@makeshkumar/blueorch-studio 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/bin/cli.js +69 -0
  2. package/cache-manager.js +191 -0
  3. package/chat.routes.js +691 -0
  4. package/llm.routes.js +285 -0
  5. package/log.routes.js +42 -0
  6. package/logger.js +86 -0
  7. package/mcp.routes.js +320 -0
  8. package/package.json +37 -0
  9. package/public/3rdpartylicenses.txt +416 -0
  10. package/public/browser/assets/monaco/_commonjsHelpers-CT9FvmAN.js +1 -0
  11. package/public/browser/assets/monaco/abap-D-t0cyap.js +1 -0
  12. package/public/browser/assets/monaco/apex-CcIm7xu6.js +1 -0
  13. package/public/browser/assets/monaco/assets/css.worker-HnVq6Ewq.js +93 -0
  14. package/public/browser/assets/monaco/assets/editor.worker-Be8ye1pW.js +26 -0
  15. package/public/browser/assets/monaco/assets/html.worker-B51mlPHg.js +470 -0
  16. package/public/browser/assets/monaco/assets/json.worker-DKiEKt88.js +58 -0
  17. package/public/browser/assets/monaco/assets/ts.worker-CMbG-7ft.js +67731 -0
  18. package/public/browser/assets/monaco/azcli-BA0tQDCg.js +1 -0
  19. package/public/browser/assets/monaco/basic-languages/monaco.contribution.js +1 -0
  20. package/public/browser/assets/monaco/bat-C397hTD6.js +1 -0
  21. package/public/browser/assets/monaco/bicep-DF5aW17k.js +2 -0
  22. package/public/browser/assets/monaco/cameligo-plsz8qhj.js +1 -0
  23. package/public/browser/assets/monaco/clojure-Y2auQMzK.js +1 -0
  24. package/public/browser/assets/monaco/coffee-Bu45yuWE.js +1 -0
  25. package/public/browser/assets/monaco/cpp-CkKPQIni.js +1 -0
  26. package/public/browser/assets/monaco/csharp-CX28MZyh.js +1 -0
  27. package/public/browser/assets/monaco/csp-D8uWnyxW.js +1 -0
  28. package/public/browser/assets/monaco/css-CaeNmE3S.js +3 -0
  29. package/public/browser/assets/monaco/cssMode-CjiAH6dQ.js +1 -0
  30. package/public/browser/assets/monaco/cypher-DVThT8BS.js +1 -0
  31. package/public/browser/assets/monaco/dart-CmGfCvrO.js +1 -0
  32. package/public/browser/assets/monaco/dockerfile-CZqqYdch.js +1 -0
  33. package/public/browser/assets/monaco/ecl-30fUercY.js +1 -0
  34. package/public/browser/assets/monaco/editor/editor.main.css +1 -0
  35. package/public/browser/assets/monaco/editor/editor.main.js +5 -0
  36. package/public/browser/assets/monaco/editor.api-CalNCsUg.js +903 -0
  37. package/public/browser/assets/monaco/elixir-xjPaIfzF.js +1 -0
  38. package/public/browser/assets/monaco/flow9-DqtmStfK.js +1 -0
  39. package/public/browser/assets/monaco/freemarker2-Cz_sV6Md.js +3 -0
  40. package/public/browser/assets/monaco/fsharp-BOMdg4U1.js +1 -0
  41. package/public/browser/assets/monaco/go-D_hbi-Jt.js +1 -0
  42. package/public/browser/assets/monaco/graphql-CKUU4kLG.js +1 -0
  43. package/public/browser/assets/monaco/handlebars-OwglfO-1.js +1 -0
  44. package/public/browser/assets/monaco/hcl-DTaboeZW.js +1 -0
  45. package/public/browser/assets/monaco/html-Pa1xEWsY.js +1 -0
  46. package/public/browser/assets/monaco/htmlMode-Bz67EXwp.js +1 -0
  47. package/public/browser/assets/monaco/ini-CsNwO04R.js +1 -0
  48. package/public/browser/assets/monaco/java-CI4ZMsH9.js +1 -0
  49. package/public/browser/assets/monaco/javascript-PczUCGdz.js +1 -0
  50. package/public/browser/assets/monaco/jsonMode-DULH5oaX.js +7 -0
  51. package/public/browser/assets/monaco/julia-BwzEvaQw.js +1 -0
  52. package/public/browser/assets/monaco/kotlin-IUYPiTV8.js +1 -0
  53. package/public/browser/assets/monaco/language/css/monaco.contribution.js +1 -0
  54. package/public/browser/assets/monaco/language/html/monaco.contribution.js +1 -0
  55. package/public/browser/assets/monaco/language/json/monaco.contribution.js +1 -0
  56. package/public/browser/assets/monaco/language/typescript/monaco.contribution.js +1 -0
  57. package/public/browser/assets/monaco/less-C0eDYdqa.js +2 -0
  58. package/public/browser/assets/monaco/lexon-iON-Kj97.js +1 -0
  59. package/public/browser/assets/monaco/liquid-DqKjdPGy.js +1 -0
  60. package/public/browser/assets/monaco/loader.js +1368 -0
  61. package/public/browser/assets/monaco/lspLanguageFeatures-kM9O9rjY.js +4 -0
  62. package/public/browser/assets/monaco/lua-DtygF91M.js +1 -0
  63. package/public/browser/assets/monaco/m3-CsR4AuFi.js +1 -0
  64. package/public/browser/assets/monaco/markdown-C_rD0bIw.js +1 -0
  65. package/public/browser/assets/monaco/mdx-DEWtB1K5.js +1 -0
  66. package/public/browser/assets/monaco/mips-CiYP61RB.js +1 -0
  67. package/public/browser/assets/monaco/monaco.contribution-D2OdxNBt.js +1 -0
  68. package/public/browser/assets/monaco/monaco.contribution-DO3azKX8.js +1 -0
  69. package/public/browser/assets/monaco/monaco.contribution-EcChJV6a.js +1 -0
  70. package/public/browser/assets/monaco/monaco.contribution-qLAYrEOP.js +1 -0
  71. package/public/browser/assets/monaco/msdax-C38-sJlp.js +1 -0
  72. package/public/browser/assets/monaco/mysql-CdtbpvbG.js +1 -0
  73. package/public/browser/assets/monaco/nls.messages-loader.js +1 -0
  74. package/public/browser/assets/monaco/nls.messages.cs.js.js +17 -0
  75. package/public/browser/assets/monaco/nls.messages.de.js.js +17 -0
  76. package/public/browser/assets/monaco/nls.messages.es.js.js +17 -0
  77. package/public/browser/assets/monaco/nls.messages.fr.js.js +15 -0
  78. package/public/browser/assets/monaco/nls.messages.it.js.js +15 -0
  79. package/public/browser/assets/monaco/nls.messages.ja.js.js +17 -0
  80. package/public/browser/assets/monaco/nls.messages.js.js +10 -0
  81. package/public/browser/assets/monaco/nls.messages.ko.js.js +25 -0
  82. package/public/browser/assets/monaco/nls.messages.pl.js.js +17 -0
  83. package/public/browser/assets/monaco/nls.messages.pt-br.js.js +6 -0
  84. package/public/browser/assets/monaco/nls.messages.ru.js.js +17 -0
  85. package/public/browser/assets/monaco/nls.messages.tr.js.js +15 -0
  86. package/public/browser/assets/monaco/nls.messages.zh-cn.js.js +17 -0
  87. package/public/browser/assets/monaco/nls.messages.zh-tw.js.js +15 -0
  88. package/public/browser/assets/monaco/objective-c-CntZFaHX.js +1 -0
  89. package/public/browser/assets/monaco/pascal-r6kuqfl_.js +1 -0
  90. package/public/browser/assets/monaco/pascaligo-BiXoTmXh.js +1 -0
  91. package/public/browser/assets/monaco/perl-DABw_TcH.js +1 -0
  92. package/public/browser/assets/monaco/pgsql-me_jFXeX.js +1 -0
  93. package/public/browser/assets/monaco/php-D_kh-9LK.js +1 -0
  94. package/public/browser/assets/monaco/pla-VfZjczW0.js +1 -0
  95. package/public/browser/assets/monaco/postiats-BBSzz8Pk.js +1 -0
  96. package/public/browser/assets/monaco/powerquery-Dt-g_2cc.js +1 -0
  97. package/public/browser/assets/monaco/powershell-B-7ap1zc.js +1 -0
  98. package/public/browser/assets/monaco/protobuf-BmtuEB1A.js +2 -0
  99. package/public/browser/assets/monaco/pug-BRpRNeEb.js +1 -0
  100. package/public/browser/assets/monaco/python-Cr0UkIbn.js +1 -0
  101. package/public/browser/assets/monaco/qsharp-BzsFaUU9.js +1 -0
  102. package/public/browser/assets/monaco/r-f8dDdrp4.js +1 -0
  103. package/public/browser/assets/monaco/razor-BYAHOTkz.js +1 -0
  104. package/public/browser/assets/monaco/redis-fvZQY4PI.js +1 -0
  105. package/public/browser/assets/monaco/redshift-45Et0LQi.js +1 -0
  106. package/public/browser/assets/monaco/restructuredtext-C7UUFKFD.js +1 -0
  107. package/public/browser/assets/monaco/ruby-CZO8zYTz.js +1 -0
  108. package/public/browser/assets/monaco/rust-Bfetafyc.js +1 -0
  109. package/public/browser/assets/monaco/sb-3GYllVck.js +1 -0
  110. package/public/browser/assets/monaco/scala-foMgrKo1.js +1 -0
  111. package/public/browser/assets/monaco/scheme-CHdMtr7p.js +1 -0
  112. package/public/browser/assets/monaco/scss-C1cmLt9V.js +3 -0
  113. package/public/browser/assets/monaco/shell-ClXCKCEW.js +1 -0
  114. package/public/browser/assets/monaco/solidity-MZ6ExpPy.js +1 -0
  115. package/public/browser/assets/monaco/sophia-DWkuSsPQ.js +1 -0
  116. package/public/browser/assets/monaco/sparql-AUGFYSyk.js +1 -0
  117. package/public/browser/assets/monaco/sql-32GpJSV2.js +1 -0
  118. package/public/browser/assets/monaco/st-CuDFIVZ_.js +1 -0
  119. package/public/browser/assets/monaco/swift-n-2HociN.js +3 -0
  120. package/public/browser/assets/monaco/systemverilog-Ch4vA8Yt.js +1 -0
  121. package/public/browser/assets/monaco/tcl-D74tq1nH.js +1 -0
  122. package/public/browser/assets/monaco/tsMode-CZz1Umrk.js +11 -0
  123. package/public/browser/assets/monaco/twig-C6taOxMV.js +1 -0
  124. package/public/browser/assets/monaco/typescript-DfOrAzoV.js +1 -0
  125. package/public/browser/assets/monaco/typespec-D-PIh9Xw.js +1 -0
  126. package/public/browser/assets/monaco/vb-Dyb2648j.js +1 -0
  127. package/public/browser/assets/monaco/wgsl-BhLXMOR0.js +298 -0
  128. package/public/browser/assets/monaco/workers-DcJshg-q.js +1 -0
  129. package/public/browser/assets/monaco/xml-CdsdnY8S.js +1 -0
  130. package/public/browser/assets/monaco/yaml-DYGvmE88.js +1 -0
  131. package/public/browser/favicon.ico +0 -0
  132. package/public/browser/favicon.svg +4 -0
  133. package/public/browser/index.html +20 -0
  134. package/public/browser/main-BRU65EMU.js +80 -0
  135. package/public/browser/polyfills-FFHMD2TL.js +2 -0
  136. package/public/browser/styles-R37AZPY2.css +1 -0
  137. package/server.js +60 -0
  138. package/system.routes.js +150 -0
  139. package/usage-normalizer.js +117 -0
@@ -0,0 +1,2 @@
1
+ var ce=globalThis;function te(e){return(ce.__Zone_symbol_prefix||"__zone_symbol__")+e}function dt(){let e=ce.performance;function n(M){e&&e.mark&&e.mark(M)}function a(M,s){e&&e.measure&&e.measure(M,s)}n("Zone");class t{static{this.__symbol__=te}static assertZonePatched(){if(ce.Promise!==S.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let s=t.current;for(;s.parent;)s=s.parent;return s}static get current(){return b.zone}static get currentTask(){return D}static __load_patch(s,i,o=!1){if(S.hasOwnProperty(s)){let g=ce[te("forceDuplicateZoneCheck")]===!0;if(!o&&g)throw Error("Already loaded patch: "+s)}else if(!ce["__Zone_disable_"+s]){let g="Zone:"+s;n(g),S[s]=i(ce,t,w),a(g,g)}}get parent(){return this._parent}get name(){return this._name}constructor(s,i){this._parent=s,this._name=i?i.name||"unnamed":"<root>",this._properties=i&&i.properties||{},this._zoneDelegate=new f(this,this._parent&&this._parent._zoneDelegate,i)}get(s){let i=this.getZoneWith(s);if(i)return i._properties[s]}getZoneWith(s){let i=this;for(;i;){if(i._properties.hasOwnProperty(s))return i;i=i._parent}return null}fork(s){if(!s)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,s)}wrap(s,i){if(typeof s!="function")throw new Error("Expecting function got: "+s);let o=this._zoneDelegate.intercept(this,s,i),g=this;return function(){return g.runGuarded(o,this,arguments,i)}}run(s,i,o,g){b={parent:b,zone:this};try{return this._zoneDelegate.invoke(this,s,i,o,g)}finally{b=b.parent}}runGuarded(s,i=null,o,g){b={parent:b,zone:this};try{try{return this._zoneDelegate.invoke(this,s,i,o,g)}catch(V){if(this._zoneDelegate.handleError(this,V))throw V}}finally{b=b.parent}}runTask(s,i,o){if(s.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(s.zone||J).name+"; Execution: "+this.name+")");let g=s,{type:V,data:{isPeriodic:ee=!1,isRefreshable:Z=!1}={}}=s;if(s.state===q&&(V===z||V===y))return;let he=s.state!=A;he&&g._transitionTo(A,d);let _e=D;D=g,b={parent:b,zone:this};try{V==y&&s.data&&!ee&&!Z&&(s.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,g,i,o)}catch(Q){if(this._zoneDelegate.handleError(this,Q))throw Q}}finally{let Q=s.state;if(Q!==q&&Q!==X)if(V==z||ee||Z&&Q===k)he&&g._transitionTo(d,A,k);else{let Ee=g._zoneDelegates;this._updateTaskCount(g,-1),he&&g._transitionTo(q,A,q),Z&&(g._zoneDelegates=Ee)}b=b.parent,D=_e}}scheduleTask(s){if(s.zone&&s.zone!==this){let o=this;for(;o;){if(o===s.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${s.zone.name}`);o=o.parent}}s._transitionTo(k,q);let i=[];s._zoneDelegates=i,s._zone=this;try{s=this._zoneDelegate.scheduleTask(this,s)}catch(o){throw s._transitionTo(X,k,q),this._zoneDelegate.handleError(this,o),o}return s._zoneDelegates===i&&this._updateTaskCount(s,1),s.state==k&&s._transitionTo(d,k),s}scheduleMicroTask(s,i,o,g){return this.scheduleTask(new E(G,s,i,o,g,void 0))}scheduleMacroTask(s,i,o,g,V){return this.scheduleTask(new E(y,s,i,o,g,V))}scheduleEventTask(s,i,o,g,V){return this.scheduleTask(new E(z,s,i,o,g,V))}cancelTask(s){if(s.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(s.zone||J).name+"; Execution: "+this.name+")");if(!(s.state!==d&&s.state!==A)){s._transitionTo(x,d,A);try{this._zoneDelegate.cancelTask(this,s)}catch(i){throw s._transitionTo(X,x),this._zoneDelegate.handleError(this,i),i}return this._updateTaskCount(s,-1),s._transitionTo(q,x),s.runCount=-1,s}}_updateTaskCount(s,i){let o=s._zoneDelegates;i==-1&&(s._zoneDelegates=null);for(let g=0;g<o.length;g++)o[g]._updateTaskCount(s.type,i)}}let c={name:"",onHasTask:(M,s,i,o)=>M.hasTask(i,o),onScheduleTask:(M,s,i,o)=>M.scheduleTask(i,o),onInvokeTask:(M,s,i,o,g,V)=>M.invokeTask(i,o,g,V),onCancelTask:(M,s,i,o)=>M.cancelTask(i,o)};class f{get zone(){return this._zone}constructor(s,i,o){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this._zone=s,this._parentDelegate=i,this._forkZS=o&&(o&&o.onFork?o:i._forkZS),this._forkDlgt=o&&(o.onFork?i:i._forkDlgt),this._forkCurrZone=o&&(o.onFork?this._zone:i._forkCurrZone),this._interceptZS=o&&(o.onIntercept?o:i._interceptZS),this._interceptDlgt=o&&(o.onIntercept?i:i._interceptDlgt),this._interceptCurrZone=o&&(o.onIntercept?this._zone:i._interceptCurrZone),this._invokeZS=o&&(o.onInvoke?o:i._invokeZS),this._invokeDlgt=o&&(o.onInvoke?i:i._invokeDlgt),this._invokeCurrZone=o&&(o.onInvoke?this._zone:i._invokeCurrZone),this._handleErrorZS=o&&(o.onHandleError?o:i._handleErrorZS),this._handleErrorDlgt=o&&(o.onHandleError?i:i._handleErrorDlgt),this._handleErrorCurrZone=o&&(o.onHandleError?this._zone:i._handleErrorCurrZone),this._scheduleTaskZS=o&&(o.onScheduleTask?o:i._scheduleTaskZS),this._scheduleTaskDlgt=o&&(o.onScheduleTask?i:i._scheduleTaskDlgt),this._scheduleTaskCurrZone=o&&(o.onScheduleTask?this._zone:i._scheduleTaskCurrZone),this._invokeTaskZS=o&&(o.onInvokeTask?o:i._invokeTaskZS),this._invokeTaskDlgt=o&&(o.onInvokeTask?i:i._invokeTaskDlgt),this._invokeTaskCurrZone=o&&(o.onInvokeTask?this._zone:i._invokeTaskCurrZone),this._cancelTaskZS=o&&(o.onCancelTask?o:i._cancelTaskZS),this._cancelTaskDlgt=o&&(o.onCancelTask?i:i._cancelTaskDlgt),this._cancelTaskCurrZone=o&&(o.onCancelTask?this._zone:i._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;let g=o&&o.onHasTask,V=i&&i._hasTaskZS;(g||V)&&(this._hasTaskZS=g?o:c,this._hasTaskDlgt=i,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,o.onScheduleTask||(this._scheduleTaskZS=c,this._scheduleTaskDlgt=i,this._scheduleTaskCurrZone=this._zone),o.onInvokeTask||(this._invokeTaskZS=c,this._invokeTaskDlgt=i,this._invokeTaskCurrZone=this._zone),o.onCancelTask||(this._cancelTaskZS=c,this._cancelTaskDlgt=i,this._cancelTaskCurrZone=this._zone))}fork(s,i){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,s,i):new t(s,i)}intercept(s,i,o){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,s,i,o):i}invoke(s,i,o,g,V){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,s,i,o,g,V):i.apply(o,g)}handleError(s,i){return this._handleErrorZS?this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,s,i):!0}scheduleTask(s,i){let o=i;if(this._scheduleTaskZS)this._hasTaskZS&&o._zoneDelegates.push(this._hasTaskDlgtOwner),o=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,s,i),o||(o=i);else if(i.scheduleFn)i.scheduleFn(i);else if(i.type==G)U(i);else throw new Error("Task is missing scheduleFn.");return o}invokeTask(s,i,o,g){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,s,i,o,g):i.callback.apply(o,g)}cancelTask(s,i){let o;if(this._cancelTaskZS)o=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,s,i);else{if(!i.cancelFn)throw Error("Task is not cancelable");o=i.cancelFn(i)}return o}hasTask(s,i){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,s,i)}catch(o){this.handleError(s,o)}}_updateTaskCount(s,i){let o=this._taskCounts,g=o[s],V=o[s]=g+i;if(V<0)throw new Error("More tasks executed then were scheduled.");if(g==0||V==0){let ee={microTask:o.microTask>0,macroTask:o.macroTask>0,eventTask:o.eventTask>0,change:s};this.hasTask(this._zone,ee)}}}class E{constructor(s,i,o,g,V,ee){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=s,this.source=i,this.data=g,this.scheduleFn=V,this.cancelFn=ee,!o)throw new Error("callback is not defined");this.callback=o;let Z=this;s===z&&g&&g.useG?this.invoke=E.invokeTask:this.invoke=function(){return E.invokeTask.call(ce,Z,this,arguments)}}static invokeTask(s,i,o){s||(s=this),K++;try{return s.runCount++,s.zone.runTask(s,i,o)}finally{K==1&&$(),K--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(q,k)}_transitionTo(s,i,o){if(this._state===i||this._state===o)this._state=s,s==q&&(this._zoneDelegates=null);else throw new Error(`${this.type} '${this.source}': can not transition to '${s}', expecting state '${i}'${o?" or '"+o+"'":""}, was '${this._state}'.`)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}let T=te("setTimeout"),p=te("Promise"),C=te("then"),_=[],P=!1,I;function H(M){if(I||ce[p]&&(I=ce[p].resolve(0)),I){let s=I[C];s||(s=I.then),s.call(I,M)}else ce[T](M,0)}function U(M){K===0&&_.length===0&&H($),M&&_.push(M)}function $(){if(!P){for(P=!0;_.length;){let M=_;_=[];for(let s=0;s<M.length;s++){let i=M[s];try{i.zone.runTask(i,null,null)}catch(o){w.onUnhandledError(o)}}}w.microtaskDrainDone(),P=!1}}let J={name:"NO ZONE"},q="notScheduled",k="scheduling",d="scheduled",A="running",x="canceling",X="unknown",G="microTask",y="macroTask",z="eventTask",S={},w={symbol:te,currentZoneFrame:()=>b,onUnhandledError:W,microtaskDrainDone:W,scheduleMicroTask:U,showUncaughtError:()=>!t[te("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:W,patchMethod:()=>W,bindArguments:()=>[],patchThen:()=>W,patchMacroTask:()=>W,patchEventPrototype:()=>W,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>W,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>W,wrapWithCurrentZone:()=>W,filterProperties:()=>[],attachOriginToPatched:()=>W,_redefineProperty:()=>W,patchCallbacks:()=>W,nativeScheduleMicroTask:H},b={parent:null,zone:new t(null,null)},D=null,K=0;function W(){}return a("Zone","Zone"),t}function _t(){let e=globalThis,n=e[te("forceDuplicateZoneCheck")]===!0;if(e.Zone&&(n||typeof e.Zone.__symbol__!="function"))throw new Error("Zone already loaded.");return e.Zone??=dt(),e.Zone}var be=Object.getOwnPropertyDescriptor,Ae=Object.defineProperty,je=Object.getPrototypeOf,Et=Object.create,Tt=Array.prototype.slice,He="addEventListener",xe="removeEventListener",Le=te(He),Ie=te(xe),ae="true",le="false",Pe=te("");function Ve(e,n){return Zone.current.wrap(e,n)}function Ge(e,n,a,t,c){return Zone.current.scheduleMacroTask(e,n,a,t,c)}var j=te,De=typeof window<"u",pe=De?window:void 0,Y=De&&pe||globalThis,gt="removeAttribute";function Fe(e,n){for(let a=e.length-1;a>=0;a--)typeof e[a]=="function"&&(e[a]=Ve(e[a],n+"_"+a));return e}function yt(e,n){let a=e.constructor.name;for(let t=0;t<n.length;t++){let c=n[t],f=e[c];if(f){let E=be(e,c);if(!tt(E))continue;e[c]=(T=>{let p=function(){return T.apply(this,Fe(arguments,a+"."+c))};return fe(p,T),p})(f)}}}function tt(e){return e?e.writable===!1?!1:!(typeof e.get=="function"&&typeof e.set>"u"):!0}var nt=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,Se=!("nw"in Y)&&typeof Y.process<"u"&&Y.process.toString()==="[object process]",Be=!Se&&!nt&&!!(De&&pe.HTMLElement),rt=typeof Y.process<"u"&&Y.process.toString()==="[object process]"&&!nt&&!!(De&&pe.HTMLElement),Ce={},mt=j("enable_beforeunload"),Ye=function(e){if(e=e||Y.event,!e)return;let n=Ce[e.type];n||(n=Ce[e.type]=j("ON_PROPERTY"+e.type));let a=this||e.target||Y,t=a[n],c;if(Be&&a===pe&&e.type==="error"){let f=e;c=t&&t.call(this,f.message,f.filename,f.lineno,f.colno,f.error),c===!0&&e.preventDefault()}else c=t&&t.apply(this,arguments),e.type==="beforeunload"&&Y[mt]&&typeof c=="string"?e.returnValue=c:c!=null&&!c&&e.preventDefault();return c};function $e(e,n,a){let t=be(e,n);if(!t&&a&&be(a,n)&&(t={enumerable:!0,configurable:!0}),!t||!t.configurable)return;let c=j("on"+n+"patched");if(e.hasOwnProperty(c)&&e[c])return;delete t.writable,delete t.value;let f=t.get,E=t.set,T=n.slice(2),p=Ce[T];p||(p=Ce[T]=j("ON_PROPERTY"+T)),t.set=function(C){let _=this;if(!_&&e===Y&&(_=Y),!_)return;typeof _[p]=="function"&&_.removeEventListener(T,Ye),E&&E.call(_,null),_[p]=C,typeof C=="function"&&_.addEventListener(T,Ye,!1)},t.get=function(){let C=this;if(!C&&e===Y&&(C=Y),!C)return null;let _=C[p];if(_)return _;if(f){let P=f.call(this);if(P)return t.set.call(this,P),typeof C[gt]=="function"&&C.removeAttribute(n),P}return null},Ae(e,n,t),e[c]=!0}function ot(e,n,a){if(n)for(let t=0;t<n.length;t++)$e(e,"on"+n[t],a);else{let t=[];for(let c in e)c.slice(0,2)=="on"&&t.push(c);for(let c=0;c<t.length;c++)$e(e,t[c],a)}}var oe=j("originalInstance");function ve(e){let n=Y[e];if(!n)return;Y[j(e)]=n,Y[e]=function(){let c=Fe(arguments,e);switch(c.length){case 0:this[oe]=new n;break;case 1:this[oe]=new n(c[0]);break;case 2:this[oe]=new n(c[0],c[1]);break;case 3:this[oe]=new n(c[0],c[1],c[2]);break;case 4:this[oe]=new n(c[0],c[1],c[2],c[3]);break;default:throw new Error("Arg list too long.")}},fe(Y[e],n);let a=new n(function(){}),t;for(t in a)e==="XMLHttpRequest"&&t==="responseBlob"||function(c){typeof a[c]=="function"?Y[e].prototype[c]=function(){return this[oe][c].apply(this[oe],arguments)}:Ae(Y[e].prototype,c,{set:function(f){typeof f=="function"?(this[oe][c]=Ve(f,e+"."+c),fe(this[oe][c],f)):this[oe][c]=f},get:function(){return this[oe][c]}})}(t);for(t in n)t!=="prototype"&&n.hasOwnProperty(t)&&(Y[e][t]=n[t])}function ue(e,n,a){let t=e;for(;t&&!t.hasOwnProperty(n);)t=je(t);!t&&e[n]&&(t=e);let c=j(n),f=null;if(t&&(!(f=t[c])||!t.hasOwnProperty(c))){f=t[c]=t[n];let E=t&&be(t,n);if(tt(E)){let T=a(f,c,n);t[n]=function(){return T(this,arguments)},fe(t[n],f)}}return f}function pt(e,n,a){let t=null;function c(f){let E=f.data;return E.args[E.cbIdx]=function(){f.invoke.apply(this,arguments)},t.apply(E.target,E.args),f}t=ue(e,n,f=>function(E,T){let p=a(E,T);return p.cbIdx>=0&&typeof T[p.cbIdx]=="function"?Ge(p.name,T[p.cbIdx],p,c):f.apply(E,T)})}function fe(e,n){e[j("OriginalDelegate")]=n}var Je=!1,Me=!1;function kt(){try{let e=pe.navigator.userAgent;if(e.indexOf("MSIE ")!==-1||e.indexOf("Trident/")!==-1)return!0}catch{}return!1}function vt(){if(Je)return Me;Je=!0;try{let e=pe.navigator.userAgent;(e.indexOf("MSIE ")!==-1||e.indexOf("Trident/")!==-1||e.indexOf("Edge/")!==-1)&&(Me=!0)}catch{}return Me}function Ke(e){return typeof e=="function"}function Qe(e){return typeof e=="number"}var me=!1;if(typeof window<"u")try{let e=Object.defineProperty({},"passive",{get:function(){me=!0}});window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch{me=!1}var bt={useG:!0},ne={},st={},it=new RegExp("^"+Pe+"(\\w+)(true|false)$"),ct=j("propagationStopped");function at(e,n){let a=(n?n(e):e)+le,t=(n?n(e):e)+ae,c=Pe+a,f=Pe+t;ne[e]={},ne[e][le]=c,ne[e][ae]=f}function Pt(e,n,a,t){let c=t&&t.add||He,f=t&&t.rm||xe,E=t&&t.listeners||"eventListeners",T=t&&t.rmAll||"removeAllListeners",p=j(c),C="."+c+":",_="prependListener",P="."+_+":",I=function(k,d,A){if(k.isRemoved)return;let x=k.callback;typeof x=="object"&&x.handleEvent&&(k.callback=y=>x.handleEvent(y),k.originalDelegate=x);let X;try{k.invoke(k,d,[A])}catch(y){X=y}let G=k.options;if(G&&typeof G=="object"&&G.once){let y=k.originalDelegate?k.originalDelegate:k.callback;d[f].call(d,A.type,y,G)}return X};function H(k,d,A){if(d=d||e.event,!d)return;let x=k||d.target||e,X=x[ne[d.type][A?ae:le]];if(X){let G=[];if(X.length===1){let y=I(X[0],x,d);y&&G.push(y)}else{let y=X.slice();for(let z=0;z<y.length&&!(d&&d[ct]===!0);z++){let S=I(y[z],x,d);S&&G.push(S)}}if(G.length===1)throw G[0];for(let y=0;y<G.length;y++){let z=G[y];n.nativeScheduleMicroTask(()=>{throw z})}}}let U=function(k){return H(this,k,!1)},$=function(k){return H(this,k,!0)};function J(k,d){if(!k)return!1;let A=!0;d&&d.useG!==void 0&&(A=d.useG);let x=d&&d.vh,X=!0;d&&d.chkDup!==void 0&&(X=d.chkDup);let G=!1;d&&d.rt!==void 0&&(G=d.rt);let y=k;for(;y&&!y.hasOwnProperty(c);)y=je(y);if(!y&&k[c]&&(y=k),!y||y[p])return!1;let z=d&&d.eventNameToString,S={},w=y[p]=y[c],b=y[j(f)]=y[f],D=y[j(E)]=y[E],K=y[j(T)]=y[T],W;d&&d.prepend&&(W=y[j(d.prepend)]=y[d.prepend]);function M(r,u){return!me&&typeof r=="object"&&r?!!r.capture:!me||!u?r:typeof r=="boolean"?{capture:r,passive:!0}:r?typeof r=="object"&&r.passive!==!1?{...r,passive:!0}:r:{passive:!0}}let s=function(r){if(!S.isExisting)return w.call(S.target,S.eventName,S.capture?$:U,S.options)},i=function(r){if(!r.isRemoved){let u=ne[r.eventName],v;u&&(v=u[r.capture?ae:le]);let R=v&&r.target[v];if(R){for(let m=0;m<R.length;m++)if(R[m]===r){R.splice(m,1),r.isRemoved=!0,r.removeAbortListener&&(r.removeAbortListener(),r.removeAbortListener=null),R.length===0&&(r.allRemoved=!0,r.target[v]=null);break}}}if(r.allRemoved)return b.call(r.target,r.eventName,r.capture?$:U,r.options)},o=function(r){return w.call(S.target,S.eventName,r.invoke,S.options)},g=function(r){return W.call(S.target,S.eventName,r.invoke,S.options)},V=function(r){return b.call(r.target,r.eventName,r.invoke,r.options)},ee=A?s:o,Z=A?i:V,he=function(r,u){let v=typeof u;return v==="function"&&r.callback===u||v==="object"&&r.originalDelegate===u},_e=d&&d.diff?d.diff:he,Q=Zone[j("UNPATCHED_EVENTS")],Ee=e[j("PASSIVE_EVENTS")];function h(r){if(typeof r=="object"&&r!==null){let u={...r};return r.signal&&(u.signal=r.signal),u}return r}let l=function(r,u,v,R,m=!1,O=!1){return function(){let N=this||e,L=arguments[0];d&&d.transferEventName&&(L=d.transferEventName(L));let F=arguments[1];if(!F)return r.apply(this,arguments);if(Se&&L==="uncaughtException")return r.apply(this,arguments);let B=!1;if(typeof F!="function"){if(!F.handleEvent)return r.apply(this,arguments);B=!0}if(x&&!x(r,F,N,arguments))return;let de=me&&!!Ee&&Ee.indexOf(L)!==-1,se=h(M(arguments[2],de)),Te=se?.signal;if(Te?.aborted)return;if(Q){for(let ie=0;ie<Q.length;ie++)if(L===Q[ie])return de?r.call(N,L,F,se):r.apply(this,arguments)}let Oe=se?typeof se=="boolean"?!0:se.capture:!1,Ue=se&&typeof se=="object"?se.once:!1,ht=Zone.current,Ne=ne[L];Ne||(at(L,z),Ne=ne[L]);let ze=Ne[Oe?ae:le],ge=N[ze],We=!1;if(ge){if(We=!0,X){for(let ie=0;ie<ge.length;ie++)if(_e(ge[ie],F))return}}else ge=N[ze]=[];let we,qe=N.constructor.name,Xe=st[qe];Xe&&(we=Xe[L]),we||(we=qe+u+(z?z(L):L)),S.options=se,Ue&&(S.options.once=!1),S.target=N,S.capture=Oe,S.eventName=L,S.isExisting=We;let ke=A?bt:void 0;ke&&(ke.taskData=S),Te&&(S.options.signal=void 0);let re=ht.scheduleEventTask(we,F,ke,v,R);if(Te){S.options.signal=Te;let ie=()=>re.zone.cancelTask(re);r.call(Te,"abort",ie,{once:!0}),re.removeAbortListener=()=>Te.removeEventListener("abort",ie)}if(S.target=null,ke&&(ke.taskData=null),Ue&&(S.options.once=!0),!me&&typeof re.options=="boolean"||(re.options=se),re.target=N,re.capture=Oe,re.eventName=L,B&&(re.originalDelegate=F),O?ge.unshift(re):ge.push(re),m)return N}};return y[c]=l(w,C,ee,Z,G),W&&(y[_]=l(W,P,g,Z,G,!0)),y[f]=function(){let r=this||e,u=arguments[0];d&&d.transferEventName&&(u=d.transferEventName(u));let v=arguments[2],R=v?typeof v=="boolean"?!0:v.capture:!1,m=arguments[1];if(!m)return b.apply(this,arguments);if(x&&!x(b,m,r,arguments))return;let O=ne[u],N;O&&(N=O[R?ae:le]);let L=N&&r[N];if(L)for(let F=0;F<L.length;F++){let B=L[F];if(_e(B,m)){if(L.splice(F,1),B.isRemoved=!0,L.length===0&&(B.allRemoved=!0,r[N]=null,!R&&typeof u=="string")){let de=Pe+"ON_PROPERTY"+u;r[de]=null}return B.zone.cancelTask(B),G?r:void 0}}return b.apply(this,arguments)},y[E]=function(){let r=this||e,u=arguments[0];d&&d.transferEventName&&(u=d.transferEventName(u));let v=[],R=lt(r,z?z(u):u);for(let m=0;m<R.length;m++){let O=R[m],N=O.originalDelegate?O.originalDelegate:O.callback;v.push(N)}return v},y[T]=function(){let r=this||e,u=arguments[0];if(u){d&&d.transferEventName&&(u=d.transferEventName(u));let v=ne[u];if(v){let R=v[le],m=v[ae],O=r[R],N=r[m];if(O){let L=O.slice();for(let F=0;F<L.length;F++){let B=L[F],de=B.originalDelegate?B.originalDelegate:B.callback;this[f].call(this,u,de,B.options)}}if(N){let L=N.slice();for(let F=0;F<L.length;F++){let B=L[F],de=B.originalDelegate?B.originalDelegate:B.callback;this[f].call(this,u,de,B.options)}}}}else{let v=Object.keys(r);for(let R=0;R<v.length;R++){let m=v[R],O=it.exec(m),N=O&&O[1];N&&N!=="removeListener"&&this[T].call(this,N)}this[T].call(this,"removeListener")}if(G)return this},fe(y[c],w),fe(y[f],b),K&&fe(y[T],K),D&&fe(y[E],D),!0}let q=[];for(let k=0;k<a.length;k++)q[k]=J(a[k],t);return q}function lt(e,n){if(!n){let f=[];for(let E in e){let T=it.exec(E),p=T&&T[1];if(p&&(!n||p===n)){let C=e[E];if(C)for(let _=0;_<C.length;_++)f.push(C[_])}}return f}let a=ne[n];a||(at(n),a=ne[n]);let t=e[a[le]],c=e[a[ae]];return t?c?t.concat(c):t.slice():c?c.slice():[]}function wt(e,n){let a=e.Event;a&&a.prototype&&n.patchMethod(a.prototype,"stopImmediatePropagation",t=>function(c,f){c[ct]=!0,t&&t.apply(c,f)})}function Rt(e,n){n.patchMethod(e,"queueMicrotask",a=>function(t,c){Zone.current.scheduleMicroTask("queueMicrotask",c[0])})}var Re=j("zoneTask");function ye(e,n,a,t){let c=null,f=null;n+=t,a+=t;let E={};function T(C){let _=C.data;_.args[0]=function(){return C.invoke.apply(this,arguments)};let P=c.apply(e,_.args);return Qe(P)?_.handleId=P:(_.handle=P,_.isRefreshable=Ke(P.refresh)),C}function p(C){let{handle:_,handleId:P}=C.data;return f.call(e,_??P)}c=ue(e,n,C=>function(_,P){if(Ke(P[0])){let I={isRefreshable:!1,isPeriodic:t==="Interval",delay:t==="Timeout"||t==="Interval"?P[1]||0:void 0,args:P},H=P[0];P[0]=function(){try{return H.apply(this,arguments)}finally{let{handle:A,handleId:x,isPeriodic:X,isRefreshable:G}=I;!X&&!G&&(x?delete E[x]:A&&(A[Re]=null))}};let U=Ge(n,P[0],I,T,p);if(!U)return U;let{handleId:$,handle:J,isRefreshable:q,isPeriodic:k}=U.data;if($)E[$]=U;else if(J&&(J[Re]=U,q&&!k)){let d=J.refresh;J.refresh=function(){let{zone:A,state:x}=U;return x==="notScheduled"?(U._state="scheduled",A._updateTaskCount(U,1)):x==="running"&&(U._state="scheduling"),d.call(this)}}return J??$??U}else return C.apply(e,P)}),f=ue(e,a,C=>function(_,P){let I=P[0],H;Qe(I)?(H=E[I],delete E[I]):(H=I?.[Re],H?I[Re]=null:H=I),H?.type?H.cancelFn&&H.zone.cancelTask(H):C.apply(e,P)})}function Ct(e,n){let{isBrowser:a,isMix:t}=n.getGlobalObjects();if(!a&&!t||!e.customElements||!("customElements"in e))return;let c=["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"];n.patchCallbacks(n,e.customElements,"customElements","define",c)}function Dt(e,n){if(Zone[n.symbol("patchEventTarget")])return;let{eventNames:a,zoneSymbolEventNames:t,TRUE_STR:c,FALSE_STR:f,ZONE_SYMBOL_PREFIX:E}=n.getGlobalObjects();for(let p=0;p<a.length;p++){let C=a[p],_=C+f,P=C+c,I=E+_,H=E+P;t[C]={},t[C][f]=I,t[C][c]=H}let T=e.EventTarget;if(!(!T||!T.prototype))return n.patchEventTarget(e,n,[T&&T.prototype]),!0}function St(e,n){n.patchEventPrototype(e,n)}function ut(e,n,a){if(!a||a.length===0)return n;let t=a.filter(f=>f.target===e);if(!t||t.length===0)return n;let c=t[0].ignoreProperties;return n.filter(f=>c.indexOf(f)===-1)}function et(e,n,a,t){if(!e)return;let c=ut(e,n,a);ot(e,c,t)}function Ze(e){return Object.getOwnPropertyNames(e).filter(n=>n.startsWith("on")&&n.length>2).map(n=>n.substring(2))}function Ot(e,n){if(Se&&!rt||Zone[e.symbol("patchEvents")])return;let a=n.__Zone_ignore_on_properties,t=[];if(Be){let c=window;t=t.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);let f=kt()?[{target:c,ignoreProperties:["error"]}]:[];et(c,Ze(c),a&&a.concat(f),je(c))}t=t.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let c=0;c<t.length;c++){let f=n[t[c]];f&&f.prototype&&et(f.prototype,Ze(f.prototype),a)}}function Nt(e){e.__load_patch("legacy",n=>{let a=n[e.__symbol__("legacyPatch")];a&&a()}),e.__load_patch("timers",n=>{let a="set",t="clear";ye(n,a,t,"Timeout"),ye(n,a,t,"Interval"),ye(n,a,t,"Immediate")}),e.__load_patch("requestAnimationFrame",n=>{ye(n,"request","cancel","AnimationFrame"),ye(n,"mozRequest","mozCancel","AnimationFrame"),ye(n,"webkitRequest","webkitCancel","AnimationFrame")}),e.__load_patch("blocking",(n,a)=>{let t=["alert","prompt","confirm"];for(let c=0;c<t.length;c++){let f=t[c];ue(n,f,(E,T,p)=>function(C,_){return a.current.run(E,n,_,p)})}}),e.__load_patch("EventTarget",(n,a,t)=>{St(n,t),Dt(n,t);let c=n.XMLHttpRequestEventTarget;c&&c.prototype&&t.patchEventTarget(n,t,[c.prototype])}),e.__load_patch("MutationObserver",(n,a,t)=>{ve("MutationObserver"),ve("WebKitMutationObserver")}),e.__load_patch("IntersectionObserver",(n,a,t)=>{ve("IntersectionObserver")}),e.__load_patch("FileReader",(n,a,t)=>{ve("FileReader")}),e.__load_patch("on_property",(n,a,t)=>{Ot(t,n)}),e.__load_patch("customElements",(n,a,t)=>{Ct(n,t)}),e.__load_patch("XHR",(n,a)=>{C(n);let t=j("xhrTask"),c=j("xhrSync"),f=j("xhrListener"),E=j("xhrScheduled"),T=j("xhrURL"),p=j("xhrErrorBeforeScheduled");function C(_){let P=_.XMLHttpRequest;if(!P)return;let I=P.prototype;function H(w){return w[t]}let U=I[Le],$=I[Ie];if(!U){let w=_.XMLHttpRequestEventTarget;if(w){let b=w.prototype;U=b[Le],$=b[Ie]}}let J="readystatechange",q="scheduled";function k(w){let b=w.data,D=b.target;D[E]=!1,D[p]=!1;let K=D[f];U||(U=D[Le],$=D[Ie]),K&&$.call(D,J,K);let W=D[f]=()=>{if(D.readyState===D.DONE)if(!b.aborted&&D[E]&&w.state===q){let s=D[a.__symbol__("loadfalse")];if(D.status!==0&&s&&s.length>0){let i=w.invoke;w.invoke=function(){let o=D[a.__symbol__("loadfalse")];for(let g=0;g<o.length;g++)o[g]===w&&o.splice(g,1);!b.aborted&&w.state===q&&i.call(w)},s.push(w)}else w.invoke()}else!b.aborted&&D[E]===!1&&(D[p]=!0)};return U.call(D,J,W),D[t]||(D[t]=w),z.apply(D,b.args),D[E]=!0,w}function d(){}function A(w){let b=w.data;return b.aborted=!0,S.apply(b.target,b.args)}let x=ue(I,"open",()=>function(w,b){return w[c]=b[2]==!1,w[T]=b[1],x.apply(w,b)}),X="XMLHttpRequest.send",G=j("fetchTaskAborting"),y=j("fetchTaskScheduling"),z=ue(I,"send",()=>function(w,b){if(a.current[y]===!0||w[c])return z.apply(w,b);{let D={target:w,url:w[T],isPeriodic:!1,args:b,aborted:!1},K=Ge(X,d,D,k,A);w&&w[p]===!0&&!D.aborted&&K.state===q&&K.invoke()}}),S=ue(I,"abort",()=>function(w,b){let D=H(w);if(D&&typeof D.type=="string"){if(D.cancelFn==null||D.data&&D.data.aborted)return;D.zone.cancelTask(D)}else if(a.current[G]===!0)return S.apply(w,b)})}}),e.__load_patch("geolocation",n=>{n.navigator&&n.navigator.geolocation&&yt(n.navigator.geolocation,["getCurrentPosition","watchPosition"])}),e.__load_patch("PromiseRejectionEvent",(n,a)=>{function t(c){return function(f){lt(n,c).forEach(T=>{let p=n.PromiseRejectionEvent;if(p){let C=new p(c,{promise:f.promise,reason:f.rejection});T.invoke(C)}})}}n.PromiseRejectionEvent&&(a[j("unhandledPromiseRejectionHandler")]=t("unhandledrejection"),a[j("rejectionHandledHandler")]=t("rejectionhandled"))}),e.__load_patch("queueMicrotask",(n,a,t)=>{Rt(n,t)})}function Lt(e){e.__load_patch("ZoneAwarePromise",(n,a,t)=>{let c=Object.getOwnPropertyDescriptor,f=Object.defineProperty;function E(h){if(h&&h.toString===Object.prototype.toString){let l=h.constructor&&h.constructor.name;return(l||"")+": "+JSON.stringify(h)}return h?h.toString():Object.prototype.toString.call(h)}let T=t.symbol,p=[],C=n[T("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")]!==!1,_=T("Promise"),P=T("then"),I="__creationTrace__";t.onUnhandledError=h=>{if(t.showUncaughtError()){let l=h&&h.rejection;l?console.error("Unhandled Promise rejection:",l instanceof Error?l.message:l,"; Zone:",h.zone.name,"; Task:",h.task&&h.task.source,"; Value:",l,l instanceof Error?l.stack:void 0):console.error(h)}},t.microtaskDrainDone=()=>{for(;p.length;){let h=p.shift();try{h.zone.runGuarded(()=>{throw h.throwOriginal?h.rejection:h})}catch(l){U(l)}}};let H=T("unhandledPromiseRejectionHandler");function U(h){t.onUnhandledError(h);try{let l=a[H];typeof l=="function"&&l.call(this,h)}catch{}}function $(h){return h&&h.then}function J(h){return h}function q(h){return Z.reject(h)}let k=T("state"),d=T("value"),A=T("finally"),x=T("parentPromiseValue"),X=T("parentPromiseState"),G="Promise.then",y=null,z=!0,S=!1,w=0;function b(h,l){return r=>{try{M(h,l,r)}catch(u){M(h,!1,u)}}}let D=function(){let h=!1;return function(r){return function(){h||(h=!0,r.apply(null,arguments))}}},K="Promise resolved with itself",W=T("currentTaskTrace");function M(h,l,r){let u=D();if(h===r)throw new TypeError(K);if(h[k]===y){let v=null;try{(typeof r=="object"||typeof r=="function")&&(v=r&&r.then)}catch(R){return u(()=>{M(h,!1,R)})(),h}if(l!==S&&r instanceof Z&&r.hasOwnProperty(k)&&r.hasOwnProperty(d)&&r[k]!==y)i(r),M(h,r[k],r[d]);else if(l!==S&&typeof v=="function")try{v.call(r,u(b(h,l)),u(b(h,!1)))}catch(R){u(()=>{M(h,!1,R)})()}else{h[k]=l;let R=h[d];if(h[d]=r,h[A]===A&&l===z&&(h[k]=h[X],h[d]=h[x]),l===S&&r instanceof Error){let m=a.currentTask&&a.currentTask.data&&a.currentTask.data[I];m&&f(r,W,{configurable:!0,enumerable:!1,writable:!0,value:m})}for(let m=0;m<R.length;)o(h,R[m++],R[m++],R[m++],R[m++]);if(R.length==0&&l==S){h[k]=w;let m=r;try{throw new Error("Uncaught (in promise): "+E(r)+(r&&r.stack?`
2
+ `+r.stack:""))}catch(O){m=O}C&&(m.throwOriginal=!0),m.rejection=r,m.promise=h,m.zone=a.current,m.task=a.currentTask,p.push(m),t.scheduleMicroTask()}}}return h}let s=T("rejectionHandledHandler");function i(h){if(h[k]===w){try{let l=a[s];l&&typeof l=="function"&&l.call(this,{rejection:h[d],promise:h})}catch{}h[k]=S;for(let l=0;l<p.length;l++)h===p[l].promise&&p.splice(l,1)}}function o(h,l,r,u,v){i(h);let R=h[k],m=R?typeof u=="function"?u:J:typeof v=="function"?v:q;l.scheduleMicroTask(G,()=>{try{let O=h[d],N=!!r&&A===r[A];N&&(r[x]=O,r[X]=R);let L=l.run(m,void 0,N&&m!==q&&m!==J?[]:[O]);M(r,!0,L)}catch(O){M(r,!1,O)}},r)}let g="function ZoneAwarePromise() { [native code] }",V=function(){},ee=n.AggregateError;class Z{static toString(){return g}static resolve(l){return l instanceof Z?l:M(new this(null),z,l)}static reject(l){return M(new this(null),S,l)}static withResolvers(){let l={};return l.promise=new Z((r,u)=>{l.resolve=r,l.reject=u}),l}static any(l){if(!l||typeof l[Symbol.iterator]!="function")return Promise.reject(new ee([],"All promises were rejected"));let r=[],u=0;try{for(let m of l)u++,r.push(Z.resolve(m))}catch{return Promise.reject(new ee([],"All promises were rejected"))}if(u===0)return Promise.reject(new ee([],"All promises were rejected"));let v=!1,R=[];return new Z((m,O)=>{for(let N=0;N<r.length;N++)r[N].then(L=>{v||(v=!0,m(L))},L=>{R.push(L),u--,u===0&&(v=!0,O(new ee(R,"All promises were rejected")))})})}static race(l){let r,u,v=new this((O,N)=>{r=O,u=N});function R(O){r(O)}function m(O){u(O)}for(let O of l)$(O)||(O=this.resolve(O)),O.then(R,m);return v}static all(l){return Z.allWithCallback(l)}static allSettled(l){return(this&&this.prototype instanceof Z?this:Z).allWithCallback(l,{thenCallback:u=>({status:"fulfilled",value:u}),errorCallback:u=>({status:"rejected",reason:u})})}static allWithCallback(l,r){let u,v,R=new this((L,F)=>{u=L,v=F}),m=2,O=0,N=[];for(let L of l){$(L)||(L=this.resolve(L));let F=O;try{L.then(B=>{N[F]=r?r.thenCallback(B):B,m--,m===0&&u(N)},B=>{r?(N[F]=r.errorCallback(B),m--,m===0&&u(N)):v(B)})}catch(B){v(B)}m++,O++}return m-=2,m===0&&u(N),R}constructor(l){let r=this;if(!(r instanceof Z))throw new Error("Must be an instanceof Promise.");r[k]=y,r[d]=[];try{let u=D();l&&l(u(b(r,z)),u(b(r,S)))}catch(u){M(r,!1,u)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return Z}then(l,r){let u=this.constructor?.[Symbol.species];(!u||typeof u!="function")&&(u=this.constructor||Z);let v=new u(V),R=a.current;return this[k]==y?this[d].push(R,v,l,r):o(this,R,v,l,r),v}catch(l){return this.then(null,l)}finally(l){let r=this.constructor?.[Symbol.species];(!r||typeof r!="function")&&(r=Z);let u=new r(V);u[A]=A;let v=a.current;return this[k]==y?this[d].push(v,u,l,l):o(this,v,u,l,l),u}}Z.resolve=Z.resolve,Z.reject=Z.reject,Z.race=Z.race,Z.all=Z.all;let he=n[_]=n.Promise;n.Promise=Z;let _e=T("thenPatched");function Q(h){let l=h.prototype,r=c(l,"then");if(r&&(r.writable===!1||!r.configurable))return;let u=l.then;l[P]=u,h.prototype.then=function(v,R){return new Z((O,N)=>{u.call(this,O,N)}).then(v,R)},h[_e]=!0}t.patchThen=Q;function Ee(h){return function(l,r){let u=h.apply(l,r);if(u instanceof Z)return u;let v=u.constructor;return v[_e]||Q(v),u}}return he&&(Q(he),ue(n,"fetch",h=>Ee(h))),Promise[a.__symbol__("uncaughtPromiseErrors")]=p,Z})}function It(e){e.__load_patch("toString",n=>{let a=Function.prototype.toString,t=j("OriginalDelegate"),c=j("Promise"),f=j("Error"),E=function(){if(typeof this=="function"){let _=this[t];if(_)return typeof _=="function"?a.call(_):Object.prototype.toString.call(_);if(this===Promise){let P=n[c];if(P)return a.call(P)}if(this===Error){let P=n[f];if(P)return a.call(P)}}return a.call(this)};E[t]=a,Function.prototype.toString=E;let T=Object.prototype.toString,p="[object Promise]";Object.prototype.toString=function(){return typeof Promise=="function"&&this instanceof Promise?p:T.call(this)}})}function Mt(e,n,a,t,c){let f=Zone.__symbol__(t);if(n[f])return;let E=n[f]=n[t];n[t]=function(T,p,C){return p&&p.prototype&&c.forEach(function(_){let P=`${a}.${t}::`+_,I=p.prototype;try{if(I.hasOwnProperty(_)){let H=e.ObjectGetOwnPropertyDescriptor(I,_);H&&H.value?(H.value=e.wrapWithCurrentZone(H.value,P),e._redefineProperty(p.prototype,_,H)):I[_]&&(I[_]=e.wrapWithCurrentZone(I[_],P))}else I[_]&&(I[_]=e.wrapWithCurrentZone(I[_],P))}catch{}}),E.call(n,T,p,C)},e.attachOriginToPatched(n[t],E)}function Zt(e){e.__load_patch("util",(n,a,t)=>{let c=Ze(n);t.patchOnProperties=ot,t.patchMethod=ue,t.bindArguments=Fe,t.patchMacroTask=pt;let f=a.__symbol__("BLACK_LISTED_EVENTS"),E=a.__symbol__("UNPATCHED_EVENTS");n[E]&&(n[f]=n[E]),n[f]&&(a[f]=a[E]=n[f]),t.patchEventPrototype=wt,t.patchEventTarget=Pt,t.isIEOrEdge=vt,t.ObjectDefineProperty=Ae,t.ObjectGetOwnPropertyDescriptor=be,t.ObjectCreate=Et,t.ArraySlice=Tt,t.patchClass=ve,t.wrapWithCurrentZone=Ve,t.filterProperties=ut,t.attachOriginToPatched=fe,t._redefineProperty=Object.defineProperty,t.patchCallbacks=Mt,t.getGlobalObjects=()=>({globalSources:st,zoneSymbolEventNames:ne,eventNames:c,isBrowser:Be,isMix:rt,isNode:Se,TRUE_STR:ae,FALSE_STR:le,ZONE_SYMBOL_PREFIX:Pe,ADD_EVENT_LISTENER_STR:He,REMOVE_EVENT_LISTENER_STR:xe})})}function At(e){Lt(e),It(e),Zt(e)}var ft=_t();At(ft);Nt(ft);
@@ -0,0 +1 @@
1
+ @charset "UTF-8";html,body{height:100%;overflow:hidden}.bs-tooltip-sm .tooltip-inner{font-size:.6rem;padding:.2rem .5rem}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#c5cfe8;border-radius:99px}::-webkit-scrollbar-thumb:hover{background:#0d6efd}::-webkit-scrollbar-corner{background:transparent}*{scrollbar-width:thin;scrollbar-color:#c5cfe8 transparent}html.dark ::-webkit-scrollbar-thumb{background:#2d3a5c!important}html.dark ::-webkit-scrollbar-thumb:hover{background:#4a6fa5!important}html.dark *{scrollbar-color:#2d3a5c transparent!important}html.dark body,html.dark .page-wrapper,html.dark .page-content{background:#0d1117!important;color:#e6edf3!important}html.dark .nav-tabs{border-color:#30363d!important;background:#0d1117!important}html.dark .nav-link{color:#8b949e!important}html.dark .nav-link:hover{background:#161b22!important;color:#e6edf3!important}html.dark .nav-tabs .nav-link.active{background:#161b22!important;color:#58a6ff!important;border-color:#30363d #30363d #161b22!important}html.dark .bg-light,html.dark .bg-white{background:#161b22!important}html.dark .border,html.dark .border-top,html.dark .border-bottom,html.dark .border-start,html.dark .border-end{border-color:#30363d!important}html.dark .text-muted,html.dark .text-secondary{color:#8b949e!important}html.dark .text-dark{color:#e6edf3!important}html.dark .alert-warning{background:#2a1d00!important;border-color:#5a3e00!important;color:#d4a017!important}html.dark .form-control,html.dark .form-select,html.dark .input-group-text{background:#161b22!important;border-color:#30363d!important;color:#e6edf3!important}html.dark .form-control::placeholder,html.dark .form-select::placeholder,html.dark .input-group-text::placeholder{color:#6e7681!important}html.dark .form-control:focus,html.dark .form-select:focus,html.dark .input-group-text:focus{background:#1c2128!important;border-color:#58a6ff!important;box-shadow:0 0 0 .2rem #58a6ff33!important}html.dark .form-control:disabled,html.dark .form-select:disabled,html.dark .input-group-text:disabled{background:#0d1117!important;color:#6e7681!important}html.dark .form-check-input{background-color:#1c2128!important;border-color:#30363d!important}html.dark .form-check-input:checked{background-color:#1f6feb!important;border-color:#1f6feb!important}html.dark .form-switch .form-check-input:checked{background-color:#1f6feb!important}html.dark .btn-outline-secondary{color:#8b949e!important;border-color:#30363d!important}html.dark .btn-outline-secondary:hover:not(:disabled){background:#1c2128!important;color:#e6edf3!important}html.dark .btn-outline-primary{color:#58a6ff!important;border-color:#58a6ff!important}html.dark .btn-outline-primary:hover:not(:disabled){background:#0c2248!important}html.dark .btn-outline-danger{color:#ff7b72!important;border-color:#ff7b72!important}html.dark .btn-outline-danger:hover:not(:disabled){background:#2a0f0f!important}html.dark .btn-outline-success{color:#3fb950!important;border-color:#3fb950!important}html.dark .btn-outline-light{color:#c9d1d9!important;border-color:#30363d!important}html.dark .btn-close{filter:invert(1)!important}html.dark .badge.bg-light{background:#21262d!important;color:#8b949e!important}html.dark .badge.bg-secondary{background:#30363d!important;color:#c9d1d9!important}html.dark .card{background:#161b22!important;border-color:#30363d!important;color:#e6edf3!important}html.dark .card-header{background:#1c2128!important;border-color:#30363d!important;color:#e6edf3!important}html.dark .card-body{background:#161b22!important}html.dark .list-group-item{background:#161b22!important;border-color:#30363d!important;color:#e6edf3!important}html.dark .chat-sidebar{background:#161b22!important;border-color:#30363d!important}html.dark .sidebar-footer{background:#161b22!important}html.dark .section-title{color:#6e7681!important}html.dark .server-block{border-color:#30363d!important}html.dark .server-header{background:#1c2128!important}html.dark .chat-main{background:#0d1117!important}html.dark .chat-header{background:#161b22!important;border-color:#30363d!important}html.dark .chat-header-bottom{border-color:#21262d!important}html.dark .chat-title-wrap{color:#e6edf3!important}html.dark .chat-body{background:#0d1117!important}html.dark .mode-btn{color:#c9d1d9!important;border-color:#30363d!important;background:transparent!important}html.dark .mode-btn:hover{background:#1c2128!important;color:#3fb950!important}html.dark .btn-check:checked+.mode-btn-expert{background:#196c38!important;color:#fff!important;border-color:#196c38!important}html.dark .btn-check:checked+.mode-btn-project{background:#196c38!important;color:#fff!important;border-color:#196c38!important}html.dark .msg-bubble.msg-ai{background:#161b22!important;border-color:#30363d!important;color:#e6edf3!important}html.dark .msg-time,html.dark .msg-copy-btn{color:#6e7681!important}html.dark .msg-copy-btn:hover{color:#58a6ff!important;border-color:#1f3a6b!important;background:#0c2248!important}html.dark .markdown-body{color:#e6edf3!important}html.dark .markdown-body h1,html.dark .markdown-body h2,html.dark .markdown-body h3,html.dark .markdown-body h4,html.dark .markdown-body h5,html.dark .markdown-body h6{color:#f0f6ff!important}html.dark .markdown-body code:not(pre>code){background:#1a2744!important;color:#79c0ff!important}html.dark .markdown-body blockquote{background:#0c1c3a!important;border-color:#1f6feb!important;color:#8b949e!important}html.dark .markdown-body table th{background:#1c2128!important;border-color:#30363d!important}html.dark .markdown-body table td{border-color:#30363d!important}html.dark .markdown-body table tr:nth-child(2n) td{background:#161b22!important}html.dark .markdown-body hr{border-color:#30363d!important}html.dark .markdown-body strong{color:#f0f6ff!important}html.dark .markdown-body a{color:#58a6ff!important}html.dark .session-cost-bar{background:#161b22!important;border-color:#30363d!important}html.dark .session-cost-label{color:#8b949e!important}html.dark .session-cost-value{color:#58a6ff!important}html.dark .session-cost-reset{color:#6e7681!important;border-color:#30363d!important}html.dark .chat-input-area{background:#161b22!important;border-color:#30363d!important}html.dark .chat-error-toast{background:#2a0f0f!important;border-color:#6e1111!important;color:#ff7b72!important}html.dark .ws-tab-wrapper{border-color:#30363d!important}html.dark .ws-tree-panel{background:#161b22!important;border-color:#30363d!important}html.dark .ws-path-bar{background:#1c2128!important;border-color:#30363d!important}html.dark .ws-ctx-bar{background:#161b22!important;border-color:#30363d!important}html.dark .ws-tree-body{background:#161b22!important}html.dark .ws-tree-node{border-color:#21262d!important}html.dark .ws-tree-node:hover{background:#1c2128!important}html.dark .ws-tree-node.is-active-root{background:#0c2248!important;border-color:#1f6feb!important}html.dark .ws-tree-node.in-context-file{background:#0f2c1a!important}html.dark .ws-tree-node.in-context-file .node-label{color:#3fb950!important}html.dark .ws-legend{background:#161b22!important;border-color:#30363d!important}html.dark .ws-path-input{background:#1c2128!important;color:#e6edf3!important}html.dark .ws-new-input-bar{background:#1c2128!important;border-color:#30363d!important}html.dark .btn-new-item{color:#8b949e!important}html.dark .btn-new-item:hover{color:#58a6ff!important}html.dark .node-label{color:#c9d1d9!important}html.dark .dir-label:hover{color:#58a6ff!important}html.dark .ws-viewer-toolbar{background:#161b22!important;border-color:#30363d!important}html.dark .ws-status-bar{background:#0d1117!important;border-color:#30363d!important;color:#6e7681!important}html.dark .ws-viewer-empty{background:#1e1e1e!important;color:#6e7681!important}html.dark .ws-viewer-panel.ws-theme-light{background:#fff!important}html.dark .usage-badge{color:#8b949e!important}html.dark .badge-stat .label{color:#6e7681!important}html.dark .badge-stat .value{color:#c9d1d9!important}html.dark .badge-divider{color:#30363d!important}html.dark .badge-cost .value{color:#58a6ff!important}html.dark .badge-speed .value{color:#3fb950!important}.code-block{margin:.65rem 0;border-radius:.5rem;overflow:hidden;border:1px solid #2a2b3d;font-size:.82rem}.code-block .code-header{display:flex;align-items:center;justify-content:space-between;padding:.3rem .75rem;background:#1a1b26;border-bottom:1px solid #2a2b3d;min-height:32px}.code-block .code-lang-label{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.68rem;font-weight:700;letter-spacing:.1em;color:#89b4fa;text-transform:uppercase;-webkit-user-select:none;user-select:none}.code-block .code-copy-btn{background:#2a2b3d;border:1px solid #6c7086;border-radius:.3rem;color:#cdd6f4!important;font-size:.7rem;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;padding:.15rem .55rem;cursor:pointer;transition:background .15s,border-color .15s,color .15s;line-height:1.4;-webkit-user-select:none;user-select:none}.code-block .code-copy-btn:hover{background:#3b3c52;border-color:#89b4fa;color:#fff!important}.code-block .code-copy-btn:active{background:#4a4b6a}.code-block .code-pre{margin:0;padding:.4rem 0;background:#1e1e2e;overflow-x:auto;overflow-y:hidden;border-radius:0}.code-block .code-pre code{display:block;background:transparent;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.82rem;line-height:1;white-space:pre;counter-reset:line-number;min-width:max-content}.code-block .code-pre .code-line{display:block;padding:0 1.25rem 0 3.75rem;position:relative}.code-block .code-pre .code-line:before{counter-increment:line-number;content:counter(line-number);position:absolute;left:0;width:3rem;text-align:right;padding-right:.6rem;color:#3d405a;-webkit-user-select:none;user-select:none;font-size:.75rem;line-height:inherit}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-keyword,.hljs-formula{color:#c678dd}.hljs-section,.hljs-name,.hljs-selector-tag,.hljs-deletion,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string{color:#98c379}.hljs-attr,.hljs-variable,.hljs-template-variable,.hljs-type,.hljs-selector-class,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-number{color:#d19a66}.hljs-symbol,.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-title.class_,.hljs-class .hljs-title{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}
package/server.js ADDED
@@ -0,0 +1,60 @@
1
+ import 'dotenv/config';
2
+ import express from 'express';
3
+ import cors from 'cors';
4
+ import { fileURLToPath } from 'url';
5
+ import { dirname, join } from 'path';
6
+ import { existsSync } from 'fs';
7
+
8
+ // ─── Logger must be imported first so console is overridden before routes load ─
9
+ import { logger } from './logger.js';
10
+
11
+ // Override console.* globally → all existing route console.log/error calls
12
+ // are automatically captured by Winston without touching any route file.
13
+ console.log = (...args) => logger.info(args.map(String).join(' '));
14
+ console.error = (...args) => logger.error(args.map(String).join(' '));
15
+ console.warn = (...args) => logger.warn(args.map(String).join(' '));
16
+
17
+ import llmRouter from './llm.routes.js';
18
+ import mcpRouter from './mcp.routes.js';
19
+ import chatRouter from './chat.routes.js';
20
+ import systemRouter from './system.routes.js';
21
+ import logRouter from './log.routes.js';
22
+
23
+ const app = express();
24
+ const PORT = Number(process.env.PORT) || 3000;
25
+ const CORS_ORIGIN = process.env.CORS_ORIGIN || '*';
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = dirname(__filename);
28
+ const IS_PROD = process.env.NODE_ENV === 'production';
29
+
30
+ const ts = () => new Date(Date.now() + (5 * 60 + 30) * 60000).toISOString().replace('Z', '+05:30');
31
+
32
+ // Allow requests from the Angular dev server
33
+ app.use(cors({ origin: CORS_ORIGIN }));
34
+ app.use(express.json());
35
+
36
+ // ─── Route modules ────────────────────────────────────────────────────────────
37
+ app.use('/api/llm', llmRouter);
38
+ app.use('/api/mcp', mcpRouter);
39
+ app.use('/api/chat', chatRouter);
40
+ app.use('/api/system', systemRouter);
41
+ app.use('/api/logs', logRouter);
42
+
43
+ // ─── Static UI (production / npx mode) ────────────────────────────────────────
44
+ if (IS_PROD) {
45
+ const publicDir = join(__dirname, 'public/browser');
46
+ if (existsSync(publicDir)) {
47
+ console.log(`[INIT] ${ts()} Serving static UI from: ${publicDir}`);
48
+ app.use(express.static(publicDir));
49
+ // SPA catch-all — must be AFTER all API routes
50
+ app.get('*', (_req, res) => res.sendFile(join(publicDir, 'index.html')));
51
+ } else {
52
+ console.warn(`[WARN] ${ts()} NODE_ENV=production but /public directory not found — UI not served. Run build:prod first.`);
53
+ }
54
+ }
55
+
56
+ // ─── Start ────────────────────────────────────────────────────────────────────
57
+ app.listen(PORT, () => {
58
+ console.log(`[INIT] ${ts()} BlueOrch Studio backend ready on port ${PORT}`);
59
+ console.log(`[INIT] ${ts()} Routes: /api/mcp/* | /api/llm/* | /api/chat/* | /api/system/* | /api/logs/*`);
60
+ });
@@ -0,0 +1,150 @@
1
+ import { Router } from 'express';
2
+ import { homedir } from 'os';
3
+ import { readdir, readFile, writeFile, mkdir } from 'fs/promises';
4
+ import { resolve, join } from 'path';
5
+ import { spawn } from 'child_process';
6
+ import { fileURLToPath } from 'url';
7
+ import { dirname } from 'path';
8
+
9
+ const router = Router();
10
+ const ts = () => new Date(Date.now() + (5 * 60 + 30) * 60000).toISOString().replace('Z', '+05:30');
11
+
12
+ // ─── GET /api/system/env ──────────────────────────────────────────────────────
13
+ // Returns environment information for the current machine.
14
+ router.get('/env', (_req, res) => {
15
+ const homeDir = homedir();
16
+ console.log(`[SUCCESS] ${ts()} /system/env | homeDir: ${homeDir}`);
17
+ return res.json({ homeDir });
18
+ });
19
+
20
+ // ─── GET /api/system/files/tree ───────────────────────────────────────────────
21
+ // Returns ONE level of children for the given directory path.
22
+ // Query param: ?path=/absolute/path
23
+ // Lazy: the UI calls this once per expand click — never walks the full tree.
24
+ router.get('/files/tree', async (req, res) => {
25
+ const rawPath = typeof req.query.path === 'string' ? req.query.path.trim() : '';
26
+ if (!rawPath) {
27
+ return res.status(400).json({ error: '?path query param is required' });
28
+ }
29
+ const safePath = resolve(rawPath); // normalise + make absolute
30
+ console.log(`[INIT] ${ts()} GET /files/tree | path: ${safePath}`);
31
+ try {
32
+ const entries = await readdir(safePath, { withFileTypes: true });
33
+ const children = entries
34
+ .filter(e => !e.name.startsWith('.')) // hide dotfiles
35
+ .map(e => ({
36
+ name: e.name,
37
+ type: e.isDirectory() ? 'directory' : 'file',
38
+ path: join(safePath, e.name),
39
+ }))
40
+ .sort((a, b) => {
41
+ if (a.type === b.type) return a.name.localeCompare(b.name);
42
+ return a.type === 'directory' ? -1 : 1; // dirs first
43
+ });
44
+ console.log(`[SUCCESS] ${ts()} GET /files/tree | ${children.length} entries at "${safePath}"`);
45
+ return res.json({ children });
46
+ } catch (err) {
47
+ const status = err.code === 'ENOENT' ? 404 : err.code === 'EACCES' ? 403 : 500;
48
+ console.error(`[ERROR] ${ts()} GET /files/tree | ${err.message}`);
49
+ return res.status(status).json({ error: err.message });
50
+ }
51
+ });
52
+
53
+ // ─── GET /api/system/files/read ──────────────────────────────────────────────
54
+ // Returns the text content of a single file.
55
+ // Query param: ?path=/absolute/path/to/file
56
+ // Capped at 2 MB to prevent accidental huge reads.
57
+ const MAX_BYTES = 2 * 1024 * 1024; // 2 MB
58
+ router.get('/files/read', async (req, res) => {
59
+ const rawPath = typeof req.query.path === 'string' ? req.query.path.trim() : '';
60
+ if (!rawPath) {
61
+ return res.status(400).json({ error: '?path query param is required' });
62
+ }
63
+ const safePath = resolve(rawPath);
64
+ console.log(`[INIT] ${ts()} GET /files/read | path: ${safePath}`);
65
+ try {
66
+ const buf = await readFile(safePath);
67
+ if (buf.length > MAX_BYTES) {
68
+ return res.status(413).json({ error: 'File too large to preview (>2 MB)' });
69
+ }
70
+ const content = buf.toString('utf8');
71
+ console.log(`[SUCCESS] ${ts()} GET /files/read | ${buf.length} bytes at "${safePath}"`);
72
+ return res.json({ content, path: safePath });
73
+ } catch (err) {
74
+ const status = err.code === 'ENOENT' ? 404 : err.code === 'EACCES' ? 403 : 500;
75
+ console.error(`[ERROR] ${ts()} GET /files/read | ${err.message}`);
76
+ return res.status(status).json({ error: err.message });
77
+ }
78
+ });
79
+
80
+ // ─── PUT /api/system/files/write ─────────────────────────────────────────────
81
+ // Overwrites a file with new text content.
82
+ // Body: { path: string, content: string }
83
+ router.put('/files/write', async (req, res) => {
84
+ const { path: rawPath, content } = req.body ?? {};
85
+ if (!rawPath) return res.status(400).json({ error: 'path is required' });
86
+ const safePath = resolve(rawPath);
87
+ console.log(`[INIT] ${ts()} PUT /files/write | path: ${safePath}`);
88
+ try {
89
+ await writeFile(safePath, content ?? '', 'utf8');
90
+ console.log(`[SUCCESS] ${ts()} PUT /files/write | ${(content ?? '').length} chars at "${safePath}"`);
91
+ return res.json({ ok: true, path: safePath });
92
+ } catch (err) {
93
+ const status = err.code === 'ENOENT' ? 404 : err.code === 'EACCES' ? 403 : 500;
94
+ console.error(`[ERROR] ${ts()} PUT /files/write | ${err.message}`);
95
+ return res.status(status).json({ error: err.message });
96
+ }
97
+ });
98
+
99
+ // ─── POST /api/system/files/create ───────────────────────────────────────────
100
+ // Creates a new empty file or directory.
101
+ // Body: { path: string, type: 'file' | 'directory' }
102
+ router.post('/files/create', async (req, res) => {
103
+ const { path: rawPath, type = 'file' } = req.body ?? {};
104
+ if (!rawPath) return res.status(400).json({ error: 'path is required' });
105
+ const safePath = resolve(rawPath);
106
+ console.log(`[INIT] ${ts()} POST /files/create | type: ${type}, path: ${safePath}`);
107
+ try {
108
+ if (type === 'directory') {
109
+ await mkdir(safePath);
110
+ } else {
111
+ await writeFile(safePath, '', { flag: 'wx', encoding: 'utf8' }); // wx = fail if exists
112
+ }
113
+ console.log(`[SUCCESS] ${ts()} POST /files/create | created "${safePath}"`);
114
+ return res.json({ ok: true, path: safePath });
115
+ } catch (err) {
116
+ const status = err.code === 'EEXIST' ? 409 : err.code === 'EACCES' ? 403 : 500;
117
+ console.error(`[ERROR] ${ts()} POST /files/create | ${err.message}`);
118
+ return res.status(status).json({ error: err.message });
119
+ }
120
+ });
121
+
122
+ // ─── GET /api/system/health ──────────────────────────────────────────────────
123
+ // Simple ping used by the UI to know the server is back up after a restart.
124
+ router.get('/health', (_req, res) => {
125
+ return res.json({ ok: true, ts: ts() });
126
+ });
127
+
128
+ // ─── POST /api/system/restart ─────────────────────────────────────────────────
129
+ // Spawns a fresh `node server.js` then exits the current process.
130
+ // The UI should poll GET /api/system/health until it responds, then reload.
131
+ router.post('/restart', (_req, res) => {
132
+ console.log(`[INIT] ${ts()} Server restart requested`);
133
+ res.json({ ok: true, message: 'Restarting…' });
134
+
135
+ const __dirname = dirname(fileURLToPath(import.meta.url));
136
+ const serverPath = join(__dirname, 'server.js');
137
+
138
+ setTimeout(() => {
139
+ const child = spawn(process.execPath, [serverPath], {
140
+ detached: true,
141
+ stdio: 'inherit',
142
+ cwd: __dirname,
143
+ env: process.env,
144
+ });
145
+ child.unref();
146
+ process.exit(0);
147
+ }, 300);
148
+ });
149
+
150
+ export default router;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * usage-normalizer.js
3
+ * ─────────────────────────────────────────────────────────────────────────────
4
+ * Maps raw LLM provider usage objects into a single StandardizedUsage shape.
5
+ *
6
+ * StandardizedUsage JSDoc typedef:
7
+ *
8
+ * @typedef {Object} StandardizedUsage
9
+ * @property {number} input - Total prompt tokens INCLUDING cached portion
10
+ * @property {number} output - Output / completion tokens
11
+ * @property {number} cached - Tokens served from provider-side cache
12
+ * @property {string} model - Model identifier string
13
+ * @property {string} provider - 'gemini' | 'openai' | 'claude' | 'ollama'
14
+ * @property {number} latencyMs - Wall-clock request latency in milliseconds
15
+ */
16
+
17
+ const ts = () => new Date(Date.now() + (5 * 60 + 30) * 60000).toISOString().replace('Z', '+05:30');
18
+
19
+ /**
20
+ * Normalise a raw provider usage object into a StandardizedUsage object.
21
+ *
22
+ * Convention: `input` = TOTAL prompt tokens (cached + non-cached combined).
23
+ * Cost calculation should derive non-cached as (input − cached).
24
+ *
25
+ * @param {object|null} rawUsage Raw usage / stats from the provider SDK
26
+ * @param {string} provider 'gemini' | 'openai' | 'claude' | 'ollama'
27
+ * @param {{ model?: string, latencyMs?: number }} [meta]
28
+ * @returns {StandardizedUsage}
29
+ */
30
+ export function mapProviderUsage(rawUsage, provider, meta = {}) {
31
+ console.log(`[INIT] ${ts()} mapProviderUsage() | provider: ${provider}`);
32
+
33
+ const model = meta.model ?? '';
34
+ const latencyMs = meta.latencyMs ?? 0;
35
+
36
+ let result;
37
+
38
+ if (provider === 'gemini') {
39
+ // ── Gemini SDK (@google/genai) ─────────────────────────────────────────
40
+ // promptTokenCount includes cached tokens; cachedContentTokenCount is the subset.
41
+ const u = rawUsage ?? {};
42
+ result = {
43
+ input: u.promptTokenCount ?? 0,
44
+ output: u.candidatesTokenCount ?? 0,
45
+ cached: u.cachedContentTokenCount ?? 0,
46
+ model, provider, latencyMs,
47
+ };
48
+ }
49
+
50
+ else if (provider === 'openai') {
51
+ // ── OpenAI SDK ─────────────────────────────────────────────────────────
52
+ // prompt_tokens includes cached tokens; prompt_tokens_details.cached_tokens is the subset.
53
+ const u = rawUsage ?? {};
54
+ result = {
55
+ input: u.prompt_tokens ?? 0,
56
+ output: u.completion_tokens ?? 0,
57
+ cached: u.prompt_tokens_details?.cached_tokens ?? 0,
58
+ model, provider, latencyMs,
59
+ };
60
+ }
61
+
62
+ else if (provider === 'claude') {
63
+ // ── Anthropic SDK ──────────────────────────────────────────────────────
64
+ // input_tokens = non-cached billed input.
65
+ // cache_creation_input_tokens = tokens written to cache (billed at input rate).
66
+ // cache_read_input_tokens = tokens read from cache (billed at cached rate).
67
+ // Normalise to: input = total (all three summed), cached = cache reads only.
68
+ const u = rawUsage ?? {};
69
+ const cacheCreate = u.cache_creation_input_tokens ?? 0;
70
+ const cacheRead = u.cache_read_input_tokens ?? 0;
71
+ result = {
72
+ input: (u.input_tokens ?? 0) + cacheCreate + cacheRead,
73
+ output: u.output_tokens ?? 0,
74
+ cached: cacheRead,
75
+ model, provider, latencyMs,
76
+ };
77
+ }
78
+
79
+ else if (provider === 'ollama') {
80
+ // ── Ollama ─────────────────────────────────────────────────────────────
81
+ // Native Ollama fields: prompt_eval_count, eval_count, total_duration (ns).
82
+ // OpenAI-compat fallback: usage.prompt_tokens, usage.completion_tokens.
83
+ const u = rawUsage ?? {};
84
+ const nativeLatencyMs = u.total_duration
85
+ ? Math.round(u.total_duration / 1_000_000) // nanoseconds → ms
86
+ : latencyMs;
87
+ result = {
88
+ input: u.prompt_eval_count ?? u.prompt_tokens ?? 0,
89
+ output: u.eval_count ?? u.completion_tokens ?? 0,
90
+ cached: 0,
91
+ model, provider,
92
+ latencyMs: nativeLatencyMs,
93
+ };
94
+ }
95
+
96
+ else if (provider === 'lmstudio') {
97
+ // ── LM Studio (OpenAI-compatible) ──────────────────────────────────────
98
+ // Standard OpenAI usage fields. LM Studio also sends a `stats` object
99
+ // with hardware telemetry — capture tokens_per_second if present.
100
+ const u = rawUsage ?? {};
101
+ const tokensPerSecond = meta.stats?.tokens_per_second ?? null;
102
+ result = {
103
+ input: u.prompt_tokens ?? 0,
104
+ output: u.completion_tokens ?? 0,
105
+ cached: 0,
106
+ model, provider, latencyMs,
107
+ ...(tokensPerSecond !== null && { tokensPerSecond }),
108
+ };
109
+ }
110
+
111
+ else {
112
+ result = { input: 0, output: 0, cached: 0, model, provider, latencyMs };
113
+ }
114
+
115
+ console.log(`[SUCCESS] ${ts()} mapProviderUsage() | ${JSON.stringify(result)}`);
116
+ return result;
117
+ }