@kedem/okdb 1.0.1 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/okdb.js +1 -1
- package/keys/public.pem +3 -0
- package/okdb.js +1 -1
- package/package.json +2 -2
- package/public/admin-app.js +1 -1
- package/public/components/admin-route-host.ok.js +1 -1
- package/public/components/env-picker.ok.js +1 -1
- package/public/components/field-path-input.ok.js +1 -1
- package/public/components/field.html +154 -2
- package/public/components/geo-map.ok.js +1 -1
- package/public/components/ok-cron-input.ok.js +1 -1
- package/public/components/ok-dropzone.ok.js +1 -1
- package/public/components/ok-js-input.ok.js +1 -1
- package/public/components/ok-json-input.ok.js +1 -1
- package/public/components/ok-text-monaco-input.ok.js +1 -1
- package/public/components/theme-toggle.ok.js +1 -1
- package/public/index.html +29 -2
- package/public/layouts/_default.ok.html +1 -1
- package/public/layouts/okdb-cube.ok.html +1 -1
- package/public/login-app.js +1 -1
- package/public/login.html +205 -1
- package/public/modules/ok.js +1 -1
- package/public/sections/api/index.ok.html +1 -1
- package/public/sections/api/parts/api-endpoint.ok.js +1 -1
- package/public/sections/auth/index.ok.html +1 -1
- package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
- package/public/sections/auth/parts/token-detail.ok.js +1 -1
- package/public/sections/auth/parts/token-list.ok.js +1 -1
- package/public/sections/db/index.ok.html +1 -1
- package/public/sections/db/modals/add-item-modal.ok.js +1 -1
- package/public/sections/db/modals/create-env-modal.ok.js +1 -1
- package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
- package/public/sections/db/modals/create-index-modal.ok.js +1 -1
- package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
- package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
- package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
- package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
- package/public/sections/db/parts/db-overview.ok.js +1 -1
- package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
- package/public/sections/db/parts/edit-row.ok.js +1 -1
- package/public/sections/db/parts/tm-timeline.ok.js +1 -1
- package/public/sections/db/parts/type-changelog.ok.js +1 -1
- package/public/sections/db/parts/type-list.ok.js +1 -1
- package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
- package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
- package/public/sections/db/parts/type-viewer.ok.js +1 -1
- package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
- package/public/sections/docs/index.ok.html +1 -1
- package/public/sections/embeddings/index.ok.html +1 -1
- package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
- package/public/sections/engines/engine-panel-shared-style.js +1 -1
- package/public/sections/engines/engine-ui-utils.js +1 -1
- package/public/sections/engines/index.ok.html +1 -1
- package/public/sections/engines/modals/engine-modal.ok.js +1 -1
- package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
- package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
- package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
- package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
- package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
- package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
- package/public/sections/files/index.ok.html +1 -1
- package/public/sections/files/parts/files-blob-status.ok.js +1 -1
- package/public/sections/files/parts/files-collection-list.ok.js +1 -1
- package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
- package/public/sections/files/parts/files-file-list.ok.js +1 -1
- package/public/sections/files/parts/files-overview.ok.js +1 -1
- package/public/sections/files/parts/files-path-browser.ok.js +1 -1
- package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
- package/public/sections/functions/index.ok.html +1 -1
- package/public/sections/functions/modals/function-modal.ok.js +1 -1
- package/public/sections/functions/parts/function-detail.ok.js +1 -1
- package/public/sections/functions/parts/function-logs.ok.js +1 -1
- package/public/sections/functions/parts/function-runner.ok.js +1 -1
- package/public/sections/functions/parts/functions-list.ok.js +1 -1
- package/public/sections/license/index.ok.html +1 -1
- package/public/sections/license/parts/license-panel.ok.js +1 -1
- package/public/sections/processors/index.ok.html +1 -1
- package/public/sections/queue/index.ok.html +1 -1
- package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
- package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
- package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
- package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
- package/public/sections/queue/parts/queue-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-workers.ok.js +1 -1
- package/public/sections/sync/index.ok.html +1 -1
- package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
- package/public/sections/sync/parts/sync-retention.ok.js +1 -1
- package/public/sections/sync/parts/sync-topology.ok.js +1 -1
- package/public/sections/system/index.ok.html +1 -1
- package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
- package/public/sections/system/parts/system-api-panel.ok.js +1 -1
- package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
- package/public/sections/system/parts/system-log-history.ok.js +1 -1
- package/public/sections/system/parts/system-log.ok.js +1 -1
- package/public/sections/system/parts/system-status.ok.js +1 -1
- package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
- package/public/sections/views/index.ok.html +1 -1
- package/public/sections/views/modals/create-view-modal.ok.js +1 -1
- package/public/sections/views/parts/view-detail.ok.js +1 -1
- package/public/sections/views/parts/views-list.ok.js +1 -1
- package/public/sections/views/parts/views-overview.ok.js +1 -1
- package/public/setup-app.js +1 -1
- package/public/setup.html +189 -1
- package/public/stores/auth-store.js +1 -1
- package/public/stores/events-store.js +1 -1
- package/public/stores/functions-store.js +1 -1
- package/public/stores/okdb-store.js +1 -1
- package/public/stores/theme-store.js +1 -1
- package/public/test-cron-input.html +53 -3
- package/public/test-json-input.html +182 -3
- package/public/util/permissions.js +1 -1
- package/public/util/sift-schema.js +1 -1
- package/public/vendor/okjs/ok.esm.min.js +1 -2
- package/public/view-models/type-query-vm.js +1 -1
- package/okdb-data/default/data.mdb +0 -0
- package/okdb-data/default/lock.mdb +0 -0
- package/okdb-data/~log/data.mdb +0 -0
- package/okdb-data/~log/lock.mdb +0 -0
- package/okdb-data/~system/data.mdb +0 -0
- package/okdb-data/~system/lock.mdb +0 -0
- package/public/images/logo.png +0 -0
- package/public/images/logo.svg +0 -333
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0xb207bd=_0x5c03;(function(_0x6bf525,_0x59a625){const _0x26a55b=_0x5c03,_0x447d0b=_0x6bf525();while(!![]){try{const _0x49bae5=-parseInt(_0x26a55b(0x222))/0x1+parseInt(_0x26a55b(0x1e2))/0x2+-parseInt(_0x26a55b(0x19d))/0x3+parseInt(_0x26a55b(0x1ea))/0x4*(parseInt(_0x26a55b(0x206))/0x5)+parseInt(_0x26a55b(0x217))/0x6*(parseInt(_0x26a55b(0x1a7))/0x7)+-parseInt(_0x26a55b(0x1be))/0x8*(parseInt(_0x26a55b(0x243))/0x9)+parseInt(_0x26a55b(0x19c))/0xa*(parseInt(_0x26a55b(0x1f8))/0xb);if(_0x49bae5===_0x59a625)break;else _0x447d0b['push'](_0x447d0b['shift']());}catch(_0x3db7ce){_0x447d0b['push'](_0x447d0b['shift']());}}}(_0x41a1,0xd25e3));function _0x5c03(_0x1e2289,_0x15fef5){_0x1e2289=_0x1e2289-0x199;const _0x41a14e=_0x41a1();let _0x5c03d8=_0x41a14e[_0x1e2289];return _0x5c03d8;}import _0x11aa59 from'../../../components/ok-js-input.ok.js';import _0x36769c from'./embed-create-panel.ok.js';const t=[{'symbol':'require','pattern':/(^|[^\w$.])require\s*\(/},{'symbol':_0xb207bd(0x231),'pattern':/(^|[^\w$.])import\b/},{'symbol':_0xb207bd(0x1ef),'pattern':/(^|[^\w$.])console\b/},{'symbol':_0xb207bd(0x21e),'pattern':/(^|[^\w$.])module\b/},{'symbol':_0xb207bd(0x1dd),'pattern':/(^|[^\w$.])exports\b/},{'symbol':_0xb207bd(0x1c2),'pattern':/(^|[^\w$.])process\b/},{'symbol':_0xb207bd(0x1c9),'pattern':/child_process/},{'symbol':_0xb207bd(0x1b4),'pattern':/worker_threads/}];function i(_0xf4cb17){const _0x201e7e=_0xb207bd,_0x2e4ba4='string'==typeof _0xf4cb17?_0xf4cb17[_0x201e7e(0x19e)](/\r\n/g,'\x0a')[_0x201e7e(0x1fe)]():'';if(!_0x2e4ba4)return{'ok':!0x1,'message':'Source\x20is\x20required'};if(new TextEncoder()[_0x201e7e(0x20b)](_0x2e4ba4)[_0x201e7e(0x1f6)]>0x10000)return{'ok':!0x1,'message':_0x201e7e(0x1d9)};if(!/^(async\s+)?\(\s*[A-Za-z_$][\w$]*\s*\)\s*=>/['test'](_0x2e4ba4))return{'ok':!0x1,'message':_0x201e7e(0x234)};for(const {symbol:_0x5506ad,pattern:_0x1227f9}of t)if(_0x1227f9[_0x201e7e(0x20d)](_0x2e4ba4))return{'ok':!0x1,'message':_0x201e7e(0x1a0)+_0x5506ad+'\x22'};try{new Function('return\x20('+_0x2e4ba4+');')();}catch(_0x22a71a){return{'ok':!0x1,'message':_0x22a71a?.[_0x201e7e(0x1cd)]||_0x201e7e(0x22e)};}return{'ok':!0x0,'normalizedSource':_0x2e4ba4};}function a(_0x3ae241){const _0x7ed06f=_0xb207bd;return!0x0===_0x3ae241||''===_0x3ae241||0x1===_0x3ae241||'1'===_0x3ae241||_0x7ed06f(0x210)===_0x3ae241;}export default{'tag':'pipeline-create-panel','attr':{'locktype':{},'lockenv':{},'initialkind':{},'locktypestrict':{},'hidequeueworker':{}},'dependencies':[_0x11aa59,_0x36769c],'context':_0x361fe7=>({'step':0x1,'busy':!0x1,'error':null,'success':null,'engineKind':'','proc_sourceType':'','mat_sourceType':'','mat_targetType':'','qw_jobType':'','qw_jobTypeMode':'existing','handlerMode':_0xb207bd(0x219),'handlerName':'','newFnName':'','newFnSource':'','newFnValidation':{'ok':!0x1,'message':_0xb207bd(0x1e9)},'newFnDryRunning':!0x1,'newFnDryResult':null,'newFnDryError':null,'newFnDryPayload':null,'showAdvanced':!0x1,'proc_mode':'async','proc_bootstrap':'snapshot','proc_batchSize':0x100,'proc_originMode':_0xb207bd(0x245),'mat_bootstrap':_0xb207bd(0x21f),'mat_batchSize':0x80,'mat_originMode':'all','mat_clearTargetOnRebuild':!0x0,'qw_concurrency':0x1,'handler_recordRuns':'errors','types':[],'functions':[],'queueJobTypes':[],get 'lockedType'(){const _0x22952b=_0xb207bd;return _0x361fe7[_0x22952b(0x1d0)][_0x22952b(0x235)]||'';},get 'lockedEnv'(){const _0x461644=_0xb207bd;return _0x361fe7['$attr'][_0x461644(0x203)]||'';},get 'initialKind'(){const _0x302a98=_0xb207bd,_0x4e8f5b=_0x361fe7[_0x302a98(0x1d0)]['initialkind']||'';return this['availableKinds'][_0x302a98(0x199)](_0x4e8f5b)?_0x4e8f5b:'';},get 'lockTypeStrict'(){const _0x1cb7ca=_0xb207bd;return a(_0x361fe7[_0x1cb7ca(0x1d0)][_0x1cb7ca(0x23b)]);},get 'hideQueueWorker'(){return a(_0x361fe7['$attr']['hidequeueworker']);},get 'availableKinds'(){const _0x5b4d53=_0xb207bd;return[_0x5b4d53(0x1e7),_0x5b4d53(0x23a),_0x5b4d53(0x1b1),_0x5b4d53(0x22b)]['filter'](_0x42af77=>!(this[_0x5b4d53(0x20e)]&&_0x5b4d53(0x1b1)===_0x42af77));},get 'typeSelectionLocked'(){return!!this['lockedType']&&this['lockTypeStrict'];},get 'kindLocked'(){const _0x19c476=_0xb207bd;return!!this[_0x19c476(0x1c3)];},get 'selectedEnv'(){const _0x26f495=_0xb207bd;return this[_0x26f495(0x202)]||_0x361fe7[_0x26f495(0x1f5)][_0x26f495(0x1b9)][_0x26f495(0x1d2)][_0x26f495(0x1db)]||'default';},async 'loadMeta'(){const _0x36a5a4=_0xb207bd,_0x1f6fc4=this[_0x36a5a4(0x1db)];try{const [_0x2033cd,_0x3161a1,_0x140a9e]=await Promise[_0x36a5a4(0x245)]([fetch(__ENV__['API']+'/env/'+encodeURIComponent(_0x1f6fc4)+_0x36a5a4(0x1ee)),fetch(__ENV__[_0x36a5a4(0x233)]+_0x36a5a4(0x22f)+encodeURIComponent(_0x1f6fc4)+_0x36a5a4(0x1ae)),fetch(__ENV__['API']+_0x36a5a4(0x22f)+encodeURIComponent(_0x1f6fc4)+_0x36a5a4(0x1cc))[_0x36a5a4(0x1fa)](()=>null)]),_0x1b0f5b=await _0x2033cd[_0x36a5a4(0x220)]()[_0x36a5a4(0x1fa)](()=>({})),_0x2226d3=await _0x3161a1[_0x36a5a4(0x220)]()[_0x36a5a4(0x1fa)](()=>({})),_0x166b58=_0x1b0f5b[_0x36a5a4(0x1e4)]??_0x1b0f5b['result']??[];this[_0x36a5a4(0x1ac)]=(Array[_0x36a5a4(0x19b)](_0x166b58)?_0x166b58[_0x36a5a4(0x1b3)](_0x14efe8=>_0x14efe8[_0x36a5a4(0x1c4)]??_0x14efe8[_0x36a5a4(0x230)]??_0x14efe8):Object['keys'](_0x166b58))[_0x36a5a4(0x211)](_0x3dc0fc=>_0x36a5a4(0x237)==typeof _0x3dc0fc&&!_0x3dc0fc[_0x36a5a4(0x1b7)]('~'))[_0x36a5a4(0x22a)]();const _0x43c21e=_0x2226d3[_0x36a5a4(0x1e4)]??_0x2226d3['result']??[];if(this['functions']=Array['isArray'](_0x43c21e)?_0x43c21e[_0x36a5a4(0x1b3)](_0x4810e9=>_0x4810e9[_0x36a5a4(0x1b8)]??_0x4810e9[_0x36a5a4(0x230)]??_0x4810e9)[_0x36a5a4(0x211)](Boolean)[_0x36a5a4(0x22a)]():[],_0x140a9e&&_0x140a9e['ok']){const _0x2322f2=await _0x140a9e['json']()[_0x36a5a4(0x1fa)](()=>({})),_0x25898c=_0x2322f2?.[_0x36a5a4(0x22d)]??_0x2322f2?.['data']??null,_0x46b099=_0x25898c?.[_0x36a5a4(0x21d)]??{};this[_0x36a5a4(0x1e8)]=Object['keys'](_0x46b099)[_0x36a5a4(0x22a)]();}else this[_0x36a5a4(0x1e8)]=[];}catch{this[_0x36a5a4(0x1ac)]=[],this[_0x36a5a4(0x225)]=[],this[_0x36a5a4(0x1e8)]=[];}},get 'effectiveJobType'(){const _0x11a6bb=_0xb207bd;return _0x11a6bb(0x1f9)===this[_0x11a6bb(0x1b2)]?this['qw_jobType']['trim']():this['qw_jobType'];},get 'effectiveHandlerName'(){const _0x9889c9=_0xb207bd;return _0x9889c9(0x1af)===this['handlerMode']?this[_0x9889c9(0x1f0)][_0x9889c9(0x1fe)]():this['handlerName'];},get 'autoName'(){const _0x303314=_0xb207bd;return _0x303314(0x1e7)===this[_0x303314(0x1fd)]&&this[_0x303314(0x1ec)]&&this[_0x303314(0x1c7)]?this[_0x303314(0x1ec)]+'-'+this[_0x303314(0x1c7)]:_0x303314(0x23a)===this['engineKind']&&this[_0x303314(0x1d4)]&&this[_0x303314(0x240)]&&this['effectiveHandlerName']?this[_0x303314(0x1d4)]+_0x303314(0x1e5)+this[_0x303314(0x240)]+'-'+this[_0x303314(0x1c7)]:_0x303314(0x1b1)===this[_0x303314(0x1fd)]&&this[_0x303314(0x246)]&&this['effectiveHandlerName']?this['effectiveJobType']+'-'+this[_0x303314(0x1c7)]:'';},get 'pipelineName'(){const _0x3e5c3c=_0xb207bd;return this[_0x3e5c3c(0x1c1)];},get 'engineName'(){const _0x226ed2=_0xb207bd;return this[_0x226ed2(0x1c1)]?this[_0x226ed2(0x1c1)]+':'+this[_0x226ed2(0x1fd)]:'';},get 'step2Valid'(){const _0x4eae23=_0xb207bd;return _0x4eae23(0x22b)===this[_0x4eae23(0x1fd)]||!(_0x4eae23(0x1e7)===this[_0x4eae23(0x1fd)]&&!this['proc_sourceType'])&&!!('materializer'!==this[_0x4eae23(0x1fd)]||this['mat_sourceType']&&this['mat_targetType'])&&!(_0x4eae23(0x1b1)===this[_0x4eae23(0x1fd)]&&!this['effectiveJobType'])&&('existing'===this[_0x4eae23(0x1df)]?!!this[_0x4eae23(0x1b5)]:!!this[_0x4eae23(0x1f0)][_0x4eae23(0x1fe)]()&&this['newFnValidation']['ok']);},'resetWizard'(){const _0x3de863=_0xb207bd;this[_0x3de863(0x1ff)]=this[_0x3de863(0x1aa)]?0x2:0x1,this[_0x3de863(0x1fd)]=this[_0x3de863(0x1aa)]?this[_0x3de863(0x1c3)]:'',this[_0x3de863(0x1ec)]=this['lockedType']||'',this[_0x3de863(0x1d4)]=this[_0x3de863(0x1da)]||'',this[_0x3de863(0x240)]='',this[_0x3de863(0x1d8)]='',this[_0x3de863(0x1b2)]=_0x3de863(0x219),this[_0x3de863(0x1df)]=_0x3de863(0x219),this['handlerName']='',this[_0x3de863(0x1f0)]='',this[_0x3de863(0x23f)]='',this['newFnValidation']={'ok':!0x1,'message':_0x3de863(0x1e9)},this['newFnDryResult']=null,this[_0x3de863(0x1a1)]=null,this[_0x3de863(0x238)]=!0x1,this[_0x3de863(0x1eb)]=_0x3de863(0x1a4),this[_0x3de863(0x1c5)]=_0x3de863(0x1d7),this[_0x3de863(0x1ba)]=_0x3de863(0x21f),this[_0x3de863(0x20c)]=0x100,this[_0x3de863(0x201)]=_0x3de863(0x245),this[_0x3de863(0x212)]=_0x3de863(0x21f),this[_0x3de863(0x228)]=0x80,this[_0x3de863(0x1bd)]=_0x3de863(0x245),this['mat_clearTargetOnRebuild']=!0x0,this['qw_concurrency']=0x1;},'applyScopeDefaults'(){const _0x16b5f7=_0xb207bd;this[_0x16b5f7(0x20a)]?(this[_0x16b5f7(0x1ec)]=this['lockedType'],this['mat_sourceType']=this[_0x16b5f7(0x1da)]):this[_0x16b5f7(0x1da)]&&!this[_0x16b5f7(0x1ec)]&&(this['proc_sourceType']=this[_0x16b5f7(0x1da)]),this[_0x16b5f7(0x20a)]||!this[_0x16b5f7(0x1da)]||this[_0x16b5f7(0x1d4)]||(this[_0x16b5f7(0x1d4)]=this[_0x16b5f7(0x1da)]),this[_0x16b5f7(0x1aa)]&&this[_0x16b5f7(0x1fd)]!==this[_0x16b5f7(0x1c3)]&&this['pickType'](this[_0x16b5f7(0x1c3)]);},get 'dedupedDryLogs'(){const _0x4dded6=_0xb207bd,_0x3cfc61=this[_0x4dded6(0x1a2)]?.[_0x4dded6(0x213)];if(!Array['isArray'](_0x3cfc61)||!_0x3cfc61[_0x4dded6(0x1f6)])return[];const _0x1ca871=[],_0x5316e9=new Map();for(const _0x5c6958 of _0x3cfc61){const _0x52d217=(_0x5c6958[_0x4dded6(0x1d3)]??'')+'::'+(_0x5c6958[_0x4dded6(0x207)]??_0x5c6958[_0x4dded6(0x1cd)]??JSON['stringify'](_0x5c6958));if(_0x5316e9[_0x4dded6(0x23e)](_0x52d217))_0x5316e9['get'](_0x52d217)[_0x4dded6(0x223)]++;else{const _0xf1bb77={..._0x5c6958,'count':0x1,'_key':_0x52d217};_0x5316e9[_0x4dded6(0x239)](_0x52d217,_0xf1bb77),_0x1ca871['push'](_0xf1bb77);}}return _0x1ca871;},get 'dryRunDuration'(){const _0x567ca1=_0xb207bd,_0x952279=this[_0x567ca1(0x1a2)];return _0x952279?_0x952279[_0x567ca1(0x1c0)]?.[_0x567ca1(0x1c8)]??null:null;},get 'dryRunStatus'(){const _0x5ebeb0=_0xb207bd,_0x39ef34=this[_0x5ebeb0(0x1a2)];return _0x39ef34?_0x5ebeb0(0x19f)===_0x39ef34['status']||_0x39ef34[_0x5ebeb0(0x19f)]?'error':_0x39ef34[_0x5ebeb0(0x1e6)]||_0x5ebeb0(0x1f2):null;},'pickType'(_0x43ff52){const _0x1938d7=_0xb207bd;this[_0x1938d7(0x1ad)][_0x1938d7(0x199)](_0x43ff52)&&(this[_0x1938d7(0x1fd)]=_0x43ff52,this['step']=0x2,this[_0x1938d7(0x20a)]&&(this[_0x1938d7(0x1ec)]=this[_0x1938d7(0x1da)],this[_0x1938d7(0x1d4)]=this['lockedType']),_0x1938d7(0x22b)!==_0x43ff52&&(this[_0x1938d7(0x23f)]||(this[_0x1938d7(0x23f)]='processor'===_0x43ff52?_0x1938d7(0x23d):_0x1938d7(0x23a)===_0x43ff52?'async\x20(ctx)\x20=>\x20{\x0a\x20\x20//\x20ctx.payload\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20array\x20of\x20change\x20records\x0a\x20\x20//\x20\x20\x20change.action\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20\x22put\x22\x20|\x20\x22remove\x22\x0a\x20\x20//\x20\x20\x20change.key\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20source\x20record\x20key\x0a\x20\x20//\x20\x20\x20change.value\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20hydrated\x20source\x20value\x20for\x20puts\x0a\x20\x20//\x20\x20\x20change.clock\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20log\x20clock\x20during\x20live\x20replay;\x20null\x20during\x20snapshot\x20bootstrap\x0a\x20\x20//\x20ctx.materializer\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20materializer\x20trigger\x20metadata\x0a\x20\x20//\x20\x20\x20ctx.materializer.sourceType\x20\x20—\x20the\x20type\x20being\x20watched\x0a\x20\x20//\x20\x20\x20ctx.materializer.targetType\x20\x20—\x20the\x20derived\x20target\x20type\x0a\x20\x20//\x20\x20\x20ctx.materializer.sourceEnv\x20\x20\x20—\x20the\x20environment\x20of\x20the\x20source\x20type\x0a\x20\x20//\x20\x20\x20ctx.materializer.targetEnv\x20\x20\x20—\x20the\x20environment\x20of\x20the\x20target\x20type\x0a\x20\x20//\x20ctx.env\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20env\x20facade\x20(read-only\x20for\x20deterministic\x20materializers)\x0a\x20\x20//\x20ctx.log\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20structured\x20logger:\x20ctx.log.info(msg,\x20data)\x0a\x20\x20//\x0a\x20\x20//\x20Return\x20ops\x20for\x20the\x20engine\x20to\x20apply\x20to\x20the\x20target\x20type.\x0a\x20\x20const\x20ops\x20=\x20[];\x0a\x0a\x20\x20for\x20(const\x20change\x20of\x20ctx.payload)\x20{\x0a\x20\x20\x20\x20if\x20(change.action\x20===\x20\x27put\x27)\x20{\x0a\x20\x20\x20\x20\x20\x20const\x20doc\x20=\x20change.value\x20??\x20change.newValue;\x0a\x20\x20\x20\x20\x20\x20if\x20(!doc)\x20continue;\x0a\x0a\x20\x20\x20\x20\x20\x20ops.push({\x0a\x20\x20\x20\x20\x20\x20\x20\x20action:\x20\x27put\x27,\x0a\x20\x20\x20\x20\x20\x20\x20\x20key:\x20change.key,\x0a\x20\x20\x20\x20\x20\x20\x20\x20value:\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20projected:\x20true,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20sourceKey:\x20change.key,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20...doc,\x0a\x20\x20\x20\x20\x20\x20\x20\x20},\x0a\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20if\x20(change.action\x20===\x20\x27remove\x27)\x20{\x0a\x20\x20\x20\x20\x20\x20ops.push({\x20action:\x20\x27remove\x27,\x20key:\x20change.key\x20});\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x0a\x20\x20return\x20ops;\x0a}':_0x1938d7(0x1f7),this[_0x1938d7(0x1de)]=i(this[_0x1938d7(0x23f)]))));},'goBack'(){const _0x39eb94=_0xb207bd;_0x39eb94(0x22b)!==this[_0x39eb94(0x1fd)]?this[_0x39eb94(0x1ff)]>0x1&&this['step']--:this[_0x39eb94(0x216)]();},'goNext'(){const _0x17e2a6=_0xb207bd;0x2===this[_0x17e2a6(0x1ff)]&&this[_0x17e2a6(0x244)]&&(this['step']=0x3);},'onEmbeddingCreated'(_0x590961){const _0xee47b8=_0xb207bd;this[_0xee47b8(0x1f2)]=_0xee47b8(0x209),this[_0xee47b8(0x19f)]=null,this['resetWizard'](),_0x361fe7[_0xee47b8(0x1d6)][_0xee47b8(0x226)](new CustomEvent(_0xee47b8(0x1cb),{'detail':_0x590961,'bubbles':!0x0}));},'updateSource'(_0x7d2ab3){const _0x2509f2=_0xb207bd;this['newFnSource']=_0x7d2ab3??'',this[_0x2509f2(0x1de)]=i(this[_0x2509f2(0x23f)]);},async 'buildDryRunPayload'(){const _0x57493b=_0xb207bd;if(_0x57493b(0x1e7)===this[_0x57493b(0x1fd)])return[{'key':_0x57493b(0x1bf),'value':{'sample':!0x0,'name':_0x57493b(0x200)},'action':_0x57493b(0x1a9),'clock':0x1}];if('materializer'===this[_0x57493b(0x1fd)])return[{'key':_0x57493b(0x1bf),'value':{'sample':!0x0,'name':_0x57493b(0x200)},'action':'put','clock':null},{'key':'test-2','action':_0x57493b(0x229),'clock':0x2}];const _0x5d22fd=this['effectiveJobType'];if(_0x5d22fd)try{const _0x473bdc=this[_0x57493b(0x1db)],_0x29fd22=__ENV__[_0x57493b(0x233)]+'/env/'+encodeURIComponent(_0x473bdc)+_0x57493b(0x1b6),_0x559da6=await fetch(_0x29fd22+_0x57493b(0x1a5)+new URLSearchParams({'type':_0x5d22fd,'limit':'1'}));if(_0x559da6['ok']){const _0x28f346=await _0x559da6[_0x57493b(0x220)](),_0x29598b=_0x28f346?.[_0x57493b(0x22d)]?.[_0x57493b(0x224)]??_0x28f346?.[_0x57493b(0x1e4)]?.[_0x57493b(0x224)]??[],_0x1d16b5=_0x29598b[0x0]?.[_0x57493b(0x1b8)]??_0x29598b[0x0]?.['id']??_0x29598b[0x0]?.['value']?.['id'];if(_0x1d16b5){const _0x2b611e=await fetch(_0x29fd22+_0x57493b(0x1a8)+encodeURIComponent(_0x1d16b5));if(_0x2b611e['ok']){const _0x2ef80e=await _0x2b611e[_0x57493b(0x220)](),_0x16b7fa=_0x2ef80e?.['result']??_0x2ef80e?.[_0x57493b(0x1e4)];if(void 0x0!==_0x16b7fa?.['payload'])return _0x16b7fa[_0x57493b(0x1ed)];}}}}catch{}return{};},async 'dryRunFunction'(){const _0x36903e=_0xb207bd;if(this[_0x36903e(0x1de)]['ok']&&!this[_0x36903e(0x1e0)]){this[_0x36903e(0x1e0)]=!0x0,this['newFnDryResult']=null,this[_0x36903e(0x1a1)]=null,this[_0x36903e(0x1ca)]=null;try{const _0x3d319a=this[_0x36903e(0x1db)],_0x4fcb68=await this[_0x36903e(0x1a6)]();this[_0x36903e(0x1ca)]=_0x4fcb68;const _0x1bef44={'name':this['newFnName']['trim']()||_0x36903e(0x1c6),'source':this['newFnValidation'][_0x36903e(0x1f4)]||this[_0x36903e(0x23f)]['trim'](),'metadata':{'description':'Pipeline\x20handler\x20preview'},'enabled':!0x0,'payload':_0x4fcb68};_0x36903e(0x1b1)===this[_0x36903e(0x1fd)]&&(_0x1bef44['jobContext']={'id':_0x36903e(0x1ce),'type':this[_0x36903e(0x246)]||_0x36903e(0x227),'tries':0x1,'created':Date['now'](),'tags':null,'priority':0x0,'bucket':null,'cron':null}),'processor'===this[_0x36903e(0x1fd)]&&(_0x1bef44[_0x36903e(0x21a)]={'mode':_0x36903e(0x1e1),'sourceType':this[_0x36903e(0x1ec)]||_0x36903e(0x214),'sourceEnv':this['selectedEnv'],'processor':_0x36903e(0x1c6),'engineKey':_0x36903e(0x1c6),'cursorKey':null}),'materializer'===this[_0x36903e(0x1fd)]&&(_0x1bef44[_0x36903e(0x242)]={'mode':_0x36903e(0x1e1),'sourceType':this[_0x36903e(0x1d4)]||_0x36903e(0x214),'targetType':this[_0x36903e(0x240)]||_0x36903e(0x1cf),'sourceEnv':this[_0x36903e(0x1db)],'targetEnv':this[_0x36903e(0x1db)],'engineKey':_0x36903e(0x1c6),'cursorKey':null});const _0xbbb60f=await fetch(__ENV__[_0x36903e(0x233)]+_0x36903e(0x22f)+encodeURIComponent(_0x3d319a)+_0x36903e(0x1d1),{'method':_0x36903e(0x1d5),'headers':{'Content-Type':_0x36903e(0x1bb)},'body':JSON[_0x36903e(0x19a)](_0x1bef44)}),_0xb3284d=await _0xbbb60f[_0x36903e(0x220)]()['catch'](()=>({})),_0x4d2b4b=_0xb3284d?.[_0x36903e(0x1e4)]??_0xb3284d?.[_0x36903e(0x22d)]??_0xb3284d;if(!_0xbbb60f['ok']&&!_0x4d2b4b?.[_0x36903e(0x1e6)])throw new Error(_0xb3284d?.[_0x36903e(0x19f)]?.[_0x36903e(0x1cd)]||'Preview\x20failed\x20('+_0xbbb60f['status']+')');this[_0x36903e(0x1a2)]=_0x4d2b4b;}catch(_0x3a7e7f){this[_0x36903e(0x1a1)]=_0x3a7e7f?.['message']||String(_0x3a7e7f);}finally{this[_0x36903e(0x1e0)]=!0x1;}}},'buildEngineConfig'(){const _0x2b8dfa=_0xb207bd,_0x599438={'kind':_0x2b8dfa(0x205),'name':this[_0x2b8dfa(0x1c7)]};return _0x2b8dfa(0x245)!==this[_0x2b8dfa(0x1eb)]&&(_0x599438['recordRuns']=this['handler_recordRuns']),_0x2b8dfa(0x1e7)===this[_0x2b8dfa(0x1fd)]?{'source_type':this[_0x2b8dfa(0x1ec)],'source_env':this[_0x2b8dfa(0x1db)],'handler':_0x599438,'mode':this[_0x2b8dfa(0x1c5)],'bootstrap':_0x2b8dfa(0x1b0)===this[_0x2b8dfa(0x1c5)]?null:this[_0x2b8dfa(0x1ba)],'batchSize':Number(this['proc_batchSize'])||0x100,'originMode':this[_0x2b8dfa(0x201)]}:_0x2b8dfa(0x23a)===this[_0x2b8dfa(0x1fd)]?{'source_type':this['mat_sourceType'],'target_type':this[_0x2b8dfa(0x240)],'source_env':this['selectedEnv'],'target_env':this['selectedEnv'],'handler':_0x599438,'bootstrap':this[_0x2b8dfa(0x212)],'batchSize':Number(this['mat_batchSize'])||0x80,'originMode':this[_0x2b8dfa(0x1bd)],'clearTargetOnRebuild':!0x1!==this[_0x2b8dfa(0x20f)]}:'queue-worker'===this[_0x2b8dfa(0x1fd)]?{'job_type':this[_0x2b8dfa(0x246)],'queue_env':this[_0x2b8dfa(0x1db)],'handler':_0x599438,'concurrency':Number(this['qw_concurrency'])||0x1}:{};},async 'submit'(){const _0x564650=_0xb207bd;if(this['step2Valid']&&!this[_0x564650(0x204)]){this['busy']=!0x0,this[_0x564650(0x19f)]=null,this[_0x564650(0x1f2)]=null;try{const _0x1bb8bf=this[_0x564650(0x1db)];if(_0x564650(0x1af)===this[_0x564650(0x1df)]){const _0x26f687={'name':this[_0x564650(0x1f0)][_0x564650(0x1fe)](),'source':this[_0x564650(0x1de)]['normalizedSource']||this[_0x564650(0x23f)]['trim'](),'metadata':{'description':_0x564650(0x1a3)+this[_0x564650(0x215)],'owner_engine':this['engineName'],'pipeline':this[_0x564650(0x215)]},'enabled':!0x0},_0x555eb2=await fetch(__ENV__['API']+'/env/'+encodeURIComponent(_0x1bb8bf)+'/functions',{'method':_0x564650(0x1d5),'headers':{'Content-Type':_0x564650(0x1bb)},'body':JSON[_0x564650(0x19a)](_0x26f687)}),_0x21b179=await _0x555eb2['json']()[_0x564650(0x1fa)](()=>({}));if(!_0x555eb2['ok'])throw new Error(_0x21b179?.[_0x564650(0x19f)]?.[_0x564650(0x1cd)]||_0x564650(0x236)+_0x555eb2[_0x564650(0x1e6)]+')');}const _0x53f0de={'name':this[_0x564650(0x215)],'meta':{'label':this[_0x564650(0x215)]},'members':[{'engineType':this['engineKind'],'engineName':this[_0x564650(0x1f1)],'role':this[_0x564650(0x1fd)],'engineConfig':this[_0x564650(0x22c)]()}]},_0x382a25=await fetch(__ENV__['API']+'/env/'+encodeURIComponent(_0x1bb8bf)+_0x564650(0x232),{'method':_0x564650(0x1d5),'headers':{'Content-Type':'application/json'},'body':JSON[_0x564650(0x19a)](_0x53f0de)}),_0x31907c=await _0x382a25['json']()['catch'](()=>({}));if(!_0x382a25['ok'])throw new Error(_0x31907c?.['error']?.['message']||_0x564650(0x1fc)+_0x382a25[_0x564650(0x1e6)]+')');this[_0x564650(0x1f2)]='Pipeline\x20\x22'+this[_0x564650(0x215)]+_0x564650(0x1fb),_0x361fe7['$el'][_0x564650(0x226)](new CustomEvent(_0x564650(0x1cb),{'detail':_0x31907c[_0x564650(0x22d)]??_0x31907c[_0x564650(0x1e4)],'bubbles':!0x0})),this[_0x564650(0x216)]();}catch(_0x171fb3){this[_0x564650(0x19f)]=_0x171fb3?.[_0x564650(0x1cd)]||String(_0x171fb3);}finally{this[_0x564650(0x204)]=!0x1;}}},'formatJson'(_0x40b3a2){const _0x11da0e=_0xb207bd;try{return JSON[_0x11da0e(0x19a)](_0x40b3a2,null,0x2);}catch{return String(_0x40b3a2??'');}},'setJobTypeMode'(_0x2da490){const _0x46b685=_0xb207bd;this[_0x46b685(0x1b2)]=_0x2da490,this[_0x46b685(0x1d8)]='';},'logLabel'(_0x5eb6e9){const _0x36271d=_0xb207bd,_0x1552a0=_0x5eb6e9?.['msg']??_0x5eb6e9?.[_0x36271d(0x1cd)]??'';return _0x5eb6e9?.[_0x36271d(0x223)]>0x1?_0x1552a0+_0x36271d(0x208)+_0x5eb6e9[_0x36271d(0x223)]+')':_0x1552a0;},'logColor'(_0x54abef){const _0x1e6abe=_0xb207bd,_0x5208c3=_0x54abef?.['level']??'';return _0x1e6abe(0x19f)===_0x5208c3||_0x1e6abe(0x221)===_0x5208c3?_0x1e6abe(0x1ab):_0x1e6abe(0x1f3)===_0x5208c3?_0x1e6abe(0x1dc):_0x1e6abe(0x241)===_0x5208c3?'var(--okdb-app-fg-muted)':_0x1e6abe(0x218);}}),async 'init'(_0x1acf37){const _0x4374bc=_0xb207bd;await this[_0x4374bc(0x21c)](),this[_0x4374bc(0x1bc)](),_0x1acf37[_0x4374bc(0x21b)](()=>_0x1acf37['$ok'][_0x4374bc(0x1b9)][_0x4374bc(0x1d2)][_0x4374bc(0x1db)],async()=>{const _0x3a743d=_0x4374bc;await this['loadMeta'](),this[_0x3a743d(0x1bc)]();});},'style':_0xb207bd(0x1e3),'template':_0xb207bd(0x23c)};function _0x41a1(){const _0x1f4ec5=['handlerMode','newFnDryRunning','live','1042710QavOib','\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20block;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-wrap\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:\x20column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x2018px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20max-width:\x20820px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-title\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2018px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20600;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-sub\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.55;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20line-height:\x201.7;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20max-width:\x20680px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20steps\x20indicator\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-steps\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-bottom:\x204px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-step-dot\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x2026px;\x20height:\x2026px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x20align-items:\x20center;\x20justify-content:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20700;\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x202px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-app-fg-muted);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20transparent;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex-shrink:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-step-dot--active\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-step-dot--done\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-color:\x20var(--okdb-success);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-success);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x207%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-step-line\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x202px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x200\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20max-width:\x2060px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-step-line--done\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x2040%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-step-label\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-left:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.45;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-step-label--active\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20type-choice\x20cards\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-choice-grid\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20grid;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20grid-template-columns:\x20repeat(auto-fit,\x20minmax(220px,\x201fr));\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-choice\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2020px\x2018px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:\x20column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20transition:\x20border-color\x20.15s,\x20background\x20.15s;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-choice:hover\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-color:\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-surface);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-choice-icon\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2028px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.8;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-choice-name\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2015px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20600;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-choice-desc\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.55;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20line-height:\x201.7;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20card\x20/\x20form\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-card\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2016px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:\x20column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-section\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20text-transform:\x20uppercase;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.45;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20letter-spacing:\x20.06em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-row\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20grid;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20grid-template-columns:\x20130px\x201fr;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x208px\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2013px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-label\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.7;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20text-align:\x20right;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-input\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x206px\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20inherit;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2013px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x20100%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20box-sizing:\x20border-box;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-input:focus\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20outline:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-select\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x206px\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20inherit;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2013px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x20100%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20box-sizing:\x20border-box;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-hint\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.4;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-style:\x20italic;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20grid-column:\x202;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20line-height:\x201.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-pills\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x204px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-pill\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x204px\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x20999px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20transparent;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20inherit;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.7;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-pill:hover\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-color:\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2027%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-pill--on\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20handler\x20toggle\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-handler-toggle\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20overflow:\x20hidden;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-handler-toggle-btn\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x207px\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20transparent;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20inherit;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.6;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20text-align:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-handler-toggle-btn:first-child\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-right:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-handler-toggle-btn--on\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20600;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20code\x20editor\x20area\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-editor-wrap\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2010px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20overflow:\x20hidden;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x20260px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20min-height:\x20260px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20dry-run\x20result\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-dry-card\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2010px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2012px\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:\x20column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-dry-ok\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-success);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-dry-err\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-danger);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-dry-pre\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20white-space:\x20pre-wrap;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20word-break:\x20break-word;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20line-height:\x201.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-app-fg-subtle);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20max-height:\x20160px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20overflow:\x20auto;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-dry-meta\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x202px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20dry-run\x20logs\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-dry-logs\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:\x20column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x202px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x204px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-dry-log-entry\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20monospace;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20line-height:\x201.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x202px\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x204px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-dry-log-level\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20inline-block;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20min-width:\x2040px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20600;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20text-transform:\x20uppercase;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2010px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-right:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20review\x20summary\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-summary-row\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20justify-content:\x20space-between;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2013px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x206px\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x201px\x20solid\x20var(--okdb-app-surface);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-summary-label\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.55;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-summary-val\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20monospace;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20buttons\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-actions\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-btn\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x208px\x2020px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x209%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-accent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2013px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20600;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-btn:hover\x20{\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2016%,\x20transparent);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-btn:disabled\x20{\x20opacity:\x20.4;\x20cursor:\x20default;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-btn--ghost\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-color:\x20var(--okdb-app-border);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20transparent;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20inherit;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20400;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.7;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-btn--ghost:hover\x20{\x20opacity:\x201;\x20background:\x20var(--okdb-app-surface);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-btn--green\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-color:\x20var(--okdb-success);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x209%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-success);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-btn--green:hover\x20{\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x2016%,\x20transparent);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-btn--small\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x205px\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20500;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20feedback\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-error\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-danger);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2013px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x208px\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20var(--okdb-danger);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-success\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-success);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2013px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x208px\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x2033%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-success)\x205%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-warn\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20var(--okdb-warning);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.75;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x206px\x2010px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-warning)\x2020%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20color-mix(in\x20srgb,\x20var(--okdb-warning)\x204%,\x20transparent);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20line-height:\x201.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20/*\x20──\x20advanced\x20toggle\x20──\x20*/\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-adv-toggle\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20user-select:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20inline-flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x206px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20pipeline-create-panel\x20.pw-adv-toggle:hover\x20{\x20opacity:\x20.8;\x20}\x0a\x20\x20\x20\x20','data','-to-','status','processor','queueJobTypes','Source\x20is\x20required','2111308ttgjSO','handler_recordRuns','proc_sourceType','payload','/types','console','newFnName','engineName','success','warn','normalizedSource','$ok','length','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\x20(only\x20for\x20queue-worker\x20pipelines)\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\x20\x20//\x0a\x20\x20//\x20Example:\x20handle\x20a\x20queued\x20task\x0a\x20\x20//\x20const\x20{\x20id,\x20action\x20}\x20=\x20ctx.payload;\x0a\x20\x20//\x20ctx.log.info(\x27handling\x20job\x27,\x20{\x20id,\x20action,\x20attempt:\x20ctx.job.tries\x20});\x0a\x20\x20//\x20await\x20ctx.env.put(\x27results\x27,\x20id,\x20{\x20done:\x20true\x20});\x0a\x0a\x20\x20return\x20{\x20ok:\x20true\x20};\x0a}','88xadOqS','custom','catch','\x22\x20created\x20and\x20started','Failed\x20(','engineKind','trim','step','Example\x20record','proc_originMode','lockedEnv','lockenv','busy','function','5SCvObr','msg','\x20(×','Embedding\x20pipeline\x20created','typeSelectionLocked','encode','proc_batchSize','test','hideQueueWorker','mat_clearTargetOnRebuild','true','filter','mat_bootstrap','logs','example','pipelineName','resetWizard','3078pLLorF','var(--okdb-app-fg-subtle)','existing','processorContext','$watch','loadMeta','byType','module','snapshot','json','fatal','1677760NXMXPT','count','items','functions','dispatchEvent','preview','mat_batchSize','remove','sort','embedding','buildEngineConfig','result','Compile\x20error','/env/','name','import','/pipelines/scaffold','API','Must\x20be\x20(ctx)\x20=>\x20{\x20…\x20}\x20or\x20async\x20(ctx)\x20=>\x20{\x20…\x20}','locktype','Failed\x20to\x20create\x20function\x20(','string','showAdvanced','set','materializer','locktypestrict','\x0a<div\x20class=\x22pw-wrap\x22>\x0a\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-title\x22>{{\x20engineKind\x20===\x20\x27embedding\x27\x20||\x20initialKind\x20===\x20\x27embedding\x27\x20?\x20\x27Create\x20Embedding\x20Pipeline\x27\x20:\x20engineKind\x20===\x20\x27materializer\x27\x20||\x20initialKind\x20===\x20\x27materializer\x27\x20?\x20\x27Create\x20Materializer\x20Pipeline\x27\x20:\x20\x27Create\x20Pipeline\x27\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-sub\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Set\x20up\x20automated\x20processing\x20in\x20<b>{{\x20selectedEnv\x20}}</b>.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20A\x20pipeline\x20connects\x20a\x20data\x20source\x20to\x20a\x20handler\x20function\x20and\x20runs\x20it\x20automatically.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<!--\x20──\x20Steps\x20indicator\x20──\x20-->\x0a\x20\x20\x20\x20<if\x20:=\x22engineKind\x20!==\x20\x27embedding\x27\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22pw-steps\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:class=\x22step\x20>=\x201\x20?\x20(step\x20>\x201\x20?\x20\x27pw-step-dot\x20pw-step-dot--done\x27\x20:\x20\x27pw-step-dot\x20pw-step-dot--active\x27)\x20:\x20\x27pw-step-dot\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20step\x20>\x201\x20?\x20\x27✓\x27\x20:\x20\x271\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22step\x20>=\x201\x20?\x20\x27pw-step-label\x20pw-step-label--active\x27\x20:\x20\x27pw-step-label\x27\x22>Type</span>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:class=\x22step\x20>\x201\x20?\x20\x27pw-step-line\x20pw-step-line--done\x27\x20:\x20\x27pw-step-line\x27\x22></div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:class=\x22step\x20>=\x202\x20?\x20(step\x20>\x202\x20?\x20\x27pw-step-dot\x20pw-step-dot--done\x27\x20:\x20\x27pw-step-dot\x20pw-step-dot--active\x27)\x20:\x20\x27pw-step-dot\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20step\x20>\x202\x20?\x20\x27✓\x27\x20:\x20\x272\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22step\x20>=\x202\x20?\x20\x27pw-step-label\x20pw-step-label--active\x27\x20:\x20\x27pw-step-label\x27\x22>Configure</span>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:class=\x22step\x20>\x202\x20?\x20\x27pw-step-line\x20pw-step-line--done\x27\x20:\x20\x27pw-step-line\x27\x22></div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20:class=\x22step\x20>=\x203\x20?\x20\x27pw-step-dot\x20pw-step-dot--active\x27\x20:\x20\x27pw-step-dot\x27\x22>3</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20:class=\x22step\x20>=\x203\x20?\x20\x27pw-step-label\x20pw-step-label--active\x27\x20:\x20\x27pw-step-label\x27\x22>Review</span>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<!--\x20════════════\x20STEP\x201:\x20Choose\x20type\x20════════════\x20-->\x0a\x20\x20\x20\x20<if\x20:=\x22step\x20===\x201\x20&&\x20!kindLocked\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-grid\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice\x22\x20@click=\x22pickType(\x27processor\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-icon\x22>⚡</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-name\x22>Change\x20Processor</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-desc\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Watches\x20a\x20data\x20type\x20for\x20changes\x20and\x20runs\x20your\x20function\x20for\x20every\x20batch.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Use\x20for\x20projections,\x20computed\x20values,\x20webhooks,\x20or\x20side-effects\x20that\x20should\x20trigger\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20whenever\x20records\x20are\x20created,\x20updated,\x20or\x20deleted.\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice\x22\x20@click=\x22pickType(\x27materializer\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-icon\x22>⇄</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-name\x22>Materializer</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-desc\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Watches\x20a\x20source\x20type\x20and\x20maintains\x20a\x20deterministic\x20derived\x20target\x20type\x20by\x20returning\x20ops\x20for\x20the\x20engine\x20to\x20apply.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Use\x20for\x20rebuildable\x20projections,\x20mirrors,\x20and\x20materialized\x20views.\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!hideQueueWorker\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice\x22\x20@click=\x22pickType(\x27queue-worker\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-icon\x22>⇶</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-name\x22>Queue\x20Worker</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-desc\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Processes\x20jobs\x20from\x20a\x20queue.\x20Use\x20for\x20background\x20tasks\x20like\x20sending\x20emails,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20generating\x20reports,\x20or\x20any\x20work\x20that\x20can\x20be\x20enqueued\x20and\x20processed\x20asynchronously\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20with\x20automatic\x20retries.\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</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\x20\x20<div\x20class=\x22pw-choice\x22\x20@click=\x22pickType(\x27embedding\x27)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-icon\x22>⊛</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-name\x22>Embedding\x20Pipeline</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-choice-desc\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Creates\x20an\x20embedder,\x20indexer,\x20search\x20engine,\x20and\x20optional\x20worker\x20as\x20one\x20grouped\x20pipeline.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Use\x20this\x20for\x20semantic\x20search,\x20RAG,\x20and\x20other\x20vector\x20workflows.\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<!--\x20════════════\x20STEP\x202:\x20Configure\x20════════════\x20-->\x0a\x20\x20\x20\x20<if\x20:=\x22step\x20===\x202\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27embedding\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-section\x22>Embeddings</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.58;\x20line-height:1.7;\x20margin-bottom:2px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Embedding\x20pipelines\x20use\x20the\x20specialized\x20creator\x20because\x20they\x20can\x20bundle\x20multiple\x20engines\x20and\x20optional\x20search/worker\x20settings\x20in\x20one\x20pass.\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\x20class=\x22pw-actions\x22\x20style=\x22margin-top:4px;\x22\x20:style=\x22kindLocked\x20?\x20\x27display:none;\x27\x20:\x20\x27\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22pw-btn\x20pw-btn--ghost\x22\x20@click=\x22goBack()\x22>←\x20Back</button>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<embed-create-panel\x20initialtab=\x22pipeline\x22\x20:locktype=\x22lockedType\x22\x20:lockenv=\x22selectedEnv\x22\x20@created=\x22onEmbeddingCreated($event.detail)\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20!==\x20\x27embedding\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Source\x20/\x20job\x20type\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-section\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20engineKind\x20===\x20\x27queue-worker\x27\x20?\x20\x27What\x20to\x20process\x27\x20:\x20\x27What\x20to\x20watch\x27\x20}}\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:=\x22engineKind\x20===\x20\x27processor\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22typeSelectionLocked\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Data\x20type</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\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22display:inline-flex;\x20align-items:center;\x20gap:6px;\x20padding:5px\x2010px;\x20border-radius:999px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20color:var(--okdb-accent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x206%,\x20transparent);\x20font-size:12px;\x22>{{\x20proc_sourceType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;\x20opacity:.45;\x22>Locked\x20to\x20the\x20current\x20DB\x20type</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</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!typeSelectionLocked\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Data\x20type</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20class=\x22pw-select\x22\x20:value=\x22proc_sourceType\x22\x20@change=\x22proc_sourceType\x20=\x20$event.target.value\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<option\x20value=\x22\x22>—\x20select\x20a\x20type\x20—</option>\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<each\x20:of=\x22types\x22\x20let:item=\x22t\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22t\x22>{{\x20t\x20}}</option>\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</each>\x0a\x20\x20\x20\x20\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\x20\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\x20\x20<div\x20class=\x22pw-hint\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20The\x20processor\x20will\x20receive\x20a\x20batch\x20of\x20changes\x20every\x20time\x20records\x20of\x20this\x20type\x20are\x20created,\x20updated,\x20or\x20deleted.\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</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27materializer\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22typeSelectionLocked\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Source\x20type</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x20flex-wrap:wrap;\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<span\x20style=\x22display:inline-flex;\x20align-items:center;\x20gap:6px;\x20padding:5px\x2010px;\x20border-radius:999px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x2033%,\x20transparent);\x20color:var(--okdb-accent);\x20background:color-mix(in\x20srgb,\x20var(--okdb-accent)\x206%,\x20transparent);\x20font-size:12px;\x22>{{\x20mat_sourceType\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<span\x20style=\x22font-size:11px;\x20opacity:.45;\x22>Locked\x20to\x20the\x20current\x20DB\x20type</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</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!typeSelectionLocked\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Source\x20type</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20class=\x22pw-select\x22\x20:value=\x22mat_sourceType\x22\x20@change=\x22mat_sourceType\x20=\x20$event.target.value\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<option\x20value=\x22\x22>—\x20select\x20a\x20type\x20—</option>\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<each\x20:of=\x22types\x22\x20let:item=\x22t\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22t\x22>{{\x20t\x20}}</option>\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</each>\x0a\x20\x20\x20\x20\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\x20\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\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Target\x20type</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20class=\x22pw-input\x22\x20type=\x22text\x22\x20placeholder=\x22e.g.\x20order_summaries\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22mat_targetType\x22\x20@input=\x22mat_targetType\x20=\x20$event.target.value\x22\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\x20class=\x22pw-hint\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20The\x20materializer\x20watches\x20the\x20source\x20type\x20and\x20applies\x20returned\x20ops\x20to\x20the\x20target\x20type,\x20making\x20rebuilds\x20deterministic.\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</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27queue-worker\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Job\x20type</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22queueJobTypes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-handler-toggle\x22\x20style=\x22max-width:300px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22qw_jobTypeMode\x20===\x20\x27existing\x27\x20?\x20\x27pw-handler-toggle-btn\x20pw-handler-toggle-btn--on\x27\x20:\x20\x27pw-handler-toggle-btn\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22setJobTypeMode(\x27existing\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>Known\x20type</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22qw_jobTypeMode\x20===\x20\x27custom\x27\x20?\x20\x27pw-handler-toggle-btn\x20pw-handler-toggle-btn--on\x27\x20:\x20\x27pw-handler-toggle-btn\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22setJobTypeMode(\x27custom\x27)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>Custom</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22qw_jobTypeMode\x20===\x20\x27existing\x27\x20&&\x20queueJobTypes.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20class=\x22pw-select\x22\x20:value=\x22qw_jobType\x22\x20@change=\x22qw_jobType\x20=\x20$event.target.value\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20value=\x22\x22>—\x20select\x20job\x20type\x20—</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22queueJobTypes\x22\x20let:item=\x22jt\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22jt\x22>{{\x20jt\x20}}</option>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</select>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22qw_jobTypeMode\x20===\x20\x27custom\x27\x20||\x20queueJobTypes.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20class=\x22pw-input\x22\x20type=\x22text\x22\x20placeholder=\x22e.g.\x20email.send\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22qw_jobType\x22\x20@input=\x22qw_jobType\x20=\x20$event.target.value\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\x22\x20style=\x22grid-column:\x201\x20/\x20-1;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Jobs\x20enqueued\x20with\x20this\x20type\x20will\x20be\x20routed\x20to\x20this\x20worker.\x20You\x20can\x20enqueue\x20jobs\x20from\x20functions,\x20the\x20API,\x20or\x20other\x20pipelines.\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Handler\x20function\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-section\x22>Handler\x20function</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.5;\x20line-height:1.6;\x20margin-bottom:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20The\x20function\x20that\x20runs\x20for\x20each\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20engineKind\x20===\x20\x27queue-worker\x27\x20?\x20\x27job\x27\x20:\x20\x27batch\x20of\x20changes\x27\x20}}.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Pick\x20an\x20existing\x20function\x20or\x20write\x20one\x20now.\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\x20class=\x22pw-handler-toggle\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22handlerMode\x20===\x20\x27existing\x27\x20?\x20\x27pw-handler-toggle-btn\x20pw-handler-toggle-btn--on\x27\x20:\x20\x27pw-handler-toggle-btn\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22handlerMode\x20=\x20\x27existing\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>Use\x20existing\x20function</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22handlerMode\x20===\x20\x27new\x27\x20?\x20\x27pw-handler-toggle-btn\x20pw-handler-toggle-btn--on\x27\x20:\x20\x27pw-handler-toggle-btn\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22handlerMode\x20=\x20\x27new\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20>Write\x20new\x20function</button>\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<!--\x20Existing\x20function\x20picker\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22handlerMode\x20===\x20\x27existing\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Function</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<select\x20class=\x22pw-select\x22\x20:value=\x22handlerName\x22\x20@change=\x22handlerName\x20=\x20$event.target.value\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<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\x20\x20\x20\x20\x20\x20<each\x20:of=\x22functions\x22\x20let:item=\x22fn\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<option\x20:value=\x22fn\x22>{{\x20fn\x20}}</option>\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</each>\x0a\x20\x20\x20\x20\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\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22functions.length\x20===\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\x22\x20style=\x22grid-column:\x201\x20/\x20-1;\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\x20No\x20functions\x20found\x20in\x20<b>{{\x20selectedEnv\x20}}</b>.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Switch\x20to\x20\x22Write\x20new\x20function\x22\x20to\x20create\x20one\x20inline.\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20New\x20function\x20inline\x20authoring\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22handlerMode\x20===\x20\x27new\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Function\x20name</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20class=\x22pw-input\x22\x20type=\x22text\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\x20placeholder=\x22e.g.\x20processArticle\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22newFnName\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22newFnName\x20=\x20$event.target.value\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20text-transform:uppercase;\x20letter-spacing:.06em;\x20opacity:.45;\x20margin-top:4px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Implementation\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\x20class=\x22pw-editor-wrap\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\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22height:100%;\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:value=\x22newFnSource\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@edit=\x22updateSource($event.detail)\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>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Validation\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22newFnValidation.ok\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:12px;\x20color:var(--okdb-success);\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!newFnValidation.ok\x20&&\x20newFnSource\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:12px;\x20color:var(--okdb-danger);\x22>{{\x20newFnValidation.message\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Dry\x20run\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22pw-btn\x20pw-btn--small\x20pw-btn--ghost\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!newFnValidation.ok\x20||\x20newFnDryRunning\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22dryRunFunction()\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{{\x20newFnDryRunning\x20?\x20\x27Running…\x27\x20:\x20\x27▶\x20Test\x20with\x20sample\x20data\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-size:11px;\x20opacity:.4;\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{{\x20engineKind\x20===\x20\x27queue-worker\x27\x20&&\x20effectiveJobType\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20?\x20\x27Uses\x20a\x20real\x20job\x20payload\x20from\x20the\x20queue\x20if\x20available.\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:\x20\x27Runs\x20the\x20function\x20draft\x20against\x20synthetic\x20test\x20data\x20without\x20saving\x20it.\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-warn\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20⚠\x20<strong>Test\x20with\x20sample\x20data</strong>\x20runs\x20your\x20function\x20for\x20real\x20—\x20the\x20function\x20itself\x20is\x20not\x20saved,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20but\x20any\x20side-effects\x20(e.g. <code>ctx.env.put</code>)\x20<em>will</em>\x20write\x20to\x20live\x20data.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Dry-run\x20result\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22newFnDryResult\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-dry-card\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\x20:class=\x22dryRunStatus\x20===\x20\x27error\x27\x20?\x20\x27pw-dry-err\x27\x20:\x20\x27pw-dry-ok\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20dryRunStatus\x20===\x20\x27error\x27\x20?\x20\x27✕\x20Function\x20returned\x20an\x20error\x27\x20:\x20\x27✓\x20Function\x20executed\x20successfully\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-dry-meta\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22dryRunDuration\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>{{\x20dryRunDuration\x20}}ms</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>status:\x20{{\x20newFnDryResult.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\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22dryRunStatus\x20===\x20\x27error\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22pw-dry-pre\x22\x20style=\x22color:var(--okdb-danger);\x22>{{\x20formatJson(newFnDryResult.error\x20??\x20newFnDryResult.result?.value\x20??\x20newFnDryResult)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22dryRunStatus\x20!==\x20\x27error\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22pw-dry-pre\x22>{{\x20formatJson(newFnDryResult.result?.value\x20??\x20newFnDryResult)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Dry-run\x20logs\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22dedupedDryLogs.length\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.06em;\x20opacity:.4;\x20margin-top:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Logs\x20({{\x20newFnDryResult.logs.length\x20}})\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-dry-logs\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22dedupedDryLogs\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\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-dry-log-entry\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-dry-log-level\x22\x20:style=\x22\x27color:\x27\x20+\x20logColor(entry)\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\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>{{\x20logLabel(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\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Input\x20payload\x20used\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22newFnDryPayload\x20!=\x20null\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<details\x20style=\x22margin-top:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<summary\x20style=\x22font-size:10px;\x20text-transform:uppercase;\x20letter-spacing:.06em;\x20opacity:.4;\x20cursor:pointer;\x20user-select:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Input\x20payload\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</summary>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<pre\x20class=\x22pw-dry-pre\x22\x20style=\x22margin-top:4px;\x20max-height:180px;\x22>{{\x20formatJson(newFnDryPayload)\x20}}</pre>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</details>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</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:=\x22newFnDryError\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-dry-card\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\x20class=\x22pw-dry-err\x22>✕\x20{{\x20newFnDryError\x20}}</div>\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Advanced\x20options\x20(collapsed)\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-adv-toggle\x22\x20@click=\x22showAdvanced\x20=\x20!showAdvanced\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>{{\x20showAdvanced\x20?\x20\x27▾\x27\x20:\x20\x27▸\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Advanced\x20options</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22showAdvanced\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27processor\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Mode</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\x20class=\x22pw-pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22proc_mode\x20===\x20\x27async\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22proc_mode\x20=\x20\x27async\x27\x22>async</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22proc_mode\x20===\x20\x27inline\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22proc_mode\x20=\x20\x27inline\x27\x22>inline</button>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\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<b>async</b>\x20processes\x20changes\x20in\x20background\x20batches\x20(recommended).\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<b>inline</b>\x20runs\x20synchronously\x20inside\x20the\x20write\x20path.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22proc_mode\x20===\x20\x27async\x27\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\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Bootstrap</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22proc_bootstrap\x20===\x20\x27snapshot\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22proc_bootstrap\x20=\x20\x27snapshot\x27\x22>snapshot</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22proc_bootstrap\x20===\x20\x27log\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22proc_bootstrap\x20=\x20\x27log\x27\x22>log</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<b>snapshot</b>\x20processes\x20all\x20existing\x20records\x20first,\x20then\x20switches\x20to\x20live.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<b>log</b>\x20replays\x20the\x20change\x20log\x20from\x20the\x20beginning.\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Batch\x20size</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<input\x20class=\x22pw-input\x22\x20type=\x22number\x22\x20min=\x221\x22\x20max=\x2210000\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22proc_batchSize\x22\x20@input=\x22proc_batchSize\x20=\x20$event.target.value\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Origin\x20mode</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\x20class=\x22pw-pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22proc_originMode\x20===\x20\x27all\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22proc_originMode\x20=\x20\x27all\x27\x22>all</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22proc_originMode\x20===\x20\x27self\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22proc_originMode\x20=\x20\x27self\x27\x22>self</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22proc_originMode\x20===\x20\x27remote\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22proc_originMode\x20=\x20\x27remote\x27\x22>remote</button>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\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<b>all</b>\x20=\x20local\x20+\x20synced\x20changes.\x20<b>self</b>\x20=\x20local\x20only.\x20<b>remote</b>\x20=\x20synced\x20only.\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27materializer\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Bootstrap</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\x20class=\x22pw-pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22mat_bootstrap\x20===\x20\x27snapshot\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22mat_bootstrap\x20=\x20\x27snapshot\x27\x22>snapshot</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22mat_bootstrap\x20===\x20\x27log\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22mat_bootstrap\x20=\x20\x27log\x27\x22>log</button>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\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<b>snapshot</b>\x20replays\x20all\x20current\x20source\x20rows\x20first.\x20<b>log</b>\x20replays\x20the\x20full\x20change\x20log.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Batch\x20size</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<input\x20class=\x22pw-input\x22\x20type=\x22number\x22\x20min=\x221\x22\x20max=\x2210000\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22mat_batchSize\x22\x20@input=\x22mat_batchSize\x20=\x20$event.target.value\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Origin\x20mode</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\x20class=\x22pw-pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22mat_originMode\x20===\x20\x27all\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22mat_originMode\x20=\x20\x27all\x27\x22>all</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22mat_originMode\x20===\x20\x27self\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22mat_originMode\x20=\x20\x27self\x27\x22>self</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22mat_originMode\x20===\x20\x27remote\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22mat_originMode\x20=\x20\x27remote\x27\x22>remote</button>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\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\x20Choose\x20whether\x20the\x20materializer\x20reacts\x20to\x20local\x20changes,\x20synced\x20changes,\x20or\x20both.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Rebuild</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<label\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x20font-size:12px;\x20color:var(--okdb-app-fg);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22mat_clearTargetOnRebuild\x22\x20@change=\x22mat_clearTargetOnRebuild\x20=\x20$event.target.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Clear\x20target\x20before\x20rebuild\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</label>\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</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27queue-worker\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Concurrency</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<input\x20class=\x22pw-input\x22\x20type=\x22number\x22\x20min=\x221\x22\x20max=\x2264\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22qw_concurrency\x22\x20@input=\x22qw_concurrency\x20=\x20$event.target.value\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\x22>How\x20many\x20jobs\x20to\x20process\x20in\x20parallel.</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Run\x20recording\x20(shared\x20by\x20both\x20engine\x20types)\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22border-top:1px\x20solid\x20var(--okdb-app-border);\x20margin-top:4px;\x20padding-top:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-label\x22>Run\x20recording</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\x20class=\x22pw-pills\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22handler_recordRuns\x20===\x20\x27all\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22handler_recordRuns\x20=\x20\x27all\x27\x22>all\x20runs</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22handler_recordRuns\x20===\x20\x27errors\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22handler_recordRuns\x20=\x20\x27errors\x27\x22>errors\x20only</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20:class=\x22handler_recordRuns\x20===\x20\x27none\x27\x20?\x20\x27pw-pill\x20pw-pill--on\x27\x20:\x20\x27pw-pill\x27\x22\x20@click=\x22handler_recordRuns\x20=\x20\x27none\x27\x22>none</button>\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-hint\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\x20Controls\x20whether\x20each\x20function\x20invocation\x20is\x20recorded\x20in\x20the\x20run\x20ledger.\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<b>errors\x20only</b>\x20(recommended)\x20avoids\x20creating\x20hundreds\x20of\x20run\x20records\x20for\x20busy\x20pipelines\x20while\x20still\x20capturing\x20failures.\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<b>none</b>\x20fully\x20suppresses\x20recording\x20—\x20useful\x20for\x20high-throughput\x20processors\x20where\x20logging\x20isn\x27t\x20needed.\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Navigation\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-actions\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22pw-btn\x20pw-btn--ghost\x22\x20@click=\x22goBack()\x22>←\x20Back</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22pw-btn\x22\x20:disabled=\x22!step2Valid\x22\x20@click=\x22goNext()\x22>Review\x20→</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20<!--\x20════════════\x20STEP\x203:\x20Review\x20&\x20Create\x20════════════\x20-->\x0a\x20\x20\x20\x20<if\x20:=\x22step\x20===\x203\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-card\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-section\x22>Summary</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Pipeline</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>{{\x20pipelineName\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Environment</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>{{\x20selectedEnv\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Type</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>{{\x20engineKind\x20===\x20\x27processor\x27\x20?\x20\x27Change\x20Processor\x27\x20:\x20engineKind\x20===\x20\x27materializer\x27\x20?\x20\x27Materializer\x27\x20:\x20\x27Queue\x20Worker\x27\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27processor\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Watches</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>{{\x20proc_sourceType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27materializer\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Source</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>{{\x20mat_sourceType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Target</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>{{\x20mat_targetType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27queue-worker\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Job\x20type</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>{{\x20effectiveJobType\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Handler</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20effectiveHandlerName\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;\x20font-family:sans-serif;\x20font-size:11px;\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{{\x20handlerMode\x20===\x20\x27new\x27\x20?\x20\x27(will\x20be\x20created)\x27\x20:\x20\x27\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Engine</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22>{{\x20engineName\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Run\x20recording</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22\x20style=\x22font-size:11px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20handler_recordRuns\x20===\x20\x27all\x27\x20?\x20\x27all\x20runs\x27\x20:\x20handler_recordRuns\x20===\x20\x27errors\x27\x20?\x20\x27errors\x20only\x27\x20:\x20\x27none\x27\x20}}\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</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22showAdvanced\x20||\x20proc_mode\x20!==\x20\x27async\x27\x20||\x20proc_bootstrap\x20!==\x20\x27snapshot\x27\x20||\x20proc_batchSize\x20!=\x20256\x20||\x20proc_originMode\x20!==\x20\x27all\x27\x20||\x20mat_bootstrap\x20!==\x20\x27snapshot\x27\x20||\x20mat_batchSize\x20!=\x20128\x20||\x20mat_originMode\x20!==\x20\x27all\x27\x20||\x20!mat_clearTargetOnRebuild\x20||\x20qw_concurrency\x20!=\x201\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-summary-row\x22\x20style=\x22border-bottom:none;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-label\x22>Options</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22pw-summary-val\x22\x20style=\x22font-size:11px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27processor\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20mode={{\x20proc_mode\x20}}\x20·\x20bootstrap={{\x20proc_mode\x20===\x20\x27inline\x27\x20?\x20\x27n/a\x27\x20:\x20proc_bootstrap\x20}}\x20·\x20batch={{\x20proc_batchSize\x20}}\x20·\x20origin={{\x20proc_originMode\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27materializer\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20bootstrap={{\x20mat_bootstrap\x20}}\x20·\x20batch={{\x20mat_batchSize\x20}}\x20·\x20origin={{\x20mat_originMode\x20}}\x20·\x20clearOnRebuild={{\x20mat_clearTargetOnRebuild\x20?\x20\x27yes\x27\x20:\x20\x27no\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22engineKind\x20===\x20\x27queue-worker\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20concurrency={{\x20qw_concurrency\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:12px;\x20opacity:.45;\x20line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20This\x20will{{\x20handlerMode\x20===\x20\x27new\x27\x20?\x20\x27\x20create\x20the\x20function,\x20then\x27\x20:\x20\x27\x27\x20}}\x20create\x20the\x20engine\x20and\x20pipeline\x20record,\x20and\x20start\x20it\x20immediately.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<!--\x20Feedback\x20-->\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-error\x22>{{\x20error\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22success\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-success\x22>{{\x20success\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22pw-actions\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22pw-btn\x20pw-btn--ghost\x22\x20@click=\x22goBack()\x22>←\x20Back</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22pw-btn\x20pw-btn--green\x22\x20:disabled=\x22busy\x22\x20@click=\x22submit()\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20busy\x20?\x20\x27Creating…\x27\x20:\x20\x27Create\x20&\x20Start\x20Pipeline\x27\x20}}\x0a\x20\x20\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</if>\x0a</div>','async\x20(ctx)\x20=>\x20{\x0a\x20\x20//\x20ctx.payload\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20array\x20of\x20{\x20key,\x20value,\x20action,\x20clock\x20}\x0a\x20\x20//\x20ctx.processor\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20processor\x20trigger\x20metadata\x20(only\x20for\x20processor\x20engines)\x0a\x20\x20//\x20\x20\x20ctx.processor.mode\x20\x20\x20\x20\x20\x20\x20\x20—\x20\x22snapshot\x22\x20|\x20\x22live\x22\x0a\x20\x20//\x20\x20\x20ctx.processor.sourceType\x20\x20—\x20the\x20type\x20being\x20watched\x0a\x20\x20//\x20\x20\x20ctx.processor.sourceEnv\x20\x20\x20—\x20the\x20environment\x20of\x20the\x20source\x20type\x0a\x20\x20//\x20ctx.env\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20env\x20facade:\x20put,\x20get,\x20query,\x20txn,\x20...\x0a\x20\x20//\x20ctx.log\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20—\x20structured\x20logger:\x20ctx.log.info(msg,\x20data)\x0a\x20\x20//\x0a\x20\x20//\x20Example:\x20materialised\x20view\x0a\x20\x20//\x20for\x20(const\x20change\x20of\x20ctx.payload)\x20{\x0a\x20\x20//\x20\x20\x20await\x20ctx.env.put(\x27derived\x27,\x20change.key,\x20{\x20processed:\x20true,\x20...change.value\x20});\x0a\x20\x20//\x20}\x0a\x0a\x20\x20return\x20{\x20processed:\x20ctx.payload.length\x20};\x0a}','has','newFnSource','mat_targetType','debug','materializerContext','294822cBzsRS','step2Valid','all','effectiveJobType','includes','stringify','isArray','3027910KxmLjs','3820794QfTVaj','replace','error','Cannot\x20use\x20\x22','newFnDryError','newFnDryResult','Handler\x20for\x20pipeline\x20','errors','/jobs?','buildDryRunPayload','6895iQjBsw','/job/','put','kindLocked','var(--okdb-danger)','types','availableKinds','/functions','new','inline','queue-worker','qw_jobTypeMode','map','worker_threads','handlerName','/queue','startsWith','key','stores','proc_bootstrap','application/json','applyScopeDefaults','mat_originMode','40PyabCy','test-1','execution','autoName','process','initialKind','type','proc_mode','__preview__','effectiveHandlerName','durationMs','child_process','newFnDryPayload','created','/queue/stats','message','__preview-job__','example_projection','$attr','/functions/preview','okdb','level','mat_sourceType','POST','$el','async','qw_jobType','Source\x20exceeds\x2064\x20KB','lockedType','selectedEnv','var(--okdb-warning)','exports','newFnValidation'];_0x41a1=function(){return _0x1f4ec5;};return _0x41a1();}
|
|
1
|
+
import e from"../../../components/ok-js-input.ok.js";import n from"./embed-create-panel.ok.js";const t=[{symbol:"require",pattern:/(^|[^\w$.])require\s*\(/},{symbol:"import",pattern:/(^|[^\w$.])import\b/},{symbol:"console",pattern:/(^|[^\w$.])console\b/},{symbol:"module",pattern:/(^|[^\w$.])module\b/},{symbol:"exports",pattern:/(^|[^\w$.])exports\b/},{symbol:"process",pattern:/(^|[^\w$.])process\b/},{symbol:"child_process",pattern:/child_process/},{symbol:"worker_threads",pattern:/worker_threads/}];function i(e){const n="string"==typeof e?e.replace(/\r\n/g,"\n").trim():"";if(!n)return{ok:!1,message:"Source is required"};if((new TextEncoder).encode(n).length>65536)return{ok:!1,message:"Source exceeds 64 KB"};if(!/^(async\s+)?\(\s*[A-Za-z_$][\w$]*\s*\)\s*=>/.test(n))return{ok:!1,message:"Must be (ctx) => { … } or async (ctx) => { … }"};for(const{symbol:e,pattern:i}of t)if(i.test(n))return{ok:!1,message:`Cannot use "${e}"`};try{new Function(`return (${n});`)()}catch(e){return{ok:!1,message:e?.message||"Compile error"}}return{ok:!0,normalizedSource:n}}function a(e){return!0===e||""===e||1===e||"1"===e||"true"===e}export default{tag:"pipeline-create-panel",attr:{locktype:{},lockenv:{},initialkind:{},locktypestrict:{},hidequeueworker:{}},dependencies:[e,n],context:e=>({step:1,busy:!1,error:null,success:null,engineKind:"",proc_sourceType:"",mat_sourceType:"",mat_targetType:"",qw_jobType:"",qw_jobTypeMode:"existing",handlerMode:"existing",handlerName:"",newFnName:"",newFnSource:"",newFnValidation:{ok:!1,message:"Source is required"},newFnDryRunning:!1,newFnDryResult:null,newFnDryError:null,newFnDryPayload:null,showAdvanced:!1,proc_mode:"async",proc_bootstrap:"snapshot",proc_batchSize:256,proc_originMode:"all",mat_bootstrap:"snapshot",mat_batchSize:128,mat_originMode:"all",mat_clearTargetOnRebuild:!0,qw_concurrency:1,handler_recordRuns:"errors",types:[],functions:[],queueJobTypes:[],get lockedType(){return e.$attr.locktype||""},get lockedEnv(){return e.$attr.lockenv||""},get initialKind(){const n=e.$attr.initialkind||"";return this.availableKinds.includes(n)?n:""},get lockTypeStrict(){return a(e.$attr.locktypestrict)},get hideQueueWorker(){return a(e.$attr.hidequeueworker)},get availableKinds(){return["processor","materializer","queue-worker","embedding"].filter(e=>!(this.hideQueueWorker&&"queue-worker"===e))},get typeSelectionLocked(){return!!this.lockedType&&this.lockTypeStrict},get kindLocked(){return!!this.initialKind},get selectedEnv(){return this.lockedEnv||e.$ok.stores.okdb.selectedEnv||"default"},async loadMeta(){const e=this.selectedEnv;try{const[n,t,i]=await Promise.all([fetch(`${__ENV__.API}/env/${encodeURIComponent(e)}/types`),fetch(`${__ENV__.API}/env/${encodeURIComponent(e)}/functions`),fetch(`${__ENV__.API}/env/${encodeURIComponent(e)}/queue/stats`).catch(()=>null)]),a=await n.json().catch(()=>({})),s=await t.json().catch(()=>({})),r=a.data??a.result??[];this.types=(Array.isArray(r)?r.map(e=>e.type??e.name??e):Object.keys(r)).filter(e=>"string"==typeof e&&!e.startsWith("~")).sort();const o=s.data??s.result??[];if(this.functions=Array.isArray(o)?o.map(e=>e.key??e.name??e).filter(Boolean).sort():[],i&&i.ok){const e=await i.json().catch(()=>({})),n=e?.result??e?.data??null,t=n?.byType??{};this.queueJobTypes=Object.keys(t).sort()}else this.queueJobTypes=[]}catch{this.types=[],this.functions=[],this.queueJobTypes=[]}},get effectiveJobType(){return"custom"===this.qw_jobTypeMode?this.qw_jobType.trim():this.qw_jobType},get effectiveHandlerName(){return"new"===this.handlerMode?this.newFnName.trim():this.handlerName},get autoName(){return"processor"===this.engineKind&&this.proc_sourceType&&this.effectiveHandlerName?`${this.proc_sourceType}-${this.effectiveHandlerName}`:"materializer"===this.engineKind&&this.mat_sourceType&&this.mat_targetType&&this.effectiveHandlerName?`${this.mat_sourceType}-to-${this.mat_targetType}-${this.effectiveHandlerName}`:"queue-worker"===this.engineKind&&this.effectiveJobType&&this.effectiveHandlerName?`${this.effectiveJobType}-${this.effectiveHandlerName}`:""},get pipelineName(){return this.autoName},get engineName(){return this.autoName?`${this.autoName}:${this.engineKind}`:""},get step2Valid(){return"embedding"===this.engineKind||!("processor"===this.engineKind&&!this.proc_sourceType)&&!!("materializer"!==this.engineKind||this.mat_sourceType&&this.mat_targetType)&&!("queue-worker"===this.engineKind&&!this.effectiveJobType)&&("existing"===this.handlerMode?!!this.handlerName:!!this.newFnName.trim()&&this.newFnValidation.ok)},resetWizard(){this.step=this.kindLocked?2:1,this.engineKind=this.kindLocked?this.initialKind:"",this.proc_sourceType=this.lockedType||"",this.mat_sourceType=this.lockedType||"",this.mat_targetType="",this.qw_jobType="",this.qw_jobTypeMode="existing",this.handlerMode="existing",this.handlerName="",this.newFnName="",this.newFnSource="",this.newFnValidation={ok:!1,message:"Source is required"},this.newFnDryResult=null,this.newFnDryError=null,this.showAdvanced=!1,this.handler_recordRuns="errors",this.proc_mode="async",this.proc_bootstrap="snapshot",this.proc_batchSize=256,this.proc_originMode="all",this.mat_bootstrap="snapshot",this.mat_batchSize=128,this.mat_originMode="all",this.mat_clearTargetOnRebuild=!0,this.qw_concurrency=1},applyScopeDefaults(){this.typeSelectionLocked?(this.proc_sourceType=this.lockedType,this.mat_sourceType=this.lockedType):this.lockedType&&!this.proc_sourceType&&(this.proc_sourceType=this.lockedType),this.typeSelectionLocked||!this.lockedType||this.mat_sourceType||(this.mat_sourceType=this.lockedType),this.kindLocked&&this.engineKind!==this.initialKind&&this.pickType(this.initialKind)},get dedupedDryLogs(){const e=this.newFnDryResult?.logs;if(!Array.isArray(e)||!e.length)return[];const n=[],t=new Map;for(const i of e){const e=`${i.level??""}::${i.msg??i.message??JSON.stringify(i)}`;if(t.has(e))t.get(e).count++;else{const a={...i,count:1,_key:e};t.set(e,a),n.push(a)}}return n},get dryRunDuration(){const e=this.newFnDryResult;return e?e.execution?.durationMs??null:null},get dryRunStatus(){const e=this.newFnDryResult;return e?"error"===e.status||e.error?"error":e.status||"success":null},pickType(e){this.availableKinds.includes(e)&&(this.engineKind=e,this.step=2,this.typeSelectionLocked&&(this.proc_sourceType=this.lockedType,this.mat_sourceType=this.lockedType),"embedding"!==e&&(this.newFnSource||(this.newFnSource="processor"===e?'async (ctx) => {\n // ctx.payload — array of { key, value, action, clock }\n // ctx.processor — processor trigger metadata (only for processor engines)\n // ctx.processor.mode — "snapshot" | "live"\n // ctx.processor.sourceType — the type being watched\n // ctx.processor.sourceEnv — the environment of the source type\n // ctx.env — env facade: put, get, query, txn, ...\n // ctx.log — structured logger: ctx.log.info(msg, data)\n //\n // Example: materialised view\n // for (const change of ctx.payload) {\n // await ctx.env.put(\'derived\', change.key, { processed: true, ...change.value });\n // }\n\n return { processed: ctx.payload.length };\n}':"materializer"===e?"async (ctx) => {\n // ctx.payload — array of change records\n // change.action — \"put\" | \"remove\"\n // change.key — source record key\n // change.value — hydrated source value for puts\n // change.clock — log clock during live replay; null during snapshot bootstrap\n // ctx.materializer — materializer trigger metadata\n // ctx.materializer.sourceType — the type being watched\n // ctx.materializer.targetType — the derived target type\n // ctx.materializer.sourceEnv — the environment of the source type\n // ctx.materializer.targetEnv — the environment of the target type\n // ctx.env — env facade (read-only for deterministic materializers)\n // ctx.log — structured logger: ctx.log.info(msg, data)\n //\n // Return ops for the engine to apply to the target type.\n const ops = [];\n\n for (const change of ctx.payload) {\n if (change.action === 'put') {\n const doc = change.value ?? change.newValue;\n if (!doc) continue;\n\n ops.push({\n action: 'put',\n key: change.key,\n value: {\n projected: true,\n sourceKey: change.key,\n ...doc,\n },\n });\n }\n\n if (change.action === 'remove') {\n ops.push({ action: 'remove', key: change.key });\n }\n }\n\n return ops;\n}":"async (ctx) => {\n // ctx.payload — the raw job payload (whatever was enqueued)\n // ctx.job — queue job context (only for queue-worker pipelines)\n // ctx.job.id, ctx.job.type, ctx.job.tries, ctx.job.tags, ...\n // ctx.job.heartbeat() — keep the job alive\n // ctx.job.markProgress(msg) — report progress\n // ctx.env — env facade: put, get, query, txn, ...\n // ctx.log — structured logger: ctx.log.info(msg, data)\n //\n // Example: handle a queued task\n // const { id, action } = ctx.payload;\n // ctx.log.info('handling job', { id, action, attempt: ctx.job.tries });\n // await ctx.env.put('results', id, { done: true });\n\n return { ok: true };\n}",this.newFnValidation=i(this.newFnSource))))},goBack(){"embedding"!==this.engineKind?this.step>1&&this.step--:this.resetWizard()},goNext(){2===this.step&&this.step2Valid&&(this.step=3)},onEmbeddingCreated(n){this.success="Embedding pipeline created",this.error=null,this.resetWizard(),e.$el.dispatchEvent(new CustomEvent("created",{detail:n,bubbles:!0}))},updateSource(e){this.newFnSource=e??"",this.newFnValidation=i(this.newFnSource)},async buildDryRunPayload(){if("processor"===this.engineKind)return[{key:"test-1",value:{sample:!0,name:"Example record"},action:"put",clock:1}];if("materializer"===this.engineKind)return[{key:"test-1",value:{sample:!0,name:"Example record"},action:"put",clock:null},{key:"test-2",action:"remove",clock:2}];const e=this.effectiveJobType;if(e)try{const n=this.selectedEnv,t=`${__ENV__.API}/env/${encodeURIComponent(n)}/queue`,i=await fetch(`${t}/jobs?${new URLSearchParams({type:e,limit:"1"})}`);if(i.ok){const e=await i.json(),n=e?.result?.items??e?.data?.items??[],a=n[0]?.key??n[0]?.id??n[0]?.value?.id;if(a){const e=await fetch(`${t}/job/${encodeURIComponent(a)}`);if(e.ok){const n=await e.json(),t=n?.result??n?.data;if(void 0!==t?.payload)return t.payload}}}}catch{}return{}},async dryRunFunction(){if(this.newFnValidation.ok&&!this.newFnDryRunning){this.newFnDryRunning=!0,this.newFnDryResult=null,this.newFnDryError=null,this.newFnDryPayload=null;try{const e=this.selectedEnv,n=await this.buildDryRunPayload();this.newFnDryPayload=n;const t={name:this.newFnName.trim()||"__preview__",source:this.newFnValidation.normalizedSource||this.newFnSource.trim(),metadata:{description:"Pipeline handler preview"},enabled:!0,payload:n};"queue-worker"===this.engineKind&&(t.jobContext={id:"__preview-job__",type:this.effectiveJobType||"preview",tries:1,created:Date.now(),tags:null,priority:0,bucket:null,cron:null}),"processor"===this.engineKind&&(t.processorContext={mode:"live",sourceType:this.proc_sourceType||"example",sourceEnv:this.selectedEnv,processor:"__preview__",engineKey:"__preview__",cursorKey:null}),"materializer"===this.engineKind&&(t.materializerContext={mode:"live",sourceType:this.mat_sourceType||"example",targetType:this.mat_targetType||"example_projection",sourceEnv:this.selectedEnv,targetEnv:this.selectedEnv,engineKey:"__preview__",cursorKey:null});const i=await fetch(`${__ENV__.API}/env/${encodeURIComponent(e)}/functions/preview`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await i.json().catch(()=>({})),s=a?.data??a?.result??a;if(!i.ok&&!s?.status)throw new Error(a?.error?.message||`Preview failed (${i.status})`);this.newFnDryResult=s}catch(e){this.newFnDryError=e?.message||String(e)}finally{this.newFnDryRunning=!1}}},buildEngineConfig(){const e={kind:"function",name:this.effectiveHandlerName};return"all"!==this.handler_recordRuns&&(e.recordRuns=this.handler_recordRuns),"processor"===this.engineKind?{source_type:this.proc_sourceType,source_env:this.selectedEnv,handler:e,mode:this.proc_mode,bootstrap:"inline"===this.proc_mode?null:this.proc_bootstrap,batchSize:Number(this.proc_batchSize)||256,originMode:this.proc_originMode}:"materializer"===this.engineKind?{source_type:this.mat_sourceType,target_type:this.mat_targetType,source_env:this.selectedEnv,target_env:this.selectedEnv,handler:e,bootstrap:this.mat_bootstrap,batchSize:Number(this.mat_batchSize)||128,originMode:this.mat_originMode,clearTargetOnRebuild:!1!==this.mat_clearTargetOnRebuild}:"queue-worker"===this.engineKind?{job_type:this.effectiveJobType,queue_env:this.selectedEnv,handler:e,concurrency:Number(this.qw_concurrency)||1}:{}},async submit(){if(this.step2Valid&&!this.busy){this.busy=!0,this.error=null,this.success=null;try{const n=this.selectedEnv;if("new"===this.handlerMode){const e={name:this.newFnName.trim(),source:this.newFnValidation.normalizedSource||this.newFnSource.trim(),metadata:{description:`Handler for pipeline ${this.pipelineName}`,owner_engine:this.engineName,pipeline:this.pipelineName},enabled:!0},t=await fetch(`${__ENV__.API}/env/${encodeURIComponent(n)}/functions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),i=await t.json().catch(()=>({}));if(!t.ok)throw new Error(i?.error?.message||`Failed to create function (${t.status})`)}const t={name:this.pipelineName,meta:{label:this.pipelineName},members:[{engineType:this.engineKind,engineName:this.engineName,role:this.engineKind,engineConfig:this.buildEngineConfig()}]},i=await fetch(`${__ENV__.API}/env/${encodeURIComponent(n)}/pipelines/scaffold`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await i.json().catch(()=>({}));if(!i.ok)throw new Error(a?.error?.message||`Failed (${i.status})`);this.success=`Pipeline "${this.pipelineName}" created and started`,e.$el.dispatchEvent(new CustomEvent("created",{detail:a.result??a.data,bubbles:!0})),this.resetWizard()}catch(e){this.error=e?.message||String(e)}finally{this.busy=!1}}},formatJson(e){try{return JSON.stringify(e,null,2)}catch{return String(e??"")}},setJobTypeMode(e){this.qw_jobTypeMode=e,this.qw_jobType=""},logLabel(e){const n=e?.msg??e?.message??"";return e?.count>1?`${n} (×${e.count})`:n},logColor(e){const n=e?.level??"";return"error"===n||"fatal"===n?"var(--okdb-danger)":"warn"===n?"var(--okdb-warning)":"debug"===n?"var(--okdb-app-fg-muted)":"var(--okdb-app-fg-subtle)"}}),async init(e){await this.loadMeta(),this.applyScopeDefaults(),e.$watch(()=>e.$ok.stores.okdb.selectedEnv,async()=>{await this.loadMeta(),this.applyScopeDefaults()})},style:"\n pipeline-create-panel {\n display: block;\n }\n pipeline-create-panel .pw-wrap {\n display: flex;\n flex-direction: column;\n gap: 18px;\n max-width: 820px;\n }\n pipeline-create-panel .pw-title {\n font-size: 18px;\n font-weight: 600;\n }\n pipeline-create-panel .pw-sub {\n font-size: 12px;\n opacity: .55;\n line-height: 1.7;\n max-width: 680px;\n }\n\n /* ── steps indicator ── */\n pipeline-create-panel .pw-steps {\n display: flex;\n align-items: center;\n gap: 0;\n font-size: 12px;\n margin-bottom: 4px;\n }\n pipeline-create-panel .pw-step-dot {\n width: 26px; height: 26px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n font-weight: 700; font-size: 12px;\n border: 2px solid var(--okdb-app-border);\n color: var(--okdb-app-fg-muted);\n background: transparent;\n flex-shrink: 0;\n }\n pipeline-create-panel .pw-step-dot--active {\n border-color: var(--okdb-accent);\n color: var(--okdb-accent);\n background: color-mix(in srgb, var(--okdb-accent) 7%, transparent);\n }\n pipeline-create-panel .pw-step-dot--done {\n border-color: var(--okdb-success);\n color: var(--okdb-success);\n background: color-mix(in srgb, var(--okdb-success) 7%, transparent);\n }\n pipeline-create-panel .pw-step-line {\n flex: 1;\n height: 2px;\n background: var(--okdb-app-border);\n margin: 0 6px;\n max-width: 60px;\n }\n pipeline-create-panel .pw-step-line--done {\n background: color-mix(in srgb, var(--okdb-success) 40%, transparent);\n }\n pipeline-create-panel .pw-step-label {\n margin-left: 8px;\n opacity: .45;\n }\n pipeline-create-panel .pw-step-label--active {\n opacity: 1;\n color: var(--okdb-accent);\n }\n\n /* ── type-choice cards ── */\n pipeline-create-panel .pw-choice-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: 14px;\n }\n pipeline-create-panel .pw-choice {\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-border);\n border-radius: 12px;\n padding: 20px 18px;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transition: border-color .15s, background .15s;\n }\n pipeline-create-panel .pw-choice:hover {\n border-color: color-mix(in srgb, var(--okdb-accent) 33%, transparent);\n background: var(--okdb-app-surface);\n }\n pipeline-create-panel .pw-choice-icon {\n font-size: 28px;\n opacity: .8;\n }\n pipeline-create-panel .pw-choice-name {\n font-size: 15px;\n font-weight: 600;\n }\n pipeline-create-panel .pw-choice-desc {\n font-size: 12px;\n opacity: .55;\n line-height: 1.7;\n }\n\n /* ── card / form ── */\n pipeline-create-panel .pw-card {\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-border);\n border-radius: 12px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n pipeline-create-panel .pw-section {\n font-size: 11px;\n text-transform: uppercase;\n opacity: .45;\n letter-spacing: .06em;\n }\n pipeline-create-panel .pw-row {\n display: grid;\n grid-template-columns: 130px 1fr;\n gap: 8px 12px;\n align-items: center;\n font-size: 13px;\n }\n pipeline-create-panel .pw-label {\n opacity: .7;\n text-align: right;\n font-size: 12px;\n }\n pipeline-create-panel .pw-input {\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-border);\n border-radius: 6px;\n padding: 6px 8px;\n color: inherit;\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n }\n pipeline-create-panel .pw-input:focus {\n outline: none;\n border-color: var(--okdb-accent);\n }\n pipeline-create-panel .pw-select {\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-border);\n border-radius: 6px;\n padding: 6px 8px;\n color: inherit;\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n }\n pipeline-create-panel .pw-hint {\n font-size: 11px;\n opacity: .4;\n font-style: italic;\n grid-column: 2;\n line-height: 1.5;\n }\n pipeline-create-panel .pw-pills {\n display: flex;\n gap: 4px;\n }\n pipeline-create-panel .pw-pill {\n padding: 4px 12px;\n border-radius: 999px;\n font-size: 12px;\n border: 1px solid var(--okdb-app-border);\n background: transparent;\n cursor: pointer;\n color: inherit;\n opacity: .7;\n }\n pipeline-create-panel .pw-pill:hover {\n opacity: 1;\n border-color: color-mix(in srgb, var(--okdb-accent) 27%, transparent);\n }\n pipeline-create-panel .pw-pill--on {\n border-color: var(--okdb-accent);\n color: var(--okdb-accent);\n opacity: 1;\n background: color-mix(in srgb, var(--okdb-accent) 7%, transparent);\n }\n\n /* ── handler toggle ── */\n pipeline-create-panel .pw-handler-toggle {\n display: flex;\n gap: 0;\n border: 1px solid var(--okdb-app-border);\n border-radius: 8px;\n overflow: hidden;\n }\n pipeline-create-panel .pw-handler-toggle-btn {\n flex: 1;\n padding: 7px 14px;\n font-size: 12px;\n border: none;\n background: transparent;\n color: inherit;\n cursor: pointer;\n opacity: .6;\n text-align: center;\n }\n pipeline-create-panel .pw-handler-toggle-btn:first-child {\n border-right: 1px solid var(--okdb-app-border);\n }\n pipeline-create-panel .pw-handler-toggle-btn--on {\n opacity: 1;\n background: color-mix(in srgb, var(--okdb-accent) 7%, transparent);\n color: var(--okdb-accent);\n font-weight: 600;\n }\n\n /* ── code editor area ── */\n pipeline-create-panel .pw-editor-wrap {\n border: 1px solid var(--okdb-app-border);\n border-radius: 10px;\n overflow: hidden;\n background: var(--okdb-app-bg-deep);\n height: 260px;\n min-height: 260px;\n }\n\n /* ── dry-run result ── */\n pipeline-create-panel .pw-dry-card {\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-border);\n border-radius: 10px;\n padding: 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n pipeline-create-panel .pw-dry-ok {\n color: var(--okdb-success);\n font-size: 12px;\n }\n pipeline-create-panel .pw-dry-err {\n color: var(--okdb-danger);\n font-size: 12px;\n }\n pipeline-create-panel .pw-dry-pre {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n line-height: 1.5;\n color: var(--okdb-app-fg-subtle);\n max-height: 160px;\n overflow: auto;\n }\n pipeline-create-panel .pw-dry-meta {\n display: flex;\n gap: 12px;\n font-size: 11px;\n opacity: .5;\n margin-top: 2px;\n }\n\n /* ── dry-run logs ── */\n pipeline-create-panel .pw-dry-logs {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 4px;\n }\n pipeline-create-panel .pw-dry-log-entry {\n font-size: 11px;\n font-family: monospace;\n line-height: 1.5;\n padding: 2px 8px;\n border-radius: 4px;\n background: var(--okdb-app-bg-deep);\n }\n pipeline-create-panel .pw-dry-log-level {\n display: inline-block;\n min-width: 40px;\n font-weight: 600;\n text-transform: uppercase;\n font-size: 10px;\n margin-right: 6px;\n }\n\n /* ── review summary ── */\n pipeline-create-panel .pw-summary-row {\n display: flex;\n justify-content: space-between;\n font-size: 13px;\n padding: 6px 0;\n border-bottom: 1px solid var(--okdb-app-surface);\n }\n pipeline-create-panel .pw-summary-label {\n opacity: .55;\n }\n pipeline-create-panel .pw-summary-val {\n font-family: monospace;\n color: var(--okdb-accent);\n }\n\n /* ── buttons ── */\n pipeline-create-panel .pw-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n pipeline-create-panel .pw-btn {\n padding: 8px 20px;\n border-radius: 8px;\n border: 1px solid var(--okdb-accent);\n background: color-mix(in srgb, var(--okdb-accent) 9%, transparent);\n color: var(--okdb-accent);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n }\n pipeline-create-panel .pw-btn:hover { background: color-mix(in srgb, var(--okdb-accent) 16%, transparent); }\n pipeline-create-panel .pw-btn:disabled { opacity: .4; cursor: default; }\n pipeline-create-panel .pw-btn--ghost {\n border-color: var(--okdb-app-border);\n background: transparent;\n color: inherit;\n font-weight: 400;\n opacity: .7;\n }\n pipeline-create-panel .pw-btn--ghost:hover { opacity: 1; background: var(--okdb-app-surface); }\n pipeline-create-panel .pw-btn--green {\n border-color: var(--okdb-success);\n background: color-mix(in srgb, var(--okdb-success) 9%, transparent);\n color: var(--okdb-success);\n }\n pipeline-create-panel .pw-btn--green:hover { background: color-mix(in srgb, var(--okdb-success) 16%, transparent); }\n pipeline-create-panel .pw-btn--small {\n padding: 5px 14px;\n font-size: 12px;\n font-weight: 500;\n }\n\n /* ── feedback ── */\n pipeline-create-panel .pw-error {\n color: var(--okdb-danger);\n font-size: 13px;\n padding: 8px 12px;\n border: 1px solid var(--okdb-danger);\n border-radius: 6px;\n }\n pipeline-create-panel .pw-success {\n color: var(--okdb-success);\n font-size: 13px;\n padding: 8px 12px;\n border: 1px solid color-mix(in srgb, var(--okdb-success) 33%, transparent);\n border-radius: 6px;\n background: color-mix(in srgb, var(--okdb-success) 5%, transparent);\n }\n pipeline-create-panel .pw-warn {\n font-size: 11px;\n color: var(--okdb-warning);\n opacity: .75;\n padding: 6px 10px;\n border: 1px solid color-mix(in srgb, var(--okdb-warning) 20%, transparent);\n border-radius: 6px;\n background: color-mix(in srgb, var(--okdb-warning) 4%, transparent);\n line-height: 1.5;\n }\n\n /* ── advanced toggle ── */\n pipeline-create-panel .pw-adv-toggle {\n font-size: 12px;\n opacity: .5;\n cursor: pointer;\n user-select: none;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n pipeline-create-panel .pw-adv-toggle:hover { opacity: .8; }\n ",template:'\n<div class="pw-wrap">\n <div>\n <div class="pw-title">{{ engineKind === \'embedding\' || initialKind === \'embedding\' ? \'Create Embedding Pipeline\' : engineKind === \'materializer\' || initialKind === \'materializer\' ? \'Create Materializer Pipeline\' : \'Create Pipeline\' }}</div>\n <div class="pw-sub">\n Set up automated processing in <b>{{ selectedEnv }}</b>.\n A pipeline connects a data source to a handler function and runs it automatically.\n </div>\n </div>\n\n \x3c!-- ── Steps indicator ── --\x3e\n <if :="engineKind !== \'embedding\'">\n <div class="pw-steps">\n <div :class="step >= 1 ? (step > 1 ? \'pw-step-dot pw-step-dot--done\' : \'pw-step-dot pw-step-dot--active\') : \'pw-step-dot\'">\n {{ step > 1 ? \'✓\' : \'1\' }}\n </div>\n <span :class="step >= 1 ? \'pw-step-label pw-step-label--active\' : \'pw-step-label\'">Type</span>\n\n <div :class="step > 1 ? \'pw-step-line pw-step-line--done\' : \'pw-step-line\'"></div>\n\n <div :class="step >= 2 ? (step > 2 ? \'pw-step-dot pw-step-dot--done\' : \'pw-step-dot pw-step-dot--active\') : \'pw-step-dot\'">\n {{ step > 2 ? \'✓\' : \'2\' }}\n </div>\n <span :class="step >= 2 ? \'pw-step-label pw-step-label--active\' : \'pw-step-label\'">Configure</span>\n\n <div :class="step > 2 ? \'pw-step-line pw-step-line--done\' : \'pw-step-line\'"></div>\n\n <div :class="step >= 3 ? \'pw-step-dot pw-step-dot--active\' : \'pw-step-dot\'">3</div>\n <span :class="step >= 3 ? \'pw-step-label pw-step-label--active\' : \'pw-step-label\'">Review</span>\n </div>\n </if>\n\n \x3c!-- ════════════ STEP 1: Choose type ════════════ --\x3e\n <if :="step === 1 && !kindLocked">\n <div class="pw-choice-grid">\n <div class="pw-choice" @click="pickType(\'processor\')">\n <div class="pw-choice-icon">⚡</div>\n <div class="pw-choice-name">Change Processor</div>\n <div class="pw-choice-desc">\n Watches a data type for changes and runs your function for every batch.\n Use for projections, computed values, webhooks, or side-effects that should trigger\n whenever records are created, updated, or deleted.\n </div>\n </div>\n <div class="pw-choice" @click="pickType(\'materializer\')">\n <div class="pw-choice-icon">⇄</div>\n <div class="pw-choice-name">Materializer</div>\n <div class="pw-choice-desc">\n Watches a source type and maintains a deterministic derived target type by returning ops for the engine to apply.\n Use for rebuildable projections, mirrors, and materialized views.\n </div>\n </div>\n <if :="!hideQueueWorker">\n <div class="pw-choice" @click="pickType(\'queue-worker\')">\n <div class="pw-choice-icon">⇶</div>\n <div class="pw-choice-name">Queue Worker</div>\n <div class="pw-choice-desc">\n Processes jobs from a queue. Use for background tasks like sending emails,\n generating reports, or any work that can be enqueued and processed asynchronously\n with automatic retries.\n </div>\n </div>\n </if>\n <div class="pw-choice" @click="pickType(\'embedding\')">\n <div class="pw-choice-icon">⊛</div>\n <div class="pw-choice-name">Embedding Pipeline</div>\n <div class="pw-choice-desc">\n Creates an embedder, indexer, search engine, and optional worker as one grouped pipeline.\n Use this for semantic search, RAG, and other vector workflows.\n </div>\n </div>\n </div>\n </if>\n\n \x3c!-- ════════════ STEP 2: Configure ════════════ --\x3e\n <if :="step === 2">\n <if :="engineKind === \'embedding\'">\n <div class="pw-card">\n <div class="pw-section">Embeddings</div>\n <div style="font-size:12px; opacity:.58; line-height:1.7; margin-bottom:2px;">\n Embedding pipelines use the specialized creator because they can bundle multiple engines and optional search/worker settings in one pass.\n </div>\n <div class="pw-actions" style="margin-top:4px;" :style="kindLocked ? \'display:none;\' : \'\'">\n <button class="pw-btn pw-btn--ghost" @click="goBack()">← Back</button>\n </div>\n </div>\n <embed-create-panel initialtab="pipeline" :locktype="lockedType" :lockenv="selectedEnv" @created="onEmbeddingCreated($event.detail)" />\n </if>\n\n <if :="engineKind !== \'embedding\'">\n \x3c!-- Source / job type --\x3e\n <div class="pw-card">\n <div class="pw-section">\n {{ engineKind === \'queue-worker\' ? \'What to process\' : \'What to watch\' }}\n </div>\n\n <if :="engineKind === \'processor\'">\n <if :="typeSelectionLocked">\n <div class="pw-row">\n <span class="pw-label">Data type</span>\n <div style="display:flex; align-items:center; gap:8px; flex-wrap:wrap;">\n <span style="display:inline-flex; align-items:center; gap:6px; padding:5px 10px; border-radius:999px; border:1px solid color-mix(in srgb, var(--okdb-accent) 33%, transparent); color:var(--okdb-accent); background:color-mix(in srgb, var(--okdb-accent) 6%, transparent); font-size:12px;">{{ proc_sourceType }}</span>\n <span style="font-size:11px; opacity:.45;">Locked to the current DB type</span>\n </div>\n </div>\n </if>\n <if :="!typeSelectionLocked">\n <div class="pw-row">\n <span class="pw-label">Data type</span>\n <select class="pw-select" :value="proc_sourceType" @change="proc_sourceType = $event.target.value">\n <option value="">— select a type —</option>\n <each :of="types" let:item="t">\n <option :value="t">{{ t }}</option>\n </each>\n </select>\n </div>\n </if>\n <div class="pw-hint">\n The processor will receive a batch of changes every time records of this type are created, updated, or deleted.\n </div>\n </if>\n\n <if :="engineKind === \'materializer\'">\n <if :="typeSelectionLocked">\n <div class="pw-row">\n <span class="pw-label">Source type</span>\n <div style="display:flex; align-items:center; gap:8px; flex-wrap:wrap;">\n <span style="display:inline-flex; align-items:center; gap:6px; padding:5px 10px; border-radius:999px; border:1px solid color-mix(in srgb, var(--okdb-accent) 33%, transparent); color:var(--okdb-accent); background:color-mix(in srgb, var(--okdb-accent) 6%, transparent); font-size:12px;">{{ mat_sourceType }}</span>\n <span style="font-size:11px; opacity:.45;">Locked to the current DB type</span>\n </div>\n </div>\n </if>\n <if :="!typeSelectionLocked">\n <div class="pw-row">\n <span class="pw-label">Source type</span>\n <select class="pw-select" :value="mat_sourceType" @change="mat_sourceType = $event.target.value">\n <option value="">— select a type —</option>\n <each :of="types" let:item="t">\n <option :value="t">{{ t }}</option>\n </each>\n </select>\n </div>\n </if>\n <div class="pw-row">\n <span class="pw-label">Target type</span>\n <input class="pw-input" type="text" placeholder="e.g. order_summaries"\n :value="mat_targetType" @input="mat_targetType = $event.target.value" />\n </div>\n <div class="pw-hint">\n The materializer watches the source type and applies returned ops to the target type, making rebuilds deterministic.\n </div>\n </if>\n\n <if :="engineKind === \'queue-worker\'">\n <div class="pw-row">\n <span class="pw-label">Job type</span>\n <div style="display:flex; flex-direction:column; gap:6px;">\n <if :="queueJobTypes.length > 0">\n <div class="pw-handler-toggle" style="max-width:300px;">\n <button\n :class="qw_jobTypeMode === \'existing\' ? \'pw-handler-toggle-btn pw-handler-toggle-btn--on\' : \'pw-handler-toggle-btn\'"\n @click="setJobTypeMode(\'existing\')"\n >Known type</button>\n <button\n :class="qw_jobTypeMode === \'custom\' ? \'pw-handler-toggle-btn pw-handler-toggle-btn--on\' : \'pw-handler-toggle-btn\'"\n @click="setJobTypeMode(\'custom\')"\n >Custom</button>\n </div>\n </if>\n <if :="qw_jobTypeMode === \'existing\' && queueJobTypes.length > 0">\n <select class="pw-select" :value="qw_jobType" @change="qw_jobType = $event.target.value">\n <option value="">— select job type —</option>\n <each :of="queueJobTypes" let:item="jt">\n <option :value="jt">{{ jt }}</option>\n </each>\n </select>\n </if>\n <if :="qw_jobTypeMode === \'custom\' || queueJobTypes.length === 0">\n <input class="pw-input" type="text" placeholder="e.g. email.send"\n :value="qw_jobType" @input="qw_jobType = $event.target.value" />\n </if>\n </div>\n </div>\n <div class="pw-hint" style="grid-column: 1 / -1;">\n Jobs enqueued with this type will be routed to this worker. You can enqueue jobs from functions, the API, or other pipelines.\n </div>\n </if>\n </div>\n\n \x3c!-- Handler function --\x3e\n <div class="pw-card">\n <div class="pw-section">Handler function</div>\n <div style="font-size:12px; opacity:.5; line-height:1.6; margin-bottom:4px;">\n The function that runs for each\n {{ engineKind === \'queue-worker\' ? \'job\' : \'batch of changes\' }}.\n Pick an existing function or write one now.\n </div>\n\n <div class="pw-handler-toggle">\n <button\n :class="handlerMode === \'existing\' ? \'pw-handler-toggle-btn pw-handler-toggle-btn--on\' : \'pw-handler-toggle-btn\'"\n @click="handlerMode = \'existing\'"\n >Use existing function</button>\n <button\n :class="handlerMode === \'new\' ? \'pw-handler-toggle-btn pw-handler-toggle-btn--on\' : \'pw-handler-toggle-btn\'"\n @click="handlerMode = \'new\'"\n >Write new function</button>\n </div>\n\n \x3c!-- Existing function picker --\x3e\n <if :="handlerMode === \'existing\'">\n <div class="pw-row">\n <span class="pw-label">Function</span>\n <select class="pw-select" :value="handlerName" @change="handlerName = $event.target.value">\n <option value="">— select function —</option>\n <each :of="functions" let:item="fn">\n <option :value="fn">{{ fn }}</option>\n </each>\n </select>\n </div>\n <if :="functions.length === 0">\n <div class="pw-hint" style="grid-column: 1 / -1;">\n No functions found in <b>{{ selectedEnv }}</b>.\n Switch to "Write new function" to create one inline.\n </div>\n </if>\n </if>\n\n \x3c!-- New function inline authoring --\x3e\n <if :="handlerMode === \'new\'">\n <div class="pw-row">\n <span class="pw-label">Function name</span>\n <input class="pw-input" type="text"\n placeholder="e.g. processArticle"\n :value="newFnName"\n @input="newFnName = $event.target.value" />\n </div>\n\n <div style="font-size:11px; text-transform:uppercase; letter-spacing:.06em; opacity:.45; margin-top:4px;">\n Implementation\n </div>\n <div class="pw-editor-wrap">\n <ok-js-input\n style="height:100%;"\n :value="newFnSource"\n @edit="updateSource($event.detail)"\n ></ok-js-input>\n </div>\n\n \x3c!-- Validation --\x3e\n <if :="newFnValidation.ok">\n <div style="font-size:12px; color:var(--okdb-success);">✓ Valid function source</div>\n </if>\n <if :="!newFnValidation.ok && newFnSource">\n <div style="font-size:12px; color:var(--okdb-danger);">{{ newFnValidation.message }}</div>\n </if>\n\n \x3c!-- Dry run --\x3e\n <div style="display:flex; align-items:center; gap:8px; flex-wrap:wrap;">\n <button class="pw-btn pw-btn--small pw-btn--ghost"\n :disabled="!newFnValidation.ok || newFnDryRunning"\n @click="dryRunFunction()">\n {{ newFnDryRunning ? \'Running…\' : \'▶ Test with sample data\' }}\n </button>\n <span style="font-size:11px; opacity:.4;">\n {{ engineKind === \'queue-worker\' && effectiveJobType\n ? \'Uses a real job payload from the queue if available.\'\n : \'Runs the function draft against synthetic test data without saving it.\' }}\n </span>\n </div>\n <div class="pw-warn">\n ⚠ <strong>Test with sample data</strong> runs your function for real — the function itself is not saved,\n but any side-effects (e.g. <code>ctx.env.put</code>) <em>will</em> write to live data.\n </div>\n\n \x3c!-- Dry-run result --\x3e\n <if :="newFnDryResult">\n <div class="pw-dry-card">\n <div :class="dryRunStatus === \'error\' ? \'pw-dry-err\' : \'pw-dry-ok\'">\n {{ dryRunStatus === \'error\' ? \'✕ Function returned an error\' : \'✓ Function executed successfully\' }}\n </div>\n <div class="pw-dry-meta">\n <if :="dryRunDuration != null">\n <span>{{ dryRunDuration }}ms</span>\n </if>\n <span>status: {{ newFnDryResult.status || \'ok\' }}</span>\n </div>\n <if :="dryRunStatus === \'error\'">\n <pre class="pw-dry-pre" style="color:var(--okdb-danger);">{{ formatJson(newFnDryResult.error ?? newFnDryResult.result?.value ?? newFnDryResult) }}</pre>\n </if>\n <if :="dryRunStatus !== \'error\'">\n <pre class="pw-dry-pre">{{ formatJson(newFnDryResult.result?.value ?? newFnDryResult) }}</pre>\n </if>\n\n \x3c!-- Dry-run logs --\x3e\n <if :="dedupedDryLogs.length > 0">\n <div style="font-size:10px; text-transform:uppercase; letter-spacing:.06em; opacity:.4; margin-top:6px;">\n Logs ({{ newFnDryResult.logs.length }})\n </div>\n <div class="pw-dry-logs">\n <each :of="dedupedDryLogs" let:item="entry">\n <div class="pw-dry-log-entry">\n <span class="pw-dry-log-level" :style="\'color:\' + logColor(entry)">{{ entry.level || \'log\' }}</span>\n <span>{{ logLabel(entry) }}</span>\n </div>\n </each>\n </div>\n </if>\n\n \x3c!-- Input payload used --\x3e\n <if :="newFnDryPayload != null">\n <details style="margin-top:6px;">\n <summary style="font-size:10px; text-transform:uppercase; letter-spacing:.06em; opacity:.4; cursor:pointer; user-select:none;">\n Input payload\n </summary>\n <pre class="pw-dry-pre" style="margin-top:4px; max-height:180px;">{{ formatJson(newFnDryPayload) }}</pre>\n </details>\n </if>\n </div>\n </if>\n <if :="newFnDryError">\n <div class="pw-dry-card">\n <div class="pw-dry-err">✕ {{ newFnDryError }}</div>\n </div>\n </if>\n </if>\n </div>\n\n \x3c!-- Advanced options (collapsed) --\x3e\n <div>\n <span class="pw-adv-toggle" @click="showAdvanced = !showAdvanced">\n <span>{{ showAdvanced ? \'▾\' : \'▸\' }}</span>\n <span>Advanced options</span>\n </span>\n </div>\n <if :="showAdvanced">\n <div class="pw-card">\n <if :="engineKind === \'processor\'">\n <div class="pw-row">\n <span class="pw-label">Mode</span>\n <div class="pw-pills">\n <button :class="proc_mode === \'async\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="proc_mode = \'async\'">async</button>\n <button :class="proc_mode === \'inline\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="proc_mode = \'inline\'">inline</button>\n </div>\n </div>\n <div class="pw-hint">\n <b>async</b> processes changes in background batches (recommended).\n <b>inline</b> runs synchronously inside the write path.\n </div>\n <if :="proc_mode === \'async\'">\n <div class="pw-row">\n <span class="pw-label">Bootstrap</span>\n <div class="pw-pills">\n <button :class="proc_bootstrap === \'snapshot\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="proc_bootstrap = \'snapshot\'">snapshot</button>\n <button :class="proc_bootstrap === \'log\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="proc_bootstrap = \'log\'">log</button>\n </div>\n </div>\n <div class="pw-hint">\n <b>snapshot</b> processes all existing records first, then switches to live.\n <b>log</b> replays the change log from the beginning.\n </div>\n </if>\n <div class="pw-row">\n <span class="pw-label">Batch size</span>\n <input class="pw-input" type="number" min="1" max="10000"\n :value="proc_batchSize" @input="proc_batchSize = $event.target.value" />\n </div>\n <div class="pw-row">\n <span class="pw-label">Origin mode</span>\n <div class="pw-pills">\n <button :class="proc_originMode === \'all\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="proc_originMode = \'all\'">all</button>\n <button :class="proc_originMode === \'self\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="proc_originMode = \'self\'">self</button>\n <button :class="proc_originMode === \'remote\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="proc_originMode = \'remote\'">remote</button>\n </div>\n </div>\n <div class="pw-hint">\n <b>all</b> = local + synced changes. <b>self</b> = local only. <b>remote</b> = synced only.\n </div>\n </if>\n <if :="engineKind === \'materializer\'">\n <div class="pw-row">\n <span class="pw-label">Bootstrap</span>\n <div class="pw-pills">\n <button :class="mat_bootstrap === \'snapshot\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="mat_bootstrap = \'snapshot\'">snapshot</button>\n <button :class="mat_bootstrap === \'log\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="mat_bootstrap = \'log\'">log</button>\n </div>\n </div>\n <div class="pw-hint">\n <b>snapshot</b> replays all current source rows first. <b>log</b> replays the full change log.\n </div>\n <div class="pw-row">\n <span class="pw-label">Batch size</span>\n <input class="pw-input" type="number" min="1" max="10000"\n :value="mat_batchSize" @input="mat_batchSize = $event.target.value" />\n </div>\n <div class="pw-row">\n <span class="pw-label">Origin mode</span>\n <div class="pw-pills">\n <button :class="mat_originMode === \'all\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="mat_originMode = \'all\'">all</button>\n <button :class="mat_originMode === \'self\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="mat_originMode = \'self\'">self</button>\n <button :class="mat_originMode === \'remote\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="mat_originMode = \'remote\'">remote</button>\n </div>\n </div>\n <div class="pw-hint">\n Choose whether the materializer reacts to local changes, synced changes, or both.\n </div>\n <div class="pw-row">\n <span class="pw-label">Rebuild</span>\n <label style="display:flex; align-items:center; gap:8px; font-size:12px; color:var(--okdb-app-fg);">\n <input type="checkbox" :checked="mat_clearTargetOnRebuild" @change="mat_clearTargetOnRebuild = $event.target.checked" />\n Clear target before rebuild\n </label>\n </div>\n </if>\n <if :="engineKind === \'queue-worker\'">\n <div class="pw-row">\n <span class="pw-label">Concurrency</span>\n <input class="pw-input" type="number" min="1" max="64"\n :value="qw_concurrency" @input="qw_concurrency = $event.target.value" />\n </div>\n <div class="pw-hint">How many jobs to process in parallel.</div>\n </if>\n\n \x3c!-- Run recording (shared by both engine types) --\x3e\n <div style="border-top:1px solid var(--okdb-app-border); margin-top:4px; padding-top:12px;">\n <div class="pw-row">\n <span class="pw-label">Run recording</span>\n <div class="pw-pills">\n <button :class="handler_recordRuns === \'all\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="handler_recordRuns = \'all\'">all runs</button>\n <button :class="handler_recordRuns === \'errors\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="handler_recordRuns = \'errors\'">errors only</button>\n <button :class="handler_recordRuns === \'none\' ? \'pw-pill pw-pill--on\' : \'pw-pill\'" @click="handler_recordRuns = \'none\'">none</button>\n </div>\n </div>\n <div class="pw-hint">\n Controls whether each function invocation is recorded in the run ledger.\n <b>errors only</b> (recommended) avoids creating hundreds of run records for busy pipelines while still capturing failures.\n <b>none</b> fully suppresses recording — useful for high-throughput processors where logging isn\'t needed.\n </div>\n </div>\n </div>\n </if>\n\n \x3c!-- Navigation --\x3e\n <div class="pw-actions">\n <button class="pw-btn pw-btn--ghost" @click="goBack()">← Back</button>\n <button class="pw-btn" :disabled="!step2Valid" @click="goNext()">Review →</button>\n </div>\n </if>\n </if>\n\n \x3c!-- ════════════ STEP 3: Review & Create ════════════ --\x3e\n <if :="step === 3">\n <div class="pw-card">\n <div class="pw-section">Summary</div>\n <div class="pw-summary-row">\n <span class="pw-summary-label">Pipeline</span>\n <span class="pw-summary-val">{{ pipelineName }}</span>\n </div>\n <div class="pw-summary-row">\n <span class="pw-summary-label">Environment</span>\n <span class="pw-summary-val">{{ selectedEnv }}</span>\n </div>\n <div class="pw-summary-row">\n <span class="pw-summary-label">Type</span>\n <span class="pw-summary-val">{{ engineKind === \'processor\' ? \'Change Processor\' : engineKind === \'materializer\' ? \'Materializer\' : \'Queue Worker\' }}</span>\n </div>\n <if :="engineKind === \'processor\'">\n <div class="pw-summary-row">\n <span class="pw-summary-label">Watches</span>\n <span class="pw-summary-val">{{ proc_sourceType }}</span>\n </div>\n </if>\n <if :="engineKind === \'materializer\'">\n <div class="pw-summary-row">\n <span class="pw-summary-label">Source</span>\n <span class="pw-summary-val">{{ mat_sourceType }}</span>\n </div>\n <div class="pw-summary-row">\n <span class="pw-summary-label">Target</span>\n <span class="pw-summary-val">{{ mat_targetType }}</span>\n </div>\n </if>\n <if :="engineKind === \'queue-worker\'">\n <div class="pw-summary-row">\n <span class="pw-summary-label">Job type</span>\n <span class="pw-summary-val">{{ effectiveJobType }}</span>\n </div>\n </if>\n <div class="pw-summary-row">\n <span class="pw-summary-label">Handler</span>\n <span class="pw-summary-val">\n {{ effectiveHandlerName }}\n <span style="opacity:.4; font-family:sans-serif; font-size:11px;">\n {{ handlerMode === \'new\' ? \'(will be created)\' : \'\' }}\n </span>\n </span>\n </div>\n <div class="pw-summary-row">\n <span class="pw-summary-label">Engine</span>\n <span class="pw-summary-val">{{ engineName }}</span>\n </div>\n <div class="pw-summary-row">\n <span class="pw-summary-label">Run recording</span>\n <span class="pw-summary-val" style="font-size:11px;">\n {{ handler_recordRuns === \'all\' ? \'all runs\' : handler_recordRuns === \'errors\' ? \'errors only\' : \'none\' }}\n </span>\n </div>\n <if :="showAdvanced || proc_mode !== \'async\' || proc_bootstrap !== \'snapshot\' || proc_batchSize != 256 || proc_originMode !== \'all\' || mat_bootstrap !== \'snapshot\' || mat_batchSize != 128 || mat_originMode !== \'all\' || !mat_clearTargetOnRebuild || qw_concurrency != 1">\n <div class="pw-summary-row" style="border-bottom:none;">\n <span class="pw-summary-label">Options</span>\n <span class="pw-summary-val" style="font-size:11px;">\n <if :="engineKind === \'processor\'">\n mode={{ proc_mode }} · bootstrap={{ proc_mode === \'inline\' ? \'n/a\' : proc_bootstrap }} · batch={{ proc_batchSize }} · origin={{ proc_originMode }}\n </if>\n <if :="engineKind === \'materializer\'">\n bootstrap={{ mat_bootstrap }} · batch={{ mat_batchSize }} · origin={{ mat_originMode }} · clearOnRebuild={{ mat_clearTargetOnRebuild ? \'yes\' : \'no\' }}\n </if>\n <if :="engineKind === \'queue-worker\'">\n concurrency={{ qw_concurrency }}\n </if>\n </span>\n </div>\n </if>\n </div>\n\n <div style="font-size:12px; opacity:.45; line-height:1.6;">\n This will{{ handlerMode === \'new\' ? \' create the function, then\' : \'\' }} create the engine and pipeline record, and start it immediately.\n </div>\n\n \x3c!-- Feedback --\x3e\n <if :="error">\n <div class="pw-error">{{ error }}</div>\n </if>\n <if :="success">\n <div class="pw-success">{{ success }}</div>\n </if>\n\n <div class="pw-actions">\n <button class="pw-btn pw-btn--ghost" @click="goBack()">← Back</button>\n <button class="pw-btn pw-btn--green" :disabled="busy" @click="submit()">\n {{ busy ? \'Creating…\' : \'Create & Start Pipeline\' }}\n </button>\n </div>\n </if>\n</div>'};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export const ENGINE_PANEL_SHARED_STYLE="\n .card { background:var(--okdb-app-surface); border-radius:12px; padding:16px; box-shadow:0 0 5px #ffffff1a; }\n .card-title { font-weight:600; margin-bottom:10px; }\n .card-subtitle { font-size:11px; opacity:.55; line-height:1.6; }\n .panel-grid { display:grid; gap:12px; }\n .panel-grid--two { grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); }\n .kv-grid { display:grid; grid-template-columns:140px 1fr; gap:4px 12px; font-size:13px; }\n .kv-grid--compact { grid-template-columns:120px 1fr; gap:6px 10px; font-size:12px; }\n .kv-key { opacity:.6; }\n .kv-val { word-break:break-all; }\n .metric-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(120px,1fr)); gap:10px; }\n .metric-card { background:var(--okdb-app-bg); border:1px solid var(--okdb-app-border); border-radius:10px; padding:12px; display:flex; flex-direction:column; gap:6px; }\n .metric-title { font-size:10px; opacity:.45; text-transform:uppercase; letter-spacing:.06em; }\n .metric-value { font-size:24px; font-weight:700; color:var(--okdb-app-fg-strong); }\n .metric-note { font-size:11px; opacity:.55; line-height:1.5; }\n .metric-grid--compact { grid-template-columns:repeat(auto-fit,minmax(110px,1fr)); gap:8px; }\n .metric-card--compact { padding:10px; gap:4px; }\n .metric-card--compact .metric-value { font-size:20px; }\n .story-card { display:flex; flex-direction:column; gap:12px; }\n .story-lead { font-size:13px; line-height:1.7; color:var(--okdb-app-fg); }\n .story-lead strong { color:#ffffff; font-weight:700; }\n .story-note { font-size:11px; color:var(--okdb-app-fg-muted); line-height:1.6; }\n .pill-row { display:flex; gap:8px; flex-wrap:wrap; align-items:center; }\n .info-pill { padding:5px 10px; border-radius:999px; border:1px solid var(--okdb-app-border); background:var(--okdb-app-bg-deep); font-size:11px; color:var(--okdb-app-fg); }\n .info-pill__label { opacity:.55; margin-right:6px; }\n .stack-compact { display:flex; flex-direction:column; gap:10px; }\n .split-story { display:grid; grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr); gap:12px; align-items:start; }\n .split-story--compact { grid-template-columns:minmax(0,1fr) minmax(240px,.75fr); }\n .section-divider { height:1px; background:var(--okdb-app-border); border:none; margin:0; }\n .stat-box { background:var(--okdb-app-border); border-radius:8px; padding:12px 8px; }\n .stat-val { font-size:28px; font-weight:600; }\n .stat-label { font-size:11px; opacity:.6; margin-top:2px; }\n .form-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:12px; }\n .field-stack { display:flex; flex-direction:column; gap:6px; min-width:0; }\n .field-label { font-size:10px; opacity:.45; text-transform:uppercase; letter-spacing:.05em; }\n .field-input { background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); border-radius:8px; padding:8px 10px; color:inherit; font-size:13px; width:100%; box-sizing:border-box; }\n .helper-text { font-size:11px; opacity:.5; line-height:1.6; }\n .card-actions { display:flex; gap:8px; align-items:center; justify-content:flex-end; flex-wrap:wrap; }\n .raw-toggle-row { display:flex; gap:8px; flex-wrap:wrap; align-items:center; }\n .raw-toggle { font-size:11px; padding:4px 10px; border-radius:999px; border:1px solid var(--okdb-app-border); background:var(--okdb-app-bg-deep); color:var(--okdb-app-fg-muted); }\n .raw-toggle--active { border-color:color-mix(in srgb, var(--okdb-accent) 40%, transparent); color:var(--okdb-accent); background:color-mix(in srgb, var(--okdb-accent) 7%, transparent); }\n .alert { padding:12px 14px; border-radius:10px; font-size:12px; line-height:1.6; }\n .alert--error { border:1px solid color-mix(in srgb, var(--okdb-danger) 33%, transparent); background:#2a1113; color:#fca5a5; }\n .muted-code { font-family:monospace; color:var(--okdb-app-fg-muted); word-break:break-all; }\n .inline-link { background:none; border:none; padding:0; color:var(--okdb-accent); font:inherit; cursor:pointer; text-decoration:underline; text-underline-offset:2px; }\n .inline-link:hover { color:var(--okdb-sky); }\n .json-block { margin:0; max-height:280px; overflow:auto; padding:10px; border-radius:8px; background:var(--okdb-app-bg-deep); border:1px solid var(--okdb-app-border); font-size:11px; line-height:1.55; white-space:pre-wrap; word-break:break-word; }\n";
|