@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.
- package/bin/okdb.js +1 -1
- package/keys/public.pem +3 -0
- package/okdb.js +1 -1
- package/package.json +2 -2
- package/public/admin-app.js +1 -1
- package/public/components/admin-route-host.ok.js +1 -1
- package/public/components/env-picker.ok.js +1 -1
- package/public/components/field-path-input.ok.js +1 -1
- package/public/components/field.html +154 -2
- package/public/components/geo-map.ok.js +1 -1
- package/public/components/ok-cron-input.ok.js +1 -1
- package/public/components/ok-dropzone.ok.js +1 -1
- package/public/components/ok-js-input.ok.js +1 -1
- package/public/components/ok-json-input.ok.js +1 -1
- package/public/components/ok-text-monaco-input.ok.js +1 -1
- package/public/components/theme-toggle.ok.js +1 -1
- package/public/index.html +29 -2
- package/public/layouts/_default.ok.html +1 -1
- package/public/layouts/okdb-cube.ok.html +1 -1
- package/public/login-app.js +1 -1
- package/public/login.html +205 -1
- package/public/modules/ok.js +1 -1
- package/public/sections/api/index.ok.html +1 -1
- package/public/sections/api/parts/api-endpoint.ok.js +1 -1
- package/public/sections/auth/index.ok.html +1 -1
- package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
- package/public/sections/auth/parts/token-detail.ok.js +1 -1
- package/public/sections/auth/parts/token-list.ok.js +1 -1
- package/public/sections/db/index.ok.html +1 -1
- package/public/sections/db/modals/add-item-modal.ok.js +1 -1
- package/public/sections/db/modals/create-env-modal.ok.js +1 -1
- package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
- package/public/sections/db/modals/create-index-modal.ok.js +1 -1
- package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
- package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
- package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
- package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
- package/public/sections/db/parts/db-overview.ok.js +1 -1
- package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
- package/public/sections/db/parts/edit-row.ok.js +1 -1
- package/public/sections/db/parts/tm-timeline.ok.js +1 -1
- package/public/sections/db/parts/type-changelog.ok.js +1 -1
- package/public/sections/db/parts/type-list.ok.js +1 -1
- package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
- package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
- package/public/sections/db/parts/type-viewer.ok.js +1 -1
- package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
- package/public/sections/docs/index.ok.html +1 -1
- package/public/sections/embeddings/index.ok.html +1 -1
- package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
- package/public/sections/engines/engine-panel-shared-style.js +1 -1
- package/public/sections/engines/engine-ui-utils.js +1 -1
- package/public/sections/engines/index.ok.html +1 -1
- package/public/sections/engines/modals/engine-modal.ok.js +1 -1
- package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
- package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
- package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
- package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
- package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
- package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
- package/public/sections/files/index.ok.html +1 -1
- package/public/sections/files/parts/files-blob-status.ok.js +1 -1
- package/public/sections/files/parts/files-collection-list.ok.js +1 -1
- package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
- package/public/sections/files/parts/files-file-list.ok.js +1 -1
- package/public/sections/files/parts/files-overview.ok.js +1 -1
- package/public/sections/files/parts/files-path-browser.ok.js +1 -1
- package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
- package/public/sections/functions/index.ok.html +1 -1
- package/public/sections/functions/modals/function-modal.ok.js +1 -1
- package/public/sections/functions/parts/function-detail.ok.js +1 -1
- package/public/sections/functions/parts/function-logs.ok.js +1 -1
- package/public/sections/functions/parts/function-runner.ok.js +1 -1
- package/public/sections/functions/parts/functions-list.ok.js +1 -1
- package/public/sections/license/index.ok.html +1 -1
- package/public/sections/license/parts/license-panel.ok.js +1 -1
- package/public/sections/processors/index.ok.html +1 -1
- package/public/sections/queue/index.ok.html +1 -1
- package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
- package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
- package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
- package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
- package/public/sections/queue/parts/queue-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-workers.ok.js +1 -1
- package/public/sections/sync/index.ok.html +1 -1
- package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
- package/public/sections/sync/parts/sync-retention.ok.js +1 -1
- package/public/sections/sync/parts/sync-topology.ok.js +1 -1
- package/public/sections/system/index.ok.html +1 -1
- package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
- package/public/sections/system/parts/system-api-panel.ok.js +1 -1
- package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
- package/public/sections/system/parts/system-log-history.ok.js +1 -1
- package/public/sections/system/parts/system-log.ok.js +1 -1
- package/public/sections/system/parts/system-status.ok.js +1 -1
- package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
- package/public/sections/views/index.ok.html +1 -1
- package/public/sections/views/modals/create-view-modal.ok.js +1 -1
- package/public/sections/views/parts/view-detail.ok.js +1 -1
- package/public/sections/views/parts/views-list.ok.js +1 -1
- package/public/sections/views/parts/views-overview.ok.js +1 -1
- package/public/setup-app.js +1 -1
- package/public/setup.html +189 -1
- package/public/stores/auth-store.js +1 -1
- package/public/stores/events-store.js +1 -1
- package/public/stores/functions-store.js +1 -1
- package/public/stores/okdb-store.js +1 -1
- package/public/stores/theme-store.js +1 -1
- package/public/test-cron-input.html +53 -3
- package/public/test-json-input.html +182 -3
- package/public/util/permissions.js +1 -1
- package/public/util/sift-schema.js +1 -1
- package/public/vendor/okjs/ok.esm.min.js +1 -2
- package/public/view-models/type-query-vm.js +1 -1
- package/okdb-data/default/data.mdb +0 -0
- package/okdb-data/default/lock.mdb +0 -0
- package/okdb-data/~log/data.mdb +0 -0
- package/okdb-data/~log/lock.mdb +0 -0
- package/okdb-data/~system/data.mdb +0 -0
- package/okdb-data/~system/lock.mdb +0 -0
- package/public/images/logo.png +0 -0
- package/public/images/logo.svg +0 -333
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x2e63d4=_0x392c;(function(_0x5e6644,_0x3bfe7d){const _0x35c17f=_0x392c,_0x9f7f0b=_0x5e6644();while(!![]){try{const _0x3098ab=parseInt(_0x35c17f(0x2ff))/0x1+parseInt(_0x35c17f(0x2c8))/0x2*(-parseInt(_0x35c17f(0x260))/0x3)+-parseInt(_0x35c17f(0x2e0))/0x4*(parseInt(_0x35c17f(0x30d))/0x5)+parseInt(_0x35c17f(0x2a7))/0x6+-parseInt(_0x35c17f(0x273))/0x7+-parseInt(_0x35c17f(0x2d5))/0x8+parseInt(_0x35c17f(0x1f7))/0x9*(parseInt(_0x35c17f(0x2b5))/0xa);if(_0x3098ab===_0x3bfe7d)break;else _0x9f7f0b['push'](_0x9f7f0b['shift']());}catch(_0x4c2861){_0x9f7f0b['push'](_0x9f7f0b['shift']());}}}(_0x5acc,0xbb1e3));import _0x5f1520 from'@toolkit/elements/ok-icon.ok.js';import _0x18869b from'@toolkit/elements/ok-table.ok.js';function _0x392c(_0x417599,_0x442d07){_0x417599=_0x417599-0x1ef;const _0x5acca5=_0x5acc();let _0x392c38=_0x5acca5[_0x417599];return _0x392c38;}import _0x2acb56 from'@toolkit/core/ok-overlay.ok.js';function _0x5acc(){const _0x4193af=['Default\x20TTL\x20cleared','_path','$router','vectorChunkMetaMap','embeddings:pipeline:ready','row','/ref-violations/','application/json','\x22?\x20This\x20cannot\x20be\x20undone.','defaultTTLBusy','unshift','indexStatuses','_unsubs','numTerms','$ok','\x20expired\x20item(s)\x20removed','target','distance','Drop\x20FTS\x20index\x20\x22','paths','details','openCreateIndex','detail','reloadTypes','Geo\x20query\x20error','hasDirectValueRows','selectedIndexEnd','time','__key','/deep-properties','code','resolve','index:reset','catch','geoLon','geoSortAsc','<create-fts-modal\x20:modal=\x22modal\x22\x20:type=\x22type\x22\x20:api-base=\x22apiBase\x22\x20:deep-paths=\x22deepPaths\x22\x20:on-done=\x22onDone\x22\x20/>','typeFields','queryMode','ftsScoreMap','result','splice','has','defaultTTL','rowValueOf','dropped','Fields\x20recomputed','searchMode','default','Error\x20fetching\x20FTS\x20indexes','openEnginesCreatePipeline','toFixed','clearSelection','querySelector','loadVectorEngines','violations','isRunning','Drop\x20FTS\x20error','loadTypeEnginesCount','okdb','ttlSweepBusy','<create-pipeline-modal\x20:modal=\x22modal\x22\x20:type=\x22type\x22\x20:env=\x22envName\x22\x20:on-done=\x22onDone\x22\x20/>','types','object','modal','violationCount','selectedFtsIndex','loadTTLStats','Drop\x20FTS\x20failed','table','$vars','geoConfig','__create_fts__','round','meta','string','\x22?\x20This\x20will\x20re-index\x20all\x20records.','status','Rebuilding\x20index\x20\x22','recomputeFields\x20error','Drop\x20type\x20error','Create\x20Index','lat','defaultTTLInput','engines','\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:0;\x20height:100%;\x22>\x0a\x0a\x20\x20<!--\x20Tab\x20bar\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:2px;\x20border-bottom:1px\x20solid\x20var(--okdb-app-border);\x20margin-bottom:12px;\x20flex-shrink:0;\x22>\x0a\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20@click=\x22setTab(\x27data\x27)\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27data\x27\x20?\x20\x27border-color:var(--okdb-accent);\x20color:var(--okdb-accent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x20border-bottom-color:transparent;\x27\x20:\x20\x27border-color:transparent;\x20background:transparent;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;\x20border-radius:6px\x206px\x200\x200;\x20font-size:13px;\x20cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20Data\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20@click=\x22setTab(\x27changelog\x27)\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27changelog\x27\x20?\x20\x27border-color:var(--okdb-accent);\x20color:var(--okdb-accent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x20border-bottom-color:transparent;\x27\x20:\x20\x27border-color:transparent;\x20background:transparent;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;\x20border-radius:6px\x206px\x200\x200;\x20font-size:13px;\x20cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20Changelog\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20@click=\x22setTab(\x27manage\x27)\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27manage\x27\x20?\x20\x27border-color:var(--okdb-accent);\x20color:var(--okdb-accent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x20border-bottom-color:transparent;\x27\x20:\x20\x27border-color:transparent;\x20background:transparent;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;\x20border-radius:6px\x206px\x200\x200;\x20font-size:13px;\x20cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20Manage\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20@click=\x22setTab(\x27schema\x27)\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27schema\x27\x20?\x20(\x27border-color:\x27\x20+\x20(violationCount\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-success)\x27)\x20+\x20\x27;\x20color:\x27\x20+\x20(violationCount\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-success)\x27)\x20+\x20\x27;\x20background:\x27\x20+\x20(violationCount\x20>\x200\x20?\x20\x27#f8717111\x27\x20:\x20\x27color-mix(in\x20srgb,\x20var(--okdb-success)\x207%,\x20transparent)\x27)\x20+\x20\x27;\x20border-bottom-color:transparent;\x27)\x20:\x20(violationCount\x20>\x200\x20?\x20\x27border-color:transparent;\x20background:transparent;\x20color:var(--okdb-danger);\x27\x20:\x20\x27border-color:transparent;\x20background:transparent;\x27)\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;\x20border-radius:6px\x206px\x200\x200;\x20font-size:13px;\x20cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20Schema<if\x20:=\x22violationCount\x20>\x200\x22><span\x20style=\x22margin-left:6px;\x20font-size:10px;\x20padding:2px\x207px;\x20border-radius:999px;\x20background:color-mix(in\x20srgb,\x20var(--okdb-danger)\x2013%,\x20transparent);\x20color:var(--okdb-danger);\x20font-weight:600;\x22>{{\x20violationCount\x20}}</span></if>\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20@click=\x22switchToEngines()\x22\x0a\x20\x20\x20\x20\x20\x20:style=\x22tab===\x27engines\x27\x20?\x20\x27border-color:var(--okdb-purple);\x20color:var(--okdb-purple);\x20background:color-mix(in\x20srgb,\x20var(--okdb-purple)\x207%,\x20transparent);\x20border-bottom-color:transparent;\x27\x20:\x20\x27border-color:transparent;\x20background:transparent;\x27\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22padding:6px\x2016px;\x20border-radius:6px\x206px\x200\x200;\x20font-size:13px;\x20cursor:pointer;\x22>\x0a\x20\x20\x20\x20\x20\x20Engines<if\x20:=\x22typeEngineCount\x20>\x200\x22><span\x20class=\x22mode-count\x22>{{\x20typeEngineCount\x20}}</span></if>\x0a\x20\x20\x20\x20</button>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Data\x20tab\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27data\x27\x22>\x0a\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:16px;\x20flex:1;\x20min-height:0;\x22>\x0a\x0a\x20\x20<div\x20class=\x22card\x22\x20style=\x22display:flex;\x20gap:16px;\x22>\x0a\x0a\x20\x20\x20\x20<!--\x20──\x20Left\x20column:\x20query\x20controls\x20──\x20-->\x0a\x20\x20\x20\x20<div\x20style=\x22flex:1;\x20display:flex;\x20flex-direction:column;\x20gap:10px;\x20min-width:0;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Row\x201:\x20filter\x20label\x20+\x20accordion\x20+\x20JSON\x20input\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:6px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Label\x20row\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20color:#6a8a9a;\x20user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20searchMode\x20===\x20\x27vector\x27\x20?\x20\x27Post-filter\x20vector\x20results\x20with\x20sift\x27\x20:\x20searchMode\x20===\x20\x27fts\x27\x20?\x20\x27Post-filter\x20FTS\x20results\x20with\x20sift\x27\x20:\x20searchMode\x20===\x20\x27geo\x27\x20?\x20\x27Post-filter\x20geo\x20results\x20with\x20sift\x27\x20:\x20\x27Filter\x20with\x20sift\x20query\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22help-toggle\x22\x20@click=\x22helpOpen\x20=\x20!helpOpen\x22\x20:class=\x22helpOpen\x20?\x20\x27help-toggle--open\x27\x20:\x20\x27\x27\x22>i</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Accordion:\x20query\x20reference\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22helpOpen\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22help-accordion\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ht-row\x22><code>{}</code><span>match\x20all\x20records</span></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ht-row\x22><code>{\x22field\x22:\x20\x22value\x22}</code><span>exact\x20match</span></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ht-row\x22><code>{\x22n\x22:\x20{\x22$gt\x22:\x205,\x20\x22$lt\x22:\x2050}}</code><span>numeric\x20comparison</span></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ht-row\x22><code>{\x22x\x22:\x20{\x22$in\x22:\x20[\x22a\x22,\x22b\x22]}}</code><span>set\x20membership</span></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ht-row\x22><code>{\x22x\x22:\x20{\x22$exists\x22:\x20true}}</code><span>field\x20presence</span></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ht-row\x20ht-row--note\x22>Nested\x20fields\x20use\x20dot\x20notation:\x20<code>\x22a.b\x22</code></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<ok-json-input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22query.query\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22query.query\x20=\x20$event.detail\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:schema=\x22siftSchema\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22min-width:220px;\x20min-height:60px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</ok-json-input>\x0a\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Mode\x20bar:\x20Scan\x20/\x20Index\x20/\x20FTS\x20/\x20Vector\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:4px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22seg-toggle\x22\x20style=\x22flex-shrink:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22searchMode\x20===\x20\x27scan\x27\x20\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22setSearchMode(\x27scan\x27)\x22>Scan</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22searchMode\x20===\x20\x27index\x27\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22setSearchMode(\x27index\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Index<if\x20:=\x22possibleIndexes.length\x20>\x200\x22><span\x20class=\x22mode-count\x22>{{\x20possibleIndexes.length\x20}}</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22searchMode\x20===\x20\x27fts\x27\x20\x20\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22setSearchMode(\x27fts\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FTS<if\x20:=\x22ftsList.length\x20>\x200\x22><span\x20class=\x22mode-count\x22>{{\x20ftsList.length\x20}}</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22searchMode\x20===\x20\x27vector\x27\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22setSearchMode(\x27vector\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Vector<if\x20:=\x22vectorEngines.length\x20>\x200\x22><span\x20class=\x22mode-count\x22>{{\x20vectorEngines.length\x20}}</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22searchMode\x20===\x20\x27geo\x27\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22setSearchMode(\x27geo\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Geo<if\x20:=\x22geoIndexes.length\x20>\x200\x22><span\x20class=\x22mode-count\x22>{{\x20geoIndexes.length\x20}}</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20──\x20Scan\x20panel\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27scan\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22query.selectedDirection\x20=\x20query.selectedDirection\x20===\x20\x27desc\x27\x20?\x20\x27asc\x27\x20:\x20\x27desc\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22min-width:78px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Toggle\x20key\x20scan\x20direction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20query.selectedDirection\x20===\x20\x27desc\x27\x20?\x20\x27↓\x20Desc\x27\x20:\x20\x27↑\x20Asc\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20opacity:.4;\x20user-select:none;\x22>Full\x20key-ordered\x20scan\x20·\x20sift\x20applied\x20as\x20filter</span>\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<!--\x20──\x20Index\x20panel\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27index\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:8px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20@change=\x22selectIndex($event.target.value)\x22\x20style=\x22min-width:160px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20none\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22possibleIndexes\x22\x20let:item=\x22idx\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22idx\x22\x20:selected=\x22query.selectedIndex\x20===\x20idx\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20idx\x20}}{{\x20indexStatuses[idx]?.unique\x20?\x20\x27\x20◆\x27\x20:\x20\x27\x27\x20}}{{\x20indexStatusBadge(idx)\x20?\x20\x27\x20⚠\x20\x27\x20+\x20indexStatusBadge(idx)\x20:\x20\x27\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</option>\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<option\x20value=\x22__create_index__\x22\x20style=\x22color:var(--okdb-accent);\x22>+\x20Create\x20index…</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedIndex\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22__remove_index__\x22\x20style=\x22color:var(--okdb-danger);\x22>×\x20Remove\x20\x22{{\x20query.selectedIndex\x20}}\x22</option>\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</select>\x0a\x0a\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@click=\x22query.selectedDirection\x20=\x20query.selectedDirection\x20===\x20\x27desc\x27\x20?\x20\x27asc\x27\x20:\x20\x27desc\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22min-width:78px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Toggle\x20sort\x20direction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20query.selectedDirection\x20===\x20\x27desc\x27\x20?\x20\x27↓\x20Desc\x27\x20:\x20\x27↑\x20Asc\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedIndex\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22seg-toggle\x22>\x0a\x20\x20\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\x20\x20:class=\x22query.queryMode\x20===\x20\x27prefix\x27\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22query.queryMode\x20=\x20\x27prefix\x27,\x20query.selectedIndexStart\x20=\x20undefined,\x20query.selectedIndexEnd\x20=\x20undefined\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Prefix\x0a\x20\x20\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<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22query.queryMode\x20===\x20\x27range\x27\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22query.queryMode\x20=\x20\x27range\x27,\x20query.selectedPrefix\x20=\x20undefined\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Range\x0a\x20\x20\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</div>\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<!--\x20──\x20Index\x20detail\x20strip\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedIndex\x20&&\x20selectedIndexInfo\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22idx-info-strip\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-info-label\x22>Fields:</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22selectedIndexInfo.fields\x22\x20let:item=\x22f\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<code\x20class=\x22idx-info-field\x22>{{\x20f\x20}}</code>\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:=\x22selectedIndexInfo.isUnique\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-info-badge\x20idx-info-badge--unique\x22>◆\x20unique</span>\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\x20\x20<if\x20:=\x22selectedIndexInfo.isGeo\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-info-badge\x20idx-info-badge--geo\x22>◎\x20geo\x20·\x20precision\x20{{\x20selectedIndexInfo.geoPrecision\x20??\x207\x20}}</span>\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\x20\x20<if\x20:=\x22!selectedIndexInfo.isUnique\x20&&\x20!selectedIndexInfo.isGeo\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-info-badge\x20idx-info-badge--regular\x22>regular</span>\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedIndex\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.queryMode\x20===\x20\x27prefix\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x20font-size:12px;\x22>Prefix:</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-json-input\x20mode=\x22input\x22\x20:value=\x22query.selectedPrefix\x22\x20@change=\x22query.selectedPrefix\x20=\x20$event.detail\x22\x20style=\x22width:220px;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.35;\x20font-size:11px;\x22>scalar\x20or\x20array\x20for\x20composite\x20indexes</span>\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\x20\x20<if\x20:=\x22query.queryMode\x20===\x20\x27range\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x20font-size:12px;\x22>Start:</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-json-input\x20mode=\x22input\x22\x20:value=\x22query.selectedIndexStart\x22\x20@change=\x22query.selectedIndexStart\x20=\x20$event.detail\x22\x20style=\x22width:180px;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x20font-size:12px;\x22>End:</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-json-input\x20mode=\x22input\x22\x20:value=\x22query.selectedIndexEnd\x22\x20@change=\x22query.selectedIndexEnd\x20=\x20$event.detail\x22\x20style=\x22width:180px;\x22\x20/>\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\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<!--\x20──\x20FTS\x20panel\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27fts\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20@change=\x22selectFtsIndex($event.target.value,\x20$event)\x22\x20style=\x22min-width:160px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20none\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22ftsList\x22\x20let:item=\x22fts\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22fts.name\x22\x20:selected=\x22query.selectedFtsIndex\x20===\x20fts.name\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20fts.name\x20}}{{\x20ftsStatusBadge(fts)\x20?\x20\x27\x20⚠\x20\x27\x20+\x20ftsStatusBadge(fts)\x20:\x20\x27\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</option>\x0a\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<option\x20value=\x22__create_fts__\x22\x20style=\x22color:var(--okdb-accent);\x22>+\x20Create\x20FTS\x20index…</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedFtsIndex\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22__drop_fts__\x22\x20style=\x22color:var(--okdb-danger);\x22>×\x20Drop\x20\x22{{\x20query.selectedFtsIndex\x20}}\x22</option>\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</select>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedFtsIndex\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22text\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22Search…\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22query.ftsText\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22query.ftsText\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;\x20min-width:140px;\x20max-width:300px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22seg-toggle\x22\x20title=\x22AND:\x20all\x20terms\x20required\x20·\x20OR:\x20any\x20term\x20matches,\x20ranked\x20by\x20hit\x20count\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22query.ftsMode\x20===\x20\x27and\x27\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22query.ftsMode\x20=\x20\x27and\x27\x22>AND</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22query.ftsMode\x20===\x20\x27or\x27\x20\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22query.ftsMode\x20=\x20\x27or\x27\x22>OR</button>\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<label\x20style=\x22font-size:12px;\x20display:flex;\x20align-items:center;\x20gap:4px;\x20cursor:pointer;\x20white-space:nowrap;\x20user-select:none;\x22\x20title=\x22Prefix:\x20\x27sta\x27\x20matches\x20\x27start\x27,\x20\x27stack\x27,\x20etc.\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22query.ftsPrefix\x22\x20@change=\x22query.ftsPrefix\x20=\x20$event.target.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Prefix\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\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<!--\x20──\x20Vector\x20panel\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27vector\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22vectorEngines.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.7;\x20display:flex;\x20align-items:center;\x20gap:8px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22cpu\x22\x20style=\x22width:13px;height:13px;opacity:.5;\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>No\x20vector\x20search\x20engines\x20for\x20<b>{{\x20type\x20}}</b>\x20yet.</span>\x0a\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@click=\x22openEnginesCreatePipeline()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:2px\x2010px;\x20border-radius:999px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-indigo)\x2033%,\x20transparent);\x20color:var(--okdb-indigo);\x20background:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x206%,\x20transparent);\x20cursor:pointer;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>⛓\x20Create\x20Pipeline…</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22vectorEngines.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20@change=\x22selectVectorEngine($event.target.value,\x20$event)\x22\x20style=\x22min-width:160px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20none\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22vectorEngines\x22\x20let:item=\x22ve\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22displayVectorName(ve.name)\x22\x20:selected=\x22query.selectedVectorEngine\x20===\x20displayVectorName(ve.name)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20displayVectorName(ve.name)\x20}}{{\x20ve.isRunning\x20?\x20\x27\x27\x20:\x20\x27\x20(stopped)\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</option>\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<option\x20value=\x22__create_pipeline__\x22\x20style=\x22color:var(--okdb-indigo);\x22>+\x20Create\x20pipeline…</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedVectorEngine\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22text\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22Semantic\x20query…\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22query.vectorText\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input:debounce.500=\x22query.vectorText\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;\x20min-width:160px;\x20max-width:340px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20opacity:.55;\x20white-space:nowrap;\x20user-select:none;\x22>top</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22number\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22query.vectorLimit\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22query.vectorLimit\x20=\x20Math.max(1,\x20Math.min(200,\x20Number($event.target.value)\x20||\x2020))\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20min=\x221\x22\x20max=\x22200\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22width:56px;\x20text-align:center;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Max\x20results\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Pipeline\x20badge\x20—\x20clickable,\x20navigates\x20to\x20local\x20Engines\x20tab\x20in\x20pipeline\x20mode\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22selectedVectorEngineMeta\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22selectedVectorEngineMeta.meta\x20&&\x20selectedVectorEngineMeta.meta.pipeline\x22>\x0a\x20\x20\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\x20\x20@click=\x22openEnginesPipeline(selectedVectorEngineMeta.meta.pipeline)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:2px\x209px;\x20border-radius:999px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-indigo)\x2033%,\x20transparent);\x20color:var(--okdb-indigo);\x20background:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x206%,\x20transparent);\x20cursor:pointer;\x20white-space:nowrap;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22\x27Open\x20the\x20type\x20pipeline\x20view\x20focused\x20on:\x20\x27\x20+\x20selectedVectorEngineMeta.meta.pipeline\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>⛓\x20{{\x20selectedVectorEngineMeta.meta.pipeline\x20}}\x20→</button>\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</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Link\x20to\x20local\x20type\x20engines\x20workspace\x20-->\x0a\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@click=\x22openTypePipelinesForSelectedVector()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:2px\x209px;\x20border-radius:999px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-indigo)\x2020%,\x20transparent);\x20color:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x2060%,\x20transparent);\x20background:transparent;\x20cursor:pointer;\x20white-space:nowrap;\x20margin-left:auto;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Open\x20the\x20type-scoped\x20engines\x20view\x20for\x20this\x20vector\x20search\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>⛓\x20Type\x20Engines\x20→</button>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20──\x20Geo\x20panel\x20──\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27geo\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22geoIndexes.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.7;\x20display:flex;\x20align-items:center;\x20gap:8px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>◎</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>No\x20geo\x20indexes\x20for\x20<b>{{\x20type\x20}}</b>\x20yet.\x20Create\x20one\x20from\x20the\x20Manage\x20tab.</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22geoIndexes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20@change=\x22geoField\x20=\x20$event.target.value\x22\x20style=\x22min-width:140px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22geoIndexes\x22\x20let:item=\x22gf\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22gf\x22\x20:selected=\x22geoField\x20===\x20gf\x22>{{\x20gf\x20}}</option>\x0a\x20\x20\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</select>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20opacity:.5;\x22>Lat</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22number\x22\x20step=\x22any\x22\x20placeholder=\x2240.7484\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22geoLat\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input:debounce.100=\x22geoLat\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22width:110px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20opacity:.5;\x22>Lon</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22number\x22\x20step=\x22any\x22\x20placeholder=\x22-73.9856\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22geoLon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input:debounce.100=\x22geoLon\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22width:110px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20opacity:.5;\x22>Radius\x20(m)</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22number\x22\x20step=\x22any\x22\x20placeholder=\x22∞\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22geoRadius\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input:debounce.100=\x22geoRadius\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22width:90px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Leave\x20empty\x20for\x20unlimited\x20radius\x20(sorted\x20by\x20distance)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\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=\x22geoSortAsc\x20=\x20!geoSortAsc\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22min-width:78px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Toggle\x20sort\x20direction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20geoSortAsc\x20?\x20\x27↑\x20Nearest\x27\x20:\x20\x27↓\x20Farthest\x27\x20}}\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.35;\x20user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Results\x20sorted\x20by\x20distance\x20·\x20sift\x20filter\x20applied\x20as\x20post-filter\x20·\x20leave\x20radius\x20empty\x20for\x20no\x20cutoff\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20──\x20Geo\x20view\x20toggle\x20(only\x20in\x20geo\x20mode)\x20──\x20-->\x0a\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27geo\x27\x20&&\x20geoIndexes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:4px;\x20flex-shrink:0;\x20padding:2px\x200;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22seg-toggle\x22\x20style=\x22flex-shrink:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22geoViewMode\x20===\x20\x27table\x27\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22geoViewMode\x20=\x20\x27table\x27\x22\x20title=\x22Table\x20only\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22table-2\x22\x20style=\x22width:13px;height:13px;vertical-align:middle;\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22geoViewMode\x20===\x20\x27map\x27\x20\x20\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22geoViewMode\x20=\x20\x27map\x27\x22\x20\x20\x20title=\x22Map\x20only\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22map-pin\x22\x20style=\x22width:13px;height:13px;vertical-align:middle;\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22geoViewMode\x20===\x20\x27split\x27\x20?\x20\x27active\x27\x20:\x20\x27\x27\x22\x20@click=\x22geoViewMode\x20=\x20\x27split\x27\x22\x20title=\x22Table\x20+\x20Map\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22columns\x22\x20style=\x22width:13px;height:13px;vertical-align:middle;\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:10px;\x20opacity:.3;\x20user-select:none;\x22>view</span>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Results\x20area\x20──\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20position:relative;\x20flex:1;\x20min-height:0;\x22>\x0a\x20\x20\x20\x20<if\x20:=\x22query.busy\x22>\x0a\x20\x20\x20\x20\x20\x20<ok-overlay>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22loader-center\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22loader\x22\x20class=\x22spin\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</ok-overlay>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<!--\x20Results\x20bar:\x20timing\x20+\x20Add\x20item\x20-->\x0a\x20\x20\x20\x20<div\x20style=\x22margin-bottom:8px;\x20display:flex;\x20align-items:center;\x20gap:8px;\x20flex-shrink:0;\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x20opacity:.45;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20query.time\x20!=\x20null\x20?\x20query.time\x20+\x20\x27ms\x27\x20:\x20\x27\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20<b\x20style=\x22opacity:.7;\x22>{{\x20type\x20}}</b>\x0a\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-left:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openAddModal\x22\x20class=\x22btn-primary\x20btn-icon\x22\x20style=\x22font-size:12px;\x20padding:3px\x2012px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27data:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27data:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.permTooltip(\x27data:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22plus\x22></ok-icon>Add\x20item\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<!--\x20Content\x20row\x20—\x20table\x20+\x20map\x20as\x20siblings,\x20shown/hidden\x20via\x20display:none\x20-->\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex:1;\x20min-height:0;\x20gap:10px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20TABLE\x20col\x20—\x20hidden\x20only\x20in\x20pure\x20map\x20mode\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x0a\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22searchMode\x20===\x20\x27geo\x27\x20&&\x20geoViewMode\x20===\x20\x27map\x27\x20?\x20\x27display:none\x27\x20:\x20\x27flex:1;\x20min-width:0;\x20display:flex;\x20flex-direction:column;\x20min-height:0;\x27\x22\x0a\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22hasDirectValueRows\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-table\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ref=\x22table\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:data=\x22displayRows\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20select=\x22single\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20no-scroll\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;\x20min-height:0;\x20overflow:auto;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@select-change=\x22onGeoTableSelect($event)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<columns>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x22min-content\x22\x20no-resize>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22key__header\x22>key</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedFtsIndex\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:10px;\x20color:var(--okdb-accent);\x20opacity:.6;\x20margin-left:6px;\x20font-weight:normal;\x22>score</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:=\x22query.selectedVectorEngine\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:10px;\x20color:var(--okdb-indigo);\x20opacity:.6;\x20margin-left:6px;\x20font-weight:normal;\x22>sim</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:=\x22searchMode\x20===\x20\x27geo\x27\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:10px;\x20color:var(--okdb-success);\x20opacity:.6;\x20margin-left:6px;\x20font-weight:normal;\x22>dist</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</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22key__cell\x22>{{\x20keyOf(row)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22directValueKindOf(row)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22\x27direct-value-badge\x20direct-value-badge--\x27\x20+\x20directValueKindOf(row)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20directValueKindOf(row)\x20}}\x0a\x20\x20\x20\x20\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\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:=\x22query.selectedFtsIndex\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22fts-score-badge\x22>{{\x20matchOf(row)\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedVectorEngine\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vec-score-badge\x22>{{\x20vectorScoreOf(row)\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\x20\x20<if\x20:=\x22vectorChunkMetaOf(row)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:10px;\x20color:var(--okdb-orange);\x20opacity:.8;\x20margin-left:4px;\x20white-space:nowrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20chunk\x20{{\x20vectorChunkMetaOf(row).start\x20}}–{{\x20vectorChunkMetaOf(row).end\x20}}\x0a\x20\x20\x20\x20\x20\x20\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\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>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27geo\x27\x20&&\x20distanceOf(row)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22geo-dist-badge\x22>{{\x20distanceOf(row)\x20}}</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</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</column>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>value</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<code\x20:title=\x22prettyValueOf(row)\x22\x20style=\x22display:block;\x20white-space:pre-wrap;\x20word-break:break-word;\x20font-size:12px;\x22>{{\x20inlineValueOf(row)\x20}}</code>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</columns>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<expanded\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Chunk\x20info\x20panel\x20—\x20shown\x20only\x20in\x20vector\x20mode\x20for\x20chunked\x20pipeline\x20results\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedVectorEngine\x20&&\x20vectorChunkMetaOf(row)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:8px\x2010px\x200;\x20display:flex;\x20flex-direction:column;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22vectorChunkMetaOf(row).text\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x20margin-bottom:2px;\x22>Matched\x20chunk\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-orange);\x20margin-left:6px;\x22>chars\x20{{\x20vectorChunkMetaOf(row).start\x20}}–{{\x20vectorChunkMetaOf(row).end\x20}}</span>\x0a\x20\x20\x20\x20\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\x20\x20\x20\x20\x20\x20<div\x20style=\x22background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x20padding:8px;\x20font-size:11px;\x20max-height:140px;\x20overflow:auto;\x20white-space:pre-wrap;\x20word-break:break-word;\x20line-height:1.5;\x22>{{\x20vectorChunkMetaOf(row).text\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!vectorChunkMetaOf(row).text\x20&&\x20vectorChunkMetaOf(row).start\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x20margin-bottom:2px;\x22>Matched\x20chunk\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-orange);\x20margin-left:6px;\x22>chars\x20{{\x20vectorChunkMetaOf(row).start\x20}}–{{\x20vectorChunkMetaOf(row).end\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.55;\x20margin-left:4px;\x22>(highlighted\x20in\x20document\x20below)</span>\x0a\x20\x20\x20\x20\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\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22height:1px;\x20background:var(--okdb-app-border);\x20margin:2px\x200;\x22></div>\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</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<edit-row\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:row=\x22rowValueOf(row)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:key=\x22keyOf(row)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:type=\x22type\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@remove=\x22onRemoveRow(keyOf(row))\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22onRowChanged($event)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</edit-row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</expanded>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</ok-table>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!hasDirectValueRows\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-table\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ref=\x22table\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:data=\x22displayRows\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20select=\x22single\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20no-scroll\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;\x20min-height:0;\x20overflow:auto;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@select-change=\x22onGeoTableSelect($event)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<columns>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x22min-content\x22\x20no-resize>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22key__header\x22>key</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedFtsIndex\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:10px;\x20color:var(--okdb-accent);\x20opacity:.6;\x20margin-left:6px;\x20font-weight:normal;\x22>score</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:=\x22query.selectedVectorEngine\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:10px;\x20color:var(--okdb-indigo);\x20opacity:.6;\x20margin-left:6px;\x20font-weight:normal;\x22>sim</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:=\x22searchMode\x20===\x20\x27geo\x27\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:10px;\x20color:var(--okdb-success);\x20opacity:.6;\x20margin-left:6px;\x20font-weight:normal;\x22>dist</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</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22key__cell\x22>{{\x20keyOf(row)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedFtsIndex\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22fts-score-badge\x22>{{\x20matchOf(row)\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedVectorEngine\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22vec-score-badge\x22>{{\x20vectorScoreOf(row)\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\x20\x20<if\x20:=\x22vectorChunkMetaOf(row)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:10px;\x20color:var(--okdb-orange);\x20opacity:.8;\x20margin-left:4px;\x20white-space:nowrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20chunk\x20{{\x20vectorChunkMetaOf(row).start\x20}}–{{\x20vectorChunkMetaOf(row).end\x20}}\x0a\x20\x20\x20\x20\x20\x20\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\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>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27geo\x27\x20&&\x20distanceOf(row)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22geo-dist-badge\x22>{{\x20distanceOf(row)\x20}}</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</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</column>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<auto\x20max=\x2210\x22\x20:show-more-content=\x22(n)\x20=>\x20\x27+\x27\x20+\x20n\x20+\x20\x27\x20cols\x27\x22\x20show-more-title=\x22Click\x20to\x20show\x20all\x20columns\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row\x20let:value>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22[typeof\x20value,\x20value\x20===\x20null\x20?\x20\x27null\x27\x20:\x20\x27\x27]\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20value\x20}}\x0a\x20\x20\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\x20\x20</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</auto>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</columns>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<expanded\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Chunk\x20info\x20panel\x20—\x20shown\x20only\x20in\x20vector\x20mode\x20for\x20chunked\x20pipeline\x20results\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22query.selectedVectorEngine\x20&&\x20vectorChunkMetaOf(row)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:8px\x2010px\x200;\x20display:flex;\x20flex-direction:column;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22vectorChunkMetaOf(row).text\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x20margin-bottom:2px;\x22>Matched\x20chunk\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-orange);\x20margin-left:6px;\x22>chars\x20{{\x20vectorChunkMetaOf(row).start\x20}}–{{\x20vectorChunkMetaOf(row).end\x20}}</span>\x0a\x20\x20\x20\x20\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\x20\x20\x20\x20\x20\x20<div\x20style=\x22background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x20padding:8px;\x20font-size:11px;\x20max-height:140px;\x20overflow:auto;\x20white-space:pre-wrap;\x20word-break:break-word;\x20line-height:1.5;\x22>{{\x20vectorChunkMetaOf(row).text\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!vectorChunkMetaOf(row).text\x20&&\x20vectorChunkMetaOf(row).start\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x20margin-bottom:2px;\x22>Matched\x20chunk\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-orange);\x20margin-left:6px;\x22>chars\x20{{\x20vectorChunkMetaOf(row).start\x20}}–{{\x20vectorChunkMetaOf(row).end\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.55;\x20margin-left:4px;\x22>(highlighted\x20in\x20document\x20below)</span>\x0a\x20\x20\x20\x20\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\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22height:1px;\x20background:var(--okdb-app-border);\x20margin:2px\x200;\x22></div>\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</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<edit-row\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:row=\x22rowValueOf(row)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:key=\x22keyOf(row)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:type=\x22type\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@remove=\x22onRemoveRow(keyOf(row))\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22onRowChanged($event)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</edit-row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</expanded>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</ok-table>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22ok-pager\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22query.prevPage()\x22\x20:disabled=\x22!query.hasPrev\x20||\x20query.busy\x22>‹\x20Prev</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>{{\x20query.total\x20}}\x20result{{\x20query.total\x20===\x201\x20?\x20\x27\x27\x20:\x20\x27s\x27\x20}}\x20·\x20{{\x20query.pageSize\x20}}/page</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22query.nextPage()\x22\x20:disabled=\x22!query.hasNext\x20||\x20query.busy\x22>Next\x20›</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22searchMode\x20===\x20\x27geo\x27\x22>\x0a\x20\x20\x20\x20\x20\x20<!--\x20MAP\x20col\x20—\x20always\x20mounted,\x20shown\x20only\x20in\x20geo\x20map/split\x20mode\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;\x20min-width:0;\x20min-height:0;\x20border-radius:8px;\x20overflow:hidden;\x20border:1px\x20solid\x20#23292e;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22{\x20\x27display\x27:\x20(geoViewMode\x20===\x20\x27map\x27\x20||\x20geoViewMode\x20===\x20\x27split\x27)?\x20\x27block\x27\x20:\x20\x27none\x27\x20}\x22\x0a\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<geo-map\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:points=\x22geoMapPoints\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:origin-lat=\x22geoLat\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:origin-lon=\x22geoLon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:radius=\x22geoRadius\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:highlight-key=\x22geoHighlightedKey\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@move=\x22geoLat\x20=\x20String($event.detail.lat.toFixed(6)),\x20geoLon\x20=\x20String($event.detail.lon.toFixed(6))\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@select=\x22onGeoMapSelect($event)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22width:100%;\x20height:100%;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x0a</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Changelog\x20tab\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27changelog\x27\x22>\x0a\x20\x20\x20\x20<type-changelog\x20:type=\x22type\x22\x20style=\x22flex:1;\x20min-height:0;\x22\x20/>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Manage\x20tab\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27manage\x27\x22>\x0a\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:12px;\x20flex:1;\x20overflow:auto;\x20padding-right:4px;\x22>\x0a\x0a\x20\x20\x20\x20<!--\x20Overview\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22card\x22\x20style=\x22display:flex;\x20gap:24px;\x20align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:15px;\x20font-weight:600;\x22>{{\x20type\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.5;\x20margin-top:2px;\x22>type</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:22px;\x20font-weight:600;\x20color:var(--okdb-accent);\x22>{{\x20typeCount\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.5;\x20margin-top:2px;\x22>records</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<!--\x20Fields\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22card\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22>Fields</div>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22typeFieldEntries.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;\x20font-size:13px;\x22>No\x20fields\x20tracked\x20yet\x20—\x20add\x20items\x20or\x20use\x20Recompute.</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22typeFieldEntries.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-grid\x20manage-grid--2\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Field</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Observed\x20types</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22typeFieldEntries\x22\x20let:item=\x22tf\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22><code>{{\x20tf.name\x20}}</code></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x20manage-cell--dim\x22>{{\x20tf.types.join(\x27,\x20\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</if>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<!--\x20Secondary\x20Indexes\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22card\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22>Secondary\x20Indexes</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openCreateIndex()\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27schema:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27schema:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.permTooltip(\x27schema:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22plus\x22></ok-icon>Create\x20index\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22indexEntries.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;\x20font-size:13px;\x22>No\x20indexes\x20yet.</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22indexEntries.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-grid\x20manage-grid--idx\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Fields</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Kind</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Ownership</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Status</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22indexEntries\x22\x20let:item=\x22ix\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22\x20style=\x22gap:4px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22ix.fields\x22\x20let:item=\x22f\x22\x20let:index=\x22fi\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<code\x20style=\x22font-size:12px;\x20color:var(--okdb-json-key);\x22>{{\x20f\x20}}</code><span\x20style=\x22opacity:.3;\x20font-size:11px;\x20margin-left:0;\x22\x20:style=\x22fi\x20<\x20ix.fields.length\x20-\x201\x20?\x20\x27\x27\x20:\x20\x27display:none\x27\x22>·</span>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22\x20style=\x22gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22ix.isGeo\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-kind-badge\x20idx-kind-badge--geo\x22>◎\x20geo</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:10px;\x20opacity:.45;\x20white-space:nowrap;\x22>precision\x20{{\x20ix.geoPrecision\x20??\x207\x20}}</span>\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\x20\x20<if\x20:=\x22ix.isUnique\x20&&\x20!ix.isGeo\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-kind-badge\x20idx-kind-badge--unique\x22>◆\x20unique</span>\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\x20\x20<if\x20:=\x22!ix.isGeo\x20&&\x20!ix.isUnique\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-kind-badge\x20idx-kind-badge--regular\x22>regular</span>\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\x20\x20<div\x20class=\x22manage-cell\x22\x20style=\x22gap:3px;\x20flex-direction:column;\x20align-items:flex-start;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22ix.createdBy\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-owned-badge\x22>{{\x20ix.createdBy.kind\x20}}:{{\x20ix.createdBy.name\x20}}</span>\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\x20\x20<each\x20:of=\x22ix.usedBy\x22\x20let:item=\x22consumer\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22idx-consumer-badge\x22>{{\x20consumer\x20}}</span>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22\x27manage-status\x20manage-status--\x27\x20+\x20ix.status\x22>{{\x20ix.status\x20}}</span>\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\x20class=\x22manage-cell\x22\x20style=\x22justify-content:flex-end;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22rebuildIndex(ix.name)\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:2px\x2010px;\x20opacity:.7;\x22\x20title=\x22Rebuild\x20this\x20index\x20from\x20all\x20current\x20records\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27schema:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27schema:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.can(\x27schema:write\x27)\x20?\x20\x27Rebuild\x20this\x20index\x20from\x20all\x20current\x20records\x27\x20:\x20$ok.stores.auth.permTooltip(\x27schema:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22refresh-cw\x22></ok-icon>Rebuild\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22\x20style=\x22justify-content:flex-end;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22removeIndex(ix.name)\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:2px\x2010px;\x20color:var(--okdb-danger);\x20opacity:.8;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27schema:write\x27)\x20||\x20ix.usedBy.length\x20>\x200\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27schema:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22ix.usedBy.length\x20>\x200\x20?\x20\x27Used\x20by:\x20\x27\x20+\x20ix.usedBy.join(\x27,\x20\x27)\x20:\x20($ok.stores.auth.can(\x27schema:write\x27)\x20?\x20\x27Remove\x20this\x20index\x27\x20:\x20$ok.stores.auth.permTooltip(\x27schema:write\x27))\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22trash-2\x22></ok-icon>Remove\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</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</if>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<!--\x20FTS\x20Indexes\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22card\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22>FTS\x20Indexes</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openCreateFtsModal()\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27schema:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27schema:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.permTooltip(\x27schema:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22plus\x22></ok-icon>Create\x20FTS\x20index\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22ftsEntries.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;\x20font-size:13px;\x22>No\x20FTS\x20indexes\x20yet.</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22ftsEntries.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-grid\x20manage-grid--fts\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Name</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Fields</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Status</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Size</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22ftsEntries\x22\x20let:item=\x22fe\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22><code>{{\x20fe.name\x20}}</code></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x20manage-cell--dim\x22>{{\x20fe.fields\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22\x27manage-status\x20manage-status--\x27\x20+\x20fe.status\x22>{{\x20fe.status\x20}}</span>\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\x20class=\x22manage-cell\x20manage-cell--dim\x22\x20style=\x22font-size:11px;\x20font-family:monospace;\x22>{{\x20fmtBytes(fe.sizeBytes)\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22\x20style=\x22justify-content:flex-end;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22rebuildFts(fe.name)\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:2px\x2010px;\x20opacity:.7;\x22\x20title=\x22Rebuild\x20this\x20FTS\x20index\x20from\x20all\x20current\x20records\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27schema:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27schema:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.can(\x27schema:write\x27)\x20?\x20\x27Rebuild\x20this\x20FTS\x20index\x20from\x20all\x20current\x20records\x27\x20:\x20$ok.stores.auth.permTooltip(\x27schema:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22refresh-cw\x22></ok-icon>Rebuild\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22\x20style=\x22justify-content:flex-end;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22dropFtsIndex(fe.name)\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:2px\x2010px;\x20color:var(--okdb-danger);\x20opacity:.8;\x22\x20title=\x22Drop\x20this\x20FTS\x20index\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27schema:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27schema:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.can(\x27schema:write\x27)\x20?\x20\x27Drop\x20this\x20FTS\x20index\x27\x20:\x20$ok.stores.auth.permTooltip(\x27schema:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22trash-2\x22></ok-icon>Drop\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</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</if>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<!--\x20Vector\x20Search\x20Engines\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22card\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22>Vector\x20Search\x20Engines</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22openEnginesWorkspace()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22btn-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x20color:var(--okdb-indigo);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x2027%,\x20transparent);\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Open\x20the\x20type-scoped\x20engines\x20view\x20for\x20this\x20type\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20⛓\x20Type\x20Engines\x20→\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22vectorEntries.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;\x20font-size:13px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20No\x20vector\x20search\x20engines\x20for\x20this\x20type\x20yet.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22openEnginesCreatePipeline()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22margin-left:6px;\x20font-size:11px;\x20padding:1px\x208px;\x20border-radius:999px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-indigo)\x2027%,\x20transparent);\x20color:var(--okdb-indigo);\x20background:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x205%,\x20transparent);\x20cursor:pointer;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>Create\x20Pipeline…</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22vectorEntries.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-grid\x20manage-grid--vec\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Engine</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Status</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22>Pipeline</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-col-hd\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22vectorEntries\x22\x20let:item=\x22ve\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22><code>{{\x20ve.displayName\x20}}</code></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22\x27manage-status\x20manage-status--\x27\x20+\x20(ve.running\x20?\x20\x27ready\x27\x20:\x20\x27creating\x27)\x22>{{\x20ve.status\x20}}</span>\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\x20class=\x22manage-cell\x20manage-cell--dim\x22>{{\x20ve.pipeline\x20??\x20\x27—\x27\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-cell\x22\x20style=\x22justify-content:flex-end;\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=\x22openEnginesPipeline(ve.pipeline)\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\x2010px;\x20color:var(--okdb-indigo);\x20opacity:.85;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Open\x20this\x20type-scoped\x20pipeline\x20view\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20⛓\x20View\x20local\x20→\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</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</if>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<!--\x20TTL\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22card\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22>Time-to-Live\x20(TTL)</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22(loadTTLStats(),\x20loadDefaultTTL())\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x20opacity:.6;\x22\x20:disabled=\x22ttlStatsLoading\x22\x20title=\x22Refresh\x20TTL\x20stats\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20↻\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Default\x20TTL\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-bottom:12px;\x20padding:10px;\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20font-weight:600;\x20opacity:.7;\x20margin-bottom:8px;\x22>Default\x20TTL\x20for\x20new\x20items</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22defaultTTL\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:13px;\x20color:var(--okdb-success);\x20margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Currently:\x20<span\x20style=\x22font-family:monospace;\x20font-weight:600;\x22>{{\x20fmtDuration(defaultTTL)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;\x20font-size:11px;\x22>\x20({{\x20defaultTTL\x20}}ms)</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!defaultTTL\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.4;\x20margin-bottom:8px;\x22>No\x20default\x20—\x20items\x20don\x27t\x20expire\x20unless\x20TTL\x20is\x20set\x20explicitly.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:6px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22onDefaultTTLPresetChange($event.target.value)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:2px\x206px;\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:4px;\x20color:var(--okdb-app-fg);\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>Custom…</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x2260000\x22>1\x20min</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22300000\x22>5\x20min</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22900000\x22>15\x20min</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x223600000\x22>1\x20hr</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x2221600000\x22>6\x20hr</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x2286400000\x22>24\x20hr</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22604800000\x22>7\x20days</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x222592000000\x22>30\x20days</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22number\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20!value=\x22defaultTTLInput\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22(defaultTTLInput\x20=\x20$el.value,\x20defaultTTLPreset\x20=\x20\x27\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22ms\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22width:110px;\x20font-size:11px;\x20padding:2px\x206px;\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:4px;\x20color:var(--okdb-app-fg);\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22setDefaultTTLAction()\x22\x20:disabled=\x22defaultTTLBusy\x20||\x20!defaultTTLInput\x20||\x20!$ok.stores.auth.can(\x27data:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27data:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.permTooltip(\x27data:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:2px\x2010px;\x20color:var(--okdb-success);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-success)\x2033%,\x20transparent);\x22>Set</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22defaultTTL\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22clearDefaultTTLAction()\x22\x20:disabled=\x22defaultTTLBusy\x20||\x20!$ok.stores.auth.can(\x27data:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27data:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.permTooltip(\x27data:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20padding:2px\x2010px;\x20color:var(--okdb-danger);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-danger)\x2033%,\x20transparent);\x22>Clear</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20TTL\x20stats\x20-->\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22!ttlStats\x20||\x20!ttlStats.enabled\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;\x20font-size:13px;\x22>No\x20TTL\x20entries\x20for\x20this\x20type\x20—\x20TTL\x20sub-databases\x20are\x20created\x20lazily\x20on\x20first\x20use.</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22ttlStats\x20&&\x20ttlStats.enabled\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:24px;\x20align-items:center;\x20margin-bottom:10px;\x22>\x0a\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\x20style=\x22font-size:18px;\x20font-weight:600;\x20color:var(--okdb-success);\x22>{{\x20ttlStats.totalEntries\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x22>entries</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\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:style=\x22\x27font-size:18px;\x20font-weight:600;\x20color:\x27\x20+\x20(ttlStats.expiredEntries\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-app-fg-muted)\x27)\x20+\x20\x27;\x27\x22>{{\x20ttlStats.expiredEntries\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x22>expired</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\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\x20style=\x22font-size:13px;\x20font-family:monospace;\x20color:var(--okdb-app-fg);\x22>{{\x20ttlStats.nextExpiry\x20?\x20fmtDuration(ttlStats.nextExpiry\x20-\x20Date.now())\x20:\x20\x27—\x27\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x22>next\x20expiry</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\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\x20\x20<button\x20@click=\x22triggerSweep()\x22\x20:disabled=\x22ttlSweepBusy\x20||\x20!$ok.stores.auth.can(\x27data:write\x27)\x22\x20class=\x22btn-icon\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27data:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.permTooltip(\x27data:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22refresh-cw\x22></ok-icon>Sweep\x20expired\x20now\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22ttlSweepBusy\x22><span\x20style=\x22font-size:11px;\x20opacity:.5;\x22>Sweeping…</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<!--\x20Danger\x20zone\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22card\x20card--danger\x22>\x20\x20\x20\x20\x20\x20<div\x20class=\x22manage-section-title\x22\x20style=\x22color:var(--okdb-danger);\x22>⚠\x20Danger\x20Zone</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20flex-wrap:wrap;\x20align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22recomputeFields\x22\x20class=\x22btn-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27data:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27data:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.can(\x27data:write\x27)\x20?\x20\x27Rescan\x20all\x20records\x20to\x20rebuild\x20the\x20field\x20schema\x27\x20:\x20$ok.stores.auth.permTooltip(\x27data:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22refresh-cw\x22></ok-icon>Recompute\x20fields\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22dropType\x22\x20class=\x22btn-danger\x20btn-icon\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!$ok.stores.auth.can(\x27data:write\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22{\x20\x27perm-denied\x27:\x20!$ok.stores.auth.can(\x27data:write\x27)\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:title=\x22$ok.stores.auth.permTooltip(\x27data:write\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22trash-2\x22></ok-icon>Drop\x20type\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</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Schema\x20tab\x20-->\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27schema\x27\x22>\x0a\x20\x20\x20\x20<type-schema-tab\x0a\x20\x20\x20\x20\x20\x20:type=\x22type\x22\x0a\x20\x20\x20\x20\x20\x20:on-view-key=\x22(key)\x20=>\x20setTab(\x27data\x27)\x22\x0a\x20\x20\x20\x20\x20\x20:on-schema-changed=\x22()\x20=>\x20loadViolations()\x22\x0a\x20\x20\x20\x20\x20\x20:on-violation-count-changed=\x22(count)\x20=>\x20onViolationCountChanged(count)\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22flex:1;\x20min-height:0;\x22\x0a\x20\x20\x20\x20/>\x0a\x20\x20</if>\x0a\x0a\x20\x20<if\x20:=\x22tab\x20===\x20\x27engines\x27\x22>\x0a\x20\x20\x20\x20<type-pipelines-tab\x20:type=\x22type\x22\x20:focusedpipeline=\x22currentRoutePipeline\x22\x20:currentmode=\x22currentRouteMode\x22\x20style=\x22flex:1;\x20min-height:0;\x22\x20/>\x0a\x20\x20</if>\x0a\x0a</div>','currentRoutePipeline','replace','score','index','pageSize','loadViolations','split','ftsMode','engine:started','Sweep\x20done:\x20','Failed\x20to\x20set\x20default\x20TTL','push','search','3KPMDuz','$attr','selectedDirection','Recompute\x20failed','unique','usedBy','apiBase','value','null','Rebuilding\x20FTS\x20index\x20\x22','vectorEngines','dropFtsIndex','length','/indexes','/index/','then','total','Create\x20FTS\x20Index','ttlStats','459529bhOlVb','ok-table','success','engine:installed','loadIndexes','deselect','schema','Sweep\x20failed','sizeBytes','selectedIndexStart','typeEngineCount','geoRadius','select','/fts','statusText','/violations/','floor','Add\x20item','engine:error','load','createdBy','clearExpanded','action','selectedEnv','array','geoHighlightedKey','flatMap','Remove\x20index\x20\x22','Rebuild\x20index\x20error','Rebuild\x20failed','Remove\x20failed','$el','ttlStatsLoading','Rebuild\x20FTS\x20error','selectedVectorEngineMeta','/query','\x22?\x20This\x20will\x20re-scan\x20all\x20records.','precision','stores','scalar','startsWith','stringify','engine:uninstalled','open','Create\x20Pipeline\x20·\x20','geoIndexes','view','source_env','entries','DELETE','index:registered','fulfilled','5066964omJizp','/ttl/default','_search','busy','trim','title','shared','geo','isArray','kind','allSettled','loadDefaultTTL','Rebuild\x20FTS\x20index\x20\x22','config','3450MZPAbA','info','possibleIndexes','loadFtsIndexes','json','geoViewMode','__create_pipeline__','/type/','filter','openCreatePipelineModal','expand','resetPaging','radius','Default\x20TTL\x20set\x20(','reverse','__create_index__','envApiBase','confirm','type','3064678qHdmOg','Remove\x20index\x20error','map','/reset','_geoSelSource','engine:stopped','find','mode','type-viewer','index:ready','index:drop','includes','defineProperty','7860944wljGty','pipeline','error','data','keyOf','selectedPrefix','ftsText','openCreateFtsModal','API','ready','selectedIndex','3376rKYjSL','Error\x20fetching\x20indexes','__remove_index__','INDEX_HAS_CONSUMERS','$watch','Drop\x20type\x20\x22','/env/','add','loadGeoQuery','items','slice','fmtDuration','query','changelog','join','toast','/ttl/sweep','stopped','create','/recompute-fields','<add-item-modal\x20:modal=\x22modal\x22\x20:type=\x22type\x22\x20:on-done=\x22onDone\x22\x20/>','Item\x20updated','keys','source_type','manage','selectedVectorEngine','pipelines','findIndex','message','all','geoLat','1403994XGzKPA','lon','geoDistanceMap','hasPrev','POST','running','removeIndex','/fts/','openTypePipelines','displayRows','name','fts:registered','overview','values','7805lDFFqi','[tag]{display:flex;flex-direction:column;height:100%;min-width:0;min-height:0}.ok-table__cell__inner>span.object{color:#a6da95}.ok-table__cell__inner>span.number{color:var(--okdb-accent)}.ok-table__cell__inner>span.boolean{color:#ff6c6b}.ok-table__cell__inner>span.null,.ok-table__cell__inner>span.undefined{color:#c792ea}.ok-table__cell__inner>.key__header{font-weight:700;color:var(--okdb-json-key)}.ok-table__cell__inner>.key__cell{color:var(--okdb-json-key)}.fts-score-badge,.mode-count{display:inline-block;border-radius:999px;font-size:10px;vertical-align:middle}.mode-count{margin-left:4px;padding:0\x205px;background:#ffffff18;line-height:1.6}.fts-score-badge{margin-left:5px;padding:1px\x205px;border:1px\x20solid\x20color-mix(in\x20srgb,var(--okdb-accent)\x2033%,transparent);color:var(--okdb-accent);opacity:.8}.vec-score-badge{border:1px\x20solid\x20color-mix(in\x20srgb,var(--okdb-indigo)\x2033%,transparent);color:var(--okdb-indigo)}.direct-value-badge,.geo-dist-badge,.vec-score-badge{display:inline-block;margin-left:5px;padding:1px\x205px;border-radius:999px;font-size:10px;vertical-align:middle;opacity:.8}.geo-dist-badge{border:1px\x20solid\x20color-mix(in\x20srgb,var(--okdb-success)\x2033%,transparent);color:var(--okdb-success)}.direct-value-badge{border:1px\x20solid}.direct-value-badge--scalar{border-color:color-mix(in\x20srgb,var(--okdb-app-fg-muted)\x2033%,transparent);color:var(--okdb-app-fg-muted)}.direct-value-badge--array{border-color:#2dd4bf55;color:#2dd4bf}.direct-value-badge--null{border-color:color-mix(in\x20srgb,var(--okdb-purple)\x2033%,transparent);color:var(--okdb-purple)}.manage-section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.manage-section-title{font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.06em;opacity:.5;margin-bottom:0}.manage-grid{display:grid;gap:0}.manage-grid--2{grid-template-columns:1fr\x201fr}.manage-grid--3{grid-template-columns:1fr\x20auto\x20auto}.manage-grid--4{grid-template-columns:1fr\x20auto\x20auto\x20auto}.manage-grid--idx{grid-template-columns:minmax(80px,2fr)\x20minmax(90px,1fr)\x20minmax(80px,1fr)\x20auto\x20auto\x20auto}.idx-consumer-badge,.idx-owned-badge{display:inline-block;padding:1px\x206px;border-radius:3px;font-size:10px;white-space:nowrap}.idx-owned-badge{background:color-mix(in\x20srgb,var(--okdb-accent)\x2012%,transparent);color:var(--okdb-accent);border:1px\x20solid\x20color-mix(in\x20srgb,var(--okdb-accent)\x2025%,transparent)}.idx-consumer-badge{background:color-mix(in\x20srgb,var(--okdb-sky)\x2012%,transparent);color:var(--okdb-sky);border:1px\x20solid\x20color-mix(in\x20srgb,var(--okdb-sky)\x2025%,transparent)}.manage-grid--fts{grid-template-columns:minmax(80px,1fr)\x202fr\x20minmax(60px,auto)\x20minmax(50px,auto)\x20auto\x20auto}.manage-grid--vec{grid-template-columns:minmax(80px,1fr)\x20minmax(60px,auto)\x20minmax(80px,1fr)\x20auto}.idx-kind-badge{display:inline-block;padding:1px\x207px;border-radius:999px;font-size:10px;border:1px\x20solid;white-space:nowrap}.idx-kind-badge--geo{color:var(--okdb-success);border-color:color-mix(in\x20srgb,var(--okdb-success)\x2033%,transparent)}.idx-kind-badge--unique{color:var(--okdb-warning);border-color:color-mix(in\x20srgb,var(--okdb-warning)\x2033%,transparent)}.idx-kind-badge--regular{color:var(--okdb-app-fg-muted);border-color:color-mix(in\x20srgb,var(--okdb-app-fg-muted)\x2020%,transparent)}.idx-info-strip{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:5px\x208px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-surface-2);border-radius:4px;font-size:11px}.idx-info-label{opacity:.4;white-space:nowrap}.idx-info-field{font-size:11px;color:var(--okdb-json-key)}.idx-info-badge{padding:1px\x207px;border-radius:999px;font-size:10px;border:1px\x20solid;white-space:nowrap}.idx-info-badge--geo{color:var(--okdb-success);border-color:color-mix(in\x20srgb,var(--okdb-success)\x2033%,transparent)}.idx-info-badge--unique{color:var(--okdb-warning);border-color:color-mix(in\x20srgb,var(--okdb-warning)\x2033%,transparent)}.idx-info-badge--regular{color:var(--okdb-app-fg-muted);border-color:color-mix(in\x20srgb,var(--okdb-app-fg-muted)\x2020%,transparent)}.manage-col-hd{font-size:11px;opacity:.4;padding:0\x2012px\x206px\x200;border-bottom:1px\x20solid\x20var(--okdb-app-border);font-weight:400}.manage-cell{padding:6px\x2012px\x206px\x200;border-bottom:1px\x20solid\x20var(--okdb-app-surface);font-size:13px;display:flex;align-items:center;min-width:0}.manage-cell--dim{opacity:.5;font-size:12px}.manage-status{display:inline-block;padding:1px\x207px;border-radius:999px;font-size:10px;border:1px\x20solid}.manage-status--ready{color:var(--okdb-success);border-color:color-mix(in\x20srgb,var(--okdb-success)\x2033%,transparent)}.manage-status--creating,.manage-status--resetting{color:var(--okdb-warning);border-color:color-mix(in\x20srgb,var(--okdb-warning)\x2033%,transparent)}.card--danger{border:1px\x20solid\x20color-mix(in\x20srgb,var(--okdb-danger)\x2013%,transparent)!important}','geoField','Index\x20rebuild\x20complete','indexer','vector-search','key','fields','defaultTTLPreset','63027qfeKVl','fts','/engines','displayVectorName','tab','Index\x20ready:\x20'];_0x5acc=function(){return _0x4193af;};return _0x5acc();}import _0x4cac4e from'../../../components/geo-map.ok.js';import _0x48d424 from'../../../components/ok-json-input.ok.js';import _0x3d17aa from'../../../view-models/type-query-vm.js';import{buildSiftSchema as _0x880d07}from'../../../util/sift-schema.js';import _0x2d1a39 from'../modals/add-item-modal.ok.js';import _0x3879ea from'../modals/create-fts-modal.ok.js';import _0x3e3f49 from'../modals/create-index-modal.ok.js';import _0x43f102 from'../modals/create-pipeline-modal.ok.js';import _0x4bd11c from'./edit-row.ok.js';import _0x12a3df from'../../../stores/events-store.js';import _0x2b9da9 from'./type-changelog.ok.js';import _0xef921d from'./type-pipelines-tab.ok.js';import _0x29c127 from'./type-schema-tab.ok.js';function y(_0x395039){const _0x463f41=_0x392c;return!!_0x395039&&_0x463f41(0x23c)==typeof _0x395039&&!Array[_0x463f41(0x2af)](_0x395039);}function x(_0x29fecf,_0x118a2e){const _0x21ae26=_0x392c;y(_0x29fecf)&&_0x29fecf[_0x21ae26(0x219)]!==_0x118a2e&&Object[_0x21ae26(0x2d4)](_0x29fecf,'__key',{'value':_0x118a2e,'enumerable':!0x1,'configurable':!0x1,'writable':!0x1});}function m(_0x4a2a7e,_0x47a008=0x0){const _0x4cef0f=_0x392c;try{return JSON[_0x4cef0f(0x29c)](_0x4a2a7e,null,_0x47a008)??String(_0x4a2a7e);}catch{return String(_0x4a2a7e);}}export default{'tag':_0x2e63d4(0x2d0),'dependencies':[_0x5f1520,_0x18869b,_0x2acb56,_0x4bd11c,_0x48d424,_0x2b9da9,_0xef921d,_0x29c127,_0x2d1a39,_0x3e3f49,_0x3879ea,_0x43f102,_0x4cac4e],'attr':{'type':{}},'context'(_0x3b4491){const _0x1c76f2=_0x2e63d4;let _0x94be6f=null,_0x223e19=null,_0x18ded9=null;const _0x1546fd=new _0x3d17aa({'type':_0x3b4491[_0x1c76f2(0x261)][_0x1c76f2(0x2c7)],'apiBase':()=>_0x3b4491['$ok'][_0x1c76f2(0x299)][_0x1c76f2(0x238)][_0x1c76f2(0x266)]});return{'tab':'data',get 'envApiBase'(){const _0x28447b=_0x1c76f2;return _0x3b4491[_0x28447b(0x20b)][_0x28447b(0x299)][_0x28447b(0x238)][_0x28447b(0x266)];},get 'type'(){const _0x25748b=_0x1c76f2;return _0x3b4491[_0x25748b(0x261)][_0x25748b(0x2c7)];},'violationCount':0x0,async 'loadViolations'(){const _0x121d18=_0x1c76f2;if(this[_0x121d18(0x2c7)])try{const [_0x5333e1,_0x9d295e]=await Promise[_0x121d18(0x2fd)]([fetch(this['envApiBase']+_0x121d18(0x282)+encodeURIComponent(this[_0x121d18(0x2c7)])),fetch(this[_0x121d18(0x2c5)]+_0x121d18(0x203)+encodeURIComponent(this['type']))]);let _0xc737d5=0x0;if(_0x5333e1['ok']){const _0x110e92=await _0x5333e1['json']();_0xc737d5+=(_0x110e92?.[_0x121d18(0x2d8)]?.['violations']??_0x110e92?.[_0x121d18(0x225)]?.[_0x121d18(0x234)]??[])['length'];}if(_0x9d295e['ok']){const _0x5408d9=await _0x9d295e[_0x121d18(0x2b9)]();_0xc737d5+=(_0x5408d9?.[_0x121d18(0x2d8)]?.[_0x121d18(0x234)]??_0x5408d9?.[_0x121d18(0x225)]?.[_0x121d18(0x234)]??[])[_0x121d18(0x26c)];}this[_0x121d18(0x23e)]=_0xc737d5;}catch{}},'onViolationCountChanged'(_0x3c66d5){const _0x311593=_0x1c76f2;this[_0x311593(0x23e)]=_0x3c66d5;},'query':_0x1546fd,'possibleIndexes':[],'indexStatuses':{},'createIdxPossible':[],'createIdxTypeLoaded':null,'ftsList':[],'vectorEngines':[],'typeEngineCount':0x0,'searchMode':'scan','geoIndexes':[],'geoField':'','geoLat':'','geoLon':'','geoRadius':'','geoSortAsc':!0x0,'geoDistanceMap':{},'mapOpen':!0x1,'geoViewMode':'table','geoHighlightedKey':null,'_geoSelSource':null,get 'geoMapPoints'(){const _0x1eb6fa=_0x1c76f2,_0x1b0b38=this[_0x1eb6fa(0x1f0)];return _0x1b0b38?(this['query'][_0x1eb6fa(0x2e9)]||[])['map'](_0x2fb45b=>{const _0x5ee571=_0x1eb6fa,_0xbab445=_0x2fb45b[_0x5ee571(0x267)]||{},_0x49a282=((_0x4f1f34,_0x3b2676)=>{let _0x3b2188=_0x4f1f34;for(const _0x375005 of _0x3b2676['split']('.')){if(null==_0x3b2188)return null;_0x3b2188=_0x3b2188[_0x375005];}return _0x3b2188;})(_0xbab445,_0x1b0b38);return{'key':_0x2fb45b[_0x5ee571(0x1f4)],'title':_0xbab445[_0x5ee571(0x309)]||_0xbab445[_0x5ee571(0x2ac)]||_0xbab445['label']||_0x2fb45b[_0x5ee571(0x1f4)],'lat':_0x49a282?.[_0x5ee571(0x24f)],'lon':_0x49a282?.[_0x5ee571(0x300)],'distance':_0x2fb45b[_0x5ee571(0x20e)]};})[_0x1eb6fa(0x2bd)](_0x589fe1=>null!=_0x589fe1[_0x1eb6fa(0x24f)]&&null!=_0x589fe1[_0x1eb6fa(0x300)]):[];},'setTab'(_0x268441){const _0x46aa40=_0x1c76f2;if(this[_0x46aa40(0x1fb)]=_0x268441,'engines'===_0x268441)return;const _0x4892fa=_0x3b4491[_0x46aa40(0x243)][_0x46aa40(0x1ff)];if(!_0x4892fa?.[_0x46aa40(0x2a9)]?.['tab'])return;const _0x583092={..._0x4892fa['_search']};delete _0x583092['tab'],delete _0x583092[_0x46aa40(0x2cf)],delete _0x583092[_0x46aa40(0x2d6)],_0x4892fa[_0x46aa40(0x254)](_0x4892fa[_0x46aa40(0x21c)](_0x4892fa[_0x46aa40(0x1fe)]||'',_0x583092,_0x4892fa['_anchor']||''));},'switchToPipelines'(){const _0xc06d50=_0x1c76f2;this[_0xc06d50(0x307)]({'mode':_0xc06d50(0x2fa),'pipeline':this[_0xc06d50(0x253)]||null});},get 'currentRoutePipeline'(){const _0x75185f=_0x1c76f2;return String(_0x3b4491[_0x75185f(0x243)]?.[_0x75185f(0x1ff)]?.[_0x75185f(0x2a9)]?.['pipeline']||'');},get 'currentRouteMode'(){const _0x40727b=_0x1c76f2;return _0x40727b(0x2fa)===String(_0x3b4491['$vars']?.[_0x40727b(0x1ff)]?.[_0x40727b(0x2a9)]?.[_0x40727b(0x2cf)]||'')[_0x40727b(0x2ab)]()?_0x40727b(0x2fa):_0x40727b(0x251);},'openTypePipelines'(_0x18a724={}){const _0x355d0d=_0x1c76f2,_0x3aa184=_0x3b4491[_0x355d0d(0x243)]?.['$router'];if(!_0x3aa184?.['resolve']||!_0x3aa184?.[_0x355d0d(0x25e)])return;const _0x6ca8a6=_0x3b4491['$ok'][_0x355d0d(0x299)][_0x355d0d(0x238)][_0x355d0d(0x28a)]||_0x355d0d(0x22d),_0x257cbb={..._0x3aa184[_0x355d0d(0x2a9)]||{},'env':_0x6ca8a6,'type':this[_0x355d0d(0x2c7)],'tab':_0x355d0d(0x251),'mode':_0x355d0d(0x2fa)===_0x18a724[_0x355d0d(0x2cf)]?_0x355d0d(0x2fa):_0x355d0d(0x251)};_0x18a724['pipeline']?_0x257cbb[_0x355d0d(0x2d6)]=_0x18a724['pipeline']:delete _0x257cbb[_0x355d0d(0x2d6)],_0x3aa184[_0x355d0d(0x25e)](_0x3aa184['resolve']('/db',_0x257cbb));},'openEnginesWorkspace'(_0x2a3bbc={}){const _0x343d0f=_0x1c76f2;if(_0x343d0f(0x2f2)===_0x2a3bbc[_0x343d0f(0x2a1)]){const _0x3873d9=_0x3b4491[_0x343d0f(0x243)]?.['$router'];if(!_0x3873d9?.[_0x343d0f(0x21c)]||!_0x3873d9?.[_0x343d0f(0x25e)])return;const _0x48c6d5={'env':_0x3b4491['$ok']['stores']['okdb'][_0x343d0f(0x28a)]||_0x343d0f(0x22d),'view':'create','sourceType':this[_0x343d0f(0x2c7)]};return _0x2a3bbc[_0x343d0f(0x2b0)]&&(_0x48c6d5[_0x343d0f(0x2b0)]=_0x2a3bbc[_0x343d0f(0x2b0)]),void _0x3873d9[_0x343d0f(0x25e)](_0x3873d9[_0x343d0f(0x21c)]('/engines',_0x48c6d5));}this['openTypePipelines']({'mode':_0x2a3bbc[_0x343d0f(0x2cf)]||_0x343d0f(0x251),'pipeline':_0x2a3bbc[_0x343d0f(0x2d6)]||null});},'openTypePipelinesForSelectedVector'(){const _0x5eb7a9=_0x1c76f2,_0x56e4b9=this[_0x5eb7a9(0x295)]?.['meta']?.[_0x5eb7a9(0x2d6)]||null;this[_0x5eb7a9(0x307)]({'mode':_0x5eb7a9(0x2fa),'pipeline':_0x56e4b9});},'openGlobalEnginesWorkspace'(_0x392107={}){const _0x43c31a=_0x1c76f2,_0x35fa76=_0x3b4491['$vars']?.[_0x43c31a(0x1ff)];if(!_0x35fa76?.[_0x43c31a(0x21c)]||!_0x35fa76?.[_0x43c31a(0x25e)])return;const _0x1c70df={'env':_0x3b4491['$ok'][_0x43c31a(0x299)][_0x43c31a(0x238)][_0x43c31a(0x28a)]||_0x43c31a(0x22d),'sourceType':this[_0x43c31a(0x2c7)]};_0x392107[_0x43c31a(0x2a1)]&&_0x43c31a(0x30b)!==_0x392107[_0x43c31a(0x2a1)]||(_0x1c70df[_0x43c31a(0x2cf)]=_0x43c31a(0x2fa)),_0x392107['view']&&'overview'!==_0x392107[_0x43c31a(0x2a1)]&&(_0x1c70df['view']=_0x392107[_0x43c31a(0x2a1)]),_0x392107[_0x43c31a(0x2b0)]&&(_0x1c70df['kind']=_0x392107[_0x43c31a(0x2b0)]),_0x392107[_0x43c31a(0x2d6)]&&(_0x1c70df[_0x43c31a(0x2d6)]=_0x392107[_0x43c31a(0x2d6)]),_0x35fa76[_0x43c31a(0x25e)](_0x35fa76[_0x43c31a(0x21c)]('/engines',_0x1c70df));},async 'openEnginesCreatePipeline'(){const _0x2800a0=_0x1c76f2;this[_0x2800a0(0x2c7)]&&await _0x3b4491[_0x2800a0(0x20b)][_0x2800a0(0x2ad)][_0x2800a0(0x23d)][_0x2800a0(0x29e)]({'owner':_0x3b4491,'title':_0x2800a0(0x29f)+this[_0x2800a0(0x2c7)],'canDrag':!0x0,'content':_0x2800a0(0x23a),'context':_0x3241a9=>({'modal':_0x3241a9,'type':this[_0x2800a0(0x2c7)],'envName':_0x3b4491[_0x2800a0(0x20b)]['stores'][_0x2800a0(0x238)][_0x2800a0(0x28a)]||_0x2800a0(0x22d),'onDone':async()=>{const _0x162673=_0x2800a0;await Promise[_0x162673(0x2fd)]([this['loadVectorEngines'](!0x0),this[_0x162673(0x237)]()]);}})});},'openEnginesPipeline'(_0x4c55fe=null){const _0x51af0b=_0x1c76f2;this[_0x51af0b(0x307)]({'mode':_0x51af0b(0x2fa),'pipeline':_0x4c55fe||null});},'switchToEngines'(){const _0x4ee091=_0x1c76f2;this[_0x4ee091(0x307)]({'mode':_0x4ee091(0x251),'pipeline':this[_0x4ee091(0x253)]||null});},'setSearchMode'(_0x46ed9c){const _0x176fe5=_0x1c76f2;if(this['searchMode']=_0x46ed9c,this['query']['selectedIndex']=null,this[_0x176fe5(0x2ec)]['selectedFtsIndex']=null,this[_0x176fe5(0x2ec)][_0x176fe5(0x2f9)]=null,this[_0x176fe5(0x2ec)]['selectedPrefix']=void 0x0,this[_0x176fe5(0x2ec)]['selectedIndexStart']=void 0x0,this[_0x176fe5(0x2ec)][_0x176fe5(0x217)]=void 0x0,this[_0x176fe5(0x301)]={},this[_0x176fe5(0x28c)]=null,'geo'!==_0x46ed9c){this[_0x176fe5(0x2ba)]=_0x176fe5(0x242);try{_0x3b4491[_0x176fe5(0x292)]?.['querySelector'](_0x176fe5(0x274))?.[_0x176fe5(0x231)]?.();}catch(_0x2f835e){}}},'_updateGeoIndexes'(){const _0x3b3c55=_0x1c76f2;this[_0x3b3c55(0x2a0)]=this[_0x3b3c55(0x2b7)][_0x3b3c55(0x2bd)](_0x19eb33=>this['indexStatuses'][_0x19eb33]?.[_0x3b3c55(0x244)]),this[_0x3b3c55(0x2a0)]['length']&&!this[_0x3b3c55(0x1f0)]&&(this['geoField']=this[_0x3b3c55(0x2a0)][0x0]);},async 'loadGeoQuery'(){const _0x3f3521=_0x1c76f2;if(!this['type']||!this[_0x3f3521(0x1f0)])return;const _0x5e02a8=parseFloat(this[_0x3f3521(0x2fe)]),_0x277545=parseFloat(this[_0x3f3521(0x21f)]);if(isNaN(_0x5e02a8)||isNaN(_0x277545))return;const _0x11febe=this[_0x3f3521(0x27e)]?parseFloat(this['geoRadius']):void 0x0;this['query'][_0x3f3521(0x2aa)]=!0x0,this['geoDistanceMap']={};try{const _0x2be871={...this['query'][_0x3f3521(0x2ec)]},_0x1b4b43={'lat':_0x5e02a8,'lon':_0x277545};_0x11febe&&!isNaN(_0x11febe)&&(_0x1b4b43[_0x3f3521(0x2c1)]=_0x11febe),_0x2be871[this['geoField']]={'$near':_0x1b4b43};const _0x15b347=await fetch(this['envApiBase']+_0x3f3521(0x2bc)+this['type']+_0x3f3521(0x296),{'method':_0x3f3521(0x303),'headers':{'Content-Type':_0x3f3521(0x204)},'body':JSON[_0x3f3521(0x29c)]({'filter':_0x2be871,'options':{'limit':this['query'][_0x3f3521(0x257)]}})});if(!_0x15b347['ok'])throw new Error(_0x15b347['statusText']);const {data:_0x210a24,meta:_0x51f6ac}=await _0x15b347[_0x3f3521(0x2b9)]();let _0x2f54c1=_0x210a24??[];this[_0x3f3521(0x220)]||(_0x2f54c1=_0x2f54c1[_0x3f3521(0x2ea)]()[_0x3f3521(0x2c3)]()),this['query'][_0x3f3521(0x2e9)]=_0x2f54c1;const _0x1e713e={};this[_0x3f3521(0x2ec)][_0x3f3521(0x30c)]=_0x2f54c1[_0x3f3521(0x2ca)](_0x34f80d=>(x(_0x34f80d[_0x3f3521(0x267)],_0x34f80d['key']),null!=_0x34f80d[_0x3f3521(0x20e)]&&(_0x1e713e[_0x34f80d['key']]=_0x34f80d['distance']),_0x34f80d['value'])),this[_0x3f3521(0x301)]=_0x1e713e,this[_0x3f3521(0x2ec)]['hasNext']=!0x1,this[_0x3f3521(0x2ec)][_0x3f3521(0x302)]=!0x1,this[_0x3f3521(0x2ec)]['_current']=null,this[_0x3f3521(0x2ec)]['_backStack']=[],this[_0x3f3521(0x2ec)][_0x3f3521(0x218)]=_0x51f6ac?.[_0x3f3521(0x218)]??null,this['query'][_0x3f3521(0x270)]=_0x2f54c1[_0x3f3521(0x26c)];}catch(_0xbfee42){console[_0x3f3521(0x2d7)](_0x3f3521(0x215),_0xbfee42);}finally{this[_0x3f3521(0x2ec)][_0x3f3521(0x2aa)]=!0x1;}},get 'selectedVectorEngineMeta'(){const _0x1eef6d=_0x1c76f2;return this[_0x1eef6d(0x2ec)][_0x1eef6d(0x2f9)]?this['vectorEngines']['find'](_0x14896a=>this[_0x1eef6d(0x1fa)](_0x14896a[_0x1eef6d(0x309)])===this['query'][_0x1eef6d(0x2f9)])??null:null;},'helpOpen':!0x1,get 'typeFields'(){const _0x1c629f=_0x1c76f2,_0x3a0b91=(_0x3b4491['$ok'][_0x1c629f(0x299)][_0x1c629f(0x238)][_0x1c629f(0x23b)]||[])[_0x1c629f(0x2ce)](_0x25b7b2=>_0x25b7b2[_0x1c629f(0x2c7)]===this[_0x1c629f(0x2c7)]);return _0x3a0b91?.['fields']||{};},get 'typeCount'(){const _0x2fa505=_0x1c76f2,_0xa06048=(_0x3b4491[_0x2fa505(0x20b)][_0x2fa505(0x299)][_0x2fa505(0x238)][_0x2fa505(0x23b)]||[])['find'](_0x5e25cc=>_0x5e25cc[_0x2fa505(0x2c7)]===this[_0x2fa505(0x2c7)]);return _0xa06048?.['count']??'?';},get 'typeFieldEntries'(){const _0x40d15d=_0x1c76f2;return Object[_0x40d15d(0x2a3)](this['typeFields'])[_0x40d15d(0x2ca)](([_0x16e223,_0x1660c3])=>({'name':_0x16e223,'types':_0x1660c3}));},get 'indexEntries'(){const _0x3cb97d=_0x1c76f2;return this[_0x3cb97d(0x2b7)]['map'](_0x8917fb=>({'name':_0x8917fb,'fields':_0x8917fb[_0x3cb97d(0x259)]('~'),'status':this['indexStatuses'][_0x8917fb]?.[_0x3cb97d(0x24a)]||'ready','isGeo':!!this['indexStatuses'][_0x8917fb]?.[_0x3cb97d(0x244)],'geoPrecision':this[_0x3cb97d(0x208)][_0x8917fb]?.[_0x3cb97d(0x244)]?.[_0x3cb97d(0x298)]??null,'isUnique':!!this['indexStatuses'][_0x8917fb]?.['unique'],'createdBy':this['indexStatuses'][_0x8917fb]?.[_0x3cb97d(0x287)]??null,'usedBy':this[_0x3cb97d(0x208)][_0x8917fb]?.['usedBy']??[]}));},get 'selectedIndexInfo'(){const _0x5789c8=_0x1c76f2,_0x4743f5=this[_0x5789c8(0x2ec)][_0x5789c8(0x2df)];if(!_0x4743f5)return null;const _0xaeef98=this[_0x5789c8(0x208)][_0x4743f5];return{'fields':_0x4743f5[_0x5789c8(0x259)]('~'),'isGeo':!!_0xaeef98?.['geoConfig'],'geoPrecision':_0xaeef98?.['geoConfig']?.['precision']??null,'isUnique':!!_0xaeef98?.[_0x5789c8(0x264)]};},get 'ftsEntries'(){const _0x2b380a=_0x1c76f2;return this['ftsList'][_0x2b380a(0x2ca)](_0x3e7084=>({'name':_0x3e7084[_0x2b380a(0x309)],'status':_0x3e7084['status']||'ready','fields':(_0x3e7084['config']&&_0x3e7084['config'][_0x2b380a(0x1f5)]?_0x3e7084[_0x2b380a(0x2b4)][_0x2b380a(0x1f5)]:[])['join'](',\x20'),'sizeBytes':_0x3e7084[_0x2b380a(0x27b)]??null}));},'fmtBytes'(_0x14d702){const _0x1e6b53=_0x1c76f2;if(null==_0x14d702||0x0===_0x14d702)return'—';const _0x5e1d4f=['B','KB','MB','GB'];let _0x4eb23c=_0x14d702,_0x5f536a=0x0;for(;_0x4eb23c>=0x400&&_0x5f536a<_0x5e1d4f[_0x1e6b53(0x26c)]-0x1;)_0x4eb23c/=0x400,_0x5f536a++;return _0x4eb23c[_0x1e6b53(0x230)](0x1)+'\u00a0'+_0x5e1d4f[_0x5f536a];},'ttlStats':null,'ttlStatsLoading':!0x1,'ttlSweepBusy':!0x1,'defaultTTL':null,'defaultTTLInput':'','defaultTTLPreset':'','defaultTTLBusy':!0x1,async 'loadTTLStats'(){const _0xb1b52c=_0x1c76f2;if(this[_0xb1b52c(0x2c7)]){this['ttlStatsLoading']=!0x0;try{const _0x5565fa=await fetch(this[_0xb1b52c(0x2c5)]+'/ttl/stats?type='+encodeURIComponent(this[_0xb1b52c(0x2c7)])),_0x4739c0=await _0x5565fa[_0xb1b52c(0x2b9)]();this['ttlStats']=_0x4739c0[_0xb1b52c(0x2d8)]??_0x4739c0[_0xb1b52c(0x225)]??null;}catch{this[_0xb1b52c(0x272)]=null;}finally{this[_0xb1b52c(0x293)]=!0x1;}}},async 'loadDefaultTTL'(){const _0x4f95ea=_0x1c76f2;if(this[_0x4f95ea(0x2c7)])try{const _0x2f4178=await fetch(this[_0x4f95ea(0x2c5)]+'/type/'+encodeURIComponent(this['type'])+_0x4f95ea(0x2a8)),_0x423152=await _0x2f4178[_0x4f95ea(0x2b9)](),_0x3da2f4=_0x423152[_0x4f95ea(0x2d8)]?.['defaultTTL']??_0x423152[_0x4f95ea(0x225)]?.['defaultTTL']??null;this[_0x4f95ea(0x228)]=_0x3da2f4,this['defaultTTLInput']=_0x3da2f4?String(_0x3da2f4):'',this[_0x4f95ea(0x1f6)]=_0x3da2f4?String(_0x3da2f4):'';}catch{this[_0x4f95ea(0x228)]=null;}},async 'setDefaultTTLAction'(){const _0x5538be=_0x1c76f2,_0x44aa72=parseInt(this['defaultTTLInput']);if(_0x44aa72&&!(_0x44aa72<=0x0)){this['defaultTTLBusy']=!0x0;try{const _0x1d4f87=await fetch(this[_0x5538be(0x2c5)]+_0x5538be(0x2bc)+encodeURIComponent(this[_0x5538be(0x2c7)])+_0x5538be(0x2a8),{'method':'PUT','headers':{'Content-Type':_0x5538be(0x204)},'body':JSON[_0x5538be(0x29c)]({'ttl':_0x44aa72})});if(!_0x1d4f87['ok']){const _0x4ea905=await _0x1d4f87[_0x5538be(0x2b9)]()[_0x5538be(0x21e)](()=>({}));throw new Error(_0x4ea905?.[_0x5538be(0x2d7)]?.[_0x5538be(0x2fc)]||_0x1d4f87[_0x5538be(0x281)]);}this[_0x5538be(0x228)]=_0x44aa72,_0x3b4491[_0x5538be(0x20b)][_0x5538be(0x2ad)]?.[_0x5538be(0x2ef)]?.[_0x5538be(0x2b6)]?.(_0x5538be(0x2c2)+this[_0x5538be(0x2eb)](_0x44aa72)+')');}catch(_0x53031e){_0x3b4491['$ok'][_0x5538be(0x2ad)]?.[_0x5538be(0x2ef)]?.[_0x5538be(0x2d7)]?.(_0x53031e['message']||_0x5538be(0x25d));}finally{this[_0x5538be(0x206)]=!0x1;}}},async 'clearDefaultTTLAction'(){const _0x17e9fb=_0x1c76f2;this[_0x17e9fb(0x206)]=!0x0;try{const _0x4ef85b=await fetch(this[_0x17e9fb(0x2c5)]+_0x17e9fb(0x2bc)+encodeURIComponent(this[_0x17e9fb(0x2c7)])+_0x17e9fb(0x2a8),{'method':_0x17e9fb(0x2a4)});if(!_0x4ef85b['ok'])throw new Error(_0x4ef85b[_0x17e9fb(0x281)]);this[_0x17e9fb(0x228)]=null,this[_0x17e9fb(0x250)]='',this['defaultTTLPreset']='',_0x3b4491[_0x17e9fb(0x20b)][_0x17e9fb(0x2ad)]?.['toast']?.[_0x17e9fb(0x2b6)]?.(_0x17e9fb(0x1fd));}catch(_0x35f47d){_0x3b4491[_0x17e9fb(0x20b)][_0x17e9fb(0x2ad)]?.[_0x17e9fb(0x2ef)]?.['error']?.(_0x35f47d['message']||'Failed\x20to\x20clear\x20default\x20TTL');}finally{this['defaultTTLBusy']=!0x1;}},'onDefaultTTLPresetChange'(_0x39b1fc){const _0x590589=_0x1c76f2;this[_0x590589(0x1f6)]=_0x39b1fc,_0x39b1fc&&(this[_0x590589(0x250)]=_0x39b1fc);},async 'triggerSweep'(){const _0x2bb5fd=_0x1c76f2;this[_0x2bb5fd(0x239)]=!0x0;try{const _0x437a0d=await fetch(this[_0x2bb5fd(0x2c5)]+_0x2bb5fd(0x2f0),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'batchSize':0x3e8})}),_0x436312=await _0x437a0d[_0x2bb5fd(0x2b9)](),_0xe31f4f=_0x2bb5fd(0x25c)+((_0x436312[_0x2bb5fd(0x2d8)]??_0x436312[_0x2bb5fd(0x225)]??{})['removed']??0x0)+_0x2bb5fd(0x20c);_0x3b4491['$ok'][_0x2bb5fd(0x2ad)]?.[_0x2bb5fd(0x2ef)]?.[_0x2bb5fd(0x2b6)]?.(_0xe31f4f),await this[_0x2bb5fd(0x240)](),await this[_0x2bb5fd(0x2ec)][_0x2bb5fd(0x286)]();}catch(_0x5a3833){_0x3b4491[_0x2bb5fd(0x20b)][_0x2bb5fd(0x2ad)]?.[_0x2bb5fd(0x2ef)]?.[_0x2bb5fd(0x2d7)]?.(_0x5a3833[_0x2bb5fd(0x2fc)]||_0x2bb5fd(0x27a));}finally{this[_0x2bb5fd(0x239)]=!0x1;}},'fmtDuration'(_0x288e06){const _0x261b84=_0x1c76f2;if(null==_0x288e06)return'—';const _0x35ae81=Math[_0x261b84(0x283)](_0x288e06/0x3e8);return _0x35ae81<0x3c?_0x35ae81+'s':_0x35ae81<0xe10?Math['floor'](_0x35ae81/0x3c)+'m\x20'+_0x35ae81%0x3c+'s':_0x35ae81<0x15180?Math[_0x261b84(0x283)](_0x35ae81/0xe10)+'h\x20'+Math[_0x261b84(0x283)](_0x35ae81%0xe10/0x3c)+'m':Math[_0x261b84(0x283)](_0x35ae81/0x15180)+'d\x20'+Math[_0x261b84(0x283)](_0x35ae81%0x15180/0xe10)+'h';},get 'vectorEntries'(){const _0x1ce2f4=_0x1c76f2;return this[_0x1ce2f4(0x26a)][_0x1ce2f4(0x2ca)](_0x252160=>({'name':_0x252160['name'],'displayName':this[_0x1ce2f4(0x1fa)](_0x252160[_0x1ce2f4(0x309)]),'status':_0x252160['isRunning']?_0x1ce2f4(0x304):_0x252160['status']||_0x1ce2f4(0x2f1),'running':_0x252160[_0x1ce2f4(0x235)],'pipeline':_0x252160['meta']&&_0x252160[_0x1ce2f4(0x247)][_0x1ce2f4(0x2d6)]?_0x252160[_0x1ce2f4(0x247)][_0x1ce2f4(0x2d6)]:null}));},get 'siftSchema'(){const _0x1a06b8=_0x1c76f2;return _0x880d07(this[_0x1a06b8(0x222)]);},async 'loadIndexes'(_0x46bff8=!0x1){const _0x560474=_0x1c76f2;if(this[_0x560474(0x2c7)]&&(_0x46bff8||_0x94be6f!==this[_0x560474(0x2c7)]))try{const _0x587d9e=await fetch(this[_0x560474(0x2c5)]+_0x560474(0x2bc)+this[_0x560474(0x2c7)]+_0x560474(0x26d)),_0x3c37f5=await _0x587d9e[_0x560474(0x2b9)](),_0x536087=_0x3c37f5['data']??_0x3c37f5[_0x560474(0x225)]??{};this[_0x560474(0x2b7)]=Object[_0x560474(0x2f6)](_0x536087),this['indexStatuses']=_0x536087,this['_updateGeoIndexes'](),_0x94be6f=this['type'];}catch(_0x41a80f){console[_0x560474(0x2d7)](_0x560474(0x2e1),_0x41a80f);}},async 'loadFtsIndexes'(_0x268a80=!0x1){const _0x1068b2=_0x1c76f2;if(this[_0x1068b2(0x2c7)]&&(_0x268a80||_0x223e19!==this[_0x1068b2(0x2c7)]))try{const _0x42bf64=await fetch(this[_0x1068b2(0x2c5)]+'/type/'+this[_0x1068b2(0x2c7)]+_0x1068b2(0x280)),{data:_0x5667fd}=await _0x42bf64[_0x1068b2(0x2b9)]();this['ftsList']=_0x5667fd||[],_0x223e19=this[_0x1068b2(0x2c7)];}catch(_0x552f68){console[_0x1068b2(0x2d7)](_0x1068b2(0x22e),_0x552f68);}},async 'loadVectorEngines'(_0x207821=!0x1){const _0x431987=_0x1c76f2;if(this[_0x431987(0x2c7)]&&(_0x207821||_0x18ded9!==this['type']))try{const _0x224815=_0x3b4491[_0x431987(0x20b)][_0x431987(0x299)][_0x431987(0x238)][_0x431987(0x28a)]||_0x431987(0x22d),[_0x2c0563,_0x480721]=await Promise[_0x431987(0x2b1)]([fetch(__ENV__['API']+_0x431987(0x2e6)+encodeURIComponent(_0x224815)+_0x431987(0x1f9))[_0x431987(0x26f)](_0x20dbe8=>_0x20dbe8['json']()),fetch(__ENV__[_0x431987(0x2dd)]+'/embeddings/embedders')['then'](_0x134e95=>_0x134e95[_0x431987(0x2b9)]())]),_0x17da5d='fulfilled'===_0x2c0563[_0x431987(0x24a)]?_0x2c0563[_0x431987(0x267)]?.['result']??_0x2c0563[_0x431987(0x267)]?.['data']??[]:[],_0x22d549=[..._0x431987(0x2a6)===_0x480721[_0x431987(0x24a)]?_0x480721[_0x431987(0x267)]?.['data']??[]:[],..._0x17da5d],_0x1d94da={};for(const _0xb1ade2 of _0x22d549)_0x431987(0x1f2)===_0xb1ade2['type']&&_0xb1ade2['config']&&(_0x1d94da[_0xb1ade2['name']]={'source_type':_0xb1ade2[_0x431987(0x2b4)][_0x431987(0x2f7)],'source_env':_0xb1ade2[_0x431987(0x2b4)][_0x431987(0x2a2)]??_0x431987(0x22d)});this[_0x431987(0x26a)]=_0x22d549[_0x431987(0x2bd)](_0x350022=>{const _0x2c1b06=_0x431987;if(_0x2c1b06(0x1f3)!==_0x350022[_0x2c1b06(0x2c7)])return!0x1;const _0xed7af0=_0x350022[_0x2c1b06(0x2b4)]?.[_0x2c1b06(0x2f7)],_0x5b8c48=_0x350022[_0x2c1b06(0x2b4)]?.[_0x2c1b06(0x2a2)]??_0x2c1b06(0x22d);if(_0xed7af0===this[_0x2c1b06(0x2c7)]&&_0x5b8c48===_0x224815)return!0x0;const _0x1e99dd=_0x1d94da[_0x350022['name']];return _0x1e99dd?.[_0x2c1b06(0x2f7)]===this[_0x2c1b06(0x2c7)]&&(_0x1e99dd?.[_0x2c1b06(0x2a2)]??_0x2c1b06(0x22d))===_0x224815;}),_0x18ded9=this[_0x431987(0x2c7)];}catch(_0x43a3be){this['vectorEngines']=[];}},async 'loadTypeEnginesCount'(){const _0x21aae9=_0x1c76f2;if(this[_0x21aae9(0x2c7)])try{const _0x5d4402=_0x3b4491[_0x21aae9(0x20b)]['stores'][_0x21aae9(0x238)][_0x21aae9(0x28a)]||_0x21aae9(0x22d),_0x39631a=await fetch(__ENV__[_0x21aae9(0x2dd)]+_0x21aae9(0x2e6)+encodeURIComponent(_0x5d4402)+_0x21aae9(0x2bc)+encodeURIComponent(this[_0x21aae9(0x2c7)])+'/pipelines'),_0x5b2ebf=await _0x39631a[_0x21aae9(0x2b9)]()[_0x21aae9(0x21e)](()=>({})),_0x516d26=_0x39631a['ok']?_0x5b2ebf?.[_0x21aae9(0x2d8)]??[]:[],_0x3531b3=new Set();for(const _0x5c0297 of _0x516d26[_0x21aae9(0x28d)](_0x331155=>_0x331155?.[_0x21aae9(0x251)]??[])){const _0x21a28c=_0x5c0297?.[_0x21aae9(0x1f4)]??(_0x5c0297?.['type']&&_0x5c0297?.[_0x21aae9(0x309)]?_0x5c0297[_0x21aae9(0x2c7)]+'@'+_0x5c0297[_0x21aae9(0x309)]:_0x5c0297?.[_0x21aae9(0x309)]??null);_0x21a28c&&_0x3531b3[_0x21aae9(0x2e7)](_0x21a28c);}this[_0x21aae9(0x27d)]=_0x3531b3['size'];}catch{this[_0x21aae9(0x27d)]=0x0;}else this[_0x21aae9(0x27d)]=0x0;},async 'recomputeFields'(){const _0x1fd329=_0x1c76f2;if(this['type'])try{await fetch(this[_0x1fd329(0x2c5)]+_0x1fd329(0x2bc)+this[_0x1fd329(0x2c7)]+_0x1fd329(0x2f3),{'method':_0x1fd329(0x303)}),await _0x3b4491['$ok']['stores'][_0x1fd329(0x238)][_0x1fd329(0x214)](),_0x3b4491['$ok'][_0x1fd329(0x2ad)]?.[_0x1fd329(0x2ef)]?.[_0x1fd329(0x275)]?.(_0x1fd329(0x22b));}catch(_0x426b25){console[_0x1fd329(0x2d7)](_0x1fd329(0x24c),_0x426b25),_0x3b4491['$ok'][_0x1fd329(0x2ad)]?.[_0x1fd329(0x2ef)]?.[_0x1fd329(0x2d7)]?.(_0x1fd329(0x263));}},'indexStatusBadge'(_0x327589){const _0x267914=_0x1c76f2,_0xe78478=this[_0x267914(0x208)]?.[_0x327589]?.['status'];return _0xe78478&&_0x267914(0x2de)!==_0xe78478?_0xe78478:null;},'ftsStatusBadge'(_0x369f80){const _0x544074=_0x1c76f2,_0x215da1=_0x369f80?.[_0x544074(0x24a)];return _0x215da1&&_0x544074(0x2de)!==_0x215da1?_0x215da1:null;},'keyOf':_0x521088=>_0x521088?.[_0x1c76f2(0x219)]??_0x521088?.[_0x1c76f2(0x1f4)]??null,get 'hasDirectValueRows'(){const _0x385b8d=_0x1c76f2;return(this[_0x385b8d(0x2ec)][_0x385b8d(0x2e9)]||[])['some'](_0x551e32=>!y(_0x551e32?.[_0x385b8d(0x267)]));},get 'displayRows'(){const _0x204d59=_0x1c76f2;return this[_0x204d59(0x216)]?this[_0x204d59(0x2ec)][_0x204d59(0x2e9)]:this[_0x204d59(0x2ec)][_0x204d59(0x30c)];},'rowValueOf':_0xc752fd=>_0xc752fd&&'object'==typeof _0xc752fd&&_0x1c76f2(0x1f4)in _0xc752fd&&_0x1c76f2(0x267)in _0xc752fd?_0xc752fd[_0x1c76f2(0x267)]:_0xc752fd,'directValueKindOf'(_0x47d09f){const _0xb7a2f=_0x1c76f2,_0x1e5827=this[_0xb7a2f(0x229)](_0x47d09f);return null===_0x1e5827?_0xb7a2f(0x268):Array['isArray'](_0x1e5827)?_0xb7a2f(0x28b):y(_0x1e5827)?null:_0xb7a2f(0x29a);},'inlineValueOf'(_0x4884be){const _0x40bf7b=_0x1c76f2;return m(this[_0x40bf7b(0x229)](_0x4884be));},'prettyValueOf'(_0x1ece79){const _0x2e9ec2=_0x1c76f2;return m(this[_0x2e9ec2(0x229)](_0x1ece79),0x2);},'scoreOf'(_0x31385f){const _0x2aa5b5=_0x1c76f2,_0x4f54ea=this[_0x2aa5b5(0x2d9)](_0x31385f);return _0x4f54ea?this['query']['ftsScoreMap']?.[_0x4f54ea]?.[_0x2aa5b5(0x255)]??null:null;},'matchOf'(_0x4bd317){const _0x330e59=_0x1c76f2,_0x25260a=this[_0x330e59(0x2d9)](_0x4bd317);if(!_0x25260a)return null;const _0x14df12=this[_0x330e59(0x2ec)][_0x330e59(0x224)]?.[_0x25260a];if(!_0x14df12||null==_0x14df12[_0x330e59(0x255)])return null;const _0x7f54af=_0x14df12['maxScore']??0x2*_0x14df12[_0x330e59(0x20a)];return _0x14df12['score']+'/'+_0x7f54af;},'vectorScoreOf'(_0xe01de7){const _0x31f07f=_0x1c76f2,_0x3dbd94=this['keyOf'](_0xe01de7);if(!_0x3dbd94)return null;const _0x1901d0=this[_0x31f07f(0x2ec)]['vectorScoreMap']?.[_0x3dbd94];return null==_0x1901d0?null:Math[_0x31f07f(0x246)](0x64*_0x1901d0)+'%';},'vectorChunkMetaOf'(_0x17e84f){const _0x25ae85=_0x1c76f2,_0x1737fc=this[_0x25ae85(0x2d9)](_0x17e84f);return _0x1737fc?this[_0x25ae85(0x2ec)][_0x25ae85(0x200)]?.[_0x1737fc]??null:null;},'distanceOf'(_0x23a259){const _0x55d04a=_0x1c76f2,_0x34da6a=this[_0x55d04a(0x2d9)](_0x23a259);if(!_0x34da6a)return null;const _0x92f55=this['geoDistanceMap']?.[_0x34da6a];return null==_0x92f55?null:_0x92f55<0x3e8?Math[_0x55d04a(0x246)](_0x92f55)+'\x20m':(_0x92f55/0x3e8)[_0x55d04a(0x230)](0x1)+'\x20km';},'displayVectorName'(_0x1657dc){const _0x5a3df3=_0x1c76f2,_0x104236=(_0x3b4491[_0x5a3df3(0x20b)][_0x5a3df3(0x299)][_0x5a3df3(0x238)][_0x5a3df3(0x28a)]||_0x5a3df3(0x22d))+':';return _0x1657dc[_0x5a3df3(0x29b)](_0x104236)?_0x1657dc[_0x5a3df3(0x2ea)](_0x104236['length']):_0x1657dc;},'selectVectorEngine'(_0x1b200b,_0x5c8e7a){const _0x2ab5ed=_0x1c76f2;if(_0x2ab5ed(0x2bb)===_0x1b200b)return _0x5c8e7a&&(_0x5c8e7a[_0x2ab5ed(0x20d)]['value']=this[_0x2ab5ed(0x2ec)][_0x2ab5ed(0x2f9)]||''),void this[_0x2ab5ed(0x2be)]();this['query'][_0x2ab5ed(0x2f9)]=_0x1b200b||null,this[_0x2ab5ed(0x2ec)][_0x2ab5ed(0x2f9)]&&(this[_0x2ab5ed(0x2ec)]['selectedIndex']=null,this[_0x2ab5ed(0x2ec)]['selectedFtsIndex']=null,this[_0x2ab5ed(0x2ec)][_0x2ab5ed(0x2da)]=void 0x0,this[_0x2ab5ed(0x2ec)][_0x2ab5ed(0x27c)]=void 0x0,this[_0x2ab5ed(0x2ec)][_0x2ab5ed(0x217)]=void 0x0);},'openCreatePipelineModal'(){const _0x5a640=_0x1c76f2;this[_0x5a640(0x22f)]();},'createMenuOpen':!0x1,'onRowChanged'(_0x2fde1b){const _0x487471=_0x1c76f2,_0x15fcca=_0x2fde1b?.[_0x487471(0x213)]??null,_0x3a2860=_0x15fcca?.[_0x487471(0x1f4)]??null;if(null!=_0x3a2860){const _0x2de7ae=this[_0x487471(0x2ec)]['items']['findIndex'](_0x4b6d57=>_0x4b6d57?.[_0x487471(0x1f4)]===_0x3a2860);if(_0x2de7ae>=0x0){const _0x30031e=_0x15fcca?.[_0x487471(0x267)];x(_0x30031e,_0x3a2860),this[_0x487471(0x2ec)][_0x487471(0x2e9)]['splice'](_0x2de7ae,0x1,{...this[_0x487471(0x2ec)][_0x487471(0x2e9)][_0x2de7ae],'value':_0x30031e}),_0x2de7ae<this['query'][_0x487471(0x30c)]['length']&&this[_0x487471(0x2ec)]['values'][_0x487471(0x226)](_0x2de7ae,0x1,_0x30031e);}}_0x3b4491['$ok'][_0x487471(0x2ad)][_0x487471(0x2ef)]['info'](_0x487471(0x2f5)),this[_0x487471(0x258)]();},'onRemoveRow'(_0x4c50ad){const _0x5095bc=_0x1c76f2,_0x316691=this['query']['items'][_0x5095bc(0x2fb)](_0x539f91=>_0x539f91?.[_0x5095bc(0x1f4)]===_0x4c50ad);_0x316691>=0x0&&(this[_0x5095bc(0x2ec)]['values']['splice'](_0x316691,0x1),this['query'][_0x5095bc(0x2e9)]['splice'](_0x316691,0x1));},async 'openAddModal'(){const _0x142164=_0x1c76f2;await _0x3b4491[_0x142164(0x20b)][_0x142164(0x2ad)][_0x142164(0x23d)][_0x142164(0x29e)]({'owner':_0x3b4491,'title':_0x142164(0x284),'content':_0x142164(0x2f4),'context':_0x9c93ba=>({'modal':_0x9c93ba,'type':this[_0x142164(0x2c7)],'onDone':async({key:_0x7c6354,value:_0x325b2e})=>{const _0x266339=_0x142164;x(_0x325b2e,_0x7c6354),this[_0x266339(0x2ec)]['values'][_0x266339(0x207)](_0x325b2e),this['query']['items'][_0x266339(0x207)]({'key':_0x7c6354,'value':_0x325b2e});}})});},async 'openCreateIndex'(){const _0x4a92a8=_0x1c76f2;let _0x219daf={},_0x33d12e=[];try{const _0x523753=await fetch(this[_0x4a92a8(0x2c5)]+_0x4a92a8(0x2bc)+this[_0x4a92a8(0x2c7)]+_0x4a92a8(0x21a)),_0x5c6967=await _0x523753[_0x4a92a8(0x2b9)]();_0x219daf=(_0x5c6967['data']??_0x5c6967[_0x4a92a8(0x225)])?.[_0x4a92a8(0x210)]??{},_0x33d12e=Object[_0x4a92a8(0x2f6)](_0x219daf)[_0x4a92a8(0x2bd)](_0x353d6b=>_0x219daf[_0x353d6b][_0x4a92a8(0x2d3)](_0x4a92a8(0x2ae)));}catch{const _0x2703d2=(_0x3b4491[_0x4a92a8(0x20b)][_0x4a92a8(0x299)]['okdb'][_0x4a92a8(0x23b)]||[])[_0x4a92a8(0x2ce)](_0x5ebea5=>_0x5ebea5[_0x4a92a8(0x2c7)]===this['type']);for(const _0x1b3eb4 of Object[_0x4a92a8(0x2f6)](_0x2703d2?.['fields']||{}))_0x219daf[_0x1b3eb4]=_0x2703d2['fields'][_0x1b3eb4];}await _0x3b4491['$ok'][_0x4a92a8(0x2ad)][_0x4a92a8(0x23d)]['open']({'owner':_0x3b4491,'title':_0x4a92a8(0x24e),'content':'<create-index-modal\x20:modal=\x22modal\x22\x20:type=\x22type\x22\x20:deep-paths=\x22deepPaths\x22\x20:geo-fields=\x22geoFields\x22\x20:on-done=\x22onDone\x22\x20/>','context':_0x384feb=>({'modal':_0x384feb,'type':this[_0x4a92a8(0x2c7)],'deepPaths':_0x219daf,'geoFields':_0x33d12e,'onDone':async()=>{const _0x40459c=_0x4a92a8;await this[_0x40459c(0x277)](!0x0);}})});},async 'dropType'(){const _0x1af53a=_0x1c76f2;if(this[_0x1af53a(0x2c7)]&&await _0x3b4491[_0x1af53a(0x20b)]['shared'][_0x1af53a(0x23d)][_0x1af53a(0x2c6)](_0x1af53a(0x2e5)+this[_0x1af53a(0x2c7)]+_0x1af53a(0x205)))try{await fetch(this['envApiBase']+_0x1af53a(0x2bc)+this[_0x1af53a(0x2c7)],{'method':_0x1af53a(0x2a4)}),await _0x3b4491[_0x1af53a(0x20b)][_0x1af53a(0x299)][_0x1af53a(0x238)][_0x1af53a(0x214)](),_0x3b4491['$el']['dispatchEvent'](new CustomEvent(_0x1af53a(0x22a),{'detail':this[_0x1af53a(0x2c7)]}));}catch(_0x103389){console['error'](_0x1af53a(0x24d),_0x103389);}},async 'removeIndex'(_0x48c54a){const _0x403732=_0x1c76f2,_0x44dfd=_0x48c54a||this[_0x403732(0x2ec)][_0x403732(0x2df)];if(_0x44dfd&&await _0x3b4491[_0x403732(0x20b)][_0x403732(0x2ad)]['modal']['confirm'](_0x403732(0x28e)+_0x44dfd+'\x22?')){try{const _0x485643=await fetch(this[_0x403732(0x2c5)]+_0x403732(0x2bc)+this[_0x403732(0x2c7)]+_0x403732(0x26e)+_0x44dfd,{'method':_0x403732(0x2a4)});if(!_0x485643['ok']){const _0x2d8be0=await _0x485643[_0x403732(0x2b9)]()[_0x403732(0x21e)](()=>({})),_0x3c6597=_0x2d8be0?.['error']?.[_0x403732(0x21b)];if(_0x403732(0x2e3)===_0x3c6597){const _0x2d2e0b=(_0x2d8be0?.[_0x403732(0x2d7)]?.[_0x403732(0x211)]?.[_0x403732(0x265)]??[])[_0x403732(0x2ca)](_0x3cb1f4=>_0x3cb1f4['kind']+':'+_0x3cb1f4[_0x403732(0x309)])[_0x403732(0x2ee)](',\x20');return void _0x3b4491[_0x403732(0x20b)]['shared']?.['toast']?.[_0x403732(0x2d7)]?.('Cannot\x20remove:\x20index\x20is\x20used\x20by\x20'+(_0x2d2e0b||'a\x20consumer'));}throw new Error(_0x2d8be0?.[_0x403732(0x2d7)]?.['message']??_0x403732(0x291));}}catch(_0x164103){return console[_0x403732(0x2d7)](_0x403732(0x2c9),_0x164103),void _0x3b4491[_0x403732(0x20b)]['shared']?.['toast']?.[_0x403732(0x2d7)]?.(_0x164103[_0x403732(0x2fc)]);}this[_0x403732(0x2ec)][_0x403732(0x2df)]===_0x44dfd&&(this['query'][_0x403732(0x2df)]=null),this['query'][_0x403732(0x2c0)](),await this[_0x403732(0x277)](!0x0),await this[_0x403732(0x2ec)][_0x403732(0x286)]();}},'selectIndex'(_0x119bdd){const _0x46f45f=_0x1c76f2;if(_0x46f45f(0x2c4)===_0x119bdd)return this[_0x46f45f(0x2ec)]['selectedIndex']=null,void this[_0x46f45f(0x212)]();_0x46f45f(0x2e2)!==_0x119bdd?(this['query'][_0x46f45f(0x2df)]=_0x119bdd||null,this[_0x46f45f(0x2ec)][_0x46f45f(0x2df)]&&(this[_0x46f45f(0x2ec)]['selectedFtsIndex']=null),this[_0x46f45f(0x2ec)][_0x46f45f(0x2df)]||(this['query'][_0x46f45f(0x2da)]=void 0x0,this[_0x46f45f(0x2ec)][_0x46f45f(0x27c)]=void 0x0,this[_0x46f45f(0x2ec)]['selectedIndexEnd']=void 0x0)):this[_0x46f45f(0x305)]();},'selectFtsIndex'(_0x392d99,_0x4ef42c){const _0x1e3b32=_0x1c76f2;if(_0x1e3b32(0x245)===_0x392d99)return _0x4ef42c&&(_0x4ef42c['target']['value']=this[_0x1e3b32(0x2ec)][_0x1e3b32(0x23f)]||''),void this[_0x1e3b32(0x2dc)]();'__drop_fts__'!==_0x392d99?(this['query'][_0x1e3b32(0x23f)]=_0x392d99||null,this[_0x1e3b32(0x2ec)]['selectedFtsIndex']&&(this[_0x1e3b32(0x2ec)][_0x1e3b32(0x2df)]=null,this['query'][_0x1e3b32(0x2da)]=void 0x0,this['query'][_0x1e3b32(0x27c)]=void 0x0,this[_0x1e3b32(0x2ec)][_0x1e3b32(0x217)]=void 0x0)):this[_0x1e3b32(0x26b)]();},async 'openCreateFtsModal'(){const _0x3d430b=_0x1c76f2;let _0x565dfe={};try{const _0x103e3d=await fetch(this[_0x3d430b(0x2c5)]+_0x3d430b(0x2bc)+this['type']+_0x3d430b(0x21a)),_0x1cf32f=await _0x103e3d[_0x3d430b(0x2b9)]();_0x565dfe=(_0x1cf32f['data']??_0x1cf32f[_0x3d430b(0x225)])?.[_0x3d430b(0x210)]??{};}catch{const _0x521229=(_0x3b4491[_0x3d430b(0x20b)][_0x3d430b(0x299)][_0x3d430b(0x238)][_0x3d430b(0x23b)]||[])['find'](_0x4c8cda=>_0x4c8cda['type']===this[_0x3d430b(0x2c7)]);for(const _0x9912e7 of Object['keys'](_0x521229?.[_0x3d430b(0x1f5)]||{}))_0x565dfe[_0x9912e7]=_0x521229['fields'][_0x9912e7];}await _0x3b4491[_0x3d430b(0x20b)][_0x3d430b(0x2ad)]['modal']['open']({'owner':_0x3b4491,'title':_0x3d430b(0x271),'content':_0x3d430b(0x221),'context':_0x4f896e=>({'modal':_0x4f896e,'type':this[_0x3d430b(0x2c7)],'apiBase':this[_0x3d430b(0x2c5)],'deepPaths':_0x565dfe,'onDone':async()=>{const _0x1f1afa=_0x3d430b;await this[_0x1f1afa(0x2b8)](!0x0);}})});},async 'dropFtsIndex'(_0x346ac2){const _0x24e3ab=_0x1c76f2,_0x24151b=_0x346ac2||this[_0x24e3ab(0x2ec)][_0x24e3ab(0x23f)];if(_0x24151b&&await _0x3b4491[_0x24e3ab(0x20b)][_0x24e3ab(0x2ad)][_0x24e3ab(0x23d)][_0x24e3ab(0x2c6)](_0x24e3ab(0x20f)+_0x24151b+'\x22?\x20This\x20cannot\x20be\x20undone.')){try{await fetch(this['envApiBase']+_0x24e3ab(0x2bc)+this[_0x24e3ab(0x2c7)]+_0x24e3ab(0x306)+encodeURIComponent(_0x24151b),{'method':_0x24e3ab(0x2a4)});}catch(_0xd3df37){return console[_0x24e3ab(0x2d7)](_0x24e3ab(0x236),_0xd3df37),void _0x3b4491[_0x24e3ab(0x20b)][_0x24e3ab(0x2ad)]?.[_0x24e3ab(0x2ef)]?.[_0x24e3ab(0x2d7)]?.(_0x24e3ab(0x241));}this[_0x24e3ab(0x2ec)]['selectedFtsIndex']===_0x24151b&&(this[_0x24e3ab(0x2ec)][_0x24e3ab(0x23f)]=null),await this['loadFtsIndexes'](!0x0),await this[_0x24e3ab(0x2ec)][_0x24e3ab(0x286)]();}},async 'rebuildIndex'(_0x590260){const _0xd96566=_0x1c76f2;if(_0x590260&&await _0x3b4491[_0xd96566(0x20b)][_0xd96566(0x2ad)]['modal'][_0xd96566(0x2c6)]('Rebuild\x20index\x20\x22'+_0x590260+_0xd96566(0x297)))try{await fetch(this[_0xd96566(0x2c5)]+_0xd96566(0x2bc)+this['type']+'/index/'+encodeURIComponent(_0x590260)+_0xd96566(0x2cb),{'method':_0xd96566(0x303)}),_0x3b4491['$ok'][_0xd96566(0x2ad)]?.[_0xd96566(0x2ef)]?.[_0xd96566(0x2b6)]?.(_0xd96566(0x24b)+_0x590260+'\x22…'),await this['loadIndexes'](!0x0);}catch(_0x6747c0){console[_0xd96566(0x2d7)](_0xd96566(0x28f),_0x6747c0),_0x3b4491[_0xd96566(0x20b)]['shared']?.[_0xd96566(0x2ef)]?.['error']?.(_0xd96566(0x290));}},async 'rebuildFts'(_0x28370a){const _0x4a8dc4=_0x1c76f2,_0x56ed8d=_0x28370a||this[_0x4a8dc4(0x2ec)][_0x4a8dc4(0x23f)];if(_0x56ed8d&&await _0x3b4491[_0x4a8dc4(0x20b)]['shared'][_0x4a8dc4(0x23d)]['confirm'](_0x4a8dc4(0x2b3)+_0x56ed8d+_0x4a8dc4(0x249)))try{await fetch(this[_0x4a8dc4(0x2c5)]+_0x4a8dc4(0x2bc)+this['type']+_0x4a8dc4(0x306)+encodeURIComponent(_0x56ed8d)+'/reset',{'method':_0x4a8dc4(0x303)}),_0x3b4491[_0x4a8dc4(0x20b)][_0x4a8dc4(0x2ad)]?.[_0x4a8dc4(0x2ef)]?.[_0x4a8dc4(0x2b6)]?.(_0x4a8dc4(0x269)+_0x56ed8d+'\x22…'),await this[_0x4a8dc4(0x2b8)](!0x0);}catch(_0x54416e){console[_0x4a8dc4(0x2d7)](_0x4a8dc4(0x294),_0x54416e),_0x3b4491[_0x4a8dc4(0x20b)][_0x4a8dc4(0x2ad)]?.[_0x4a8dc4(0x2ef)]?.[_0x4a8dc4(0x2d7)]?.(_0x4a8dc4(0x290));}},'onGeoTableSelect'(_0x19555a){const _0x6132d9=_0x1c76f2;if(_0x6132d9(0x2ae)!==this[_0x6132d9(0x22c)])return;this[_0x6132d9(0x2cc)]=_0x6132d9(0x242);const _0x32616d=_0x19555a['detail']?.[_0x6132d9(0x289)];this[_0x6132d9(0x28c)]=_0x6132d9(0x278)===_0x32616d?null:_0x19555a[_0x6132d9(0x213)]?.[_0x6132d9(0x202)]?.['__key']??null;},'onGeoMapSelect'(_0x3299c0){const _0x5b74b7=_0x1c76f2,_0x5404ad=_0x3299c0[_0x5b74b7(0x213)]?.[_0x5b74b7(0x1f4)]??null;this['_geoSelSource']=_0x5b74b7(0x2ca),this[_0x5b74b7(0x28c)]=this['geoHighlightedKey']===_0x5404ad?null:_0x5404ad;}};},'_unsubs':[],async 'init'(_0x335a66){const _0x18c70b=_0x2e63d4;if(_0x335a66['$watch'](()=>this[_0x18c70b(0x2c7)],async()=>{const _0xf8eae3=_0x18c70b;this[_0xf8eae3(0x2ec)]['type']=this[_0xf8eae3(0x2c7)],this[_0xf8eae3(0x2ec)][_0xf8eae3(0x23f)]=null,this[_0xf8eae3(0x2ec)]['selectedVectorEngine']=null,this[_0xf8eae3(0x22c)]='scan',this[_0xf8eae3(0x2ec)][_0xf8eae3(0x2c0)](),await this[_0xf8eae3(0x277)](!0x0),await this[_0xf8eae3(0x2b8)](!0x0),await this['loadVectorEngines'](!0x0),await this['loadTypeEnginesCount'](),await this['loadViolations'](),await this[_0xf8eae3(0x2ec)][_0xf8eae3(0x286)]();}),_0x335a66['$watch'](()=>[this[_0x18c70b(0x2ec)]['query'],this['query']['selectedIndex'],this['query'][_0x18c70b(0x27c)],this[_0x18c70b(0x2ec)][_0x18c70b(0x217)],this[_0x18c70b(0x2ec)][_0x18c70b(0x262)],this[_0x18c70b(0x2ec)][_0x18c70b(0x223)],this[_0x18c70b(0x2ec)][_0x18c70b(0x2da)],this[_0x18c70b(0x2ec)][_0x18c70b(0x23f)],this[_0x18c70b(0x2ec)][_0x18c70b(0x2db)],this[_0x18c70b(0x2ec)][_0x18c70b(0x25a)],this[_0x18c70b(0x2ec)]['ftsPrefix'],this['query'][_0x18c70b(0x2f9)],this[_0x18c70b(0x2ec)]['vectorText'],this['query']['vectorLimit']],async()=>{const _0x510b5b=_0x18c70b;this[_0x510b5b(0x2c7)]&&(this[_0x510b5b(0x2ec)][_0x510b5b(0x2c0)](),await this[_0x510b5b(0x2ec)][_0x510b5b(0x286)]());}),_0x335a66[_0x18c70b(0x2e4)](()=>[this['searchMode'],this[_0x18c70b(0x1f0)],this[_0x18c70b(0x2fe)],this[_0x18c70b(0x21f)],this[_0x18c70b(0x27e)],this[_0x18c70b(0x220)],this[_0x18c70b(0x2ec)][_0x18c70b(0x2ec)]],async()=>{const _0x26a9c4=_0x18c70b;'geo'===this[_0x26a9c4(0x22c)]&&this[_0x26a9c4(0x2c7)]&&this[_0x26a9c4(0x1f0)]&&this[_0x26a9c4(0x2fe)]&&this[_0x26a9c4(0x21f)]&&await this[_0x26a9c4(0x2e8)]();}),this['type']){const _0x27bef8=new Set([_0x18c70b(0x2d8),_0x18c70b(0x2ed),_0x18c70b(0x2f8),_0x18c70b(0x279),_0x18c70b(0x2fa),_0x18c70b(0x251)]),_0x13a53e=_0x335a66['$vars'][_0x18c70b(0x1ff)]?.[_0x18c70b(0x25f)]?.['tab'];_0x13a53e&&_0x27bef8[_0x18c70b(0x227)](_0x13a53e)&&(this['tab']=_0x18c70b(0x2fa)===_0x13a53e?_0x18c70b(0x251):_0x13a53e),await Promise[_0x18c70b(0x2fd)]([this[_0x18c70b(0x277)](),this[_0x18c70b(0x2b8)](),this[_0x18c70b(0x233)](),this['loadTypeEnginesCount'](),this[_0x18c70b(0x258)](),this[_0x18c70b(0x240)](),this[_0x18c70b(0x2b2)](),this['query'][_0x18c70b(0x286)]()]);}this[_0x18c70b(0x209)]=[_0x12a3df['on'](_0x18c70b(0x21d),()=>{const _0x364e2c=_0x18c70b;this[_0x364e2c(0x277)](!0x0),this[_0x364e2c(0x2b8)](!0x0);}),_0x12a3df['on'](_0x18c70b(0x2d1),_0x4b032a=>{const _0x4ab541=_0x18c70b;this[_0x4ab541(0x277)](!0x0),this[_0x4ab541(0x2b8)](!0x0);const _0x1c6c89=_0x4b032a?.[_0x4ab541(0x2c7)];if(!_0x1c6c89||_0x1c6c89===this[_0x4ab541(0x2c7)]){const _0x4e0b59=_0x4b032a?.[_0x4ab541(0x256)],_0x53792a=Array[_0x4ab541(0x2af)](_0x4e0b59)&&_0x4ab541(0x1f8)===_0x4e0b59[0x0],_0xfee97f=_0x53792a?_0x4e0b59[0x1]:_0x4ab541(0x248)==typeof _0x4e0b59?_0x4e0b59:'',_0x5964c6=_0x53792a?'FTS\x20index\x20ready:\x20'+_0xfee97f:_0xfee97f?_0x4ab541(0x1fc)+_0xfee97f:_0x4ab541(0x1f1);_0x335a66[_0x4ab541(0x20b)][_0x4ab541(0x2ad)]?.[_0x4ab541(0x2ef)]?.['success']?.(_0x5964c6);}}),_0x12a3df['on'](_0x18c70b(0x2a5),()=>this['loadIndexes'](!0x0)),_0x12a3df['on'](_0x18c70b(0x2d2),()=>this['loadIndexes'](!0x0)),_0x12a3df['on'](_0x18c70b(0x30a),()=>this['loadFtsIndexes'](!0x0)),_0x12a3df['on']('fts:drop',()=>this[_0x18c70b(0x2b8)](!0x0)),_0x12a3df['on'](_0x18c70b(0x25b),()=>this[_0x18c70b(0x233)](!0x0)),_0x12a3df['on']('engine:stopped',()=>this['loadVectorEngines'](!0x0)),_0x12a3df['on'](_0x18c70b(0x285),()=>this[_0x18c70b(0x233)](!0x0)),_0x12a3df['on'](_0x18c70b(0x276),()=>this[_0x18c70b(0x233)](!0x0)),_0x12a3df['on'](_0x18c70b(0x29d),()=>this[_0x18c70b(0x233)](!0x0)),_0x12a3df['on'](_0x18c70b(0x25b),()=>this[_0x18c70b(0x237)]()),_0x12a3df['on'](_0x18c70b(0x2cd),()=>this['loadTypeEnginesCount']()),_0x12a3df['on'](_0x18c70b(0x285),()=>this[_0x18c70b(0x237)]()),_0x12a3df['on']('engine:installed',()=>this[_0x18c70b(0x237)]()),_0x12a3df['on'](_0x18c70b(0x29d),()=>this[_0x18c70b(0x237)]()),_0x12a3df['on'](_0x18c70b(0x201),()=>this[_0x18c70b(0x233)](!0x0)),_0x12a3df['on'](_0x18c70b(0x201),()=>this[_0x18c70b(0x237)]())];const _0x2b560c=new Set([_0x18c70b(0x2d8),_0x18c70b(0x2ed),_0x18c70b(0x2f8),_0x18c70b(0x279),_0x18c70b(0x2fa),'engines']);_0x335a66[_0x18c70b(0x2e4)](()=>_0x335a66['$vars'][_0x18c70b(0x1ff)]?.[_0x18c70b(0x2a9)]?.[_0x18c70b(0x1fb)],()=>{const _0x36bd43=_0x18c70b,_0x493c68=_0x335a66['$vars'][_0x36bd43(0x1ff)]?.[_0x36bd43(0x2a9)]?.[_0x36bd43(0x1fb)];if(!_0x493c68)return;const _0x1a99c8=_0x2b560c[_0x36bd43(0x227)](_0x493c68)?'pipelines'===_0x493c68?_0x36bd43(0x251):_0x493c68:_0x36bd43(0x2d8);this['tab']!==_0x1a99c8&&(this[_0x36bd43(0x1fb)]=_0x1a99c8);}),_0x335a66[_0x18c70b(0x2e4)](()=>this['geoHighlightedKey'],_0x1cf1f5=>{const _0x5783d8=_0x18c70b,_0x38a7dc=this['_geoSelSource'];if(this[_0x5783d8(0x2cc)]=null,_0x5783d8(0x2ae)!==this[_0x5783d8(0x22c)])return;if('table'===_0x38a7dc)return;const _0x25ac7f=_0x335a66[_0x5783d8(0x292)]?.[_0x5783d8(0x232)](_0x5783d8(0x274));if(!_0x25ac7f)return;if(!_0x1cf1f5)return _0x25ac7f[_0x5783d8(0x231)]?.(),void _0x25ac7f[_0x5783d8(0x288)]?.();const _0x1b3825=this[_0x5783d8(0x308)]?.[_0x5783d8(0x2ce)](_0x14cd23=>this[_0x5783d8(0x2d9)](_0x14cd23)===_0x1cf1f5);_0x1b3825?(_0x25ac7f[_0x5783d8(0x27f)]?.(_0x1b3825),_0x25ac7f['clearExpanded']?.(),_0x25ac7f[_0x5783d8(0x2bf)]?.(_0x1b3825)):(_0x25ac7f[_0x5783d8(0x231)]?.(),_0x25ac7f[_0x5783d8(0x288)]?.());});},'unmount'(){const _0x4957ee=_0x2e63d4;for(const _0xcee0a7 of this[_0x4957ee(0x209)])_0xcee0a7();this[_0x4957ee(0x209)]=[];},'template':_0x2e63d4(0x252),'style':_0x2e63d4(0x1ef)};
|
|
1
|
+
import e from"@toolkit/elements/ok-icon.ok.js";import n from"@toolkit/elements/ok-table.ok.js";import t from"@toolkit/core/ok-overlay.ok.js";import i from"../../../components/geo-map.ok.js";import o from"../../../components/ok-json-input.ok.js";import s from"../../../view-models/type-query-vm.js";import{buildSiftSchema as a}from"../../../util/sift-schema.js";import r from"../modals/add-item-modal.ok.js";import l from"../modals/create-fts-modal.ok.js";import d from"../modals/create-index-modal.ok.js";import c from"../modals/create-pipeline-modal.ok.js";import p from"./edit-row.ok.js";import u from"../../../stores/events-store.js";import h from"./type-changelog.ok.js";import g from"./type-pipelines-tab.ok.js";import f from"./type-schema-tab.ok.js";function y(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function x(e,n){y(e)&&e.__key!==n&&Object.defineProperty(e,"__key",{value:n,enumerable:!1,configurable:!1,writable:!1})}function m(e,n=0){try{return JSON.stringify(e,null,n)??String(e)}catch{return String(e)}}export default{tag:"type-viewer",dependencies:[e,n,t,p,o,h,g,f,r,d,l,c,i],attr:{type:{}},context(e){let n=null,t=null,i=null;const o=new s({type:e.$attr.type,apiBase:()=>e.$ok.stores.okdb.apiBase});return{tab:"data",get envApiBase(){return e.$ok.stores.okdb.apiBase},get type(){return e.$attr.type},violationCount:0,async loadViolations(){if(this.type)try{const[e,n]=await Promise.all([fetch(`${this.envApiBase}/violations/${encodeURIComponent(this.type)}`),fetch(`${this.envApiBase}/ref-violations/${encodeURIComponent(this.type)}`)]);let t=0;if(e.ok){const n=await e.json();t+=(n?.data?.violations??n?.result?.violations??[]).length}if(n.ok){const e=await n.json();t+=(e?.data?.violations??e?.result?.violations??[]).length}this.violationCount=t}catch{}},onViolationCountChanged(e){this.violationCount=e},query:o,possibleIndexes:[],indexStatuses:{},createIdxPossible:[],createIdxTypeLoaded:null,ftsList:[],vectorEngines:[],typeEngineCount:0,searchMode:"scan",geoIndexes:[],geoField:"",geoLat:"",geoLon:"",geoRadius:"",geoSortAsc:!0,geoDistanceMap:{},mapOpen:!1,geoViewMode:"table",geoHighlightedKey:null,_geoSelSource:null,get geoMapPoints(){const e=this.geoField;return e?(this.query.items||[]).map(n=>{const t=n.value||{},i=((e,n)=>{let t=e;for(const e of n.split(".")){if(null==t)return null;t=t[e]}return t})(t,e);return{key:n.key,title:t.name||t.title||t.label||n.key,lat:i?.lat,lon:i?.lon,distance:n.distance}}).filter(e=>null!=e.lat&&null!=e.lon):[]},setTab(n){if(this.tab=n,"engines"===n)return;const t=e.$vars.$router;if(!t?._search?.tab)return;const i={...t._search};delete i.tab,delete i.mode,delete i.pipeline,t.replace(t.resolve(t._path||"",i,t._anchor||""))},switchToPipelines(){this.openTypePipelines({mode:"pipelines",pipeline:this.currentRoutePipeline||null})},get currentRoutePipeline(){return String(e.$vars?.$router?._search?.pipeline||"")},get currentRouteMode(){return"pipelines"===String(e.$vars?.$router?._search?.mode||"").trim()?"pipelines":"engines"},openTypePipelines(n={}){const t=e.$vars?.$router;if(!t?.resolve||!t?.push)return;const i=e.$ok.stores.okdb.selectedEnv||"default",o={...t._search||{},env:i,type:this.type,tab:"engines",mode:"pipelines"===n.mode?"pipelines":"engines"};n.pipeline?o.pipeline=n.pipeline:delete o.pipeline,t.push(t.resolve("/db",o))},openEnginesWorkspace(n={}){if("create"===n.view){const t=e.$vars?.$router;if(!t?.resolve||!t?.push)return;const i={env:e.$ok.stores.okdb.selectedEnv||"default",view:"create",sourceType:this.type};return n.kind&&(i.kind=n.kind),void t.push(t.resolve("/engines",i))}this.openTypePipelines({mode:n.mode||"engines",pipeline:n.pipeline||null})},openTypePipelinesForSelectedVector(){const e=this.selectedVectorEngineMeta?.meta?.pipeline||null;this.openTypePipelines({mode:"pipelines",pipeline:e})},openGlobalEnginesWorkspace(n={}){const t=e.$vars?.$router;if(!t?.resolve||!t?.push)return;const i={env:e.$ok.stores.okdb.selectedEnv||"default",sourceType:this.type};n.view&&"overview"!==n.view||(i.mode="pipelines"),n.view&&"overview"!==n.view&&(i.view=n.view),n.kind&&(i.kind=n.kind),n.pipeline&&(i.pipeline=n.pipeline),t.push(t.resolve("/engines",i))},async openEnginesCreatePipeline(){this.type&&await e.$ok.shared.modal.open({owner:e,title:`Create Pipeline · ${this.type}`,canDrag:!0,content:'<create-pipeline-modal :modal="modal" :type="type" :env="envName" :on-done="onDone" />',context:n=>({modal:n,type:this.type,envName:e.$ok.stores.okdb.selectedEnv||"default",onDone:async()=>{await Promise.all([this.loadVectorEngines(!0),this.loadTypeEnginesCount()])}})})},openEnginesPipeline(e=null){this.openTypePipelines({mode:"pipelines",pipeline:e||null})},switchToEngines(){this.openTypePipelines({mode:"engines",pipeline:this.currentRoutePipeline||null})},setSearchMode(n){if(this.searchMode=n,this.query.selectedIndex=null,this.query.selectedFtsIndex=null,this.query.selectedVectorEngine=null,this.query.selectedPrefix=void 0,this.query.selectedIndexStart=void 0,this.query.selectedIndexEnd=void 0,this.geoDistanceMap={},this.geoHighlightedKey=null,"geo"!==n){this.geoViewMode="table";try{e.$el?.querySelector("ok-table")?.clearSelection?.()}catch(e){}}},_updateGeoIndexes(){this.geoIndexes=this.possibleIndexes.filter(e=>this.indexStatuses[e]?.geoConfig),this.geoIndexes.length&&!this.geoField&&(this.geoField=this.geoIndexes[0])},async loadGeoQuery(){if(!this.type||!this.geoField)return;const e=parseFloat(this.geoLat),n=parseFloat(this.geoLon);if(isNaN(e)||isNaN(n))return;const t=this.geoRadius?parseFloat(this.geoRadius):void 0;this.query.busy=!0,this.geoDistanceMap={};try{const i={...this.query.query},o={lat:e,lon:n};t&&!isNaN(t)&&(o.radius=t),i[this.geoField]={$near:o};const s=await fetch(`${this.envApiBase}/type/${this.type}/query`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filter:i,options:{limit:this.query.pageSize}})});if(!s.ok)throw new Error(s.statusText);const{data:a,meta:r}=await s.json();let l=a??[];this.geoSortAsc||(l=l.slice().reverse()),this.query.items=l;const d={};this.query.values=l.map(e=>(x(e.value,e.key),null!=e.distance&&(d[e.key]=e.distance),e.value)),this.geoDistanceMap=d,this.query.hasNext=!1,this.query.hasPrev=!1,this.query._current=null,this.query._backStack=[],this.query.time=r?.time??null,this.query.total=l.length}catch(e){console.error("Geo query error",e)}finally{this.query.busy=!1}},get selectedVectorEngineMeta(){return this.query.selectedVectorEngine?this.vectorEngines.find(e=>this.displayVectorName(e.name)===this.query.selectedVectorEngine)??null:null},helpOpen:!1,get typeFields(){const n=(e.$ok.stores.okdb.types||[]).find(e=>e.type===this.type);return n?.fields||{}},get typeCount(){const n=(e.$ok.stores.okdb.types||[]).find(e=>e.type===this.type);return n?.count??"?"},get typeFieldEntries(){return Object.entries(this.typeFields).map(([e,n])=>({name:e,types:n}))},get indexEntries(){return this.possibleIndexes.map(e=>({name:e,fields:e.split("~"),status:this.indexStatuses[e]?.status||"ready",isGeo:!!this.indexStatuses[e]?.geoConfig,geoPrecision:this.indexStatuses[e]?.geoConfig?.precision??null,isUnique:!!this.indexStatuses[e]?.unique,createdBy:this.indexStatuses[e]?.createdBy??null,usedBy:this.indexStatuses[e]?.usedBy??[]}))},get selectedIndexInfo(){const e=this.query.selectedIndex;if(!e)return null;const n=this.indexStatuses[e];return{fields:e.split("~"),isGeo:!!n?.geoConfig,geoPrecision:n?.geoConfig?.precision??null,isUnique:!!n?.unique}},get ftsEntries(){return this.ftsList.map(e=>({name:e.name,status:e.status||"ready",fields:(e.config&&e.config.fields?e.config.fields:[]).join(", "),sizeBytes:e.sizeBytes??null}))},fmtBytes(e){if(null==e||0===e)return"—";const n=["B","KB","MB","GB"];let t=e,i=0;for(;t>=1024&&i<n.length-1;)t/=1024,i++;return t.toFixed(1)+" "+n[i]},ttlStats:null,ttlStatsLoading:!1,ttlSweepBusy:!1,defaultTTL:null,defaultTTLInput:"",defaultTTLPreset:"",defaultTTLBusy:!1,async loadTTLStats(){if(this.type){this.ttlStatsLoading=!0;try{const e=await fetch(`${this.envApiBase}/ttl/stats?type=${encodeURIComponent(this.type)}`),n=await e.json();this.ttlStats=n.data??n.result??null}catch{this.ttlStats=null}finally{this.ttlStatsLoading=!1}}},async loadDefaultTTL(){if(this.type)try{const e=await fetch(`${this.envApiBase}/type/${encodeURIComponent(this.type)}/ttl/default`),n=await e.json(),t=n.data?.defaultTTL??n.result?.defaultTTL??null;this.defaultTTL=t,this.defaultTTLInput=t?String(t):"",this.defaultTTLPreset=t?String(t):""}catch{this.defaultTTL=null}},async setDefaultTTLAction(){const n=parseInt(this.defaultTTLInput);if(n&&!(n<=0)){this.defaultTTLBusy=!0;try{const t=await fetch(`${this.envApiBase}/type/${encodeURIComponent(this.type)}/ttl/default`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({ttl:n})});if(!t.ok){const e=await t.json().catch(()=>({}));throw new Error(e?.error?.message||t.statusText)}this.defaultTTL=n,e.$ok.shared?.toast?.info?.("Default TTL set ("+this.fmtDuration(n)+")")}catch(n){e.$ok.shared?.toast?.error?.(n.message||"Failed to set default TTL")}finally{this.defaultTTLBusy=!1}}},async clearDefaultTTLAction(){this.defaultTTLBusy=!0;try{const n=await fetch(`${this.envApiBase}/type/${encodeURIComponent(this.type)}/ttl/default`,{method:"DELETE"});if(!n.ok)throw new Error(n.statusText);this.defaultTTL=null,this.defaultTTLInput="",this.defaultTTLPreset="",e.$ok.shared?.toast?.info?.("Default TTL cleared")}catch(n){e.$ok.shared?.toast?.error?.(n.message||"Failed to clear default TTL")}finally{this.defaultTTLBusy=!1}},onDefaultTTLPresetChange(e){this.defaultTTLPreset=e,e&&(this.defaultTTLInput=e)},async triggerSweep(){this.ttlSweepBusy=!0;try{const n=await fetch(`${this.envApiBase}/ttl/sweep`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({batchSize:1e3})}),t=await n.json(),i=`Sweep done: ${(t.data??t.result??{}).removed??0} expired item(s) removed`;e.$ok.shared?.toast?.info?.(i),await this.loadTTLStats(),await this.query.load()}catch(n){e.$ok.shared?.toast?.error?.(n.message||"Sweep failed")}finally{this.ttlSweepBusy=!1}},fmtDuration(e){if(null==e)return"—";const n=Math.floor(e/1e3);return n<60?n+"s":n<3600?Math.floor(n/60)+"m "+n%60+"s":n<86400?Math.floor(n/3600)+"h "+Math.floor(n%3600/60)+"m":Math.floor(n/86400)+"d "+Math.floor(n%86400/3600)+"h"},get vectorEntries(){return this.vectorEngines.map(e=>({name:e.name,displayName:this.displayVectorName(e.name),status:e.isRunning?"running":e.status||"stopped",running:e.isRunning,pipeline:e.meta&&e.meta.pipeline?e.meta.pipeline:null}))},get siftSchema(){return a(this.typeFields)},async loadIndexes(e=!1){if(this.type&&(e||n!==this.type))try{const e=await fetch(`${this.envApiBase}/type/${this.type}/indexes`),t=await e.json(),i=t.data??t.result??{};this.possibleIndexes=Object.keys(i),this.indexStatuses=i,this._updateGeoIndexes(),n=this.type}catch(e){console.error("Error fetching indexes",e)}},async loadFtsIndexes(e=!1){if(this.type&&(e||t!==this.type))try{const e=await fetch(`${this.envApiBase}/type/${this.type}/fts`),{data:n}=await e.json();this.ftsList=n||[],t=this.type}catch(e){console.error("Error fetching FTS indexes",e)}},async loadVectorEngines(n=!1){if(this.type&&(n||i!==this.type))try{const n=e.$ok.stores.okdb.selectedEnv||"default",[t,o]=await Promise.allSettled([fetch(`${__ENV__.API}/env/${encodeURIComponent(n)}/engines`).then(e=>e.json()),fetch(`${__ENV__.API}/embeddings/embedders`).then(e=>e.json())]),s="fulfilled"===t.status?t.value?.result??t.value?.data??[]:[],a=[..."fulfilled"===o.status?o.value?.data??[]:[],...s],r={};for(const e of a)"indexer"===e.type&&e.config&&(r[e.name]={source_type:e.config.source_type,source_env:e.config.source_env??"default"});this.vectorEngines=a.filter(e=>{if("vector-search"!==e.type)return!1;const t=e.config?.source_type,i=e.config?.source_env??"default";if(t===this.type&&i===n)return!0;const o=r[e.name];return o?.source_type===this.type&&(o?.source_env??"default")===n}),i=this.type}catch(e){this.vectorEngines=[]}},async loadTypeEnginesCount(){if(this.type)try{const n=e.$ok.stores.okdb.selectedEnv||"default",t=await fetch(`${__ENV__.API}/env/${encodeURIComponent(n)}/type/${encodeURIComponent(this.type)}/pipelines`),i=await t.json().catch(()=>({})),o=t.ok?i?.data??[]:[],s=new Set;for(const e of o.flatMap(e=>e?.engines??[])){const n=e?.key??(e?.type&&e?.name?`${e.type}@${e.name}`:e?.name??null);n&&s.add(n)}this.typeEngineCount=s.size}catch{this.typeEngineCount=0}else this.typeEngineCount=0},async recomputeFields(){if(this.type)try{await fetch(`${this.envApiBase}/type/${this.type}/recompute-fields`,{method:"POST"}),await e.$ok.stores.okdb.reloadTypes(),e.$ok.shared?.toast?.success?.("Fields recomputed")}catch(n){console.error("recomputeFields error",n),e.$ok.shared?.toast?.error?.("Recompute failed")}},indexStatusBadge(e){const n=this.indexStatuses?.[e]?.status;return n&&"ready"!==n?n:null},ftsStatusBadge(e){const n=e?.status;return n&&"ready"!==n?n:null},keyOf:e=>e?.__key??e?.key??null,get hasDirectValueRows(){return(this.query.items||[]).some(e=>!y(e?.value))},get displayRows(){return this.hasDirectValueRows?this.query.items:this.query.values},rowValueOf:e=>e&&"object"==typeof e&&"key"in e&&"value"in e?e.value:e,directValueKindOf(e){const n=this.rowValueOf(e);return null===n?"null":Array.isArray(n)?"array":y(n)?null:"scalar"},inlineValueOf(e){return m(this.rowValueOf(e))},prettyValueOf(e){return m(this.rowValueOf(e),2)},scoreOf(e){const n=this.keyOf(e);return n?this.query.ftsScoreMap?.[n]?.score??null:null},matchOf(e){const n=this.keyOf(e);if(!n)return null;const t=this.query.ftsScoreMap?.[n];if(!t||null==t.score)return null;const i=t.maxScore??2*t.numTerms;return`${t.score}/${i}`},vectorScoreOf(e){const n=this.keyOf(e);if(!n)return null;const t=this.query.vectorScoreMap?.[n];return null==t?null:`${Math.round(100*t)}%`},vectorChunkMetaOf(e){const n=this.keyOf(e);return n?this.query.vectorChunkMetaMap?.[n]??null:null},distanceOf(e){const n=this.keyOf(e);if(!n)return null;const t=this.geoDistanceMap?.[n];return null==t?null:t<1e3?`${Math.round(t)} m`:`${(t/1e3).toFixed(1)} km`},displayVectorName(n){const t=(e.$ok.stores.okdb.selectedEnv||"default")+":";return n.startsWith(t)?n.slice(t.length):n},selectVectorEngine(e,n){if("__create_pipeline__"===e)return n&&(n.target.value=this.query.selectedVectorEngine||""),void this.openCreatePipelineModal();this.query.selectedVectorEngine=e||null,this.query.selectedVectorEngine&&(this.query.selectedIndex=null,this.query.selectedFtsIndex=null,this.query.selectedPrefix=void 0,this.query.selectedIndexStart=void 0,this.query.selectedIndexEnd=void 0)},openCreatePipelineModal(){this.openEnginesCreatePipeline()},createMenuOpen:!1,onRowChanged(n){const t=n?.detail??null,i=t?.key??null;if(null!=i){const e=this.query.items.findIndex(e=>e?.key===i);if(e>=0){const n=t?.value;x(n,i),this.query.items.splice(e,1,{...this.query.items[e],value:n}),e<this.query.values.length&&this.query.values.splice(e,1,n)}}e.$ok.shared.toast.info("Item updated"),this.loadViolations()},onRemoveRow(e){const n=this.query.items.findIndex(n=>n?.key===e);n>=0&&(this.query.values.splice(n,1),this.query.items.splice(n,1))},async openAddModal(){await e.$ok.shared.modal.open({owner:e,title:"Add item",content:'<add-item-modal :modal="modal" :type="type" :on-done="onDone" />',context:e=>({modal:e,type:this.type,onDone:async({key:e,value:n})=>{x(n,e),this.query.values.unshift(n),this.query.items.unshift({key:e,value:n})}})})},async openCreateIndex(){let n={},t=[];try{const e=await fetch(`${this.envApiBase}/type/${this.type}/deep-properties`),i=await e.json();n=(i.data??i.result)?.paths??{},t=Object.keys(n).filter(e=>n[e].includes("geo"))}catch{const t=(e.$ok.stores.okdb.types||[]).find(e=>e.type===this.type);for(const e of Object.keys(t?.fields||{}))n[e]=t.fields[e]}await e.$ok.shared.modal.open({owner:e,title:"Create Index",content:'<create-index-modal :modal="modal" :type="type" :deep-paths="deepPaths" :geo-fields="geoFields" :on-done="onDone" />',context:e=>({modal:e,type:this.type,deepPaths:n,geoFields:t,onDone:async()=>{await this.loadIndexes(!0)}})})},async dropType(){if(this.type&&await e.$ok.shared.modal.confirm(`Drop type "${this.type}"? This cannot be undone.`))try{await fetch(`${this.envApiBase}/type/${this.type}`,{method:"DELETE"}),await e.$ok.stores.okdb.reloadTypes(),e.$el.dispatchEvent(new CustomEvent("dropped",{detail:this.type}))}catch(e){console.error("Drop type error",e)}},async removeIndex(n){const t=n||this.query.selectedIndex;if(t&&await e.$ok.shared.modal.confirm(`Remove index "${t}"?`)){try{const n=await fetch(`${this.envApiBase}/type/${this.type}/index/${t}`,{method:"DELETE"});if(!n.ok){const t=await n.json().catch(()=>({})),i=t?.error?.code;if("INDEX_HAS_CONSUMERS"===i){const n=(t?.error?.details?.usedBy??[]).map(e=>`${e.kind}:${e.name}`).join(", ");return void e.$ok.shared?.toast?.error?.(`Cannot remove: index is used by ${n||"a consumer"}`)}throw new Error(t?.error?.message??"Remove failed")}}catch(n){return console.error("Remove index error",n),void e.$ok.shared?.toast?.error?.(n.message)}this.query.selectedIndex===t&&(this.query.selectedIndex=null),this.query.resetPaging(),await this.loadIndexes(!0),await this.query.load()}},selectIndex(e){if("__create_index__"===e)return this.query.selectedIndex=null,void this.openCreateIndex();"__remove_index__"!==e?(this.query.selectedIndex=e||null,this.query.selectedIndex&&(this.query.selectedFtsIndex=null),this.query.selectedIndex||(this.query.selectedPrefix=void 0,this.query.selectedIndexStart=void 0,this.query.selectedIndexEnd=void 0)):this.removeIndex()},selectFtsIndex(e,n){if("__create_fts__"===e)return n&&(n.target.value=this.query.selectedFtsIndex||""),void this.openCreateFtsModal();"__drop_fts__"!==e?(this.query.selectedFtsIndex=e||null,this.query.selectedFtsIndex&&(this.query.selectedIndex=null,this.query.selectedPrefix=void 0,this.query.selectedIndexStart=void 0,this.query.selectedIndexEnd=void 0)):this.dropFtsIndex()},async openCreateFtsModal(){let n={};try{const e=await fetch(`${this.envApiBase}/type/${this.type}/deep-properties`),t=await e.json();n=(t.data??t.result)?.paths??{}}catch{const t=(e.$ok.stores.okdb.types||[]).find(e=>e.type===this.type);for(const e of Object.keys(t?.fields||{}))n[e]=t.fields[e]}await e.$ok.shared.modal.open({owner:e,title:"Create FTS Index",content:'<create-fts-modal :modal="modal" :type="type" :api-base="apiBase" :deep-paths="deepPaths" :on-done="onDone" />',context:e=>({modal:e,type:this.type,apiBase:this.envApiBase,deepPaths:n,onDone:async()=>{await this.loadFtsIndexes(!0)}})})},async dropFtsIndex(n){const t=n||this.query.selectedFtsIndex;if(t&&await e.$ok.shared.modal.confirm(`Drop FTS index "${t}"? This cannot be undone.`)){try{await fetch(`${this.envApiBase}/type/${this.type}/fts/${encodeURIComponent(t)}`,{method:"DELETE"})}catch(n){return console.error("Drop FTS error",n),void e.$ok.shared?.toast?.error?.("Drop FTS failed")}this.query.selectedFtsIndex===t&&(this.query.selectedFtsIndex=null),await this.loadFtsIndexes(!0),await this.query.load()}},async rebuildIndex(n){if(n&&await e.$ok.shared.modal.confirm(`Rebuild index "${n}"? This will re-scan all records.`))try{await fetch(`${this.envApiBase}/type/${this.type}/index/${encodeURIComponent(n)}/reset`,{method:"POST"}),e.$ok.shared?.toast?.info?.(`Rebuilding index "${n}"…`),await this.loadIndexes(!0)}catch(n){console.error("Rebuild index error",n),e.$ok.shared?.toast?.error?.("Rebuild failed")}},async rebuildFts(n){const t=n||this.query.selectedFtsIndex;if(t&&await e.$ok.shared.modal.confirm(`Rebuild FTS index "${t}"? This will re-index all records.`))try{await fetch(`${this.envApiBase}/type/${this.type}/fts/${encodeURIComponent(t)}/reset`,{method:"POST"}),e.$ok.shared?.toast?.info?.(`Rebuilding FTS index "${t}"…`),await this.loadFtsIndexes(!0)}catch(n){console.error("Rebuild FTS error",n),e.$ok.shared?.toast?.error?.("Rebuild failed")}},onGeoTableSelect(e){if("geo"!==this.searchMode)return;this._geoSelSource="table";const n=e.detail?.action;this.geoHighlightedKey="deselect"===n?null:e.detail?.row?.__key??null},onGeoMapSelect(e){const n=e.detail?.key??null;this._geoSelSource="map",this.geoHighlightedKey=this.geoHighlightedKey===n?null:n}}},_unsubs:[],async init(e){if(e.$watch(()=>this.type,async()=>{this.query.type=this.type,this.query.selectedFtsIndex=null,this.query.selectedVectorEngine=null,this.searchMode="scan",this.query.resetPaging(),await this.loadIndexes(!0),await this.loadFtsIndexes(!0),await this.loadVectorEngines(!0),await this.loadTypeEnginesCount(),await this.loadViolations(),await this.query.load()}),e.$watch(()=>[this.query.query,this.query.selectedIndex,this.query.selectedIndexStart,this.query.selectedIndexEnd,this.query.selectedDirection,this.query.queryMode,this.query.selectedPrefix,this.query.selectedFtsIndex,this.query.ftsText,this.query.ftsMode,this.query.ftsPrefix,this.query.selectedVectorEngine,this.query.vectorText,this.query.vectorLimit],async()=>{this.type&&(this.query.resetPaging(),await this.query.load())}),e.$watch(()=>[this.searchMode,this.geoField,this.geoLat,this.geoLon,this.geoRadius,this.geoSortAsc,this.query.query],async()=>{"geo"===this.searchMode&&this.type&&this.geoField&&this.geoLat&&this.geoLon&&await this.loadGeoQuery()}),this.type){const n=new Set(["data","changelog","manage","schema","pipelines","engines"]),t=e.$vars.$router?.search?.tab;t&&n.has(t)&&(this.tab="pipelines"===t?"engines":t),await Promise.all([this.loadIndexes(),this.loadFtsIndexes(),this.loadVectorEngines(),this.loadTypeEnginesCount(),this.loadViolations(),this.loadTTLStats(),this.loadDefaultTTL(),this.query.load()])}this._unsubs=[u.on("index:reset",()=>{this.loadIndexes(!0),this.loadFtsIndexes(!0)}),u.on("index:ready",n=>{this.loadIndexes(!0),this.loadFtsIndexes(!0);const t=n?.type;if(!t||t===this.type){const t=n?.index,i=Array.isArray(t)&&"fts"===t[0],o=i?t[1]:"string"==typeof t?t:"",s=i?`FTS index ready: ${o}`:o?`Index ready: ${o}`:"Index rebuild complete";e.$ok.shared?.toast?.success?.(s)}}),u.on("index:registered",()=>this.loadIndexes(!0)),u.on("index:drop",()=>this.loadIndexes(!0)),u.on("fts:registered",()=>this.loadFtsIndexes(!0)),u.on("fts:drop",()=>this.loadFtsIndexes(!0)),u.on("engine:started",()=>this.loadVectorEngines(!0)),u.on("engine:stopped",()=>this.loadVectorEngines(!0)),u.on("engine:error",()=>this.loadVectorEngines(!0)),u.on("engine:installed",()=>this.loadVectorEngines(!0)),u.on("engine:uninstalled",()=>this.loadVectorEngines(!0)),u.on("engine:started",()=>this.loadTypeEnginesCount()),u.on("engine:stopped",()=>this.loadTypeEnginesCount()),u.on("engine:error",()=>this.loadTypeEnginesCount()),u.on("engine:installed",()=>this.loadTypeEnginesCount()),u.on("engine:uninstalled",()=>this.loadTypeEnginesCount()),u.on("embeddings:pipeline:ready",()=>this.loadVectorEngines(!0)),u.on("embeddings:pipeline:ready",()=>this.loadTypeEnginesCount())];const n=new Set(["data","changelog","manage","schema","pipelines","engines"]);e.$watch(()=>e.$vars.$router?._search?.tab,()=>{const t=e.$vars.$router?._search?.tab;if(!t)return;const i=n.has(t)?"pipelines"===t?"engines":t:"data";this.tab!==i&&(this.tab=i)}),e.$watch(()=>this.geoHighlightedKey,n=>{const t=this._geoSelSource;if(this._geoSelSource=null,"geo"!==this.searchMode)return;if("table"===t)return;const i=e.$el?.querySelector("ok-table");if(!i)return;if(!n)return i.clearSelection?.(),void i.clearExpanded?.();const o=this.displayRows?.find(e=>this.keyOf(e)===n);o?(i.select?.(o),i.clearExpanded?.(),i.expand?.(o)):(i.clearSelection?.(),i.clearExpanded?.())})},unmount(){for(const e of this._unsubs)e();this._unsubs=[]},template:'\n<div style="display:flex; flex-direction:column; gap:0; height:100%;">\n\n \x3c!-- Tab bar --\x3e\n <div style="display:flex; gap:2px; border-bottom:1px solid var(--okdb-app-border); margin-bottom:12px; flex-shrink:0;">\n <button\n @click="setTab(\'data\')"\n :style="tab===\'data\' ? \'border-color:var(--okdb-accent); color:var(--okdb-accent); background:color-mix(in srgb, var(--okdb-accent) 7%, transparent); border-bottom-color:transparent;\' : \'border-color:transparent; background:transparent;\'"\n style="padding:6px 16px; border-radius:6px 6px 0 0; font-size:13px; cursor:pointer;">\n Data\n </button>\n <button\n @click="setTab(\'changelog\')"\n :style="tab===\'changelog\' ? \'border-color:var(--okdb-accent); color:var(--okdb-accent); background:color-mix(in srgb, var(--okdb-accent) 7%, transparent); border-bottom-color:transparent;\' : \'border-color:transparent; background:transparent;\'"\n style="padding:6px 16px; border-radius:6px 6px 0 0; font-size:13px; cursor:pointer;">\n Changelog\n </button>\n <button\n @click="setTab(\'manage\')"\n :style="tab===\'manage\' ? \'border-color:var(--okdb-accent); color:var(--okdb-accent); background:color-mix(in srgb, var(--okdb-accent) 7%, transparent); border-bottom-color:transparent;\' : \'border-color:transparent; background:transparent;\'"\n style="padding:6px 16px; border-radius:6px 6px 0 0; font-size:13px; cursor:pointer;">\n Manage\n </button>\n <button\n @click="setTab(\'schema\')"\n :style="tab===\'schema\' ? (\'border-color:\' + (violationCount > 0 ? \'var(--okdb-danger)\' : \'var(--okdb-success)\') + \'; color:\' + (violationCount > 0 ? \'var(--okdb-danger)\' : \'var(--okdb-success)\') + \'; background:\' + (violationCount > 0 ? \'#f8717111\' : \'color-mix(in srgb, var(--okdb-success) 7%, transparent)\') + \'; border-bottom-color:transparent;\') : (violationCount > 0 ? \'border-color:transparent; background:transparent; color:var(--okdb-danger);\' : \'border-color:transparent; background:transparent;\')"\n style="padding:6px 16px; border-radius:6px 6px 0 0; font-size:13px; cursor:pointer;">\n Schema<if :="violationCount > 0"><span style="margin-left:6px; font-size:10px; padding:2px 7px; border-radius:999px; background:color-mix(in srgb, var(--okdb-danger) 13%, transparent); color:var(--okdb-danger); font-weight:600;">{{ violationCount }}</span></if>\n </button>\n <button\n @click="switchToEngines()"\n :style="tab===\'engines\' ? \'border-color:var(--okdb-purple); color:var(--okdb-purple); background:color-mix(in srgb, var(--okdb-purple) 7%, transparent); border-bottom-color:transparent;\' : \'border-color:transparent; background:transparent;\'"\n style="padding:6px 16px; border-radius:6px 6px 0 0; font-size:13px; cursor:pointer;">\n Engines<if :="typeEngineCount > 0"><span class="mode-count">{{ typeEngineCount }}</span></if>\n </button>\n </div>\n\n \x3c!-- Data tab --\x3e\n <if :="tab === \'data\'">\n <div style="display:flex; flex-direction:column; gap:16px; flex:1; min-height:0;">\n\n <div class="card" style="display:flex; gap:16px;">\n\n \x3c!-- ── Left column: query controls ── --\x3e\n <div style="flex:1; display:flex; flex-direction:column; gap:10px; min-width:0;">\n\n \x3c!-- Row 1: filter label + accordion + JSON input --\x3e\n <div style="display:flex; flex-direction:column; gap:6px;">\n\n \x3c!-- Label row --\x3e\n <div style="display:flex; align-items:center; gap:6px;">\n <span style="font-size:12px; color:#6a8a9a; user-select:none;">\n {{ searchMode === \'vector\' ? \'Post-filter vector results with sift\' : searchMode === \'fts\' ? \'Post-filter FTS results with sift\' : searchMode === \'geo\' ? \'Post-filter geo results with sift\' : \'Filter with sift query\' }}\n </span>\n <span class="help-toggle" @click="helpOpen = !helpOpen" :class="helpOpen ? \'help-toggle--open\' : \'\'">i</span>\n </div>\n\n \x3c!-- Accordion: query reference --\x3e\n <if :="helpOpen">\n <div class="help-accordion">\n <div class="ht-row"><code>{}</code><span>match all records</span></div>\n <div class="ht-row"><code>{"field": "value"}</code><span>exact match</span></div>\n <div class="ht-row"><code>{"n": {"$gt": 5, "$lt": 50}}</code><span>numeric comparison</span></div>\n <div class="ht-row"><code>{"x": {"$in": ["a","b"]}}</code><span>set membership</span></div>\n <div class="ht-row"><code>{"x": {"$exists": true}}</code><span>field presence</span></div>\n <div class="ht-row ht-row--note">Nested fields use dot notation: <code>"a.b"</code></div>\n </div>\n </if>\n\n <ok-json-input\n :value="query.query"\n @change="query.query = $event.detail"\n :schema="siftSchema"\n style="min-width:220px; min-height:60px;">\n </ok-json-input>\n\n </div>\n\n \x3c!-- Mode bar: Scan / Index / FTS / Vector --\x3e\n <div style="display:flex; gap:4px; align-items:center; flex-wrap:wrap;">\n <div class="seg-toggle" style="flex-shrink:0;">\n <button :class="searchMode === \'scan\' ? \'active\' : \'\'" @click="setSearchMode(\'scan\')">Scan</button>\n <button :class="searchMode === \'index\' ? \'active\' : \'\'" @click="setSearchMode(\'index\')">\n Index<if :="possibleIndexes.length > 0"><span class="mode-count">{{ possibleIndexes.length }}</span></if>\n </button>\n <button :class="searchMode === \'fts\' ? \'active\' : \'\'" @click="setSearchMode(\'fts\')">\n FTS<if :="ftsList.length > 0"><span class="mode-count">{{ ftsList.length }}</span></if>\n </button>\n <button :class="searchMode === \'vector\' ? \'active\' : \'\'" @click="setSearchMode(\'vector\')">\n Vector<if :="vectorEngines.length > 0"><span class="mode-count">{{ vectorEngines.length }}</span></if>\n </button>\n <button :class="searchMode === \'geo\' ? \'active\' : \'\'" @click="setSearchMode(\'geo\')">\n Geo<if :="geoIndexes.length > 0"><span class="mode-count">{{ geoIndexes.length }}</span></if>\n </button>\n </div>\n </div>\n\n \x3c!-- ── Scan panel ── --\x3e\n <if :="searchMode === \'scan\'">\n <div style="display:flex; gap:8px; align-items:center; flex-wrap:wrap;">\n <button\n @click="query.selectedDirection = query.selectedDirection === \'desc\' ? \'asc\' : \'desc\'"\n style="min-width:78px;"\n title="Toggle key scan direction">\n {{ query.selectedDirection === \'desc\' ? \'↓ Desc\' : \'↑ Asc\' }}\n </button>\n <span style="font-size:12px; opacity:.4; user-select:none;">Full key-ordered scan · sift applied as filter</span>\n </div>\n </if>\n\n \x3c!-- ── Index panel ── --\x3e\n <if :="searchMode === \'index\'">\n <div style="display:flex; flex-direction:column; gap:8px;">\n\n <div style="display:flex; gap:8px; align-items:center; flex-wrap:wrap;">\n <select @change="selectIndex($event.target.value)" style="min-width:160px;">\n <option value="">— none —</option>\n <each :of="possibleIndexes" let:item="idx">\n <option :value="idx" :selected="query.selectedIndex === idx">\n {{ idx }}{{ indexStatuses[idx]?.unique ? \' ◆\' : \'\' }}{{ indexStatusBadge(idx) ? \' ⚠ \' + indexStatusBadge(idx) : \'\' }}\n </option>\n </each>\n <option value="__create_index__" style="color:var(--okdb-accent);">+ Create index…</option>\n <if :="query.selectedIndex">\n <option value="__remove_index__" style="color:var(--okdb-danger);">× Remove "{{ query.selectedIndex }}"</option>\n </if>\n </select>\n\n <button\n @click="query.selectedDirection = query.selectedDirection === \'desc\' ? \'asc\' : \'desc\'"\n style="min-width:78px;"\n title="Toggle sort direction">\n {{ query.selectedDirection === \'desc\' ? \'↓ Desc\' : \'↑ Asc\' }}\n </button>\n\n <if :="query.selectedIndex">\n <div class="seg-toggle">\n <button\n :class="query.queryMode === \'prefix\' ? \'active\' : \'\'"\n @click="query.queryMode = \'prefix\', query.selectedIndexStart = undefined, query.selectedIndexEnd = undefined">\n Prefix\n </button>\n <button\n :class="query.queryMode === \'range\' ? \'active\' : \'\'"\n @click="query.queryMode = \'range\', query.selectedPrefix = undefined">\n Range\n </button>\n </div>\n </if>\n </div>\n\n \x3c!-- ── Index detail strip ── --\x3e\n <if :="query.selectedIndex && selectedIndexInfo">\n <div class="idx-info-strip">\n <span class="idx-info-label">Fields:</span>\n <each :of="selectedIndexInfo.fields" let:item="f">\n <code class="idx-info-field">{{ f }}</code>\n </each>\n <if :="selectedIndexInfo.isUnique">\n <span class="idx-info-badge idx-info-badge--unique">◆ unique</span>\n </if>\n <if :="selectedIndexInfo.isGeo">\n <span class="idx-info-badge idx-info-badge--geo">◎ geo · precision {{ selectedIndexInfo.geoPrecision ?? 7 }}</span>\n </if>\n <if :="!selectedIndexInfo.isUnique && !selectedIndexInfo.isGeo">\n <span class="idx-info-badge idx-info-badge--regular">regular</span>\n </if>\n </div>\n </if>\n\n <if :="query.selectedIndex">\n <div style="display:flex; gap:8px; align-items:center; flex-wrap:wrap;">\n <if :="query.queryMode === \'prefix\'">\n <span style="opacity:.6; font-size:12px;">Prefix:</span>\n <ok-json-input mode="input" :value="query.selectedPrefix" @change="query.selectedPrefix = $event.detail" style="width:220px;" />\n <span style="opacity:.35; font-size:11px;">scalar or array for composite indexes</span>\n </if>\n <if :="query.queryMode === \'range\'">\n <span style="opacity:.6; font-size:12px;">Start:</span>\n <ok-json-input mode="input" :value="query.selectedIndexStart" @change="query.selectedIndexStart = $event.detail" style="width:180px;" />\n <span style="opacity:.6; font-size:12px;">End:</span>\n <ok-json-input mode="input" :value="query.selectedIndexEnd" @change="query.selectedIndexEnd = $event.detail" style="width:180px;" />\n </if>\n </div>\n </if>\n\n </div>\n </if>\n\n \x3c!-- ── FTS panel ── --\x3e\n <if :="searchMode === \'fts\'">\n <div style="display:flex; gap:8px; align-items:center; flex-wrap:wrap;">\n\n <select @change="selectFtsIndex($event.target.value, $event)" style="min-width:160px;">\n <option value="">— none —</option>\n <each :of="ftsList" let:item="fts">\n <option :value="fts.name" :selected="query.selectedFtsIndex === fts.name">\n {{ fts.name }}{{ ftsStatusBadge(fts) ? \' ⚠ \' + ftsStatusBadge(fts) : \'\' }}\n </option>\n </each>\n <option value="__create_fts__" style="color:var(--okdb-accent);">+ Create FTS index…</option>\n <if :="query.selectedFtsIndex">\n <option value="__drop_fts__" style="color:var(--okdb-danger);">× Drop "{{ query.selectedFtsIndex }}"</option>\n </if>\n </select>\n\n <if :="query.selectedFtsIndex">\n <input\n type="text"\n placeholder="Search…"\n :value="query.ftsText"\n @input="query.ftsText = $event.target.value"\n style="flex:1; min-width:140px; max-width:300px;"\n />\n <div class="seg-toggle" title="AND: all terms required · OR: any term matches, ranked by hit count">\n <button :class="query.ftsMode === \'and\' ? \'active\' : \'\'" @click="query.ftsMode = \'and\'">AND</button>\n <button :class="query.ftsMode === \'or\' ? \'active\' : \'\'" @click="query.ftsMode = \'or\'">OR</button>\n </div>\n <label style="font-size:12px; display:flex; align-items:center; gap:4px; cursor:pointer; white-space:nowrap; user-select:none;" title="Prefix: \'sta\' matches \'start\', \'stack\', etc.">\n <input type="checkbox" :checked="query.ftsPrefix" @change="query.ftsPrefix = $event.target.checked" />\n Prefix\n </label>\n </if>\n\n </div>\n </if>\n\n \x3c!-- ── Vector panel ── --\x3e\n <if :="searchMode === \'vector\'">\n <if :="vectorEngines.length === 0">\n <div style="font-size:12px; opacity:.7; display:flex; align-items:center; gap:8px; flex-wrap:wrap;">\n <ok-icon name="cpu" style="width:13px;height:13px;opacity:.5;"></ok-icon>\n <span>No vector search engines for <b>{{ type }}</b> yet.</span>\n <button\n @click="openEnginesCreatePipeline()"\n style="font-size:11px; padding:2px 10px; border-radius:999px; border:1px solid color-mix(in srgb, var(--okdb-indigo) 33%, transparent); color:var(--okdb-indigo); background:color-mix(in srgb, var(--okdb-indigo) 6%, transparent); cursor:pointer;"\n >⛓ Create Pipeline…</button>\n </div>\n </if>\n <if :="vectorEngines.length > 0">\n <div style="display:flex; gap:8px; align-items:center; flex-wrap:wrap;">\n\n <select @change="selectVectorEngine($event.target.value, $event)" style="min-width:160px;">\n <option value="">— none —</option>\n <each :of="vectorEngines" let:item="ve">\n <option :value="displayVectorName(ve.name)" :selected="query.selectedVectorEngine === displayVectorName(ve.name)">\n {{ displayVectorName(ve.name) }}{{ ve.isRunning ? \'\' : \' (stopped)\' }}\n </option>\n </each>\n <option value="__create_pipeline__" style="color:var(--okdb-indigo);">+ Create pipeline…</option>\n </select>\n\n <if :="query.selectedVectorEngine">\n <input\n type="text"\n placeholder="Semantic query…"\n :value="query.vectorText"\n @input:debounce.500="query.vectorText = $event.target.value"\n style="flex:1; min-width:160px; max-width:340px;"\n />\n <span style="font-size:12px; opacity:.55; white-space:nowrap; user-select:none;">top</span>\n <input\n type="number"\n :value="query.vectorLimit"\n @change="query.vectorLimit = Math.max(1, Math.min(200, Number($event.target.value) || 20))"\n min="1" max="200"\n style="width:56px; text-align:center;"\n title="Max results"\n />\n </if>\n\n \x3c!-- Pipeline badge — clickable, navigates to local Engines tab in pipeline mode --\x3e\n <if :="selectedVectorEngineMeta">\n <if :="selectedVectorEngineMeta.meta && selectedVectorEngineMeta.meta.pipeline">\n <button\n @click="openEnginesPipeline(selectedVectorEngineMeta.meta.pipeline)"\n style="font-size:11px; padding:2px 9px; border-radius:999px; border:1px solid color-mix(in srgb, var(--okdb-indigo) 33%, transparent); color:var(--okdb-indigo); background:color-mix(in srgb, var(--okdb-indigo) 6%, transparent); cursor:pointer; white-space:nowrap;"\n :title="\'Open the type pipeline view focused on: \' + selectedVectorEngineMeta.meta.pipeline"\n >⛓ {{ selectedVectorEngineMeta.meta.pipeline }} →</button>\n </if>\n </if>\n\n \x3c!-- Link to local type engines workspace --\x3e\n <button\n @click="openTypePipelinesForSelectedVector()"\n style="font-size:11px; padding:2px 9px; border-radius:999px; border:1px solid color-mix(in srgb, var(--okdb-indigo) 20%, transparent); color:color-mix(in srgb, var(--okdb-indigo) 60%, transparent); background:transparent; cursor:pointer; white-space:nowrap; margin-left:auto;"\n title="Open the type-scoped engines view for this vector search"\n >⛓ Type Engines →</button>\n\n </div>\n </if>\n </if>\n\n \x3c!-- ── Geo panel ── --\x3e\n <if :="searchMode === \'geo\'">\n <if :="geoIndexes.length === 0">\n <div style="font-size:12px; opacity:.7; display:flex; align-items:center; gap:8px; flex-wrap:wrap;">\n <span>◎</span>\n <span>No geo indexes for <b>{{ type }}</b> yet. Create one from the Manage tab.</span>\n </div>\n </if>\n <if :="geoIndexes.length > 0">\n <div style="display:flex; flex-direction:column; gap:8px;">\n <div style="display:flex; gap:8px; align-items:center; flex-wrap:wrap;">\n <select @change="geoField = $event.target.value" style="min-width:140px;">\n <each :of="geoIndexes" let:item="gf">\n <option :value="gf" :selected="geoField === gf">{{ gf }}</option>\n </each>\n </select>\n <span style="font-size:12px; opacity:.5;">Lat</span>\n <input\n type="number" step="any" placeholder="40.7484"\n :value="geoLat"\n @input:debounce.100="geoLat = $event.target.value"\n style="width:110px;"\n />\n <span style="font-size:12px; opacity:.5;">Lon</span>\n <input\n type="number" step="any" placeholder="-73.9856"\n :value="geoLon"\n @input:debounce.100="geoLon = $event.target.value"\n style="width:110px;"\n />\n <span style="font-size:12px; opacity:.5;">Radius (m)</span>\n <input\n type="number" step="any" placeholder="∞"\n :value="geoRadius"\n @input:debounce.100="geoRadius = $event.target.value"\n style="width:90px;"\n title="Leave empty for unlimited radius (sorted by distance)"\n />\n <button\n @click="geoSortAsc = !geoSortAsc"\n style="min-width:78px;"\n title="Toggle sort direction">\n {{ geoSortAsc ? \'↑ Nearest\' : \'↓ Farthest\' }}\n </button>\n </div>\n <div style="font-size:11px; opacity:.35; user-select:none;">\n Results sorted by distance · sift filter applied as post-filter · leave radius empty for no cutoff\n </div>\n </div>\n </if>\n </if>\n\n </div>\n\n </div>\n\n \x3c!-- ── Geo view toggle (only in geo mode) ── --\x3e\n <if :="searchMode === \'geo\' && geoIndexes.length > 0">\n <div style="display:flex; align-items:center; gap:4px; flex-shrink:0; padding:2px 0;">\n <div class="seg-toggle" style="flex-shrink:0;">\n <button :class="geoViewMode === \'table\' ? \'active\' : \'\'" @click="geoViewMode = \'table\'" title="Table only">\n <ok-icon name="table-2" style="width:13px;height:13px;vertical-align:middle;"></ok-icon>\n </button>\n <button :class="geoViewMode === \'map\' ? \'active\' : \'\'" @click="geoViewMode = \'map\'" title="Map only">\n <ok-icon name="map-pin" style="width:13px;height:13px;vertical-align:middle;"></ok-icon>\n </button>\n <button :class="geoViewMode === \'split\' ? \'active\' : \'\'" @click="geoViewMode = \'split\'" title="Table + Map">\n <ok-icon name="columns" style="width:13px;height:13px;vertical-align:middle;"></ok-icon>\n </button>\n </div>\n <span style="font-size:10px; opacity:.3; user-select:none;">view</span>\n </div>\n </if>\n\n \x3c!-- ── Results area ── --\x3e\n <div style="display:flex; flex-direction:column; position:relative; flex:1; min-height:0;">\n <if :="query.busy">\n <ok-overlay>\n <div class="loader-center">\n <ok-icon name="loader" class="spin"></ok-icon>\n </div>\n </ok-overlay>\n </if>\n\n \x3c!-- Results bar: timing + Add item --\x3e\n <div style="margin-bottom:8px; display:flex; align-items:center; gap:8px; flex-shrink:0;">\n <span style="font-size:12px; opacity:.45;">\n {{ query.time != null ? query.time + \'ms\' : \'\' }}\n <b style="opacity:.7;">{{ type }}</b>\n </span>\n <div style="margin-left:auto;">\n <button @click="openAddModal" class="btn-primary btn-icon" style="font-size:12px; padding:3px 12px;"\n :disabled="!$ok.stores.auth.can(\'data:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'data:write\') }"\n :title="$ok.stores.auth.permTooltip(\'data:write\')">\n <ok-icon name="plus"></ok-icon>Add item\n </button>\n </div>\n </div>\n\n \x3c!-- Content row — table + map as siblings, shown/hidden via display:none --\x3e\n <div style="display:flex; flex:1; min-height:0; gap:10px;">\n\n \x3c!-- TABLE col — hidden only in pure map mode --\x3e\n <div\n :style="searchMode === \'geo\' && geoViewMode === \'map\' ? \'display:none\' : \'flex:1; min-width:0; display:flex; flex-direction:column; min-height:0;\'"\n >\n <if :="hasDirectValueRows">\n <ok-table\n ref="table"\n :data="displayRows"\n select="single"\n no-scroll\n style="flex:1; min-height:0; overflow:auto;"\n @select-change="onGeoTableSelect($event)"\n >\n <columns>\n <column width="min-content" no-resize>\n <header>\n <span class="key__header">key</span>\n <if :="query.selectedFtsIndex">\n <span style="font-size:10px; color:var(--okdb-accent); opacity:.6; margin-left:6px; font-weight:normal;">score</span>\n </if>\n <if :="query.selectedVectorEngine">\n <span style="font-size:10px; color:var(--okdb-indigo); opacity:.6; margin-left:6px; font-weight:normal;">sim</span>\n </if>\n <if :="searchMode === \'geo\'">\n <span style="font-size:10px; color:var(--okdb-success); opacity:.6; margin-left:6px; font-weight:normal;">dist</span>\n </if>\n </header>\n <cell let:row>\n <span class="key__cell">{{ keyOf(row) }}</span>\n <if :="directValueKindOf(row)">\n <span :class="\'direct-value-badge direct-value-badge--\' + directValueKindOf(row)">\n {{ directValueKindOf(row) }}\n </span>\n </if>\n <if :="query.selectedFtsIndex">\n <span class="fts-score-badge">{{ matchOf(row) ?? \'—\' }}</span>\n </if>\n <if :="query.selectedVectorEngine">\n <span class="vec-score-badge">{{ vectorScoreOf(row) ?? \'—\' }}</span>\n <if :="vectorChunkMetaOf(row)">\n <span style="font-size:10px; color:var(--okdb-orange); opacity:.8; margin-left:4px; white-space:nowrap;">\n chunk {{ vectorChunkMetaOf(row).start }}–{{ vectorChunkMetaOf(row).end }}\n </span>\n </if>\n </if>\n <if :="searchMode === \'geo\' && distanceOf(row)">\n <span class="geo-dist-badge">{{ distanceOf(row) }}</span>\n </if>\n </cell>\n </column>\n\n <column>\n <header>value</header>\n <cell let:row>\n <code :title="prettyValueOf(row)" style="display:block; white-space:pre-wrap; word-break:break-word; font-size:12px;">{{ inlineValueOf(row) }}</code>\n </cell>\n </column>\n </columns>\n\n <expanded let:row>\n \x3c!-- Chunk info panel — shown only in vector mode for chunked pipeline results --\x3e\n <if :="query.selectedVectorEngine && vectorChunkMetaOf(row)">\n <div style="padding:8px 10px 0; display:flex; flex-direction:column; gap:6px;">\n <if :="vectorChunkMetaOf(row).text">\n <div style="font-size:11px; opacity:.5; margin-bottom:2px;">Matched chunk\n <span style="color:var(--okdb-orange); margin-left:6px;">chars {{ vectorChunkMetaOf(row).start }}–{{ vectorChunkMetaOf(row).end }}</span>\n </div>\n <div style="background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:6px; padding:8px; font-size:11px; max-height:140px; overflow:auto; white-space:pre-wrap; word-break:break-word; line-height:1.5;">{{ vectorChunkMetaOf(row).text }}</div>\n </if>\n\n <if :="!vectorChunkMetaOf(row).text && vectorChunkMetaOf(row).start != null">\n <div style="font-size:11px; opacity:.5; margin-bottom:2px;">Matched chunk\n <span style="color:var(--okdb-orange); margin-left:6px;">chars {{ vectorChunkMetaOf(row).start }}–{{ vectorChunkMetaOf(row).end }}</span>\n <span style="opacity:.55; margin-left:4px;">(highlighted in document below)</span>\n </div>\n </if>\n\n <div style="height:1px; background:var(--okdb-app-border); margin:2px 0;"></div>\n </div>\n </if>\n\n <edit-row\n :row="rowValueOf(row)"\n :key="keyOf(row)"\n :type="type"\n @remove="onRemoveRow(keyOf(row))"\n @change="onRowChanged($event)">\n </edit-row>\n </expanded>\n </ok-table>\n </if>\n\n <if :="!hasDirectValueRows">\n <ok-table\n ref="table"\n :data="displayRows"\n select="single"\n no-scroll\n style="flex:1; min-height:0; overflow:auto;"\n @select-change="onGeoTableSelect($event)"\n >\n <columns>\n <column width="min-content" no-resize>\n <header>\n <span class="key__header">key</span>\n <if :="query.selectedFtsIndex">\n <span style="font-size:10px; color:var(--okdb-accent); opacity:.6; margin-left:6px; font-weight:normal;">score</span>\n </if>\n <if :="query.selectedVectorEngine">\n <span style="font-size:10px; color:var(--okdb-indigo); opacity:.6; margin-left:6px; font-weight:normal;">sim</span>\n </if>\n <if :="searchMode === \'geo\'">\n <span style="font-size:10px; color:var(--okdb-success); opacity:.6; margin-left:6px; font-weight:normal;">dist</span>\n </if>\n </header>\n <cell let:row>\n <span class="key__cell">{{ keyOf(row) }}</span>\n <if :="query.selectedFtsIndex">\n <span class="fts-score-badge">{{ matchOf(row) ?? \'—\' }}</span>\n </if>\n <if :="query.selectedVectorEngine">\n <span class="vec-score-badge">{{ vectorScoreOf(row) ?? \'—\' }}</span>\n <if :="vectorChunkMetaOf(row)">\n <span style="font-size:10px; color:var(--okdb-orange); opacity:.8; margin-left:4px; white-space:nowrap;">\n chunk {{ vectorChunkMetaOf(row).start }}–{{ vectorChunkMetaOf(row).end }}\n </span>\n </if>\n </if>\n <if :="searchMode === \'geo\' && distanceOf(row)">\n <span class="geo-dist-badge">{{ distanceOf(row) }}</span>\n </if>\n </cell>\n </column>\n\n <auto max="10" :show-more-content="(n) => \'+\' + n + \' cols\'" show-more-title="Click to show all columns">\n <cell let:row let:value>\n <span :class="[typeof value, value === null ? \'null\' : \'\']">\n {{ value }}\n </span>\n </cell>\n </auto>\n </columns>\n\n <expanded let:row>\n \x3c!-- Chunk info panel — shown only in vector mode for chunked pipeline results --\x3e\n <if :="query.selectedVectorEngine && vectorChunkMetaOf(row)">\n <div style="padding:8px 10px 0; display:flex; flex-direction:column; gap:6px;">\n <if :="vectorChunkMetaOf(row).text">\n <div style="font-size:11px; opacity:.5; margin-bottom:2px;">Matched chunk\n <span style="color:var(--okdb-orange); margin-left:6px;">chars {{ vectorChunkMetaOf(row).start }}–{{ vectorChunkMetaOf(row).end }}</span>\n </div>\n <div style="background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:6px; padding:8px; font-size:11px; max-height:140px; overflow:auto; white-space:pre-wrap; word-break:break-word; line-height:1.5;">{{ vectorChunkMetaOf(row).text }}</div>\n </if>\n\n <if :="!vectorChunkMetaOf(row).text && vectorChunkMetaOf(row).start != null">\n <div style="font-size:11px; opacity:.5; margin-bottom:2px;">Matched chunk\n <span style="color:var(--okdb-orange); margin-left:6px;">chars {{ vectorChunkMetaOf(row).start }}–{{ vectorChunkMetaOf(row).end }}</span>\n <span style="opacity:.55; margin-left:4px;">(highlighted in document below)</span>\n </div>\n </if>\n\n <div style="height:1px; background:var(--okdb-app-border); margin:2px 0;"></div>\n </div>\n </if>\n\n <edit-row\n :row="rowValueOf(row)"\n :key="keyOf(row)"\n :type="type"\n @remove="onRemoveRow(keyOf(row))"\n @change="onRowChanged($event)">\n </edit-row>\n </expanded>\n </ok-table>\n </if>\n\n <div class="ok-pager">\n <button @click="query.prevPage()" :disabled="!query.hasPrev || query.busy">‹ Prev</button>\n <span>{{ query.total }} result{{ query.total === 1 ? \'\' : \'s\' }} · {{ query.pageSize }}/page</span>\n <button @click="query.nextPage()" :disabled="!query.hasNext || query.busy">Next ›</button>\n </div>\n </div>\n\n <if :="searchMode === \'geo\'">\n \x3c!-- MAP col — always mounted, shown only in geo map/split mode --\x3e\n <div\n style="flex:1; min-width:0; min-height:0; border-radius:8px; overflow:hidden; border:1px solid #23292e;"\n :style="{ \'display\': (geoViewMode === \'map\' || geoViewMode === \'split\')? \'block\' : \'none\' }"\n >\n <geo-map\n :points="geoMapPoints"\n :origin-lat="geoLat"\n :origin-lon="geoLon"\n :radius="geoRadius"\n :highlight-key="geoHighlightedKey"\n @move="geoLat = String($event.detail.lat.toFixed(6)), geoLon = String($event.detail.lon.toFixed(6))"\n @select="onGeoMapSelect($event)"\n style="width:100%; height:100%;"\n />\n </div>\n </if>\n\n </div>\n </div>\n\n\n</div>\n </if>\n\n \x3c!-- Changelog tab --\x3e\n <if :="tab === \'changelog\'">\n <type-changelog :type="type" style="flex:1; min-height:0;" />\n </if>\n\n \x3c!-- Manage tab --\x3e\n <if :="tab === \'manage\'">\n <div style="display:flex; flex-direction:column; gap:12px; flex:1; overflow:auto; padding-right:4px;">\n\n \x3c!-- Overview --\x3e\n <div class="card" style="display:flex; gap:24px; align-items:center;">\n <div>\n <div style="font-size:15px; font-weight:600;">{{ type }}</div>\n <div style="font-size:12px; opacity:.5; margin-top:2px;">type</div>\n </div>\n <div>\n <div style="font-size:22px; font-weight:600; color:var(--okdb-accent);">{{ typeCount }}</div>\n <div style="font-size:12px; opacity:.5; margin-top:2px;">records</div>\n </div>\n </div>\n\n \x3c!-- Fields --\x3e\n <div class="card">\n <div class="manage-section-title">Fields</div>\n <if :="typeFieldEntries.length === 0">\n <div style="opacity:.4; font-size:13px;">No fields tracked yet — add items or use Recompute.</div>\n </if>\n <if :="typeFieldEntries.length > 0">\n <div class="manage-grid manage-grid--2">\n <div class="manage-col-hd">Field</div>\n <div class="manage-col-hd">Observed types</div>\n <each :of="typeFieldEntries" let:item="tf">\n <div class="manage-cell"><code>{{ tf.name }}</code></div>\n <div class="manage-cell manage-cell--dim">{{ tf.types.join(\', \') }}</div>\n </each>\n </div>\n </if>\n </div>\n\n \x3c!-- Secondary Indexes --\x3e\n <div class="card">\n <div class="manage-section-header">\n <div class="manage-section-title">Secondary Indexes</div>\n <button @click="openCreateIndex()" class="btn-icon" style="font-size:11px; padding:3px 10px;"\n :disabled="!$ok.stores.auth.can(\'schema:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'schema:write\') }"\n :title="$ok.stores.auth.permTooltip(\'schema:write\')">\n <ok-icon name="plus"></ok-icon>Create index\n </button>\n </div>\n <if :="indexEntries.length === 0">\n <div style="opacity:.4; font-size:13px;">No indexes yet.</div>\n </if>\n <if :="indexEntries.length > 0">\n <div class="manage-grid manage-grid--idx">\n <div class="manage-col-hd">Fields</div>\n <div class="manage-col-hd">Kind</div>\n <div class="manage-col-hd">Ownership</div>\n <div class="manage-col-hd">Status</div>\n <div class="manage-col-hd"></div>\n <div class="manage-col-hd"></div>\n <each :of="indexEntries" let:item="ix">\n <div class="manage-cell" style="gap:4px; flex-wrap:wrap;">\n <each :of="ix.fields" let:item="f" let:index="fi">\n <code style="font-size:12px; color:var(--okdb-json-key);">{{ f }}</code><span style="opacity:.3; font-size:11px; margin-left:0;" :style="fi < ix.fields.length - 1 ? \'\' : \'display:none\'">·</span>\n </each>\n </div>\n <div class="manage-cell" style="gap:6px;">\n <if :="ix.isGeo">\n <span class="idx-kind-badge idx-kind-badge--geo">◎ geo</span>\n <span style="font-size:10px; opacity:.45; white-space:nowrap;">precision {{ ix.geoPrecision ?? 7 }}</span>\n </if>\n <if :="ix.isUnique && !ix.isGeo">\n <span class="idx-kind-badge idx-kind-badge--unique">◆ unique</span>\n </if>\n <if :="!ix.isGeo && !ix.isUnique">\n <span class="idx-kind-badge idx-kind-badge--regular">regular</span>\n </if>\n </div>\n <div class="manage-cell" style="gap:3px; flex-direction:column; align-items:flex-start;">\n <if :="ix.createdBy">\n <span class="idx-owned-badge">{{ ix.createdBy.kind }}:{{ ix.createdBy.name }}</span>\n </if>\n <each :of="ix.usedBy" let:item="consumer">\n <span class="idx-consumer-badge">{{ consumer }}</span>\n </each>\n </div>\n <div class="manage-cell">\n <span :class="\'manage-status manage-status--\' + ix.status">{{ ix.status }}</span>\n </div>\n <div class="manage-cell" style="justify-content:flex-end;">\n <button @click="rebuildIndex(ix.name)" class="btn-icon" style="font-size:11px; padding:2px 10px; opacity:.7;" title="Rebuild this index from all current records"\n :disabled="!$ok.stores.auth.can(\'schema:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'schema:write\') }"\n :title="$ok.stores.auth.can(\'schema:write\') ? \'Rebuild this index from all current records\' : $ok.stores.auth.permTooltip(\'schema:write\')">\n <ok-icon name="refresh-cw"></ok-icon>Rebuild\n </button>\n </div>\n <div class="manage-cell" style="justify-content:flex-end;">\n <button @click="removeIndex(ix.name)" class="btn-icon" style="font-size:11px; padding:2px 10px; color:var(--okdb-danger); opacity:.8;"\n :disabled="!$ok.stores.auth.can(\'schema:write\') || ix.usedBy.length > 0"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'schema:write\') }"\n :title="ix.usedBy.length > 0 ? \'Used by: \' + ix.usedBy.join(\', \') : ($ok.stores.auth.can(\'schema:write\') ? \'Remove this index\' : $ok.stores.auth.permTooltip(\'schema:write\'))">\n <ok-icon name="trash-2"></ok-icon>Remove\n </button>\n </div>\n </each>\n </div>\n </if>\n </div>\n\n \x3c!-- FTS Indexes --\x3e\n <div class="card">\n <div class="manage-section-header">\n <div class="manage-section-title">FTS Indexes</div>\n <button @click="openCreateFtsModal()" class="btn-icon" style="font-size:11px; padding:3px 10px;"\n :disabled="!$ok.stores.auth.can(\'schema:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'schema:write\') }"\n :title="$ok.stores.auth.permTooltip(\'schema:write\')">\n <ok-icon name="plus"></ok-icon>Create FTS index\n </button>\n </div>\n <if :="ftsEntries.length === 0">\n <div style="opacity:.4; font-size:13px;">No FTS indexes yet.</div>\n </if>\n <if :="ftsEntries.length > 0">\n <div class="manage-grid manage-grid--fts">\n <div class="manage-col-hd">Name</div>\n <div class="manage-col-hd">Fields</div>\n <div class="manage-col-hd">Status</div>\n <div class="manage-col-hd">Size</div>\n <div class="manage-col-hd"></div>\n <div class="manage-col-hd"></div>\n <each :of="ftsEntries" let:item="fe">\n <div class="manage-cell"><code>{{ fe.name }}</code></div>\n <div class="manage-cell manage-cell--dim">{{ fe.fields }}</div>\n <div class="manage-cell">\n <span :class="\'manage-status manage-status--\' + fe.status">{{ fe.status }}</span>\n </div>\n <div class="manage-cell manage-cell--dim" style="font-size:11px; font-family:monospace;">{{ fmtBytes(fe.sizeBytes) }}</div>\n <div class="manage-cell" style="justify-content:flex-end;">\n <button @click="rebuildFts(fe.name)" class="btn-icon" style="font-size:11px; padding:2px 10px; opacity:.7;" title="Rebuild this FTS index from all current records"\n :disabled="!$ok.stores.auth.can(\'schema:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'schema:write\') }"\n :title="$ok.stores.auth.can(\'schema:write\') ? \'Rebuild this FTS index from all current records\' : $ok.stores.auth.permTooltip(\'schema:write\')">\n <ok-icon name="refresh-cw"></ok-icon>Rebuild\n </button>\n </div>\n <div class="manage-cell" style="justify-content:flex-end;">\n <button @click="dropFtsIndex(fe.name)" class="btn-icon" style="font-size:11px; padding:2px 10px; color:var(--okdb-danger); opacity:.8;" title="Drop this FTS index"\n :disabled="!$ok.stores.auth.can(\'schema:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'schema:write\') }"\n :title="$ok.stores.auth.can(\'schema:write\') ? \'Drop this FTS index\' : $ok.stores.auth.permTooltip(\'schema:write\')">\n <ok-icon name="trash-2"></ok-icon>Drop\n </button>\n </div>\n </each>\n </div>\n </if>\n </div>\n\n \x3c!-- Vector Search Engines --\x3e\n <div class="card">\n <div class="manage-section-header">\n <div class="manage-section-title">Vector Search Engines</div>\n <button\n @click="openEnginesWorkspace()"\n class="btn-icon"\n style="font-size:11px; padding:3px 10px; color:var(--okdb-indigo); border-color:color-mix(in srgb, var(--okdb-indigo) 27%, transparent);"\n title="Open the type-scoped engines view for this type"\n >\n ⛓ Type Engines →\n </button>\n </div>\n <if :="vectorEntries.length === 0">\n <div style="opacity:.4; font-size:13px;">\n No vector search engines for this type yet.\n <button\n @click="openEnginesCreatePipeline()"\n style="margin-left:6px; font-size:11px; padding:1px 8px; border-radius:999px; border:1px solid color-mix(in srgb, var(--okdb-indigo) 27%, transparent); color:var(--okdb-indigo); background:color-mix(in srgb, var(--okdb-indigo) 5%, transparent); cursor:pointer;"\n >Create Pipeline…</button>\n </div>\n </if>\n <if :="vectorEntries.length > 0">\n <div class="manage-grid manage-grid--vec">\n <div class="manage-col-hd">Engine</div>\n <div class="manage-col-hd">Status</div>\n <div class="manage-col-hd">Pipeline</div>\n <div class="manage-col-hd"></div>\n <each :of="vectorEntries" let:item="ve">\n <div class="manage-cell"><code>{{ ve.displayName }}</code></div>\n <div class="manage-cell">\n <span :class="\'manage-status manage-status--\' + (ve.running ? \'ready\' : \'creating\')">{{ ve.status }}</span>\n </div>\n <div class="manage-cell manage-cell--dim">{{ ve.pipeline ?? \'—\' }}</div>\n <div class="manage-cell" style="justify-content:flex-end;">\n <button\n @click="openEnginesPipeline(ve.pipeline)"\n class="btn-icon"\n style="font-size:11px; padding:2px 10px; color:var(--okdb-indigo); opacity:.85;"\n title="Open this type-scoped pipeline view"\n >\n ⛓ View local →\n </button>\n </div>\n </each>\n </div>\n </if>\n </div>\n\n \x3c!-- TTL --\x3e\n <div class="card">\n <div class="manage-section-header">\n <div class="manage-section-title">Time-to-Live (TTL)</div>\n <button @click="(loadTTLStats(), loadDefaultTTL())" class="btn-icon" style="font-size:11px; padding:3px 10px; opacity:.6;" :disabled="ttlStatsLoading" title="Refresh TTL stats">\n ↻\n </button>\n </div>\n\n \x3c!-- Default TTL --\x3e\n <div style="margin-bottom:12px; padding:10px; background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:6px;">\n <div style="font-size:12px; font-weight:600; opacity:.7; margin-bottom:8px;">Default TTL for new items</div>\n <if :="defaultTTL">\n <div style="font-size:13px; color:var(--okdb-success); margin-bottom:8px;">\n Currently: <span style="font-family:monospace; font-weight:600;">{{ fmtDuration(defaultTTL) }}</span>\n <span style="opacity:.4; font-size:11px;"> ({{ defaultTTL }}ms)</span>\n </div>\n </if>\n <if :="!defaultTTL">\n <div style="font-size:12px; opacity:.4; margin-bottom:8px;">No default — items don\'t expire unless TTL is set explicitly.</div>\n </if>\n <div style="display:flex; gap:6px; align-items:center; flex-wrap:wrap;">\n <select\n @change="onDefaultTTLPresetChange($event.target.value)"\n style="font-size:11px; padding:2px 6px; background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:4px; color:var(--okdb-app-fg);"\n >\n <option value="">Custom…</option>\n <option value="60000">1 min</option>\n <option value="300000">5 min</option>\n <option value="900000">15 min</option>\n <option value="3600000">1 hr</option>\n <option value="21600000">6 hr</option>\n <option value="86400000">24 hr</option>\n <option value="604800000">7 days</option>\n <option value="2592000000">30 days</option>\n </select>\n <input\n type="number"\n !value="defaultTTLInput"\n @input="(defaultTTLInput = $el.value, defaultTTLPreset = \'\')"\n placeholder="ms"\n style="width:110px; font-size:11px; padding:2px 6px; background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:4px; color:var(--okdb-app-fg);"\n />\n <button @click="setDefaultTTLAction()" :disabled="defaultTTLBusy || !defaultTTLInput || !$ok.stores.auth.can(\'data:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'data:write\') }"\n :title="$ok.stores.auth.permTooltip(\'data:write\')"\n style="font-size:11px; padding:2px 10px; color:var(--okdb-success); border-color:color-mix(in srgb, var(--okdb-success) 33%, transparent);">Set</button>\n <if :="defaultTTL">\n <button @click="clearDefaultTTLAction()" :disabled="defaultTTLBusy || !$ok.stores.auth.can(\'data:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'data:write\') }"\n :title="$ok.stores.auth.permTooltip(\'data:write\')"\n style="font-size:11px; padding:2px 10px; color:var(--okdb-danger); border-color:color-mix(in srgb, var(--okdb-danger) 33%, transparent);">Clear</button>\n </if>\n </div>\n </div>\n\n \x3c!-- TTL stats --\x3e\n <if :="!ttlStats || !ttlStats.enabled">\n <div style="opacity:.4; font-size:13px;">No TTL entries for this type — TTL sub-databases are created lazily on first use.</div>\n </if>\n <if :="ttlStats && ttlStats.enabled">\n <div style="display:flex; gap:24px; align-items:center; margin-bottom:10px;">\n <div>\n <div style="font-size:18px; font-weight:600; color:var(--okdb-success);">{{ ttlStats.totalEntries }}</div>\n <div style="font-size:11px; opacity:.5;">entries</div>\n </div>\n <div>\n <div :style="\'font-size:18px; font-weight:600; color:\' + (ttlStats.expiredEntries > 0 ? \'var(--okdb-danger)\' : \'var(--okdb-app-fg-muted)\') + \';\'">{{ ttlStats.expiredEntries }}</div>\n <div style="font-size:11px; opacity:.5;">expired</div>\n </div>\n <div>\n <div style="font-size:13px; font-family:monospace; color:var(--okdb-app-fg);">{{ ttlStats.nextExpiry ? fmtDuration(ttlStats.nextExpiry - Date.now()) : \'—\' }}</div>\n <div style="font-size:11px; opacity:.5;">next expiry</div>\n </div>\n </div>\n <div style="display:flex; gap:8px; align-items:center;">\n <button @click="triggerSweep()" :disabled="ttlSweepBusy || !$ok.stores.auth.can(\'data:write\')" class="btn-icon" style="font-size:11px; padding:3px 10px;"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'data:write\') }"\n :title="$ok.stores.auth.permTooltip(\'data:write\')">\n <ok-icon name="refresh-cw"></ok-icon>Sweep expired now\n </button>\n <if :="ttlSweepBusy"><span style="font-size:11px; opacity:.5;">Sweeping…</span></if>\n </div>\n </if>\n </div>\n\n \x3c!-- Danger zone --\x3e\n <div class="card card--danger"> <div class="manage-section-title" style="color:var(--okdb-danger);">⚠ Danger Zone</div>\n <div style="display:flex; gap:8px; flex-wrap:wrap; align-items:center;">\n <button @click="recomputeFields" class="btn-icon"\n :disabled="!$ok.stores.auth.can(\'data:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'data:write\') }"\n :title="$ok.stores.auth.can(\'data:write\') ? \'Rescan all records to rebuild the field schema\' : $ok.stores.auth.permTooltip(\'data:write\')">\n <ok-icon name="refresh-cw"></ok-icon>Recompute fields\n </button>\n <button @click="dropType" class="btn-danger btn-icon"\n :disabled="!$ok.stores.auth.can(\'data:write\')"\n :class="{ \'perm-denied\': !$ok.stores.auth.can(\'data:write\') }"\n :title="$ok.stores.auth.permTooltip(\'data:write\')">\n <ok-icon name="trash-2"></ok-icon>Drop type\n </button>\n </div>\n </div>\n\n </div>\n </if>\n\n \x3c!-- Schema tab --\x3e\n <if :="tab === \'schema\'">\n <type-schema-tab\n :type="type"\n :on-view-key="(key) => setTab(\'data\')"\n :on-schema-changed="() => loadViolations()"\n :on-violation-count-changed="(count) => onViolationCountChanged(count)"\n style="flex:1; min-height:0;"\n />\n </if>\n\n <if :="tab === \'engines\'">\n <type-pipelines-tab :type="type" :focusedpipeline="currentRoutePipeline" :currentmode="currentRouteMode" style="flex:1; min-height:0;" />\n </if>\n\n</div>',style:"[tag]{display:flex;flex-direction:column;height:100%;min-width:0;min-height:0}.ok-table__cell__inner>span.object{color:#a6da95}.ok-table__cell__inner>span.number{color:var(--okdb-accent)}.ok-table__cell__inner>span.boolean{color:#ff6c6b}.ok-table__cell__inner>span.null,.ok-table__cell__inner>span.undefined{color:#c792ea}.ok-table__cell__inner>.key__header{font-weight:700;color:var(--okdb-json-key)}.ok-table__cell__inner>.key__cell{color:var(--okdb-json-key)}.fts-score-badge,.mode-count{display:inline-block;border-radius:999px;font-size:10px;vertical-align:middle}.mode-count{margin-left:4px;padding:0 5px;background:#ffffff18;line-height:1.6}.fts-score-badge{margin-left:5px;padding:1px 5px;border:1px solid color-mix(in srgb,var(--okdb-accent) 33%,transparent);color:var(--okdb-accent);opacity:.8}.vec-score-badge{border:1px solid color-mix(in srgb,var(--okdb-indigo) 33%,transparent);color:var(--okdb-indigo)}.direct-value-badge,.geo-dist-badge,.vec-score-badge{display:inline-block;margin-left:5px;padding:1px 5px;border-radius:999px;font-size:10px;vertical-align:middle;opacity:.8}.geo-dist-badge{border:1px solid color-mix(in srgb,var(--okdb-success) 33%,transparent);color:var(--okdb-success)}.direct-value-badge{border:1px solid}.direct-value-badge--scalar{border-color:color-mix(in srgb,var(--okdb-app-fg-muted) 33%,transparent);color:var(--okdb-app-fg-muted)}.direct-value-badge--array{border-color:#2dd4bf55;color:#2dd4bf}.direct-value-badge--null{border-color:color-mix(in srgb,var(--okdb-purple) 33%,transparent);color:var(--okdb-purple)}.manage-section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.manage-section-title{font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.06em;opacity:.5;margin-bottom:0}.manage-grid{display:grid;gap:0}.manage-grid--2{grid-template-columns:1fr 1fr}.manage-grid--3{grid-template-columns:1fr auto auto}.manage-grid--4{grid-template-columns:1fr auto auto auto}.manage-grid--idx{grid-template-columns:minmax(80px,2fr) minmax(90px,1fr) minmax(80px,1fr) auto auto auto}.idx-consumer-badge,.idx-owned-badge{display:inline-block;padding:1px 6px;border-radius:3px;font-size:10px;white-space:nowrap}.idx-owned-badge{background:color-mix(in srgb,var(--okdb-accent) 12%,transparent);color:var(--okdb-accent);border:1px solid color-mix(in srgb,var(--okdb-accent) 25%,transparent)}.idx-consumer-badge{background:color-mix(in srgb,var(--okdb-sky) 12%,transparent);color:var(--okdb-sky);border:1px solid color-mix(in srgb,var(--okdb-sky) 25%,transparent)}.manage-grid--fts{grid-template-columns:minmax(80px,1fr) 2fr minmax(60px,auto) minmax(50px,auto) auto auto}.manage-grid--vec{grid-template-columns:minmax(80px,1fr) minmax(60px,auto) minmax(80px,1fr) auto}.idx-kind-badge{display:inline-block;padding:1px 7px;border-radius:999px;font-size:10px;border:1px solid;white-space:nowrap}.idx-kind-badge--geo{color:var(--okdb-success);border-color:color-mix(in srgb,var(--okdb-success) 33%,transparent)}.idx-kind-badge--unique{color:var(--okdb-warning);border-color:color-mix(in srgb,var(--okdb-warning) 33%,transparent)}.idx-kind-badge--regular{color:var(--okdb-app-fg-muted);border-color:color-mix(in srgb,var(--okdb-app-fg-muted) 20%,transparent)}.idx-info-strip{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:5px 8px;background:var(--okdb-app-bg-deep);border:1px solid var(--okdb-app-surface-2);border-radius:4px;font-size:11px}.idx-info-label{opacity:.4;white-space:nowrap}.idx-info-field{font-size:11px;color:var(--okdb-json-key)}.idx-info-badge{padding:1px 7px;border-radius:999px;font-size:10px;border:1px solid;white-space:nowrap}.idx-info-badge--geo{color:var(--okdb-success);border-color:color-mix(in srgb,var(--okdb-success) 33%,transparent)}.idx-info-badge--unique{color:var(--okdb-warning);border-color:color-mix(in srgb,var(--okdb-warning) 33%,transparent)}.idx-info-badge--regular{color:var(--okdb-app-fg-muted);border-color:color-mix(in srgb,var(--okdb-app-fg-muted) 20%,transparent)}.manage-col-hd{font-size:11px;opacity:.4;padding:0 12px 6px 0;border-bottom:1px solid var(--okdb-app-border);font-weight:400}.manage-cell{padding:6px 12px 6px 0;border-bottom:1px solid var(--okdb-app-surface);font-size:13px;display:flex;align-items:center;min-width:0}.manage-cell--dim{opacity:.5;font-size:12px}.manage-status{display:inline-block;padding:1px 7px;border-radius:999px;font-size:10px;border:1px solid}.manage-status--ready{color:var(--okdb-success);border-color:color-mix(in srgb,var(--okdb-success) 33%,transparent)}.manage-status--creating,.manage-status--resetting{color:var(--okdb-warning);border-color:color-mix(in srgb,var(--okdb-warning) 33%,transparent)}.card--danger{border:1px solid color-mix(in srgb,var(--okdb-danger) 13%,transparent)!important}"};
|