@kedem/okdb 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/bin/okdb.js +1 -1
  2. package/keys/public.pem +3 -0
  3. package/okdb.js +1 -1
  4. package/package.json +2 -2
  5. package/public/admin-app.js +1 -1
  6. package/public/components/admin-route-host.ok.js +1 -1
  7. package/public/components/env-picker.ok.js +1 -1
  8. package/public/components/field-path-input.ok.js +1 -1
  9. package/public/components/field.html +154 -2
  10. package/public/components/geo-map.ok.js +1 -1
  11. package/public/components/ok-cron-input.ok.js +1 -1
  12. package/public/components/ok-dropzone.ok.js +1 -1
  13. package/public/components/ok-js-input.ok.js +1 -1
  14. package/public/components/ok-json-input.ok.js +1 -1
  15. package/public/components/ok-text-monaco-input.ok.js +1 -1
  16. package/public/components/theme-toggle.ok.js +1 -1
  17. package/public/index.html +29 -2
  18. package/public/layouts/_default.ok.html +1 -1
  19. package/public/layouts/okdb-cube.ok.html +1 -1
  20. package/public/login-app.js +1 -1
  21. package/public/login.html +205 -1
  22. package/public/modules/ok.js +1 -1
  23. package/public/sections/api/index.ok.html +1 -1
  24. package/public/sections/api/parts/api-endpoint.ok.js +1 -1
  25. package/public/sections/auth/index.ok.html +1 -1
  26. package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
  27. package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
  28. package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
  29. package/public/sections/auth/parts/token-detail.ok.js +1 -1
  30. package/public/sections/auth/parts/token-list.ok.js +1 -1
  31. package/public/sections/db/index.ok.html +1 -1
  32. package/public/sections/db/modals/add-item-modal.ok.js +1 -1
  33. package/public/sections/db/modals/create-env-modal.ok.js +1 -1
  34. package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
  35. package/public/sections/db/modals/create-index-modal.ok.js +1 -1
  36. package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
  37. package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
  38. package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
  39. package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
  40. package/public/sections/db/parts/db-overview.ok.js +1 -1
  41. package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
  42. package/public/sections/db/parts/edit-row.ok.js +1 -1
  43. package/public/sections/db/parts/tm-timeline.ok.js +1 -1
  44. package/public/sections/db/parts/type-changelog.ok.js +1 -1
  45. package/public/sections/db/parts/type-list.ok.js +1 -1
  46. package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
  47. package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
  48. package/public/sections/db/parts/type-viewer.ok.js +1 -1
  49. package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
  50. package/public/sections/docs/index.ok.html +1 -1
  51. package/public/sections/embeddings/index.ok.html +1 -1
  52. package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
  53. package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
  54. package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
  55. package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
  56. package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
  57. package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
  58. package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
  59. package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
  60. package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
  61. package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
  62. package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
  63. package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
  64. package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
  65. package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
  66. package/public/sections/engines/engine-panel-shared-style.js +1 -1
  67. package/public/sections/engines/engine-ui-utils.js +1 -1
  68. package/public/sections/engines/index.ok.html +1 -1
  69. package/public/sections/engines/modals/engine-modal.ok.js +1 -1
  70. package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
  71. package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
  72. package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
  73. package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
  74. package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
  75. package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
  76. package/public/sections/files/index.ok.html +1 -1
  77. package/public/sections/files/parts/files-blob-status.ok.js +1 -1
  78. package/public/sections/files/parts/files-collection-list.ok.js +1 -1
  79. package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
  80. package/public/sections/files/parts/files-file-list.ok.js +1 -1
  81. package/public/sections/files/parts/files-overview.ok.js +1 -1
  82. package/public/sections/files/parts/files-path-browser.ok.js +1 -1
  83. package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
  84. package/public/sections/functions/index.ok.html +1 -1
  85. package/public/sections/functions/modals/function-modal.ok.js +1 -1
  86. package/public/sections/functions/parts/function-detail.ok.js +1 -1
  87. package/public/sections/functions/parts/function-logs.ok.js +1 -1
  88. package/public/sections/functions/parts/function-runner.ok.js +1 -1
  89. package/public/sections/functions/parts/functions-list.ok.js +1 -1
  90. package/public/sections/license/index.ok.html +1 -1
  91. package/public/sections/license/parts/license-panel.ok.js +1 -1
  92. package/public/sections/processors/index.ok.html +1 -1
  93. package/public/sections/queue/index.ok.html +1 -1
  94. package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
  95. package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
  96. package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
  97. package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
  98. package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
  99. package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
  100. package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
  101. package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
  102. package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
  103. package/public/sections/queue/parts/queue-types.ok.js +1 -1
  104. package/public/sections/queue/parts/queue-workers.ok.js +1 -1
  105. package/public/sections/sync/index.ok.html +1 -1
  106. package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
  107. package/public/sections/sync/parts/sync-retention.ok.js +1 -1
  108. package/public/sections/sync/parts/sync-topology.ok.js +1 -1
  109. package/public/sections/system/index.ok.html +1 -1
  110. package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
  111. package/public/sections/system/parts/system-api-panel.ok.js +1 -1
  112. package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
  113. package/public/sections/system/parts/system-log-history.ok.js +1 -1
  114. package/public/sections/system/parts/system-log.ok.js +1 -1
  115. package/public/sections/system/parts/system-status.ok.js +1 -1
  116. package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
  117. package/public/sections/views/index.ok.html +1 -1
  118. package/public/sections/views/modals/create-view-modal.ok.js +1 -1
  119. package/public/sections/views/parts/view-detail.ok.js +1 -1
  120. package/public/sections/views/parts/views-list.ok.js +1 -1
  121. package/public/sections/views/parts/views-overview.ok.js +1 -1
  122. package/public/setup-app.js +1 -1
  123. package/public/setup.html +189 -1
  124. package/public/stores/auth-store.js +1 -1
  125. package/public/stores/events-store.js +1 -1
  126. package/public/stores/functions-store.js +1 -1
  127. package/public/stores/okdb-store.js +1 -1
  128. package/public/stores/theme-store.js +1 -1
  129. package/public/test-cron-input.html +53 -3
  130. package/public/test-json-input.html +182 -3
  131. package/public/util/permissions.js +1 -1
  132. package/public/util/sift-schema.js +1 -1
  133. package/public/vendor/okjs/ok.esm.min.js +1 -2
  134. package/public/view-models/type-query-vm.js +1 -1
  135. package/okdb-data/default/data.mdb +0 -0
  136. package/okdb-data/default/lock.mdb +0 -0
  137. package/okdb-data/~log/data.mdb +0 -0
  138. package/okdb-data/~log/lock.mdb +0 -0
  139. package/okdb-data/~system/data.mdb +0 -0
  140. package/okdb-data/~system/lock.mdb +0 -0
  141. package/public/images/logo.png +0 -0
  142. package/public/images/logo.svg +0 -333
@@ -1 +1 @@
1
- const _0x145ee7=_0x5ad3;function _0x3def(){const _0x5398e3=['label','type-context','hidetype','Error','/restart','var(--okdb-info)','hidepipeline','filter','member','Engine\x20rebuild\x20started','delete','Restart','Chunk','match','materializer','compact','$ok','join','/stop',';\x20color:','rebuild','12LQspQp','runtime','Concurrency','8220820zcTyPe','height:100%;width:','Delete','envName','showdelete','danger','/pause','Engine\x20resumed','2575779ipAeMC','1637165HVOrER','color-mix(in\x20srgb,\x20','busy','success','Collection','\x20complete','$dispatch','var(--okdb-orange)','pillStyle','edit','metricPercent','Retry','Rebuild\x20engine\x20\x22','DELETE','split','\x0a<div\x20:class=\x22isMember\x20?\x20\x27engine-resource-card\x20erc\x20erc--member\x27\x20:\x20\x27engine-resource-card\x20erc\x20erc--card\x27\x22>\x0a\x0a\x20\x20<!--\x20──\x20Name\x20+\x20type\x20+\x20status\x20+\x20actions\x20row\x20──\x20-->\x0a\x20\x20<div\x20class=\x22erc-header\x22>\x0a\x20\x20\x20\x20<span\x20class=\x22erc-dot\x22\x20:style=\x22\x27background:\x27\x20+\x20statusMeta.color\x20+\x20\x27;box-shadow:0\x200\x200\x203px\x20color-mix(in\x20srgb,\x20\x27\x20+\x20statusMeta.color\x20+\x20\x27\x2013%,\x20transparent);\x27\x22\x20:title=\x22statusMeta.title\x22></span>\x0a\x20\x20\x20\x20<div\x20class=\x22erc-name-group\x22>\x0a\x20\x20\x20\x20\x20\x20<code\x20class=\x22erc-name\x22\x20:title=\x22title\x22>{{\x20displayTitle\x20}}</code>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22titleNamespace\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-ns\x22>{{\x20titleNamespace\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<span\x20class=\x22erc-pill\x22\x20:style=\x22typeBadgeStyle()\x22>{{\x20typeName(eng.role\x20||\x20eng.type)\x20}}</span>\x0a\x20\x20\x20\x20<if\x20:=\x22!running\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-pill\x22\x20:style=\x22statusPillStyle()\x22>{{\x20statusMeta.label\x20}}</span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<if\x20:=\x22pipelineLabel\x20&&\x20!hidePipeline\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-pill\x22\x20:style=\x22pipelineBadgeStyle()\x22\x20:title=\x22\x27pipeline:\x20\x27\x20+\x20pipelineName\x22>{{\x20pipelineLabel\x20}}</span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<if\x20:=\x22envName\x20&&\x20!isMember\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-pill\x22\x20:style=\x22envBadgeStyle()\x22\x20:title=\x22\x27env:\x20\x27\x20+\x20envName\x22>{{\x20envName\x20}}</span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<each\x20:of=\x22healthBadges\x22\x20let:item=\x22badge\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-pill\x22\x20:style=\x22healthBadgeStyle(badge)\x22\x20:title=\x22badge.title\x22>{{\x20badge.text\x20}}</span>\x0a\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20<span\x20class=\x22erc-spacer\x22></span>\x0a\x20\x20\x20\x20<each\x20:of=\x22overflowActions\x22\x20let:item=\x22action\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runAction(action)\x22\x20:disabled=\x22busy\x22\x20:title=\x22action.title\x20||\x20action.label\x22\x20class=\x22erc-btn\x20erc-btn--muted\x22\x20:style=\x22\x27color:\x27\x20+\x20action.color\x20+\x20\x27;\x27\x22>{{\x20glyph(action.label)\x20}}\x20{{\x20action.label\x20}}</button>\x0a\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20<if\x20:=\x22overflowActions.length\x20>\x200\x20&&\x20primaryAction\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-sep\x22></span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<if\x20:=\x22primaryAction\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22runAction(primaryAction)\x22\x20:disabled=\x22busy\x22\x20class=\x22erc-btn\x20erc-btn--primary\x22\x20:style=\x22pillStyle(primaryAction.color)\x22>{{\x20busy\x20?\x20\x27…\x27\x20:\x20(glyph(primaryAction.label)\x20+\x20\x27\x20\x27\x20+\x20primaryAction.label)\x20}}</button>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20──\x20Summary\x20(card\x20mode\x20only)\x20──\x20-->\x0a\x20\x20<if\x20:=\x22description\x20&&\x20!isMember\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22erc-summary\x22>{{\x20description\x20}}</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Config\x20metadata\x20──\x20-->\x0a\x20\x20<if\x20:=\x22metadata.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22erc-kv-row\x22>\x0a\x20\x20\x20\x20\x20\x20<each\x20:of=\x22metadata\x22\x20let:item=\x22metric\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-kv\x22\x20:title=\x22metric.title\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-kv__label\x22>{{\x20metric.label\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-kv__val\x22>{{\x20metric.value\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Runtime\x20metrics\x20──\x20-->\x0a\x20\x20<if\x20:=\x22metrics.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22erc-kv-row\x20erc-kv-row--metrics\x22>\x0a\x20\x20\x20\x20\x20\x20<each\x20:of=\x22metrics\x22\x20let:item=\x22metric\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-kv\x22\x20:title=\x22metric.title\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-kv__label\x22>{{\x20metric.label\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22erc-kv__val\x22\x20:style=\x22\x27color:\x27\x20+\x20metricToneColor(metric)\x22>{{\x20metric.value\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Progress\x20bar\x20──\x20-->\x0a\x20\x20<if\x20:=\x22showProgressBar()\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22erc-progress\x22\x20:title=\x22progressMetric()?.title\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20:style=\x22progressFillStyle()\x22></div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Error\x20──\x20-->\x0a\x20\x20<if\x20:=\x22inlineError\x20||\x20error\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22erc-error\x22>⚠\x20{{\x20inlineError\x20||\x20error\x20}}</div>\x0a\x20\x20</if>\x0a\x0a</div>\x0a','#fb7185','border-color:color-mix(in\x20srgb,\x20var(--okdb-app-border)\x2040%,\x20transparent);\x20color:#7a93a8;\x20background:transparent;','6528690TeYwvc','TTL','env','statusMeta','var(--okdb-warning)','2ocDaiW','pop','Engine\x20deleted','canRunLifecycle','eng','Pause','pipeline','_uiEnv','Provider','hideType','/start','View\x20Type\x20Context','Search','Edit','push','showDelete','get','collectionEngine','Engine\x20started','Engine\x20paused','Reset','Model','Prepare','Algorithm','key','false','running','/resume','/rebuild','\x2033%,\x20transparent)','Rebuild','8OTwnLg','hideEnv','Reset\x20Cursor','Embedder','slice','typeBadgeStyle','refresh','var(--okdb-sky)','Progress','reset','Poll','var(--okdb-danger)','config','true','embeddingsMode','restart','healthy','target_type','values','699639xrkMhE','isFinite','tone','7051919OrOxhY','Worker','Reset\x20cursor\x20for\x20engine\x20\x22','Restart\x20engine\x20\x22','toast','indexer','text','status','modal','title','1127493tWdsZE','border-color:','Engine\x20retry\x20started','Extractor','var(--okdb-app-fg-muted)','name','includes','Field','Indexer','color','suffix','/reset-cursor','type','method','POST','paused','Delete\x20engine\x20\x22','Type','stats','min','Engine','isMember','pipelineName','$attr','%;border-radius:999px;background:','progressMetric','storeEnv','Resume','var(--okdb-success)','Stop\x20engine\x20\x22','Dims','basePath','warning','source_type','variant','Stop','\x20failed','error','\x207%,\x20transparent)','isRunning','var(--okdb-accent)','Mode','source_env','Storage','local','sourceType','/retry','confirm','shared','Engine\x20stopped','message','\x0aengine-resource-card\x20{\x20display:\x20block;\x20}\x0a\x0a/*\x20──\x20Top-level\x20hover\x20(applies\x20when\x20component\x20root\x20carries\x20.engine-resource-card\x20class)\x20──\x20*/\x0a.engine-resource-card:hover\x20{\x20border-color:\x20var(--okdb-app-border-strong);\x20}\x0a\x0a/*\x20──\x20Card\x20variant\x20(standalone)\x20───────────────────────\x20*/\x0aengine-resource-card\x20.erc--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\x20padding:\x2012px\x2014px;\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-direction:\x20column;\x0a\x20\x20gap:\x208px;\x0a\x20\x20box-shadow:\x200\x200\x204px\x20rgba(255,255,255,0.03);\x0a\x20\x20transition:\x20border-color\x20.14s;\x0a}\x0aengine-resource-card\x20.erc--card:hover\x20{\x20border-color:\x20var(--okdb-app-border-strong);\x20}\x0a\x0a/*\x20──\x20Member\x20variant\x20(inside\x20pipeline)\x20────────────────\x20*/\x0aengine-resource-card\x20.erc--member\x20{\x0a\x20\x20background:\x20var(--okdb-app-surface);\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-surface-2);\x0a\x20\x20border-radius:\x208px;\x0a\x20\x20padding:\x209px\x2012px;\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-direction:\x20column;\x0a\x20\x20gap:\x206px;\x0a\x20\x20transition:\x20border-color\x20.12s,\x20background\x20.12s;\x0a}\x0aengine-resource-card\x20.erc--member:hover\x20{\x20border-color:\x20var(--okdb-app-border-strong);\x20background:\x20var(--okdb-app-surface);\x20}\x0a\x0a/*\x20──\x20Header\x20row\x20─────────────────────────────────────\x20*/\x0aengine-resource-card\x20.erc-header\x20{\x20display:\x20flex;\x20align-items:\x20center;\x20gap:\x205px;\x20flex-wrap:\x20wrap;\x20min-width:\x200;\x20}\x0aengine-resource-card\x20.erc-dot\x20{\x20width:\x207px;\x20height:\x207px;\x20border-radius:\x2050%;\x20flex-shrink:\x200;\x20}\x0aengine-resource-card\x20.erc-name-group\x20{\x20display:\x20flex;\x20align-items:\x20baseline;\x20gap:\x205px;\x20min-width:\x200;\x20}\x0aengine-resource-card\x20.erc-name\x20{\x20font-size:\x2013px;\x20font-weight:\x20600;\x20color:\x20var(--okdb-app-fg-strong);\x20overflow:\x20hidden;\x20text-overflow:\x20ellipsis;\x20white-space:\x20nowrap;\x20letter-spacing:\x20-.01em;\x20}\x0aengine-resource-card\x20.erc-ns\x20{\x20font-size:\x2010.5px;\x20color:\x20var(--okdb-app-fg-subtle);\x20white-space:\x20nowrap;\x20}\x0aengine-resource-card\x20.erc-spacer\x20{\x20flex:\x201;\x20min-width:\x200;\x20}\x0aengine-resource-card\x20.erc-sep\x20{\x20width:\x201px;\x20height:\x2012px;\x20background:\x20var(--okdb-app-border);\x20flex-shrink:\x200;\x20}\x0a\x0a/*\x20──\x20Pills\x20──────────────────────────────────────────\x20*/\x0aengine-resource-card\x20.erc-pill\x20{\x20font-size:\x2010.5px;\x20padding:\x201px\x208px;\x20border-radius:\x20999px;\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x20color:\x20var(--okdb-app-fg-muted);\x20background:\x20transparent;\x20display:\x20inline-flex;\x20align-items:\x20center;\x20white-space:\x20nowrap;\x20flex-shrink:\x200;\x20letter-spacing:\x20.01em;\x20}\x0aengine-resource-card\x20.erc-pill--pipeline\x20{\x20border-color:\x20#6366f144;\x20color:\x20#a5b4fc;\x20background:\x20#6366f110;\x20}\x0aengine-resource-card\x20.erc-pill--env\x20{\x20border-color:\x20color-mix(in\x20srgb,\x20var(--okdb-app-border)\x2040%,\x20transparent);\x20color:\x20#7a93a8;\x20}\x0a\x0a/*\x20──\x20Buttons\x20────────────────────────────────────────\x20*/\x0aengine-resource-card\x20.erc-btn\x20{\x20font-size:\x2011px;\x20padding:\x202px\x2010px;\x20border-radius:\x20999px;\x20border:\x201px\x20solid;\x20cursor:\x20pointer;\x20line-height:\x201.5;\x20flex-shrink:\x200;\x20white-space:\x20nowrap;\x20transition:\x20filter\x20.12s;\x20}\x0aengine-resource-card\x20.erc-btn--primary\x20{\x20font-weight:\x20600;\x20}\x0aengine-resource-card\x20.erc-btn--muted\x20{\x20background:\x20var(--okdb-app-bg-deep);\x20border-color:\x20var(--okdb-app-border);\x20}\x0aengine-resource-card\x20.erc-btn:hover:not(:disabled)\x20{\x20filter:\x20brightness(1.3);\x20}\x0aengine-resource-card\x20.erc-btn:disabled\x20{\x20opacity:\x20.4;\x20cursor:\x20not-allowed;\x20}\x0a\x0a/*\x20──\x20Content\x20rows\x20───────────────────────────────────\x20*/\x0aengine-resource-card\x20.erc-summary\x20{\x20font-size:\x2011.5px;\x20line-height:\x201.55;\x20color:\x20#6d8899;\x20padding-left:\x2012px;\x20}\x0aengine-resource-card\x20.erc-kv-row\x20{\x20display:\x20grid;\x20grid-template-columns:repeat(auto-fit,\x20minmax(180px,\x201fr));\x20gap:\x202px\x2012px;\x20padding-left:\x2012px;\x20}\x0aengine-resource-card\x20.erc--member\x20.erc-kv-row\x20{\x20grid-template-columns:\x20repeat(3,\x201fr);\x20gap:\x202px\x2010px;\x20}\x0aengine-resource-card\x20.erc-kv-row--metrics\x20{\x20border-top:\x201px\x20solid\x20var(--okdb-app-border);\x20padding-top:\x206px;\x20}\x0aengine-resource-card\x20.erc-kv\x20{\x20display:\x20inline-flex;\x20gap:\x204px;\x20align-items:\x20baseline;\x20font-size:\x2011px;\x20line-height:\x201.35;\x20}\x0aengine-resource-card\x20.erc-kv__label\x20{\x20font-size:\x209.5px;\x20text-transform:\x20uppercase;\x20letter-spacing:\x20.04em;\x20color:\x20var(--okdb-app-fg-subtle);\x20flex-shrink:\x200;\x20}\x0aengine-resource-card\x20.erc-kv__val\x20{\x20color:\x20#a8c4d9;\x20overflow:\x20hidden;\x20text-overflow:\x20ellipsis;\x20white-space:\x20nowrap;\x20}\x0aengine-resource-card\x20.erc-progress\x20{\x20height:\x203px;\x20width:\x20100%;\x20border-radius:\x20999px;\x20background:\x20var(--okdb-app-bg-deep);\x20overflow:\x20hidden;\x20}\x0aengine-resource-card\x20.erc-error\x20{\x20font-size:\x2011px;\x20line-height:\x201.5;\x20color:\x20var(--okdb-danger);\x20border-top:\x201px\x20solid\x20var(--okdb-app-border);\x20padding-top:\x206px;\x20padding-left:\x2012px;\x20}\x0a','typeColor','Materializer','json','max','var(--okdb-accent-2)'];_0x3def=function(){return _0x5398e3;};return _0x3def();}(function(_0x480cc8,_0x50623f){const _0x404de9=_0x5ad3,_0x180ede=_0x480cc8();while(!![]){try{const _0x5d01b7=-parseInt(_0x404de9(0x136))/0x1+-parseInt(_0x404de9(0x104))/0x2*(-parseInt(_0x404de9(0xec))/0x3)+-parseInt(_0x404de9(0xe1))/0x4*(parseInt(_0x404de9(0xed))/0x5)+parseInt(_0x404de9(0xff))/0x6+parseInt(_0x404de9(0x139))/0x7*(parseInt(_0x404de9(0x123))/0x8)+parseInt(_0x404de9(0x143))/0x9+-parseInt(_0x404de9(0xe4))/0xa;if(_0x5d01b7===_0x50623f)break;else _0x180ede['push'](_0x180ede['shift']());}catch(_0x3bc357){_0x180ede['push'](_0x180ede['shift']());}}}(_0x3def,0x8c796));import{buildEngineBasePath as _0x402e8f,compactEngineConfigMetrics as _0x14b5e1,compactEngineErrorText as _0x1adcde,compactEngineRowMetrics as _0x4b1cde,compactEngineRowStatusBadges as _0x4af50d,compactEngineRowSummary as _0x32a20c,compactEngineStatusMeta as _0x55eade,isEmbeddingsEngine as _0x420bf1}from'../engine-ui-utils.js';function l(_0xd0016d,_0x12c5b4=!0x1){const _0x2923ac=_0x5ad3;return null==_0xd0016d?_0x12c5b4:!0x0===_0xd0016d||_0x2923ac(0x130)===_0xd0016d||!0x1!==_0xd0016d&&_0x2923ac(0x11d)!==_0xd0016d&&Boolean(_0xd0016d);}function _0x5ad3(_0x1188b3,_0x5c9669){_0x1188b3=_0x1188b3-0xdc;const _0x3defd8=_0x3def();let _0x5ad361=_0x3defd8[_0x1188b3];return _0x5ad361;}const c={'Start':'▶','Stop':'■','Pause':'❚❚','Resume':'▶','Restart':'↻','Retry':'↻','Reset':'⟲','Rebuild':'⚒','Edit':'✎','Type':'↗','Delete':'🗑'};export default{'tag':'engine-resource-card','attr':{'engine':{},'env':{},'pipeline':{},'hidepipeline':{},'hidetype':{},'hideenv':{},'variant':{},'compact':{},'showdelete':{}},'context':_0x5738fc=>({'busy':!0x1,'error':null,'typeLabel':{'embedder':'Embedder','indexer':_0x145ee7(0x14b),'search':'Search','worker':'Worker','vector-search':_0x145ee7(0x110),'embed-worker':_0x145ee7(0x13a),'materializer':_0x145ee7(0x178),'file-extractor':_0x145ee7(0x146),'file-collection':_0x145ee7(0xf1),'file-extractor-worker':_0x145ee7(0x13a),'processor':'Processor','queue-worker':'Queue\x20Worker'},'typeColor':{'embedder':_0x145ee7(0x181),'indexer':_0x145ee7(0x17b),'vector-search':_0x145ee7(0x16b),'embed-worker':_0x145ee7(0x103),'materializer':_0x145ee7(0xfd),'file-extractor':_0x145ee7(0x15f),'file-collection':_0x145ee7(0x12a),'file-extractor-worker':_0x145ee7(0x103),'processor':_0x145ee7(0xf4),'queue-worker':_0x145ee7(0x17b)},get 'eng'(){const _0x4fe014=_0x145ee7;return _0x5738fc[_0x4fe014(0x15a)]['engine']??{};},get 'envName'(){const _0x555459=_0x145ee7;return _0x5738fc[_0x555459(0x15a)]['env']??this['eng']?.[_0x555459(0x101)]??this['eng']?.[_0x555459(0x10b)]??this[_0x555459(0x108)]?.[_0x555459(0x15d)]??this['eng']?.[_0x555459(0x12f)]?.[_0x555459(0x16d)]??null;},get 'isMember'(){const _0x3672fc=_0x145ee7;return _0x3672fc(0x184)===_0x5738fc[_0x3672fc(0x15a)][_0x3672fc(0x165)]||'card'!==_0x5738fc[_0x3672fc(0x15a)]['variant']&&l(_0x5738fc['$attr'][_0x3672fc(0x18b)],!0x1);},get 'hidePipeline'(){const _0x54f4af=_0x145ee7;return l(_0x5738fc['$attr'][_0x54f4af(0x182)],!0x1);},get 'hideType'(){const _0x120348=_0x145ee7;return l(_0x5738fc[_0x120348(0x15a)][_0x120348(0x17e)],!0x1);},get 'hideEnv'(){const _0x10fdd0=_0x145ee7;return l(_0x5738fc[_0x10fdd0(0x15a)]['hideenv'],!0x1);},get 'showDelete'(){const _0x309848=_0x145ee7;return l(_0x5738fc['$attr'][_0x309848(0xe8)],!0x1);},get 'basePath'(){const _0x590d01=_0x145ee7;return _0x402e8f(this[_0x590d01(0x108)],this['envName']);},get 'embeddingsMode'(){return _0x420bf1(this['eng']);},get 'running'(){const _0x2e7600=_0x145ee7;return!!this[_0x2e7600(0x108)]?.[_0x2e7600(0x16a)];},get 'statusMeta'(){return _0x55eade(this['eng']);},get 'paused'(){const _0x3b3c7e=_0x145ee7;return!0x0===this[_0x3b3c7e(0x108)]?.['stats']?.[_0x3b3c7e(0x152)]||!0x0===this['eng']?.[_0x3b3c7e(0xe2)]?.[_0x3b3c7e(0x152)]||!0x0===this[_0x3b3c7e(0x108)]?.['paused'];},get 'pipelineName'(){const _0x3fbae7=_0x145ee7;return _0x5738fc[_0x3fbae7(0x15a)]['pipeline']??this[_0x3fbae7(0x108)]?.['meta']?.[_0x3fbae7(0x10a)]??this[_0x3fbae7(0x108)]?.[_0x3fbae7(0x12f)]?.[_0x3fbae7(0x10a)]??this[_0x3fbae7(0x108)]?.[_0x3fbae7(0x12f)]?.[_0x3fbae7(0x115)]??null;},get 'pipelineLabel'(){const _0x1f74ab=_0x145ee7;return this['pipelineName']?String(this[_0x1f74ab(0x159)])[_0x1f74ab(0xfb)](':')[_0x1f74ab(0x105)]():null;},get 'sourceType'(){const _0x5aec23=_0x145ee7;return this[_0x5aec23(0x108)]?.[_0x5aec23(0x12f)]?.[_0x5aec23(0x164)]??this['eng']?.[_0x5aec23(0xe2)]?.[_0x5aec23(0x164)]??this['eng']?.[_0x5aec23(0x155)]?.[_0x5aec23(0x164)]??this['eng']?.['stats']?.[_0x5aec23(0x13e)]?.['source_type']??this[_0x5aec23(0x108)]?.[_0x5aec23(0x12f)]?.[_0x5aec23(0x134)]??null;},get 'canRunLifecycle'(){const _0x2740d4=_0x145ee7;return!!this[_0x2740d4(0x162)];},get 'title'(){const _0x1a0cf6=_0x145ee7;return this[_0x1a0cf6(0x108)]?.[_0x1a0cf6(0x148)]??this['eng']?.[_0x1a0cf6(0x11c)]??_0x1a0cf6(0x157);},get 'displayTitle'(){const _0x2d158b=_0x145ee7,_0x40e554=String(this[_0x2d158b(0x142)]??'');return _0x40e554[_0x2d158b(0x149)](':')?_0x40e554[_0x2d158b(0xfb)](':')[_0x2d158b(0x105)]():_0x40e554;},get 'titleNamespace'(){const _0x4ba2eb=_0x145ee7,_0x1e02d3=String(this[_0x4ba2eb(0x142)]??'');return _0x1e02d3[_0x4ba2eb(0x149)](':')?_0x1e02d3[_0x4ba2eb(0xfb)](':')[_0x4ba2eb(0x127)](0x0,-0x1)[_0x4ba2eb(0xdd)](':'):null;},get 'description'(){const _0x22c98e=_0x145ee7;return _0x32a20c(this[_0x22c98e(0x108)]);},get 'inlineError'(){const _0x2f7e32=_0x145ee7;return _0x1adcde(this[_0x2f7e32(0x108)]);},get 'metadata'(){const _0x4dac54=_0x145ee7,_0x4e8c1c=['Source',_0x4dac54(0x14a),_0x4dac54(0x16e),_0x4dac54(0x126),_0x4dac54(0x161),_0x4dac54(0x11b),_0x4dac54(0x10c),_0x4dac54(0x119),_0x4dac54(0xe3),_0x4dac54(0x12d),_0x4dac54(0x100),_0x4dac54(0x16c),_0x4dac54(0x11a),_0x4dac54(0x188)],_0x5ced03=new Map(_0x14b5e1(this[_0x4dac54(0x108)])['map'](_0x2d009d=>[_0x2d009d[_0x4dac54(0x17c)],_0x2d009d])),_0x54eade=[];for(const _0x8fbe7e of _0x4e8c1c){if(this[_0x4dac54(0x158)]&&'Embedder'===_0x8fbe7e)continue;const _0x1ffd73=_0x5ced03[_0x4dac54(0x114)](_0x8fbe7e);_0x1ffd73&&(_0x54eade[_0x4dac54(0x112)](_0x1ffd73),_0x5ced03[_0x4dac54(0x186)](_0x8fbe7e));}for(const _0x5043d0 of _0x5ced03[_0x4dac54(0x135)]())(this['isMember']||this[_0x4dac54(0x124)])&&'Source\x20env'===_0x5043d0[_0x4dac54(0x17c)]||_0x54eade[_0x4dac54(0x112)](_0x5043d0);return _0x54eade[_0x4dac54(0x127)](0x0,this['isMember']?0x6:0xa);},get 'metrics'(){const _0x4d24b0=_0x145ee7,_0xe77f2c=[_0x4d24b0(0x14a),'Mode',_0x4d24b0(0x11a),_0x4d24b0(0x188),'Embedder','Provider',_0x4d24b0(0x119),'Algorithm'];return _0x4b1cde(this[_0x4d24b0(0x108)])[_0x4d24b0(0x183)](_0x11fcbd=>!_0xe77f2c[_0x4d24b0(0x149)](_0x11fcbd[_0x4d24b0(0x17c)]))[_0x4d24b0(0x127)](0x0,this[_0x4d24b0(0x158)]?0x5:0x8);},get 'healthBadges'(){const _0x43480b=_0x145ee7,_0x3f1d98=this['statusMeta'][_0x43480b(0x17c)];return _0x4af50d(this[_0x43480b(0x108)])[_0x43480b(0x183)](_0x5a5199=>_0x5a5199?.['text']&&_0x5a5199[_0x43480b(0x13f)]!==_0x3f1d98)['filter'](_0x30e87e=>!(this[_0x43480b(0x11e)]&&_0x43480b(0x133)===_0x30e87e[_0x43480b(0x13f)]))[_0x43480b(0x127)](0x0,0x2);},get 'primaryAction'(){const _0x30726d=_0x145ee7;return this[_0x30726d(0x107)]?this[_0x30726d(0x131)]?this[_0x30726d(0x11e)]?{'label':_0x30726d(0x166),'method':_0x30726d(0x151),'suffix':_0x30726d(0xde),'color':_0x30726d(0x103),'confirm':_0x30726d(0x160)+this[_0x30726d(0x142)]+'\x22?','toast':_0x30726d(0x174)}:_0x30726d(0x168)===this[_0x30726d(0x108)]?.[_0x30726d(0x140)]?{'label':_0x30726d(0x187),'method':_0x30726d(0x151),'suffix':_0x30726d(0x180),'color':_0x30726d(0xf4),'confirm':'Restart\x20engine\x20\x22'+this[_0x30726d(0x142)]+'\x22?','toast':'Engine\x20restarted'}:{'label':'Start','method':'POST','suffix':_0x30726d(0x10e),'color':_0x30726d(0x15f),'confirm':null,'toast':_0x30726d(0x116)}:_0x30726d(0x168)===this[_0x30726d(0x108)]?.[_0x30726d(0x140)]?{'label':_0x30726d(0xf8),'method':_0x30726d(0x151),'suffix':_0x30726d(0x171),'color':'var(--okdb-orange)','confirm':null,'toast':_0x30726d(0x145)}:this[_0x30726d(0x152)]?{'label':_0x30726d(0x15e),'method':_0x30726d(0x151),'suffix':_0x30726d(0x11f),'color':_0x30726d(0x15f),'confirm':null,'toast':_0x30726d(0xeb)}:{'label':'Pause','method':_0x30726d(0x151),'suffix':'/pause','color':_0x30726d(0x103),'confirm':null,'toast':_0x30726d(0x117)}:null;},get 'overflowActions'(){const _0x3cce0a=_0x145ee7,_0x599833=[];return this[_0x3cce0a(0x107)]&&(_0x599833[_0x3cce0a(0x112)]({'key':_0x3cce0a(0x132),'label':_0x3cce0a(0x187),'method':_0x3cce0a(0x151),'suffix':_0x3cce0a(0x180),'color':_0x3cce0a(0x147),'confirm':this[_0x3cce0a(0x131)]?_0x3cce0a(0x13c)+this[_0x3cce0a(0x142)]+'\x22?':null,'toast':'Engine\x20restarted'}),this[_0x3cce0a(0x131)]||_0x599833[_0x3cce0a(0x112)]({'key':'pause','label':this['paused']?_0x3cce0a(0x15e):_0x3cce0a(0x109),'method':'POST','suffix':this[_0x3cce0a(0x152)]?_0x3cce0a(0x11f):_0x3cce0a(0xea),'color':this[_0x3cce0a(0x152)]?'var(--okdb-success)':_0x3cce0a(0x103),'toast':this['paused']?_0x3cce0a(0xeb):_0x3cce0a(0x117)}),_0x3cce0a(0x18a)===this[_0x3cce0a(0x108)]?.['type']&&(_0x599833[_0x3cce0a(0x112)]({'key':_0x3cce0a(0x12c),'label':_0x3cce0a(0x118),'title':_0x3cce0a(0x125),'method':'POST','suffix':_0x3cce0a(0x14e),'color':_0x3cce0a(0x181),'confirm':_0x3cce0a(0x13b)+this[_0x3cce0a(0x142)]+'\x22?','toast':'Engine\x20cursor\x20reset'}),_0x599833[_0x3cce0a(0x112)]({'key':_0x3cce0a(0xe0),'label':_0x3cce0a(0x122),'method':'POST','suffix':_0x3cce0a(0x120),'color':'var(--okdb-success)','confirm':_0x3cce0a(0xf9)+this[_0x3cce0a(0x142)]+'\x22?','toast':_0x3cce0a(0x185)}))),_0x599833['push']({'key':_0x3cce0a(0xf6),'label':_0x3cce0a(0x111),'color':_0x3cce0a(0x16b),'local':'edit'}),this[_0x3cce0a(0x170)]&&!this[_0x3cce0a(0x10d)]&&_0x599833[_0x3cce0a(0x112)]({'key':_0x3cce0a(0x14f),'label':_0x3cce0a(0x154),'title':_0x3cce0a(0x10f),'color':_0x3cce0a(0x17b),'local':'type'}),this[_0x3cce0a(0x113)]&&this[_0x3cce0a(0x107)]&&_0x599833[_0x3cce0a(0x112)]({'key':_0x3cce0a(0x186),'label':_0x3cce0a(0xe6),'method':_0x3cce0a(0xfa),'suffix':'','color':'var(--okdb-danger)','confirm':_0x3cce0a(0x153)+this[_0x3cce0a(0x142)]+'\x22?','toast':_0x3cce0a(0x106),'destructive':!0x0}),_0x599833;},'typeName'(_0x4f53b3){return this['typeLabel'][_0x4f53b3]||_0x4f53b3||'Engine';},'glyph':_0x518e15=>c[_0x518e15]??'','pillStyle'(_0x4fd406){const _0x290f46=_0x145ee7,_0x536fbd=_0x4fd406['startsWith']('var(');return _0x290f46(0x144)+(_0x536fbd?'color-mix(in\x20srgb,\x20'+_0x4fd406+_0x290f46(0x121):_0x4fd406+'55')+_0x290f46(0xdf)+_0x4fd406+';\x20background:'+(_0x536fbd?_0x290f46(0xee)+_0x4fd406+_0x290f46(0x169):_0x4fd406+'12')+';';},'typeBadgeStyle'(){const _0x359abb=_0x145ee7;return this[_0x359abb(0xf5)](this[_0x359abb(0x177)][this[_0x359abb(0x108)]?.[_0x359abb(0x14f)]]??_0x359abb(0x147));},'pipelineBadgeStyle':()=>'border-color:#6366f144;\x20color:#a5b4fc;\x20background:#6366f110;','envBadgeStyle':()=>_0x145ee7(0xfe),'healthBadgeStyle'(_0x1940f7){const _0x8d5a89=_0x145ee7;return this[_0x8d5a89(0xf5)](_0x1940f7?.[_0x8d5a89(0x14c)]??_0x8d5a89(0x147));},'typePillStyle'(){const _0x2c3090=_0x145ee7;return this[_0x2c3090(0x128)]();},'statusPillStyle'(){const _0xff8467=_0x145ee7;return this[_0xff8467(0xf5)](this[_0xff8467(0x102)][_0xff8467(0x14c)]??'var(--okdb-app-fg-muted)');},'metricToneColor'(_0x1cf62d=null){const _0x57bc06=_0x145ee7;if(_0x57bc06(0x17f)===_0x1cf62d?.[_0x57bc06(0x17c)]&&Number(String(_0x1cf62d['value'])['replace'](/,/g,''))<=0x0)return _0x57bc06(0x147);switch(_0x1cf62d?.[_0x57bc06(0x138)]){case _0x57bc06(0xe9):return _0x57bc06(0x12e);case _0x57bc06(0x163):return _0x57bc06(0x103);default:return'var(--okdb-app-fg)';}},'metricPercent'(_0x349181=null){const _0x90ee0a=_0x145ee7,_0x487fa0=String(_0x349181?.['value']??'')[_0x90ee0a(0x189)](/(?:\(|\b)(\d{1,3})%/);if(!_0x487fa0)return null;const _0x3657f2=Number(_0x487fa0[0x1]);return Number[_0x90ee0a(0x137)](_0x3657f2)?Math[_0x90ee0a(0x17a)](0x0,Math[_0x90ee0a(0x156)](0x64,_0x3657f2)):null;},'progressMetric'(){const _0x2d60fe=_0x145ee7;return _0x4b1cde(this[_0x2d60fe(0x108)])['find'](_0x5182af=>_0x2d60fe(0x12b)===_0x5182af?.[_0x2d60fe(0x17c)])??null;},'progressFillStyle'(){const _0x6a8fad=_0x145ee7,_0x58fcfe=this[_0x6a8fad(0x15c)]();return _0x6a8fad(0xe5)+(this[_0x6a8fad(0xf7)](_0x58fcfe)??0x0)+_0x6a8fad(0x15b)+(_0x6a8fad(0xe9)===_0x58fcfe?.[_0x6a8fad(0x138)]?_0x6a8fad(0x12e):'warning'===_0x58fcfe?.[_0x6a8fad(0x138)]?'var(--okdb-warning)':'var(--okdb-success)')+';';},'showProgressBar'(){const _0x3f27c2=_0x145ee7,_0x5bbef2=this['metricPercent'](this[_0x3f27c2(0x15c)]());return null!=_0x5bbef2&&_0x5bbef2<0x64;},async 'runAction'(_0x2d15d4){const _0x3058f4=_0x145ee7;if(_0x2d15d4){if(_0x3058f4(0xf6)!==_0x2d15d4[_0x3058f4(0x16f)]){if('type'!==_0x2d15d4[_0x3058f4(0x16f)]){if(this[_0x3058f4(0x162)]&&(!_0x2d15d4[_0x3058f4(0x172)]||await _0x5738fc[_0x3058f4(0xdc)][_0x3058f4(0x173)][_0x3058f4(0x141)][_0x3058f4(0x172)](_0x2d15d4[_0x3058f4(0x172)]))){this[_0x3058f4(0xef)]=!0x0,this[_0x3058f4(0x168)]=null;try{const _0x58c9ef=await fetch(''+this['basePath']+(_0x2d15d4[_0x3058f4(0x14d)]??''),{'method':_0x2d15d4[_0x3058f4(0x150)]??_0x3058f4(0x151)}),_0x342d6d=await _0x58c9ef[_0x3058f4(0x179)]()['catch'](()=>({}));if(!_0x58c9ef['ok'])throw new Error(_0x342d6d?.[_0x3058f4(0x168)]?.[_0x3058f4(0x175)]||_0x2d15d4[_0x3058f4(0x17c)]+_0x3058f4(0x167));_0x5738fc[_0x3058f4(0xdc)]['shared']?.[_0x3058f4(0x13d)]?.[_0x3058f4(0xf0)]?.(_0x2d15d4[_0x3058f4(0x13d)]??_0x2d15d4[_0x3058f4(0x17c)]+_0x3058f4(0xf2)),_0x5738fc[_0x3058f4(0xf3)]('action',_0x2d15d4[_0x3058f4(0x11c)]??_0x2d15d4[_0x3058f4(0x17c)]),_0x5738fc[_0x3058f4(0xf3)](_0x3058f4(0x129));}catch(_0x145526){this[_0x3058f4(0x168)]=_0x145526?.['message']||String(_0x145526),_0x5738fc[_0x3058f4(0xdc)]['shared']?.[_0x3058f4(0x13d)]?.[_0x3058f4(0x168)]?.(this['error']);}finally{this['busy']=!0x1;}}}else _0x5738fc['$dispatch'](_0x3058f4(0x17d),{'engine':this[_0x3058f4(0x108)],'type':this[_0x3058f4(0x170)],'env':this[_0x3058f4(0xe7)]});}else _0x5738fc[_0x3058f4(0xf3)](_0x3058f4(0xf6),this[_0x3058f4(0x108)]);}}}),'template':_0x145ee7(0xfc),'style':_0x145ee7(0x176)};
1
+ import{buildEngineBasePath as e,compactEngineConfigMetrics as r,compactEngineErrorText as t,compactEngineRowMetrics as n,compactEngineRowStatusBadges as i,compactEngineRowSummary as a,compactEngineStatusMeta as s,isEmbeddingsEngine as o}from"../engine-ui-utils.js";function l(e,r=!1){return null==e?r:!0===e||"true"===e||!1!==e&&"false"!==e&&Boolean(e)}const c={Start:"▶",Stop:"■",Pause:"❚❚",Resume:"▶",Restart:"↻",Retry:"↻",Reset:"⟲",Rebuild:"⚒",Edit:"✎",Type:"↗",Delete:"🗑"};export default{tag:"engine-resource-card",attr:{engine:{},env:{},pipeline:{},hidepipeline:{},hidetype:{},hideenv:{},variant:{},compact:{},showdelete:{}},context:d=>({busy:!1,error:null,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-accent-2)","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-accent-2)"},get eng(){return d.$attr.engine??{}},get envName(){return d.$attr.env??this.eng?.env??this.eng?._uiEnv??this.eng?.storeEnv??this.eng?.config?.source_env??null},get isMember(){return"member"===d.$attr.variant||"card"!==d.$attr.variant&&l(d.$attr.compact,!1)},get hidePipeline(){return l(d.$attr.hidepipeline,!1)},get hideType(){return l(d.$attr.hidetype,!1)},get hideEnv(){return l(d.$attr.hideenv,!1)},get showDelete(){return l(d.$attr.showdelete,!1)},get basePath(){return e(this.eng,this.envName)},get embeddingsMode(){return o(this.eng)},get running(){return!!this.eng?.isRunning},get statusMeta(){return s(this.eng)},get paused(){return!0===this.eng?.stats?.paused||!0===this.eng?.runtime?.paused||!0===this.eng?.paused},get pipelineName(){return d.$attr.pipeline??this.eng?.meta?.pipeline??this.eng?.config?.pipeline??this.eng?.config?.collectionEngine??null},get pipelineLabel(){return this.pipelineName?String(this.pipelineName).split(":").pop():null},get sourceType(){return this.eng?.config?.source_type??this.eng?.runtime?.source_type??this.eng?.stats?.source_type??this.eng?.stats?.indexer?.source_type??this.eng?.config?.target_type??null},get canRunLifecycle(){return!!this.basePath},get title(){return this.eng?.name??this.eng?.key??"Engine"},get displayTitle(){const e=String(this.title??"");return e.includes(":")?e.split(":").pop():e},get titleNamespace(){const e=String(this.title??"");return e.includes(":")?e.split(":").slice(0,-1).join(":"):null},get description(){return a(this.eng)},get inlineError(){return t(this.eng)},get metadata(){const e=["Source","Field","Storage","Embedder","Dims","Algorithm","Provider","Model","Concurrency","Poll","TTL","Mode","Prepare","Chunk"],t=new Map(r(this.eng).map(e=>[e.label,e])),n=[];for(const r of e){if(this.isMember&&"Embedder"===r)continue;const e=t.get(r);e&&(n.push(e),t.delete(r))}for(const e of t.values())(this.isMember||this.hideEnv)&&"Source env"===e.label||n.push(e);return n.slice(0,this.isMember?6:10)},get metrics(){const e=["Field","Mode","Prepare","Chunk","Embedder","Provider","Model","Algorithm"];return n(this.eng).filter(r=>!e.includes(r.label)).slice(0,this.isMember?5:8)},get healthBadges(){const e=this.statusMeta.label;return i(this.eng).filter(r=>r?.text&&r.text!==e).filter(e=>!(this.running&&"healthy"===e.text)).slice(0,2)},get primaryAction(){return this.canRunLifecycle?this.embeddingsMode?this.running?{label:"Stop",method:"POST",suffix:"/stop",color:"var(--okdb-warning)",confirm:`Stop engine "${this.title}"?`,toast:"Engine stopped"}:"error"===this.eng?.status?{label:"Restart",method:"POST",suffix:"/restart",color:"var(--okdb-orange)",confirm:`Restart engine "${this.title}"?`,toast:"Engine restarted"}:{label:"Start",method:"POST",suffix:"/start",color:"var(--okdb-success)",confirm:null,toast:"Engine started"}:"error"===this.eng?.status?{label:"Retry",method:"POST",suffix:"/retry",color:"var(--okdb-orange)",confirm:null,toast:"Engine retry started"}:this.paused?{label:"Resume",method:"POST",suffix:"/resume",color:"var(--okdb-success)",confirm:null,toast:"Engine resumed"}:{label:"Pause",method:"POST",suffix:"/pause",color:"var(--okdb-warning)",confirm:null,toast:"Engine paused"}:null},get overflowActions(){const e=[];return this.canRunLifecycle&&(e.push({key:"restart",label:"Restart",method:"POST",suffix:"/restart",color:"var(--okdb-app-fg-muted)",confirm:this.embeddingsMode?`Restart engine "${this.title}"?`:null,toast:"Engine restarted"}),this.embeddingsMode||e.push({key:"pause",label:this.paused?"Resume":"Pause",method:"POST",suffix:this.paused?"/resume":"/pause",color:this.paused?"var(--okdb-success)":"var(--okdb-warning)",toast:this.paused?"Engine resumed":"Engine paused"}),"materializer"===this.eng?.type&&(e.push({key:"reset",label:"Reset",title:"Reset Cursor",method:"POST",suffix:"/reset-cursor",color:"var(--okdb-info)",confirm:`Reset cursor for engine "${this.title}"?`,toast:"Engine cursor reset"}),e.push({key:"rebuild",label:"Rebuild",method:"POST",suffix:"/rebuild",color:"var(--okdb-success)",confirm:`Rebuild engine "${this.title}"?`,toast:"Engine rebuild started"}))),e.push({key:"edit",label:"Edit",color:"var(--okdb-accent)",local:"edit"}),this.sourceType&&!this.hideType&&e.push({key:"type",label:"Type",title:"View Type Context",color:"var(--okdb-accent-2)",local:"type"}),this.showDelete&&this.canRunLifecycle&&e.push({key:"delete",label:"Delete",method:"DELETE",suffix:"",color:"var(--okdb-danger)",confirm:`Delete engine "${this.title}"?`,toast:"Engine deleted",destructive:!0}),e},typeName(e){return this.typeLabel[e]||e||"Engine"},glyph:e=>c[e]??"",pillStyle(e){const r=e.startsWith("var(");return`border-color:${r?`color-mix(in srgb, ${e} 33%, transparent)`:`${e}55`}; color:${e}; background:${r?`color-mix(in srgb, ${e} 7%, transparent)`:`${e}12`};`},typeBadgeStyle(){return this.pillStyle(this.typeColor[this.eng?.type]??"var(--okdb-app-fg-muted)")},pipelineBadgeStyle:()=>"border-color:#6366f144; color:#a5b4fc; background:#6366f110;",envBadgeStyle:()=>"border-color:color-mix(in srgb, var(--okdb-app-border) 40%, transparent); color:#7a93a8; background:transparent;",healthBadgeStyle(e){return this.pillStyle(e?.color??"var(--okdb-app-fg-muted)")},typePillStyle(){return this.typeBadgeStyle()},statusPillStyle(){return this.pillStyle(this.statusMeta.color??"var(--okdb-app-fg-muted)")},metricToneColor(e=null){if("Error"===e?.label&&Number(String(e.value).replace(/,/g,""))<=0)return"var(--okdb-app-fg-muted)";switch(e?.tone){case"danger":return"var(--okdb-danger)";case"warning":return"var(--okdb-warning)";default:return"var(--okdb-app-fg)"}},metricPercent(e=null){const r=String(e?.value??"").match(/(?:\(|\b)(\d{1,3})%/);if(!r)return null;const t=Number(r[1]);return Number.isFinite(t)?Math.max(0,Math.min(100,t)):null},progressMetric(){return n(this.eng).find(e=>"Progress"===e?.label)??null},progressFillStyle(){const e=this.progressMetric();return`height:100%;width:${this.metricPercent(e)??0}%;border-radius:999px;background:${"danger"===e?.tone?"var(--okdb-danger)":"warning"===e?.tone?"var(--okdb-warning)":"var(--okdb-success)"};`},showProgressBar(){const e=this.metricPercent(this.progressMetric());return null!=e&&e<100},async runAction(e){if(e)if("edit"!==e.local)if("type"!==e.local){if(this.basePath&&(!e.confirm||await d.$ok.shared.modal.confirm(e.confirm))){this.busy=!0,this.error=null;try{const r=await fetch(`${this.basePath}${e.suffix??""}`,{method:e.method??"POST"}),t=await r.json().catch(()=>({}));if(!r.ok)throw new Error(t?.error?.message||`${e.label} failed`);d.$ok.shared?.toast?.success?.(e.toast??`${e.label} complete`),d.$dispatch("action",e.key??e.label),d.$dispatch("refresh")}catch(e){this.error=e?.message||String(e),d.$ok.shared?.toast?.error?.(this.error)}finally{this.busy=!1}}}else d.$dispatch("type-context",{engine:this.eng,type:this.sourceType,env:this.envName});else d.$dispatch("edit",this.eng)}}),template:'\n<div :class="isMember ? \'engine-resource-card erc erc--member\' : \'engine-resource-card erc erc--card\'">\n\n \x3c!-- ── Name + type + status + actions row ── --\x3e\n <div class="erc-header">\n <span class="erc-dot" :style="\'background:\' + statusMeta.color + \';box-shadow:0 0 0 3px color-mix(in srgb, \' + statusMeta.color + \' 13%, transparent);\'" :title="statusMeta.title"></span>\n <div class="erc-name-group">\n <code class="erc-name" :title="title">{{ displayTitle }}</code>\n <if :="titleNamespace">\n <span class="erc-ns">{{ titleNamespace }}</span>\n </if>\n </div>\n <span class="erc-pill" :style="typeBadgeStyle()">{{ typeName(eng.role || eng.type) }}</span>\n <if :="!running">\n <span class="erc-pill" :style="statusPillStyle()">{{ statusMeta.label }}</span>\n </if>\n <if :="pipelineLabel && !hidePipeline">\n <span class="erc-pill" :style="pipelineBadgeStyle()" :title="\'pipeline: \' + pipelineName">{{ pipelineLabel }}</span>\n </if>\n <if :="envName && !isMember">\n <span class="erc-pill" :style="envBadgeStyle()" :title="\'env: \' + envName">{{ envName }}</span>\n </if>\n <each :of="healthBadges" let:item="badge">\n <span class="erc-pill" :style="healthBadgeStyle(badge)" :title="badge.title">{{ badge.text }}</span>\n </each>\n <span class="erc-spacer"></span>\n <each :of="overflowActions" let:item="action">\n <button @click="runAction(action)" :disabled="busy" :title="action.title || action.label" class="erc-btn erc-btn--muted" :style="\'color:\' + action.color + \';\'">{{ glyph(action.label) }} {{ action.label }}</button>\n </each>\n <if :="overflowActions.length > 0 && primaryAction">\n <span class="erc-sep"></span>\n </if>\n <if :="primaryAction">\n <button @click="runAction(primaryAction)" :disabled="busy" class="erc-btn erc-btn--primary" :style="pillStyle(primaryAction.color)">{{ busy ? \'…\' : (glyph(primaryAction.label) + \' \' + primaryAction.label) }}</button>\n </if>\n </div>\n\n \x3c!-- ── Summary (card mode only) ── --\x3e\n <if :="description && !isMember">\n <div class="erc-summary">{{ description }}</div>\n </if>\n\n \x3c!-- ── Config metadata ── --\x3e\n <if :="metadata.length > 0">\n <div class="erc-kv-row">\n <each :of="metadata" let:item="metric">\n <span class="erc-kv" :title="metric.title">\n <span class="erc-kv__label">{{ metric.label }}</span>\n <span class="erc-kv__val">{{ metric.value }}</span>\n </span>\n </each>\n </div>\n </if>\n\n \x3c!-- ── Runtime metrics ── --\x3e\n <if :="metrics.length > 0">\n <div class="erc-kv-row erc-kv-row--metrics">\n <each :of="metrics" let:item="metric">\n <span class="erc-kv" :title="metric.title">\n <span class="erc-kv__label">{{ metric.label }}</span>\n <span class="erc-kv__val" :style="\'color:\' + metricToneColor(metric)">{{ metric.value }}</span>\n </span>\n </each>\n </div>\n </if>\n\n \x3c!-- ── Progress bar ── --\x3e\n <if :="showProgressBar()">\n <div class="erc-progress" :title="progressMetric()?.title">\n <div :style="progressFillStyle()"></div>\n </div>\n </if>\n\n \x3c!-- ── Error ── --\x3e\n <if :="inlineError || error">\n <div class="erc-error">⚠ {{ inlineError || error }}</div>\n </if>\n\n</div>\n',style:"\nengine-resource-card { display: block; }\n\n/* ── Top-level hover (applies when component root carries .engine-resource-card class) ── */\n.engine-resource-card:hover { border-color: var(--okdb-app-border-strong); }\n\n/* ── Card variant (standalone) ─────────────────────── */\nengine-resource-card .erc--card {\n background: var(--okdb-app-surface);\n border: 1px solid var(--okdb-app-border);\n border-radius: 10px;\n padding: 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n box-shadow: 0 0 4px rgba(255,255,255,0.03);\n transition: border-color .14s;\n}\nengine-resource-card .erc--card:hover { border-color: var(--okdb-app-border-strong); }\n\n/* ── Member variant (inside pipeline) ──────────────── */\nengine-resource-card .erc--member {\n background: var(--okdb-app-surface);\n border: 1px solid var(--okdb-app-surface-2);\n border-radius: 8px;\n padding: 9px 12px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n transition: border-color .12s, background .12s;\n}\nengine-resource-card .erc--member:hover { border-color: var(--okdb-app-border-strong); background: var(--okdb-app-surface); }\n\n/* ── Header row ───────────────────────────────────── */\nengine-resource-card .erc-header { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; min-width: 0; }\nengine-resource-card .erc-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }\nengine-resource-card .erc-name-group { display: flex; align-items: baseline; gap: 5px; min-width: 0; }\nengine-resource-card .erc-name { font-size: 13px; font-weight: 600; color: var(--okdb-app-fg-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; letter-spacing: -.01em; }\nengine-resource-card .erc-ns { font-size: 10.5px; color: var(--okdb-app-fg-subtle); white-space: nowrap; }\nengine-resource-card .erc-spacer { flex: 1; min-width: 0; }\nengine-resource-card .erc-sep { width: 1px; height: 12px; background: var(--okdb-app-border); flex-shrink: 0; }\n\n/* ── Pills ────────────────────────────────────────── */\nengine-resource-card .erc-pill { font-size: 10.5px; padding: 1px 8px; border-radius: 999px; border: 1px solid var(--okdb-app-border); color: var(--okdb-app-fg-muted); background: transparent; display: inline-flex; align-items: center; white-space: nowrap; flex-shrink: 0; letter-spacing: .01em; }\nengine-resource-card .erc-pill--pipeline { border-color: #6366f144; color: #a5b4fc; background: #6366f110; }\nengine-resource-card .erc-pill--env { border-color: color-mix(in srgb, var(--okdb-app-border) 40%, transparent); color: #7a93a8; }\n\n/* ── Buttons ──────────────────────────────────────── */\nengine-resource-card .erc-btn { font-size: 11px; padding: 2px 10px; border-radius: 999px; border: 1px solid; cursor: pointer; line-height: 1.5; flex-shrink: 0; white-space: nowrap; transition: filter .12s; }\nengine-resource-card .erc-btn--primary { font-weight: 600; }\nengine-resource-card .erc-btn--muted { background: var(--okdb-app-bg-deep); border-color: var(--okdb-app-border); }\nengine-resource-card .erc-btn:hover:not(:disabled) { filter: brightness(1.3); }\nengine-resource-card .erc-btn:disabled { opacity: .4; cursor: not-allowed; }\n\n/* ── Content rows ─────────────────────────────────── */\nengine-resource-card .erc-summary { font-size: 11.5px; line-height: 1.55; color: #6d8899; padding-left: 12px; }\nengine-resource-card .erc-kv-row { display: grid; grid-template-columns:repeat(auto-fit, minmax(180px, 1fr)); gap: 2px 12px; padding-left: 12px; }\nengine-resource-card .erc--member .erc-kv-row { grid-template-columns: repeat(3, 1fr); gap: 2px 10px; }\nengine-resource-card .erc-kv-row--metrics { border-top: 1px solid var(--okdb-app-border); padding-top: 6px; }\nengine-resource-card .erc-kv { display: inline-flex; gap: 4px; align-items: baseline; font-size: 11px; line-height: 1.35; }\nengine-resource-card .erc-kv__label { font-size: 9.5px; text-transform: uppercase; letter-spacing: .04em; color: var(--okdb-app-fg-subtle); flex-shrink: 0; }\nengine-resource-card .erc-kv__val { color: #a8c4d9; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\nengine-resource-card .erc-progress { height: 3px; width: 100%; border-radius: 999px; background: var(--okdb-app-bg-deep); overflow: hidden; }\nengine-resource-card .erc-error { font-size: 11px; line-height: 1.5; color: var(--okdb-danger); border-top: 1px solid var(--okdb-app-border); padding-top: 6px; padding-left: 12px; }\n"};
@@ -1 +1 @@
1
- function _0x3e33(_0x1e3bfe,_0x593c80){_0x1e3bfe=_0x1e3bfe-0xa6;var _0x570c7c=_0x570c();var _0x3e33d8=_0x570c7c[_0x1e3bfe];return _0x3e33d8;}var _0xfb5671=_0x3e33;(function(_0x336ed8,_0x38582c){var _0x5e4a7b=_0x3e33,_0x48455e=_0x336ed8();while(!![]){try{var _0x43ac80=parseInt(_0x5e4a7b(0xbb))/0x1*(-parseInt(_0x5e4a7b(0xac))/0x2)+parseInt(_0x5e4a7b(0xc3))/0x3*(-parseInt(_0x5e4a7b(0xaf))/0x4)+parseInt(_0x5e4a7b(0xb7))/0x5*(parseInt(_0x5e4a7b(0xbc))/0x6)+parseInt(_0x5e4a7b(0xb6))/0x7+parseInt(_0x5e4a7b(0xc6))/0x8+-parseInt(_0x5e4a7b(0xb4))/0x9*(-parseInt(_0x5e4a7b(0xb3))/0xa)+-parseInt(_0x5e4a7b(0xa8))/0xb;if(_0x43ac80===_0x38582c)break;else _0x48455e['push'](_0x48455e['shift']());}catch(_0x7d96eb){_0x48455e['push'](_0x48455e['shift']());}}}(_0x570c,0x360c9));function _0x570c(){var _0xe6082=['Edit','2060120ESwfav',';background:','var(--okdb-app-border)','var(--okdb-app-surface)','6092691YIHzOi','\x0a<button\x0a\x20\x20@click=\x22select()\x22\x0a\x20\x20:style=\x22rootStyle\x22\x0a>\x0a\x20\x20<span\x20:style=\x22\x27width:6px;height:6px;border-radius:50%;flex-shrink:0;background:\x27\x20+\x20tone\x22></span>\x0a\x20\x20<span\x20:style=\x22\x27font-size:10px;padding:1px\x206px;border-radius:4px;border:1px\x20solid\x20\x27\x20+\x20labelAlpha(rowLabelColor)\x20+\x20\x27;color:\x27\x20+\x20rowLabelColor\x20+\x20\x27;min-width:54px;text-align:center;flex-shrink:0;\x27\x22>{{\x20rowLabel\x20}}</span>\x0a\x20\x20<span\x20style=\x22flex:1;font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\x22>{{\x20rowTitle\x20}}</span>\x0a\x20\x20<if\x20:=\x22rowSubtitle\x22>\x0a\x20\x20\x20\x20<span\x20style=\x22font-size:11px;opacity:.4;font-style:italic;flex-shrink:0;\x22>{{\x20rowSubtitle\x20}}</span>\x0a\x20\x20</if>\x0a\x20\x20<slot\x20/>\x0a\x20\x20<if\x20:=\x22hasActionLabel\x22>\x0a\x20\x20\x20\x20<span\x20style=\x22font-size:11px;padding:2px\x208px;border-radius:999px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);color:var(--okdb-accent);flex-shrink:0;\x22>{{\x20rowActionLabel\x20}}</span>\x0a\x20\x20</if>\x0a</button>\x0a','startsWith','labelColor','22OWSfZf','selected','color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent)','1904PCFzeB','engine','$dispatch','rowActionLabel','183570wSvxFG','171lHtyAE','true','1392006jgqDIt','30pkasyR','actionLabel','name','engine-row-item','20778EGbuQs','353844uiHPPd','isSelected','type',';cursor:pointer;width:100%;text-align:left;color:inherit;min-width:0;','display:flex;align-items:center;gap:7px;padding:7px\x209px;border-radius:6px;border:1px\x20solid\x20','$attr','var(--okdb-app-bg-deep)','978wEdVpi','eng'];_0x570c=function(){return _0xe6082;};return _0x570c();}import{statusTone as _0x44feca}from'../engine-ui-utils.js';export default{'tag':_0xfb5671(0xba),'attr':{'engine':{},'label':{},'labelColor':{},'subtitle':{},'title':{},'actionLabel':{},'selected':{}},'context':_0x2b7408=>({get 'eng'(){var _0x26d761=_0xfb5671;return _0x2b7408[_0x26d761(0xc1)][_0x26d761(0xb0)]??{};},get 'tone'(){var _0x4fd6b2=_0xfb5671;return _0x44feca(this[_0x4fd6b2(0xc4)]);},get 'rowTitle'(){var _0x4e9562=_0xfb5671;return _0x2b7408[_0x4e9562(0xc1)]['title']??this[_0x4e9562(0xc4)][_0x4e9562(0xb9)]??'engine';},get 'rowLabel'(){var _0x40abd9=_0xfb5671;return _0x2b7408[_0x40abd9(0xc1)]['label']??this[_0x40abd9(0xc4)][_0x40abd9(0xbe)]??'engine';},get 'rowLabelColor'(){var _0x230108=_0xfb5671;return _0x2b7408[_0x230108(0xc1)][_0x230108(0xab)]??'var(--okdb-accent)';},'labelAlpha':(_0x2e8b45,_0x56cc78=0x1b)=>_0x2e8b45[_0xfb5671(0xaa)]('var(')?'color-mix(in\x20srgb,\x20'+_0x2e8b45+'\x20'+_0x56cc78+'%,\x20transparent)':_0x2e8b45+'44',get 'rowSubtitle'(){return _0x2b7408['$attr']['subtitle']??'';},get 'rowActionLabel'(){var _0x20229a=_0xfb5671;return _0x2b7408[_0x20229a(0xc1)][_0x20229a(0xb8)]??_0x20229a(0xc5);},get 'hasActionLabel'(){var _0x200dc8=_0xfb5671;return!!(this[_0x200dc8(0xb2)]||'')['trim']();},get 'isSelected'(){var _0x5e13a1=_0xfb5671;return!0x0===_0x2b7408[_0x5e13a1(0xc1)]['selected']||_0x5e13a1(0xb5)===_0x2b7408[_0x5e13a1(0xc1)][_0x5e13a1(0xad)];},get 'rootStyle'(){var _0x547654=_0xfb5671;return _0x547654(0xc0)+(this[_0x547654(0xbd)]?_0x547654(0xae):_0x547654(0xa6))+_0x547654(0xc7)+(this['isSelected']?_0x547654(0xa7):_0x547654(0xc2))+_0x547654(0xbf);},'select'(){var _0x4bd00c=_0xfb5671;_0x2b7408[_0x4bd00c(0xb1)]('select',this[_0x4bd00c(0xc4)]);}}),'template':_0xfb5671(0xa9)};
1
+ import{statusTone as e}from"../engine-ui-utils.js";export default{tag:"engine-row-item",attr:{engine:{},label:{},labelColor:{},subtitle:{},title:{},actionLabel:{},selected:{}},context:t=>({get eng(){return t.$attr.engine??{}},get tone(){return e(this.eng)},get rowTitle(){return t.$attr.title??this.eng.name??"engine"},get rowLabel(){return t.$attr.label??this.eng.type??"engine"},get rowLabelColor(){return t.$attr.labelColor??"var(--okdb-accent)"},labelAlpha:(e,t=27)=>e.startsWith("var(")?`color-mix(in srgb, ${e} ${t}%, transparent)`:`${e}44`,get rowSubtitle(){return t.$attr.subtitle??""},get rowActionLabel(){return t.$attr.actionLabel??"Edit"},get hasActionLabel(){return!!(this.rowActionLabel||"").trim()},get isSelected(){return!0===t.$attr.selected||"true"===t.$attr.selected},get rootStyle(){return`display:flex;align-items:center;gap:7px;padding:7px 9px;border-radius:6px;border:1px solid ${this.isSelected?"color-mix(in srgb, var(--okdb-accent) 33%, transparent)":"var(--okdb-app-border)"};background:${this.isSelected?"var(--okdb-app-surface)":"var(--okdb-app-bg-deep)"};cursor:pointer;width:100%;text-align:left;color:inherit;min-width:0;`},select(){t.$dispatch("select",this.eng)}}),template:'\n<button\n @click="select()"\n :style="rootStyle"\n>\n <span :style="\'width:6px;height:6px;border-radius:50%;flex-shrink:0;background:\' + tone"></span>\n <span :style="\'font-size:10px;padding:1px 6px;border-radius:4px;border:1px solid \' + labelAlpha(rowLabelColor) + \';color:\' + rowLabelColor + \';min-width:54px;text-align:center;flex-shrink:0;\'">{{ rowLabel }}</span>\n <span style="flex:1;font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">{{ rowTitle }}</span>\n <if :="rowSubtitle">\n <span style="font-size:11px;opacity:.4;font-style:italic;flex-shrink:0;">{{ rowSubtitle }}</span>\n </if>\n <slot />\n <if :="hasActionLabel">\n <span style="font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb, var(--okdb-accent) 27%, transparent);color:var(--okdb-accent);flex-shrink:0;">{{ rowActionLabel }}</span>\n </if>\n</button>\n'};
@@ -1 +1 @@
1
- const _0x224a85=_0x493d;function _0x493d(_0x1c3754,_0x312219){_0x1c3754=_0x1c3754-0x118;const _0x33bbd2=_0x33bb();let _0x493d77=_0x33bbd2[_0x1c3754];return _0x493d77;}(function(_0x58ed1f,_0x412710){const _0x4ef6e8=_0x493d,_0x1e05b6=_0x58ed1f();while(!![]){try{const _0xeb7887=-parseInt(_0x4ef6e8(0x16f))/0x1+parseInt(_0x4ef6e8(0x166))/0x2*(parseInt(_0x4ef6e8(0x196))/0x3)+parseInt(_0x4ef6e8(0x140))/0x4+parseInt(_0x4ef6e8(0x126))/0x5*(parseInt(_0x4ef6e8(0x170))/0x6)+parseInt(_0x4ef6e8(0x154))/0x7*(-parseInt(_0x4ef6e8(0x195))/0x8)+-parseInt(_0x4ef6e8(0x1b2))/0x9+parseInt(_0x4ef6e8(0x13a))/0xa;if(_0xeb7887===_0x412710)break;else _0x1e05b6['push'](_0x1e05b6['shift']());}catch(_0x342deb){_0x1e05b6['push'](_0x1e05b6['shift']());}}}(_0x33bb,0x4f995));import _0x1b8cfb from'./engine-panel-shell.ok.js';import _0x418dcd from'../../functions/modals/function-modal.ok.js';import{ENGINE_PANEL_SHARED_STYLE as _0x2b5256}from'../engine-panel-shared-style.js';import{buildEngineBasePath as _0x2a72f3,formatJsonValue as _0x3d4a0d,getApiErrorMessage as _0x2a7ee6,openFunctionRoute as _0x3096d,resolveEngineEnvName as _0x2c2102}from'../engine-ui-utils.js';function o(_0x2c0f08,_0x4911e3='—'){const _0x529e6f=_0x493d;return null==_0x2c0f08||''===_0x2c0f08?_0x4911e3:Array[_0x529e6f(0x153)](_0x2c0f08)?_0x2c0f08[_0x529e6f(0x118)]?_0x2c0f08[_0x529e6f(0x173)](',\x20'):_0x4911e3:'boolean'==typeof _0x2c0f08?_0x2c0f08?'yes':'no':String(_0x2c0f08);}function c(_0x57f7d4,_0x60b0b8=[]){const _0x1315ed=_0x493d;return function(_0x48c93b){const _0x686103=_0x493d;return!!_0x48c93b&&_0x686103(0x199)==typeof _0x48c93b&&!Array['isArray'](_0x48c93b);}(_0x57f7d4)?Object[_0x1315ed(0x11a)](_0x57f7d4)[_0x1315ed(0x194)](([_0x62fbac,_0x42cae8])=>!_0x60b0b8['includes'](_0x62fbac)&&(null==_0x42cae8||['string',_0x1315ed(0x128),_0x1315ed(0x188)][_0x1315ed(0x162)](typeof _0x42cae8))):[];}function d(_0x2ae7fd,_0x594e76){const _0x498e48=_0x493d;if(''===_0x2ae7fd||null==_0x2ae7fd)return null;const _0x2ed44b=Math[_0x498e48(0x144)](Number(_0x2ae7fd));if(!Number[_0x498e48(0x11e)](_0x2ed44b)||_0x2ed44b<0x1)throw new Error(_0x594e76+_0x498e48(0x192));return _0x2ed44b;}function p(_0x3742c4){const _0xf7173f=_0x493d;if(null==_0x3742c4||''===_0x3742c4)return'—';const _0x24e54b=Number(_0x3742c4);if(!Number[_0xf7173f(0x11e)](_0x24e54b))return String(_0x3742c4);const _0x1e50b1=_0x24e54b<=0x1?0x64*_0x24e54b:_0x24e54b;return Math['round'](_0x1e50b1)+'%';}export default{'tag':_0x224a85(0x156),'dependencies':[_0x1b8cfb,_0x418dcd],'attr':{'engine':{},'env':{},'modal':{}},'context':_0xe5eb0c=>({'saveConfigBusy':!0x1,'saveConfigError':null,'materializerRepairBusy':!0x1,'materializerRepairError':null,'showRawRuntime':!0x1,'showRawStats':!0x1,'showRawConfig':!0x1,'workerConfigDraft':{'concurrency':'','pollInterval':'','ttl':''},get 'eng'(){const _0x3235de=_0x224a85;return _0xe5eb0c[_0x3235de(0x1aa)][_0x3235de(0x186)]??{};},get 'envName'(){const _0x3a6c5f=_0x224a85;return _0x2c2102(this['eng'],_0xe5eb0c[_0x3a6c5f(0x1aa)]['env']??null);},get 'basePath'(){const _0x22467a=_0x224a85;return _0x2a72f3(this[_0x22467a(0x18b)],this['envName']);},get 'isQueueWorker'(){const _0x2d6965=_0x224a85;return _0x2d6965(0x179)===this['eng'][_0x2d6965(0x177)];},get 'isProcessor'(){const _0x5826c6=_0x224a85;return'processor'===this['eng'][_0x5826c6(0x177)];},get 'isMaterializer'(){const _0x6a2756=_0x224a85;return _0x6a2756(0x16a)===this['eng'][_0x6a2756(0x177)];},get 'hasSpecializedPipelineView'(){return this['isQueueWorker']||this['isProcessor']||this['isMaterializer'];},get 'stateText'(){const _0x1788db=_0x224a85;return _0x1788db(0x17f)===this[_0x1788db(0x18b)]['status']?_0x1788db(0x17f):_0x1788db(0x120)===this[_0x1788db(0x18b)][_0x1788db(0x1a7)]?_0x1788db(0x120):this[_0x1788db(0x18b)]['isRunning']||'online'===this[_0x1788db(0x18b)]['status']?_0x1788db(0x174):this['eng']['status']||_0x1788db(0x14f);},get 'reasonText'(){const _0x3d6580=_0x224a85,_0x8c3823=this['eng']['reason']??null;return _0x8c3823&&_0x8c3823!==this[_0x3d6580(0x17d)]?String(_0x8c3823)[_0x3d6580(0x1a4)](/_/g,'\x20'):'—';},get 'affinityText'(){const _0xf05ff4=_0x224a85;return o(this[_0xf05ff4(0x18b)][_0xf05ff4(0x18e)],_0xf05ff4(0x1ac));},get 'updatedText'(){const _0x4bc91c=_0x224a85;return function(_0x461030){const _0x1c34d5=_0x493d;if(!_0x461030)return'—';try{return new Date(_0x461030)[_0x1c34d5(0x1a6)]();}catch{return String(_0x461030);}}(this['eng']['runtime']?.[_0x4bc91c(0x150)]);},get 'runtimePreviewEntries'(){const _0xbcab80=_0x224a85;return c(this['eng']['runtime'],[_0xbcab80(0x16d),_0xbcab80(0x131),_0xbcab80(0x17f),_0xbcab80(0x174),_0xbcab80(0x150)]);},get 'statsPreviewEntries'(){const _0x371f9e=_0x224a85;return c(this['eng'][_0x371f9e(0x14d)],[_0x371f9e(0x1a3),_0x371f9e(0x14b),_0x371f9e(0x19e),'handler',_0x371f9e(0x137),_0x371f9e(0x19f),_0x371f9e(0x13c),'running']);},get 'configPreviewEntries'(){const _0x13bc74=_0x224a85;return c(this[_0x13bc74(0x18b)][_0x13bc74(0x11b)],['job_type',_0x13bc74(0x19e),_0x13bc74(0x183),_0x13bc74(0x137),_0x13bc74(0x160),'ttl']);},get 'workerStats'(){const _0x51a7b3=_0x224a85;return this[_0x51a7b3(0x18b)][_0x51a7b3(0x14d)]??{};},get 'pipelineStats'(){const _0x36931e=_0x224a85;return this[_0x36931e(0x18b)][_0x36931e(0x14d)]??{};},get 'workerHandler'(){const _0x339165=_0x224a85;return this[_0x339165(0x18f)][_0x339165(0x183)]??this[_0x339165(0x18b)]['config']?.[_0x339165(0x183)]??null;},get 'pipelineHandler'(){const _0x1999ff=_0x224a85;return this[_0x1999ff(0x13f)][_0x1999ff(0x183)]??this[_0x1999ff(0x18b)][_0x1999ff(0x11b)]?.[_0x1999ff(0x183)]??null;},get 'handlerName'(){const _0xfe0eef=_0x224a85;return this[_0xfe0eef(0x14e)]?.[_0xfe0eef(0x159)]??null;},get 'handlerEnv'(){const _0x398bd5=_0x224a85;return this[_0x398bd5(0x14e)]?.[_0x398bd5(0x16b)]??this[_0x398bd5(0x13b)]??'—';},get 'canOpenHandlerFunction'(){const _0x55f74e=_0x224a85;return!!this[_0x55f74e(0x1a9)];},get 'workerJobType'(){const _0x1a7e01=_0x224a85;return this[_0x1a7e01(0x18f)]['job_type']??this[_0x1a7e01(0x18b)]['config']?.['job_type']??'—';},get 'workerQueueEnv'(){const _0x5c87be=_0x224a85;return this[_0x5c87be(0x18f)]['queue_env']??this[_0x5c87be(0x18b)][_0x5c87be(0x11b)]?.['queue_env']??this['envName']??'—';},get 'workerFunctionEnv'(){const _0x19e91e=_0x224a85;return this[_0x19e91e(0x1a1)]?.[_0x19e91e(0x16b)]??this[_0x19e91e(0x13b)]??'—';},get 'workerRecordRuns'(){const _0xe12ae2=_0x224a85;return this[_0xe12ae2(0x18b)][_0xe12ae2(0x11b)]?.[_0xe12ae2(0x183)]?.[_0xe12ae2(0x16c)]??'all';},get 'workerProcessed'(){const _0x40572d=_0x224a85;return this['workerStats'][_0x40572d(0x19f)]??0x0;},get 'workerFailed'(){const _0x491068=_0x224a85;return this[_0x491068(0x18f)][_0x491068(0x13c)]??0x0;},get 'workerRunning'(){const _0x206675=_0x224a85;return this['workerStats'][_0x206675(0x174)]??0x0;},get 'workerConcurrency'(){const _0x1eedc0=_0x224a85;return this['workerStats'][_0x1eedc0(0x137)]??this[_0x1eedc0(0x18b)][_0x1eedc0(0x11b)]?.[_0x1eedc0(0x137)]??0x1;},get 'workerPollInterval'(){const _0x1a0b89=_0x224a85;return this[_0x1a0b89(0x18b)]['config']?.[_0x1a0b89(0x160)]??0x3e8;},get 'workerTtl'(){const _0x429f75=_0x224a85;return this[_0x429f75(0x18b)][_0x429f75(0x11b)]?.['ttl']??0x7530;},get 'canOpenWorkerFunction'(){const _0x2afd03=_0x224a85;return!!this[_0x2afd03(0x1a1)]?.[_0x2afd03(0x159)];},get 'showWorkerReason'(){const _0x5e1e9d=_0x224a85;return'—'!==this[_0x5e1e9d(0x141)]&&_0x5e1e9d(0x174)!==this[_0x5e1e9d(0x141)];},get 'showWorkerAffinity'(){const _0x379ced=_0x224a85;return _0x379ced(0x1ac)!==this['affinityText'];},get 'processorSourceType'(){const _0x3dc13e=_0x224a85;return this['pipelineStats'][_0x3dc13e(0x191)]??this[_0x3dc13e(0x18b)]['config']?.['source_type']??'—';},get 'processorSourceEnv'(){const _0x118d24=_0x224a85;return this[_0x118d24(0x13f)][_0x118d24(0x189)]??this[_0x118d24(0x18b)][_0x118d24(0x11b)]?.[_0x118d24(0x189)]??this['envName']??'—';},get 'processorMode'(){const _0x37ed01=_0x224a85;return this[_0x37ed01(0x13f)]['mode']??this['eng'][_0x37ed01(0x11b)]?.[_0x37ed01(0x1ab)]??'async';},get 'processorBootstrap'(){const _0x10f704=_0x224a85;return this[_0x10f704(0x13f)]['bootstrap']??this[_0x10f704(0x18b)]['config']?.[_0x10f704(0x15a)]??_0x10f704(0x146);},get 'processorOriginMode'(){const _0x3ce51a=_0x224a85;return this[_0x3ce51a(0x13f)][_0x3ce51a(0x1a0)]??this[_0x3ce51a(0x18b)]['config']?.['originMode']??_0x3ce51a(0x151);},get 'processorBatchSize'(){const _0x30402e=_0x224a85;return this[_0x30402e(0x13f)][_0x30402e(0x136)]??this[_0x30402e(0x18b)][_0x30402e(0x11b)]?.[_0x30402e(0x136)]??0x100;},get 'processorCursorKey'(){const _0x4d1268=_0x224a85;return this[_0x4d1268(0x13f)][_0x4d1268(0x139)]??this['eng'][_0x4d1268(0x11b)]?.[_0x4d1268(0x139)]??this[_0x4d1268(0x18b)][_0x4d1268(0x143)]??'—';},get 'processorLockMode'(){const _0xc40c63=_0x224a85;return this[_0xc40c63(0x13f)][_0xc40c63(0x134)]??this[_0xc40c63(0x18b)][_0xc40c63(0x11b)]?.[_0xc40c63(0x134)]??_0xc40c63(0x1af);},get 'processorHydrateValues'(){const _0x2b0181=_0x224a85;return o(this[_0x2b0181(0x13f)][_0x2b0181(0x197)]??this[_0x2b0181(0x18b)][_0x2b0181(0x11b)]?.[_0x2b0181(0x197)]??!0x0);},get 'processorFailOnHandlerError'(){const _0x27affe=_0x224a85;return o(this[_0x27affe(0x13f)]['failOnHandlerError']??this[_0x27affe(0x18b)]['config']?.[_0x27affe(0x17e)]??!0x0);},get 'processorInvocations'(){const _0x8ed9b8=_0x224a85;return this[_0x8ed9b8(0x13f)][_0x8ed9b8(0x12f)]??0x0;},get 'processorProcessedChanges'(){const _0xfabfe1=_0x224a85;return this[_0xfabfe1(0x13f)][_0xfabfe1(0x184)]??0x0;},get 'processorFailedBatches'(){const _0xe79989=_0x224a85;return this[_0xe79989(0x13f)][_0xe79989(0x157)]??0x0;},get 'processorRunningBatches'(){const _0x3201a2=_0x224a85;return this[_0x3201a2(0x13f)][_0x3201a2(0x17a)]??0x0;},get 'processorLag'(){const _0x21b3db=_0x224a85;return this[_0x21b3db(0x13f)][_0x21b3db(0x18a)]??'—';},get 'processorProgress'(){const _0x5b57b8=_0x224a85;return p(this['pipelineStats'][_0x5b57b8(0x147)]);},get 'processorPaused'(){const _0x32b0b6=_0x224a85;return!0x0===this[_0x32b0b6(0x13f)]['paused'];},get 'materializerSourceType'(){const _0x5c94c3=_0x224a85;return this[_0x5c94c3(0x13f)]['source_type']??this['eng'][_0x5c94c3(0x11b)]?.[_0x5c94c3(0x191)]??'—';},get 'materializerTargetType'(){const _0x2b847c=_0x224a85;return this['pipelineStats']['target_type']??this['eng'][_0x2b847c(0x11b)]?.['target_type']??'—';},get 'materializerSourceEnv'(){const _0x1db647=_0x224a85;return this['pipelineStats'][_0x1db647(0x189)]??this[_0x1db647(0x18b)][_0x1db647(0x11b)]?.['source_env']??this[_0x1db647(0x13b)]??'—';},get 'materializerTargetEnv'(){const _0x4efee9=_0x224a85;return this[_0x4efee9(0x13f)][_0x4efee9(0x165)]??this[_0x4efee9(0x18b)]['config']?.[_0x4efee9(0x165)]??this[_0x4efee9(0x13b)]??'—';},get 'materializerBootstrap'(){const _0x474169=_0x224a85;return this['pipelineStats'][_0x474169(0x15a)]??this[_0x474169(0x18b)][_0x474169(0x11b)]?.[_0x474169(0x15a)]??_0x474169(0x146);},get 'materializerOriginMode'(){const _0x37221e=_0x224a85;return this[_0x37221e(0x13f)][_0x37221e(0x1a0)]??this[_0x37221e(0x18b)][_0x37221e(0x11b)]?.['originMode']??_0x37221e(0x151);},get 'materializerBatchSize'(){const _0x3b0083=_0x224a85;return this[_0x3b0083(0x13f)][_0x3b0083(0x136)]??this[_0x3b0083(0x18b)][_0x3b0083(0x11b)]?.[_0x3b0083(0x136)]??0x80;},get 'materializerCursorKey'(){const _0x44a3f5=_0x224a85;return this['pipelineStats'][_0x44a3f5(0x139)]??this[_0x44a3f5(0x18b)][_0x44a3f5(0x11b)]?.['cursorKey']??this[_0x44a3f5(0x18b)][_0x44a3f5(0x143)]??'—';},get 'materializerClearTargetOnRebuild'(){const _0x447b83=_0x224a85;return o(this[_0x447b83(0x13f)]['clearTargetOnRebuild']??this[_0x447b83(0x18b)]['config']?.[_0x447b83(0x18c)]??!0x0);},get 'materializerProcessedChanges'(){const _0x376d0d=_0x224a85;return this[_0x376d0d(0x13f)][_0x376d0d(0x184)]??0x0;},get 'materializerAppliedOps'(){const _0x525120=_0x224a85;return this[_0x525120(0x13f)][_0x525120(0x167)]??0x0;},get 'materializerFailedBatches'(){const _0x8eefb6=_0x224a85;return this[_0x8eefb6(0x13f)][_0x8eefb6(0x157)]??0x0;},get 'materializerRunningBatches'(){const _0x1ee538=_0x224a85;return this[_0x1ee538(0x13f)]['runningBatches']??0x0;},get 'materializerTargetCount'(){const _0x31b8a9=_0x224a85;return this[_0x31b8a9(0x13f)][_0x31b8a9(0x193)]??'—';},get 'materializerLag'(){const _0x2dc869=_0x224a85;return this[_0x2dc869(0x13f)][_0x2dc869(0x18a)]??'—';},get 'materializerProgress'(){const _0x4121e2=_0x224a85;return p(this[_0x4121e2(0x13f)]['progress']);},get 'materializerPaused'(){const _0x2fff1b=_0x224a85;return!0x0===this[_0x2fff1b(0x13f)][_0x2fff1b(0x19b)];},get 'materializerErrorText'(){const _0x42de06=_0x224a85;return this['pipelineStats'][_0x42de06(0x17f)]??this[_0x42de06(0x18b)]['error']??null;},get 'materializerPreviewPayload'(){const _0x2089bf=_0x224a85;return[{'action':_0x2089bf(0x19a),'key':_0x2089bf(0x149),'value':{'sample':!0x0,'title':_0x2089bf(0x12a),'sourceType':this[_0x2089bf(0x132)]},'clock':null},{'action':_0x2089bf(0x12c),'key':_0x2089bf(0x1b1),'clock':0x7b}];},get 'materializerPreviewContext'(){const _0x5b3361=_0x224a85;return{'mode':_0x5b3361(0x12e)===this[_0x5b3361(0x13f)][_0x5b3361(0x16d)]?_0x5b3361(0x129):_0x5b3361(0x135),'sourceType':this[_0x5b3361(0x132)],'targetType':this[_0x5b3361(0x1a2)],'sourceEnv':this['materializerSourceEnv'],'targetEnv':this[_0x5b3361(0x19c)],'engineKey':this['eng'][_0x5b3361(0x143)]??null,'cursorKey':this[_0x5b3361(0x13e)]};},'formatJson':_0x3d4a0d,'labelize':_0x135131=>String(_0x135131||'')[_0x224a85(0x1a4)](/_/g,'\x20'),'humanValue':o,'rawToggleStyle':_0x5a6085=>_0x5a6085?_0x224a85(0x13d):'','syncWorkerConfig'(_0x54393e=null){const _0x477285=_0x224a85,_0x3bb9b3=_0x54393e?.[_0x477285(0x11b)]??{};this[_0x477285(0x18d)]={'concurrency':null==_0x3bb9b3[_0x477285(0x137)]?'':String(_0x3bb9b3[_0x477285(0x137)]),'pollInterval':null==_0x3bb9b3['pollInterval']?'':String(_0x3bb9b3[_0x477285(0x160)]),'ttl':null==_0x3bb9b3[_0x477285(0x172)]?'':String(_0x3bb9b3[_0x477285(0x172)])},this[_0x477285(0x1ad)]=null;},'buildWorkerConfigPatch'(){const _0x230b21=_0x224a85,_0x21691c=this[_0x230b21(0x18b)][_0x230b21(0x11b)]??{},_0x216f11={'concurrency':d(this[_0x230b21(0x18d)][_0x230b21(0x137)],_0x230b21(0x15e)),'pollInterval':d(this['workerConfigDraft']['pollInterval'],'Poll\x20interval'),'ttl':d(this[_0x230b21(0x18d)][_0x230b21(0x172)],_0x230b21(0x16e))},_0x313d07={};for(const [_0x5cc19a,_0x13df10]of Object[_0x230b21(0x11a)](_0x216f11))null==_0x13df10?void 0x0!==_0x21691c[_0x5cc19a]&&(_0x313d07[_0x5cc19a]=null):_0x21691c[_0x5cc19a]!==_0x13df10&&(_0x313d07[_0x5cc19a]=_0x13df10);return _0x313d07;},'resetWorkerConfig'(){const _0x14df4c=_0x224a85;this[_0x14df4c(0x180)](this[_0x14df4c(0x18b)]);},'inspectWorkerFunction'(){const _0x1e7fd5=_0x224a85;this[_0x1e7fd5(0x17c)](this[_0x1e7fd5(0x1a1)]?.[_0x1e7fd5(0x159)]??null);},'openHandlerFunction'(_0x3fb407=null){const _0xe336a5=_0x224a85,_0x650638=_0x3fb407??this[_0xe336a5(0x1a9)];_0x650638&&_0x3096d(_0xe5eb0c,_0x650638,{'beforeNavigate':()=>_0xe5eb0c['$attr'][_0xe336a5(0x1a5)]?.[_0xe336a5(0x155)]?.()});},async 'openHandlerEditor'(){const _0x530ff2=_0x224a85;if(!this[_0x530ff2(0x1a9)])return;const _0x503270=_0xe5eb0c[_0x530ff2(0x127)][_0x530ff2(0x169)]['okdb'],_0x2ed3b9=_0xe5eb0c[_0x530ff2(0x127)]['stores']['functions'],_0x18f8f1=this['handlerEnv']&&'—'!==this[_0x530ff2(0x138)]?this[_0x530ff2(0x138)]:this[_0x530ff2(0x13b)];_0x18f8f1?(_0x503270[_0x530ff2(0x164)]!==_0x18f8f1&&_0x503270[_0x530ff2(0x14a)](_0x18f8f1),await _0x2ed3b9[_0x530ff2(0x176)](),await _0x2ed3b9[_0x530ff2(0x15b)](this[_0x530ff2(0x1a9)]),_0x2ed3b9[_0x530ff2(0x122)](),_0x2ed3b9[_0x530ff2(0x198)](this[_0x530ff2(0x12b)](this[_0x530ff2(0x17b)])),_0x2ed3b9[_0x530ff2(0x145)]({'materializerContext':this[_0x530ff2(0x123)]}),await _0xe5eb0c['$ok'][_0x530ff2(0x187)][_0x530ff2(0x1a5)]['open']({'owner':_0xe5eb0c,'title':'Edit\x20Function\x20·\x20'+this['handlerName'],'canDrag':!0x0,'content':_0x530ff2(0x1ae),'context':_0x4b6f2c=>({'modal':_0x4b6f2c,'onDone':async()=>{const _0x252d56=_0x530ff2;await _0x2ed3b9[_0x252d56(0x15b)](this[_0x252d56(0x1a9)]),await _0x2ed3b9[_0x252d56(0x163)](),_0xe5eb0c[_0x252d56(0x11f)]('refresh');}})})):this[_0x530ff2(0x17c)]();},async 'runMaterializerRepairAction'(_0xd81afc,_0x4ab212,_0x2e5fae=null){const _0x11e96a=_0x224a85;if(this['isMaterializer']&&this[_0x11e96a(0x19d)]&&!this[_0x11e96a(0x181)]){if(_0x2e5fae&&!await _0xe5eb0c[_0x11e96a(0x127)][_0x11e96a(0x187)][_0x11e96a(0x1a5)][_0x11e96a(0x119)](_0x2e5fae))return;this[_0x11e96a(0x181)]=!0x0,this['materializerRepairError']=null;try{const _0x209917=await fetch(''+this[_0x11e96a(0x19d)]+_0xd81afc,{'method':_0x11e96a(0x11c)}),_0xa66b58=await _0x209917['json']()[_0x11e96a(0x125)](()=>({}));if(!_0x209917['ok'])throw new Error(_0x2a7ee6(_0xa66b58,'Failed\x20('+_0x209917[_0x11e96a(0x1a7)]+')'));const _0x68243e=_0xa66b58?.[_0x11e96a(0x152)]??_0xa66b58?.[_0x11e96a(0x124)]??null;_0x68243e&&_0xe5eb0c[_0x11e96a(0x11f)]('engine-updated',_0x68243e),_0xe5eb0c[_0x11e96a(0x11f)]('refresh'),_0xe5eb0c['$ok'][_0x11e96a(0x187)]?.[_0x11e96a(0x15c)]?.[_0x11e96a(0x182)]?.(_0x4ab212);}catch(_0x2e65da){this[_0x11e96a(0x15f)]=_0x2e65da?.[_0x11e96a(0x130)]||String(_0x2e65da),_0xe5eb0c[_0x11e96a(0x127)][_0x11e96a(0x187)]?.[_0x11e96a(0x15c)]?.['error']?.(this['materializerRepairError']);}finally{this[_0x11e96a(0x181)]=!0x1;}}},'retryMaterializer'(){const _0x2d0059=_0x224a85;return this['runMaterializerRepairAction'](_0x2d0059(0x14c),_0x2d0059(0x175));},'resetMaterializerCursor'(){const _0x1bf67b=_0x224a85;return this[_0x1bf67b(0x161)](_0x1bf67b(0x178),_0x1bf67b(0x148),_0x1bf67b(0x11d)+this[_0x1bf67b(0x18b)][_0x1bf67b(0x159)]+'\x22?');},'rebuildMaterializer'(){const _0x210107=_0x224a85;return this[_0x210107(0x161)](_0x210107(0x12d),_0x210107(0x133),_0x210107(0x168)+this[_0x210107(0x18b)]['name']+'\x22?');},async 'saveWorkerConfig'(){const _0x4bf0fe=_0x224a85;if(this['isQueueWorker']&&this[_0x4bf0fe(0x19d)]&&!this[_0x4bf0fe(0x190)]){this['saveConfigBusy']=!0x0,this['saveConfigError']=null;try{const _0x5dc707=this[_0x4bf0fe(0x15d)]();if(!Object[_0x4bf0fe(0x1b0)](_0x5dc707)[_0x4bf0fe(0x118)])return void _0xe5eb0c[_0x4bf0fe(0x127)][_0x4bf0fe(0x187)]?.['toast']?.['info']?.(_0x4bf0fe(0x1a8));const _0x35c668=await fetch(this['basePath'],{'method':'PATCH','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'config':_0x5dc707})}),_0x3e9e64=await _0x35c668['json']()[_0x4bf0fe(0x125)](()=>({}));if(!_0x35c668['ok'])throw new Error(_0x2a7ee6(_0x3e9e64,_0x4bf0fe(0x171)+_0x35c668[_0x4bf0fe(0x1a7)]+')'));const _0x5d8958=_0x3e9e64?.[_0x4bf0fe(0x152)]??_0x3e9e64?.[_0x4bf0fe(0x124)]??null;_0x5d8958&&(this[_0x4bf0fe(0x180)](_0x5d8958),_0xe5eb0c['$dispatch'](_0x4bf0fe(0x142),_0x5d8958)),_0xe5eb0c[_0x4bf0fe(0x11f)](_0x4bf0fe(0x158)),_0xe5eb0c[_0x4bf0fe(0x127)][_0x4bf0fe(0x187)]?.[_0x4bf0fe(0x15c)]?.[_0x4bf0fe(0x182)]?.('Worker\x20settings\x20saved');}catch(_0x1c564a){this[_0x4bf0fe(0x1ad)]=_0x1c564a?.['message']||String(_0x1c564a),_0xe5eb0c[_0x4bf0fe(0x127)][_0x4bf0fe(0x187)]?.[_0x4bf0fe(0x15c)]?.['error']?.(this[_0x4bf0fe(0x1ad)]);}finally{this[_0x4bf0fe(0x190)]=!0x1;}}}}),'init'(_0x5d1a4d){const _0x2cf66a=_0x224a85;this['syncWorkerConfig'](_0x5d1a4d[_0x2cf66a(0x1aa)]['engine']),_0x5d1a4d[_0x2cf66a(0x185)](()=>_0x5d1a4d[_0x2cf66a(0x1aa)][_0x2cf66a(0x186)],()=>this[_0x2cf66a(0x180)](_0x5d1a4d[_0x2cf66a(0x1aa)][_0x2cf66a(0x186)]));},'template':_0x224a85(0x121),'style':_0x2b5256};function _0x33bb(){const _0xad5fa1=['lockMode','build','batchSize','concurrency','handlerEnv','cursorKey','7119430Wlriws','envName','failed','border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2040%,\x20transparent);color:var(--okdb-accent);background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);','materializerCursorKey','pipelineStats','1136384Lnjkee','reasonText','engine-updated','key','trunc','setModalPreviewContext','snapshot','progress','Materializer\x20cursor\x20reset','example-1','selectEnv','job_type','/retry','stats','pipelineHandler','stopped','updated','all','data','isArray','105658sVvPpQ','close','generic-engine-panel','failedBatches','refresh','name','bootstrap','select','toast','buildWorkerConfigPatch','Concurrency','materializerRepairError','pollInterval','runMaterializerRepairAction','includes','loadOverviewRuns','selectedEnv','target_env','4lrIqQX','appliedOps','Rebuild\x20materializer\x20\x22','stores','materializer','env','recordRuns','state','Job\x20TTL','268432rhFtAq','89274dXmnhY','Failed\x20(','ttl','join','running','Materializer\x20retry\x20started','onEnvChanged','type','/reset-cursor','queue-worker','runningBatches','materializerPreviewPayload','openHandlerFunction','stateText','failOnHandlerError','error','syncWorkerConfig','materializerRepairBusy','success','handler','processedChanges','$watch','engine','shared','boolean','source_env','lag','eng','clearTargetOnRebuild','workerConfigDraft','affinity','workerStats','saveConfigBusy','source_type','\x20must\x20be\x20a\x20positive\x20integer','targetCount','filter','248ByfPVD','909072ExrZFe','hydrateValues','setModalPayloadDraft','object','put','paused','materializerTargetEnv','basePath','queue_env','processed','originMode','workerHandler','materializerTargetType','engine_key','replace','modal','toLocaleString','status','No\x20worker\x20setting\x20changes\x20to\x20save','handlerName','$attr','mode','all\x20nodes','saveConfigError','<function-modal\x20:modal=\x22modal\x22\x20mode=\x22edit\x22\x20:on-done=\x22onDone\x22\x20/>','exclusive','keys','example-2','4991247hmwpcU','length','confirm','entries','config','POST','Reset\x20cursor\x20for\x20materializer\x20\x22','isFinite','$dispatch','inactive','\x0a<engine-panel-shell\x0a\x20\x20:engine=\x22eng\x22\x0a\x20\x20:env=\x22envName\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:=\x22isQueueWorker\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22stack-compact\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\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\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\x20\x20<div\x20class=\x22pill-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Queue\x20job\x20type\x20this\x20worker\x20consumes.\x22>{{\x20workerJobType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Environment\x20whose\x20queue\x20is\x20consumed.\x22>queue:\x20{{\x20workerQueueEnv\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Function\x20environment.\x22>fn\x20env:\x20{{\x20workerFunctionEnv\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22showWorkerReason\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Why\x20the\x20worker\x20is\x20in\x20its\x20current\x20state.\x22>{{\x20reasonText\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22showWorkerAffinity\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Node\x20tags\x20required\x20for\x20this\x20worker\x20to\x20run.\x22>affinity:\x20{{\x20affinityText\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\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22field-label\x22\x20style=\x22margin:0;\x22>Function</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22canOpenWorkerFunction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22inspectWorkerFunction()\x22\x20class=\x22inline-link\x22\x20title=\x22View\x20or\x20edit\x20this\x20function\x20in\x20the\x20Functions\x20section.\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ƒ\x20{{\x20workerHandler?.name\x20||\x20\x27—\x27\x20}}\x20↗\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!canOpenWorkerFunction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22muted-code\x22\x20style=\x22color:var(--okdb-app-fg);\x22>{{\x20workerHandler?.name\x20||\x20\x27—\x27\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</div>\x0a\x0a\x20\x20\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Done</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22color:var(--okdb-success);\x22>{{\x20workerProcessed\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Error</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20:style=\x22\x27color:\x27\x20+\x20(workerFailed\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-app-fg-strong)\x27)\x22>{{\x20workerFailed\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Active</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20:style=\x22\x27color:\x27\x20+\x20(workerRunning\x20>\x200\x20?\x20\x27var(--okdb-warning)\x27\x20:\x20\x27var(--okdb-app-fg-strong)\x27)\x22>{{\x20workerRunning\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Concurrency</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22color:var(--okdb-accent);\x22>{{\x20workerConcurrency\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</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\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-label\x22\x20style=\x22margin:0;\x22>Settings</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22story-note\x22\x20style=\x22margin-right:4px;\x22>updated\x20{{\x20updatedText\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22resetWorkerConfig()\x22\x20:disabled=\x22saveConfigBusy\x20||\x20!basePath\x22\x20title=\x22Discard\x20unsaved\x20changes.\x22\x20style=\x22font-size:11px;padding:4px\x2010px;opacity:.75;\x22>Reset</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22saveWorkerConfig()\x22\x20:disabled=\x22saveConfigBusy\x20||\x20!basePath\x22\x20title=\x22Save\x20and\x20restart\x20the\x20worker\x20with\x20these\x20values.\x22\x20style=\x22font-size:11px;padding:4px\x2010px;color:var(--okdb-accent);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20saveConfigBusy\x20?\x20\x27Saving…\x27\x20:\x20\x27Save\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22form-grid\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22field-stack\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22field-label\x22\x20title=\x22Parallel\x20worker\x20lanes.\x22>Concurrency</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20class=\x22field-input\x22\x20type=\x22number\x22\x20min=\x221\x22\x20:value=\x22workerConfigDraft.concurrency\x22\x20@input=\x22workerConfigDraft.concurrency\x20=\x20$event.target.value\x22\x20placeholder=\x221\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22field-stack\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22field-label\x22\x20title=\x22Milliseconds\x20to\x20wait\x20before\x20polling\x20again\x20when\x20the\x20queue\x20is\x20empty.\x22>Poll</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20class=\x22field-input\x22\x20type=\x22number\x22\x20min=\x221\x22\x20:value=\x22workerConfigDraft.pollInterval\x22\x20@input=\x22workerConfigDraft.pollInterval\x20=\x20$event.target.value\x22\x20placeholder=\x221000\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22field-stack\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22field-label\x22\x20title=\x22Milliseconds\x20an\x20in-flight\x20claim\x20stays\x20reserved\x20before\x20it\x20can\x20be\x20reclaimed.\x22>TTL</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20class=\x22field-input\x22\x20type=\x22number\x22\x20min=\x221\x22\x20:value=\x22workerConfigDraft.ttl\x22\x20@input=\x22workerConfigDraft.ttl\x20=\x20$event.target.value\x22\x20placeholder=\x2230000\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22field-stack\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22field-label\x22\x20title=\x22Whether\x20function\x20runs\x20are\x20persisted.\x22>Runs</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-input\x22\x20style=\x22display:flex;align-items:center;min-height:36px;background:var(--okdb-app-bg);\x22>{{\x20workerRecordRuns\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22saveConfigError\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22alert\x20alert--error\x22>{{\x20saveConfigError\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<if\x20:=\x22isProcessor\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22stack-compact\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\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\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\x20\x20<div\x20class=\x22pill-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Source\x20type\x20this\x20processor\x20watches.\x22>{{\x20processorSourceType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Environment\x20whose\x20changelog\x20is\x20consumed.\x22>source:\x20{{\x20processorSourceEnv\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Function\x20environment.\x22>fn\x20env:\x20{{\x20handlerEnv\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22How\x20source\x20changes\x20are\x20consumed.\x22>mode:\x20{{\x20processorMode\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22processorPaused\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Processor\x20registration\x20is\x20currently\x20paused.\x22>paused</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22showWorkerReason\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Why\x20the\x20processor\x20is\x20in\x20its\x20current\x20state.\x22>{{\x20reasonText\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\x20\x20<div\x20class=\x22story-lead\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Watches\x20<strong>{{\x20processorSourceType\x20}}</strong>\x20in\x20<strong>{{\x20processorSourceEnv\x20}}</strong>\x20and\x20runs\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22canOpenHandlerFunction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openHandlerFunction()\x22\x20class=\x22inline-link\x22\x20title=\x22View\x20or\x20edit\x20this\x20function\x20in\x20the\x20Functions\x20section.\x22>ƒ\x20{{\x20handlerName\x20}}\x20↗</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!canOpenHandlerFunction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22muted-code\x22\x20style=\x22color:var(--okdb-app-fg);\x22>{{\x20handlerName\x20||\x20\x27—\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20for\x20each\x20change\x20batch.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-note\x22>Use\x20this\x20engine\x20for\x20side\x20effects\x20and\x20projections\x20driven\x20by\x20change\x20batches\x20without\x20owning\x20a\x20dedicated\x20target\x20type.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-grid\x20metric-grid--compact\x22\x20style=\x22min-width:min(100%,\x20420px);\x22>\x0a\x20\x20\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\x20\x20<div\x20class=\x22metric-title\x22>Invocations</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22color:var(--okdb-accent);\x22>{{\x20processorInvocations\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Changes</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22color:var(--okdb-success);\x22>{{\x20processorProcessedChanges\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Failures</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20:style=\x22\x27color:\x27\x20+\x20(processorFailedBatches\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-app-fg-strong)\x27)\x22>{{\x20processorFailedBatches\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Lag</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20:style=\x22\x27color:\x27\x20+\x20(processorLag\x20===\x200\x20?\x20\x27var(--okdb-success)\x27\x20:\x20\x27var(--okdb-warning)\x27)\x22>{{\x20processorLag\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</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\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Processing\x20settings</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22kv-grid\x20kv-grid--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>bootstrap</span><span\x20class=\x22kv-val\x22>{{\x20processorBootstrap\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>origin\x20mode</span><span\x20class=\x22kv-val\x22>{{\x20processorOriginMode\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>batch\x20size</span><span\x20class=\x22kv-val\x22>{{\x20processorBatchSize\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>running\x20batches</span><span\x20class=\x22kv-val\x22>{{\x20processorRunningBatches\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>progress</span><span\x20class=\x22kv-val\x22>{{\x20processorProgress\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>cursor\x20key</span><span\x20class=\x22kv-val\x22>{{\x20processorCursorKey\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>lock\x20mode</span><span\x20class=\x22kv-val\x22>{{\x20processorLockMode\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>hydrate\x20values</span><span\x20class=\x22kv-val\x22>{{\x20processorHydrateValues\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>fail\x20on\x20fn\x20error</span><span\x20class=\x22kv-val\x22>{{\x20processorFailOnHandlerError\x20}}</span>\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:=\x22isMaterializer\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22stack-compact\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\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\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\x20\x20<div\x20class=\x22pill-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Source\x20type\x20this\x20materializer\x20watches.\x22>{{\x20materializerSourceType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Target\x20type\x20updated\x20by\x20returned\x20ops.\x22>target:\x20{{\x20materializerTargetType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Source\x20environment.\x22>source\x20env:\x20{{\x20materializerSourceEnv\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Target\x20environment.\x22>target\x20env:\x20{{\x20materializerTargetEnv\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Function\x20environment.\x22>fn\x20env:\x20{{\x20handlerEnv\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22materializerPaused\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22info-pill\x22\x20title=\x22Materializer\x20registration\x20is\x20currently\x20paused.\x22>paused</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-lead\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Projects\x20<strong>{{\x20materializerSourceType\x20}}</strong>\x20into\x20<strong>{{\x20materializerTargetType\x20}}</strong>\x20using\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22canOpenHandlerFunction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openHandlerFunction()\x22\x20class=\x22inline-link\x22\x20title=\x22View\x20or\x20edit\x20this\x20function\x20in\x20the\x20Functions\x20section.\x22>ƒ\x20{{\x20handlerName\x20}}\x20↗</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!canOpenHandlerFunction\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22muted-code\x22\x20style=\x22color:var(--okdb-app-fg);\x22>{{\x20handlerName\x20||\x20\x27—\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20and\x20applies\x20the\x20returned\x20ops\x20to\x20the\x20target\x20collection.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-note\x22>Use\x20this\x20engine\x20when\x20you\x20want\x20deterministic,\x20rebuildable\x20derived\x20records\x20instead\x20of\x20free-form\x20side\x20effects.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-grid\x20metric-grid--compact\x22\x20style=\x22min-width:min(100%,\x20420px);\x22>\x0a\x20\x20\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\x20\x20<div\x20class=\x22metric-title\x22>Applied\x20ops</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22color:var(--okdb-success);\x22>{{\x20materializerAppliedOps\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Target\x20rows</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22color:var(--okdb-accent);\x22>{{\x20materializerTargetCount\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Changes</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20style=\x22color:var(--okdb-success);\x22>{{\x20materializerProcessedChanges\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\x20\x20<div\x20class=\x22metric-card\x20metric-card--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-title\x22>Failures</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22metric-value\x22\x20:style=\x22\x27color:\x27\x20+\x20(materializerFailedBatches\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-app-fg-strong)\x27)\x22>{{\x20materializerFailedBatches\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</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\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Materialization\x20settings</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22kv-grid\x20kv-grid--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>bootstrap</span><span\x20class=\x22kv-val\x22>{{\x20materializerBootstrap\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>origin\x20mode</span><span\x20class=\x22kv-val\x22>{{\x20materializerOriginMode\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>batch\x20size</span><span\x20class=\x22kv-val\x22>{{\x20materializerBatchSize\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>running\x20batches</span><span\x20class=\x22kv-val\x22>{{\x20materializerRunningBatches\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>progress</span><span\x20class=\x22kv-val\x22>{{\x20materializerProgress\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>lag</span><span\x20class=\x22kv-val\x22>{{\x20materializerLag\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>cursor\x20key</span><span\x20class=\x22kv-val\x22>{{\x20materializerCursorKey\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>clear\x20on\x20rebuild</span><span\x20class=\x22kv-val\x22>{{\x20materializerClearTargetOnRebuild\x20}}</span>\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\x20class=\x22card\x20stack-compact\x22\x20style=\x22padding:14px;gap:12px;border-color:#244057;\x22>\x0a\x20\x20\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\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:6px;min-width:0;flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Repair\x20workflow</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-note\x22\x20style=\x22margin:0;\x22>Edit\x20the\x20handler\x20with\x20seeded\x20sample\x20input,\x20verify\x20the\x20draft\x20run,\x20then\x20retry,\x20rewind,\x20or\x20rebuild\x20from\x20here.</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\x20style=\x22display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openHandlerEditor()\x22\x20:disabled=\x22!canOpenHandlerFunction\x20||\x20materializerRepairBusy\x22\x20style=\x22font-size:12px;padding:4px\x2010px;color:var(--okdb-accent);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x22>ƒ\x20Edit\x20handler</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22retryMaterializer()\x22\x20:disabled=\x22materializerRepairBusy\x20||\x20!basePath\x22\x20style=\x22font-size:12px;padding:4px\x2010px;color:var(--okdb-orange);border-color:color-mix(in\x20srgb,\x20var(--okdb-orange)\x2033%,\x20transparent);\x22>↻\x20Retry</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22resetMaterializerCursor()\x22\x20:disabled=\x22materializerRepairBusy\x20||\x20!basePath\x22\x20style=\x22font-size:12px;padding:4px\x2010px;color:var(--okdb-info);border-color:color-mix(in\x20srgb,\x20var(--okdb-info)\x2033%,\x20transparent);\x22>⇤\x20Reset\x20cursor</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22rebuildMaterializer()\x22\x20:disabled=\x22materializerRepairBusy\x20||\x20!basePath\x22\x20style=\x22font-size:12px;padding:4px\x2010px;color:var(--okdb-success);border-color:color-mix(in\x20srgb,\x20var(--okdb-success)\x2033%,\x20transparent);\x22>⟳\x20Rebuild</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22materializerErrorText\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22alert\x20alert--error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-weight:600;margin-bottom:4px;\x22>Last\x20materializer\x20error</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>{{\x20materializerErrorText\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22materializerRepairError\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22alert\x20alert--error\x22>{{\x20materializerRepairError\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:minmax(0,1fr)\x20minmax(280px,.9fr);gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:8px;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-label\x22>Suggested\x20<code>ctx.payload</code></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22json-block\x22\x20style=\x22margin:0;max-height:220px;overflow:auto;\x22>{{\x20formatJson(materializerPreviewPayload)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:8px;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-label\x22>Suggested\x20<code>ctx.materializer</code></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22json-block\x22\x20style=\x22margin:0;max-height:220px;overflow:auto;\x22>{{\x20formatJson(materializerPreviewContext)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22story-note\x22\x20style=\x22margin:0;\x22>Recommended\x20order:\x20<strong>Edit\x20handler</strong>\x20→\x20run\x20the\x20seeded\x20draft\x20preview\x20→\x20<strong>Retry</strong>.\x20Use\x20<strong>Reset\x20cursor</strong>\x20to\x20replay\x20without\x20clearing\x20the\x20target,\x20or\x20<strong>Rebuild</strong>\x20to\x20clear\x20and\x20rematerialize\x20from\x20scratch.</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:=\x22!hasSpecializedPipelineView\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22panel-grid\x20panel-grid--two\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card\x22\x20style=\x22display:flex;flex-direction:column;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Overview</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22kv-grid\x20kv-grid--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>state</span><span\x20class=\x22kv-val\x22>{{\x20stateText\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>reason</span><span\x20class=\x22kv-val\x22>{{\x20reasonText\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>enabled</span><span\x20class=\x22kv-val\x22>{{\x20eng.enabled\x20===\x20false\x20?\x20\x27no\x27\x20:\x20\x27yes\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>affinity</span><span\x20class=\x22kv-val\x22>{{\x20affinityText\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>updated</span><span\x20class=\x22kv-val\x22>{{\x20updatedText\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22runtimePreviewEntries.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-label\x22>Runtime\x20details</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22kv-grid\x20kv-grid--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22runtimePreviewEntries\x22\x20let:item=\x22entry\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>{{\x20labelize(entry[0])\x20}}</span><span\x20class=\x22kv-val\x22>{{\x20humanValue(entry[1])\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card\x22\x20style=\x22display:flex;flex-direction:column;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-title\x22\x20style=\x22margin:0;\x22>Configuration</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22configPreviewEntries.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22kv-grid\x20kv-grid--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22configPreviewEntries\x22\x20let:item=\x22entry\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>{{\x20labelize(entry[0])\x20}}</span><span\x20class=\x22kv-val\x22>{{\x20humanValue(entry[1])\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\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22configPreviewEntries.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22helper-text\x22>This\x20engine\x20mostly\x20uses\x20structured\x20config.\x20Open\x20the\x20raw\x20JSON\x20below\x20if\x20you\x20need\x20the\x20full\x20payload.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22statsPreviewEntries.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-label\x22>Stats\x20snapshot</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22kv-grid\x20kv-grid--compact\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22statsPreviewEntries\x22\x20let:item=\x22entry\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22kv-key\x22>{{\x20labelize(entry[0])\x20}}</span><span\x20class=\x22kv-val\x22>{{\x20humanValue(entry[1])\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</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;flex-direction:column;gap:12px;\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>Raw\x20data</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22card-subtitle\x22>Keep\x20the\x20default\x20view\x20visual\x20first.\x20Open\x20these\x20only\x20when\x20you\x20need\x20the\x20underlying\x20JSON.</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22raw-toggle-row\x22>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22eng.runtime\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22raw-toggle\x22\x20:style=\x22rawToggleStyle(showRawRuntime)\x22\x20@click=\x22showRawRuntime\x20=\x20!showRawRuntime\x22>Runtime\x20JSON</button>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22eng.stats\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22raw-toggle\x22\x20:style=\x22rawToggleStyle(showRawStats)\x22\x20@click=\x22showRawStats\x20=\x20!showRawStats\x22>Stats\x20JSON</button>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22eng.config\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22raw-toggle\x22\x20:style=\x22rawToggleStyle(showRawConfig)\x22\x20@click=\x22showRawConfig\x20=\x20!showRawConfig\x22>Config\x20JSON</button>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22showRawRuntime\x20&&\x20eng.runtime\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-label\x22>Runtime\x20payload</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22json-block\x22>{{\x20formatJson(eng.runtime)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<if\x20:=\x22showRawStats\x20&&\x20eng.stats\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-label\x22>Stats\x20payload</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22json-block\x22>{{\x20formatJson(eng.stats)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<if\x20:=\x22showRawConfig\x20&&\x20eng.config\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22field-label\x22>Config\x20payload</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22json-block\x22>{{\x20formatJson(eng.config)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a</engine-panel-shell>\x0a','beginEditDraft','materializerPreviewContext','result','catch','5iNTTJV','$ok','number','live','Example\x20source\x20row','formatJson','remove','/rebuild','online','invocations','message','reason','materializerSourceType','Materializer\x20rebuild\x20started'];_0x33bb=function(){return _0xad5fa1;};return _0x33bb();}
1
+ import e from"./engine-panel-shell.ok.js";import n from"../../functions/modals/function-modal.ok.js";import{ENGINE_PANEL_SHARED_STYLE as t}from"../engine-panel-shared-style.js";import{buildEngineBasePath as i,formatJsonValue as r,getApiErrorMessage as a,openFunctionRoute as s,resolveEngineEnvName as l}from"../engine-ui-utils.js";function o(e,n="—"){return null==e||""===e?n:Array.isArray(e)?e.length?e.join(", "):n:"boolean"==typeof e?e?"yes":"no":String(e)}function c(e,n=[]){return function(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}(e)?Object.entries(e).filter(([e,t])=>!n.includes(e)&&(null==t||["string","number","boolean"].includes(typeof t))):[]}function d(e,n){if(""===e||null==e)return null;const t=Math.trunc(Number(e));if(!Number.isFinite(t)||t<1)throw new Error(`${n} must be a positive integer`);return t}function p(e){if(null==e||""===e)return"—";const n=Number(e);if(!Number.isFinite(n))return String(e);const t=n<=1?100*n:n;return`${Math.round(t)}%`}export default{tag:"generic-engine-panel",dependencies:[e,n],attr:{engine:{},env:{},modal:{}},context:e=>({saveConfigBusy:!1,saveConfigError:null,materializerRepairBusy:!1,materializerRepairError:null,showRawRuntime:!1,showRawStats:!1,showRawConfig:!1,workerConfigDraft:{concurrency:"",pollInterval:"",ttl:""},get eng(){return e.$attr.engine??{}},get envName(){return l(this.eng,e.$attr.env??null)},get basePath(){return i(this.eng,this.envName)},get isQueueWorker(){return"queue-worker"===this.eng.type},get isProcessor(){return"processor"===this.eng.type},get isMaterializer(){return"materializer"===this.eng.type},get hasSpecializedPipelineView(){return this.isQueueWorker||this.isProcessor||this.isMaterializer},get stateText(){return"error"===this.eng.status?"error":"inactive"===this.eng.status?"inactive":this.eng.isRunning||"online"===this.eng.status?"running":this.eng.status||"stopped"},get reasonText(){const e=this.eng.reason??null;return e&&e!==this.stateText?String(e).replace(/_/g," "):"—"},get affinityText(){return o(this.eng.affinity,"all nodes")},get updatedText(){return function(e){if(!e)return"—";try{return new Date(e).toLocaleString()}catch{return String(e)}}(this.eng.runtime?.updated)},get runtimePreviewEntries(){return c(this.eng.runtime,["state","reason","error","running","updated"])},get statsPreviewEntries(){return c(this.eng.stats,["engine_key","job_type","queue_env","handler","concurrency","processed","failed","running"])},get configPreviewEntries(){return c(this.eng.config,["job_type","queue_env","handler","concurrency","pollInterval","ttl"])},get workerStats(){return this.eng.stats??{}},get pipelineStats(){return this.eng.stats??{}},get workerHandler(){return this.workerStats.handler??this.eng.config?.handler??null},get pipelineHandler(){return this.pipelineStats.handler??this.eng.config?.handler??null},get handlerName(){return this.pipelineHandler?.name??null},get handlerEnv(){return this.pipelineHandler?.env??this.envName??"—"},get canOpenHandlerFunction(){return!!this.handlerName},get workerJobType(){return this.workerStats.job_type??this.eng.config?.job_type??"—"},get workerQueueEnv(){return this.workerStats.queue_env??this.eng.config?.queue_env??this.envName??"—"},get workerFunctionEnv(){return this.workerHandler?.env??this.envName??"—"},get workerRecordRuns(){return this.eng.config?.handler?.recordRuns??"all"},get workerProcessed(){return this.workerStats.processed??0},get workerFailed(){return this.workerStats.failed??0},get workerRunning(){return this.workerStats.running??0},get workerConcurrency(){return this.workerStats.concurrency??this.eng.config?.concurrency??1},get workerPollInterval(){return this.eng.config?.pollInterval??1e3},get workerTtl(){return this.eng.config?.ttl??3e4},get canOpenWorkerFunction(){return!!this.workerHandler?.name},get showWorkerReason(){return"—"!==this.reasonText&&"running"!==this.reasonText},get showWorkerAffinity(){return"all nodes"!==this.affinityText},get processorSourceType(){return this.pipelineStats.source_type??this.eng.config?.source_type??"—"},get processorSourceEnv(){return this.pipelineStats.source_env??this.eng.config?.source_env??this.envName??"—"},get processorMode(){return this.pipelineStats.mode??this.eng.config?.mode??"async"},get processorBootstrap(){return this.pipelineStats.bootstrap??this.eng.config?.bootstrap??"snapshot"},get processorOriginMode(){return this.pipelineStats.originMode??this.eng.config?.originMode??"all"},get processorBatchSize(){return this.pipelineStats.batchSize??this.eng.config?.batchSize??256},get processorCursorKey(){return this.pipelineStats.cursorKey??this.eng.config?.cursorKey??this.eng.key??"—"},get processorLockMode(){return this.pipelineStats.lockMode??this.eng.config?.lockMode??"exclusive"},get processorHydrateValues(){return o(this.pipelineStats.hydrateValues??this.eng.config?.hydrateValues??!0)},get processorFailOnHandlerError(){return o(this.pipelineStats.failOnHandlerError??this.eng.config?.failOnHandlerError??!0)},get processorInvocations(){return this.pipelineStats.invocations??0},get processorProcessedChanges(){return this.pipelineStats.processedChanges??0},get processorFailedBatches(){return this.pipelineStats.failedBatches??0},get processorRunningBatches(){return this.pipelineStats.runningBatches??0},get processorLag(){return this.pipelineStats.lag??"—"},get processorProgress(){return p(this.pipelineStats.progress)},get processorPaused(){return!0===this.pipelineStats.paused},get materializerSourceType(){return this.pipelineStats.source_type??this.eng.config?.source_type??"—"},get materializerTargetType(){return this.pipelineStats.target_type??this.eng.config?.target_type??"—"},get materializerSourceEnv(){return this.pipelineStats.source_env??this.eng.config?.source_env??this.envName??"—"},get materializerTargetEnv(){return this.pipelineStats.target_env??this.eng.config?.target_env??this.envName??"—"},get materializerBootstrap(){return this.pipelineStats.bootstrap??this.eng.config?.bootstrap??"snapshot"},get materializerOriginMode(){return this.pipelineStats.originMode??this.eng.config?.originMode??"all"},get materializerBatchSize(){return this.pipelineStats.batchSize??this.eng.config?.batchSize??128},get materializerCursorKey(){return this.pipelineStats.cursorKey??this.eng.config?.cursorKey??this.eng.key??"—"},get materializerClearTargetOnRebuild(){return o(this.pipelineStats.clearTargetOnRebuild??this.eng.config?.clearTargetOnRebuild??!0)},get materializerProcessedChanges(){return this.pipelineStats.processedChanges??0},get materializerAppliedOps(){return this.pipelineStats.appliedOps??0},get materializerFailedBatches(){return this.pipelineStats.failedBatches??0},get materializerRunningBatches(){return this.pipelineStats.runningBatches??0},get materializerTargetCount(){return this.pipelineStats.targetCount??"—"},get materializerLag(){return this.pipelineStats.lag??"—"},get materializerProgress(){return p(this.pipelineStats.progress)},get materializerPaused(){return!0===this.pipelineStats.paused},get materializerErrorText(){return this.pipelineStats.error??this.eng.error??null},get materializerPreviewPayload(){return[{action:"put",key:"example-1",value:{sample:!0,title:"Example source row",sourceType:this.materializerSourceType},clock:null},{action:"remove",key:"example-2",clock:123}]},get materializerPreviewContext(){return{mode:"online"===this.pipelineStats.state?"live":"build",sourceType:this.materializerSourceType,targetType:this.materializerTargetType,sourceEnv:this.materializerSourceEnv,targetEnv:this.materializerTargetEnv,engineKey:this.eng.key??null,cursorKey:this.materializerCursorKey}},formatJson:r,labelize:e=>String(e||"").replace(/_/g," "),humanValue:o,rawToggleStyle:e=>e?"border-color:color-mix(in srgb, var(--okdb-accent) 40%, transparent);color:var(--okdb-accent);background:color-mix(in srgb, var(--okdb-accent) 7%, transparent);":"",syncWorkerConfig(e=null){const n=e?.config??{};this.workerConfigDraft={concurrency:null==n.concurrency?"":String(n.concurrency),pollInterval:null==n.pollInterval?"":String(n.pollInterval),ttl:null==n.ttl?"":String(n.ttl)},this.saveConfigError=null},buildWorkerConfigPatch(){const e=this.eng.config??{},n={concurrency:d(this.workerConfigDraft.concurrency,"Concurrency"),pollInterval:d(this.workerConfigDraft.pollInterval,"Poll interval"),ttl:d(this.workerConfigDraft.ttl,"Job TTL")},t={};for(const[i,r]of Object.entries(n))null==r?void 0!==e[i]&&(t[i]=null):e[i]!==r&&(t[i]=r);return t},resetWorkerConfig(){this.syncWorkerConfig(this.eng)},inspectWorkerFunction(){this.openHandlerFunction(this.workerHandler?.name??null)},openHandlerFunction(n=null){const t=n??this.handlerName;t&&s(e,t,{beforeNavigate:()=>e.$attr.modal?.close?.()})},async openHandlerEditor(){if(!this.handlerName)return;const n=e.$ok.stores.okdb,t=e.$ok.stores.functions,i=this.handlerEnv&&"—"!==this.handlerEnv?this.handlerEnv:this.envName;i?(n.selectedEnv!==i&&n.selectEnv(i),await t.onEnvChanged(),await t.select(this.handlerName),t.beginEditDraft(),t.setModalPayloadDraft(this.formatJson(this.materializerPreviewPayload)),t.setModalPreviewContext({materializerContext:this.materializerPreviewContext}),await e.$ok.shared.modal.open({owner:e,title:`Edit Function · ${this.handlerName}`,canDrag:!0,content:'<function-modal :modal="modal" mode="edit" :on-done="onDone" />',context:n=>({modal:n,onDone:async()=>{await t.select(this.handlerName),await t.loadOverviewRuns(),e.$dispatch("refresh")}})})):this.openHandlerFunction()},async runMaterializerRepairAction(n,t,i=null){if(this.isMaterializer&&this.basePath&&!this.materializerRepairBusy){if(i&&!await e.$ok.shared.modal.confirm(i))return;this.materializerRepairBusy=!0,this.materializerRepairError=null;try{const i=await fetch(`${this.basePath}${n}`,{method:"POST"}),r=await i.json().catch(()=>({}));if(!i.ok)throw new Error(a(r,`Failed (${i.status})`));const s=r?.data??r?.result??null;s&&e.$dispatch("engine-updated",s),e.$dispatch("refresh"),e.$ok.shared?.toast?.success?.(t)}catch(n){this.materializerRepairError=n?.message||String(n),e.$ok.shared?.toast?.error?.(this.materializerRepairError)}finally{this.materializerRepairBusy=!1}}},retryMaterializer(){return this.runMaterializerRepairAction("/retry","Materializer retry started")},resetMaterializerCursor(){return this.runMaterializerRepairAction("/reset-cursor","Materializer cursor reset",`Reset cursor for materializer "${this.eng.name}"?`)},rebuildMaterializer(){return this.runMaterializerRepairAction("/rebuild","Materializer rebuild started",`Rebuild materializer "${this.eng.name}"?`)},async saveWorkerConfig(){if(this.isQueueWorker&&this.basePath&&!this.saveConfigBusy){this.saveConfigBusy=!0,this.saveConfigError=null;try{const n=this.buildWorkerConfigPatch();if(!Object.keys(n).length)return void e.$ok.shared?.toast?.info?.("No worker setting changes to save");const t=await fetch(this.basePath,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({config:n})}),i=await t.json().catch(()=>({}));if(!t.ok)throw new Error(a(i,`Failed (${t.status})`));const r=i?.data??i?.result??null;r&&(this.syncWorkerConfig(r),e.$dispatch("engine-updated",r)),e.$dispatch("refresh"),e.$ok.shared?.toast?.success?.("Worker settings saved")}catch(n){this.saveConfigError=n?.message||String(n),e.$ok.shared?.toast?.error?.(this.saveConfigError)}finally{this.saveConfigBusy=!1}}}}),init(e){this.syncWorkerConfig(e.$attr.engine),e.$watch(()=>e.$attr.engine,()=>this.syncWorkerConfig(e.$attr.engine))},template:'\n<engine-panel-shell\n :engine="eng"\n :env="envName"\n @engine-updated="$dispatch(\'engine-updated\', $event.detail)"\n @refresh="$dispatch(\'refresh\')"\n @deleted="$dispatch(\'deleted\', $event.detail)"\n>\n <if :="isQueueWorker">\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 this worker consumes.">{{ workerJobType }}</span>\n <span class="info-pill" title="Environment whose queue is consumed.">queue: {{ workerQueueEnv }}</span>\n <span class="info-pill" title="Function environment.">fn env: {{ workerFunctionEnv }}</span>\n <if :="showWorkerReason">\n <span class="info-pill" title="Why the worker is in its current state.">{{ reasonText }}</span>\n </if>\n <if :="showWorkerAffinity">\n <span class="info-pill" title="Node tags required for this worker to run.">affinity: {{ affinityText }}</span>\n </if>\n </div>\n <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;">\n <span class="field-label" style="margin:0;">Function</span>\n <if :="canOpenWorkerFunction">\n <button @click="inspectWorkerFunction()" class="inline-link" title="View or edit this function in the Functions section.">\n ƒ {{ workerHandler?.name || \'—\' }} ↗\n </button>\n </if>\n <if :="!canOpenWorkerFunction">\n <span class="muted-code" style="color:var(--okdb-app-fg);">{{ workerHandler?.name || \'—\' }}</span>\n </if>\n </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">Done</div>\n <div class="metric-value" style="color:var(--okdb-success);">{{ workerProcessed }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Error</div>\n <div class="metric-value" :style="\'color:\' + (workerFailed > 0 ? \'var(--okdb-danger)\' : \'var(--okdb-app-fg-strong)\')">{{ workerFailed }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Active</div>\n <div class="metric-value" :style="\'color:\' + (workerRunning > 0 ? \'var(--okdb-warning)\' : \'var(--okdb-app-fg-strong)\')">{{ workerRunning }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Concurrency</div>\n <div class="metric-value" style="color:var(--okdb-accent);">{{ workerConcurrency }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="card stack-compact" style="padding:14px;gap:12px;">\n <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;">\n <div class="field-label" style="margin:0;">Settings</div>\n <div style="flex:1;"></div>\n <span class="story-note" style="margin-right:4px;">updated {{ updatedText }}</span>\n <button @click="resetWorkerConfig()" :disabled="saveConfigBusy || !basePath" title="Discard unsaved changes." style="font-size:11px;padding:4px 10px;opacity:.75;">Reset</button>\n <button @click="saveWorkerConfig()" :disabled="saveConfigBusy || !basePath" title="Save and restart the worker with these values." style="font-size:11px;padding:4px 10px;color:var(--okdb-accent);border-color:color-mix(in srgb, var(--okdb-accent) 33%, transparent);">\n {{ saveConfigBusy ? \'Saving…\' : \'Save\' }}\n </button>\n </div>\n\n <div class="form-grid">\n <label class="field-stack">\n <span class="field-label" title="Parallel worker lanes.">Concurrency</span>\n <input class="field-input" type="number" min="1" :value="workerConfigDraft.concurrency" @input="workerConfigDraft.concurrency = $event.target.value" placeholder="1" />\n </label>\n <label class="field-stack">\n <span class="field-label" title="Milliseconds to wait before polling again when the queue is empty.">Poll</span>\n <input class="field-input" type="number" min="1" :value="workerConfigDraft.pollInterval" @input="workerConfigDraft.pollInterval = $event.target.value" placeholder="1000" />\n </label>\n <label class="field-stack">\n <span class="field-label" title="Milliseconds an in-flight claim stays reserved before it can be reclaimed.">TTL</span>\n <input class="field-input" type="number" min="1" :value="workerConfigDraft.ttl" @input="workerConfigDraft.ttl = $event.target.value" placeholder="30000" />\n </label>\n <label class="field-stack">\n <span class="field-label" title="Whether function runs are persisted.">Runs</span>\n <div class="field-input" style="display:flex;align-items:center;min-height:36px;background:var(--okdb-app-bg);">{{ workerRecordRuns }}</div>\n </label>\n </div>\n\n <if :="saveConfigError">\n <div class="alert alert--error">{{ saveConfigError }}</div>\n </if>\n </div>\n </div>\n </if>\n\n <if :="isProcessor">\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="Source type this processor watches.">{{ processorSourceType }}</span>\n <span class="info-pill" title="Environment whose changelog is consumed.">source: {{ processorSourceEnv }}</span>\n <span class="info-pill" title="Function environment.">fn env: {{ handlerEnv }}</span>\n <span class="info-pill" title="How source changes are consumed.">mode: {{ processorMode }}</span>\n <if :="processorPaused">\n <span class="info-pill" title="Processor registration is currently paused.">paused</span>\n </if>\n <if :="showWorkerReason">\n <span class="info-pill" title="Why the processor is in its current state.">{{ reasonText }}</span>\n </if>\n </div>\n <div class="story-lead">\n Watches <strong>{{ processorSourceType }}</strong> in <strong>{{ processorSourceEnv }}</strong> and runs\n <if :="canOpenHandlerFunction">\n <button @click="openHandlerFunction()" class="inline-link" title="View or edit this function in the Functions section.">ƒ {{ handlerName }} ↗</button>\n </if>\n <if :="!canOpenHandlerFunction">\n <span class="muted-code" style="color:var(--okdb-app-fg);">{{ handlerName || \'—\' }}</span>\n </if>\n for each change batch.\n </div>\n <div class="story-note">Use this engine for side effects and projections driven by change batches without owning a dedicated target type.</div>\n </div>\n\n <div class="metric-grid metric-grid--compact" style="min-width:min(100%, 420px);">\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Invocations</div>\n <div class="metric-value" style="color:var(--okdb-accent);">{{ processorInvocations }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Changes</div>\n <div class="metric-value" style="color:var(--okdb-success);">{{ processorProcessedChanges }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Failures</div>\n <div class="metric-value" :style="\'color:\' + (processorFailedBatches > 0 ? \'var(--okdb-danger)\' : \'var(--okdb-app-fg-strong)\')">{{ processorFailedBatches }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Lag</div>\n <div class="metric-value" :style="\'color:\' + (processorLag === 0 ? \'var(--okdb-success)\' : \'var(--okdb-warning)\')">{{ processorLag }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="card stack-compact" style="padding:14px;gap:12px;">\n <div class="card-title" style="margin:0;">Processing settings</div>\n <div class="kv-grid kv-grid--compact">\n <span class="kv-key">bootstrap</span><span class="kv-val">{{ processorBootstrap }}</span>\n <span class="kv-key">origin mode</span><span class="kv-val">{{ processorOriginMode }}</span>\n <span class="kv-key">batch size</span><span class="kv-val">{{ processorBatchSize }}</span>\n <span class="kv-key">running batches</span><span class="kv-val">{{ processorRunningBatches }}</span>\n <span class="kv-key">progress</span><span class="kv-val">{{ processorProgress }}</span>\n <span class="kv-key">cursor key</span><span class="kv-val">{{ processorCursorKey }}</span>\n <span class="kv-key">lock mode</span><span class="kv-val">{{ processorLockMode }}</span>\n <span class="kv-key">hydrate values</span><span class="kv-val">{{ processorHydrateValues }}</span>\n <span class="kv-key">fail on fn error</span><span class="kv-val">{{ processorFailOnHandlerError }}</span>\n </div>\n </div>\n </div>\n </if>\n\n <if :="isMaterializer">\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="Source type this materializer watches.">{{ materializerSourceType }}</span>\n <span class="info-pill" title="Target type updated by returned ops.">target: {{ materializerTargetType }}</span>\n <span class="info-pill" title="Source environment.">source env: {{ materializerSourceEnv }}</span>\n <span class="info-pill" title="Target environment.">target env: {{ materializerTargetEnv }}</span>\n <span class="info-pill" title="Function environment.">fn env: {{ handlerEnv }}</span>\n <if :="materializerPaused">\n <span class="info-pill" title="Materializer registration is currently paused.">paused</span>\n </if>\n </div>\n <div class="story-lead">\n Projects <strong>{{ materializerSourceType }}</strong> into <strong>{{ materializerTargetType }}</strong> using\n <if :="canOpenHandlerFunction">\n <button @click="openHandlerFunction()" class="inline-link" title="View or edit this function in the Functions section.">ƒ {{ handlerName }} ↗</button>\n </if>\n <if :="!canOpenHandlerFunction">\n <span class="muted-code" style="color:var(--okdb-app-fg);">{{ handlerName || \'—\' }}</span>\n </if>\n and applies the returned ops to the target collection.\n </div>\n <div class="story-note">Use this engine when you want deterministic, rebuildable derived records instead of free-form side effects.</div>\n </div>\n\n <div class="metric-grid metric-grid--compact" style="min-width:min(100%, 420px);">\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Applied ops</div>\n <div class="metric-value" style="color:var(--okdb-success);">{{ materializerAppliedOps }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Target rows</div>\n <div class="metric-value" style="color:var(--okdb-accent);">{{ materializerTargetCount }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Changes</div>\n <div class="metric-value" style="color:var(--okdb-success);">{{ materializerProcessedChanges }}</div>\n </div>\n <div class="metric-card metric-card--compact">\n <div class="metric-title">Failures</div>\n <div class="metric-value" :style="\'color:\' + (materializerFailedBatches > 0 ? \'var(--okdb-danger)\' : \'var(--okdb-app-fg-strong)\')">{{ materializerFailedBatches }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="card stack-compact" style="padding:14px;gap:12px;">\n <div class="card-title" style="margin:0;">Materialization settings</div>\n <div class="kv-grid kv-grid--compact">\n <span class="kv-key">bootstrap</span><span class="kv-val">{{ materializerBootstrap }}</span>\n <span class="kv-key">origin mode</span><span class="kv-val">{{ materializerOriginMode }}</span>\n <span class="kv-key">batch size</span><span class="kv-val">{{ materializerBatchSize }}</span>\n <span class="kv-key">running batches</span><span class="kv-val">{{ materializerRunningBatches }}</span>\n <span class="kv-key">progress</span><span class="kv-val">{{ materializerProgress }}</span>\n <span class="kv-key">lag</span><span class="kv-val">{{ materializerLag }}</span>\n <span class="kv-key">cursor key</span><span class="kv-val">{{ materializerCursorKey }}</span>\n <span class="kv-key">clear on rebuild</span><span class="kv-val">{{ materializerClearTargetOnRebuild }}</span>\n </div>\n </div>\n\n <div class="card stack-compact" style="padding:14px;gap:12px;border-color:#244057;">\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:6px;min-width:0;flex:1;">\n <div class="card-title" style="margin:0;">Repair workflow</div>\n <div class="story-note" style="margin:0;">Edit the handler with seeded sample input, verify the draft run, then retry, rewind, or rebuild from here.</div>\n </div>\n <div style="display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;">\n <button @click="openHandlerEditor()" :disabled="!canOpenHandlerFunction || materializerRepairBusy" style="font-size:12px;padding:4px 10px;color:var(--okdb-accent);border-color:color-mix(in srgb, var(--okdb-accent) 33%, transparent);">ƒ Edit handler</button>\n <button @click="retryMaterializer()" :disabled="materializerRepairBusy || !basePath" style="font-size:12px;padding:4px 10px;color:var(--okdb-orange);border-color:color-mix(in srgb, var(--okdb-orange) 33%, transparent);">↻ Retry</button>\n <button @click="resetMaterializerCursor()" :disabled="materializerRepairBusy || !basePath" style="font-size:12px;padding:4px 10px;color:var(--okdb-info);border-color:color-mix(in srgb, var(--okdb-info) 33%, transparent);">⇤ Reset cursor</button>\n <button @click="rebuildMaterializer()" :disabled="materializerRepairBusy || !basePath" style="font-size:12px;padding:4px 10px;color:var(--okdb-success);border-color:color-mix(in srgb, var(--okdb-success) 33%, transparent);">⟳ Rebuild</button>\n </div>\n </div>\n\n <if :="materializerErrorText">\n <div class="alert alert--error">\n <div style="font-weight:600;margin-bottom:4px;">Last materializer error</div>\n <div>{{ materializerErrorText }}</div>\n </div>\n </if>\n\n <if :="materializerRepairError">\n <div class="alert alert--error">{{ materializerRepairError }}</div>\n </if>\n\n <div style="display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,.9fr);gap:12px;">\n <div style="display:flex;flex-direction:column;gap:8px;min-width:0;">\n <div class="field-label">Suggested <code>ctx.payload</code></div>\n <pre class="json-block" style="margin:0;max-height:220px;overflow:auto;">{{ formatJson(materializerPreviewPayload) }}</pre>\n </div>\n <div style="display:flex;flex-direction:column;gap:8px;min-width:0;">\n <div class="field-label">Suggested <code>ctx.materializer</code></div>\n <pre class="json-block" style="margin:0;max-height:220px;overflow:auto;">{{ formatJson(materializerPreviewContext) }}</pre>\n </div>\n </div>\n\n <div class="story-note" style="margin:0;">Recommended order: <strong>Edit handler</strong> → run the seeded draft preview → <strong>Retry</strong>. Use <strong>Reset cursor</strong> to replay without clearing the target, or <strong>Rebuild</strong> to clear and rematerialize from scratch.</div>\n </div>\n </div>\n </if>\n\n <if :="!hasSpecializedPipelineView">\n <div class="panel-grid panel-grid--two">\n <div class="card" style="display:flex;flex-direction:column;gap:12px;">\n <div class="card-title" style="margin:0;">Overview</div>\n <div class="kv-grid kv-grid--compact">\n <span class="kv-key">state</span><span class="kv-val">{{ stateText }}</span>\n <span class="kv-key">reason</span><span class="kv-val">{{ reasonText }}</span>\n <span class="kv-key">enabled</span><span class="kv-val">{{ eng.enabled === false ? \'no\' : \'yes\' }}</span>\n <span class="kv-key">affinity</span><span class="kv-val">{{ affinityText }}</span>\n <span class="kv-key">updated</span><span class="kv-val">{{ updatedText }}</span>\n </div>\n <if :="runtimePreviewEntries.length > 0">\n <div style="display:flex;flex-direction:column;gap:8px;">\n <div class="field-label">Runtime details</div>\n <div class="kv-grid kv-grid--compact">\n <each :of="runtimePreviewEntries" let:item="entry">\n <span class="kv-key">{{ labelize(entry[0]) }}</span><span class="kv-val">{{ humanValue(entry[1]) }}</span>\n </each>\n </div>\n </div>\n </if>\n </div>\n\n <div class="card" style="display:flex;flex-direction:column;gap:12px;">\n <div class="card-title" style="margin:0;">Configuration</div>\n <if :="configPreviewEntries.length > 0">\n <div class="kv-grid kv-grid--compact">\n <each :of="configPreviewEntries" let:item="entry">\n <span class="kv-key">{{ labelize(entry[0]) }}</span><span class="kv-val">{{ humanValue(entry[1]) }}</span>\n </each>\n </div>\n </if>\n <if :="configPreviewEntries.length === 0">\n <div class="helper-text">This engine mostly uses structured config. Open the raw JSON below if you need the full payload.</div>\n </if>\n <if :="statsPreviewEntries.length > 0">\n <div style="display:flex;flex-direction:column;gap:8px;">\n <div class="field-label">Stats snapshot</div>\n <div class="kv-grid kv-grid--compact">\n <each :of="statsPreviewEntries" let:item="entry">\n <span class="kv-key">{{ labelize(entry[0]) }}</span><span class="kv-val">{{ humanValue(entry[1]) }}</span>\n </each>\n </div>\n </div>\n </if>\n </div>\n </div>\n </if>\n\n <div class="card" style="display:flex;flex-direction:column;gap:12px;">\n <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;">\n <div class="card-title" style="margin:0;">Raw data</div>\n <div class="card-subtitle">Keep the default view visual first. Open these only when you need the underlying JSON.</div>\n </div>\n <div class="raw-toggle-row">\n <if :="eng.runtime">\n <button class="raw-toggle" :style="rawToggleStyle(showRawRuntime)" @click="showRawRuntime = !showRawRuntime">Runtime JSON</button>\n </if>\n <if :="eng.stats">\n <button class="raw-toggle" :style="rawToggleStyle(showRawStats)" @click="showRawStats = !showRawStats">Stats JSON</button>\n </if>\n <if :="eng.config">\n <button class="raw-toggle" :style="rawToggleStyle(showRawConfig)" @click="showRawConfig = !showRawConfig">Config JSON</button>\n </if>\n </div>\n\n <if :="showRawRuntime && eng.runtime">\n <div style="display:flex;flex-direction:column;gap:6px;">\n <div class="field-label">Runtime payload</div>\n <pre class="json-block">{{ formatJson(eng.runtime) }}</pre>\n </div>\n </if>\n <if :="showRawStats && eng.stats">\n <div style="display:flex;flex-direction:column;gap:6px;">\n <div class="field-label">Stats payload</div>\n <pre class="json-block">{{ formatJson(eng.stats) }}</pre>\n </div>\n </if>\n <if :="showRawConfig && eng.config">\n <div style="display:flex;flex-direction:column;gap:6px;">\n <div class="field-label">Config payload</div>\n <pre class="json-block">{{ formatJson(eng.config) }}</pre>\n </div>\n </if>\n </div>\n</engine-panel-shell>\n',style:t};
@@ -1 +1 @@
1
- <script type="module">import filesBlobStatus from"./parts/files-blob-status.ok.js";import filesFileList from"./parts/files-file-list.ok.js";import filesOverview from"./parts/files-overview.ok.js";import filesPathBrowser from"./parts/files-path-browser.ok.js";export default{tag:"files-index",unwrap:!0,dependencies:[filesPathBrowser,filesFileList,filesBlobStatus,filesOverview],context:e=>({allFiles:[],selectedPath:null,pathBrowser:null,get showOverview(){return!this.selectedPath},get showFiles(){return this.selectedPath&&"__blobs__"!==this.selectedPath},get showBlobs(){return"__blobs__"===this.selectedPath},onFilesLoaded(e){this.allFiles=e??[]},onSelect(e){this.selectedPath=e??null},onSelectBlobs(){this.selectedPath="__blobs__",this.pathBrowser?.$scope?.$innerContext?.clearSelection?.()},async onRefresh(){await(this.pathBrowser?.$scope?.$innerContext?.load?.())},async onEnvChanged(){this.selectedPath=null,this.allFiles=[],await(this.pathBrowser?.$scope?.$innerContext?.load?.())}}),init(e){e.$watch(()=>e.$ok.stores.okdb.selectedEnv,()=>this.onEnvChanged())}}</script><style>.action-row{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:6px;border:1px solid transparent;background:0 0;cursor:pointer;width:100%;font-size:12px;transition:background .1s}.action-row:hover{background:var(--okdb-app-surface);border-color:var(--okdb-app-border)}.action-row--on{background:var(--okdb-accent-soft-bg);border-color:var(--okdb-accent-soft-border);color:var(--okdb-accent)}</style><template><component import="../../layouts/_default.ok.html"><template name="sidebar"><div style="display:flex;flex-direction:column;gap:0;height:100%;min-height:0"><button :class="showOverview ? 'action-row action-row--on' : 'action-row'" @click="onSelect(null)" style="margin-bottom:4px;flex-shrink:0"><span style="width:15px;text-align:center;flex-shrink:0;font-size:13px">⌂</span> <span style="font-size:12px">Overview</span></button><div style="border-top:1px solid var(--okdb-app-border);margin:0 0 6px;flex-shrink:0"></div><button :class="showBlobs ? 'action-row action-row--on' : 'action-row'" @click="onSelectBlobs()" style="margin-bottom:6px;flex-shrink:0"><span style="width:15px;text-align:center;flex-shrink:0;color:var(--okdb-sky);font-size:13px">⇄</span> <span style="font-size:12px;color:var(--okdb-sky)">Blob Sync</span></button><div style="border-top:1px solid var(--okdb-app-border);margin:0 0 8px;flex-shrink:0"></div><div style="flex:1;min-height:0;overflow:hidden"><files-path-browser :ref="pathBrowser = $el" @select="onSelect($event.detail)" @loaded="onFilesLoaded($event.detail)"/></div></div></template><template name="default"><if :="showOverview"><files-overview :files="allFiles" @select="onSelect($event.detail)"/></if><if :="showFiles"><files-file-list :path="selectedPath" @refresh="onRefresh()"/></if><if :="showBlobs"><files-blob-status/></if></template></component></template>
1
+ <script type="module">import e from"./parts/files-blob-status.ok.js";import t from"./parts/files-file-list.ok.js";import s from"./parts/files-overview.ok.js";import l from"./parts/files-path-browser.ok.js";export default{tag:"files-index",unwrap:!0,dependencies:[l,t,e,s],context:e=>({allFiles:[],selectedPath:null,pathBrowser:null,get showOverview(){return!this.selectedPath},get showFiles(){return this.selectedPath&&"__blobs__"!==this.selectedPath},get showBlobs(){return"__blobs__"===this.selectedPath},onFilesLoaded(e){this.allFiles=e??[]},onSelect(e){this.selectedPath=e??null},onSelectBlobs(){this.selectedPath="__blobs__",this.pathBrowser?.$scope?.$innerContext?.clearSelection?.()},async onRefresh(){await(this.pathBrowser?.$scope?.$innerContext?.load?.())},async onEnvChanged(){this.selectedPath=null,this.allFiles=[],await(this.pathBrowser?.$scope?.$innerContext?.load?.())}}),init(e){e.$watch(()=>e.$ok.stores.okdb.selectedEnv,()=>this.onEnvChanged())}};</script><style>.action-row{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:6px;border:1px solid transparent;background:0 0;cursor:pointer;width:100%;font-size:12px;transition:background .1s}.action-row:hover{background:var(--okdb-app-surface);border-color:var(--okdb-app-border)}.action-row--on{background:var(--okdb-accent-soft-bg);border-color:var(--okdb-accent-soft-border);color:var(--okdb-accent)}</style><template><component import="../../layouts/_default.ok.html"><template name="sidebar"><div style="display:flex;flex-direction:column;gap:0;height:100%;min-height:0"><button :class="showOverview ? 'action-row action-row--on' : 'action-row'" @click="onSelect(null)" style="margin-bottom:4px;flex-shrink:0"><span style="width:15px;text-align:center;flex-shrink:0;font-size:13px">⌂</span> <span style="font-size:12px">Overview</span></button><div style="border-top:1px solid var(--okdb-app-border);margin:0 0 6px;flex-shrink:0"></div><button :class="showBlobs ? 'action-row action-row--on' : 'action-row'" @click="onSelectBlobs()" style="margin-bottom:6px;flex-shrink:0"><span style="width:15px;text-align:center;flex-shrink:0;color:var(--okdb-sky);font-size:13px">⇄</span> <span style="font-size:12px;color:var(--okdb-sky)">Blob Sync</span></button><div style="border-top:1px solid var(--okdb-app-border);margin:0 0 8px;flex-shrink:0"></div><div style="flex:1;min-height:0;overflow:hidden"><files-path-browser :ref="pathBrowser = $el" @select="onSelect($event.detail)" @loaded="onFilesLoaded($event.detail)"/></div></div></template><template name="default"><if :="showOverview"><files-overview :files="allFiles" @select="onSelect($event.detail)"/></if><if :="showFiles"><files-file-list :path="selectedPath" @refresh="onRefresh()"/></if><if :="showBlobs"><files-blob-status/></if></template></component></template>
@@ -1 +1 @@
1
- const _0x30be55=_0xad98;(function(_0x3a514b,_0x22d9e6){const _0x21aeb6=_0xad98,_0x48241c=_0x3a514b();while(!![]){try{const _0x324f89=parseInt(_0x21aeb6(0x201))/0x1+-parseInt(_0x21aeb6(0x200))/0x2*(parseInt(_0x21aeb6(0x206))/0x3)+parseInt(_0x21aeb6(0x1f5))/0x4*(parseInt(_0x21aeb6(0x1f1))/0x5)+parseInt(_0x21aeb6(0x208))/0x6*(-parseInt(_0x21aeb6(0x1fd))/0x7)+parseInt(_0x21aeb6(0x1f0))/0x8+parseInt(_0x21aeb6(0x1e9))/0x9*(parseInt(_0x21aeb6(0x1ea))/0xa)+-parseInt(_0x21aeb6(0x204))/0xb;if(_0x324f89===_0x22d9e6)break;else _0x48241c['push'](_0x48241c['shift']());}catch(_0x240c72){_0x48241c['push'](_0x48241c['shift']());}}}(_0x2103,0x272c3));export default{'tag':_0x30be55(0x1f8),'context':_0xdb640=>({'busy':!0x1,'syncing':!0x1,'blobs':[],'error':null,'syncResult':null,async 'load'(){const _0x2d52e6=_0x30be55;this[_0x2d52e6(0x1f7)]=!0x0,this[_0x2d52e6(0x1eb)]=null;try{const _0x526c50=await fetch(__ENV__[_0x2d52e6(0x1f2)]+'/files/blobs/status'),_0x28d673=await _0x526c50[_0x2d52e6(0x1ee)]();if(!_0x526c50['ok'])throw new Error(_0x28d673?.[_0x2d52e6(0x1eb)]?.[_0x2d52e6(0x1f9)]||_0x2d52e6(0x1fa));this['blobs']=_0x28d673[_0x2d52e6(0x205)]??[];}catch(_0x3f726a){this['error']=_0x3f726a?.[_0x2d52e6(0x1f9)]||String(_0x3f726a);}finally{this[_0x2d52e6(0x1f7)]=!0x1;}},async 'triggerSync'(){const _0x558613=_0x30be55;this[_0x558613(0x1ff)]=!0x0,this['syncResult']=null;try{const _0x548f73=await fetch(__ENV__[_0x558613(0x1f2)]+_0x558613(0x1fb),{'method':_0x558613(0x203),'headers':{'Content-Type':_0x558613(0x1ef)},'body':'{}'}),_0x525513=await _0x548f73[_0x558613(0x1ee)]();if(!_0x548f73['ok'])throw new Error(_0x525513?.[_0x558613(0x1eb)]?.[_0x558613(0x1f9)]||_0x558613(0x1fa));this[_0x558613(0x1fe)]=_0x525513['data'],await this[_0x558613(0x1ed)]();}catch(_0x12fae1){this[_0x558613(0x1eb)]=_0x12fae1?.[_0x558613(0x1f9)]||String(_0x12fae1);}finally{this[_0x558613(0x1ff)]=!0x1;}},'fmtSize':_0x2a04f3=>null==_0x2a04f3?'':_0x2a04f3<0x400?_0x2a04f3+'\x20B':_0x2a04f3<0x100000?(_0x2a04f3/0x400)['toFixed'](0x1)+_0x30be55(0x1f6):(_0x2a04f3/0x100000)[_0x30be55(0x1f3)](0x1)+_0x30be55(0x202),'nodeCount':_0x25aa03=>_0x25aa03&&'object'==typeof _0x25aa03?Object[_0x30be55(0x1f4)](_0x25aa03)[_0x30be55(0x1ec)](Boolean)[_0x30be55(0x207)]:0x0}),async 'mount'(){await this['load']();},'template':_0x30be55(0x1fc)};function _0xad98(_0x3c7008,_0x4b71a6){_0x3c7008=_0x3c7008-0x1e9;const _0x21033f=_0x2103();let _0xad98e8=_0x21033f[_0x3c7008];return _0xad98e8;}function _0x2103(){const _0x445c6f=['message','failed','/files/blobs/sync','\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:16px;\x20height:100%;\x20min-height:0;\x22>\x0a\x0a\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20justify-content:space-between;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-weight:600;\x20font-size:15px;\x22>Blob\x20Mesh\x20Sync</div>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22load()\x22\x20:disabled=\x22busy\x22\x20style=\x22font-size:12px;\x22>↻\x20Refresh</button>\x0a\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22triggerSync()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22syncing\x20||\x20busy\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;\x20background:var(--okdb-sky-soft-bg);\x20border-color:var(--okdb-sky-soft-border);\x20color:var(--okdb-sky);\x22\x0a\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20syncing\x20?\x20\x27Syncing…\x27\x20:\x20\x27⇄\x20Sync\x20Blobs\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<if\x20:=\x22syncResult\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22\x0a\x20\x20\x20\x20\x20\x20padding:8px\x2012px;\x0a\x20\x20\x20\x20\x20\x20border-radius:8px;\x0a\x20\x20\x20\x20\x20\x20background:#1a2f1a;\x0a\x20\x20\x20\x20\x20\x20border:1px\x20solid\x20#2a4a2a;\x0a\x20\x20\x20\x20\x20\x20font-size:12px;\x0a\x20\x20\x20\x20\x20\x20color:#86efac;\x0a\x20\x20\x20\x20\x22>\x0a\x20\x20\x20\x20\x20\x20Sync\x20complete\x20—\x20pulled\x20<strong>{{\x20syncResult.synced\x20}}</strong>\x20blob(s).\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22syncResult.errors?.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-danger);\x20margin-left:8px;\x22>{{\x20syncResult.errors.length\x20}}\x20error(s)</span>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:12px;\x22>{{\x20error\x20}}</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<if\x20:=\x22busy\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.5;\x22>Loading…</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<if\x20:=\x22!busy\x20&&\x20blobs.length\x20===\x200\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-size:13px;\x20opacity:.4;\x20padding:24px\x200;\x20text-align:center;\x22>\x0a\x20\x20\x20\x20\x20\x20No\x20blobs\x20tracked\x20yet.\x20Upload\x20files\x20to\x20see\x20them\x20here.\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<if\x20:=\x22blobs.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22flex:1;\x20overflow:auto;\x20min-height:0;\x22>\x0a\x20\x20\x20\x20\x20\x20<table\x20style=\x22width:100%;\x20border-collapse:collapse;\x20font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<thead>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<tr\x20style=\x22border-bottom:1px\x20solid\x20var(--okdb-app-border);\x20opacity:.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<th\x20style=\x22text-align:left;\x20padding:6px\x208px;\x20font-weight:500;\x22>Hash</th>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<th\x20style=\x22text-align:right;\x20padding:6px\x208px;\x20font-weight:500;\x22>Refs</th>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<th\x20style=\x22text-align:center;\x20padding:6px\x208px;\x20font-weight:500;\x22>On\x20Disk</th>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<th\x20style=\x22text-align:right;\x20padding:6px\x208px;\x20font-weight:500;\x22>Size</th>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<th\x20style=\x22text-align:right;\x20padding:6px\x208px;\x20font-weight:500;\x22>Nodes</th>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</thead>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<tbody>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<tr\x20as=\x22repeat\x22\x20:of=\x22blobs\x22\x20let:item=\x22b\x22\x20style=\x22border-bottom:1px\x20solid\x20var(--okdb-app-surface-2);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<td\x20style=\x22padding:5px\x208px;\x20font-family:monospace;\x20font-size:11px;\x20opacity:.7;\x22\x20:title=\x22b.hash\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20b.hash\x20?\x20b.hash.slice(0,\x2012)\x20:\x20\x27\x27\x20}}…\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<td\x20style=\x22padding:5px\x208px;\x20text-align:right;\x20font-family:monospace;\x22>{{\x20b.refs\x20}}</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<td\x20style=\x22padding:5px\x208px;\x20text-align:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22b.onDisk\x20?\x20\x27color:var(--okdb-success);\x27\x20:\x20\x27color:var(--okdb-danger);\x27\x22>{{\x20b.onDisk\x20?\x20\x27✓\x27\x20:\x20\x27✗\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<td\x20style=\x22padding:5px\x208px;\x20text-align:right;\x20font-family:monospace;\x20opacity:.7;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20fmtSize(b.sizeBytes)\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<td\x20style=\x22padding:5px\x208px;\x20text-align:right;\x20opacity:.6;\x22>{{\x20nodeCount(b.nodes)\x20}}</td>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</tr>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</tbody>\x0a\x20\x20\x20\x20\x20\x20</table>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.4;\x20text-align:right;\x22>{{\x20blobs.length\x20}}\x20blob(s)\x20tracked</div>\x0a\x20\x20</if>\x0a\x0a</div>','7fLBEJs','syncResult','syncing','46IoCMOb','55898AoRcaa','\x20MB','POST','1050896FAXVjS','data','10281bkUAJN','length','1784166YbzYvT','9zahxVK','2243550uKczsR','error','filter','load','json','application/json','2280728gHKqbq','675SkdhIj','API','toFixed','values','1980dPLHkC','\x20KB','busy','files-blob-status'];_0x2103=function(){return _0x445c6f;};return _0x2103();}
1
+ export default{tag:"files-blob-status",context:t=>({busy:!1,syncing:!1,blobs:[],error:null,syncResult:null,async load(){this.busy=!0,this.error=null;try{const t=await fetch(`${__ENV__.API}/files/blobs/status`),n=await t.json();if(!t.ok)throw new Error(n?.error?.message||"failed");this.blobs=n.data??[]}catch(t){this.error=t?.message||String(t)}finally{this.busy=!1}},async triggerSync(){this.syncing=!0,this.syncResult=null;try{const t=await fetch(`${__ENV__.API}/files/blobs/sync`,{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"}),n=await t.json();if(!t.ok)throw new Error(n?.error?.message||"failed");this.syncResult=n.data,await this.load()}catch(t){this.error=t?.message||String(t)}finally{this.syncing=!1}},fmtSize:t=>null==t?"":t<1024?t+" B":t<1048576?(t/1024).toFixed(1)+" KB":(t/1048576).toFixed(1)+" MB",nodeCount:t=>t&&"object"==typeof t?Object.values(t).filter(Boolean).length:0}),async mount(){await this.load()},template:'\n<div style="display:flex; flex-direction:column; gap:16px; height:100%; min-height:0;">\n\n <div style="display:flex; align-items:center; justify-content:space-between; gap:8px;">\n <div style="font-weight:600; font-size:15px;">Blob Mesh Sync</div>\n <div style="display:flex; gap:8px;">\n <button @click="load()" :disabled="busy" style="font-size:12px;">↻ Refresh</button>\n <button\n @click="triggerSync()"\n :disabled="syncing || busy"\n style="font-size:12px; background:var(--okdb-sky-soft-bg); border-color:var(--okdb-sky-soft-border); color:var(--okdb-sky);"\n >\n {{ syncing ? \'Syncing…\' : \'⇄ Sync Blobs\' }}\n </button>\n </div>\n </div>\n\n <if :="syncResult">\n <div style="\n padding:8px 12px;\n border-radius:8px;\n background:#1a2f1a;\n border:1px solid #2a4a2a;\n font-size:12px;\n color:#86efac;\n ">\n Sync complete — pulled <strong>{{ syncResult.synced }}</strong> blob(s).\n <if :="syncResult.errors?.length > 0">\n <span style="color:var(--okdb-danger); margin-left:8px;">{{ syncResult.errors.length }} error(s)</span>\n </if>\n </div>\n </if>\n\n <if :="error">\n <div style="color:var(--okdb-danger); font-size:12px;">{{ error }}</div>\n </if>\n\n <if :="busy">\n <div style="font-size:12px; opacity:.5;">Loading…</div>\n </if>\n\n <if :="!busy && blobs.length === 0">\n <div style="font-size:13px; opacity:.4; padding:24px 0; text-align:center;">\n No blobs tracked yet. Upload files to see them here.\n </div>\n </if>\n\n <if :="blobs.length > 0">\n <div style="flex:1; overflow:auto; min-height:0;">\n <table style="width:100%; border-collapse:collapse; font-size:12px;">\n <thead>\n <tr style="border-bottom:1px solid var(--okdb-app-border); opacity:.6;">\n <th style="text-align:left; padding:6px 8px; font-weight:500;">Hash</th>\n <th style="text-align:right; padding:6px 8px; font-weight:500;">Refs</th>\n <th style="text-align:center; padding:6px 8px; font-weight:500;">On Disk</th>\n <th style="text-align:right; padding:6px 8px; font-weight:500;">Size</th>\n <th style="text-align:right; padding:6px 8px; font-weight:500;">Nodes</th>\n </tr>\n </thead>\n <tbody>\n <tr as="repeat" :of="blobs" let:item="b" style="border-bottom:1px solid var(--okdb-app-surface-2);">\n <td style="padding:5px 8px; font-family:monospace; font-size:11px; opacity:.7;" :title="b.hash">\n {{ b.hash ? b.hash.slice(0, 12) : \'\' }}…\n </td>\n <td style="padding:5px 8px; text-align:right; font-family:monospace;">{{ b.refs }}</td>\n <td style="padding:5px 8px; text-align:center;">\n <span :style="b.onDisk ? \'color:var(--okdb-success);\' : \'color:var(--okdb-danger);\'">{{ b.onDisk ? \'✓\' : \'✗\' }}</span>\n </td>\n <td style="padding:5px 8px; text-align:right; font-family:monospace; opacity:.7;">\n {{ fmtSize(b.sizeBytes) }}\n </td>\n <td style="padding:5px 8px; text-align:right; opacity:.6;">{{ nodeCount(b.nodes) }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n <div style="font-size:11px; opacity:.4; text-align:right;">{{ blobs.length }} blob(s) tracked</div>\n </if>\n\n</div>'};
@@ -1 +1 @@
1
- const _0x50fd56=_0x1958;(function(_0x2dba62,_0xa8f38a){const _0xebe2e=_0x1958,_0x576b1d=_0x2dba62();while(!![]){try{const _0x24d307=-parseInt(_0xebe2e(0xa8))/0x1+parseInt(_0xebe2e(0xa6))/0x2+parseInt(_0xebe2e(0xa2))/0x3*(-parseInt(_0xebe2e(0xa7))/0x4)+-parseInt(_0xebe2e(0x9a))/0x5+-parseInt(_0xebe2e(0xa3))/0x6+parseInt(_0xebe2e(0x94))/0x7*(parseInt(_0xebe2e(0x8c))/0x8)+parseInt(_0xebe2e(0x95))/0x9*(parseInt(_0xebe2e(0x9d))/0xa);if(_0x24d307===_0xa8f38a)break;else _0x576b1d['push'](_0x576b1d['shift']());}catch(_0x182d79){_0x576b1d['push'](_0x576b1d['shift']());}}}(_0x4499,0x38925));import _0x1c8b07 from'../../../stores/events-store.js';import _0x12e3ed from'../../../stores/okdb-store.js';function _0x1958(_0x1a09ef,_0x5e730d){_0x1a09ef=_0x1a09ef-0x8a;const _0x44998e=_0x4499();let _0x195879=_0x44998e[_0x1a09ef];return _0x195879;}export default{'tag':'files-path-browser','context':_0x5c59aa=>({'busy':!0x1,'allFiles':[],'selected':null,'_unsubs':[],async 'load'(){const _0x3f92b0=_0x1958;this[_0x3f92b0(0x8b)]=!0x0;try{const _0x28b758=await fetch(_0x12e3ed[_0x3f92b0(0xa9)]+_0x3f92b0(0x91));if(!_0x28b758['ok'])throw new Error(_0x3f92b0(0x97));const _0x37dbf0=await _0x28b758['json']();this['allFiles']=_0x37dbf0[_0x3f92b0(0x98)]??[],_0x5c59aa[_0x3f92b0(0x90)](_0x3f92b0(0xa5),this[_0x3f92b0(0x9f)]);}catch(_0x59633a){console['error'](_0x3f92b0(0x96),_0x59633a);}finally{this['busy']=!0x1;}},'clearSelection'(){const _0xd446ae=_0x1958;this[_0xd446ae(0x8a)]=null;},'select'(_0x3b7baa){const _0x2b2cd8=_0x1958;this[_0x2b2cd8(0x8a)]=_0x3b7baa,_0x5c59aa['$dispatch']('select',_0x3b7baa);},get 'dirs'(){const _0x12593d=_0x1958,_0x222ffd=new Map();for(const _0x5329d7 of this[_0x12593d(0x9f)]){const _0xaedf27=(_0x5329d7[_0x12593d(0xaa)]??'')[_0x12593d(0x8f)](/^(\/[^/]+)/),_0x309e57=_0xaedf27?_0xaedf27[0x1]:'/';_0x222ffd['set'](_0x309e57,(_0x222ffd[_0x12593d(0x9e)](_0x309e57)??0x0)+0x1);}return[..._0x222ffd[_0x12593d(0xa4)]()][_0x12593d(0x92)]((_0x5200ff,_0x2d2562)=>_0x5200ff[0x0][_0x12593d(0xa1)](_0x2d2562[0x0]))[_0x12593d(0x99)](([_0x181610,_0x1d3eda])=>({'path':_0x181610,'count':_0x1d3eda}));},get 'totalFiles'(){const _0x55afb5=_0x1958;return this[_0x55afb5(0x9f)][_0x55afb5(0xa0)];}}),async 'mount'(){const _0x319e66=_0x1958;await this[_0x319e66(0x93)]();const _0x206e28=()=>this[_0x319e66(0x93)]();this[_0x319e66(0x9c)]=[_0x1c8b07['on'](_0x319e66(0x8e),_0x206e28),_0x1c8b07['on'](_0x319e66(0x8d),_0x206e28)];},'unmount'(){const _0xfe1051=_0x1958;for(const _0x1f66cb of this[_0xfe1051(0x9c)])_0x1f66cb();this[_0xfe1051(0x9c)]=[];},'template':'\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:4px;\x20height:100%;\x20min-height:0;\x22>\x0a\x0a\x20\x20<!--\x20Header\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20justify-content:space-between;\x20gap:6px;\x20margin-bottom:4px;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-weight:600;\x20font-size:13px;\x20opacity:.8;\x22>Directories</div>\x0a\x20\x20\x20\x20<button\x20@click=\x22load()\x22\x20:disabled=\x22busy\x22\x20style=\x22font-size:11px;\x20opacity:.7;\x22\x20title=\x22Refresh\x22>↻</button>\x0a\x20\x20</div>\x0a\x0a\x20\x20<if\x20:=\x22busy\x20&&\x20allFiles.length\x20===\x200\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.4;\x20padding:4px\x200;\x22>Loading…</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20All\x20Files\x20entry\x20-->\x0a\x20\x20<button\x0a\x20\x20\x20\x20:class=\x22selected\x20===\x20\x27/\x27\x20?\x20\x27dir-row\x20dir-row--on\x27\x20:\x20\x27dir-row\x27\x22\x0a\x20\x20\x20\x20@click=\x22select(\x27/\x27)\x22\x0a\x20\x20>\x0a\x20\x20\x20\x20<span\x20style=\x22flex-shrink:0;\x20font-size:12px;\x20opacity:.6;\x22>📁</span>\x0a\x20\x20\x20\x20<span\x20style=\x22flex:1;\x20text-align:left;\x20font-size:12px;\x22>/\x20(all\x20files)</span>\x0a\x20\x20\x20\x20<span\x20style=\x22font-size:10px;\x20opacity:.4;\x20flex-shrink:0;\x20font-family:monospace;\x22>{{\x20totalFiles\x20}}</span>\x0a\x20\x20</button>\x0a\x0a\x20\x20<if\x20:=\x22dirs.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22border-top:1px\x20solid\x20var(--okdb-app-surface-2);\x20margin:2px\x200;\x22></div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Dir\x20rows\x20-->\x0a\x20\x20<each\x20:of=\x22dirs\x22\x20let:item=\x22dir\x22>\x0a\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20:class=\x22selected\x20===\x20dir.path\x20?\x20\x27dir-row\x20dir-row--on\x27\x20:\x20\x27dir-row\x27\x22\x0a\x20\x20\x20\x20\x20\x20@click=\x22select(dir.path)\x22\x0a\x20\x20\x20\x20\x20\x20:title=\x22dir.path\x22\x0a\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22flex-shrink:0;\x20font-size:12px;\x20opacity:.5;\x22>📂</span>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22flex:1;\x20text-align:left;\x20font-size:12px;\x20overflow:hidden;\x20text-overflow:ellipsis;\x20white-space:nowrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20dir.path\x20}}\x0a\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:10px;\x20opacity:.4;\x20flex-shrink:0;\x20font-family:monospace;\x22>{{\x20dir.count\x20}}</span>\x0a\x20\x20\x20\x20</button>\x0a\x20\x20</each>\x0a\x0a\x20\x20<if\x20:=\x22allFiles.length\x20===\x200\x20&&\x20!busy\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.35;\x20padding:8px\x200;\x20text-align:center;\x22>No\x20files\x20yet.</div>\x0a\x20\x20</if>\x0a\x0a</div>','style':_0x50fd56(0x9b)};function _0x4499(){const _0x3676f7=['allFiles','length','localeCompare','9xwiVnc','1820004WgTuIU','entries','loaded','913706BKXzJG','120448dEoHtr','395907uiPpNa','apiBase','path','selected','busy','3025544iYJMfo','files:removed','files:uploaded','match','$dispatch','/files?path=/&limit=5000','sort','load','7DvMeTS','2855484LOSOQg','files-path-browser\x20load\x20error','failed','data','map','2241520YMtLdE','\x0a[tag]\x20.dir-row\x20{\x0a\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20gap:\x207px;\x0a\x20\x20\x20\x20padding:\x205px\x208px;\x0a\x20\x20\x20\x20border-radius:\x206px;\x0a\x20\x20\x20\x20border:\x201px\x20solid\x20transparent;\x0a\x20\x20\x20\x20background:\x20transparent;\x0a\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20width:\x20100%;\x0a}\x0a[tag]\x20.dir-row:hover\x20\x20{\x20background:\x20var(--okdb-app-surface);\x20border-color:\x20var(--okdb-app-border);\x20}\x0a[tag]\x20.dir-row--on\x20\x20\x20\x20{\x20background:\x20var(--okdb-app-surface);\x20border-color:\x20var(--okdb-accent);\x20}\x0a','_unsubs','20EsoQNT','get'];_0x4499=function(){return _0x3676f7;};return _0x4499();}
1
+ import e from"../../../stores/events-store.js";import t from"../../../stores/okdb-store.js";export default{tag:"files-path-browser",context:e=>({busy:!1,allFiles:[],selected:null,_unsubs:[],async load(){this.busy=!0;try{const n=await fetch(`${t.apiBase}/files?path=/&limit=5000`);if(!n.ok)throw new Error("failed");const s=await n.json();this.allFiles=s.data??[],e.$dispatch("loaded",this.allFiles)}catch(e){console.error("files-path-browser load error",e)}finally{this.busy=!1}},clearSelection(){this.selected=null},select(t){this.selected=t,e.$dispatch("select",t)},get dirs(){const e=new Map;for(const t of this.allFiles){const n=(t.path??"").match(/^(\/[^/]+)/),s=n?n[1]:"/";e.set(s,(e.get(s)??0)+1)}return[...e.entries()].sort((e,t)=>e[0].localeCompare(t[0])).map(([e,t])=>({path:e,count:t}))},get totalFiles(){return this.allFiles.length}}),async mount(){await this.load();const t=()=>this.load();this._unsubs=[e.on("files:uploaded",t),e.on("files:removed",t)]},unmount(){for(const e of this._unsubs)e();this._unsubs=[]},template:'\n<div style="display:flex; flex-direction:column; gap:4px; height:100%; min-height:0;">\n\n \x3c!-- Header --\x3e\n <div style="display:flex; align-items:center; justify-content:space-between; gap:6px; margin-bottom:4px;">\n <div style="font-weight:600; font-size:13px; opacity:.8;">Directories</div>\n <button @click="load()" :disabled="busy" style="font-size:11px; opacity:.7;" title="Refresh">↻</button>\n </div>\n\n <if :="busy && allFiles.length === 0">\n <div style="font-size:11px; opacity:.4; padding:4px 0;">Loading…</div>\n </if>\n\n \x3c!-- All Files entry --\x3e\n <button\n :class="selected === \'/\' ? \'dir-row dir-row--on\' : \'dir-row\'"\n @click="select(\'/\')"\n >\n <span style="flex-shrink:0; font-size:12px; opacity:.6;">📁</span>\n <span style="flex:1; text-align:left; font-size:12px;">/ (all files)</span>\n <span style="font-size:10px; opacity:.4; flex-shrink:0; font-family:monospace;">{{ totalFiles }}</span>\n </button>\n\n <if :="dirs.length > 0">\n <div style="border-top:1px solid var(--okdb-app-surface-2); margin:2px 0;"></div>\n </if>\n\n \x3c!-- Dir rows --\x3e\n <each :of="dirs" let:item="dir">\n <button\n :class="selected === dir.path ? \'dir-row dir-row--on\' : \'dir-row\'"\n @click="select(dir.path)"\n :title="dir.path"\n >\n <span style="flex-shrink:0; font-size:12px; opacity:.5;">📂</span>\n <span style="flex:1; text-align:left; font-size:12px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">\n {{ dir.path }}\n </span>\n <span style="font-size:10px; opacity:.4; flex-shrink:0; font-family:monospace;">{{ dir.count }}</span>\n </button>\n </each>\n\n <if :="allFiles.length === 0 && !busy">\n <div style="font-size:12px; opacity:.35; padding:8px 0; text-align:center;">No files yet.</div>\n </if>\n\n</div>',style:"\n[tag] .dir-row {\n display: flex;\n align-items: center;\n gap: 7px;\n padding: 5px 8px;\n border-radius: 6px;\n border: 1px solid transparent;\n background: transparent;\n cursor: pointer;\n width: 100%;\n}\n[tag] .dir-row:hover { background: var(--okdb-app-surface); border-color: var(--okdb-app-border); }\n[tag] .dir-row--on { background: var(--okdb-app-surface); border-color: var(--okdb-accent); }\n"};
@@ -1 +1 @@
1
- function _0x534d(_0x404475,_0x3e61c3){_0x404475=_0x404475-0x1ec;var _0x2ba293=_0x2ba2();var _0x534d24=_0x2ba293[_0x404475];return _0x534d24;}function _0x2ba2(){var _0x242d14=['$dispatch','files-path-panel','5752872bGkcjQ','1236490AQZQZc','3414rjGAzS','6853AoqLYA','4295133lqcepH','18dcSKVd','\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:0;\x20height:100%;\x20min-height:0;\x22>\x0a\x20\x20<files-file-list\x20:path=\x22path\x22\x20@refresh=\x22onRefresh()\x22\x20/>\x0a</div>','69617uhkyAE','path','7535871UDQmfz','$attr','1195630qDDlVC','refresh','33tUDsnF','16BbfGZt'];_0x2ba2=function(){return _0x242d14;};return _0x2ba2();}var _0x559173=_0x534d;(function(_0x3b923f,_0x525e46){var _0x476670=_0x534d,_0x1b6ab3=_0x3b923f();while(!![]){try{var _0x275504=-parseInt(_0x476670(0x1fc))/0x1*(-parseInt(_0x476670(0x1fa))/0x2)+parseInt(_0x476670(0x1f9))/0x3+-parseInt(_0x476670(0x1f2))/0x4*(parseInt(_0x476670(0x1f6))/0x5)+-parseInt(_0x476670(0x1f7))/0x6*(parseInt(_0x476670(0x1f8))/0x7)+parseInt(_0x476670(0x1f5))/0x8+-parseInt(_0x476670(0x1ed))/0x9+parseInt(_0x476670(0x1ef))/0xa*(parseInt(_0x476670(0x1f1))/0xb);if(_0x275504===_0x525e46)break;else _0x1b6ab3['push'](_0x1b6ab3['shift']());}catch(_0xfa67bf){_0x1b6ab3['push'](_0x1b6ab3['shift']());}}}(_0x2ba2,0xb7b74));import _0x1279c0 from'./files-file-list.ok.js';export default{'tag':_0x559173(0x1f4),'props':['path'],'dependencies':[_0x1279c0],'context':_0x2ab490=>({get 'path'(){var _0x52b517=_0x559173;return _0x2ab490[_0x52b517(0x1ee)][_0x52b517(0x1ec)]??'/';},'onRefresh'(){var _0x5d9bdd=_0x559173;_0x2ab490[_0x5d9bdd(0x1f3)](_0x5d9bdd(0x1f0));}}),'template':_0x559173(0x1fb)};
1
+ import e from"./files-file-list.ok.js";export default{tag:"files-path-panel",props:["path"],dependencies:[e],context:e=>({get path(){return e.$attr.path??"/"},onRefresh(){e.$dispatch("refresh")}}),template:'\n<div style="display:flex; flex-direction:column; gap:0; height:100%; min-height:0;">\n <files-file-list :path="path" @refresh="onRefresh()" />\n</div>'};