@kb-labs/workflow-entry 2.119.0 → 2.119.1-canary.b53bbee1d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/commands/defs-list.js.map +1 -1
  2. package/dist/commands/defs-view.js.map +1 -1
  3. package/dist/commands/health.js.map +1 -1
  4. package/dist/commands/lint.js.map +1 -1
  5. package/dist/commands/list.js.map +1 -1
  6. package/dist/commands/logs.js.map +1 -1
  7. package/dist/commands/metrics.js.map +1 -1
  8. package/dist/commands/run.js.map +1 -1
  9. package/dist/commands/runs-approve.js.map +1 -1
  10. package/dist/commands/runs-cancel.js.map +1 -1
  11. package/dist/commands/runs-list.js.map +1 -1
  12. package/dist/commands/runs-logs.js.map +1 -1
  13. package/dist/commands/runs-rerun.js.map +1 -1
  14. package/dist/commands/runs-restart.js.map +1 -1
  15. package/dist/commands/runs-status.js.map +1 -1
  16. package/dist/commands/runs-view.js.map +1 -1
  17. package/dist/commands/runs-watch.js.map +1 -1
  18. package/dist/commands/status.js.map +1 -1
  19. package/dist/commands/workflow-run.js.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/manifest.js.map +1 -1
  22. package/dist/manifest.json +960 -0
  23. package/dist/rest/cron-list-handler.js.map +1 -1
  24. package/dist/rest/index.js.map +1 -1
  25. package/dist/rest/job-cancel-handler.js.map +1 -1
  26. package/dist/rest/job-detail-handler.js.map +1 -1
  27. package/dist/rest/job-logs-handler.js.map +1 -1
  28. package/dist/rest/job-steps-handler.js.map +1 -1
  29. package/dist/rest/jobs-list-handler.js.map +1 -1
  30. package/dist/rest/pending-approvals-handler.js.map +1 -1
  31. package/dist/rest/resolve-approval-handler.js.map +1 -1
  32. package/dist/rest/run-detail-handler.js.map +1 -1
  33. package/dist/rest/runs-list-handler.js.map +1 -1
  34. package/dist/rest/stats-handler.js.map +1 -1
  35. package/dist/rest/workflow-detail-handler.js.map +1 -1
  36. package/dist/rest/workflow-run-cancel-handler.js.map +1 -1
  37. package/dist/rest/workflow-run-handler.js.map +1 -1
  38. package/dist/rest/workflow-runs-handler.js.map +1 -1
  39. package/dist/rest/workflows-list-handler.js.map +1 -1
  40. package/dist/widgets/117.js +32 -0
  41. package/dist/widgets/165.js +1 -0
  42. package/dist/widgets/326.js +1 -0
  43. package/dist/widgets/370.js +1 -0
  44. package/dist/widgets/405.js +1 -0
  45. package/dist/widgets/421.js +96 -0
  46. package/dist/widgets/46.js +445 -0
  47. package/dist/widgets/50.js +1 -0
  48. package/dist/widgets/546.js +1 -0
  49. package/dist/widgets/648.js +1 -0
  50. package/dist/widgets/669.js +1 -0
  51. package/dist/widgets/7.js +407 -0
  52. package/dist/widgets/707.js +1 -0
  53. package/dist/widgets/716.js +1 -0
  54. package/dist/widgets/775.js +1 -0
  55. package/dist/widgets/78.js +1 -0
  56. package/dist/widgets/875.js +25 -0
  57. package/dist/widgets/945.js +1 -0
  58. package/dist/widgets/968.js +9 -0
  59. package/dist/widgets/997.js +1 -0
  60. package/dist/widgets/__federation_expose_Crons.js +1 -0
  61. package/dist/widgets/__federation_expose_DefinitionDetail.js +1 -0
  62. package/dist/widgets/__federation_expose_Definitions.js +1 -0
  63. package/dist/widgets/__federation_expose_Jobs.js +1 -0
  64. package/dist/widgets/__federation_expose_RunDetail.js +109 -0
  65. package/dist/widgets/__federation_expose_Runs.js +1 -0
  66. package/dist/widgets/mf-manifest.json +348 -0
  67. package/dist/widgets/mf-stats.json +386 -0
  68. package/dist/widgets/remoteEntry.js +7 -0
  69. package/dist/ws/logs-channel.js.map +1 -1
  70. package/dist/ws/progress-channel.js.map +1 -1
  71. package/package.json +7 -7
@@ -0,0 +1,7 @@
1
+ var workflowPlugin;(()=>{var __webpack_modules__={3937(e,t,r){"use strict";r.d(t,{get:()=>r.getContainer,init:()=>r.initContainer})},1004(e,t,r){"use strict";var o,n,a,i,s,l,c,u,f,d,p,h,m=r(7038),g=r.n(m);let y=[].filter(({plugin:e})=>e).map(({plugin:e,params:t})=>e(t)),b={},E="workflowPlugin",S="version-first",_,R="var",I=r;if((I.initializeSharingData||I.initializeExposesData)&&I.federation){let e=(e,t,r)=>{e&&e[t]&&(e[t]=r)},t=(e,t,r)=>{var o,n,a,i,s,l;let c=r();Array.isArray(c)?(null!=(a=(o=e)[n=t])||(o[n]=[]),e[t].push(...c)):"object"==typeof c&&null!==c&&(null!=(l=(i=e)[s=t])||(i[s]={}),Object.assign(e[t],c))},r=(e,t,r)=>{var o,n,a;null!=(a=(o=e)[n=t])||(o[n]=r())},m=null!=(o=null==(l=I.remotesLoadingData)?void 0:l.chunkMapping)?o:{},M=null!=(n=null==(c=I.remotesLoadingData)?void 0:c.moduleIdToRemoteDataMapping)?n:{},T=null!=(a=null==(u=I.initializeSharingData)?void 0:u.scopeToSharingDataMapping)?a:{},N=null!=(i=null==(f=I.consumesLoadingData)?void 0:f.chunkMapping)?i:{},v=null!=(s=null==(d=I.consumesLoadingData)?void 0:d.moduleIdToConsumeDataMapping)?s:{},k={},O=[],P={},w=null==(p=I.initializeExposesData)?void 0:p.shareScope;for(let e in g())I.federation[e]=g()[e];r(I.federation,"libraryType",()=>R),r(I.federation,"sharedFallback",()=>_);let A=I.federation.sharedFallback;r(I.federation,"consumesLoadingModuleToHandlerMapping",()=>{let e={};for(let[r,o]of Object.entries(v)){var t;e[r]={getter:A?null==(t=I.federation.bundlerRuntime)?void 0:t.getSharedFallbackGetter({shareKey:o.shareKey,factory:o.fallback,webpackRequire:I,libraryType:I.federation.libraryType}):o.fallback,treeShakingGetter:A?o.fallback:void 0,shareInfo:{shareConfig:{fixedDependencies:!1,requiredVersion:o.requiredVersion,strictVersion:o.strictVersion,singleton:o.singleton,eager:o.eager},scope:[o.shareScope]},shareKey:o.shareKey,treeShaking:I.federation.sharedFallback?{get:o.fallback,mode:o.treeShakingMode}:void 0}}return e}),r(I.federation,"initOptions",()=>({})),r(I.federation.initOptions,"name",()=>E),r(I.federation.initOptions,"shareStrategy",()=>S),r(I.federation.initOptions,"shared",()=>{let e={};for(let[t,r]of Object.entries(T))for(let o of r)if("object"==typeof o&&null!==o){let{name:r,version:n,factory:a,eager:i,singleton:s,requiredVersion:l,strictVersion:c,treeShakingMode:u}=o,f={},d=function(e){return void 0!==e};d(s)&&(f.singleton=s),d(l)&&(f.requiredVersion=l),d(i)&&(f.eager=i),d(c)&&(f.strictVersion=c);let p={version:n,scope:[t],shareConfig:f,get:a,treeShaking:u?{mode:u}:void 0};e[r]?e[r].push(p):e[r]=[p]}return e}),t(I.federation.initOptions,"remotes",()=>Object.values(b).flat().filter(e=>"script"===e.externalType)),t(I.federation.initOptions,"plugins",()=>y),r(I.federation,"bundlerRuntimeOptions",()=>({})),r(I.federation.bundlerRuntimeOptions,"remotes",()=>({})),r(I.federation.bundlerRuntimeOptions.remotes,"chunkMapping",()=>m),r(I.federation.bundlerRuntimeOptions.remotes,"remoteInfos",()=>b),r(I.federation.bundlerRuntimeOptions.remotes,"idToExternalAndNameMapping",()=>{let e={};for(let[t,r]of Object.entries(M))e[t]=[r.shareScope,r.name,r.externalModuleId,r.remoteName];return e}),r(I.federation.bundlerRuntimeOptions.remotes,"webpackRequire",()=>I),t(I.federation.bundlerRuntimeOptions.remotes,"idToRemoteMap",()=>{let e={};for(let[t,r]of Object.entries(M)){let o=b[r.remoteName];o&&(e[t]=o)}return e}),e(I,"S",I.federation.bundlerRuntime.S),I.federation.attachShareScopeMap&&I.federation.attachShareScopeMap(I),e(I.f,"remotes",(e,t)=>I.federation.bundlerRuntime.remotes({chunkId:e,promises:t,chunkMapping:m,idToExternalAndNameMapping:I.federation.bundlerRuntimeOptions.remotes.idToExternalAndNameMapping,idToRemoteMap:I.federation.bundlerRuntimeOptions.remotes.idToRemoteMap,webpackRequire:I})),e(I.f,"consumes",(e,t)=>I.federation.bundlerRuntime.consumes({chunkId:e,promises:t,chunkMapping:N,moduleToHandlerMapping:I.federation.consumesLoadingModuleToHandlerMapping,installedModules:k,webpackRequire:I})),e(I,"I",(e,t)=>I.federation.bundlerRuntime.I({shareScopeName:e,initScope:t,initPromises:O,initTokens:P,webpackRequire:I})),e(I,"initContainer",(e,t,r)=>I.federation.bundlerRuntime.initContainerEntry({shareScope:e,initScope:t,remoteEntryInitOptions:r,shareScopeKey:w,webpackRequire:I})),e(I,"getContainer",(e,t)=>{var r=I.initializeExposesData.moduleMap;return I.R=t,t=Object.prototype.hasOwnProperty.call(r,e)?r[e]():Promise.resolve().then(()=>{throw Error('Module "'+e+'" does not exist in container.')}),I.R=void 0,t}),I.federation.instance=I.federation.bundlerRuntime.init({webpackRequire:I}),(null==(h=I.consumesLoadingData)?void 0:h.initialConsumes)&&I.federation.bundlerRuntime.installInitialConsumes({webpackRequire:I,installedModules:k,initialConsumes:I.consumesLoadingData.initialConsumes,moduleToHandlerMapping:I.federation.consumesLoadingModuleToHandlerMapping})}},1310(e,t,r){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"});let o=r(3253);t.logAndReport=function(e,t,r,n,a,i){return n(o.getShortErrorMsg(e,t,r,a))}},789(e,t,r){let o=r(7789),n={[o.RUNTIME_001]:"Failed to get remoteEntry exports.",[o.RUNTIME_002]:'The remote entry interface does not contain "init"',[o.RUNTIME_003]:"Failed to get manifest.",[o.RUNTIME_004]:"Failed to locate remote.",[o.RUNTIME_005]:"Invalid loadShareSync function call from bundler runtime",[o.RUNTIME_006]:"Invalid loadShareSync function call from runtime",[o.RUNTIME_007]:"Failed to get remote snapshot.",[o.RUNTIME_008]:"Failed to load script resources.",[o.RUNTIME_009]:"Please call createInstance first.",[o.RUNTIME_010]:'The name option cannot be changed after initialization. If you want to create a new instance with a different name, please use "createInstance" api.',[o.RUNTIME_011]:"The remoteEntry URL is missing from the remote snapshot.",[o.RUNTIME_012]:'The getter for the shared module is not a function. This may be caused by setting "shared.import: false" without the host providing the corresponding lib.'},a={[o.TYPE_001]:"Failed to generate type declaration. Execute the below cmd to reproduce and fix the error."},i={[o.BUILD_001]:"Failed to find expose module.",[o.BUILD_002]:"PublicPath is required in prod mode."},s={...n,...a,...i};t.buildDescMap=i,t.errorDescMap=s,t.runtimeDescMap=n,t.typeDescMap=a},7789(e,t){let r="RUNTIME-001",o="RUNTIME-002",n="RUNTIME-003",a="RUNTIME-004",i="RUNTIME-005",s="RUNTIME-006",l="RUNTIME-007",c="RUNTIME-008",u="RUNTIME-009",f="RUNTIME-010",d="RUNTIME-011",p="RUNTIME-012",h="TYPE-001",m="BUILD-002";t.BUILD_001="BUILD-001",t.BUILD_002=m,t.RUNTIME_001=r,t.RUNTIME_002=o,t.RUNTIME_003=n,t.RUNTIME_004=a,t.RUNTIME_005=i,t.RUNTIME_006=s,t.RUNTIME_007=l,t.RUNTIME_008=c,t.RUNTIME_009=u,t.RUNTIME_010=f,t.RUNTIME_011=d,t.RUNTIME_012=p,t.TYPE_001=h},3253(e,t){let r=e=>`View the docs to see how to solve: https://module-federation.io/guide/troubleshooting/${e.split("-")[0].toLowerCase()}#${e.toLowerCase()}`;t.getShortErrorMsg=(e,t,o,n)=>{let a=[`${[t[e]]} #${e}`];return o&&a.push(`args: ${JSON.stringify(o)}`),a.push(r(e)),n&&a.push(`Original Error Message:
2
+ ${n}`),a.join("\n")}},6062(e,t,r){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"});let o=r(7789),n=r(3253),a=r(789);t.BUILD_001=o.BUILD_001,t.BUILD_002=o.BUILD_002,t.RUNTIME_001=o.RUNTIME_001,t.RUNTIME_002=o.RUNTIME_002,t.RUNTIME_003=o.RUNTIME_003,t.RUNTIME_004=o.RUNTIME_004,t.RUNTIME_005=o.RUNTIME_005,t.RUNTIME_006=o.RUNTIME_006,t.RUNTIME_007=o.RUNTIME_007,t.RUNTIME_008=o.RUNTIME_008,t.RUNTIME_009=o.RUNTIME_009,t.RUNTIME_010=o.RUNTIME_010,t.RUNTIME_011=o.RUNTIME_011,t.RUNTIME_012=o.RUNTIME_012,t.TYPE_001=o.TYPE_001,t.buildDescMap=a.buildDescMap,t.errorDescMap=a.errorDescMap,t.getShortErrorMsg=n.getShortErrorMsg,t.runtimeDescMap=a.runtimeDescMap,t.typeDescMap=a.typeDescMap},6890(e,t){var r=Object.defineProperty;t.__exportAll=(e,t)=>{let o={};for(var n in e)r(o,n,{get:e[n],enumerable:!0});return t||r(o,Symbol.toStringTag,{value:"Module"}),o}},2012(e,t){let r="default";t.DEFAULT_REMOTE_TYPE="global",t.DEFAULT_SCOPE=r},589(e,t,r){let o=r(4110),n=r(2012),a=r(1839),i=r(9915),s=r(3251),l=r(3226);r(4446);let c=r(4281),u=r(1065),f=r(7782),d=r(4319),p=r(973),h=r(5331);r(7603);let m=r(2214),g=r(220),y=r(814),b=r(2350),E=r(1475),S=r(6654),_=r(6062);t.ModuleFederation=class{constructor(e){this.hooks=new h.PluginSystem({beforeInit:new d.SyncWaterfallHook("beforeInit"),init:new u.SyncHook,beforeInitContainer:new p.AsyncWaterfallHook("beforeInitContainer"),initContainer:new p.AsyncWaterfallHook("initContainer")}),this.version="2.3.3",this.moduleCache=new Map,this.loaderHook=new h.PluginSystem({getModuleInfo:new u.SyncHook,createScript:new u.SyncHook,createLink:new u.SyncHook,fetch:new f.AsyncHook,loadEntryError:new f.AsyncHook,getModuleFactory:new f.AsyncHook}),this.bridgeHook=new h.PluginSystem({beforeBridgeRender:new u.SyncHook,afterBridgeRender:new u.SyncHook,beforeBridgeDestroy:new u.SyncHook,afterBridgeDestroy:new u.SyncHook});const t=[m.snapshotPlugin(),g.generatePreloadAssetsPlugin()],r={id:i.getBuilderId(),name:e.name,plugins:t,remotes:[],shared:{},inBrowser:S.isBrowserEnvValue};this.name=e.name,this.options=r,this.snapshotHandler=new y.SnapshotHandler(this),this.sharedHandler=new b.SharedHandler(this),this.remoteHandler=new E.RemoteHandler(this),this.shareScopeMap=this.sharedHandler.shareScopeMap,this.registerPlugins([...r.plugins,...e.plugins||[]]),this.options=this.formatOptions(r,e)}initOptions(e){e.name&&e.name!==this.options.name&&o.error((0,_.getShortErrorMsg)(_.RUNTIME_010,_.runtimeDescMap)),this.registerPlugins(e.plugins);let t=this.formatOptions(this.options,e);return this.options=t,t}async loadShare(e,t){return this.sharedHandler.loadShare(e,t)}loadShareSync(e,t){return this.sharedHandler.loadShareSync(e,t)}initializeSharing(e=n.DEFAULT_SCOPE,t){return this.sharedHandler.initializeSharing(e,t)}initRawContainer(e,t,r){let o=l.getRemoteInfo({name:e,entry:t}),n=new c.Module({host:this,remoteInfo:o});return n.remoteEntryExports=r,this.moduleCache.set(e,n),n}async loadRemote(e,t){return this.remoteHandler.loadRemote(e,t)}async preloadRemote(e){return this.remoteHandler.preloadRemote(e)}initShareScopeMap(e,t,r={}){this.sharedHandler.initShareScopeMap(e,t,r)}formatOptions(e,t){let{allShareInfos:r}=a.formatShareConfigs(e,t),{userOptions:o,options:n}=this.hooks.lifecycle.beforeInit.emit({origin:this,userOptions:t,options:e,shareInfo:r}),i=this.remoteHandler.formatAndRegisterRemote(n,o),{allShareInfos:s}=this.sharedHandler.registerShared(n,o),l=[...n.plugins];o.plugins&&o.plugins.forEach(e=>{l.includes(e)||l.push(e)});let c={...e,...t,plugins:l,remotes:i,shared:s};return this.hooks.lifecycle.init.emit({origin:this,options:c}),c}registerPlugins(e){let t=s.registerPlugins(e,this);this.options.plugins=this.options.plugins.reduce((e,t)=>(t&&e&&!e.find(e=>e.name===t.name)&&e.push(t),e),t||[])}registerRemotes(e,t){return this.remoteHandler.registerRemotes(e,t)}registerShared(e){this.sharedHandler.registerShared(this.options,{...this.options,shared:e})}}},9653(e,t,r){let o=r(4110),n=r(4328),a=r(6654),i="object"==typeof globalThis?globalThis:window,s=(()=>{try{return document.defaultView}catch{return i}})(),l=s;function c(e,t,r){Object.defineProperty(e,t,{value:r,configurable:!1,writable:!0})}function u(e,t){return Object.hasOwnProperty.call(e,t)}u(i,"__GLOBAL_LOADING_REMOTE_ENTRY__")||c(i,"__GLOBAL_LOADING_REMOTE_ENTRY__",{});let f=i.__GLOBAL_LOADING_REMOTE_ENTRY__;function d(e){u(e,"__VMOK__")&&!u(e,"__FEDERATION__")&&c(e,"__FEDERATION__",e.__VMOK__),u(e,"__FEDERATION__")||(c(e,"__FEDERATION__",{__GLOBAL_PLUGIN__:[],__INSTANCES__:[],moduleInfo:{},__SHARE__:{},__MANIFEST_LOADING__:{},__PRELOADED_MAP__:new Map}),c(e,"__VMOK__",e.__FEDERATION__)),e.__FEDERATION__.__GLOBAL_PLUGIN__??=[],e.__FEDERATION__.__INSTANCES__??=[],e.__FEDERATION__.moduleInfo??={},e.__FEDERATION__.__SHARE__??={},e.__FEDERATION__.__MANIFEST_LOADING__??={},e.__FEDERATION__.__PRELOADED_MAP__??=new Map}function p(){i.__FEDERATION__.__GLOBAL_PLUGIN__=[],i.__FEDERATION__.__INSTANCES__=[],i.__FEDERATION__.moduleInfo={},i.__FEDERATION__.__SHARE__={},i.__FEDERATION__.__MANIFEST_LOADING__={},Object.keys(f).forEach(e=>{delete f[e]})}function h(e){i.__FEDERATION__.__INSTANCES__.push(e)}function m(){return i.__FEDERATION__.__DEBUG_CONSTRUCTOR__}function g(e,t=(0,a.isDebugMode)()){t&&(i.__FEDERATION__.__DEBUG_CONSTRUCTOR__=e,i.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__="2.3.3")}function y(e,t){if("string"==typeof t)if(e[t])return{value:e[t],key:t};else{for(let r of Object.keys(e)){let[o,n]=r.split(":"),a=`${o}:${t}`,i=e[a];if(i)return{value:i,key:a}}return{value:void 0,key:t}}o.error(`getInfoWithoutType: "key" must be a string, got ${typeof t} (${JSON.stringify(t)}).`)}d(i),d(s);let b=()=>s.__FEDERATION__.moduleInfo,E=(e,t)=>{let r=y(t,n.getFMId(e)).value;if(r&&!r.version&&"version"in e&&e.version&&(r.version=e.version),r)return r;if("version"in e&&e.version){let{version:t,...r}=e,o=n.getFMId(r),a=y(s.__FEDERATION__.moduleInfo,o).value;if(a?.version===t)return a}},S=e=>E(e,s.__FEDERATION__.moduleInfo),_=(e,t)=>{let r=n.getFMId(e);return s.__FEDERATION__.moduleInfo[r]=t,s.__FEDERATION__.moduleInfo},R=e=>(s.__FEDERATION__.moduleInfo={...s.__FEDERATION__.moduleInfo,...e},()=>{for(let t of Object.keys(e))delete s.__FEDERATION__.moduleInfo[t]}),I=(e,t)=>{let r=t||`__FEDERATION_${e}:custom__`;return{remoteEntryKey:r,entryExports:i[r]}},M=e=>{let{__GLOBAL_PLUGIN__:t}=s.__FEDERATION__;e.forEach(e=>{-1===t.findIndex(t=>t.name===e.name)?t.push(e):o.warn(`The plugin ${e.name} has been registered.`)})},T=()=>s.__FEDERATION__.__GLOBAL_PLUGIN__,N=e=>i.__FEDERATION__.__PRELOADED_MAP__.get(e),v=e=>i.__FEDERATION__.__PRELOADED_MAP__.set(e,!0);t.CurrentGlobal=i,t.Global=l,t.addGlobalSnapshot=R,t.getGlobalFederationConstructor=m,t.getGlobalHostPlugins=T,t.getGlobalSnapshot=b,t.getGlobalSnapshotInfoByModuleInfo=S,t.getInfoWithoutType=y,t.getPreloaded=N,t.getRemoteEntryExports=I,t.getTargetSnapshotInfoByModuleInfo=E,t.globalLoading=f,t.nativeGlobal=s,t.registerGlobalPlugins=M,t.resetFederationGlobalInfo=p,t.setGlobalFederationConstructor=g,t.setGlobalFederationInstance=h,t.setGlobalSnapshotInfoByModuleInfo=_,t.setPreloaded=v},4747(e,t,r){let o=r(9653),n=r(1839),a=r(4653),i=r(3226);r(4446);let s=r(8725),l={getRegisteredShare:n.getRegisteredShare,getGlobalShareScope:n.getGlobalShareScope};t.default={global:{Global:o.Global,nativeGlobal:o.nativeGlobal,resetFederationGlobalInfo:o.resetFederationGlobalInfo,setGlobalFederationInstance:o.setGlobalFederationInstance,getGlobalFederationConstructor:o.getGlobalFederationConstructor,setGlobalFederationConstructor:o.setGlobalFederationConstructor,getInfoWithoutType:o.getInfoWithoutType,getGlobalSnapshot:o.getGlobalSnapshot,getTargetSnapshotInfoByModuleInfo:o.getTargetSnapshotInfoByModuleInfo,getGlobalSnapshotInfoByModuleInfo:o.getGlobalSnapshotInfoByModuleInfo,setGlobalSnapshotInfoByModuleInfo:o.setGlobalSnapshotInfoByModuleInfo,addGlobalSnapshot:o.addGlobalSnapshot,getRemoteEntryExports:o.getRemoteEntryExports,registerGlobalPlugins:o.registerGlobalPlugins,getGlobalHostPlugins:o.getGlobalHostPlugins,getPreloaded:o.getPreloaded,setPreloaded:o.setPreloaded},share:l,utils:{matchRemoteWithNameAndExpose:a.matchRemoteWithNameAndExpose,preloadAssets:s.preloadAssets,getRemoteInfo:i.getRemoteInfo}}},8340(e,t,r){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"});let o=r(4110),n=r(4328),a=r(9653),i=r(3835),s=r(1839),l=r(4653),c=r(3226);r(4446);let u=r(4747),f=r(4281),d=r(589),p=r(9017),h=r(6654),m=u.default;t.CurrentGlobal=a.CurrentGlobal,t.Global=a.Global,t.Module=f.Module,t.ModuleFederation=d.ModuleFederation,t.addGlobalSnapshot=a.addGlobalSnapshot,t.assert=o.assert,t.error=o.error,t.getGlobalFederationConstructor=a.getGlobalFederationConstructor,t.getGlobalSnapshot=a.getGlobalSnapshot,t.getInfoWithoutType=a.getInfoWithoutType,t.getRegisteredShare=s.getRegisteredShare,t.getRemoteEntry=c.getRemoteEntry,t.getRemoteInfo=c.getRemoteInfo,t.helpers=m,t.isStaticResourcesEqual=n.isStaticResourcesEqual,Object.defineProperty(t,"loadScript",{enumerable:!0,get:function(){return h.loadScript}}),Object.defineProperty(t,"loadScriptNode",{enumerable:!0,get:function(){return h.loadScriptNode}}),t.matchRemoteWithNameAndExpose=l.matchRemoteWithNameAndExpose,t.registerGlobalPlugins=a.registerGlobalPlugins,t.resetFederationGlobalInfo=a.resetFederationGlobalInfo,t.safeWrapper=n.safeWrapper,t.satisfy=i.satisfy,t.setGlobalFederationConstructor=a.setGlobalFederationConstructor,t.setGlobalFederationInstance=a.setGlobalFederationInstance,Object.defineProperty(t,"types",{enumerable:!0,get:function(){return p.type_exports}})},4281(e,t,r){let o=r(4110),n=r(4328),a=r(3226),i=r(9587);r(4446);let s=r(6654),l=r(6062);function c(e,t,r){let o=t,n=Array.isArray(e.shareScope)?e.shareScope:[e.shareScope];n.length||n.push("default"),n.forEach(e=>{o[e]||(o[e]={})});let a={version:e.version||"",shareScopeKeys:Array.isArray(e.shareScope)?n:e.shareScope||"default"};return Object.defineProperty(a,"shareScopeMap",{value:o,enumerable:!1}),{remoteEntryInitOptions:a,shareScope:o[n[0]],initScope:r??[]}}t.Module=class{constructor({remoteInfo:e,host:t}){this.inited=!1,this.initing=!1,this.lib=void 0,this.remoteInfo=e,this.host=t}async getEntry(){if(this.remoteEntryExports)return this.remoteEntryExports;let e=await a.getRemoteEntry({origin:this.host,remoteInfo:this.remoteInfo,remoteEntryExports:this.remoteEntryExports});return o.assert(e,`remoteEntryExports is undefined
3
+ ${(0,s.safeToString)(this.remoteInfo)}`),this.remoteEntryExports=e,this.remoteEntryExports}async init(e,t,r){let n=await this.getEntry();if(this.inited)return n;if(this.initPromise)return await this.initPromise,n;this.initing=!0,this.initPromise=(async()=>{let{remoteEntryInitOptions:a,shareScope:s,initScope:u}=c(this.remoteInfo,this.host.shareScopeMap,r),f=await this.host.hooks.lifecycle.beforeInitContainer.emit({shareScope:s,remoteEntryInitOptions:a,initScope:u,remoteInfo:this.remoteInfo,origin:this.host});void 0===n?.init&&o.error(l.RUNTIME_002,l.runtimeDescMap,{hostName:this.host.name,remoteName:this.remoteInfo.name,remoteEntryUrl:this.remoteInfo.entry,remoteEntryKey:this.remoteInfo.entryGlobalName},void 0,i.optionsToMFContext(this.host.options)),await n.init(f.shareScope,f.initScope,f.remoteEntryInitOptions),await this.host.hooks.lifecycle.initContainer.emit({...f,id:e,remoteSnapshot:t,remoteEntryExports:n}),this.inited=!0})();try{await this.initPromise}finally{this.initing=!1,this.initPromise=void 0}return n}async get(e,t,r,a){let i,{loadFactory:s=!0}=r||{loadFactory:!0},l=await this.init(e,a);this.lib=l,(i=await this.host.loaderHook.lifecycle.getModuleFactory.emit({remoteEntryExports:l,expose:t,moduleInfo:this.remoteInfo}))||(i=await l.get(t)),o.assert(i,`${n.getFMId(this.remoteInfo)} remote don't export ${t}.`);let c=n.processModuleAlias(this.remoteInfo.name,t),u=this.wraperFactory(i,c);return s?await u():u}wraperFactory(e,t){function r(e,t){e&&"object"==typeof e&&Object.isExtensible(e)&&!Object.getOwnPropertyDescriptor(e,Symbol.for("mf_module_id"))&&Object.defineProperty(e,Symbol.for("mf_module_id"),{value:t,enumerable:!1})}return e instanceof Promise?async()=>{let o=await e();return r(o,t),o}:()=>{let o=e();return r(o,t),o}}}},220(e,t,r){let o=r(4328),n=r(9653),a=r(1839);r(4446);let i=r(8725),s=r(2214),l=r(6654);function c(e){let t=e.split(":");return 1===t.length?{name:t[0],version:void 0}:2===t.length?{name:t[0],version:t[1]}:{name:t[1],version:t[2]}}function u(e,t,r,a,i={},s){let{value:f}=n.getInfoWithoutType(e,o.getFMId(t)),d=s||f;if(d&&!(0,l.isManifestProvider)(d)&&(r(d,t,a),d.remotesInfo))for(let t of Object.keys(d.remotesInfo)){if(i[t])continue;i[t]=!0;let o=c(t),n=d.remotesInfo[t];u(e,{name:o.name,version:n.matchedVersion},r,!1,i,void 0)}}let f=(e,t)=>document.querySelector(`${e}[${"link"===e?"href":"src"}="${t}"]`);function d(e,t,r,s,c){let d=[],p=[],h=[],m=new Set,g=new Set,{options:y}=e,{preloadConfig:b}=t,{depsRemote:E}=b;if(u(s,r,(t,r,a)=>{let s;if(a)s=b;else if(Array.isArray(E)){let e=E.find(e=>e.nameOrAlias===r.name||e.nameOrAlias===r.alias);if(!e)return;s=i.defaultPreloadArgs(e)}else{if(!0!==E)return;s=b}let c=(0,l.getResourceUrl)(t,o.getRemoteEntryInfoFromSnapshot(t).url);c&&h.push({name:r.name,moduleInfo:{name:r.name,entry:c,type:"remoteEntryType"in t?t.remoteEntryType:"global",entryGlobalName:"globalName"in t?t.globalName:r.name,shareScope:"",version:"version"in t?t.version:void 0},url:c});let u="modules"in t?t.modules:[],f=i.normalizePreloadExposes(s.exposes);function m(e){let r=e.map(e=>(0,l.getResourceUrl)(t,e));return s.filter?r.filter(s.filter):r}if(f.length&&"modules"in t&&(u=t?.modules?.reduce((e,t)=>(f?.indexOf(t.moduleName)!==-1&&e.push(t),e),[])),u){let o=u.length;for(let a=0;a<o;a++){let o=u[a],i=`${r.name}/${o.moduleName}`;e.remoteHandler.hooks.lifecycle.handlePreloadModule.emit({id:"."===o.moduleName?r.name:i,name:r.name,remoteSnapshot:t,preloadConfig:s,remote:r,origin:e}),n.getPreloaded(i)||("all"===s.resourceCategory?(d.push(...m(o.assets.css.async)),d.push(...m(o.assets.css.sync)),p.push(...m(o.assets.js.async)),p.push(...m(o.assets.js.sync))):"sync"===s.resourceCategory&&(d.push(...m(o.assets.css.sync)),p.push(...m(o.assets.js.sync))),n.setPreloaded(i))}}},!0,{},c),c.shared&&c.shared.length>0){let t=(t,r)=>{let{shared:o}=a.getRegisteredShare(e.shareScopeMap,r.sharedName,t,e.sharedHandler.hooks.lifecycle.resolveShare)||{};o&&"function"==typeof o.lib&&(r.assets.js.sync.forEach(e=>{m.add(e)}),r.assets.css.sync.forEach(e=>{g.add(e)}))};c.shared.forEach(e=>{let r=y.shared?.[e.sharedName];if(!r)return;let n=e.version?r.find(t=>t.version===e.version):r;n&&o.arrayOptions(n).forEach(r=>{t(r,e)})})}let S=p.filter(e=>!m.has(e)&&!f("script",e));return{cssAssets:d.filter(e=>!g.has(e)&&!f("link",e)),jsAssetsWithoutEntry:S,entryAssets:h.filter(e=>!f("script",e.url))}}t.generatePreloadAssetsPlugin=function(){return{name:"generate-preload-assets-plugin",async generatePreloadAssets(e){let{origin:t,preloadOptions:r,remoteInfo:n,remote:a,globalSnapshot:i,remoteSnapshot:c}=e;return l.isBrowserEnvValue?o.isRemoteInfoWithEntry(a)&&o.isPureRemoteEntry(a)?{cssAssets:[],jsAssetsWithoutEntry:[],entryAssets:[{name:a.name,url:a.entry,moduleInfo:{name:n.name,entry:a.entry,type:n.type||"global",entryGlobalName:"",shareScope:""}}]}:(s.assignRemoteInfo(n,c),d(t,r,n,i,c)):{cssAssets:[],jsAssetsWithoutEntry:[],entryAssets:[]}}}}},814(e,t,r){let o=r(4110),n=r(4328),a=r(9653),i=r(3226),s=r(9587);r(4446);let l=r(7782),c=r(973),u=r(5331);r(7603);let f=r(6654),d=r(6062);function p(e,t){let r=a.getGlobalSnapshotInfoByModuleInfo({name:t.name,version:t.options.version}),o=r&&"remotesInfo"in r&&r.remotesInfo&&a.getInfoWithoutType(r.remotesInfo,e.name).value;return o&&o.matchedVersion?{hostGlobalSnapshot:r,globalSnapshot:a.getGlobalSnapshot(),remoteSnapshot:a.getGlobalSnapshotInfoByModuleInfo({name:e.name,version:o.matchedVersion})}:{hostGlobalSnapshot:void 0,globalSnapshot:a.getGlobalSnapshot(),remoteSnapshot:a.getGlobalSnapshotInfoByModuleInfo({name:e.name,version:"version"in e?e.version:void 0})}}t.SnapshotHandler=class{constructor(e){this.loadingHostSnapshot=null,this.manifestCache=new Map,this.hooks=new u.PluginSystem({beforeLoadRemoteSnapshot:new l.AsyncHook("beforeLoadRemoteSnapshot"),loadSnapshot:new c.AsyncWaterfallHook("loadGlobalSnapshot"),loadRemoteSnapshot:new c.AsyncWaterfallHook("loadRemoteSnapshot"),afterLoadSnapshot:new c.AsyncWaterfallHook("afterLoadSnapshot")}),this.manifestLoading=a.Global.__FEDERATION__.__MANIFEST_LOADING__,this.HostInstance=e,this.loaderHook=e.loaderHook}async loadRemoteSnapshotInfo({moduleInfo:e,id:t,expose:r}){let i,l,{options:c}=this.HostInstance;await this.hooks.lifecycle.beforeLoadRemoteSnapshot.emit({options:c,moduleInfo:e});let u=a.getGlobalSnapshotInfoByModuleInfo({name:this.HostInstance.options.name,version:this.HostInstance.options.version});u||(u={version:this.HostInstance.options.version||"",remoteEntry:"",remotesInfo:{}},a.addGlobalSnapshot({[this.HostInstance.options.name]:u})),u&&"remotesInfo"in u&&!a.getInfoWithoutType(u.remotesInfo,e.name).value&&("version"in e||"entry"in e)&&(u.remotesInfo={...u?.remotesInfo,[e.name]:{matchedVersion:"version"in e?e.version:e.entry}});let{hostGlobalSnapshot:p,remoteSnapshot:h,globalSnapshot:m}=this.getGlobalRemoteInfo(e),{remoteSnapshot:g,globalSnapshot:y}=await this.hooks.lifecycle.loadSnapshot.emit({options:c,moduleInfo:e,hostGlobalSnapshot:p,remoteSnapshot:h,globalSnapshot:m});if(g)if((0,f.isManifestProvider)(g)){let t=f.isBrowserEnvValue?g.remoteEntry:g.ssrRemoteEntry||g.remoteEntry||"",r=await this.getManifestJson(t,e,{}),o=a.setGlobalSnapshotInfoByModuleInfo({...e,entry:t},r);i=r,l=o}else{let{remoteSnapshot:t}=await this.hooks.lifecycle.loadRemoteSnapshot.emit({options:this.HostInstance.options,moduleInfo:e,remoteSnapshot:g,from:"global"});i=t,l=y}else if(n.isRemoteInfoWithEntry(e)){let t=await this.getManifestJson(e.entry,e,{}),r=a.setGlobalSnapshotInfoByModuleInfo(e,t),{remoteSnapshot:o}=await this.hooks.lifecycle.loadRemoteSnapshot.emit({options:this.HostInstance.options,moduleInfo:e,remoteSnapshot:t,from:"global"});i=o,l=r}else o.error(d.RUNTIME_007,d.runtimeDescMap,{remoteName:e.name,remoteVersion:e.version,hostName:this.HostInstance.options.name,globalSnapshot:JSON.stringify(y)},void 0,s.optionsToMFContext(this.HostInstance.options));return await this.hooks.lifecycle.afterLoadSnapshot.emit({id:t,host:this.HostInstance,options:c,moduleInfo:e,remoteSnapshot:i}),{remoteSnapshot:i,globalSnapshot:l}}getGlobalRemoteInfo(e){return p(e,this.HostInstance)}async getManifestJson(e,t,r){let n=async()=>{let r=this.manifestCache.get(e);if(r)return r;try{let o=await this.loaderHook.lifecycle.fetch.emit(e,{},i.getRemoteInfo(t));o&&o instanceof Response||(o=await fetch(e,{})),r=await o.json()}catch(n){(r=await this.HostInstance.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({id:e,error:n,from:"runtime",lifecycle:"afterResolve",origin:this.HostInstance}))||(delete this.manifestLoading[e],o.error(d.RUNTIME_003,d.runtimeDescMap,{manifestUrl:e,moduleName:t.name,hostName:this.HostInstance.options.name},`${n}`,s.optionsToMFContext(this.HostInstance.options)))}return o.assert(r.metaData&&r.exposes&&r.shared,`"${e}" is not a valid federation manifest for remote "${t.name}". Missing required fields: ${[!r.metaData&&"metaData",!r.exposes&&"exposes",!r.shared&&"shared"].filter(Boolean).join(", ")}.`),this.manifestCache.set(e,r),r},a=async()=>{let r=await n(),o=(0,f.generateSnapshotFromManifest)(r,{version:e}),{remoteSnapshot:a}=await this.hooks.lifecycle.loadRemoteSnapshot.emit({options:this.HostInstance.options,moduleInfo:t,manifestJson:r,remoteSnapshot:o,manifestUrl:e,from:"manifest"});return a};return this.manifestLoading[e]||(this.manifestLoading[e]=a().then(e=>e)),this.manifestLoading[e]}},t.getGlobalRemoteInfo=p},2214(e,t,r){let o=r(4110),n=r(4328);r(4446);let a=r(8725),i=r(6654),s=r(6062);function l(e,t){let r=n.getRemoteEntryInfoFromSnapshot(t);r.url||o.error(s.RUNTIME_011,s.runtimeDescMap,{remoteName:e.name});let a=(0,i.getResourceUrl)(t,r.url);i.isBrowserEnvValue||a.startsWith("http")||(a=`https:${a}`),e.type=r.type,e.entryGlobalName=r.globalName,e.entry=a,e.version=t.version,e.buildVersion=t.buildVersion}function c(){return{name:"snapshot-plugin",async afterResolve(e){let{remote:t,pkgNameOrAlias:r,expose:o,origin:i,remoteInfo:s,id:c}=e;if(!n.isRemoteInfoWithEntry(t)||!n.isPureRemoteEntry(t)){let{remoteSnapshot:n,globalSnapshot:u}=await i.snapshotHandler.loadRemoteSnapshotInfo({moduleInfo:t,id:c});l(s,n);let f={remote:t,preloadConfig:{nameOrAlias:r,exposes:[o],resourceCategory:"sync",share:!1,depsRemote:!1}},d=await i.remoteHandler.hooks.lifecycle.generatePreloadAssets.emit({origin:i,preloadOptions:f,remoteInfo:s,remote:t,remoteSnapshot:n,globalSnapshot:u});return d&&a.preloadAssets(s,i,d,!1),{...e,remoteSnapshot:n}}return e}}}t.assignRemoteInfo=l,t.snapshotPlugin=c},1475(e,t,r){let o=r(4110),n=r(9653),a=r(2012),i=r(1839),s=r(4653),l=r(3226),c=r(9587);r(4446);let u=r(8725),f=r(4281),d=r(1065),p=r(7782),h=r(4319),m=r(973),g=r(5331);r(7603);let y=r(814),b=r(6654),E=r(6062);t.RemoteHandler=class{constructor(e){this.hooks=new g.PluginSystem({beforeRegisterRemote:new h.SyncWaterfallHook("beforeRegisterRemote"),registerRemote:new h.SyncWaterfallHook("registerRemote"),beforeRequest:new m.AsyncWaterfallHook("beforeRequest"),onLoad:new p.AsyncHook("onLoad"),handlePreloadModule:new d.SyncHook("handlePreloadModule"),errorLoadRemote:new p.AsyncHook("errorLoadRemote"),beforePreloadRemote:new p.AsyncHook("beforePreloadRemote"),generatePreloadAssets:new p.AsyncHook("generatePreloadAssets"),afterPreloadRemote:new p.AsyncHook,loadEntry:new p.AsyncHook}),this.host=e,this.idToRemoteMap={}}formatAndRegisterRemote(e,t){return(t.remotes||[]).reduce((e,t)=>(this.registerRemote(t,e,{force:!1}),e),e.remotes)}setIdToRemoteMap(e,t){let{remote:r,expose:o}=t,{name:n,alias:a}=r;if(this.idToRemoteMap[e]={name:r.name,expose:o},a&&e.startsWith(n)){let t=e.replace(n,a);this.idToRemoteMap[t]={name:r.name,expose:o};return}if(a&&e.startsWith(a)){let t=e.replace(a,n);this.idToRemoteMap[t]={name:r.name,expose:o}}}async loadRemote(e,t){let{host:r}=this;try{let{loadFactory:o=!0}=t||{loadFactory:!0},{module:n,moduleOptions:a,remoteMatchInfo:i}=await this.getRemoteModuleAndOptions({id:e}),{pkgNameOrAlias:s,remote:l,expose:c,id:u,remoteSnapshot:f}=i,d=await n.get(u,c,t,f),p=await this.hooks.lifecycle.onLoad.emit({id:u,pkgNameOrAlias:s,expose:c,exposeModule:o?d:void 0,exposeModuleFactory:o?void 0:d,remote:l,options:a,moduleInstance:n,origin:r});if(this.setIdToRemoteMap(e,i),"function"==typeof p)return p;return d}catch(a){let{from:o="runtime"}=t||{from:"runtime"},n=await this.hooks.lifecycle.errorLoadRemote.emit({id:e,error:a,from:o,lifecycle:"onLoad",origin:r});if(!n)throw a;return n}}async preloadRemote(e){let{host:t}=this;await this.hooks.lifecycle.beforePreloadRemote.emit({preloadOps:e,options:t.options,origin:t});let r=u.formatPreloadArgs(t.options.remotes,e);await Promise.all(r.map(async e=>{let{remote:r}=e,o=l.getRemoteInfo(r),{globalSnapshot:n,remoteSnapshot:a}=await t.snapshotHandler.loadRemoteSnapshotInfo({moduleInfo:r}),i=await this.hooks.lifecycle.generatePreloadAssets.emit({origin:t,preloadOptions:e,remote:r,remoteInfo:o,globalSnapshot:n,remoteSnapshot:a});i&&u.preloadAssets(o,t,i)}))}registerRemotes(e,t){let{host:r}=this;e.forEach(e=>{this.registerRemote(e,r.options.remotes,{force:t?.force})})}async getRemoteModuleAndOptions(e){let t,{host:r}=this,{id:n}=e;try{t=await this.hooks.lifecycle.beforeRequest.emit({id:n,options:r.options,origin:r})}catch(e){if(!(t=await this.hooks.lifecycle.errorLoadRemote.emit({id:n,options:r.options,origin:r,from:"runtime",error:e,lifecycle:"beforeRequest"})))throw e}let{id:a}=t,i=s.matchRemoteWithNameAndExpose(r.options.remotes,a);i||o.error(E.RUNTIME_004,E.runtimeDescMap,{hostName:r.options.name,requestId:a},void 0,c.optionsToMFContext(r.options));let{remote:u}=i,d=l.getRemoteInfo(u),p=await r.sharedHandler.hooks.lifecycle.afterResolve.emit({id:a,...i,options:r.options,origin:r,remoteInfo:d}),{remote:h,expose:m}=p;o.assert(h&&m,`The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${a}.`);let g=r.moduleCache.get(h.name),y={host:r,remoteInfo:d};return g||(g=new f.Module(y),r.moduleCache.set(h.name,g)),{module:g,moduleOptions:y,remoteMatchInfo:p}}registerRemote(e,t,r){let{host:n}=this,i=()=>{if(e.alias){let r=t.find(t=>e.alias&&(t.name.startsWith(e.alias)||t.alias?.startsWith(e.alias)));o.assert(!r,`The alias ${e.alias} of remote ${e.name} is not allowed to be the prefix of ${r&&r.name} name or alias`)}"entry"in e&&b.isBrowserEnvValue&&"u">typeof window&&!e.entry.startsWith("http")&&(e.entry=new URL(e.entry,window.location.origin).href),e.shareScope||(e.shareScope=a.DEFAULT_SCOPE),e.type||(e.type=a.DEFAULT_REMOTE_TYPE)};this.hooks.lifecycle.beforeRegisterRemote.emit({remote:e,origin:n});let s=t.find(t=>t.name===e.name);if(s){let o=[`The remote "${e.name}" is already registered.`,"Please note that overriding it may cause unexpected errors."];r?.force&&(this.removeRemote(s),i(),t.push(e),this.hooks.lifecycle.registerRemote.emit({remote:e,origin:n}),(0,b.warn)(o.join(" ")))}else i(),t.push(e),this.hooks.lifecycle.registerRemote.emit({remote:e,origin:n})}removeRemote(e){try{let{host:t}=this,{name:r}=e,o=t.options.remotes.findIndex(e=>e.name===r);-1!==o&&t.options.remotes.splice(o,1);let a=t.moduleCache.get(e.name);if(a){let r=a.remoteInfo,o=r.entryGlobalName;n.CurrentGlobal[o]&&(Object.getOwnPropertyDescriptor(n.CurrentGlobal,o)?.configurable?delete n.CurrentGlobal[o]:n.CurrentGlobal[o]=void 0);let s=l.getRemoteEntryUniqueKey(a.remoteInfo);n.globalLoading[s]&&delete n.globalLoading[s],t.snapshotHandler.manifestCache.delete(r.entry);let c=r.buildVersion?(0,b.composeKeyWithSeparator)(r.name,r.buildVersion):r.name,u=n.CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex(e=>r.buildVersion?e.options.id===c:e.name===c);if(-1!==u){let e=n.CurrentGlobal.__FEDERATION__.__INSTANCES__[u];c=e.options.id||c;let t=i.getGlobalShareScope(),o=!0,a=[];Object.keys(t).forEach(e=>{let n=t[e];n&&Object.keys(n).forEach(t=>{let i=n[t];i&&Object.keys(i).forEach(n=>{let s=i[n];s&&Object.keys(s).forEach(i=>{let l=s[i];l&&"object"==typeof l&&l.from===r.name&&(l.loaded||l.loading?(l.useIn=l.useIn.filter(e=>e!==r.name),l.useIn.length?o=!1:a.push([e,t,n,i])):a.push([e,t,n,i]))})})})}),o&&(e.shareScopeMap={},delete t[c]),a.forEach(([e,r,o,n])=>{delete t[e]?.[r]?.[o]?.[n]}),n.CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(u,1)}let{hostGlobalSnapshot:f}=y.getGlobalRemoteInfo(e,t);if(f){let t=f&&"remotesInfo"in f&&f.remotesInfo&&n.getInfoWithoutType(f.remotesInfo,e.name).key;t&&(delete f.remotesInfo[t],n.Global.__FEDERATION__.__MANIFEST_LOADING__[t]&&delete n.Global.__FEDERATION__.__MANIFEST_LOADING__[t])}t.moduleCache.delete(e.name)}}catch(e){o.logger.error(`removeRemote failed: ${e instanceof Error?e.message:String(e)}`)}}}},2350(e,t,r){let o=r(4110),n=r(2012),a=r(1839),i=r(9587);r(4446);let s=r(7782),l=r(4319),c=r(973),u=r(5331);r(7603);let f=r(6062);t.SharedHandler=class{constructor(e){this.hooks=new u.PluginSystem({beforeRegisterShare:new l.SyncWaterfallHook("beforeRegisterShare"),afterResolve:new c.AsyncWaterfallHook("afterResolve"),beforeLoadShare:new c.AsyncWaterfallHook("beforeLoadShare"),loadShare:new s.AsyncHook,resolveShare:new l.SyncWaterfallHook("resolveShare"),initContainerShareScopeMap:new l.SyncWaterfallHook("initContainerShareScopeMap")}),this.host=e,this.shareScopeMap={},this.initTokens={},this._setGlobalShareScopeMap(e.options)}registerShared(e,t){let{newShareInfos:r,allShareInfos:o}=a.formatShareConfigs(e,t);return Object.keys(r).forEach(e=>{r[e].forEach(r=>{r.scope.forEach(o=>{this.hooks.lifecycle.beforeRegisterShare.emit({origin:this.host,pkgName:e,shared:r}),this.shareScopeMap[o]?.[e]||this.setShared({pkgName:e,lib:r.lib,get:r.get,loaded:r.loaded||!!r.lib,shared:r,from:t.name})})})}),{newShareInfos:r,allShareInfos:o}}async loadShare(e,t){let{host:r}=this,n=a.getTargetSharedOptions({pkgName:e,extraOptions:t,shareInfos:r.options.shared});n?.scope&&await Promise.all(n.scope.map(async e=>{await Promise.all(this.initializeSharing(e,{strategy:n.strategy}))}));let{shareInfo:i}=await this.hooks.lifecycle.beforeLoadShare.emit({pkgName:e,shareInfo:n,shared:r.options.shared,origin:r});o.assert(i,`Cannot find shared "${e}" in host "${r.options.name}". Ensure the shared config for "${e}" is declared in the federation plugin options and the host has been initialized before loading shares.`);let{shared:s,useTreesShaking:l}=a.getRegisteredShare(this.shareScopeMap,e,i,this.hooks.lifecycle.resolveShare)||{};if(s){let t=a.directShare(s,l);if(t.lib)return a.addUseIn(t,r.options.name),t.lib;if(t.loading&&!t.loaded){let e=await t.loading;return t.loaded=!0,t.lib||(t.lib=e),a.addUseIn(t,r.options.name),e}{let o=(async()=>{let e=await t.get();return a.addUseIn(t,r.options.name),t.loaded=!0,t.lib=e,e})();return this.setShared({pkgName:e,loaded:!1,shared:s,from:r.options.name,lib:null,loading:o,treeShaking:l?t:void 0}),o}}{if(t?.customShareInfo)return!1;let o=a.shouldUseTreeShaking(i.treeShaking),n=a.directShare(i,o),s=(async()=>{let t=await n.get();n.lib=t,n.loaded=!0,a.addUseIn(n,r.options.name);let{shared:o,useTreesShaking:s}=a.getRegisteredShare(this.shareScopeMap,e,i,this.hooks.lifecycle.resolveShare)||{};if(o){let e=a.directShare(o,s);e.lib=t,e.loaded=!0,o.from=i.from}return t})();return this.setShared({pkgName:e,loaded:!1,shared:i,from:r.options.name,lib:null,loading:s,treeShaking:o?n:void 0}),s}}initializeSharing(e=n.DEFAULT_SCOPE,t){let{host:r}=this,o=t?.from,i=t?.strategy,s=t?.initScope,l=[];if("build"!==o){let{initTokens:t}=this;s||(s=[]);let r=t[e];if(r||(r=t[e]={from:this.host.name}),s.indexOf(r)>=0)return l;s.push(r)}let c=this.shareScopeMap,u=r.options.name;c[e]||(c[e]={});let f=c[e],d=(e,t)=>{let{version:r,eager:o}=t;f[e]=f[e]||{};let n=f[e],i=n[r]&&a.directShare(n[r]),s=!!(i&&("eager"in i&&i.eager||"shareConfig"in i&&i.shareConfig?.eager));(!i||"loaded-first"!==i.strategy&&!i.loaded&&(!o!=!s?o:u>n[r].from))&&(n[r]=t)},p=async e=>{let t,{module:o}=await r.remoteHandler.getRemoteModuleAndOptions({id:e});try{t=await o.getEntry()}catch(o){if(!(t=await r.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({id:e,error:o,from:"runtime",lifecycle:"beforeLoadShare",origin:r})))return}finally{t?.init&&!o.initing&&(o.remoteEntryExports=t,await o.init(void 0,void 0,s))}};return Object.keys(r.options.shared).forEach(t=>{r.options.shared[t].forEach(r=>{r.scope.includes(e)&&d(t,r)})}),("version-first"===r.options.shareStrategy||"version-first"===i)&&r.options.remotes.forEach(t=>{t.shareScope===e&&l.push(p(t.name))}),l}loadShareSync(e,t){let{host:r}=this,n=a.getTargetSharedOptions({pkgName:e,extraOptions:t,shareInfos:r.options.shared});n?.scope&&n.scope.forEach(e=>{this.initializeSharing(e,{strategy:n.strategy})});let{shared:s,useTreesShaking:l}=a.getRegisteredShare(this.shareScopeMap,e,n,this.hooks.lifecycle.resolveShare)||{};if(s){if("function"==typeof s.lib)return a.addUseIn(s,r.options.name),s.loaded||(s.loaded=!0,s.from===r.options.name&&(n.loaded=!0)),s.lib;if("function"==typeof s.get){let t=s.get();if(!(t instanceof Promise))return a.addUseIn(s,r.options.name),this.setShared({pkgName:e,loaded:!0,from:r.options.name,lib:t,shared:s}),t}}if(n.lib)return n.loaded||(n.loaded=!0),n.lib;if(n.get){let a=n.get();return a instanceof Promise&&o.error(t?.from==="build"?f.RUNTIME_005:f.RUNTIME_006,f.runtimeDescMap,{hostName:r.options.name,sharedPkgName:e},void 0,i.optionsToMFContext(r.options)),n.lib=a,this.setShared({pkgName:e,loaded:!0,from:r.options.name,lib:n.lib,shared:n}),n.lib}o.error(f.RUNTIME_006,f.runtimeDescMap,{hostName:r.options.name,sharedPkgName:e},void 0,i.optionsToMFContext(r.options))}initShareScopeMap(e,t,r={}){let{host:o}=this;this.shareScopeMap[e]=t,this.hooks.lifecycle.initContainerShareScopeMap.emit({shareScope:t,options:o.options,origin:o,scopeName:e,hostShareScopeMap:r.hostShareScopeMap})}setShared({pkgName:e,shared:t,from:r,lib:o,loading:n,loaded:a,get:i,treeShaking:s}){let{version:l,scope:c="default",...u}=t,f=Array.isArray(c)?c:[c],d=e=>{let t=(e,t,r)=>{r&&!e[t]&&(e[t]=r)},r=s?e.treeShaking:e;t(r,"loaded",a),t(r,"loading",n),t(r,"get",i)};f.forEach(t=>{this.shareScopeMap[t]||(this.shareScopeMap[t]={}),this.shareScopeMap[t][e]||(this.shareScopeMap[t][e]={}),this.shareScopeMap[t][e][l]||(this.shareScopeMap[t][e][l]={version:l,scope:[t],...u,lib:o});let n=this.shareScopeMap[t][e][l];d(n),r&&n.from!==r&&(n.from=r)})}_setGlobalShareScopeMap(e){let t=a.getGlobalShareScope(),r=e.id||e.name;r&&!t[r]&&(t[r]=this.shareScopeMap)}}},9017(e,t,r){var o=r(6890).__exportAll({});Object.defineProperty(t,"type_exports",{enumerable:!0,get:function(){return o}})},9587(e,t){function r(e){return{name:e.name,alias:e.alias,entry:"entry"in e?e.entry:void 0,version:"version"in e?e.version:void 0,type:e.type,entryGlobalName:e.entryGlobalName,shareScope:e.shareScope}}t.optionsToMFContext=function(e){let t={};for(let[r,o]of Object.entries(e.shared)){let e=o[0];e&&(t[r]={version:e.version,singleton:e.shareConfig?.singleton,requiredVersion:e.shareConfig?.requiredVersion!==!1&&e.shareConfig?.requiredVersion,eager:e.eager,strictVersion:e.shareConfig?.strictVersion})}return{project:{name:e.name,mfRole:e.remotes?.length>0?"host":"unknown"},mfConfig:{name:e.name,remotes:e.remotes?.map(r)??[],shared:t}}}},9915(e,t,r){r(6654),t.getBuilderId=function(){return"workflowPlugin:2.119.1-canary.b53bbee1d"}},7782(e,t,r){let o=r(1065);t.AsyncHook=class extends o.SyncHook{emit(...e){let t,r=Array.from(this.listeners);if(r.length>0){let o=0,n=t=>!1!==t&&(o<r.length?Promise.resolve(r[o++].apply(null,e)).then(n):t);t=n()}return Promise.resolve(t)}}},973(e,t,r){let o=r(4110),n=r(4328),a=r(1065),i=r(4319);t.AsyncWaterfallHook=class extends a.SyncHook{constructor(e){super(),this.onerror=o.error,this.type=e}emit(e){n.isObject(e)||o.error(`The response data for the "${this.type}" hook must be an object.`);let t=Array.from(this.listeners);if(t.length>0){let r=0,n=t=>(o.warn(t),this.onerror(t),e),a=o=>{if(i.checkReturnData(e,o)){if(e=o,r<t.length)try{return Promise.resolve(t[r++](e)).then(a,n)}catch(e){return n(e)}}else this.onerror(`A plugin returned an incorrect value for the "${this.type}" type.`);return e};return Promise.resolve(a(e))}return Promise.resolve(e)}}},7603(e,t,r){r(1065),r(7782),r(4319),r(973),r(5331)},5331(e,t,r){let o=r(4110),n=r(4328);r(4446),t.PluginSystem=class{constructor(e){this.registerPlugins={},this.lifecycle=e,this.lifecycleKeys=Object.keys(e)}applyPlugin(e,t){o.assert(n.isPlainObject(e),"Plugin configuration is invalid.");let r=e.name;o.assert(r,"A name must be provided by the plugin."),this.registerPlugins[r]||(this.registerPlugins[r]=e,e.apply?.(t),Object.keys(this.lifecycle).forEach(t=>{let r=e[t];r&&this.lifecycle[t].on(r)}))}removePlugin(e){o.assert(e,"A name is required.");let t=this.registerPlugins[e];o.assert(t,`The plugin "${e}" is not registered.`),Object.keys(t).forEach(e=>{"name"!==e&&this.lifecycle[e].remove(t[e])})}}},1065(e,t){t.SyncHook=class{constructor(e){this.type="",this.listeners=new Set,e&&(this.type=e)}on(e){"function"==typeof e&&this.listeners.add(e)}once(e){let t=this;this.on(function r(...o){return t.remove(r),e.apply(null,o)})}emit(...e){let t;return this.listeners.size>0&&this.listeners.forEach(r=>{t=r(...e)}),t}remove(e){this.listeners.delete(e)}removeAll(){this.listeners.clear()}}},4319(e,t,r){let o=r(4110),n=r(4328),a=r(1065);function i(e,t){if(!n.isObject(t))return!1;if(e!==t){for(let r in e)if(!(r in t))return!1}return!0}t.SyncWaterfallHook=class extends a.SyncHook{constructor(e){super(),this.onerror=o.error,this.type=e}emit(e){for(let t of(n.isObject(e)||o.error(`The data for the "${this.type}" hook should be an object.`),this.listeners))try{let r=t(e);if(i(e,r))e=r;else{this.onerror(`A plugin returned an unacceptable value for the "${this.type}" type.`);break}}catch(e){o.warn(e),this.onerror(e)}return e}},t.checkReturnData=i},4446(e,t,r){r(4110),r(4328),r(9915),r(4653),r(3251),r(3226),r(9587),r(6654)},3226(e,t,r){let o=r(4110),n=r(9653),a=r(2012),i=r(6654),s=r(6062),l=".then(callbacks[0]).catch(callbacks[1])";async function c({entry:e,remoteEntryExports:t}){return new Promise((r,n)=>{try{t?r(t):"u">typeof FEDERATION_ALLOW_NEW_FUNCTION?Function("callbacks",`import("${e}")${l}`)([r,n]):import(e).then(r).catch(n)}catch(t){o.error(`Failed to load ESM entry from "${e}". ${t instanceof Error?t.message:String(t)}`)}})}async function u({entry:e,remoteEntryExports:t}){return new Promise((r,n)=>{try{t?r(t):Function("callbacks",`System.import("${e}")${l}`)([r,n])}catch(t){o.error(`Failed to load SystemJS entry from "${e}". ${t instanceof Error?t.message:String(t)}`)}})}function f(e,t,r){let{remoteEntryKey:a,entryExports:i}=n.getRemoteEntryExports(e,t);return i||o.error(s.RUNTIME_001,s.runtimeDescMap,{remoteName:e,remoteEntryUrl:r,remoteEntryKey:a}),i}async function d({name:e,globalName:t,entry:r,remoteInfo:a,loaderHook:l,getEntryUrl:c}){let{entryExports:u}=n.getRemoteEntryExports(e,t);if(u)return u;let p=c?c(r):r;return(0,i.loadScript)(p,{attrs:{},createScriptHook:(e,t)=>{let r=l.lifecycle.createScript.emit({url:e,attrs:t,remoteInfo:a});if(r&&(r instanceof HTMLScriptElement||"script"in r||"timeout"in r))return r}}).then(()=>f(e,t,r),t=>{let r=t instanceof Error?t.message:String(t);o.error(s.RUNTIME_008,s.runtimeDescMap,{remoteName:e,resourceUrl:p},r)})}async function p({remoteInfo:e,remoteEntryExports:t,loaderHook:r,getEntryUrl:o}){let{entry:n,entryGlobalName:a,name:i,type:s}=e;switch(s){case"esm":case"module":return c({entry:n,remoteEntryExports:t});case"system":return u({entry:n,remoteEntryExports:t});default:return d({entry:n,globalName:a,name:i,remoteInfo:e,loaderHook:r,getEntryUrl:o})}}async function h({remoteInfo:e,loaderHook:t}){let{entry:r,entryGlobalName:a,name:s,type:l}=e,{entryExports:c}=n.getRemoteEntryExports(s,a);return c||(0,i.loadScriptNode)(r,{attrs:{name:s,globalName:a,type:l},loaderHook:{createScriptHook:(r,o={})=>{let n=t.lifecycle.createScript.emit({url:r,attrs:o,remoteInfo:e});if(n&&"url"in n)return n}}}).then(()=>f(s,a,r)).catch(e=>{o.error(`Failed to load Node.js entry for remote "${s}" from "${r}". ${e instanceof Error?e.message:String(e)}`)})}function m(e){let{entry:t,name:r}=e;return(0,i.composeKeyWithSeparator)(r,t)}async function g(e){let{origin:t,remoteEntryExports:r,remoteInfo:o,getEntryUrl:a,_inErrorHandling:l=!1}=e,c=m(o);if(r)return r;if(!n.globalLoading[c]){let e=t.remoteHandler.hooks.lifecycle.loadEntry,u=t.loaderHook;n.globalLoading[c]=e.emit({loaderHook:u,remoteInfo:o,remoteEntryExports:r}).then(e=>e||(("u">typeof ENV_TARGET?"web"===ENV_TARGET:i.isBrowserEnvValue)?p({remoteInfo:o,remoteEntryExports:r,loaderHook:u,getEntryUrl:a}):h({remoteInfo:o,loaderHook:u}))).catch(async e=>{let a=m(o),i=e instanceof Error&&e.message.includes("ScriptExecutionError");if(e instanceof Error&&e.message.includes(s.RUNTIME_008)&&!i&&!l){let e=e=>g({...e,_inErrorHandling:!0}),i=await t.loaderHook.lifecycle.loadEntryError.emit({getRemoteEntry:e,origin:t,remoteInfo:o,remoteEntryExports:r,globalLoading:n.globalLoading,uniqueKey:a});if(i)return i}throw e})}return n.globalLoading[c]}function y(e){return{...e,entry:"entry"in e?e.entry:"",type:e.type||a.DEFAULT_REMOTE_TYPE,entryGlobalName:e.entryGlobalName||e.name,shareScope:e.shareScope||a.DEFAULT_SCOPE}}t.getRemoteEntry=g,t.getRemoteEntryUniqueKey=m,t.getRemoteInfo=y},4110(e,t,r){let o=r(6654),n=r(1310),a="[ Federation Runtime ]",i=(0,o.createLogger)(a);function s(e,t,r,o,i){if(void 0!==t)return(0,n.logAndReport)(e,t,r??{},e=>{throw Error(`${a}: ${e}`)},o,i);let s=e;if(s instanceof Error)throw s.message.startsWith(a)||(s.message=`${a}: ${s.message}`),s;throw Error(`${a}: ${s}`)}function l(e){e instanceof Error&&(e.message.startsWith(a)||(e.message=`${a}: ${e.message}`)),i.warn(e)}t.assert=function(e,t,r,o,n){e||(void 0!==r?s(t,r,o,void 0,n):s(t))},t.error=s,t.logger=i,t.warn=l},4653(e,t){function r(e,t){for(let r of e){let e=t.startsWith(r.name),o=t.replace(r.name,"");if(e){if(o.startsWith("/"))return{pkgNameOrAlias:r.name,expose:o=`.${o}`,remote:r};else if(""===o)return{pkgNameOrAlias:r.name,expose:".",remote:r}}let n=r.alias&&t.startsWith(r.alias),a=r.alias&&t.replace(r.alias,"");if(r.alias&&n){if(a&&a.startsWith("/"))return{pkgNameOrAlias:r.alias,expose:a=`.${a}`,remote:r};else if(""===a)return{pkgNameOrAlias:r.alias,expose:".",remote:r}}}}t.matchRemote=function(e,t){for(let r of e)if(t===r.name||r.alias&&t===r.alias)return r},t.matchRemoteWithNameAndExpose=r},3251(e,t,r){let o=r(9653);t.registerPlugins=function(e,t){let r=o.getGlobalHostPlugins(),n=[t.hooks,t.remoteHandler.hooks,t.sharedHandler.hooks,t.snapshotHandler.hooks,t.loaderHook,t.bridgeHook];return r.length>0&&r.forEach(t=>{e?.find(e=>e.name!==t.name)&&e.push(t)}),e&&e.length>0&&e.forEach(e=>{n.forEach(r=>{r.applyPlugin(e,t)})}),e}},8725(e,t,r){let o=r(4110),n=r(4653),a=r(3226),i=r(6654);function s(e){return{resourceCategory:"sync",share:!0,depsRemote:!0,prefetchInterface:!1,...e}}function l(e,t){return t.map(t=>{let r=n.matchRemote(e,t.nameOrAlias);return o.assert(r,`Unable to preload ${t.nameOrAlias} as it is not included in ${!r&&(0,i.safeToString)({remoteInfo:r,remotes:e})}`),{remote:r,preloadConfig:s(t)}})}function c(e){return e?e.map(e=>"."===e?e:e.startsWith("./")?e.replace("./",""):e):[]}function u(e,t,r,o=!0){let{cssAssets:n,jsAssetsWithoutEntry:s,entryAssets:l}=r;if(t.options.inBrowser){if(l.forEach(r=>{let{moduleInfo:o}=r,n=t.moduleCache.get(e.name);n?a.getRemoteEntry({origin:t,remoteInfo:o,remoteEntryExports:n.remoteEntryExports}):a.getRemoteEntry({origin:t,remoteInfo:o,remoteEntryExports:void 0})}),o){let r={rel:"preload",as:"style"};n.forEach(o=>{let{link:n,needAttach:a}=(0,i.createLink)({url:o,cb:()=>{},attrs:r,createLinkHook:(r,o)=>{let n=t.loaderHook.lifecycle.createLink.emit({url:r,attrs:o,remoteInfo:e});if(n instanceof HTMLLinkElement)return n}});a&&document.head.appendChild(n)})}else{let r={rel:"stylesheet",type:"text/css"};n.forEach(o=>{let{link:n,needAttach:a}=(0,i.createLink)({url:o,cb:()=>{},attrs:r,createLinkHook:(r,o)=>{let n=t.loaderHook.lifecycle.createLink.emit({url:r,attrs:o,remoteInfo:e});if(n instanceof HTMLLinkElement)return n},needDeleteLink:!1});a&&document.head.appendChild(n)})}if(o){let r={rel:"preload",as:"script"};s.forEach(o=>{let{link:n,needAttach:a}=(0,i.createLink)({url:o,cb:()=>{},attrs:r,createLinkHook:(r,o)=>{let n=t.loaderHook.lifecycle.createLink.emit({url:r,attrs:o,remoteInfo:e});if(n instanceof HTMLLinkElement)return n}});a&&document.head.appendChild(n)})}else{let r={fetchpriority:"high",type:e?.type==="module"?"module":"text/javascript"};s.forEach(o=>{let{script:n,needAttach:a}=(0,i.createScript)({url:o,cb:()=>{},attrs:r,createScriptHook:(r,o)=>{let n=t.loaderHook.lifecycle.createScript.emit({url:r,attrs:o,remoteInfo:e});if(n instanceof HTMLScriptElement)return n},needDeleteScript:!0});a&&document.head.appendChild(n)})}}}t.defaultPreloadArgs=s,t.formatPreloadArgs=l,t.normalizePreloadExposes=c,t.preloadAssets=u},2598(e,t){function r(e,t){return(e=Number(e)||e)>(t=Number(t)||t)?1:e===t?0:-1}function o(e,t){let{preRelease:o}=e,{preRelease:n}=t;if(void 0===o&&n)return 1;if(o&&void 0===n)return -1;if(void 0===o&&void 0===n)return 0;for(let e=0,t=o.length;e<=t;e++){let t=o[e],a=n[e];if(t!==a){if(void 0===t&&void 0===a)return 0;if(!t)return 1;if(!a)return -1;return r(t,a)}}return 0}function n(e,t){return r(e.major,t.major)||r(e.minor,t.minor)||r(e.patch,t.patch)||o(e,t)}function a(e,t){return e.version===t.version}t.compare=function(e,t){switch(e.operator){case"":case"=":return a(e,t);case">":return 0>n(e,t);case">=":return a(e,t)||0>n(e,t);case"<":return n(e,t)>0;case"<=":return a(e,t)||n(e,t)>0;case void 0:return!0;default:return!1}}},9140(e,t){let r="[0-9A-Za-z-]+",o=`(?:\\+(${r}(?:\\.${r})*))`,n="0|[1-9]\\d*",a="[0-9]+",i="\\d*[a-zA-Z-][a-zA-Z0-9-]*",s=`(?:${a}|${i})`,l=`(?:-?(${s}(?:\\.${s})*))`,c=`(?:${n}|${i})`,u=`(?:-(${c}(?:\\.${c})*))`,f=`${n}|x|X|\\*`,d=`[v=\\s]*(${f})(?:\\.(${f})(?:\\.(${f})(?:${u})?${o}?)?)?`,p=`^\\s*(${d})\\s+-\\s+(${d})\\s*$`,h=`[v=\\s]*${`(${a})\\.(${a})\\.(${a})`}${l}?${o}?`,m="((?:<|>)?=?)",g=`(\\s*)${m}\\s*(${h}|${d})`,y="(?:~>?)",b=`(\\s*)${y}\\s+`,E="(?:\\^)",S=`(\\s*)${E}\\s+`,_="(<|>)?=?\\s*\\*",R=`^${E}${d}$`,I=`v?${`(${n})\\.(${n})\\.(${n})`}${u}?${o}?`,M=`^${y}${d}$`,T=`^${m}\\s*${d}$`,N=`^${m}\\s*(${I})$|^$`,v="^\\s*>=\\s*0.0.0\\s*$";t.caret=R,t.caretTrim=S,t.comparator=N,t.comparatorTrim=g,t.gte0=v,t.hyphenRange=p,t.star=_,t.tilde=M,t.tildeTrim=b,t.xRange=T},3835(e,t,r){let o=r(2948),n=r(8708),a=r(2598);function i(e){return o.pipe(n.parseCarets,n.parseTildes,n.parseXRanges,n.parseStar)(e)}function s(e){return o.pipe(n.parseHyphen,n.parseComparatorTrim,n.parseTildeTrim,n.parseCaretTrim)(e.trim()).split(/\s+/).join(" ")}t.satisfy=function(e,t){if(!e)return!1;let r=o.extractComparator(e);if(!r)return!1;let[,l,,c,u,f,d]=r,p={operator:l,version:o.combineVersion(c,u,f,d),major:c,minor:u,patch:f,preRelease:d?.split(".")};for(let e of t.split("||")){let t=e.trim();if(!t||"*"===t||"x"===t)return!0;try{let e=s(t);if(!e.trim())return!0;let r=e.split(" ").map(e=>i(e)).join(" ");if(!r.trim())return!0;let l=r.split(/\s+/).map(e=>n.parseGTE0(e)).filter(Boolean);if(0===l.length)continue;let c=!0;for(let e of l){let t=o.extractComparator(e);if(!t){c=!1;break}let[,r,,n,i,s,l]=t;if(!a.compare({operator:r,version:o.combineVersion(n,i,s,l),major:n,minor:i,patch:s,preRelease:l?.split(".")},p)){c=!1;break}}if(c)return!0}catch(e){console.error(`[semver] Error processing range part "${t}":`,e);continue}}return!1}},8708(e,t,r){let o=r(9140),n=r(2948);function a(e){return e.replace(n.parseRegex(o.hyphenRange),(e,t,r,o,a,i,s,l,c,u,f,d)=>(t=n.isXVersion(r)?"":n.isXVersion(o)?`>=${r}.0.0`:n.isXVersion(a)?`>=${r}.${o}.0`:`>=${t}`,l=n.isXVersion(c)?"":n.isXVersion(u)?`<${Number(c)+1}.0.0-0`:n.isXVersion(f)?`<${c}.${Number(u)+1}.0-0`:d?`<=${c}.${u}.${f}-${d}`:`<=${l}`,`${t} ${l}`.trim()))}function i(e){return e.replace(n.parseRegex(o.comparatorTrim),"$1$2$3")}function s(e){return e.replace(n.parseRegex(o.tildeTrim),"$1~")}function l(e){return e.trim().split(/\s+/).map(e=>e.replace(n.parseRegex(o.caret),(e,t,r,o,a)=>{if(n.isXVersion(t))return"";if(n.isXVersion(r))return`>=${t}.0.0 <${Number(t)+1}.0.0-0`;if(n.isXVersion(o))if("0"===t)return`>=${t}.${r}.0 <${t}.${Number(r)+1}.0-0`;else return`>=${t}.${r}.0 <${Number(t)+1}.0.0-0`;if(a)if("0"!==t)return`>=${t}.${r}.${o}-${a} <${Number(t)+1}.0.0-0`;else if("0"===r)return`>=${t}.${r}.${o}-${a} <${t}.${r}.${Number(o)+1}-0`;else return`>=${t}.${r}.${o}-${a} <${t}.${Number(r)+1}.0-0`;if("0"===t)if("0"===r)return`>=${t}.${r}.${o} <${t}.${r}.${Number(o)+1}-0`;else return`>=${t}.${r}.${o} <${t}.${Number(r)+1}.0-0`;return`>=${t}.${r}.${o} <${Number(t)+1}.0.0-0`})).join(" ")}function c(e){return e.trim().split(/\s+/).map(e=>e.replace(n.parseRegex(o.tilde),(e,t,r,o,a)=>n.isXVersion(t)?"":n.isXVersion(r)?`>=${t}.0.0 <${Number(t)+1}.0.0-0`:n.isXVersion(o)?`>=${t}.${r}.0 <${t}.${Number(r)+1}.0-0`:a?`>=${t}.${r}.${o}-${a} <${t}.${Number(r)+1}.0-0`:`>=${t}.${r}.${o} <${t}.${Number(r)+1}.0-0`)).join(" ")}function u(e){return e.split(/\s+/).map(e=>e.trim().replace(n.parseRegex(o.xRange),(e,t,r,o,a,i)=>{let s=n.isXVersion(r),l=s||n.isXVersion(o),c=l||n.isXVersion(a);if("="===t&&c&&(t=""),i="",s)if(">"===t||"<"===t)return"<0.0.0-0";else return"*";return t&&c?(l&&(o=0),a=0,">"===t?(t=">=",l?(r=Number(r)+1,o=0):o=Number(o)+1,a=0):"<="===t&&(t="<",l?r=Number(r)+1:o=Number(o)+1),"<"===t&&(i="-0"),`${t+r}.${o}.${a}${i}`):l?`>=${r}.0.0${i} <${Number(r)+1}.0.0-0`:c?`>=${r}.${o}.0${i} <${r}.${Number(o)+1}.0-0`:e})).join(" ")}function f(e){return e.trim().replace(n.parseRegex(o.star),"")}function d(e){return e.trim().replace(n.parseRegex(o.gte0),"")}t.parseCaretTrim=function(e){return e.replace(n.parseRegex(o.caretTrim),"$1^")},t.parseCarets=l,t.parseComparatorTrim=i,t.parseGTE0=d,t.parseHyphen=a,t.parseStar=f,t.parseTildeTrim=s,t.parseTildes=c,t.parseXRanges=u},2948(e,t,r){let o=r(9140);function n(e){return new RegExp(e)}function a(e){return!e||"x"===e.toLowerCase()||"*"===e}function i(...e){return t=>e.reduce((e,t)=>t(e),t)}function s(e){return e.match(n(o.comparator))}t.combineVersion=function(e,t,r,o){let n=`${e}.${t}.${r}`;return o?`${n}-${o}`:n},t.extractComparator=s,t.isXVersion=a,t.parseRegex=n,t.pipe=i},1839(e,t,r){let o=r(4110),n=r(4328),a=r(9653),i=r(2012),s=r(3835),l=r(6654);function c(e,t,r,n){let a;return a="get"in e?e.get:"lib"in e?()=>Promise.resolve(e.lib):()=>Promise.resolve(()=>{o.error(`Cannot get shared "${r}" from "${t}": neither "get" nor "lib" is provided in the share config.`)}),e.shareConfig?.eager&&e.treeShaking?.mode&&o.error(`Invalid shared config for "${r}" from "${t}": cannot use both "eager: true" and "treeShaking.mode" simultaneously. Choose one strategy.`),{deps:[],useIn:[],from:t,loading:null,...e,shareConfig:{requiredVersion:`^${e.version}`,singleton:!1,eager:!1,strictVersion:!1,...e.shareConfig},get:a,loaded:!!e?.loaded||"lib"in e||void 0,version:e.version??"0",scope:Array.isArray(e.scope)?e.scope:[e.scope??"default"],strategy:(e.strategy??n)||"version-first",treeShaking:e.treeShaking?{...e.treeShaking,mode:e.treeShaking.mode??"server-calc",status:e.treeShaking.status??l.TreeShakingStatus.UNKNOWN,useIn:[]}:void 0}}function u(e,t){let r=t.shared||{},o=t.name,a=Object.keys(r).reduce((e,a)=>{let i=n.arrayOptions(r[a]);return e[a]=e[a]||[],i.forEach(r=>{e[a].push(c(r,o,a,t.shareStrategy))}),e},{}),i={...e.shared};return Object.keys(a).forEach(e=>{i[e]?a[e].forEach(t=>{i[e].find(e=>e.version===t.version)||i[e].push(t)}):i[e]=a[e]}),{allShareInfos:i,newShareInfos:a}}function f(e,t){if(!e)return!1;let{status:r,mode:o}=e;return r!==l.TreeShakingStatus.NO_USE&&(r===l.TreeShakingStatus.CALCULATED||"runtime-infer"===o&&(!t||g(e,t)))}function d(e,t){let r=e=>{if(!Number.isNaN(Number(e))){let t=e.split("."),r=e;for(let e=0;e<3-t.length;e++)r+=".0";return r}return e};return!!s.satisfy(r(e),`<=${r(t)}`)}let p=(e,t)=>{let r=t||function(e,t){return d(e,t)};return Object.keys(e).reduce((e,t)=>!e||r(e,t)||"0"===e?t:e,0)},h=e=>!!e.loaded||"function"==typeof e.lib,m=e=>!!e.loading,g=(e,t)=>{if(!e||!t)return!1;let{usedExports:r}=e;return!!r&&!!t.every(e=>r.includes(e))};function y(e,t,r,o){let n=e[t][r],a="",i=f(o),s=function(e,t){return i?!n[e].treeShaking||!!n[t].treeShaking&&!h(n[e].treeShaking)&&d(e,t):!h(n[e])&&d(e,t)};if(i){if(a=p(e[t][r],s))return{version:a,useTreesShaking:i};i=!1}return{version:p(e[t][r],s),useTreesShaking:i}}let b=e=>h(e)||m(e);function E(e,t,r,o){let n=e[t][r],a="",i=f(o),s=function(e,t){if(i){if(!n[e].treeShaking)return!0;if(!n[t].treeShaking)return!1;if(b(n[t].treeShaking))if(b(n[e].treeShaking))return!!d(e,t);else return!0;if(b(n[e].treeShaking))return!1}if(b(n[t]))if(b(n[e]))return!!d(e,t);else return!0;return!b(n[e])&&d(e,t)};if(i){if(a=p(e[t][r],s))return{version:a,useTreesShaking:i};i=!1}return{version:p(e[t][r],s),useTreesShaking:i}}function S(e){return"loaded-first"===e?E:y}function _(e,t,r,n){if(!e)return;let{shareConfig:l,scope:c=i.DEFAULT_SCOPE,strategy:u,treeShaking:d}=r;for(let i of Array.isArray(c)?c:[c])if(l&&e[i]&&e[i][t]){let{requiredVersion:c}=l,{version:p,useTreesShaking:h}=S(u)(e,i,t,d),m=()=>{let n=e[i][t][p];if(l.singleton){if("string"==typeof c&&!s.satisfy(p,c)){let e=`Version ${p} from ${p&&n.from} of shared singleton module ${t} does not satisfy the requirement of ${r.from} which needs ${c})`;l.strictVersion?o.error(e):o.warn(e)}return{shared:n,useTreesShaking:h}}{if(!1===c||"*"===c||s.satisfy(p,c))return{shared:n,useTreesShaking:h};let r=f(d);if(r){for(let[o,n]of Object.entries(e[i][t]))if(f(n.treeShaking,d?.usedExports)&&s.satisfy(o,c))return{shared:n,useTreesShaking:r}}for(let[r,o]of Object.entries(e[i][t]))if(s.satisfy(r,c))return{shared:o,useTreesShaking:!1}}},g={shareScopeMap:e,scope:i,pkgName:t,version:p,GlobalFederation:a.Global.__FEDERATION__,shareInfo:r,resolver:m};return(n.emit(g)||g).resolver()}}function R(){return a.Global.__FEDERATION__.__SHARE__}function I(e){let{pkgName:t,extraOptions:r,shareInfos:o}=e,n=e=>{if(!e)return;let t={};e.forEach(e=>{t[e.version]=e});let r=function(e,r){return!h(t[e])&&d(e,r)};return t[p(t,r)]},a=r?.resolver??n,i=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),s=(...e)=>{let t={};for(let r of e)if(r)for(let[e,o]of Object.entries(r)){let r=t[e];i(r)&&i(o)?t[e]=s(r,o):void 0!==o&&(t[e]=o)}return t};return s(a(o[t]),r?.customShareInfo)}function M(e,t){return t&&e.treeShaking?e.treeShaking:e}t.addUseIn=(e,t)=>{e.useIn||(e.useIn=[]),n.addUniqueItem(e.useIn,t)},t.directShare=M,t.formatShareConfigs=u,t.getGlobalShareScope=R,t.getRegisteredShare=_,t.getTargetSharedOptions=I,t.shouldUseTreeShaking=f},4328(e,t,r){let o=r(4110),n=r(6654);function a(e,t){return -1===e.findIndex(e=>e===t)&&e.push(t),e}function i(e){return"version"in e&&e.version?`${e.name}:${e.version}`:"entry"in e&&e.entry?`${e.name}:${e.entry}`:`${e.name}`}function s(e){return void 0!==e.entry}function l(e){return!e.entry.includes(".json")}async function c(e,t){try{return await e()}catch(e){t||o.warn(e);return}}function u(e){return e&&"object"==typeof e}let f=Object.prototype.toString;function d(e){return"[object Object]"===f.call(e)}function p(e,t){let r=/^(https?:)?\/\//i;return e.replace(r,"").replace(/\/$/,"")===t.replace(r,"").replace(/\/$/,"")}function h(e){return Array.isArray(e)?e:[e]}function m(e){let t={url:"",type:"global",globalName:""};return n.isBrowserEnvValue||(0,n.isReactNativeEnv)()||!("ssrRemoteEntry"in e)?"remoteEntry"in e?{url:e.remoteEntry,type:e.remoteEntryType,globalName:e.globalName}:t:"ssrRemoteEntry"in e?{url:e.ssrRemoteEntry||t.url,type:e.ssrRemoteEntryType||t.type,globalName:e.globalName}:t}let g=(e,t)=>{let r;return r=e.endsWith("/")?e.slice(0,-1):e,t.startsWith(".")&&(t=t.slice(1)),r+=t};t.addUniqueItem=a,t.arrayOptions=h,t.getFMId=i,t.getRemoteEntryInfoFromSnapshot=m,t.isObject=u,t.isPlainObject=d,t.isPureRemoteEntry=l,t.isRemoteInfoWithEntry=s,t.isStaticResourcesEqual=p,t.objectToString=f,t.processModuleAlias=g,t.safeWrapper=c},4336(e,t){var r=Object.create,o=Object.defineProperty,n=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,i=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,l=(e,t,r,i)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var l,c=a(t),u=0,f=c.length;u<f;u++)l=c[u],s.call(e,l)||l===r||o(e,l,{get:(e=>t[e]).bind(null,l),enumerable:!(i=n(t,l))||i.enumerable});return e};t.__toESM=(e,t,n)=>(n=null!=e?r(i(e)):{},l(!t&&e&&e.__esModule?n:o(n,"default",{value:e,enumerable:!0}),e))},7329(e,t,r){Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),r(4336);let o=r(1073),n=r(8340),a={...n.helpers.global,getGlobalFederationInstance:o.getGlobalFederationInstance},i=n.helpers.share,s=n.helpers.utils;t.default={global:a,share:i,utils:s},t.global=a,t.share=i,t.utils=s},5694(e,t,r){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),r(4336);let o=r(1073),n=r(8340),a=r(6062);function i(e){let t=new((0,n.getGlobalFederationConstructor)()||n.ModuleFederation)(e);return(0,n.setGlobalFederationInstance)(t),t}let s=null;function l(e){let t=o.getGlobalFederationInstance(e.name,e.version);return t?(t.initOptions(e),s||(s=t),t):s=i(e)}function c(...e){return(0,n.assert)(s,a.RUNTIME_009,a.runtimeDescMap),s.loadRemote.apply(s,e)}function u(...e){return(0,n.assert)(s,a.RUNTIME_009,a.runtimeDescMap),s.loadShare.apply(s,e)}function f(...e){return(0,n.assert)(s,a.RUNTIME_009,a.runtimeDescMap),s.loadShareSync.apply(s,e)}function d(...e){return(0,n.assert)(s,a.RUNTIME_009,a.runtimeDescMap),s.preloadRemote.apply(s,e)}function p(...e){return(0,n.assert)(s,a.RUNTIME_009,a.runtimeDescMap),s.registerRemotes.apply(s,e)}function h(...e){return(0,n.assert)(s,a.RUNTIME_009,a.runtimeDescMap),s.registerPlugins.apply(s,e)}function m(){return s}function g(...e){return(0,n.assert)(s,a.RUNTIME_009,a.runtimeDescMap),s.registerShared.apply(s,e)}(0,n.setGlobalFederationConstructor)(n.ModuleFederation),Object.defineProperty(t,"Module",{enumerable:!0,get:function(){return n.Module}}),t.ModuleFederation=n.ModuleFederation,t.createInstance=i,t.getInstance=m,Object.defineProperty(t,"getRemoteEntry",{enumerable:!0,get:function(){return n.getRemoteEntry}}),Object.defineProperty(t,"getRemoteInfo",{enumerable:!0,get:function(){return n.getRemoteInfo}}),t.init=l,t.loadRemote=c,Object.defineProperty(t,"loadScript",{enumerable:!0,get:function(){return n.loadScript}}),Object.defineProperty(t,"loadScriptNode",{enumerable:!0,get:function(){return n.loadScriptNode}}),t.loadShare=u,t.loadShareSync=f,t.preloadRemote=d,Object.defineProperty(t,"registerGlobalPlugins",{enumerable:!0,get:function(){return n.registerGlobalPlugins}}),t.registerPlugins=h,t.registerRemotes=p,t.registerShared=g},1073(e,t,r){r(4336);let o=r(8340);function n(){return"workflowPlugin:2.119.1-canary.b53bbee1d"}t.getGlobalFederationInstance=function(e,t){let r=n();return o.CurrentGlobal.__FEDERATION__.__INSTANCES__.find(o=>!!r&&o.options.id===r||o.options.name===e&&!o.options.version&&!t||o.options.name===e&&!!t&&o.options.version===t)}},576(e,t){var r=Object.defineProperty;t.__exportAll=(e,t)=>{let o={};for(var n in e)r(o,n,{get:e[n],enumerable:!0});return t||r(o,Symbol.toStringTag,{value:"Module"}),o}},5762(e,t){let r="federation-manifest.json",o=".json",n="FEDERATION_DEBUG",a={AT:"@",HYPHEN:"-",SLASH:"/"},i={[a.AT]:"scope_",[a.HYPHEN]:"_",[a.SLASH]:"__"},s={[i[a.AT]]:a.AT,[i[a.HYPHEN]]:a.HYPHEN,[i[a.SLASH]]:a.SLASH},l=":",c="mf-manifest.json",u="mf-stats.json",f={NPM:"npm",APP:"app"},d="__MF_DEVTOOLS_MODULE_INFO__",p="ENCODE_NAME_PREFIX",h=".federation",m={identifier:"MFDataPrefetch",globalKey:"__PREFETCH__",library:"mf-data-prefetch",exportsKey:"__PREFETCH_EXPORTS__",fileName:"bootstrap.js"},g=function(e){return e[e.UNKNOWN=1]="UNKNOWN",e[e.CALCULATED=2]="CALCULATED",e[e.NO_USE=0]="NO_USE",e}({});t.BROWSER_LOG_KEY=n,t.ENCODE_NAME_PREFIX=p,t.EncodedNameTransformMap=s,t.FederationModuleManifest=r,t.MANIFEST_EXT=o,t.MFModuleType=f,t.MFPrefetchCommon=m,t.MODULE_DEVTOOL_IDENTIFIER=d,t.ManifestFileName=c,t.NameTransformMap=i,t.NameTransformSymbol=a,t.SEPARATOR=l,t.StatsFileName=u,t.TEMP_DIR=h,t.TreeShakingStatus=g},275(e,t){t.createModuleFederationConfig=e=>e},6(e,t,r){let o=r(6049);async function n(e,t){try{return await e()}catch(e){t||o.warn(e);return}}function a(e,t){let r=/^(https?:)?\/\//i;return e.replace(r,"").replace(/\/$/,"")===t.replace(r,"").replace(/\/$/,"")}function i(e){let t,r=null,o=!0,i=2e4,s=document.getElementsByTagName("script");for(let t=0;t<s.length;t++){let n=s[t],i=n.getAttribute("src");if(i&&a(i,e.url)){r=n,o=!1;break}}if(!r){let t,o=e.attrs;(r=document.createElement("script")).type=o?.type==="module"?"module":"text/javascript",e.createScriptHook&&((t=e.createScriptHook(e.url,e.attrs))instanceof HTMLScriptElement?r=t:"object"==typeof t&&("script"in t&&t.script&&(r=t.script),"timeout"in t&&t.timeout&&(i=t.timeout))),r.src||(r.src=e.url),o&&!t&&Object.keys(o).forEach(e=>{r&&("async"===e||"defer"===e?r[e]=o[e]:r.getAttribute(e)||r.setAttribute(e,o[e]))})}let l=null,c="u">typeof window?t=>{if(t.filename&&a(t.filename,e.url)){let r=Error(`ScriptExecutionError: Script "${e.url}" loaded but threw a runtime error during execution: ${t.message} (${t.filename}:${t.lineno}:${t.colno})`);r.name="ScriptExecutionError",l=r}}:null;c&&window.addEventListener("error",c);let u=async(o,a)=>{clearTimeout(t),c&&window.removeEventListener("error",c);let i=()=>{if(a?.type==="error"){let t=Error(a?.isTimeout?`ScriptNetworkError: Script "${e.url}" timed out.`:`ScriptNetworkError: Failed to load script "${e.url}" - the script URL is unreachable or the server returned an error (network failure, 404, CORS, etc.)`);t.name="ScriptNetworkError",e?.onErrorCallback&&e?.onErrorCallback(t)}else l?e?.onErrorCallback&&e?.onErrorCallback(l):e?.cb&&e?.cb()};if(r&&(r.onerror=null,r.onload=null,n(()=>{let{needDeleteScript:t=!0}=e;t&&r?.parentNode&&r.parentNode.removeChild(r)}),o&&"function"==typeof o)){let e=o(a);if(e instanceof Promise){let t=await e;return i(),t}return i(),e}i()};return r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),t=setTimeout(()=>{u(null,{type:"error",isTimeout:!0})},i),{script:r,needAttach:o}}function s(e,t){let{attrs:r={},createScriptHook:o}=t;return new Promise((t,n)=>{let{script:a,needAttach:s}=i({url:e,cb:t,onErrorCallback:n,attrs:{fetchpriority:"high",...r},createScriptHook:o,needDeleteScript:!0});s&&document.head.appendChild(a)})}t.createLink=function(e){let t=null,r=!0,o=document.getElementsByTagName("link");for(let n=0;n<o.length;n++){let i=o[n],s=i.getAttribute("href"),l=i.getAttribute("rel");if(s&&a(s,e.url)&&l===e.attrs.rel){t=i,r=!1;break}}if(!t){let r;(t=document.createElement("link")).setAttribute("href",e.url);let o=e.attrs;e.createLinkHook&&(r=e.createLinkHook(e.url,o))instanceof HTMLLinkElement&&(t=r),o&&!r&&Object.keys(o).forEach(e=>{t&&!t.getAttribute(e)&&t.setAttribute(e,o[e])})}let i=(r,o)=>{let a=()=>{o?.type==="error"?e?.onErrorCallback&&e?.onErrorCallback(o):e?.cb&&e?.cb()};if(t&&(t.onerror=null,t.onload=null,n(()=>{let{needDeleteLink:r=!0}=e;r&&t?.parentNode&&t.parentNode.removeChild(t)}),r)){let e=r(o);return a(),e}a()};return t.onerror=i.bind(null,t.onerror),t.onload=i.bind(null,t.onload),{link:t,needAttach:r}},t.createScript=i,t.isStaticResourcesEqual=a,t.loadScript=s,t.safeWrapper=n},4315(e,t,r){let o=r(5762),n="u">typeof ENV_TARGET?"web"===ENV_TARGET:"u">typeof window&&void 0!==window.document;function a(){return n}function i(){return"u">typeof navigator&&navigator?.product==="ReactNative"}function s(){try{if(a()&&window.localStorage)return!!localStorage.getItem(o.BROWSER_LOG_KEY)}catch(e){}return!1}function l(){return"u">typeof process&&process.env&&process.env.FEDERATION_DEBUG?!!process.env.FEDERATION_DEBUG:!!("u">typeof FEDERATION_DEBUG&&FEDERATION_DEBUG)||s()}t.getProcessEnv=function(){return"u">typeof process&&process.env?process.env:{}},t.isBrowserEnv=a,t.isBrowserEnvValue=n,t.isDebugMode=l,t.isReactNativeEnv=i},7824(e,t,r){let o=r(5762),n=(e,t)=>{if(!e)return t;let r=(e=>{if("."===e)return"";if(e.startsWith("./"))return e.replace("./","");if(e.startsWith("/")){let t=e.slice(1);return t.endsWith("/")?t.slice(0,-1):t}return e})(e);return r?r.endsWith("/")?`${r}${t}`:`${r}/${t}`:t};function a(e){return e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/")}function i(e){return!!("remoteEntry"in e&&e.remoteEntry.includes(o.MANIFEST_EXT))}function s(e){if(!e)return{statsFileName:o.StatsFileName,manifestFileName:o.ManifestFileName};let t="boolean"==typeof e?"":e.filePath||"",r="boolean"==typeof e?"":e.fileName||"",a=".json",i=e=>e.endsWith(a)?e:`${e}${a}`,s=(e,t)=>e.replace(a,`${t}${a}`),l=r?i(r):o.ManifestFileName;return{statsFileName:n(t,r?s(l,"-stats"):o.StatsFileName),manifestFileName:n(t,l)}}t.generateSnapshotFromManifest=function(e,t={}){let r,{remotes:o={},overrides:i={},version:s}=t,l=()=>"publicPath"in e.metaData?("auto"===e.metaData.publicPath||""===e.metaData.publicPath)&&s?a(s):e.metaData.publicPath:e.metaData.getPublicPath,c=Object.keys(i),u={};Object.keys(o).length||(u=e.remotes?.reduce((e,t)=>{let r,o=t.federationContainerName;return r=c.includes(o)?i[o]:"version"in t?t.version:t.entry,e[o]={matchedVersion:r},e},{})||{}),Object.keys(o).forEach(e=>u[e]={matchedVersion:c.includes(e)?i[e]:o[e]});let{remoteEntry:{path:f,name:d,type:p},types:h={path:"",name:"",zip:"",api:""},buildInfo:{buildVersion:m},globalName:g,ssrRemoteEntry:y}=e.metaData,{exposes:b}=e,E={version:s||"",buildVersion:m,globalName:g,remoteEntry:n(f,d),remoteEntryType:p,remoteTypes:n(h.path,h.name),remoteTypesZip:h.zip||"",remoteTypesAPI:h.api||"",remotesInfo:u,shared:e?.shared.map(e=>({assets:e.assets,sharedName:e.name,version:e.version,usedExports:e.referenceExports||[]})),modules:b?.map(e=>({moduleName:e.name,modulePath:e.path,assets:e.assets}))};if(e.metaData?.prefetchInterface){let t=e.metaData.prefetchInterface;E={...E,prefetchInterface:t}}if(e.metaData?.prefetchEntry){let{path:t,name:r,type:o}=e.metaData.prefetchEntry;E={...E,prefetchEntry:n(t,r),prefetchEntryType:o}}if("publicPath"in e.metaData?(r={...E,publicPath:l()},"string"==typeof e.metaData.ssrPublicPath&&(r.ssrPublicPath=e.metaData.ssrPublicPath)):r={...E,getPublicPath:l()},y){let e=n(y.path,y.name);r.ssrRemoteEntry=e,r.ssrRemoteEntryType=y.type||"commonjs-module"}return r},t.getManifestFileName=s,t.inferAutoPublicPath=a,t.isManifestProvider=i,t.simpleJoinRemoteEntry=n},6654(e,t,r){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"});let o=r(5762),n=r(9505),a=r(8278),i=r(173),s=r(8305),l=r(6217),c=r(1904),u=r(4315),f=r(6049),d=r(7824),p=r(8318),h=r(6),m=r(5446),g=r(4927),y=r(275);t.BROWSER_LOG_KEY=o.BROWSER_LOG_KEY,t.ENCODE_NAME_PREFIX=o.ENCODE_NAME_PREFIX,t.EncodedNameTransformMap=o.EncodedNameTransformMap,t.FederationModuleManifest=o.FederationModuleManifest,t.MANIFEST_EXT=o.MANIFEST_EXT,t.MFModuleType=o.MFModuleType,t.MFPrefetchCommon=o.MFPrefetchCommon,t.MODULE_DEVTOOL_IDENTIFIER=o.MODULE_DEVTOOL_IDENTIFIER,t.ManifestFileName=o.ManifestFileName,t.NameTransformMap=o.NameTransformMap,t.NameTransformSymbol=o.NameTransformSymbol,t.SEPARATOR=o.SEPARATOR,t.StatsFileName=o.StatsFileName,t.TEMP_DIR=o.TEMP_DIR,t.TreeShakingStatus=o.TreeShakingStatus,t.assert=f.assert,t.bindLoggerToCompiler=p.bindLoggerToCompiler,t.composeKeyWithSeparator=f.composeKeyWithSeparator,Object.defineProperty(t,"consumeSharedPlugin",{enumerable:!0,get:function(){return l.ConsumeSharedPlugin_exports}}),Object.defineProperty(t,"containerPlugin",{enumerable:!0,get:function(){return n.ContainerPlugin_exports}}),Object.defineProperty(t,"containerReferencePlugin",{enumerable:!0,get:function(){return a.ContainerReferencePlugin_exports}}),t.createInfrastructureLogger=p.createInfrastructureLogger,t.createLink=h.createLink,t.createLogger=p.createLogger,t.createModuleFederationConfig=y.createModuleFederationConfig,t.createScript=h.createScript,t.createScriptNode=m.createScriptNode,t.decodeName=f.decodeName,t.encodeName=f.encodeName,t.error=f.error,t.generateExposeFilename=f.generateExposeFilename,t.generateShareFilename=f.generateShareFilename,t.generateSnapshotFromManifest=d.generateSnapshotFromManifest,t.getManifestFileName=d.getManifestFileName,t.getProcessEnv=u.getProcessEnv,t.getResourceUrl=f.getResourceUrl,t.inferAutoPublicPath=d.inferAutoPublicPath,t.infrastructureLogger=p.infrastructureLogger,t.isBrowserEnv=u.isBrowserEnv,t.isBrowserEnvValue=u.isBrowserEnvValue,t.isDebugMode=u.isDebugMode,t.isManifestProvider=d.isManifestProvider,t.isReactNativeEnv=u.isReactNativeEnv,t.isRequiredVersion=f.isRequiredVersion,t.isStaticResourcesEqual=h.isStaticResourcesEqual,t.loadScript=h.loadScript,t.loadScriptNode=m.loadScriptNode,t.logger=p.logger,Object.defineProperty(t,"moduleFederationPlugin",{enumerable:!0,get:function(){return i.ModuleFederationPlugin_exports}}),t.normalizeOptions=g.normalizeOptions,t.parseEntry=f.parseEntry,Object.defineProperty(t,"provideSharedPlugin",{enumerable:!0,get:function(){return c.ProvideSharedPlugin_exports}}),t.safeToString=f.safeToString,t.safeWrapper=h.safeWrapper,Object.defineProperty(t,"sharePlugin",{enumerable:!0,get:function(){return s.SharePlugin_exports}}),t.simpleJoinRemoteEntry=d.simpleJoinRemoteEntry,t.warn=f.warn},8318(e,t,r){let o=r(4315),n="[ Module Federation ]",a=console,i=["logger.ts","logger.js","captureStackTrace","Logger.emit","Logger.log","Logger.info","Logger.warn","Logger.error","Logger.debug"];function s(){try{let e=Error().stack;if(!e)return;let[,...t]=e.split("\n"),r=t.filter(e=>!i.some(t=>e.includes(t)));if(!r.length)return;return`Stack trace:
4
+ ${r.slice(0,5).join("\n")}`}catch{return}}var l=class{constructor(e,t=a){this.prefix=e,this.delegate=t??a}setPrefix(e){this.prefix=e}setDelegate(e){this.delegate=e??a}emit(e,t){let r=this.delegate,n=o.isDebugMode()?s():void 0,i=n?[...t,n]:t,l=(()=>{switch(e){case"log":return["log","info"];case"info":return["info","log"];case"warn":return["warn","info","log"];case"error":return["error","warn","log"];default:return["debug","log"]}})();for(let e of l){let t=r[e];if("function"==typeof t)return void t.call(r,this.prefix,...i)}for(let e of l){let t=a[e];if("function"==typeof t)return void t.call(a,this.prefix,...i)}}log(...e){this.emit("log",e)}warn(...e){this.emit("warn",e)}error(...e){this.emit("error",e)}success(...e){this.emit("info",e)}info(...e){this.emit("info",e)}ready(...e){this.emit("info",e)}debug(...e){o.isDebugMode()&&this.emit("debug",e)}};function c(e){return new l(e)}function u(e){let t=new l(e);return Object.defineProperty(t,"__mf_infrastructure_logger__",{value:!0,enumerable:!1,configurable:!1}),t}function f(e,t,r){if(e.__mf_infrastructure_logger__&&t?.getInfrastructureLogger)try{let o=t.getInfrastructureLogger(r);o&&"object"==typeof o&&("function"==typeof o.log||"function"==typeof o.info||"function"==typeof o.warn||"function"==typeof o.error)&&e.setDelegate(o)}catch{e.setDelegate(void 0)}}let d=c(n),p=u(n);t.bindLoggerToCompiler=f,t.createInfrastructureLogger=u,t.createLogger=c,t.infrastructureLogger=p,t.logger=d},5446(__unused_rspack_module,exports){let sdkImportCache=new Map;function importNodeModule(e){if(!e)throw Error("import specifier is required");if(sdkImportCache.has(e))return sdkImportCache.get(e);let t=Function("name","return import(name)")(e).then(e=>e).catch(t=>{throw console.error(`Error importing module ${e}:`,t),sdkImportCache.delete(e),t});return sdkImportCache.set(e,t),t}let loadNodeFetch=async()=>{let e=await importNodeModule("node-fetch");return e.default||e},lazyLoaderHookFetch=async(e,t,r)=>{let o=(e,t)=>r.lifecycle.fetch.emit(e,t),n=await o(e,t||{});return n&&n instanceof Response?n:("u"<typeof fetch?await loadNodeFetch():fetch)(e,t||{})},createScriptNode="u"<typeof ENV_TARGET||"web"!==ENV_TARGET?(url,cb,attrs,loaderHook)=>{let urlObj;if(loaderHook?.createScriptHook){let hookResult=loaderHook.createScriptHook(url);hookResult&&"object"==typeof hookResult&&"url"in hookResult&&(url=hookResult.url)}try{urlObj=new URL(url)}catch(e){console.error("Error constructing URL:",e),cb(Error(`Invalid URL: ${e}`));return}let getFetch=async()=>loaderHook?.fetch?(e,t)=>lazyLoaderHookFetch(e,t,loaderHook):"u"<typeof fetch?loadNodeFetch():fetch,handleScriptFetch=async(f,urlObj)=>{try{let requireFn,res=await f(urlObj.href),data=await res.text(),[path,vm]=await Promise.all([importNodeModule("path"),importNodeModule("vm")]),scriptContext={exports:{},module:{exports:{}}},urlDirname=urlObj.pathname.split("/").slice(0,-1).join("/"),filename=path.basename(urlObj.pathname),script=new vm.Script(`(function(exports, module, require, __dirname, __filename) {${data}
5
+ })`,{filename,importModuleDynamically:vm.constants?.USE_MAIN_CONTEXT_DEFAULT_LOADER??importNodeModule});requireFn=eval("require"),script.runInThisContext()(scriptContext.exports,scriptContext.module,requireFn,urlDirname,filename);let exportedInterface=scriptContext.module.exports||scriptContext.exports;if(attrs&&exportedInterface&&attrs.globalName)return void cb(void 0,exportedInterface[attrs.globalName]||exportedInterface);cb(void 0,exportedInterface)}catch(e){cb(e instanceof Error?e:Error(`Script execution error: ${e}`))}};getFetch().then(async e=>{if(attrs?.type==="esm"||attrs?.type==="module")return loadModule(urlObj.href,{fetch:e,vm:await importNodeModule("vm")}).then(async e=>{await e.evaluate(),cb(void 0,e.namespace)}).catch(e=>{cb(e instanceof Error?e:Error(`Script execution error: ${e}`))});handleScriptFetch(e,urlObj)}).catch(e=>{cb(e)})}:(e,t,r,o)=>{t(Error("createScriptNode is disabled in non-Node.js environment"))},loadScriptNode="u"<typeof ENV_TARGET||"web"!==ENV_TARGET?(e,t)=>new Promise((r,o)=>{createScriptNode(e,(e,n)=>{if(e)o(e);else{let e=t?.attrs?.globalName||`__FEDERATION_${t?.attrs?.name}:custom__`;r(globalThis[e]=n)}},t.attrs,t.loaderHook)}):(e,t)=>{throw Error("loadScriptNode is disabled in non-Node.js environment")},esmModuleCache=new Map;async function loadModule(e,t){if(esmModuleCache.has(e))return esmModuleCache.get(e);let{fetch:r,vm:o}=t,n=await (await r(e)).text(),a=new o.SourceTextModule(n,{importModuleDynamically:async(r,o)=>loadModule(new URL(r,e).href,t)});return esmModuleCache.set(e,a),await a.link(async r=>{let o=new URL(r,e).href;return await loadModule(o,t)}),a}exports.createScriptNode=createScriptNode,exports.loadScriptNode=loadScriptNode},4927(e,t){t.normalizeOptions=function(e,t,r){return function(o){if(!1===o)return!1;if(void 0===o)if(e)return t;else return!1;if(!0===o)return t;if(o&&"object"==typeof o)return{...t,...o};throw Error(`Unexpected type for \`${r}\`, expect boolean/undefined/object, got: ${typeof o}`)}}},6217(e,t,r){var o=r(576).__exportAll({});Object.defineProperty(t,"ConsumeSharedPlugin_exports",{enumerable:!0,get:function(){return o}})},9505(e,t,r){var o=r(576).__exportAll({});Object.defineProperty(t,"ContainerPlugin_exports",{enumerable:!0,get:function(){return o}})},8278(e,t,r){var o=r(576).__exportAll({});Object.defineProperty(t,"ContainerReferencePlugin_exports",{enumerable:!0,get:function(){return o}})},173(e,t,r){var o=r(576).__exportAll({});Object.defineProperty(t,"ModuleFederationPlugin_exports",{enumerable:!0,get:function(){return o}})},1904(e,t,r){var o=r(576).__exportAll({});Object.defineProperty(t,"ProvideSharedPlugin_exports",{enumerable:!0,get:function(){return o}})},8305(e,t,r){var o=r(576).__exportAll({});Object.defineProperty(t,"SharePlugin_exports",{enumerable:!0,get:function(){return o}})},6049(e,t,r){let o=r(5762),n=r(4315),a="[ Federation Runtime ]",i=(e,t,r=o.SEPARATOR)=>{let a=e.split(r),i="development"===n.getProcessEnv().NODE_ENV&&t,s="*",l=e=>e.startsWith("http")||e.includes(o.MANIFEST_EXT);if(a.length>=2){let[t,...o]=a;e.startsWith(r)&&(t=a.slice(0,2).join(r),o=[i||a.slice(2).join(r)]);let n=i||o.join(r);return l(n)?{name:t,entry:n}:{name:t,version:n||s}}if(1===a.length){let[e]=a;return i&&l(i)?{name:e,entry:i}:{name:e,version:i||s}}throw`Invalid entry value: ${e}`},s=function(...e){return e.length?e.reduce((e,t)=>t?e?`${e}${o.SEPARATOR}${t}`:t:e,""):""},l=function(e,t="",r=!1){try{let n=r?".js":"";return`${t}${e.replace(RegExp(`${o.NameTransformSymbol.AT}`,"g"),o.NameTransformMap[o.NameTransformSymbol.AT]).replace(RegExp(`${o.NameTransformSymbol.HYPHEN}`,"g"),o.NameTransformMap[o.NameTransformSymbol.HYPHEN]).replace(RegExp(`${o.NameTransformSymbol.SLASH}`,"g"),o.NameTransformMap[o.NameTransformSymbol.SLASH])}${n}`}catch(e){throw e}},c=function(e,t,r){try{let n=e;if(t){if(!n.startsWith(t))return n;n=n.replace(RegExp(t,"g"),"")}return n=n.replace(RegExp(`${o.NameTransformMap[o.NameTransformSymbol.AT]}`,"g"),o.EncodedNameTransformMap[o.NameTransformMap[o.NameTransformSymbol.AT]]).replace(RegExp(`${o.NameTransformMap[o.NameTransformSymbol.SLASH]}`,"g"),o.EncodedNameTransformMap[o.NameTransformMap[o.NameTransformSymbol.SLASH]]).replace(RegExp(`${o.NameTransformMap[o.NameTransformSymbol.HYPHEN]}`,"g"),o.EncodedNameTransformMap[o.NameTransformMap[o.NameTransformSymbol.HYPHEN]]),r&&(n=n.replace(".js","")),n}catch(e){throw e}},u=(e,t)=>{if(!e)return"";let r=e;return"."===r&&(r="default_export"),r.startsWith("./")&&(r=r.replace("./","")),l(r,"__federation_expose_",t)},f=(e,t)=>e?l(e,"__federation_shared_",t):"",d=(e,t)=>{if("getPublicPath"in e){let r;return r=e.getPublicPath.startsWith("function")?Function("return "+e.getPublicPath)()():Function(e.getPublicPath)(),`${r}${t}`}return"publicPath"in e?!n.isBrowserEnv()&&!n.isReactNativeEnv()&&"ssrPublicPath"in e&&"string"==typeof e.ssrPublicPath?`${e.ssrPublicPath}${t}`:`${e.publicPath}${t}`:(console.warn("Cannot get resource URL. If in debug mode, please ignore.",e,t),"")},p=e=>{throw Error(`${a}: ${e}`)},h=e=>{console.warn(`${a}: ${e}`)};function m(e){try{return JSON.stringify(e,null,2)}catch(e){return""}}let g=/^([\d^=v<>~]|[*xX]$)/;function y(e){return g.test(e)}t.assert=(e,t)=>{e||p(t)},t.composeKeyWithSeparator=s,t.decodeName=c,t.encodeName=l,t.error=p,t.generateExposeFilename=u,t.generateShareFilename=f,t.getResourceUrl=d,t.isRequiredVersion=y,t.parseEntry=i,t.safeToString=m,t.warn=h},3728(e,t){var r=Object.create,o=Object.defineProperty,n=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,i=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,l=(e,t,r,i)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var l,c=a(t),u=0,f=c.length;u<f;u++)l=c[u],s.call(e,l)||l===r||o(e,l,{get:(e=>t[e]).bind(null,l),enumerable:!(i=n(t,l))||i.enumerable});return e};t.__toESM=(e,t,n)=>(n=null!=e?r(i(e)):{},l(!t&&e&&e.__esModule?n:o(n,"default",{value:e,enumerable:!0}),e))},3780(e,t){t.attachShareScopeMap=function(e){e.S&&!e.federation.hasAttachShareScopeMap&&e.federation.instance&&e.federation.instance.shareScopeMap&&(e.S=e.federation.instance.shareScopeMap,e.federation.hasAttachShareScopeMap=!0)}},1938(e,t){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),t.FEDERATION_SUPPORTED_TYPES=["script"]},1787(e,t,r){let o=r(3780),n=r(537),a=r(3634),i=r(8386),s=r(4568);t.consumes=function(e){n.updateConsumeOptions(e);let{chunkId:t,promises:r,installedModules:l,webpackRequire:c,chunkMapping:u,moduleToHandlerMapping:f}=e;o.attachShareScopeMap(c),c.o(u,t)&&u[t].forEach(e=>{if(c.o(l,e))return r.push(l[e]);let t=t=>{l[e]=0,c.m[e]=r=>{delete c.c[e];let o=t(),{shareInfo:n}=f[e];if(n?.shareConfig?.layer&&o&&"object"==typeof o)try{o.hasOwnProperty("layer")&&void 0!==o.layer||(o.layer=n.shareConfig.layer)}catch(e){}r.exports=o}},o=t=>{delete l[e],c.m[e]=r=>{throw delete c.c[e],t}};try{let n=c.federation.instance;if(!n)throw Error("Federation instance not found!");let{shareKey:u,getter:d,shareInfo:p,treeShakingGetter:h}=f[e],m=a.getUsedExports(c,u),g={...p};Array.isArray(g.scope)&&Array.isArray(g.scope[0])&&(g.scope=g.scope[0]),m&&(g.treeShaking={usedExports:m,useIn:[n.options.name]});let y=n.loadShare(u,{customShareInfo:g}).then(e=>{if(!1===e){if("function"!=typeof d)throw Error(s.getShortErrorMsg(i.RUNTIME_012,{[i.RUNTIME_012]:'The getter for the shared module is not a function. This may be caused by setting "shared.import: false" without the host providing the corresponding lib.'},{shareKey:u}));return h?.()||d()}return e});y.then?r.push(l[e]=y.then(t).catch(o)):t(y)}catch(e){o(e)}})}},8386(e,t){t.RUNTIME_012="RUNTIME-012"},4568(e,t){let r=e=>`View the docs to see how to solve: https://module-federation.io/guide/troubleshooting/${e.split("-")[0].toLowerCase()}#${e.toLowerCase()}`;t.getShortErrorMsg=(e,t,o,n)=>{let a=[`${[t[e]]} #${e}`];return o&&a.push(`args: ${JSON.stringify(o)}`),a.push(r(e)),n&&a.push(`Original Error Message:
6
+ ${n}`),a.join("\n")}},3126(e,t){t.getSharedFallbackGetter=({shareKey:e,factory:t,version:r,webpackRequire:o,libraryType:n="global"})=>{let{runtime:a,instance:i,bundlerRuntime:s,sharedFallback:l}=o.federation;if(!l)return t;let c=l[e];if(!c)return t;let u=r?c.find(e=>e[1]===r):c[0];if(!u)throw Error(`No fallback item found for shareKey: ${e} and version: ${r}`);return()=>a.getRemoteEntry({origin:o.federation.instance,remoteInfo:{name:u[2],entry:`${o.p}${u[0]}`,type:n,entryGlobalName:u[2],shareScope:"default"}}).then(t=>{if(!t)throw Error(`Failed to load fallback entry for shareKey: ${e} and version: ${r}`);return t.init(o.federation.instance,s).then(()=>t.get())})}},3634(e,t){t.getUsedExports=function(e,t){let r=e.federation.usedExports;if(r)return r[t]}},7038(e,t,r){Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});let o=r(3728),n=r(3780),a=r(1415),i=r(1787),s=r(1592),l=r(6992),c=r(5135),u=r(1988),f=r(3126),d=r(5694),p={runtime:d=o.__toESM(d),instance:void 0,initOptions:void 0,bundlerRuntime:{remotes:a.remotes,consumes:i.consumes,I:s.initializeSharing,S:{},installInitialConsumes:l.installInitialConsumes,initContainerEntry:c.initContainerEntry,init:u.init,getSharedFallbackGetter:f.getSharedFallbackGetter},attachShareScopeMap:n.attachShareScopeMap,bundlerRuntimeOptions:{}},h=p.instance,m=p.initOptions,g=p.bundlerRuntime,y=p.bundlerRuntimeOptions;t.attachShareScopeMap=n.attachShareScopeMap,t.bundlerRuntime=g,t.bundlerRuntimeOptions=y,t.default=p,t.initOptions=m,t.instance=h,Object.defineProperty(t,"runtime",{enumerable:!0,get:function(){return d}})},1988(e,t,r){let o=r(3728),n=r(5694),a=r(7329);a=o.__toESM(a),t.init=function({webpackRequire:e}){let{initOptions:t,runtime:o,sharedFallback:i,bundlerRuntime:s,libraryType:l}=e.federation;if(!t)throw Error("initOptions is required!");let c=function(){return{name:"tree-shake-plugin",beforeInit(t){let{userOptions:o,origin:c,options:u}=t,f=o.version||u.version;if(!i)return t;let d=o.shared||{},p=[];Object.keys(d).forEach(t=>{(Array.isArray(d[t])?d[t]:[d[t]]).forEach(r=>{p.push([t,r]),"get"in r&&(r.treeShaking||={},r.treeShaking.get=r.get,r.get=s.getSharedFallbackGetter({shareKey:t,factory:r.get,webpackRequire:e,libraryType:l,version:r.version}))})});let h=a.default.global.getGlobalSnapshotInfoByModuleInfo({name:c.name,version:f});if(!h||!("shared"in h))return t;Object.keys(u.shared||{}).forEach(e=>{u.shared[e].forEach(t=>{p.push([e,t])})});let m=(e,t)=>{let o=h.shared.find(t=>t.sharedName===e);if(!o)return;let{treeShaking:a}=t;if(!a)return;let{secondarySharedTreeShakingName:i,secondarySharedTreeShakingEntry:s,treeShakingStatus:u}=o;a.status!==u&&(a.status=u,s&&l&&i&&(a.get=async()=>{let e=await (0,n.getRemoteEntry)({origin:c,remoteInfo:{name:i,entry:s,type:l,entryGlobalName:i,shareScope:"default"}});return await e.init(c,r.federation.bundlerRuntime),e.get()}))};return p.forEach(([e,t])=>{m(e,t)}),t}}};return t.plugins||=[],t.plugins.push(c()),o.init(t)}},5135(e,t){t.initContainerEntry=function(e){let{webpackRequire:t,shareScope:r,initScope:o,shareScopeKey:n,remoteEntryInitOptions:a}=e;if(!t.S||!t.federation||!t.federation.instance||!t.federation.initOptions)return;let i=t.federation.instance;i.initOptions({name:t.federation.initOptions.name,remotes:[],...a});let s=a?.shareScopeKeys,l=a?.shareScopeMap;if(n&&"string"!=typeof n)n.forEach(e=>{if(!s||!l)return void i.initShareScopeMap(e,r,{hostShareScopeMap:a?.shareScopeMap||{}});l[e]||(l[e]={});let t=l[e];i.initShareScopeMap(e,t,{hostShareScopeMap:a?.shareScopeMap||{}})});else{let e=n||"default";Array.isArray(s)?s.forEach(e=>{l[e]||(l[e]={});let t=l[e];i.initShareScopeMap(e,t,{hostShareScopeMap:a?.shareScopeMap||{}})}):i.initShareScopeMap(e,r,{hostShareScopeMap:a?.shareScopeMap||{}})}return(t.federation.attachShareScopeMap&&t.federation.attachShareScopeMap(t),"function"==typeof t.federation.prefetch&&t.federation.prefetch(),Array.isArray(n))?t.federation.initOptions.shared?t.I(n,o):Promise.all(n.map(e=>t.I(e,o))).then(()=>!0):t.I(n||"default",o)}},1592(e,t,r){let o=r(3780),n=r(1938);t.initializeSharing=function({shareScopeName:e,webpackRequire:t,initPromises:r,initTokens:a,initScope:i}){let s=Array.isArray(e)?e:[e];var l=[],c=function(s){i||(i=[]);let l=t.federation.instance;var c=a[s];if(c||(c=a[s]={from:l.name}),i.indexOf(c)>=0)return;i.push(c);let u=r[s];if(u)return u;var f=e=>"u">typeof console&&console.warn&&console.warn(e),d=r=>{var o=e=>f("Initialization of sharing external failed: "+e);try{var n=t(r);if(!n)return;var a=r=>r&&r.init&&r.init(t.S[s],i,{shareScopeMap:t.S||{},shareScopeKeys:e});if(n.then)return p.push(n.then(a,o));var l=a(n);if(l&&"boolean"!=typeof l&&l.then)return p.push(l.catch(o))}catch(e){o(e)}};let p=l.initializeSharing(s,{strategy:l.options.shareStrategy,initScope:i,from:"build"});o.attachShareScopeMap(t);let h=t.federation.bundlerRuntimeOptions.remotes;return(h&&Object.keys(h.idToRemoteMap).forEach(e=>{let t=h.idToRemoteMap[e],r=h.idToExternalAndNameMapping[e][2];if(t.length>1)d(r);else if(1===t.length){let e=t[0];n.FEDERATION_SUPPORTED_TYPES.includes(e.externalType)||d(r)}}),p.length)?r[s]=Promise.all(p).then(()=>r[s]=!0):r[s]=!0};return s.forEach(e=>{l.push(c(e))}),Promise.all(l).then(()=>!0)}},6992(e,t,r){let o=r(537),n=r(3634);function a(e){let{moduleId:t,moduleToHandlerMapping:r,webpackRequire:o,asyncLoad:a}=e,i=o.federation.instance;if(!i)throw Error("Federation instance not found!");let{shareKey:s,shareInfo:l}=r[t];try{let e=n.getUsedExports(o,s),t={...l};if(e&&(t.treeShaking={usedExports:e,useIn:[i.options.name]}),a)return i.loadShare(s,{customShareInfo:t});return i.loadShareSync(s,{customShareInfo:t})}catch(e){throw console.error('loadShareSync failed! The function should not be called unless you set "eager:true". If you do not set it, and encounter this issue, you can check whether an async boundary is implemented.'),console.error("The original error message is as follows: "),e}}t.installInitialConsumes=function(e){o.updateConsumeOptions(e);let{moduleToHandlerMapping:t,webpackRequire:r,installedModules:n,initialConsumes:i,asyncLoad:s}=e,l=[];i.forEach(e=>{let o=()=>a({moduleId:e,moduleToHandlerMapping:t,webpackRequire:r,asyncLoad:s});l.push([e,o])});let c=(e,o)=>{r.m[e]=a=>{n[e]=0,delete r.c[e];let i=o();if("function"!=typeof i)throw Error(`Shared module is not available for eager consumption: ${e}`);let s=i(),{shareInfo:l}=t[e];if(l?.shareConfig?.layer&&s&&"object"==typeof s)try{s.hasOwnProperty("layer")&&void 0!==s.layer||(s.layer=l.shareConfig.layer)}catch(e){}a.exports=s}};if(s)return Promise.all(l.map(async([e,t])=>{let r=await t();c(e,()=>r)}));l.forEach(([e,t])=>{c(e,t)})}},1415(e,t,r){r(3728);let o=r(3780),n=r(1938),a=r(537),i=r(6654);t.remotes=function(e){a.updateRemoteOptions(e);let{chunkId:t,promises:r,webpackRequire:s,chunkMapping:l,idToExternalAndNameMapping:c,idToRemoteMap:u}=e;o.attachShareScopeMap(s),s.o(l,t)&&l[t].forEach(e=>{let t=s.R;t||(t=[]);let o=c[e],a=u[e]||[];if(t.indexOf(o)>=0)return;if(t.push(o),o.p)return r.push(o.p);let l=t=>{t||(t=Error("Container missing")),"string"==typeof t.message&&(t.message+=`
7
+ while loading "${o[1]}" from ${o[2]}`),s.m[e]=()=>{throw t},o.p=0},f=(e,t,n,a,i,s)=>{try{let c=e(t,n);if(!c||!c.then)return i(c,a,s);{let e=c.then(e=>i(e,a),l);if(!s)return e;r.push(o.p=e)}}catch(e){l(e)}},d=(e,t,r)=>e?f(s.I,o[0],0,e,p,r):l();var p=(e,r,n)=>f(r.get,o[1],t,0,h,n),h=t=>{o.p=1,s.m[e]=e=>{e.exports=t()}};let m=()=>{try{let e=(0,i.decodeName)(a[0].name,i.ENCODE_NAME_PREFIX)+o[1].slice(1),t=s.federation.instance,r=()=>s.federation.instance.loadRemote(e,{loadFactory:!1,from:"build"});if("version-first"===t.options.shareStrategy){let e=Array.isArray(o[0])?o[0]:[o[0]];return Promise.all(e.map(e=>t.sharedHandler.initializeSharing(e))).then(()=>r())}return r()}catch(e){l(e)}};1===a.length&&n.FEDERATION_SUPPORTED_TYPES.includes(a[0].externalType)&&a[0].name?f(m,o[2],0,0,h,1):f(s,o[2],0,0,d,1)})}},537(e,t){function r(e){let{webpackRequire:t,idToExternalAndNameMapping:r={},idToRemoteMap:o={},chunkMapping:n={}}=e,{remotesLoadingData:a}=t,i=t.federation?.bundlerRuntimeOptions?.remotes?.remoteInfos;if(!a||a._updated||!i)return;let{chunkMapping:s,moduleIdToRemoteDataMapping:l}=a;if(s&&l){for(let[e,t]of Object.entries(l))if(r[e]||(r[e]=[t.shareScope,t.name,t.externalModuleId]),!o[e]&&i[t.remoteName]){let r=i[t.remoteName];o[e]||=[],r.forEach(t=>{o[e].includes(t)||o[e].push(t)})}n&&Object.entries(s).forEach(([e,t])=>{n[e]||(n[e]=[]),t.forEach(t=>{n[e].includes(t)||n[e].push(t)})}),a._updated=1}}t.updateConsumeOptions=function(e){let{webpackRequire:t,moduleToHandlerMapping:r}=e,{consumesLoadingData:o,initializeSharingData:n}=t,{sharedFallback:a,bundlerRuntime:i,libraryType:s}=t.federation;if(o&&!o._updated){let{moduleIdToConsumeDataMapping:n={},initialConsumes:l=[],chunkMapping:c={}}=o;if(Object.entries(n).forEach(([e,o])=>{r[e]||(r[e]={getter:a?i?.getSharedFallbackGetter({shareKey:o.shareKey,factory:o.fallback,webpackRequire:t,libraryType:s}):o.fallback,treeShakingGetter:a?o.fallback:void 0,shareInfo:{shareConfig:{requiredVersion:o.requiredVersion,strictVersion:o.strictVersion,singleton:o.singleton,eager:o.eager,layer:o.layer},scope:Array.isArray(o.shareScope)?o.shareScope:[o.shareScope||"default"],treeShaking:a?{get:o.fallback,mode:o.treeShakingMode}:void 0},shareKey:o.shareKey})}),"initialConsumes"in e){let{initialConsumes:t=[]}=e;l.forEach(e=>{t.includes(e)||t.push(e)})}if("chunkMapping"in e){let{chunkMapping:t={}}=e;Object.entries(c).forEach(([e,r])=>{t[e]||(t[e]=[]),r.forEach(r=>{t[e].includes(r)||t[e].push(r)})})}o._updated=1}if(n&&!n._updated){let{federation:e}=t;if(!e.instance||!n.scopeToSharingDataMapping)return;let r={};for(let[e,t]of Object.entries(n.scopeToSharingDataMapping))for(let o of t)if("object"==typeof o&&null!==o){let{name:t,version:n,factory:a,eager:i,singleton:s,requiredVersion:l,strictVersion:c}=o,u={requiredVersion:`^${n}`},f=function(e){return void 0!==e};f(s)&&(u.singleton=s),f(l)&&(u.requiredVersion=l),f(i)&&(u.eager=i),f(c)&&(u.strictVersion=c);let d={version:n,scope:[e],shareConfig:u,get:a};r[t]?r[t].push(d):r[t]=[d]}e.instance.registerShared(r),n._updated=1}},t.updateRemoteOptions=r}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={id:e,exports:{}};return __webpack_modules__[e].call(r.exports,r,r.exports,__webpack_require__),r.exports}__webpack_require__.m=__webpack_modules__,__webpack_require__.c=__webpack_module_cache__,__webpack_require__.x=()=>__webpack_require__(3937),(()=>{__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t}})(),(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;__webpack_require__.t=function(r,o){if(1&o&&(r=this(r)),8&o||"object"==typeof r&&r&&(4&o&&r.__esModule||16&o&&"function"==typeof r.then))return r;var n=Object.create(null);__webpack_require__.r(n);var a={};e=e||[null,t({}),t([]),t(t)];for(var i=2&o&&r;("object"==typeof i||"function"==typeof i)&&!~e.indexOf(i);i=t(i))Object.getOwnPropertyNames(i).forEach(e=>{a[e]=()=>r[e]});return a.default=()=>r,__webpack_require__.d(n,a),n}})(),(()=>{__webpack_require__.d=(e,t,r)=>{var o=(t,r)=>{for(var o in t)__webpack_require__.o(t,o)&&!__webpack_require__.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,[r]:t[o]})};o(t,"get"),o(r,"value")}})(),(()=>{__webpack_require__.f={},__webpack_require__.e=e=>Promise.all(Object.keys(__webpack_require__.f).reduce((t,r)=>(__webpack_require__.f[r](e,t),t),[]))})(),(()=>{__webpack_require__.u=e=>""+(({125:"__federation_expose_RunDetail",55:"__federation_expose_Definitions",67:"__federation_expose_Runs",772:"__federation_expose_Crons",777:"__federation_expose_DefinitionDetail",97:"__federation_expose_Jobs"})[e]||e)+".js"})(),(()=>{__webpack_require__.g=(()=>{if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}})()})(),(()=>{__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{var e={},t="@kb-labs/workflow-entry:";__webpack_require__.l=function(r,o,n,a){if(e[r])return void e[r].push(o);if(void 0!==n)for(var i,s,l=document.getElementsByTagName("script"),c=0;c<l.length;c++){var u=l[c];if(u.getAttribute("src")==r||u.getAttribute("data-rspack")==t+n){i=u;break}}i||(s=!0,(i=document.createElement("script")).timeout=120,__webpack_require__.nc&&i.setAttribute("nonce",__webpack_require__.nc),i.setAttribute("data-rspack",t+n),i.src=r),e[r]=[o];var f=function(t,o){i.onerror=i.onload=null,clearTimeout(d);var n=e[r];if(delete e[r],i.parentNode&&i.parentNode.removeChild(i),n&&n.forEach(function(e){return e(o)}),t)return t(o)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=f.bind(null,i.onerror),i.onload=f.bind(null,i.onload),s&&document.head.appendChild(i)}})(),(()=>{__webpack_require__.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}})(),(()=>{__webpack_require__.federation||(__webpack_require__.federation={chunkMatcher:function(e){return!/^(295|336|397|756|774)$/.test(e)},rootOutputDir:""})})(),(()=>{__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e)})(),(()=>{__webpack_require__.nc=void 0})(),(()=>{__webpack_require__.S={},__webpack_require__.initializeSharingData={scopeToSharingDataMapping:{default:[{name:"@kb-labs/studio-event-bus",version:"2.119.1-canary.b53bbee1d",factory:()=>Promise.all([__webpack_require__.e(397),__webpack_require__.e(50)]).then(()=>()=>__webpack_require__(4332)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^2.0.0"},{name:"@kb-labs/studio-hooks",version:"2.119.1-canary.b53bbee1d",factory:()=>Promise.all([__webpack_require__.e(397),__webpack_require__.e(336),__webpack_require__.e(756),__webpack_require__.e(370),__webpack_require__.e(945)]).then(()=>()=>__webpack_require__(3481)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^2.0.0"},{name:"@kb-labs/studio-ui-core",version:"2.119.1-canary.b53bbee1d",factory:()=>__webpack_require__.e(968).then(()=>()=>__webpack_require__(3755)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^2.0.0"},{name:"@kb-labs/studio-ui-kit",version:"2.119.1-canary.b53bbee1d",factory:()=>Promise.all([__webpack_require__.e(648),__webpack_require__.e(997),__webpack_require__.e(421),__webpack_require__.e(397),__webpack_require__.e(336),__webpack_require__.e(756),__webpack_require__.e(117),__webpack_require__.e(326)]).then(()=>()=>__webpack_require__(2924)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^2.0.0"},{name:"@tanstack/react-query",version:"5.97.0",factory:()=>Promise.all([__webpack_require__.e(78),__webpack_require__.e(397),__webpack_require__.e(707)]).then(()=>()=>__webpack_require__(453)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^5.0.0"},{name:"antd",version:"5.29.3",factory:()=>Promise.all([__webpack_require__.e(648),__webpack_require__.e(46),__webpack_require__.e(397),__webpack_require__.e(295)]).then(()=>()=>__webpack_require__(8229)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^5.21.0"},{name:"react-dom",version:"19.2.5",factory:()=>Promise.all([__webpack_require__.e(397),__webpack_require__.e(546)]).then(()=>()=>__webpack_require__(1297)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^19.0.0"},{name:"react-router-dom",version:"7.18.1",factory:()=>Promise.all([__webpack_require__.e(875),__webpack_require__.e(397),__webpack_require__.e(295)]).then(()=>()=>__webpack_require__(7174)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^7.0.0"},{name:"react",version:"19.2.5",factory:()=>__webpack_require__.e(405).then(()=>()=>__webpack_require__(6740)),eager:0,treeShakingMode:null,singleton:1,requiredVersion:"^19.0.0"}]},uniqueName:"@kb-labs/workflow-entry"},__webpack_require__.I=__webpack_require__.I||function(){throw Error("should have __webpack_require__.I")}})(),(()=>{__webpack_require__.g.importScripts&&(e=__webpack_require__.g.location+"");var e,t=__webpack_require__.g.document;if(!e&&t&&(t.currentScript&&"SCRIPT"===t.currentScript.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var o=r.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=r[o--].src}if(!e)throw Error("Automatic publicPath is not supported in this browser");__webpack_require__.p=e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/")})(),(()=>{__webpack_require__.consumesLoadingData={chunkMapping:{295:["4778"],336:["5963"],370:["5699","9312"],397:["92"],756:["7899","9497"],774:["4519","5155"]},moduleIdToConsumeDataMapping:{4519:{shareScope:"default",shareKey:"@kb-labs/studio-hooks",import:"@kb-labs/studio-hooks",requiredVersion:"^2.0.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>Promise.all([__webpack_require__.e(336),__webpack_require__.e(756),__webpack_require__.e(370)]).then(()=>()=>__webpack_require__(3481)),treeShakingMode:null},4778:{shareScope:"default",shareKey:"react-dom",import:"react-dom",requiredVersion:"^19.0.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>__webpack_require__.e(165).then(()=>()=>__webpack_require__(1297)),treeShakingMode:null},5155:{shareScope:"default",shareKey:"@kb-labs/studio-ui-kit",import:"@kb-labs/studio-ui-kit",requiredVersion:"^2.0.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>Promise.all([__webpack_require__.e(648),__webpack_require__.e(997),__webpack_require__.e(421),__webpack_require__.e(336),__webpack_require__.e(756),__webpack_require__.e(117)]).then(()=>()=>__webpack_require__(2924)),treeShakingMode:null},5699:{shareScope:"default",shareKey:"@kb-labs/studio-event-bus",import:"@kb-labs/studio-event-bus",requiredVersion:"^2.0.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>__webpack_require__.e(669).then(()=>()=>__webpack_require__(4332)),treeShakingMode:null},5963:{shareScope:"default",shareKey:"react-router-dom",import:"react-router-dom",requiredVersion:"^7.0.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>Promise.all([__webpack_require__.e(875),__webpack_require__.e(295)]).then(()=>()=>__webpack_require__(7174)),treeShakingMode:null},7899:{shareScope:"default",shareKey:"@kb-labs/studio-ui-core",import:"@kb-labs/studio-ui-core",requiredVersion:"^2.0.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>__webpack_require__.e(968).then(()=>()=>__webpack_require__(3755)),treeShakingMode:null},92:{shareScope:"default",shareKey:"react",import:"react",requiredVersion:"^19.0.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>__webpack_require__.e(405).then(()=>()=>__webpack_require__(6740)),treeShakingMode:null},9312:{shareScope:"default",shareKey:"@tanstack/react-query",import:"@tanstack/react-query",requiredVersion:"^5.0.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>__webpack_require__.e(78).then(()=>()=>__webpack_require__(453)),treeShakingMode:null},9497:{shareScope:"default",shareKey:"antd",import:"antd",requiredVersion:"^5.21.0",strictVersion:!1,singleton:!0,eager:!1,fallback:()=>Promise.all([__webpack_require__.e(648),__webpack_require__.e(46),__webpack_require__.e(295)]).then(()=>()=>__webpack_require__(8229)),treeShakingMode:null}},initialConsumes:[]},__webpack_require__.f.consumes=__webpack_require__.f.consumes||function(){throw Error("should have __webpack_require__.f.consumes")}})(),(()=>{__webpack_require__.initializeExposesData={moduleMap:{"./Runs":()=>Promise.all([__webpack_require__.e(397),__webpack_require__.e(336),__webpack_require__.e(774),__webpack_require__.e(716),__webpack_require__.e(67)]).then(()=>()=>__webpack_require__(4637)),"./RunDetail":()=>Promise.all([__webpack_require__.e(997),__webpack_require__.e(7),__webpack_require__.e(397),__webpack_require__.e(336),__webpack_require__.e(295),__webpack_require__.e(774),__webpack_require__.e(716),__webpack_require__.e(125)]).then(()=>()=>__webpack_require__(4346)),"./Definitions":()=>Promise.all([__webpack_require__.e(397),__webpack_require__.e(336),__webpack_require__.e(774),__webpack_require__.e(55)]).then(()=>()=>__webpack_require__(8792)),"./DefinitionDetail":()=>Promise.all([__webpack_require__.e(397),__webpack_require__.e(336),__webpack_require__.e(774),__webpack_require__.e(777)]).then(()=>()=>__webpack_require__(3887)),"./Jobs":()=>Promise.all([__webpack_require__.e(397),__webpack_require__.e(774),__webpack_require__.e(97)]).then(()=>()=>__webpack_require__(9012)),"./Crons":()=>Promise.all([__webpack_require__.e(397),__webpack_require__.e(774),__webpack_require__.e(772)]).then(()=>()=>__webpack_require__(1597))},shareScope:"default"},__webpack_require__.getContainer=__webpack_require__.getContainer||function(){throw Error("should have __webpack_require__.getContainer")},__webpack_require__.initContainer=__webpack_require__.initContainer||function(){throw Error("should have __webpack_require__.initContainer")}})(),(()=>{var e={882:0};__webpack_require__.f.j=function(t,r){var o=__webpack_require__.o(e,t)?e[t]:void 0;if(0!==o)if(o)r.push(o[2]);else if(/^(295|336|397|756|774)$/.test(t))e[t]=0;else{var n=new Promise((r,n)=>o=e[t]=[r,n]);r.push(o[2]=n);var a=__webpack_require__.p+__webpack_require__.u(t),i=Error(),s=function(r){if(__webpack_require__.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var n=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;i.message="Loading chunk "+t+" failed.\n("+n+": "+a+")",i.name="ChunkLoadError",i.type=n,i.request=a,o[1](i)}};__webpack_require__.l(a,s,"chunk-"+t,t)}};var t=(t,r)=>{var o,n,[a,i,s]=r,l=0;if(a.some(t=>0!==e[t])){for(o in i)__webpack_require__.o(i,o)&&(__webpack_require__.m[o]=i[o]);s&&s(__webpack_require__)}for(t&&t(r);l<a.length;l++)n=a[l],__webpack_require__.o(e,n)&&e[n]&&e[n][0](),e[n]=0},r=self.rspackChunk_kb_labs_workflow_entry=self.rspackChunk_kb_labs_workflow_entry||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{var e=__webpack_require__.x,t=!1;__webpack_require__.x=function(){if(t||(t=!0,__webpack_require__(1004)),"function"==typeof e)return e();console.warn("[MF] Invalid prevStartup")}})();var __webpack_exports__=__webpack_require__.x();workflowPlugin=__webpack_exports__})();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/workflow/entry/src/http-client.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/workflow/entry/src/ws/logs-channel.ts"],"names":[],"mappings":"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","file":"logs-channel.js","sourcesContent":["/**\n * HTTP client for interacting with Workflow Daemon\n */\nimport type {\n WorkflowRerunRequest,\n WorkflowRestartRequest,\n WorkflowRestartResponse,\n WorkflowRunRequest,\n JobStatusInfo,\n JobStepsResponse,\n JobLogsResponse,\n CronListResponse,\n WorkflowInfo,\n WorkflowListResponse,\n} from '@kb-labs/workflow-contracts';\nimport { useEnv } from '@kb-labs/sdk';\n\n/** Workflow run summary returned by GET /api/v1/runs */\nexport interface WorkflowRunSummary {\n id: string;\n name: string;\n version?: string;\n status: 'queued' | 'running' | 'success' | 'failed' | 'cancelled';\n trigger?: {\n type: string;\n actor?: string;\n payload?: unknown;\n parentRunId?: string;\n parentJobId?: string;\n parentStepId?: string;\n };\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n inputs?: Record<string, unknown>;\n hasPendingApproval?: boolean;\n currentStepName?: string;\n}\n\n/** Full workflow run detail returned by GET /api/v1/runs/:runId */\nexport interface WorkflowRunDetail extends WorkflowRunSummary {\n env?: Record<string, string>;\n metadata?: Record<string, unknown>;\n result?: {\n status: string;\n summary?: string;\n error?: { message: string; code?: string };\n outputs?: Record<string, unknown>;\n };\n jobs?: Array<{\n id: string;\n jobName?: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n error?: { message: string; code?: string; stack?: string } | string;\n steps?: Array<{\n id: string;\n name?: string;\n index?: number;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n outputs?: Record<string, unknown>;\n resolvedInputs?: Record<string, unknown>;\n error?: { message: string; code?: string; details?: Record<string, unknown> } | string;\n spec?: Record<string, unknown>;\n }>;\n }>;\n}\n\n/** Metrics data returned by GET /metrics */\nexport interface WorkflowMetricsData {\n runs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n cancelled: number;\n };\n jobs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n };\n [key: string]: unknown;\n}\n\n/** Extended job status returned by GET /api/v1/jobs/:id — includes nested jobs/steps */\nexport interface JobStatusDetail extends Omit<JobStatusInfo, 'result'> {\n result?: {\n ok: boolean;\n summary?: string;\n error?: { code: string; message: string };\n };\n jobs?: Array<{\n id: string;\n name: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n error?: string;\n steps?: Array<{\n id: string;\n name: string;\n status: string;\n handler?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n outputs?: Record<string, unknown>;\n error?: { message?: string } | string;\n }>;\n }>;\n}\n\nconst DEFAULT_DAEMON_URL = 'http://localhost:7778';\n\nexport interface DaemonClientOptions {\n url?: string;\n}\n\n/**\n * Get workflow daemon URL from environment or default\n */\nexport function getWorkflowDaemonUrl(): string {\n return useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n}\n\nexport class WorkflowDaemonClient {\n private readonly baseUrl: string;\n\n constructor(options: DaemonClientOptions = {}) {\n this.baseUrl = options.url ?? useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n }\n\n /**\n * Validate response Content-Type and parse JSON safely\n */\n private async parseJsonResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n throw new Error(`Invalid Content-Type: expected application/json, got ${contentType}`);\n }\n return response.json() as Promise<T>;\n }\n\n private unwrapData<T>(payload: unknown): T {\n if (\n payload\n && typeof payload === 'object'\n && 'ok' in payload\n && (payload as { ok?: boolean }).ok === true\n && 'data' in payload\n ) {\n return (payload as { data: T }).data;\n }\n return payload as T;\n }\n\n /**\n * Validate and encode job ID to prevent path traversal attacks\n */\n private validateAndEncodeJobId(jobId: string): string {\n // Validate job ID format (alphanumeric, hyphens, underscores only)\n if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {\n throw new Error(`Invalid job ID format: ${jobId}`);\n }\n // Encode for URL safety (defense in depth)\n return encodeURIComponent(jobId);\n }\n\n /**\n * Health check\n */\n async health(): Promise<{ ok: boolean; service: string }> {\n const response = await fetch(`${this.baseUrl}/health`);\n if (!response.ok) {\n throw new Error(`Health check failed: ${response.statusText}`);\n }\n return this.parseJsonResponse(response);\n }\n\n /**\n * Get workflow metrics (raw metrics data from daemon)\n */\n async getMetrics(): Promise<WorkflowMetricsData> {\n const response = await fetch(`${this.baseUrl}/metrics`);\n if (!response.ok) {\n throw new Error(`Failed to get metrics: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<WorkflowMetricsData>(data);\n }\n\n /**\n * Get job status with full details (jobs, steps, outputs)\n */\n async getJobStatus(jobId: string): Promise<JobStatusDetail> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job status: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStatusDetail>(data);\n }\n\n /**\n * Get job steps with outputs\n */\n async getJobSteps(jobId: string): Promise<JobStepsResponse> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/steps`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job steps: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStepsResponse>(data);\n }\n\n /**\n * Get job logs\n */\n async getJobLogs(jobId: string): Promise<JobLogsResponse['logs']> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/logs`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<JobLogsResponse>(data);\n return unwrapped.logs ?? [];\n }\n\n /**\n * Get active executions\n */\n async getExecutions(): Promise<JobStatusInfo[]> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`);\n if (!response.ok) {\n throw new Error(`Failed to get executions: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ jobs?: JobStatusInfo[] }>(data);\n const jobs = unwrapped.jobs ?? [];\n return jobs.filter((job) => job.status === 'running' || job.status === 'pending');\n }\n\n /**\n * Get cron jobs\n */\n async getCronJobs(): Promise<CronListResponse> {\n const response = await fetch(`${this.baseUrl}/api/v1/cron`);\n if (!response.ok) {\n throw new Error(`Failed to get cron jobs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<CronListResponse>(data);\n }\n\n /**\n * Submit a job for execution\n */\n async submitJob(params: {\n handler: string;\n input?: unknown;\n priority?: number;\n }): Promise<{ id: string; status: string }> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type: params.handler,\n payload: params.input,\n priority: params.priority,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to submit job: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<unknown>(response);\n const data = this.unwrapData<{ jobId: string }>(payload);\n return { id: data.jobId, status: 'pending' };\n }\n\n /**\n * List workflow definitions, optionally filtered by source/status/tags\n */\n async listWorkflows(params: {\n source?: string;\n status?: string;\n tags?: string;\n } = {}): Promise<WorkflowInfo[]> {\n const query = new URLSearchParams();\n if (params.source) { query.set('source', params.source); }\n if (params.status) { query.set('status', params.status); }\n if (params.tags) { query.set('tags', params.tags); }\n\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/workflows${qs ? `?${qs}` : ''}`);\n if (!response.ok) {\n throw new Error(`Failed to list workflows: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<WorkflowListResponse>(data);\n return unwrapped.workflows ?? [];\n }\n\n /**\n * Get a specific workflow definition by ID\n */\n async getWorkflow(id: string): Promise<WorkflowInfo> {\n const encodedId = encodeURIComponent(id);\n const response = await fetch(`${this.baseUrl}/api/v1/workflows/${encodedId}`);\n if (response.status === 404) {\n throw new Error(`Workflow ${id} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get workflow: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<WorkflowInfo>(data);\n }\n\n /**\n * List workflow runs with optional status filter\n */\n async listRuns(params: {\n status?: string;\n limit?: number;\n workflowId?: string;\n } = {}): Promise<WorkflowRunSummary[]> {\n const query = new URLSearchParams();\n if (params.status) { query.set('status', params.status); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.workflowId) { query.set('workflowId', params.workflowId); }\n\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs${qs ? `?${qs}` : ''}`);\n if (!response.ok) {\n throw new Error(`Failed to list runs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ runs?: WorkflowRunSummary[] }>(data);\n return unwrapped.runs ?? (Array.isArray(data) ? data as WorkflowRunSummary[] : []);\n }\n\n /**\n * Get a specific workflow run with full detail\n */\n async getRun(runId: string): Promise<WorkflowRunDetail> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n // Response shape: { ok: true, data: { run: {...} } }\n const unwrapped = this.unwrapData<{ run?: WorkflowRunDetail } | WorkflowRunDetail>(data);\n return ('run' in (unwrapped as object) ? (unwrapped as { run: WorkflowRunDetail }).run : unwrapped) as WorkflowRunDetail;\n }\n\n /**\n * Get run logs, optionally filtered to failed steps only\n */\n async getRunLogs(runId: string, params: {\n stepId?: string;\n level?: string;\n limit?: number;\n failedOnly?: boolean;\n } = {}): Promise<Array<{ level: string; message: string; timestamp: string; stepId?: string; stepName?: string; stream?: string; [key: string]: unknown }>> {\n const query = new URLSearchParams();\n if (params.stepId) { query.set('stepId', params.stepId); }\n if (params.level) { query.set('level', params.level); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.failedOnly) { query.set('failedOnly', 'true'); }\n\n const encodedId = encodeURIComponent(runId);\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/logs${qs ? `?${qs}` : ''}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ logs?: unknown[] }>(data);\n return (unwrapped.logs ?? []) as Array<{ level: string; message: string; timestamp: string; [key: string]: unknown }>;\n }\n\n /**\n * Stream run events via SSE (returns a ReadableStream or EventSource-compatible URL)\n */\n getRunEventsUrl(runId: string): string {\n return `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/events`;\n }\n\n /**\n * List pending approval steps for a run\n */\n async listPendingApprovals(runId: string): Promise<{\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals`);\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to list pending approvals: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: {\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Resolve (approve or reject) a pending approval step\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n comment?: string,\n data?: Record<string, unknown>\n ): Promise<{ runId: string; jobId: string; stepId: string; action: string; resolved: boolean }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals/resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jobId, stepId, action, comment, data }),\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to resolve approval: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: { runId: string; jobId: string; stepId: string; action: string; resolved: boolean };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Cancel a workflow run\n */\n async cancelRun(runId: string): Promise<void> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/cancel`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to cancel run: ${message || response.statusText || response.status}`);\n }\n }\n\n /**\n * Run workflow by ID\n */\n async runWorkflow(\n workflowId: string,\n request: WorkflowRunRequest = {}\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/workflows/${encodeURIComponent(workflowId)}/runs`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to run workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Rerun a workflow run by ID, optionally only failed jobs\n */\n async rerunWorkflow(\n runId: string,\n request: WorkflowRerunRequest = {},\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/rerun`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to rerun workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Restart a run from a snapshot, optionally resuming from a specific step.\n * Preceding steps inherit their stored outputs; only the target step and beyond are re-executed.\n */\n async restartRun(\n runId: string,\n request: WorkflowRestartRequest = {},\n ): Promise<WorkflowRestartResponse> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/restart`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to restart run: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: WorkflowRestartResponse }>(response);\n return this.unwrapData<WorkflowRestartResponse>(payload);\n }\n}\n","/**\n * @module @kb-labs/workflow-cli/ws/logs-channel\n * WebSocket channel for real-time job logs streaming.\n *\n * Polls the workflow daemon REST API to stream logs to the client.\n * Uses HTTP polling instead of in-process ring buffer because the daemon\n * runs in a separate process and its logs are not shared via the ring buffer.\n */\n\nimport { defineWebSocket, defineMessage, MessageRouter } from '@kb-labs/sdk';\nimport type { WSMessage } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client.js';\n\nconst POLL_INTERVAL_MS = 1_500;\n\n// Define typed messages\nconst SubscribeMsg = defineMessage<{ jobId: string; level?: string }>(\n 'subscribe',\n);\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nconst UnsubscribeMsg = defineMessage<{}>('unsubscribe');\n\nconst LogMsg = defineMessage<{\n timestamp: string;\n level: 'info' | 'warn' | 'error' | 'debug';\n message: string;\n context?: Record<string, unknown>;\n}>('log');\n\nconst ErrorMsg = defineMessage<{\n error: string;\n code: 'NOT_FOUND' | 'DEPENDENCY_UNAVAILABLE';\n}>('error');\n\ntype Incoming =\n | ReturnType<typeof SubscribeMsg.create>\n | ReturnType<typeof UnsubscribeMsg.create>;\n\ntype Outgoing =\n | ReturnType<typeof LogMsg.create>\n | ReturnType<typeof ErrorMsg.create>;\n\n// Module-level state keyed by ctx.requestId (stable per WS connection)\nconst pollingTimers = new Map<string, ReturnType<typeof setInterval>>();\nconst logOffsets = new Map<string, number>();\n// \"active\" gate. Set on subscribe, cleared on unsubscribe/disconnect. The\n// polling callback is async — clearInterval stops future ticks but cannot\n// cancel an in-flight `await fetchLogs(...)`. The poll body must consult\n// this gate before sending so a late-resolving fetch from a just-stopped\n// subscription doesn't emit one stray log after unsubscribe (WS-L04).\nconst activeSubscriptions = new Set<string>();\n\ntype DaemonLog = {\n timestamp: string;\n level: string;\n message: string;\n context?: Record<string, unknown>;\n};\n\ntype ExistenceProbe =\n | { exists: true }\n | { exists: false; unavailable?: boolean };\n\nfunction normalizeLevel(level: string): 'info' | 'warn' | 'error' | 'debug' {\n switch (level) {\n case 'trace':\n case 'debug':\n return 'debug';\n case 'warn':\n return 'warn';\n case 'error':\n case 'fatal':\n return 'error';\n default:\n return 'info';\n }\n}\n\nfunction levelMatches(logLevel: string, filterLevel?: string): boolean {\n if (!filterLevel || filterLevel === 'all') {\n return true;\n }\n const levelOrder: Record<string, number> = {\n debug: 0,\n trace: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 3,\n };\n return (levelOrder[logLevel] ?? 1) >= (levelOrder[filterLevel] ?? 0);\n}\n\nasync function fetchLogs(\n runId: string,\n offset: number,\n level?: string,\n): Promise<DaemonLog[]> {\n const daemonUrl = getWorkflowDaemonUrl();\n const params = new URLSearchParams({ limit: '200', offset: String(offset) });\n if (level) {\n params.set('level', level);\n }\n const url = `${daemonUrl}/api/v1/runs/${encodeURIComponent(runId)}/logs?${params}`;\n const res = await fetch(url);\n if (!res.ok) {\n return [];\n }\n const body = (await res.json()) as {\n ok?: boolean;\n data?: { logs?: DaemonLog[] };\n };\n return body?.data?.logs ?? [];\n}\n\nasync function checkRunExists(runId: string): Promise<ExistenceProbe> {\n const daemonUrl = getWorkflowDaemonUrl();\n try {\n const res = await fetch(\n `${daemonUrl}/api/v1/runs/${encodeURIComponent(runId)}`,\n );\n if (res.status === 404) {\n return { exists: false };\n }\n if (!res.ok) {\n return { exists: false, unavailable: true };\n }\n return { exists: true };\n } catch {\n return { exists: false, unavailable: true };\n }\n}\n\nfunction clearConnection(connectionId: string): void {\n activeSubscriptions.delete(connectionId);\n const timer = pollingTimers.get(connectionId);\n if (timer) {\n clearInterval(timer);\n pollingTimers.delete(connectionId);\n }\n logOffsets.delete(connectionId);\n}\n\nexport default defineWebSocket<unknown, Incoming, Outgoing>({\n path: '/logs/:runId',\n description: 'Real-time job logs streaming',\n\n handler: {\n async onConnect(ctx, _sender) {\n ctx.platform.logger.info('[logs-channel] Client connected', {\n connectionId: ctx.requestId,\n });\n },\n\n async onMessage(ctx, message, sender) {\n const connectionId = ctx.requestId;\n\n const router = new MessageRouter()\n .on(SubscribeMsg, async (_ctx, payload) => {\n const { jobId: runId, level } = payload;\n\n // Validate run exists before subscribing\n const probe = await checkRunExists(runId);\n if (!probe.exists) {\n const code = probe.unavailable\n ? 'DEPENDENCY_UNAVAILABLE'\n : 'NOT_FOUND';\n const error = probe.unavailable\n ? 'Workflow daemon is unavailable; logs cannot be subscribed right now'\n : `Run ${runId} not found`;\n await sender.send(ErrorMsg.create({ error, code }));\n sender.close(probe.unavailable ? 1013 : 1008, code);\n return;\n }\n\n // Clear any existing subscription, then mark active.\n clearConnection(connectionId);\n logOffsets.set(connectionId, 0);\n activeSubscriptions.add(connectionId);\n\n // Backfill semantics: send only the MOST RECENT existing log as a\n // \"current state\" hint, then advance offset past all existing logs\n // so polling streams strictly new entries.\n //\n // Why not replay everything: callers that immediately unsubscribe\n // after the first log (WS-L04 pattern: \"verify unsubscribe stops\n // the stream\") would otherwise see additional pre-buffered logs\n // arrive after unsubscribe — the bytes already left the socket\n // before activeSubscriptions could gate them out. A single-entry\n // backfill aligns with `tail -f` semantics and keeps the\n // subscribe-then-unsubscribe contract deterministic. Consumers\n // that need full history can fetch it via the daemon's REST\n // /api/v1/runs/:runId/logs endpoint directly.\n const initialLogs = await fetchLogs(runId, 0, level).catch(\n () => [] as DaemonLog[],\n );\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n const tail = initialLogs.slice(-1);\n for (const log of tail) {\n if (!levelMatches(log.level, level)) {\n continue;\n }\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n await sender.send(\n LogMsg.create({\n timestamp: log.timestamp,\n level: normalizeLevel(log.level),\n message: log.message,\n context: log.context,\n }),\n );\n }\n logOffsets.set(connectionId, initialLogs.length);\n\n // Poll for new logs. The poll body is async, so clearInterval cannot\n // cancel an in-flight tick — gate every send on activeSubscriptions\n // so a late fetch resolving after unsubscribe stays silent.\n const timer = setInterval(async () => {\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n const currentOffset = logOffsets.get(connectionId) ?? 0;\n const newLogs = await fetchLogs(runId, currentOffset, level).catch(\n () => [] as DaemonLog[],\n );\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n if (newLogs.length === 0) {\n return;\n }\n for (const log of newLogs) {\n if (!levelMatches(log.level, level)) {\n continue;\n }\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n await sender\n .send(\n LogMsg.create({\n timestamp: log.timestamp,\n level: normalizeLevel(log.level),\n message: log.message,\n context: log.context,\n }),\n )\n .catch(() => {\n /* socket may have closed */\n });\n }\n logOffsets.set(connectionId, currentOffset + newLogs.length);\n }, POLL_INTERVAL_MS);\n\n pollingTimers.set(connectionId, timer);\n })\n .on(UnsubscribeMsg, async (_ctx) => {\n // Stop the polling timer and clear offsets. No confirmation\n // message is emitted on purpose: clients use unsubscribe to\n // expect a quiet stream, and emitting a synthetic LogMsg here\n // would surface as a new log to consumers like WS-L04.\n clearConnection(connectionId);\n });\n\n await router.handle(ctx, message as WSMessage, sender.raw);\n },\n\n async onDisconnect(ctx, _code, _reason) {\n clearConnection(ctx.requestId);\n ctx.platform.logger.info('[logs-channel] Client disconnected', {\n connectionId: ctx.requestId,\n });\n },\n\n async onError(ctx, error, sender) {\n ctx.platform.logger.error('[logs-channel] Error', error);\n clearConnection(ctx.requestId);\n try {\n await sender.send(\n ErrorMsg.create({\n error: error.message,\n code: 'DEPENDENCY_UNAVAILABLE',\n }),\n );\n } catch {\n // socket may be closed\n }\n },\n },\n});\n\nexport { normalizeLevel, levelMatches };\n"]}
1
+ {"version":3,"sources":["../../src/http-client.ts","../../src/ws/logs-channel.ts"],"names":[],"mappings":"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","file":"logs-channel.js","sourcesContent":["/**\n * HTTP client for interacting with Workflow Daemon\n */\nimport type {\n WorkflowRerunRequest,\n WorkflowRestartRequest,\n WorkflowRestartResponse,\n WorkflowRunRequest,\n JobStatusInfo,\n JobStepsResponse,\n JobLogsResponse,\n CronListResponse,\n WorkflowInfo,\n WorkflowListResponse,\n} from '@kb-labs/workflow-contracts';\nimport { useEnv } from '@kb-labs/sdk';\n\n/** Workflow run summary returned by GET /api/v1/runs */\nexport interface WorkflowRunSummary {\n id: string;\n name: string;\n version?: string;\n status: 'queued' | 'running' | 'success' | 'failed' | 'cancelled';\n trigger?: {\n type: string;\n actor?: string;\n payload?: unknown;\n parentRunId?: string;\n parentJobId?: string;\n parentStepId?: string;\n };\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n inputs?: Record<string, unknown>;\n hasPendingApproval?: boolean;\n currentStepName?: string;\n}\n\n/** Full workflow run detail returned by GET /api/v1/runs/:runId */\nexport interface WorkflowRunDetail extends WorkflowRunSummary {\n env?: Record<string, string>;\n metadata?: Record<string, unknown>;\n result?: {\n status: string;\n summary?: string;\n error?: { message: string; code?: string };\n outputs?: Record<string, unknown>;\n };\n jobs?: Array<{\n id: string;\n jobName?: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n error?: { message: string; code?: string; stack?: string } | string;\n steps?: Array<{\n id: string;\n name?: string;\n index?: number;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n outputs?: Record<string, unknown>;\n resolvedInputs?: Record<string, unknown>;\n error?: { message: string; code?: string; details?: Record<string, unknown> } | string;\n spec?: Record<string, unknown>;\n }>;\n }>;\n}\n\n/** Metrics data returned by GET /metrics */\nexport interface WorkflowMetricsData {\n runs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n cancelled: number;\n };\n jobs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n };\n [key: string]: unknown;\n}\n\n/** Extended job status returned by GET /api/v1/jobs/:id — includes nested jobs/steps */\nexport interface JobStatusDetail extends Omit<JobStatusInfo, 'result'> {\n result?: {\n ok: boolean;\n summary?: string;\n error?: { code: string; message: string };\n };\n jobs?: Array<{\n id: string;\n name: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n error?: string;\n steps?: Array<{\n id: string;\n name: string;\n status: string;\n handler?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n outputs?: Record<string, unknown>;\n error?: { message?: string } | string;\n }>;\n }>;\n}\n\nconst DEFAULT_DAEMON_URL = 'http://localhost:7778';\n\nexport interface DaemonClientOptions {\n url?: string;\n}\n\n/**\n * Get workflow daemon URL from environment or default\n */\nexport function getWorkflowDaemonUrl(): string {\n return useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n}\n\nexport class WorkflowDaemonClient {\n private readonly baseUrl: string;\n\n constructor(options: DaemonClientOptions = {}) {\n this.baseUrl = options.url ?? useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n }\n\n /**\n * Validate response Content-Type and parse JSON safely\n */\n private async parseJsonResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n throw new Error(`Invalid Content-Type: expected application/json, got ${contentType}`);\n }\n return response.json() as Promise<T>;\n }\n\n private unwrapData<T>(payload: unknown): T {\n if (\n payload\n && typeof payload === 'object'\n && 'ok' in payload\n && (payload as { ok?: boolean }).ok === true\n && 'data' in payload\n ) {\n return (payload as { data: T }).data;\n }\n return payload as T;\n }\n\n /**\n * Validate and encode job ID to prevent path traversal attacks\n */\n private validateAndEncodeJobId(jobId: string): string {\n // Validate job ID format (alphanumeric, hyphens, underscores only)\n if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {\n throw new Error(`Invalid job ID format: ${jobId}`);\n }\n // Encode for URL safety (defense in depth)\n return encodeURIComponent(jobId);\n }\n\n /**\n * Health check\n */\n async health(): Promise<{ ok: boolean; service: string }> {\n const response = await fetch(`${this.baseUrl}/health`);\n if (!response.ok) {\n throw new Error(`Health check failed: ${response.statusText}`);\n }\n return this.parseJsonResponse(response);\n }\n\n /**\n * Get workflow metrics (raw metrics data from daemon)\n */\n async getMetrics(): Promise<WorkflowMetricsData> {\n const response = await fetch(`${this.baseUrl}/metrics`);\n if (!response.ok) {\n throw new Error(`Failed to get metrics: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<WorkflowMetricsData>(data);\n }\n\n /**\n * Get job status with full details (jobs, steps, outputs)\n */\n async getJobStatus(jobId: string): Promise<JobStatusDetail> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job status: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStatusDetail>(data);\n }\n\n /**\n * Get job steps with outputs\n */\n async getJobSteps(jobId: string): Promise<JobStepsResponse> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/steps`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job steps: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStepsResponse>(data);\n }\n\n /**\n * Get job logs\n */\n async getJobLogs(jobId: string): Promise<JobLogsResponse['logs']> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/logs`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<JobLogsResponse>(data);\n return unwrapped.logs ?? [];\n }\n\n /**\n * Get active executions\n */\n async getExecutions(): Promise<JobStatusInfo[]> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`);\n if (!response.ok) {\n throw new Error(`Failed to get executions: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ jobs?: JobStatusInfo[] }>(data);\n const jobs = unwrapped.jobs ?? [];\n return jobs.filter((job) => job.status === 'running' || job.status === 'pending');\n }\n\n /**\n * Get cron jobs\n */\n async getCronJobs(): Promise<CronListResponse> {\n const response = await fetch(`${this.baseUrl}/api/v1/cron`);\n if (!response.ok) {\n throw new Error(`Failed to get cron jobs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<CronListResponse>(data);\n }\n\n /**\n * Submit a job for execution\n */\n async submitJob(params: {\n handler: string;\n input?: unknown;\n priority?: number;\n }): Promise<{ id: string; status: string }> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type: params.handler,\n payload: params.input,\n priority: params.priority,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to submit job: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<unknown>(response);\n const data = this.unwrapData<{ jobId: string }>(payload);\n return { id: data.jobId, status: 'pending' };\n }\n\n /**\n * List workflow definitions, optionally filtered by source/status/tags\n */\n async listWorkflows(params: {\n source?: string;\n status?: string;\n tags?: string;\n } = {}): Promise<WorkflowInfo[]> {\n const query = new URLSearchParams();\n if (params.source) { query.set('source', params.source); }\n if (params.status) { query.set('status', params.status); }\n if (params.tags) { query.set('tags', params.tags); }\n\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/workflows${qs ? `?${qs}` : ''}`);\n if (!response.ok) {\n throw new Error(`Failed to list workflows: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<WorkflowListResponse>(data);\n return unwrapped.workflows ?? [];\n }\n\n /**\n * Get a specific workflow definition by ID\n */\n async getWorkflow(id: string): Promise<WorkflowInfo> {\n const encodedId = encodeURIComponent(id);\n const response = await fetch(`${this.baseUrl}/api/v1/workflows/${encodedId}`);\n if (response.status === 404) {\n throw new Error(`Workflow ${id} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get workflow: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<WorkflowInfo>(data);\n }\n\n /**\n * List workflow runs with optional status filter\n */\n async listRuns(params: {\n status?: string;\n limit?: number;\n workflowId?: string;\n } = {}): Promise<WorkflowRunSummary[]> {\n const query = new URLSearchParams();\n if (params.status) { query.set('status', params.status); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.workflowId) { query.set('workflowId', params.workflowId); }\n\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs${qs ? `?${qs}` : ''}`);\n if (!response.ok) {\n throw new Error(`Failed to list runs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ runs?: WorkflowRunSummary[] }>(data);\n return unwrapped.runs ?? (Array.isArray(data) ? data as WorkflowRunSummary[] : []);\n }\n\n /**\n * Get a specific workflow run with full detail\n */\n async getRun(runId: string): Promise<WorkflowRunDetail> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n // Response shape: { ok: true, data: { run: {...} } }\n const unwrapped = this.unwrapData<{ run?: WorkflowRunDetail } | WorkflowRunDetail>(data);\n return ('run' in (unwrapped as object) ? (unwrapped as { run: WorkflowRunDetail }).run : unwrapped) as WorkflowRunDetail;\n }\n\n /**\n * Get run logs, optionally filtered to failed steps only\n */\n async getRunLogs(runId: string, params: {\n stepId?: string;\n level?: string;\n limit?: number;\n failedOnly?: boolean;\n } = {}): Promise<Array<{ level: string; message: string; timestamp: string; stepId?: string; stepName?: string; stream?: string; [key: string]: unknown }>> {\n const query = new URLSearchParams();\n if (params.stepId) { query.set('stepId', params.stepId); }\n if (params.level) { query.set('level', params.level); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.failedOnly) { query.set('failedOnly', 'true'); }\n\n const encodedId = encodeURIComponent(runId);\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/logs${qs ? `?${qs}` : ''}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ logs?: unknown[] }>(data);\n return (unwrapped.logs ?? []) as Array<{ level: string; message: string; timestamp: string; [key: string]: unknown }>;\n }\n\n /**\n * Stream run events via SSE (returns a ReadableStream or EventSource-compatible URL)\n */\n getRunEventsUrl(runId: string): string {\n return `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/events`;\n }\n\n /**\n * List pending approval steps for a run\n */\n async listPendingApprovals(runId: string): Promise<{\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals`);\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to list pending approvals: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: {\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Resolve (approve or reject) a pending approval step\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n comment?: string,\n data?: Record<string, unknown>\n ): Promise<{ runId: string; jobId: string; stepId: string; action: string; resolved: boolean }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals/resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jobId, stepId, action, comment, data }),\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to resolve approval: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: { runId: string; jobId: string; stepId: string; action: string; resolved: boolean };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Cancel a workflow run\n */\n async cancelRun(runId: string): Promise<void> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/cancel`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to cancel run: ${message || response.statusText || response.status}`);\n }\n }\n\n /**\n * Run workflow by ID\n */\n async runWorkflow(\n workflowId: string,\n request: WorkflowRunRequest = {}\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/workflows/${encodeURIComponent(workflowId)}/runs`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to run workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Rerun a workflow run by ID, optionally only failed jobs\n */\n async rerunWorkflow(\n runId: string,\n request: WorkflowRerunRequest = {},\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/rerun`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to rerun workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Restart a run from a snapshot, optionally resuming from a specific step.\n * Preceding steps inherit their stored outputs; only the target step and beyond are re-executed.\n */\n async restartRun(\n runId: string,\n request: WorkflowRestartRequest = {},\n ): Promise<WorkflowRestartResponse> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/restart`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to restart run: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: WorkflowRestartResponse }>(response);\n return this.unwrapData<WorkflowRestartResponse>(payload);\n }\n}\n","/**\n * @module @kb-labs/workflow-cli/ws/logs-channel\n * WebSocket channel for real-time job logs streaming.\n *\n * Polls the workflow daemon REST API to stream logs to the client.\n * Uses HTTP polling instead of in-process ring buffer because the daemon\n * runs in a separate process and its logs are not shared via the ring buffer.\n */\n\nimport { defineWebSocket, defineMessage, MessageRouter } from '@kb-labs/sdk';\nimport type { WSMessage } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client.js';\n\nconst POLL_INTERVAL_MS = 1_500;\n\n// Define typed messages\nconst SubscribeMsg = defineMessage<{ jobId: string; level?: string }>(\n 'subscribe',\n);\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nconst UnsubscribeMsg = defineMessage<{}>('unsubscribe');\n\nconst LogMsg = defineMessage<{\n timestamp: string;\n level: 'info' | 'warn' | 'error' | 'debug';\n message: string;\n context?: Record<string, unknown>;\n}>('log');\n\nconst ErrorMsg = defineMessage<{\n error: string;\n code: 'NOT_FOUND' | 'DEPENDENCY_UNAVAILABLE';\n}>('error');\n\ntype Incoming =\n | ReturnType<typeof SubscribeMsg.create>\n | ReturnType<typeof UnsubscribeMsg.create>;\n\ntype Outgoing =\n | ReturnType<typeof LogMsg.create>\n | ReturnType<typeof ErrorMsg.create>;\n\n// Module-level state keyed by ctx.requestId (stable per WS connection)\nconst pollingTimers = new Map<string, ReturnType<typeof setInterval>>();\nconst logOffsets = new Map<string, number>();\n// \"active\" gate. Set on subscribe, cleared on unsubscribe/disconnect. The\n// polling callback is async — clearInterval stops future ticks but cannot\n// cancel an in-flight `await fetchLogs(...)`. The poll body must consult\n// this gate before sending so a late-resolving fetch from a just-stopped\n// subscription doesn't emit one stray log after unsubscribe (WS-L04).\nconst activeSubscriptions = new Set<string>();\n\ntype DaemonLog = {\n timestamp: string;\n level: string;\n message: string;\n context?: Record<string, unknown>;\n};\n\ntype ExistenceProbe =\n | { exists: true }\n | { exists: false; unavailable?: boolean };\n\nfunction normalizeLevel(level: string): 'info' | 'warn' | 'error' | 'debug' {\n switch (level) {\n case 'trace':\n case 'debug':\n return 'debug';\n case 'warn':\n return 'warn';\n case 'error':\n case 'fatal':\n return 'error';\n default:\n return 'info';\n }\n}\n\nfunction levelMatches(logLevel: string, filterLevel?: string): boolean {\n if (!filterLevel || filterLevel === 'all') {\n return true;\n }\n const levelOrder: Record<string, number> = {\n debug: 0,\n trace: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 3,\n };\n return (levelOrder[logLevel] ?? 1) >= (levelOrder[filterLevel] ?? 0);\n}\n\nasync function fetchLogs(\n runId: string,\n offset: number,\n level?: string,\n): Promise<DaemonLog[]> {\n const daemonUrl = getWorkflowDaemonUrl();\n const params = new URLSearchParams({ limit: '200', offset: String(offset) });\n if (level) {\n params.set('level', level);\n }\n const url = `${daemonUrl}/api/v1/runs/${encodeURIComponent(runId)}/logs?${params}`;\n const res = await fetch(url);\n if (!res.ok) {\n return [];\n }\n const body = (await res.json()) as {\n ok?: boolean;\n data?: { logs?: DaemonLog[] };\n };\n return body?.data?.logs ?? [];\n}\n\nasync function checkRunExists(runId: string): Promise<ExistenceProbe> {\n const daemonUrl = getWorkflowDaemonUrl();\n try {\n const res = await fetch(\n `${daemonUrl}/api/v1/runs/${encodeURIComponent(runId)}`,\n );\n if (res.status === 404) {\n return { exists: false };\n }\n if (!res.ok) {\n return { exists: false, unavailable: true };\n }\n return { exists: true };\n } catch {\n return { exists: false, unavailable: true };\n }\n}\n\nfunction clearConnection(connectionId: string): void {\n activeSubscriptions.delete(connectionId);\n const timer = pollingTimers.get(connectionId);\n if (timer) {\n clearInterval(timer);\n pollingTimers.delete(connectionId);\n }\n logOffsets.delete(connectionId);\n}\n\nexport default defineWebSocket<unknown, Incoming, Outgoing>({\n path: '/logs/:runId',\n description: 'Real-time job logs streaming',\n\n handler: {\n async onConnect(ctx, _sender) {\n ctx.platform.logger.info('[logs-channel] Client connected', {\n connectionId: ctx.requestId,\n });\n },\n\n async onMessage(ctx, message, sender) {\n const connectionId = ctx.requestId;\n\n const router = new MessageRouter()\n .on(SubscribeMsg, async (_ctx, payload) => {\n const { jobId: runId, level } = payload;\n\n // Validate run exists before subscribing\n const probe = await checkRunExists(runId);\n if (!probe.exists) {\n const code = probe.unavailable\n ? 'DEPENDENCY_UNAVAILABLE'\n : 'NOT_FOUND';\n const error = probe.unavailable\n ? 'Workflow daemon is unavailable; logs cannot be subscribed right now'\n : `Run ${runId} not found`;\n await sender.send(ErrorMsg.create({ error, code }));\n sender.close(probe.unavailable ? 1013 : 1008, code);\n return;\n }\n\n // Clear any existing subscription, then mark active.\n clearConnection(connectionId);\n logOffsets.set(connectionId, 0);\n activeSubscriptions.add(connectionId);\n\n // Backfill semantics: send only the MOST RECENT existing log as a\n // \"current state\" hint, then advance offset past all existing logs\n // so polling streams strictly new entries.\n //\n // Why not replay everything: callers that immediately unsubscribe\n // after the first log (WS-L04 pattern: \"verify unsubscribe stops\n // the stream\") would otherwise see additional pre-buffered logs\n // arrive after unsubscribe — the bytes already left the socket\n // before activeSubscriptions could gate them out. A single-entry\n // backfill aligns with `tail -f` semantics and keeps the\n // subscribe-then-unsubscribe contract deterministic. Consumers\n // that need full history can fetch it via the daemon's REST\n // /api/v1/runs/:runId/logs endpoint directly.\n const initialLogs = await fetchLogs(runId, 0, level).catch(\n () => [] as DaemonLog[],\n );\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n const tail = initialLogs.slice(-1);\n for (const log of tail) {\n if (!levelMatches(log.level, level)) {\n continue;\n }\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n await sender.send(\n LogMsg.create({\n timestamp: log.timestamp,\n level: normalizeLevel(log.level),\n message: log.message,\n context: log.context,\n }),\n );\n }\n logOffsets.set(connectionId, initialLogs.length);\n\n // Poll for new logs. The poll body is async, so clearInterval cannot\n // cancel an in-flight tick — gate every send on activeSubscriptions\n // so a late fetch resolving after unsubscribe stays silent.\n const timer = setInterval(async () => {\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n const currentOffset = logOffsets.get(connectionId) ?? 0;\n const newLogs = await fetchLogs(runId, currentOffset, level).catch(\n () => [] as DaemonLog[],\n );\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n if (newLogs.length === 0) {\n return;\n }\n for (const log of newLogs) {\n if (!levelMatches(log.level, level)) {\n continue;\n }\n if (!activeSubscriptions.has(connectionId)) {\n return;\n }\n await sender\n .send(\n LogMsg.create({\n timestamp: log.timestamp,\n level: normalizeLevel(log.level),\n message: log.message,\n context: log.context,\n }),\n )\n .catch(() => {\n /* socket may have closed */\n });\n }\n logOffsets.set(connectionId, currentOffset + newLogs.length);\n }, POLL_INTERVAL_MS);\n\n pollingTimers.set(connectionId, timer);\n })\n .on(UnsubscribeMsg, async (_ctx) => {\n // Stop the polling timer and clear offsets. No confirmation\n // message is emitted on purpose: clients use unsubscribe to\n // expect a quiet stream, and emitting a synthetic LogMsg here\n // would surface as a new log to consumers like WS-L04.\n clearConnection(connectionId);\n });\n\n await router.handle(ctx, message as WSMessage, sender.raw);\n },\n\n async onDisconnect(ctx, _code, _reason) {\n clearConnection(ctx.requestId);\n ctx.platform.logger.info('[logs-channel] Client disconnected', {\n connectionId: ctx.requestId,\n });\n },\n\n async onError(ctx, error, sender) {\n ctx.platform.logger.error('[logs-channel] Error', error);\n clearConnection(ctx.requestId);\n try {\n await sender.send(\n ErrorMsg.create({\n error: error.message,\n code: 'DEPENDENCY_UNAVAILABLE',\n }),\n );\n } catch {\n // socket may be closed\n }\n },\n },\n});\n\nexport { normalizeLevel, levelMatches };\n"]}