@kedem/okdb 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/bin/okdb.js +1 -1
  2. package/keys/public.pem +3 -0
  3. package/okdb.js +1 -1
  4. package/package.json +2 -2
  5. package/public/admin-app.js +1 -1
  6. package/public/components/admin-route-host.ok.js +1 -1
  7. package/public/components/env-picker.ok.js +1 -1
  8. package/public/components/field-path-input.ok.js +1 -1
  9. package/public/components/field.html +154 -2
  10. package/public/components/geo-map.ok.js +1 -1
  11. package/public/components/ok-cron-input.ok.js +1 -1
  12. package/public/components/ok-dropzone.ok.js +1 -1
  13. package/public/components/ok-js-input.ok.js +1 -1
  14. package/public/components/ok-json-input.ok.js +1 -1
  15. package/public/components/ok-text-monaco-input.ok.js +1 -1
  16. package/public/components/theme-toggle.ok.js +1 -1
  17. package/public/index.html +29 -2
  18. package/public/layouts/_default.ok.html +1 -1
  19. package/public/layouts/okdb-cube.ok.html +1 -1
  20. package/public/login-app.js +1 -1
  21. package/public/login.html +205 -1
  22. package/public/modules/ok.js +1 -1
  23. package/public/sections/api/index.ok.html +1 -1
  24. package/public/sections/api/parts/api-endpoint.ok.js +1 -1
  25. package/public/sections/auth/index.ok.html +1 -1
  26. package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
  27. package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
  28. package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
  29. package/public/sections/auth/parts/token-detail.ok.js +1 -1
  30. package/public/sections/auth/parts/token-list.ok.js +1 -1
  31. package/public/sections/db/index.ok.html +1 -1
  32. package/public/sections/db/modals/add-item-modal.ok.js +1 -1
  33. package/public/sections/db/modals/create-env-modal.ok.js +1 -1
  34. package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
  35. package/public/sections/db/modals/create-index-modal.ok.js +1 -1
  36. package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
  37. package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
  38. package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
  39. package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
  40. package/public/sections/db/parts/db-overview.ok.js +1 -1
  41. package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
  42. package/public/sections/db/parts/edit-row.ok.js +1 -1
  43. package/public/sections/db/parts/tm-timeline.ok.js +1 -1
  44. package/public/sections/db/parts/type-changelog.ok.js +1 -1
  45. package/public/sections/db/parts/type-list.ok.js +1 -1
  46. package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
  47. package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
  48. package/public/sections/db/parts/type-viewer.ok.js +1 -1
  49. package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
  50. package/public/sections/docs/index.ok.html +1 -1
  51. package/public/sections/embeddings/index.ok.html +1 -1
  52. package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
  53. package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
  54. package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
  55. package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
  56. package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
  57. package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
  58. package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
  59. package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
  60. package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
  61. package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
  62. package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
  63. package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
  64. package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
  65. package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
  66. package/public/sections/engines/engine-panel-shared-style.js +1 -1
  67. package/public/sections/engines/engine-ui-utils.js +1 -1
  68. package/public/sections/engines/index.ok.html +1 -1
  69. package/public/sections/engines/modals/engine-modal.ok.js +1 -1
  70. package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
  71. package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
  72. package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
  73. package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
  74. package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
  75. package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
  76. package/public/sections/files/index.ok.html +1 -1
  77. package/public/sections/files/parts/files-blob-status.ok.js +1 -1
  78. package/public/sections/files/parts/files-collection-list.ok.js +1 -1
  79. package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
  80. package/public/sections/files/parts/files-file-list.ok.js +1 -1
  81. package/public/sections/files/parts/files-overview.ok.js +1 -1
  82. package/public/sections/files/parts/files-path-browser.ok.js +1 -1
  83. package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
  84. package/public/sections/functions/index.ok.html +1 -1
  85. package/public/sections/functions/modals/function-modal.ok.js +1 -1
  86. package/public/sections/functions/parts/function-detail.ok.js +1 -1
  87. package/public/sections/functions/parts/function-logs.ok.js +1 -1
  88. package/public/sections/functions/parts/function-runner.ok.js +1 -1
  89. package/public/sections/functions/parts/functions-list.ok.js +1 -1
  90. package/public/sections/license/index.ok.html +1 -1
  91. package/public/sections/license/parts/license-panel.ok.js +1 -1
  92. package/public/sections/processors/index.ok.html +1 -1
  93. package/public/sections/queue/index.ok.html +1 -1
  94. package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
  95. package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
  96. package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
  97. package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
  98. package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
  99. package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
  100. package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
  101. package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
  102. package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
  103. package/public/sections/queue/parts/queue-types.ok.js +1 -1
  104. package/public/sections/queue/parts/queue-workers.ok.js +1 -1
  105. package/public/sections/sync/index.ok.html +1 -1
  106. package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
  107. package/public/sections/sync/parts/sync-retention.ok.js +1 -1
  108. package/public/sections/sync/parts/sync-topology.ok.js +1 -1
  109. package/public/sections/system/index.ok.html +1 -1
  110. package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
  111. package/public/sections/system/parts/system-api-panel.ok.js +1 -1
  112. package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
  113. package/public/sections/system/parts/system-log-history.ok.js +1 -1
  114. package/public/sections/system/parts/system-log.ok.js +1 -1
  115. package/public/sections/system/parts/system-status.ok.js +1 -1
  116. package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
  117. package/public/sections/views/index.ok.html +1 -1
  118. package/public/sections/views/modals/create-view-modal.ok.js +1 -1
  119. package/public/sections/views/parts/view-detail.ok.js +1 -1
  120. package/public/sections/views/parts/views-list.ok.js +1 -1
  121. package/public/sections/views/parts/views-overview.ok.js +1 -1
  122. package/public/setup-app.js +1 -1
  123. package/public/setup.html +189 -1
  124. package/public/stores/auth-store.js +1 -1
  125. package/public/stores/events-store.js +1 -1
  126. package/public/stores/functions-store.js +1 -1
  127. package/public/stores/okdb-store.js +1 -1
  128. package/public/stores/theme-store.js +1 -1
  129. package/public/test-cron-input.html +53 -3
  130. package/public/test-json-input.html +182 -3
  131. package/public/util/permissions.js +1 -1
  132. package/public/util/sift-schema.js +1 -1
  133. package/public/vendor/okjs/ok.esm.min.js +1 -2
  134. package/public/view-models/type-query-vm.js +1 -1
  135. package/okdb-data/default/data.mdb +0 -0
  136. package/okdb-data/default/lock.mdb +0 -0
  137. package/okdb-data/~log/data.mdb +0 -0
  138. package/okdb-data/~log/lock.mdb +0 -0
  139. package/okdb-data/~system/data.mdb +0 -0
  140. package/okdb-data/~system/lock.mdb +0 -0
  141. package/public/images/logo.png +0 -0
  142. package/public/images/logo.svg +0 -333
@@ -1 +1 @@
1
- function _0x5304(_0x52975e,_0xaca0fc){_0x52975e=_0x52975e-0xfe;const _0x560746=_0x5607();let _0x53044f=_0x560746[_0x52975e];return _0x53044f;}const _0x214a29=_0x5304;(function(_0x46ac77,_0x5b5237){const _0x2ecd12=_0x5304,_0x4ca6cf=_0x46ac77();while(!![]){try{const _0x21525d=-parseInt(_0x2ecd12(0x139))/0x1*(parseInt(_0x2ecd12(0x164))/0x2)+parseInt(_0x2ecd12(0x15e))/0x3*(-parseInt(_0x2ecd12(0x13a))/0x4)+-parseInt(_0x2ecd12(0x144))/0x5*(-parseInt(_0x2ecd12(0x117))/0x6)+-parseInt(_0x2ecd12(0x165))/0x7+-parseInt(_0x2ecd12(0x127))/0x8*(parseInt(_0x2ecd12(0x114))/0x9)+-parseInt(_0x2ecd12(0x175))/0xa+-parseInt(_0x2ecd12(0x12c))/0xb*(-parseInt(_0x2ecd12(0x10b))/0xc);if(_0x21525d===_0x5b5237)break;else _0x4ca6cf['push'](_0x4ca6cf['shift']());}catch(_0x379589){_0x4ca6cf['push'](_0x4ca6cf['shift']());}}}(_0x5607,0xb2a6a));import _0x14bae5 from'@toolkit/elements/ok-table.ok.js';function _0x5607(){const _0x3ec04d=['fetchDoc','chunked\x20·\x20','push','query\x20failed','/env/','busy','$watch','Rebuild\x20complete.','6dKamzu','flat','filter','name','min','modal','2FqxSjg','1963360ooYXyF','embedder','source_type','keys','loadEditAlgorithms','queryBusy','sourceType','$attr','queryResults','API','fields','start','map','slice','engine-updated','embed-search-panel','13783280QyXXVB','\x0a<engine-panel-shell\x0a\x20\x20:engine=\x22eng\x22\x0a\x20\x20:title=\x22name\x22\x0a\x20\x20type-label=\x22vector-search\x22\x0a\x20\x20type-color=\x22var(--okdb-accent)\x22\x0a\x20\x20:badges=\x22headerBadges\x22\x0a\x20\x20show-refresh=\x22true\x22\x0a\x20\x20fill=\x22true\x22\x0a\x20\x20:refresh-busy=\x22busy\x20||\x20queryBusy\x20||\x20actionBusy\x22\x0a\x20\x20:on-refresh=\x22()\x20=>\x20onRefresh()\x22\x0a\x20\x20:on-pipeline=\x22viewPipeline\x22\x0a\x20\x20@engine-updated=\x22$dispatch(\x27engine-updated\x27,\x20$event.detail)\x22\x0a\x20\x20@refresh=\x22$dispatch(\x27refresh\x27)\x22\x0a\x20\x20@deleted=\x22$dispatch(\x27deleted\x27,\x20$event.detail)\x22\x0a>\x0a\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:13px;\x22>{{\x20error\x20}}</div>\x0a\x20\x20</if>\x0a\x0a\x0a\x20\x20<if\x20:=\x22stats\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:8px;min-width:0;flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pill-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Vector\x20search\x20algorithm.\x22>{{\x20s.algorithm\x20||\x20\x27—\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Distance\x20metric.\x22>{{\x20metricValue\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Vector\x20dimensions.\x22>dims:\x20{{\x20dimsValue\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Backing\x20storage\x20key.\x22>store:\x20{{\x20storageKeyValue\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22chunkStrategy\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Chunking\x20strategy\x20used\x20by\x20the\x20indexer.\x22>chunk:\x20{{\x20chunkStrategy\x20}}</span>\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\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-lead\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Query\x20the\x20live\x20vector\x20index\x20for\x20<strong>{{\x20storageKeyValue\x20}}</strong>\x20and\x20inspect\x20the\x20matched\x20source\x20chunks\x20below.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-note\x22>Use\x20text\x20search\x20here\x20to\x20validate\x20relevance\x20quickly.\x20Snapshot\x20and\x20rebuild\x20are\x20available\x20below\x20when\x20the\x20in-memory\x20index\x20needs\x20maintenance.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-grid\x20metric-grid--compact\x22\x20style=\x22min-width:min(100%,\x20360px);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Vectors</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22>{{\x20vectorCount\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<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Capacity</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22font-size:18px;\x22>{{\x20capacityValue\x20}}</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</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<if\x20:=\x22wm\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;justify-content:space-between;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Performance</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!wm.searchOps\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;opacity:.4;font-style:italic;\x22>Run\x20a\x20search\x20to\x20populate\x20latency\x20metrics.</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-grid\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-label\x22>Avg\x20latency</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-value\x22>{{\x20fmtMs(wm.searchLatencyAvgMs)\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-label\x22>p95\x20latency</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-value\x22>{{\x20fmtMs(wm.searchLatencyP95Ms)\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-label\x22>Searches</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-value\x22>{{\x20wm.searchOps\x20??\x200\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-label\x22>Queue\x20depth</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-value\x22>{{\x20wm.pendingOps\x20??\x200\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22wm.workerMemory\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-label\x22>Heap\x20used</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-value\x22\x20style=\x22font-size:15px;\x22>{{\x20fmtBytes(wm.workerMemory.heapUsed)\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<div\x20class=\x22perf-cell\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-label\x22>RSS</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22perf-value\x22\x20style=\x22font-size:15px;\x22>{{\x20fmtBytes(wm.workerMemory.rss)\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</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<div\x20class=\x22card\x22\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:10px;\x20flex:1;\x20min-height:0;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Search\x20test</div>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22story-note\x22>Run\x20a\x20text\x20query\x20and\x20inspect\x20the\x20raw\x20chunk\x20hits\x20and\x20source\x20context.</span>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22!hasEmbedder\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.55;\x20font-size:12px;\x20font-style:italic;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20No\x20embedder\x20configured\x20—\x20text\x20queries\x20unavailable.\x20Pass\x20a\x20Float32Array\x20via\x20the\x20API\x20directly.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22flex:1;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22Enter\x20text\x20query…\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22queryText\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22queryText\x20=\x20$el.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20@keydown.enter=\x22runQuery\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!hasEmbedder\x20||\x20!eng.isRunning\x22\x0a\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20type=\x22number\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22width:72px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22queryLimit\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22queryLimit\x20=\x20Number($el.value)\x20||\x2010\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20min=\x221\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20max=\x22100\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Top-K\x22\x0a\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runQuery\x22\x20:disabled=\x22queryBusy\x20||\x20!queryText.trim()\x20||\x20!eng.isRunning\x20||\x20!hasEmbedder\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20queryBusy\x20?\x20\x27…\x27\x20:\x20\x27Search\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22queryError\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:13px;\x22>{{\x20queryError\x20}}</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22queryResults\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22overflow:auto;\x20min-height:0;\x20flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22queryResults.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.5;\x20font-size:13px;\x22>No\x20results.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<ok-table\x20:data=\x22queryResults\x22\x20no-scroll\x20style=\x22width:100%;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<columns>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x2236px\x22\x20no-resize>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>#</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>{{\x20queryResults.indexOf(row)\x20+\x201\x20}}</cell>\x0a\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<column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>Key</header>\x0a\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<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>{{\x20row.key\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.chunk\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22chunk-loc\x22\x20style=\x22margin-left:8px;\x22>{{\x20fmtRange(row.chunk)\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</div>\x0a\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</column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x22200px\x22\x20no-resize>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>Score</header>\x0a\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<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;\x20background:var(--okdb-app-border);\x20border-radius:4px;\x20height:6px;\x20overflow:hidden;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:style=\x22\x27height:100%;\x20border-radius:4px;\x20background:\x27\x20+\x20scoreColor(row.score)\x20+\x20\x27;\x20width:\x27\x20+\x20scoreBar(row.score)\x20+\x20\x27%\x27\x22></div>\x0a\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<span\x20style=\x22font-size:12px;\x20opacity:.8;\x20min-width:42px;\x20text-align:right;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20(row.score\x20*\x20100).toFixed(1)\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</div>\x0a\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</column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</columns>\x0a\x0a\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<div\x20style=\x22padding:10px;\x20font-size:12px;\x20display:flex;\x20flex-direction:column;\x20gap:10px;\x22\x20:data-fetch=\x22autoFetch(row)\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Identity\x20line\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.6;\x20font-size:11px;\x20display:flex;\x20align-items:center;\x20gap:10px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>key:\x20<strong\x20style=\x22color:#fff;\x20opacity:1;\x22>{{\x20row.key\x20}}</strong></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22sourceType\x22><span>type:\x20<strong\x20style=\x22color:var(--okdb-accent);\x22>{{\x20sourceType\x20}}</strong></span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.chunk\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22chunk-loc\x22>{{\x20fmtRange(row.chunk)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.chunkHash\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;\x20font-family:monospace;\x20font-size:10px;\x22>{{\x20row.chunkHash\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20═══\x20CHUNKED\x20RESULT\x20═══════════════════════════════════════════\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.chunk\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Tier\x201:\x20Matched\x20chunk\x20text\x20-->\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\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x20margin-bottom:4px;\x20display:flex;\x20align-items:center;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Matched\x20chunk</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!row.chunk.text\x20&&\x20usesNonTrivialPrepare\x20&&\x20getChunkText(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=\x22color:var(--okdb-warning);\x20font-size:10px;\x22\x20title=\x22Chunk\x20offsets\x20are\x20into\x20the\x20prepared\x20text;\x20extraction\x20from\x20the\x20raw\x20field\x20may\x20be\x20approximate.\x22>⚠\x20approximate</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</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20storeText:\x20true\x20—\x20text\x20carried\x20in\x20the\x20result\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.chunk.text\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22chunk-text\x22>{{\x20row.chunk.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<!--\x20storeText:\x20false\x20—\x20extract\x20from\x20loaded\x20source\x20doc\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!row.chunk.text\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22docCache[row.key]?.busy\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.45;\x20font-size:11px;\x20padding:6px\x200;\x22>Loading\x20chunk…</div>\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\x20\x20<if\x20:=\x22!docCache[row.key]?.busy\x20&&\x20getChunkText(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<div\x20class=\x22chunk-text\x22>{{\x20getChunkText(row)\x20}}</div>\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\x20\x20<if\x20:=\x22!docCache[row.key]?.busy\x20&&\x20!getChunkText(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<div\x20style=\x22opacity:.4;\x20font-size:11px;\x20font-style:italic;\x20padding:4px\x200;\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\x20<if\x20:=\x22docCache[row.key]?.error\x22>Source\x20doc\x20unavailable.</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!docCache[row.key]?.error\x20&&\x20!sourceType\x22>No\x20source\x20type\x20—\x20cannot\x20look\x20up\x20chunk\x20text.</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!docCache[row.key]?.error\x20&&\x20sourceType\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\x20\x20\x20Chunk\x20text\x20not\x20stored.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!eng.config?.field\x22>\x20No\x20field\x20configured.</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22eng.config?.field\x22>\x20Enable\x20<code>storeText:\x20true</code>\x20in\x20the\x20pipeline\x20to\x20store\x20it.</if>\x0a\x20\x20\x20\x20\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\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</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</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Tier\x202:\x20\x22View\x20in\x20context\x20of\x20source\x22\x20collapsible\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22sourceType\x22>\x0a\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<button\x20class=\x22doc-toggle\x22\x20@click=\x22toggleDocExpand(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<if\x20:=\x22docExpanded[row.key]\x22>▲\x20hide\x20source\x20context</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!docExpanded[row.key]\x22>▼\x20view\x20in\x20context\x20of\x20source</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\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\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22docExpanded[row.key]\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:8px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22docCache[row.key]?.busy\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\x20\x20\x20<div\x20style=\x22opacity:.45;\x20font-size:11px;\x22>Loading\x20source…</div>\x0a\x20\x20\x20\x20\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\x20\x20\x20\x20\x20\x20<if\x20:=\x22docCache[row.key]?.error\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\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:12px;\x22>{{\x20docCache[row.key].error\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\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\x20\x20\x20\x20\x20\x20<if\x20:=\x22docCache[row.key]?.value\x20!==\x20undefined\x20&&\x20!docCache[row.key]?.error\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Field\x20known\x20+\x20value\x20present\x20→\x20show\x20highlighted\x20field\x20text\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22eng.config?.field\x20&&\x20docCache[row.key].value?.[eng.config.field]\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\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.5;\x20margin-bottom:4px;\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\x20\x20\x20\x20\x20\x20\x20Field\x20<strong\x20style=\x22color:#fff;\x20opacity:.9;\x22>{{\x20eng.config.field\x20}}</strong>\x20—\x20matched\x20range\x20highlighted\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22usesNonTrivialPrepare\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\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-warning);\x22\x20title=\x22The\x20pipeline\x20uses\x20prepare:\x27{{\x20stats.indexer.prepare\x20}}\x27.\x20Chunk\x20offsets\x20are\x20into\x20the\x20prepared\x20text,\x20so\x20the\x20highlight\x20position\x20in\x20the\x20raw\x20field\x20is\x20approximate.\x22>\x20⚠\x20approximate\x20(prepare:\x20{{\x20stats.indexer.prepare\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\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\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\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22chunk-text\x20chunk-text--ctx\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\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22splitHighlight(String(docCache[row.key].value[eng.config.field]\x20??\x20\x27\x27),\x20row.chunk)\x22\x20let:item=\x22seg\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\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22seg.highlight\x20?\x20\x27chunk-hl\x27\x20:\x20\x27\x27\x22>{{\x20seg.text\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\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\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\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\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20No\x20field\x20or\x20field\x20value\x20missing\x20→\x20fall\x20back\x20to\x20full\x20doc\x20JSON\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!(eng.config?.field\x20&&\x20docCache[row.key].value?.[eng.config.field])\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\x20\x20\x20\x20\x20<pre\x20style=\x22margin:0;\x20white-space:pre-wrap;\x20word-break:break-all;\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x20padding:8px;\x20font-size:11px;\x20max-height:300px;\x20overflow:auto;\x20color:#a5f3fc;\x22>{{\x20fmtDoc(docCache[row.key].value)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\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\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\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</if>\x0a\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</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!sourceType\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.45;\x20font-size:11px;\x22>No\x20source\x20type\x20linked\x20—\x20cannot\x20load\x20source\x20document.</div>\x0a\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20═══\x20END\x20CHUNKED\x20══════════════════════════════════════════════\x20-->\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20═══\x20NON-CHUNKED\x20RESULT:\x20show\x20source\x20doc\x20directly\x20(unchanged)\x20═\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!row.chunk\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22sourceType\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22docCache[row.key]?.busy\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.5;\x20font-size:11px;\x22>Loading…</div>\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:=\x22docCache[row.key]?.error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20margin-top:4px;\x22>{{\x20docCache[row.key].error\x20}}</div>\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:=\x22docCache[row.key]?.value\x20!==\x20undefined\x20&&\x20!docCache[row.key]?.error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20style=\x22margin:0;\x20white-space:pre-wrap;\x20word-break:break-all;\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x20padding:8px;\x20font-size:11px;\x20max-height:220px;\x20overflow:auto;\x20color:#a5f3fc;\x22>{{\x20fmtDoc(docCache[row.key].value)\x20}}</pre>\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!sourceType\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.5;\x20font-size:11px;\x22>No\x20source\x20type\x20linked\x20—\x20cannot\x20look\x20up\x20original\x20document.</div>\x0a\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20═══\x20END\x20NON-CHUNKED\x20══════════════════════════════════════════\x20-->\x0a\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</expanded>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</ok-table>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20</div>\x0a\x0a\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;justify-content:space-between;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Index\x20details</div>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22!editMode\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20style=\x22font-size:12px;padding:3px\x2010px;\x22\x20@click=\x22openEditConfig\x22\x20:disabled=\x22!eng.isRunning\x20&&\x20!eng.config\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Edit\x20config\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22!editMode\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22kv-grid\x20kv-grid--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>algorithm</span><span\x20class=\x22kv-val\x22>{{\x20s.algorithm\x20||\x20eng.config?.algorithm\x20||\x20\x27—\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>metric</span><span\x20class=\x22kv-val\x22>{{\x20metricValue\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>dims</span><span\x20class=\x22kv-val\x22>{{\x20dimsValue\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>storage\x20key</span><span\x20class=\x22kv-val\x22>{{\x20storageKeyValue\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22s.role\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>role</span><span\x20class=\x22kv-val\x22>{{\x20s.role\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22s.M\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>M</span><span\x20class=\x22kv-val\x22>{{\x20s.M\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>efConstruction</span><span\x20class=\x22kv-val\x22>{{\x20s.efConstruction\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>efSearch</span><span\x20class=\x22kv-val\x22>{{\x20s.efSearch\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22s.connectivity\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>connectivity</span><span\x20class=\x22kv-val\x22>{{\x20s.connectivity\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>expansion\x20search</span><span\x20class=\x22kv-val\x22>{{\x20s.expansionSearch\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22s.changesSince\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>changes\x20since\x20snap</span><span\x20class=\x22kv-val\x22>{{\x20s.changesSince\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22s.latestSnapshot\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>last\x20snapshot</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-val\x22\x20style=\x22font-size:11px;\x20word-break:break-all;\x22>{{\x20s.latestSnapshot\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22editMode\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22edit-form\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22edit-note\x22>Saving\x20will\x20restart\x20the\x20engine\x20to\x20apply\x20the\x20new\x20algorithm.\x20stats_data\x20and\x20storage\x20remain\x20intact.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22edit-label\x22>Algorithm</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<select\x20:value=\x22editAlgorithm\x22\x20@change=\x22onEditAlgorithmChange($el.value)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22editAlgorithms\x22\x20let:item=\x22alg\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22alg.key\x22\x20:selected=\x22alg.key\x20===\x20editAlgorithm\x22>{{\x20alg.label\x20||\x20alg.key\x20}}</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22editAlgorithmNote\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22edit-hint\x22>{{\x20editAlgorithmNote\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22editAlgorithmFields\x22\x20let:item=\x22field\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22edit-label\x22>{{\x20field.label\x20||\x20field.key\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22field.type\x20===\x20\x27select\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20:value=\x22editAlgConfig[field.key]\x22\x20@change=\x22editAlgConfig\x20=\x20{\x20...editAlgConfig,\x20[field.key]:\x20$el.value\x20}\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22field.options\x22\x20let:item=\x22opt\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22opt.value\x22\x20:selected=\x22opt.value\x20===\x20editAlgConfig[field.key]\x22>{{\x20opt.label\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</select>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22field.type\x20!==\x20\x27select\x27\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\x20:type=\x22field.type\x20===\x20\x27number\x27\x20?\x20\x27number\x27\x20:\x20\x27text\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22editAlgConfig[field.key]\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22editAlgConfig\x20=\x20{\x20...editAlgConfig,\x20[field.key]:\x20$el.value\x20}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:placeholder=\x22field.placeholder\x20??\x20\x27\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:min=\x22field.min\x20??\x20undefined\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22field.hint\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22edit-hint\x22>{{\x20field.hint\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22editError\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:13px;\x22>{{\x20editError\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:8px;margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22saveConfig\x22\x20:disabled=\x22editBusy\x22>{{\x20editBusy\x20?\x20\x27Saving…\x27\x20:\x20\x27Save\x20&\x20restart\x27\x20}}</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22closeEditConfig\x22\x20:disabled=\x22editBusy\x22\x20style=\x22opacity:.7;\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Maintenance</div>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:10px;\x20flex-wrap:wrap;\x20align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22snapshot\x22\x20:disabled=\x22actionBusy\x20||\x20!eng.isRunning\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20actionBusy\x20?\x20\x27…\x27\x20:\x20\x27Snapshot\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22rebuild\x22\x20:disabled=\x22actionBusy\x20||\x20!eng.isRunning\x22\x20style=\x22color:var(--okdb-warning);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20actionBusy\x20?\x20\x27…\x27\x20:\x20\x27Rebuild\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22story-note\x22>Snapshot\x20current\x20state\x20for\x20faster\x20reloads,\x20or\x20rebuild\x20when\x20the\x20in-memory\x20index\x20drifts\x20from\x20storage.</span>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<if\x20:=\x22actionResult\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-success);\x20font-size:13px;\x22>{{\x20actionResult\x20}}</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<if\x20:=\x22actionError\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:13px;\x22>{{\x20actionError\x20}}</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a</engine-panel-shell>\x0a','editAlgorithms','editAlgorithmFields','POST','metric','PATCH','editMode','fromEntries','var(--okdb-purple)','engine','queryText','$dispatch','strategy','type','/item/','<1ms','trim','12mJtdlX','algorithm_config','search','stats','maxElements','var(--okdb-danger)','_pipelineUrl','_buildEditAlgConfig','var(--okdb-warning)','9eoReMX','snapshot\x20failed','field','3537582ACGeEO','docCache','$ok','editAlgConfig','$el','note','message','application/json','source_env','var(--okdb-orange)','_seedEditAlgConfig','editAlgorithm','key','toFixed','confirm','text','257144cmtQFe','/snapshot','not\x20found','queryLimit','editBusy','36472117DtBmrg','shared','\x0a\x20\x20.kv-grid\x20{\x20grid-template-columns:160px\x201fr;\x20}\x0a\x20\x20.chunk-loc\x20\x20{\x20font-size:11px;\x20color:var(--okdb-orange);\x20opacity:.9;\x20white-space:nowrap;\x20}\x0a\x20\x20.chunk-text\x20{\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x20padding:8px;\x20font-size:11px;\x20max-height:160px;\x20overflow:auto;\x20white-space:pre-wrap;\x20word-break:break-word;\x20line-height:1.5;\x20}\x0a\x20\x20.chunk-text--ctx\x20{\x20max-height:300px;\x20}\x0a\x20\x20.chunk-hl\x20\x20\x20{\x20background:color-mix(in\x20srgb,\x20var(--okdb-orange)\x2013%,\x20transparent);\x20border-bottom:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-orange)\x2053%,\x20transparent);\x20color:#fed7aa;\x20}\x0a\x20\x20.doc-toggle\x20{\x20font-size:11px;\x20color:var(--okdb-accent);\x20cursor:pointer;\x20opacity:.75;\x20background:none;\x20border:none;\x20padding:0;\x20}\x0a\x20\x20.doc-toggle:hover\x20{\x20opacity:1;\x20}\x0a\x20\x20.approx-note\x20{\x20font-size:10px;\x20opacity:.45;\x20margin-top:3px;\x20}\x0a\x20\x20.perf-grid\x20{\x20display:grid;\x20grid-template-columns:repeat(auto-fill,minmax(110px,1fr));\x20gap:8px;\x20}\x0a\x20\x20.perf-cell\x20{\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:8px;\x20padding:8px\x2010px;\x20}\x0a\x20\x20.perf-label\x20{\x20font-size:10px;\x20opacity:.5;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x20margin-bottom:4px;\x20}\x0a\x20\x20.perf-value\x20{\x20font-size:18px;\x20font-weight:600;\x20color:var(--okdb-accent);\x20}\x0a\x20\x20.perf-unit\x20\x20{\x20font-size:11px;\x20opacity:.55;\x20margin-left:2px;\x20}\x0a\x20\x20.edit-form\x20\x20{\x20display:grid;\x20grid-template-columns:140px\x201fr;\x20gap:8px\x2012px;\x20align-items:start;\x20font-size:13px;\x20}\x0a\x20\x20.edit-form\x20select,\x20.edit-form\x20input\x20{\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:6px;\x20padding:6px\x208px;\x20color:inherit;\x20font-size:13px;\x20width:100%;\x20box-sizing:border-box;\x20}\x0a\x20\x20.edit-form\x20select:focus,\x20.edit-form\x20input:focus\x20{\x20outline:none;\x20border-color:var(--okdb-accent);\x20}\x0a\x20\x20.edit-label\x20{\x20opacity:.65;\x20text-align:right;\x20padding-top:7px;\x20}\x0a\x20\x20.edit-hint\x20\x20{\x20font-size:11px;\x20opacity:.4;\x20font-style:italic;\x20margin-top:2px;\x20grid-column:2;\x20}\x0a\x20\x20.edit-note\x20\x20{\x20font-size:12px;\x20opacity:.55;\x20background:color-mix(in\x20srgb,\x20var(--okdb-warning)\x208%,\x20transparent);\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-warning)\x2025%,\x20transparent);\x20border-radius:6px;\x20padding:7px\x2010px;\x20grid-column:1/-1;\x20}\x0a','/rebuild','length','algorithm','error','var(--okdb-success)','actionError','editAlgorithmMap','docExpanded','json','eng','717393HAkwTl','1530292KPoFLT','isConnected','config','round','max','load','value','data','workerMetrics','chunk','5ERMRZF','actionBusy','isArray','actionResult','number','end','/query','queryError','default','count','\x20GB','result','\x20KB','rebuild\x20failed','Take\x20a\x20snapshot\x20now?','save\x20failed','/embeddings/engines/','editError'];_0x5607=function(){return _0x3ec04d;};return _0x5607();}import _0x81180e from'../../engines/parts/engine-panel-shell.ok.js';import{ENGINE_PANEL_SHARED_STYLE as _0x3bc99f}from'../../engines/engine-panel-shared-style.js';import{buildEmbeddingsPipelineUrl as _0x2bc020,dispatchEnginePipelineSelection as _0x149b46}from'../../engines/engine-ui-utils.js';const a=_0x3bc99f+_0x214a29(0x12e);export default{'tag':_0x214a29(0x174),'dependencies':[_0x14bae5,_0x81180e],'attr':{'name':{},'engine':{}},'context':_0x557513=>({'busy':!0x1,'stats':null,'error':null,'actionBusy':!0x1,'actionResult':null,'actionError':null,'queryText':'','queryLimit':0xa,'queryResults':null,'queryBusy':!0x1,'queryError':null,'docCache':{},'docExpanded':{},'editMode':!0x1,'editBusy':!0x1,'editError':null,'editAlgorithm':null,'editAlgConfig':{},'editAlgorithms':[],'editAlgorithmMap':{},get 'eng'(){const _0xe60470=_0x214a29;return _0x557513[_0xe60470(0x16c)][_0xe60470(0x103)]??{};},get 'name'(){const _0x4ff706=_0x214a29;return _0x557513['$attr'][_0x4ff706(0x161)];},get '_pipelineUrl'(){const _0x5db0aa=_0x214a29;return _0x2bc020(this[_0x5db0aa(0x138)],this['name']);},get 's'(){const _0x5bbd8f=_0x214a29;return this[_0x5bbd8f(0x10e)]?.[_0x5bbd8f(0x10d)]??this[_0x5bbd8f(0x10e)]??{};},get 'hasEmbedder'(){const _0x44f4b3=_0x214a29;return!!this[_0x44f4b3(0x138)][_0x44f4b3(0x13c)]?.[_0x44f4b3(0x166)];},get 'sourceType'(){const _0x297188=_0x214a29;return this[_0x297188(0x10e)]?.['type']??this['s']?.[_0x297188(0x167)]??this['eng'][_0x297188(0x13c)]?.[_0x297188(0x167)]??null;},get 'vectorCount'(){const _0x11f3d0=_0x214a29;return this['s'][_0x11f3d0(0x14d)]??0x0;},get 'capacityValue'(){const _0x444043=_0x214a29;return this['s'][_0x444043(0x10f)]??'∞';},get 'dimsValue'(){return this['s']['dims']??'—';},get 'metricValue'(){const _0x1e314d=_0x214a29;return this['s'][_0x1e314d(0xfe)]||'—';},get 'storageKeyValue'(){return this['s']['storage_key']||'—';},get 'chunkStrategy'(){const _0x72a44=_0x214a29;return this['s'][_0x72a44(0x143)]?.[_0x72a44(0x106)]||null;},get 'wm'(){const _0x3aad1d=_0x214a29;return this['s'][_0x3aad1d(0x142)]??null;},get 'headerBadges'(){const _0x1d4da0=_0x214a29,_0x1c6d36=[];return this['s'][_0x1d4da0(0x131)]&&_0x1c6d36[_0x1d4da0(0x158)]({'text':this['s']['algorithm'],'color':_0x1d4da0(0x102)}),this['s'][_0x1d4da0(0x143)]&&_0x1c6d36['push']({'text':_0x1d4da0(0x157)+this['s'][_0x1d4da0(0x143)][_0x1d4da0(0x106)],'color':_0x1d4da0(0x120)}),_0x1c6d36;},get 'usesNonTrivialPrepare'(){const _0x443a10=_0x214a29,_0x50ec5f=this[_0x443a10(0x10e)]?.['indexer']?.['prepare'];return!!_0x50ec5f&&'none'!==_0x50ec5f;},'fmtBytes':_0xb1bad6=>null==_0xb1bad6?'—':_0xb1bad6>=0x40000000?(_0xb1bad6/0x40000000)[_0x214a29(0x124)](0x1)+_0x214a29(0x14e):_0xb1bad6>=0x100000?(_0xb1bad6/0x100000)[_0x214a29(0x124)](0x1)+'\x20MB':_0xb1bad6>=0x400?(_0xb1bad6/0x400)[_0x214a29(0x124)](0x0)+_0x214a29(0x150):_0xb1bad6+'\x20B','fmtMs':_0x31dd51=>null==_0x31dd51?'—':_0x31dd51<0x1?_0x214a29(0x109):_0x31dd51+'ms',async 'loadEditAlgorithms'(){const _0x3d46ac=_0x214a29;if(!this[_0x3d46ac(0x177)][_0x3d46ac(0x130)])try{const _0x6bfad9=await fetch(__ENV__['API']+'/embeddings/algorithms'),_0x2aa448=await _0x6bfad9[_0x3d46ac(0x137)]();this[_0x3d46ac(0x177)]=_0x2aa448[_0x3d46ac(0x141)]||[],this[_0x3d46ac(0x135)]=Object[_0x3d46ac(0x101)](this[_0x3d46ac(0x177)][_0x3d46ac(0x171)](_0x12409e=>[_0x12409e[_0x3d46ac(0x123)],_0x12409e]));}catch{this['editAlgorithms']=[];}},get 'editAlgorithmFields'(){const _0x1a837e=_0x214a29;return this[_0x1a837e(0x135)][this['editAlgorithm']]?.[_0x1a837e(0x16f)]??[];},get 'editAlgorithmNote'(){const _0x1bfa53=_0x214a29;return this['editAlgorithmMap'][this[_0x1bfa53(0x122)]]?.[_0x1bfa53(0x11c)]??null;},async 'openEditConfig'(){const _0x1221e8=_0x214a29;await this[_0x1221e8(0x169)]();const _0x50b9ae=this[_0x1221e8(0x138)][_0x1221e8(0x13c)]??{};this[_0x1221e8(0x122)]=_0x50b9ae[_0x1221e8(0x131)]??_0x1221e8(0x15f),this[_0x1221e8(0x121)](this[_0x1221e8(0x122)],_0x50b9ae[_0x1221e8(0x10c)]??{}),this['editMode']=!0x0,this[_0x1221e8(0x155)]=null;},'closeEditConfig'(){const _0x482047=_0x214a29;this[_0x482047(0x100)]=!0x1,this[_0x482047(0x155)]=null;},'_seedEditAlgConfig'(_0x1cf2d5,_0xb304dd={}){const _0x136eeb=_0x214a29,_0x548c73=this[_0x136eeb(0x135)][_0x1cf2d5]?.[_0x136eeb(0x16f)]??[],_0x22107e={};for(const _0x567052 of _0x548c73)_0x22107e[_0x567052['key']]=_0xb304dd[_0x567052['key']]??_0x567052[_0x136eeb(0x14c)]??'';this[_0x136eeb(0x11a)]=_0x22107e;},'onEditAlgorithmChange'(_0x51221a){const _0x3efda7=_0x214a29;this['editAlgorithm']=_0x51221a;const _0x2f459e=this[_0x3efda7(0x138)][_0x3efda7(0x13c)]?.[_0x3efda7(0x131)]===_0x51221a?this['eng'][_0x3efda7(0x13c)]?.[_0x3efda7(0x10c)]??{}:{};this['_seedEditAlgConfig'](_0x51221a,_0x2f459e);},'_buildEditAlgConfig'(){const _0x2857d1=_0x214a29,_0x1d956e={};for(const _0x471423 of this[_0x2857d1(0x178)]){const _0x1030ff=this['editAlgConfig'][_0x471423[_0x2857d1(0x123)]];''!==_0x1030ff&&null!=_0x1030ff&&(_0x1d956e[_0x471423[_0x2857d1(0x123)]]=_0x2857d1(0x148)===_0x471423[_0x2857d1(0x107)]?Number(_0x1030ff):_0x1030ff);}return Object[_0x2857d1(0x168)](_0x1d956e)[_0x2857d1(0x130)]>0x0?_0x1d956e:void 0x0;},async 'saveConfig'(){const _0x1a4dce=_0x214a29;this[_0x1a4dce(0x12b)]=!0x0,this[_0x1a4dce(0x155)]=null;try{const _0x3b9189=this[_0x1a4dce(0x112)](),_0x665ec3={'algorithm':this[_0x1a4dce(0x122)]};_0x3b9189?_0x665ec3['algorithm_config']=_0x3b9189:delete _0x665ec3['algorithm_config'];const _0xba15cf=await fetch(__ENV__[_0x1a4dce(0x16e)]+_0x1a4dce(0x154)+encodeURIComponent(this[_0x1a4dce(0x138)][_0x1a4dce(0x123)]),{'method':_0x1a4dce(0xff),'headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'config':_0x665ec3})}),_0x4d0c18=await _0xba15cf[_0x1a4dce(0x137)]();if(!_0xba15cf['ok'])throw new Error(_0x4d0c18?.['error']?.[_0x1a4dce(0x11d)]||_0x1a4dce(0x153));this[_0x1a4dce(0x100)]=!0x1,_0x557513[_0x1a4dce(0x105)](_0x1a4dce(0x173),_0x4d0c18[_0x1a4dce(0x14f)]??_0x4d0c18[_0x1a4dce(0x141)]),await this[_0x1a4dce(0x13f)]();}catch(_0x562ad5){this[_0x1a4dce(0x155)]=_0x562ad5?.[_0x1a4dce(0x11d)]||String(_0x562ad5);}finally{this[_0x1a4dce(0x12b)]=!0x1;}},async 'load'(){const _0x3cd1e2=_0x214a29;this['busy']=!0x0,this[_0x3cd1e2(0x132)]=null;try{const _0x1c8793=await fetch(this[_0x3cd1e2(0x111)]+'/stats'),_0x1bf98d=await _0x1c8793[_0x3cd1e2(0x137)]();if(!_0x1c8793['ok'])throw new Error(_0x1bf98d?.[_0x3cd1e2(0x132)]?.[_0x3cd1e2(0x11d)]||'failed');this[_0x3cd1e2(0x10e)]=_0x1bf98d[_0x3cd1e2(0x141)];}catch(_0x4d620a){this[_0x3cd1e2(0x132)]=_0x4d620a?.[_0x3cd1e2(0x11d)]||String(_0x4d620a),this[_0x3cd1e2(0x10e)]=null;}finally{this[_0x3cd1e2(0x15b)]=!0x1;}},async 'snapshot'(){const _0x3a46d6=_0x214a29;if(await _0x557513[_0x3a46d6(0x119)][_0x3a46d6(0x12d)]['modal']['confirm'](_0x3a46d6(0x152))){this[_0x3a46d6(0x145)]=!0x0,this[_0x3a46d6(0x147)]=null,this[_0x3a46d6(0x134)]=null;try{const _0x7c60ec=await fetch(this[_0x3a46d6(0x111)]+_0x3a46d6(0x128),{'method':_0x3a46d6(0x179)}),_0x51d71b=await _0x7c60ec[_0x3a46d6(0x137)]();if(!_0x7c60ec['ok'])throw new Error(_0x51d71b?.[_0x3a46d6(0x132)]?.[_0x3a46d6(0x11d)]||_0x3a46d6(0x115));this['actionResult']=_0x51d71b['data']?.['snapped']?'Snapshot\x20published.':'No\x20snapshot\x20needed\x20(up\x20to\x20date).',await this['load']();}catch(_0x31cf78){this['actionError']=_0x31cf78?.[_0x3a46d6(0x11d)]||String(_0x31cf78);}finally{this[_0x3a46d6(0x145)]=!0x1;}}},async 'rebuild'(){const _0x5f26d1=_0x214a29;if(await _0x557513[_0x5f26d1(0x119)][_0x5f26d1(0x12d)][_0x5f26d1(0x163)][_0x5f26d1(0x125)]('Rebuild\x20the\x20full\x20index\x20from\x20storage?\x20This\x20may\x20take\x20a\x20while.')){this[_0x5f26d1(0x145)]=!0x0,this['actionResult']=null,this[_0x5f26d1(0x134)]=null;try{const _0x1fb1dd=await fetch(this[_0x5f26d1(0x111)]+_0x5f26d1(0x12f),{'method':_0x5f26d1(0x179)}),_0x3d8887=await _0x1fb1dd[_0x5f26d1(0x137)]();if(!_0x1fb1dd['ok'])throw new Error(_0x3d8887?.[_0x5f26d1(0x132)]?.[_0x5f26d1(0x11d)]||_0x5f26d1(0x151));this[_0x5f26d1(0x147)]=_0x5f26d1(0x15d),await this[_0x5f26d1(0x13f)]();}catch(_0x53c3bc){this[_0x5f26d1(0x134)]=_0x53c3bc?.[_0x5f26d1(0x11d)]||String(_0x53c3bc);}finally{this[_0x5f26d1(0x145)]=!0x1;}}},async 'runQuery'(){const _0x320e74=_0x214a29,_0x63534c=String(this[_0x320e74(0x104)]||'')[_0x320e74(0x10a)]();if(_0x63534c){this[_0x320e74(0x16a)]=!0x0,this['queryError']=null,this[_0x320e74(0x16d)]=null,this[_0x320e74(0x118)]={},this['docExpanded']={};try{const _0x3ed619=await fetch(this[_0x320e74(0x111)]+_0x320e74(0x14a),{'method':'POST','headers':{'Content-Type':_0x320e74(0x11e)},'body':JSON['stringify']({'query':_0x63534c,'limit':Number(this[_0x320e74(0x12a)])||0xa})}),_0x20a4e8=await _0x3ed619['json']();if(!_0x3ed619['ok'])throw new Error(_0x20a4e8?.[_0x320e74(0x132)]?.[_0x320e74(0x11d)]||_0x320e74(0x159));this[_0x320e74(0x16d)]=_0x20a4e8['data']||[];}catch(_0x56ddc8){this[_0x320e74(0x14b)]=_0x56ddc8?.[_0x320e74(0x11d)]||String(_0x56ddc8);}finally{this[_0x320e74(0x16a)]=!0x1;}}},'scoreBar':_0x4f28f3=>Math[_0x214a29(0x13d)](0x64*Math[_0x214a29(0x162)](0x1,Math[_0x214a29(0x13e)](0x0,_0x4f28f3))),'scoreColor':_0x3b784b=>_0x3b784b>=0.8?_0x214a29(0x133):_0x3b784b>=0.5?_0x214a29(0x113):_0x214a29(0x110),get 'isChunked'(){const _0x62bf5a=_0x214a29;return Array[_0x62bf5a(0x146)](this[_0x62bf5a(0x16d)])&&this['queryResults']['some'](_0x2f0008=>_0x2f0008[_0x62bf5a(0x143)]);},'fmtRange':_0x27ff18=>_0x27ff18?'chars\x20'+_0x27ff18[_0x214a29(0x170)]+'–'+_0x27ff18[_0x214a29(0x149)]:'','autoFetch'(_0xff5d4b){const _0x40fa2f=_0x214a29;return!this['sourceType']||this['docCache'][_0xff5d4b[_0x40fa2f(0x123)]]||!!_0xff5d4b['chunk']?.['text']||this[_0x40fa2f(0x156)](_0xff5d4b),null;},async 'fetchDoc'(_0x2c8bba){const _0x7bff10=_0x214a29,_0x55afff=this[_0x7bff10(0x16b)];if(!_0x55afff)return;const _0x372c0d=_0x2c8bba[_0x7bff10(0x123)];this[_0x7bff10(0x118)][_0x372c0d]={'busy':!0x0,'value':void 0x0,'error':null};try{const _0x42ca20=this[_0x7bff10(0x138)]['config']?.[_0x7bff10(0x11f)]??'default',_0x5b5b02=__ENV__[_0x7bff10(0x16e)]+_0x7bff10(0x15a)+encodeURIComponent(_0x42ca20),_0x19f2e5=await fetch(_0x5b5b02+'/type/'+encodeURIComponent(_0x55afff)+_0x7bff10(0x108)+encodeURIComponent(_0x372c0d)),_0x35d206=await _0x19f2e5['json']();if(!_0x19f2e5['ok'])throw new Error(_0x35d206?.[_0x7bff10(0x132)]?.[_0x7bff10(0x11d)]||_0x7bff10(0x129));this['docCache'][_0x372c0d]={'busy':!0x1,'value':_0x35d206[_0x7bff10(0x141)]?.[_0x7bff10(0x140)]??null,'error':null};}catch(_0x18ef18){this[_0x7bff10(0x118)][_0x372c0d]={'busy':!0x1,'value':void 0x0,'error':_0x18ef18?.[_0x7bff10(0x11d)]||String(_0x18ef18)};}},'toggleDocExpand'(_0x377ade){const _0x47cc1f=_0x214a29,_0x450077=_0x377ade[_0x47cc1f(0x123)];this['docExpanded'][_0x450077]=!this['docExpanded'][_0x450077],this[_0x47cc1f(0x136)][_0x450077]&&!this[_0x47cc1f(0x118)][_0x450077]&&this['fetchDoc'](_0x377ade);},'fmtDoc'(_0x4cb1ce){try{return JSON['stringify'](_0x4cb1ce,null,0x2);}catch{return String(_0x4cb1ce);}},'getChunkText'(_0x2e2ea8){const _0x35a7c4=_0x214a29;if(_0x2e2ea8['chunk']?.['text'])return _0x2e2ea8['chunk'][_0x35a7c4(0x126)];const _0x67eb34=this[_0x35a7c4(0x138)]['config']?.[_0x35a7c4(0x116)],_0x2437c6=this[_0x35a7c4(0x118)][_0x2e2ea8[_0x35a7c4(0x123)]];if(!_0x67eb34||!_0x2437c6?.[_0x35a7c4(0x140)]||!_0x2e2ea8['chunk'])return null;const _0x1387e5=_0x2437c6[_0x35a7c4(0x140)][_0x67eb34];return'string'!=typeof _0x1387e5?null:_0x1387e5[_0x35a7c4(0x172)](_0x2e2ea8[_0x35a7c4(0x143)][_0x35a7c4(0x170)],_0x2e2ea8['chunk'][_0x35a7c4(0x149)])||null;},'splitHighlight'(_0xe877a4,_0x141f37){const _0x2a6f96=_0x214a29;if(!_0x141f37||!_0xe877a4||'string'!=typeof _0xe877a4)return null;const {start:_0x371d04,end:_0x2cfca0}=_0x141f37;if('number'!=typeof _0x371d04||_0x2a6f96(0x148)!=typeof _0x2cfca0)return null;const _0x195e29=Math[_0x2a6f96(0x13e)](0x0,_0x371d04),_0x1c4f3a=Math['min'](_0xe877a4[_0x2a6f96(0x130)],Math[_0x2a6f96(0x13e)](_0x195e29,_0x2cfca0));return _0x195e29>=_0x1c4f3a?[{'text':_0xe877a4,'highlight':!0x1}]:[{'text':_0xe877a4[_0x2a6f96(0x172)](0x0,_0x195e29),'highlight':!0x1},{'text':_0xe877a4[_0x2a6f96(0x172)](_0x195e29,_0x1c4f3a),'highlight':!0x0},{'text':_0xe877a4['slice'](_0x1c4f3a),'highlight':!0x1}][_0x2a6f96(0x160)](_0x5686c6=>_0x5686c6[_0x2a6f96(0x126)][_0x2a6f96(0x130)]>0x0);},async 'onRefresh'(){const _0x4e832f=_0x214a29;this[_0x4e832f(0x16d)]=null,this[_0x4e832f(0x136)]={},await this['load']();},'viewPipeline'(){const _0x157fb5=_0x214a29;_0x149b46(_0x557513,this[_0x157fb5(0x138)]);}}),async 'init'(_0x3bc72e){const _0x3c6514=_0x214a29;_0x3bc72e[_0x3c6514(0x15c)](()=>_0x3bc72e[_0x3c6514(0x16c)][_0x3c6514(0x161)],async()=>{const _0x1a3f05=_0x3c6514;this[_0x1a3f05(0x10e)]=null,this[_0x1a3f05(0x16d)]=null,this[_0x1a3f05(0x136)]={},await this[_0x1a3f05(0x13f)]();}),await this[_0x3c6514(0x13f)]();const _0x1321f9=_0x3bc72e[_0x3c6514(0x11b)]??_0x3bc72e['$host']??null,_0x555dde=setInterval(async()=>{const _0x562c86=_0x3c6514;if(!_0x1321f9||_0x1321f9[_0x562c86(0x13b)]){if(!this['busy']&&!this[_0x562c86(0x12b)]&&!this[_0x562c86(0x100)])try{await this['load']();}catch{}}else clearInterval(_0x555dde);},0x1388);},'template':_0x214a29(0x176),'style':a};
1
+ import e from"@toolkit/elements/ok-table.ok.js";import n from"../../engines/parts/engine-panel-shell.ok.js";import{ENGINE_PANEL_SHARED_STYLE as t}from"../../engines/engine-panel-shared-style.js";import{buildEmbeddingsPipelineUrl as i,dispatchEnginePipelineSelection as s}from"../../engines/engine-ui-utils.js";const a=t+"\n .kv-grid { grid-template-columns:160px 1fr; }\n .chunk-loc { font-size:11px; color:var(--okdb-orange); opacity:.9; white-space:nowrap; }\n .chunk-text { background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:6px; padding:8px; font-size:11px; max-height:160px; overflow:auto; white-space:pre-wrap; word-break:break-word; line-height:1.5; }\n .chunk-text--ctx { max-height:300px; }\n .chunk-hl { background:color-mix(in srgb, var(--okdb-orange) 13%, transparent); border-bottom:1px solid color-mix(in srgb, var(--okdb-orange) 53%, transparent); color:#fed7aa; }\n .doc-toggle { font-size:11px; color:var(--okdb-accent); cursor:pointer; opacity:.75; background:none; border:none; padding:0; }\n .doc-toggle:hover { opacity:1; }\n .approx-note { font-size:10px; opacity:.45; margin-top:3px; }\n .perf-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(110px,1fr)); gap:8px; }\n .perf-cell { background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:8px; padding:8px 10px; }\n .perf-label { font-size:10px; opacity:.5; text-transform:uppercase; letter-spacing:.05em; margin-bottom:4px; }\n .perf-value { font-size:18px; font-weight:600; color:var(--okdb-accent); }\n .perf-unit { font-size:11px; opacity:.55; margin-left:2px; }\n .edit-form { display:grid; grid-template-columns:140px 1fr; gap:8px 12px; align-items:start; font-size:13px; }\n .edit-form select, .edit-form input { background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:6px; padding:6px 8px; color:inherit; font-size:13px; width:100%; box-sizing:border-box; }\n .edit-form select:focus, .edit-form input:focus { outline:none; border-color:var(--okdb-accent); }\n .edit-label { opacity:.65; text-align:right; padding-top:7px; }\n .edit-hint { font-size:11px; opacity:.4; font-style:italic; margin-top:2px; grid-column:2; }\n .edit-note { font-size:12px; opacity:.55; background:color-mix(in srgb, var(--okdb-warning) 8%, transparent); border:1px solid color-mix(in srgb, var(--okdb-warning) 25%, transparent); border-radius:6px; padding:7px 10px; grid-column:1/-1; }\n";export default{tag:"embed-search-panel",dependencies:[e,n],attr:{name:{},engine:{}},context:e=>({busy:!1,stats:null,error:null,actionBusy:!1,actionResult:null,actionError:null,queryText:"",queryLimit:10,queryResults:null,queryBusy:!1,queryError:null,docCache:{},docExpanded:{},editMode:!1,editBusy:!1,editError:null,editAlgorithm:null,editAlgConfig:{},editAlgorithms:[],editAlgorithmMap:{},get eng(){return e.$attr.engine??{}},get name(){return e.$attr.name},get _pipelineUrl(){return i(this.eng,this.name)},get s(){return this.stats?.search??this.stats??{}},get hasEmbedder(){return!!this.eng.config?.embedder},get sourceType(){return this.stats?.type??this.s?.source_type??this.eng.config?.source_type??null},get vectorCount(){return this.s.count??0},get capacityValue(){return this.s.maxElements??"∞"},get dimsValue(){return this.s.dims??"—"},get metricValue(){return this.s.metric||"—"},get storageKeyValue(){return this.s.storage_key||"—"},get chunkStrategy(){return this.s.chunk?.strategy||null},get wm(){return this.s.workerMetrics??null},get headerBadges(){const e=[];return this.s.algorithm&&e.push({text:this.s.algorithm,color:"var(--okdb-purple)"}),this.s.chunk&&e.push({text:`chunked · ${this.s.chunk.strategy}`,color:"var(--okdb-orange)"}),e},get usesNonTrivialPrepare(){const e=this.stats?.indexer?.prepare;return!!e&&"none"!==e},fmtBytes:e=>null==e?"—":e>=1073741824?(e/1073741824).toFixed(1)+" GB":e>=1048576?(e/1048576).toFixed(1)+" MB":e>=1024?(e/1024).toFixed(0)+" KB":e+" B",fmtMs:e=>null==e?"—":e<1?"<1ms":e+"ms",async loadEditAlgorithms(){if(!this.editAlgorithms.length)try{const e=await fetch(`${__ENV__.API}/embeddings/algorithms`),n=await e.json();this.editAlgorithms=n.data||[],this.editAlgorithmMap=Object.fromEntries(this.editAlgorithms.map(e=>[e.key,e]))}catch{this.editAlgorithms=[]}},get editAlgorithmFields(){return this.editAlgorithmMap[this.editAlgorithm]?.fields??[]},get editAlgorithmNote(){return this.editAlgorithmMap[this.editAlgorithm]?.note??null},async openEditConfig(){await this.loadEditAlgorithms();const e=this.eng.config??{};this.editAlgorithm=e.algorithm??"flat",this._seedEditAlgConfig(this.editAlgorithm,e.algorithm_config??{}),this.editMode=!0,this.editError=null},closeEditConfig(){this.editMode=!1,this.editError=null},_seedEditAlgConfig(e,n={}){const t=this.editAlgorithmMap[e]?.fields??[],i={};for(const e of t)i[e.key]=n[e.key]??e.default??"";this.editAlgConfig=i},onEditAlgorithmChange(e){this.editAlgorithm=e;const n=this.eng.config?.algorithm===e?this.eng.config?.algorithm_config??{}:{};this._seedEditAlgConfig(e,n)},_buildEditAlgConfig(){const e={};for(const n of this.editAlgorithmFields){const t=this.editAlgConfig[n.key];""!==t&&null!=t&&(e[n.key]="number"===n.type?Number(t):t)}return Object.keys(e).length>0?e:void 0},async saveConfig(){this.editBusy=!0,this.editError=null;try{const n=this._buildEditAlgConfig(),t={algorithm:this.editAlgorithm};n?t.algorithm_config=n:delete t.algorithm_config;const i=await fetch(`${__ENV__.API}/embeddings/engines/${encodeURIComponent(this.eng.key)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:t})}),s=await i.json();if(!i.ok)throw new Error(s?.error?.message||"save failed");this.editMode=!1,e.$dispatch("engine-updated",s.result??s.data),await this.load()}catch(e){this.editError=e?.message||String(e)}finally{this.editBusy=!1}},async load(){this.busy=!0,this.error=null;try{const e=await fetch(`${this._pipelineUrl}/stats`),n=await e.json();if(!e.ok)throw new Error(n?.error?.message||"failed");this.stats=n.data}catch(e){this.error=e?.message||String(e),this.stats=null}finally{this.busy=!1}},async snapshot(){if(await e.$ok.shared.modal.confirm("Take a snapshot now?")){this.actionBusy=!0,this.actionResult=null,this.actionError=null;try{const e=await fetch(`${this._pipelineUrl}/snapshot`,{method:"POST"}),n=await e.json();if(!e.ok)throw new Error(n?.error?.message||"snapshot failed");this.actionResult=n.data?.snapped?"Snapshot published.":"No snapshot needed (up to date).",await this.load()}catch(e){this.actionError=e?.message||String(e)}finally{this.actionBusy=!1}}},async rebuild(){if(await e.$ok.shared.modal.confirm("Rebuild the full index from storage? This may take a while.")){this.actionBusy=!0,this.actionResult=null,this.actionError=null;try{const e=await fetch(`${this._pipelineUrl}/rebuild`,{method:"POST"}),n=await e.json();if(!e.ok)throw new Error(n?.error?.message||"rebuild failed");this.actionResult="Rebuild complete.",await this.load()}catch(e){this.actionError=e?.message||String(e)}finally{this.actionBusy=!1}}},async runQuery(){const e=String(this.queryText||"").trim();if(e){this.queryBusy=!0,this.queryError=null,this.queryResults=null,this.docCache={},this.docExpanded={};try{const n=await fetch(`${this._pipelineUrl}/query`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:e,limit:Number(this.queryLimit)||10})}),t=await n.json();if(!n.ok)throw new Error(t?.error?.message||"query failed");this.queryResults=t.data||[]}catch(e){this.queryError=e?.message||String(e)}finally{this.queryBusy=!1}}},scoreBar:e=>Math.round(100*Math.min(1,Math.max(0,e))),scoreColor:e=>e>=.8?"var(--okdb-success)":e>=.5?"var(--okdb-warning)":"var(--okdb-danger)",get isChunked(){return Array.isArray(this.queryResults)&&this.queryResults.some(e=>e.chunk)},fmtRange:e=>e?`chars ${e.start}–${e.end}`:"",autoFetch(e){return!this.sourceType||this.docCache[e.key]||!!e.chunk?.text||this.fetchDoc(e),null},async fetchDoc(e){const n=this.sourceType;if(!n)return;const t=e.key;this.docCache[t]={busy:!0,value:void 0,error:null};try{const e=this.eng.config?.source_env??"default",i=`${__ENV__.API}/env/${encodeURIComponent(e)}`,s=await fetch(`${i}/type/${encodeURIComponent(n)}/item/${encodeURIComponent(t)}`),a=await s.json();if(!s.ok)throw new Error(a?.error?.message||"not found");this.docCache[t]={busy:!1,value:a.data?.value??null,error:null}}catch(e){this.docCache[t]={busy:!1,value:void 0,error:e?.message||String(e)}}},toggleDocExpand(e){const n=e.key;this.docExpanded[n]=!this.docExpanded[n],this.docExpanded[n]&&!this.docCache[n]&&this.fetchDoc(e)},fmtDoc(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}},getChunkText(e){if(e.chunk?.text)return e.chunk.text;const n=this.eng.config?.field,t=this.docCache[e.key];if(!n||!t?.value||!e.chunk)return null;const i=t.value[n];return"string"!=typeof i?null:i.slice(e.chunk.start,e.chunk.end)||null},splitHighlight(e,n){if(!n||!e||"string"!=typeof e)return null;const{start:t,end:i}=n;if("number"!=typeof t||"number"!=typeof i)return null;const s=Math.max(0,t),a=Math.min(e.length,Math.max(s,i));return s>=a?[{text:e,highlight:!1}]:[{text:e.slice(0,s),highlight:!1},{text:e.slice(s,a),highlight:!0},{text:e.slice(a),highlight:!1}].filter(e=>e.text.length>0)},async onRefresh(){this.queryResults=null,this.docExpanded={},await this.load()},viewPipeline(){s(e,this.eng)}}),async init(e){e.$watch(()=>e.$attr.name,async()=>{this.stats=null,this.queryResults=null,this.docExpanded={},await this.load()}),await this.load();const n=e.$el??e.$host??null,t=setInterval(async()=>{if(!n||n.isConnected){if(!this.busy&&!this.editBusy&&!this.editMode)try{await this.load()}catch{}}else clearInterval(t)},5e3)},template:'\n<engine-panel-shell\n :engine="eng"\n :title="name"\n type-label="vector-search"\n type-color="var(--okdb-accent)"\n :badges="headerBadges"\n show-refresh="true"\n fill="true"\n :refresh-busy="busy || queryBusy || actionBusy"\n :on-refresh="() => onRefresh()"\n :on-pipeline="viewPipeline"\n @engine-updated="$dispatch(\'engine-updated\', $event.detail)"\n @refresh="$dispatch(\'refresh\')"\n @deleted="$dispatch(\'deleted\', $event.detail)"\n>\n <if :="error">\n <div style="color:var(--okdb-danger); font-size:13px;">{{ error }}</div>\n </if>\n\n\n <if :="stats">\n <div class="card stack-compact" style="padding:14px;gap:12px;">\n <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;">\n <div style="display:flex;flex-direction:column;gap:8px;min-width:0;flex:1;">\n <div class="pill-row">\n <span class="info-pill" title="Vector search algorithm.">{{ s.algorithm || \'—\' }}</span>\n <span class="info-pill" title="Distance metric.">{{ metricValue }}</span>\n <span class="info-pill" title="Vector dimensions.">dims: {{ dimsValue }}</span>\n <span class="info-pill" title="Backing storage key.">store: {{ storageKeyValue }}</span>\n <if :="chunkStrategy">\n <span class="info-pill" title="Chunking strategy used by the indexer.">chunk: {{ chunkStrategy }}</span>\n </if>\n </div>\n <div class="story-lead">\n Query the live vector index for <strong>{{ storageKeyValue }}</strong> and inspect the matched source chunks below.\n </div>\n <div class="story-note">Use text search here to validate relevance quickly. Snapshot and rebuild are available below when the in-memory index needs maintenance.</div>\n </div>\n\n <div class="metric-grid metric-grid--compact" style="min-width:min(100%, 360px);">\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Vectors</div>\n <div class="metric-value">{{ vectorCount }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Capacity</div>\n <div class="metric-value" style="font-size:18px;">{{ capacityValue }}</div>\n </div>\n </div>\n </div>\n </div>\n </if>\n\n <if :="wm">\n <div class="card stack-compact" style="padding:14px;gap:10px;">\n <div style="display:flex;align-items:center;justify-content:space-between;gap:8px;">\n <div class="card-title" style="margin:0;">Performance</div>\n <if :="!wm.searchOps">\n <span style="font-size:11px;opacity:.4;font-style:italic;">Run a search to populate latency metrics.</span>\n </if>\n </div>\n <div class="perf-grid">\n <div class="perf-cell">\n <div class="perf-label">Avg latency</div>\n <div class="perf-value">{{ fmtMs(wm.searchLatencyAvgMs) }}</div>\n </div>\n <div class="perf-cell">\n <div class="perf-label">p95 latency</div>\n <div class="perf-value">{{ fmtMs(wm.searchLatencyP95Ms) }}</div>\n </div>\n <div class="perf-cell">\n <div class="perf-label">Searches</div>\n <div class="perf-value">{{ wm.searchOps ?? 0 }}</div>\n </div>\n <div class="perf-cell">\n <div class="perf-label">Queue depth</div>\n <div class="perf-value">{{ wm.pendingOps ?? 0 }}</div>\n </div>\n <if :="wm.workerMemory">\n <div class="perf-cell">\n <div class="perf-label">Heap used</div>\n <div class="perf-value" style="font-size:15px;">{{ fmtBytes(wm.workerMemory.heapUsed) }}</div>\n </div>\n <div class="perf-cell">\n <div class="perf-label">RSS</div>\n <div class="perf-value" style="font-size:15px;">{{ fmtBytes(wm.workerMemory.rss) }}</div>\n </div>\n </if>\n </div>\n </div>\n </if>\n\n <div class="card" style="display:flex; flex-direction:column; gap:10px; flex:1; min-height:0;">\n <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;">\n <div class="card-title" style="margin:0;">Search test</div>\n <span class="story-note">Run a text query and inspect the raw chunk hits and source context.</span>\n </div>\n\n <if :="!hasEmbedder">\n <div style="opacity:.55; font-size:12px; font-style:italic;">\n No embedder configured — text queries unavailable. Pass a Float32Array via the API directly.\n </div>\n </if>\n\n <div style="display:flex; gap:8px; align-items:center;">\n <input\n style="flex:1;"\n placeholder="Enter text query…"\n :value="queryText"\n @input="queryText = $el.value"\n @keydown.enter="runQuery"\n :disabled="!hasEmbedder || !eng.isRunning"\n />\n <input\n type="number"\n style="width:72px;"\n :value="queryLimit"\n @input="queryLimit = Number($el.value) || 10"\n min="1"\n max="100"\n title="Top-K"\n />\n <button @click="runQuery" :disabled="queryBusy || !queryText.trim() || !eng.isRunning || !hasEmbedder">\n {{ queryBusy ? \'…\' : \'Search\' }}\n </button>\n </div>\n\n <if :="queryError">\n <div style="color:var(--okdb-danger); font-size:13px;">{{ queryError }}</div>\n </if>\n\n <if :="queryResults">\n <div style="overflow:auto; min-height:0; flex:1;">\n <if :="queryResults.length === 0">\n <div style="opacity:.5; font-size:13px;">No results.</div>\n </if>\n\n <ok-table :data="queryResults" no-scroll style="width:100%;">\n <columns>\n <column width="36px" no-resize>\n <header>#</header>\n <cell let:row>{{ queryResults.indexOf(row) + 1 }}</cell>\n </column>\n <column>\n <header>Key</header>\n <cell let:row>\n <div>\n <span>{{ row.key }}</span>\n <if :="row.chunk">\n <span class="chunk-loc" style="margin-left:8px;">{{ fmtRange(row.chunk) }}</span>\n </if>\n </div>\n </cell>\n </column>\n <column width="200px" no-resize>\n <header>Score</header>\n <cell let:row>\n <div style="display:flex; align-items:center; gap:8px;">\n <div style="flex:1; background:var(--okdb-app-border); border-radius:4px; height:6px; overflow:hidden;">\n <div :style="\'height:100%; border-radius:4px; background:\' + scoreColor(row.score) + \'; width:\' + scoreBar(row.score) + \'%\'"></div>\n </div>\n <span style="font-size:12px; opacity:.8; min-width:42px; text-align:right;">\n {{ (row.score * 100).toFixed(1) }}%\n </span>\n </div>\n </cell>\n </column>\n </columns>\n\n <expanded let:row>\n <div style="padding:10px; font-size:12px; display:flex; flex-direction:column; gap:10px;" :data-fetch="autoFetch(row)">\n\n \x3c!-- Identity line --\x3e\n <div style="opacity:.6; font-size:11px; display:flex; align-items:center; gap:10px; flex-wrap:wrap;">\n <span>key: <strong style="color:#fff; opacity:1;">{{ row.key }}</strong></span>\n <if :="sourceType"><span>type: <strong style="color:var(--okdb-accent);">{{ sourceType }}</strong></span></if>\n <if :="row.chunk">\n <span class="chunk-loc">{{ fmtRange(row.chunk) }}</span>\n <if :="row.chunkHash">\n <span style="opacity:.4; font-family:monospace; font-size:10px;">{{ row.chunkHash }}</span>\n </if>\n </if>\n </div>\n\n \x3c!-- ═══ CHUNKED RESULT ═══════════════════════════════════════════ --\x3e\n <if :="row.chunk">\n\n \x3c!-- Tier 1: Matched chunk text --\x3e\n <div>\n <div style="font-size:11px; opacity:.5; margin-bottom:4px; display:flex; align-items:center; gap:6px;">\n <span>Matched chunk</span>\n <if :="!row.chunk.text && usesNonTrivialPrepare && getChunkText(row)">\n <span style="color:var(--okdb-warning); font-size:10px;" title="Chunk offsets are into the prepared text; extraction from the raw field may be approximate.">⚠ approximate</span>\n </if>\n </div>\n\n \x3c!-- storeText: true — text carried in the result --\x3e\n <if :="row.chunk.text">\n <div class="chunk-text">{{ row.chunk.text }}</div>\n </if>\n\n \x3c!-- storeText: false — extract from loaded source doc --\x3e\n <if :="!row.chunk.text">\n <if :="docCache[row.key]?.busy">\n <div style="opacity:.45; font-size:11px; padding:6px 0;">Loading chunk…</div>\n </if>\n <if :="!docCache[row.key]?.busy && getChunkText(row)">\n <div class="chunk-text">{{ getChunkText(row) }}</div>\n </if>\n <if :="!docCache[row.key]?.busy && !getChunkText(row)">\n <div style="opacity:.4; font-size:11px; font-style:italic; padding:4px 0;">\n <if :="docCache[row.key]?.error">Source doc unavailable.</if>\n <if :="!docCache[row.key]?.error && !sourceType">No source type — cannot look up chunk text.</if>\n <if :="!docCache[row.key]?.error && sourceType">\n Chunk text not stored.\n <if :="!eng.config?.field"> No field configured.</if>\n <if :="eng.config?.field"> Enable <code>storeText: true</code> in the pipeline to store it.</if>\n </if>\n </div>\n </if>\n </if>\n </div>\n\n \x3c!-- Tier 2: "View in context of source" collapsible --\x3e\n <if :="sourceType">\n <div>\n <button class="doc-toggle" @click="toggleDocExpand(row)">\n <if :="docExpanded[row.key]">▲ hide source context</if>\n <if :="!docExpanded[row.key]">▼ view in context of source</if>\n </button>\n\n <if :="docExpanded[row.key]">\n <div style="margin-top:8px;">\n\n <if :="docCache[row.key]?.busy">\n <div style="opacity:.45; font-size:11px;">Loading source…</div>\n </if>\n <if :="docCache[row.key]?.error">\n <div style="color:var(--okdb-danger); font-size:12px;">{{ docCache[row.key].error }}</div>\n </if>\n\n <if :="docCache[row.key]?.value !== undefined && !docCache[row.key]?.error">\n\n \x3c!-- Field known + value present → show highlighted field text --\x3e\n <if :="eng.config?.field && docCache[row.key].value?.[eng.config.field]">\n <div style="font-size:11px; opacity:.5; margin-bottom:4px;">\n Field <strong style="color:#fff; opacity:.9;">{{ eng.config.field }}</strong> — matched range highlighted\n <if :="usesNonTrivialPrepare">\n <span style="color:var(--okdb-warning);" title="The pipeline uses prepare:\'{{ stats.indexer.prepare }}\'. Chunk offsets are into the prepared text, so the highlight position in the raw field is approximate."> ⚠ approximate (prepare: {{ stats.indexer.prepare }})</span>\n </if>\n </div>\n <div class="chunk-text chunk-text--ctx">\n <each :of="splitHighlight(String(docCache[row.key].value[eng.config.field] ?? \'\'), row.chunk)" let:item="seg">\n <span :class="seg.highlight ? \'chunk-hl\' : \'\'">{{ seg.text }}</span>\n </each>\n </div>\n </if>\n\n \x3c!-- No field or field value missing → fall back to full doc JSON --\x3e\n <if :="!(eng.config?.field && docCache[row.key].value?.[eng.config.field])">\n <pre style="margin:0; white-space:pre-wrap; word-break:break-all; background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:6px; padding:8px; font-size:11px; max-height:300px; overflow:auto; color:#a5f3fc;">{{ fmtDoc(docCache[row.key].value) }}</pre>\n </if>\n\n </if>\n </div>\n </if>\n </div>\n </if>\n\n <if :="!sourceType">\n <div style="opacity:.45; font-size:11px;">No source type linked — cannot load source document.</div>\n </if>\n\n </if>\n \x3c!-- ═══ END CHUNKED ══════════════════════════════════════════════ --\x3e\n\n \x3c!-- ═══ NON-CHUNKED RESULT: show source doc directly (unchanged) ═ --\x3e\n <if :="!row.chunk">\n <if :="sourceType">\n <if :="docCache[row.key]?.busy">\n <div style="opacity:.5; font-size:11px;">Loading…</div>\n </if>\n <if :="docCache[row.key]?.error">\n <div style="color:var(--okdb-danger); margin-top:4px;">{{ docCache[row.key].error }}</div>\n </if>\n <if :="docCache[row.key]?.value !== undefined && !docCache[row.key]?.error">\n <pre style="margin:0; white-space:pre-wrap; word-break:break-all; background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:6px; padding:8px; font-size:11px; max-height:220px; overflow:auto; color:#a5f3fc;">{{ fmtDoc(docCache[row.key].value) }}</pre>\n </if>\n </if>\n <if :="!sourceType">\n <div style="opacity:.5; font-size:11px;">No source type linked — cannot look up original document.</div>\n </if>\n </if>\n \x3c!-- ═══ END NON-CHUNKED ══════════════════════════════════════════ --\x3e\n\n </div>\n </expanded>\n </ok-table>\n </div>\n </if>\n\n </div>\n\n <div class="card stack-compact" style="padding:14px;gap:12px;">\n <div style="display:flex;align-items:center;justify-content:space-between;gap:8px;">\n <div class="card-title" style="margin:0;">Index details</div>\n <if :="!editMode">\n <button style="font-size:12px;padding:3px 10px;" @click="openEditConfig" :disabled="!eng.isRunning && !eng.config">\n Edit config\n </button>\n </if>\n </div>\n\n <if :="!editMode">\n <div class="kv-grid kv-grid--compact">\n <span class="kv-key">algorithm</span><span class="kv-val">{{ s.algorithm || eng.config?.algorithm || \'—\' }}</span>\n <span class="kv-key">metric</span><span class="kv-val">{{ metricValue }}</span>\n <span class="kv-key">dims</span><span class="kv-val">{{ dimsValue }}</span>\n <span class="kv-key">storage key</span><span class="kv-val">{{ storageKeyValue }}</span>\n <if :="s.role">\n <span class="kv-key">role</span><span class="kv-val">{{ s.role }}</span>\n </if>\n <if :="s.M != null">\n <span class="kv-key">M</span><span class="kv-val">{{ s.M }}</span>\n <span class="kv-key">efConstruction</span><span class="kv-val">{{ s.efConstruction }}</span>\n <span class="kv-key">efSearch</span><span class="kv-val">{{ s.efSearch }}</span>\n </if>\n <if :="s.connectivity != null">\n <span class="kv-key">connectivity</span><span class="kv-val">{{ s.connectivity }}</span>\n <span class="kv-key">expansion search</span><span class="kv-val">{{ s.expansionSearch }}</span>\n </if>\n <if :="s.changesSince != null">\n <span class="kv-key">changes since snap</span><span class="kv-val">{{ s.changesSince }}</span>\n </if>\n <if :="s.latestSnapshot">\n <span class="kv-key">last snapshot</span>\n <span class="kv-val" style="font-size:11px; word-break:break-all;">{{ s.latestSnapshot }}</span>\n </if>\n </div>\n </if>\n\n <if :="editMode">\n <div class="edit-form">\n <div class="edit-note">Saving will restart the engine to apply the new algorithm. stats_data and storage remain intact.</div>\n <span class="edit-label">Algorithm</span>\n <select :value="editAlgorithm" @change="onEditAlgorithmChange($el.value)">\n <each :of="editAlgorithms" let:item="alg">\n <option :value="alg.key" :selected="alg.key === editAlgorithm">{{ alg.label || alg.key }}</option>\n </each>\n </select>\n <if :="editAlgorithmNote">\n <div class="edit-hint">{{ editAlgorithmNote }}</div>\n </if>\n <each :of="editAlgorithmFields" let:item="field">\n <span class="edit-label">{{ field.label || field.key }}</span>\n <if :="field.type === \'select\'">\n <select :value="editAlgConfig[field.key]" @change="editAlgConfig = { ...editAlgConfig, [field.key]: $el.value }">\n <each :of="field.options" let:item="opt">\n <option :value="opt.value" :selected="opt.value === editAlgConfig[field.key]">{{ opt.label }}</option>\n </each>\n </select>\n </if>\n <if :="field.type !== \'select\'">\n <input\n :type="field.type === \'number\' ? \'number\' : \'text\'"\n :value="editAlgConfig[field.key]"\n @input="editAlgConfig = { ...editAlgConfig, [field.key]: $el.value }"\n :placeholder="field.placeholder ?? \'\'"\n :min="field.min ?? undefined"\n />\n </if>\n <if :="field.hint">\n <div class="edit-hint">{{ field.hint }}</div>\n </if>\n </each>\n </div>\n <if :="editError">\n <div style="color:var(--okdb-danger);font-size:13px;">{{ editError }}</div>\n </if>\n <div style="display:flex;gap:8px;margin-top:4px;">\n <button @click="saveConfig" :disabled="editBusy">{{ editBusy ? \'Saving…\' : \'Save & restart\' }}</button>\n <button @click="closeEditConfig" :disabled="editBusy" style="opacity:.7;">Cancel</button>\n </div>\n </if>\n </div>\n\n <div class="card stack-compact" style="padding:14px;gap:12px;">\n <div class="card-title" style="margin:0;">Maintenance</div>\n <div style="display:flex; gap:10px; flex-wrap:wrap; align-items:center;">\n <button @click="snapshot" :disabled="actionBusy || !eng.isRunning">\n {{ actionBusy ? \'…\' : \'Snapshot\' }}\n </button>\n <button @click="rebuild" :disabled="actionBusy || !eng.isRunning" style="color:var(--okdb-warning);">\n {{ actionBusy ? \'…\' : \'Rebuild\' }}\n </button>\n <span class="story-note">Snapshot current state for faster reloads, or rebuild when the in-memory index drifts from storage.</span>\n </div>\n <if :="actionResult">\n <div style="color:var(--okdb-success); font-size:13px;">{{ actionResult }}</div>\n </if>\n <if :="actionError">\n <div style="color:var(--okdb-danger); font-size:13px;">{{ actionError }}</div>\n </if>\n </div>\n</engine-panel-shell>\n',style:a};
@@ -1 +1 @@
1
- const _0x534aa7=_0x2dcb;function _0x53eb(){const _0x40efcc=['processed','$ok','8466864HXYcpG','API','eng','embedder',',\x20re-enqueued\x20','Retry\x20all\x20failed\x20queue\x20jobs\x20for\x20type\x20\x22<b>','failed','json','retryBusy','179765DzbJnF','1512XEQulY','data','$dispatch','load','engine','job_type','success','application/json','$attr','concurrency','2562492JvBkBz','busy','/embeddings/workers/','464412TLXgDY','/queue/retryFailed','Cannot\x20determine\x20job_type\x20or\x20indexer\x20name','name','stats','modal','embed-worker-panel','/embeddings/indexers/','Retried\x20','40PePRag','797586Lyiaza','retried','config','/retryFailed','confirm','toast','message','Retry\x20failed','$watch','184170iMaCtE','in_flight','POST','stringify','shared','error','63suPwVm','3251154yJXwey','indexer'];_0x53eb=function(){return _0x40efcc;};return _0x53eb();}(function(_0x5ce672,_0x5332a2){const _0x584ce0=_0x2dcb,_0x366f62=_0x5ce672();while(!![]){try{const _0x39b049=parseInt(_0x584ce0(0x89))/0x1+-parseInt(_0x584ce0(0x86))/0x2+-parseInt(_0x584ce0(0x6e))/0x3+-parseInt(_0x584ce0(0x92))/0x4*(parseInt(_0x584ce0(0x7b))/0x5)+parseInt(_0x584ce0(0x93))/0x6*(-parseInt(_0x584ce0(0x6d))/0x7)+parseInt(_0x584ce0(0x72))/0x8+parseInt(_0x584ce0(0x7c))/0x9*(parseInt(_0x584ce0(0x9c))/0xa);if(_0x39b049===_0x5332a2)break;else _0x366f62['push'](_0x366f62['shift']());}catch(_0x2df6a9){_0x366f62['push'](_0x366f62['shift']());}}}(_0x53eb,0xa9e91));import _0x3e8945 from'../../engines/parts/engine-panel-shell.ok.js';import{ENGINE_PANEL_SHARED_STYLE as _0x440914}from'../../engines/engine-panel-shared-style.js';import{dispatchEnginePipelineSelection as _0x3b473f}from'../../engines/engine-ui-utils.js';function _0x2dcb(_0x5d4424,_0x23515a){_0x5d4424=_0x5d4424-0x6b;const _0x53eb32=_0x53eb();let _0x2dcba7=_0x53eb32[_0x5d4424];return _0x2dcba7;}const s=_0x440914;export default{'tag':_0x534aa7(0x8f),'dependencies':[_0x3e8945],'attr':{'name':{},'engine':{}},'context':_0x3f2fa5=>({'busy':!0x1,'stats':null,'error':null,'retryBusy':!0x1,get 'eng'(){const _0x5d29ca=_0x534aa7;return _0x3f2fa5[_0x5d29ca(0x84)][_0x5d29ca(0x80)]??{};},get 'name'(){return _0x3f2fa5['$attr']['name'];},get 'jobType'(){const _0x19fbaa=_0x534aa7;return this[_0x19fbaa(0x8d)]?.[_0x19fbaa(0x81)]||this[_0x19fbaa(0x74)]?.[_0x19fbaa(0x95)]?.[_0x19fbaa(0x81)]||'—';},get 'indexerName'(){const _0xbf636e=_0x534aa7;return this['stats']?.[_0xbf636e(0x6f)]||this[_0xbf636e(0x74)]?.['config']?.[_0xbf636e(0x6f)]||'—';},get 'embedderName'(){const _0x16922f=_0x534aa7;return this[_0x16922f(0x8d)]?.[_0x16922f(0x75)]||this[_0x16922f(0x74)]?.[_0x16922f(0x95)]?.[_0x16922f(0x75)]||'—';},get 'concurrencyValue'(){const _0x35ab66=_0x534aa7;return this[_0x35ab66(0x8d)]?.[_0x35ab66(0x85)]??this['eng']?.['config']?.['concurrency']??'—';},get 'processedCount'(){const _0x5b2702=_0x534aa7;return this[_0x5b2702(0x8d)]?.[_0x5b2702(0x70)]??0x0;},get 'failedCount'(){const _0x148e62=_0x534aa7;return this[_0x148e62(0x8d)]?.[_0x148e62(0x78)]??0x0;},get 'inflightCount'(){const _0xbd1c0c=_0x534aa7;return this[_0xbd1c0c(0x8d)]?.[_0xbd1c0c(0x9d)]??0x0;},async 'load'(){const _0x37a174=_0x534aa7;this[_0x37a174(0x87)]=!0x0,this[_0x37a174(0x6c)]=null;try{const _0x581d95=await fetch(__ENV__['API']+_0x37a174(0x88)+encodeURIComponent(this['name'])+'/stats'),_0x2d0dd9=await _0x581d95[_0x37a174(0x79)]();if(!_0x581d95['ok'])throw new Error(_0x2d0dd9?.[_0x37a174(0x6c)]?.['message']||_0x37a174(0x78));this['stats']=_0x2d0dd9[_0x37a174(0x7d)];}catch(_0x1eb489){this[_0x37a174(0x6c)]=_0x1eb489?.['message']||String(_0x1eb489),this[_0x37a174(0x8d)]=null;}finally{this[_0x37a174(0x87)]=!0x1;}},async 'onRefresh'(){await this['load']();},'viewPipeline'(){_0x3b473f(_0x3f2fa5,this['eng']);},async 'retryAllFailed'(){const _0x38235a=_0x534aa7,_0x33436a=this[_0x38235a(0x8d)]?.[_0x38235a(0x81)]||this[_0x38235a(0x74)]?.['config']?.[_0x38235a(0x81)],_0x3c2a61=this[_0x38235a(0x8d)]?.[_0x38235a(0x6f)]||this['eng']?.['config']?.[_0x38235a(0x6f)];if(_0x33436a||_0x3c2a61){if(await _0x3f2fa5[_0x38235a(0x71)][_0x38235a(0x6b)][_0x38235a(0x8e)][_0x38235a(0x97)](_0x38235a(0x77)+_0x33436a+'</b>\x22?<br><br>This\x20will\x20also\x20re-enqueue\x20any\x20stuck\x20PENDING\x20docs\x20on\x20the\x20indexer.')){this[_0x38235a(0x7a)]=!0x0;try{const _0x139948=await fetch(__ENV__[_0x38235a(0x73)]+_0x38235a(0x8a),{'method':_0x38235a(0x9e),'headers':{'Content-Type':_0x38235a(0x83)},'body':JSON['stringify']({'type':_0x33436a,'limit':0x1388})}),_0x5dcf20=await _0x139948['json'](),_0xff5e43=_0x5dcf20?.[_0x38235a(0x7d)]?.['retried']??0x0;let _0x701c5a=0x0;if(_0x3c2a61){const _0x183aec=await fetch(__ENV__[_0x38235a(0x73)]+_0x38235a(0x90)+encodeURIComponent(_0x3c2a61)+_0x38235a(0x96),{'method':_0x38235a(0x9e),'headers':{'Content-Type':_0x38235a(0x83)},'body':JSON[_0x38235a(0x9f)]({'limit':0x1388,'includeStuckPending':!0x0})}),_0xaf2d7a=await _0x183aec[_0x38235a(0x79)]();_0x701c5a=_0xaf2d7a?.[_0x38235a(0x7d)]?.[_0x38235a(0x94)]??0x0;}_0x3f2fa5[_0x38235a(0x71)][_0x38235a(0x6b)]?.[_0x38235a(0x98)]?.[_0x38235a(0x82)]?.(_0x38235a(0x91)+_0xff5e43+'\x20queue\x20job(s)'+(_0x701c5a?_0x38235a(0x76)+_0x701c5a+'\x20doc(s)':'')),_0x3f2fa5[_0x38235a(0x7e)]('refresh'),await this[_0x38235a(0x7f)]();}catch(_0x17fd0e){_0x3f2fa5['$ok'][_0x38235a(0x6b)]?.[_0x38235a(0x98)]?.[_0x38235a(0x6c)]?.(_0x17fd0e?.[_0x38235a(0x99)]||_0x38235a(0x9a));}finally{this['retryBusy']=!0x1;}}}else _0x3f2fa5['$ok'][_0x38235a(0x6b)]?.[_0x38235a(0x98)]?.[_0x38235a(0x6c)]?.(_0x38235a(0x8b));}}),async 'init'(_0x6ce44e){const _0x555c11=_0x534aa7;_0x6ce44e[_0x555c11(0x9b)](()=>_0x6ce44e[_0x555c11(0x84)][_0x555c11(0x8c)],async()=>{const _0x19aa06=_0x555c11;this[_0x19aa06(0x8d)]=null,this['error']=null,await this[_0x19aa06(0x7f)]();}),await this['load']();},'template':'\x0a<engine-panel-shell\x0a\x20\x20:engine=\x22eng\x22\x0a\x20\x20:title=\x22name\x22\x0a\x20\x20type-label=\x22worker\x22\x0a\x20\x20type-color=\x22var(--okdb-warning)\x22\x0a\x20\x20show-refresh=\x22true\x22\x0a\x20\x20:refresh-busy=\x22busy\x20||\x20retryBusy\x22\x0a\x20\x20:on-refresh=\x22onRefresh\x22\x0a\x20\x20:on-pipeline=\x22viewPipeline\x22\x0a\x20\x20@engine-updated=\x22$dispatch(\x27engine-updated\x27,\x20$event.detail)\x22\x0a\x20\x20@refresh=\x22$dispatch(\x27refresh\x27)\x22\x0a\x20\x20@deleted=\x22$dispatch(\x27deleted\x27,\x20$event.detail)\x22\x0a>\x0a\x20\x20<div\x20class=\x22stack-compact\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:8px;min-width:0;flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pill-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Queue\x20job\x20type\x20consumed\x20by\x20this\x20worker.\x22>{{\x20jobType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Indexer\x20this\x20worker\x20feeds.\x22>indexer:\x20{{\x20indexerName\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Embedder\x20used\x20for\x20vector\x20generation.\x22>embedder:\x20{{\x20embedderName\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Parallel\x20worker\x20lanes.\x22>concurrency:\x20{{\x20concurrencyValue\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-lead\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Consumes\x20queued\x20embedding\x20jobs\x20for\x20<strong>{{\x20indexerName\x20}}</strong>\x20and\x20pushes\x20text\x20through\x20<strong>{{\x20embedderName\x20}}</strong>.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-note\x22>Use\x20retry\x20when\x20queue\x20jobs\x20failed\x20or\x20docs\x20were\x20left\x20stuck\x20pending\x20after\x20a\x20queue\x20disruption.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-grid\x20metric-grid--compact\x22\x20style=\x22min-width:min(100%,\x20360px);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Processed</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22color:var(--okdb-success);\x22>{{\x20processedCount\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<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Failed</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20:style=\x22\x27color:\x27\x20+\x20(failedCount\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-app-fg)\x27)\x22>{{\x20failedCount\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<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>In\x20flight</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20:style=\x22\x27color:\x27\x20+\x20(inflightCount\x20>\x200\x20?\x20\x27var(--okdb-warning)\x27\x20:\x20\x27var(--okdb-app-fg)\x27)\x22>{{\x20inflightCount\x20}}</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</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:10px;flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22retryAllFailed()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22retryBusy\x20||\x20(!failedCount\x20&&\x20!jobType)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22color:var(--okdb-warning);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-warning)\x2027%,\x20transparent);\x20font-size:12px;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Retry\x20all\x20failed\x20queue\x20jobs\x20for\x20this\x20worker\x27s\x20job_type\x20+\x20re-enqueue\x20stuck\x20docs\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20retryBusy\x20?\x20\x27Retrying…\x27\x20:\x20\x27↺\x20Retry\x20Failed\x20Jobs\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22story-note\x22>Retries\x20queue\x20failures\x20and\x20also\x20re-enqueues\x20stuck\x20pending\x20docs\x20on\x20the\x20linked\x20indexer.</span>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22alert\x20alert--error\x22>{{\x20error\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Worker\x20details</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22kv-grid\x20kv-grid--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>job\x20type</span><span\x20class=\x22kv-val\x22>{{\x20jobType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>indexer</span><span\x20class=\x22kv-val\x22>{{\x20indexerName\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>embedder</span><span\x20class=\x22kv-val\x22>{{\x20embedderName\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>concurrency</span><span\x20class=\x22kv-val\x22>{{\x20concurrencyValue\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a</engine-panel-shell>\x0a','style':s};
1
+ import e from"../../engines/parts/engine-panel-shell.ok.js";import{ENGINE_PANEL_SHARED_STYLE as n}from"../../engines/engine-panel-shared-style.js";import{dispatchEnginePipelineSelection as t}from"../../engines/engine-ui-utils.js";const s=n;export default{tag:"embed-worker-panel",dependencies:[e],attr:{name:{},engine:{}},context:e=>({busy:!1,stats:null,error:null,retryBusy:!1,get eng(){return e.$attr.engine??{}},get name(){return e.$attr.name},get jobType(){return this.stats?.job_type||this.eng?.config?.job_type||"—"},get indexerName(){return this.stats?.indexer||this.eng?.config?.indexer||"—"},get embedderName(){return this.stats?.embedder||this.eng?.config?.embedder||"—"},get concurrencyValue(){return this.stats?.concurrency??this.eng?.config?.concurrency??"—"},get processedCount(){return this.stats?.processed??0},get failedCount(){return this.stats?.failed??0},get inflightCount(){return this.stats?.in_flight??0},async load(){this.busy=!0,this.error=null;try{const e=await fetch(`${__ENV__.API}/embeddings/workers/${encodeURIComponent(this.name)}/stats`),n=await e.json();if(!e.ok)throw new Error(n?.error?.message||"failed");this.stats=n.data}catch(e){this.error=e?.message||String(e),this.stats=null}finally{this.busy=!1}},async onRefresh(){await this.load()},viewPipeline(){t(e,this.eng)},async retryAllFailed(){const n=this.stats?.job_type||this.eng?.config?.job_type,t=this.stats?.indexer||this.eng?.config?.indexer;if(n||t){if(await e.$ok.shared.modal.confirm(`Retry all failed queue jobs for type "<b>${n}</b>"?<br><br>This will also re-enqueue any stuck PENDING docs on the indexer.`)){this.retryBusy=!0;try{const s=await fetch(`${__ENV__.API}/queue/retryFailed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:n,limit:5e3})}),i=await s.json(),r=i?.data?.retried??0;let a=0;if(t){const e=await fetch(`${__ENV__.API}/embeddings/indexers/${encodeURIComponent(t)}/retryFailed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({limit:5e3,includeStuckPending:!0})}),n=await e.json();a=n?.data?.retried??0}e.$ok.shared?.toast?.success?.(`Retried ${r} queue job(s)`+(a?`, re-enqueued ${a} doc(s)`:"")),e.$dispatch("refresh"),await this.load()}catch(n){e.$ok.shared?.toast?.error?.(n?.message||"Retry failed")}finally{this.retryBusy=!1}}}else e.$ok.shared?.toast?.error?.("Cannot determine job_type or indexer name")}}),async init(e){e.$watch(()=>e.$attr.name,async()=>{this.stats=null,this.error=null,await this.load()}),await this.load()},template:'\n<engine-panel-shell\n :engine="eng"\n :title="name"\n type-label="worker"\n type-color="var(--okdb-warning)"\n show-refresh="true"\n :refresh-busy="busy || retryBusy"\n :on-refresh="onRefresh"\n :on-pipeline="viewPipeline"\n @engine-updated="$dispatch(\'engine-updated\', $event.detail)"\n @refresh="$dispatch(\'refresh\')"\n @deleted="$dispatch(\'deleted\', $event.detail)"\n>\n <div class="stack-compact">\n <div class="card stack-compact" style="padding:14px;gap:12px;">\n <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap;">\n <div style="display:flex;flex-direction:column;gap:8px;min-width:0;flex:1;">\n <div class="pill-row">\n <span class="info-pill" title="Queue job type consumed by this worker.">{{ jobType }}</span>\n <span class="info-pill" title="Indexer this worker feeds.">indexer: {{ indexerName }}</span>\n <span class="info-pill" title="Embedder used for vector generation.">embedder: {{ embedderName }}</span>\n <span class="info-pill" title="Parallel worker lanes.">concurrency: {{ concurrencyValue }}</span>\n </div>\n <div class="story-lead">\n Consumes queued embedding jobs for <strong>{{ indexerName }}</strong> and pushes text through <strong>{{ embedderName }}</strong>.\n </div>\n <div class="story-note">Use retry when queue jobs failed or docs were left stuck pending after a queue disruption.</div>\n </div>\n\n <div class="metric-grid metric-grid--compact" style="min-width:min(100%, 360px);">\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Processed</div>\n <div class="metric-value" style="color:var(--okdb-success);">{{ processedCount }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Failed</div>\n <div class="metric-value" :style="\'color:\' + (failedCount > 0 ? \'var(--okdb-danger)\' : \'var(--okdb-app-fg)\')">{{ failedCount }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">In flight</div>\n <div class="metric-value" :style="\'color:\' + (inflightCount > 0 ? \'var(--okdb-warning)\' : \'var(--okdb-app-fg)\')">{{ inflightCount }}</div>\n </div>\n </div>\n </div>\n\n <div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">\n <button\n @click="retryAllFailed()"\n :disabled="retryBusy || (!failedCount && !jobType)"\n style="color:var(--okdb-warning); border-color:color-mix(in srgb, var(--okdb-warning) 27%, transparent); font-size:12px;"\n title="Retry all failed queue jobs for this worker\'s job_type + re-enqueue stuck docs"\n >\n {{ retryBusy ? \'Retrying…\' : \'↺ Retry Failed Jobs\' }}\n </button>\n <span class="story-note">Retries queue failures and also re-enqueues stuck pending docs on the linked indexer.</span>\n </div>\n\n <if :="error">\n <div class="alert alert--error">{{ error }}</div>\n </if>\n </div>\n\n <div class="card stack-compact" style="padding:14px;gap:12px;">\n <div class="card-title" style="margin:0;">Worker details</div>\n <div class="kv-grid kv-grid--compact">\n <span class="kv-key">job type</span><span class="kv-val">{{ jobType }}</span>\n <span class="kv-key">indexer</span><span class="kv-val">{{ indexerName }}</span>\n <span class="kv-key">embedder</span><span class="kv-val">{{ embedderName }}</span>\n <span class="kv-key">concurrency</span><span class="kv-val">{{ concurrencyValue }}</span>\n </div>\n </div>\n </div>\n</engine-panel-shell>\n',style:s};
@@ -1 +1 @@
1
- (function(_0x4f2d23,_0x53f337){var _0xd884ba=_0xa306,_0x48b161=_0x4f2d23();while(!![]){try{var _0x58738f=parseInt(_0xd884ba(0x11a))/0x1*(parseInt(_0xd884ba(0x120))/0x2)+parseInt(_0xd884ba(0x115))/0x3*(parseInt(_0xd884ba(0x11f))/0x4)+-parseInt(_0xd884ba(0x122))/0x5+-parseInt(_0xd884ba(0x119))/0x6*(parseInt(_0xd884ba(0x11d))/0x7)+parseInt(_0xd884ba(0x118))/0x8+-parseInt(_0xd884ba(0x117))/0x9+parseInt(_0xd884ba(0x11e))/0xa;if(_0x58738f===_0x53f337)break;else _0x48b161['push'](_0x48b161['shift']());}catch(_0x2a4822){_0x48b161['push'](_0x48b161['shift']());}}}(_0x1f36,0x78a39));import _0x2d4326 from'./embed-embedder-panel.ok.js';import _0x1d4606 from'./embed-indexer-panel.ok.js';import _0x4e7eef from'./embed-search-panel.ok.js';function _0xa306(_0x2ef321,_0xf414b4){_0x2ef321=_0x2ef321-0x115;var _0x1f36d1=_0x1f36();var _0xa30619=_0x1f36d1[_0x2ef321];return _0xa30619;}function _0x1f36(){var _0x49a343=['969045BjFgZa','9081BxMzRs','type','4351590QODcqa','4032008QrzVkg','4352040chFeov','27598JFfFQB','eng','panelType','7JtjCXX','1013690OfuBBI','576kfeTTX','62LXFBwE','engine'];_0x1f36=function(){return _0x49a343;};return _0x1f36();}import _0x5db74d from'./embed-worker-panel.ok.js';import{isEmbeddingsEngineType as _0x5c67c3}from'../../engines/engine-ui-utils.js';export default{'tag':'embeddings-engine-panel','dependencies':[_0x2d4326,_0x1d4606,_0x4e7eef,_0x5db74d],'attr':{'engine':{}},'context':_0x5d6388=>({get 'eng'(){var _0x3be465=_0xa306;return _0x5d6388['$attr'][_0x3be465(0x121)]??{};},get 'panelType'(){var _0x3e57f7=_0xa306;return this[_0x3e57f7(0x11b)][_0x3e57f7(0x116)]??'';},get 'hasKnownPanel'(){var _0x260d9c=_0xa306;return _0x5c67c3(this[_0x260d9c(0x11c)]);},'forward'(_0x4bf44b){var _0x199c6d=_0xa306;_0x4bf44b?.['type']&&_0x5d6388['$dispatch'](_0x4bf44b[_0x199c6d(0x116)],_0x4bf44b['detail']);}}),'template':'\x0a<div\x20style=\x22display:flex;flex-direction:column;gap:14px;min-width:0;\x22>\x0a\x20\x20<if\x20:=\x22panelType\x20===\x20\x27embedder\x27\x22>\x0a\x20\x20\x20\x20<embed-embedder-panel\x0a\x20\x20\x20\x20\x20\x20:name=\x22eng.name\x22\x0a\x20\x20\x20\x20\x20\x20:engine=\x22eng\x22\x0a\x20\x20\x20\x20\x20\x20@engine-updated=\x22forward($event)\x22\x0a\x20\x20\x20\x20\x20\x20@refresh=\x22forward($event)\x22\x0a\x20\x20\x20\x20\x20\x20@deleted=\x22forward($event)\x22\x0a\x20\x20\x20\x20/>\x0a\x20\x20</if>\x0a\x20\x20<if\x20:=\x22panelType\x20===\x20\x27indexer\x27\x22>\x0a\x20\x20\x20\x20<embed-indexer-panel\x0a\x20\x20\x20\x20\x20\x20:name=\x22eng.name\x22\x0a\x20\x20\x20\x20\x20\x20:engine=\x22eng\x22\x0a\x20\x20\x20\x20\x20\x20@engine-updated=\x22forward($event)\x22\x0a\x20\x20\x20\x20\x20\x20@refresh=\x22forward($event)\x22\x0a\x20\x20\x20\x20\x20\x20@deleted=\x22forward($event)\x22\x0a\x20\x20\x20\x20/>\x0a\x20\x20</if>\x0a\x20\x20<if\x20:=\x22panelType\x20===\x20\x27embed-worker\x27\x22>\x0a\x20\x20\x20\x20<embed-worker-panel\x0a\x20\x20\x20\x20\x20\x20:name=\x22eng.name\x22\x0a\x20\x20\x20\x20\x20\x20:engine=\x22eng\x22\x0a\x20\x20\x20\x20\x20\x20@engine-updated=\x22forward($event)\x22\x0a\x20\x20\x20\x20\x20\x20@refresh=\x22forward($event)\x22\x0a\x20\x20\x20\x20\x20\x20@deleted=\x22forward($event)\x22\x0a\x20\x20\x20\x20/>\x0a\x20\x20</if>\x0a\x20\x20<if\x20:=\x22panelType\x20===\x20\x27vector-search\x27\x22>\x0a\x20\x20\x20\x20<embed-search-panel\x0a\x20\x20\x20\x20\x20\x20:name=\x22eng.name\x22\x0a\x20\x20\x20\x20\x20\x20:engine=\x22eng\x22\x0a\x20\x20\x20\x20\x20\x20@engine-updated=\x22forward($event)\x22\x0a\x20\x20\x20\x20\x20\x20@refresh=\x22forward($event)\x22\x0a\x20\x20\x20\x20\x20\x20@deleted=\x22forward($event)\x22\x0a\x20\x20\x20\x20/>\x0a\x20\x20</if>\x0a\x20\x20<if\x20:=\x22!hasKnownPanel\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:12px;background:var(--okdb-app-bg-deep);color:var(--okdb-app-fg-muted);font-size:12px;line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20No\x20embeddings\x20panel\x20is\x20registered\x20for\x20engine\x20type\x20<code>{{\x20panelType\x20||\x20\x27unknown\x27\x20}}</code>.\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a</div>\x0a'};
1
+ import e from"./embed-embedder-panel.ok.js";import n from"./embed-indexer-panel.ok.js";import r from"./embed-search-panel.ok.js";import d from"./embed-worker-panel.ok.js";import{isEmbeddingsEngineType as a}from"../../engines/engine-ui-utils.js";export default{tag:"embeddings-engine-panel",dependencies:[e,n,r,d],attr:{engine:{}},context:e=>({get eng(){return e.$attr.engine??{}},get panelType(){return this.eng.type??""},get hasKnownPanel(){return a(this.panelType)},forward(n){n?.type&&e.$dispatch(n.type,n.detail)}}),template:'\n<div style="display:flex;flex-direction:column;gap:14px;min-width:0;">\n <if :="panelType === \'embedder\'">\n <embed-embedder-panel\n :name="eng.name"\n :engine="eng"\n @engine-updated="forward($event)"\n @refresh="forward($event)"\n @deleted="forward($event)"\n />\n </if>\n <if :="panelType === \'indexer\'">\n <embed-indexer-panel\n :name="eng.name"\n :engine="eng"\n @engine-updated="forward($event)"\n @refresh="forward($event)"\n @deleted="forward($event)"\n />\n </if>\n <if :="panelType === \'embed-worker\'">\n <embed-worker-panel\n :name="eng.name"\n :engine="eng"\n @engine-updated="forward($event)"\n @refresh="forward($event)"\n @deleted="forward($event)"\n />\n </if>\n <if :="panelType === \'vector-search\'">\n <embed-search-panel\n :name="eng.name"\n :engine="eng"\n @engine-updated="forward($event)"\n @refresh="forward($event)"\n @deleted="forward($event)"\n />\n </if>\n <if :="!hasKnownPanel">\n <div style="padding:14px;border:1px solid var(--okdb-app-border);border-radius:12px;background:var(--okdb-app-bg-deep);color:var(--okdb-app-fg-muted);font-size:12px;line-height:1.6;">\n No embeddings panel is registered for engine type <code>{{ panelType || \'unknown\' }}</code>.\n </div>\n </if>\n</div>\n'};
@@ -1 +1 @@
1
- function _0x4e17(){const _0x343df0=['__standalone__','$dispatch','accent','runtime','embedding','collectionEngine','1468366KPbQyl','Queue\x20Worker','relatedType','family','memberOwnerEnv','online','Try\x20changing\x20the\x20selected\x20pipeline,\x20status,\x20or\x20search\x20filters\x20above.','storeEnv','embeddings','Stop\x20pipeline\x20\x22<b>','withPipelineBusy','isRunning','extractors','\x0a/*\x20──\x20Root\x20───────────────────────────────────────────\x20*/\x0aengines-overview\x20.eo-root\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-direction:\x20column;\x0a\x20\x20gap:\x2016px;\x0a\x20\x20max-width:\x20980px;\x0a}\x0a\x0a/*\x20──\x20Page\x20header\x20────────────────────────────────────\x20*/\x0aengines-overview\x20.eo-header\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20justify-content:\x20space-between;\x0a\x20\x20gap:\x2012px;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20flex-wrap:\x20wrap;\x0a}\x0aengines-overview\x20.eo-title\x20{\x20font-weight:\x20700;\x20font-size:\x2017px;\x20color:\x20var(--okdb-app-fg);\x20letter-spacing:\x20-.01em;\x20}\x0aengines-overview\x20.eo-stats\x20{\x20display:\x20flex;\x20gap:\x2010px;\x20flex-wrap:\x20wrap;\x20align-items:\x20center;\x20font-size:\x2011px;\x20}\x0aengines-overview\x20.eo-stat-sep\x20{\x20width:\x201px;\x20height:\x2012px;\x20background:\x20var(--okdb-app-border);\x20flex-shrink:\x200;\x20}\x0a\x0a/*\x20──\x20Alerts\x20─────────────────────────────────────────\x20*/\x0aengines-overview\x20.eo-alert\x20{\x0a\x20\x20padding:\x2012px\x2016px;\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20border-radius:\x2010px;\x0a\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20font-size:\x2012px;\x0a\x20\x20line-height:\x201.6;\x0a}\x0aengines-overview\x20.eo-alert__title\x20{\x20font-weight:\x20600;\x20color:\x20var(--okdb-app-fg-muted);\x20margin-bottom:\x202px;\x20}\x0aengines-overview\x20.eo-alert__body\x20{\x20color:\x20var(--okdb-app-fg-subtle);\x20}\x0a\x0a/*\x20──\x20Section\x20────────────────────────────────────────\x20*/\x0aengines-overview\x20.eo-section\x20{\x20display:\x20flex;\x20flex-direction:\x20column;\x20gap:\x208px;\x20}\x0aengines-overview\x20.eo-section__label\x20{\x0a\x20\x20font-size:\x2010px;\x0a\x20\x20text-transform:\x20uppercase;\x0a\x20\x20letter-spacing:\x20.07em;\x0a\x20\x20color:\x20var(--okdb-app-fg-muted);\x0a\x20\x20opacity:\x20.55;\x0a\x20\x20margin-bottom:\x202px;\x0a}\x0aengines-overview\x20.eo-count\x20{\x0a\x20\x20font-size:\x2010px;\x0a\x20\x20padding:\x200\x206px;\x0a\x20\x20border-radius:\x20999px;\x0a\x20\x20background:\x20var(--okdb-app-surface);\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20color:\x20var(--okdb-accent-muted);\x0a\x20\x20margin-left:\x204px;\x0a\x20\x20vertical-align:\x20middle;\x0a}\x0a\x0a/*\x20──\x20Pipeline\x20card\x20──────────────────────────────────\x20*/\x0aengines-overview\x20.eo-pipeline-card\x20{\x0a\x20\x20background:\x20var(--okdb-app-surface);\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20border-radius:\x2010px;\x0a\x20\x20overflow:\x20hidden;\x0a\x20\x20transition:\x20border-color\x20.14s;\x0a}\x0aengines-overview\x20.eo-pipeline-card:hover\x20{\x20border-color:\x20#384047;\x20}\x0a\x0aengines-overview\x20.eo-pipeline-header\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x208px;\x0a\x20\x20padding:\x2012px\x2014px;\x0a\x20\x20flex-wrap:\x20wrap;\x0a\x20\x20min-width:\x200;\x0a}\x0aengines-overview\x20.eo-health-dot\x20{\x0a\x20\x20width:\x207px;\x0a\x20\x20height:\x207px;\x0a\x20\x20border-radius:\x2050%;\x0a\x20\x20flex-shrink:\x200;\x0a}\x0aengines-overview\x20.eo-pipeline-name\x20{\x0a\x20\x20font-weight:\x20600;\x0a\x20\x20font-size:\x2013.5px;\x0a\x20\x20color:\x20var(--okdb-app-fg);\x0a\x20\x20overflow:\x20hidden;\x0a\x20\x20text-overflow:\x20ellipsis;\x0a\x20\x20white-space:\x20nowrap;\x0a\x20\x20min-width:\x200;\x0a\x20\x20letter-spacing:\x20-.01em;\x0a}\x0aengines-overview\x20.eo-spacer\x20{\x20flex:\x201;\x20min-width:\x200;\x20}\x0aengines-overview\x20.eo-run-count\x20{\x0a\x20\x20font-size:\x2011px;\x0a\x20\x20color:\x20var(--okdb-accent-muted);\x0a\x20\x20display:\x20inline-flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x204px;\x0a\x20\x20white-space:\x20nowrap;\x0a\x20\x20flex-shrink:\x200;\x0a}\x0a\x0a/*\x20──\x20Pills\x20──────────────────────────────────────────\x20*/\x0aengines-overview\x20.eo-pill\x20{\x0a\x20\x20font-size:\x2010.5px;\x0a\x20\x20padding:\x201px\x208px;\x0a\x20\x20border-radius:\x20999px;\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20color:\x20var(--okdb-app-fg-muted);\x0a\x20\x20background:\x20transparent;\x0a\x20\x20display:\x20inline-flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20white-space:\x20nowrap;\x0a\x20\x20flex-shrink:\x200;\x0a\x20\x20letter-spacing:\x20.01em;\x0a}\x0a\x0a/*\x20──\x20Buttons\x20────────────────────────────────────────\x20*/\x0aengines-overview\x20.eo-btn\x20{\x0a\x20\x20font-size:\x2011px;\x0a\x20\x20padding:\x203px\x2010px;\x0a\x20\x20border-radius:\x20999px;\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20color:\x20var(--okdb-app-fg-muted);\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20line-height:\x201.4;\x0a\x20\x20flex-shrink:\x200;\x0a\x20\x20white-space:\x20nowrap;\x0a\x20\x20transition:\x20filter\x20.12s;\x0a}\x0aengines-overview\x20.eo-btn--toggle\x20{\x20background:\x20var(--okdb-app-bg-deep);\x20border-color:\x20var(--okdb-app-border);\x20color:\x20var(--okdb-app-fg-muted);\x20}\x0aengines-overview\x20.eo-btn--danger\x20{\x20border-color:\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2033%,\x20transparent);\x20color:\x20var(--okdb-danger);\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x207%,\x20transparent);\x20}\x0aengines-overview\x20.eo-btn:hover:not(:disabled)\x20{\x20filter:\x20brightness(1.3);\x20}\x0aengines-overview\x20.eo-btn:disabled\x20{\x20opacity:\x20.4;\x20cursor:\x20not-allowed;\x20}\x0a\x0a/*\x20──\x20Metrics\x20row\x20(pipeline\x20header)\x20─────────────────\x20*/\x0aengines-overview\x20.eo-pipeline-metrics\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-wrap:\x20wrap;\x0a\x20\x20gap:\x203px\x2016px;\x0a\x20\x20padding:\x200\x2014px\x2010px\x2035px;\x0a}\x0aengines-overview\x20.eo-kv\x20{\x20display:\x20inline-flex;\x20gap:\x204px;\x20align-items:\x20baseline;\x20font-size:\x2011px;\x20line-height:\x201.4;\x20}\x0aengines-overview\x20.eo-kv__label\x20{\x20font-size:\x209.5px;\x20text-transform:\x20uppercase;\x20letter-spacing:\x20.04em;\x20color:\x20var(--okdb-app-fg-subtle);\x20flex-shrink:\x200;\x20}\x0aengines-overview\x20.eo-kv__val\x20{\x20color:\x20#a8c4d9;\x20overflow:\x20hidden;\x20text-overflow:\x20ellipsis;\x20white-space:\x20nowrap;\x20}\x0a\x0a/*\x20──\x20Inline\x20chip\x20strip\x20(collapsed\x20pipeline)\x20─────────\x20*/\x0aengines-overview\x20.eo-chip-strip\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-wrap:\x20wrap;\x0a\x20\x20gap:\x205px;\x0a\x20\x20padding:\x200\x2014px\x2012px\x2035px;\x0a}\x0aengines-overview\x20.eo-chip\x20{\x0a\x20\x20display:\x20inline-flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x205px;\x0a\x20\x20padding:\x202px\x208px;\x0a\x20\x20border-radius:\x20999px;\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20font-size:\x2010.5px;\x0a\x20\x20white-space:\x20nowrap;\x0a}\x0aengines-overview\x20.eo-chip__name\x20{\x20color:\x20var(--okdb-accent-muted);\x20}\x0a\x0a/*\x20──\x20Accordion\x20(expanded\x20pipeline)\x20─────────────────\x20*/\x0aengines-overview\x20.eo-accordion\x20{\x0a\x20\x20border-top:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-direction:\x20column;\x0a\x20\x20gap:\x208px;\x0a\x20\x20padding:\x2012px;\x0a}\x0aengines-overview\x20.eo-accordion-footer\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20justify-content:\x20flex-end;\x0a\x20\x20padding:\x204px\x202px\x202px;\x0a\x20\x20border-top:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20margin-top:\x202px;\x0a}\x0a','1554frbBlH','Source','color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent)','includes','engineInSelectedPipeline','toast','</b>\x22?','Env\x20Pipelines','var(--okdb-purple)','has','record','pipelines','stats','paused','matchesSearch','join','Prepare','collections','Indexer','resolve','pipelineRequest','degraded','fileEngines','string','pipelineRecords','<engine-modal\x20:modal=\x22modal\x22\x20:engine=\x22engine\x22\x20:env=\x22envName\x22\x20/>','Workers','Try\x20changing\x20the\x20pipeline\x20type,\x20status,\x20search,\x20or\x20source-type\x20filters.','visibleEngines','embedder','slice','pipelineConfigMetrics','Algorithm','Extractor','phase','touchesSourceType','source_env','state','type','Delete\x20pipeline\x20\x22<b>','building','4323456cBKksK','inactive','engines','attention','selectedEnv','warning','</b>\x22?<br><br>','var(--okdb-accent)','source_type','workers','Processor','pipelineTypeFilter',';border-radius:10px;overflow:hidden;transition:border-color\x20.14s;','enginePipelineName','message','engineStatusMeta','default','Start\x20failed','sourceTypeFilter','pipeline','role','embedEngines','search','36866124wXZQHV','font-size:11px;padding:3px\x2010px;border-radius:999px;border:1px\x20solid\x20','push','every','var(--okdb-danger)','Engines','Embedder','okdb','pipelineActionBusy','flatMap','var(--okdb-info)','Mode','add','<br>','filterToSelectedPipeline','modal','selectedPipelineMembers','var(--okdb-sky)','Chunk','embedded','Concurrency','object','label','error','No\x20pipelines\x20match\x20the\x20current\x20filters','activeEngines','toLowerCase','engineId',';background:','shared','selectedPipelineName','status','\x20failed','progress','filteredEmbedPipelines','engineEnv','Progress','Engine','selectedpipeline','matchesGroup','vector-search','pop','true','/pipelines/','~system','filter','running','var(--okdb-indigo)','stop','$ok','sort','statusFilter','all','stores','engineTypeFilter','isEmbedded','success','var(--okdb-warning)','Environment','Stopped','engineMetricSearchParts','_uiEnv','Search','some','totalEngineCount','config','file','tone','pipelineTypeMatches','typeLabel','modeFilter','fileData','set','Worker','color','2598456FInZTn','Stop\x20failed','value','isArray','55;color:','Provider','groupStatusBucket','var(--okdb-success)','Queue','/stop','var(--okdb-orange)','find','Started','filteredVisibleEngines','Delete\x20failed','embed','json','localeCompare','$router','POST','pipelineIdentity','Field','3WVlsYk','embedOnly','filePipelineEngines','totalPipelineCount','danger','2045735KGJhNJ','get','catch','DELETE','Restarted\x20pipeline\x20\x22','Restart\x20pipeline\x20\x22<b>','meta','$vars','filePipelines','job_type','key','Collection','\x20pipeline\x20\x22','filteredFilePipelines','Model','values','37429CtZAFL','Pipelines','engineStatusBucket','1165977zIXnte','whole\x20record','Edit\x20Engine\x20·\x20','searchFilter','map','/env/','trim','allUniqueEngines','number','env','sourcetype','filterpipeline','select','pipelinetype','stopped','request','var(--okdb-app-fg-muted)','$attr','embedPipelines','isSelectedPipeline','allEngines','worker','engineSourceTypes','engines-overview','collection','length','API','indexer','goto-type','embedPipelineEngines','name','target_type','refresh','#94a3b8','confirm','split'];_0x4e17=function(){return _0x343df0;};return _0x4e17();}const _0x17e184=_0x5d0e;(function(_0x3ca057,_0x10b07b){const _0x1d95b9=_0x5d0e,_0x5c8cc7=_0x3ca057();while(!![]){try{const _0x23691b=parseInt(_0x1d95b9(0x129))/0x1+parseInt(_0x1d95b9(0x153))/0x2+-parseInt(_0x1d95b9(0x111))/0x3*(-parseInt(_0x1d95b9(0xfb))/0x4)+parseInt(_0x1d95b9(0x116))/0x5+-parseInt(_0x1d95b9(0x70))/0x6*(-parseInt(_0x1d95b9(0x126))/0x7)+parseInt(_0x1d95b9(0x99))/0x8+-parseInt(_0x1d95b9(0xb0))/0x9;if(_0x23691b===_0x10b07b)break;else _0x5c8cc7['push'](_0x5c8cc7['shift']());}catch(_0x1fabe0){_0x5c8cc7['push'](_0x5c8cc7['shift']());}}}(_0x4e17,0xc0616));import _0x57f941 from'../../engines/modals/engine-modal.ok.js';import _0x5d3b80 from'../../engines/parts/engine-resource-card.ok.js';function _0x5d0e(_0x54e69d,_0x37b832){_0x54e69d=_0x54e69d-0x66;const _0x4e17fa=_0x4e17();let _0x5d0e0d=_0x4e17fa[_0x54e69d];return _0x5d0e0d;}import{compactEngineConfigMetrics as _0x1e414a,compactEngineRowMetrics as _0x542d4b,compactEngineStatusMeta as _0x5257b9}from'../../engines/engine-ui-utils.js';export default{'tag':_0x17e184(0x140),'dependencies':[_0x57f941,_0x5d3b80],'attr':{'embedEngines':{},'embedPipelines':{},'fileEngines':{},'embedded':{},'filterpipeline':{},'mode':{},'pipelinetype':{},'enginetype':{},'status':{},'search':{},'sourcetype':{},'selectedpipeline':{}},'context':_0x4a746b=>({get 'allEmbed'(){const _0x42d93c=_0x17e184;return _0x4a746b['$attr'][_0x42d93c(0xae)]??[];},get 'pipelineRecords'(){const _0x50c758=_0x17e184;return _0x4a746b['$attr'][_0x50c758(0x13b)]??[];},get 'fileData'(){const _0x7b9562=_0x17e184;return _0x4a746b['$attr'][_0x7b9562(0x86)]??{};},get 'allFile'(){const _0x2cf1e9=_0x17e184,_0x355a30=this[_0x2cf1e9(0xf7)];return[..._0x355a30[_0x2cf1e9(0x6e)]??[],..._0x355a30['collections']??[],..._0x355a30[_0x2cf1e9(0xa2)]??[]];},get 'isEmbedded'(){const _0x2fc262=_0x17e184;return!0x0===_0x4a746b[_0x2fc262(0x13a)]['embedded']||_0x2fc262(0xda)===_0x4a746b['$attr'][_0x2fc262(0xc3)];},get 'filterToSelectedPipeline'(){const _0xb511d3=_0x17e184;return!0x0===_0x4a746b['$attr'][_0xb511d3(0x134)]||_0xb511d3(0xda)===_0x4a746b[_0xb511d3(0x13a)][_0xb511d3(0x134)];},get 'modeFilter'(){const _0x278cba=_0x17e184;return _0x278cba(0x9b)===_0x4a746b[_0x278cba(0x13a)]['mode']?_0x278cba(0x9b):_0x278cba(0x7b);},get 'pipelineTypeFilter'(){const _0x128c6b=_0x17e184;return['all',_0x128c6b(0x151),'file']['includes'](_0x4a746b[_0x128c6b(0x13a)]['pipelinetype'])?_0x4a746b[_0x128c6b(0x13a)][_0x128c6b(0x136)]:_0x128c6b(0xe4);},get 'engineTypeFilter'(){const _0x499def=_0x17e184;return String(_0x4a746b[_0x499def(0x13a)]['enginetype']??'')[_0x499def(0x12f)]();},get 'statusFilter'(){const _0x125399=_0x17e184;return _0x4a746b[_0x125399(0x13a)][_0x125399(0xcf)]??_0x125399(0xe4);},get 'searchFilter'(){const _0x2e73ac=_0x17e184;return String(_0x4a746b['$attr'][_0x2e73ac(0xaf)]??'')['trim']()['toLowerCase']();},get 'sourceTypeFilter'(){const _0x537679=_0x17e184;return String(_0x4a746b[_0x537679(0x13a)][_0x537679(0x133)]??'')[_0x537679(0x12f)]();},get 'selectedPipelineName'(){const _0x42ff41=_0x17e184;return String(_0x4a746b[_0x42ff41(0x13a)][_0x42ff41(0xd6)]??'')[_0x42ff41(0x12f)]();},'pipelineActionBusy':{},get 'embedOnly'(){const _0x33fa0a=_0x17e184;return(_0x4a746b[_0x33fa0a(0x13a)][_0x33fa0a(0xae)]??[])[_0x33fa0a(0xdd)](_0x32dcb0=>'processor'!==_0x32dcb0[_0x33fa0a(0x96)]&&'queue-worker'!==_0x32dcb0['type']);},get 'allEngines'(){return[...this['allEmbed'],...this['allFile']];},'engineId':_0x4c07e4=>_0x4c07e4?_0x4c07e4[_0x17e184(0x120)]??(_0x4c07e4[_0x17e184(0x96)]&&_0x4c07e4['name']?_0x4c07e4[_0x17e184(0x96)]+'@'+_0x4c07e4[_0x17e184(0x147)]:_0x4c07e4['name']??null):null,'engineSourceTypes'(_0x4dfa9c){const _0x57bfb0=_0x17e184,_0x45866e=[_0x4dfa9c?.['config']?.['source_type'],_0x4dfa9c?.[_0x57bfb0(0x150)]?.[_0x57bfb0(0xa1)],_0x4dfa9c?.[_0x57bfb0(0xf1)]?.['target_type'],_0x4dfa9c?.[_0x57bfb0(0x150)]?.[_0x57bfb0(0x148)]]['filter'](Boolean);return[...new Set(_0x45866e)];},'touchesSourceType'(_0x21d687){const _0x406190=_0x17e184;return!this[_0x406190(0xab)]||this[_0x406190(0x13f)](_0x21d687)[_0x406190(0x73)](this[_0x406190(0xab)]);},'engineStatusBucket'(_0x5acff4){const _0x4f295b=_0x17e184,_0xf6f094=_0x5acff4?.[_0x4f295b(0x7c)]?.[_0x4f295b(0x95)]??_0x5acff4?.[_0x4f295b(0xcf)]??null;return _0x5acff4?.['isRunning']||'online'===_0xf6f094?'running':[_0x4f295b(0xc7),_0x4f295b(0x9a),_0x4f295b(0x7d),_0x4f295b(0x98),_0x4f295b(0x85)]['includes'](_0xf6f094)?_0x4f295b(0x9c):_0x4f295b(0x137);},'groupStatusBucket'(_0x1a4359){const _0x54bf60=_0x17e184,_0x32e77b=_0x1a4359[_0x54bf60(0x12d)](_0xbe55ae=>this[_0x54bf60(0x128)](_0xbe55ae));return 0x0===_0x32e77b[_0x54bf60(0x142)]?_0x54bf60(0x137):_0x32e77b[_0x54bf60(0xb3)](_0x5de3fc=>_0x54bf60(0xde)===_0x5de3fc)?'running':_0x32e77b[_0x54bf60(0xef)](_0x5809f3=>_0x54bf60(0x9c)===_0x5809f3)||_0x32e77b[_0x54bf60(0xef)](_0x47a741=>_0x54bf60(0xde)===_0x47a741)?'attention':_0x54bf60(0x137);},'matchesSearch'(_0x3b8b42=[]){const _0x2bbded=_0x17e184;return!this['searchFilter']||_0x3b8b42[_0x2bbded(0xdd)](Boolean)[_0x2bbded(0x7f)]('\x20')[_0x2bbded(0xca)]()[_0x2bbded(0x73)](this[_0x2bbded(0x12c)]);},'pipelineTypeMatches'(_0x50845a){const _0x593602=_0x17e184;return'all'===this[_0x593602(0xa4)]||this['pipelineTypeFilter']===_0x50845a;},get 'embedPipelines'(){const _0x54b162=_0x17e184;if(this['pipelineRecords'][_0x54b162(0x142)]>0x0)return this[_0x54b162(0x88)][_0x54b162(0x12d)](_0x282e1d=>{const _0x1d7922=_0x54b162,_0x17b5aa=Array[_0x1d7922(0xfe)](_0x282e1d[_0x1d7922(0x9b)])?_0x282e1d[_0x1d7922(0x9b)][_0x1d7922(0xdd)](Boolean):[],_0xdfc10a=_0x17b5aa['find'](_0x470bec=>this[_0x1d7922(0xd3)](_0x470bec))??null,_0x494052=_0x17b5aa[_0x1d7922(0x106)](_0x155def=>_0x1d7922(0x8d)===_0x155def[_0x1d7922(0xad)]||_0x1d7922(0x8d)===_0x155def[_0x1d7922(0x96)])??null,_0x15b5e6=_0x17b5aa['find'](_0x41b485=>_0x1d7922(0x144)===_0x41b485[_0x1d7922(0xad)]||_0x1d7922(0x144)===_0x41b485[_0x1d7922(0x96)])??null,_0xade654=_0x17b5aa['find'](_0x38b22b=>'search'===_0x38b22b['role']||_0x1d7922(0xd8)===_0x38b22b[_0x1d7922(0x96)])??null,_0xbfdc7b=_0x17b5aa[_0x1d7922(0x106)](_0x5dbee2=>_0x1d7922(0x13e)===_0x5dbee2[_0x1d7922(0xad)]||'embed-worker'===_0x5dbee2[_0x1d7922(0x96)])??null;return{'name':_0x282e1d[_0x1d7922(0x11c)]?.[_0x1d7922(0xc6)]??_0x282e1d[_0x1d7922(0x11c)]?.[_0x1d7922(0xac)]??_0x282e1d[_0x1d7922(0x147)],'key':_0x282e1d[_0x1d7922(0x147)],'env':_0x282e1d[_0x1d7922(0x132)]??this[_0x1d7922(0xd3)](_0xdfc10a)??_0x15b5e6?.[_0x1d7922(0xf1)]?.[_0x1d7922(0x94)]??_0xade654?.[_0x1d7922(0xf1)]?.['source_env']??null,'type':_0x1d7922(0x6a)===_0x282e1d[_0x1d7922(0x11c)]?.['family']?'embed':_0x1d7922(0x132),'record':_0x282e1d,'members':_0x17b5aa,'embedder':_0x494052,'indexer':_0x15b5e6,'search':_0xade654,'worker':_0xbfdc7b};})['filter'](_0x164657=>_0x164657['members'][_0x54b162(0x142)]>0x0)[_0x54b162(0xe2)]((_0x3b9440,_0x111686)=>_0x3b9440[_0x54b162(0x147)][_0x54b162(0x10c)](_0x111686[_0x54b162(0x147)]));const _0x45ca83=new Map();for(const _0x298e22 of this[_0x54b162(0x112)]){const _0x55e5fc=_0x298e22[_0x54b162(0x11c)]?.[_0x54b162(0xac)]??_0x298e22['name']['replace'](/-worker$/,'');_0x45ca83[_0x54b162(0x79)](_0x55e5fc)||_0x45ca83[_0x54b162(0xf8)](_0x55e5fc,{'name':_0x55e5fc,'type':_0x54b162(0x10a),'embedder':null,'indexer':null,'search':null,'worker':null});const _0x291157=_0x45ca83['get'](_0x55e5fc);'embedder'===_0x298e22['type']?_0x291157[_0x54b162(0x8d)]=_0x298e22:_0x54b162(0x144)===_0x298e22[_0x54b162(0x96)]?_0x291157[_0x54b162(0x144)]=_0x298e22:_0x54b162(0xd8)===_0x298e22[_0x54b162(0x96)]?_0x291157[_0x54b162(0xaf)]=_0x298e22:'embed-worker'===_0x298e22[_0x54b162(0x96)]&&(_0x291157['worker']=_0x298e22);}return[..._0x45ca83[_0x54b162(0x125)]()]['filter'](_0x52b54b=>[_0x52b54b['embedder'],_0x52b54b[_0x54b162(0x144)],_0x52b54b['search'],_0x52b54b[_0x54b162(0x13e)]][_0x54b162(0xdd)](Boolean)['length']>0x1)[_0x54b162(0xe2)]((_0xb3f9e6,_0x3e6e4f)=>_0xb3f9e6['name'][_0x54b162(0x10c)](_0x3e6e4f[_0x54b162(0x147)]));},get 'filePipelines'(){const _0x3a8e4f=_0x17e184;return(this[_0x3a8e4f(0xf7)][_0x3a8e4f(0x81)]??[])[_0x3a8e4f(0x12d)](_0x1d87ad=>{const _0x1f9ada=_0x3a8e4f,_0x5c0dfa=(this['fileData'][_0x1f9ada(0x6e)]??[])[_0x1f9ada(0xdd)](_0x37c3a2=>_0x1d87ad[_0x1f9ada(0xf1)]?.['pipeline']?.[_0x1f9ada(0x73)](_0x37c3a2['name'])),_0x4c7aa2=(this[_0x1f9ada(0xf7)][_0x1f9ada(0xa2)]??[])[_0x1f9ada(0xdd)](_0x24eb35=>_0x24eb35[_0x1f9ada(0xf1)]?.[_0x1f9ada(0x152)]===_0x1d87ad['name']);return{'name':_0x1d87ad[_0x1f9ada(0x141)]??_0x1d87ad[_0x1f9ada(0x147)],'type':_0x1f9ada(0xf2),'collection':_0x1d87ad,'extractors':_0x5c0dfa,'workers':_0x4c7aa2};})[_0x3a8e4f(0xe2)]((_0x17600e,_0x38184d)=>_0x17600e[_0x3a8e4f(0x147)]['localeCompare'](_0x38184d[_0x3a8e4f(0x147)]));},get 'allUniqueEngines'(){const _0x55e95f=_0x17e184,_0x5a74ee=new Set();return this['allEngines'][_0x55e95f(0xdd)](_0x537b7c=>{const _0x5eeb4b=this['engineId'](_0x537b7c);return!(!_0x5eeb4b||_0x5a74ee['has'](_0x5eeb4b)||(_0x5a74ee['add'](_0x5eeb4b),0x0));});},get 'visibleEngines'(){const _0x215388=_0x17e184;return this['allUniqueEngines'][_0x215388(0xdd)](_0x44e384=>this[_0x215388(0x74)](_0x44e384))[_0x215388(0xdd)](_0x33d366=>!this['engineTypeFilter']||_0x33d366[_0x215388(0x96)]===this[_0x215388(0xe6)])[_0x215388(0xdd)](_0x394f4d=>_0x215388(0xe4)===this[_0x215388(0xe3)]||this[_0x215388(0x128)](_0x394f4d)===this[_0x215388(0xe3)])[_0x215388(0xdd)](_0x20143e=>this[_0x215388(0x93)](_0x20143e))['filter'](_0x356251=>this[_0x215388(0x7e)]([_0x356251?.['name'],_0x356251?.[_0x215388(0x96)],_0x356251?.[_0x215388(0x11c)]?.[_0x215388(0xac)],_0x356251?.['env'],_0x356251?.[_0x215388(0xed)],...this[_0x215388(0xec)](_0x356251),...this[_0x215388(0x13f)](_0x356251),_0x356251?.['config']?.[_0x215388(0x11f)],_0x356251?.['config']?.['handler']?.[_0x215388(0x147)]]))[_0x215388(0xe2)]((_0x18418b,_0x5962e3)=>String(_0x18418b[_0x215388(0x96)]||'')[_0x215388(0x10c)](String(_0x5962e3[_0x215388(0x96)]||''))||String(_0x18418b[_0x215388(0x147)]||'')['localeCompare'](String(_0x5962e3[_0x215388(0x147)]||'')));},get 'visibleEngineGroups'(){const _0x51d464=_0x17e184,_0x3a0e59=new Map(),_0x3a98c2={'key':_0x51d464(0x14d),'label':'Standalone','pipeline':null,'engines':[]};for(const _0xceb1bc of this[_0x51d464(0x8c)]){const _0x3c2f6d=this[_0x51d464(0xa6)](_0xceb1bc);_0x3c2f6d?(_0x3a0e59['has'](_0x3c2f6d)||_0x3a0e59[_0x51d464(0xf8)](_0x3c2f6d,{'key':_0x3c2f6d,'label':String(_0x3c2f6d)[_0x51d464(0x14c)](':')[_0x51d464(0xd9)](),'pipeline':_0x3c2f6d,'engines':[]}),_0x3a0e59['get'](_0x3c2f6d)[_0x51d464(0x9b)]['push'](_0xceb1bc)):_0x3a98c2[_0x51d464(0x9b)][_0x51d464(0xb2)](_0xceb1bc);}const _0x246676=[..._0x3a0e59['values']()]['sort']((_0x3f8a3e,_0x54f920)=>_0x3f8a3e[_0x51d464(0xc6)]['localeCompare'](_0x54f920[_0x51d464(0xc6)]));return _0x3a98c2[_0x51d464(0x9b)][_0x51d464(0x142)]&&_0x246676[_0x51d464(0xb2)](_0x3a98c2),_0x246676;},'matchesGroup'(_0x1ac554,_0x55a457,_0x25f7fb,_0x1d9b0b=[]){const _0x128878=_0x17e184;return(_0x128878(0xe4)===this[_0x128878(0xe3)]||this[_0x128878(0x101)](_0x25f7fb)===this['statusFilter'])&&!(this[_0x128878(0xab)]&&!_0x25f7fb['some'](_0x5d1ea2=>this[_0x128878(0x93)](_0x5d1ea2)))&&this[_0x128878(0x7e)]([_0x1ac554?.[_0x128878(0x147)],_0x1ac554?.[_0x128878(0x96)],_0x1ac554?.[_0x128878(0x132)],..._0x1d9b0b,..._0x25f7fb[_0x128878(0xb9)](_0x1a4b3a=>[_0x1a4b3a?.[_0x128878(0x147)],_0x1a4b3a?.['type'],...this[_0x128878(0x13f)](_0x1a4b3a),_0x1a4b3a?.['config']?.['job_type'],_0x1a4b3a?.[_0x128878(0xf1)]?.['handler']?.[_0x128878(0x147)]])]);},get 'filteredEmbedPipelines'(){const _0x35a155=_0x17e184;return _0x35a155(0x7b)!==this[_0x35a155(0xf6)]?[]:this[_0x35a155(0xf4)](_0x35a155(0x151))?this[_0x35a155(0x13b)]['filter'](_0x31c929=>(!this[_0x35a155(0xbe)]||!this['selectedPipelineName']||this['pipelineIdentity'](_0x31c929)===this['selectedPipelineName'])&&this[_0x35a155(0xd7)](_0x31c929,_0x35a155(0x151),this[_0x35a155(0x146)](_0x31c929),[_0x31c929?.['record']?.[_0x35a155(0x11c)]?.[_0x35a155(0x156)]])):[];},get 'filteredFilePipelines'(){const _0xe2a2bc=_0x17e184;return'pipelines'!==this[_0xe2a2bc(0xf6)]?[]:this['pipelineTypeMatches'](_0xe2a2bc(0xf2))?this[_0xe2a2bc(0x11e)][_0xe2a2bc(0xdd)](_0x29352d=>this[_0xe2a2bc(0xd7)](_0x29352d,_0xe2a2bc(0xf2),this[_0xe2a2bc(0x113)](_0x29352d),[_0x29352d?.['collection']?.[_0xe2a2bc(0x141)]])):[];},get 'filteredPipelineCount'(){const _0x152eb4=_0x17e184;return this[_0x152eb4(0xd2)]['length']+this[_0x152eb4(0x123)][_0x152eb4(0x142)];},get 'filteredVisibleEngines'(){const _0x4d3b3e=_0x17e184;if('pipelines'!==this[_0x4d3b3e(0xf6)])return[];const _0x5c95c2=new Set(),_0x41f6b3=[];for(const _0x249577 of this[_0x4d3b3e(0xd2)])for(const _0x32ac1a of this[_0x4d3b3e(0x146)](_0x249577)){const _0x20e3eb=this['engineId'](_0x32ac1a);_0x20e3eb&&!_0x5c95c2[_0x4d3b3e(0x79)](_0x20e3eb)&&(_0x5c95c2[_0x4d3b3e(0xbc)](_0x20e3eb),_0x41f6b3[_0x4d3b3e(0xb2)](_0x32ac1a));}for(const _0x2933cc of this['filteredFilePipelines'])for(const _0x529ffd of this[_0x4d3b3e(0x113)](_0x2933cc)){const _0x23d5c8=this[_0x4d3b3e(0xcb)](_0x529ffd);_0x23d5c8&&!_0x5c95c2[_0x4d3b3e(0x79)](_0x23d5c8)&&(_0x5c95c2[_0x4d3b3e(0xbc)](_0x23d5c8),_0x41f6b3['push'](_0x529ffd));}return _0x41f6b3;},get 'totalPipelineCount'(){const _0xc5b841=_0x17e184;return this[_0xc5b841(0x13b)][_0xc5b841(0x142)]+this[_0xc5b841(0x11e)]['length'];},get 'totalEngineCount'(){const _0x1c2ae0=_0x17e184;return this[_0x1c2ae0(0x130)][_0x1c2ae0(0x142)];},get 'visibleItemCount'(){const _0x4f93b1=_0x17e184;return _0x4f93b1(0x7b)===this[_0x4f93b1(0xf6)]?this['filteredPipelineCount']:this[_0x4f93b1(0x8c)][_0x4f93b1(0x142)];},get 'totalItemCount'(){const _0x3be4e1=_0x17e184;return _0x3be4e1(0x7b)===this[_0x3be4e1(0xf6)]?this[_0x3be4e1(0x114)]:this[_0x3be4e1(0xf0)];},get 'activeEngines'(){const _0x49a8b6=_0x17e184;return _0x49a8b6(0x7b)===this[_0x49a8b6(0xf6)]?this[_0x49a8b6(0x108)]:this[_0x49a8b6(0x8c)];},get 'hasAnyEngines'(){const _0x23a963=_0x17e184;return this[_0x23a963(0x13d)][_0x23a963(0x142)]>0x0;},get 'runningCount'(){const _0x57b7ea=_0x17e184;return this[_0x57b7ea(0xc9)][_0x57b7ea(0xdd)](_0x592a5f=>'running'===this[_0x57b7ea(0x128)](_0x592a5f))[_0x57b7ea(0x142)];},get 'errorCount'(){const _0x1b86ff=_0x17e184;return this['activeEngines'][_0x1b86ff(0xdd)](_0x2e6d94=>_0x1b86ff(0x9c)===this['engineStatusBucket'](_0x2e6d94))[_0x1b86ff(0x142)];},get 'headerTitle'(){const _0xca5552=_0x17e184;return'pipelines'===this[_0xca5552(0xf6)]?_0xca5552(0x127):_0xca5552(0xb5);},get 'noResultsLabel'(){const _0x268f1d=_0x17e184;return _0x268f1d(0x7b)===this[_0x268f1d(0xf6)]?_0x268f1d(0xc8):'No\x20engines\x20match\x20the\x20current\x20filters';},get 'noResultsHint'(){const _0x14b019=_0x17e184;return this[_0x14b019(0xe7)]?_0x14b019(0x7b)===this[_0x14b019(0xf6)]?_0x14b019(0x68):'Try\x20changing\x20the\x20engine\x20type,\x20status,\x20or\x20search\x20filters\x20above.':_0x14b019(0x7b)===this[_0x14b019(0xf6)]?_0x14b019(0x8b):'Try\x20changing\x20the\x20engine\x20type,\x20status,\x20search,\x20or\x20source-type\x20filters.';},'typeLabel':{'embedder':_0x17e184(0xb6),'indexer':_0x17e184(0x82),'search':_0x17e184(0xee),'worker':_0x17e184(0xf9),'vector-search':_0x17e184(0xee),'embed-worker':_0x17e184(0xf9),'materializer':'Materializer','file-extractor':_0x17e184(0x91),'file-collection':_0x17e184(0x121),'file-extractor-worker':_0x17e184(0xf9),'processor':_0x17e184(0xa3),'queue-worker':_0x17e184(0x154)},'typeColor':{'embedder':_0x17e184(0xba),'indexer':_0x17e184(0x78),'vector-search':_0x17e184(0xa0),'embed-worker':_0x17e184(0xe9),'materializer':'#fb7185','file-extractor':_0x17e184(0x102),'file-collection':_0x17e184(0xc1),'file-extractor-worker':_0x17e184(0xe9),'processor':_0x17e184(0x105),'queue-worker':_0x17e184(0xdf)},'healthDot':_0x43374d=>_0x43374d&&0x0!==_0x43374d['length']?_0x43374d['every'](_0x3898bb=>_0x3898bb[_0x17e184(0x6d)])?'var(--okdb-success)':_0x43374d[_0x17e184(0xef)](_0x476397=>'error'===_0x476397[_0x17e184(0xcf)])?'var(--okdb-danger)':_0x17e184(0xe9):_0x17e184(0x139),'statusDot'(_0x5b8ac9){const _0x1a250b=_0x17e184;return _0x5b8ac9?this[_0x1a250b(0xa8)](_0x5b8ac9)?.[_0x1a250b(0xfa)]??_0x1a250b(0x139):_0x1a250b(0x139);},'typeName'(_0x1bd238){const _0x27e423=_0x17e184;return this[_0x27e423(0xf5)][_0x1bd238]||_0x1bd238||_0x27e423(0xd5);},'shortEngineName'(_0x61995d){const _0x2c2726=_0x17e184,_0x2122a6=String(_0x61995d?.['name']??_0x61995d?.[_0x2c2726(0x120)]??''),_0x17c486=_0x61995d?.[_0x2c2726(0xf1)]?.[_0x2c2726(0x94)]??_0x61995d?.['env']??_0x61995d?.['storeEnv']??'';return _0x17c486&&_0x2122a6['startsWith'](_0x17c486+':')?_0x2122a6[_0x2c2726(0x8e)](_0x17c486[_0x2c2726(0x142)]+0x1):_0x2122a6;},'showStatusText'(_0x8a58ad){const _0x275da5=_0x17e184,_0x53d7d1=this[_0x275da5(0xa8)](_0x8a58ad)?.[_0x275da5(0xc6)];return!!_0x53d7d1&&![_0x275da5(0xde),_0x275da5(0x67)]['includes'](_0x53d7d1);},'engineEnv':_0x1f962d=>_0x1f962d?_0x1f962d['config']?.[_0x17e184(0x94)]??_0x1f962d[_0x17e184(0x132)]??_0x1f962d[_0x17e184(0xed)]??_0x1f962d[_0x17e184(0x69)]??(_0x17e184(0x8d)===_0x1f962d[_0x17e184(0x96)]?_0x17e184(0xdc):null):null,'enginePipelineName':_0x329dc6=>_0x329dc6?.[_0x17e184(0x11c)]?.[_0x17e184(0xac)]??_0x329dc6?.[_0x17e184(0xf1)]?.[_0x17e184(0xac)]??_0x329dc6?.[_0x17e184(0xf1)]?.[_0x17e184(0x152)]??null,'engineInSelectedPipeline'(_0x987693){const _0x562d94=_0x17e184;if(!this['filterToSelectedPipeline']||!this['selectedPipelineName'])return!0x0;if(this[_0x562d94(0xa6)](_0x987693)===this[_0x562d94(0xce)])return!0x0;const _0x34147b=this[_0x562d94(0x88)][_0x562d94(0x106)](_0x5cba00=>this[_0x562d94(0x10f)](_0x5cba00)===this[_0x562d94(0xce)]||_0x5cba00?.[_0x562d94(0x147)]===this[_0x562d94(0xce)])??null;return!(!Array['isArray'](_0x34147b?.[_0x562d94(0x9b)])||0x0===_0x34147b['engines'][_0x562d94(0x142)])&&_0x34147b[_0x562d94(0x9b)][_0x562d94(0xef)](_0x266120=>_0x266120?.['type']===_0x987693?.[_0x562d94(0x96)]&&_0x266120?.['name']===_0x987693?.['name']);},'embedPipelineEngines':_0x18bb03=>Array[_0x17e184(0xfe)](_0x18bb03?.[_0x17e184(0x7a)]?.['engines'])&&_0x18bb03[_0x17e184(0x7a)][_0x17e184(0x9b)][_0x17e184(0x142)]>0x0?_0x18bb03[_0x17e184(0x7a)]['engines']:[_0x18bb03[_0x17e184(0x8d)],_0x18bb03['indexer'],_0x18bb03[_0x17e184(0x13e)],_0x18bb03[_0x17e184(0xaf)]][_0x17e184(0xdd)](Boolean),'pipelineRunningCount'(_0x353851){const _0x4e468e=_0x17e184;return this[_0x4e468e(0x146)](_0x353851)['filter'](_0x4eb235=>_0x4eb235?.[_0x4e468e(0x6d)])[_0x4e468e(0x142)];},'pipelineMemberCount'(_0x503905){const _0xd780f2=_0x17e184;return this[_0xd780f2(0x146)](_0x503905)[_0xd780f2(0x142)];},get 'groupedPipelineHeading'(){const _0x1886d7=_0x17e184;return this[_0x1886d7(0x88)][_0x1886d7(0x142)]>0x0?_0x1886d7(0x77):'Embedding\x20Pipelines';},'filePipelineEngines':_0x163c39=>[_0x163c39[_0x17e184(0x141)],..._0x163c39[_0x17e184(0x6e)],..._0x163c39[_0x17e184(0xa2)]],'pipelineIdentity':_0x222ba2=>_0x222ba2?.['record']?.[_0x17e184(0x147)]??_0x222ba2?.[_0x17e184(0x120)]??_0x222ba2?.[_0x17e184(0x147)]??null,'isSelectedPipeline'(_0x1ea287){const _0x5bff7e=_0x17e184,_0x1c822a=this[_0x5bff7e(0x10f)](_0x1ea287);return!!_0x1c822a&&_0x1c822a===this[_0x5bff7e(0xce)];},'togglePipeline'(_0x209214){const _0x37e95a=_0x17e184,_0x588ce2=this[_0x37e95a(0x10f)](_0x209214);_0x4a746b[_0x37e95a(0x14e)](_0x37e95a(0x135),{'name':this[_0x37e95a(0x13c)](_0x209214)?'':_0x588ce2??''});},'pipelineBusy'(_0x4e6d87){const _0x13a4e9=_0x17e184,_0x9f658d=this[_0x13a4e9(0x10f)](_0x4e6d87);return!(!_0x9f658d||!this['pipelineActionBusy'][_0x9f658d]);},async 'withPipelineBusy'(_0x54711d,_0x4ad592){const _0x4f854b=_0x17e184,_0x173a93=this[_0x4f854b(0x10f)](_0x54711d);if(_0x173a93&&!this['pipelineActionBusy'][_0x173a93]){this['pipelineActionBusy']={...this['pipelineActionBusy'],[_0x173a93]:!0x0};try{await _0x4ad592();}finally{this[_0x4f854b(0xb8)]={...this[_0x4f854b(0xb8)],[_0x173a93]:!0x1};}}},'selectedPipelineMembers'(_0x15599d){const _0x1192dd=_0x17e184;return Array['isArray'](_0x15599d?.[_0x1192dd(0x7a)]?.['engines'])&&_0x15599d[_0x1192dd(0x7a)][_0x1192dd(0x9b)][_0x1192dd(0x142)]?_0x15599d[_0x1192dd(0x7a)][_0x1192dd(0x9b)]:this['embedPipelineEngines'](_0x15599d);},'relatedType':_0x2b61f7=>_0x2b61f7?.[_0x17e184(0xf1)]?.[_0x17e184(0xa1)]??_0x2b61f7?.[_0x17e184(0x150)]?.[_0x17e184(0xa1)]??_0x2b61f7?.[_0x17e184(0x7c)]?.[_0x17e184(0xa1)]??_0x2b61f7?.[_0x17e184(0x7c)]?.[_0x17e184(0x144)]?.['source_type']??null,'relatedEnv':(_0x2d6290,_0x19ae9c=null)=>_0x2d6290?.[_0x17e184(0xf1)]?.[_0x17e184(0x94)]??_0x2d6290?.[_0x17e184(0x150)]?.[_0x17e184(0x94)]??_0x19ae9c??null,'memberOwnerEnv'(_0x208b38,_0x1742f4=null){const _0x1b0283=_0x17e184;return _0x208b38?.[_0x1b0283(0x69)]??_0x208b38?.[_0x1b0283(0x132)]??this['relatedEnv'](_0x208b38,_0x1742f4)??_0x1742f4??null;},'pipelineConfigMetrics'(_0x497fad){const _0x521b4e=_0x17e184,_0x750153=this[_0x521b4e(0x146)](_0x497fad),_0x23303c=[_0x521b4e(0x71),_0x521b4e(0x110),_0x521b4e(0xbb),_0x521b4e(0x80),_0x521b4e(0xc2),_0x521b4e(0x90),_0x521b4e(0x124),_0x521b4e(0x100),_0x521b4e(0xc4)],_0x3862cb=new Set(),_0x4a1a48=[];for(const _0x55bd5e of _0x23303c){for(const _0x474605 of _0x750153[_0x521b4e(0xb9)](_0x50b535=>_0x1e414a(_0x50b535))){const _0x2d4678=_0x474605[_0x521b4e(0xc6)]+':'+_0x474605[_0x521b4e(0xfd)];if(_0x474605[_0x521b4e(0xc6)]===_0x55bd5e&&!_0x3862cb[_0x521b4e(0x79)](_0x2d4678)){_0x3862cb['add'](_0x2d4678),_0x4a1a48[_0x521b4e(0xb2)](_0x474605);break;}}if(_0x4a1a48[_0x521b4e(0x142)]>=0x8)break;}return _0x4a1a48;},'pipelineHeaderMetrics'(_0x3b4777){const _0x123dc8=_0x17e184,_0x3e616e=new Map(this[_0x123dc8(0x8f)](_0x3b4777)[_0x123dc8(0x12d)](_0x11d340=>[_0x11d340['label'],_0x11d340[_0x123dc8(0xfd)]])),_0x11bc28=_0x3e616e['get']('Source'),_0x399349=_0x3e616e['get'](_0x123dc8(0x110)),_0x5c7ee1=[],_0x37b67d=(_0x5ca98a,_0x18d3f6)=>{null!=_0x18d3f6&&''!==_0x18d3f6&&_0x5c7ee1['push']({'label':_0x5ca98a,'value':String(_0x18d3f6)});};return _0x37b67d(_0x123dc8(0x71),_0x11bc28?_0x399349&&_0x123dc8(0x12a)!==_0x399349?_0x11bc28+'.'+_0x399349:_0x11bc28:null),_0x37b67d(_0x123dc8(0x103),_0x3e616e['get'](_0x123dc8(0xbb))),_0x37b67d(_0x123dc8(0x90),_0x3e616e['get'](_0x123dc8(0x90))),_0x37b67d(_0x123dc8(0x124),_0x3e616e[_0x123dc8(0x117)]('Model')),_0x37b67d(_0x123dc8(0x8a),_0x3e616e[_0x123dc8(0x117)](_0x123dc8(0xc4))),_0x37b67d(_0x123dc8(0xea),_0x3b4777?.[_0x123dc8(0x132)]??_0x3b4777?.[_0x123dc8(0x7a)]?.[_0x123dc8(0x132)]),_0x5c7ee1;},'pipelineProgressMetric'(_0xb86ba){const _0x38280e=_0x17e184,_0x12ecf9=this['embedPipelineEngines'](_0xb86ba)[_0x38280e(0x106)](_0x12489e=>_0x38280e(0x144)===_0x12489e?.[_0x38280e(0x96)]||_0x38280e(0x144)===_0x12489e?.['role'])??null,_0x375b71=_0x542d4b(_0x12ecf9)[_0x38280e(0x106)](_0x37804c=>'Progress'===_0x37804c?.[_0x38280e(0xc6)])??null;if(_0x375b71)return _0x375b71;const _0x448ebf=_0x12ecf9?.[_0x38280e(0xd1)]??_0x12ecf9?.['runtime']?.[_0x38280e(0xd1)]??null;if(null==_0x448ebf)return null;if(_0x38280e(0x87)==typeof _0x448ebf||_0x38280e(0x131)==typeof _0x448ebf)return{'label':_0x38280e(0xd4),'value':String(_0x448ebf),'tone':_0x38280e(0x14f)};if(_0x38280e(0xc5)==typeof _0x448ebf&&_0x38280e(0x87)==typeof _0x448ebf[_0x38280e(0x92)])return{'label':'Progress','value':_0x448ebf[_0x38280e(0x92)],'tone':_0x38280e(0x14f)};try{return{'label':_0x38280e(0xd4),'value':JSON['stringify'](_0x448ebf),'tone':_0x38280e(0x14f)};}catch{return{'label':_0x38280e(0xd4),'value':_0x38280e(0xd1),'tone':_0x38280e(0x14f)};}},async 'pipelineRequest'(_0x4f637e,_0x16026a,_0x1e9a7f){const _0x29c22d=_0x17e184,_0x19b03b=_0x4f637e?.[_0x29c22d(0x7a)]?.[_0x29c22d(0x147)]??_0x4f637e?.[_0x29c22d(0x120)]??null,_0x2f3c51=_0x4f637e?.[_0x29c22d(0x132)]??_0x4f637e?.[_0x29c22d(0x7a)]?.[_0x29c22d(0x132)]??_0x4a746b[_0x29c22d(0xe1)][_0x29c22d(0xe5)]['okdb']['selectedEnv']??'default';_0x19b03b&&await this[_0x29c22d(0x6c)](_0x4f637e,async()=>{const _0x14e491=_0x29c22d,_0x1443e7=_0x14e491(0x119)===_0x16026a?'':'/'+_0x1e9a7f,_0xc25b7d=await fetch(__ENV__[_0x14e491(0x143)]+_0x14e491(0x12e)+encodeURIComponent(_0x2f3c51)+_0x14e491(0xdb)+encodeURIComponent(_0x19b03b)+_0x1443e7,{'method':_0x16026a}),_0x5dc279=await _0xc25b7d['json']()['catch'](()=>({}));if(!_0xc25b7d['ok'])throw new Error(_0x5dc279?.[_0x14e491(0xc7)]?.['message']||(_0x1e9a7f||_0x14e491(0x138))+_0x14e491(0xd0));_0x4a746b[_0x14e491(0xe1)][_0x14e491(0xcd)]?.[_0x14e491(0x75)]?.['success']?.(_0x14e491(0x119)===_0x16026a?'Deleted\x20pipeline\x20\x22'+_0x19b03b+'\x22':('start'===_0x1e9a7f?_0x14e491(0x107):_0x14e491(0xeb))+_0x14e491(0x122)+_0x19b03b+'\x22'),_0x14e491(0x119)===_0x16026a&&_0x4a746b[_0x14e491(0x14e)](_0x14e491(0x135),{'name':''}),_0x4a746b['$dispatch']('refresh');});},async 'restartPipeline'(_0x4b876e){const _0x34969b=_0x17e184,_0x825104=_0x4b876e?.[_0x34969b(0x7a)]?.['name']??_0x4b876e?.[_0x34969b(0x120)]??null;_0x825104&&await _0x4a746b[_0x34969b(0xe1)][_0x34969b(0xcd)]?.[_0x34969b(0xbf)]?.[_0x34969b(0x14b)]?.(_0x34969b(0x11b)+_0x825104+_0x34969b(0x76))&&await this[_0x34969b(0x6c)](_0x4b876e,async()=>{const _0xd2b2ab=_0x34969b,_0xcf0faa=_0x4b876e?.['env']??_0x4b876e?.[_0xd2b2ab(0x7a)]?.[_0xd2b2ab(0x132)]??_0x4a746b['$ok'][_0xd2b2ab(0xe5)][_0xd2b2ab(0xb7)][_0xd2b2ab(0x9d)]??_0xd2b2ab(0xa9),_0x29717b=__ENV__['API']+_0xd2b2ab(0x12e)+encodeURIComponent(_0xcf0faa)+'/pipelines/'+encodeURIComponent(_0x825104),_0x3f37e1=await fetch(_0x29717b+_0xd2b2ab(0x104),{'method':_0xd2b2ab(0x10e)}),_0x46923a=await _0x3f37e1[_0xd2b2ab(0x10b)]()[_0xd2b2ab(0x118)](()=>({}));if(!_0x3f37e1['ok'])throw new Error(_0x46923a?.[_0xd2b2ab(0xc7)]?.['message']||_0xd2b2ab(0xfc));const _0x311e45=await fetch(_0x29717b+'/start',{'method':'POST'}),_0x10e03f=await _0x311e45[_0xd2b2ab(0x10b)]()['catch'](()=>({}));if(!_0x311e45['ok'])throw new Error(_0x10e03f?.[_0xd2b2ab(0xc7)]?.['message']||_0xd2b2ab(0xaa));_0x4a746b[_0xd2b2ab(0xe1)][_0xd2b2ab(0xcd)]?.[_0xd2b2ab(0x75)]?.[_0xd2b2ab(0xe8)]?.(_0xd2b2ab(0x11a)+_0x825104+'\x22'),_0x4a746b[_0xd2b2ab(0x14e)](_0xd2b2ab(0x149));});},'pipelineSourceType'(_0x2ed5de){const _0x1c5f99=_0x17e184,_0x3f4f40=this['embedPipelineEngines'](_0x2ed5de);for(const _0x433f17 of _0x3f4f40){const _0x4d1cde=_0x433f17?.[_0x1c5f99(0xf1)]?.[_0x1c5f99(0xa1)]??_0x433f17?.[_0x1c5f99(0x150)]?.[_0x1c5f99(0xa1)]??_0x433f17?.[_0x1c5f99(0xf1)]?.[_0x1c5f99(0x148)]??null;if(_0x4d1cde)return _0x4d1cde;}return null;},async 'startPipeline'(_0x2d3c58){const _0x246b39=_0x17e184;try{await this[_0x246b39(0x84)](_0x2d3c58,_0x246b39(0x10e),'start');}catch(_0x3fb953){_0x4a746b[_0x246b39(0xe1)][_0x246b39(0xcd)]?.['toast']?.['error']?.(_0x3fb953?.['message']||_0x246b39(0xaa));}},async 'stopPipeline'(_0x5d3cc8){const _0x22fc30=_0x17e184,_0x28d5d0=_0x5d3cc8?.[_0x22fc30(0x7a)]?.[_0x22fc30(0x147)]??_0x5d3cc8?.[_0x22fc30(0x120)]??null;if(_0x28d5d0&&await _0x4a746b['$ok'][_0x22fc30(0xcd)]?.[_0x22fc30(0xbf)]?.[_0x22fc30(0x14b)]?.(_0x22fc30(0x6b)+_0x28d5d0+_0x22fc30(0x76)))try{await this[_0x22fc30(0x84)](_0x5d3cc8,_0x22fc30(0x10e),_0x22fc30(0xe0));}catch(_0x36d7bd){_0x4a746b[_0x22fc30(0xe1)][_0x22fc30(0xcd)]?.['toast']?.[_0x22fc30(0xc7)]?.(_0x36d7bd?.['message']||_0x22fc30(0xfc));}},async 'deletePipeline'(_0x3db355){const _0x19a86e=_0x17e184,_0x19de68=_0x3db355?.[_0x19a86e(0x7a)]?.[_0x19a86e(0x147)]??_0x3db355?.[_0x19a86e(0x120)]??null;if(!_0x19de68)return;const _0x263d50=this[_0x19a86e(0xc0)](_0x3db355)['map'](_0x15ca33=>'•\x20'+(_0x15ca33?.['role']||_0x15ca33?.[_0x19a86e(0x96)])+':\x20'+_0x15ca33?.[_0x19a86e(0x96)]+'@'+_0x15ca33?.[_0x19a86e(0x147)])[_0x19a86e(0x7f)](_0x19a86e(0xbd));if(await _0x4a746b[_0x19a86e(0xe1)][_0x19a86e(0xcd)]?.['modal']?.[_0x19a86e(0x14b)]?.(_0x19a86e(0x97)+_0x19de68+_0x19a86e(0x9f)+(_0x263d50||'No\x20members')+'<br><br>Env-owned\x20members\x20will\x20be\x20removed;\x20shared\x20members\x20will\x20be\x20preserved.'))try{await this['pipelineRequest'](_0x3db355,_0x19a86e(0x119),null);}catch(_0x2d2475){_0x4a746b[_0x19a86e(0xe1)]['shared']?.[_0x19a86e(0x75)]?.['error']?.(_0x2d2475?.[_0x19a86e(0xa7)]||_0x19a86e(0x109));}},'pipelineActionStyle':(_0x3630ce=_0x17e184(0x14a))=>_0x17e184(0xb1)+_0x3630ce+_0x17e184(0xff)+_0x3630ce+_0x17e184(0xcc)+_0x3630ce+'12;cursor:pointer;line-height:1.4;white-space:nowrap;','typeName'(_0x381f5a){const _0x16add0=_0x17e184;return this['typeLabel'][_0x381f5a]||_0x381f5a||_0x16add0(0xd5);},'pipelineCardStyle'(_0x1bae2b){const _0x21bcad=_0x17e184;return'background:var(--okdb-app-surface);border:1px\x20solid\x20'+(this[_0x21bcad(0x13c)](_0x1bae2b)?_0x21bcad(0x72):'var(--okdb-app-border)')+_0x21bcad(0xa5);},async 'openEngineModal'(_0x2c2f51,_0x4acb8d=null){const _0x110b56=_0x17e184;if(!_0x2c2f51?.[_0x110b56(0x147)])return;const _0x172562=this[_0x110b56(0x66)](_0x2c2f51,_0x4acb8d)??(_0x4a746b[_0x110b56(0xe1)][_0x110b56(0xe5)][_0x110b56(0xb7)]['selectedEnv']||_0x110b56(0xa9));await _0x4a746b[_0x110b56(0xe1)]['shared'][_0x110b56(0xbf)]['open']({'owner':_0x4a746b,'title':_0x110b56(0x12b)+_0x2c2f51[_0x110b56(0x147)],'canDrag':!0x0,'content':_0x110b56(0x89),'context':_0x59d942=>({'modal':_0x59d942,'engine':_0x2c2f51,'envName':_0x172562})});},'openTypeMember'(_0x3cebe4,_0x176418=null){const _0x3cbaea=_0x17e184,_0x449f21=this[_0x3cbaea(0x155)](_0x3cebe4);if(!_0x449f21)return;const _0x479c4b=this['relatedEnv'](_0x3cebe4,_0x176418);_0x4a746b[_0x3cbaea(0x14e)](_0x3cbaea(0x145),{'type':_0x449f21,'env':_0x479c4b});},'engineMetricSearchParts':_0x41e372=>_0x542d4b(_0x41e372)[_0x17e184(0xb9)](_0x13be99=>[_0x13be99?.[_0x17e184(0xc6)],_0x13be99?.['value']]),'engineStatusMeta':_0x349685=>_0x5257b9(_0x349685),'lifecycleEnv'(_0x329ab9,_0x492665=null){const _0x2d1992=_0x17e184;return this['memberOwnerEnv'](_0x329ab9,_0x492665)??this[_0x2d1992(0xd3)](_0x329ab9)??_0x4a746b[_0x2d1992(0xe1)][_0x2d1992(0xe5)][_0x2d1992(0xb7)]['selectedEnv']??'default';},'metricToneColor'(_0x1cffbb=null){const _0x2591a9=_0x17e184;switch(_0x1cffbb?.[_0x2591a9(0xf3)]){case _0x2591a9(0xe8):return _0x2591a9(0x102);case _0x2591a9(0x115):return _0x2591a9(0xb4);case _0x2591a9(0x9e):return _0x2591a9(0xe9);case _0x2591a9(0x14f):return _0x2591a9(0xba);default:return'var(--okdb-app-fg)';}},'metricPreview':(_0x212b77=null)=>_0x212b77?.[_0x17e184(0xc6)]&&_0x212b77?.[_0x17e184(0xfd)]?_0x212b77[_0x17e184(0xc6)]+':\x20'+_0x212b77[_0x17e184(0xfd)]:'','requestRefresh'(){const _0x179a92=_0x17e184;_0x4a746b[_0x179a92(0x14e)](_0x179a92(0x149));},'goToType'(_0xbaf4a5){const _0x5ba96b=_0x17e184,_0x163039=_0x4a746b[_0x5ba96b(0x11d)][_0x5ba96b(0x10d)];_0x163039[_0x5ba96b(0xb2)](_0x163039[_0x5ba96b(0x83)]('/db',{'type':_0xbaf4a5,'tab':_0x5ba96b(0x7b)}));},'goToFiles'(_0x84b921){const _0x5c50e5=_0x17e184,_0x49406c=_0x4a746b[_0x5c50e5(0x11d)][_0x5c50e5(0x10d)];_0x49406c['push'](_0x49406c[_0x5c50e5(0x83)]('/files',{'collection':_0x84b921}));}}),'template':'\x0a<div\x20class=\x22eo-root\x22>\x0a\x0a\x20\x20<!--\x20──\x20Page\x20header\x20──\x20-->\x0a\x20\x20<div\x20class=\x22eo-header\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x20min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-title\x22>{{\x20headerTitle\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20<span\x20:title=\x22isEmbedded\x20?\x20\x27Use\x20the\x20inline\x20filters\x20above\x20to\x20scope\x20this\x20type-local\x20engines\x20view.\x27\x20:\x20\x27Use\x20the\x20left\x20sidebar\x20to\x20switch\x20mode\x20and\x20filter\x20by\x20type,\x20status,\x20search\x20text,\x20and\x20source\x20type.\x27\x22\x20style=\x22font-size:12px;\x20opacity:.3;\x20cursor:help;\x22>ⓘ</span>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22eo-stats\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20title=\x22Visible\x20results\x22\x20style=\x22color:var(--okdb-app-fg-muted);\x22><span\x20style=\x22opacity:.55;\x22>Visible:</span><span\x20style=\x22color:var(--okdb-app-fg);\x20margin-left:4px;\x22>{{\x20visibleItemCount\x20}}\x20/\x20{{\x20totalItemCount\x20}}</span></span>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-stat-sep\x22></span>\x0a\x20\x20\x20\x20\x20\x20<span\x20title=\x22Running\x20engines\x22\x20style=\x22color:var(--okdb-app-fg-muted);\x22><span\x20style=\x22opacity:.55;\x22>Running:</span><span\x20style=\x22color:var(--okdb-success);\x20margin-left:4px;\x22>{{\x20runningCount\x20}}</span></span>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22errorCount\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-stat-sep\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20title=\x22Engines\x20needing\x20attention\x22\x20style=\x22color:var(--okdb-app-fg-muted);\x22><span\x20style=\x22opacity:.55;\x22>Attention:</span><span\x20style=\x22color:var(--okdb-danger);\x20margin-left:4px;\x22>{{\x20errorCount\x20}}</span></span>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20──\x20No\x20engines\x20at\x20all\x20──\x20-->\x0a\x20\x20<if\x20:=\x22!hasAnyEngines\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22eo-alert\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-alert__title\x22>No\x20engines\x20configured</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-alert__body\x22>Create\x20a\x20pipeline\x20to\x20provision\x20engines,\x20then\x20return\x20here\x20to\x20inspect\x20and\x20manage\x20them.</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20No\x20filter\x20results\x20──\x20-->\x0a\x20\x20<if\x20:=\x22hasAnyEngines\x20&&\x20visibleItemCount\x20===\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22eo-alert\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-alert__title\x22>{{\x20noResultsLabel\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-alert__body\x22>{{\x20noResultsHint\x20}}</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Env\x20/\x20embedding\x20pipelines\x20──\x20-->\x0a\x20\x20<if\x20:=\x22filteredEmbedPipelines.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22eo-section\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-section__label\x22>{{\x20groupedPipelineHeading\x20}}\x20<span\x20class=\x22eo-count\x22>{{\x20filteredEmbedPipelines.length\x20}}</span></div>\x0a\x20\x20\x20\x20\x20\x20<each\x20:of=\x22filteredEmbedPipelines\x22\x20let:item=\x22g\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:style=\x22pipelineCardStyle(g)\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Pipeline\x20header\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-pipeline-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-health-dot\x22\x20:style=\x22\x27background:\x27\x20+\x20healthDot(embedPipelineEngines(g))\x20+\x20\x27;box-shadow:0\x200\x200\x203px\x20\x27\x20+\x20healthDot(embedPipelineEngines(g))\x20+\x20\x2720;\x27\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-pipeline-name\x22\x20:title=\x22g.name\x22>{{\x20g.name\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-pill\x22\x20:style=\x22g.type\x20===\x20\x27embed\x27\x20?\x20\x27border-color:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x2033%,\x20transparent);color:var(--okdb-indigo);background:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x207%,\x20transparent);\x27\x20:\x20\x27border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);color:var(--okdb-accent);background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x27\x22>{{\x20g.type\x20===\x20\x27file\x27\x20?\x20\x27Files\x27\x20:\x20g.type\x20===\x20\x27embed\x27\x20?\x20\x27Embedding\x27\x20:\x20\x27Env\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-run-count\x22\x20:title=\x22pipelineRunningCount(g)\x20+\x20\x27\x20running\x20of\x20\x27\x20+\x20pipelineMemberCount(g)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\x27\x20+\x20(pipelineRunningCount(g)\x20===\x20pipelineMemberCount(g)\x20&&\x20pipelineMemberCount(g)\x20>\x200\x20?\x20\x27var(--okdb-success)\x27\x20:\x20pipelineRunningCount(g)\x20>\x200\x20?\x20\x27var(--okdb-warning)\x27\x20:\x20\x27#374151\x27)\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20pipelineRunningCount(g)\x20}}/{{\x20pipelineMemberCount(g)\x20}}\x0a\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<span\x20class=\x22eo-spacer\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22pipelineSourceType(g)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openTypeMember(embedPipelineEngines(g).find(e\x20=>\x20e?.config?.source_type\x20||\x20e?.runtime?.source_type\x20||\x20e?.config?.target_type),\x20g.env)\x22\x20:disabled=\x22pipelineBusy(g)\x22\x20title=\x22Open\x20source\x20type\x20context\x22\x20class=\x22eo-btn\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x2033%,\x20transparent);color:var(--okdb-indigo);background:color-mix(in\x20srgb,\x20var(--okdb-indigo)\x207%,\x20transparent);\x22>↗\x20Type</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22pipelineRunningCount(g)\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22stopPipeline(g)\x22\x20:disabled=\x22pipelineBusy(g)\x22\x20title=\x22Stop\x20all\x20running\x20members\x22\x20class=\x22eo-btn\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-warning)\x2033%,\x20transparent);color:var(--okdb-warning);background:color-mix(in\x20srgb,\x20var(--okdb-warning)\x207%,\x20transparent);\x22>■\x20Stop</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22pipelineMemberCount(g)\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22restartPipeline(g)\x22\x20:disabled=\x22pipelineBusy(g)\x22\x20title=\x22Restart\x20all\x20members\x20(stop\x20then\x20start)\x22\x20class=\x22eo-btn\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-orange)\x2033%,\x20transparent);color:var(--okdb-orange);background:color-mix(in\x20srgb,\x20var(--okdb-orange)\x207%,\x20transparent);\x22>↺\x20Restart</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22pipelineRunningCount(g)\x20<\x20pipelineMemberCount(g)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22startPipeline(g)\x22\x20:disabled=\x22pipelineBusy(g)\x22\x20title=\x22Start\x20every\x20runnable\x20member\x22\x20class=\x22eo-btn\x22\x20:style=\x22pipelineActionStyle(\x27var(--okdb-success)\x27)\x22>▶\x20Start</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22togglePipeline(g)\x22\x20:title=\x22isSelectedPipeline(g)\x20?\x20\x27Collapse\x27\x20:\x20\x27Expand\x20members\x27\x22\x20class=\x22eo-btn\x20eo-btn--toggle\x22>Members\x20{{\x20isSelectedPipeline(g)\x20?\x20\x27▴\x27\x20:\x20\x27▾\x27\x20}}</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Config\x20metrics\x20row\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22pipelineHeaderMetrics(g).length\x20>\x200\x20||\x20pipelineProgressMetric(g)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-pipeline-metrics\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22pipelineHeaderMetrics(g)\x22\x20let:item=\x22metric\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-kv\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-kv__label\x22>{{\x20metric.label\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-kv__val\x22>{{\x20metric.value\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22pipelineProgressMetric(g)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-kv\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-kv__label\x22>Progress</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-kv__val\x22\x20:style=\x22\x27color:\x27\x20+\x20metricToneColor(pipelineProgressMetric(g))\x22>{{\x20pipelineProgressMetric(g).value\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</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<!--\x20Inline\x20member\x20chip\x20strip\x20(always\x20visible\x20when\x20collapsed)\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!isSelectedPipeline(g)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-chip-strip\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22embedPipelineEngines(g)\x22\x20let:item=\x22eng\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-chip\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\x27\x20+\x20statusDot(eng)\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27color:\x27\x20+\x20(typeColor[eng.role\x20||\x20eng.type]\x20??\x20\x27var(--okdb-app-fg-muted)\x27)\x22>{{\x20typeName(eng.role\x20||\x20eng.type)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-chip__name\x22>{{\x20shortEngineName(eng)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22showStatusText(eng)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27color:\x27\x20+\x20engineStatusMeta(eng).color\x20+\x20\x27;opacity:.8;\x27\x22>{{\x20engineStatusMeta(eng).label\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</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</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Expanded\x20accordion:\x20full\x20engine-resource-card\x20members\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22isSelectedPipeline(g)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-accordion\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22selectedPipelineMembers(g)\x22\x20let:item=\x22member\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<engine-resource-card\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:engine=\x22member\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:env=\x22lifecycleEnv(member,\x20g.env)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:pipeline=\x22pipelineIdentity(g)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:hidepipeline=\x22true\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20hidetype=\x22true\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20hideenv=\x22true\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20variant=\x22member\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:showdelete=\x22false\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@refresh=\x22requestRefresh()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@edit=\x22openEngineModal($event.detail,\x20g.env)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@type-context=\x22openTypeMember($event.detail.engine,\x20g.env)\x22\x0a\x20\x20\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</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Footer:\x20destructive\x20action\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-accordion-footer\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22deletePipeline(g)\x22\x20:disabled=\x22pipelineBusy(g)\x22\x20title=\x22Delete\x20the\x20pipeline\x20record\x20and\x20env-owned\x20members\x22\x20class=\x22eo-btn\x20eo-btn--danger\x22>🗑\x20Delete\x20pipeline</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</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</each>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20File\x20Pipelines\x20──\x20-->\x0a\x20\x20<if\x20:=\x22filteredFilePipelines.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22eo-section\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-section__label\x22>File\x20Pipelines\x20<span\x20class=\x22eo-count\x22>{{\x20filteredFilePipelines.length\x20}}</span></div>\x0a\x20\x20\x20\x20\x20\x20<each\x20:of=\x22filteredFilePipelines\x22\x20let:item=\x22g\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-pipeline-card\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Pipeline\x20header\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-pipeline-header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-health-dot\x22\x20:style=\x22\x27background:\x27\x20+\x20healthDot(filePipelineEngines(g))\x20+\x20\x27;box-shadow:0\x200\x200\x203px\x20\x27\x20+\x20healthDot(filePipelineEngines(g))\x20+\x20\x2720;\x27\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-pipeline-name\x22\x20:title=\x22g.name\x22>{{\x20g.name\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-pill\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-sky)\x2033%,\x20transparent);color:var(--okdb-sky);background:color-mix(in\x20srgb,\x20var(--okdb-sky)\x207%,\x20transparent);\x22>Files</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-run-count\x22\x20:title=\x22filePipelineEngines(g).filter(e\x20=>\x20e.isRunning).length\x20+\x20\x27\x20running\x20of\x20\x27\x20+\x20filePipelineEngines(g).length\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\x27\x20+\x20(filePipelineEngines(g).every(e\x20=>\x20e.isRunning)\x20&&\x20filePipelineEngines(g).length\x20>\x200\x20?\x20\x27var(--okdb-success)\x27\x20:\x20filePipelineEngines(g).some(e\x20=>\x20e.isRunning)\x20?\x20\x27var(--okdb-warning)\x27\x20:\x20\x27#374151\x27)\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20filePipelineEngines(g).filter(e\x20=>\x20e.isRunning).length\x20}}/{{\x20filePipelineEngines(g).length\x20}}\x0a\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<span\x20class=\x22eo-spacer\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22goToFiles(g.name)\x22\x20title=\x22Open\x20the\x20file\x20collection\x20context\x22\x20class=\x22eo-btn\x22\x20style=\x22border-color:color-mix(in\x20srgb,\x20var(--okdb-sky)\x2033%,\x20transparent);color:var(--okdb-sky);background:color-mix(in\x20srgb,\x20var(--okdb-sky)\x207%,\x20transparent);\x22>↗\x20Open</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Engine\x20chip\x20strip\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-chip-strip\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-chip\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\x27\x20+\x20statusDot(g.collection)\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27color:\x27\x20+\x20(typeColor[g.collection.type]\x20??\x20\x27var(--okdb-sky)\x27)\x22>{{\x20typeLabel[g.collection.type]\x20??\x20\x27Collection\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-chip__name\x22>{{\x20g.collection.name\x20}}</span>\x0a\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<each\x20:of=\x22g.extractors\x22\x20let:item=\x22ext\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-chip\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\x27\x20+\x20statusDot(ext)\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-success);\x22>Extractor</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-chip__name\x22>{{\x20ext.name\x20}}</span>\x0a\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</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22g.workers\x22\x20let:item=\x22w\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-chip\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\x27\x20+\x20statusDot(w)\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-warning);\x22>Worker</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22eo-chip__name\x22>{{\x20w.name\x20}}</span>\x0a\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</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Engines\x20(engine\x20mode)\x20──\x20-->\x0a\x20\x20<if\x20:=\x22modeFilter\x20===\x20\x27engines\x27\x20&&\x20visibleEngines.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22eo-section\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22eo-section__label\x22>Engines\x20<span\x20class=\x22eo-count\x22>{{\x20visibleEngines.length\x20}}</span></div>\x0a\x20\x20\x20\x20\x20\x20<each\x20:of=\x22visibleEngineGroups\x22\x20let:item=\x22group\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22group.engines\x22\x20let:item=\x22eng\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<engine-resource-card\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:engine=\x22eng\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:env=\x22lifecycleEnv(eng)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:pipeline=\x22enginePipelineName(eng)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20variant=\x22card\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:showdelete=\x22false\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@refresh=\x22requestRefresh()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@edit=\x22openEngineModal($event.detail,\x20engineEnv($event.detail))\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@type-context=\x22goToType($event.detail.type)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a</div>','style':_0x17e184(0x6f)};
1
+ import e from"../../engines/modals/engine-modal.ok.js";import n from"../../engines/parts/engine-resource-card.ok.js";import{compactEngineConfigMetrics as i,compactEngineRowMetrics as t,compactEngineStatusMeta as r}from"../../engines/engine-ui-utils.js";export default{tag:"engines-overview",dependencies:[e,n],attr:{embedEngines:{},embedPipelines:{},fileEngines:{},embedded:{},filterpipeline:{},mode:{},pipelinetype:{},enginetype:{},status:{},search:{},sourcetype:{},selectedpipeline:{}},context:e=>({get allEmbed(){return e.$attr.embedEngines??[]},get pipelineRecords(){return e.$attr.embedPipelines??[]},get fileData(){return e.$attr.fileEngines??{}},get allFile(){const e=this.fileData;return[...e.extractors??[],...e.collections??[],...e.workers??[]]},get isEmbedded(){return!0===e.$attr.embedded||"true"===e.$attr.embedded},get filterToSelectedPipeline(){return!0===e.$attr.filterpipeline||"true"===e.$attr.filterpipeline},get modeFilter(){return"engines"===e.$attr.mode?"engines":"pipelines"},get pipelineTypeFilter(){return["all","embedding","file"].includes(e.$attr.pipelinetype)?e.$attr.pipelinetype:"all"},get engineTypeFilter(){return String(e.$attr.enginetype??"").trim()},get statusFilter(){return e.$attr.status??"all"},get searchFilter(){return String(e.$attr.search??"").trim().toLowerCase()},get sourceTypeFilter(){return String(e.$attr.sourcetype??"").trim()},get selectedPipelineName(){return String(e.$attr.selectedpipeline??"").trim()},pipelineActionBusy:{},get embedOnly(){return(e.$attr.embedEngines??[]).filter(e=>"processor"!==e.type&&"queue-worker"!==e.type)},get allEngines(){return[...this.allEmbed,...this.allFile]},engineId:e=>e?e.key??(e.type&&e.name?`${e.type}@${e.name}`:e.name??null):null,engineSourceTypes(e){const n=[e?.config?.source_type,e?.runtime?.source_type,e?.config?.target_type,e?.runtime?.target_type].filter(Boolean);return[...new Set(n)]},touchesSourceType(e){return!this.sourceTypeFilter||this.engineSourceTypes(e).includes(this.sourceTypeFilter)},engineStatusBucket(e){const n=e?.stats?.state??e?.status??null;return e?.isRunning||"online"===n?"running":["error","inactive","paused","building","degraded"].includes(n)?"attention":"stopped"},groupStatusBucket(e){const n=e.map(e=>this.engineStatusBucket(e));return 0===n.length?"stopped":n.every(e=>"running"===e)?"running":n.some(e=>"attention"===e)||n.some(e=>"running"===e)?"attention":"stopped"},matchesSearch(e=[]){return!this.searchFilter||e.filter(Boolean).join(" ").toLowerCase().includes(this.searchFilter)},pipelineTypeMatches(e){return"all"===this.pipelineTypeFilter||this.pipelineTypeFilter===e},get embedPipelines(){if(this.pipelineRecords.length>0)return this.pipelineRecords.map(e=>{const n=Array.isArray(e.engines)?e.engines.filter(Boolean):[],i=n.find(e=>this.engineEnv(e))??null,t=n.find(e=>"embedder"===e.role||"embedder"===e.type)??null,r=n.find(e=>"indexer"===e.role||"indexer"===e.type)??null,s=n.find(e=>"search"===e.role||"vector-search"===e.type)??null,o=n.find(e=>"worker"===e.role||"embed-worker"===e.type)??null;return{name:e.meta?.label??e.meta?.pipeline??e.name,key:e.name,env:e.env??this.engineEnv(i)??r?.config?.source_env??s?.config?.source_env??null,type:"embeddings"===e.meta?.family?"embed":"env",record:e,members:n,embedder:t,indexer:r,search:s,worker:o}}).filter(e=>e.members.length>0).sort((e,n)=>e.name.localeCompare(n.name));const e=new Map;for(const n of this.embedOnly){const i=n.meta?.pipeline??n.name.replace(/-worker$/,"");e.has(i)||e.set(i,{name:i,type:"embed",embedder:null,indexer:null,search:null,worker:null});const t=e.get(i);"embedder"===n.type?t.embedder=n:"indexer"===n.type?t.indexer=n:"vector-search"===n.type?t.search=n:"embed-worker"===n.type&&(t.worker=n)}return[...e.values()].filter(e=>[e.embedder,e.indexer,e.search,e.worker].filter(Boolean).length>1).sort((e,n)=>e.name.localeCompare(n.name))},get filePipelines(){return(this.fileData.collections??[]).map(e=>{const n=(this.fileData.extractors??[]).filter(n=>e.config?.pipeline?.includes(n.name)),i=(this.fileData.workers??[]).filter(n=>n.config?.collectionEngine===e.name);return{name:e.collection??e.name,type:"file",collection:e,extractors:n,workers:i}}).sort((e,n)=>e.name.localeCompare(n.name))},get allUniqueEngines(){const e=new Set;return this.allEngines.filter(n=>{const i=this.engineId(n);return!(!i||e.has(i)||(e.add(i),0))})},get visibleEngines(){return this.allUniqueEngines.filter(e=>this.engineInSelectedPipeline(e)).filter(e=>!this.engineTypeFilter||e.type===this.engineTypeFilter).filter(e=>"all"===this.statusFilter||this.engineStatusBucket(e)===this.statusFilter).filter(e=>this.touchesSourceType(e)).filter(e=>this.matchesSearch([e?.name,e?.type,e?.meta?.pipeline,e?.env,e?._uiEnv,...this.engineMetricSearchParts(e),...this.engineSourceTypes(e),e?.config?.job_type,e?.config?.handler?.name])).sort((e,n)=>String(e.type||"").localeCompare(String(n.type||""))||String(e.name||"").localeCompare(String(n.name||"")))},get visibleEngineGroups(){const e=new Map,n={key:"__standalone__",label:"Standalone",pipeline:null,engines:[]};for(const i of this.visibleEngines){const t=this.enginePipelineName(i);t?(e.has(t)||e.set(t,{key:t,label:String(t).split(":").pop(),pipeline:t,engines:[]}),e.get(t).engines.push(i)):n.engines.push(i)}const i=[...e.values()].sort((e,n)=>e.label.localeCompare(n.label));return n.engines.length&&i.push(n),i},matchesGroup(e,n,i,t=[]){return("all"===this.statusFilter||this.groupStatusBucket(i)===this.statusFilter)&&!(this.sourceTypeFilter&&!i.some(e=>this.touchesSourceType(e)))&&this.matchesSearch([e?.name,e?.type,e?.env,...t,...i.flatMap(e=>[e?.name,e?.type,...this.engineSourceTypes(e),e?.config?.job_type,e?.config?.handler?.name])])},get filteredEmbedPipelines(){return"pipelines"!==this.modeFilter?[]:this.pipelineTypeMatches("embedding")?this.embedPipelines.filter(e=>(!this.filterToSelectedPipeline||!this.selectedPipelineName||this.pipelineIdentity(e)===this.selectedPipelineName)&&this.matchesGroup(e,"embedding",this.embedPipelineEngines(e),[e?.record?.meta?.family])):[]},get filteredFilePipelines(){return"pipelines"!==this.modeFilter?[]:this.pipelineTypeMatches("file")?this.filePipelines.filter(e=>this.matchesGroup(e,"file",this.filePipelineEngines(e),[e?.collection?.collection])):[]},get filteredPipelineCount(){return this.filteredEmbedPipelines.length+this.filteredFilePipelines.length},get filteredVisibleEngines(){if("pipelines"!==this.modeFilter)return[];const e=new Set,n=[];for(const i of this.filteredEmbedPipelines)for(const t of this.embedPipelineEngines(i)){const i=this.engineId(t);i&&!e.has(i)&&(e.add(i),n.push(t))}for(const i of this.filteredFilePipelines)for(const t of this.filePipelineEngines(i)){const i=this.engineId(t);i&&!e.has(i)&&(e.add(i),n.push(t))}return n},get totalPipelineCount(){return this.embedPipelines.length+this.filePipelines.length},get totalEngineCount(){return this.allUniqueEngines.length},get visibleItemCount(){return"pipelines"===this.modeFilter?this.filteredPipelineCount:this.visibleEngines.length},get totalItemCount(){return"pipelines"===this.modeFilter?this.totalPipelineCount:this.totalEngineCount},get activeEngines(){return"pipelines"===this.modeFilter?this.filteredVisibleEngines:this.visibleEngines},get hasAnyEngines(){return this.allEngines.length>0},get runningCount(){return this.activeEngines.filter(e=>"running"===this.engineStatusBucket(e)).length},get errorCount(){return this.activeEngines.filter(e=>"attention"===this.engineStatusBucket(e)).length},get headerTitle(){return"pipelines"===this.modeFilter?"Pipelines":"Engines"},get noResultsLabel(){return"pipelines"===this.modeFilter?"No pipelines match the current filters":"No engines match the current filters"},get noResultsHint(){return this.isEmbedded?"pipelines"===this.modeFilter?"Try changing the selected pipeline, status, or search filters above.":"Try changing the engine type, status, or search filters above.":"pipelines"===this.modeFilter?"Try changing the pipeline type, status, search, or source-type filters.":"Try changing the engine type, status, search, or source-type filters."},typeLabel:{embedder:"Embedder",indexer:"Indexer",search:"Search",worker:"Worker","vector-search":"Search","embed-worker":"Worker",materializer:"Materializer","file-extractor":"Extractor","file-collection":"Collection","file-extractor-worker":"Worker",processor:"Processor","queue-worker":"Queue Worker"},typeColor:{embedder:"var(--okdb-info)",indexer:"var(--okdb-purple)","vector-search":"var(--okdb-accent)","embed-worker":"var(--okdb-warning)",materializer:"#fb7185","file-extractor":"var(--okdb-success)","file-collection":"var(--okdb-sky)","file-extractor-worker":"var(--okdb-warning)",processor:"var(--okdb-orange)","queue-worker":"var(--okdb-indigo)"},healthDot:e=>e&&0!==e.length?e.every(e=>e.isRunning)?"var(--okdb-success)":e.some(e=>"error"===e.status)?"var(--okdb-danger)":"var(--okdb-warning)":"var(--okdb-app-fg-muted)",statusDot(e){return e?this.engineStatusMeta(e)?.color??"var(--okdb-app-fg-muted)":"var(--okdb-app-fg-muted)"},typeName(e){return this.typeLabel[e]||e||"Engine"},shortEngineName(e){const n=String(e?.name??e?.key??""),i=e?.config?.source_env??e?.env??e?.storeEnv??"";return i&&n.startsWith(`${i}:`)?n.slice(i.length+1):n},showStatusText(e){const n=this.engineStatusMeta(e)?.label;return!!n&&!["running","online"].includes(n)},engineEnv:e=>e?e.config?.source_env??e.env??e._uiEnv??e.storeEnv??("embedder"===e.type?"~system":null):null,enginePipelineName:e=>e?.meta?.pipeline??e?.config?.pipeline??e?.config?.collectionEngine??null,engineInSelectedPipeline(e){if(!this.filterToSelectedPipeline||!this.selectedPipelineName)return!0;if(this.enginePipelineName(e)===this.selectedPipelineName)return!0;const n=this.pipelineRecords.find(e=>this.pipelineIdentity(e)===this.selectedPipelineName||e?.name===this.selectedPipelineName)??null;return!(!Array.isArray(n?.engines)||0===n.engines.length)&&n.engines.some(n=>n?.type===e?.type&&n?.name===e?.name)},embedPipelineEngines:e=>Array.isArray(e?.record?.engines)&&e.record.engines.length>0?e.record.engines:[e.embedder,e.indexer,e.worker,e.search].filter(Boolean),pipelineRunningCount(e){return this.embedPipelineEngines(e).filter(e=>e?.isRunning).length},pipelineMemberCount(e){return this.embedPipelineEngines(e).length},get groupedPipelineHeading(){return this.pipelineRecords.length>0?"Env Pipelines":"Embedding Pipelines"},filePipelineEngines:e=>[e.collection,...e.extractors,...e.workers],pipelineIdentity:e=>e?.record?.name??e?.key??e?.name??null,isSelectedPipeline(e){const n=this.pipelineIdentity(e);return!!n&&n===this.selectedPipelineName},togglePipeline(n){const i=this.pipelineIdentity(n);e.$dispatch("select",{name:this.isSelectedPipeline(n)?"":i??""})},pipelineBusy(e){const n=this.pipelineIdentity(e);return!(!n||!this.pipelineActionBusy[n])},async withPipelineBusy(e,n){const i=this.pipelineIdentity(e);if(i&&!this.pipelineActionBusy[i]){this.pipelineActionBusy={...this.pipelineActionBusy,[i]:!0};try{await n()}finally{this.pipelineActionBusy={...this.pipelineActionBusy,[i]:!1}}}},selectedPipelineMembers(e){return Array.isArray(e?.record?.engines)&&e.record.engines.length?e.record.engines:this.embedPipelineEngines(e)},relatedType:e=>e?.config?.source_type??e?.runtime?.source_type??e?.stats?.source_type??e?.stats?.indexer?.source_type??null,relatedEnv:(e,n=null)=>e?.config?.source_env??e?.runtime?.source_env??n??null,memberOwnerEnv(e,n=null){return e?.storeEnv??e?.env??this.relatedEnv(e,n)??n??null},pipelineConfigMetrics(e){const n=this.embedPipelineEngines(e),t=["Source","Field","Mode","Prepare","Chunk","Algorithm","Model","Provider","Concurrency"],r=new Set,s=[];for(const e of t){for(const t of n.flatMap(e=>i(e))){const n=`${t.label}:${t.value}`;if(t.label===e&&!r.has(n)){r.add(n),s.push(t);break}}if(s.length>=8)break}return s},pipelineHeaderMetrics(e){const n=new Map(this.pipelineConfigMetrics(e).map(e=>[e.label,e.value])),i=n.get("Source"),t=n.get("Field"),r=[],s=(e,n)=>{null!=n&&""!==n&&r.push({label:e,value:String(n)})};return s("Source",i?t&&"whole record"!==t?`${i}.${t}`:i:null),s("Queue",n.get("Mode")),s("Algorithm",n.get("Algorithm")),s("Model",n.get("Model")),s("Workers",n.get("Concurrency")),s("Environment",e?.env??e?.record?.env),r},pipelineProgressMetric(e){const n=this.embedPipelineEngines(e).find(e=>"indexer"===e?.type||"indexer"===e?.role)??null,i=t(n).find(e=>"Progress"===e?.label)??null;if(i)return i;const r=n?.progress??n?.runtime?.progress??null;if(null==r)return null;if("string"==typeof r||"number"==typeof r)return{label:"Progress",value:String(r),tone:"accent"};if("object"==typeof r&&"string"==typeof r.phase)return{label:"Progress",value:r.phase,tone:"accent"};try{return{label:"Progress",value:JSON.stringify(r),tone:"accent"}}catch{return{label:"Progress",value:"progress",tone:"accent"}}},async pipelineRequest(n,i,t){const r=n?.record?.name??n?.key??null,s=n?.env??n?.record?.env??e.$ok.stores.okdb.selectedEnv??"default";r&&await this.withPipelineBusy(n,async()=>{const n="DELETE"===i?"":`/${t}`,o=await fetch(`${__ENV__.API}/env/${encodeURIComponent(s)}/pipelines/${encodeURIComponent(r)}${n}`,{method:i}),l=await o.json().catch(()=>({}));if(!o.ok)throw new Error(l?.error?.message||`${t||"request"} failed`);e.$ok.shared?.toast?.success?.("DELETE"===i?`Deleted pipeline "${r}"`:`${"start"===t?"Started":"Stopped"} pipeline "${r}"`),"DELETE"===i&&e.$dispatch("select",{name:""}),e.$dispatch("refresh")})},async restartPipeline(n){const i=n?.record?.name??n?.key??null;i&&await(e.$ok.shared?.modal?.confirm?.(`Restart pipeline "<b>${i}</b>"?`))&&await this.withPipelineBusy(n,async()=>{const t=n?.env??n?.record?.env??e.$ok.stores.okdb.selectedEnv??"default",r=`${__ENV__.API}/env/${encodeURIComponent(t)}/pipelines/${encodeURIComponent(i)}`,s=await fetch(`${r}/stop`,{method:"POST"}),o=await s.json().catch(()=>({}));if(!s.ok)throw new Error(o?.error?.message||"Stop failed");const l=await fetch(`${r}/start`,{method:"POST"}),a=await l.json().catch(()=>({}));if(!l.ok)throw new Error(a?.error?.message||"Start failed");e.$ok.shared?.toast?.success?.(`Restarted pipeline "${i}"`),e.$dispatch("refresh")})},pipelineSourceType(e){const n=this.embedPipelineEngines(e);for(const e of n){const n=e?.config?.source_type??e?.runtime?.source_type??e?.config?.target_type??null;if(n)return n}return null},async startPipeline(n){try{await this.pipelineRequest(n,"POST","start")}catch(n){e.$ok.shared?.toast?.error?.(n?.message||"Start failed")}},async stopPipeline(n){const i=n?.record?.name??n?.key??null;if(i&&await(e.$ok.shared?.modal?.confirm?.(`Stop pipeline "<b>${i}</b>"?`)))try{await this.pipelineRequest(n,"POST","stop")}catch(n){e.$ok.shared?.toast?.error?.(n?.message||"Stop failed")}},async deletePipeline(n){const i=n?.record?.name??n?.key??null;if(!i)return;const t=this.selectedPipelineMembers(n).map(e=>`• ${e?.role||e?.type}: ${e?.type}@${e?.name}`).join("<br>");if(await(e.$ok.shared?.modal?.confirm?.(`Delete pipeline "<b>${i}</b>"?<br><br>${t||"No members"}<br><br>Env-owned members will be removed; shared members will be preserved.`)))try{await this.pipelineRequest(n,"DELETE",null)}catch(n){e.$ok.shared?.toast?.error?.(n?.message||"Delete failed")}},pipelineActionStyle:(e="#94a3b8")=>`font-size:11px;padding:3px 10px;border-radius:999px;border:1px solid ${e}55;color:${e};background:${e}12;cursor:pointer;line-height:1.4;white-space:nowrap;`,typeName(e){return this.typeLabel[e]||e||"Engine"},pipelineCardStyle(e){return`background:var(--okdb-app-surface);border:1px solid ${this.isSelectedPipeline(e)?"color-mix(in srgb, var(--okdb-accent) 33%, transparent)":"var(--okdb-app-border)"};border-radius:10px;overflow:hidden;transition:border-color .14s;`},async openEngineModal(n,i=null){if(!n?.name)return;const t=this.memberOwnerEnv(n,i)??(e.$ok.stores.okdb.selectedEnv||"default");await e.$ok.shared.modal.open({owner:e,title:`Edit Engine · ${n.name}`,canDrag:!0,content:'<engine-modal :modal="modal" :engine="engine" :env="envName" />',context:e=>({modal:e,engine:n,envName:t})})},openTypeMember(n,i=null){const t=this.relatedType(n);if(!t)return;const r=this.relatedEnv(n,i);e.$dispatch("goto-type",{type:t,env:r})},engineMetricSearchParts:e=>t(e).flatMap(e=>[e?.label,e?.value]),engineStatusMeta:e=>r(e),lifecycleEnv(n,i=null){return this.memberOwnerEnv(n,i)??this.engineEnv(n)??e.$ok.stores.okdb.selectedEnv??"default"},metricToneColor(e=null){switch(e?.tone){case"success":return"var(--okdb-success)";case"danger":return"var(--okdb-danger)";case"warning":return"var(--okdb-warning)";case"accent":return"var(--okdb-info)";default:return"var(--okdb-app-fg)"}},metricPreview:(e=null)=>e?.label&&e?.value?`${e.label}: ${e.value}`:"",requestRefresh(){e.$dispatch("refresh")},goToType(n){const i=e.$vars.$router;i.push(i.resolve("/db",{type:n,tab:"pipelines"}))},goToFiles(n){const i=e.$vars.$router;i.push(i.resolve("/files",{collection:n}))}}),template:'\n<div class="eo-root">\n\n \x3c!-- ── Page header ── --\x3e\n <div class="eo-header">\n <div style="display:flex; align-items:center; gap:8px; min-width:0;">\n <div class="eo-title">{{ headerTitle }}</div>\n <span :title="isEmbedded ? \'Use the inline filters above to scope this type-local engines view.\' : \'Use the left sidebar to switch mode and filter by type, status, search text, and source type.\'" style="font-size:12px; opacity:.3; cursor:help;">ⓘ</span>\n </div>\n <div class="eo-stats">\n <span title="Visible results" style="color:var(--okdb-app-fg-muted);"><span style="opacity:.55;">Visible:</span><span style="color:var(--okdb-app-fg); margin-left:4px;">{{ visibleItemCount }} / {{ totalItemCount }}</span></span>\n <span class="eo-stat-sep"></span>\n <span title="Running engines" style="color:var(--okdb-app-fg-muted);"><span style="opacity:.55;">Running:</span><span style="color:var(--okdb-success); margin-left:4px;">{{ runningCount }}</span></span>\n <if :="errorCount > 0">\n <span class="eo-stat-sep"></span>\n <span title="Engines needing attention" style="color:var(--okdb-app-fg-muted);"><span style="opacity:.55;">Attention:</span><span style="color:var(--okdb-danger); margin-left:4px;">{{ errorCount }}</span></span>\n </if>\n </div>\n </div>\n\n \x3c!-- ── No engines at all ── --\x3e\n <if :="!hasAnyEngines">\n <div class="eo-alert">\n <div class="eo-alert__title">No engines configured</div>\n <div class="eo-alert__body">Create a pipeline to provision engines, then return here to inspect and manage them.</div>\n </div>\n </if>\n\n \x3c!-- ── No filter results ── --\x3e\n <if :="hasAnyEngines && visibleItemCount === 0">\n <div class="eo-alert">\n <div class="eo-alert__title">{{ noResultsLabel }}</div>\n <div class="eo-alert__body">{{ noResultsHint }}</div>\n </div>\n </if>\n\n \x3c!-- ── Env / embedding pipelines ── --\x3e\n <if :="filteredEmbedPipelines.length > 0">\n <div class="eo-section">\n <div class="eo-section__label">{{ groupedPipelineHeading }} <span class="eo-count">{{ filteredEmbedPipelines.length }}</span></div>\n <each :of="filteredEmbedPipelines" let:item="g">\n <div :style="pipelineCardStyle(g)">\n\n \x3c!-- Pipeline header --\x3e\n <div class="eo-pipeline-header">\n <span class="eo-health-dot" :style="\'background:\' + healthDot(embedPipelineEngines(g)) + \';box-shadow:0 0 0 3px \' + healthDot(embedPipelineEngines(g)) + \'20;\'"></span>\n <span class="eo-pipeline-name" :title="g.name">{{ g.name }}</span>\n <span class="eo-pill" :style="g.type === \'embed\' ? \'border-color:color-mix(in srgb, var(--okdb-indigo) 33%, transparent);color:var(--okdb-indigo);background:color-mix(in srgb, var(--okdb-indigo) 7%, transparent);\' : \'border-color:color-mix(in srgb, var(--okdb-accent) 33%, transparent);color:var(--okdb-accent);background:color-mix(in srgb, var(--okdb-accent) 7%, transparent);\'">{{ g.type === \'file\' ? \'Files\' : g.type === \'embed\' ? \'Embedding\' : \'Env\' }}</span>\n <span class="eo-run-count" :title="pipelineRunningCount(g) + \' running of \' + pipelineMemberCount(g)">\n <span :style="\'width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\' + (pipelineRunningCount(g) === pipelineMemberCount(g) && pipelineMemberCount(g) > 0 ? \'var(--okdb-success)\' : pipelineRunningCount(g) > 0 ? \'var(--okdb-warning)\' : \'#374151\')"></span>\n {{ pipelineRunningCount(g) }}/{{ pipelineMemberCount(g) }}\n </span>\n <span class="eo-spacer"></span>\n <if :="pipelineSourceType(g)">\n <button @click="openTypeMember(embedPipelineEngines(g).find(e => e?.config?.source_type || e?.runtime?.source_type || e?.config?.target_type), g.env)" :disabled="pipelineBusy(g)" title="Open source type context" class="eo-btn" style="border-color:color-mix(in srgb, var(--okdb-indigo) 33%, transparent);color:var(--okdb-indigo);background:color-mix(in srgb, var(--okdb-indigo) 7%, transparent);">↗ Type</button>\n </if>\n <if :="pipelineRunningCount(g) > 0">\n <button @click="stopPipeline(g)" :disabled="pipelineBusy(g)" title="Stop all running members" class="eo-btn" style="border-color:color-mix(in srgb, var(--okdb-warning) 33%, transparent);color:var(--okdb-warning);background:color-mix(in srgb, var(--okdb-warning) 7%, transparent);">■ Stop</button>\n </if>\n <if :="pipelineMemberCount(g) > 0">\n <button @click="restartPipeline(g)" :disabled="pipelineBusy(g)" title="Restart all members (stop then start)" class="eo-btn" style="border-color:color-mix(in srgb, var(--okdb-orange) 33%, transparent);color:var(--okdb-orange);background:color-mix(in srgb, var(--okdb-orange) 7%, transparent);">↺ Restart</button>\n </if>\n <if :="pipelineRunningCount(g) < pipelineMemberCount(g)">\n <button @click="startPipeline(g)" :disabled="pipelineBusy(g)" title="Start every runnable member" class="eo-btn" :style="pipelineActionStyle(\'var(--okdb-success)\')">▶ Start</button>\n </if>\n <button @click="togglePipeline(g)" :title="isSelectedPipeline(g) ? \'Collapse\' : \'Expand members\'" class="eo-btn eo-btn--toggle">Members {{ isSelectedPipeline(g) ? \'▴\' : \'▾\' }}</button>\n </div>\n\n \x3c!-- Config metrics row --\x3e\n <if :="pipelineHeaderMetrics(g).length > 0 || pipelineProgressMetric(g)">\n <div class="eo-pipeline-metrics">\n <each :of="pipelineHeaderMetrics(g)" let:item="metric">\n <span class="eo-kv">\n <span class="eo-kv__label">{{ metric.label }}</span>\n <span class="eo-kv__val">{{ metric.value }}</span>\n </span>\n </each>\n <if :="pipelineProgressMetric(g)">\n <span class="eo-kv">\n <span class="eo-kv__label">Progress</span>\n <span class="eo-kv__val" :style="\'color:\' + metricToneColor(pipelineProgressMetric(g))">{{ pipelineProgressMetric(g).value }}</span>\n </span>\n </if>\n </div>\n </if>\n\n \x3c!-- Inline member chip strip (always visible when collapsed) --\x3e\n <if :="!isSelectedPipeline(g)">\n <div class="eo-chip-strip">\n <each :of="embedPipelineEngines(g)" let:item="eng">\n <span class="eo-chip">\n <span :style="\'width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\' + statusDot(eng)"></span>\n <span :style="\'color:\' + (typeColor[eng.role || eng.type] ?? \'var(--okdb-app-fg-muted)\')">{{ typeName(eng.role || eng.type) }}</span>\n <span class="eo-chip__name">{{ shortEngineName(eng) }}</span>\n <if :="showStatusText(eng)">\n <span :style="\'color:\' + engineStatusMeta(eng).color + \';opacity:.8;\'">{{ engineStatusMeta(eng).label }}</span>\n </if>\n </span>\n </each>\n </div>\n </if>\n\n \x3c!-- Expanded accordion: full engine-resource-card members --\x3e\n <if :="isSelectedPipeline(g)">\n <div class="eo-accordion">\n <each :of="selectedPipelineMembers(g)" let:item="member">\n <engine-resource-card\n :engine="member"\n :env="lifecycleEnv(member, g.env)"\n :pipeline="pipelineIdentity(g)"\n :hidepipeline="true"\n hidetype="true"\n hideenv="true"\n variant="member"\n :showdelete="false"\n @refresh="requestRefresh()"\n @edit="openEngineModal($event.detail, g.env)"\n @type-context="openTypeMember($event.detail.engine, g.env)"\n />\n </each>\n \x3c!-- Footer: destructive action --\x3e\n <div class="eo-accordion-footer">\n <button @click="deletePipeline(g)" :disabled="pipelineBusy(g)" title="Delete the pipeline record and env-owned members" class="eo-btn eo-btn--danger">🗑 Delete pipeline</button>\n </div>\n </div>\n </if>\n\n </div>\n </each>\n </div>\n </if>\n\n \x3c!-- ── File Pipelines ── --\x3e\n <if :="filteredFilePipelines.length > 0">\n <div class="eo-section">\n <div class="eo-section__label">File Pipelines <span class="eo-count">{{ filteredFilePipelines.length }}</span></div>\n <each :of="filteredFilePipelines" let:item="g">\n <div class="eo-pipeline-card">\n\n \x3c!-- Pipeline header --\x3e\n <div class="eo-pipeline-header">\n <span class="eo-health-dot" :style="\'background:\' + healthDot(filePipelineEngines(g)) + \';box-shadow:0 0 0 3px \' + healthDot(filePipelineEngines(g)) + \'20;\'"></span>\n <span class="eo-pipeline-name" :title="g.name">{{ g.name }}</span>\n <span class="eo-pill" style="border-color:color-mix(in srgb, var(--okdb-sky) 33%, transparent);color:var(--okdb-sky);background:color-mix(in srgb, var(--okdb-sky) 7%, transparent);">Files</span>\n <span class="eo-run-count" :title="filePipelineEngines(g).filter(e => e.isRunning).length + \' running of \' + filePipelineEngines(g).length">\n <span :style="\'width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\' + (filePipelineEngines(g).every(e => e.isRunning) && filePipelineEngines(g).length > 0 ? \'var(--okdb-success)\' : filePipelineEngines(g).some(e => e.isRunning) ? \'var(--okdb-warning)\' : \'#374151\')"></span>\n {{ filePipelineEngines(g).filter(e => e.isRunning).length }}/{{ filePipelineEngines(g).length }}\n </span>\n <span class="eo-spacer"></span>\n <button @click="goToFiles(g.name)" title="Open the file collection context" class="eo-btn" style="border-color:color-mix(in srgb, var(--okdb-sky) 33%, transparent);color:var(--okdb-sky);background:color-mix(in srgb, var(--okdb-sky) 7%, transparent);">↗ Open</button>\n </div>\n\n \x3c!-- Engine chip strip --\x3e\n <div class="eo-chip-strip">\n <span class="eo-chip">\n <span :style="\'width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\' + statusDot(g.collection)"></span>\n <span :style="\'color:\' + (typeColor[g.collection.type] ?? \'var(--okdb-sky)\')">{{ typeLabel[g.collection.type] ?? \'Collection\' }}</span>\n <span class="eo-chip__name">{{ g.collection.name }}</span>\n </span>\n <each :of="g.extractors" let:item="ext">\n <span class="eo-chip">\n <span :style="\'width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\' + statusDot(ext)"></span>\n <span style="color:var(--okdb-success);">Extractor</span>\n <span class="eo-chip__name">{{ ext.name }}</span>\n </span>\n </each>\n <each :of="g.workers" let:item="w">\n <span class="eo-chip">\n <span :style="\'width:5px;height:5px;border-radius:50%;flex-shrink:0;background:\' + statusDot(w)"></span>\n <span style="color:var(--okdb-warning);">Worker</span>\n <span class="eo-chip__name">{{ w.name }}</span>\n </span>\n </each>\n </div>\n\n </div>\n </each>\n </div>\n </if>\n\n \x3c!-- ── Engines (engine mode) ── --\x3e\n <if :="modeFilter === \'engines\' && visibleEngines.length > 0">\n <div class="eo-section">\n <div class="eo-section__label">Engines <span class="eo-count">{{ visibleEngines.length }}</span></div>\n <each :of="visibleEngineGroups" let:item="group">\n <each :of="group.engines" let:item="eng">\n <engine-resource-card\n :engine="eng"\n :env="lifecycleEnv(eng)"\n :pipeline="enginePipelineName(eng)"\n variant="card"\n :showdelete="false"\n @refresh="requestRefresh()"\n @edit="openEngineModal($event.detail, engineEnv($event.detail))"\n @type-context="goToType($event.detail.type)"\n />\n </each>\n </each>\n </div>\n </if>\n\n</div>',style:"\n/* ── Root ─────────────────────────────────────────── */\nengines-overview .eo-root {\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 980px;\n}\n\n/* ── Page header ──────────────────────────────────── */\nengines-overview .eo-header {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n align-items: center;\n flex-wrap: wrap;\n}\nengines-overview .eo-title { font-weight: 700; font-size: 17px; color: var(--okdb-app-fg); letter-spacing: -.01em; }\nengines-overview .eo-stats { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; font-size: 11px; }\nengines-overview .eo-stat-sep { width: 1px; height: 12px; background: var(--okdb-app-border); flex-shrink: 0; }\n\n/* ── Alerts ───────────────────────────────────────── */\nengines-overview .eo-alert {\n padding: 12px 16px;\n border: 1px solid var(--okdb-app-border);\n border-radius: 10px;\n background: var(--okdb-app-bg-deep);\n font-size: 12px;\n line-height: 1.6;\n}\nengines-overview .eo-alert__title { font-weight: 600; color: var(--okdb-app-fg-muted); margin-bottom: 2px; }\nengines-overview .eo-alert__body { color: var(--okdb-app-fg-subtle); }\n\n/* ── Section ──────────────────────────────────────── */\nengines-overview .eo-section { display: flex; flex-direction: column; gap: 8px; }\nengines-overview .eo-section__label {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: .07em;\n color: var(--okdb-app-fg-muted);\n opacity: .55;\n margin-bottom: 2px;\n}\nengines-overview .eo-count {\n font-size: 10px;\n padding: 0 6px;\n border-radius: 999px;\n background: var(--okdb-app-surface);\n border: 1px solid var(--okdb-app-border);\n color: var(--okdb-accent-muted);\n margin-left: 4px;\n vertical-align: middle;\n}\n\n/* ── Pipeline card ────────────────────────────────── */\nengines-overview .eo-pipeline-card {\n background: var(--okdb-app-surface);\n border: 1px solid var(--okdb-app-border);\n border-radius: 10px;\n overflow: hidden;\n transition: border-color .14s;\n}\nengines-overview .eo-pipeline-card:hover { border-color: #384047; }\n\nengines-overview .eo-pipeline-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px;\n flex-wrap: wrap;\n min-width: 0;\n}\nengines-overview .eo-health-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n}\nengines-overview .eo-pipeline-name {\n font-weight: 600;\n font-size: 13.5px;\n color: var(--okdb-app-fg);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n letter-spacing: -.01em;\n}\nengines-overview .eo-spacer { flex: 1; min-width: 0; }\nengines-overview .eo-run-count {\n font-size: 11px;\n color: var(--okdb-accent-muted);\n display: inline-flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n flex-shrink: 0;\n}\n\n/* ── Pills ────────────────────────────────────────── */\nengines-overview .eo-pill {\n font-size: 10.5px;\n padding: 1px 8px;\n border-radius: 999px;\n border: 1px solid var(--okdb-app-border);\n color: var(--okdb-app-fg-muted);\n background: transparent;\n display: inline-flex;\n align-items: center;\n white-space: nowrap;\n flex-shrink: 0;\n letter-spacing: .01em;\n}\n\n/* ── Buttons ──────────────────────────────────────── */\nengines-overview .eo-btn {\n font-size: 11px;\n padding: 3px 10px;\n border-radius: 999px;\n border: 1px solid var(--okdb-app-border);\n background: var(--okdb-app-bg-deep);\n color: var(--okdb-app-fg-muted);\n cursor: pointer;\n line-height: 1.4;\n flex-shrink: 0;\n white-space: nowrap;\n transition: filter .12s;\n}\nengines-overview .eo-btn--toggle { background: var(--okdb-app-bg-deep); border-color: var(--okdb-app-border); color: var(--okdb-app-fg-muted); }\nengines-overview .eo-btn--danger { border-color: color-mix(in srgb, var(--okdb-danger) 33%, transparent); color: var(--okdb-danger); background: color-mix(in srgb, var(--okdb-danger) 7%, transparent); }\nengines-overview .eo-btn:hover:not(:disabled) { filter: brightness(1.3); }\nengines-overview .eo-btn:disabled { opacity: .4; cursor: not-allowed; }\n\n/* ── Metrics row (pipeline header) ───────────────── */\nengines-overview .eo-pipeline-metrics {\n display: flex;\n flex-wrap: wrap;\n gap: 3px 16px;\n padding: 0 14px 10px 35px;\n}\nengines-overview .eo-kv { display: inline-flex; gap: 4px; align-items: baseline; font-size: 11px; line-height: 1.4; }\nengines-overview .eo-kv__label { font-size: 9.5px; text-transform: uppercase; letter-spacing: .04em; color: var(--okdb-app-fg-subtle); flex-shrink: 0; }\nengines-overview .eo-kv__val { color: #a8c4d9; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n\n/* ── Inline chip strip (collapsed pipeline) ───────── */\nengines-overview .eo-chip-strip {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n padding: 0 14px 12px 35px;\n}\nengines-overview .eo-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid var(--okdb-app-border);\n background: var(--okdb-app-bg-deep);\n font-size: 10.5px;\n white-space: nowrap;\n}\nengines-overview .eo-chip__name { color: var(--okdb-accent-muted); }\n\n/* ── Accordion (expanded pipeline) ───────────────── */\nengines-overview .eo-accordion {\n border-top: 1px solid var(--okdb-app-border);\n background: var(--okdb-app-bg-deep);\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n}\nengines-overview .eo-accordion-footer {\n display: flex;\n justify-content: flex-end;\n padding: 4px 2px 2px;\n border-top: 1px solid var(--okdb-app-border);\n margin-top: 2px;\n}\n"};