@kedem/okdb 1.0.1 → 1.0.3

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 (193) 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/geo-map.ok.js +1 -1
  10. package/public/components/ok-cron-input.ok.js +1 -1
  11. package/public/components/ok-dropzone.ok.js +1 -1
  12. package/public/components/ok-js-input.ok.js +1 -1
  13. package/public/components/ok-json-input.ok.js +1 -1
  14. package/public/components/ok-text-monaco-input.ok.js +1 -1
  15. package/public/components/theme-toggle.ok.js +1 -1
  16. package/public/login-app.js +1 -1
  17. package/public/modules/ok.js +1 -1
  18. package/public/sections/api/parts/api-endpoint.ok.js +1 -1
  19. package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
  20. package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
  21. package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
  22. package/public/sections/auth/parts/token-detail.ok.js +1 -1
  23. package/public/sections/auth/parts/token-list.ok.js +1 -1
  24. package/public/sections/db/modals/add-item-modal.ok.js +1 -1
  25. package/public/sections/db/modals/create-env-modal.ok.js +1 -1
  26. package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
  27. package/public/sections/db/modals/create-index-modal.ok.js +1 -1
  28. package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
  29. package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
  30. package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
  31. package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
  32. package/public/sections/db/parts/db-overview.ok.js +1 -1
  33. package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
  34. package/public/sections/db/parts/edit-row.ok.js +1 -1
  35. package/public/sections/db/parts/tm-timeline.ok.js +1 -1
  36. package/public/sections/db/parts/type-changelog.ok.js +1 -1
  37. package/public/sections/db/parts/type-list.ok.js +1 -1
  38. package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
  39. package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
  40. package/public/sections/db/parts/type-viewer.ok.js +1 -1
  41. package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
  42. package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
  43. package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
  44. package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
  45. package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
  46. package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
  47. package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
  48. package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
  49. package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
  50. package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
  51. package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
  52. package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
  53. package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
  54. package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
  55. package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
  56. package/public/sections/engines/engine-panel-shared-style.js +1 -1
  57. package/public/sections/engines/engine-ui-utils.js +1 -1
  58. package/public/sections/engines/modals/engine-modal.ok.js +1 -1
  59. package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
  60. package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
  61. package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
  62. package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
  63. package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
  64. package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
  65. package/public/sections/files/parts/files-blob-status.ok.js +1 -1
  66. package/public/sections/files/parts/files-collection-list.ok.js +1 -1
  67. package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
  68. package/public/sections/files/parts/files-file-list.ok.js +1 -1
  69. package/public/sections/files/parts/files-overview.ok.js +1 -1
  70. package/public/sections/files/parts/files-path-browser.ok.js +1 -1
  71. package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
  72. package/public/sections/functions/modals/function-modal.ok.js +1 -1
  73. package/public/sections/functions/parts/function-detail.ok.js +1 -1
  74. package/public/sections/functions/parts/function-logs.ok.js +1 -1
  75. package/public/sections/functions/parts/function-runner.ok.js +1 -1
  76. package/public/sections/functions/parts/functions-list.ok.js +1 -1
  77. package/public/sections/license/parts/license-panel.ok.js +1 -1
  78. package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
  79. package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
  80. package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
  81. package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
  82. package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
  83. package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
  84. package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
  85. package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
  86. package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
  87. package/public/sections/queue/parts/queue-types.ok.js +1 -1
  88. package/public/sections/queue/parts/queue-workers.ok.js +1 -1
  89. package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
  90. package/public/sections/sync/parts/sync-retention.ok.js +1 -1
  91. package/public/sections/sync/parts/sync-topology.ok.js +1 -1
  92. package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
  93. package/public/sections/system/parts/system-api-panel.ok.js +1 -1
  94. package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
  95. package/public/sections/system/parts/system-log-history.ok.js +1 -1
  96. package/public/sections/system/parts/system-log.ok.js +1 -1
  97. package/public/sections/system/parts/system-status.ok.js +1 -1
  98. package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
  99. package/public/sections/views/modals/create-view-modal.ok.js +1 -1
  100. package/public/sections/views/parts/view-detail.ok.js +1 -1
  101. package/public/sections/views/parts/views-list.ok.js +1 -1
  102. package/public/sections/views/parts/views-overview.ok.js +1 -1
  103. package/public/setup-app.js +1 -1
  104. package/public/stores/auth-store.js +1 -1
  105. package/public/stores/events-store.js +1 -1
  106. package/public/stores/functions-store.js +1 -1
  107. package/public/stores/okdb-store.js +1 -1
  108. package/public/stores/theme-store.js +1 -1
  109. package/public/util/permissions.js +1 -1
  110. package/public/util/sift-schema.js +1 -1
  111. package/public/vendor/okjs/ok.esm.min.js +1 -2
  112. package/public/vendor/okjs/toolkit/behavior/async.ok.js +1 -1
  113. package/public/vendor/okjs/toolkit/components/ok-chart.ok.js +1 -1
  114. package/public/vendor/okjs/toolkit/components/ok-doc-viewer.ok.js +1 -1
  115. package/public/vendor/okjs/toolkit/components/ok-marked.ok.js +1 -1
  116. package/public/vendor/okjs/toolkit/components/ok-monaco.ok.js +1 -1
  117. package/public/vendor/okjs/toolkit/core/ok-layer-service.ok.js +1 -1
  118. package/public/vendor/okjs/toolkit/core/ok-layer.ok.js +1 -1
  119. package/public/vendor/okjs/toolkit/core/ok-overlay.ok.js +1 -1
  120. package/public/vendor/okjs/toolkit/core/ok-sandbox.ok.js +1 -1
  121. package/public/vendor/okjs/toolkit/core/transition.ok.js +1 -1
  122. package/public/vendor/okjs/toolkit/core/virtualized.ok.js +1 -1
  123. package/public/vendor/okjs/toolkit/devtools/ok-console-service.ok.js +1 -1
  124. package/public/vendor/okjs/toolkit/devtools/ok-console.ok.js +1 -1
  125. package/public/vendor/okjs/toolkit/devtools/ok-fps-monitor-service.ok.js +1 -1
  126. package/public/vendor/okjs/toolkit/devtools/ok-fps-monitor.ok.js +1 -1
  127. package/public/vendor/okjs/toolkit/devtools/ok-inspector-service.ok.js +1 -1
  128. package/public/vendor/okjs/toolkit/devtools/ok-inspector.ok.js +1 -1
  129. package/public/vendor/okjs/toolkit/devtools/ok-js-tree.ok.js +1 -1
  130. package/public/vendor/okjs/toolkit/devtools/ok-timeline-service.ok.js +1 -1
  131. package/public/vendor/okjs/toolkit/devtools/ok-timeline.ok.js +1 -1
  132. package/public/vendor/okjs/toolkit/docs/doc-viewer.ok.js +1 -1
  133. package/public/vendor/okjs/toolkit/editor/ok-live-component.ok.js +1 -1
  134. package/public/vendor/okjs/toolkit/editor/ok-live-example.ok.js +1 -1
  135. package/public/vendor/okjs/toolkit/editor/ok-live-shell.ok.js +1 -1
  136. package/public/vendor/okjs/toolkit/elements/ok-dropdown.ok.js +1 -1
  137. package/public/vendor/okjs/toolkit/elements/ok-icon.ok.js +1 -1
  138. package/public/vendor/okjs/toolkit/elements/ok-select.ok.js +1 -1
  139. package/public/vendor/okjs/toolkit/elements/ok-table.ok.js +1 -1
  140. package/public/vendor/okjs/toolkit/errors/ok-crash-boundary.ok.js +1 -1
  141. package/public/vendor/okjs/toolkit/errors/ok-crash-info.ok.js +1 -1
  142. package/public/vendor/okjs/toolkit/i18n/i18n-editor-examples.ok.js +1 -1
  143. package/public/vendor/okjs/toolkit/i18n/i18n-editor.ok.js +1 -1
  144. package/public/vendor/okjs/toolkit/i18n/i18n-key-editor-tips.ok.js +1 -1
  145. package/public/vendor/okjs/toolkit/i18n/i18n-key-editor.ok.js +1 -1
  146. package/public/vendor/okjs/toolkit/i18n/i18n-service.ok.js +1 -1
  147. package/public/vendor/okjs/toolkit/i18n/ok-i18n.js +1 -1
  148. package/public/vendor/okjs/toolkit/interaction/ok-contextmenu.ok.js +1 -1
  149. package/public/vendor/okjs/toolkit/interaction/ok-dismiss-service.ok.js +1 -1
  150. package/public/vendor/okjs/toolkit/interaction/ok-draggable.ok.js +1 -1
  151. package/public/vendor/okjs/toolkit/interaction/ok-flyover-panel.ok.js +1 -1
  152. package/public/vendor/okjs/toolkit/interaction/ok-flyover.ok.js +1 -1
  153. package/public/vendor/okjs/toolkit/interaction/ok-highlight-service.ok.js +1 -1
  154. package/public/vendor/okjs/toolkit/interaction/ok-highlight.ok.js +1 -1
  155. package/public/vendor/okjs/toolkit/interaction/ok-hotkeys-service.ok.js +1 -1
  156. package/public/vendor/okjs/toolkit/interaction/ok-picker-service.ok.js +1 -1
  157. package/public/vendor/okjs/toolkit/interaction/ok-popout-service.ok.js +1 -1
  158. package/public/vendor/okjs/toolkit/interaction/ok-popout.ok.js +1 -1
  159. package/public/vendor/okjs/toolkit/interaction/ok-portal-service.ok.js +1 -1
  160. package/public/vendor/okjs/toolkit/interaction/ok-submenu.ok.js +1 -1
  161. package/public/vendor/okjs/toolkit/layout/ok-resizer.ok.js +1 -1
  162. package/public/vendor/okjs/toolkit/manifest.js +1 -1
  163. package/public/vendor/okjs/toolkit/modals/ok-modal-service.ok.js +1 -1
  164. package/public/vendor/okjs/toolkit/modals/ok-modal.ok.js +1 -1
  165. package/public/vendor/okjs/toolkit/modals/ok-toast-service.ok.js +1 -1
  166. package/public/vendor/okjs/toolkit/modals/ok-window.ok.js +1 -1
  167. package/public/vendor/okjs/toolkit/navigation/hash-router.ok.js +1 -1
  168. package/public/vendor/okjs/toolkit/navigation/history-router.ok.js +1 -1
  169. package/public/vendor/okjs/toolkit/navigation/router.ok.js +1 -1
  170. package/public/vendor/okjs/toolkit/sync/reactive-sync-service.ok.js +1 -1
  171. package/public/vendor/okjs/toolkit/sync/reactive-sync.js +1 -1
  172. package/public/vendor/okjs/toolkit/theming/blocks/ok-design-button.css.js +1 -1
  173. package/public/vendor/okjs/toolkit/theming/blocks/ok-design-input.css.js +1 -1
  174. package/public/vendor/okjs/toolkit/theming/ok-design-style.js +1 -1
  175. package/public/vendor/okjs/toolkit/theming/ok-design-vars.js +1 -1
  176. package/public/vendor/okjs/toolkit/theming/ok-design.ok.js +1 -1
  177. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-input.ok.js +1 -1
  178. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-service.ok.js +1 -1
  179. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-style.js +1 -1
  180. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-utils.js +1 -1
  181. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-variable.ok.js +1 -1
  182. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-vm.js +1 -1
  183. package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor.ok.js +1 -1
  184. package/public/vendor/okjs/toolkit/theming/ok-theme.ok.js +1 -1
  185. package/public/view-models/type-query-vm.js +1 -1
  186. package/okdb-data/default/data.mdb +0 -0
  187. package/okdb-data/default/lock.mdb +0 -0
  188. package/okdb-data/~log/data.mdb +0 -0
  189. package/okdb-data/~log/lock.mdb +0 -0
  190. package/okdb-data/~system/data.mdb +0 -0
  191. package/okdb-data/~system/lock.mdb +0 -0
  192. package/public/images/logo.png +0 -0
  193. package/public/images/logo.svg +0 -333
@@ -1 +1 @@
1
- const _0x5b4081=_0x52ef;(function(_0x235e21,_0x3f1304){const _0x5657c8=_0x52ef,_0x5f1838=_0x235e21();while(!![]){try{const _0x54c268=parseInt(_0x5657c8(0x208))/0x1+parseInt(_0x5657c8(0x22a))/0x2+-parseInt(_0x5657c8(0x1d4))/0x3+parseInt(_0x5657c8(0x1da))/0x4*(parseInt(_0x5657c8(0x1f2))/0x5)+-parseInt(_0x5657c8(0x1c3))/0x6*(-parseInt(_0x5657c8(0x213))/0x7)+-parseInt(_0x5657c8(0x1cf))/0x8*(parseInt(_0x5657c8(0x217))/0x9)+-parseInt(_0x5657c8(0x204))/0xa;if(_0x54c268===_0x3f1304)break;else _0x5f1838['push'](_0x5f1838['shift']());}catch(_0x515b62){_0x5f1838['push'](_0x5f1838['shift']());}}}(_0x47e3,0x53b16));import _0x5268d5 from'../../../stores/events-store.js';import _0xb8fb87 from'../../../stores/okdb-store.js';function _0x47e3(){const _0x18f1ea=['/functions/preview','Must\x20be\x20(ctx)\x20=>\x20{\x20…\x20}','$attr','986178EfRGPP','workers','apiBase','functions','catch','async\x20(ctx)\x20=>\x20{\x0a\x20\x20//\x20ctx.payload\x20—\x20the\x20raw\x20job\x20payload\x20(whatever\x20was\x20enqueued)\x0a\x20\x20//\x20ctx.job\x20\x20\x20\x20\x20—\x20queue\x20job\x20context\x0a\x20\x20//\x20\x20\x20ctx.job.id,\x20ctx.job.type,\x20ctx.job.tries,\x20ctx.job.tags,\x20...\x0a\x20\x20//\x20\x20\x20ctx.job.heartbeat()\x20\x20\x20\x20\x20\x20\x20\x20—\x20keep\x20the\x20job\x20alive\x0a\x20\x20//\x20\x20\x20ctx.job.markProgress(msg)\x20\x20—\x20report\x20progress\x0a\x20\x20//\x20ctx.env\x20\x20\x20\x20\x20—\x20env\x20facade:\x20put,\x20get,\x20query,\x20txn,\x20...\x0a\x20\x20//\x20ctx.log\x20\x20\x20\x20\x20—\x20structured\x20logger:\x20ctx.log.info(msg,\x20data)\x0a\x0a\x20\x20return\x20{\x20ok:\x20true\x20};\x0a}','handler','DELETE','6LgRfue','durationMs','now','#facc15','Worker\x20','sort','logs','samplePayload','var(--okdb-danger)','status','return\x20(','canCreate','4936MYNkKM','loadFunctions','building','stringify','processed','739386VlDGFH','_unsubs','$ok','restart','previewRunning','name','622340wCDbHr','reduce','createError','load','envName','/engines?type=queue-worker','execution','Worker\x20\x22','fnSource','-preview-1','modal','/engines/','\x0a<div\x20style=\x22display:flex;flex-direction:column;gap:14px;flex:1;overflow:auto;padding-right:4px;\x22>\x0a\x0a\x20\x20<!--\x20Header\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-weight:600;font-size:15px;\x22>\x0a\x20\x20\x20\x20\x20\x20Queue\x20Workers\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<if\x20:=\x22jobType\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;padding:2px\x208px;border-radius:999px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x209%,\x20transparent);border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);color:var(--okdb-accent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20bound\x20to\x20{{\x20jobType\x20}}\x0a\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<if\x20:=\x22workers.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;padding:2px\x208px;border-radius:999px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x209%,\x20transparent);border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);color:var(--okdb-accent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20workers.length\x20}}\x20worker{{\x20workers.length\x20!==\x201\x20?\x20\x27s\x27\x20:\x20\x27\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<div\x20style=\x22flex:1;\x22></div>\x0a\x20\x20\x20\x20<button\x20@click=\x22load()\x22\x20:disabled=\x22busy\x22\x20style=\x22font-size:11px;padding:3px\x208px;opacity:.6;\x22>↻</button>\x0a\x20\x20\x20\x20<if\x20:=\x22!showCreate\x20&&\x20hasBoundJobType\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openCreate()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;padding:5px\x2014px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2013%,\x20transparent);border-color:var(--okdb-accent);color:var(--okdb-accent);font-weight:600;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20+\x20Add\x20Worker\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a\x20\x20<if\x20:=\x22jobType\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;padding:12px\x2014px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:4px;min-width:220px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Scope</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:14px;font-weight:600;\x22>{{\x20jobType\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.55;line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Workers\x20here\x20are\x20explicitly\x20tied\x20to\x20this\x20queue\x20job\x20type.\x20They\x20are\x20not\x20general-purpose\x20consumers.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:18px;flex-wrap:wrap;font-size:11px;opacity:.65;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>workers:\x20<b\x20style=\x22color:var(--okdb-app-fg-strong);opacity:1;\x22>{{\x20workers.length\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>processed:\x20<b\x20style=\x22color:var(--okdb-success);opacity:1;\x22>{{\x20totalProcessed\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22totalFailed\x20>\x200\x22><span>failed:\x20<b\x20style=\x22color:var(--okdb-danger);opacity:1;\x22>{{\x20totalFailed\x20}}</b></span></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:=\x22createSuccess\x20&&\x20!showCreate\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-success);font-size:12px;padding:6px\x2010px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x2020%,\x20transparent);border-radius:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20✓\x20{{\x20createSuccess\x20}}\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:12px;padding:6px\x2010px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:6px;\x22>{{\x20error\x20}}</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<if\x20:=\x22!hasBoundJobType\x20&&\x20!showCreate\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22padding:32px\x2024px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;display:flex;flex-direction:column;gap:12px;align-items:center;text-align:center;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:34px;opacity:.18;\x22>⇶</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:14px;font-weight:600;opacity:.72;\x22>Select\x20a\x20queue\x20job\x20type</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.48;line-height:1.8;max-width:430px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Queue\x20workers\x20are\x20managed\x20per\x20job\x20type.\x20Pick\x20a\x20type\x20from\x20the\x20sidebar\x20to\x20view\x20its\x20workers,\x0a\x20\x20\x20\x20\x20\x20\x20\x20create\x20a\x20new\x20one,\x20and\x20test\x20it\x20against\x20sample\x20job\x20payloads.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Worker\x20list\x20-->\x0a\x20\x20<if\x20:=\x22!showCreate\x22>\x0a\x20\x20\x20\x20<if\x20:=\x22hasBoundJobType\x20&&\x20!busy\x20&&\x20workers.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:28px\x2020px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;text-align:center;display:flex;flex-direction:column;gap:10px;align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:32px;opacity:.2;\x22>⚙</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:14px;font-weight:600;opacity:.7;\x22>No\x20workers\x20yet\x20for\x20\x22{{\x20jobType\x20}}\x22</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.45;max-width:420px;line-height:1.7;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Create\x20a\x20worker\x20bound\x20to\x20this\x20queue\x20job\x20type.\x20The\x20worker\x20will\x20consume\x20only\x20<code>{{\x20jobType\x20}}</code>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20jobs\x20and\x20run\x20a\x20specific\x20function\x20handler.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openCreate()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22margin-top:4px;font-size:12px;padding:6px\x2018px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2013%,\x20transparent);border-color:var(--okdb-accent);color:var(--okdb-accent);font-weight:600;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20+\x20Add\x20Worker\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<each\x20:of=\x22workers\x22\x20let:item=\x22w\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22background:var(--okdb-app-surface);border:1px\x20solid\x20var(--okdb-app-border);border-radius:12px;padding:14px\x2016px;display:flex;flex-direction:column;gap:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<engine-row-item\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:engine=\x22w\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20label=\x22Worker\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20label-color=\x22var(--okdb-accent)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:subtitle=\x22stateLabel(w)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@select=\x22openWorkerModal($event.detail)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22doAction(w,\x27pause\x27)\x22\x20\x20\x20title=\x22Pause\x22\x20\x20\x20style=\x22font-size:11px;padding:2px\x207px;color:var(--okdb-warning);border-color:color-mix(in\x20srgb,\x20var(--okdb-warning)\x2033%,\x20transparent);\x22>⏸</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22doAction(w,\x27resume\x27)\x22\x20\x20title=\x22Resume\x22\x20\x20style=\x22font-size:11px;padding:2px\x207px;color:var(--okdb-success);border-color:color-mix(in\x20srgb,\x20var(--okdb-success)\x2033%,\x20transparent);\x22>▶</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22doAction(w,\x27restart\x27)\x22\x20title=\x22Restart\x22\x20style=\x22font-size:11px;padding:2px\x207px;opacity:.6;\x22>↺</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22doDelete(w)\x22\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Delete\x22\x20\x20style=\x22font-size:11px;padding:2px\x207px;color:var(--okdb-danger);border-color:color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x22>🗑</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px\x2014px;font-size:11px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Job\x20type</div><div\x20style=\x22margin-top:3px;color:var(--okdb-app-fg-strong);\x22>{{\x20w.config?.job_type\x20||\x20\x27—\x27\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Handler</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:3px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22w.config?.handler?.name\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openWorkerFunction(w,\x20$event)\x22\x20title=\x22Open\x20this\x20handler\x20in\x20the\x20Functions\x20section.\x22\x20style=\x22background:none;border:none;padding:0;color:var(--okdb-accent);font-size:11px;text-decoration:underline;text-underline-offset:2px;cursor:pointer;\x22>ƒ\x20{{\x20w.config?.handler?.name\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!w.config?.handler?.name\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-app-fg-strong);\x22>—</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\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Concurrency</div><div\x20style=\x22margin-top:3px;color:var(--okdb-app-fg-strong);\x22>{{\x20w.config?.concurrency\x20??\x201\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Poll\x20interval</div><div\x20style=\x22margin-top:3px;color:var(--okdb-app-fg-strong);\x22>{{\x20w.config?.pollInterval\x20??\x20100\x20}}\x20ms</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22w.stats\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Processed</div><div\x20style=\x22margin-top:3px;color:var(--okdb-success);\x22>{{\x20w.stats.processed\x20??\x200\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Failed</div><div\x20:style=\x22\x27margin-top:3px;color:\x27\x20+\x20((w.stats.failed\x20??\x200)\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-app-fg-strong)\x27)\x22>{{\x20w.stats.failed\x20??\x200\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22w.stats?.error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:11px;padding:4px\x208px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:4px;font-family:monospace;\x22>{{\x20w.stats.error\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</each>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Create\x20panel\x20-->\x0a\x20\x20<if\x20:=\x22showCreate\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22background:var(--okdb-app-surface);border:1px\x20solid\x20var(--okdb-app-border);border-radius:12px;padding:18px;display:flex;flex-direction:column;gap:16px;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-weight:600;font-size:14px;display:flex;align-items:center;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>New\x20Queue\x20Worker</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;color:var(--okdb-accent);opacity:.8;\x22>bound\x20to\x20{{\x20jobType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22cancelCreate()\x22\x20style=\x22font-size:11px;padding:2px\x208px;opacity:.6;\x22>✕\x20Cancel</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:minmax(0,1.35fr)\x20minmax(320px,.95fr);gap:16px;align-items:start;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:14px;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);display:flex;flex-direction:column;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Binding</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px\x2014px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Environment</div><div\x20style=\x22margin-top:3px;color:var(--okdb-app-fg-strong);\x22>{{\x20envName\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Job\x20type</div><div\x20style=\x22margin-top:3px;color:var(--okdb-accent);font-weight:600;\x22>{{\x20jobType\x20}}</div></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\x20style=\x22font-size:11px;opacity:.5;line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20This\x20worker\x20will\x20consume\x20only\x20<code>{{\x20jobType\x20}}</code>\x20jobs.\x20The\x20job\x20type\x20is\x20fixed\x20by\x20the\x20queue\x20sidebar\x20selection.\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\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);display:flex;flex-direction:column;gap:12px;\x22>\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;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Handler</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22pickNewFn()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22fnMode===\x27new\x27\x20?\x20\x27font-size:11px;padding:2px\x2010px;border-color:var(--okdb-accent);color:var(--okdb-accent);background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x27\x20:\x20\x27font-size:11px;padding:2px\x2010px;opacity:.55;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Write\x20new\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22pickExistingFn()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22fnMode===\x27existing\x27\x20?\x20\x27font-size:11px;padding:2px\x2010px;border-color:var(--okdb-accent);color:var(--okdb-accent);background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x27\x20:\x20\x27font-size:11px;padding:2px\x2010px;opacity:.55;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Pick\x20existing\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnMode\x20===\x20\x27new\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:120px\x201fr;gap:10px;align-items:center;font-size:13px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x22>Function\x20name</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20:value=\x22fnName\x22\x20@input=\x22fnName\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22e.g.\x20handleOrderJob\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;padding:6px\x208px;color:inherit;font-size:13px;width:100%;box-sizing:border-box;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:6px;min-width:0;min-height:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Implementation</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;min-height:420px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;overflow:hidden;background:#10171e;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px\x2012px;border-bottom:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Worker\x20handler</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;font-family:monospace;\x22>async\x20(ctx)\x20=&gt;\x20{\x20}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;min-height:0;background:#0d1318;display:flex;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-js-input\x20:value=\x22fnSource\x22\x20@edit=\x22updateSource($event.detail)\x22\x20style=\x22display:block;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnValidation.ok\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:#86efac;font-size:11px;\x22>✓\x20Valid\x20function\x20source</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!fnValidation.ok\x20&&\x20fnSource.trim()\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:11px;\x22>{{\x20fnValidation.message\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnMode\x20===\x20\x27existing\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:120px\x201fr;gap:10px;align-items:center;font-size:13px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x22>Function</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20:value=\x22existingFn\x22\x20@change=\x22existingFn\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;padding:6px\x208px;color:inherit;font-size:13px;width:100%;box-sizing:border-box;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20select\x20function\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22functions\x22\x20let:item=\x22fn\x22><option\x20:value=\x22fn\x22>{{\x20fn\x20}}</option></each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;opacity:.5;line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Pick\x20an\x20existing\x20function\x20already\x20stored\x20in\x20this\x20environment.\x20Inline\x20test\x20preview\x20is\x20available\x20when\x20writing\x20a\x20new\x20function\x20in\x20this\x20panel.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:14px;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);display:flex;flex-direction:column;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Runtime</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:1fr\x201fr;gap:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Concurrency</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20min=\x221\x22\x20max=\x2264\x22\x20:value=\x22concurrency\x22\x20@input=\x22concurrency\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22margin-top:4px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;padding:6px\x208px;color:inherit;font-size:13px;width:100%;box-sizing:border-box;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Poll\x20interval</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20min=\x2210\x22\x20max=\x2210000\x22\x20:value=\x22pollInterval\x22\x20@input=\x22pollInterval\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22margin-top:4px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;padding:6px\x208px;color:inherit;font-size:13px;width:100%;box-sizing:border-box;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;margin-top:4px;\x22>milliseconds</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);display:flex;flex-direction:column;gap:12px;\x22>\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;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Testing</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnMode\x20!==\x20\x27new\x27\x22><span\x20style=\x22font-size:10px;color:var(--okdb-warning);opacity:.8;\x22>inline\x20preview\x20works\x20for\x20new\x20functions</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Sample\x20job\x20payload</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:6px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;overflow:hidden;background:var(--okdb-app-bg-deep);min-height:220px;display:flex;flex-direction:column;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-json-input\x20mode=\x22textbox\x22\x20:value=\x22samplePayload\x22\x20@edit=\x22samplePayload\x20=\x20$event.detail\x22\x20style=\x22height:100%;display:flex;min-height:220px;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnMode\x20===\x20\x27new\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\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\x20\x20\x20\x20\x20\x20<button\x20@click=\x22preview()\x22\x20:disabled=\x22!fnValidation.ok\x20||\x20previewRunning\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;padding:5px\x2014px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x209%,\x20transparent);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);color:var(--okdb-accent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20previewRunning\x20?\x20\x27Running…\x27\x20:\x20\x27▷\x20Test\x20with\x20sample\x20job\x27\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\x20\x20<span\x20style=\x22font-size:11px;opacity:.45;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Runs\x20the\x20draft\x20against\x20the\x20sample\x20payload\x20above.\x20Side-effects\x20still\x20write\x20to\x20live\x20data.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22previewError\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:11px;padding:8px\x2010px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:6px;\x22>{{\x20previewError\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22previewResult\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:8px;padding:10px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;background:#0f1418;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:style=\x22\x27font-size:12px;font-weight:600;color:\x27+previewStatusColor(previewResult)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20previewOk\x20?\x20\x27✓\x20Function\x20executed\x20successfully\x27\x20:\x20\x27✕\x20Function\x20returned\x20an\x20error\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:10px;flex-wrap:wrap;font-size:11px;opacity:.55;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>status:\x20{{\x20previewResult.status\x20||\x20\x27ok\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22previewDuration\x20!=\x20null\x22><span>{{\x20previewDuration\x20}}ms</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20:style=\x22\x27margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);font-size:11px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:\x27\x20+\x20(previewOk\x20?\x20\x27var(--okdb-app-fg)\x27\x20:\x20\x27#fca5a5\x27)\x22>{{\x20formatJson(previewOk\x20?\x20(previewResult.result?.value\x20??\x20previewResult)\x20:\x20(previewResult.error\x20??\x20previewResult.result?.value\x20??\x20previewResult))\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22previewLogs.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<details>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<summary\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;cursor:pointer;user-select:none;\x22>Logs\x20({{\x20previewLogs.length\x20}})</summary>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:6px;display:flex;flex-direction:column;gap:4px;max-height:140px;overflow:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22previewLogs\x22\x20let:item=\x22entry\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;padding:6px\x208px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;background:var(--okdb-app-bg-deep);display:flex;gap:8px;align-items:flex-start;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:10px;text-transform:uppercase;opacity:.5;min-width:40px;\x22>{{\x20entry.level\x20||\x20\x27log\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22flex:1;\x22>{{\x20entry.msg\x20||\x20entry.message\x20||\x20formatJson(entry)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</details>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22createError\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:12px;padding:6px\x2010px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:6px;\x22>{{\x20createError\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;justify-content:flex-end;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22cancelCreate()\x22\x20style=\x22font-size:12px;padding:5px\x2014px;opacity:.6;\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22create()\x22\x20:disabled=\x22!canCreate\x20||\x20creating\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;padding:5px\x2018px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2013%,\x20transparent);border-color:var(--okdb-accent);color:var(--okdb-accent);font-weight:600;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20creating\x20?\x20\x27Creating…\x27\x20:\x20\x27Create\x20Worker\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a</div>','var(--okdb-app-fg-muted)','application/json','stats','Failed\x20to\x20create\x20function','Worker\x20restarted','var(--okdb-success)','existingFn','createSuccess','Worker\x20paused','Queue\x20worker\x20for\x20','job','5GaiVqA','engine:started','\x20failed','__preview__','handlerName','jobType','json','#818cf8','pollInterval','data','normal','shared','default','message','existing','fnValidation','previewResult','replace','5927230ENOrCo','state','paused','creating','350849Hzdfzc','new','busy','fnName','process','function','selectedEnv','showCreate','$watch','result','\x22\x20created','3769339NxwGQr','config','error','jobtype','5193VRByhi','filter','isArray','concurrency','Source\x20required','Worker\x20resumed','previewError','toast','open','fnMode','Failed\x20(','resume','engine:stopped','/functions','POST','trim'];_0x47e3=function(){return _0x18f1ea;};return _0x47e3();}import _0x1d191c from'../../../components/ok-js-input.ok.js';import _0x23f689 from'../../../components/ok-json-input.ok.js';import _0x357550 from'../../engines/modals/engine-modal.ok.js';import _0x20bd87 from'../../engines/parts/engine-row-item.ok.js';import{openFunctionRoute as _0x1301dc}from'../../engines/engine-ui-utils.js';function _0x52ef(_0x168852,_0x4a385a){_0x168852=_0x168852-0x1bf;const _0x47e31c=_0x47e3();let _0x52ef67=_0x47e31c[_0x168852];return _0x52ef67;}const s=_0x5b4081(0x1c0),p=[/(^|[^\w$.])require\s*\(/,/(^|[^\w$.])import\b/,/(^|[^\w$.])console\b/,/(^|[^\w$.])process\b/];function d(_0x4466d2){const _0x4b6f83=_0x5b4081,_0x19aa72=(_0x4466d2||'')[_0x4b6f83(0x203)](/\r\n/g,'\x0a')[_0x4b6f83(0x226)]();if(!_0x19aa72)return{'ok':!0x1,'message':_0x4b6f83(0x21b)};if(!/^(async\s+)?\(\s*[A-Za-z_$][\w$]*\s*\)\s*=>/['test'](_0x19aa72))return{'ok':!0x1,'message':_0x4b6f83(0x228)};for(const _0x3bc6b6 of p)if(_0x3bc6b6['test'](_0x19aa72))return{'ok':!0x1,'message':'Forbidden\x20pattern'};try{new Function(_0x4b6f83(0x1cd)+_0x19aa72+');')();}catch(_0x314f56){return{'ok':!0x1,'message':_0x314f56[_0x4b6f83(0x1ff)]};}return{'ok':!0x0,'normalized':_0x19aa72};}function l(_0x1b6854='job'){const _0xe110a7=_0x5b4081;return{'id':_0x1b6854+_0xe110a7(0x1e3),'type':_0x1b6854,'action':_0xe110a7(0x20c),'priority':_0xe110a7(0x1fc),'sample':!0x0,'data':{'note':'Example\x20queue\x20payload'}};}function c(_0xf74275){const _0x204673=_0x5b4081;try{return JSON[_0x204673(0x1d2)](_0xf74275,null,0x2);}catch{return String(_0xf74275??'');}}export default{'tag':'queue-workers','dependencies':[_0x1d191c,_0x23f689,_0x357550,_0x20bd87],'attr':{'jobtype':{}},'context':_0x4716e7=>({'workers':[],'busy':!0x1,'error':null,'_unsubs':[],'showCreate':!0x1,'creating':!0x1,'createError':null,'createSuccess':null,'fnName':'','fnSource':s,'fnValidation':d(s),'fnMode':'new','existingFn':'','functions':[],'concurrency':0x1,'pollInterval':0x64,'advanced':!0x1,'samplePayload':l(_0x5b4081(0x1f1)),'previewRunning':!0x1,'previewResult':null,'previewError':null,get 'jobType'(){return _0x4716e7['$attr']['jobtype']||'';},get 'envName'(){const _0x536aaa=_0x5b4081;return _0xb8fb87[_0x536aaa(0x20e)]||_0x536aaa(0x1fe);},get 'apiBase'(){return _0xb8fb87['apiBase'];},get 'handlerName'(){const _0x56d9d4=_0x5b4081;return _0x56d9d4(0x200)===this[_0x56d9d4(0x220)]?this[_0x56d9d4(0x1ed)]:this['fnName'][_0x56d9d4(0x226)]();},get 'hasBoundJobType'(){const _0x5e5c33=_0x5b4081;return!!this[_0x5e5c33(0x1f7)];},get 'canCreate'(){const _0x4c7636=_0x5b4081;return!(!this[_0x4c7636(0x1f7)]||!this[_0x4c7636(0x1f6)]||'new'===this[_0x4c7636(0x220)]&&!this[_0x4c7636(0x201)]['ok']);},get 'previewOk'(){const _0xfa8ffe=_0x5b4081;return!!this[_0xfa8ffe(0x202)]&&_0xfa8ffe(0x215)!==this[_0xfa8ffe(0x202)][_0xfa8ffe(0x1cc)]&&!this[_0xfa8ffe(0x202)][_0xfa8ffe(0x215)];},get 'previewLogs'(){const _0x39be72=_0x5b4081;return Array[_0x39be72(0x219)](this['previewResult']?.['logs'])?this[_0x39be72(0x202)][_0x39be72(0x1c9)]:[];},get 'previewDuration'(){const _0x157c15=_0x5b4081;return this[_0x157c15(0x202)]?.[_0x157c15(0x1e0)]?.[_0x157c15(0x1c4)]??null;},get 'totalProcessed'(){const _0x11efb2=_0x5b4081;return(this[_0x11efb2(0x22b)]??[])[_0x11efb2(0x1db)]((_0x517ffc,_0x2ed4df)=>_0x517ffc+Number(_0x2ed4df?.[_0x11efb2(0x1e9)]?.[_0x11efb2(0x1d3)]??0x0),0x0);},get 'totalFailed'(){const _0x29edc2=_0x5b4081;return(this[_0x29edc2(0x22b)]??[])[_0x29edc2(0x1db)]((_0x83ea61,_0x57ce5f)=>_0x83ea61+Number(_0x57ce5f?.[_0x29edc2(0x1e9)]?.['failed']??0x0),0x0);},async 'load'(){const _0x3f8068=_0x5b4081;if(!this[_0x3f8068(0x1f7)])return this[_0x3f8068(0x22b)]=[],this['error']=null,void(this['busy']=!0x1);this[_0x3f8068(0x20a)]=!0x0,this['error']=null;try{const _0x403145=await fetch(this[_0x3f8068(0x22c)]+_0x3f8068(0x1df)),_0x37371d=await _0x403145[_0x3f8068(0x1f8)](),_0x5c87bc=_0x37371d?.['result']??_0x37371d?.['data']??[];this['workers']=_0x5c87bc[_0x3f8068(0x218)](_0x3ba5ba=>_0x3ba5ba[_0x3f8068(0x214)]?.['job_type']===this[_0x3f8068(0x1f7)]);}catch(_0x2bca06){this['error']=_0x2bca06?.[_0x3f8068(0x1ff)]||String(_0x2bca06);}finally{this[_0x3f8068(0x20a)]=!0x1;}},async 'loadFunctions'(){const _0x5a9737=_0x5b4081;try{const _0x296d3d=await fetch(this[_0x5a9737(0x22c)]+'/functions'),_0x3deb23=await _0x296d3d[_0x5a9737(0x1f8)]();this[_0x5a9737(0x22d)]=(_0x3deb23?.[_0x5a9737(0x211)]??_0x3deb23?.[_0x5a9737(0x1fb)]??[])['map'](_0x22ceea=>_0x22ceea['name']??_0x22ceea['key']??_0x22ceea)[_0x5a9737(0x218)](Boolean)[_0x5a9737(0x1c8)]();}catch{this[_0x5a9737(0x22d)]=[];}},'openCreate'(){const _0x4f4ba6=_0x5b4081;this[_0x4f4ba6(0x1f7)]&&(this[_0x4f4ba6(0x20f)]=!0x0,this['createError']=null,this[_0x4f4ba6(0x1ee)]=null,this[_0x4f4ba6(0x20b)]='',this[_0x4f4ba6(0x1e2)]=s,this[_0x4f4ba6(0x201)]=d(s),this[_0x4f4ba6(0x220)]='new',this[_0x4f4ba6(0x1ed)]='',this['previewResult']=null,this['previewError']=null,this['concurrency']=0x1,this[_0x4f4ba6(0x1fa)]=0x64,this[_0x4f4ba6(0x1ca)]=l(this[_0x4f4ba6(0x1f7)]),this[_0x4f4ba6(0x1d0)]());},'cancelCreate'(){const _0x500fc1=_0x5b4081;this[_0x500fc1(0x20f)]=!0x1,this[_0x500fc1(0x1dc)]=null;},'pickExistingFn'(){const _0x3a9fc7=_0x5b4081;this[_0x3a9fc7(0x220)]=_0x3a9fc7(0x200),this[_0x3a9fc7(0x1d0)]();},'pickNewFn'(){const _0x4fdcec=_0x5b4081;this['fnMode']=_0x4fdcec(0x209),this[_0x4fdcec(0x1e2)]?.['trim']()||(this[_0x4fdcec(0x1e2)]=s,this['fnValidation']=d(this[_0x4fdcec(0x1e2)]));},'updateSource'(_0x1d4614){const _0x246571=_0x5b4081;this['fnSource']=_0x1d4614??'',this['fnValidation']=d(this[_0x246571(0x1e2)]);},async 'preview'(){const _0x4dc309=_0x5b4081;if(this[_0x4dc309(0x201)]['ok']&&!this[_0x4dc309(0x1d8)]){this['previewRunning']=!0x0,this[_0x4dc309(0x202)]=null,this[_0x4dc309(0x21d)]=null;try{const _0x549108=await fetch(this[_0x4dc309(0x22c)]+_0x4dc309(0x227),{'method':'POST','headers':{'Content-Type':_0x4dc309(0x1e8)},'body':JSON[_0x4dc309(0x1d2)]({'source':this['fnValidation']['normalized'],'payload':this[_0x4dc309(0x1ca)],'jobContext':{'id':_0x4dc309(0x1f5),'type':this[_0x4dc309(0x1f7)],'tries':0x1,'created':Date[_0x4dc309(0x1c5)](),'tags':null,'priority':0x0}})}),_0x21a776=await _0x549108[_0x4dc309(0x1f8)]();this['previewResult']=_0x21a776?.[_0x4dc309(0x211)]??_0x21a776?.[_0x4dc309(0x1fb)]??null;}catch(_0x3993f0){this[_0x4dc309(0x21d)]=_0x3993f0?.[_0x4dc309(0x1ff)]||String(_0x3993f0);}finally{this[_0x4dc309(0x1d8)]=!0x1;}}},async 'create'(){const _0x174339=_0x5b4081;if(this[_0x174339(0x1ce)]&&!this[_0x174339(0x207)]){this[_0x174339(0x207)]=!0x0,this[_0x174339(0x1dc)]=null;try{if('new'===this[_0x174339(0x220)]){const _0x8de1fe=await fetch(this['apiBase']+_0x174339(0x224),{'method':'POST','headers':{'Content-Type':_0x174339(0x1e8)},'body':JSON['stringify']({'name':this['fnName'][_0x174339(0x226)](),'source':this[_0x174339(0x201)]['normalized'],'enabled':!0x0,'metadata':{'description':_0x174339(0x1f0)+this[_0x174339(0x1f7)]}})}),_0x380323=await _0x8de1fe[_0x174339(0x1f8)]();if(!_0x8de1fe['ok'])throw new Error(_0x380323?.[_0x174339(0x215)]?.['message']||_0x174339(0x1ea));}const _0x4093eb=this[_0x174339(0x1f7)]+'-'+this[_0x174339(0x1f6)],_0x3376cf=await fetch(this[_0x174339(0x22c)]+'/engines',{'method':_0x174339(0x225),'headers':{'Content-Type':_0x174339(0x1e8)},'body':JSON[_0x174339(0x1d2)]({'type':'queue-worker','name':_0x4093eb,'config':{'job_type':this[_0x174339(0x1f7)],'handler':{'kind':_0x174339(0x20d),'name':this[_0x174339(0x1f6)]},'concurrency':Number(this[_0x174339(0x21a)])||0x1,'pollInterval':Number(this[_0x174339(0x1fa)])||0x64}})}),_0x35f87b=await _0x3376cf['json']();if(!_0x3376cf['ok'])throw new Error(_0x35f87b?.[_0x174339(0x215)]?.[_0x174339(0x1ff)]||_0x174339(0x221)+_0x3376cf[_0x174339(0x1cc)]+')');this[_0x174339(0x1ee)]=_0x174339(0x1e1)+_0x4093eb+_0x174339(0x212),this['showCreate']=!0x1,await this[_0x174339(0x1dd)]();}catch(_0x3b6b42){this[_0x174339(0x1dc)]=_0x3b6b42?.[_0x174339(0x1ff)]||String(_0x3b6b42);}finally{this[_0x174339(0x207)]=!0x1;}}},async 'doAction'(_0x290de6,_0x43fa9b){const _0x8261c8=_0x5b4081;try{const _0x2e1f01=await fetch(this[_0x8261c8(0x22c)]+_0x8261c8(0x1e5)+encodeURIComponent(_0x290de6['type'])+'/'+encodeURIComponent(_0x290de6['name'])+'/'+_0x43fa9b,{'method':_0x8261c8(0x225)}),_0x3f4cd9=await _0x2e1f01['json']()[_0x8261c8(0x1bf)](()=>({}));if(!_0x2e1f01['ok'])throw new Error(_0x3f4cd9?.[_0x8261c8(0x215)]?.[_0x8261c8(0x1ff)]||_0x43fa9b+'\x20failed');const _0x107789='pause'===_0x43fa9b?_0x8261c8(0x1ef):_0x8261c8(0x222)===_0x43fa9b?_0x8261c8(0x21c):_0x8261c8(0x1d7)===_0x43fa9b?_0x8261c8(0x1eb):_0x8261c8(0x1c7)+_0x43fa9b+'d';_0x4716e7[_0x8261c8(0x1d6)]['shared']?.[_0x8261c8(0x21e)]?.['info']?.(_0x107789),await this[_0x8261c8(0x1dd)]();}catch(_0xc42839){_0x4716e7[_0x8261c8(0x1d6)][_0x8261c8(0x1fd)]?.[_0x8261c8(0x21e)]?.[_0x8261c8(0x215)]?.(_0xc42839?.['message']||_0x43fa9b+_0x8261c8(0x1f4));}},async 'doDelete'(_0x5c66b8){const _0x4e350d=_0x5b4081;if(confirm('Delete\x20worker\x20\x22'+_0x5c66b8[_0x4e350d(0x1d9)]+'\x22?'))try{await fetch(this[_0x4e350d(0x22c)]+_0x4e350d(0x1e5)+encodeURIComponent(_0x5c66b8['type'])+'/'+encodeURIComponent(_0x5c66b8[_0x4e350d(0x1d9)]),{'method':_0x4e350d(0x1c2)}),await this['load']();}catch{}},async 'openWorkerModal'(_0x5f5165){const _0x34a83a=_0x5b4081;if(!_0x5f5165)return;const _0x5155f2=this;await _0x4716e7[_0x34a83a(0x1d6)]['shared'][_0x34a83a(0x1e4)][_0x34a83a(0x21f)]({'owner':_0x4716e7,'title':'Edit\x20Worker\x20·\x20'+_0x5f5165[_0x34a83a(0x1d9)],'canDrag':!0x0,'content':'<engine-modal\x20:modal=\x22modal\x22\x20:engine=\x22engine\x22\x20:env=\x22envName\x22\x20:on-done=\x22onDone\x22\x20/>','context':_0x4f93bd=>({'modal':_0x4f93bd,'engine':_0x5f5165,'envName':_0x5155f2[_0x34a83a(0x1de)],'onDone':async()=>{const _0x102a23=_0x34a83a;await _0x5155f2[_0x102a23(0x1dd)]();}})});},'openWorkerFunction'(_0x55c39f,_0x17e648){const _0x23402a=_0x5b4081;_0x17e648?.['stopPropagation']?.();const _0x5736b6=_0x55c39f?.[_0x23402a(0x214)]?.[_0x23402a(0x1c1)]?.[_0x23402a(0x1d9)];_0x5736b6&&_0x1301dc(_0x4716e7,_0x5736b6);},'stateColor'(_0x43b356){const _0x1c65cb=_0x5b4081,_0x33ffc0=_0x43b356?.['stats']?.[_0x1c65cb(0x205)]??_0x43b356?.[_0x1c65cb(0x1cc)];return'online'===_0x33ffc0?'var(--okdb-success)':_0x1c65cb(0x215)===_0x33ffc0?_0x1c65cb(0x1cb):_0x1c65cb(0x206)===_0x33ffc0?_0x1c65cb(0x1f9):_0x1c65cb(0x1d1)===_0x33ffc0?_0x1c65cb(0x1c6):_0x1c65cb(0x1e7);},'stateLabel':_0x5bed96=>_0x5bed96?.['stats']?.['state']??_0x5bed96?.['status']??'—','previewStatusColor':_0x2afea9=>_0x2afea9?_0x5b4081(0x215)===_0x2afea9[_0x5b4081(0x1cc)]||_0x2afea9[_0x5b4081(0x215)]?_0x5b4081(0x1cb):_0x5b4081(0x1ec):'var(--okdb-app-fg-muted)','formatJson':c}),async 'mount'(_0x3b3e9d){const _0x3488e2=_0x5b4081;await this[_0x3488e2(0x1dd)]();const _0x364221=()=>this[_0x3488e2(0x1dd)]();this[_0x3488e2(0x1d5)]=[_0x5268d5['on'](_0x3488e2(0x1f3),_0x364221),_0x5268d5['on'](_0x3488e2(0x223),_0x364221),_0x5268d5['on']('engine:error',_0x364221)],_0x3b3e9d[_0x3488e2(0x210)](()=>_0x3b3e9d[_0x3488e2(0x229)][_0x3488e2(0x216)],()=>{const _0xd57362=_0x3488e2;this['showCreate']=!0x1,this[_0xd57362(0x202)]=null,this[_0xd57362(0x21d)]=null,this[_0xd57362(0x1ca)]=l(_0x3b3e9d[_0xd57362(0x229)][_0xd57362(0x216)]||_0xd57362(0x1f1)),this['load']();}),_0x3b3e9d[_0x3488e2(0x210)](()=>_0xb8fb87[_0x3488e2(0x20e)],()=>{const _0x4beaa2=_0x3488e2;this[_0x4beaa2(0x20f)]=!0x1,this[_0x4beaa2(0x1dd)]();});},'unmount'(){const _0x595ba4=_0x5b4081;for(const _0x44fb4 of this['_unsubs'])_0x44fb4();this[_0x595ba4(0x1d5)]=[];},'template':_0x5b4081(0x1e6)};
1
+ const _0x415b05=_0x262d;(function(_0x4f9b16,_0x2a8e7a){const _0x12308=_0x262d,_0x4e2bf3=_0x4f9b16();while(!![]){try{const _0x3b7695=parseInt(_0x12308(0x13c))/0x1+-parseInt(_0x12308(0x177))/0x2*(parseInt(_0x12308(0x141))/0x3)+parseInt(_0x12308(0x166))/0x4*(parseInt(_0x12308(0x149))/0x5)+parseInt(_0x12308(0x13a))/0x6+parseInt(_0x12308(0x15b))/0x7+-parseInt(_0x12308(0x16d))/0x8+-parseInt(_0x12308(0x124))/0x9*(parseInt(_0x12308(0x114))/0xa);if(_0x3b7695===_0x2a8e7a)break;else _0x4e2bf3['push'](_0x4e2bf3['shift']());}catch(_0x7b8ee6){_0x4e2bf3['push'](_0x4e2bf3['shift']());}}}(_0x53db,0xf0b90));import _0x1e1c24 from'../../../stores/events-store.js';function _0x53db(){const _0x212b6a=['key','fnMode','var(--okdb-success)','json','var(--okdb-danger)','failed','DELETE','name','creating','10142070TiIeAD','canCreate','1208669rjopJn','durationMs','Worker\x20restarted','fnSource','\x22\x20created','702063FzfJTl','load','\x20failed','isArray','existing','async\x20(ctx)\x20=>\x20{\x0a\x20\x20//\x20ctx.payload\x20—\x20the\x20raw\x20job\x20payload\x20(whatever\x20was\x20enqueued)\x0a\x20\x20//\x20ctx.job\x20\x20\x20\x20\x20—\x20queue\x20job\x20context\x0a\x20\x20//\x20\x20\x20ctx.job.id,\x20ctx.job.type,\x20ctx.job.tries,\x20ctx.job.tags,\x20...\x0a\x20\x20//\x20\x20\x20ctx.job.heartbeat()\x20\x20\x20\x20\x20\x20\x20\x20—\x20keep\x20the\x20job\x20alive\x0a\x20\x20//\x20\x20\x20ctx.job.markProgress(msg)\x20\x20—\x20report\x20progress\x0a\x20\x20//\x20ctx.env\x20\x20\x20\x20\x20—\x20env\x20facade:\x20put,\x20get,\x20query,\x20txn,\x20...\x0a\x20\x20//\x20ctx.log\x20\x20\x20\x20\x20—\x20structured\x20logger:\x20ctx.log.info(msg,\x20data)\x0a\x0a\x20\x20return\x20{\x20ok:\x20true\x20};\x0a}','envName','engine:stopped','119550VNlacQ','trim','/engines?type=queue-worker','state','info','queue-workers','shared','/functions','jobType','Source\x20required','now','Worker\x20resumed','resume','reduce','online','status','/engines','normalized','12984356AGwHRC','$watch','pause','/engines/','filter','return\x20(','/functions/preview','Failed\x20(','open','handlerName','$ok','148yzhhpA','logs','$attr','\x0a<div\x20style=\x22display:flex;flex-direction:column;gap:14px;flex:1;overflow:auto;padding-right:4px;\x22>\x0a\x0a\x20\x20<!--\x20Header\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-weight:600;font-size:15px;\x22>\x0a\x20\x20\x20\x20\x20\x20Queue\x20Workers\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<if\x20:=\x22jobType\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;padding:2px\x208px;border-radius:999px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x209%,\x20transparent);border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);color:var(--okdb-accent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20bound\x20to\x20{{\x20jobType\x20}}\x0a\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<if\x20:=\x22workers.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;padding:2px\x208px;border-radius:999px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x209%,\x20transparent);border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);color:var(--okdb-accent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20workers.length\x20}}\x20worker{{\x20workers.length\x20!==\x201\x20?\x20\x27s\x27\x20:\x20\x27\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20<div\x20style=\x22flex:1;\x22></div>\x0a\x20\x20\x20\x20<button\x20@click=\x22load()\x22\x20:disabled=\x22busy\x22\x20style=\x22font-size:11px;padding:3px\x208px;opacity:.6;\x22>↻</button>\x0a\x20\x20\x20\x20<if\x20:=\x22!showCreate\x20&&\x20hasBoundJobType\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openCreate()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;padding:5px\x2014px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2013%,\x20transparent);border-color:var(--okdb-accent);color:var(--okdb-accent);font-weight:600;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20+\x20Add\x20Worker\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a\x20\x20<if\x20:=\x22jobType\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;padding:12px\x2014px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:4px;min-width:220px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Scope</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:14px;font-weight:600;\x22>{{\x20jobType\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.55;line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Workers\x20here\x20are\x20explicitly\x20tied\x20to\x20this\x20queue\x20job\x20type.\x20They\x20are\x20not\x20general-purpose\x20consumers.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:18px;flex-wrap:wrap;font-size:11px;opacity:.65;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>workers:\x20<b\x20style=\x22color:var(--okdb-app-fg-strong);opacity:1;\x22>{{\x20workers.length\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>processed:\x20<b\x20style=\x22color:var(--okdb-success);opacity:1;\x22>{{\x20totalProcessed\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22totalFailed\x20>\x200\x22><span>failed:\x20<b\x20style=\x22color:var(--okdb-danger);opacity:1;\x22>{{\x20totalFailed\x20}}</b></span></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:=\x22createSuccess\x20&&\x20!showCreate\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-success);font-size:12px;padding:6px\x2010px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x2020%,\x20transparent);border-radius:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20✓\x20{{\x20createSuccess\x20}}\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:12px;padding:6px\x2010px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:6px;\x22>{{\x20error\x20}}</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<if\x20:=\x22!hasBoundJobType\x20&&\x20!showCreate\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22padding:32px\x2024px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;display:flex;flex-direction:column;gap:12px;align-items:center;text-align:center;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:34px;opacity:.18;\x22>⇶</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:14px;font-weight:600;opacity:.72;\x22>Select\x20a\x20queue\x20job\x20type</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.48;line-height:1.8;max-width:430px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Queue\x20workers\x20are\x20managed\x20per\x20job\x20type.\x20Pick\x20a\x20type\x20from\x20the\x20sidebar\x20to\x20view\x20its\x20workers,\x0a\x20\x20\x20\x20\x20\x20\x20\x20create\x20a\x20new\x20one,\x20and\x20test\x20it\x20against\x20sample\x20job\x20payloads.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Worker\x20list\x20-->\x0a\x20\x20<if\x20:=\x22!showCreate\x22>\x0a\x20\x20\x20\x20<if\x20:=\x22hasBoundJobType\x20&&\x20!busy\x20&&\x20workers.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:28px\x2020px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;text-align:center;display:flex;flex-direction:column;gap:10px;align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:32px;opacity:.2;\x22>⚙</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:14px;font-weight:600;opacity:.7;\x22>No\x20workers\x20yet\x20for\x20\x22{{\x20jobType\x20}}\x22</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;opacity:.45;max-width:420px;line-height:1.7;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Create\x20a\x20worker\x20bound\x20to\x20this\x20queue\x20job\x20type.\x20The\x20worker\x20will\x20consume\x20only\x20<code>{{\x20jobType\x20}}</code>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20jobs\x20and\x20run\x20a\x20specific\x20function\x20handler.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openCreate()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22margin-top:4px;font-size:12px;padding:6px\x2018px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2013%,\x20transparent);border-color:var(--okdb-accent);color:var(--okdb-accent);font-weight:600;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20+\x20Add\x20Worker\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<each\x20:of=\x22workers\x22\x20let:item=\x22w\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22background:var(--okdb-app-surface);border:1px\x20solid\x20var(--okdb-app-border);border-radius:12px;padding:14px\x2016px;display:flex;flex-direction:column;gap:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;gap:8px;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<engine-row-item\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:engine=\x22w\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20label=\x22Worker\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20label-color=\x22var(--okdb-accent)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:subtitle=\x22stateLabel(w)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@select=\x22openWorkerModal($event.detail)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22doAction(w,\x27pause\x27)\x22\x20\x20\x20title=\x22Pause\x22\x20\x20\x20style=\x22font-size:11px;padding:2px\x207px;color:var(--okdb-warning);border-color:color-mix(in\x20srgb,\x20var(--okdb-warning)\x2033%,\x20transparent);\x22>⏸</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22doAction(w,\x27resume\x27)\x22\x20\x20title=\x22Resume\x22\x20\x20style=\x22font-size:11px;padding:2px\x207px;color:var(--okdb-success);border-color:color-mix(in\x20srgb,\x20var(--okdb-success)\x2033%,\x20transparent);\x22>▶</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22doAction(w,\x27restart\x27)\x22\x20title=\x22Restart\x22\x20style=\x22font-size:11px;padding:2px\x207px;opacity:.6;\x22>↺</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22doDelete(w)\x22\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20title=\x22Delete\x22\x20\x20style=\x22font-size:11px;padding:2px\x207px;color:var(--okdb-danger);border-color:color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x22>🗑</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px\x2014px;font-size:11px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Job\x20type</div><div\x20style=\x22margin-top:3px;color:var(--okdb-app-fg-strong);\x22>{{\x20w.config?.job_type\x20||\x20\x27—\x27\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Handler</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:3px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22w.config?.handler?.name\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openWorkerFunction(w,\x20$event)\x22\x20title=\x22Open\x20this\x20handler\x20in\x20the\x20Functions\x20section.\x22\x20style=\x22background:none;border:none;padding:0;color:var(--okdb-accent);font-size:11px;text-decoration:underline;text-underline-offset:2px;cursor:pointer;\x22>ƒ\x20{{\x20w.config?.handler?.name\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!w.config?.handler?.name\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--okdb-app-fg-strong);\x22>—</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\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Concurrency</div><div\x20style=\x22margin-top:3px;color:var(--okdb-app-fg-strong);\x22>{{\x20w.config?.concurrency\x20??\x201\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Poll\x20interval</div><div\x20style=\x22margin-top:3px;color:var(--okdb-app-fg-strong);\x22>{{\x20w.config?.pollInterval\x20??\x20100\x20}}\x20ms</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22w.stats\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Processed</div><div\x20style=\x22margin-top:3px;color:var(--okdb-success);\x22>{{\x20w.stats.processed\x20??\x200\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22opacity:.4;text-transform:uppercase;letter-spacing:.05em;font-size:10px;\x22>Failed</div><div\x20:style=\x22\x27margin-top:3px;color:\x27\x20+\x20((w.stats.failed\x20??\x200)\x20>\x200\x20?\x20\x27var(--okdb-danger)\x27\x20:\x20\x27var(--okdb-app-fg-strong)\x27)\x22>{{\x20w.stats.failed\x20??\x200\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22w.stats?.error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:11px;padding:4px\x208px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:4px;font-family:monospace;\x22>{{\x20w.stats.error\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</each>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Create\x20panel\x20-->\x0a\x20\x20<if\x20:=\x22showCreate\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22background:var(--okdb-app-surface);border:1px\x20solid\x20var(--okdb-app-border);border-radius:12px;padding:18px;display:flex;flex-direction:column;gap:16px;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-weight:600;font-size:14px;display:flex;align-items:center;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span>New\x20Queue\x20Worker</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;color:var(--okdb-accent);opacity:.8;\x22>bound\x20to\x20{{\x20jobType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22cancelCreate()\x22\x20style=\x22font-size:11px;padding:2px\x208px;opacity:.6;\x22>✕\x20Cancel</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:minmax(0,1.35fr)\x20minmax(320px,.95fr);gap:16px;align-items:start;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:14px;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);display:flex;flex-direction:column;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Binding</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px\x2014px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Environment</div><div\x20style=\x22margin-top:3px;color:var(--okdb-app-fg-strong);\x22>{{\x20envName\x20}}</div></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div><div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Job\x20type</div><div\x20style=\x22margin-top:3px;color:var(--okdb-accent);font-weight:600;\x22>{{\x20jobType\x20}}</div></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\x20style=\x22font-size:11px;opacity:.5;line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20This\x20worker\x20will\x20consume\x20only\x20<code>{{\x20jobType\x20}}</code>\x20jobs.\x20The\x20job\x20type\x20is\x20fixed\x20by\x20the\x20queue\x20sidebar\x20selection.\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\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);display:flex;flex-direction:column;gap:12px;\x22>\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;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Handler</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22pickNewFn()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22fnMode===\x27new\x27\x20?\x20\x27font-size:11px;padding:2px\x2010px;border-color:var(--okdb-accent);color:var(--okdb-accent);background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x27\x20:\x20\x27font-size:11px;padding:2px\x2010px;opacity:.55;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Write\x20new\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22pickExistingFn()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22fnMode===\x27existing\x27\x20?\x20\x27font-size:11px;padding:2px\x2010px;border-color:var(--okdb-accent);color:var(--okdb-accent);background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x27\x20:\x20\x27font-size:11px;padding:2px\x2010px;opacity:.55;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Pick\x20existing\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnMode\x20===\x20\x27new\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:120px\x201fr;gap:10px;align-items:center;font-size:13px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x22>Function\x20name</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20:value=\x22fnName\x22\x20@input=\x22fnName\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22e.g.\x20handleOrderJob\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;padding:6px\x208px;color:inherit;font-size:13px;width:100%;box-sizing:border-box;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:6px;min-width:0;min-height:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Implementation</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;min-height:420px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;overflow:hidden;background:#10171e;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px\x2012px;border-bottom:1px\x20solid\x20var(--okdb-app-border);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Worker\x20handler</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;font-family:monospace;\x22>async\x20(ctx)\x20=&gt;\x20{\x20}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22flex:1;min-height:0;background:#0d1318;display:flex;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-js-input\x20:value=\x22fnSource\x22\x20@edit=\x22updateSource($event.detail)\x22\x20style=\x22display:block;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnValidation.ok\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:#86efac;font-size:11px;\x22>✓\x20Valid\x20function\x20source</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!fnValidation.ok\x20&&\x20fnSource.trim()\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:11px;\x22>{{\x20fnValidation.message\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnMode\x20===\x20\x27existing\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:120px\x201fr;gap:10px;align-items:center;font-size:13px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.6;\x22>Function</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20:value=\x22existingFn\x22\x20@change=\x22existingFn\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;padding:6px\x208px;color:inherit;font-size:13px;width:100%;box-sizing:border-box;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20select\x20function\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22functions\x22\x20let:item=\x22fn\x22><option\x20:value=\x22fn\x22>{{\x20fn\x20}}</option></each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;opacity:.5;line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Pick\x20an\x20existing\x20function\x20already\x20stored\x20in\x20this\x20environment.\x20Inline\x20test\x20preview\x20is\x20available\x20when\x20writing\x20a\x20new\x20function\x20in\x20this\x20panel.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:14px;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);display:flex;flex-direction:column;gap:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Runtime</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:grid;grid-template-columns:1fr\x201fr;gap:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Concurrency</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20min=\x221\x22\x20max=\x2264\x22\x20:value=\x22concurrency\x22\x20@input=\x22concurrency\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22margin-top:4px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;padding:6px\x208px;color:inherit;font-size:13px;width:100%;box-sizing:border-box;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Poll\x20interval</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20min=\x2210\x22\x20max=\x2210000\x22\x20:value=\x22pollInterval\x22\x20@input=\x22pollInterval\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22margin-top:4px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;padding:6px\x208px;color:inherit;font-size:13px;width:100%;box-sizing:border-box;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;margin-top:4px;\x22>milliseconds</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:14px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:10px;background:var(--okdb-app-bg-deep);display:flex;flex-direction:column;gap:12px;\x22>\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;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;\x22>Testing</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnMode\x20!==\x20\x27new\x27\x22><span\x20style=\x22font-size:10px;color:var(--okdb-warning);opacity:.8;\x22>inline\x20preview\x20works\x20for\x20new\x20functions</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em;\x22>Sample\x20job\x20payload</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:6px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;overflow:hidden;background:var(--okdb-app-bg-deep);min-height:220px;display:flex;flex-direction:column;min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-json-input\x20mode=\x22textbox\x22\x20:value=\x22samplePayload\x22\x20@edit=\x22samplePayload\x20=\x20$event.detail\x22\x20style=\x22height:100%;display:flex;min-height:220px;\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22fnMode\x20===\x20\x27new\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\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\x20\x20\x20\x20\x20\x20<button\x20@click=\x22preview()\x22\x20:disabled=\x22!fnValidation.ok\x20||\x20previewRunning\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;padding:5px\x2014px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x209%,\x20transparent);border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);color:var(--okdb-accent);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20previewRunning\x20?\x20\x27Running…\x27\x20:\x20\x27▷\x20Test\x20with\x20sample\x20job\x27\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\x20\x20<span\x20style=\x22font-size:11px;opacity:.45;line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Runs\x20the\x20draft\x20against\x20the\x20sample\x20payload\x20above.\x20Side-effects\x20still\x20write\x20to\x20live\x20data.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22previewError\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:11px;padding:8px\x2010px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:6px;\x22>{{\x20previewError\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22previewResult\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;flex-direction:column;gap:8px;padding:10px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;background:#0f1418;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:style=\x22\x27font-size:12px;font-weight:600;color:\x27+previewStatusColor(previewResult)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20previewOk\x20?\x20\x27✓\x20Function\x20executed\x20successfully\x27\x20:\x20\x27✕\x20Function\x20returned\x20an\x20error\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;gap:10px;flex-wrap:wrap;font-size:11px;opacity:.55;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>status:\x20{{\x20previewResult.status\x20||\x20\x27ok\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22previewDuration\x20!=\x20null\x22><span>{{\x20previewDuration\x20}}ms</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20:style=\x22\x27margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;background:var(--okdb-app-bg-deep);border:1px\x20solid\x20var(--okdb-app-border);font-size:11px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:\x27\x20+\x20(previewOk\x20?\x20\x27var(--okdb-app-fg)\x27\x20:\x20\x27#fca5a5\x27)\x22>{{\x20formatJson(previewOk\x20?\x20(previewResult.result?.value\x20??\x20previewResult)\x20:\x20(previewResult.error\x20??\x20previewResult.result?.value\x20??\x20previewResult))\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22previewLogs.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<details>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<summary\x20style=\x22font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.45;cursor:pointer;user-select:none;\x22>Logs\x20({{\x20previewLogs.length\x20}})</summary>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:6px;display:flex;flex-direction:column;gap:4px;max-height:140px;overflow:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22previewLogs\x22\x20let:item=\x22entry\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;padding:6px\x208px;border:1px\x20solid\x20var(--okdb-app-border);border-radius:6px;background:var(--okdb-app-bg-deep);display:flex;gap:8px;align-items:flex-start;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:10px;text-transform:uppercase;opacity:.5;min-width:40px;\x22>{{\x20entry.level\x20||\x20\x27log\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22flex:1;\x22>{{\x20entry.msg\x20||\x20entry.message\x20||\x20formatJson(entry)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</details>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22createError\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);font-size:12px;padding:6px\x2010px;border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);border-radius:6px;\x22>{{\x20createError\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;justify-content:flex-end;gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22cancelCreate()\x22\x20style=\x22font-size:12px;padding:5px\x2014px;opacity:.6;\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22create()\x22\x20:disabled=\x22!canCreate\x20||\x20creating\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;padding:5px\x2018px;background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2013%,\x20transparent);border-color:var(--okdb-accent);color:var(--okdb-accent);font-weight:600;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20creating\x20?\x20\x27Creating…\x27\x20:\x20\x27Create\x20Worker\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a</div>','type','showCreate','var(--okdb-app-fg-muted)','6548032SLwtuy','data','previewResult','Example\x20queue\x20payload','Must\x20be\x20(ctx)\x20=>\x20{\x20…\x20}','stringify','catch','stats','_unsubs','pollInterval','2uufuea','function','previewRunning','Worker\x20\x22','Delete\x20worker\x20\x22','selectedEnv','<engine-modal\x20:modal=\x22modal\x22\x20:engine=\x22engine\x22\x20:env=\x22envName\x22\x20:on-done=\x22onDone\x22\x20/>','error','POST','default','new','Queue\x20worker\x20for\x20','workers','existingFn','samplePayload','queue-worker','job','10mTRrkO','createError','concurrency','apiBase','config','replace','previewError','paused','functions','fnValidation','Worker\x20paused','toast','jobtype','Failed\x20to\x20create\x20function','application/json','busy','32400603ngEYds','result','fnName','handler','engine:error','-preview-1','message','createSuccess','restart','#818cf8','#facc15','__preview__','test'];_0x53db=function(){return _0x212b6a;};return _0x53db();}import _0x298961 from'../../../stores/okdb-store.js';import _0x3fd175 from'../../../components/ok-js-input.ok.js';import _0x4ec572 from'../../../components/ok-json-input.ok.js';import _0x34cde4 from'../../engines/modals/engine-modal.ok.js';import _0x4be893 from'../../engines/parts/engine-row-item.ok.js';import{openFunctionRoute as _0x4f3259}from'../../engines/engine-ui-utils.js';const s=_0x415b05(0x146),p=[/(^|[^\w$.])require\s*\(/,/(^|[^\w$.])import\b/,/(^|[^\w$.])console\b/,/(^|[^\w$.])process\b/];function d(_0x272ba4){const _0x1cb6cf=_0x415b05,_0x2af0f2=(_0x272ba4||'')[_0x1cb6cf(0x119)](/\r\n/g,'\x0a')['trim']();if(!_0x2af0f2)return{'ok':!0x1,'message':_0x1cb6cf(0x152)};if(!/^(async\s+)?\(\s*[A-Za-z_$][\w$]*\s*\)\s*=>/[_0x1cb6cf(0x130)](_0x2af0f2))return{'ok':!0x1,'message':_0x1cb6cf(0x171)};for(const _0x26765d of p)if(_0x26765d[_0x1cb6cf(0x130)](_0x2af0f2))return{'ok':!0x1,'message':'Forbidden\x20pattern'};try{new Function(_0x1cb6cf(0x160)+_0x2af0f2+');')();}catch(_0x1c089e){return{'ok':!0x1,'message':_0x1c089e[_0x1cb6cf(0x12a)]};}return{'ok':!0x0,'normalized':_0x2af0f2};}function l(_0x1f4ffc=_0x415b05(0x113)){const _0x2bca07=_0x415b05;return{'id':_0x1f4ffc+_0x2bca07(0x129),'type':_0x1f4ffc,'action':'process','priority':'normal','sample':!0x0,'data':{'note':_0x2bca07(0x170)}};}function c(_0x47f1a5){const _0x136913=_0x415b05;try{return JSON[_0x136913(0x172)](_0x47f1a5,null,0x2);}catch{return String(_0x47f1a5??'');}}function _0x262d(_0x2bb0b4,_0x1ebba7){_0x2bb0b4=_0x2bb0b4-0x108;const _0x53dba3=_0x53db();let _0x262d34=_0x53dba3[_0x2bb0b4];return _0x262d34;}export default{'tag':_0x415b05(0x14e),'dependencies':[_0x3fd175,_0x4ec572,_0x34cde4,_0x4be893],'attr':{'jobtype':{}},'context':_0x173202=>({'workers':[],'busy':!0x1,'error':null,'_unsubs':[],'showCreate':!0x1,'creating':!0x1,'createError':null,'createSuccess':null,'fnName':'','fnSource':s,'fnValidation':d(s),'fnMode':_0x415b05(0x10d),'existingFn':'','functions':[],'concurrency':0x1,'pollInterval':0x64,'advanced':!0x1,'samplePayload':l(_0x415b05(0x113)),'previewRunning':!0x1,'previewResult':null,'previewError':null,get 'jobType'(){const _0x1e1f33=_0x415b05;return _0x173202['$attr'][_0x1e1f33(0x120)]||'';},get 'envName'(){const _0x108e46=_0x415b05;return _0x298961[_0x108e46(0x108)]||_0x108e46(0x10c);},get 'apiBase'(){const _0x2d89a5=_0x415b05;return _0x298961[_0x2d89a5(0x117)];},get 'handlerName'(){const _0x1b73ea=_0x415b05;return _0x1b73ea(0x145)===this['fnMode']?this[_0x1b73ea(0x110)]:this[_0x1b73ea(0x126)][_0x1b73ea(0x14a)]();},get 'hasBoundJobType'(){const _0x3b86f6=_0x415b05;return!!this[_0x3b86f6(0x151)];},get 'canCreate'(){const _0x267a45=_0x415b05;return!(!this[_0x267a45(0x151)]||!this[_0x267a45(0x164)]||_0x267a45(0x10d)===this['fnMode']&&!this[_0x267a45(0x11d)]['ok']);},get 'previewOk'(){const _0x2a367e=_0x415b05;return!!this['previewResult']&&_0x2a367e(0x10a)!==this[_0x2a367e(0x16f)][_0x2a367e(0x158)]&&!this[_0x2a367e(0x16f)][_0x2a367e(0x10a)];},get 'previewLogs'(){const _0x6baa51=_0x415b05;return Array[_0x6baa51(0x144)](this['previewResult']?.[_0x6baa51(0x167)])?this[_0x6baa51(0x16f)][_0x6baa51(0x167)]:[];},get 'previewDuration'(){const _0x334cee=_0x415b05;return this[_0x334cee(0x16f)]?.['execution']?.[_0x334cee(0x13d)]??null;},get 'totalProcessed'(){const _0x46dcc7=_0x415b05;return(this[_0x46dcc7(0x10f)]??[])[_0x46dcc7(0x156)]((_0x517d3d,_0x32d4de)=>_0x517d3d+Number(_0x32d4de?.[_0x46dcc7(0x174)]?.['processed']??0x0),0x0);},get 'totalFailed'(){const _0x1b991e=_0x415b05;return(this[_0x1b991e(0x10f)]??[])[_0x1b991e(0x156)]((_0x3fd522,_0x4b991f)=>_0x3fd522+Number(_0x4b991f?.[_0x1b991e(0x174)]?.[_0x1b991e(0x136)]??0x0),0x0);},async 'load'(){const _0x916caf=_0x415b05;if(!this['jobType'])return this[_0x916caf(0x10f)]=[],this[_0x916caf(0x10a)]=null,void(this[_0x916caf(0x123)]=!0x1);this['busy']=!0x0,this[_0x916caf(0x10a)]=null;try{const _0xf1c91b=await fetch(this[_0x916caf(0x117)]+_0x916caf(0x14b)),_0x33d0b7=await _0xf1c91b[_0x916caf(0x134)](),_0x4412fe=_0x33d0b7?.[_0x916caf(0x125)]??_0x33d0b7?.[_0x916caf(0x16e)]??[];this[_0x916caf(0x10f)]=_0x4412fe[_0x916caf(0x15f)](_0x10bce4=>_0x10bce4[_0x916caf(0x118)]?.['job_type']===this[_0x916caf(0x151)]);}catch(_0x4a5a53){this[_0x916caf(0x10a)]=_0x4a5a53?.[_0x916caf(0x12a)]||String(_0x4a5a53);}finally{this[_0x916caf(0x123)]=!0x1;}},async 'loadFunctions'(){const _0x3273df=_0x415b05;try{const _0x1e53ff=await fetch(this['apiBase']+_0x3273df(0x150)),_0x188abf=await _0x1e53ff[_0x3273df(0x134)]();this[_0x3273df(0x11c)]=(_0x188abf?.[_0x3273df(0x125)]??_0x188abf?.[_0x3273df(0x16e)]??[])['map'](_0x5a7857=>_0x5a7857[_0x3273df(0x138)]??_0x5a7857[_0x3273df(0x131)]??_0x5a7857)[_0x3273df(0x15f)](Boolean)['sort']();}catch{this[_0x3273df(0x11c)]=[];}},'openCreate'(){const _0x5bb9e0=_0x415b05;this['jobType']&&(this[_0x5bb9e0(0x16b)]=!0x0,this[_0x5bb9e0(0x115)]=null,this[_0x5bb9e0(0x12b)]=null,this['fnName']='',this[_0x5bb9e0(0x13f)]=s,this[_0x5bb9e0(0x11d)]=d(s),this[_0x5bb9e0(0x132)]=_0x5bb9e0(0x10d),this[_0x5bb9e0(0x110)]='',this[_0x5bb9e0(0x16f)]=null,this[_0x5bb9e0(0x11a)]=null,this[_0x5bb9e0(0x116)]=0x1,this['pollInterval']=0x64,this[_0x5bb9e0(0x111)]=l(this[_0x5bb9e0(0x151)]),this['loadFunctions']());},'cancelCreate'(){const _0x43a218=_0x415b05;this[_0x43a218(0x16b)]=!0x1,this['createError']=null;},'pickExistingFn'(){const _0x1801f9=_0x415b05;this['fnMode']=_0x1801f9(0x145),this['loadFunctions']();},'pickNewFn'(){const _0x488ced=_0x415b05;this[_0x488ced(0x132)]=_0x488ced(0x10d),this[_0x488ced(0x13f)]?.['trim']()||(this['fnSource']=s,this[_0x488ced(0x11d)]=d(this[_0x488ced(0x13f)]));},'updateSource'(_0x180d81){const _0x454dc4=_0x415b05;this[_0x454dc4(0x13f)]=_0x180d81??'',this[_0x454dc4(0x11d)]=d(this[_0x454dc4(0x13f)]);},async 'preview'(){const _0x563871=_0x415b05;if(this['fnValidation']['ok']&&!this[_0x563871(0x179)]){this[_0x563871(0x179)]=!0x0,this[_0x563871(0x16f)]=null,this[_0x563871(0x11a)]=null;try{const _0xb5fa1b=await fetch(this['apiBase']+_0x563871(0x161),{'method':_0x563871(0x10b),'headers':{'Content-Type':_0x563871(0x122)},'body':JSON['stringify']({'source':this[_0x563871(0x11d)][_0x563871(0x15a)],'payload':this['samplePayload'],'jobContext':{'id':_0x563871(0x12f),'type':this[_0x563871(0x151)],'tries':0x1,'created':Date[_0x563871(0x153)](),'tags':null,'priority':0x0}})}),_0x1e24f0=await _0xb5fa1b[_0x563871(0x134)]();this[_0x563871(0x16f)]=_0x1e24f0?.['result']??_0x1e24f0?.[_0x563871(0x16e)]??null;}catch(_0x2da858){this[_0x563871(0x11a)]=_0x2da858?.[_0x563871(0x12a)]||String(_0x2da858);}finally{this['previewRunning']=!0x1;}}},async 'create'(){const _0x45712d=_0x415b05;if(this[_0x45712d(0x13b)]&&!this[_0x45712d(0x139)]){this['creating']=!0x0,this['createError']=null;try{if(_0x45712d(0x10d)===this[_0x45712d(0x132)]){const _0x348ed0=await fetch(this[_0x45712d(0x117)]+_0x45712d(0x150),{'method':_0x45712d(0x10b),'headers':{'Content-Type':_0x45712d(0x122)},'body':JSON[_0x45712d(0x172)]({'name':this[_0x45712d(0x126)][_0x45712d(0x14a)](),'source':this[_0x45712d(0x11d)]['normalized'],'enabled':!0x0,'metadata':{'description':_0x45712d(0x10e)+this[_0x45712d(0x151)]}})}),_0x17410d=await _0x348ed0[_0x45712d(0x134)]();if(!_0x348ed0['ok'])throw new Error(_0x17410d?.[_0x45712d(0x10a)]?.[_0x45712d(0x12a)]||_0x45712d(0x121));}const _0x1b6c31=this[_0x45712d(0x151)]+'-'+this[_0x45712d(0x164)],_0x1c5099=await fetch(this[_0x45712d(0x117)]+_0x45712d(0x159),{'method':'POST','headers':{'Content-Type':_0x45712d(0x122)},'body':JSON[_0x45712d(0x172)]({'type':_0x45712d(0x112),'name':_0x1b6c31,'config':{'job_type':this[_0x45712d(0x151)],'handler':{'kind':_0x45712d(0x178),'name':this[_0x45712d(0x164)]},'concurrency':Number(this['concurrency'])||0x1,'pollInterval':Number(this[_0x45712d(0x176)])||0x64}})}),_0x1f4b51=await _0x1c5099['json']();if(!_0x1c5099['ok'])throw new Error(_0x1f4b51?.[_0x45712d(0x10a)]?.['message']||_0x45712d(0x162)+_0x1c5099['status']+')');this[_0x45712d(0x12b)]=_0x45712d(0x17a)+_0x1b6c31+_0x45712d(0x140),this[_0x45712d(0x16b)]=!0x1,await this[_0x45712d(0x142)]();}catch(_0x22a50a){this['createError']=_0x22a50a?.['message']||String(_0x22a50a);}finally{this[_0x45712d(0x139)]=!0x1;}}},async 'doAction'(_0x3711b5,_0x3f680d){const _0x10efad=_0x415b05;try{const _0x46ec28=await fetch(this[_0x10efad(0x117)]+_0x10efad(0x15e)+encodeURIComponent(_0x3711b5['type'])+'/'+encodeURIComponent(_0x3711b5[_0x10efad(0x138)])+'/'+_0x3f680d,{'method':_0x10efad(0x10b)}),_0x4f2e15=await _0x46ec28[_0x10efad(0x134)]()[_0x10efad(0x173)](()=>({}));if(!_0x46ec28['ok'])throw new Error(_0x4f2e15?.[_0x10efad(0x10a)]?.[_0x10efad(0x12a)]||_0x3f680d+'\x20failed');const _0x1436b8=_0x10efad(0x15d)===_0x3f680d?_0x10efad(0x11e):_0x10efad(0x155)===_0x3f680d?_0x10efad(0x154):_0x10efad(0x12c)===_0x3f680d?_0x10efad(0x13e):'Worker\x20'+_0x3f680d+'d';_0x173202['$ok']['shared']?.['toast']?.[_0x10efad(0x14d)]?.(_0x1436b8),await this['load']();}catch(_0x59599d){_0x173202['$ok'][_0x10efad(0x14f)]?.[_0x10efad(0x11f)]?.[_0x10efad(0x10a)]?.(_0x59599d?.['message']||_0x3f680d+_0x10efad(0x143));}},async 'doDelete'(_0x2d3680){const _0x30abe0=_0x415b05;if(confirm(_0x30abe0(0x17b)+_0x2d3680[_0x30abe0(0x138)]+'\x22?'))try{await fetch(this[_0x30abe0(0x117)]+_0x30abe0(0x15e)+encodeURIComponent(_0x2d3680[_0x30abe0(0x16a)])+'/'+encodeURIComponent(_0x2d3680[_0x30abe0(0x138)]),{'method':_0x30abe0(0x137)}),await this[_0x30abe0(0x142)]();}catch{}},async 'openWorkerModal'(_0xf7ce83){const _0x11c846=_0x415b05;if(!_0xf7ce83)return;const _0x68fa2=this;await _0x173202[_0x11c846(0x165)][_0x11c846(0x14f)]['modal'][_0x11c846(0x163)]({'owner':_0x173202,'title':'Edit\x20Worker\x20·\x20'+_0xf7ce83[_0x11c846(0x138)],'canDrag':!0x0,'content':_0x11c846(0x109),'context':_0x157e5b=>({'modal':_0x157e5b,'engine':_0xf7ce83,'envName':_0x68fa2[_0x11c846(0x147)],'onDone':async()=>{await _0x68fa2['load']();}})});},'openWorkerFunction'(_0x584ecb,_0x5ae2dd){const _0x32c8c6=_0x415b05;_0x5ae2dd?.['stopPropagation']?.();const _0x123437=_0x584ecb?.['config']?.[_0x32c8c6(0x127)]?.['name'];_0x123437&&_0x4f3259(_0x173202,_0x123437);},'stateColor'(_0x3debc0){const _0x33fe04=_0x415b05,_0x564d64=_0x3debc0?.[_0x33fe04(0x174)]?.[_0x33fe04(0x14c)]??_0x3debc0?.['status'];return _0x33fe04(0x157)===_0x564d64?'var(--okdb-success)':_0x33fe04(0x10a)===_0x564d64?_0x33fe04(0x135):_0x33fe04(0x11b)===_0x564d64?_0x33fe04(0x12d):'building'===_0x564d64?_0x33fe04(0x12e):_0x33fe04(0x16c);},'stateLabel':_0x47184f=>_0x47184f?.[_0x415b05(0x174)]?.[_0x415b05(0x14c)]??_0x47184f?.[_0x415b05(0x158)]??'—','previewStatusColor':_0x39a710=>_0x39a710?'error'===_0x39a710['status']||_0x39a710['error']?'var(--okdb-danger)':_0x415b05(0x133):_0x415b05(0x16c),'formatJson':c}),async 'mount'(_0x576911){const _0x389117=_0x415b05;await this[_0x389117(0x142)]();const _0x347d2d=()=>this['load']();this[_0x389117(0x175)]=[_0x1e1c24['on']('engine:started',_0x347d2d),_0x1e1c24['on'](_0x389117(0x148),_0x347d2d),_0x1e1c24['on'](_0x389117(0x128),_0x347d2d)],_0x576911[_0x389117(0x15c)](()=>_0x576911[_0x389117(0x168)][_0x389117(0x120)],()=>{const _0x11a57e=_0x389117;this['showCreate']=!0x1,this[_0x11a57e(0x16f)]=null,this['previewError']=null,this['samplePayload']=l(_0x576911[_0x11a57e(0x168)][_0x11a57e(0x120)]||_0x11a57e(0x113)),this[_0x11a57e(0x142)]();}),_0x576911[_0x389117(0x15c)](()=>_0x298961['selectedEnv'],()=>{const _0x3dd848=_0x389117;this[_0x3dd848(0x16b)]=!0x1,this['load']();});},'unmount'(){const _0x170144=_0x415b05;for(const _0x20bcb0 of this[_0x170144(0x175)])_0x20bcb0();this[_0x170144(0x175)]=[];},'template':_0x415b05(0x169)};
@@ -1 +1 @@
1
- function _0x4789(_0x412098,_0x55e357){_0x412098=_0x412098-0xfd;var _0x19cf6c=_0x19cf();var _0x478914=_0x19cf6c[_0x412098];return _0x478914;}var _0x5edc02=_0x4789;(function(_0x460750,_0x919b6a){var _0xeab1d3=_0x4789,_0x19889b=_0x460750();while(!![]){try{var _0x27a178=parseInt(_0xeab1d3(0x101))/0x1+parseInt(_0xeab1d3(0xff))/0x2+parseInt(_0xeab1d3(0xfd))/0x3+-parseInt(_0xeab1d3(0x103))/0x4+-parseInt(_0xeab1d3(0x108))/0x5+parseInt(_0xeab1d3(0x106))/0x6+parseInt(_0xeab1d3(0x107))/0x7*(-parseInt(_0xeab1d3(0x102))/0x8);if(_0x27a178===_0x919b6a)break;else _0x19889b['push'](_0x19889b['shift']());}catch(_0xcf8b71){_0x19889b['push'](_0x19889b['shift']());}}}(_0x19cf,0x316c3));export default{'tag':_0x5edc02(0x105),'unwrap':!0x0,'context':_0x2784ee=>({get 'topology'(){var _0x3570f4=_0x5edc02;return _0x2784ee['$attr'][_0x3570f4(0x100)]||{};},get 'nodeId'(){var _0x37c566=_0x5edc02;return _0x2784ee[_0x37c566(0x109)][_0x37c566(0xfe)];},get 'node'(){var _0x247996=_0x5edc02;return this[_0x247996(0x100)]?.[this[_0x247996(0xfe)]]||null;},get 'tags'(){var _0x78a1f8=_0x5edc02;return Array['isArray'](this[_0x78a1f8(0x10a)]?.[_0x78a1f8(0x104)])?this['node'][_0x78a1f8(0x104)]:[];},'pretty'(_0x1af3e9){if(null==_0x1af3e9)return'';try{return JSON['stringify'](_0x1af3e9,null,0x2);}catch{return String(_0x1af3e9);}}}),'template':'<if\x20:=\x22node\x22><div\x20style=\x22border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:10px;\x20padding:14px;\x20background:var(--okdb-app-bg);\x20display:flex;\x20flex-direction:column;\x20gap:12px;\x22><div\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x22><div\x20style=\x22font-weight:600;\x20flex:1;\x20min-width:0;\x20overflow:hidden;\x20text-overflow:ellipsis;\x20white-space:nowrap;\x22>Node\x20Detail:\x20{{node.id}}</div><if\x20:=\x22node.error\x22><span\x20style=\x22font-size:10px;\x20padding:2px\x208px;\x20border-radius:999px;\x20color:var(--okdb-danger);\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x22>error</span></if></div><div\x20style=\x22display:grid;\x20grid-template-columns:repeat(auto-fit,minmax(180px,1fr));\x20gap:10px\x2014px;\x20font-size:12px;\x22><div><div\x20style=\x22opacity:.45;\x20font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Address</div><div\x20style=\x22margin-top:4px;\x20font-family:monospace;\x20word-break:break-all;\x22>{{node.address\x20||\x20\x27—\x27}}</div></div><div><div\x20style=\x22opacity:.45;\x20font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Clock</div><div\x20style=\x22margin-top:4px;\x20font-family:monospace;\x22>{{node.clock\x20??\x20\x27—\x27}}</div></div><div><div\x20style=\x22opacity:.45;\x20font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Available\x20envs</div><div\x20style=\x22margin-top:4px;\x22>{{(node.availableEnvs\x20||\x20[]).join(\x27,\x20\x27)\x20||\x20\x27—\x27}}</div></div></div><div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:6px;\x22><div\x20style=\x22opacity:.45;\x20font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Tags</div><div\x20style=\x22display:flex;\x20flex-wrap:wrap;\x20gap:6px;\x20min-height:20px;\x22><if\x20:=\x22tags.length\x20===\x200\x22><span\x20style=\x22font-size:11px;\x20opacity:.45;\x22>No\x20tags</span></if><for\x20:=\x22tags\x22\x20let:tag><span\x20style=\x22font-size:10px;\x20padding:2px\x208px;\x20border-radius:999px;\x20border:1px\x20solid\x20var(--okdb-accent-soft-border);\x20color:var(--okdb-accent);\x20background:var(--okdb-accent-soft-bg);\x22>{{tag}}</span></for></div></div><pre\x20style=\x22font-size:12px;\x20margin:0;\x20overflow:auto;\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:8px;\x20padding:10px;\x22>\x0a{{pretty(node)}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</pre></div></if>'};function _0x19cf(){var _0x338f07=['topology','402828NgwPtG','8JBqsgC','922536SfLuFT','tags','sync-node-detail','2149056rBTngs','1364783xXmQAy','1910550eVIzMc','$attr','node','447732BBjeyY','nodeId','199800QOTNeS'];_0x19cf=function(){return _0x338f07;};return _0x19cf();}
1
+ function _0x2e46(_0x1976db,_0x4b6837){_0x1976db=_0x1976db-0x169;var _0x1e45df=_0x1e45();var _0x2e4625=_0x1e45df[_0x1976db];return _0x2e4625;}var _0x538360=_0x2e46;function _0x1e45(){var _0x382300=['sync-node-detail','276040skjXgs','tags','2120398kvdPvF','73269eyyizP','32pXDzIL','isArray','node','<if\x20:=\x22node\x22><div\x20style=\x22border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:10px;\x20padding:14px;\x20background:var(--okdb-app-bg);\x20display:flex;\x20flex-direction:column;\x20gap:12px;\x22><div\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x22><div\x20style=\x22font-weight:600;\x20flex:1;\x20min-width:0;\x20overflow:hidden;\x20text-overflow:ellipsis;\x20white-space:nowrap;\x22>Node\x20Detail:\x20{{node.id}}</div><if\x20:=\x22node.error\x22><span\x20style=\x22font-size:10px;\x20padding:2px\x208px;\x20border-radius:999px;\x20color:var(--okdb-danger);\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x22>error</span></if></div><div\x20style=\x22display:grid;\x20grid-template-columns:repeat(auto-fit,minmax(180px,1fr));\x20gap:10px\x2014px;\x20font-size:12px;\x22><div><div\x20style=\x22opacity:.45;\x20font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Address</div><div\x20style=\x22margin-top:4px;\x20font-family:monospace;\x20word-break:break-all;\x22>{{node.address\x20||\x20\x27—\x27}}</div></div><div><div\x20style=\x22opacity:.45;\x20font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Clock</div><div\x20style=\x22margin-top:4px;\x20font-family:monospace;\x22>{{node.clock\x20??\x20\x27—\x27}}</div></div><div><div\x20style=\x22opacity:.45;\x20font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Available\x20envs</div><div\x20style=\x22margin-top:4px;\x22>{{(node.availableEnvs\x20||\x20[]).join(\x27,\x20\x27)\x20||\x20\x27—\x27}}</div></div></div><div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:6px;\x22><div\x20style=\x22opacity:.45;\x20font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Tags</div><div\x20style=\x22display:flex;\x20flex-wrap:wrap;\x20gap:6px;\x20min-height:20px;\x22><if\x20:=\x22tags.length\x20===\x200\x22><span\x20style=\x22font-size:11px;\x20opacity:.45;\x22>No\x20tags</span></if><for\x20:=\x22tags\x22\x20let:tag><span\x20style=\x22font-size:10px;\x20padding:2px\x208px;\x20border-radius:999px;\x20border:1px\x20solid\x20var(--okdb-accent-soft-border);\x20color:var(--okdb-accent);\x20background:var(--okdb-accent-soft-bg);\x22>{{tag}}</span></for></div></div><pre\x20style=\x22font-size:12px;\x20margin:0;\x20overflow:auto;\x20background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:8px;\x20padding:10px;\x22>\x0a{{pretty(node)}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</pre></div></if>','510906cGDzZw','873855KFEyJW','topology','50EQrBUN','$attr','6AFDfnb','4502wVNeOQ','stringify','28FoSPPw','1755544cgSRMd','nodeId'];_0x1e45=function(){return _0x382300;};return _0x1e45();}(function(_0x125c59,_0x82a114){var _0x27bcaf=_0x2e46,_0x470d08=_0x125c59();while(!![]){try{var _0x59a9f3=parseInt(_0x27bcaf(0x16c))/0x1*(parseInt(_0x27bcaf(0x176))/0x2)+parseInt(_0x27bcaf(0x16b))/0x3*(-parseInt(_0x27bcaf(0x178))/0x4)+parseInt(_0x27bcaf(0x17c))/0x5+-parseInt(_0x27bcaf(0x175))/0x6*(-parseInt(_0x27bcaf(0x16a))/0x7)+-parseInt(_0x27bcaf(0x179))/0x8+-parseInt(_0x27bcaf(0x171))/0x9+-parseInt(_0x27bcaf(0x173))/0xa*(-parseInt(_0x27bcaf(0x170))/0xb);if(_0x59a9f3===_0x82a114)break;else _0x470d08['push'](_0x470d08['shift']());}catch(_0x49919a){_0x470d08['push'](_0x470d08['shift']());}}}(_0x1e45,0x2ab25));export default{'tag':_0x538360(0x17b),'unwrap':!0x0,'context':_0x3a8328=>({get 'topology'(){var _0x540c9e=_0x538360;return _0x3a8328[_0x540c9e(0x174)][_0x540c9e(0x172)]||{};},get 'nodeId'(){var _0x2e6352=_0x538360;return _0x3a8328[_0x2e6352(0x174)]['nodeId'];},get 'node'(){var _0x2b7626=_0x538360;return this['topology']?.[this[_0x2b7626(0x17a)]]||null;},get 'tags'(){var _0x53d62b=_0x538360;return Array[_0x53d62b(0x16d)](this['node']?.[_0x53d62b(0x169)])?this[_0x53d62b(0x16e)][_0x53d62b(0x169)]:[];},'pretty'(_0x4c575e){var _0x4614c7=_0x538360;if(null==_0x4c575e)return'';try{return JSON[_0x4614c7(0x177)](_0x4c575e,null,0x2);}catch{return String(_0x4c575e);}}}),'template':_0x538360(0x16f)};
@@ -1 +1 @@
1
- function _0x467d(){const _0x7cc5d0=['json','floor','loading','10URzfeY','round','peerStalenessLimitMs','#f59e0b18','values','~system','Force\x20resync\x20failed','/sync/gc/status','Stale','479596TVHmqu','44085YHhTbD','GC\x20run\x20failed','72ZZqePH','result','61853Jhurhr','3NMjtLf','API','message','285288yvLdYb','m\x20ago','peer_id','runError','4720YqNKyu','includes','/resync','1821744YDArKo','just\x20now','gcHorizon','running','1190LSchxs','envs','var(--okdb-success)','Healthy','/sync/gc/run','status','data','envRows','sync-retention','d\x20ago','var(--okdb-warning)','toLocaleString','/sync/gc/peer/','load','runResult','<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:16px;\x22><div\x20style=\x22display:flex;\x20align-items:center;\x20gap:10px;\x22><div\x20style=\x22flex:1;\x22><div\x20style=\x22font-weight:600;\x20font-size:15px;\x22>Changelog\x20GC\x20—\x20this\x20node</div><div\x20style=\x22font-size:11px;\x20opacity:.4;\x20margin-top:3px;\x20display:flex;\x20align-items:center;\x20gap:10px;\x20flex-wrap:wrap;\x22><span>Runs\x20automatically\x20when\x20peer\x20watermarks\x20advance.</span><if\x20:=\x22stalenessLimit\x22><span\x20style=\x22font-family:monospace;\x20opacity:.8;\x22>stale\x20after:\x20{{stalenessLimit}}</span></if><span>Each\x20cluster\x20node\x20manages\x20its\x20own\x20changelog\x20independently.</span></div></div><button\x20@click=\x22load()\x22\x20:disabled=\x22loading\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x22>{{\x20loading\x20?\x20\x27Loading…\x27\x20:\x20\x27Refresh\x27\x20}}</button>\x20<button\x20@click=\x22runGc()\x22\x20:disabled=\x22running\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x20background:#1a3a20;\x20border-color:#2a6a30;\x20color:#6ee08a;\x22\x20title=\x22Immediately\x20sweep\x20this\x20node\x27s\x20changelog\x20across\x20all\x20environments.\x20Other\x20cluster\x20nodes\x20are\x20unaffected.\x22>{{\x20running\x20?\x20\x27Running…\x27\x20:\x20\x27Run\x20GC\x20now\x27\x20}}</button></div><if\x20:=\x22error\x22><div\x20style=\x22font-size:12px;\x20color:var(--okdb-danger);\x20background:var(--okdb-danger-soft-bg);\x20border:1px\x20solid\x20var(--okdb-danger-soft-border);\x20border-radius:8px;\x20padding:10px\x2012px;\x22>{{error}}</div></if><if\x20:=\x22runResult\x22><div\x20style=\x22font-size:12px;\x20color:var(--okdb-success);\x20background:#0f2a1a;\x20border:1px\x20solid\x20#1a5a30;\x20border-radius:8px;\x20padding:10px\x2012px;\x22>GC\x20complete\x20—\x20removed\x20{{runResult.removed?.toLocaleString()\x20??\x200}}\x20entries\x20across\x20all\x20environments\x20({{runResult.durationMs}}ms)</div></if><if\x20:=\x22runError\x22><div\x20style=\x22font-size:12px;\x20color:var(--okdb-danger);\x20background:var(--okdb-danger-soft-bg);\x20border:1px\x20solid\x20var(--okdb-danger-soft-border);\x20border-radius:8px;\x20padding:10px\x2012px;\x22>{{runError}}</div></if><if\x20:=\x22status\x20&&\x20envRows.length\x22><div\x20style=\x22background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:10px;\x20overflow:hidden;\x22><div\x20style=\x22padding:10px\x2014px;\x20font-size:11px;\x20text-transform:uppercase;\x20letter-spacing:.06em;\x20opacity:.45;\x20border-bottom:1px\x20solid\x20var(--okdb-app-border);\x22>Per-Environment\x20Changelog</div><div\x20style=\x22display:grid;\x20grid-template-columns:1fr\x201fr\x201fr\x201fr;\x20font-size:11px;\x22><div\x20style=\x22padding:8px\x2014px;\x20opacity:.45;\x22>Env</div><div\x20style=\x22padding:8px\x2014px;\x20opacity:.45;\x20text-align:right;\x22>Entries</div><div\x20style=\x22padding:8px\x2014px;\x20opacity:.45;\x20text-align:right;\x22>Current\x20clock</div><div\x20style=\x22padding:8px\x2014px;\x20opacity:.45;\x20text-align:right;\x22\x20title=\x22Lowest\x20clock\x20all\x20healthy\x20peers\x20have\x20confirmed\x20receiving\x20from\x20this\x20node.\x20Entries\x20below\x20this\x20are\x20safe\x20to\x20delete.\x22>GC\x20horizon</div><for\x20:=\x22envRows\x22\x20let:env><div\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20font-family:monospace;\x20color:var(--okdb-sky);\x22>{{env.env}}</div><div\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x20font-family:monospace;\x22>{{(env.entryCount\x20??\x200).toLocaleString()}}</div><div\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x20font-family:monospace;\x20opacity:.7;\x22>{{fmtClock(env.currentClock)}}</div><div\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x20font-family:monospace;\x22\x20:style=\x22env.gcHorizon\x20>\x200\x20?\x20\x27color:var(--okdb-success);\x27\x20:\x20\x27opacity:.35;\x27\x22>{{env.gcHorizon\x20>\x200\x20?\x20fmtClock(env.gcHorizon)\x20:\x20\x27no\x20peers\x20synced\x20yet\x27}}</div></for></div></div></if><if\x20:=\x22status\x22><div\x20style=\x22background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:10px;\x20overflow:hidden;\x22><div\x20style=\x22padding:10px\x2014px;\x20font-size:11px;\x20text-transform:uppercase;\x20letter-spacing:.06em;\x20opacity:.45;\x20border-bottom:1px\x20solid\x20var(--okdb-app-border);\x22>Peer\x20Watermarks\x20—\x20as\x20seen\x20by\x20this\x20node</div><if\x20:=\x22peerRows.length\x20===\x200\x22><div\x20style=\x22padding:20px\x2014px;\x20font-size:12px;\x20opacity:.4;\x20text-align:center;\x22>No\x20peers\x20have\x20pulled\x20deltas\x20from\x20this\x20node\x20yet.\x20Watermarks\x20are\x20recorded\x20when\x20a\x20peer\x20sends\x20its\x20first\x20delta\x20request.</div></if><if\x20:=\x22peerRows.length\x20>\x200\x22><div\x20style=\x22overflow-x:auto;\x22><table\x20style=\x22width:100%;\x20border-collapse:collapse;\x20font-size:11px;\x22><thead><tr\x20style=\x22opacity:.45;\x22><th\x20style=\x22padding:8px\x2014px;\x20text-align:left;\x20font-weight:normal;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22>Peer</th><th\x20style=\x22padding:8px\x2014px;\x20text-align:left;\x20font-weight:normal;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22>Last\x20seen</th><th\x20style=\x22padding:8px\x2014px;\x20text-align:right;\x20font-weight:normal;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22>Status</th><th\x20style=\x22padding:8px\x2014px;\x20text-align:right;\x20font-weight:normal;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22\x20title=\x22Highest\x20clock\x20this\x20peer\x20has\x20confirmed\x20receiving\x20from\x20this\x20node,\x20per\x20environment.\x22>Confirmed\x20up\x20to</th><th\x20style=\x22padding:8px\x2014px;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22/></tr></thead><tbody><tr\x20as=\x22repeat\x22\x20:of=\x22peerRows\x22\x20let:item=\x22peer\x22><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20font-family:monospace;\x20color:var(--okdb-sky);\x20max-width:200px;\x20overflow:hidden;\x20text-overflow:ellipsis;\x20white-space:nowrap;\x22\x20:style=\x22isPinnedPeer(peer)\x20?\x20\x27color:var(--okdb-warning);\x27\x20:\x20\x27\x27\x22\x20:title=\x22peer.peer_id\x22>{{peer.peer_id.slice(0,\x2016)}}…</td><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20opacity:.7;\x22>{{fmtTime(peer.since_ms)}}</td><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x22><span\x20:style=\x22\x27font-size:10px;\x20padding:2px\x208px;\x20border-radius:999px;\x20border:1px\x20solid\x20\x27\x20+\x20statusBadge(peer).color\x20+\x20\x2744;\x20color:\x27\x20+\x20statusBadge(peer).color\x20+\x20\x27;\x20background:\x27\x20+\x20statusBadge(peer).bg\x22>{{statusBadge(peer).label}}</span></td><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x20font-family:monospace;\x20font-size:10px;\x20opacity:.7;\x22><for\x20:=\x22Object.entries(peer.envs\x20||\x20{}).filter(([k])\x20=>\x20k\x20!==\x20\x27~system\x27)\x22\x20let:entry><div>{{entry[0]}}:\x20{{fmtClock(entry[1])}}</div></for></td><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x22><button\x20@click=\x22forceResync(peer.peer_id)\x22\x20style=\x22font-size:10px;\x20padding:2px\x208px;\x20background:var(--okdb-danger-soft-bg);\x20border-color:var(--okdb-danger-soft-border);\x20color:var(--okdb-danger);\x22\x20title=\x22Reset\x20this\x20peer\x27s\x20watermark\x20to\x20zero\x20on\x20this\x20node.\x20Their\x20next\x20connection\x20will\x20require\x20a\x20full\x20snapshot\x20pull\x20from\x20this\x20node.\x22>Force\x20resync</button></td></tr></tbody></table></div></if></div></if><div\x20style=\x22font-size:11px;\x20opacity:.35;\x20line-height:1.6;\x22>The\x20GC\x20horizon\x20is\x20the\x20lowest\x20clock\x20any\x20healthy\x20peer\x20has\x20confirmed\x20receiving\x20from\x20this\x20node,\x20per\x20environment.\x20Entries\x20below\x20it\x20are\x20already\x20in\x20every\x20peer\x27s\x20local\x20store\x20and\x20are\x20safe\x20to\x20delete.\x20Stale\x20peers\x20are\x20excluded\x20so\x20an\x20offline\x20node\x20never\x20blocks\x20GC\x20indefinitely.\x20Each\x20cluster\x20node\x20maintains\x20its\x20own\x20watermarks\x20and\x20runs\x20GC\x20on\x20its\x20own\x20schedule.</div></div>','POST','444722cIjCje','horizonPinnedBy','filter','h\x20ago','error','env','stale'];_0x467d=function(){return _0x7cc5d0;};return _0x467d();}const _0x214b50=_0x5a1a;(function(_0x11b2e5,_0x4160c7){const _0x42a9b1=_0x5a1a,_0x977bcb=_0x11b2e5();while(!![]){try{const _0x3c5610=-parseInt(_0x42a9b1(0xe5))/0x1+parseInt(_0x42a9b1(0x101))/0x2*(parseInt(_0x42a9b1(0xe2))/0x3)+parseInt(_0x42a9b1(0xdc))/0x4+-parseInt(_0x42a9b1(0xdd))/0x5*(-parseInt(_0x42a9b1(0xdf))/0x6)+-parseInt(_0x42a9b1(0xf0))/0x7*(parseInt(_0x42a9b1(0xe9))/0x8)+parseInt(_0x42a9b1(0xec))/0x9+-parseInt(_0x42a9b1(0x10b))/0xa*(parseInt(_0x42a9b1(0xe1))/0xb);if(_0x3c5610===_0x4160c7)break;else _0x977bcb['push'](_0x977bcb['shift']());}catch(_0x2823c2){_0x977bcb['push'](_0x977bcb['shift']());}}}(_0x467d,0x3f4c5));function _0x5a1a(_0x855536,_0x124f0e){_0x855536=_0x855536-0xd7;const _0x467d08=_0x467d();let _0x5a1aa3=_0x467d08[_0x855536];return _0x5a1aa3;}export default{'tag':_0x214b50(0xf8),'unwrap':!0x0,'context':_0x21844e=>({'loading':!0x1,'error':null,'status':null,'running':!0x1,'runResult':null,'runError':null,async 'load'(){const _0x10bfb6=_0x214b50;this[_0x10bfb6(0x10a)]=!0x0,this[_0x10bfb6(0x105)]=null;try{const _0x282500=await fetch(__ENV__[_0x10bfb6(0xe3)]+_0x10bfb6(0xda)),_0x396b20=await _0x282500[_0x10bfb6(0x108)]();if(!_0x282500['ok'])throw new Error(_0x396b20?.[_0x10bfb6(0x105)]?.['message']||'Failed\x20to\x20load\x20GC\x20status');this[_0x10bfb6(0xf5)]=_0x396b20[_0x10bfb6(0xf6)]??_0x396b20[_0x10bfb6(0xe0)]??null;}catch(_0x5356ba){this[_0x10bfb6(0x105)]=_0x5356ba?.[_0x10bfb6(0xe4)]||String(_0x5356ba);}finally{this['loading']=!0x1;}},async 'runGc'(){const _0x5f1835=_0x214b50;if(!this[_0x5f1835(0xef)]){this['running']=!0x0,this[_0x5f1835(0xfe)]=null,this[_0x5f1835(0xe8)]=null;try{const _0x1bb1b1=await fetch(__ENV__['API']+_0x5f1835(0xf4),{'method':_0x5f1835(0x100)}),_0x2a1508=await _0x1bb1b1[_0x5f1835(0x108)]();if(!_0x1bb1b1['ok'])throw new Error(_0x2a1508?.['error']?.[_0x5f1835(0xe4)]||_0x5f1835(0xde));this[_0x5f1835(0xfe)]=_0x2a1508[_0x5f1835(0xf6)]??_0x2a1508[_0x5f1835(0xe0)]??null,await this[_0x5f1835(0xfd)]();}catch(_0x1eca9c){this[_0x5f1835(0xe8)]=_0x1eca9c?.[_0x5f1835(0xe4)]||String(_0x1eca9c);}finally{this['running']=!0x1;}}},async 'forceResync'(_0x5d6cf5){const _0x41edc2=_0x214b50;try{const _0x3fac37=await fetch(__ENV__[_0x41edc2(0xe3)]+_0x41edc2(0xfc)+encodeURIComponent(_0x5d6cf5)+_0x41edc2(0xeb),{'method':'POST'}),_0x397dc2=await _0x3fac37[_0x41edc2(0x108)]();if(!_0x3fac37['ok'])throw new Error(_0x397dc2?.['error']?.[_0x41edc2(0xe4)]||_0x41edc2(0xd9));await this[_0x41edc2(0xfd)]();}catch(_0x56851d){this[_0x41edc2(0x105)]=_0x56851d?.[_0x41edc2(0xe4)]||String(_0x56851d);}},'fmtClock':_0x232f92=>null==_0x232f92?'—':Number(_0x232f92)[_0x214b50(0xfb)](),'fmtTime'(_0x253242){const _0x28fdf0=_0x214b50;if(!_0x253242)return'—';const _0x322eaa=Math[_0x28fdf0(0x109)](_0x253242/0x5265c00),_0x235c08=Math[_0x28fdf0(0x109)](_0x253242%0x5265c00/0x36ee80),_0xeb0883=Math['floor'](_0x253242%0x36ee80/0xea60);return _0x322eaa>0x0?_0x322eaa+_0x28fdf0(0xf9):_0x235c08>0x0?_0x235c08+_0x28fdf0(0x104):_0xeb0883>0x0?_0xeb0883+_0x28fdf0(0xe6):_0x28fdf0(0xed);},'statusBadge':_0x140040=>_0x140040[_0x214b50(0x107)]?{'label':_0x214b50(0xdb),'color':_0x214b50(0xfa),'bg':_0x214b50(0x10e)}:{'label':_0x214b50(0xf3),'color':_0x214b50(0xf2),'bg':'#4ade8018'},get 'envRows'(){const _0x3aa940=_0x214b50;return(this[_0x3aa940(0xf5)]?.[_0x3aa940(0xf1)]??[])[_0x3aa940(0x103)](_0x938ea7=>_0x3aa940(0xd8)!==_0x938ea7[_0x3aa940(0x106)]);},get 'peerRows'(){const _0x4d40d0=_0x214b50;return this[_0x4d40d0(0xf5)]?.['peers']??[];},get 'horizonPinnedBy'(){const _0x3ad588=_0x214b50,_0x40c2a7={};for(const _0x1cf3f5 of this[_0x3ad588(0xf7)]){if(!_0x1cf3f5[_0x3ad588(0xee)])continue;const _0x4927fe=this['peerRows'][_0x3ad588(0x103)](_0x3dff5e=>!_0x3dff5e[_0x3ad588(0x107)]&&null!=_0x3dff5e[_0x3ad588(0xf1)]?.[_0x1cf3f5[_0x3ad588(0x106)]])['sort']((_0x5a68a8,_0x736f7)=>(_0x5a68a8[_0x3ad588(0xf1)][_0x1cf3f5[_0x3ad588(0x106)]]||0x0)-(_0x736f7['envs'][_0x1cf3f5['env']]||0x0));_0x40c2a7[_0x1cf3f5[_0x3ad588(0x106)]]=_0x4927fe[0x0]?.[_0x3ad588(0xe7)]??null;}return _0x40c2a7;},'isPinnedPeer'(_0x3fc84a){const _0x4fa34b=_0x214b50;return!!_0x3fc84a?.[_0x4fa34b(0xe7)]&&Object[_0x4fa34b(0xd7)](this[_0x4fa34b(0x102)])[_0x4fa34b(0xea)](_0x3fc84a[_0x4fa34b(0xe7)]);},get 'stalenessLimit'(){const _0x145524=_0x214b50,_0x4e43d4=this[_0x145524(0xf5)]?.[_0x145524(0x10d)];return _0x4e43d4?Math[_0x145524(0x10c)](_0x4e43d4/0x5265c00)+'d':null;}}),async 'mount'(){const _0x5c6f2f=_0x214b50;await this[_0x5c6f2f(0xfd)]();},'template':_0x214b50(0xff)};
1
+ const _0x1f0fdd=_0x357d;function _0x1580(){const _0x3948b2=['error','172CiLJSF','/sync/gc/peer/','load','806213qftFXD','stale','#f59e0b18','413aeLlAM','h\x20ago','sync-retention','/resync','POST','env','result','674055hJFhLU','438sMqEcU','runError','message','Healthy','25385wWCAQq','var(--okdb-warning)','toLocaleString','horizonPinnedBy','120edAACL','json','peers','Failed\x20to\x20load\x20GC\x20status','/sync/gc/status','API','1403941tLUFYk','status','filter','runResult','just\x20now','running','477492hrmcrr','Force\x20resync\x20failed','150184bydrYa','<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:16px;\x22><div\x20style=\x22display:flex;\x20align-items:center;\x20gap:10px;\x22><div\x20style=\x22flex:1;\x22><div\x20style=\x22font-weight:600;\x20font-size:15px;\x22>Changelog\x20GC\x20—\x20this\x20node</div><div\x20style=\x22font-size:11px;\x20opacity:.4;\x20margin-top:3px;\x20display:flex;\x20align-items:center;\x20gap:10px;\x20flex-wrap:wrap;\x22><span>Runs\x20automatically\x20when\x20peer\x20watermarks\x20advance.</span><if\x20:=\x22stalenessLimit\x22><span\x20style=\x22font-family:monospace;\x20opacity:.8;\x22>stale\x20after:\x20{{stalenessLimit}}</span></if><span>Each\x20cluster\x20node\x20manages\x20its\x20own\x20changelog\x20independently.</span></div></div><button\x20@click=\x22load()\x22\x20:disabled=\x22loading\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x22>{{\x20loading\x20?\x20\x27Loading…\x27\x20:\x20\x27Refresh\x27\x20}}</button>\x20<button\x20@click=\x22runGc()\x22\x20:disabled=\x22running\x22\x20style=\x22font-size:11px;\x20padding:3px\x2010px;\x20background:#1a3a20;\x20border-color:#2a6a30;\x20color:#6ee08a;\x22\x20title=\x22Immediately\x20sweep\x20this\x20node\x27s\x20changelog\x20across\x20all\x20environments.\x20Other\x20cluster\x20nodes\x20are\x20unaffected.\x22>{{\x20running\x20?\x20\x27Running…\x27\x20:\x20\x27Run\x20GC\x20now\x27\x20}}</button></div><if\x20:=\x22error\x22><div\x20style=\x22font-size:12px;\x20color:var(--okdb-danger);\x20background:var(--okdb-danger-soft-bg);\x20border:1px\x20solid\x20var(--okdb-danger-soft-border);\x20border-radius:8px;\x20padding:10px\x2012px;\x22>{{error}}</div></if><if\x20:=\x22runResult\x22><div\x20style=\x22font-size:12px;\x20color:var(--okdb-success);\x20background:#0f2a1a;\x20border:1px\x20solid\x20#1a5a30;\x20border-radius:8px;\x20padding:10px\x2012px;\x22>GC\x20complete\x20—\x20removed\x20{{runResult.removed?.toLocaleString()\x20??\x200}}\x20entries\x20across\x20all\x20environments\x20({{runResult.durationMs}}ms)</div></if><if\x20:=\x22runError\x22><div\x20style=\x22font-size:12px;\x20color:var(--okdb-danger);\x20background:var(--okdb-danger-soft-bg);\x20border:1px\x20solid\x20var(--okdb-danger-soft-border);\x20border-radius:8px;\x20padding:10px\x2012px;\x22>{{runError}}</div></if><if\x20:=\x22status\x20&&\x20envRows.length\x22><div\x20style=\x22background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:10px;\x20overflow:hidden;\x22><div\x20style=\x22padding:10px\x2014px;\x20font-size:11px;\x20text-transform:uppercase;\x20letter-spacing:.06em;\x20opacity:.45;\x20border-bottom:1px\x20solid\x20var(--okdb-app-border);\x22>Per-Environment\x20Changelog</div><div\x20style=\x22display:grid;\x20grid-template-columns:1fr\x201fr\x201fr\x201fr;\x20font-size:11px;\x22><div\x20style=\x22padding:8px\x2014px;\x20opacity:.45;\x22>Env</div><div\x20style=\x22padding:8px\x2014px;\x20opacity:.45;\x20text-align:right;\x22>Entries</div><div\x20style=\x22padding:8px\x2014px;\x20opacity:.45;\x20text-align:right;\x22>Current\x20clock</div><div\x20style=\x22padding:8px\x2014px;\x20opacity:.45;\x20text-align:right;\x22\x20title=\x22Lowest\x20clock\x20all\x20healthy\x20peers\x20have\x20confirmed\x20receiving\x20from\x20this\x20node.\x20Entries\x20below\x20this\x20are\x20safe\x20to\x20delete.\x22>GC\x20horizon</div><for\x20:=\x22envRows\x22\x20let:env><div\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20font-family:monospace;\x20color:var(--okdb-sky);\x22>{{env.env}}</div><div\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x20font-family:monospace;\x22>{{(env.entryCount\x20??\x200).toLocaleString()}}</div><div\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x20font-family:monospace;\x20opacity:.7;\x22>{{fmtClock(env.currentClock)}}</div><div\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x20font-family:monospace;\x22\x20:style=\x22env.gcHorizon\x20>\x200\x20?\x20\x27color:var(--okdb-success);\x27\x20:\x20\x27opacity:.35;\x27\x22>{{env.gcHorizon\x20>\x200\x20?\x20fmtClock(env.gcHorizon)\x20:\x20\x27no\x20peers\x20synced\x20yet\x27}}</div></for></div></div></if><if\x20:=\x22status\x22><div\x20style=\x22background:var(--okdb-app-bg-deep);\x20border:1px\x20solid\x20var(--okdb-app-border);\x20border-radius:10px;\x20overflow:hidden;\x22><div\x20style=\x22padding:10px\x2014px;\x20font-size:11px;\x20text-transform:uppercase;\x20letter-spacing:.06em;\x20opacity:.45;\x20border-bottom:1px\x20solid\x20var(--okdb-app-border);\x22>Peer\x20Watermarks\x20—\x20as\x20seen\x20by\x20this\x20node</div><if\x20:=\x22peerRows.length\x20===\x200\x22><div\x20style=\x22padding:20px\x2014px;\x20font-size:12px;\x20opacity:.4;\x20text-align:center;\x22>No\x20peers\x20have\x20pulled\x20deltas\x20from\x20this\x20node\x20yet.\x20Watermarks\x20are\x20recorded\x20when\x20a\x20peer\x20sends\x20its\x20first\x20delta\x20request.</div></if><if\x20:=\x22peerRows.length\x20>\x200\x22><div\x20style=\x22overflow-x:auto;\x22><table\x20style=\x22width:100%;\x20border-collapse:collapse;\x20font-size:11px;\x22><thead><tr\x20style=\x22opacity:.45;\x22><th\x20style=\x22padding:8px\x2014px;\x20text-align:left;\x20font-weight:normal;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22>Peer</th><th\x20style=\x22padding:8px\x2014px;\x20text-align:left;\x20font-weight:normal;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22>Last\x20seen</th><th\x20style=\x22padding:8px\x2014px;\x20text-align:right;\x20font-weight:normal;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22>Status</th><th\x20style=\x22padding:8px\x2014px;\x20text-align:right;\x20font-weight:normal;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22\x20title=\x22Highest\x20clock\x20this\x20peer\x20has\x20confirmed\x20receiving\x20from\x20this\x20node,\x20per\x20environment.\x22>Confirmed\x20up\x20to</th><th\x20style=\x22padding:8px\x2014px;\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface);\x22/></tr></thead><tbody><tr\x20as=\x22repeat\x22\x20:of=\x22peerRows\x22\x20let:item=\x22peer\x22><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20font-family:monospace;\x20color:var(--okdb-sky);\x20max-width:200px;\x20overflow:hidden;\x20text-overflow:ellipsis;\x20white-space:nowrap;\x22\x20:style=\x22isPinnedPeer(peer)\x20?\x20\x27color:var(--okdb-warning);\x27\x20:\x20\x27\x27\x22\x20:title=\x22peer.peer_id\x22>{{peer.peer_id.slice(0,\x2016)}}…</td><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20opacity:.7;\x22>{{fmtTime(peer.since_ms)}}</td><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x22><span\x20:style=\x22\x27font-size:10px;\x20padding:2px\x208px;\x20border-radius:999px;\x20border:1px\x20solid\x20\x27\x20+\x20statusBadge(peer).color\x20+\x20\x2744;\x20color:\x27\x20+\x20statusBadge(peer).color\x20+\x20\x27;\x20background:\x27\x20+\x20statusBadge(peer).bg\x22>{{statusBadge(peer).label}}</span></td><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x20font-family:monospace;\x20font-size:10px;\x20opacity:.7;\x22><for\x20:=\x22Object.entries(peer.envs\x20||\x20{}).filter(([k])\x20=>\x20k\x20!==\x20\x27~system\x27)\x22\x20let:entry><div>{{entry[0]}}:\x20{{fmtClock(entry[1])}}</div></for></td><td\x20style=\x22padding:8px\x2014px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface);\x20text-align:right;\x22><button\x20@click=\x22forceResync(peer.peer_id)\x22\x20style=\x22font-size:10px;\x20padding:2px\x208px;\x20background:var(--okdb-danger-soft-bg);\x20border-color:var(--okdb-danger-soft-border);\x20color:var(--okdb-danger);\x22\x20title=\x22Reset\x20this\x20peer\x27s\x20watermark\x20to\x20zero\x20on\x20this\x20node.\x20Their\x20next\x20connection\x20will\x20require\x20a\x20full\x20snapshot\x20pull\x20from\x20this\x20node.\x22>Force\x20resync</button></td></tr></tbody></table></div></if></div></if><div\x20style=\x22font-size:11px;\x20opacity:.35;\x20line-height:1.6;\x22>The\x20GC\x20horizon\x20is\x20the\x20lowest\x20clock\x20any\x20healthy\x20peer\x20has\x20confirmed\x20receiving\x20from\x20this\x20node,\x20per\x20environment.\x20Entries\x20below\x20it\x20are\x20already\x20in\x20every\x20peer\x27s\x20local\x20store\x20and\x20are\x20safe\x20to\x20delete.\x20Stale\x20peers\x20are\x20excluded\x20so\x20an\x20offline\x20node\x20never\x20blocks\x20GC\x20indefinitely.\x20Each\x20cluster\x20node\x20maintains\x20its\x20own\x20watermarks\x20and\x20runs\x20GC\x20on\x20its\x20own\x20schedule.</div></div>','envs','Stale','103905ktZwvR','peer_id','data','floor','m\x20ago','sort'];_0x1580=function(){return _0x3948b2;};return _0x1580();}(function(_0x47d80b,_0x254875){const _0x41ab82=_0x357d,_0x14ca8c=_0x47d80b();while(!![]){try{const _0x3669c2=parseInt(_0x41ab82(0xb0))/0x1+parseInt(_0x41ab82(0xcf))/0x2+-parseInt(_0x41ab82(0xa6))/0x3*(-parseInt(_0x41ab82(0xad))/0x4)+parseInt(_0x41ab82(0xbf))/0x5*(parseInt(_0x41ab82(0xbb))/0x6)+parseInt(_0x41ab82(0xb3))/0x7*(-parseInt(_0x41ab82(0xd1))/0x8)+parseInt(_0x41ab82(0xba))/0x9*(-parseInt(_0x41ab82(0xc3))/0xa)+-parseInt(_0x41ab82(0xc9))/0xb;if(_0x3669c2===_0x254875)break;else _0x14ca8c['push'](_0x14ca8c['shift']());}catch(_0x2e0131){_0x14ca8c['push'](_0x14ca8c['shift']());}}}(_0x1580,0xbc35b));function _0x357d(_0x2c3387,_0x4d0b5c){_0x2c3387=_0x2c3387-0xa3;const _0x158082=_0x1580();let _0x357d1b=_0x158082[_0x2c3387];return _0x357d1b;}export default{'tag':_0x1f0fdd(0xb5),'unwrap':!0x0,'context':_0x119359=>({'loading':!0x1,'error':null,'status':null,'running':!0x1,'runResult':null,'runError':null,async 'load'(){const _0xfc0adc=_0x1f0fdd;this['loading']=!0x0,this[_0xfc0adc(0xac)]=null;try{const _0x55670d=await fetch(__ENV__[_0xfc0adc(0xc8)]+_0xfc0adc(0xc7)),_0x120402=await _0x55670d[_0xfc0adc(0xc4)]();if(!_0x55670d['ok'])throw new Error(_0x120402?.[_0xfc0adc(0xac)]?.[_0xfc0adc(0xbd)]||_0xfc0adc(0xc6));this[_0xfc0adc(0xca)]=_0x120402[_0xfc0adc(0xa8)]??_0x120402[_0xfc0adc(0xb9)]??null;}catch(_0x1ab7df){this[_0xfc0adc(0xac)]=_0x1ab7df?.[_0xfc0adc(0xbd)]||String(_0x1ab7df);}finally{this['loading']=!0x1;}},async 'runGc'(){const _0x3890ba=_0x1f0fdd;if(!this[_0x3890ba(0xce)]){this[_0x3890ba(0xce)]=!0x0,this['runResult']=null,this[_0x3890ba(0xbc)]=null;try{const _0x2179a0=await fetch(__ENV__[_0x3890ba(0xc8)]+'/sync/gc/run',{'method':_0x3890ba(0xb7)}),_0x427bdc=await _0x2179a0[_0x3890ba(0xc4)]();if(!_0x2179a0['ok'])throw new Error(_0x427bdc?.['error']?.[_0x3890ba(0xbd)]||'GC\x20run\x20failed');this[_0x3890ba(0xcc)]=_0x427bdc['data']??_0x427bdc[_0x3890ba(0xb9)]??null,await this[_0x3890ba(0xaf)]();}catch(_0x4e31fc){this[_0x3890ba(0xbc)]=_0x4e31fc?.['message']||String(_0x4e31fc);}finally{this[_0x3890ba(0xce)]=!0x1;}}},async 'forceResync'(_0x4d7b10){const _0x16e8c3=_0x1f0fdd;try{const _0x359a56=await fetch(__ENV__['API']+_0x16e8c3(0xae)+encodeURIComponent(_0x4d7b10)+_0x16e8c3(0xb6),{'method':_0x16e8c3(0xb7)}),_0x4487c2=await _0x359a56[_0x16e8c3(0xc4)]();if(!_0x359a56['ok'])throw new Error(_0x4487c2?.[_0x16e8c3(0xac)]?.[_0x16e8c3(0xbd)]||_0x16e8c3(0xd0));await this[_0x16e8c3(0xaf)]();}catch(_0x267988){this[_0x16e8c3(0xac)]=_0x267988?.[_0x16e8c3(0xbd)]||String(_0x267988);}},'fmtClock':_0x3a179f=>null==_0x3a179f?'—':Number(_0x3a179f)[_0x1f0fdd(0xc1)](),'fmtTime'(_0x417112){const _0x5c8511=_0x1f0fdd;if(!_0x417112)return'—';const _0x3c48cf=Math[_0x5c8511(0xa9)](_0x417112/0x5265c00),_0xf41474=Math[_0x5c8511(0xa9)](_0x417112%0x5265c00/0x36ee80),_0x19ddb8=Math[_0x5c8511(0xa9)](_0x417112%0x36ee80/0xea60);return _0x3c48cf>0x0?_0x3c48cf+'d\x20ago':_0xf41474>0x0?_0xf41474+_0x5c8511(0xb4):_0x19ddb8>0x0?_0x19ddb8+_0x5c8511(0xaa):_0x5c8511(0xcd);},'statusBadge':_0x417b50=>_0x417b50['stale']?{'label':_0x1f0fdd(0xa5),'color':_0x1f0fdd(0xc0),'bg':_0x1f0fdd(0xb2)}:{'label':_0x1f0fdd(0xbe),'color':'var(--okdb-success)','bg':'#4ade8018'},get 'envRows'(){const _0x1e1ec7=_0x1f0fdd;return(this[_0x1e1ec7(0xca)]?.['envs']??[])[_0x1e1ec7(0xcb)](_0x1374a1=>'~system'!==_0x1374a1[_0x1e1ec7(0xb8)]);},get 'peerRows'(){const _0x42eaa4=_0x1f0fdd;return this[_0x42eaa4(0xca)]?.[_0x42eaa4(0xc5)]??[];},get 'horizonPinnedBy'(){const _0x1fa7a6=_0x1f0fdd,_0x47a5d0={};for(const _0x1a8f7a of this['envRows']){if(!_0x1a8f7a['gcHorizon'])continue;const _0x4daae8=this['peerRows'][_0x1fa7a6(0xcb)](_0x317526=>!_0x317526[_0x1fa7a6(0xb1)]&&null!=_0x317526['envs']?.[_0x1a8f7a['env']])[_0x1fa7a6(0xab)]((_0xe616b2,_0xd5a065)=>(_0xe616b2[_0x1fa7a6(0xa4)][_0x1a8f7a[_0x1fa7a6(0xb8)]]||0x0)-(_0xd5a065['envs'][_0x1a8f7a['env']]||0x0));_0x47a5d0[_0x1a8f7a[_0x1fa7a6(0xb8)]]=_0x4daae8[0x0]?.[_0x1fa7a6(0xa7)]??null;}return _0x47a5d0;},'isPinnedPeer'(_0xfc2f8f){const _0x5256bd=_0x1f0fdd;return!!_0xfc2f8f?.['peer_id']&&Object['values'](this[_0x5256bd(0xc2)])['includes'](_0xfc2f8f[_0x5256bd(0xa7)]);},get 'stalenessLimit'(){const _0x38f55c=_0x1f0fdd,_0x2cf4cc=this[_0x38f55c(0xca)]?.['peerStalenessLimitMs'];return _0x2cf4cc?Math['round'](_0x2cf4cc/0x5265c00)+'d':null;}}),async 'mount'(){await this['load']();},'template':_0x1f0fdd(0xa3)};