@kedem/okdb 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +57 -0
- package/README.md +344 -0
- package/banner.jpg +0 -0
- package/bin/okdb.js +2 -0
- package/docs/OKDB-ARCHITECTURE.md +1036 -0
- package/docs/auth-and-sync.md +558 -0
- package/docs/auth-permissions.md +143 -0
- package/docs/change-log.md +169 -0
- package/docs/data-model.md +174 -0
- package/docs/embeddings.md +338 -0
- package/docs/files.md +131 -0
- package/docs/fts.md +139 -0
- package/docs/functions.md +514 -0
- package/docs/getting-started.md +233 -0
- package/docs/http-api.md +705 -0
- package/docs/index.md +115 -0
- package/docs/indexes.md +207 -0
- package/docs/logging.md +116 -0
- package/docs/manifest.json +38 -0
- package/docs/migration.md +154 -0
- package/docs/pipelines.md +598 -0
- package/docs/plugins.md +144 -0
- package/docs/querying.md +204 -0
- package/docs/queue.md +637 -0
- package/docs/sync.md +156 -0
- package/docs/transactions.md +140 -0
- package/docs/ttl.md +375 -0
- package/okdb.js +1 -0
- package/package.json +26 -0
- package/public/admin-app.js +1 -0
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/components/admin-route-host.ok.js +1 -0
- package/public/components/env-picker.ok.js +1 -0
- package/public/components/field-path-input.ok.js +1 -0
- package/public/components/field.html +6 -0
- package/public/components/geo-map.ok.js +1 -0
- package/public/components/ok-cron-input.ok.js +1 -0
- package/public/components/ok-dropzone.ok.js +1 -0
- package/public/components/ok-js-input.ok.js +1 -0
- package/public/components/ok-json-input.ok.js +1 -0
- package/public/components/ok-text-monaco-input.ok.js +1 -0
- package/public/components/theme-toggle.ok.js +1 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/images/logo.png +0 -0
- package/public/images/logo.svg +333 -0
- package/public/index.html +6 -0
- package/public/layouts/_default.ok.html +1 -0
- package/public/layouts/okdb-cube.ok.html +1 -0
- package/public/login-app.js +1 -0
- package/public/login.html +1 -0
- package/public/modules/ok.js +1 -0
- package/public/sections/api/index.ok.html +1 -0
- package/public/sections/api/parts/api-endpoint.ok.js +1 -0
- package/public/sections/auth/index.ok.html +1 -0
- package/public/sections/auth/modals/create-token-modal.ok.js +1 -0
- package/public/sections/auth/modals/edit-token-modal.ok.js +1 -0
- package/public/sections/auth/modals/perm-info-popover.ok.js +1 -0
- package/public/sections/auth/parts/token-detail.ok.js +1 -0
- package/public/sections/auth/parts/token-list.ok.js +1 -0
- package/public/sections/db/index.ok.html +1 -0
- package/public/sections/db/modals/add-item-modal.ok.js +1 -0
- package/public/sections/db/modals/create-env-modal.ok.js +1 -0
- package/public/sections/db/modals/create-fts-modal.ok.js +1 -0
- package/public/sections/db/modals/create-index-modal.ok.js +1 -0
- package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -0
- package/public/sections/db/modals/demo-env-modal.ok.js +1 -0
- package/public/sections/db/modals/remove-env-modal.ok.js +1 -0
- package/public/sections/db/modals/schema-edit-modal.ok.js +1 -0
- package/public/sections/db/parts/db-overview.ok.js +1 -0
- package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -0
- package/public/sections/db/parts/edit-row.ok.js +1 -0
- package/public/sections/db/parts/tm-timeline.ok.js +1 -0
- package/public/sections/db/parts/type-changelog.ok.js +1 -0
- package/public/sections/db/parts/type-list.ok.js +1 -0
- package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -0
- package/public/sections/db/parts/type-schema-tab.ok.js +1 -0
- package/public/sections/db/parts/type-viewer.ok.js +1 -0
- package/public/sections/db/parts/type-violations-tab.ok.js +1 -0
- package/public/sections/docs/index.ok.html +1 -0
- package/public/sections/embeddings/index.ok.html +1 -0
- package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-overview.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -0
- package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -0
- package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -0
- package/public/sections/embeddings/parts/engines-overview.ok.js +1 -0
- package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -0
- package/public/sections/engines/engine-panel-shared-style.js +1 -0
- package/public/sections/engines/engine-ui-utils.js +1 -0
- package/public/sections/engines/index.ok.html +1 -0
- package/public/sections/engines/modals/engine-modal.ok.js +1 -0
- package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -0
- package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -0
- package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -0
- package/public/sections/engines/parts/engine-resource-card.ok.js +1 -0
- package/public/sections/engines/parts/engine-row-item.ok.js +1 -0
- package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -0
- package/public/sections/files/index.ok.html +1 -0
- package/public/sections/files/parts/files-blob-status.ok.js +1 -0
- package/public/sections/files/parts/files-collection-list.ok.js +1 -0
- package/public/sections/files/parts/files-collection-panel.ok.js +1 -0
- package/public/sections/files/parts/files-file-list.ok.js +1 -0
- package/public/sections/files/parts/files-overview.ok.js +1 -0
- package/public/sections/files/parts/files-path-browser.ok.js +1 -0
- package/public/sections/files/parts/files-upload-panel.ok.js +1 -0
- package/public/sections/functions/index.ok.html +1 -0
- package/public/sections/functions/modals/function-modal.ok.js +1 -0
- package/public/sections/functions/parts/function-detail.ok.js +1 -0
- package/public/sections/functions/parts/function-logs.ok.js +1 -0
- package/public/sections/functions/parts/function-runner.ok.js +1 -0
- package/public/sections/functions/parts/functions-list.ok.js +1 -0
- package/public/sections/license/index.ok.html +1 -0
- package/public/sections/license/parts/license-panel.ok.js +1 -0
- package/public/sections/processors/index.ok.html +1 -0
- package/public/sections/queue/index.ok.html +1 -0
- package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -0
- package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -0
- package/public/sections/queue/modals/edit-job-modal.ok.js +1 -0
- package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -0
- package/public/sections/queue/modals/job-type-modal.ok.js +1 -0
- package/public/sections/queue/parts/ok-job-form.ok.js +1 -0
- package/public/sections/queue/parts/queue-buckets.ok.js +1 -0
- package/public/sections/queue/parts/queue-job-types.ok.js +1 -0
- package/public/sections/queue/parts/queue-jobs.ok.js +1 -0
- package/public/sections/queue/parts/queue-types.ok.js +1 -0
- package/public/sections/queue/parts/queue-workers.ok.js +1 -0
- package/public/sections/sync/index.ok.html +5 -0
- package/public/sections/sync/parts/sync-node-detail.ok.js +1 -0
- package/public/sections/sync/parts/sync-retention.ok.js +1 -0
- package/public/sections/sync/parts/sync-topology.ok.js +1 -0
- package/public/sections/system/index.ok.html +1 -0
- package/public/sections/system/modals/data-ops-modal.ok.js +1 -0
- package/public/sections/system/parts/system-api-panel.ok.js +1 -0
- package/public/sections/system/parts/system-auth-panel.ok.js +1 -0
- package/public/sections/system/parts/system-log-history.ok.js +1 -0
- package/public/sections/system/parts/system-log.ok.js +1 -0
- package/public/sections/system/parts/system-status.ok.js +1 -0
- package/public/sections/system/parts/system-sync-panel.ok.js +1 -0
- package/public/sections/views/index.ok.html +1 -0
- package/public/sections/views/modals/create-view-modal.ok.js +1 -0
- package/public/sections/views/parts/view-detail.ok.js +1 -0
- package/public/sections/views/parts/views-list.ok.js +1 -0
- package/public/sections/views/parts/views-overview.ok.js +1 -0
- package/public/setup-app.js +1 -0
- package/public/setup.html +1 -0
- package/public/site.webmanifest +1 -0
- package/public/stores/auth-store.js +1 -0
- package/public/stores/events-store.js +1 -0
- package/public/stores/functions-store.js +1 -0
- package/public/stores/okdb-store.js +1 -0
- package/public/stores/theme-store.js +1 -0
- package/public/styles.css +1 -0
- package/public/test-cron-input.html +10 -0
- package/public/test-json-input.html +101 -0
- package/public/util/permissions.js +1 -0
- package/public/util/sift-schema.js +1 -0
- package/public/vendor/okjs/ok.esm.min.js +2 -0
- package/public/vendor/okjs/toolkit/behavior/async.ok.js +1 -0
- package/public/vendor/okjs/toolkit/components/ok-chart.ok.js +1 -0
- package/public/vendor/okjs/toolkit/components/ok-doc-viewer.ok.js +1 -0
- package/public/vendor/okjs/toolkit/components/ok-marked.ok.js +1 -0
- package/public/vendor/okjs/toolkit/components/ok-monaco.ok.js +1 -0
- package/public/vendor/okjs/toolkit/core/ok-layer-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/core/ok-layer.ok.js +1 -0
- package/public/vendor/okjs/toolkit/core/ok-overlay.ok.js +1 -0
- package/public/vendor/okjs/toolkit/core/ok-sandbox.ok.js +1 -0
- package/public/vendor/okjs/toolkit/core/transition.ok.js +1 -0
- package/public/vendor/okjs/toolkit/core/virtualized.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-console-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-console.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-fps-monitor-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-fps-monitor.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-inspector-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-inspector.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-js-tree.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-timeline-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/devtools/ok-timeline.ok.js +1 -0
- package/public/vendor/okjs/toolkit/docs/doc-viewer.ok.js +1 -0
- package/public/vendor/okjs/toolkit/editor/ok-live-component.ok.js +1 -0
- package/public/vendor/okjs/toolkit/editor/ok-live-example.ok.js +1 -0
- package/public/vendor/okjs/toolkit/editor/ok-live-shell.ok.js +1 -0
- package/public/vendor/okjs/toolkit/elements/ok-dropdown.ok.js +1 -0
- package/public/vendor/okjs/toolkit/elements/ok-icon.ok.js +1 -0
- package/public/vendor/okjs/toolkit/elements/ok-select.ok.js +1 -0
- package/public/vendor/okjs/toolkit/elements/ok-table.ok.js +1 -0
- package/public/vendor/okjs/toolkit/errors/ok-crash-boundary.ok.js +1 -0
- package/public/vendor/okjs/toolkit/errors/ok-crash-info.ok.js +1 -0
- package/public/vendor/okjs/toolkit/i18n/i18n-editor-examples.ok.js +1 -0
- package/public/vendor/okjs/toolkit/i18n/i18n-editor.ok.js +1 -0
- package/public/vendor/okjs/toolkit/i18n/i18n-key-editor-tips.ok.js +1 -0
- package/public/vendor/okjs/toolkit/i18n/i18n-key-editor.ok.js +1 -0
- package/public/vendor/okjs/toolkit/i18n/i18n-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/i18n/ok-i18n.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-contextmenu.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-dismiss-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-draggable.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-flyover-panel.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-flyover.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-highlight-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-highlight.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-hotkeys-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-picker-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-popout-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-popout.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-portal-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/interaction/ok-submenu.ok.js +1 -0
- package/public/vendor/okjs/toolkit/layout/ok-resizer.ok.js +1 -0
- package/public/vendor/okjs/toolkit/manifest.js +1 -0
- package/public/vendor/okjs/toolkit/modals/ok-modal-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/modals/ok-modal.ok.js +1 -0
- package/public/vendor/okjs/toolkit/modals/ok-toast-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/modals/ok-window.ok.js +1 -0
- package/public/vendor/okjs/toolkit/navigation/hash-router.ok.js +1 -0
- package/public/vendor/okjs/toolkit/navigation/history-router.ok.js +1 -0
- package/public/vendor/okjs/toolkit/navigation/router.ok.js +1 -0
- package/public/vendor/okjs/toolkit/sync/reactive-sync-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/sync/reactive-sync.js +1 -0
- package/public/vendor/okjs/toolkit/theming/blocks/ok-design-button.css.js +1 -0
- package/public/vendor/okjs/toolkit/theming/blocks/ok-design-input.css.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-design-style.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-design-vars.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-design.ok.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-input.ok.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-service.ok.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-style.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-utils.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-variable.ok.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor-vm.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-theme-editor/ok-theme-editor.ok.js +1 -0
- package/public/vendor/okjs/toolkit/theming/ok-theme.ok.js +1 -0
- package/public/view-models/type-query-vm.js +1 -0
- package/types/environment.d.ts +130 -0
- package/types/errors.d.ts +98 -0
- package/types/features/admin.d.ts +4 -0
- package/types/features/api.d.ts +18 -0
- package/types/features/auth.d.ts +31 -0
- package/types/features/embeddings.d.ts +39 -0
- package/types/features/engines.d.ts +23 -0
- package/types/features/files.d.ts +29 -0
- package/types/features/fts.d.ts +25 -0
- package/types/features/functions.d.ts +23 -0
- package/types/features/mcp.d.ts +17 -0
- package/types/features/pipelines.d.ts +19 -0
- package/types/features/queue.d.ts +189 -0
- package/types/features/sync.d.ts +34 -0
- package/types/features/time-machine.d.ts +32 -0
- package/types/features/views.d.ts +16 -0
- package/types/index.d.ts +153 -0
- package/types/options.d.ts +202 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x2d3087=_0x585e;function _0x585e(_0x7f0260,_0x25b897){_0x7f0260=_0x7f0260-0xf9;const _0x5ac416=_0x5ac4();let _0x585e5d=_0x5ac416[_0x7f0260];return _0x585e5d;}(function(_0x4ece03,_0x11c7e3){const _0x2da219=_0x585e,_0xa6c743=_0x4ece03();while(!![]){try{const _0x5ec3db=-parseInt(_0x2da219(0x10c))/0x1+-parseInt(_0x2da219(0x118))/0x2+parseInt(_0x2da219(0x122))/0x3*(-parseInt(_0x2da219(0x11b))/0x4)+-parseInt(_0x2da219(0x130))/0x5+parseInt(_0x2da219(0x121))/0x6*(-parseInt(_0x2da219(0x12f))/0x7)+parseInt(_0x2da219(0x12a))/0x8+-parseInt(_0x2da219(0x106))/0x9*(-parseInt(_0x2da219(0x131))/0xa);if(_0x5ec3db===_0x11c7e3)break;else _0xa6c743['push'](_0xa6c743['shift']());}catch(_0x5b4cdb){_0xa6c743['push'](_0xa6c743['shift']());}}}(_0x5ac4,0x7f163));function _0x5ac4(){const _0x177fe1=['priority','isArray','idempotency_key','9qAoExo','type','map','initialType','timestamp','job','369081sCgIsV','getTime','form-change','filter','payloadInit','data','when','slice','loadBuckets','cron','apiBase','__create__','1326522nsBWDG','buckets','modal','20qknPhH','trim','tokens','backoff','backoff_multiplier','json','1851516vDtSKj','356463FHqyGi','retryDelay','asap','bucketOptions','idempotencyKey','payload','split','join','2322832smajRm','\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:10px;\x22>\x0a\x0a\x20\x20<!--\x20Row\x201:\x20type\x20+\x20priority\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:flex-end;\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22flex:1;\x22><label>Type</label>\x0a\x20\x20\x20\x20\x20\x20<input\x20placeholder=\x22e.g.\x20email.send\x22\x20:value=\x22type\x22\x20@input=\x22type\x20=\x20$el.value\x22\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22width:120px;\x22><label>Priority</label>\x0a\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20placeholder=\x220\x22\x20:value=\x22priority\x22\x20@input=\x22priority\x20=\x20Number($el.value)\x22\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Row\x202:\x20tags\x20+\x20idempotency\x20key\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:flex-end;\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22flex:1;\x22><label>Tags</label>\x0a\x20\x20\x20\x20\x20\x20<input\x20placeholder=\x22comma\x20separated\x22\x20:value=\x22tags\x22\x20@input=\x22tags\x20=\x20$el.value\x22\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20<label>Idempotency\x20Key</label>\x0a\x20\x20\x20\x20\x20\x20<input\x20type=\x22text\x22\x20placeholder=\x22optional\x20—\x20prevents\x20duplicate\x20jobs\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22idempotencyKey\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22idempotencyKey\x20=\x20$el.value\x22\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Buckets\x20-->\x0a\x20\x20<div\x20class=\x22field\x22>\x0a\x20\x20\x20\x20<label>Buckets\x20<span\x20style=\x22opacity:.4;\x20font-weight:400;\x20font-size:11px;\x22>(rate\x20limiting)</span></label>\x0a\x20\x20\x20\x20<each\x20:of=\x22buckets\x22\x20let:item=\x22b\x22\x20let:index=\x22i\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:6px;\x20align-items:center;\x20margin-bottom:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<select\x20style=\x22flex:1;\x22\x20@change=\x22onBucketSelect(i,\x20$el.value)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20none\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20as=\x22repeat\x22\x20:of=\x22bucketOptions\x22\x20let:item=\x22opt\x22\x20:value=\x22opt.id\x22\x20:selected=\x22opt.id\x20===\x20b.id\x22>{{\x20opt.id\x20}}</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22__create__\x22>+\x20Create\x20bucket…</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<input\x20style=\x22width:72px;\x22\x20type=\x22number\x22\x20min=\x221\x22\x20placeholder=\x22tokens\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22b.tokens\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22setBucketTokens(i,\x20$el.value)\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22btn-ghost\x22\x20@click=\x22removeBucket(i)\x22\x20title=\x22Remove\x22>✕</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20<button\x20class=\x22btn-ghost\x20btn-ghost--sm\x22\x20@click=\x22addBucket()\x22\x20style=\x22margin-top:2px;\x22>+\x20Add\x20bucket</button>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Row\x203:\x20when\x20+\x20max\x20tries\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:flex-end;\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22flex:1;\x22>\x0a\x20\x20\x20\x20\x20\x20<label>When</label>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:4px;\x20align-items:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22whenMode===\x27asap\x27\x20?\x20\x27mode-btn\x20mode-btn--on\x27\x20:\x20\x27mode-btn\x27\x22\x20@click=\x22whenMode=\x27asap\x27\x22>ASAP</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22whenMode===\x27datetime\x27\x20?\x20\x27mode-btn\x20mode-btn--on\x27\x20:\x20\x27mode-btn\x27\x22\x20@click=\x22whenMode=\x27datetime\x27\x22>Date</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22whenMode===\x27timestamp\x27\x20?\x20\x27mode-btn\x20mode-btn--on\x27\x20:\x20\x27mode-btn\x27\x22\x20@click=\x22whenMode=\x27timestamp\x27\x22>TS</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22whenMode\x20===\x20\x27datetime\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22datetime-local\x22\x20style=\x22flex:1;\x22\x20:value=\x22whenDatetime\x22\x20@input=\x22whenDatetime\x20=\x20$el.value\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22whenMode\x20===\x20\x27timestamp\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20style=\x22flex:1;\x22\x20placeholder=\x22ms\x20timestamp\x22\x20:value=\x22whenTs\x22\x20@input=\x22whenTs\x20=\x20$el.value\x20===\x20\x27\x27\x20?\x20null\x20:\x20Number($el.value)\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22whenMode\x20===\x20\x27asap\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.5;\x20font-size:12px;\x20padding:0\x208px;\x22>Run\x20immediately</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22width:120px;\x22><label>Max\x20tries</label>\x0a\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20placeholder=\x22unlimited\x22\x20:value=\x22maxTries\x22\x20@input=\x22maxTries\x20=\x20$el.value\x20===\x20\x27\x27\x20?\x20null\x20:\x20Number($el.value)\x22\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Row\x204:\x20retry\x20delay\x20+\x20backoff\x20+\x20cron\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:flex-end;\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22flex:1;\x22><label>Retry\x20delay\x20(ms)</label>\x0a\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20placeholder=\x220\x22\x20:value=\x22retryDelay\x22\x20@input=\x22retryDelay\x20=\x20Number($el.value)\x22\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22width:120px;\x22><label>Backoff\x20multiplier</label>\x0a\x20\x20\x20\x20\x20\x20<input\x20type=\x22number\x22\x20step=\x220.1\x22\x20placeholder=\x221\x22\x20:value=\x22backoff\x22\x20@input=\x22backoff\x20=\x20Number($el.value)\x22\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22field\x22\x20style=\x22flex:1;\x22><label>Cron</label>\x0a\x20\x20\x20\x20\x20\x20<ok-cron-input\x20:value=\x22cron\x22\x20placeholder=\x22optional\x22\x20@change=\x22cron\x20=\x20$event.detail\x22\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Payload\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20<span\x20style=\x22opacity:.7;\x20font-size:12px;\x22>Payload</span>\x0a\x20\x20\x20\x20<ok-json-input\x0a\x20\x20\x20\x20\x20\x20mode=\x22textarea\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22height:260px;\x22\x0a\x20\x20\x20\x20\x20\x20:value=\x22payloadInit\x22\x0a\x20\x20\x20\x20\x20\x20@edit=\x22payload\x20=\x20$event.detail\x22\x0a\x20\x20\x20\x20/>\x0a\x20\x20</div>\x0a\x0a</div>\x0a','bucket','_emitChange','_populateFromJob','7MkvQtX','3516765MNITyo','28685790thqoyy','max_tries','length','.mode-btn{font-size:11px;padding:2px\x208px;opacity:.6;border-radius:4px}.mode-btn--on{opacity:1;background:color-mix(in\x20srgb,var(--okdb-accent)\x2013%,transparent);border-color:color-mix(in\x20srgb,var(--okdb-accent)\x2033%,transparent);color:var(--okdb-accent)}.btn-ghost{background:0\x200;border:1px\x20solid\x20var(--okdb-app-border);border-radius:5px;color:inherit;cursor:pointer;opacity:.6;padding:2px\x208px;font-size:12px}.btn-ghost:hover{opacity:1;border-color:color-mix(in\x20srgb,var(--okdb-accent)\x2033%,transparent)}.btn-ghost--sm{font-size:11px;padding:1px\x207px}','tags','getWhen','$attr','maxTries','shared','now','dispatchEvent','max','bucket_tokens','whenTs','<create-bucket-modal\x20:modal=\x22modal\x22\x20:on-done=\x22onDone\x22\x20/>','whenMode','toISOString','whenDatetime'];_0x5ac4=function(){return _0x177fe1;};return _0x5ac4();}import _0x396823 from'../../../components/ok-cron-input.ok.js';import _0x8e07ee from'../../../components/ok-json-input.ok.js';import _0x4230bc from'../modals/create-bucket-modal.ok.js';import _0x2d6392 from'../../../stores/okdb-store.js';export default{'tag':'ok-job-form','dependencies':[_0x396823,_0x8e07ee,_0x4230bc],'attr':{'job':{},'initialType':{}},'context':_0x5b03db=>({'type':'','payloadInit':{},'payload':{},'when':null,'whenMode':_0x2d3087(0x124),'whenDatetime':'','whenTs':null,'priority':0x0,'maxTries':null,'retryDelay':0x0,'backoff':0x1,'tags':'','buckets':[],'cron':'','idempotencyKey':'','bucketOptions':[],async 'loadBuckets'(){const _0xaa8e5c=_0x2d3087;try{const _0x9ce4a5=await fetch(_0x2d6392[_0xaa8e5c(0x116)]+'/queue/buckets'),_0x3c7c1d=await _0x9ce4a5[_0xaa8e5c(0x120)]();this[_0xaa8e5c(0x125)]=_0x3c7c1d?.[_0xaa8e5c(0x111)]??[];}catch{this[_0xaa8e5c(0x125)]=[];}},async 'onBucketSelect'(_0xd07c6d,_0x4c8774){const _0x4d3995=_0x2d3087;if(_0x4d3995(0x117)===_0x4c8774){const _0x18faed=this;await _0x5b03db['$ok'][_0x4d3995(0xf9)][_0x4d3995(0x11a)]['open']({'owner':_0x5b03db,'title':'Add\x20Token\x20Bucket','content':_0x4d3995(0xff),'context':_0x2b4aa0=>({'modal':_0x2b4aa0,'onDone':async _0x37264b=>{const _0x45c62f=_0x4d3995;await _0x18faed['loadBuckets'](),_0x18faed[_0x45c62f(0x119)]=_0x18faed['buckets'][_0x45c62f(0x108)]((_0x7050fa,_0x19ef21)=>_0x19ef21===_0xd07c6d?{..._0x7050fa,'id':_0x37264b}:_0x7050fa);}})});}else this[_0x4d3995(0x119)]=this[_0x4d3995(0x119)][_0x4d3995(0x108)]((_0x4c66b0,_0x55eb86)=>_0x55eb86===_0xd07c6d?{..._0x4c66b0,'id':_0x4c8774}:_0x4c66b0);},'setBucketTokens'(_0x5d4ccc,_0xb77807){const _0x254568=_0x2d3087,_0x1e7304=''===_0xb77807?0x1:Math[_0x254568(0xfc)](0x1,parseInt(_0xb77807)||0x1);this[_0x254568(0x119)]=this[_0x254568(0x119)][_0x254568(0x108)]((_0x136237,_0x1b833d)=>_0x1b833d===_0x5d4ccc?{..._0x136237,'tokens':_0x1e7304}:_0x136237);},'addBucket'(){const _0x208360=_0x2d3087;this['buckets']=[...this[_0x208360(0x119)],{'id':'','tokens':0x1}];},'removeBucket'(_0x53b925){const _0x298538=_0x2d3087;this[_0x298538(0x119)]=this[_0x298538(0x119)][_0x298538(0x10f)]((_0x50c637,_0x43d53f)=>_0x43d53f!==_0x53b925);},'getWhen'(){const _0xc3e3a1=_0x2d3087;if('asap'===this[_0xc3e3a1(0x100)])return null;if('datetime'===this[_0xc3e3a1(0x100)]){const _0x233453=new Date(this[_0xc3e3a1(0x102)]);return isNaN(_0x233453['getTime']())?null:_0x233453[_0xc3e3a1(0x10d)]();}return this[_0xc3e3a1(0xfe)];},'_parseTags'(_0x45549d){const _0x23a511=_0x2d3087;if(!_0x45549d)return;const _0x5efbb4=String(_0x45549d)[_0x23a511(0x128)](',')[_0x23a511(0x108)](_0x1f86fa=>_0x1f86fa[_0x23a511(0x11c)]())['filter'](Boolean);return _0x5efbb4[_0x23a511(0x133)]?_0x5efbb4:void 0x0;},'_emitChange'(){const _0x1dd243=_0x2d3087,_0x573cd1=this[_0x1dd243(0x136)](),_0x1f44bf=String(this[_0x1dd243(0x115)]||'')[_0x1dd243(0x11c)]();_0x5b03db['$el'][_0x1dd243(0xfb)](new CustomEvent(_0x1dd243(0x10e),{'bubbles':!0x1,'detail':{'type':String(this[_0x1dd243(0x107)]||'')[_0x1dd243(0x11c)](),'payload':this[_0x1dd243(0x127)],'priority':Number(this[_0x1dd243(0x103)])||0x0,'retry_delay':Number(this[_0x1dd243(0x123)])||0x0,'backoff_multiplier':Number(this[_0x1dd243(0x11e)])||0x1,'max_tries':null!==this['maxTries']&&''!==this[_0x1dd243(0x138)]?Number(this[_0x1dd243(0x138)]):null,'buckets':this['buckets'][_0x1dd243(0x10f)](_0xf72827=>_0xf72827['id'])[_0x1dd243(0x108)](_0x5aa508=>({'id':_0x5aa508['id'],'tokens':_0x5aa508['tokens']||0x1})),'when':_0x573cd1,'cron':_0x1f44bf||null,'tags':this['_parseTags'](this[_0x1dd243(0x135)]),'idempotency_key':this[_0x1dd243(0x126)]||null}}));},'_populateFromJob'(_0x213c59){const _0x44b2d7=_0x2d3087;if(!_0x213c59)return this[_0x44b2d7(0x107)]='',this[_0x44b2d7(0x110)]={},this['payload']={},this['when']=null,this[_0x44b2d7(0x100)]='asap',this['whenDatetime']='',this[_0x44b2d7(0xfe)]=null,this[_0x44b2d7(0x103)]=0x0,this['maxTries']=null,this['retryDelay']=0x0,this['backoff']=0x1,this[_0x44b2d7(0x135)]='',this['buckets']=[{'id':'','tokens':0x1}],this[_0x44b2d7(0x115)]='',this[_0x44b2d7(0x126)]='',void this[_0x44b2d7(0x12d)]();this[_0x44b2d7(0x107)]=_0x213c59?.['type']??'',this[_0x44b2d7(0x110)]=_0x213c59?.['payload']??{},this[_0x44b2d7(0x127)]=_0x213c59?.[_0x44b2d7(0x127)]??{},this['when']=_0x213c59?.[_0x44b2d7(0x112)]??null,this[_0x44b2d7(0x103)]=_0x213c59?.[_0x44b2d7(0x103)]??0x0,this['maxTries']=_0x213c59?.[_0x44b2d7(0x132)]??null,this['retryDelay']=_0x213c59?.['retry_delay']??0x0,this[_0x44b2d7(0x11e)]=_0x213c59?.[_0x44b2d7(0x11f)]??0x1,this['tags']=Array[_0x44b2d7(0x104)](_0x213c59?.[_0x44b2d7(0x135)])?_0x213c59['tags'][_0x44b2d7(0x129)](',\x20'):'',this['cron']=_0x213c59?.['cron']??'',this['idempotencyKey']=_0x213c59?.[_0x44b2d7(0x105)]||'',_0x213c59?.[_0x44b2d7(0x112)]&&_0x213c59['when']>Date[_0x44b2d7(0xfa)]()-0x3e8?(this['whenMode']=_0x44b2d7(0x10a),this[_0x44b2d7(0x102)]=new Date(_0x213c59[_0x44b2d7(0x112)])[_0x44b2d7(0x101)]()[_0x44b2d7(0x113)](0x0,0x10),this[_0x44b2d7(0xfe)]=_0x213c59[_0x44b2d7(0x112)]):(this[_0x44b2d7(0x100)]=_0x44b2d7(0x124),this[_0x44b2d7(0x102)]='',this[_0x44b2d7(0xfe)]=null),Array[_0x44b2d7(0x104)](_0x213c59?.[_0x44b2d7(0x119)])&&_0x213c59[_0x44b2d7(0x119)]['length']>0x0?this['buckets']=_0x213c59['buckets']['map'](_0x516bd7=>({'id':_0x516bd7['id'],'tokens':_0x516bd7[_0x44b2d7(0x11d)]??0x1})):this[_0x44b2d7(0x119)]=_0x213c59?.[_0x44b2d7(0x12c)]?[{'id':_0x213c59[_0x44b2d7(0x12c)],'tokens':_0x213c59[_0x44b2d7(0xfd)]??0x1}]:[],this[_0x44b2d7(0x12d)]();}}),async 'mount'(_0x1f597b){const _0x51bff4=_0x2d3087;await this[_0x51bff4(0x114)](),this[_0x51bff4(0x12e)](_0x1f597b[_0x51bff4(0x137)][_0x51bff4(0x10b)]??null),_0x1f597b['$attr'][_0x51bff4(0x109)]&&(this['type']=_0x1f597b[_0x51bff4(0x137)][_0x51bff4(0x109)]),setTimeout(()=>this[_0x51bff4(0x12d)](),0x0);},'watch':{'job'(_0x17be13){const _0x37021f=_0x2d3087;this[_0x37021f(0x12e)](_0x17be13);},'type'(){const _0x2902ba=_0x2d3087;this[_0x2902ba(0x12d)]();},'payload'(){const _0x56e0b3=_0x2d3087;this[_0x56e0b3(0x12d)]();},'priority'(){const _0x2cab78=_0x2d3087;this[_0x2cab78(0x12d)]();},'retryDelay'(){this['_emitChange']();},'backoff'(){this['_emitChange']();},'maxTries'(){const _0x580bdf=_0x2d3087;this[_0x580bdf(0x12d)]();},'buckets'(){const _0x1a8b2f=_0x2d3087;this[_0x1a8b2f(0x12d)]();},'whenMode'(){this['_emitChange']();},'whenDatetime'(){const _0x3737f0=_0x2d3087;this[_0x3737f0(0x12d)]();},'whenTs'(){const _0x4a4d0b=_0x2d3087;this[_0x4a4d0b(0x12d)]();},'cron'(){const _0x2655f2=_0x2d3087;this[_0x2655f2(0x12d)]();},'tags'(){const _0x48c317=_0x2d3087;this[_0x48c317(0x12d)]();},'idempotencyKey'(){const _0x15151c=_0x2d3087;this[_0x15151c(0x12d)]();}},'template':_0x2d3087(0x12b),'style':_0x2d3087(0x134)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x1a2964=_0x120f;function _0x120f(_0x3c1c8d,_0x15e273){_0x3c1c8d=_0x3c1c8d-0x1bd;const _0x374302=_0x3743();let _0x120fce=_0x374302[_0x3c1c8d];return _0x120fce;}function _0x3743(){const _0x2860e1=['Edit\x20Bucket','min','capacity','3583822beIzOZ','confirm','buckets','shared','\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:16px;\x20height:100%;\x20min-height:0;\x22>\x0a\x0a\x20\x20<!--\x20Toolbar\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20align-items:center;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-weight:600;\x20font-size:16px;\x22>Token\x20Buckets</div>\x0a\x20\x20\x20\x20<div\x20style=\x22margin-left:auto;\x20display:flex;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22load()\x22\x20:disabled=\x22busy\x22>↻\x20Refresh</button>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openCreate()\x22\x20style=\x22background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2013%,\x20transparent);\x20border-color:var(--okdb-accent);\x20color:var(--okdb-accent);\x22>+\x20Add\x20Bucket</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:13px;\x20padding:10px\x2012px;\x20border:1px\x20solid\x20var(--okdb-danger);\x20border-radius:8px;\x22>{{error}}</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Empty\x20state\x20-->\x0a\x20\x20<if\x20:=\x22!busy\x20&&\x20buckets.length\x20===\x200\x20&&\x20!error\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22opacity:.55;\x20font-size:13px;\x20line-height:1.8;\x20padding:16px\x200;\x22>\x0a\x20\x20\x20\x20\x20\x20No\x20token\x20buckets\x20defined.<br>\x0a\x20\x20\x20\x20\x20\x20Token\x20buckets\x20let\x20you\x20rate-limit\x20queue\x20job\x20processing\x20per\x20bucket\x20ID.\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20Bucket\x20cards\x20-->\x0a\x20\x20<div\x20style=\x22display:grid;\x20grid-template-columns:repeat(auto-fill,minmax(280px,1fr));\x20gap:12px;\x20overflow:auto;\x20min-height:0;\x22>\x0a\x20\x20\x20\x20<for\x20:=\x22buckets\x22\x20let:b>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:#1e2326;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border:1px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-radius:12px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:14px\x2016px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20gap:10px;\x0a\x20\x20\x20\x20\x20\x20\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Header\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-weight:600;\x20font-family:monospace;\x20font-size:13px;\x20flex:1;\x20overflow:hidden;\x20text-overflow:ellipsis;\x20white-space:nowrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{b.id}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openEdit(b)\x22\x20style=\x22font-size:11px;\x20padding:3px\x208px;\x20opacity:.8;\x22>Edit</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22remove(b)\x22\x20style=\x22font-size:11px;\x20padding:3px\x208px;\x20color:var(--okdb-danger);\x20opacity:.8;\x22>✕</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Token\x20bar\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20justify-content:space-between;\x20font-size:12px;\x20margin-bottom:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.7;\x22>Tokens</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27color:\x27\x20+\x20pctColor(tokenPct(b))\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{b.tokens}}\x20/\x20{{b.capacity}}\x20({{tokenPct(b)}}%)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22height:6px;\x20background:var(--okdb-app-border);\x20border-radius:999px;\x20overflow:hidden;\x22>\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:style=\x22\x27height:100%;\x20border-radius:999px;\x20width:\x27\x20+\x20tokenPct(b)\x20+\x20\x27%;\x20background:\x27\x20+\x20pctColor(tokenPct(b))\x20+\x20\x27;\x20transition:width\x200.3s;\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Stats\x20row\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:12px;\x20font-size:12px;\x20opacity:.75;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Refill:\x20<b>{{refillLabel(b)}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Actions\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22refill(b)\x22\x20style=\x22font-size:11px;\x20flex:1;\x22\x20:disabled=\x22b.tokens\x20>=\x20b.capacity\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Refill\x20to\x20Full\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</for>\x0a\x20\x20</div>\x0a\x0a</div>\x0a','application/json','</b>\x22?','2989508Rldgvz','Failed\x20to\x20load\x20buckets','json','var(--okdb-success)','busy','refill_every','success','Deleted\x20\x22','Refill\x20failed','Delete\x20failed','apiBase','error','$ok','data','queue-buckets','round','tokens','/queue/bucket/update/','55857550FQPrBN','\x20/\x20','toast','info','570471gUdRfX','Add\x20Token\x20Bucket','1239ImhSsb','8228295VdqYHi','okdb','297MpsuRo','open','49144UMYMHL','modal','1740ZJCpeK','3ARbjXE','load','selectedEnv','<edit-bucket-modal\x20:modal=\x22modal\x22\x20:edit-mode=\x22editMode\x22\x20:initial-form=\x22initialForm\x22\x20:on-done=\x22onDone\x22\x20/>','stores','var(--okdb-warning)','/queue/buckets','toFixed','refill_amount','message','/queue/bucket/remove/','POST'];_0x3743=function(){return _0x2860e1;};return _0x3743();}(function(_0x4522eb,_0x1cf8aa){const _0x577d0f=_0x120f,_0x2e71ad=_0x4522eb();while(!![]){try{const _0xe949bf=-parseInt(_0x577d0f(0x1cb))/0x1+-parseInt(_0x577d0f(0x1e4))/0x2+-parseInt(_0x577d0f(0x1d5))/0x3*(parseInt(_0x577d0f(0x1eb))/0x4)+-parseInt(_0x577d0f(0x1ce))/0x5+parseInt(_0x577d0f(0x1d4))/0x6*(-parseInt(_0x577d0f(0x1cd))/0x7)+-parseInt(_0x577d0f(0x1d2))/0x8*(-parseInt(_0x577d0f(0x1d0))/0x9)+parseInt(_0x577d0f(0x1c7))/0xa;if(_0xe949bf===_0x1cf8aa)break;else _0x2e71ad['push'](_0x2e71ad['shift']());}catch(_0x2cab8a){_0x2e71ad['push'](_0x2e71ad['shift']());}}}(_0x3743,0xefade));import _0x5063fe from'../modals/edit-bucket-modal.ok.js';import _0x9b4b4f from'../../../stores/okdb-store.js';export default{'tag':_0x1a2964(0x1c3),'dependencies':[_0x5063fe],'context':_0x417816=>({'busy':!0x1,'buckets':[],'error':null,async 'load'(){const _0x52b6aa=_0x1a2964;this['busy']=!0x0,this[_0x52b6aa(0x1c0)]=null;try{const _0x4b8ed7=await fetch(_0x9b4b4f[_0x52b6aa(0x1bf)]+_0x52b6aa(0x1db)),_0xd5b75b=await _0x4b8ed7[_0x52b6aa(0x1ed)]();if(!_0x4b8ed7['ok'])throw new Error(_0xd5b75b?.[_0x52b6aa(0x1c0)]?.['message']||_0x52b6aa(0x1ec));this[_0x52b6aa(0x1e6)]=_0xd5b75b[_0x52b6aa(0x1c2)]??[];}catch(_0x3d97c8){this['error']=_0x3d97c8?.[_0x52b6aa(0x1de)]||String(_0x3d97c8),this[_0x52b6aa(0x1e6)]=[];}finally{this[_0x52b6aa(0x1ef)]=!0x1;}},async 'openCreate'(){const _0x9b0b24=_0x1a2964;await _0x417816[_0x9b0b24(0x1c1)][_0x9b0b24(0x1e7)][_0x9b0b24(0x1d3)]['open']({'owner':_0x417816,'title':_0x9b0b24(0x1cc),'content':_0x9b0b24(0x1d8),'context':_0x1b353b=>({'modal':_0x1b353b,'editMode':!0x1,'initialForm':{},'onDone':async()=>{const _0x2cba05=_0x9b0b24;await this[_0x2cba05(0x1d6)]();}})});},async 'openEdit'(_0x427901){const _0xe4d2c6=_0x1a2964;await _0x417816[_0xe4d2c6(0x1c1)][_0xe4d2c6(0x1e7)]['modal'][_0xe4d2c6(0x1d1)]({'owner':_0x417816,'title':_0xe4d2c6(0x1e1),'content':_0xe4d2c6(0x1d8),'context':_0x355f4b=>({'modal':_0x355f4b,'editMode':!0x0,'initialForm':{'id':_0x427901['id'],'capacity':_0x427901[_0xe4d2c6(0x1e3)],'tokens':_0x427901['tokens'],'refill_amount':_0x427901['refill_amount']??0x0,'refill_every':_0x427901[_0xe4d2c6(0x1f0)]??0x0},'onDone':async()=>{const _0xcc2588=_0xe4d2c6;await this[_0xcc2588(0x1d6)]();}})});},async 'remove'(_0x21a273){const _0x2ad734=_0x1a2964;if(await _0x417816[_0x2ad734(0x1c1)][_0x2ad734(0x1e7)][_0x2ad734(0x1d3)][_0x2ad734(0x1e5)]('Delete\x20bucket\x20\x22<b>'+_0x21a273['id']+_0x2ad734(0x1ea)))try{if(!(await fetch(_0x9b4b4f[_0x2ad734(0x1bf)]+_0x2ad734(0x1df)+encodeURIComponent(_0x21a273['id']),{'method':'POST'}))['ok'])throw new Error(_0x2ad734(0x1be));_0x417816[_0x2ad734(0x1c1)][_0x2ad734(0x1e7)]?.[_0x2ad734(0x1c9)]?.[_0x2ad734(0x1ca)]?.(_0x2ad734(0x1f2)+_0x21a273['id']+'\x22'),await this[_0x2ad734(0x1d6)]();}catch(_0x3f864f){_0x417816['$ok']['shared']?.[_0x2ad734(0x1c9)]?.[_0x2ad734(0x1c0)]?.(_0x3f864f?.[_0x2ad734(0x1de)]||_0x2ad734(0x1be));}},async 'refill'(_0x561e44){const _0x7782cf=_0x1a2964;try{if(!(await fetch(_0x9b4b4f[_0x7782cf(0x1bf)]+_0x7782cf(0x1c6)+encodeURIComponent(_0x561e44['id']),{'method':_0x7782cf(0x1e0),'headers':{'Content-Type':_0x7782cf(0x1e9)},'body':JSON['stringify']({'tokens':_0x561e44[_0x7782cf(0x1e3)]})}))['ok'])throw new Error(_0x7782cf(0x1bd));_0x417816['$ok']['shared']?.['toast']?.[_0x7782cf(0x1f1)]?.('Refilled\x20\x22'+_0x561e44['id']+'\x22'),await this[_0x7782cf(0x1d6)]();}catch(_0x54cd17){_0x417816[_0x7782cf(0x1c1)][_0x7782cf(0x1e7)]?.[_0x7782cf(0x1c9)]?.['error']?.(_0x54cd17?.['message']||_0x7782cf(0x1bd));}},'tokenPct':_0x1bf6bf=>_0x1bf6bf[_0x1a2964(0x1e3)]?Math[_0x1a2964(0x1e2)](0x64,Math[_0x1a2964(0x1c4)](_0x1bf6bf[_0x1a2964(0x1c5)]/_0x1bf6bf[_0x1a2964(0x1e3)]*0x64)):0x0,'pctColor':_0x4ff88b=>_0x4ff88b>0x3c?_0x1a2964(0x1ee):_0x4ff88b>0x19?_0x1a2964(0x1da):'var(--okdb-danger)','refillLabel'(_0x13dc65){const _0x2849b3=_0x1a2964;if(!_0x13dc65[_0x2849b3(0x1f0)]||!_0x13dc65[_0x2849b3(0x1dd)])return'No\x20refill';const _0x372080=_0x13dc65[_0x2849b3(0x1f0)];let _0x115ec5;return _0x115ec5=_0x372080>=0x36ee80?(_0x372080/0x36ee80)[_0x2849b3(0x1dc)](0x1)+'h':_0x372080>=0xea60?Math['round'](_0x372080/0xea60)+'m':Math[_0x2849b3(0x1c4)](_0x372080/0x3e8)+'s','+'+_0x13dc65['refill_amount']+_0x2849b3(0x1c8)+_0x115ec5;}}),async 'mount'(_0x285dc6){const _0x3eec98=_0x1a2964;await this['load'](),_0x285dc6['$watch'](()=>_0x285dc6[_0x3eec98(0x1c1)][_0x3eec98(0x1d9)][_0x3eec98(0x1cf)][_0x3eec98(0x1d7)],()=>this[_0x3eec98(0x1d6)]());},'template':_0x1a2964(0x1e8)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0x268e(_0x1c74be,_0x42737e){_0x1c74be=_0x1c74be-0x14a;const _0x178311=_0x1783();let _0x268e95=_0x178311[_0x1c74be];return _0x268e95;}const _0x494219=_0x268e;(function(_0x3931b4,_0x30bc80){const _0x43a73e=_0x268e,_0x183017=_0x3931b4();while(!![]){try{const _0x823819=parseInt(_0x43a73e(0x14e))/0x1*(-parseInt(_0x43a73e(0x17c))/0x2)+-parseInt(_0x43a73e(0x14d))/0x3+parseInt(_0x43a73e(0x175))/0x4+parseInt(_0x43a73e(0x165))/0x5*(-parseInt(_0x43a73e(0x17b))/0x6)+-parseInt(_0x43a73e(0x14a))/0x7*(-parseInt(_0x43a73e(0x173))/0x8)+-parseInt(_0x43a73e(0x181))/0x9+parseInt(_0x43a73e(0x168))/0xa;if(_0x823819===_0x30bc80)break;else _0x183017['push'](_0x183017['shift']());}catch(_0x39fd13){_0x183017['push'](_0x183017['shift']());}}}(_0x1783,0xea7e0));import _0x22d5c2 from'../../../stores/okdb-store.js';import _0x170c6d from'../modals/job-type-modal.ok.js';function _0x1783(){const _0x540464=['queue-job-types\x20load\x20error','11666925kZsnLz','message','Draining','max_concurrency','\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:16px;\x20padding:16px\x200;\x22>\x0a\x0a\x20\x20<!--\x20header\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:10px;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22font-size:14px;\x20font-weight:600;\x20flex:1;\x22>Registered\x20Job\x20Types</div>\x0a\x20\x20\x20\x20<button\x20@click=\x22load\x22\x20:disabled=\x22busy\x22\x20style=\x22opacity:.6;\x20font-size:11px;\x20padding:2px\x208px;\x22>↻</button>\x0a\x20\x20\x20\x20<button\x20@click=\x22openCreate()\x22\x20style=\x22font-size:12px;\x20padding:4px\x2012px;\x22>+\x20Register\x20type</button>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20error\x20state\x20-->\x0a\x20\x20<if\x20:=\x22loadError\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:#ef4444;\x20font-size:12px;\x20padding:8px\x2012px;\x20border:1px\x20solid\x20#ef4444;\x20border-radius:6px;\x20background:color-mix(in\x20srgb,\x20#ef4444\x208%,\x20transparent);\x22>\x0a\x20\x20\x20\x20\x20\x20Failed\x20to\x20load\x20job\x20types:\x20{{\x20loadError\x20}}\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20empty\x20state\x20-->\x0a\x20\x20<if\x20:=\x22!busy\x20&&\x20!loadError\x20&&\x20types.length\x20===\x200\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22opacity:.45;\x20font-size:13px;\x20line-height:1.8;\x20padding:32px\x200;\x20text-align:center;\x22>\x0a\x20\x20\x20\x20\x20\x20No\x20registered\x20job\x20types.<br>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:12px;\x22>Register\x20a\x20type\x20to\x20set\x20defaults,\x20control\x20concurrency,\x20and\x20pause/resume\x20claiming.</span>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20types\x20list\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20<each\x20:of=\x22types\x22\x20let:item=\x22jt\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22jt-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:10px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:13px;\x20font-weight:600;\x20flex:1;\x20min-width:0;\x20overflow:hidden;\x20text-overflow:ellipsis;\x20white-space:nowrap;\x22>{{\x20jt.id\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22status-badge\x22\x20:style=\x22\x27border-color:\x27\x20+\x20statusColor(jt.status)\x20+\x20\x27;\x20color:\x27\x20+\x20statusColor(jt.status)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20statusLabel(jt.status)\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22jt.payload_schema\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22status-badge\x22\x20style=\x22border-color:var(--okdb-accent);\x20color:var(--okdb-accent);\x22>schema</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22jt.payload_schema.enforce\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22status-badge\x22\x20style=\x22border-color:#ef4444;\x20color:#ef4444;\x22>enforced</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20lifecycle\x20actions\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22jt.status\x20!==\x20\x27paused\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22act-btn\x22\x20@click=\x22setStatus(jt,\x20\x27pause\x27)\x22\x20title=\x22Pause\x20—\x20stop\x20workers\x20from\x20claiming\x20new\x20jobs\x22>⏸\x20Pause</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22jt.status\x20===\x20\x27paused\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22act-btn\x20act-btn--accent\x22\x20@click=\x22setStatus(jt,\x20\x27resume\x27)\x22\x20title=\x22Resume\x20normal\x20claiming\x22>▶\x20Resume</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22jt.status\x20!==\x20\x27draining\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22act-btn\x22\x20@click=\x22setStatus(jt,\x20\x27drain\x27)\x22\x20title=\x22Drain\x20—\x20stop\x20new\x20enqueues,\x20let\x20queue\x20empty\x22>⬇\x20Drain</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22jt.status\x20===\x20\x27draining\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22act-btn\x20act-btn--accent\x22\x20@click=\x22setStatus(jt,\x20\x27resume\x27)\x22>▶\x20Resume</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22act-btn\x20act-btn--enqueue\x22\x20@click=\x22openEnqueue(jt)\x22>+\x20Enqueue</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22act-btn\x22\x20@click=\x22openEdit(jt)\x22>Edit</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22act-btn\x20act-btn--danger\x22\x20@click=\x22remove(jt)\x22>Remove</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20opacity:.55;\x20margin-top:4px;\x20font-family:monospace;\x22>{{\x20formatDefaults(jt)\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</each>\x0a\x20\x20</div>\x0a\x0a</div>\x0a','concurrency:','<enqueue-job-modal\x20:modal=\x22modal\x22\x20:initial-type=\x22initialType\x22\x20:on-done=\x22onDone\x22\x20/>','Job\x20enqueued','\x20job\x20type','result','color-mix(in\x20srgb,\x20#22c55e\x2080%,\x20transparent)','9938481FzqMZl','ttl:','pri:','4919217uCtRwP','1caKZeI','toast','Active','status','$watch','/queue/job-type/','tries:','var(--okdb-app-fg-muted)','load','bucketOptions','\x20\x20·\x20\x20','<job-type-modal\x20:modal=\x22modal\x22\x20:job-type=\x22jobType\x22\x20:bucket-options=\x22bucketOptions\x22\x20:on-done=\x22onDone\x22\x20/>','modal','json','data','color-mix(in\x20srgb,\x20#f59e0b\x2080%,\x20transparent)','HTTP\x20','Failed\x20to\x20load','error','open','catch','\x22?\x20Existing\x20jobs\x20are\x20unaffected.','types','7679015uCBRPF','shared','ttl','32799550WWglzE','busy','push','loadError','apiBase','retry_delay','$ok','Edit:\x20','queue-job-types','Failed\x20to\x20remove\x20job\x20type','selectedEnv','8lfMZVv','color-mix(in\x20srgb,\x20#3b82f6\x2080%,\x20transparent)','3309280VnysJG','failed','max_tries','delay:','Failed\x20to\x20','DELETE','6rlhlyl','189422cAiQBP','priority','Remove\x20job\x20type\x20\x22','<job-type-modal\x20:modal=\x22modal\x22\x20:job-type=\x22null\x22\x20:bucket-options=\x22bucketOptions\x22\x20:on-done=\x22onDone\x22\x20/>'];_0x1783=function(){return _0x540464;};return _0x1783();}import _0x45b3ba from'../modals/enqueue-job-modal.ok.js';const n={'active':_0x494219(0x150),'paused':'Paused','draining':_0x494219(0x183)},a={'active':_0x494219(0x18b),'paused':_0x494219(0x15d),'draining':_0x494219(0x174)};export default{'tag':_0x494219(0x170),'dependencies':[_0x170c6d,_0x45b3ba],'context':_0x36d5de=>({'busy':!0x1,'loadError':null,'types':[],'bucketOptions':[],async 'load'(){const _0x2c5d5e=_0x494219;this[_0x2c5d5e(0x169)]=!0x0,this[_0x2c5d5e(0x16b)]=null;try{const [_0x5c1bb1,_0x3f539a]=await Promise['all']([fetch(_0x22d5c2[_0x2c5d5e(0x16c)]+'/queue/job-types'),fetch(_0x22d5c2[_0x2c5d5e(0x16c)]+'/queue/buckets')[_0x2c5d5e(0x162)](()=>null)]);if(!_0x5c1bb1['ok']){const _0x4ef038=await _0x5c1bb1['json']()[_0x2c5d5e(0x162)](()=>({}));throw new Error(_0x4ef038?.['error']?.[_0x2c5d5e(0x182)]??_0x4ef038?.['message']??_0x2c5d5e(0x15e)+_0x5c1bb1[_0x2c5d5e(0x151)]);}const _0x5b55c6=await _0x5c1bb1[_0x2c5d5e(0x15b)]();this[_0x2c5d5e(0x164)]=_0x5b55c6?.[_0x2c5d5e(0x18a)]??_0x5b55c6?.[_0x2c5d5e(0x15c)]??[];const _0x2e6d90=_0x3f539a?.['ok']?await _0x3f539a['json']()['catch'](()=>({})):{};this['bucketOptions']=_0x2e6d90?.[_0x2c5d5e(0x18a)]??_0x2e6d90?.[_0x2c5d5e(0x15c)]??[];}catch(_0x1fae9d){console[_0x2c5d5e(0x160)](_0x2c5d5e(0x180),_0x1fae9d),this[_0x2c5d5e(0x16b)]=_0x1fae9d[_0x2c5d5e(0x182)]||_0x2c5d5e(0x15f),this[_0x2c5d5e(0x164)]=[];}finally{this[_0x2c5d5e(0x169)]=!0x1;}},'statusLabel':_0x55dcdf=>n[_0x55dcdf]??_0x55dcdf,'statusColor':_0x12e5d0=>a[_0x12e5d0]??_0x494219(0x155),'formatDefaults'(_0x2dc2b1){const _0x3b60ae=_0x494219,_0x2344f7=_0x2dc2b1['defaults']??{},_0x4d15ab=[];return null!=_0x2344f7[_0x3b60ae(0x177)]&&_0x4d15ab[_0x3b60ae(0x16a)](_0x3b60ae(0x154)+_0x2344f7['max_tries']),null!=_0x2344f7[_0x3b60ae(0x16d)]&&_0x4d15ab[_0x3b60ae(0x16a)](_0x3b60ae(0x178)+_0x2344f7[_0x3b60ae(0x16d)]+'ms'),null!=_0x2344f7['priority']&&_0x4d15ab['push'](_0x3b60ae(0x14c)+_0x2344f7[_0x3b60ae(0x17d)]),null!=_0x2344f7[_0x3b60ae(0x167)]&&_0x4d15ab['push'](_0x3b60ae(0x14b)+_0x2344f7[_0x3b60ae(0x167)]+'ms'),null!=_0x2dc2b1[_0x3b60ae(0x184)]&&_0x4d15ab[_0x3b60ae(0x16a)](_0x3b60ae(0x186)+_0x2dc2b1[_0x3b60ae(0x184)]),_0x4d15ab['join'](_0x3b60ae(0x158))||'—';},'openCreate'(){const _0x1a78a4=_0x494219,_0x25fab2=this;_0x36d5de[_0x1a78a4(0x16e)]['shared']['modal'][_0x1a78a4(0x161)]({'owner':_0x36d5de,'title':'Register\x20Job\x20Type','content':_0x1a78a4(0x17f),'context':_0x54af2c=>({'modal':_0x54af2c,'bucketOptions':_0x25fab2['bucketOptions'],'onDone':()=>_0x25fab2[_0x1a78a4(0x156)]()})});},'openEdit'(_0x4cce0f){const _0x50c19e=_0x494219;_0x36d5de['$ok'][_0x50c19e(0x166)][_0x50c19e(0x15a)]['open']({'owner':_0x36d5de,'title':_0x50c19e(0x16f)+_0x4cce0f['id'],'content':_0x50c19e(0x159),'context':_0x1be5eb=>({'modal':_0x1be5eb,'jobType':_0x4cce0f,'bucketOptions':this[_0x50c19e(0x157)],'onDone':()=>this[_0x50c19e(0x156)]()})});},async 'setStatus'(_0x34a4f6,_0x39db6f){const _0x68f47c=_0x494219;try{if(!(await fetch(_0x22d5c2[_0x68f47c(0x16c)]+_0x68f47c(0x153)+encodeURIComponent(_0x34a4f6['id'])+'/'+_0x39db6f,{'method':'POST'}))['ok'])throw new Error(_0x68f47c(0x176));await this[_0x68f47c(0x156)]();}catch{_0x36d5de[_0x68f47c(0x16e)][_0x68f47c(0x166)]?.[_0x68f47c(0x14f)]?.['error']?.(_0x68f47c(0x179)+_0x39db6f+_0x68f47c(0x189));}},'openEnqueue'(_0x5c76ff){const _0x4db09b=_0x494219;_0x36d5de['$ok'][_0x4db09b(0x166)][_0x4db09b(0x15a)][_0x4db09b(0x161)]({'owner':_0x36d5de,'title':'Enqueue\x20Job','content':_0x4db09b(0x187),'context':_0xd84186=>({'modal':_0xd84186,'initialType':_0x5c76ff['id'],'onDone':()=>_0x36d5de['$ok'][_0x4db09b(0x166)]?.[_0x4db09b(0x14f)]?.['success']?.(_0x4db09b(0x188))})});},async 'remove'(_0x228960){const _0x2c6e6d=_0x494219;if(await _0x36d5de['$ok'][_0x2c6e6d(0x166)][_0x2c6e6d(0x15a)]['confirm'](_0x2c6e6d(0x17e)+_0x228960['id']+_0x2c6e6d(0x163)))try{if(!(await fetch(_0x22d5c2[_0x2c6e6d(0x16c)]+'/queue/job-type/'+encodeURIComponent(_0x228960['id']),{'method':_0x2c6e6d(0x17a)}))['ok'])throw new Error(_0x2c6e6d(0x176));await this[_0x2c6e6d(0x156)]();}catch{_0x36d5de[_0x2c6e6d(0x16e)][_0x2c6e6d(0x166)]?.[_0x2c6e6d(0x14f)]?.[_0x2c6e6d(0x160)]?.(_0x2c6e6d(0x171));}}}),async 'mount'(_0x2a1f81){const _0x772f30=_0x494219;await this[_0x772f30(0x156)](),_0x2a1f81[_0x772f30(0x152)](()=>_0x22d5c2[_0x772f30(0x172)],()=>{const _0x3cfa06=_0x772f30;this[_0x3cfa06(0x164)]=[],this['load']();});},'template':_0x494219(0x185),'style':'.jt-card{border:1px\x20solid\x20var(--okdb-app-border);border-radius:8px;padding:10px\x2014px;background:var(--okdb-app-surface)}.status-badge{font-size:10px;padding:2px\x208px;border-radius:999px;border:1px\x20solid;font-weight:600;letter-spacing:.04em}.act-btn{font-size:11px;padding:2px\x208px;border-radius:5px;border:1px\x20solid\x20var(--okdb-app-border);background:0\x200;cursor:pointer;color:var(--okdb-app-fg-muted)}.act-btn:hover{border-color:var(--okdb-app-fg-muted);color:var(--okdb-app-fg)}.act-btn--accent,.act-btn--enqueue{border-color:color-mix(in\x20srgb,var(--okdb-accent)\x2040%,transparent);color:var(--okdb-accent)}.act-btn--danger:hover{border-color:#ef4444;color:#ef4444}.act-btn--enqueue{border-color:color-mix(in\x20srgb,var(--okdb-accent)\x2030%,transparent)}.act-btn--enqueue:hover{border-color:var(--okdb-accent)}'};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x221c7d=_0x4cba;(function(_0x2b6bc0,_0x58a169){const _0x3f26ae=_0x4cba,_0x4a96b3=_0x2b6bc0();while(!![]){try{const _0x21cf56=-parseInt(_0x3f26ae(0x1fe))/0x1*(parseInt(_0x3f26ae(0x1cb))/0x2)+parseInt(_0x3f26ae(0x1fa))/0x3+-parseInt(_0x3f26ae(0x218))/0x4+-parseInt(_0x3f26ae(0x233))/0x5+-parseInt(_0x3f26ae(0x203))/0x6*(parseInt(_0x3f26ae(0x1db))/0x7)+-parseInt(_0x3f26ae(0x208))/0x8*(parseInt(_0x3f26ae(0x1f5))/0x9)+parseInt(_0x3f26ae(0x1d2))/0xa;if(_0x21cf56===_0x58a169)break;else _0x4a96b3['push'](_0x4a96b3['shift']());}catch(_0x4286af){_0x4a96b3['push'](_0x4a96b3['shift']());}}}(_0x852a,0x875a6));import _0x515a27 from'@toolkit/elements/ok-icon.ok.js';function _0x852a(){const _0x52cf3b=['Clear\x20failed\x20jobs\x20error:\x20','\x20for\x20type\x20\x22<b>','message','function','bulkBusy','hasPrev','byType','in\x20','/queue/clearFailed','splice','pendingUpdates','modal','data','slice','9DmIjAN','POST','var(--okdb-info)','Retried\x20','/queue/reconcile','1566063gpNDUP','status','asc','isArray','31EKqEgl','Delete\x20all\x20\x22failed\x22\x20jobs','abs','sort','apiBase','1434nUzpHL','busy','_applyFilterAndReload','direction','Cancelled\x20','6324176FuPBRd','indexOf','_unsubs','<enqueue-job-modal\x20:modal=\x22modal\x22\x20:initial-type=\x22initialType\x22\x20:on-done=\x22onDone\x22\x20/>','/queue/clearStuck','applyTypeAttr','set','cursor','Cleared\x20','in\x20a\x20moment',';\x20border-color:','all','success','refresh','selectedEnv','Deleted\x20','529800YXBNxE','Cancel\x20failed','loadStats','queue:enqueued','queue-jobs','</b>\x22','when','error','sortMode','\x20stuck\x20jobs','.pill{display:inline-flex;align-items:center;gap:5px;border:1px\x20solid\x20var(--okdb-app-border);background:var(--okdb-app-surface);padding:4px\x2010px;border-radius:999px;font-size:12px;cursor:pointer;color:var(--okdb-app-fg-muted);transition:border-color\x20.12s,color\x20.12s}.pill:hover{border-color:#3b4754;color:var(--okdb-app-fg)}.pill--on{box-shadow:0\x200\x200\x201px\x20rgba(255,255,255,.07)\x20inset}.pill--p.pill--on{color:var(--okdb-warning);border-color:var(--okdb-warning)}.pill--r.pill--on{color:var(--okdb-info);border-color:var(--okdb-info)}.pill--f.pill--on{color:var(--okdb-danger);border-color:var(--okdb-danger)}.pill--d.pill--on{color:var(--okdb-success);border-color:var(--okdb-success)}.pill-count{font-size:11px;opacity:.65;font-variant-numeric:tabular-nums}.status-badge{display:inline-block;padding:2px\x208px;border-radius:999px;font-size:11px;border:1px\x20solid;white-space:nowrap}','s\x20ago','/queue/retryFailed','queue:reconciled','failed','retry\x20failed','\x20failed\x20jobs','Retry\x20job\x20<code>','queue:retry','application/json','values','/cancel','query','open','Bulk\x20retry\x20failed:\x20','_busy','var(--okdb-success)','89250yxJKuP','_statsTimer','round','HTTP\x20','cancel\x20failed','_nextCursor','Clear\x20done\x20failed:\x20','total','Retry\x20failed:\x20','queue:failed','/retry','json','info','toast','/queue/jobs?','Delete\x20job\x20<code>','deleted','Retry\x20all\x20failed\x20jobs','resetPaging','Delete\x20failed','stats','var(--okdb-danger)','$attr','#9ca3af','load','push','queue:removed','?<br><br>This\x20cannot\x20be\x20undone.','items','$watch','Enqueue\x20Job','/queue/stats','stringify','now','length','7626gXkHHb','_cursors','<edit-job-modal\x20:modal=\x22modal\x22\x20:job-id=\x22jobId\x22\x20:on-done=\x22onDone\x22\x20/>','$ok','confirm','</code>?','/queue/clearDone','20170570slWCtZ','result','loadError','type','stores','/remove','$dispatch','_applySort','okdb','27111OAZMYL','hasNext','_liveTimer','d\x20ago','Stats\x20rebuild\x20failed','Clear\x20all\x20\x22done\x22\x20jobs','_pageIdx','var(--okdb-warning)','shared','/queue/job/','h\x20ago','Delete\x20all\x20stuck\x20(expired-claim)\x20running\x20jobs'];_0x852a=function(){return _0x52cf3b;};return _0x852a();}import _0x202ac2 from'@toolkit/elements/ok-table.ok.js';import _0x2f63f6 from'@toolkit/core/ok-overlay.ok.js';import _0x3f61b2 from'../modals/edit-job-modal.ok.js';import _0x4815a1 from'../modals/enqueue-job-modal.ok.js';import _0x5ede24 from'../../../stores/events-store.js';function _0x4cba(_0x415762,_0x57fb44){_0x415762=_0x415762-0x1ac;const _0x852ae3=_0x852a();let _0x4cba4f=_0x852ae3[_0x415762];return _0x4cba4f;}import _0x4ebce8 from'../../../stores/okdb-store.js';export default{'tag':_0x221c7d(0x21c),'dependencies':[_0x515a27,_0x202ac2,_0x2f63f6,_0x4815a1,_0x3f61b2],'attr':{'type':{}},'context':_0x480025=>({'query':function({apiBase:_0x296583,pageSize:_0x1e59f8=0x32}){const _0x348602=_0x221c7d;return{'busy':!0x1,'values':[],'total':0x0,'hasNext':!0x1,'hasPrev':!0x1,'pageSize':_0x1e59f8,'loadError':null,'type':null,'status':null,'sort':_0x348602(0x21e),'direction':_0x348602(0x1fc),'_cursors':[null],'_pageIdx':0x0,'_nextCursor':null,'resetPaging'(){const _0x4e049f=_0x348602;this['_cursors']=[null],this[_0x4e049f(0x1e1)]=0x0,this['_nextCursor']=null,this[_0x4e049f(0x1dc)]=!0x1,this['hasPrev']=!0x1;},async 'load'(){const _0x1b8a45=_0x348602,_0xea4193=_0x1b8a45(0x1ea)==typeof _0x296583?_0x296583():_0x296583,_0x492f98=this[_0x1b8a45(0x1cc)][this[_0x1b8a45(0x1e1)]];this[_0x1b8a45(0x204)]=!0x0,this[_0x1b8a45(0x1d4)]=null;try{const _0x3ea065=new URLSearchParams({'limit':String(this['pageSize']),'sort':this[_0x1b8a45(0x201)]??'when','direction':this[_0x1b8a45(0x206)]??_0x1b8a45(0x1fc)});this['type']&&_0x3ea065[_0x1b8a45(0x20e)]('type',this['type']),this[_0x1b8a45(0x1fb)]&&_0x3ea065[_0x1b8a45(0x20e)](_0x1b8a45(0x1fb),this['status']),null!=_0x492f98&&_0x3ea065[_0x1b8a45(0x20e)]('cursor',JSON[_0x1b8a45(0x1c8)](_0x492f98));const _0x68ec8f=await fetch(_0xea4193+_0x1b8a45(0x1b6)+_0x3ea065),_0x5d72da=await _0x68ec8f[_0x1b8a45(0x1b3)]();if(!_0x68ec8f['ok'])throw new Error(_0x5d72da?.[_0x1b8a45(0x21f)]?.[_0x1b8a45(0x1e9)]||_0x1b8a45(0x236)+_0x68ec8f[_0x1b8a45(0x1fb)]);const _0x4ac5a1=_0x5d72da[_0x1b8a45(0x1d3)]??_0x5d72da[_0x1b8a45(0x1f3)]??_0x5d72da;this['values']=Array[_0x1b8a45(0x1fd)](_0x4ac5a1['items'])?_0x4ac5a1[_0x1b8a45(0x1c4)]:Array[_0x1b8a45(0x1fd)](_0x4ac5a1)?_0x4ac5a1:[],this[_0x1b8a45(0x1ad)]=_0x4ac5a1[_0x1b8a45(0x20f)]??null,this[_0x1b8a45(0x1dc)]=null!=this[_0x1b8a45(0x1ad)],this['hasPrev']=this[_0x1b8a45(0x1e1)]>0x0;}catch(_0x2db14f){this[_0x1b8a45(0x1d4)]=_0x2db14f?.['message']||String(_0x2db14f),this['values']=[];}finally{this[_0x1b8a45(0x204)]=!0x1;}},async 'nextPage'(){const _0x1475d0=_0x348602;this['hasNext']&&!this['busy']&&(this['_pageIdx']+0x1>=this[_0x1475d0(0x1cc)][_0x1475d0(0x1ca)]&&this['_cursors'][_0x1475d0(0x1c1)](this['_nextCursor']),this[_0x1475d0(0x1e1)]++,await this[_0x1475d0(0x1c0)]());},async 'prevPage'(){const _0x44f07f=_0x348602;this[_0x44f07f(0x1ec)]&&!this[_0x44f07f(0x204)]&&(this['_pageIdx']--,await this['load']());}};}({'apiBase':()=>_0x4ebce8[_0x221c7d(0x202)],'pageSize':0x32}),'type':null,'status':null,'sortMode':_0x221c7d(0x21e),'direction':_0x221c7d(0x1fc),'stats':null,'_statsTimer':null,async 'loadStats'(){const _0xb40af=_0x221c7d;try{const _0x30e49d=await fetch(_0x4ebce8[_0xb40af(0x202)]+_0xb40af(0x1c7));if(_0x30e49d['ok']){const _0x572043=await _0x30e49d[_0xb40af(0x1b3)]();this[_0xb40af(0x1bc)]=_0x572043[_0xb40af(0x1d3)]??_0x572043[_0xb40af(0x1f3)]??null;}}catch{}},'_scheduleStats'(){const _0x43700e=_0x221c7d;clearTimeout(this[_0x43700e(0x234)]),this[_0x43700e(0x234)]=setTimeout(()=>this['loadStats'](),0x190);},'statusCount'(_0x16a21f){const _0x52ca16=_0x221c7d;if(!this[_0x52ca16(0x1bc)])return'';const _0x344714=this[_0x52ca16(0x1d5)];return _0x16a21f?_0x344714?this[_0x52ca16(0x1bc)]['byType']?.[_0x344714]?.['byStatus']?.[_0x16a21f]??0x0:this[_0x52ca16(0x1bc)]['byStatus']?.[_0x16a21f]??0x0:_0x344714?this[_0x52ca16(0x1bc)][_0x52ca16(0x1ed)]?.[_0x344714]?.[_0x52ca16(0x1af)]??0x0:this['stats'][_0x52ca16(0x1af)]??0x0;},'applyTypeAttr'(){const _0x8f4e4=_0x221c7d;var _0x5dc6ca;this['type']=null==(_0x5dc6ca=_0x480025[_0x8f4e4(0x1be)]['type'])||''===_0x5dc6ca?null:String(_0x5dc6ca),this[_0x8f4e4(0x205)]();},'setStatus'(_0x4320c8){const _0x598534=_0x221c7d;this[_0x598534(0x1fb)]=null==_0x4320c8||''===_0x4320c8?null:_0x4320c8,this[_0x598534(0x205)]();},'setSort'(_0x28984a){const _0x5475c5=_0x221c7d;this['sortMode']=_0x28984a,this[_0x5475c5(0x1d9)](),this[_0x5475c5(0x22e)]['resetPaging'](),this[_0x5475c5(0x22e)][_0x5475c5(0x1c0)]();},'toggleDirection'(){const _0x4614a5=_0x221c7d;this[_0x4614a5(0x206)]='asc'===this[_0x4614a5(0x206)]?'desc':_0x4614a5(0x1fc),this[_0x4614a5(0x1d9)](),this['query'][_0x4614a5(0x1ba)](),this['query'][_0x4614a5(0x1c0)]();},'_applySort'(){const _0x33250c=_0x221c7d;this[_0x33250c(0x22e)][_0x33250c(0x201)]=this[_0x33250c(0x220)],this[_0x33250c(0x22e)]['direction']=this[_0x33250c(0x206)];},'_applyFilterAndReload'(){const _0xf754b8=_0x221c7d;this[_0xf754b8(0x22e)][_0xf754b8(0x1d5)]=this[_0xf754b8(0x1d5)],this['query']['status']=this[_0xf754b8(0x1fb)],this['_applySort'](),this[_0xf754b8(0x22e)][_0xf754b8(0x1ba)](),this[_0xf754b8(0x22e)][_0xf754b8(0x1c0)]();},async 'refresh'(){const _0x87630f=_0x221c7d;clearTimeout(this[_0x87630f(0x1dd)]),this[_0x87630f(0x1f1)]=0x0;try{await fetch(_0x4ebce8['apiBase']+_0x87630f(0x1f9),{'method':_0x87630f(0x1f6)});}catch{}await this[_0x87630f(0x22e)][_0x87630f(0x1c0)](),await this[_0x87630f(0x21a)](),_0x480025[_0x87630f(0x1d8)](_0x87630f(0x215));},async 'rebuildStats'(){const _0x4adb3f=_0x221c7d;try{await fetch(_0x4ebce8[_0x4adb3f(0x202)]+'/queue/stats/rebuild',{'method':_0x4adb3f(0x1f6)}),_0x480025[_0x4adb3f(0x1ce)][_0x4adb3f(0x1e3)]?.['toast']?.[_0x4adb3f(0x214)]?.('Stats\x20rebuilt'),await this[_0x4adb3f(0x21a)](),_0x480025[_0x4adb3f(0x1d8)](_0x4adb3f(0x215)),await this[_0x4adb3f(0x22e)][_0x4adb3f(0x1c0)]();}catch{_0x480025['$ok'][_0x4adb3f(0x1e3)]?.[_0x4adb3f(0x1b5)]?.[_0x4adb3f(0x21f)]?.(_0x4adb3f(0x1df));}},async 'openEnqueue'(){const _0x1f270b=_0x221c7d,_0x462c39=this;await _0x480025[_0x1f270b(0x1ce)][_0x1f270b(0x1e3)][_0x1f270b(0x1f2)][_0x1f270b(0x22f)]({'owner':_0x480025,'title':_0x1f270b(0x1c6),'content':_0x1f270b(0x20b),'context':_0x2add1a=>({'modal':_0x2add1a,'initialType':_0x462c39[_0x1f270b(0x1d5)]||'','onDone':async()=>{const _0x4099e3=_0x1f270b;_0x480025[_0x4099e3(0x1ce)][_0x4099e3(0x1e3)]?.[_0x4099e3(0x1b5)]?.['success']?.('Job\x20enqueued'),await _0x462c39[_0x4099e3(0x215)]();}})});},async 'openEditJob'(_0x5739cd){const _0x5eb0ea=_0x221c7d,_0x449b12=this;await _0x480025['$ok'][_0x5eb0ea(0x1e3)]['modal']['open']({'owner':_0x480025,'title':'Edit\x20Job\x20'+_0x5739cd['id']['slice'](0x0,0x8),'content':_0x5eb0ea(0x1cd),'context':_0x3852bf=>({'modal':_0x3852bf,'jobId':_0x5739cd['id'],'onDone':async()=>{const _0x51be1c=_0x5eb0ea;await _0x449b12[_0x51be1c(0x215)]();}})});},async 'deleteJob'(_0x2f3f6b){const _0x49a5a9=_0x221c7d;if(await _0x480025[_0x49a5a9(0x1ce)]['shared']['modal'][_0x49a5a9(0x1cf)](_0x49a5a9(0x1b7)+_0x2f3f6b['id'][_0x49a5a9(0x1f4)](0x0,0x8)+_0x49a5a9(0x1d0))){_0x2f3f6b[_0x49a5a9(0x231)]=!0x0;try{if(!(await fetch(_0x4ebce8[_0x49a5a9(0x202)]+'/queue/job/'+_0x2f3f6b['id']+_0x49a5a9(0x1d7),{'method':_0x49a5a9(0x1f6)}))['ok'])throw new Error('remove\x20failed');const _0x55db62=this[_0x49a5a9(0x22e)][_0x49a5a9(0x22c)][_0x49a5a9(0x209)](_0x2f3f6b);_0x55db62>=0x0&&this['query'][_0x49a5a9(0x22c)][_0x49a5a9(0x1f0)](_0x55db62,0x1),_0x480025[_0x49a5a9(0x1ce)][_0x49a5a9(0x1e3)][_0x49a5a9(0x1b5)]?.[_0x49a5a9(0x1b4)](_0x49a5a9(0x217)+_0x2f3f6b['id']['slice'](0x0,0x8)),_0x480025['$dispatch'](_0x49a5a9(0x215)),this['_scheduleStats']();}catch{_0x480025[_0x49a5a9(0x1ce)]['shared'][_0x49a5a9(0x1b5)]?.[_0x49a5a9(0x21f)](_0x49a5a9(0x1bb));}finally{_0x2f3f6b['_busy']=!0x1;}}},async 'cancelJob'(_0x49c2a3){const _0x1465e2=_0x221c7d;if(await _0x480025['$ok']['shared'][_0x1465e2(0x1f2)][_0x1465e2(0x1cf)]('Cancel\x20job\x20<code>'+_0x49c2a3['id']['slice'](0x0,0x8)+_0x1465e2(0x1d0))){_0x49c2a3[_0x1465e2(0x231)]=!0x0;try{if(!(await fetch(_0x4ebce8[_0x1465e2(0x202)]+'/queue/job/'+_0x49c2a3['id']+_0x1465e2(0x22d),{'method':'POST'}))['ok'])throw new Error(_0x1465e2(0x1ac));_0x480025[_0x1465e2(0x1ce)]['shared'][_0x1465e2(0x1b5)]?.['info'](_0x1465e2(0x207)+_0x49c2a3['id']['slice'](0x0,0x8)),await this[_0x1465e2(0x215)]();}catch{_0x480025[_0x1465e2(0x1ce)]['shared'][_0x1465e2(0x1b5)]?.[_0x1465e2(0x21f)](_0x1465e2(0x219));}finally{_0x49c2a3[_0x1465e2(0x231)]=!0x1;}}},async 'retryJob'(_0x34bc47){const _0x4c4f66=_0x221c7d;if(await _0x480025['$ok']['shared'][_0x4c4f66(0x1f2)][_0x4c4f66(0x1cf)](_0x4c4f66(0x229)+_0x34bc47['id'][_0x4c4f66(0x1f4)](0x0,0x8)+_0x4c4f66(0x1d0))){_0x34bc47['_busy']=!0x0;try{const _0x2ec6e4=await fetch(_0x4ebce8['apiBase']+_0x4c4f66(0x1e4)+_0x34bc47['id']+_0x4c4f66(0x1b2),{'method':_0x4c4f66(0x1f6)}),_0x21c291=await _0x2ec6e4['json']();if(!_0x2ec6e4['ok'])throw new Error(_0x21c291?.[_0x4c4f66(0x21f)]?.['message']||_0x4c4f66(0x227));_0x480025['$ok']['shared'][_0x4c4f66(0x1b5)]?.[_0x4c4f66(0x214)]('Retried\x20'+_0x34bc47['id'][_0x4c4f66(0x1f4)](0x0,0x8)),await this[_0x4c4f66(0x215)]();}catch(_0x484683){_0x480025[_0x4c4f66(0x1ce)]['shared'][_0x4c4f66(0x1b5)]?.['error'](_0x4c4f66(0x1b0)+(_0x484683?.[_0x4c4f66(0x1e9)]||_0x484683));}finally{_0x34bc47[_0x4c4f66(0x231)]=!0x1;}}},'bulkBusy':!0x1,async 'retryAllFailed'(){const _0x1e0fc1=_0x221c7d;if(await _0x480025[_0x1e0fc1(0x1ce)][_0x1e0fc1(0x1e3)]['modal'][_0x1e0fc1(0x1cf)](_0x1e0fc1(0x1b9)+(this[_0x1e0fc1(0x1d5)]?_0x1e0fc1(0x1e8)+this[_0x1e0fc1(0x1d5)]+_0x1e0fc1(0x21d):'')+'?')){this[_0x1e0fc1(0x1eb)]=!0x0;try{const _0x4a4fef={'limit':0x1388};this['type']&&(_0x4a4fef['type']=this[_0x1e0fc1(0x1d5)]);const _0x8572b=await fetch(_0x4ebce8[_0x1e0fc1(0x202)]+_0x1e0fc1(0x224),{'method':_0x1e0fc1(0x1f6),'headers':{'Content-Type':'application/json'},'body':JSON['stringify'](_0x4a4fef)}),_0x36166e=await _0x8572b[_0x1e0fc1(0x1b3)]();if(!_0x8572b['ok'])throw new Error(_0x36166e?.[_0x1e0fc1(0x21f)]?.[_0x1e0fc1(0x1e9)]||_0x1e0fc1(0x226));_0x480025[_0x1e0fc1(0x1ce)][_0x1e0fc1(0x1e3)]?.[_0x1e0fc1(0x1b5)]?.[_0x1e0fc1(0x214)]?.(_0x1e0fc1(0x1f8)+_0x36166e['data']['retried']+_0x1e0fc1(0x228)),await this['refresh']();}catch(_0x10c5bc){_0x480025[_0x1e0fc1(0x1ce)][_0x1e0fc1(0x1e3)]?.['toast']?.[_0x1e0fc1(0x21f)]?.(_0x1e0fc1(0x230)+(_0x10c5bc?.['message']||_0x10c5bc));}finally{this['bulkBusy']=!0x1;}}},async 'deleteAllDone'(){const _0x585919=_0x221c7d;if(await _0x480025[_0x585919(0x1ce)]['shared']['modal']['confirm'](_0x585919(0x1e0)+(this['type']?'\x20for\x20type\x20\x22<b>'+this[_0x585919(0x1d5)]+_0x585919(0x21d):'')+'?<br><br>This\x20cannot\x20be\x20undone.')){this[_0x585919(0x1eb)]=!0x0;try{const _0x13f1f7={'limit':0xc350};this[_0x585919(0x1d5)]&&(_0x13f1f7[_0x585919(0x1d5)]=this[_0x585919(0x1d5)]);const _0x2001c8=await fetch(_0x4ebce8[_0x585919(0x202)]+_0x585919(0x1d1),{'method':_0x585919(0x1f6),'headers':{'Content-Type':_0x585919(0x22b)},'body':JSON[_0x585919(0x1c8)](_0x13f1f7)}),_0x477ceb=await _0x2001c8[_0x585919(0x1b3)]();if(!_0x2001c8['ok'])throw new Error(_0x477ceb?.[_0x585919(0x21f)]?.['message']||'failed');_0x480025[_0x585919(0x1ce)][_0x585919(0x1e3)]?.['toast']?.[_0x585919(0x1b4)]?.(_0x585919(0x210)+_0x477ceb[_0x585919(0x1f3)][_0x585919(0x1b8)]+'\x20done\x20jobs'),await this[_0x585919(0x215)]();}catch(_0x240c75){_0x480025['$ok']['shared']?.[_0x585919(0x1b5)]?.['error']?.(_0x585919(0x1ae)+(_0x240c75?.['message']||_0x240c75));}finally{this['bulkBusy']=!0x1;}}},async 'deleteAllFailed'(){const _0x323ee8=_0x221c7d;if(await _0x480025[_0x323ee8(0x1ce)]['shared'][_0x323ee8(0x1f2)][_0x323ee8(0x1cf)](_0x323ee8(0x1ff)+(this[_0x323ee8(0x1d5)]?'\x20for\x20type\x20\x22<b>'+this['type']+_0x323ee8(0x21d):'')+_0x323ee8(0x1c3))){this[_0x323ee8(0x1eb)]=!0x0;try{const _0x1718c5={'limit':0xc350};this[_0x323ee8(0x1d5)]&&(_0x1718c5[_0x323ee8(0x1d5)]=this[_0x323ee8(0x1d5)]);const _0x19a26d=await fetch(_0x4ebce8['apiBase']+_0x323ee8(0x1ef),{'method':_0x323ee8(0x1f6),'headers':{'Content-Type':_0x323ee8(0x22b)},'body':JSON[_0x323ee8(0x1c8)](_0x1718c5)}),_0x48477e=await _0x19a26d[_0x323ee8(0x1b3)]();if(!_0x19a26d['ok'])throw new Error(_0x48477e?.[_0x323ee8(0x21f)]?.[_0x323ee8(0x1e9)]||_0x323ee8(0x226));_0x480025[_0x323ee8(0x1ce)][_0x323ee8(0x1e3)]?.[_0x323ee8(0x1b5)]?.[_0x323ee8(0x1b4)]?.(_0x323ee8(0x210)+_0x48477e[_0x323ee8(0x1f3)]['deleted']+_0x323ee8(0x228)),await this[_0x323ee8(0x215)]();}catch(_0x3413ab){_0x480025['$ok'][_0x323ee8(0x1e3)]?.['toast']?.[_0x323ee8(0x21f)]?.(_0x323ee8(0x1e7)+(_0x3413ab?.['message']||_0x3413ab));}finally{this[_0x323ee8(0x1eb)]=!0x1;}}},async 'clearStuck'(){const _0xd714ce=_0x221c7d;if(await _0x480025[_0xd714ce(0x1ce)][_0xd714ce(0x1e3)]['modal'][_0xd714ce(0x1cf)](_0xd714ce(0x1e6)+(this[_0xd714ce(0x1d5)]?_0xd714ce(0x1e8)+this[_0xd714ce(0x1d5)]+_0xd714ce(0x21d):'')+'?<br><br>Stuck\x20jobs\x20are\x20running\x20jobs\x20whose\x20TTL\x20has\x20expired.\x20They\x20will\x20be\x20permanently\x20deleted,\x20not\x20re-queued.')){this[_0xd714ce(0x1eb)]=!0x0;try{const _0x9f7588={'limit':0xc350};this[_0xd714ce(0x1d5)]&&(_0x9f7588[_0xd714ce(0x1d5)]=this[_0xd714ce(0x1d5)]);const _0x44ddd2=await fetch(_0x4ebce8[_0xd714ce(0x202)]+_0xd714ce(0x20c),{'method':_0xd714ce(0x1f6),'headers':{'Content-Type':_0xd714ce(0x22b)},'body':JSON[_0xd714ce(0x1c8)](_0x9f7588)}),_0x3e3a24=await _0x44ddd2['json']();if(!_0x44ddd2['ok'])throw new Error(_0x3e3a24?.[_0xd714ce(0x21f)]?.['message']||_0xd714ce(0x226));_0x480025['$ok']['shared']?.[_0xd714ce(0x1b5)]?.[_0xd714ce(0x1b4)]?.('Cleared\x20'+_0x3e3a24['data'][_0xd714ce(0x1b8)]+_0xd714ce(0x221)),await this[_0xd714ce(0x215)]();}catch(_0x4be654){_0x480025[_0xd714ce(0x1ce)]['shared']?.[_0xd714ce(0x1b5)]?.[_0xd714ce(0x21f)]?.('Clear\x20stuck\x20failed:\x20'+(_0x4be654?.[_0xd714ce(0x1e9)]||_0x4be654));}finally{this['bulkBusy']=!0x1;}}},'isStatusOn'(_0x3a6dc2){const _0x2ac0a7=_0x221c7d;return(this[_0x2ac0a7(0x1fb)]??null)===(_0x3a6dc2??null);},'statusBadgeStyle'(_0x2600e4){const _0x1f1399=_0x221c7d,_0x26ad09={'pending':_0x1f1399(0x1e2),'running':_0x1f1399(0x1f7),'done':_0x1f1399(0x232),'failed':_0x1f1399(0x1bd)}[_0x2600e4]||_0x1f1399(0x1bf);return'color:'+_0x26ad09+_0x1f1399(0x212)+_0x26ad09+';';},'formatWhen'(_0x1c2252){const _0x42a97d=_0x221c7d;if(!_0x1c2252)return'—';const _0x3f4f65=_0x1c2252-Date[_0x42a97d(0x1c9)](),_0xf9f829=Math[_0x42a97d(0x200)](_0x3f4f65),_0x813632=Math['round'](_0xf9f829/0x3e8);if(_0x813632<0x5)return _0x3f4f65<=0x0?'now':_0x42a97d(0x211);if(_0x813632<0x3c)return _0x3f4f65<0x0?_0x813632+_0x42a97d(0x223):_0x42a97d(0x1ee)+_0x813632+'s';const _0x2f430c=Math['round'](_0x813632/0x3c);if(_0x2f430c<0x3c)return _0x3f4f65<0x0?_0x2f430c+'m\x20ago':'in\x20'+_0x2f430c+'m';const _0x5a588c=Math[_0x42a97d(0x235)](_0x2f430c/0x3c);if(_0x5a588c<0x18)return _0x3f4f65<0x0?_0x5a588c+_0x42a97d(0x1e5):_0x42a97d(0x1ee)+_0x5a588c+'h';const _0x4507ed=Math['round'](_0x5a588c/0x18);return _0x3f4f65<0x0?_0x4507ed+_0x42a97d(0x1de):_0x42a97d(0x1ee)+_0x4507ed+'d';},'shortId':_0x1e3040=>(_0x1e3040||'')['slice'](0x0,0x8),'_unsubs':[],'_liveTimer':null,'pendingUpdates':0x0,'_scheduleLiveReload'(){const _0x7bf9d8=_0x221c7d;this[_0x7bf9d8(0x1f1)]++,clearTimeout(this[_0x7bf9d8(0x1dd)]),this[_0x7bf9d8(0x1dd)]=setTimeout(async()=>{const _0x382694=_0x7bf9d8;await this[_0x382694(0x22e)][_0x382694(0x1c0)](),await this[_0x382694(0x21a)](),_0x480025[_0x382694(0x1d8)](_0x382694(0x215)),this[_0x382694(0x1f1)]=0x0;},0xbb8);}}),async 'init'(_0x52837f){const _0x3df35e=_0x221c7d;this[_0x3df35e(0x20d)](),_0x52837f[_0x3df35e(0x1c5)](()=>_0x52837f[_0x3df35e(0x1be)][_0x3df35e(0x1d5)],()=>this[_0x3df35e(0x20d)]()),_0x52837f[_0x3df35e(0x1c5)](()=>_0x52837f[_0x3df35e(0x1ce)][_0x3df35e(0x1d6)][_0x3df35e(0x1da)][_0x3df35e(0x216)],()=>{const _0x1f9775=_0x3df35e;this[_0x1f9775(0x1bc)]=null,this[_0x1f9775(0x22e)][_0x1f9775(0x1ba)](),Promise[_0x1f9775(0x213)]([this[_0x1f9775(0x22e)][_0x1f9775(0x1c0)](),this[_0x1f9775(0x21a)]()]);}),await Promise[_0x3df35e(0x213)]([this[_0x3df35e(0x22e)]['load'](),this[_0x3df35e(0x21a)]()]);},'mount'(){const _0x199967=_0x221c7d,_0x3c37c4=()=>this['_scheduleLiveReload']();this['_unsubs']=[_0x5ede24['on'](_0x199967(0x21b),_0x3c37c4),_0x5ede24['on']('queue:done',_0x3c37c4),_0x5ede24['on'](_0x199967(0x1b1),_0x3c37c4),_0x5ede24['on'](_0x199967(0x22a),_0x3c37c4),_0x5ede24['on'](_0x199967(0x1c2),_0x3c37c4),_0x5ede24['on'](_0x199967(0x225),_0x3c37c4)];},'unmount'(){const _0x4de986=_0x221c7d;clearTimeout(this['_liveTimer']),clearTimeout(this[_0x4de986(0x234)]);for(const _0x1ffb3b of this[_0x4de986(0x20a)])_0x1ffb3b();this[_0x4de986(0x20a)]=[];},'template':'\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20height:100%;\x20min-height:0;\x20gap:10px;\x22>\x0a\x0a\x20\x20<!--\x20──\x20Row\x201:\x20Status\x20filters\x20+\x20Enqueue\x20──\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:6px;\x20align-items:center;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20<button\x20@click=\x22setStatus(null)\x22\x20\x20\x20\x20\x20\x20:class=\x22isStatusOn(null)\x20\x20\x20\x20\x20\x20?\x20\x27pill\x20pill--on\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:\x20\x27pill\x27\x22>All<span\x20class=\x22pill-count\x22>{{\x20statusCount(null)\x20}}</span></button>\x0a\x20\x20\x20\x20<button\x20@click=\x22setStatus(\x27pending\x27)\x22\x20:class=\x22isStatusOn(\x27pending\x27)\x20?\x20\x27pill\x20pill--on\x20pill--p\x27\x20\x20\x20:\x20\x27pill\x20pill--p\x27\x22>Pending<span\x20class=\x22pill-count\x22>{{\x20statusCount(\x27pending\x27)\x20}}</span></button>\x0a\x20\x20\x20\x20<button\x20@click=\x22setStatus(\x27running\x27)\x22\x20:class=\x22isStatusOn(\x27running\x27)\x20?\x20\x27pill\x20pill--on\x20pill--r\x27\x20\x20\x20:\x20\x27pill\x20pill--r\x27\x22>Running<span\x20class=\x22pill-count\x22>{{\x20statusCount(\x27running\x27)\x20}}</span></button>\x0a\x20\x20\x20\x20<button\x20@click=\x22setStatus(\x27failed\x27)\x22\x20\x20:class=\x22isStatusOn(\x27failed\x27)\x20\x20?\x20\x27pill\x20pill--on\x20pill--f\x27\x20\x20\x20:\x20\x27pill\x20pill--f\x27\x22>Failed<span\x20\x20class=\x22pill-count\x22>{{\x20statusCount(\x27failed\x27)\x20}}</span></button>\x0a\x20\x20\x20\x20<button\x20@click=\x22setStatus(\x27done\x27)\x22\x20\x20\x20\x20:class=\x22isStatusOn(\x27done\x27)\x20\x20\x20\x20?\x20\x27pill\x20pill--on\x20pill--d\x27\x20\x20\x20:\x20\x27pill\x20pill--d\x27\x22>Done<span\x20\x20\x20\x20class=\x22pill-count\x22>{{\x20statusCount(\x27done\x27)\x20}}</span></button>\x0a\x0a\x20\x20\x20\x20<div\x20style=\x22flex:1;\x22></div>\x0a\x0a\x20\x20\x20\x20<select\x20@change=\x22setSort($el.value)\x22\x20:value=\x22sortMode\x22\x20style=\x22font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20<option\x20value=\x22when\x22>Sort:\x20When</option>\x0a\x20\x20\x20\x20\x20\x20<option\x20value=\x22priority\x22>Sort:\x20Priority</option>\x0a\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20<button\x20@click=\x22toggleDirection\x22\x20style=\x22font-size:12px;\x20min-width:32px;\x22\x20title=\x22Toggle\x20sort\x20direction\x22>\x0a\x20\x20\x20\x20\x20\x20{{\x20direction\x20===\x20\x27asc\x27\x20?\x20\x27▲\x27\x20:\x20\x27▼\x27\x20}}\x0a\x20\x20\x20\x20</button>\x0a\x0a\x20\x20\x20\x20<button\x20@click=\x22openEnqueue\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2013%,\x20transparent);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20color:var(--okdb-accent);\x20font-weight:600;\x20padding:4px\x2014px;\x20font-size:12px;\x20white-space:nowrap;\x22>\x0a\x20\x20\x20\x20\x20\x20+\x20Enqueue\x0a\x20\x20\x20\x20</button>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20──\x20Row\x202:\x20Bulk\x20actions\x20──\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:6px;\x20align-items:center;\x20flex-wrap:wrap;\x20padding:5px\x200;\x20border-top:1px\x20solid\x20var(--okdb-app-surface-2);\x20border-bottom:1px\x20solid\x20var(--okdb-app-surface-2);\x22>\x0a\x20\x20\x20\x20<button\x20@click=\x22retryAllFailed()\x22\x20:disabled=\x22bulkBusy\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;\x20color:var(--okdb-warning);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-warning)\x2020%,\x20transparent);\x20background:transparent;\x20padding:3px\x2010px;\x22\x0a\x20\x20\x20\x20\x20\x20title=\x22Reset\x20all\x20failed\x20jobs\x20back\x20to\x20pending\x22>\x0a\x20\x20\x20\x20\x20\x20↺\x20Retry\x20Failed\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<div\x20style=\x22width:1px;\x20height:16px;\x20background:var(--okdb-app-border);\x22></div>\x0a\x20\x20\x20\x20<button\x20@click=\x22deleteAllDone()\x22\x20:disabled=\x22bulkBusy\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;\x20color:var(--okdb-success);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-success)\x2020%,\x20transparent);\x20background:transparent;\x20padding:3px\x2010px;\x22\x0a\x20\x20\x20\x20\x20\x20title=\x22Delete\x20all\x20done\x20jobs\x20in\x20one\x20index\x20pass\x22>\x0a\x20\x20\x20\x20\x20\x20✕\x20Clear\x20Done\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x20@click=\x22deleteAllFailed()\x22\x20:disabled=\x22bulkBusy\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;\x20color:var(--okdb-danger);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x20background:transparent;\x20padding:3px\x2010px;\x22\x0a\x20\x20\x20\x20\x20\x20title=\x22Permanently\x20delete\x20all\x20failed\x20jobs\x22>\x0a\x20\x20\x20\x20\x20\x20✕\x20Clear\x20Failed\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<button\x20@click=\x22clearStuck()\x22\x20:disabled=\x22bulkBusy\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22font-size:12px;\x20color:var(--okdb-app-fg-muted);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-app-fg-muted)\x2020%,\x20transparent);\x20background:transparent;\x20padding:3px\x2010px;\x22\x0a\x20\x20\x20\x20\x20\x20title=\x22Delete\x20running\x20jobs\x20whose\x20claim\x20TTL\x20has\x20expired\x20(permanently,\x20not\x20re-queued)\x22>\x0a\x20\x20\x20\x20\x20\x20✕\x20Clear\x20Stuck\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<div\x20style=\x22width:1px;\x20height:16px;\x20background:var(--okdb-app-border);\x22></div>\x0a\x20\x20\x20\x20<button\x20@click=\x22rebuildStats\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22font-size:11px;\x20opacity:.4;\x20background:transparent;\x20border-color:transparent;\x20padding:3px\x208px;\x22\x0a\x20\x20\x20\x20\x20\x20title=\x22Full\x20scan\x20rebuild\x20of\x20stats\x20counters\x22>\x0a\x20\x20\x20\x20\x20\x20Rebuild\x20Stats\x0a\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20<if\x20:=\x22pendingUpdates\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;\x20color:var(--okdb-warning);\x20opacity:.8;\x20margin-left:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20⟳\x20{{\x20pendingUpdates\x20}}\x20pending\x0a\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Table\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20position:relative;\x20flex:1;\x20min-height:0;\x22>\x0a\x20\x20\x20\x20<if\x20:=\x22query.busy\x22>\x0a\x20\x20\x20\x20\x20\x20<ok-overlay>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22loader-center\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<ok-icon\x20name=\x22loader\x22\x20class=\x22spin\x22\x20style=\x22width:32px;height:32px;\x22></ok-icon>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</ok-overlay>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22query.loadError\x20&&\x20!query.busy\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20padding:12px\x2014px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2033%,\x20transparent);\x20border-radius:8px;\x20margin-bottom:8px;\x20font-size:13px;\x20display:flex;\x20align-items:center;\x20gap:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22flex:1;\x22>{{\x20query.loadError\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22query.load()\x22\x20style=\x22font-size:11px;\x20color:var(--okdb-danger);\x20border-color:color-mix(in\x20srgb,\x20var(--okdb-danger)\x2033%,\x20transparent);\x20padding:3px\x2010px;\x22>Retry</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<ok-table\x20:data=\x22query.values\x22\x20no-scroll\x20style=\x22flex:1;\x20min-height:0;\x20overflow:auto;\x22>\x0a\x20\x20\x20\x20\x20\x20<columns>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x2280px\x22\x20no-resize>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>Status</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22status-badge\x22\x20:style=\x22statusBadgeStyle(row.status)\x22>{{\x20row.status\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x221fr\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>Type\x20+\x20Metadata</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:2px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>{{\x20row.type\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:4px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.tags\x20&&\x20row.tags.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22display:inline-block;\x20font-size:11px;\x20padding:1px\x206px;\x20background:var(--okdb-app-bg-deep);\x20border-radius:3px;\x20opacity:.7;\x22>{{\x20row.tags.join(\x27,\x20\x27)\x20}}</span>\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:=\x22row.progress\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22display:inline-block;\x20font-size:11px;\x20padding:1px\x206px;\x20background:var(--okdb-app-bg-deep);\x20border-radius:3px;\x20opacity:.7;\x22>{{\x20row.progress\x20}}</span>\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:=\x22row.cron\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22display:inline-block;\x20font-size:11px;\x20padding:1px\x206px;\x20background:var(--okdb-app-bg-deep);\x20border-radius:3px;\x20opacity:.7;\x20color:var(--okdb-indigo);\x22>cron:\x20{{\x20row.cron\x20}}</span>\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:=\x22row.idempotency_key\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22display:inline-block;\x20font-size:11px;\x20padding:1px\x206px;\x20background:var(--okdb-app-bg-deep);\x20border-radius:3px;\x20opacity:.7;\x20color:#34d399;\x22>key:\x20{{\x20row.idempotency_key\x20}}</span>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x22130px\x22\x20no-resize>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>When</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>{{\x20formatWhen(row.when)\x20}}</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x2270px\x22\x20no-resize>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>Tries</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22row.tries\x20>=\x20row.max_tries\x20&&\x20row.max_tries\x20>\x200\x20?\x20\x27color:var(--okdb-danger);\x27\x20:\x20\x27\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20row.tries\x20}}\x20/\x20{{\x20row.max_tries\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</column>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<column\x20width=\x22180px\x22\x20no-resize>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<header>Actions</header>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<cell\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22openEditJob(row)\x22\x20:disabled=\x22row._busy\x22\x20style=\x22font-size:11px;\x22>Edit</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22retryJob(row)\x22\x20\x20:disabled=\x22row._busy\x22\x20style=\x22font-size:11px;\x22>Retry</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.status\x20===\x20\x27pending\x27\x20||\x20row.status\x20===\x20\x27running\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22cancelJob(row)\x22\x20:disabled=\x22row._busy\x22\x20style=\x22font-size:11px;\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22deleteJob(row)\x22\x20:disabled=\x22row._busy\x22\x20style=\x22color:#ff6c6b;\x20font-size:11px;\x22>Delete</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</cell>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</column>\x0a\x20\x20\x20\x20\x20\x20</columns>\x0a\x0a\x20\x20\x20\x20\x20\x20<expanded\x20let:row>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22padding:10px;\x20font-size:12px;\x20display:flex;\x20flex-direction:column;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.error_stack\x20||\x20row.status_message\x22>\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<if\x20:=\x22row.status_message\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22white-space:pre-wrap;\x20opacity:.9;\x20margin-bottom:6px;\x22>{{\x20row.status_message\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22row.error_stack\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20style=\x22white-space:pre-wrap;\x20opacity:.85;\x20max-height:220px;\x20overflow:auto;\x20background:var(--okdb-app-bg-deep);\x20padding:8px;\x20border-radius:4px;\x22>{{\x20row.error_stack\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-wrap:wrap;\x20gap:12px;\x20opacity:.8;\x20font-size:11px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>ID:\x20<b>{{\x20row.id\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Status\x20code:\x20<b>{{\x20row.status_code\x20||\x20\x27—\x27\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Max\x20tries:\x20<b>{{\x20row.max_tries\x20??\x20\x27—\x27\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Retry\x20delay:\x20<b>{{\x20row.retry_delay\x20??\x200\x20}}ms</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Backoff:\x20<b>{{\x20row.backoff_multiplier\x20??\x201\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Priority:\x20<b>{{\x20row.priority\x20??\x200\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:=\x22row.bucket\x22\x20style=\x22display:inline;\x22>Bucket:\x20<b>{{\x20row.bucket\x20||\x20\x27—\x27\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Claim\x20expires:\x20<b>{{\x20formatWhen(row.claim_expires)\x20}}</b></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<details\x20style=\x22margin-top:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<summary\x20style=\x22cursor:pointer;\x20opacity:.8;\x20font-size:11px;\x22>Raw\x20job</summary>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20style=\x22white-space:pre-wrap;\x20opacity:.85;\x20max-height:260px;\x20overflow:auto;\x20margin-top:4px;\x20background:var(--okdb-app-bg-deep);\x20padding:8px;\x20border-radius:4px;\x20font-size:10px;\x22>{{\x20row\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</details>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</expanded>\x0a\x20\x20\x20\x20</ok-table>\x0a\x0a\x20\x20\x20\x20<!--\x20Pagination\x20-->\x0a\x20\x20\x20\x20<div\x20class=\x22ok-pager\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22query.prevPage()\x22\x20:disabled=\x22!query.hasPrev\x20||\x20query.busy\x22>‹\x20Prev</button>\x0a\x20\x20\x20\x20\x20\x20<span>{{\x20statusCount(status)\x20}}\x20total\x20·\x20{{\x20query.pageSize\x20}}/page</span>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22query.nextPage()\x22\x20:disabled=\x22!query.hasNext\x20||\x20query.busy\x22>Next\x20›</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a</div>\x0a','style':_0x221c7d(0x222)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0x48ba(){const _0x4e2390=['queue-types','stats\x20failed','queue:reconciled','values','4505335vWtBjy','engine:started','808552pMsufa','_unsubs','error','toLowerCase','_scheduleLoad','queue:removed','1208882tUFxFG','includes','$attr','/engines?type=queue-worker','_reloadTimer','total','reduce','1NwOxRB','selectedType','.type-row{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px\x208px;border-radius:5px;font-size:12px;border:1px\x20solid\x20transparent;background:0\x200;cursor:pointer;width:100%;color:var(--okdb-app-fg-muted);transition:background\x20.12s,border-color\x20.12s,color\x20.12s}.type-row--on,.type-row:hover{background:var(--okdb-app-surface);border-color:var(--okdb-app-border);color:var(--okdb-app-fg)}.type-row--on{border-color:var(--okdb-accent);color:var(--okdb-app-fg-strong)}.worker-chip{display:inline-flex;align-items:center;gap:4px;padding:1px\x206px;border-radius:999px;border:1px\x20solid\x20color-mix(in\x20srgb,var(--okdb-accent)\x2020%,transparent);color:var(--okdb-accent);background:color-mix(in\x20srgb,var(--okdb-accent)\x205%,transparent);font-size:10px;flex-shrink:0}','push','/queue/job-types','2255553UKtdTb','15749810ZaLryB','engine:stopped','typesData','busy','loadFromStats','types\x20failed','selectedEnv','byType','workerCounts','queue:enqueued','result','fromEntries','localeCompare','registeredTypes','engine:error','selectedtype','240289QbtTwG','sort','length','load','engine:uninstalled','queue:failed','type','filterText','queue-types\x20load\x20error','$dispatch','174gXbYmF','filter','apiBase','/queue/types','queue-types\x20stats\x20fallback\x20error','$watch','types','data','json','find','9jbTzGh','map','job_type','keys','catch','#f59e0b','some','all','/queue/stats','1343504aplqBD','isArray','#3b82f6','\x0a<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:8px;\x20min-height:0;\x22>\x0a\x0a\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20justify-content:space-between;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:6px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-weight:600;\x20font-size:12px;\x20opacity:.7;\x20text-transform:uppercase;\x20letter-spacing:.05em;\x22>Types</div>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22totalWorkers()\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:10px;\x20padding:1px\x206px;\x20border-radius:999px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);\x20color:var(--okdb-accent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x22>⚙\x20{{\x20totalWorkers()\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<button\x20@click=\x22load\x22\x20:disabled=\x22busy\x22\x20style=\x22opacity:.6;\x20font-size:11px;\x20padding:2px\x206px;\x22>↻</button>\x0a\x20\x20</div>\x0a\x0a\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20:value=\x22filterText\x22\x0a\x20\x20\x20\x20\x20\x20@input=\x22filterText\x20=\x20$event.target.value\x22\x0a\x20\x20\x20\x20\x20\x20placeholder=\x22Filter\x20types…\x22\x0a\x20\x20\x20\x20\x20\x20style=\x22width:100%;\x20min-width:0;\x20padding:6px\x208px;\x20border-radius:6px;\x20border:1px\x20solid\x20var(--okdb-app-border);\x20background:var(--okdb-app-bg-deep);\x20color:var(--okdb-app-fg-strong);\x20font-size:12px;\x22\x0a\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20<if\x20:=\x22filterText\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22clearFilter()\x22\x20style=\x22opacity:.7;\x20font-size:11px;\x20padding:5px\x207px;\x22>✕</button>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20Types\x20list\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:3px;\x20overflow:auto;\x20min-height:0;\x20padding-right:4px;\x22>\x0a\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20@click=\x22selectType(null)\x22\x0a\x20\x20\x20\x20\x20\x20:class=\x22selectedType\x20==\x20null\x20?\x20\x27type-row\x20type-row--on\x27\x20:\x20\x27type-row\x27\x22>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22display:flex;\x20align-items:center;\x20gap:6px;\x20min-width:0;\x20flex:1;\x20text-align:left;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22white-space:nowrap;\x20overflow:hidden;\x20text-overflow:ellipsis;\x22>All\x20types</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22totalWorkers()\x20>\x200\x22><span\x20class=\x22worker-chip\x22>⚙\x20{{\x20totalWorkers()\x20}}</span></if>\x0a\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.55;\x20font-size:11px;\x22>{{\x20totalFor(null)\x20}}</span>\x0a\x20\x20\x20\x20</button>\x0a\x0a\x20\x20\x20\x20<each\x20:of=\x22types\x22\x20let:item=\x22item\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22selectType(item.type)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22selectedType\x20===\x20item.type\x20?\x20\x27type-row\x20type-row--on\x27\x20:\x20\x27type-row\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22display:flex;\x20align-items:center;\x20gap:6px;\x20min-width:0;\x20flex:1;\x20text-align:left;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22jtStatusColor(item.type)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:style=\x22\x27width:6px;height:6px;border-radius:50%;background:\x27\x20+\x20jtStatusColor(item.type)\x20+\x20\x27;flex-shrink:0;\x27\x22\x20:title=\x22jtStatus(item.type)\x22></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22white-space:nowrap;\x20overflow:hidden;\x20text-overflow:ellipsis;\x22>{{\x20item.type\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22item.workerCount\x20>\x200\x22><span\x20class=\x22worker-chip\x22>⚙\x20{{\x20item.workerCount\x20}}</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.55;\x20font-size:11px;\x22>{{\x20item.total\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</each>\x0a\x0a\x20\x20\x20\x20<if\x20:=\x22!busy\x20&&\x20types.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.5;\x20font-size:12px;\x20padding:6px\x208px;\x20line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20filterText\x20?\x20\x27No\x20types\x20match\x20this\x20filter.\x27\x20:\x20\x27No\x20queued\x20job\x20types\x20in\x20this\x20environment.\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a</div>\x0a','_mergeRegisteredTypes'];_0x48ba=function(){return _0x4e2390;};return _0x48ba();}const _0x525295=_0x32cb;(function(_0x485ece,_0x5da81a){const _0x5754c8=_0x32cb,_0x15feea=_0x485ece();while(!![]){try{const _0x365425=parseInt(_0x5754c8(0x11a))/0x1*(-parseInt(_0x5754c8(0x113))/0x2)+parseInt(_0x5754c8(0x11f))/0x3+parseInt(_0x5754c8(0x10d))/0x4+parseInt(_0x5754c8(0x10b))/0x5+-parseInt(_0x5754c8(0x13a))/0x6*(-parseInt(_0x5754c8(0x130))/0x7)+parseInt(_0x5754c8(0x102))/0x8*(-parseInt(_0x5754c8(0x144))/0x9)+-parseInt(_0x5754c8(0x120))/0xa;if(_0x365425===_0x5da81a)break;else _0x15feea['push'](_0x15feea['shift']());}catch(_0xee3b2f){_0x15feea['push'](_0x15feea['shift']());}}}(_0x48ba,0x7ad8b));import _0x592aa9 from'../../../stores/events-store.js';function _0x32cb(_0x4949e0,_0x5a1824){_0x4949e0=_0x4949e0-0x100;const _0x48ba49=_0x48ba();let _0x32cb43=_0x48ba49[_0x4949e0];return _0x32cb43;}import _0x4f23ce from'../../../stores/okdb-store.js';const s={'paused':_0x525295(0x149),'draining':_0x525295(0x104)};export default{'tag':_0x525295(0x107),'attr':{'selectedtype':{}},'context':_0x1422a4=>({'busy':!0x1,'total':0x0,'typesData':[],'workerCounts':{},'registeredTypes':{},'filterText':'','_unsubs':[],'_reloadTimer':null,'selectedType':null,async 'load'(){const _0x4b7da2=_0x525295;this[_0x4b7da2(0x123)]=!0x0;try{const [_0x2f9759,_0x246ff0,_0x2b1a91]=await Promise[_0x4b7da2(0x100)]([fetch(_0x4f23ce['apiBase']+_0x4b7da2(0x13d)),fetch(_0x4f23ce[_0x4b7da2(0x13c)]+_0x4b7da2(0x116))['catch'](()=>null),fetch(_0x4f23ce[_0x4b7da2(0x13c)]+_0x4b7da2(0x11e))[_0x4b7da2(0x148)](()=>null)]);if(!_0x2f9759['ok'])throw new Error(_0x4b7da2(0x125));const _0x5eb207=await _0x2f9759['json'](),_0x10407a=_0x5eb207?.[_0x4b7da2(0x12a)]??_0x5eb207?.['data']??null,_0x4621b0=_0x246ff0?.['ok']?await _0x246ff0[_0x4b7da2(0x142)]()[_0x4b7da2(0x148)](()=>({})):null,_0x2c5852=_0x4621b0?.['result']??_0x4621b0?.[_0x4b7da2(0x141)]??[],_0xd2d618={};for(const _0x130157 of _0x2c5852){const _0xab9af9=_0x130157?.['config']?.[_0x4b7da2(0x146)];_0xab9af9&&(_0xd2d618[_0xab9af9]=(_0xd2d618[_0xab9af9]??0x0)+0x1);}if(this[_0x4b7da2(0x128)]=_0xd2d618,_0x2b1a91?.['ok']){const _0x840b88=await _0x2b1a91[_0x4b7da2(0x142)]()[_0x4b7da2(0x148)](()=>({})),_0x453a29=_0x840b88?.[_0x4b7da2(0x12a)]??[];this['registeredTypes']=Object[_0x4b7da2(0x12b)](_0x453a29['map'](_0x495d0e=>[_0x495d0e['id'],_0x495d0e]));}this[_0x4b7da2(0x118)]=_0x10407a?.[_0x4b7da2(0x118)]??0x0,this['typesData']=Array[_0x4b7da2(0x103)](_0x10407a?.[_0x4b7da2(0x140)])?_0x10407a[_0x4b7da2(0x140)]['slice']()[_0x4b7da2(0x131)]((_0x4677b7,_0x1394ac)=>String(_0x4677b7?.[_0x4b7da2(0x136)]||'')[_0x4b7da2(0x12c)](String(_0x1394ac?.[_0x4b7da2(0x136)]||'')))['map'](_0x28bcd9=>({..._0x28bcd9,'workerCount':_0xd2d618[_0x28bcd9?.[_0x4b7da2(0x136)]]??0x0})):[],this[_0x4b7da2(0x122)][_0x4b7da2(0x132)]||await this[_0x4b7da2(0x124)](),this['_mergeRegisteredTypes'](),this['selectedType']&&!this['typesData'][_0x4b7da2(0x14a)](_0x22a5ad=>_0x22a5ad?.[_0x4b7da2(0x136)]===this[_0x4b7da2(0x11b)])&&(this['selectedType']=null,_0x1422a4['$dispatch']('type',null));}catch(_0x5330cd){console[_0x4b7da2(0x10f)](_0x4b7da2(0x138),_0x5330cd),await this['loadFromStats'](),this[_0x4b7da2(0x106)]();}finally{this[_0x4b7da2(0x123)]=!0x1;}},'_mergeRegisteredTypes'(){const _0x574714=_0x525295,_0x194029=new Set(this[_0x574714(0x122)][_0x574714(0x145)](_0x5be03b=>_0x5be03b?.['type']));for(const _0x38bee2 of Object[_0x574714(0x147)](this[_0x574714(0x12d)]))_0x194029['has'](_0x38bee2)||this[_0x574714(0x122)][_0x574714(0x11d)]({'type':_0x38bee2,'total':0x0,'byStatus':{},'workerCount':this[_0x574714(0x128)][_0x38bee2]??0x0});this['typesData'][_0x574714(0x131)]((_0x2da0db,_0x262dea)=>String(_0x2da0db?.['type']||'')[_0x574714(0x12c)](String(_0x262dea?.['type']||'')));},async 'loadFromStats'(){const _0x404faa=_0x525295;try{const _0x36f61b=await fetch(_0x4f23ce[_0x404faa(0x13c)]+_0x404faa(0x101));if(!_0x36f61b['ok'])throw new Error(_0x404faa(0x108));const _0xeea7b0=await _0x36f61b[_0x404faa(0x142)](),_0x397143=_0xeea7b0?.[_0x404faa(0x12a)]??_0xeea7b0?.[_0x404faa(0x141)]??null,_0x3e6cbd=_0x397143?.[_0x404faa(0x127)]||{};this[_0x404faa(0x118)]=_0x397143?.[_0x404faa(0x118)]??0x0,this[_0x404faa(0x122)]=Object[_0x404faa(0x147)](_0x3e6cbd)[_0x404faa(0x131)]((_0x4bf8cc,_0x14f165)=>_0x4bf8cc[_0x404faa(0x12c)](_0x14f165))['map'](_0x1aba89=>({'type':_0x1aba89,'total':_0x3e6cbd[_0x1aba89]?.['total']??0x0,'byStatus':_0x3e6cbd[_0x1aba89]?.['byStatus']||{},'workerCount':this[_0x404faa(0x128)]?.[_0x1aba89]??0x0}));}catch(_0x511626){console[_0x404faa(0x10f)](_0x404faa(0x13e),_0x511626),this[_0x404faa(0x118)]=0x0,this[_0x404faa(0x122)]=[];}},get 'types'(){const _0x18d8aa=_0x525295,_0x4b29fc=(this[_0x18d8aa(0x137)]||'')['trim']()[_0x18d8aa(0x110)]();return _0x4b29fc?this['typesData'][_0x18d8aa(0x13b)](_0x1b08df=>String(_0x1b08df?.[_0x18d8aa(0x136)]||'')[_0x18d8aa(0x110)]()[_0x18d8aa(0x114)](_0x4b29fc)):this[_0x18d8aa(0x122)];},'totalFor'(_0x3a05e6){const _0x14fa6a=_0x525295;return _0x3a05e6?this[_0x14fa6a(0x122)][_0x14fa6a(0x143)](_0x1148d9=>_0x1148d9?.[_0x14fa6a(0x136)]===_0x3a05e6)?.[_0x14fa6a(0x118)]??0x0:this[_0x14fa6a(0x118)];},'totalWorkers'(){const _0x46b8cb=_0x525295;return Object[_0x46b8cb(0x10a)](this[_0x46b8cb(0x128)]||{})[_0x46b8cb(0x119)]((_0x4d9688,_0x177379)=>_0x4d9688+Number(_0x177379||0x0),0x0);},'jtStatus'(_0x4e1643){const _0xd78de1=_0x525295;return this[_0xd78de1(0x12d)][_0x4e1643]?.['status']??null;},'jtStatusColor'(_0x28f8f0){return s[this['jtStatus'](_0x28f8f0)]??null;},'selectType'(_0x110f3a){const _0x3dfc4b=_0x525295;this['selectedType']=_0x110f3a??null,_0x1422a4[_0x3dfc4b(0x139)](_0x3dfc4b(0x136),this[_0x3dfc4b(0x11b)]);},async 'refresh'(){const _0x5286a3=_0x525295;await this[_0x5286a3(0x133)]();},'clearFilter'(){const _0x1b46e7=_0x525295;this[_0x1b46e7(0x137)]='';},'_scheduleLoad'(){const _0x381a5c=_0x525295;clearTimeout(this[_0x381a5c(0x117)]),this[_0x381a5c(0x117)]=setTimeout(()=>this[_0x381a5c(0x133)](),0x190);}}),async 'mount'(_0xfde8c6){const _0x3601d1=_0x525295;await this['load'](),this[_0x3601d1(0x11b)]=_0xfde8c6['$attr'][_0x3601d1(0x12f)]??null;const _0x13ca70=()=>this[_0x3601d1(0x111)]();this[_0x3601d1(0x10e)]=[_0x592aa9['on'](_0x3601d1(0x129),_0x13ca70),_0x592aa9['on']('queue:done',_0x13ca70),_0x592aa9['on'](_0x3601d1(0x135),_0x13ca70),_0x592aa9['on']('queue:retry',_0x13ca70),_0x592aa9['on'](_0x3601d1(0x112),_0x13ca70),_0x592aa9['on'](_0x3601d1(0x109),_0x13ca70),_0x592aa9['on'](_0x3601d1(0x10c),_0x13ca70),_0x592aa9['on'](_0x3601d1(0x121),_0x13ca70),_0x592aa9['on'](_0x3601d1(0x12e),_0x13ca70),_0x592aa9['on'](_0x3601d1(0x134),_0x13ca70)],_0xfde8c6[_0x3601d1(0x13f)](()=>_0x4f23ce[_0x3601d1(0x126)],()=>{const _0xabdb4c=_0x3601d1;this[_0xabdb4c(0x118)]=0x0,this['typesData']=[],this['filterText']='',this[_0xabdb4c(0x11b)]=null,_0xfde8c6[_0xabdb4c(0x139)]('type',null),this[_0xabdb4c(0x133)]();}),_0xfde8c6['$watch'](()=>_0xfde8c6[_0x3601d1(0x115)][_0x3601d1(0x12f)],_0x396054=>{const _0x25e692=_0x3601d1;this[_0x25e692(0x11b)]=_0x396054??null;});},'unmount'(){const _0x4627e0=_0x525295;clearTimeout(this[_0x4627e0(0x117)]);for(const _0x31c0df of this['_unsubs'])_0x31c0df();this[_0x4627e0(0x10e)]=[];},'template':_0x525295(0x105),'style':_0x525295(0x11c)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0x2e2a(_0x559c6a,_0x601bdb){_0x559c6a=_0x559c6a-0x16a;const _0x46963d=_0x4696();let _0x2e2ab3=_0x46963d[_0x559c6a];return _0x2e2ab3;}const _0x605d6d=_0x2e2a;(function(_0x440a52,_0x457f83){const _0xdbc91f=_0x2e2a,_0x18e984=_0x440a52();while(!![]){try{const _0x1d081d=-parseInt(_0xdbc91f(0x1be))/0x1*(parseInt(_0xdbc91f(0x17d))/0x2)+parseInt(_0xdbc91f(0x182))/0x3+parseInt(_0xdbc91f(0x18d))/0x4+-parseInt(_0xdbc91f(0x1b1))/0x5*(parseInt(_0xdbc91f(0x1c1))/0x6)+-parseInt(_0xdbc91f(0x1d4))/0x7+-parseInt(_0xdbc91f(0x16e))/0x8+parseInt(_0xdbc91f(0x1b8))/0x9*(parseInt(_0xdbc91f(0x16a))/0xa);if(_0x1d081d===_0x457f83)break;else _0x18e984['push'](_0x18e984['shift']());}catch(_0x5cb74d){_0x18e984['push'](_0x18e984['shift']());}}}(_0x4696,0xdfb38));function _0x4696(){const _0x18c740=['functions','jobtype','32502290kegxPU','job','Must\x20be\x20(ctx)\x20=>\x20{\x20…\x20}','process','3938656GcaIXp','handler','engine:stopped','$attr','logs','#facc15','stats','Delete\x20worker\x20\x22','default','POST','new','normalized','return\x20(','error','building','90BJjBgc','samplePayload','config','busy','job_type','2184669yEFtfx','/engines/','\x22\x20created','_unsubs','stringify','existing','$ok','shared','engine:error','now','previewError','330628zDawIO','state','resume','jobType','\x20failed','reduce','existingFn','/functions','fnMode','envName','pollInterval','createSuccess','Worker\x20resumed','key','sort','-preview-1','fnSource','Worker\x20\x22','queue-workers','var(--okdb-app-fg-muted)','var(--okdb-danger)','Failed\x20(','replace','online','createError','Example\x20queue\x20payload','\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=>\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>','selectedEnv','__preview__','trim','result','test','apiBase','filter','fnValidation','Failed\x20to\x20create\x20function','6444455TkrtVz','processed','application/json','fnName','loadFunctions','catch','data','9btvNYI','toast','json','load','Worker\x20restarted','failed','142WDOOLV','open','/functions/preview','6WaKSgP','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}','canCreate','previewResult','name','creating','status','$watch','showCreate','/engines','#818cf8','message','normal','handlerName','Edit\x20Worker\x20·\x20','map','pause','type','modal','9500512pbaApo','function','var(--okdb-success)','previewRunning'];_0x4696=function(){return _0x18c740;};return _0x4696();}import _0x50aefb from'../../../stores/events-store.js';import _0x1d147a from'../../../stores/okdb-store.js';import _0x65c83 from'../../../components/ok-js-input.ok.js';import _0x41d924 from'../../../components/ok-json-input.ok.js';import _0x50454e from'../../engines/modals/engine-modal.ok.js';import _0xda78dc from'../../engines/parts/engine-row-item.ok.js';import{openFunctionRoute as _0x8056ab}from'../../engines/engine-ui-utils.js';const s=_0x605d6d(0x1c2),p=[/(^|[^\w$.])require\s*\(/,/(^|[^\w$.])import\b/,/(^|[^\w$.])console\b/,/(^|[^\w$.])process\b/];function d(_0x2da846){const _0x56b710=_0x605d6d,_0x56f12e=(_0x2da846||'')[_0x56b710(0x1a3)](/\r\n/g,'\x0a')['trim']();if(!_0x56f12e)return{'ok':!0x1,'message':'Source\x20required'};if(!/^(async\s+)?\(\s*[A-Za-z_$][\w$]*\s*\)\s*=>/[_0x56b710(0x1ac)](_0x56f12e))return{'ok':!0x1,'message':_0x56b710(0x16c)};for(const _0x540d0c of p)if(_0x540d0c['test'](_0x56f12e))return{'ok':!0x1,'message':'Forbidden\x20pattern'};try{new Function(_0x56b710(0x17a)+_0x56f12e+');')();}catch(_0x129629){return{'ok':!0x1,'message':_0x129629[_0x56b710(0x1cc)]};}return{'ok':!0x0,'normalized':_0x56f12e};}function l(_0x21bf37='job'){const _0x15b2b5=_0x605d6d;return{'id':_0x21bf37+_0x15b2b5(0x19c),'type':_0x21bf37,'action':_0x15b2b5(0x16d),'priority':_0x15b2b5(0x1cd),'sample':!0x0,'data':{'note':_0x15b2b5(0x1a6)}};}function c(_0x50109b){const _0x16b2f4=_0x605d6d;try{return JSON[_0x16b2f4(0x186)](_0x50109b,null,0x2);}catch{return String(_0x50109b??'');}}export default{'tag':_0x605d6d(0x19f),'dependencies':[_0x65c83,_0x41d924,_0x50454e,_0xda78dc],'attr':{'jobtype':{}},'context':_0x1d97ea=>({'workers':[],'busy':!0x1,'error':null,'_unsubs':[],'showCreate':!0x1,'creating':!0x1,'createError':null,'createSuccess':null,'fnName':'','fnSource':s,'fnValidation':d(s),'fnMode':_0x605d6d(0x178),'existingFn':'','functions':[],'concurrency':0x1,'pollInterval':0x64,'advanced':!0x1,'samplePayload':l(_0x605d6d(0x16b)),'previewRunning':!0x1,'previewResult':null,'previewError':null,get 'jobType'(){const _0x3da4dc=_0x605d6d;return _0x1d97ea[_0x3da4dc(0x171)][_0x3da4dc(0x1d9)]||'';},get 'envName'(){const _0x37afeb=_0x605d6d;return _0x1d147a[_0x37afeb(0x1a8)]||_0x37afeb(0x176);},get 'apiBase'(){const _0x36a3f9=_0x605d6d;return _0x1d147a[_0x36a3f9(0x1ad)];},get 'handlerName'(){const _0x1f99a4=_0x605d6d;return _0x1f99a4(0x187)===this[_0x1f99a4(0x195)]?this[_0x1f99a4(0x193)]:this[_0x1f99a4(0x1b4)][_0x1f99a4(0x1aa)]();},get 'hasBoundJobType'(){const _0x3529cb=_0x605d6d;return!!this[_0x3529cb(0x190)];},get 'canCreate'(){const _0x1ebb68=_0x605d6d;return!(!this[_0x1ebb68(0x190)]||!this[_0x1ebb68(0x1ce)]||_0x1ebb68(0x178)===this[_0x1ebb68(0x195)]&&!this[_0x1ebb68(0x1af)]['ok']);},get 'previewOk'(){const _0x2d063e=_0x605d6d;return!!this[_0x2d063e(0x1c4)]&&_0x2d063e(0x17b)!==this[_0x2d063e(0x1c4)][_0x2d063e(0x1c7)]&&!this['previewResult'][_0x2d063e(0x17b)];},get 'previewLogs'(){const _0x32f144=_0x605d6d;return Array['isArray'](this[_0x32f144(0x1c4)]?.[_0x32f144(0x172)])?this[_0x32f144(0x1c4)][_0x32f144(0x172)]:[];},get 'previewDuration'(){return this['previewResult']?.['execution']?.['durationMs']??null;},get 'totalProcessed'(){const _0x454d69=_0x605d6d;return(this['workers']??[])['reduce']((_0x2ccc3d,_0x20281f)=>_0x2ccc3d+Number(_0x20281f?.[_0x454d69(0x174)]?.[_0x454d69(0x1b2)]??0x0),0x0);},get 'totalFailed'(){const _0x4bbb9f=_0x605d6d;return(this['workers']??[])[_0x4bbb9f(0x192)]((_0x3b9378,_0x1bead3)=>_0x3b9378+Number(_0x1bead3?.[_0x4bbb9f(0x174)]?.[_0x4bbb9f(0x1bd)]??0x0),0x0);},async 'load'(){const _0x66e8e=_0x605d6d;if(!this[_0x66e8e(0x190)])return this['workers']=[],this['error']=null,void(this['busy']=!0x1);this[_0x66e8e(0x180)]=!0x0,this[_0x66e8e(0x17b)]=null;try{const _0x509932=await fetch(this[_0x66e8e(0x1ad)]+'/engines?type=queue-worker'),_0xfaf39f=await _0x509932[_0x66e8e(0x1ba)](),_0x4c5048=_0xfaf39f?.[_0x66e8e(0x1ab)]??_0xfaf39f?.['data']??[];this['workers']=_0x4c5048[_0x66e8e(0x1ae)](_0x3bab5f=>_0x3bab5f['config']?.[_0x66e8e(0x181)]===this[_0x66e8e(0x190)]);}catch(_0x2d1090){this[_0x66e8e(0x17b)]=_0x2d1090?.[_0x66e8e(0x1cc)]||String(_0x2d1090);}finally{this['busy']=!0x1;}},async 'loadFunctions'(){const _0x5e28fe=_0x605d6d;try{const _0x3023d6=await fetch(this[_0x5e28fe(0x1ad)]+_0x5e28fe(0x194)),_0x4cd839=await _0x3023d6['json']();this['functions']=(_0x4cd839?.[_0x5e28fe(0x1ab)]??_0x4cd839?.['data']??[])[_0x5e28fe(0x1d0)](_0x332285=>_0x332285[_0x5e28fe(0x1c5)]??_0x332285[_0x5e28fe(0x19a)]??_0x332285)[_0x5e28fe(0x1ae)](Boolean)[_0x5e28fe(0x19b)]();}catch{this[_0x5e28fe(0x1d8)]=[];}},'openCreate'(){const _0x41e941=_0x605d6d;this[_0x41e941(0x190)]&&(this['showCreate']=!0x0,this[_0x41e941(0x1a5)]=null,this['createSuccess']=null,this[_0x41e941(0x1b4)]='',this['fnSource']=s,this['fnValidation']=d(s),this['fnMode']='new',this[_0x41e941(0x193)]='',this[_0x41e941(0x1c4)]=null,this[_0x41e941(0x18c)]=null,this['concurrency']=0x1,this[_0x41e941(0x197)]=0x64,this[_0x41e941(0x17e)]=l(this[_0x41e941(0x190)]),this['loadFunctions']());},'cancelCreate'(){const _0x22d902=_0x605d6d;this[_0x22d902(0x1c9)]=!0x1,this[_0x22d902(0x1a5)]=null;},'pickExistingFn'(){const _0x4b9307=_0x605d6d;this[_0x4b9307(0x195)]=_0x4b9307(0x187),this[_0x4b9307(0x1b5)]();},'pickNewFn'(){const _0x4369de=_0x605d6d;this[_0x4369de(0x195)]='new',this[_0x4369de(0x19d)]?.[_0x4369de(0x1aa)]()||(this['fnSource']=s,this[_0x4369de(0x1af)]=d(this[_0x4369de(0x19d)]));},'updateSource'(_0x1789c7){const _0x3c2e58=_0x605d6d;this[_0x3c2e58(0x19d)]=_0x1789c7??'',this[_0x3c2e58(0x1af)]=d(this[_0x3c2e58(0x19d)]);},async 'preview'(){const _0x2c6995=_0x605d6d;if(this[_0x2c6995(0x1af)]['ok']&&!this['previewRunning']){this[_0x2c6995(0x1d7)]=!0x0,this[_0x2c6995(0x1c4)]=null,this[_0x2c6995(0x18c)]=null;try{const _0x5b3e8c=await fetch(this[_0x2c6995(0x1ad)]+_0x2c6995(0x1c0),{'method':_0x2c6995(0x177),'headers':{'Content-Type':_0x2c6995(0x1b3)},'body':JSON[_0x2c6995(0x186)]({'source':this['fnValidation'][_0x2c6995(0x179)],'payload':this[_0x2c6995(0x17e)],'jobContext':{'id':_0x2c6995(0x1a9),'type':this[_0x2c6995(0x190)],'tries':0x1,'created':Date[_0x2c6995(0x18b)](),'tags':null,'priority':0x0}})}),_0x2336f7=await _0x5b3e8c['json']();this[_0x2c6995(0x1c4)]=_0x2336f7?.[_0x2c6995(0x1ab)]??_0x2336f7?.[_0x2c6995(0x1b7)]??null;}catch(_0x418987){this[_0x2c6995(0x18c)]=_0x418987?.[_0x2c6995(0x1cc)]||String(_0x418987);}finally{this[_0x2c6995(0x1d7)]=!0x1;}}},async 'create'(){const _0x2a0d51=_0x605d6d;if(this[_0x2a0d51(0x1c3)]&&!this[_0x2a0d51(0x1c6)]){this[_0x2a0d51(0x1c6)]=!0x0,this[_0x2a0d51(0x1a5)]=null;try{if(_0x2a0d51(0x178)===this[_0x2a0d51(0x195)]){const _0x100776=await fetch(this[_0x2a0d51(0x1ad)]+_0x2a0d51(0x194),{'method':_0x2a0d51(0x177),'headers':{'Content-Type':_0x2a0d51(0x1b3)},'body':JSON[_0x2a0d51(0x186)]({'name':this[_0x2a0d51(0x1b4)][_0x2a0d51(0x1aa)](),'source':this['fnValidation']['normalized'],'enabled':!0x0,'metadata':{'description':'Queue\x20worker\x20for\x20'+this[_0x2a0d51(0x190)]}})}),_0x3b63da=await _0x100776[_0x2a0d51(0x1ba)]();if(!_0x100776['ok'])throw new Error(_0x3b63da?.[_0x2a0d51(0x17b)]?.[_0x2a0d51(0x1cc)]||_0x2a0d51(0x1b0));}const _0x2c49d0=this['jobType']+'-'+this[_0x2a0d51(0x1ce)],_0x5a0e45=await fetch(this[_0x2a0d51(0x1ad)]+_0x2a0d51(0x1ca),{'method':_0x2a0d51(0x177),'headers':{'Content-Type':_0x2a0d51(0x1b3)},'body':JSON[_0x2a0d51(0x186)]({'type':'queue-worker','name':_0x2c49d0,'config':{'job_type':this[_0x2a0d51(0x190)],'handler':{'kind':_0x2a0d51(0x1d5),'name':this['handlerName']},'concurrency':Number(this['concurrency'])||0x1,'pollInterval':Number(this['pollInterval'])||0x64}})}),_0x5d3ab9=await _0x5a0e45[_0x2a0d51(0x1ba)]();if(!_0x5a0e45['ok'])throw new Error(_0x5d3ab9?.[_0x2a0d51(0x17b)]?.['message']||_0x2a0d51(0x1a2)+_0x5a0e45[_0x2a0d51(0x1c7)]+')');this[_0x2a0d51(0x198)]=_0x2a0d51(0x19e)+_0x2c49d0+_0x2a0d51(0x184),this[_0x2a0d51(0x1c9)]=!0x1,await this[_0x2a0d51(0x1bb)]();}catch(_0x512467){this['createError']=_0x512467?.['message']||String(_0x512467);}finally{this[_0x2a0d51(0x1c6)]=!0x1;}}},async 'doAction'(_0x3c960c,_0x14191c){const _0x513c49=_0x605d6d;try{const _0x560aa0=await fetch(this['apiBase']+_0x513c49(0x183)+encodeURIComponent(_0x3c960c[_0x513c49(0x1d2)])+'/'+encodeURIComponent(_0x3c960c['name'])+'/'+_0x14191c,{'method':'POST'}),_0x25b128=await _0x560aa0[_0x513c49(0x1ba)]()[_0x513c49(0x1b6)](()=>({}));if(!_0x560aa0['ok'])throw new Error(_0x25b128?.[_0x513c49(0x17b)]?.[_0x513c49(0x1cc)]||_0x14191c+_0x513c49(0x191));const _0x435b2c=_0x513c49(0x1d1)===_0x14191c?'Worker\x20paused':_0x513c49(0x18f)===_0x14191c?_0x513c49(0x199):'restart'===_0x14191c?_0x513c49(0x1bc):'Worker\x20'+_0x14191c+'d';_0x1d97ea[_0x513c49(0x188)]['shared']?.[_0x513c49(0x1b9)]?.['info']?.(_0x435b2c),await this[_0x513c49(0x1bb)]();}catch(_0x1a4d2f){_0x1d97ea['$ok'][_0x513c49(0x189)]?.[_0x513c49(0x1b9)]?.[_0x513c49(0x17b)]?.(_0x1a4d2f?.['message']||_0x14191c+'\x20failed');}},async 'doDelete'(_0x3f5915){const _0x4a5979=_0x605d6d;if(confirm(_0x4a5979(0x175)+_0x3f5915['name']+'\x22?'))try{await fetch(this['apiBase']+_0x4a5979(0x183)+encodeURIComponent(_0x3f5915[_0x4a5979(0x1d2)])+'/'+encodeURIComponent(_0x3f5915[_0x4a5979(0x1c5)]),{'method':'DELETE'}),await this[_0x4a5979(0x1bb)]();}catch{}},async 'openWorkerModal'(_0x88bbb8){const _0x4c8033=_0x605d6d;if(!_0x88bbb8)return;const _0x4af481=this;await _0x1d97ea['$ok'][_0x4c8033(0x189)][_0x4c8033(0x1d3)][_0x4c8033(0x1bf)]({'owner':_0x1d97ea,'title':_0x4c8033(0x1cf)+_0x88bbb8[_0x4c8033(0x1c5)],'canDrag':!0x0,'content':'<engine-modal\x20:modal=\x22modal\x22\x20:engine=\x22engine\x22\x20:env=\x22envName\x22\x20:on-done=\x22onDone\x22\x20/>','context':_0x45f6d8=>({'modal':_0x45f6d8,'engine':_0x88bbb8,'envName':_0x4af481[_0x4c8033(0x196)],'onDone':async()=>{const _0x2e0d04=_0x4c8033;await _0x4af481[_0x2e0d04(0x1bb)]();}})});},'openWorkerFunction'(_0x108e16,_0x536587){const _0x485c9=_0x605d6d;_0x536587?.['stopPropagation']?.();const _0x1011b5=_0x108e16?.[_0x485c9(0x17f)]?.[_0x485c9(0x16f)]?.[_0x485c9(0x1c5)];_0x1011b5&&_0x8056ab(_0x1d97ea,_0x1011b5);},'stateColor'(_0x486143){const _0x38da7c=_0x605d6d,_0x16b024=_0x486143?.[_0x38da7c(0x174)]?.[_0x38da7c(0x18e)]??_0x486143?.[_0x38da7c(0x1c7)];return _0x38da7c(0x1a4)===_0x16b024?_0x38da7c(0x1d6):_0x38da7c(0x17b)===_0x16b024?_0x38da7c(0x1a1):'paused'===_0x16b024?_0x38da7c(0x1cb):_0x38da7c(0x17c)===_0x16b024?_0x38da7c(0x173):_0x38da7c(0x1a0);},'stateLabel':_0x152cb8=>_0x152cb8?.[_0x605d6d(0x174)]?.[_0x605d6d(0x18e)]??_0x152cb8?.[_0x605d6d(0x1c7)]??'—','previewStatusColor':_0x2115f7=>_0x2115f7?'error'===_0x2115f7[_0x605d6d(0x1c7)]||_0x2115f7[_0x605d6d(0x17b)]?'var(--okdb-danger)':_0x605d6d(0x1d6):_0x605d6d(0x1a0),'formatJson':c}),async 'mount'(_0x5d8ba4){const _0x21259a=_0x605d6d;await this[_0x21259a(0x1bb)]();const _0x431d09=()=>this[_0x21259a(0x1bb)]();this[_0x21259a(0x185)]=[_0x50aefb['on']('engine:started',_0x431d09),_0x50aefb['on'](_0x21259a(0x170),_0x431d09),_0x50aefb['on'](_0x21259a(0x18a),_0x431d09)],_0x5d8ba4[_0x21259a(0x1c8)](()=>_0x5d8ba4[_0x21259a(0x171)][_0x21259a(0x1d9)],()=>{const _0x45f586=_0x21259a;this[_0x45f586(0x1c9)]=!0x1,this[_0x45f586(0x1c4)]=null,this[_0x45f586(0x18c)]=null,this[_0x45f586(0x17e)]=l(_0x5d8ba4[_0x45f586(0x171)][_0x45f586(0x1d9)]||_0x45f586(0x16b)),this[_0x45f586(0x1bb)]();}),_0x5d8ba4['$watch'](()=>_0x1d147a[_0x21259a(0x1a8)],()=>{const _0x2fc2a4=_0x21259a;this[_0x2fc2a4(0x1c9)]=!0x1,this[_0x2fc2a4(0x1bb)]();});},'unmount'(){for(const _0x479024 of this['_unsubs'])_0x479024();this['_unsubs']=[];},'template':_0x605d6d(0x1a7)};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<script type="module">import syncTopology from"./parts/sync-topology.ok.js";import syncRetention from"./parts/sync-retention.ok.js";export default{tag:"sync-index",unwrap:!0,dependencies:[syncTopology,syncRetention],context:()=>({loading:!1,error:null,topology:null,availableEnvs:[],selectedNodeId:null,showConnect:!1,joinAddress:"",dataLink:!0,joinToken:"",joinUsername:"",joinPassword:"",showPasswordAuth:!1,joining:!1,joinError:null,selfNode:null,selfClock:null,selfClocks:{},selfTagsInput:"",savingSelf:!1,saveSelfError:null,async loadSelf(){try{const s=await fetch(`${__ENV__.API}/sync/info`),o=await s.json();s.ok&&(this.selfNode=o.data?.node??null,this.selfClock=o.data?.clock??null,this.selfClocks=o.data?.clocks??{},this.selfTagsInput=(this.selfNode?.tags??[]).join(", "))}catch{}},async loadTopology(){this.loading=!0,this.error=null;try{const s=await fetch(`${__ENV__.API}/sync/topology`),o=await s.json();if(!s.ok)throw new Error(o?.error?.message||"Failed to load topology");const t=o.data??o;this.topology=t.topology??t,this.availableEnvs=t.availableEnvs??[]}catch(s){this.error=s?.message||String(s)}finally{this.loading=!1}},async loadIdentity(){},openConnect(){this.joinAddress="",this.joinToken="",this.joinUsername="",this.joinPassword="",this.joinError=null,this.showPasswordAuth=!1,this.showConnect=!0},closeConnect(){this.showConnect=!1,this.joinError=null},async joinCluster(){if(this.joinAddress&&!this.joining){this.joining=!0,this.joinError=null;try{const s={address:this.joinAddress,data_link:this.dataLink};!this.showPasswordAuth&&this.joinToken.trim()?s.token=this.joinToken.trim():this.showPasswordAuth&&this.joinUsername.trim()&&(s.username=this.joinUsername.trim(),s.password=this.joinPassword);const o=await fetch(`${__ENV__.API}/sync/connect`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),t=await o.json();if(!o.ok)throw new Error(t?.error?.message||"Connect failed");this.closeConnect(),await this.loadTopology()}catch(s){this.joinError=s.message}finally{this.joining=!1}}},get selfClockEntries(){return Object.entries(this.selfClocks).filter(([s])=>"~system"!==s)},get selfTagList(){return this.parseTags(this.selfTagsInput)},parseTags:s=>String(s??"").split(",").map(s=>s.trim()).filter(Boolean).filter((s,o,t)=>t.indexOf(s)===o),selectNode(s){this.selectedNodeId=s||null},async saveSelfTags(){if(!this.savingSelf){this.savingSelf=!0,this.saveSelfError=null;try{const s=await fetch(`${__ENV__.API}/sync/self`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({tags:this.selfTagList})}),o=await s.json();if(!s.ok)throw new Error(o?.error?.message||"Failed to save node tags");this.selfNode=o.data?.node??o.result?.node??this.selfNode,this.selfTagsInput=(this.selfNode?.tags??[]).join(", "),await this.loadTopology()}catch(s){this.saveSelfError=s?.message||String(s)}finally{this.savingSelf=!1}}},async copyText(s){try{await navigator.clipboard.writeText(String(s??""))}catch(s){}}}),async mount(){await this.loadSelf(),await this.loadTopology()}}</script><template><component import="../../layouts/_default.ok.html"><template name="sidebar"><if :="selfNode"><div style="background:var(--okdb-app-surface);border:1px solid var(--okdb-app-border);border-radius:10px;padding:10px 12px;font-size:12px;display:flex;flex-direction:column;gap:6px"><div style="font-size:10px;text-transform:uppercase;letter-spacing:.06em;opacity:.5;margin-bottom:2px">This Node</div><div style="display:flex;align-items:center;gap:6px"><span style="width:7px;height:7px;border-radius:50%;background:var(--okdb-success);flex-shrink:0"></span> <span style="font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">{{selfNode.name || selfNode.id?.slice(0,8)}}</span></div><div style="display:grid;grid-template-columns:52px 1fr;gap:3px 8px;opacity:.8"><span style="opacity:.6">ID</span><div style="display:flex;align-items:center;gap:4px"><span style="font-family:monospace;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">{{selfNode.id?.slice(0, 12)}}… </span><span @click="copyText(selfNode.id)" style="cursor:pointer;opacity:.5;font-size:10px">⎘</span></div><if :="selfNode.address"><span style="opacity:.6">Addr</span> <span style="font-family:monospace;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" :title="selfNode.address">{{selfNode.address}}</span></if></div><div style="border-top:1px solid var(--okdb-app-border);padding-top:8px;margin-top:4px;display:flex;flex-direction:column;gap:8px"><div style="font-size:10px;opacity:.4;text-transform:uppercase;letter-spacing:.05em">Node Tags</div><input :value="selfTagsInput" @input="selfTagsInput = $event.target.value" @keydown.enter="saveSelfTags()" placeholder="gpu, region:eu, fast-storage" style="font-family:monospace;font-size:12px"/><div style="display:flex;flex-wrap:wrap;gap:6px;min-height:20px"><if :="selfTagList.length === 0"><span style="font-size:11px;opacity:.45">No tags</span></if><for :="selfTagList" let:tag><span style="font-size:10px;padding:2px 8px;border-radius:999px;border:1px solid var(--okdb-accent-soft-border);color:var(--okdb-accent);background:var(--okdb-accent-soft-bg)">{{tag}}</span></for></div><if :="saveSelfError"><div style="font-size:11px;color:var(--okdb-danger)">{{saveSelfError}}</div></if><div style="display:flex;justify-content:flex-end"><button @click="saveSelfTags()" :disabled="savingSelf" style="font-size:11px;padding:4px 10px;background:var(--okdb-sky-soft-bg);border-color:var(--okdb-sky-soft-border);color:var(--okdb-sky)">{{ savingSelf ? 'Saving…' : 'Save Tags' }}</button></div></div><if :="selfClockEntries.length"><div style="border-top:1px solid var(--okdb-app-border);padding-top:6px;margin-top:2px"><div style="font-size:10px;opacity:.4;margin-bottom:4px;text-transform:uppercase;letter-spacing:.05em">Clocks</div><div style="display:grid;grid-template-columns:64px 1fr;gap:2px 8px;font-size:11px"><for :="selfClockEntries" let:entry><span style="opacity:.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">{{entry[0]}}</span> <span style="font-family:monospace;opacity:.8">{{entry[1]}}</span></for></div></div></if></div></if></template><template name="default"><div style="display:flex;flex-direction:column;gap:20px;height:100%"><div style="display:flex;justify-content:space-between;align-items:center"><div style="font-weight:600;font-size:18px">Sync Cluster</div><div style="display:flex;gap:8px"><button @click="loadTopology()" :disabled="loading">Refresh</button> <button @click="openConnect()" style="background:var(--okdb-sky-soft-bg);border-color:var(--okdb-sky-soft-border);color:var(--okdb-sky)">+ Connect Node</button></div></div><if :="error"><div style="color:var(--okdb-danger);font-size:13px">{{error}}</div></if><sync-topology :topology="topology" :available-envs="availableEnvs" :self-id="selfNode?.id" :selected-node-id="selectedNodeId" @select="selectNode($event.detail)"/><div style="border-top:1px solid var(--okdb-app-border);padding-top:20px"><sync-retention/></div></div><if :="showConnect"><div @click.self="closeConnect()" style="position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.65);display:flex;align-items:center;justify-content:center"><div style="background:var(--okdb-app-bg-deep);border:1px solid var(--okdb-app-border);border-radius:14px;padding:24px;width:440px;max-width:calc(100vw - 32px);display:flex;flex-direction:column;gap:16px;box-shadow:0 24px 64px rgba(0,0,0,.6)"><div style="display:flex;justify-content:space-between;align-items:center"><div style="font-weight:700;font-size:16px">Connect to Node</div><span @click="closeConnect()" style="cursor:pointer;opacity:.5;font-size:18px;line-height:1;padding:2px 6px">✕</span></div><div style="display:flex;flex-direction:column;gap:6px"><label style="font-size:11px;opacity:.5;text-transform:uppercase;letter-spacing:.06em">Remote address</label> <input :value="joinAddress" @input="joinAddress = $event.target.value" @keydown.enter="joinCluster()" placeholder="http://host:8484" style="font-family:monospace" autofocus/></div><div style="display:flex;flex-direction:column;gap:8px"><div style="display:flex;align-items:center;justify-content:space-between"><label style="font-size:11px;opacity:.5;text-transform:uppercase;letter-spacing:.06em">Credential</label><div style="display:flex;border:1px solid var(--okdb-app-border);border-radius:6px;overflow:hidden;font-size:11px"><button @click="showPasswordAuth = false" :style="!showPasswordAuth
|
|
2
|
+
? 'background:var(--okdb-app-surface);color:var(--okdb-app-fg-strong);border:none;padding:3px 12px;cursor:pointer;'
|
|
3
|
+
: 'background:transparent;color:var(--okdb-app-fg-subtle);border:none;padding:3px 12px;cursor:pointer;'">Token</button> <button @click="showPasswordAuth = true" :style="showPasswordAuth
|
|
4
|
+
? 'background:var(--okdb-app-surface);color:var(--okdb-app-fg-strong);border:none;padding:3px 12px;cursor:pointer;'
|
|
5
|
+
: 'background:transparent;color:var(--okdb-app-fg-subtle);border:none;padding:3px 12px;cursor:pointer;'">Login</button></div></div><if :="!showPasswordAuth"><input :value="joinToken" @input="joinToken = $event.target.value" @keydown.enter="joinCluster()" placeholder="Bearer token — leave blank if remote is open" style="font-family:monospace;font-size:12px"/></if><if :="showPasswordAuth"><div style="display:flex;gap:8px"><input :value="joinUsername" @input="joinUsername = $event.target.value" placeholder="Username" style="flex:1"/> <input type="password" :value="joinPassword" @input="joinPassword = $event.target.value" @keydown.enter="joinCluster()" placeholder="Password" style="flex:1"/></div></if></div><div style="display:flex;align-items:center;gap:8px;font-size:12px;opacity:.8"><input type="checkbox" id="modalDataLink" :checked="dataLink" @change="dataLink = $event.target.checked" style="cursor:pointer"/> <label for="modalDataLink" style="cursor:pointer">Sync data immediately <span style="opacity:.5;font-size:11px">(unchecked = topology only)</span></label></div><if :="joinError"><div style="font-size:12px;color:var(--okdb-danger);background:var(--okdb-danger-soft-bg);border:1px solid var(--okdb-danger-soft-border);border-radius:8px;padding:8px 12px">{{joinError}}</div></if><div style="display:flex;justify-content:flex-end;gap:8px;margin-top:4px"><button @click="closeConnect()" style="opacity:.7">Cancel</button> <button @click="joinCluster()" :disabled="!joinAddress || joining" style="background:var(--okdb-sky-soft-bg);border-color:var(--okdb-sky-soft-border);color:var(--okdb-sky);min-width:100px">{{ joining ? 'Connecting…' : 'Connect' }}</button></div></div></div></if></template></component></template>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0x3ef4(_0x57d561,_0x641bbb){_0x57d561=_0x57d561-0x7e;var _0x535b9b=_0x535b();var _0x3ef4d6=_0x535b9b[_0x57d561];return _0x3ef4d6;}var _0x1a83e2=_0x3ef4;(function(_0x24dc7e,_0x7d02da){var _0x48a8ba=_0x3ef4,_0x169e2f=_0x24dc7e();while(!![]){try{var _0x3db84b=-parseInt(_0x48a8ba(0x84))/0x1*(parseInt(_0x48a8ba(0x91))/0x2)+parseInt(_0x48a8ba(0x80))/0x3+-parseInt(_0x48a8ba(0x8f))/0x4*(-parseInt(_0x48a8ba(0x8c))/0x5)+parseInt(_0x48a8ba(0x8d))/0x6+-parseInt(_0x48a8ba(0x89))/0x7*(-parseInt(_0x48a8ba(0x83))/0x8)+-parseInt(_0x48a8ba(0x8e))/0x9*(-parseInt(_0x48a8ba(0x7f))/0xa)+parseInt(_0x48a8ba(0x8a))/0xb*(-parseInt(_0x48a8ba(0x88))/0xc);if(_0x3db84b===_0x7d02da)break;else _0x169e2f['push'](_0x169e2f['shift']());}catch(_0x375dc5){_0x169e2f['push'](_0x169e2f['shift']());}}}(_0x535b,0xabea3));function _0x535b(){var _0x507da2=['286XjUAgO','isArray','90EfnLvl','2935296gKBBqH','8763246gDirxK','162136nAkunD','sync-node-detail','1543710hQonCa','topology','10sglVbI','53802SBMxfI','node','tags','8PFNAKe','1WSxItD','stringify','$attr','nodeId','678696KUnoPw','5152490kXvNnh'];_0x535b=function(){return _0x507da2;};return _0x535b();}export default{'tag':_0x1a83e2(0x90),'unwrap':!0x0,'context':_0x5ba325=>({get 'topology'(){var _0x58f067=_0x1a83e2;return _0x5ba325[_0x58f067(0x86)]['topology']||{};},get 'nodeId'(){var _0x226941=_0x1a83e2;return _0x5ba325[_0x226941(0x86)][_0x226941(0x87)];},get 'node'(){var _0x21917f=_0x1a83e2;return this[_0x21917f(0x7e)]?.[this[_0x21917f(0x87)]]||null;},get 'tags'(){var _0x1c7932=_0x1a83e2;return Array[_0x1c7932(0x8b)](this[_0x1c7932(0x81)]?.[_0x1c7932(0x82)])?this[_0x1c7932(0x81)][_0x1c7932(0x82)]:[];},'pretty'(_0x1fc179){var _0x2d7e71=_0x1a83e2;if(null==_0x1fc179)return'';try{return JSON[_0x2d7e71(0x85)](_0x1fc179,null,0x2);}catch{return String(_0x1fc179);}}}),'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>'};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _0x2d9fab=_0x3692;function _0x3692(_0xb40b52,_0x1f74bc){_0xb40b52=_0xb40b52-0x107;const _0x2d5ee3=_0x2d5e();let _0x36925b=_0x2d5ee3[_0xb40b52];return _0x36925b;}(function(_0x329288,_0x22d54a){const _0x34c4f9=_0x3692,_0x10d304=_0x329288();while(!![]){try{const _0x498edf=parseInt(_0x34c4f9(0x10a))/0x1*(-parseInt(_0x34c4f9(0x123))/0x2)+parseInt(_0x34c4f9(0x119))/0x3+-parseInt(_0x34c4f9(0x11d))/0x4+parseInt(_0x34c4f9(0x117))/0x5+-parseInt(_0x34c4f9(0x10e))/0x6*(-parseInt(_0x34c4f9(0x139))/0x7)+parseInt(_0x34c4f9(0x132))/0x8*(-parseInt(_0x34c4f9(0x130))/0x9)+parseInt(_0x34c4f9(0x122))/0xa;if(_0x498edf===_0x22d54a)break;else _0x10d304['push'](_0x10d304['shift']());}catch(_0x5c6584){_0x10d304['push'](_0x10d304['shift']());}}}(_0x2d5e,0x89419));function _0x2d5e(){const _0x51b959=['loading','d\x20ago','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>','2827069OEIACB','sync-retention','m\x20ago','status','306099XaPPjz','load','Failed\x20to\x20load\x20GC\x20status','error','6KXjMEF','var(--okdb-warning)','envs','GC\x20run\x20failed','stale','POST','gcHorizon','/sync/gc/status','runError','4968995zwKYWX','message','2148825AopjNC','/resync','/sync/gc/peer/','result','348220qBOihB','API','running','env','#f59e0b18','14680iBMZRL','4qmQsad','values','round','peerRows','data','var(--okdb-success)','just\x20now','h\x20ago','#4ade8018','peerStalenessLimitMs','filter','json','peer_id','909wOUNRw','~system','67640BfjOtl','Stale','floor'];_0x2d5e=function(){return _0x51b959;};return _0x2d5e();}export default{'tag':_0x2d9fab(0x107),'unwrap':!0x0,'context':_0x17905d=>({'loading':!0x1,'error':null,'status':null,'running':!0x1,'runResult':null,'runError':null,async 'load'(){const _0x26983a=_0x2d9fab;this[_0x26983a(0x135)]=!0x0,this[_0x26983a(0x10d)]=null;try{const _0x563c93=await fetch(__ENV__[_0x26983a(0x11e)]+_0x26983a(0x115)),_0x4e1e41=await _0x563c93['json']();if(!_0x563c93['ok'])throw new Error(_0x4e1e41?.[_0x26983a(0x10d)]?.[_0x26983a(0x118)]||_0x26983a(0x10c));this[_0x26983a(0x109)]=_0x4e1e41[_0x26983a(0x127)]??_0x4e1e41[_0x26983a(0x11c)]??null;}catch(_0xe57e7a){this[_0x26983a(0x10d)]=_0xe57e7a?.[_0x26983a(0x118)]||String(_0xe57e7a);}finally{this[_0x26983a(0x135)]=!0x1;}},async 'runGc'(){const _0x2bfd4a=_0x2d9fab;if(!this['running']){this[_0x2bfd4a(0x11f)]=!0x0,this[_0x2bfd4a(0x137)]=null,this[_0x2bfd4a(0x116)]=null;try{const _0x2f16b2=await fetch(__ENV__['API']+'/sync/gc/run',{'method':_0x2bfd4a(0x113)}),_0x14b260=await _0x2f16b2[_0x2bfd4a(0x12e)]();if(!_0x2f16b2['ok'])throw new Error(_0x14b260?.['error']?.[_0x2bfd4a(0x118)]||_0x2bfd4a(0x111));this[_0x2bfd4a(0x137)]=_0x14b260[_0x2bfd4a(0x127)]??_0x14b260[_0x2bfd4a(0x11c)]??null,await this[_0x2bfd4a(0x10b)]();}catch(_0x82df56){this[_0x2bfd4a(0x116)]=_0x82df56?.['message']||String(_0x82df56);}finally{this[_0x2bfd4a(0x11f)]=!0x1;}}},async 'forceResync'(_0x321dd5){const _0x3f87df=_0x2d9fab;try{const _0x1653ba=await fetch(__ENV__[_0x3f87df(0x11e)]+_0x3f87df(0x11b)+encodeURIComponent(_0x321dd5)+_0x3f87df(0x11a),{'method':_0x3f87df(0x113)}),_0x242432=await _0x1653ba[_0x3f87df(0x12e)]();if(!_0x1653ba['ok'])throw new Error(_0x242432?.[_0x3f87df(0x10d)]?.[_0x3f87df(0x118)]||'Force\x20resync\x20failed');await this[_0x3f87df(0x10b)]();}catch(_0x3e1ec2){this['error']=_0x3e1ec2?.[_0x3f87df(0x118)]||String(_0x3e1ec2);}},'fmtClock':_0x57e8d8=>null==_0x57e8d8?'—':Number(_0x57e8d8)['toLocaleString'](),'fmtTime'(_0x475078){const _0x583fda=_0x2d9fab;if(!_0x475078)return'—';const _0x1a07d2=Math['floor'](_0x475078/0x5265c00),_0x270a49=Math['floor'](_0x475078%0x5265c00/0x36ee80),_0x3df00f=Math[_0x583fda(0x134)](_0x475078%0x36ee80/0xea60);return _0x1a07d2>0x0?_0x1a07d2+_0x583fda(0x136):_0x270a49>0x0?_0x270a49+_0x583fda(0x12a):_0x3df00f>0x0?_0x3df00f+_0x583fda(0x108):_0x583fda(0x129);},'statusBadge':_0x4c31cb=>_0x4c31cb[_0x2d9fab(0x112)]?{'label':_0x2d9fab(0x133),'color':_0x2d9fab(0x10f),'bg':_0x2d9fab(0x121)}:{'label':'Healthy','color':_0x2d9fab(0x128),'bg':_0x2d9fab(0x12b)},get 'envRows'(){const _0x49c1d6=_0x2d9fab;return(this[_0x49c1d6(0x109)]?.[_0x49c1d6(0x110)]??[])[_0x49c1d6(0x12d)](_0x1ea0c9=>_0x49c1d6(0x131)!==_0x1ea0c9['env']);},get 'peerRows'(){const _0x2e2d3b=_0x2d9fab;return this[_0x2e2d3b(0x109)]?.['peers']??[];},get 'horizonPinnedBy'(){const _0x166b41=_0x2d9fab,_0x4f3a42={};for(const _0x250623 of this['envRows']){if(!_0x250623[_0x166b41(0x114)])continue;const _0xac2cae=this[_0x166b41(0x126)][_0x166b41(0x12d)](_0x5a48e4=>!_0x5a48e4[_0x166b41(0x112)]&&null!=_0x5a48e4[_0x166b41(0x110)]?.[_0x250623[_0x166b41(0x120)]])['sort']((_0x439228,_0x26cfe9)=>(_0x439228[_0x166b41(0x110)][_0x250623[_0x166b41(0x120)]]||0x0)-(_0x26cfe9['envs'][_0x250623[_0x166b41(0x120)]]||0x0));_0x4f3a42[_0x250623[_0x166b41(0x120)]]=_0xac2cae[0x0]?.[_0x166b41(0x12f)]??null;}return _0x4f3a42;},'isPinnedPeer'(_0x7d6124){const _0x1b81d5=_0x2d9fab;return!!_0x7d6124?.[_0x1b81d5(0x12f)]&&Object[_0x1b81d5(0x124)](this['horizonPinnedBy'])['includes'](_0x7d6124[_0x1b81d5(0x12f)]);},get 'stalenessLimit'(){const _0x3f5b12=_0x2d9fab,_0x487f6e=this[_0x3f5b12(0x109)]?.[_0x3f5b12(0x12c)];return _0x487f6e?Math[_0x3f5b12(0x125)](_0x487f6e/0x5265c00)+'d':null;}}),async 'mount'(){await this['load']();},'template':_0x2d9fab(0x138)};
|