@makeshkumar/blueorch-studio 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makeshkumar/blueorch-studio",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "BlueOrch Studio — Modular MCP Orchestrator with LLM chat, served as an npx command",
5
5
  "type": "module",
6
6
  "main": "server.js",
@@ -16,5 +16,5 @@
16
16
  <app-root></app-root>
17
17
  <!-- Bootstrap 5 Bundle (Popper included) -->
18
18
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
19
- <script src="polyfills-FFHMD2TL.js" type="module"></script><script src="main-BRU65EMU.js" type="module"></script></body>
19
+ <script src="polyfills-FFHMD2TL.js" type="module"></script><script src="main-3OKCTHR4.js" type="module"></script></body>
20
20
  </html>
@@ -75,6 +75,6 @@ Focus specifically on these selected file(s):
75
75
  ${r}`}return`${t}
76
76
 
77
77
  If the user refers to the workspace, project, or current folder, they mean that exact root path.`},Hq="You are a world-class Senior Software Engineer and Computer Science expert. Provide high-performance, clean, and secure code solutions focusing on industry best practices and efficient algorithms. (Note: Local workspace access is currently disabled for this query.)",ad=(()=>{class e{constructor(t,r,i,o,s){this.chatService=t,this.llmService=r,this.mcpService=i,this.workspaceService=o,this.usageCalc=s,this.navigateToWorkspace=new Re,this.providers=[],this.selectedProviderId="",this.mcpConnections=[],this.messages=[],this.inputMessage="",this.isThinking=!1,this.errorMessage="",this.showError=!1,this.totalSessionCost=0,this.copiedTimestamp=null,this.isProjectModeActive=!1,this.shouldScroll=!1,this.chatSub=null,console.log(`[INIT] ${new Date().toISOString()} ChatComponent initialized`)}ngOnInit(){this.loadSidebar(),this.loadHistory()}ngAfterViewChecked(){this.shouldScroll&&(this.scrollToBottom(),this.shouldScroll=!1)}ngOnDestroy(){this.chatSub&&(this.chatSub.unsubscribe(),this.chatSub=null)}loadSidebar(){console.log(`[INIT] ${new Date().toISOString()} ChatComponent.loadSidebar()`),this.loadProviders(),this.loadMcpConnections()}loadProviders(){let t=this.selectedProviderId;this.llmService.getRegistry().subscribe({next:r=>{this.providers=r.registry,r.registry.some(o=>o.id===t)||(this.selectedProviderId=r.activeId??r.registry[0]?.id??""),console.log(`[SUCCESS] ${new Date().toISOString()} Providers loaded | ${r.registry.length}`)},error:r=>console.log(`[ERROR] ${new Date().toISOString()} Failed to load providers | ${r.message}`)})}loadMcpConnections(){this.mcpService.getClients().subscribe({next:t=>{if(t.length===0){this.mcpConnections=[];return}let r=t.map(i=>this.mcpService.getTools(i.connectionId).pipe(Rn(()=>K({connectionId:i.connectionId,tools:[]}))));Mo(r).subscribe({next:i=>{this.mcpConnections=t.map((o,s)=>{let a=this.mcpConnections.find(l=>l.connectionId===o.connectionId);return{connectionId:o.connectionId,label:o.label,enabled:a?.enabled??!0,tools:(i[s].tools??[]).map(l=>{let c=a?.tools.find(d=>d.name===l.name);return{name:l.name,description:l.description,enabled:c?.enabled??!0}})}}),console.log(`[SUCCESS] ${new Date().toISOString()} MCP connections loaded | ${t.length}`)},error:i=>console.log(`[ERROR] ${new Date().toISOString()} Failed to load MCP tools | ${i.message}`)})},error:t=>console.log(`[ERROR] ${new Date().toISOString()} Failed to load MCP connections | ${t.message}`)})}providerLabel(t){return`${{gemini:"Gemini",openai:"OpenAI",claude:"Claude"}[t.provider]??t.provider} \u2014 ${t.model}`}providerIconClass(t){return{gemini:"bi-google",openai:"bi-robot",claude:"bi-cpu",ollama:"bi-hdd-stack",lmstudio:"bi-pc-display"}[t]??"bi-box"}getSelectedProvider(){return this.providers.find(t=>t.id===this.selectedProviderId)}toggleServer(t){t.enabled=!t.enabled,t.tools.forEach(r=>r.enabled=t.enabled)}getActiveTools(){let t=[];for(let r of this.mcpConnections)if(r.enabled)for(let i of r.tools)i.enabled&&t.push({connectionId:r.connectionId,toolName:i.name});return t}get activeToolCount(){return this.getActiveTools().length}get inputPlaceholder(){return this.isProjectModeActive?"Ask about your project...":"Ask a general coding question..."}get systemInstruction(){return this.isProjectModeActive?Yq(this.workspaceService.currentPath,this.workspaceService.contextFiles):Hq}loadHistory(){this.chatService.getHistory().subscribe({next:t=>{this.messages=t.history.map(r=>({role:r.role,content:r.content,timestamp:new Date().toISOString(),toolsUsed:r.toolsUsed,standardizedUsage:r.standardizedUsage??null,turnCost:r.standardizedUsage?this.usageCalc.calculateCost(r.standardizedUsage):0})),this.messages.length>0&&(this.shouldScroll=!0),console.log(`[SUCCESS] ${new Date().toISOString()} Chat history loaded | ${this.messages.length} messages`)},error:t=>console.log(`[ERROR] ${new Date().toISOString()} Failed to load history | ${t.message}`)})}sendMessage(){let t=this.inputMessage.trim();if(!t||this.isThinking)return;if(!this.selectedProviderId){this.showAlert("Please select a model before sending a message.");return}this.messages.push({role:"user",content:t,timestamp:new Date().toISOString()}),this.inputMessage="",this.isThinking=!0,this.showError=!1,this.shouldScroll=!0,console.log(`[INIT] ${new Date().toISOString()} ChatComponent.sendMessage() | provider: ${this.selectedProviderId}`);let r=this.isProjectModeActive?this.getActiveTools():[];this.chatSub=this.chatService.send({message:t,providerId:this.selectedProviderId,activeTools:r,systemContext:this.systemInstruction,activeWorkspacePath:this.isProjectModeActive?this.workspaceService.currentPath:void 0}).subscribe({next:i=>{let o=this.usageCalc.calculateCost(i.standardizedUsage);this.totalSessionCost+=o,this.messages.push({role:"assistant",content:i.reply,toolsUsed:i.toolsUsed,timestamp:new Date().toISOString(),standardizedUsage:i.standardizedUsage,turnCost:o}),this.isThinking=!1,this.chatSub=null,this.shouldScroll=!0,console.log(`[SUCCESS] ${new Date().toISOString()} Reply received | toolsUsed: [${i.toolsUsed.join(", ")}] | turnCost: $${o.toFixed(6)} | sessionCost: $${this.totalSessionCost.toFixed(6)}`)},error:i=>{this.isThinking=!1,this.chatSub=null;let o=i.error?.error??i.message??"An unexpected error occurred.";this.showAlert(`Chat error: ${o}`),console.log(`[ERROR] ${new Date().toISOString()} sendMessage failed | ${o}`)}})}stopGeneration(){!this.chatSub||!this.isThinking||(this.chatSub.unsubscribe(),this.chatSub=null,this.isThinking=!1,this.showAlert("Response stopped by user."),console.log(`[SUCCESS] ${new Date().toISOString()} ChatComponent: generation stopped by user`))}onEnter(t){t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),this.sendMessage())}clearChat(){this.chatService.clearHistory().subscribe({next:()=>{this.messages=[],this.totalSessionCost=0,console.log(`[SUCCESS] ${new Date().toISOString()} Chat history cleared`)},error:t=>console.log(`[ERROR] ${new Date().toISOString()} Failed to clear history | ${t.message}`)})}resetSessionCost(){this.totalSessionCost=0,console.log(`[SUCCESS] ${new Date().toISOString()} Session cost reset`)}showAlert(t){this.errorMessage=t,this.showError=!0}dismissError(){this.showError=!1}scrollToBottom(){try{let t=this.chatBodyRef?.nativeElement;t&&(t.scrollTop=t.scrollHeight)}catch{}}onCopyClick(t){let r=t.target.closest(".code-copy-btn");if(!r)return;let i=r.closest(".code-block")?.querySelector("code");if(!i)return;let o=(i.textContent??"").trim(),s=r.textContent??"Copy";navigator.clipboard.writeText(o).then(()=>{r.textContent="Copied!",console.log(`[SUCCESS] ${new Date().toISOString()} Code block copied to clipboard`),setTimeout(()=>{r.textContent=s},2e3)}).catch(a=>{r.textContent="Error",console.log(`[ERROR] ${new Date().toISOString()} Clipboard write failed | ${a.message}`),setTimeout(()=>{r.textContent=s},2e3)})}copyResponse(t){navigator.clipboard.writeText(t.content).then(()=>{this.copiedTimestamp=t.timestamp,console.log(`[SUCCESS] ${new Date().toISOString()} AI response copied to clipboard`),setTimeout(()=>{this.copiedTimestamp=null},2e3)}).catch(r=>{console.log(`[ERROR] ${new Date().toISOString()} Clipboard write failed | ${r.message}`)})}truncatePath(t){if(!t)return"\u2014";let r=t.includes("/")?"/":"\\",i=t.split(r).filter(l=>l.length>0);if(i.length<=4)return t;let o=t.startsWith("/")?"/":"",s=i.slice(0,2).join(r),a=i.slice(-2).join(r);return`${o}${s}${r}\u2026${r}${a}`}static{this.\u0275fac=function(r){return new(r||e)(M(QD),M(od),M(sd),M(yo),M(Qs))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-chat"]],viewQuery:function(r,i){if(r&1&&tn(_q,5),r&2){let o;xt(o=Pt())&&(i.chatBodyRef=o.first)}},hostBindings:function(r,i){r&1&&L("click",function(s){return i.onCopyClick(s)})},outputs:{navigateToWorkspace:"navigateToWorkspace"},decls:62,vars:27,consts:[["chatBody",""],[1,"chat-wrapper"],[1,"chat-sidebar"],[1,"sidebar-section","border-bottom","p-3"],[1,"section-title","mb-2"],[1,"bi","bi-cpu-fill","text-primary","me-2"],["class","text-muted small text-center py-2",4,"ngIf"],["class","form-select form-select-sm",3,"ngModel","ngModelChange",4,"ngIf"],[1,"sidebar-section","sidebar-scroll","p-3"],[1,"bi","bi-tools","text-primary","me-2"],["class","badge bg-primary ms-1 fw-normal",4,"ngIf"],["class","server-block border rounded mb-2",4,"ngFor","ngForOf"],[1,"sidebar-footer","border-top","p-3"],[1,"btn","btn-sm","btn-outline-secondary","w-100",3,"click","disabled"],[1,"bi","bi-trash3","me-1"],[1,"chat-main"],[1,"chat-header","border-bottom","flex-shrink-0"],[1,"chat-header-row","chat-header-top","px-3","py-2"],[1,"chat-title-wrap"],[1,"bi","bi-chat-dots-fill","text-primary"],[1,"fw-semibold"],["role","group","aria-label","Chat mode",1,"mode-segment","flex-shrink-0"],["type","radio","name","chatMode","id","modeExpert","autocomplete","off",1,"btn-check",3,"ngModelChange","value","ngModel"],["for","modeExpert",1,"btn","btn-sm","mode-btn","mode-btn-expert"],[1,"bi","bi-globe2","me-1"],["type","radio","name","chatMode","id","modeProject","autocomplete","off",1,"btn-check",3,"ngModelChange","value","ngModel"],["for","modeProject",1,"btn","btn-sm","mode-btn","mode-btn-project"],[1,"bi","bi-folder2-open","me-1"],[1,"chat-header-row","chat-header-bottom","px-3","pb-2"],[1,"meta-strip"],[4,"ngIf"],["class","badge bg-success",4,"ngIf"],["class","context-strip",4,"ngIf"],[1,"chat-body"],["class","empty-state",4,"ngIf"],[4,"ngFor","ngForOf"],["class","msg-row msg-row-ai",4,"ngIf"],[1,"session-cost-bar","border-top","px-4","py-1","d-flex","align-items-center","justify-content-between","flex-shrink-0"],[1,"session-cost-label"],[1,"bi","bi-calculator","me-1","text-primary"],[1,"fw-semibold","text-secondary"],[1,"session-cost-value","ms-1"],["tooltipPlacement","left",1,"btn","btn-sm","session-cost-reset",3,"click","bsTooltip","disabled"],[1,"bi","bi-arrow-counterclockwise"],[1,"chat-input-area","border-top","px-4","py-2","flex-shrink-0"],["class","chat-error-toast",4,"ngIf"],[1,"input-group"],["rows","2",1,"form-control",2,"resize","none",3,"ngModelChange","keydown","placeholder","ngModel","disabled"],["class","btn btn-danger px-3","tooltipPlacement","top",3,"bsTooltip","click",4,"ngIf"],[1,"btn","btn-primary","px-4",3,"click","disabled"],["class","spinner-border spinner-border-sm","role","status",4,"ngIf"],["class","bi bi-send-fill",4,"ngIf"],[1,"text-muted","small","text-center","py-2"],[1,"bi","bi-exclamation-circle","d-block","mb-1","fs-5","opacity-50"],[1,"form-select","form-select-sm",3,"ngModelChange","ngModel"],["value","","disabled",""],[3,"value",4,"ngFor","ngForOf"],[3,"value"],[3,"ngSwitch"],[4,"ngSwitchCase"],[4,"ngSwitchDefault"],[1,"badge","bg-primary","ms-1","fw-normal"],[1,"bi","bi-plug","d-block","mb-1","fs-5","opacity-50"],[1,"server-block","border","rounded","mb-2"],[1,"server-header","d-flex","align-items-center","px-2","py-1","bg-light","rounded-top"],[1,"form-check","form-switch","mb-0","me-2"],["type","checkbox","role","switch",1,"form-check-input",3,"change","checked"],[1,"bi","bi-hdd-stack","text-primary","small","me-1"],["tooltipPlacement","right",1,"small","fw-semibold","text-truncate","flex-1",3,"bsTooltip"],[1,"badge","bg-secondary","small","ms-1"],["class","tools-list px-2 py-1",4,"ngIf"],[1,"tools-list","px-2","py-1"],["class","form-check py-0 mb-0",4,"ngFor","ngForOf"],[1,"form-check","py-0","mb-0"],["type","checkbox",1,"form-check-input",3,"ngModelChange","id","ngModel"],["tooltipPlacement","right",1,"form-check-label","small","text-muted","text-truncate","d-block",3,"for","bsTooltip"],[1,"badge","bg-primary"],[1,"bi","me-1",3,"ngClass"],[1,"badge","bg-success"],[1,"bi","bi-tools","me-1"],[1,"context-strip"],["tooltipPlacement","bottom",1,"context-item",3,"bsTooltip"],[1,"bi","bi-folder2-open","text-primary"],[1,"font-monospace","context-path"],["tooltipPlacement","bottom",1,"btn","btn-sm","btn-outline-primary","py-0","px-2",3,"click","bsTooltip"],[1,"bi","bi-folder-tree","me-1"],[1,"badge","bg-success",2,"font-size","0.68rem"],[1,"bi","bi-file-earmark-check","me-1"],[1,"empty-state"],[1,"bi","bi-chat-square-dots","d-block","fs-1","mb-3","text-primary","opacity-35"],[1,"fw-semibold","mb-1"],[1,"small","mb-0","text-muted"],["class","msg-row msg-row-user",4,"ngIf"],[1,"msg-row","msg-row-user"],[1,"msg-bubble","msg-user"],[1,"msg-time"],[1,"msg-row","msg-row-ai"],[1,"ai-avatar","flex-shrink-0"],[1,"bi","bi-robot"],[1,"d-flex","flex-column","align-items-start","gap-1"],[1,"msg-bubble","msg-ai","markdown-body"],[3,"data","disableSanitizer"],["class","d-flex align-items-center flex-wrap gap-1",4,"ngIf"],[3,"usage","cost",4,"ngIf"],[1,"d-flex","align-items-center","gap-2"],["tooltipPlacement","top",1,"msg-copy-btn",3,"click","bsTooltip"],[1,"bi",3,"ngClass"],[1,"d-flex","align-items-center","flex-wrap","gap-1"],[1,"bi","bi-tools","text-muted",2,"font-size","0.7rem"],["class","badge bg-light text-muted border","style","font-size: 0.65rem;",4,"ngFor","ngForOf"],[1,"badge","bg-light","text-muted","border",2,"font-size","0.65rem"],[3,"usage","cost"],[1,"msg-bubble","msg-ai","d-flex","align-items-center","gap-2"],[1,"thinking-dots"],[1,"small","text-muted"],[1,"chat-error-toast"],[1,"bi","bi-exclamation-triangle-fill","me-2","flex-shrink-0"],[1,"flex-grow-1"],[1,"btn-close","btn-close-sm","ms-2",3,"click"],["tooltipPlacement","top",1,"btn","btn-danger","px-3",3,"click","bsTooltip"],[1,"bi","bi-stop-fill"],["role","status",1,"spinner-border","spinner-border-sm"],[1,"bi","bi-send-fill"]],template:function(r,i){if(r&1){let o=be();_(0,"div",1)(1,"div",2)(2,"div",3)(3,"p",4),y(4,"i",5),h(5,"Model "),g(),F(6,mq,8,0,"div",6)(7,Tq,4,2,"select",7),g(),_(8,"div",8)(9,"p",4),y(10,"i",9),h(11,"Tools "),F(12,Cq,2,1,"span",10),g(),F(13,vq,8,0,"div",6)(14,Oq,10,5,"div",11),g(),_(15,"div",12)(16,"button",13),L("click",function(){return q(o),z(i.clearChat())}),y(17,"i",14),h(18,"Clear Chat "),g()()(),_(19,"div",15)(20,"div",16)(21,"div",17)(22,"div",18),y(23,"i",19),_(24,"span",20),h(25,"Chat"),g()(),_(26,"div",21)(27,"input",22),Yt("ngModelChange",function(a){return q(o),rn(i.isProjectModeActive,a)||(i.isProjectModeActive=a),z(a)}),g(),_(28,"label",23),y(29,"i",24),h(30,"Expert Mode "),g(),_(31,"input",25),Yt("ngModelChange",function(a){return q(o),rn(i.isProjectModeActive,a)||(i.isProjectModeActive=a),z(a)}),g(),_(32,"label",26),y(33,"i",27),h(34,"Project Mode "),g()()(),_(35,"div",28)(36,"div",29),F(37,Rq,5,5,"ng-container",30)(38,Nq,3,2,"span",31),g(),F(39,Aq,10,6,"div",32),g()(),_(40,"div",33,0),F(42,wq,6,0,"div",34)(43,Fq,3,2,"ng-container",35)(44,Uq,10,0,"div",36),g(),_(45,"div",37)(46,"span",38),y(47,"i",39),_(48,"span",40),h(49,"Session Cost:"),g(),_(50,"span",41),h(51),g()(),_(52,"button",42),L("click",function(){return q(o),z(i.resetSessionCost())}),y(53,"i",43),g()(),_(54,"div",44),F(55,Bq,5,1,"div",45),_(56,"div",46)(57,"textarea",47),Yt("ngModelChange",function(a){return q(o),rn(i.inputMessage,a)||(i.inputMessage=a),z(a)}),L("keydown",function(a){return q(o),z(i.onEnter(a))}),g(),F(58,Gq,2,1,"button",48),_(59,"button",49),L("click",function(){return q(o),z(i.sendMessage())}),F(60,Vq,1,0,"span",50)(61,$q,1,0,"i",51),g()()()()()}r&2&&(f(6),C("ngIf",i.providers.length===0),f(),C("ngIf",i.providers.length>0),f(5),C("ngIf",i.activeToolCount>0),f(),C("ngIf",i.mcpConnections.length===0),f(),C("ngForOf",i.mcpConnections),f(2),C("disabled",i.messages.length===0),f(11),C("value",!1),$t("ngModel",i.isProjectModeActive),f(4),C("value",!0),$t("ngModel",i.isProjectModeActive),f(6),C("ngIf",i.getSelectedProvider()),f(),C("ngIf",i.activeToolCount>0),f(),C("ngIf",i.isProjectModeActive),f(3),C("ngIf",i.messages.length===0&&!i.isThinking),f(),C("ngForOf",i.messages),f(),C("ngIf",i.isThinking),f(7),ie("$",i.totalSessionCost.toFixed(4),""),f(),C("bsTooltip","Reset session cost")("disabled",i.totalSessionCost===0),f(3),C("ngIf",i.showError),f(2),C("placeholder",i.inputPlaceholder),$t("ngModel",i.inputMessage),C("disabled",i.isThinking),f(),C("ngIf",i.isThinking),f(),C("disabled",!i.inputMessage.trim()||i.isThinking),f(),C("ngIf",i.isThinking),f(),C("ngIf",!i.isThinking))},dependencies:[vr,yr,Lt,Xl,IS,OS,hc,Ec,Un,y_,so,A_,Ar,ci,zT,id,nA,to,Jl,RS],styles:["[_nghost-%COMP%]{display:flex;height:100%;overflow:hidden}.chat-wrapper[_ngcontent-%COMP%]{display:flex;width:100%;height:100%;overflow:hidden}.chat-sidebar[_ngcontent-%COMP%]{width:280px;min-width:260px;display:flex;flex-direction:column;overflow:hidden;border-right:1px solid #dee2e6;background-color:#f8f9fa}.sidebar-section[_ngcontent-%COMP%]{flex-shrink:0}.sidebar-section.sidebar-scroll[_ngcontent-%COMP%]{flex:1;overflow-y:auto;min-height:0}.sidebar-footer[_ngcontent-%COMP%]{flex-shrink:0;background-color:#f8f9fa}.section-title[_ngcontent-%COMP%]{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#6c757d;margin:0}.server-block[_ngcontent-%COMP%] .server-header[_ngcontent-%COMP%]{background-color:#f1f3f5;border-radius:.25rem .25rem 0 0;cursor:default}.server-block[_ngcontent-%COMP%] .flex-1[_ngcontent-%COMP%]{flex:1;min-width:0}.tools-list[_ngcontent-%COMP%] .form-check[_ngcontent-%COMP%]{min-width:0}.tools-list[_ngcontent-%COMP%] .form-check[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{max-width:200px;cursor:pointer}.chat-main[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden;background-color:#fff}.chat-header[_ngcontent-%COMP%]{background-color:#fff;min-height:70px}.chat-header-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;min-width:0}.chat-header-top[_ngcontent-%COMP%]{justify-content:space-between}.chat-title-wrap[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.35rem;color:#1f2937}.chat-header-bottom[_ngcontent-%COMP%]{justify-content:space-between;border-top:1px solid #f1f3f5;padding-top:.45rem}.meta-strip[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;gap:.35rem;min-width:0}.context-strip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.45rem;min-width:0;max-width:56%}.context-item[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.35rem;color:#6c757d;min-width:0;font-size:.75rem}.context-path[_ngcontent-%COMP%]{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chat-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;min-height:0;padding:1.5rem;display:flex;flex-direction:column;gap:1.25rem;background-color:#f8f9fa}.empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#6c757d;text-align:center}.msg-row[_ngcontent-%COMP%]{display:flex;align-items:flex-end;gap:.5rem}.msg-row.msg-row-user[_ngcontent-%COMP%]{align-self:flex-end;flex-direction:column;align-items:flex-end;max-width:72%}.msg-row.msg-row-ai[_ngcontent-%COMP%]{align-self:flex-start;max-width:80%}.msg-bubble[_ngcontent-%COMP%]{padding:.6rem 1rem;border-radius:1rem;line-height:1.55;word-break:break-word;white-space:pre-wrap}.msg-bubble.msg-user[_ngcontent-%COMP%]{background-color:#0d6efd;color:#fff;border-bottom-right-radius:.25rem}.msg-bubble.msg-ai[_ngcontent-%COMP%]{background-color:#fff;color:#212529;border:1px solid #dee2e6;white-space:normal;border-bottom-left-radius:.25rem}.ai-avatar[_ngcontent-%COMP%]{width:32px;height:32px;border-radius:50%;background-color:#0d6efd;color:#fff;display:flex;align-items:center;justify-content:center;font-size:.85rem;flex-shrink:0}.msg-time[_ngcontent-%COMP%]{font-size:.68rem;color:#adb5bd}.msg-copy-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:1px solid transparent;border-radius:.25rem;padding:.1rem .3rem;font-size:.75rem;color:#adb5bd;cursor:pointer;transition:color .15s ease,border-color .15s ease,background-color .15s ease;line-height:1}.msg-copy-btn[_ngcontent-%COMP%]:hover{color:#0d6efd;border-color:#cfe2ff;background-color:#eef4ff}.msg-copy-btn.msg-copy-btn--copied[_ngcontent-%COMP%]{color:#198754;border-color:#a3cfbb;background-color:#d1e7dd}.thinking-dots[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px}.thinking-dots[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-block;width:7px;height:7px;border-radius:50%;background-color:#adb5bd;animation:_ngcontent-%COMP%_bounce 1.2s infinite ease-in-out}.thinking-dots[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(1){animation-delay:0s}.thinking-dots[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){animation-delay:.2s}.thinking-dots[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(3){animation-delay:.4s}@keyframes _ngcontent-%COMP%_bounce{0%,80%,to{transform:scale(.6);opacity:.5}40%{transform:scale(1);opacity:1}}.markdown-body[_ngcontent-%COMP%]{line-height:1.5;font-size:.9rem;color:#212529;word-break:break-word;min-width:0;white-space:normal}.markdown-body[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{margin-top:0!important}.markdown-body[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:last-child{margin-bottom:0!important}.markdown-body[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-bottom:.3rem;line-height:1.5}.markdown-body[_ngcontent-%COMP%] h1[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] h6[_ngcontent-%COMP%]{font-weight:700;line-height:1.3;margin:.9rem 0 .35rem;color:#1a1a2e}.markdown-body[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{font-size:1.2rem}.markdown-body[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:1.08rem}.markdown-body[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:.98rem}.markdown-body[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] h5[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] h6[_ngcontent-%COMP%]{font-size:.9rem}.markdown-body[_ngcontent-%COMP%] code[_ngcontent-%COMP%]:not(pre > code)[_ngcontent-%COMP%]{background:#eef2ff;color:#3730a3;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.82em;padding:.15em .4em;border-radius:.25rem;white-space:nowrap}.markdown-body[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{background:#1e1e2e;color:#cdd6f4;border-radius:.5rem;padding:.9rem 1rem;margin:.6rem 0;overflow-x:auto;font-size:.82rem;line-height:1.55}.markdown-body[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:transparent;color:inherit;padding:0;font-size:inherit;white-space:pre}.markdown-body[_ngcontent-%COMP%] ul[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] ol[_ngcontent-%COMP%]{padding-left:1.4rem;margin-bottom:.55rem}.markdown-body[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] li[_ngcontent-%COMP%] + li[_ngcontent-%COMP%], .markdown-body[_ngcontent-%COMP%] ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%] + li[_ngcontent-%COMP%]{margin-top:.2rem}.markdown-body[_ngcontent-%COMP%] blockquote[_ngcontent-%COMP%]{border-left:3px solid #0d6efd;margin:.6rem 0;padding:.4rem .8rem;color:#495057;background:#f0f4ff;border-radius:0 .25rem .25rem 0;font-style:italic}.markdown-body[_ngcontent-%COMP%] blockquote[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-bottom:0}.markdown-body[_ngcontent-%COMP%] table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;font-size:.85rem;margin:.6rem 0}.markdown-body[_ngcontent-%COMP%] table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{background:#f0f4ff;font-weight:700;text-align:left;padding:.4rem .65rem;border:1px solid #dee2e6}.markdown-body[_ngcontent-%COMP%] table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:.35rem .65rem;border:1px solid #dee2e6}.markdown-body[_ngcontent-%COMP%] table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:nth-child(2n) td[_ngcontent-%COMP%]{background:#f8f9fa}.markdown-body[_ngcontent-%COMP%] hr[_ngcontent-%COMP%]{border:none;border-top:1px solid #dee2e6;margin:.75rem 0}.markdown-body[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{background:transparent;padding:0;margin:0;overflow:visible;font-size:inherit}.markdown-body[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:transparent;color:inherit;padding:0}.markdown-body[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-weight:700;color:#1a1a2e}.markdown-body[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{font-style:italic}.markdown-body[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{color:#0d6efd;text-decoration:none}.markdown-body[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:hover{text-decoration:underline}.session-cost-bar[_ngcontent-%COMP%]{background-color:#f8f9fa;min-height:34px}.session-cost-bar[_ngcontent-%COMP%] .session-cost-label[_ngcontent-%COMP%]{font-size:.75rem;color:#6c757d}.session-cost-bar[_ngcontent-%COMP%] .session-cost-value[_ngcontent-%COMP%]{font-weight:700;color:#0d6efd;font-size:.8rem}.session-cost-bar[_ngcontent-%COMP%] .session-cost-reset[_ngcontent-%COMP%]{padding:.1rem .4rem;font-size:.75rem;color:#adb5bd;border:1px solid #dee2e6;background:transparent;border-radius:.375rem;line-height:1.2;transition:color .15s,border-color .15s}.session-cost-bar[_ngcontent-%COMP%] .session-cost-reset[_ngcontent-%COMP%]:hover:not(:disabled){color:#0d6efd;border-color:#0d6efd}.session-cost-bar[_ngcontent-%COMP%] .session-cost-reset[_ngcontent-%COMP%]:disabled{opacity:.35}.chat-input-area[_ngcontent-%COMP%]{position:relative;background-color:#fff}.chat-input-area[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{font-size:.9rem}.chat-input-area[_ngcontent-%COMP%] .btn-primary[_ngcontent-%COMP%]{border-top-left-radius:0;border-bottom-left-radius:0}.chat-input-area[_ngcontent-%COMP%] .btn-outline-danger[_ngcontent-%COMP%]{border-radius:0;border-left:0;border-right:0}.mode-segment[_ngcontent-%COMP%]{display:inline-flex;border-radius:1rem;overflow:hidden;border:1px solid #dee2e6;background-color:#f1f3f5}.mode-segment[_ngcontent-%COMP%] .mode-btn[_ngcontent-%COMP%]{border:none;border-radius:0;font-size:.75rem;font-weight:600;padding:.25rem .85rem;background-color:transparent;color:#495057;transition:background-color .18s,color .18s,box-shadow .18s}.mode-segment[_ngcontent-%COMP%] .mode-btn[_ngcontent-%COMP%]:first-of-type{border-radius:1rem 0 0 1rem}.mode-segment[_ngcontent-%COMP%] .mode-btn[_ngcontent-%COMP%]:last-of-type{border-radius:0 1rem 1rem 0}.mode-segment[_ngcontent-%COMP%] .mode-btn[_ngcontent-%COMP%]:hover{color:#198754}.mode-segment[_ngcontent-%COMP%] .btn-check[_ngcontent-%COMP%]:checked + .mode-btn-expert[_ngcontent-%COMP%]{background-color:#198754;color:#fff;box-shadow:inset 0 1px 3px #00000026}.mode-segment[_ngcontent-%COMP%] .btn-check[_ngcontent-%COMP%]:checked + .mode-btn-project[_ngcontent-%COMP%]{background-color:#198754;color:#fff;box-shadow:inset 0 1px 3px #00000026}.dark[_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%]{background-color:#1e2530;border-color:#3a4255}.dark[_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%] .mode-btn[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%] .mode-btn[_ngcontent-%COMP%]{color:#9ca3b0}.dark[_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%] .mode-btn[_ngcontent-%COMP%]:hover, .dark [_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%] .mode-btn[_ngcontent-%COMP%]:hover{color:#6ee7b7}.dark[_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%] .btn-check[_ngcontent-%COMP%]:checked + .mode-btn-expert[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%] .btn-check[_ngcontent-%COMP%]:checked + .mode-btn-expert[_ngcontent-%COMP%], .dark[_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%] .btn-check[_ngcontent-%COMP%]:checked + .mode-btn-project[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .mode-segment[_ngcontent-%COMP%] .btn-check[_ngcontent-%COMP%]:checked + .mode-btn-project[_ngcontent-%COMP%]{background-color:#198754;color:#fff}.chat-error-toast[_ngcontent-%COMP%]{position:absolute;bottom:100%;left:1rem;right:1rem;margin-bottom:.4rem;z-index:20;display:flex;align-items:center;gap:.4rem;padding:.45rem .75rem;font-size:.8rem;background-color:#f8d7da;color:#842029;border:1px solid #f5c2c7;border-radius:.375rem;box-shadow:0 2px 8px #0000001f}@media (max-width: 992px){.chat-header-top[_ngcontent-%COMP%], .chat-header-bottom[_ngcontent-%COMP%]{flex-wrap:wrap;justify-content:flex-start}.context-strip[_ngcontent-%COMP%]{max-width:100%}}"]})}}return e})();var zq=["logsTerminal"];function Wq(e,n){if(e&1){let t=be();_(0,"div",28),y(1,"i",29),h(2),_(3,"button",30),L("click",function(){q(t);let i=R();return z(i.dismissError())}),g()()}if(e&2){let t=R();f(2),ie("",t.errorMessage," ")}}function Kq(e,n){e&1&&y(0,"span",31)}function jq(e,n){e&1&&y(0,"i",32)}function Qq(e,n){e&1&&(_(0,"div",33),y(1,"i",34),h(2," No active connections "),g())}function Xq(e,n){if(e&1){let t=be();_(0,"div",35),L("click",function(){let i=q(t).$implicit,o=R();return z(o.selectConnection(i.connectionId))}),_(1,"span",36),y(2,"i",37),g(),_(3,"div",38)(4,"div",39),h(5),g(),_(6,"div",40),h(7),g(),_(8,"div",41),h(9),g()(),_(10,"button",42),L("click",function(i){let o=q(t).$implicit,s=R();return z(s.disconnect(o.connectionId,i))}),y(11,"i",43),g()()}if(e&2){let t=n.$implicit,r=R();j("active",r.selectedConnectionId===t.connectionId),f(5),J(t.label),f(2),nn("",t.command," ",t.args.join(" "),""),f(2),nn("",t.toolCount," tool",t.toolCount!==1?"s":"",""),f(),j("text-white",r.selectedConnectionId===t.connectionId)("text-danger",r.selectedConnectionId!==t.connectionId)}}function Zq(e,n){e&1&&(_(0,"div",44),y(1,"i",45),_(2,"p",46),h(3,"No server selected"),g(),_(4,"p",47),h(5,"Connect to an MCP server and select it from the sidebar."),g()())}function Jq(e,n){if(e&1&&(_(0,"div",77)(1,"p",78),h(2),g(),_(3,"pre",79),h(4),St(5,"json"),g()()),e&2){let t=R().$implicit;f(2),J(t.description),f(2),J(sn(5,2,t.inputSchema))}}function ez(e,n){if(e&1){let t=be();_(0,"div")(1,"div",72),L("click",function(){let i=q(t).$implicit,o=R(2);return z(o.selectTool(i))}),y(2,"i",73),_(3,"span",74),h(4),g(),y(5,"i",75),g(),F(6,Jq,6,4,"div",76),g()}if(e&2){let t=n.$implicit,r=n.last,i=R(2);j("border-bottom",!r),f(),j("tool-active",(i.selectedTool==null?null:i.selectedTool.name)===t.name),f(3),J(t.name),f(),j("bi-chevron-down",(i.selectedTool==null?null:i.selectedTool.name)!==t.name)("bi-chevron-up",(i.selectedTool==null?null:i.selectedTool.name)===t.name),f(),C("ngIf",(i.selectedTool==null?null:i.selectedTool.name)===t.name)}}function tz(e,n){e&1&&(_(0,"div",80),y(1,"span",81),h(2,"Loading tools... "),g())}function nz(e,n){if(e&1&&(_(0,"span",82),h(1),g()),e&2){let t=R(2);f(),J(t.selectedTool.name)}}function rz(e,n){e&1&&(_(0,"div",83),y(1,"i",84),h(2," Select a tool above to run it "),g())}function iz(e,n){e&1&&y(0,"span",31)}function oz(e,n){e&1&&y(0,"i",93)}function sz(e,n){if(e&1){let t=be();Ve(0),_(1,"div",85)(2,"label",86),h(3," Arguments "),_(4,"span",87),h(5,"(JSON object)"),g()(),_(6,"textarea",88),Yt("ngModelChange",function(i){q(t);let o=R(2);return rn(o.toolArgsJson,i)||(o.toolArgsJson=i),z(i)}),g()(),_(7,"button",89),L("click",function(){q(t);let i=R(2);return z(i.runTool())}),F(8,iz,1,0,"span",16)(9,oz,1,0,"i",90),h(10),g(),_(11,"div")(12,"label",86),y(13,"i",91),h(14,"Response "),g(),_(15,"pre",92),h(16),g()(),$e()}if(e&2){let t=R(2);f(6),$t("ngModel",t.toolArgsJson),f(),C("disabled",t.isExecuting),f(),C("ngIf",t.isExecuting),f(),C("ngIf",!t.isExecuting),f(),ie(" ",t.isExecuting?"Running...":"Run Tool"," "),f(6),J(t.toolResult||"// awaiting execution...")}}function az(e,n){e&1&&(_(0,"div",94),h(1," // No logs yet \u2014 they will appear here as tools are called "),g())}function lz(e,n){if(e&1&&(_(0,"div",95),h(1),g()),e&2){let t=n.$implicit;j("log-success",t.includes("[SUCCESS]"))("log-error",t.includes("[ERROR]"))("log-bridge",t.includes("[BRIDGE]"))("log-init",t.includes("[INIT]")||t.includes("[TOOL_CALL]")),f(),J(t)}}function cz(e,n){if(e&1){let t=be();Ve(0),_(1,"div",48)(2,"div",19),y(3,"i",49),h(4," Tool Explorer "),_(5,"span",50),h(6),g()(),_(7,"div",51),F(8,ez,7,10,"div",52)(9,tz,3,0,"div",53),g()(),_(10,"div",54)(11,"div",55),y(12,"i",56),h(13," Execution Console "),F(14,nz,2,1,"span",57),g(),_(15,"div",58),F(16,rz,3,0,"div",59)(17,sz,17,6,"ng-container",27),g()(),_(18,"div",60)(19,"div",55),y(20,"i",61),h(21," Server Logs "),_(22,"span",50),h(23),g(),_(24,"div",62),y(25,"span",63),_(26,"span",64),h(27),g(),_(28,"button",65),L("click",function(){q(t);let i=R();return z(i.toggleLogsPaused())}),y(29,"i",66),h(30),g(),_(31,"button",67),L("click",function(){q(t);let i=R();return z(i.clearServerLogs())}),y(32,"i",68),h(33,"Clear "),g()()(),_(34,"div",69,0),F(36,az,2,0,"div",70)(37,lz,2,9,"div",71),g()(),$e()}if(e&2){let t=R();f(6),J(t.tools.length),f(2),C("ngForOf",t.tools),f(),C("ngIf",t.tools.length===0),f(5),C("ngIf",t.selectedTool),f(2),C("ngIf",!t.selectedTool),f(),C("ngIf",t.selectedTool),f(6),J(t.serverLogs.length),f(2),j("paused",t.logsPaused),f(2),J(t.logsPaused?"Paused":"Live"),f(),j("btn-outline-warning",!t.logsPaused)("btn-outline-success",t.logsPaused),C("title",t.logsPaused?"Resume log polling":"Pause log polling"),f(),j("bi-pause-fill",!t.logsPaused)("bi-play-fill",t.logsPaused),f(),ie(" ",t.logsPaused?"Resume":"Pause"," "),f(6),C("ngIf",t.serverLogs.length===0),f(),C("ngForOf",t.serverLogs)}}var iA=(()=>{class e{constructor(t){this.mcpService=t,this.command="npx",this.argsInput="",this.connections=[],this.selectedConnectionId=null,this.tools=[],this.selectedTool=null,this.toolArgsJson="{}",this.toolResult="",this.serverLogs=[],this.logsPaused=!1,this.isConnecting=!1,this.isExecuting=!1,this.errorMessage="",this.showError=!1,this.logsInterval=null,console.log(`[INIT] ${new Date().toISOString()} McpConfigComponent initialized`)}ngOnInit(){this.mcpService.getClients().subscribe({next:t=>{this.connections=t,console.log(`[SUCCESS] ${new Date().toISOString()} McpConfigComponent loaded ${t.length} existing connection(s)`)},error:t=>console.log(`[ERROR] ${new Date().toISOString()} McpConfigComponent failed to load connections | ${t.message}`)})}ngOnDestroy(){this.stopLogsPolling()}startLogsPolling(t){this.stopLogsPolling(),this.logsInterval=setInterval(()=>{this.logsPaused||this.mcpService.getLogs(t).subscribe({next:r=>{this.serverLogs=r.logs,setTimeout(()=>{let i=this.logsTerminalRef?.nativeElement;i&&(i.scrollTop=i.scrollHeight)},0)},error:()=>{}})},1500)}stopLogsPolling(){this.logsInterval!==null&&(clearInterval(this.logsInterval),this.logsInterval=null)}clearServerLogs(){this.selectedConnectionId&&this.mcpService.clearLogs(this.selectedConnectionId).subscribe({next:()=>{this.serverLogs=[]},error:()=>{}})}toggleLogsPaused(){this.logsPaused=!this.logsPaused,console.log(`[INIT] ${new Date().toISOString()} Log polling ${this.logsPaused?"paused":"resumed"}`)}connect(){if(!this.command.trim())return;let t=this.argsInput.trim().split(/\s+/).filter(r=>r.length>0);this.isConnecting=!0,this.dismissError(),this.mcpService.connect(this.command.trim(),t).subscribe({next:r=>{this.connections.push({connectionId:r.connectionId,label:r.label,command:r.command,args:r.args,toolCount:r.tools.length}),this.isConnecting=!1,this.selectConnection(r.connectionId),console.log(`[SUCCESS] ${new Date().toISOString()} McpConfigComponent connected | id: ${r.connectionId}`)},error:r=>{this.showAlert(r.error?.error??"Failed to connect. Check command and args."),this.isConnecting=!1}})}selectConnection(t){this.selectedConnectionId=t,this.selectedTool=null,this.toolResult="",this.toolArgsJson="{}",this.serverLogs=[],this.logsPaused=!1,this.dismissError(),this.mcpService.getTools(t).subscribe({next:r=>{this.tools=r.tools},error:r=>{this.showAlert(r.error?.error??"Failed to load tools")}}),this.startLogsPolling(t)}selectTool(t){if(this.selectedTool?.name===t.name){this.selectedTool=null;return}this.selectedTool=t,this.toolResult="";let r=t.inputSchema?.properties??{},i={};Object.keys(r).forEach(o=>{let s=r[o];s.type==="array"?i[o]=[]:s.type==="string"?i[o]="":s.type==="number"?i[o]=0:i[o]=null}),this.toolArgsJson=JSON.stringify(i,null,2)}runTool(){if(!this.selectedTool||!this.selectedConnectionId)return;let t={};try{t=JSON.parse(this.toolArgsJson)}catch{this.showAlert('Arguments must be valid JSON (e.g. {"key": "value"})');return}this.isExecuting=!0,this.toolResult="",this.dismissError(),this.mcpService.execute(this.selectedConnectionId,this.selectedTool.name,t).subscribe({next:r=>{this.toolResult=JSON.stringify(r.result,null,2),this.isExecuting=!1,console.log(`[SUCCESS] ${new Date().toISOString()} Tool executed: ${this.selectedTool?.name}`)},error:r=>{this.toolResult=JSON.stringify({error:r.error?.error??"Execution failed"},null,2),this.isExecuting=!1}})}disconnect(t,r){r.stopPropagation(),this.selectedConnectionId===t&&this.stopLogsPolling(),this.mcpService.disconnect(t).subscribe({next:()=>{this.connections=this.connections.filter(i=>i.connectionId!==t),this.selectedConnectionId===t&&(this.selectedConnectionId=null,this.tools=[],this.selectedTool=null,this.toolResult="",this.serverLogs=[])},error:()=>{this.connections=this.connections.filter(i=>i.connectionId!==t)}})}showAlert(t){this.errorMessage=t,this.showError=!0}dismissError(){this.showError=!1,this.errorMessage=""}static{this.\u0275fac=function(r){return new(r||e)(M(sd))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-mcp-config"]],viewQuery:function(r,i){if(r&1&&tn(zq,5),r&2){let o;xt(o=Pt())&&(i.logsTerminalRef=o.first)}},decls:39,vars:16,consts:[["logsTerminal",""],["class","alert alert-danger alert-dismissible fade show mb-3 flex-shrink-0","role","alert",4,"ngIf"],[1,"row","g-3","mcp-row"],[1,"col-lg-4","sidebar-col"],[1,"card","shadow-sm","mb-2"],[1,"card-header","bg-primary","text-white","fw-semibold"],[1,"bi","bi-plug-fill","me-2"],[1,"card-body","py-2"],[1,"mb-2"],[1,"form-label","small","text-muted","mb-1"],[1,"d-flex","gap-1","align-items-center"],["type","text","placeholder","node",1,"form-control","form-control-sm","font-monospace",2,"max-width","90px",3,"ngModelChange","keyup.enter","ngModel"],[1,"btn","btn-outline-secondary","btn-sm",3,"click"],[1,"fw-normal"],["type","text","placeholder","MCP server name or file path",1,"form-control","form-control-sm","font-monospace",3,"ngModelChange","keyup.enter","ngModel"],[1,"btn","btn-primary","w-100","mt-1",3,"click","disabled"],["class","spinner-border spinner-border-sm me-2","role","status",4,"ngIf"],["class","bi bi-power me-2",4,"ngIf"],[1,"card","shadow-sm","connections-card"],[1,"card-header","fw-semibold","d-flex","align-items-center"],[1,"bi","bi-hdd-network","me-2","text-primary"],[1,"badge","bg-primary","ms-auto"],[1,"connections-list","list-group","list-group-flush"],["class","list-group-item text-muted small text-center py-4",4,"ngIf"],["class","list-group-item list-group-item-action d-flex align-items-center gap-2 py-1","style","cursor: pointer;",3,"active","click",4,"ngFor","ngForOf"],[1,"col-lg-8","main-col"],["class","card shadow-sm text-center py-5 text-muted border-dashed",4,"ngIf"],[4,"ngIf"],["role","alert",1,"alert","alert-danger","alert-dismissible","fade","show","mb-3","flex-shrink-0"],[1,"bi","bi-exclamation-triangle-fill","me-2"],["type","button",1,"btn-close",3,"click"],["role","status",1,"spinner-border","spinner-border-sm","me-2"],[1,"bi","bi-power","me-2"],[1,"list-group-item","text-muted","small","text-center","py-4"],[1,"bi","bi-cloud-slash","d-block","fs-4","mb-2","opacity-50"],[1,"list-group-item","list-group-item-action","d-flex","align-items-center","gap-2","py-1",2,"cursor","pointer",3,"click"],[1,"text-success"],[1,"bi","bi-circle-fill",2,"font-size","0.55rem"],[1,"flex-grow-1","overflow-hidden"],[1,"fw-semibold","small","text-truncate"],[1,"small","opacity-75","font-monospace","text-truncate"],[1,"small","opacity-75"],["title","Disconnect",1,"btn","btn-sm","p-0","ms-auto","opacity-50",3,"click"],[1,"bi","bi-x-circle"],[1,"card","shadow-sm","text-center","py-5","text-muted","border-dashed"],[1,"bi","bi-arrow-left-circle","fs-1","d-block","mb-3","text-primary","opacity-35"],[1,"mb-1","fw-semibold"],[1,"small","mb-0"],[1,"card","shadow-sm","mb-4"],[1,"bi","bi-tools","me-2","text-primary"],[1,"badge","bg-secondary","ms-2"],[1,"tools-scroll-area"],[3,"border-bottom",4,"ngFor","ngForOf"],["class","p-4 text-center text-muted small",4,"ngIf"],[1,"card","shadow-sm"],[1,"card-header","bg-white","fw-semibold","d-flex","align-items-center"],[1,"bi","bi-terminal-fill","me-2","text-primary"],["class","badge bg-primary ms-2",4,"ngIf"],[1,"card-body"],["class","text-muted small text-center py-3",4,"ngIf"],[1,"card","shadow-sm","flex-shrink-0"],[1,"bi","bi-list-ul","me-2","text-primary"],[1,"ms-auto","d-flex","align-items-center","gap-2"],[1,"live-dot"],[1,"small","text-muted"],[1,"btn","btn-sm","py-0","px-2","ms-1",3,"click","title"],[1,"bi","me-1"],["title","Clear logs",1,"btn","btn-sm","btn-outline-secondary","py-0","px-2",3,"click"],[1,"bi","bi-trash3","me-1"],[1,"logs-terminal","p-3","font-monospace","small"],["class","log-empty",4,"ngIf"],["class","log-line",3,"log-success","log-error","log-bridge","log-init",4,"ngFor","ngForOf"],[1,"d-flex","align-items-center","px-3","py-2","tool-header",2,"cursor","pointer",3,"click"],[1,"bi","bi-gear-fill","text-primary","me-2","flex-shrink-0"],[1,"fw-semibold","small","flex-grow-1"],[1,"bi","ms-2","text-muted"],["class","px-3 pb-3 pt-1 bg-light border-top",4,"ngIf"],[1,"px-3","pb-3","pt-1","bg-light","border-top"],[1,"text-muted","small","mb-2"],[1,"bg-white","rounded","border","p-3","small","mb-0",2,"max-height","180px","overflow-y","auto"],[1,"p-4","text-center","text-muted","small"],[1,"spinner-border","spinner-border-sm","me-2"],[1,"badge","bg-primary","ms-2"],[1,"text-muted","small","text-center","py-3"],[1,"bi","bi-hand-index-thumb","d-block","fs-4","mb-2","opacity-50"],[1,"mb-3"],[1,"form-label","fw-semibold","small"],[1,"text-muted","fw-normal"],["rows","5","spellcheck","false","placeholder",'{ "productNames": ["Yoga Mat"] }',1,"form-control","font-monospace","small",3,"ngModelChange","ngModel"],[1,"btn","btn-primary","mb-4",3,"click","disabled"],["class","bi bi-play-fill me-1",4,"ngIf"],[1,"bi","bi-terminal","me-1"],[1,"response-terminal","rounded","p-3","font-monospace","small","mb-0",2,"min-height","130px","max-height","420px","overflow-y","auto"],[1,"bi","bi-play-fill","me-1"],[1,"log-empty"],[1,"log-line"]],template:function(r,i){r&1&&(F(0,Wq,4,1,"div",1),_(1,"div",2)(2,"div",3)(3,"div",4)(4,"div",5),y(5,"i",6),h(6,"Connect to Server "),g(),_(7,"div",7)(8,"div",8)(9,"label",9),h(10,"Command"),g(),_(11,"div",10)(12,"input",11),Yt("ngModelChange",function(s){return rn(i.command,s)||(i.command=s),s}),L("keyup.enter",function(){return i.connect()}),g(),_(13,"button",12),L("click",function(){return i.command="node"}),h(14,"node"),g(),_(15,"button",12),L("click",function(){return i.command="npx"}),h(16,"npx"),g()()(),_(17,"div",8)(18,"label",9),h(19,"Args "),_(20,"span",13),h(21,"(space-separated)"),g()(),_(22,"input",14),Yt("ngModelChange",function(s){return rn(i.argsInput,s)||(i.argsInput=s),s}),L("keyup.enter",function(){return i.connect()}),g()(),_(23,"button",15),L("click",function(){return i.connect()}),F(24,Kq,1,0,"span",16)(25,jq,1,0,"i",17),h(26),g()()(),_(27,"div",18)(28,"div",19),y(29,"i",20),h(30," Active Servers "),_(31,"span",21),h(32),g()(),_(33,"div",22),F(34,Qq,3,0,"div",23)(35,Xq,12,11,"div",24),g()()(),_(36,"div",25),F(37,Zq,6,0,"div",26)(38,cz,38,22,"ng-container",27),g()()),r&2&&(C("ngIf",i.showError),f(12),$t("ngModel",i.command),f(),j("active",i.command==="node"),f(2),j("active",i.command==="npx"),f(7),$t("ngModel",i.argsInput),f(),C("disabled",i.isConnecting),f(),C("ngIf",i.isConnecting),f(),C("ngIf",!i.isConnecting),f(),ie(" ",i.isConnecting?"Connecting...":"Connect"," "),f(6),J(i.connections.length),f(2),C("ngIf",i.connections.length===0),f(),C("ngForOf",i.connections),f(2),C("ngIf",!i.selectedConnectionId),f(),C("ngIf",i.selectedConnectionId))},dependencies:[yr,Lt,Un,Ar,ci,NS],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;overflow:hidden}.mcp-row[_ngcontent-%COMP%]{flex:1;min-height:0;overflow:hidden}.sidebar-col[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;overflow:hidden}.connections-card[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.connections-card[_ngcontent-%COMP%] .card-header[_ngcontent-%COMP%]{border-bottom:1px solid var(--bs-border-color)}.connections-list[_ngcontent-%COMP%]{flex:1;overflow-y:auto;min-height:0}.main-col[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;overflow-y:auto;padding-bottom:1rem}.tools-scroll-area[_ngcontent-%COMP%]{overflow-y:auto;max-height:260px}.tool-header[_ngcontent-%COMP%]{transition:background-color .15s ease}.tool-header[_ngcontent-%COMP%]:hover{background-color:#0d6efd0f}.tool-active[_ngcontent-%COMP%]{background-color:#0d6efd1a}.dark[_nghost-%COMP%] .card[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .card[_ngcontent-%COMP%], .dark[_nghost-%COMP%] .card-header[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .card-header[_ngcontent-%COMP%], .dark[_nghost-%COMP%] .card-footer[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .card-footer[_ngcontent-%COMP%], .dark[_nghost-%COMP%] .card-body[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .card-body[_ngcontent-%COMP%]{background-color:#161b27;border-color:#2a3347;color:#c9d1d9}.dark[_nghost-%COMP%] .list-group-item[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .list-group-item[_ngcontent-%COMP%]{background-color:#161b27;border-color:#2a3347;color:#c9d1d9}.dark[_nghost-%COMP%] .list-group-item.active[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .list-group-item.active[_ngcontent-%COMP%]{--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;--bs-list-group-active-color: #fff;background-color:#0d6efd!important;border-color:#0d6efd!important;color:#fff!important}.dark[_nghost-%COMP%] .list-group-item[_ngcontent-%COMP%]:hover:not(.active), .dark [_nghost-%COMP%] .list-group-item[_ngcontent-%COMP%]:hover:not(.active){background-color:#1e2530}.dark[_nghost-%COMP%] .tool-header[_ngcontent-%COMP%]:hover, .dark [_nghost-%COMP%] .tool-header[_ngcontent-%COMP%]:hover{background-color:#0d6efd26}.dark[_nghost-%COMP%] .tool-active[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .tool-active[_ngcontent-%COMP%]{background-color:#0d6efd4d;border-left:3px solid #0d6efd}.dark[_nghost-%COMP%] .border-bottom[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .border-bottom[_ngcontent-%COMP%]{border-color:#2a3347!important}.response-terminal[_ngcontent-%COMP%]{background-color:#1e1e2e;color:#a6e3a1;border:1px solid #313244}.logs-terminal[_ngcontent-%COMP%]{background-color:#0d1117;min-height:140px;max-height:220px;overflow-y:auto;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.log-line[_ngcontent-%COMP%]{color:#8b949e;line-height:1.6;white-space:pre-wrap;word-break:break-all}.log-line.log-success[_ngcontent-%COMP%]{color:#3fb950}.log-line.log-error[_ngcontent-%COMP%]{color:#f85149}.log-line.log-bridge[_ngcontent-%COMP%]{color:#58a6ff}.log-line.log-init[_ngcontent-%COMP%]{color:#d29922}.log-empty[_ngcontent-%COMP%]{color:#484f58}.live-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;background-color:#3fb950;display:inline-block;animation:_ngcontent-%COMP%_pulse 1.5s ease-in-out infinite}.live-dot.paused[_ngcontent-%COMP%]{background-color:#ffc107;animation:none}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.25}}.border-dashed[_ngcontent-%COMP%]{border-style:dashed!important}"]})}}return e})();function uz(e,n){if(e&1&&(_(0,"div",6)(1,"label",7),h(2,"Server URL"),g(),y(3,"input",34),_(4,"div",35),h(5),g()()),e&2){let t=R();f(3),C("placeholder",t.isLmStudioProvider?"http://localhost:1234":"http://localhost:11434"),f(2),ie(" Default: ",t.isLmStudioProvider?"http://localhost:1234":"http://localhost:11434"," ")}}function pz(e,n){if(e&1&&(_(0,"div",6)(1,"label",7),h(2,"API Key"),g(),y(3,"input",36),_(4,"div",15),h(5,"API key is required."),g()()),e&2){let t=R();f(3),j("is-invalid",t.llmForm.get("apiKey").invalid&&t.llmForm.get("apiKey").touched)}}function _z(e,n){e&1&&y(0,"span",45)}function mz(e,n){e&1&&y(0,"i",46)}function fz(e,n){e&1&&(_(0,"span",47),y(1,"i",48),h(2,"Enter your API key above first "),g())}function gz(e,n){if(e&1&&(_(0,"span",49),y(1,"i",50),h(2),g()),e&2){let t=R(2);f(2),ie("",t.modelOptions.length-1," model(s) available ")}}function hz(e,n){if(e&1&&(_(0,"div",51),y(1,"i",52),h(2),g()),e&2){let t=R(2);f(2),ie("",t.cloudFetchError," ")}}function Ez(e,n){if(e&1){let t=be();_(0,"div",37)(1,"div",38)(2,"button",39),L("click",function(){q(t);let i=R();return z(i.fetchCloudModels())}),F(3,_z,1,0,"span",40)(4,mz,1,0,"i",41),h(5),g(),F(6,fz,3,0,"span",42)(7,gz,3,1,"span",43),g(),F(8,hz,3,1,"div",44),g()}if(e&2){let t,r,i=R();f(2),C("disabled",i.cloudFetchStatus==="fetching"||!((t=i.llmForm.get("apiKey").value)!=null&&t.trim())),f(),C("ngIf",i.cloudFetchStatus==="fetching"),f(),C("ngIf",i.cloudFetchStatus!=="fetching"),f(),ie(" ",i.cloudFetchStatus==="fetching"?"Fetching...":"Fetch Available Models"," "),f(),C("ngIf",!((r=i.llmForm.get("apiKey").value)!=null&&r.trim())&&i.cloudFetchStatus==="idle"),f(),C("ngIf",i.cloudFetchStatus==="done"),f(),C("ngIf",i.cloudFetchStatus==="error")}}function Sz(e,n){e&1&&y(0,"span",45)}function bz(e,n){e&1&&y(0,"i",46)}function Tz(e,n){e&1&&(_(0,"span",56),y(1,"i",52),h(2,"Server not running "),g())}function Cz(e,n){if(e&1&&(_(0,"span",49),y(1,"i",50),h(2),g()),e&2){let t=R(2);f(2),ie("",t.lmStudioModels.length," model(s) loaded ")}}function vz(e,n){if(e&1){let t=be();_(0,"div",53)(1,"button",54),L("click",function(){q(t);let i=R();return z(i.fetchLmStudioModels())}),F(2,Sz,1,0,"span",40)(3,bz,1,0,"i",41),h(4),g(),F(5,Tz,3,0,"span",55)(6,Cz,3,1,"span",43),g()}if(e&2){let t=R();f(),C("disabled",t.lmStudioFetchStatus==="fetching"),f(),C("ngIf",t.lmStudioFetchStatus==="fetching"),f(),C("ngIf",t.lmStudioFetchStatus!=="fetching"),f(),ie(" ",t.lmStudioFetchStatus==="fetching"?"Fetching...":"Fetch Loaded Models"," "),f(),C("ngIf",t.lmStudioFetchStatus==="error"),f(),C("ngIf",t.lmStudioFetchStatus==="done")}}function yz(e,n){e&1&&y(0,"span",45)}function Iz(e,n){e&1&&y(0,"i",46)}function Oz(e,n){e&1&&(_(0,"span",56),y(1,"i",52),h(2,"Could not reach Ollama "),g())}function Rz(e,n){if(e&1&&(_(0,"span",49),y(1,"i",50),h(2),g()),e&2){let t=R(2);f(2),ie("",t.ollamaModels.length," model(s) found ")}}function Nz(e,n){if(e&1){let t=be();_(0,"div",53)(1,"button",39),L("click",function(){q(t);let i=R();return z(i.fetchOllamaModels())}),F(2,yz,1,0,"span",40)(3,Iz,1,0,"i",41),h(4),g(),F(5,Oz,3,0,"span",55)(6,Rz,3,1,"span",43),g()}if(e&2){let t=R();f(),C("disabled",t.ollamaFetchStatus==="fetching"),f(),C("ngIf",t.ollamaFetchStatus==="fetching"),f(),C("ngIf",t.ollamaFetchStatus!=="fetching"),f(),ie(" ",t.ollamaFetchStatus==="fetching"?"Fetching...":"Fetch Loaded Models"," "),f(),C("ngIf",t.ollamaFetchStatus==="error"),f(),C("ngIf",t.ollamaFetchStatus==="done")}}function Dz(e,n){if(e&1&&(_(0,"option",57),h(1),g()),e&2){let t=n.$implicit;C("value",t.value),f(),J(t.label)}}function Az(e,n){if(e&1&&(_(0,"div",58)(1,"label",7),h(2,"Custom Model ID"),g(),y(3,"input",59),_(4,"div",15),h(5,"Please enter a custom model ID."),g()()),e&2){let t=R();f(3),j("is-invalid",t.llmForm.get("customModel").invalid&&t.llmForm.get("customModel").touched)}}function wz(e,n){e&1&&y(0,"span",60)}function Mz(e,n){e&1&&y(0,"i",61)}function xz(e,n){if(e&1&&(_(0,"span",66),h(1),g()),e&2){let t=R(2);f(),ie(" ",t.verifyLatency,"ms ")}}function Pz(e,n){if(e&1&&(_(0,"div",62),y(1,"span",63),_(2,"span",64),h(3,"Added to registry"),g(),F(4,xz,2,1,"span",65),g()),e&2){let t=R();f(4),C("ngIf",t.verifyLatency!==null)}}function Lz(e,n){if(e&1&&(_(0,"span",73),h(1),g()),e&2){let t=R(2);f(),ie(" ",t.verifyLatency,"ms ")}}function kz(e,n){e&1&&(_(0,"div",74),y(1,"i",75),_(2,"strong"),h(3,"Hint:"),g(),h(4," In LM Studio, go to "),_(5,"em"),h(6,"Settings \u2192 Developer"),g(),h(7,", enable "),_(8,"strong"),h(9,"Developer Mode"),g(),h(10,", then open the "),_(11,"strong"),h(12,"Developer"),g(),h(13," tab and click "),_(14,"strong"),h(15,"Start Server"),g(),h(16,". "),g())}function Fz(e,n){if(e&1&&(_(0,"div",67)(1,"div",68),y(2,"span",69),_(3,"span",70),h(4,"Verification Failed"),g(),F(5,Lz,2,1,"span",71),g(),y(6,"i",52),h(7),F(8,kz,17,0,"div",72),g()),e&2){let t=R();f(5),C("ngIf",t.verifyLatency!==null),f(2),ie("",t.verifyError," "),f(),C("ngIf",t.isLmStudioProvider)}}function Uz(e,n){e&1&&(_(0,"div",76),y(1,"i",77),_(2,"p",78),h(3,"No providers connected yet"),g(),_(4,"p",79),h(5,"Use the form to verify and add a provider to the registry."),g()())}function Bz(e,n){e&1&&(_(0,"span",97),h(1,"Local"),g())}function Gz(e,n){if(e&1){let t=be();_(0,"tr")(1,"td")(2,"span",87),y(3,"i",88),_(4,"span",89),h(5),g(),F(6,Bz,2,0,"span",90),g()(),_(7,"td")(8,"span",91),h(9),g()(),_(10,"td",92)(11,"span",93),h(12),g()(),_(13,"td")(14,"span",94),h(15),g()(),_(16,"td")(17,"button",95),L("click",function(){let i=q(t).$implicit,o=R(2);return z(o.deleteEntry(i.id))}),y(18,"i",96),g()()()}if(e&2){let t=n.$implicit,r=R(2);f(3),C("ngClass",r.providerIconClass(t.provider)),f(2),J(r.providerLabel(t.provider)),f(),C("ngIf",t.provider==="ollama"||t.provider==="lmstudio"),f(3),J(t.model),f(2),j("bg-success-subtle",t.latency<2e3)("text-success",t.latency<2e3)("border-success-subtle",t.latency<2e3)("bg-warning-subtle",t.latency>=2e3)("text-warning",t.latency>=2e3)("border-warning-subtle",t.latency>=2e3),f(),ie(" ",t.latency,"ms "),f(3),J(r.formatTime(t.verifiedAt))}}function Vz(e,n){if(e&1&&(_(0,"div",80)(1,"table",81)(2,"thead",82)(3,"tr")(4,"th"),h(5,"Provider"),g(),_(6,"th"),h(7,"Model"),g(),_(8,"th",83),h(9,"Latency"),g(),_(10,"th",84),h(11,"Added"),g(),y(12,"th",85),g()(),_(13,"tbody"),F(14,Gz,19,18,"tr",86),g()()()),e&2){let t=R();f(14),C("ngForOf",t.registeredProviders)}}function $z(e,n){e&1&&(_(0,"div",98),y(1,"i",48),h(2," Verified providers are available for selection in the "),_(3,"strong"),h(4,"Chat"),g(),h(5," module. "),g())}var oA={gemini:"BlueOrchStudioGeminiApiKey",openai:"BlueOrchStudioOpenAIApiKey",claude:"BlueOrchStudioClaudeApiKey"},sA={label:"Other (Enter Model ID)",value:"other"},aA=(()=>{class e{constructor(t,r){this.llmService=t,this.fb=r,this.modelOptions=[],this.ollamaModels=[],this.ollamaFetchStatus="idle",this.lmStudioModels=[],this.lmStudioFetchStatus="idle",this.cloudFetchStatus="idle",this.cloudFetchError="",this.verifyStatus="idle",this.verifyLatency=null,this.verifyError="",this.registeredProviders=[],console.log(`[INIT] ${new Date().toISOString()} LlmConfigComponent initialized`),this.llmForm=this.fb.group({provider:["",ai.required],model:["",ai.required],customModel:[""],apiKey:["",ai.required],baseUrl:["http://localhost:11434"]})}ngOnInit(){this.loadRegistry()}loadRegistry(){this.llmService.getRegistry().subscribe({next:t=>{this.registeredProviders=t.registry,console.log(`[SUCCESS] ${new Date().toISOString()} Registry loaded | ${t.registry.length} entries`)},error:t=>{console.log(`[ERROR] ${new Date().toISOString()} Failed to load registry | ${t.message}`)}})}onProviderChange(){let t=this.llmForm.get("provider").value;this.modelOptions=[],this.llmForm.patchValue({model:"",customModel:""}),this.verifyStatus="idle",this.verifyLatency=null,this.verifyError="",this.cloudFetchStatus="idle",this.cloudFetchError="";let r=this.llmForm.get("apiKey");if(t==="ollama"||t==="lmstudio")r.clearValidators(),this.llmForm.patchValue({apiKey:""}),this.modelOptions=[sA],t==="ollama"?(this.llmForm.patchValue({baseUrl:"http://localhost:11434"}),this.ollamaModels=[],this.ollamaFetchStatus="idle"):(this.llmForm.patchValue({baseUrl:"http://localhost:1234"}),this.lmStudioModels=[],this.lmStudioFetchStatus="idle");else{r.setValidators([ai.required]);let i=oA[t],o=i?localStorage.getItem(i)??"":"";this.llmForm.patchValue({apiKey:o})}r.updateValueAndValidity(),console.log(`[INIT] ${new Date().toISOString()} Provider changed | provider: ${t}`)}get isCustomModel(){return this.llmForm.get("model").value==="other"}get isOllamaProvider(){return this.llmForm.get("provider").value==="ollama"}get isLmStudioProvider(){return this.llmForm.get("provider").value==="lmstudio"}get isLocalProvider(){return this.isOllamaProvider||this.isLmStudioProvider}get isCloudProvider(){let t=this.llmForm.get("provider").value;return t==="gemini"||t==="openai"||t==="claude"}fetchCloudModels(){let{provider:t,apiKey:r}=this.llmForm.value,i=r?.trim()??"";i&&(this.cloudFetchStatus="fetching",this.cloudFetchError="",console.log(`[INIT] ${new Date().toISOString()} fetchCloudModels() | provider: ${t}`),this.llmService.fetchCloudModels(t,i).subscribe({next:o=>{this.modelOptions=[...o.models,sA],this.cloudFetchStatus="done",console.log(`[SUCCESS] ${new Date().toISOString()} fetchCloudModels() | ${o.models.length} models`)},error:o=>{this.cloudFetchStatus="error",this.cloudFetchError=o.error?.error??"Failed to fetch models. Check your API key.",console.log(`[ERROR] ${new Date().toISOString()} fetchCloudModels() failed | ${this.cloudFetchError}`)}}))}fetchOllamaModels(){let t=this.llmForm.get("baseUrl").value.trim()||"http://localhost:11434";this.ollamaFetchStatus="fetching",console.log(`[INIT] ${new Date().toISOString()} fetchOllamaModels() | baseUrl: ${t}`),this.llmService.fetchOllamaModels(t).subscribe({next:r=>{this.ollamaModels=r.models,this.modelOptions=[...r.models.map(i=>({label:i.name,value:i.name})),{label:"Other (Enter Model ID)",value:"other"}],this.ollamaFetchStatus="done",console.log(`[SUCCESS] ${new Date().toISOString()} Ollama models fetched | ${r.models.length} models`)},error:r=>{this.ollamaFetchStatus="error",console.log(`[ERROR] ${new Date().toISOString()} Failed to fetch Ollama models | ${r.message}`)}})}fetchLmStudioModels(){let t=this.llmForm.get("baseUrl").value.trim()||"http://localhost:1234";this.lmStudioFetchStatus="fetching",console.log(`[INIT] ${new Date().toISOString()} fetchLmStudioModels() | baseUrl: ${t}`),this.llmService.fetchLmStudioModels(t).subscribe({next:r=>{this.lmStudioModels=r.models,this.modelOptions=[...r.models.map(i=>({label:i.id,value:i.id})),{label:"Other (Enter Model ID)",value:"other"}],r.models.length===0&&(this.modelOptions=[{label:"Other (Enter Model ID)",value:"other"}]),this.lmStudioFetchStatus="done",console.log(`[SUCCESS] ${new Date().toISOString()} LM Studio models fetched | ${r.models.length} models`)},error:r=>{this.lmStudioFetchStatus="error",console.log(`[ERROR] ${new Date().toISOString()} Failed to fetch LM Studio models | ${r.message}`)}})}providerLabel(t){return{gemini:"Gemini",openai:"OpenAI",claude:"Claude",ollama:"Ollama (Local)",lmstudio:"LM Studio"}[t]??t}providerIconClass(t){return{gemini:"bi-google",openai:"bi-robot",claude:"bi-cpu",ollama:"bi-hdd-fill",lmstudio:"bi-pc-display"}[t]??"bi-box"}formatTime(t){return new Date(t).toLocaleTimeString()}verifyLlm(){if(this.llmForm.invalid){this.llmForm.markAllAsTouched();return}let{provider:t,model:r,customModel:i,apiKey:o,baseUrl:s}=this.llmForm.value,a=r==="other"?i.trim():r;if(!a){this.llmForm.get("customModel").setErrors({required:!0});return}this.verifyStatus="verifying",this.verifyLatency=null,this.verifyError="",console.log(`[INIT] ${new Date().toISOString()} verifyLlm() | provider: ${t} | model: ${a}`);let l=D(D({provider:t,model:a,apiKey:o},t==="ollama"&&{baseUrl:s||"http://localhost:11434"}),t==="lmstudio"&&{baseUrl:s||"http://localhost:1234"});this.llmService.verify(l).subscribe({next:c=>{this.verifyStatus="success",this.verifyLatency=c.latency;let d=oA[t];d&&o&&(localStorage.setItem(d,o),console.log(`[SUCCESS] ${new Date().toISOString()} API key saved to localStorage | key: ${d}`)),this.registeredProviders.push({id:c.id,provider:c.provider,model:c.model,latency:c.latency,verifiedAt:c.verifiedAt}),this.llmForm.patchValue({apiKey:""}),this.llmForm.get("apiKey").markAsUntouched(),console.log(`[SUCCESS] ${new Date().toISOString()} LLM added to registry | id: ${c.id} | latency: ${c.latency}ms`)},error:c=>{this.verifyStatus="error",this.verifyLatency=c.error?.latency??null,this.verifyError=c.error?.error??"Verification failed. Check your API key.",console.log(`[ERROR] ${new Date().toISOString()} LLM verification failed | ${this.verifyError}`)}})}deleteEntry(t){this.llmService.deleteEntry(t).subscribe({next:r=>{this.registeredProviders=this.registeredProviders.filter(i=>i.id!==t),console.log(`[SUCCESS] ${new Date().toISOString()} Registry entry deleted | id: ${t}`)},error:r=>{console.log(`[ERROR] ${new Date().toISOString()} Failed to delete entry | ${r.message}`)}})}static{this.\u0275fac=function(r){return new(r||e)(M(od),M(Mb))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-llm-config"]],decls:56,vars:23,consts:[[1,"row","g-3"],[1,"col-xl-4","col-lg-5"],[1,"card","shadow-sm","h-100"],[1,"card-header","bg-primary","text-white","fw-semibold"],[1,"bi","bi-cpu-fill","me-2"],[1,"card-body","px-4","py-2",3,"formGroup"],[1,"mb-2"],[1,"form-label","fw-semibold","small","mb-1"],["formControlName","provider",1,"form-select",3,"change"],["value","","disabled",""],["value","gemini"],["value","openai"],["value","claude"],["value","ollama"],["value","lmstudio"],[1,"invalid-feedback"],["class","mb-2",4,"ngIf"],["class","mb-1",4,"ngIf"],["class","d-flex gap-2 mb-1",4,"ngIf"],["formControlName","model",1,"form-select"],[3,"value",4,"ngFor","ngForOf"],["class","mb-3",4,"ngIf"],[1,"btn","btn-primary","w-100",3,"click","disabled"],["class","spinner-border spinner-border-sm me-2","role","status",4,"ngIf"],["class","bi bi-shield-check me-2",4,"ngIf"],["class","d-flex align-items-center gap-2 mt-3",4,"ngIf"],["class","alert alert-danger mt-3 mb-0 py-2 small",4,"ngIf"],[1,"col-xl-8","col-lg-7"],[1,"card-header","fw-semibold","d-flex","align-items-center"],[1,"bi","bi-hdd-stack","me-2","text-primary"],[1,"badge","bg-primary","ms-2"],["class","card-body text-center text-muted py-5",4,"ngIf"],["class","table-responsive",4,"ngIf"],["class","card-footer text-muted small py-2",4,"ngIf"],["type","text","formControlName","baseUrl",1,"form-control","font-monospace",3,"placeholder"],[1,"form-text","text-muted"],["type","password","formControlName","apiKey","placeholder","\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022","autocomplete","current-password",1,"form-control","font-monospace"],[1,"mb-1"],[1,"d-flex","flex-wrap","gap-2"],["type","button",1,"btn","btn-sm","btn-outline-primary",3,"click","disabled"],["class","spinner-border spinner-border-sm me-1","role","status",4,"ngIf"],["class","bi bi-cloud-download me-1",4,"ngIf"],["class","small text-muted align-self-center",4,"ngIf"],["class","small text-success align-self-center",4,"ngIf"],["class","mt-1 small text-danger",4,"ngIf"],["role","status",1,"spinner-border","spinner-border-sm","me-1"],[1,"bi","bi-cloud-download","me-1"],[1,"small","text-muted","align-self-center"],[1,"bi","bi-info-circle","me-1"],[1,"small","text-success","align-self-center"],[1,"bi","bi-check-circle","me-1"],[1,"mt-1","small","text-danger"],[1,"bi","bi-exclamation-circle","me-1"],[1,"d-flex","gap-2","mb-1"],["type","button",1,"btn","btn-sm","btn-outline-primary","px-1","py-2",3,"click","disabled"],["class","small text-danger align-self-center",4,"ngIf"],[1,"small","text-danger","align-self-center"],[3,"value"],[1,"mb-3"],["type","text","formControlName","customModel","placeholder","e.g. gemini-2.0-flash",1,"form-control","font-monospace"],["role","status",1,"spinner-border","spinner-border-sm","me-2"],[1,"bi","bi-shield-check","me-2"],[1,"d-flex","align-items-center","gap-2","mt-3"],[1,"status-dot","status-success"],[1,"small","text-success","fw-semibold"],["class","badge bg-success-subtle text-success border border-success-subtle",4,"ngIf"],[1,"badge","bg-success-subtle","text-success","border","border-success-subtle"],[1,"alert","alert-danger","mt-3","mb-0","py-2","small"],[1,"d-flex","align-items-center","gap-2","mb-1"],[1,"status-dot","status-error"],[1,"fw-semibold"],["class","badge bg-danger-subtle text-danger border border-danger-subtle ms-auto",4,"ngIf"],["class","mt-2 pt-2 border-top border-danger-subtle",4,"ngIf"],[1,"badge","bg-danger-subtle","text-danger","border","border-danger-subtle","ms-auto"],[1,"mt-2","pt-2","border-top","border-danger-subtle"],[1,"bi","bi-info-circle","me-1","text-danger"],[1,"card-body","text-center","text-muted","py-5"],[1,"bi","bi-cloud-slash","d-block","fs-1","mb-3","opacity-35","text-primary"],[1,"mb-1","fw-semibold"],[1,"small","mb-0"],[1,"table-responsive"],[1,"table","table-hover","align-middle","mb-0","registry-table"],[1,"registry-thead"],[1,"text-end",2,"width","90px"],[2,"width","100px"],[2,"width","50px"],[4,"ngFor","ngForOf"],[1,"d-flex","align-items-center","gap-2"],[1,"bi","text-primary",3,"ngClass"],[1,"fw-semibold","text-muted"],["class","badge bg-secondary",4,"ngIf"],[1,"font-monospace","small","text-muted"],[1,"text-end"],[1,"badge",2,"border","1px solid"],[1,"small","text-muted"],["title","Remove from registry",1,"btn","btn-sm","btn-outline-danger","py-0","px-2",3,"click"],[1,"bi","bi-trash3"],[1,"badge","bg-secondary"],[1,"card-footer","text-muted","small","py-2"]],template:function(r,i){r&1&&(_(0,"div",0)(1,"div",1)(2,"div",2)(3,"div",3),y(4,"i",4),h(5,"Add LLM Provider "),g(),_(6,"div",5)(7,"div",6)(8,"label",7),h(9,"Provider"),g(),_(10,"select",8),L("change",function(){return i.onProviderChange()}),_(11,"option",9),h(12,"Select a provider..."),g(),_(13,"option",10),h(14,"Gemini (Google)"),g(),_(15,"option",11),h(16,"GPT (OpenAI)"),g(),_(17,"option",12),h(18,"Claude (Anthropic)"),g(),_(19,"option",13),h(20,"Ollama (Local)"),g(),_(21,"option",14),h(22,"LM Studio (Local)"),g()(),_(23,"div",15),h(24,"Please select a provider."),g()(),F(25,uz,6,2,"div",16)(26,pz,6,2,"div",16),_(27,"div",6)(28,"label",7),h(29,"Model"),g(),F(30,Ez,9,7,"div",17)(31,vz,7,6,"div",18)(32,Nz,7,6,"div",18),_(33,"select",19)(34,"option",9),h(35),g(),F(36,Dz,2,2,"option",20),g(),_(37,"div",15),h(38,"Please select a model."),g()(),F(39,Az,6,2,"div",21),_(40,"button",22),L("click",function(){return i.verifyLlm()}),F(41,wz,1,0,"span",23)(42,Mz,1,0,"i",24),h(43),g(),F(44,Pz,5,1,"div",25)(45,Fz,9,3,"div",26),g()()(),_(46,"div",27)(47,"div",2)(48,"div",28),y(49,"i",29),h(50," Connected Providers "),_(51,"span",30),h(52),g()(),F(53,Uz,6,0,"div",31)(54,Vz,15,1,"div",32)(55,$z,6,0,"div",33),g()()()),r&2&&(f(6),C("formGroup",i.llmForm),f(4),j("is-invalid",i.llmForm.get("provider").invalid&&i.llmForm.get("provider").touched),f(15),C("ngIf",i.isLocalProvider),f(),C("ngIf",i.isCloudProvider),f(4),C("ngIf",i.isCloudProvider),f(),C("ngIf",i.isLmStudioProvider),f(),C("ngIf",i.isOllamaProvider),f(),j("is-invalid",i.llmForm.get("model").invalid&&i.llmForm.get("model").touched),f(2),ie(" ",i.llmForm.get("provider").value?"Select a model...":"Select a provider first"," "),f(),C("ngForOf",i.modelOptions),f(3),C("ngIf",i.isCustomModel),f(),C("disabled",i.verifyStatus==="verifying"),f(),C("ngIf",i.verifyStatus==="verifying"),f(),C("ngIf",i.verifyStatus!=="verifying"),f(),ie(" ",i.verifyStatus==="verifying"?"Verifying...":"Verify & Save"," "),f(),C("ngIf",i.verifyStatus==="success"),f(),C("ngIf",i.verifyStatus==="error"),f(7),J(i.registeredProviders.length),f(),C("ngIf",i.registeredProviders.length===0),f(),C("ngIf",i.registeredProviders.length>0),f(),C("ngIf",i.registeredProviders.length>0))},dependencies:[vr,yr,Lt,hc,Ec,Un,so,Ar,Tb,w_,M_],styles:[".status-dot[_ngcontent-%COMP%]{display:inline-block;width:12px;height:12px;border-radius:50%;flex-shrink:0}.status-dot.status-success[_ngcontent-%COMP%]{background-color:#198754}.status-dot.status-error[_ngcontent-%COMP%]{background-color:#dc3545}.registry-table[_ngcontent-%COMP%]{font-size:.875rem}.registry-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600;font-size:.8rem;text-transform:uppercase;letter-spacing:.03em;color:#6c757d;border-bottom-width:1px}.registry-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.table-primary[_ngcontent-%COMP%]{--bs-table-bg: rgba(13, 110, 253, .06);--bs-table-border-color: rgba(13, 110, 253, .15)}.registry-thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{background-color:#f8f9fa;font-weight:600;font-size:.8rem;text-transform:uppercase;letter-spacing:.03em;color:#6c757d;border-bottom-width:1px}.dark[_nghost-%COMP%] .card[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .card[_ngcontent-%COMP%], .dark[_nghost-%COMP%] .card-header[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .card-header[_ngcontent-%COMP%], .dark[_nghost-%COMP%] .card-footer[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .card-footer[_ngcontent-%COMP%], .dark[_nghost-%COMP%] .card-body[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .card-body[_ngcontent-%COMP%]{background-color:#161b27;border-color:#2a3347;color:#c9d1d9}.dark[_nghost-%COMP%] .registry-thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .registry-thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{background-color:#1e2530;color:#8b949e;border-color:#2a3347}.dark[_nghost-%COMP%] .registry-table[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .registry-table[_ngcontent-%COMP%]{--bs-table-bg: transparent;--bs-table-striped-bg: #1e2530;--bs-table-hover-bg: #1e2530;--bs-table-border-color: #2a3347;color:#c9d1d9}.dark[_nghost-%COMP%] .registry-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.table-primary[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .registry-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.table-primary[_ngcontent-%COMP%]{--bs-table-bg: rgba(13, 110, 253, .15)}"]})}}return e})();var Hz=["editorContainer"];var dA=new V("NGX_MONACO_EDITOR_CONFIG"),lA=!1,cA,qz=(()=>{class e{constructor(){this.config=P(dA),this.onInit=new Re,this._insideNg=!1}set insideNg(t){this._insideNg=t,this._editor&&(this._editor.dispose(),this.initMonaco(this._options,this.insideNg))}get insideNg(){return this._insideNg}ngAfterViewInit(){lA?cA.then(()=>{this.initMonaco(this._options,this.insideNg)}):(lA=!0,cA=new Promise(t=>{let r=this.config.baseUrl;if((r==="assets"||!r)&&(r="./assets/monaco/min/vs"),typeof window.monaco=="object"){this.initMonaco(this._options,this.insideNg),t();return}let i=a=>{let l=a||window.require,c={paths:{vs:`${r}`}};Object.assign(c,this.config.requireConfig||{}),l.config(c),l(["vs/editor/editor.main"],()=>{typeof this.config.onMonacoLoad=="function"&&this.config.onMonacoLoad(),this.initMonaco(this._options,this.insideNg),t()})};if(this.config.monacoRequire)i(this.config.monacoRequire);else if(window.require)if(window.require.config)i();else{var o=`${r}/loader.js`,s=new XMLHttpRequest;s.addEventListener("load",()=>{let a=document.createElement("script");a.type="text/javascript",a.text=["var nodeRequire = require;",s.responseText.replace('"use strict";',""),"var monacoAmdRequire = require;","require = nodeRequire;","require.nodeRequire = require;"].join(`
78
- `),document.body.appendChild(a),i(window.monacoAmdRequire)}),s.open("GET",o),s.send()}else{let a=document.createElement("script");a.type="text/javascript",a.src=`${r}/loader.js`,a.addEventListener("load",()=>{i()}),document.body.appendChild(a)}}))}ngOnDestroy(){this._windowResizeSubscription&&this._windowResizeSubscription.unsubscribe(),this._editor&&(this._editor.dispose(),this._editor=void 0)}static{this.\u0275fac=function(r){return new(r||e)}}static{this.\u0275cmp=Ge({type:e,selectors:[["ng-component"]],viewQuery:function(r,i){if(r&1&&tn(Hz,7),r&2){let o;xt(o=Pt())&&(i._editorContainer=o.first)}},inputs:{insideNg:"insideNg"},outputs:{onInit:"onInit"},decls:0,vars:0,template:function(r,i){},encapsulation:2})}}return e})(),uA=(()=>{class e extends qz{constructor(){super(...arguments),this.zone=P(Ne),this._value="",this.propagateChange=t=>{},this.onTouched=()=>{}}set options(t){this._options=Object.assign({},this.config.defaultOptions,t),this._editor&&(this._editor.dispose(),this.initMonaco(this._options,this.insideNg))}get options(){return this._options}set model(t){this.options.model=t,this._editor&&(this._editor.dispose(),this.initMonaco(this.options,this.insideNg))}writeValue(t){this._value=t||"",setTimeout(()=>{this._editor&&!this.options.model&&this._editor.setValue(this._value)})}registerOnChange(t){this.propagateChange=t}registerOnTouched(t){this.onTouched=t}setDisabledState(t){this.options.readOnly=t||this._options.readOnly}initMonaco(t,r){let i=!!t.model;if(i){let o=monaco.editor.getModel(t.model.uri||"");o?(t.model=o,t.model.setValue(this._value)):t.model=monaco.editor.createModel(t.model.value,t.model.language,t.model.uri)}r?this._editor=monaco.editor.create(this._editorContainer.nativeElement,t):this.zone.runOutsideAngular(()=>{this._editor=monaco.editor.create(this._editorContainer.nativeElement,t)}),i||this._editor.setValue(this._value),this._editor.onDidChangeModelContent(o=>{let s=this._editor.getValue();this.zone.run(()=>{this.propagateChange(s),this._value=s})}),this._editor.onDidBlurEditorWidget(()=>{this.onTouched()}),this._editor.setTheme=o=>{this.options.theme=o,monaco.editor.setTheme(o)},this._windowResizeSubscription&&this._windowResizeSubscription.unsubscribe(),this._windowResizeSubscription=xo(window,"resize").subscribe(()=>this._editor.layout()),this.onInit.emit(this._editor)}static{this.\u0275fac=(()=>{let t;return function(i){return(t||(t=Ln(e)))(i||e)}})()}static{this.\u0275cmp=Ge({type:e,selectors:[["ngx-monaco-editor"]],inputs:{options:"options",model:"model"},standalone:!0,features:[on([{provide:or,useExisting:Bt(()=>e),multi:!0}]),Et,er],decls:2,vars:0,consts:[["editorContainer",""],[1,"editor-container"]],template:function(r,i){r&1&&y(0,"div",1,0)},styles:["[_nghost-%COMP%]{display:block;height:200px}.editor-container[_ngcontent-%COMP%]{width:100%;height:98%}"],changeDetection:0})}}return e})();var pA=(()=>{class e{static forRoot(t={}){return{ngModule:e,providers:[{provide:dA,useValue:t}]}}static{this.\u0275fac=function(r){return new(r||e)}}static{this.\u0275mod=rt({type:e})}static{this.\u0275inj=nt({imports:[no]})}}return e})();function Wz(e,n){if(e&1){let t=be();Ve(0),_(1,"span",30),y(2,"i",31),h(3),g(),_(4,"button",32),L("click",function(){q(t);let i=R();return z(i.resetContext())}),y(5,"i",33),g(),$e()}if(e&2){let t=n.ngIf;f(3),ie("",t," in context ")}}function Kz(e,n){if(e&1&&(_(0,"div",44),y(1,"i",45),h(2),g()),e&2){let t=R(2);f(2),ie("",t.newInputError," ")}}function jz(e,n){if(e&1){let t=be();_(0,"div",34)(1,"div",35),y(2,"i",36),_(3,"input",37,0),Yt("ngModelChange",function(i){q(t);let o=R();return rn(o.newInputName,i)||(o.newInputName=i),z(i)}),L("keydown",function(i){q(t);let o=R();return z(o.onNewInputKeydown(i))}),g(),_(5,"button",38),L("click",function(){q(t);let i=R();return z(i.confirmNewFile())}),y(6,"i",39),g(),_(7,"button",40),L("click",function(){q(t);let i=R();return z(i.cancelNewFile())}),y(8,"i",41),g()(),F(9,Kz,3,1,"div",42),_(10,"div",43),h(11),g()()}if(e&2){let t=R();f(2),j("bi-file-earmark-plus",t.newInputType==="file")("bi-folder-plus",t.newInputType==="directory"),f(),C("placeholder",t.newInputType==="file"?"filename.ts":"folder-name"),$t("ngModel",t.newInputName),f(6),C("ngIf",t.newInputError),f(2),ie("In: ",t.newInputDir,"")}}function Qz(e,n){e&1&&(_(0,"div",46),y(1,"div",47),_(2,"p",48),h(3,"Loading\u2026"),g()())}function Xz(e,n){if(e&1&&(_(0,"div",49),y(1,"i",50),h(2),g()),e&2){let t=R();f(2),ie("",t.treeError," ")}}function Zz(e,n){e&1&&(_(0,"div",54),y(1,"i",55),h(2,"Empty folder "),g())}function Jz(e,n){if(e&1){let t=be();_(0,"cdk-tree-node",59),L("click",function(){let i=q(t).$implicit,o=R(3);return z(o.openFile(i))}),y(1,"i",60),_(2,"span",61),h(3),g(),_(4,"label",62),L("click",function(i){return q(t),z(i.stopPropagation())}),_(5,"input",63),L("change",function(i){let o=q(t).$implicit,s=R(3);return z(s.toggleContext(i,o))}),g()()()}if(e&2){let t=n.$implicit,r=R(3);Zi("padding-left",t.level*16+28,"px"),j("in-context-file",t.inContext)("is-viewing",r.viewerFile===t),f(),j("bi-file-earmark-code",r.isCodeFile(t.name))("bi-file-earmark-text",!r.isCodeFile(t.name))("text-info",r.isCodeFile(t.name))("text-secondary",!r.isCodeFile(t.name)),f(),C("title",t.path),f(),J(t.name),f(2),C("checked",t.inContext)}}function e3(e,n){e&1&&y(0,"span",72)}function t3(e,n){if(e&1&&y(0,"i",73),e&2){let t=R().$implicit,r=R(3);j("expanded",r.isExpanded(t))}}function n3(e,n){if(e&1){let t=be();_(0,"cdk-tree-node",64),L("click",function(i){let o=q(t).$implicit,s=R(3);return z(s.onDirRowClick(i,o))}),_(1,"button",65),L("click",function(){let i=q(t).$implicit,o=R(3);return z(o.toggleNode(i))}),F(2,e3,1,0,"span",66)(3,t3,1,2,"i",67),g(),y(4,"i",68),_(5,"span",69),h(6),g(),_(7,"button",70),L("click",function(i){let o=q(t).$implicit,s=R(3);return i.stopPropagation(),z(s.setAsRoot(o))}),y(8,"i",71),g()()}if(e&2){let t=n.$implicit,r=R(3);Zi("padding-left",t.level*16+4,"px"),j("is-active-root",t.path===r.activePath),f(),C("disabled",t.loading),f(),C("ngIf",t.loading),f(),C("ngIf",!t.loading),f(),j("bi-folder-fill",!r.isExpanded(t))("bi-folder2-open",r.isExpanded(t)),f(),C("title","Open: "+t.path),f(),J(t.name),f(),C("title",t.path===r.activePath?"Active workspace root":"Set as workspace root"),f(),j("bi-pin-fill",t.path===r.activePath)("text-primary",t.path===r.activePath)("bi-pin",t.path!==r.activePath)("text-muted",t.path!==r.activePath)}}function r3(e,n){if(e&1&&(_(0,"cdk-tree",56),F(1,Jz,6,17,"cdk-tree-node",57)(2,n3,9,22,"cdk-tree-node",58),g()),e&2){let t=R(2);C("dataSource",t.nodesData$)("treeControl",t.treeControl),f(2),C("cdkTreeNodeDefWhen",t.hasChild)}}function i3(e,n){if(e&1&&(_(0,"div",51),F(1,Zz,3,0,"div",52)(2,r3,3,3,"cdk-tree",53),g()),e&2){let t=R();f(),C("ngIf",t.flatNodes.length===0),f(),C("ngIf",t.flatNodes.length>0)}}function o3(e,n){e&1&&(_(0,"div",74),y(1,"i",75),_(2,"p",76),h(3,"No file open"),g(),_(4,"p",48),h(5,"Click any file in the tree to view its content here"),g()())}function s3(e,n){if(e&1&&(_(0,"div",74),y(1,"div",77),_(2,"p",48),h(3),g()()),e&2){let t=R();f(3),ie("Loading ",t.viewerFile.name,"\u2026")}}function a3(e,n){if(e&1){let t=be();_(0,"div",78),y(1,"i",79),_(2,"p",80),h(3),g(),_(4,"button",81),L("click",function(){q(t);let i=R();return z(i.closeViewer())}),h(5,"Close"),g()()}if(e&2){let t=R();f(3),J(t.viewerError)}}function l3(e,n){e&1&&(_(0,"span",97),h(1,"\u25CF"),g())}function c3(e,n){e&1&&(_(0,"span",98),h(1,"In Context"),g())}function d3(e,n){if(e&1){let t=be();Ve(0),_(1,"button",99),L("click",function(){q(t);let i=R(2);return z(i.toggleEdit())}),y(2,"i",100),h(3,"Edit "),g(),$e()}}function u3(e,n){e&1&&y(0,"span",107)}function p3(e,n){e&1&&y(0,"i",108)}function _3(e,n){if(e&1){let t=be();Ve(0),_(1,"button",101),L("click",function(){q(t);let i=R(2);return z(i.saveFile())}),F(2,u3,1,0,"span",102)(3,p3,1,0,"i",103),h(4),g(),_(5,"button",104),L("click",function(){q(t);let i=R(2);return z(i.discardChanges())}),y(6,"i",105),g(),_(7,"span",106),h(8,"EDITING"),g(),$e()}if(e&2){let t=R(2);f(),j("btn-success",!t.isSaving)("btn-secondary",t.isSaving),C("disabled",t.isSaving),f(),C("ngIf",t.isSaving),f(),C("ngIf",!t.isSaving),f(),ie(" ",t.isSaving?"Saving\u2026":"Save"," "),f(),C("disabled",t.isSaving)}}function m3(e,n){e&1&&(_(0,"span",109),y(1,"i",110),g())}function f3(e,n){if(e&1){let t=be();_(0,"div",82)(1,"div",83),y(2,"i",84),F(3,l3,2,0,"span",85),_(4,"span",86),h(5),g(),_(6,"label",87),L("click",function(i){return q(t),z(i.stopPropagation())}),_(7,"input",63),L("change",function(i){q(t);let o=R();return z(o.toggleContext(i,o.viewerFile))}),g()(),F(8,c3,2,0,"span",88),_(9,"button",89),L("click",function(){q(t);let i=R();return z(i.closeViewer())}),g()(),_(10,"span",90),h(11),g(),_(12,"div",91),F(13,d3,4,0,"ng-container",10)(14,_3,9,9,"ng-container",10)(15,m3,2,0,"span",92),y(16,"div",93),_(17,"button",94),L("click",function(){q(t);let i=R();return z(i.toggleWordWrap())}),y(18,"i",95),g(),_(19,"button",94),L("click",function(){q(t);let i=R();return z(i.toggleMinimap())}),y(20,"i",96),g()()()}if(e&2){let t=R();f(3),C("ngIf",t.isDirty),f(2),J(t.viewerFile.name),f(2),C("checked",t.viewerFile.inContext),f(),C("ngIf",t.viewerFile.inContext),f(2),C("title",t.viewerFile.path),f(),J(t.viewerFile.path),f(2),C("ngIf",!t.isEditing),f(),C("ngIf",t.isEditing),f(),C("ngIf",t.saveNotify),f(2),j("active",t.wordWrap),wl("title","Word wrap ",t.wordWrap?"On":"Off",""),f(2),j("active",t.minimapOn),wl("title","Minimap ",t.minimapOn?"On":"Off","")}}function g3(e,n){if(e&1&&(_(0,"div",111)(1,"div",112),y(2,"div",113),_(3,"span",114),h(4),g()()()),e&2){let t=R();f(4),ie(" ",t.monacoReady?"Loading "+t.viewerFile.name+"\u2026":"Initialising editor\u2026"," ")}}function h3(e,n){e&1&&(Ve(0),_(1,"span",117),h(2,"|"),g(),_(3,"span",132),y(4,"i",133),h(5," EDITING "),g(),$e())}function E3(e,n){e&1&&(Ve(0),_(1,"span",117),h(2,"|"),g(),_(3,"span",134),y(4,"i",135),h(5," Unsaved "),g(),$e())}function S3(e,n){if(e&1){let t=be();_(0,"div",115)(1,"span",116),h(2),g(),_(3,"span",117),h(4,"|"),g(),_(5,"span",116),h(6),g(),F(7,h3,6,0,"ng-container",10)(8,E3,6,0,"ng-container",10),y(9,"span",118),_(10,"span",119)(11,"button",120),L("click",function(){q(t);let i=R();return z(i.setFontSize(-1))}),h(12,"A"),_(13,"sup",121),h(14,"\u2212"),g()(),_(15,"span"),h(16),g(),_(17,"button",122),L("click",function(){q(t);let i=R();return z(i.setFontSize(1))}),h(18,"A"),_(19,"sup",121),h(20,"+"),g()()(),_(21,"span",117),h(22,"|"),g(),_(23,"div",123)(24,"button",124),y(25,"i",125),_(26,"span"),h(27),g(),y(28,"i",126),g(),_(29,"ul",127)(30,"li")(31,"button",128),L("click",function(){q(t);let i=R();return z(i.setTheme("vs-dark"))}),y(32,"i",129),h(33,"Dark "),g()(),_(34,"li")(35,"button",128),L("click",function(){q(t);let i=R();return z(i.setTheme("vs"))}),y(36,"i",130),h(37,"Light "),g()(),_(38,"li")(39,"button",128),L("click",function(){q(t);let i=R();return z(i.setTheme("hc-black"))}),y(40,"i",131),h(41,"High Contrast "),g()()()()()}if(e&2){let t=R();f(2),nn("Ln ",t.cursorLine,", Col ",t.cursorCol,""),f(4),J(t.viewerFile?t.langFromName(t.viewerFile.name):""),f(),C("ngIf",t.isEditing),f(),C("ngIf",t.isDirty),f(8),ie("",t.fontSize,"px"),f(11),J(t.activeTheme==="vs-dark"?"Dark":t.activeTheme==="vs"?"Light":"HC"),f(4),j("active",t.activeTheme==="vs-dark"),f(4),j("active",t.activeTheme==="vs"),f(4),j("active",t.activeTheme==="hc-black")}}var _A={theme:"vs-dark",readOnly:!0,minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:13,fontFamily:"'Cascadia Code', 'Fira Code', 'Consolas', monospace",lineNumbers:"on",renderLineHighlight:"line",wordWrap:"on"};function zm(e){let n=e.split(".").pop()?.toLowerCase()??"";return{ts:"typescript",js:"javascript",mjs:"javascript",cjs:"javascript",html:"html",css:"css",scss:"scss",sass:"sass",json:"json",md:"markdown",yaml:"yaml",yml:"yaml",py:"python",java:"java",go:"go",rs:"rust",c:"c",cpp:"cpp",h:"cpp",rb:"ruby",php:"php",sh:"shell",bash:"shell",zsh:"shell",sql:"sql",xml:"xml",toml:"ini",env:"ini",swift:"swift",kt:"kotlin"}[n]??"plaintext"}var mA=(()=>{class e{constructor(t){this.workspaceService=t,this.activePath="",this.pathInput="",this.treeLoading=!1,this.treeError="",this.treeRootPath="",this.flatNodes=[],this.nodesData$=new ze([]),this.treeControl=new Gc(r=>r.level,r=>r.expandable),this.hasChild=(r,i)=>i.expandable,this.contextFilePaths=new Set,this.viewerFile=null,this.viewerContent="",this.viewerLoading=!1,this.viewerError="",this.editorOptions=Ee(D({},_A),{language:"plaintext"}),this.monacoEditor=null,this.pendingContent=null,this.resizeObserver=null,this.monacoReady=!1,this.contentReady=!1,this.isEditing=!1,this.isDirty=!1,this.isSaving=!1,this.saveNotify=!1,this.originalContent="",this.activeTheme="vs-dark",this.wordWrap=!0,this.minimapOn=!0,this.fontSize=13,this.cursorLine=1,this.cursorCol=1,this.showNewInput=!1,this.newInputName="",this.newInputType="file",this.newInputDir="",this.newInputError="",this._skipNextLoad=!1,console.log(`[INIT] ${new Date().toISOString()} WorkspaceTabComponent initialized`)}ngOnInit(){this.sub=this.workspaceService.activePath$.subscribe(t=>{if(this.activePath=t,this.pathInput=t,this._skipNextLoad){this._skipNextLoad=!1;return}this.treeRootPath=t,this._loadRoot(t||"/")}),this.contextFilePaths=new Set(this.workspaceService.contextFiles)}ngOnDestroy(){this.sub?.unsubscribe(),this.resizeObserver?.disconnect()}applyPathInput(){let t=this.pathInput.trim();t&&t!==this.activePath&&this.workspaceService.setPath(t)}onPathKeydown(t){t.key==="Enter"&&(this.applyPathInput(),t.target.blur()),t.key==="Escape"&&(this.pathInput=this.activePath)}navigateToParent(){let t=this._parentPath(this.treeRootPath);t!==this.treeRootPath&&(this.treeError="",this._loadRoot(t))}onDirRowClick(t,r){t.target.closest("button")||this.navigateInto(r)}navigateInto(t){t.type==="directory"&&(this.treeError="",this._loadRoot(t.path))}setAsRoot(t){t.type==="directory"&&(this._skipNextLoad=!0,this.workspaceService.setPath(t.path))}toggleNode(t){if(!(!t.expandable||t.loading))if(this.treeControl.isExpanded(t)){this._collapseDescendants(t),this.treeControl.collapse(t);let r=this.flatNodes.indexOf(t),i=r+1;for(;i<this.flatNodes.length&&this.flatNodes[i].level>t.level;)i++;this.flatNodes.splice(r+1,i-r-1),this.nodesData$.next([...this.flatNodes])}else if(this.treeControl.expand(t),t.childrenLoaded){let r=this.flatNodes.indexOf(t);this.flatNodes.splice(r+1,0,...t.children),this.nodesData$.next([...this.flatNodes])}else t.loading=!0,this.nodesData$.next([...this.flatNodes]),this.workspaceService.getFileTree(t.path).subscribe({next:r=>{t.loading=!1,t.childrenLoaded=!0;let i=this._itemsToNodes(r,t.level+1);t.children=i;let o=this.flatNodes.indexOf(t);this.flatNodes.splice(o+1,0,...i),this.nodesData$.next([...this.flatNodes])},error:r=>{t.loading=!1,this.treeControl.collapse(t),this.nodesData$.next([...this.flatNodes]),console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: load failed | ${r.message}`)}})}isExpanded(t){return this.treeControl.isExpanded(t)}openFile(t){t.type==="file"&&this.viewerFile!==t&&(this.isDirty&&!confirm("Discard unsaved changes?")||(this.isEditing=!1,this.isDirty=!1,this.originalContent="",this.monacoEditor&&this.monacoEditor.updateOptions({readOnly:!0}),this.viewerFile=t,this.viewerContent="",this.viewerLoading=!0,this.viewerError="",this.contentReady=!1,this.editorOptions=Ee(D({},_A),{language:zm(t.name)}),console.log(`[INIT] ${new Date().toISOString()} WorkspaceTab: opening "${t.path}"`),this.workspaceService.readFile(t.path).subscribe({next:r=>{if(this.viewerLoading=!1,this.viewerContent=r,this.monacoEditor){this.monacoEditor.setValue(r);let i=this.monacoEditor.getModel();i&&window.monaco?.editor?.setModelLanguage(i,zm(t.name)),this.monacoEditor.revealLine(1),this.monacoEditor.layout(),requestAnimationFrame(()=>requestAnimationFrame(()=>this.contentReady=!0))}else this.pendingContent=r;console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: loaded "${t.name}"`)},error:r=>{this.viewerLoading=!1,this.viewerError=r.error?.error??r.message??"Failed to read file.",console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: read failed | ${this.viewerError}`)}})))}onMonacoInit(t){this.monacoEditor=t,this.monacoReady=!0;let r=this.pendingContent??this.viewerContent;r&&(t.setValue(r),this.pendingContent=null,t.layout(),requestAnimationFrame(()=>requestAnimationFrame(()=>this.contentReady=!0)));let i=t.getContainerDomNode();i&&typeof ResizeObserver<"u"&&(this.resizeObserver?.disconnect(),this.resizeObserver=new ResizeObserver(()=>{t.layout()}),this.resizeObserver.observe(i.parentElement??i)),t.onDidChangeCursorPosition(o=>{this.cursorLine=o.position.lineNumber,this.cursorCol=o.position.column}),t.onDidChangeModelContent(()=>{this.isEditing&&(this.isDirty=t.getValue()!==this.originalContent)}),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: Monaco editor ready`)}closeViewer(){this.isDirty&&!confirm("Discard unsaved changes?")||(this.viewerFile=null,this.viewerContent="",this.viewerError="",this.contentReady=!1,this.pendingContent=null,this.isEditing=!1,this.isDirty=!1,this.originalContent="",this.isSaving=!1,this.monacoEditor&&(this.monacoEditor.setValue(""),this.monacoEditor.updateOptions({readOnly:!0})))}onKeydown(t){(t.metaKey||t.ctrlKey)&&t.key==="s"&&this.isEditing&&this.isDirty&&(t.preventDefault(),this.saveFile())}toggleEdit(){if(this.viewerFile){if(this.isEditing){if(this.isDirty&&!confirm("Discard unsaved changes?"))return;this.discardChanges();return}this.originalContent=this.monacoEditor?.getValue()??this.viewerContent,this.isEditing=!0,this.monacoEditor?.updateOptions({readOnly:!1}),this.monacoEditor?.focus(),console.log(`[INIT] ${new Date().toISOString()} WorkspaceTab: edit mode ON "${this.viewerFile.name}"`)}}saveFile(){if(!this.viewerFile||!this.isEditing)return;let t=this.monacoEditor?.getValue()??this.viewerContent;this.isSaving=!0,console.log(`[INIT] ${new Date().toISOString()} WorkspaceTab: saving "${this.viewerFile.path}"`),this.workspaceService.writeFile(this.viewerFile.path,t).subscribe({next:()=>{this.isSaving=!1,this.isDirty=!1,this.originalContent=t,this.viewerContent=t,this.saveNotify=!0,setTimeout(()=>this.saveNotify=!1,2e3),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: saved "${this.viewerFile.path}"`)},error:r=>{this.isSaving=!1,alert("Save failed: "+(r.error?.error??r.message)),console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: save failed | ${r.message}`)}})}discardChanges(){this.isEditing=!1,this.isDirty=!1,this.monacoEditor?.updateOptions({readOnly:!0}),this.monacoEditor?.setValue(this.originalContent),this.viewerContent=this.originalContent,this.originalContent="",console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: changes discarded`)}setTheme(t){this.activeTheme=t,window.monaco?.editor?.setTheme(t),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: theme \u2192 ${t}`)}toggleWordWrap(){this.wordWrap=!this.wordWrap,this.monacoEditor?.updateOptions({wordWrap:this.wordWrap?"on":"off"})}toggleMinimap(){this.minimapOn=!this.minimapOn,this.monacoEditor?.updateOptions({minimap:{enabled:this.minimapOn}})}setFontSize(t){this.fontSize=Math.min(30,Math.max(8,this.fontSize+t)),this.monacoEditor?.updateOptions({fontSize:this.fontSize}),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: fontSize \u2192 ${this.fontSize}`)}showNewFileInput(t,r="file"){this.showNewInput=!0,this.newInputName="",this.newInputType=r,this.newInputDir=t||this.treeRootPath,this.newInputError=""}cancelNewFile(){this.showNewInput=!1,this.newInputName="",this.newInputError=""}confirmNewFile(){let t=this.newInputName.trim();if(!t){this.newInputError="Name is required";return}if(/[\/\\:*?"<>|]/.test(t)){this.newInputError="Invalid characters";return}let r=this.newInputDir.replace(/\/+$/,"")+"/"+t;this.workspaceService.createFile(r,this.newInputType).subscribe({next:()=>{this.showNewInput=!1,this.newInputName="",this._loadRoot(this.treeRootPath),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: created "${r}"`)},error:i=>{this.newInputError=i.error?.error??i.message??"Failed to create",console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: create failed | ${this.newInputError}`)}})}onNewInputKeydown(t){t.key==="Enter"&&this.confirmNewFile(),t.key==="Escape"&&this.cancelNewFile()}toggleContext(t,r){t.stopPropagation(),r.inContext=!r.inContext,r.type==="file"&&(r.inContext?this.contextFilePaths.add(r.path):this.contextFilePaths.delete(r.path),this.workspaceService.setContextFiles([...this.contextFilePaths])),this.nodesData$.next([...this.flatNodes]),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: context \u2192 ${r.name} = ${r.inContext}`)}resetContext(){this.contextFilePaths.clear(),this.workspaceService.clearContextFiles(),this.flatNodes.forEach(t=>t.inContext=!1),this.nodesData$.next([...this.flatNodes]),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: context reset`)}isCodeFile(t){return/\.(ts|js|mjs|py|java|go|rs|c|cpp|h|css|scss|sass|html|json|md|yaml|yml|sh|bash|zsh|txt|env|toml|xml|sql|rb|php|swift|kt|dart)$/i.test(t)}langFromName(t){return zm(t)}_loadRoot(t){this.treeLoading=!0,this.treeRootPath=t,this.flatNodes=[],this.nodesData$.next([]),this.workspaceService.getFileTree(t).subscribe({next:r=>{this.treeLoading=!1,this.flatNodes=this._itemsToNodes(r,0),this.nodesData$.next([...this.flatNodes]),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: root loaded | ${r.length} items`)},error:r=>{this.treeLoading=!1,this.treeError=r.error?.error??r.message??"Failed to list directory.",console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: root load failed | ${this.treeError}`)}})}_itemsToNodes(t,r){return t.map(i=>({name:i.name,type:i.type,path:i.path,level:r,expandable:i.type==="directory",loading:!1,inContext:i.type==="file"?this.contextFilePaths.has(i.path):!1,childrenLoaded:!1,children:[]}))}_parentPath(t){let r=t.replace(/\/+$/,""),i=r.lastIndexOf("/");return i<=0?"/":r.substring(0,i)}_collapseDescendants(t){for(let r of t.children)this.treeControl.isExpanded(r)&&(this._collapseDescendants(r),this.treeControl.collapse(r))}static{this.\u0275fac=function(r){return new(r||e)(M(yo))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-workspace-tab"]],hostBindings:function(r,i){r&1&&L("keydown",function(s){return i.onKeydown(s)},!1,Qh)},decls:36,vars:23,consts:[["newFileInput",""],[1,"ws-tab-wrapper"],[1,"ws-tree-panel"],[1,"ws-path-bar","border-bottom","d-flex","align-items-center","gap-2","px-3","py-2"],["title","Go up to parent folder",1,"btn","btn-sm","btn-outline-secondary","py-0","px-2","flex-shrink-0",3,"click","disabled"],[1,"bi","bi-arrow-up"],["type","text","spellcheck","false",1,"form-control","form-control-sm","font-monospace","ws-path-input",3,"input","keydown","blur","value","title"],[1,"ws-ctx-bar","border-bottom","px-3","py-1","d-flex","align-items-center","gap-2","small"],[1,"bi","bi-folder2-open","text-primary","flex-shrink-0"],[1,"text-muted","text-truncate","flex-1",2,"font-size","0.72rem",3,"title"],[4,"ngIf"],["title","New File",1,"btn-new-item",3,"click"],[1,"bi","bi-file-earmark-plus"],["title","New Folder",1,"btn-new-item",3,"click"],[1,"bi","bi-folder-plus"],["class","ws-new-input-bar border-bottom px-3 py-2",4,"ngIf"],["class","text-center py-5 text-muted",4,"ngIf"],["class","alert alert-warning m-3 py-2 small",4,"ngIf"],["class","ws-tree-body",4,"ngIf"],[1,"ws-legend","border-top","px-3","py-1","d-flex","align-items-center","gap-3","small","text-muted","bg-light"],[1,"bi","bi-pin","me-1"],[1,"bi","bi-check2-square","me-1"],[1,"ws-viewer-panel"],["class","ws-viewer-empty d-flex flex-column align-items-center justify-content-center text-muted",4,"ngIf"],["class","ws-viewer-empty d-flex flex-column align-items-center justify-content-center",4,"ngIf"],["class","ws-viewer-tabbar d-flex align-items-center border-bottom bg-dark px-2",4,"ngIf"],[1,"ws-monaco-wrap"],["class","ws-monaco-loader",4,"ngIf"],[1,"ws-monaco",3,"onInit","options"],["class","ws-statusbar",4,"ngIf"],[1,"badge","bg-success","d-flex","align-items-center","gap-1",2,"font-size","0.68rem"],[1,"bi","bi-file-earmark-check"],["title","Reset context selection",1,"btn","btn-xs","btn-outline-danger","py-0","px-1",3,"click"],[1,"bi","bi-x-circle"],[1,"ws-new-input-bar","border-bottom","px-3","py-2"],[1,"d-flex","align-items-center","gap-2"],[1,"bi","text-muted","flex-shrink-0"],["type","text","autofocus","",1,"form-control","form-control-sm","font-monospace","flex-1",3,"ngModelChange","keydown","placeholder","ngModel"],[1,"btn","btn-sm","btn-primary","py-0","px-2",3,"click"],[1,"bi","bi-check-lg"],[1,"btn","btn-sm","btn-outline-secondary","py-0","px-2",3,"click"],[1,"bi","bi-x-lg"],["class","text-danger mt-1","style","font-size:0.72rem;",4,"ngIf"],[1,"text-muted","mt-1",2,"font-size","0.68rem"],[1,"text-danger","mt-1",2,"font-size","0.72rem"],[1,"bi","bi-exclamation-circle","me-1"],[1,"text-center","py-5","text-muted"],["role","status",1,"spinner-border","spinner-border-sm","text-primary","mb-2"],[1,"small","mb-0"],[1,"alert","alert-warning","m-3","py-2","small"],[1,"bi","bi-exclamation-triangle","me-1"],[1,"ws-tree-body"],["class","text-center text-muted py-5 small",4,"ngIf"],[3,"dataSource","treeControl",4,"ngIf"],[1,"text-center","text-muted","py-5","small"],[1,"bi","bi-folder-x","d-block","fs-3","mb-2","opacity-50"],[3,"dataSource","treeControl"],["class","ws-tree-node ws-node-file",3,"in-context-file","is-viewing","padding-left","click",4,"cdkTreeNodeDef"],["class","ws-tree-node ws-node-dir",3,"is-active-root","padding-left","click",4,"cdkTreeNodeDef","cdkTreeNodeDefWhen"],[1,"ws-tree-node","ws-node-file",3,"click"],[1,"node-icon","bi"],[1,"node-label","small","text-truncate","flex-1",3,"title"],["title","Add to AI context",1,"ctx-label","flex-shrink-0",3,"click"],["type","checkbox",1,"form-check-input","ctx-check",3,"change","checked"],[1,"ws-tree-node","ws-node-dir",3,"click"],[1,"btn-expand",3,"click","disabled"],["class","spinner-border spinner-border-sm text-primary","role","status","style","width:11px;height:11px;",4,"ngIf"],["class","bi bi-chevron-right expand-icon",3,"expanded",4,"ngIf"],[1,"node-icon","text-warning","bi"],[1,"node-label","small","text-truncate","flex-1","dir-label",3,"title"],[1,"btn-pin","flex-shrink-0",3,"click","title"],[1,"bi","active-root-icon"],["role","status",1,"spinner-border","spinner-border-sm","text-primary",2,"width","11px","height","11px"],[1,"bi","bi-chevron-right","expand-icon"],[1,"ws-viewer-empty","d-flex","flex-column","align-items-center","justify-content-center","text-muted"],[1,"bi","bi-file-earmark-code","d-block","fs-1","mb-3","opacity-25"],[1,"fw-semibold","mb-1"],["role","status",1,"spinner-border","text-primary","mb-3"],[1,"ws-viewer-empty","d-flex","flex-column","align-items-center","justify-content-center"],[1,"bi","bi-exclamation-triangle-fill","text-warning","d-block","fs-2","mb-3"],[1,"text-danger","small","mb-2"],[1,"btn","btn-sm","btn-outline-secondary",3,"click"],[1,"ws-viewer-tabbar","d-flex","align-items-center","border-bottom","bg-dark","px-2"],[1,"ws-viewer-tab","d-flex","align-items-center","gap-2","px-3","py-2","text-light","active-viewer-tab"],[1,"bi","bi-file-earmark-code","text-info",2,"font-size","0.8rem"],["class","dirty-dot","title","Unsaved changes",4,"ngIf"],[1,"small",2,"font-size","0.8rem"],["title","Add to AI context",1,"ctx-label","ms-2",3,"click"],["class","badge bg-success ms-1","style","font-size:0.62rem;",4,"ngIf"],[1,"btn-close","btn-close-white","ms-2",2,"width","10px","height","10px",3,"click"],[1,"ws-tab-path",3,"title"],[1,"ws-tab-controls"],["class","text-success","style","font-size:0.8rem;",4,"ngIf"],[1,"ws-tab-sep"],[1,"ws-tab-icon-btn",3,"click","title"],[1,"bi","bi-text-wrap"],[1,"bi","bi-map"],["title","Unsaved changes",1,"dirty-dot"],[1,"badge","bg-success","ms-1",2,"font-size","0.62rem"],["title","Edit file",1,"btn","btn-sm","btn-outline-primary","py-0","px-2",3,"click"],[1,"bi","bi-pencil","me-1"],["title","Save (Cmd/Ctrl+S)",1,"btn","btn-sm","py-0","px-2",3,"click","disabled"],["class","spinner-border spinner-border-sm me-1","role","status",4,"ngIf"],["class","bi bi-floppy me-1",4,"ngIf"],["title","Discard changes",1,"ws-tab-icon-btn",3,"click","disabled"],[1,"bi","bi-arrow-counterclockwise"],[1,"badge","bg-warning","text-dark",2,"font-size","0.65rem"],["role","status",1,"spinner-border","spinner-border-sm","me-1"],[1,"bi","bi-floppy","me-1"],[1,"text-success",2,"font-size","0.8rem"],[1,"bi","bi-check-circle-fill"],[1,"ws-monaco-loader"],[1,"ws-monaco-loader-inner"],["role","status",1,"spinner-border","text-primary",2,"width","1.5rem","height","1.5rem"],[1,"small","text-muted","mt-2"],[1,"ws-statusbar"],[1,"ws-statusbar-item"],[1,"ws-statusbar-sep"],[1,"ws-statusbar-spacer"],[1,"ws-statusbar-item","ws-statusbar-font"],["title","Decrease font size",1,"ws-sb-btn",3,"click"],[2,"font-size","0.55rem"],["title","Increase font size",1,"ws-sb-btn",3,"click"],[1,"dropdown"],["type","button","data-bs-toggle","dropdown","title","Theme",1,"ws-sb-dropdown-btn"],[1,"bi","bi-palette",2,"font-size","0.7rem"],[1,"bi","bi-chevron-up",2,"font-size","0.5rem","opacity","0.6"],[1,"dropdown-menu","dropdown-menu-end","shadow-sm"],[1,"dropdown-item","small",3,"click"],[1,"bi","bi-moon-fill","me-2"],[1,"bi","bi-sun-fill","me-2"],[1,"bi","bi-circle-half","me-2"],[1,"ws-statusbar-item","ws-status-editing"],[1,"bi","bi-pencil-fill",2,"font-size","0.6rem"],[1,"ws-statusbar-item","ws-status-dirty"],[1,"bi","bi-circle-fill",2,"font-size","0.45rem"]],template:function(r,i){if(r&1&&(_(0,"div",1)(1,"div",2)(2,"div",3)(3,"button",4),L("click",function(){return i.navigateToParent()}),y(4,"i",5),g(),_(5,"input",6),L("input",function(s){return i.pathInput=s.target.value})("keydown",function(s){return i.onPathKeydown(s)})("blur",function(){return i.applyPathInput()}),g()(),_(6,"div",7),y(7,"i",8),_(8,"span",9),h(9),g(),F(10,Wz,6,1,"ng-container",10),St(11,"async"),_(12,"button",11),L("click",function(){return i.showNewFileInput(i.treeRootPath,"file")}),y(13,"i",12),g(),_(14,"button",13),L("click",function(){return i.showNewFileInput(i.treeRootPath,"directory")}),y(15,"i",14),g()(),F(16,jz,12,8,"div",15)(17,Qz,4,0,"div",16)(18,Xz,3,1,"div",17)(19,i3,3,2,"div",18),_(20,"div",19)(21,"span"),y(22,"i",20),h(23,"Set root folder"),g(),_(24,"span"),y(25,"i",21),h(26,"Select file for context"),g()()(),_(27,"div",22),F(28,o3,6,0,"div",23)(29,s3,4,1,"div",23)(30,a3,6,1,"div",24)(31,f3,21,17,"div",25),_(32,"div",26),F(33,g3,5,1,"div",27),_(34,"ngx-monaco-editor",28),L("onInit",function(s){return i.onMonacoInit(s)}),g()(),F(35,S3,42,13,"div",29),g()()),r&2){let o;f(3),C("disabled",i.treeRootPath==="/"||i.treeLoading),f(2),C("value",i.pathInput)("title",i.treeRootPath),f(3),C("title",i.activePath),f(),ie(" Root: ",i.activePath||"\u2014"," "),f(),C("ngIf",(o=sn(11,21,i.workspaceService.contextFiles$))==null?null:o.length),f(6),C("ngIf",i.showNewInput),f(),C("ngIf",i.treeLoading),f(),C("ngIf",!i.treeLoading&&i.treeError),f(),C("ngIf",!i.treeLoading&&!i.treeError),f(8),j("ws-theme-light",i.activeTheme==="vs"),f(),C("ngIf",!i.viewerFile),f(),C("ngIf",i.viewerFile&&i.viewerLoading),f(),C("ngIf",i.viewerFile&&!i.viewerLoading&&i.viewerError),f(),C("ngIf",i.viewerFile&&!i.viewerLoading&&!i.viewerError),f(),Zi("display",i.viewerFile?"flex":"none"),f(),C("ngIf",i.viewerFile&&(i.viewerLoading||!i.monacoReady||!i.contentReady)),f(),C("options",i.editorOptions),f(),C("ngIf",i.viewerFile&&!i.viewerLoading&&!i.viewerError)}},dependencies:[Lt,Un,Ar,ci,bm,Tm,Vc,uA,to],styles:["[_nghost-%COMP%]{display:flex;flex:1;min-height:0;height:100%}.ws-tab-wrapper[_ngcontent-%COMP%]{display:flex;width:100%;height:100%;min-height:0;gap:0;border:1px solid #dee2e6;border-radius:.375rem;overflow:hidden}.ws-tree-panel[_ngcontent-%COMP%]{width:300px;min-width:220px;flex-shrink:0;border-right:1px solid #dee2e6;display:flex;flex-direction:column;background:#fafbfc;overflow:hidden}.ws-path-bar[_ngcontent-%COMP%]{flex-shrink:0;background:#f0f4ff}.ws-path-input[_ngcontent-%COMP%]{font-size:.78rem;min-width:0}.ws-ctx-bar[_ngcontent-%COMP%]{flex-shrink:0;background:#f8f9fa}.ws-ctx-bar[_ngcontent-%COMP%] .btn-xs[_ngcontent-%COMP%]{font-size:.65rem;padding:0 4px}.ws-tree-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;min-height:0}.ws-legend[_ngcontent-%COMP%]{flex-shrink:0;font-size:.68rem}.ws-tree-node[_ngcontent-%COMP%]{display:flex;align-items:center;height:26px;padding-right:6px;gap:3px;cursor:default;border-bottom:1px solid #f0f0f0;transition:background .07s}.ws-tree-node[_ngcontent-%COMP%]:hover{background:#f0f4ff}.ws-tree-node.is-active-root[_ngcontent-%COMP%]{background:#e8f4fd;border-left:3px solid #0d6efd}.ws-tree-node.in-context-file[_ngcontent-%COMP%]{background:#f0fdf4;border-left:3px solid #198754}.ws-tree-node.in-context-file[_ngcontent-%COMP%] .node-label[_ngcontent-%COMP%]{color:#145c32;font-weight:500}.ws-tree-node.in-context-file[_ngcontent-%COMP%] .node-icon[_ngcontent-%COMP%]{color:#198754!important}.ws-tree-node.is-viewing[_ngcontent-%COMP%]{background:#fffbea;border-left:3px solid #ffc107}.ws-tree-node.is-viewing[_ngcontent-%COMP%] .node-label[_ngcontent-%COMP%]{color:#856404;font-weight:600}.ws-node-file[_ngcontent-%COMP%]{cursor:pointer}.btn-expand[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;background:transparent;border-radius:3px;flex-shrink:0;cursor:pointer;color:#6c757d}.btn-expand[_ngcontent-%COMP%]:hover:not(:disabled){background:#dee2e6;color:#0d6efd}.btn-expand[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:default}.expand-icon[_ngcontent-%COMP%]{font-size:.6rem;transition:transform .13s}.expand-icon.expanded[_ngcontent-%COMP%]{transform:rotate(90deg)}.btn-pin[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;background:transparent;border-radius:3px;flex-shrink:0;cursor:pointer;opacity:.3;transition:opacity .1s}.btn-pin[_ngcontent-%COMP%]:hover{opacity:1;background:#e8f0fe}.ws-tree-node.is-active-root[_ngcontent-%COMP%] .btn-pin[_ngcontent-%COMP%]{opacity:1}.node-icon[_ngcontent-%COMP%]{font-size:.82rem;flex-shrink:0}.node-label[_ngcontent-%COMP%]{flex:1;min-width:0;font-size:.8rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dir-label[_ngcontent-%COMP%]{cursor:pointer}.dir-label[_ngcontent-%COMP%]:hover{color:#0d6efd;text-decoration:underline}.active-root-icon[_ngcontent-%COMP%]{font-size:.72rem}.ctx-label[_ngcontent-%COMP%]{display:inline-flex;align-items:center;flex-shrink:0;cursor:pointer;opacity:.35;transition:opacity .1s}.ctx-label[_ngcontent-%COMP%]:hover{opacity:1}.ws-tree-node[_ngcontent-%COMP%]:has(.ctx-check:checked) .ctx-label[_ngcontent-%COMP%]{opacity:1}.ctx-check[_ngcontent-%COMP%]{width:12px;height:12px;cursor:pointer;accent-color:#0d6efd;border:1.5px solid #6c757d!important}.ctx-check[_ngcontent-%COMP%]:not(:checked){background-color:#fff!important}.ws-viewer-panel[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column;background:#1e1e1e;overflow:hidden}.ws-viewer-empty[_ngcontent-%COMP%]{flex:1;background:#f8f9fa;color:#6c757d}.ws-viewer-tabbar[_ngcontent-%COMP%]{flex-shrink:0;min-height:38px;background:#252526;border-bottom:1px solid #3c3c3c;overflow-x:auto}.ws-viewer-tab[_ngcontent-%COMP%]{border-right:1px solid #3c3c3c;white-space:nowrap}.active-viewer-tab[_ngcontent-%COMP%]{background:#1e1e1e}.ws-monaco-wrap[_ngcontent-%COMP%]{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}.ws-monaco-loader[_ngcontent-%COMP%]{position:absolute;inset:0;z-index:10;background:#1e1e1e;display:flex;align-items:center;justify-content:center}.ws-monaco-loader-inner[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:.5rem}.ws-monaco[_ngcontent-%COMP%]{flex:1;min-height:0;width:100%} .ws-monaco>div{width:100%!important;height:100%!important}.btn-new-item[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;background:transparent;border-radius:4px;flex-shrink:0;cursor:pointer;color:#6c757d;font-size:.82rem;transition:background .1s,color .1s}.btn-new-item[_ngcontent-%COMP%]:hover{background:#e2e6ea;color:#0d6efd}.ws-new-input-bar[_ngcontent-%COMP%]{flex-shrink:0;background:#f0f4ff;font-size:.8rem}.ws-tab-path[_ngcontent-%COMP%]{flex:1;min-width:0;font-size:.68rem;padding:0 8px;color:#888;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Consolas,monospace}.ws-tab-controls[_ngcontent-%COMP%]{flex-shrink:0;display:flex;align-items:center;gap:2px;padding:0 6px}.ws-tab-controls[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{font-size:.76rem}.ws-tab-controls[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%]{font-size:.65rem}.ws-tab-icon-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;gap:1px;height:24px;min-width:24px;padding:0 5px;border:none;background:transparent;border-radius:4px;flex-shrink:0;cursor:pointer;color:#ccc;font-size:.8rem;line-height:1;transition:background .1s,color .1s}.ws-tab-icon-btn[_ngcontent-%COMP%]:hover{background:#3e3e42;color:#fff}.ws-tab-icon-btn.active[_ngcontent-%COMP%]{background:#0d6efd26;color:#4da3ff}.ws-tab-icon-btn[_ngcontent-%COMP%]:disabled{opacity:.4;cursor:not-allowed}.ws-tab-sep[_ngcontent-%COMP%]{width:1px;height:16px;background:#444;margin:0 4px;flex-shrink:0}.ws-tab-font-size[_ngcontent-%COMP%]{font-size:.72rem;color:#aaa;min-width:18px;text-align:center;font-family:Consolas,monospace;-webkit-user-select:none;user-select:none}.ws-theme-light[_ngcontent-%COMP%], .ws-theme-light[_ngcontent-%COMP%] .ws-monaco-loader[_ngcontent-%COMP%]{background:#fff}.ws-theme-light[_ngcontent-%COMP%] .ws-viewer-tabbar[_ngcontent-%COMP%]{background:#f3f3f3!important;border-bottom-color:#ddd!important}.ws-theme-light[_ngcontent-%COMP%] .ws-viewer-tab[_ngcontent-%COMP%]{background:#fff!important;color:#333!important}.ws-theme-light[_ngcontent-%COMP%] .ws-statusbar[_ngcontent-%COMP%]{background:#007acc}.ws-theme-light[_ngcontent-%COMP%] .active-viewer-tab[_ngcontent-%COMP%]{background:#fff!important}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-icon-btn[_ngcontent-%COMP%]{color:#555}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-icon-btn[_ngcontent-%COMP%]:hover{background:#e8e8e8;color:#333}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-path[_ngcontent-%COMP%]{color:#999}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-font-size[_ngcontent-%COMP%]{color:#666}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-sep[_ngcontent-%COMP%]{background:#ddd}.dirty-dot[_ngcontent-%COMP%]{color:#e2b04a;font-size:.7rem;line-height:1}.ws-statusbar[_ngcontent-%COMP%]{flex-shrink:0;background:#007acc;color:#fff;display:flex;align-items:center;height:22px;padding:0 12px;font-size:.7rem;font-family:Consolas,monospace;gap:0;-webkit-user-select:none;user-select:none}.ws-statusbar-item[_ngcontent-%COMP%]{padding:0 8px;display:inline-flex;align-items:center;gap:4px;height:100%}.ws-statusbar-item[_ngcontent-%COMP%]:hover{background:#ffffff26;cursor:default}.ws-statusbar-spacer[_ngcontent-%COMP%]{flex:1}.ws-status-editing[_ngcontent-%COMP%]{background:#ffa50033;color:#ffc107;font-weight:600;letter-spacing:.04em}.ws-status-editing[_ngcontent-%COMP%]:hover{background:#ffa5004d}.ws-status-dirty[_ngcontent-%COMP%]{color:#e2b04a}.ws-statusbar-font[_ngcontent-%COMP%]{gap:4px;cursor:default}.ws-statusbar-font[_ngcontent-%COMP%]:hover{background:#ffffff26}.ws-sb-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;padding:0 3px;line-height:1;font-size:.72rem;border-radius:3px}.ws-sb-btn[_ngcontent-%COMP%]:hover{background:#fff3}.ws-sb-dropdown-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;background:transparent;border:none;color:#fff;cursor:pointer;padding:0 8px;height:22px;font-size:.7rem;font-family:Consolas,monospace}.ws-sb-dropdown-btn[_ngcontent-%COMP%]:hover{background:#ffffff26}.ws-statusbar-sep[_ngcontent-%COMP%]{opacity:.4;padding:0 2px}"]})}}return e})();function T3(e,n){e&1&&y(0,"i",22)}var fA=(()=>{class e{constructor(t){this.http=t,this.activeTab="mcp",this.isDarkMode=!1,this.isRestarting=!1,this.apiUrl=`${un.apiUrl}/api/system`,console.log(`[INIT] ${new Date().toISOString()} DashboardComponent initialized`);let r=localStorage.getItem("blueorchstudio-dark-mode");this.isDarkMode=r==="true",this._applyTheme()}setTab(t){this.activeTab=t,t==="chat"&&this.chatComp?.loadSidebar()}toggleDarkMode(){this.isDarkMode=!this.isDarkMode,localStorage.setItem("blueorchstudio-dark-mode",String(this.isDarkMode)),this._applyTheme(),console.log(`[SUCCESS] ${new Date().toISOString()} DashboardComponent: dark mode ${this.isDarkMode?"ON":"OFF"}`)}_applyTheme(){document.documentElement.classList.toggle("dark",this.isDarkMode)}restartServer(){this.isRestarting||(this.isRestarting=!0,this.http.post(`${this.apiUrl}/restart`,{}).subscribe({next:()=>this._pollUntilUp(),error:()=>this._pollUntilUp()}))}_pollUntilUp(){let r=0,i=()=>{r++,this.http.get(`${this.apiUrl}/health`).subscribe({next:()=>{this.isRestarting=!1,window.location.reload()},error:()=>{r<30?setTimeout(i,1e3):this.isRestarting=!1}})};setTimeout(i,1500)}static{this.\u0275fac=function(r){return new(r||e)(M(Rt))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-dashboard"]],viewQuery:function(r,i){if(r&1&&tn(ad,5),r&2){let o;xt(o=Pt())&&(i.chatComp=o.first)}},decls:39,vars:21,consts:[[1,"page-wrapper"],[1,"navbar","navbar-dark","bg-primary","shadow-sm","flex-shrink-0"],[1,"container-fluid","px-4"],[1,"navbar-brand","fw-bold","fs-5"],[1,"bi","bi-terminal","me-2"],[1,"dark-mode-toggle","ms-auto",3,"click","title"],[1,"bi",3,"ngClass"],["href","/logs","target","_blank","rel","noopener","title","Open live logs in new tab",1,"logs-nav-btn","ms-2"],[1,"bi","bi-terminal-fill","me-1"],["tooltipPlacement","bottom",1,"restart-btn","ms-2",3,"click","disabled","bsTooltip"],["class","bi bi-arrow-clockwise",4,"ngIf"],[1,"page-content","container-fluid","d-flex","flex-column","py-3","px-4"],[1,"nav","nav-tabs","flex-shrink-0","mb-3"],[1,"nav-item"],[1,"nav-link","d-flex","align-items-center","gap-2",3,"click"],[1,"bi","bi-diagram-3-fill"],[1,"bi","bi-cpu-fill"],[1,"bi","bi-chat-dots-fill"],[1,"bi","bi-folder2-open"],[1,"tab-fill"],[1,"llm-tab-content"],[3,"navigateToWorkspace"],[1,"bi","bi-arrow-clockwise"]],template:function(r,i){r&1&&(_(0,"div",0)(1,"nav",1)(2,"div",2)(3,"span",3),y(4,"i",4),h(5,"BlueOrch \u2014 Studio "),g(),_(6,"button",5),L("click",function(){return i.toggleDarkMode()}),y(7,"i",6),g(),_(8,"a",7),y(9,"i",8),h(10,"Logs "),g(),_(11,"button",9),L("click",function(){return i.restartServer()}),F(12,T3,1,0,"i",10),g()()(),_(13,"div",11)(14,"ul",12)(15,"li",13)(16,"button",14),L("click",function(){return i.setTab("mcp")}),y(17,"i",15),h(18,"MCP Config "),g()(),_(19,"li",13)(20,"button",14),L("click",function(){return i.setTab("llm")}),y(21,"i",16),h(22,"LLM Config "),g()(),_(23,"li",13)(24,"button",14),L("click",function(){return i.setTab("chat")}),y(25,"i",17),h(26,"Chat "),g()(),_(27,"li",13)(28,"button",14),L("click",function(){return i.setTab("workspace")}),y(29,"i",18),h(30,"Workspace "),g()()(),_(31,"div",19),y(32,"app-mcp-config"),g(),_(33,"div",20),y(34,"app-llm-config"),g(),_(35,"div",19)(36,"app-chat",21),L("navigateToWorkspace",function(){return i.setTab("workspace")}),g()(),_(37,"div",19),y(38,"app-workspace-tab"),g()()()),r&2&&(f(6),C("title",i.isDarkMode?"Switch to Light Mode":"Switch to Dark Mode"),f(),C("ngClass",i.isDarkMode?"bi-sun-fill":"bi-moon-stars-fill"),f(4),C("disabled",i.isRestarting)("bsTooltip","Restart backend server"),f(),C("ngIf",!i.isRestarting),f(4),j("active",i.activeTab==="mcp"),f(4),j("active",i.activeTab==="llm"),f(4),j("active",i.activeTab==="chat"),f(4),j("active",i.activeTab==="workspace"),f(3),j("d-none",i.activeTab!=="mcp"),f(2),j("d-none",i.activeTab!=="llm"),f(2),j("d-none",i.activeTab!=="chat"),f(2),j("d-none",i.activeTab!=="workspace"))},dependencies:[vr,Lt,id,iA,aA,ad,mA],styles:[".page-wrapper[_ngcontent-%COMP%]{height:100vh;display:flex;flex-direction:column;overflow:hidden}.page-content[_ngcontent-%COMP%]{flex:1;overflow:hidden;min-height:0;display:flex;flex-direction:column}.tab-fill[_ngcontent-%COMP%]{flex:1;min-height:0;overflow:hidden}.llm-tab-content[_ngcontent-%COMP%]{overflow-y:auto;padding-bottom:1rem}.navbar-logo[_ngcontent-%COMP%]{width:22px;height:22px;vertical-align:middle}.dark-mode-toggle[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;border:1px solid rgba(255,255,255,.3);background:#ffffff1a;color:#fff;cursor:pointer;font-size:.95rem;transition:background .15s,border-color .15s,transform .2s}.dark-mode-toggle[_ngcontent-%COMP%]:hover{background:#fff3;border-color:#fff9;transform:scale(1.08)}.restart-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;border:1px solid rgba(255,255,255,.3);background:#ffffff1a;color:#fff;cursor:pointer;font-size:.95rem;transition:background .15s,border-color .15s,transform .2s}.restart-btn[_ngcontent-%COMP%]:hover:not(:disabled){background:#fff3;border-color:#fff9;transform:rotate(30deg) scale(1.08)}.restart-btn[_ngcontent-%COMP%]:disabled{opacity:.65;cursor:not-allowed}.logs-nav-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:.25rem .75rem;border-radius:6px;border:1px solid rgba(255,255,255,.3);background:#ffffff1a;color:#fff;font-size:.85rem;font-weight:500;text-decoration:none;transition:background .15s,border-color .15s}.logs-nav-btn[_ngcontent-%COMP%]:hover{background:#fff3;border-color:#fff9;color:#fff;text-decoration:none}"]})}}return e})();var gA=(()=>{class e{constructor(t){this.http=t,this.baseUrl=`${un.apiUrl}/api/logs`}getRecentLogs(t=300,r="all"){return this.http.get(`${this.baseUrl}?limit=${t}&level=${r}`)}streamLogs(){return new de(t=>{let r=new EventSource(`${this.baseUrl}/stream`);return r.onmessage=i=>{try{let o=JSON.parse(i.data);t.next(o)}catch{}},r.onerror=()=>{},()=>{r.close()}})}static{this.\u0275fac=function(r){return new(r||e)(k(Rt))}}static{this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}}return e})();var v3=["logContainer"];function y3(e,n){if(e&1){let t=be();_(0,"button",20),L("click",function(){let i=q(t).$implicit,o=R();return z(o.setLevel(i))}),h(1),St(2,"titlecase"),g()}if(e&2){let t=n.$implicit,r=R();j("active",r.activeLevel===t),f(),ie(" ",sn(2,3,t)," ")}}function I3(e,n){e&1&&(_(0,"div",21),y(1,"i",22),_(2,"span"),h(3,"Waiting for log entries\u2026"),g()())}function O3(e,n){if(e&1&&(_(0,"div",23)(1,"span",24),h(2),g(),_(3,"span",25),h(4),g(),_(5,"span",26),h(6),g()()),e&2){let t=n.$implicit,r=R();C("ngClass",r.tagClass(t)),f(2),J(r.formatTs(t.timestamp)),f(2),J(r.extractTag(t.message)),f(2),J(r.stripTag(t.message))}}function R3(e,n){if(e&1&&(_(0,"span",27),h(1),g()),e&2){let t=R();f(),ie("(filtered: ",t.activeLevel,")")}}var hA=(()=>{class e{constructor(t,r){this.logsService=t,this.cdr=r,this.logs=[],this.activeLevel="all",this.autoScroll=!0,this.isConnected=!1,this._allLogs=[],this._sseSub=null,this.levels=["all","info","warn","error"]}ngOnInit(){this._loadHistory(),this._connectSSE()}ngOnDestroy(){this._sseSub?.unsubscribe()}_loadHistory(){this.logsService.getRecentLogs(300).subscribe({next:t=>{this._allLogs=t.logs,this._applyFilter()},error:()=>{}})}_connectSSE(){this._sseSub=this.logsService.streamLogs().subscribe({next:t=>{this._allLogs.push(t),this._allLogs.length>2e3&&this._allLogs.shift(),this._applyFilter(),this.autoScroll&&setTimeout(()=>this._scrollToBottom(),0),this.isConnected=!0,this.cdr.detectChanges()},error:()=>{this.isConnected=!1,this.cdr.detectChanges()}}),this.isConnected=!0}setLevel(t){this.activeLevel=t,this._applyFilter()}_applyFilter(){this.activeLevel==="all"?this.logs=[...this._allLogs]:this.logs=this._allLogs.filter(t=>t.level===this.activeLevel)}clearLogs(){this._allLogs=[],this.logs=[]}toggleAutoScroll(){this.autoScroll=!this.autoScroll,this.autoScroll&&this._scrollToBottom()}_scrollToBottom(){try{let t=this.logContainer?.nativeElement;t&&(t.scrollTop=t.scrollHeight)}catch{}}tagClass(t){let r=t.message??"";return r.includes("[ERROR]")?"tag-error":r.includes("[SUCCESS]")?"tag-success":r.includes("[INIT]")?"tag-init":t.level==="error"?"tag-error":t.level==="warn"?"tag-warn":"tag-info"}extractTag(t){let r=t.match(/^\[(INIT|SUCCESS|ERROR|WARN)\]/);return r?`[${r[1]}]`:`[${this.activeLevel.toUpperCase()||"INFO"}]`}stripTag(t){return t.replace(/^\[(INIT|SUCCESS|ERROR|WARN)\]\s*/,"")}formatTs(t){try{return new Date(t).toLocaleTimeString("en-US",{hour12:!1})+"."+String(new Date(t).getMilliseconds()).padStart(3,"0")}catch{return t}}trackByIdx(t,r){return t}static{this.\u0275fac=function(r){return new(r||e)(M(gA),M(an))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-logs"]],viewQuery:function(r,i){if(r&1&&tn(v3,5),r&2){let o;xt(o=Pt())&&(i.logContainer=o.first)}},decls:26,vars:16,consts:[["logContainer",""],[1,"logs-page"],[1,"logs-toolbar"],[1,"d-flex","align-items-center","gap-3"],[1,"logs-title"],[1,"bi","bi-terminal-fill","me-2"],[1,"conn-badge"],[1,"conn-dot"],[1,"d-flex","align-items-center","gap-2"],["role","group",1,"btn-group","btn-group-sm"],["type","button","class","btn level-btn",3,"active","click",4,"ngFor","ngForOf"],[1,"btn","btn-sm","toolbar-btn",3,"click","title"],[1,"bi",3,"ngClass"],["title","Clear displayed logs",1,"btn","btn-sm","toolbar-btn","toolbar-btn--danger",3,"click"],[1,"bi","bi-trash3","me-1"],[1,"logs-body"],["class","logs-empty",4,"ngIf"],["class","log-entry",3,"ngClass",4,"ngFor","ngForOf","ngForTrackBy"],[1,"logs-footer"],["class","ms-2 fst-italic",4,"ngIf"],["type","button",1,"btn","level-btn",3,"click"],[1,"logs-empty"],[1,"bi","bi-hourglass-split","d-block","fs-2","mb-2","opacity-50"],[1,"log-entry",3,"ngClass"],[1,"log-ts"],[1,"log-tag"],[1,"log-msg"],[1,"ms-2","fst-italic"]],template:function(r,i){if(r&1){let o=be();_(0,"div",1)(1,"div",2)(2,"div",3)(3,"span",4),y(4,"i",5),h(5,"BlueOrch Studio \u2014 Live Logs "),g(),_(6,"span",6),y(7,"span",7),h(8),g()(),_(9,"div",8)(10,"div",9),F(11,y3,3,5,"button",10),g(),_(12,"button",11),L("click",function(){return q(o),z(i.toggleAutoScroll())}),y(13,"i",12),h(14," Auto-scroll "),g(),_(15,"button",13),L("click",function(){return q(o),z(i.clearLogs())}),y(16,"i",14),h(17,"Clear "),g()()(),_(18,"div",15,0),F(20,I3,4,0,"div",16)(21,O3,7,4,"div",17),g(),_(22,"div",18)(23,"span"),h(24),g(),F(25,R3,2,1,"span",19),g()()}r&2&&(f(6),j("conn-badge--live",i.isConnected)("conn-badge--off",!i.isConnected),f(2),ie(" ",i.isConnected?"Live":"Disconnected"," "),f(3),C("ngForOf",i.levels),f(),j("toolbar-btn--active",i.autoScroll),C("title",i.autoScroll?"Auto-scroll ON (click to pause)":"Auto-scroll OFF (click to resume)"),f(),C("ngClass",i.autoScroll?"bi-arrow-down-circle-fill":"bi-arrow-down-circle"),f(7),C("ngIf",i.logs.length===0),f(),C("ngForOf",i.logs)("ngForTrackBy",i.trackByIdx),f(3),nn("",i.logs.length," entr",i.logs.length===1?"y":"ies"," displayed"),f(),C("ngIf",i.activeLevel!=="all"))},dependencies:[vr,yr,Lt,Jl],styles:["[_nghost-%COMP%]{display:block;height:100vh;overflow:hidden}.logs-page[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100vh;background:#0d1117;color:#c9d1d9;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:13px}.logs-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.75rem;padding:.6rem 1.25rem;background:#161b22;border-bottom:1px solid #30363d;flex-shrink:0}.logs-title[_ngcontent-%COMP%]{font-size:1rem;font-weight:700;color:#58a6ff;font-family:inherit}.conn-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.35rem;padding:.15rem .6rem;border-radius:999px;font-size:.75rem;font-weight:600;border:1px solid transparent}.conn-badge--live[_ngcontent-%COMP%]{background:#3fb95026;border-color:#3fb950;color:#3fb950}.conn-badge--live[_ngcontent-%COMP%] .conn-dot[_ngcontent-%COMP%]{background:#3fb950;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite}.conn-badge--off[_ngcontent-%COMP%]{background:#f8514926;border-color:#f85149;color:#f85149}.conn-badge--off[_ngcontent-%COMP%] .conn-dot[_ngcontent-%COMP%]{background:#f85149}.conn-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex-shrink:0}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.35}}.level-btn[_ngcontent-%COMP%]{background:#21262d;border-color:#30363d;color:#8b949e;font-size:.72rem;font-family:inherit}.level-btn[_ngcontent-%COMP%]:hover{background:#30363d;color:#c9d1d9}.level-btn.active[_ngcontent-%COMP%]{background:#1f6feb;border-color:#1f6feb;color:#fff}.toolbar-btn[_ngcontent-%COMP%]{background:#21262d;border:1px solid #30363d;color:#8b949e;font-family:inherit;font-size:.72rem}.toolbar-btn[_ngcontent-%COMP%]:hover{background:#30363d;color:#c9d1d9}.toolbar-btn--active[_ngcontent-%COMP%]{background:#1f6feb26;border-color:#1f6feb;color:#58a6ff}.toolbar-btn--danger[_ngcontent-%COMP%]:hover{background:#f8514926;border-color:#f85149;color:#f85149}.logs-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;padding:.5rem 0}.logs-body[_ngcontent-%COMP%]::-webkit-scrollbar{width:6px}.logs-body[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:#0d1117}.logs-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#30363d;border-radius:3px}.logs-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover{background:#484f58}.logs-empty[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#484f58;font-size:.9rem;text-align:center}.log-entry[_ngcontent-%COMP%]{display:flex;align-items:baseline;gap:.75rem;padding:.15rem 1.25rem;line-height:1.55;white-space:pre-wrap;word-break:break-all;border-left:3px solid transparent}.log-entry[_ngcontent-%COMP%]:hover{background:#ffffff08}.log-entry.tag-error[_ngcontent-%COMP%]{border-left-color:#f85149}.log-entry.tag-error[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#f85149}.log-entry.tag-error[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-error[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#ffa198}.log-entry.tag-success[_ngcontent-%COMP%]{border-left-color:#3fb950}.log-entry.tag-success[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#3fb950}.log-entry.tag-success[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-success[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#c9d1d9}.log-entry.tag-init[_ngcontent-%COMP%]{border-left-color:#58a6ff}.log-entry.tag-init[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#58a6ff}.log-entry.tag-init[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-init[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#c9d1d9}.log-entry.tag-warn[_ngcontent-%COMP%]{border-left-color:#d29922}.log-entry.tag-warn[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#d29922}.log-entry.tag-warn[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-warn[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#e3b341}.log-entry.tag-info[_ngcontent-%COMP%]{border-left-color:#484f58}.log-entry.tag-info[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#8b949e}.log-entry.tag-info[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-info[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#c9d1d9}.log-ts[_ngcontent-%COMP%]{flex-shrink:0;font-size:.7rem;min-width:82px;color:#6e7681}.log-tag[_ngcontent-%COMP%]{flex-shrink:0;font-weight:700;font-size:.72rem;min-width:72px;letter-spacing:.03em}.log-msg[_ngcontent-%COMP%]{flex:1;color:#c9d1d9}.logs-footer[_ngcontent-%COMP%]{flex-shrink:0;padding:.3rem 1.25rem;background:#161b22;border-top:1px solid #30363d;font-size:.7rem;color:#6e7681}"]})}}return e})();var N3=[{path:"",component:fA},{path:"logs",component:hA}];function D3(){let e=new dn;return e.code=(n,t)=>{console.log(`[INIT] ${new Date().toISOString()} markedRenderer.code | lang: ${t??"auto"}`);let r=t&&rd.getLanguage(t)?t:"",i;try{i=r?rd.highlight(n,{language:r,ignoreIllegals:!0}).value:rd.highlightAuto(n).value}catch{i=n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}let o=(t||"code").toUpperCase(),s=i.split(`
78
+ `),document.body.appendChild(a),i(window.monacoAmdRequire)}),s.open("GET",o),s.send()}else{let a=document.createElement("script");a.type="text/javascript",a.src=`${r}/loader.js`,a.addEventListener("load",()=>{i()}),document.body.appendChild(a)}}))}ngOnDestroy(){this._windowResizeSubscription&&this._windowResizeSubscription.unsubscribe(),this._editor&&(this._editor.dispose(),this._editor=void 0)}static{this.\u0275fac=function(r){return new(r||e)}}static{this.\u0275cmp=Ge({type:e,selectors:[["ng-component"]],viewQuery:function(r,i){if(r&1&&tn(Hz,7),r&2){let o;xt(o=Pt())&&(i._editorContainer=o.first)}},inputs:{insideNg:"insideNg"},outputs:{onInit:"onInit"},decls:0,vars:0,template:function(r,i){},encapsulation:2})}}return e})(),uA=(()=>{class e extends qz{constructor(){super(...arguments),this.zone=P(Ne),this._value="",this.propagateChange=t=>{},this.onTouched=()=>{}}set options(t){this._options=Object.assign({},this.config.defaultOptions,t),this._editor&&(this._editor.dispose(),this.initMonaco(this._options,this.insideNg))}get options(){return this._options}set model(t){this.options.model=t,this._editor&&(this._editor.dispose(),this.initMonaco(this.options,this.insideNg))}writeValue(t){this._value=t||"",setTimeout(()=>{this._editor&&!this.options.model&&this._editor.setValue(this._value)})}registerOnChange(t){this.propagateChange=t}registerOnTouched(t){this.onTouched=t}setDisabledState(t){this.options.readOnly=t||this._options.readOnly}initMonaco(t,r){let i=!!t.model;if(i){let o=monaco.editor.getModel(t.model.uri||"");o?(t.model=o,t.model.setValue(this._value)):t.model=monaco.editor.createModel(t.model.value,t.model.language,t.model.uri)}r?this._editor=monaco.editor.create(this._editorContainer.nativeElement,t):this.zone.runOutsideAngular(()=>{this._editor=monaco.editor.create(this._editorContainer.nativeElement,t)}),i||this._editor.setValue(this._value),this._editor.onDidChangeModelContent(o=>{let s=this._editor.getValue();this.zone.run(()=>{this.propagateChange(s),this._value=s})}),this._editor.onDidBlurEditorWidget(()=>{this.onTouched()}),this._editor.setTheme=o=>{this.options.theme=o,monaco.editor.setTheme(o)},this._windowResizeSubscription&&this._windowResizeSubscription.unsubscribe(),this._windowResizeSubscription=xo(window,"resize").subscribe(()=>this._editor.layout()),this.onInit.emit(this._editor)}static{this.\u0275fac=(()=>{let t;return function(i){return(t||(t=Ln(e)))(i||e)}})()}static{this.\u0275cmp=Ge({type:e,selectors:[["ngx-monaco-editor"]],inputs:{options:"options",model:"model"},standalone:!0,features:[on([{provide:or,useExisting:Bt(()=>e),multi:!0}]),Et,er],decls:2,vars:0,consts:[["editorContainer",""],[1,"editor-container"]],template:function(r,i){r&1&&y(0,"div",1,0)},styles:["[_nghost-%COMP%]{display:block;height:200px}.editor-container[_ngcontent-%COMP%]{width:100%;height:98%}"],changeDetection:0})}}return e})();var pA=(()=>{class e{static forRoot(t={}){return{ngModule:e,providers:[{provide:dA,useValue:t}]}}static{this.\u0275fac=function(r){return new(r||e)}}static{this.\u0275mod=rt({type:e})}static{this.\u0275inj=nt({imports:[no]})}}return e})();function Wz(e,n){if(e&1){let t=be();Ve(0),_(1,"span",30),y(2,"i",31),h(3),g(),_(4,"button",32),L("click",function(){q(t);let i=R();return z(i.resetContext())}),y(5,"i",33),g(),$e()}if(e&2){let t=n.ngIf;f(3),ie("",t," in context ")}}function Kz(e,n){if(e&1&&(_(0,"div",44),y(1,"i",45),h(2),g()),e&2){let t=R(2);f(2),ie("",t.newInputError," ")}}function jz(e,n){if(e&1){let t=be();_(0,"div",34)(1,"div",35),y(2,"i",36),_(3,"input",37,0),Yt("ngModelChange",function(i){q(t);let o=R();return rn(o.newInputName,i)||(o.newInputName=i),z(i)}),L("keydown",function(i){q(t);let o=R();return z(o.onNewInputKeydown(i))}),g(),_(5,"button",38),L("click",function(){q(t);let i=R();return z(i.confirmNewFile())}),y(6,"i",39),g(),_(7,"button",40),L("click",function(){q(t);let i=R();return z(i.cancelNewFile())}),y(8,"i",41),g()(),F(9,Kz,3,1,"div",42),_(10,"div",43),h(11),g()()}if(e&2){let t=R();f(2),j("bi-file-earmark-plus",t.newInputType==="file")("bi-folder-plus",t.newInputType==="directory"),f(),C("placeholder",t.newInputType==="file"?"filename.ts":"folder-name"),$t("ngModel",t.newInputName),f(6),C("ngIf",t.newInputError),f(2),ie("In: ",t.newInputDir,"")}}function Qz(e,n){e&1&&(_(0,"div",46),y(1,"div",47),_(2,"p",48),h(3,"Loading\u2026"),g()())}function Xz(e,n){if(e&1&&(_(0,"div",49),y(1,"i",50),h(2),g()),e&2){let t=R();f(2),ie("",t.treeError," ")}}function Zz(e,n){e&1&&(_(0,"div",54),y(1,"i",55),h(2,"Empty folder "),g())}function Jz(e,n){if(e&1){let t=be();_(0,"cdk-tree-node",59),L("click",function(){let i=q(t).$implicit,o=R(3);return z(o.openFile(i))}),y(1,"i",60),_(2,"span",61),h(3),g(),_(4,"label",62),L("click",function(i){return q(t),z(i.stopPropagation())}),_(5,"input",63),L("change",function(i){let o=q(t).$implicit,s=R(3);return z(s.toggleContext(i,o))}),g()()()}if(e&2){let t=n.$implicit,r=R(3);Zi("padding-left",t.level*16+28,"px"),j("in-context-file",t.inContext)("is-viewing",r.viewerFile===t),f(),j("bi-file-earmark-code",r.isCodeFile(t.name))("bi-file-earmark-text",!r.isCodeFile(t.name))("text-info",r.isCodeFile(t.name))("text-secondary",!r.isCodeFile(t.name)),f(),C("title",t.path),f(),J(t.name),f(2),C("checked",t.inContext)}}function e3(e,n){e&1&&y(0,"span",72)}function t3(e,n){if(e&1&&y(0,"i",73),e&2){let t=R().$implicit,r=R(3);j("expanded",r.isExpanded(t))}}function n3(e,n){if(e&1){let t=be();_(0,"cdk-tree-node",64),L("click",function(i){let o=q(t).$implicit,s=R(3);return z(s.onDirRowClick(i,o))}),_(1,"button",65),L("click",function(){let i=q(t).$implicit,o=R(3);return z(o.toggleNode(i))}),F(2,e3,1,0,"span",66)(3,t3,1,2,"i",67),g(),y(4,"i",68),_(5,"span",69),h(6),g(),_(7,"button",70),L("click",function(i){let o=q(t).$implicit,s=R(3);return i.stopPropagation(),z(s.setAsRoot(o))}),y(8,"i",71),g()()}if(e&2){let t=n.$implicit,r=R(3);Zi("padding-left",t.level*16+4,"px"),j("is-active-root",t.path===r.activePath),f(),C("disabled",t.loading),f(),C("ngIf",t.loading),f(),C("ngIf",!t.loading),f(),j("bi-folder-fill",!r.isExpanded(t))("bi-folder2-open",r.isExpanded(t)),f(),C("title","Open: "+t.path),f(),J(t.name),f(),C("title",t.path===r.activePath?"Active workspace root":"Set as workspace root"),f(),j("bi-pin-fill",t.path===r.activePath)("text-primary",t.path===r.activePath)("bi-pin",t.path!==r.activePath)("text-muted",t.path!==r.activePath)}}function r3(e,n){if(e&1&&(_(0,"cdk-tree",56),F(1,Jz,6,17,"cdk-tree-node",57)(2,n3,9,22,"cdk-tree-node",58),g()),e&2){let t=R(2);C("dataSource",t.nodesData$)("treeControl",t.treeControl),f(2),C("cdkTreeNodeDefWhen",t.hasChild)}}function i3(e,n){if(e&1&&(_(0,"div",51),F(1,Zz,3,0,"div",52)(2,r3,3,3,"cdk-tree",53),g()),e&2){let t=R();f(),C("ngIf",t.flatNodes.length===0),f(),C("ngIf",t.flatNodes.length>0)}}function o3(e,n){e&1&&(_(0,"div",74),y(1,"i",75),_(2,"p",76),h(3,"No file open"),g(),_(4,"p",48),h(5,"Click any file in the tree to view its content here"),g()())}function s3(e,n){if(e&1&&(_(0,"div",74),y(1,"div",77),_(2,"p",48),h(3),g()()),e&2){let t=R();f(3),ie("Loading ",t.viewerFile.name,"\u2026")}}function a3(e,n){if(e&1){let t=be();_(0,"div",78),y(1,"i",79),_(2,"p",80),h(3),g(),_(4,"button",81),L("click",function(){q(t);let i=R();return z(i.closeViewer())}),h(5,"Close"),g()()}if(e&2){let t=R();f(3),J(t.viewerError)}}function l3(e,n){e&1&&(_(0,"span",97),h(1,"\u25CF"),g())}function c3(e,n){e&1&&(_(0,"span",98),h(1,"In Context"),g())}function d3(e,n){if(e&1){let t=be();Ve(0),_(1,"button",99),L("click",function(){q(t);let i=R(2);return z(i.toggleEdit())}),y(2,"i",100),h(3,"Edit "),g(),$e()}}function u3(e,n){e&1&&y(0,"span",107)}function p3(e,n){e&1&&y(0,"i",108)}function _3(e,n){if(e&1){let t=be();Ve(0),_(1,"button",101),L("click",function(){q(t);let i=R(2);return z(i.saveFile())}),F(2,u3,1,0,"span",102)(3,p3,1,0,"i",103),h(4),g(),_(5,"button",104),L("click",function(){q(t);let i=R(2);return z(i.discardChanges())}),y(6,"i",105),g(),_(7,"span",106),h(8,"EDITING"),g(),$e()}if(e&2){let t=R(2);f(),j("btn-success",!t.isSaving)("btn-secondary",t.isSaving),C("disabled",t.isSaving),f(),C("ngIf",t.isSaving),f(),C("ngIf",!t.isSaving),f(),ie(" ",t.isSaving?"Saving\u2026":"Save"," "),f(),C("disabled",t.isSaving)}}function m3(e,n){e&1&&(_(0,"span",109),y(1,"i",110),g())}function f3(e,n){if(e&1){let t=be();_(0,"div",82)(1,"div",83),y(2,"i",84),F(3,l3,2,0,"span",85),_(4,"span",86),h(5),g(),_(6,"label",87),L("click",function(i){return q(t),z(i.stopPropagation())}),_(7,"input",63),L("change",function(i){q(t);let o=R();return z(o.toggleContext(i,o.viewerFile))}),g()(),F(8,c3,2,0,"span",88),_(9,"button",89),L("click",function(){q(t);let i=R();return z(i.closeViewer())}),g()(),_(10,"span",90),h(11),g(),_(12,"div",91),F(13,d3,4,0,"ng-container",10)(14,_3,9,9,"ng-container",10)(15,m3,2,0,"span",92),y(16,"div",93),_(17,"button",94),L("click",function(){q(t);let i=R();return z(i.toggleWordWrap())}),y(18,"i",95),g(),_(19,"button",94),L("click",function(){q(t);let i=R();return z(i.toggleMinimap())}),y(20,"i",96),g()()()}if(e&2){let t=R();f(3),C("ngIf",t.isDirty),f(2),J(t.viewerFile.name),f(2),C("checked",t.viewerFile.inContext),f(),C("ngIf",t.viewerFile.inContext),f(2),C("title",t.viewerFile.path),f(),J(t.viewerFile.path),f(2),C("ngIf",!t.isEditing),f(),C("ngIf",t.isEditing),f(),C("ngIf",t.saveNotify),f(2),j("active",t.wordWrap),wl("title","Word wrap ",t.wordWrap?"On":"Off",""),f(2),j("active",t.minimapOn),wl("title","Minimap ",t.minimapOn?"On":"Off","")}}function g3(e,n){if(e&1&&(_(0,"div",111)(1,"div",112),y(2,"div",113),_(3,"span",114),h(4),g()()()),e&2){let t=R();f(4),ie(" ",t.monacoReady?"Loading "+t.viewerFile.name+"\u2026":"Initialising editor\u2026"," ")}}function h3(e,n){e&1&&(Ve(0),_(1,"span",117),h(2,"|"),g(),_(3,"span",132),y(4,"i",133),h(5," EDITING "),g(),$e())}function E3(e,n){e&1&&(Ve(0),_(1,"span",117),h(2,"|"),g(),_(3,"span",134),y(4,"i",135),h(5," Unsaved "),g(),$e())}function S3(e,n){if(e&1){let t=be();_(0,"div",115)(1,"span",116),h(2),g(),_(3,"span",117),h(4,"|"),g(),_(5,"span",116),h(6),g(),F(7,h3,6,0,"ng-container",10)(8,E3,6,0,"ng-container",10),y(9,"span",118),_(10,"span",119)(11,"button",120),L("click",function(){q(t);let i=R();return z(i.setFontSize(-1))}),h(12,"A"),_(13,"sup",121),h(14,"\u2212"),g()(),_(15,"span"),h(16),g(),_(17,"button",122),L("click",function(){q(t);let i=R();return z(i.setFontSize(1))}),h(18,"A"),_(19,"sup",121),h(20,"+"),g()()(),_(21,"span",117),h(22,"|"),g(),_(23,"div",123)(24,"button",124),y(25,"i",125),_(26,"span"),h(27),g(),y(28,"i",126),g(),_(29,"ul",127)(30,"li")(31,"button",128),L("click",function(){q(t);let i=R();return z(i.setTheme("vs-dark"))}),y(32,"i",129),h(33,"Dark "),g()(),_(34,"li")(35,"button",128),L("click",function(){q(t);let i=R();return z(i.setTheme("vs"))}),y(36,"i",130),h(37,"Light "),g()(),_(38,"li")(39,"button",128),L("click",function(){q(t);let i=R();return z(i.setTheme("hc-black"))}),y(40,"i",131),h(41,"High Contrast "),g()()()()()}if(e&2){let t=R();f(2),nn("Ln ",t.cursorLine,", Col ",t.cursorCol,""),f(4),J(t.viewerFile?t.langFromName(t.viewerFile.name):""),f(),C("ngIf",t.isEditing),f(),C("ngIf",t.isDirty),f(8),ie("",t.fontSize,"px"),f(11),J(t.activeTheme==="vs-dark"?"Dark":t.activeTheme==="vs"?"Light":"HC"),f(4),j("active",t.activeTheme==="vs-dark"),f(4),j("active",t.activeTheme==="vs"),f(4),j("active",t.activeTheme==="hc-black")}}var _A={theme:"vs-dark",readOnly:!0,minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:13,fontFamily:"'Cascadia Code', 'Fira Code', 'Consolas', monospace",lineNumbers:"on",renderLineHighlight:"line",wordWrap:"on"};function zm(e){let n=e.split(".").pop()?.toLowerCase()??"";return{ts:"typescript",js:"javascript",mjs:"javascript",cjs:"javascript",html:"html",css:"css",scss:"scss",sass:"sass",json:"json",md:"markdown",yaml:"yaml",yml:"yaml",py:"python",java:"java",go:"go",rs:"rust",c:"c",cpp:"cpp",h:"cpp",rb:"ruby",php:"php",sh:"shell",bash:"shell",zsh:"shell",sql:"sql",xml:"xml",toml:"ini",env:"ini",swift:"swift",kt:"kotlin"}[n]??"plaintext"}var mA=(()=>{class e{constructor(t){this.workspaceService=t,this.activePath="",this.pathInput="",this.treeLoading=!1,this.treeError="",this.treeRootPath="",this.flatNodes=[],this.nodesData$=new ze([]),this.treeControl=new Gc(r=>r.level,r=>r.expandable),this.hasChild=(r,i)=>i.expandable,this.contextFilePaths=new Set,this.viewerFile=null,this.viewerContent="",this.viewerLoading=!1,this.viewerError="",this.editorOptions=Ee(D({},_A),{language:"plaintext"}),this.monacoEditor=null,this.pendingContent=null,this.resizeObserver=null,this.monacoReady=!1,this.contentReady=!1,this.isEditing=!1,this.isDirty=!1,this.isSaving=!1,this.saveNotify=!1,this.originalContent="",this.activeTheme="vs-dark",this.wordWrap=!0,this.minimapOn=!0,this.fontSize=13,this.cursorLine=1,this.cursorCol=1,this.showNewInput=!1,this.newInputName="",this.newInputType="file",this.newInputDir="",this.newInputError="",this._skipNextLoad=!1,console.log(`[INIT] ${new Date().toISOString()} WorkspaceTabComponent initialized`)}ngOnInit(){this.sub=this.workspaceService.activePath$.subscribe(t=>{if(this.activePath=t,this.pathInput=t,this._skipNextLoad){this._skipNextLoad=!1;return}this.treeRootPath=t,this._loadRoot(t||"/")}),this.contextFilePaths=new Set(this.workspaceService.contextFiles)}ngOnDestroy(){this.sub?.unsubscribe(),this.resizeObserver?.disconnect()}applyPathInput(){let t=this.pathInput.trim();t&&t!==this.activePath&&this.workspaceService.setPath(t)}onPathKeydown(t){t.key==="Enter"&&(this.applyPathInput(),t.target.blur()),t.key==="Escape"&&(this.pathInput=this.activePath)}navigateToParent(){let t=this._parentPath(this.treeRootPath);t!==this.treeRootPath&&(this.treeError="",this._loadRoot(t))}onDirRowClick(t,r){t.target.closest("button")||this.navigateInto(r)}navigateInto(t){t.type==="directory"&&(this.treeError="",this._loadRoot(t.path))}setAsRoot(t){t.type==="directory"&&(this._skipNextLoad=!0,this.workspaceService.setPath(t.path))}toggleNode(t){if(!(!t.expandable||t.loading))if(this.treeControl.isExpanded(t)){this._collapseDescendants(t),this.treeControl.collapse(t);let r=this.flatNodes.indexOf(t),i=r+1;for(;i<this.flatNodes.length&&this.flatNodes[i].level>t.level;)i++;this.flatNodes.splice(r+1,i-r-1),this.nodesData$.next([...this.flatNodes])}else if(this.treeControl.expand(t),t.childrenLoaded){let r=this.flatNodes.indexOf(t);this.flatNodes.splice(r+1,0,...t.children),this.nodesData$.next([...this.flatNodes])}else t.loading=!0,this.nodesData$.next([...this.flatNodes]),this.workspaceService.getFileTree(t.path).subscribe({next:r=>{t.loading=!1,t.childrenLoaded=!0;let i=this._itemsToNodes(r,t.level+1);t.children=i;let o=this.flatNodes.indexOf(t);this.flatNodes.splice(o+1,0,...i),this.nodesData$.next([...this.flatNodes])},error:r=>{t.loading=!1,this.treeControl.collapse(t),this.nodesData$.next([...this.flatNodes]),console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: load failed | ${r.message}`)}})}isExpanded(t){return this.treeControl.isExpanded(t)}openFile(t){t.type==="file"&&this.viewerFile!==t&&(this.isDirty&&!confirm("Discard unsaved changes?")||(this.isEditing=!1,this.isDirty=!1,this.originalContent="",this.monacoEditor&&this.monacoEditor.updateOptions({readOnly:!0}),this.viewerFile=t,this.viewerContent="",this.viewerLoading=!0,this.viewerError="",this.contentReady=!1,this.editorOptions=Ee(D({},_A),{language:zm(t.name)}),console.log(`[INIT] ${new Date().toISOString()} WorkspaceTab: opening "${t.path}"`),this.workspaceService.readFile(t.path).subscribe({next:r=>{if(this.viewerLoading=!1,this.viewerContent=r,this.monacoEditor){this.monacoEditor.setValue(r);let i=this.monacoEditor.getModel();i&&window.monaco?.editor?.setModelLanguage(i,zm(t.name)),this.monacoEditor.revealLine(1),this.monacoEditor.layout(),requestAnimationFrame(()=>requestAnimationFrame(()=>this.contentReady=!0))}else this.pendingContent=r;console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: loaded "${t.name}"`)},error:r=>{this.viewerLoading=!1,this.viewerError=r.error?.error??r.message??"Failed to read file.",console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: read failed | ${this.viewerError}`)}})))}onMonacoInit(t){this.monacoEditor=t,this.monacoReady=!0;let r=this.pendingContent??this.viewerContent;r&&(t.setValue(r),this.pendingContent=null,t.layout(),requestAnimationFrame(()=>requestAnimationFrame(()=>this.contentReady=!0)));let i=t.getContainerDomNode();i&&typeof ResizeObserver<"u"&&(this.resizeObserver?.disconnect(),this.resizeObserver=new ResizeObserver(()=>{t.layout()}),this.resizeObserver.observe(i.parentElement??i)),t.onDidChangeCursorPosition(o=>{this.cursorLine=o.position.lineNumber,this.cursorCol=o.position.column}),t.onDidChangeModelContent(()=>{this.isEditing&&(this.isDirty=t.getValue()!==this.originalContent)}),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: Monaco editor ready`)}closeViewer(){this.isDirty&&!confirm("Discard unsaved changes?")||(this.viewerFile=null,this.viewerContent="",this.viewerError="",this.contentReady=!1,this.pendingContent=null,this.isEditing=!1,this.isDirty=!1,this.originalContent="",this.isSaving=!1,this.monacoEditor&&(this.monacoEditor.setValue(""),this.monacoEditor.updateOptions({readOnly:!0})))}onKeydown(t){(t.metaKey||t.ctrlKey)&&t.key==="s"&&this.isEditing&&this.isDirty&&(t.preventDefault(),this.saveFile())}toggleEdit(){if(this.viewerFile){if(this.isEditing){if(this.isDirty&&!confirm("Discard unsaved changes?"))return;this.discardChanges();return}this.originalContent=this.monacoEditor?.getValue()??this.viewerContent,this.isEditing=!0,this.monacoEditor?.updateOptions({readOnly:!1}),this.monacoEditor?.focus(),console.log(`[INIT] ${new Date().toISOString()} WorkspaceTab: edit mode ON "${this.viewerFile.name}"`)}}saveFile(){if(!this.viewerFile||!this.isEditing)return;let t=this.monacoEditor?.getValue()??this.viewerContent;this.isSaving=!0,console.log(`[INIT] ${new Date().toISOString()} WorkspaceTab: saving "${this.viewerFile.path}"`),this.workspaceService.writeFile(this.viewerFile.path,t).subscribe({next:()=>{this.isSaving=!1,this.isDirty=!1,this.originalContent=t,this.viewerContent=t,this.saveNotify=!0,setTimeout(()=>this.saveNotify=!1,2e3),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: saved "${this.viewerFile.path}"`)},error:r=>{this.isSaving=!1,alert("Save failed: "+(r.error?.error??r.message)),console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: save failed | ${r.message}`)}})}discardChanges(){this.isEditing=!1,this.isDirty=!1,this.monacoEditor?.updateOptions({readOnly:!0}),this.monacoEditor?.setValue(this.originalContent),this.viewerContent=this.originalContent,this.originalContent="",console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: changes discarded`)}setTheme(t){this.activeTheme=t,window.monaco?.editor?.setTheme(t),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: theme \u2192 ${t}`)}toggleWordWrap(){this.wordWrap=!this.wordWrap,this.monacoEditor?.updateOptions({wordWrap:this.wordWrap?"on":"off"})}toggleMinimap(){this.minimapOn=!this.minimapOn,this.monacoEditor?.updateOptions({minimap:{enabled:this.minimapOn}})}setFontSize(t){this.fontSize=Math.min(30,Math.max(8,this.fontSize+t)),this.monacoEditor?.updateOptions({fontSize:this.fontSize}),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: fontSize \u2192 ${this.fontSize}`)}showNewFileInput(t,r="file"){this.showNewInput=!0,this.newInputName="",this.newInputType=r,this.newInputDir=t||this.treeRootPath,this.newInputError=""}cancelNewFile(){this.showNewInput=!1,this.newInputName="",this.newInputError=""}confirmNewFile(){let t=this.newInputName.trim();if(!t){this.newInputError="Name is required";return}if(/[\/\\:*?"<>|]/.test(t)){this.newInputError="Invalid characters";return}let r=this.newInputDir.replace(/\/+$/,"")+"/"+t;this.workspaceService.createFile(r,this.newInputType).subscribe({next:()=>{this.showNewInput=!1,this.newInputName="",this._loadRoot(this.treeRootPath),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: created "${r}"`)},error:i=>{this.newInputError=i.error?.error??i.message??"Failed to create",console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: create failed | ${this.newInputError}`)}})}onNewInputKeydown(t){t.key==="Enter"&&this.confirmNewFile(),t.key==="Escape"&&this.cancelNewFile()}toggleContext(t,r){t.stopPropagation(),r.inContext=!r.inContext,r.type==="file"&&(r.inContext?this.contextFilePaths.add(r.path):this.contextFilePaths.delete(r.path),this.workspaceService.setContextFiles([...this.contextFilePaths])),this.nodesData$.next([...this.flatNodes]),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: context \u2192 ${r.name} = ${r.inContext}`)}resetContext(){this.contextFilePaths.clear(),this.workspaceService.clearContextFiles(),this.flatNodes.forEach(t=>t.inContext=!1),this.nodesData$.next([...this.flatNodes]),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: context reset`)}isCodeFile(t){return/\.(ts|js|mjs|py|java|go|rs|c|cpp|h|css|scss|sass|html|json|md|yaml|yml|sh|bash|zsh|txt|env|toml|xml|sql|rb|php|swift|kt|dart)$/i.test(t)}langFromName(t){return zm(t)}_loadRoot(t){this.treeLoading=!0,this.treeRootPath=t,this.flatNodes=[],this.nodesData$.next([]),this.workspaceService.getFileTree(t).subscribe({next:r=>{this.treeLoading=!1,this.flatNodes=this._itemsToNodes(r,0),this.nodesData$.next([...this.flatNodes]),console.log(`[SUCCESS] ${new Date().toISOString()} WorkspaceTab: root loaded | ${r.length} items`)},error:r=>{this.treeLoading=!1,this.treeError=r.error?.error??r.message??"Failed to list directory.",console.error(`[ERROR] ${new Date().toISOString()} WorkspaceTab: root load failed | ${this.treeError}`)}})}_itemsToNodes(t,r){return t.map(i=>({name:i.name,type:i.type,path:i.path,level:r,expandable:i.type==="directory",loading:!1,inContext:i.type==="file"?this.contextFilePaths.has(i.path):!1,childrenLoaded:!1,children:[]}))}_parentPath(t){let r=t.replace(/\/+$/,""),i=r.lastIndexOf("/");return i<=0?"/":r.substring(0,i)}_collapseDescendants(t){for(let r of t.children)this.treeControl.isExpanded(r)&&(this._collapseDescendants(r),this.treeControl.collapse(r))}static{this.\u0275fac=function(r){return new(r||e)(M(yo))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-workspace-tab"]],hostBindings:function(r,i){r&1&&L("keydown",function(s){return i.onKeydown(s)},!1,Qh)},decls:36,vars:23,consts:[["newFileInput",""],[1,"ws-tab-wrapper"],[1,"ws-tree-panel"],[1,"ws-path-bar","border-bottom","d-flex","align-items-center","gap-2","px-3","py-2"],["title","Go up to parent folder",1,"btn","btn-sm","btn-outline-secondary","py-0","px-2","flex-shrink-0",3,"click","disabled"],[1,"bi","bi-arrow-up"],["type","text","spellcheck","false",1,"form-control","form-control-sm","font-monospace","ws-path-input",3,"input","keydown","blur","value","title"],[1,"ws-ctx-bar","border-bottom","px-3","py-1","d-flex","align-items-center","gap-2","small"],[1,"bi","bi-folder2-open","text-primary","flex-shrink-0"],[1,"text-muted","text-truncate","flex-1",2,"font-size","0.72rem",3,"title"],[4,"ngIf"],["title","New File",1,"btn-new-item",3,"click"],[1,"bi","bi-file-earmark-plus"],["title","New Folder",1,"btn-new-item",3,"click"],[1,"bi","bi-folder-plus"],["class","ws-new-input-bar border-bottom px-3 py-2",4,"ngIf"],["class","text-center py-5 text-muted",4,"ngIf"],["class","alert alert-warning m-3 py-2 small",4,"ngIf"],["class","ws-tree-body",4,"ngIf"],[1,"ws-legend","border-top","px-3","py-1","d-flex","align-items-center","gap-3","small","text-muted","bg-light"],[1,"bi","bi-pin","me-1"],[1,"bi","bi-check2-square","me-1"],[1,"ws-viewer-panel"],["class","ws-viewer-empty d-flex flex-column align-items-center justify-content-center text-muted",4,"ngIf"],["class","ws-viewer-empty d-flex flex-column align-items-center justify-content-center",4,"ngIf"],["class","ws-viewer-tabbar d-flex align-items-center border-bottom bg-dark px-2",4,"ngIf"],[1,"ws-monaco-wrap"],["class","ws-monaco-loader",4,"ngIf"],[1,"ws-monaco",3,"onInit","options"],["class","ws-statusbar",4,"ngIf"],[1,"badge","bg-success","d-flex","align-items-center","gap-1",2,"font-size","0.68rem"],[1,"bi","bi-file-earmark-check"],["title","Reset context selection",1,"btn","btn-xs","btn-outline-danger","py-0","px-1",3,"click"],[1,"bi","bi-x-circle"],[1,"ws-new-input-bar","border-bottom","px-3","py-2"],[1,"d-flex","align-items-center","gap-2"],[1,"bi","text-muted","flex-shrink-0"],["type","text","autofocus","",1,"form-control","form-control-sm","font-monospace","flex-1",3,"ngModelChange","keydown","placeholder","ngModel"],[1,"btn","btn-sm","btn-primary","py-0","px-2",3,"click"],[1,"bi","bi-check-lg"],[1,"btn","btn-sm","btn-outline-secondary","py-0","px-2",3,"click"],[1,"bi","bi-x-lg"],["class","text-danger mt-1","style","font-size:0.72rem;",4,"ngIf"],[1,"text-muted","mt-1",2,"font-size","0.68rem"],[1,"text-danger","mt-1",2,"font-size","0.72rem"],[1,"bi","bi-exclamation-circle","me-1"],[1,"text-center","py-5","text-muted"],["role","status",1,"spinner-border","spinner-border-sm","text-primary","mb-2"],[1,"small","mb-0"],[1,"alert","alert-warning","m-3","py-2","small"],[1,"bi","bi-exclamation-triangle","me-1"],[1,"ws-tree-body"],["class","text-center text-muted py-5 small",4,"ngIf"],[3,"dataSource","treeControl",4,"ngIf"],[1,"text-center","text-muted","py-5","small"],[1,"bi","bi-folder-x","d-block","fs-3","mb-2","opacity-50"],[3,"dataSource","treeControl"],["class","ws-tree-node ws-node-file",3,"in-context-file","is-viewing","padding-left","click",4,"cdkTreeNodeDef"],["class","ws-tree-node ws-node-dir",3,"is-active-root","padding-left","click",4,"cdkTreeNodeDef","cdkTreeNodeDefWhen"],[1,"ws-tree-node","ws-node-file",3,"click"],[1,"node-icon","bi"],[1,"node-label","small","text-truncate","flex-1",3,"title"],["title","Add to AI context",1,"ctx-label","flex-shrink-0",3,"click"],["type","checkbox",1,"form-check-input","ctx-check",3,"change","checked"],[1,"ws-tree-node","ws-node-dir",3,"click"],[1,"btn-expand",3,"click","disabled"],["class","spinner-border spinner-border-sm text-primary","role","status","style","width:11px;height:11px;",4,"ngIf"],["class","bi bi-chevron-right expand-icon",3,"expanded",4,"ngIf"],[1,"node-icon","text-warning","bi"],[1,"node-label","small","text-truncate","flex-1","dir-label",3,"title"],[1,"btn-pin","flex-shrink-0",3,"click","title"],[1,"bi","active-root-icon"],["role","status",1,"spinner-border","spinner-border-sm","text-primary",2,"width","11px","height","11px"],[1,"bi","bi-chevron-right","expand-icon"],[1,"ws-viewer-empty","d-flex","flex-column","align-items-center","justify-content-center","text-muted"],[1,"bi","bi-file-earmark-code","d-block","fs-1","mb-3","opacity-25"],[1,"fw-semibold","mb-1"],["role","status",1,"spinner-border","text-primary","mb-3"],[1,"ws-viewer-empty","d-flex","flex-column","align-items-center","justify-content-center"],[1,"bi","bi-exclamation-triangle-fill","text-warning","d-block","fs-2","mb-3"],[1,"text-danger","small","mb-2"],[1,"btn","btn-sm","btn-outline-secondary",3,"click"],[1,"ws-viewer-tabbar","d-flex","align-items-center","border-bottom","bg-dark","px-2"],[1,"ws-viewer-tab","d-flex","align-items-center","gap-2","px-3","py-2","text-light","active-viewer-tab"],[1,"bi","bi-file-earmark-code","text-info",2,"font-size","0.8rem"],["class","dirty-dot","title","Unsaved changes",4,"ngIf"],[1,"small",2,"font-size","0.8rem"],["title","Add to AI context",1,"ctx-label","ms-2",3,"click"],["class","badge bg-success ms-1","style","font-size:0.62rem;",4,"ngIf"],[1,"btn-close","btn-close-white","ms-2",2,"width","10px","height","10px",3,"click"],[1,"ws-tab-path",3,"title"],[1,"ws-tab-controls"],["class","text-success","style","font-size:0.8rem;",4,"ngIf"],[1,"ws-tab-sep"],[1,"ws-tab-icon-btn",3,"click","title"],[1,"bi","bi-text-wrap"],[1,"bi","bi-map"],["title","Unsaved changes",1,"dirty-dot"],[1,"badge","bg-success","ms-1",2,"font-size","0.62rem"],["title","Edit file",1,"btn","btn-sm","btn-outline-primary","py-0","px-2",3,"click"],[1,"bi","bi-pencil","me-1"],["title","Save (Cmd/Ctrl+S)",1,"btn","btn-sm","py-0","px-2",3,"click","disabled"],["class","spinner-border spinner-border-sm me-1","role","status",4,"ngIf"],["class","bi bi-floppy me-1",4,"ngIf"],["title","Discard changes",1,"ws-tab-icon-btn",3,"click","disabled"],[1,"bi","bi-arrow-counterclockwise"],[1,"badge","bg-warning","text-dark",2,"font-size","0.65rem"],["role","status",1,"spinner-border","spinner-border-sm","me-1"],[1,"bi","bi-floppy","me-1"],[1,"text-success",2,"font-size","0.8rem"],[1,"bi","bi-check-circle-fill"],[1,"ws-monaco-loader"],[1,"ws-monaco-loader-inner"],["role","status",1,"spinner-border","text-primary",2,"width","1.5rem","height","1.5rem"],[1,"small","text-muted","mt-2"],[1,"ws-statusbar"],[1,"ws-statusbar-item"],[1,"ws-statusbar-sep"],[1,"ws-statusbar-spacer"],[1,"ws-statusbar-item","ws-statusbar-font"],["title","Decrease font size",1,"ws-sb-btn",3,"click"],[2,"font-size","0.55rem"],["title","Increase font size",1,"ws-sb-btn",3,"click"],[1,"dropdown"],["type","button","data-bs-toggle","dropdown","title","Theme",1,"ws-sb-dropdown-btn"],[1,"bi","bi-palette",2,"font-size","0.7rem"],[1,"bi","bi-chevron-up",2,"font-size","0.5rem","opacity","0.6"],[1,"dropdown-menu","dropdown-menu-end","shadow-sm"],[1,"dropdown-item","small",3,"click"],[1,"bi","bi-moon-fill","me-2"],[1,"bi","bi-sun-fill","me-2"],[1,"bi","bi-circle-half","me-2"],[1,"ws-statusbar-item","ws-status-editing"],[1,"bi","bi-pencil-fill",2,"font-size","0.6rem"],[1,"ws-statusbar-item","ws-status-dirty"],[1,"bi","bi-circle-fill",2,"font-size","0.45rem"]],template:function(r,i){if(r&1&&(_(0,"div",1)(1,"div",2)(2,"div",3)(3,"button",4),L("click",function(){return i.navigateToParent()}),y(4,"i",5),g(),_(5,"input",6),L("input",function(s){return i.pathInput=s.target.value})("keydown",function(s){return i.onPathKeydown(s)})("blur",function(){return i.applyPathInput()}),g()(),_(6,"div",7),y(7,"i",8),_(8,"span",9),h(9),g(),F(10,Wz,6,1,"ng-container",10),St(11,"async"),_(12,"button",11),L("click",function(){return i.showNewFileInput(i.treeRootPath,"file")}),y(13,"i",12),g(),_(14,"button",13),L("click",function(){return i.showNewFileInput(i.treeRootPath,"directory")}),y(15,"i",14),g()(),F(16,jz,12,8,"div",15)(17,Qz,4,0,"div",16)(18,Xz,3,1,"div",17)(19,i3,3,2,"div",18),_(20,"div",19)(21,"span"),y(22,"i",20),h(23,"Set root folder"),g(),_(24,"span"),y(25,"i",21),h(26,"Select file for context"),g()()(),_(27,"div",22),F(28,o3,6,0,"div",23)(29,s3,4,1,"div",23)(30,a3,6,1,"div",24)(31,f3,21,17,"div",25),_(32,"div",26),F(33,g3,5,1,"div",27),_(34,"ngx-monaco-editor",28),L("onInit",function(s){return i.onMonacoInit(s)}),g()(),F(35,S3,42,13,"div",29),g()()),r&2){let o;f(3),C("disabled",i.treeRootPath==="/"||i.treeLoading),f(2),C("value",i.pathInput)("title",i.treeRootPath),f(3),C("title",i.activePath),f(),ie(" Root: ",i.activePath||"\u2014"," "),f(),C("ngIf",(o=sn(11,21,i.workspaceService.contextFiles$))==null?null:o.length),f(6),C("ngIf",i.showNewInput),f(),C("ngIf",i.treeLoading),f(),C("ngIf",!i.treeLoading&&i.treeError),f(),C("ngIf",!i.treeLoading&&!i.treeError),f(8),j("ws-theme-light",i.activeTheme==="vs"),f(),C("ngIf",!i.viewerFile),f(),C("ngIf",i.viewerFile&&i.viewerLoading),f(),C("ngIf",i.viewerFile&&!i.viewerLoading&&i.viewerError),f(),C("ngIf",i.viewerFile&&!i.viewerLoading&&!i.viewerError),f(),Zi("display",i.viewerFile?"flex":"none"),f(),C("ngIf",i.viewerFile&&(i.viewerLoading||!i.monacoReady||!i.contentReady)),f(),C("options",i.editorOptions),f(),C("ngIf",i.viewerFile&&!i.viewerLoading&&!i.viewerError)}},dependencies:[Lt,Un,Ar,ci,bm,Tm,Vc,uA,to],styles:["[_nghost-%COMP%]{display:flex;flex:1;min-height:0;height:100%}.ws-tab-wrapper[_ngcontent-%COMP%]{display:flex;width:100%;height:100%;min-height:0;gap:0;border:1px solid #dee2e6;border-radius:.375rem;overflow:hidden}.ws-tree-panel[_ngcontent-%COMP%]{width:300px;min-width:220px;flex-shrink:0;border-right:1px solid #dee2e6;display:flex;flex-direction:column;background:#fafbfc;overflow:hidden}.ws-path-bar[_ngcontent-%COMP%]{flex-shrink:0;background:#f0f4ff}.ws-path-input[_ngcontent-%COMP%]{font-size:.78rem;min-width:0}.ws-ctx-bar[_ngcontent-%COMP%]{flex-shrink:0;background:#f8f9fa}.ws-ctx-bar[_ngcontent-%COMP%] .btn-xs[_ngcontent-%COMP%]{font-size:.65rem;padding:0 4px}.ws-tree-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;min-height:0}.ws-legend[_ngcontent-%COMP%]{flex-shrink:0;font-size:.68rem}.ws-tree-node[_ngcontent-%COMP%]{display:flex;align-items:center;height:26px;padding-right:6px;gap:3px;cursor:default;border-bottom:1px solid #f0f0f0;transition:background .07s}.ws-tree-node[_ngcontent-%COMP%]:hover{background:#f0f4ff}.ws-tree-node.is-active-root[_ngcontent-%COMP%]{background:#e8f4fd;border-left:3px solid #0d6efd}.ws-tree-node.in-context-file[_ngcontent-%COMP%]{background:#f0fdf4;border-left:3px solid #198754}.ws-tree-node.in-context-file[_ngcontent-%COMP%] .node-label[_ngcontent-%COMP%]{color:#145c32;font-weight:500}.ws-tree-node.in-context-file[_ngcontent-%COMP%] .node-icon[_ngcontent-%COMP%]{color:#198754!important}.ws-tree-node.is-viewing[_ngcontent-%COMP%]{background:#fffbea;border-left:3px solid #ffc107}.ws-tree-node.is-viewing[_ngcontent-%COMP%] .node-label[_ngcontent-%COMP%]{color:#856404;font-weight:600}.ws-node-file[_ngcontent-%COMP%]{cursor:pointer}.btn-expand[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;background:transparent;border-radius:3px;flex-shrink:0;cursor:pointer;color:#6c757d}.btn-expand[_ngcontent-%COMP%]:hover:not(:disabled){background:#dee2e6;color:#0d6efd}.btn-expand[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:default}.expand-icon[_ngcontent-%COMP%]{font-size:.6rem;transition:transform .13s}.expand-icon.expanded[_ngcontent-%COMP%]{transform:rotate(90deg)}.btn-pin[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;background:transparent;border-radius:3px;flex-shrink:0;cursor:pointer;opacity:.3;transition:opacity .1s}.btn-pin[_ngcontent-%COMP%]:hover{opacity:1;background:#e8f0fe}.ws-tree-node.is-active-root[_ngcontent-%COMP%] .btn-pin[_ngcontent-%COMP%]{opacity:1}.node-icon[_ngcontent-%COMP%]{font-size:.82rem;flex-shrink:0}.node-label[_ngcontent-%COMP%]{flex:1;min-width:0;font-size:.8rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dir-label[_ngcontent-%COMP%]{cursor:pointer}.dir-label[_ngcontent-%COMP%]:hover{color:#0d6efd;text-decoration:underline}.active-root-icon[_ngcontent-%COMP%]{font-size:.72rem}.ctx-label[_ngcontent-%COMP%]{display:inline-flex;align-items:center;flex-shrink:0;cursor:pointer;opacity:.35;transition:opacity .1s}.ctx-label[_ngcontent-%COMP%]:hover{opacity:1}.ws-tree-node[_ngcontent-%COMP%]:has(.ctx-check:checked) .ctx-label[_ngcontent-%COMP%]{opacity:1}.ctx-check[_ngcontent-%COMP%]{width:12px;height:12px;cursor:pointer;accent-color:#0d6efd;border:1.5px solid #6c757d!important}.ctx-check[_ngcontent-%COMP%]:not(:checked){background-color:#fff!important}.ws-viewer-panel[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column;background:#1e1e1e;overflow:hidden}.ws-viewer-empty[_ngcontent-%COMP%]{flex:1;background:#f8f9fa;color:#6c757d}.ws-viewer-tabbar[_ngcontent-%COMP%]{flex-shrink:0;min-height:38px;background:#252526;border-bottom:1px solid #3c3c3c;overflow-x:auto}.ws-viewer-tab[_ngcontent-%COMP%]{border-right:1px solid #3c3c3c;white-space:nowrap}.active-viewer-tab[_ngcontent-%COMP%]{background:#1e1e1e}.ws-monaco-wrap[_ngcontent-%COMP%]{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}.ws-monaco-loader[_ngcontent-%COMP%]{position:absolute;inset:0;z-index:10;background:#1e1e1e;display:flex;align-items:center;justify-content:center}.ws-monaco-loader-inner[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:.5rem}.ws-monaco[_ngcontent-%COMP%]{flex:1;min-height:0;width:100%} .ws-monaco>div{width:100%!important;height:100%!important}.btn-new-item[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;background:transparent;border-radius:4px;flex-shrink:0;cursor:pointer;color:#6c757d;font-size:.82rem;transition:background .1s,color .1s}.btn-new-item[_ngcontent-%COMP%]:hover{background:#e2e6ea;color:#0d6efd}.ws-new-input-bar[_ngcontent-%COMP%]{flex-shrink:0;background:#f0f4ff;font-size:.8rem}.ws-tab-path[_ngcontent-%COMP%]{flex:1;min-width:0;font-size:.68rem;padding:0 8px;color:#888;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Consolas,monospace}.ws-tab-controls[_ngcontent-%COMP%]{flex-shrink:0;display:flex;align-items:center;gap:2px;padding:0 6px}.ws-tab-controls[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{font-size:.76rem}.ws-tab-controls[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%]{font-size:.65rem}.ws-tab-icon-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;gap:1px;height:24px;min-width:24px;padding:0 5px;border:none;background:transparent;border-radius:4px;flex-shrink:0;cursor:pointer;color:#ccc;font-size:.8rem;line-height:1;transition:background .1s,color .1s}.ws-tab-icon-btn[_ngcontent-%COMP%]:hover{background:#3e3e42;color:#fff}.ws-tab-icon-btn.active[_ngcontent-%COMP%]{background:#0d6efd26;color:#4da3ff}.ws-tab-icon-btn[_ngcontent-%COMP%]:disabled{opacity:.4;cursor:not-allowed}.ws-tab-sep[_ngcontent-%COMP%]{width:1px;height:16px;background:#444;margin:0 4px;flex-shrink:0}.ws-tab-font-size[_ngcontent-%COMP%]{font-size:.72rem;color:#aaa;min-width:18px;text-align:center;font-family:Consolas,monospace;-webkit-user-select:none;user-select:none}.ws-theme-light[_ngcontent-%COMP%], .ws-theme-light[_ngcontent-%COMP%] .ws-monaco-loader[_ngcontent-%COMP%]{background:#fff}.ws-theme-light[_ngcontent-%COMP%] .ws-viewer-tabbar[_ngcontent-%COMP%]{background:#f3f3f3!important;border-bottom-color:#ddd!important}.ws-theme-light[_ngcontent-%COMP%] .ws-viewer-tab[_ngcontent-%COMP%]{background:#fff!important;color:#333!important}.ws-theme-light[_ngcontent-%COMP%] .ws-statusbar[_ngcontent-%COMP%]{background:#007acc}.ws-theme-light[_ngcontent-%COMP%] .active-viewer-tab[_ngcontent-%COMP%]{background:#fff!important}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-icon-btn[_ngcontent-%COMP%]{color:#555}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-icon-btn[_ngcontent-%COMP%]:hover{background:#e8e8e8;color:#333}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-path[_ngcontent-%COMP%]{color:#999}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-font-size[_ngcontent-%COMP%]{color:#666}.ws-theme-light[_ngcontent-%COMP%] .ws-tab-sep[_ngcontent-%COMP%]{background:#ddd}.dirty-dot[_ngcontent-%COMP%]{color:#e2b04a;font-size:.7rem;line-height:1}.ws-statusbar[_ngcontent-%COMP%]{flex-shrink:0;background:#007acc;color:#fff;display:flex;align-items:center;height:22px;padding:0 12px;font-size:.7rem;font-family:Consolas,monospace;gap:0;-webkit-user-select:none;user-select:none}.ws-statusbar-item[_ngcontent-%COMP%]{padding:0 8px;display:inline-flex;align-items:center;gap:4px;height:100%}.ws-statusbar-item[_ngcontent-%COMP%]:hover{background:#ffffff26;cursor:default}.ws-statusbar-spacer[_ngcontent-%COMP%]{flex:1}.ws-status-editing[_ngcontent-%COMP%]{background:#ffa50033;color:#ffc107;font-weight:600;letter-spacing:.04em}.ws-status-editing[_ngcontent-%COMP%]:hover{background:#ffa5004d}.ws-status-dirty[_ngcontent-%COMP%]{color:#e2b04a}.ws-statusbar-font[_ngcontent-%COMP%]{gap:4px;cursor:default}.ws-statusbar-font[_ngcontent-%COMP%]:hover{background:#ffffff26}.ws-sb-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;padding:0 3px;line-height:1;font-size:.72rem;border-radius:3px}.ws-sb-btn[_ngcontent-%COMP%]:hover{background:#fff3}.ws-sb-dropdown-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;background:transparent;border:none;color:#fff;cursor:pointer;padding:0 8px;height:22px;font-size:.7rem;font-family:Consolas,monospace}.ws-sb-dropdown-btn[_ngcontent-%COMP%]:hover{background:#ffffff26}.ws-statusbar-sep[_ngcontent-%COMP%]{opacity:.4;padding:0 2px}"]})}}return e})();function T3(e,n){e&1&&y(0,"i",22)}var fA=(()=>{class e{constructor(t){this.http=t,this.activeTab="mcp",this.isDarkMode=!1,this.isRestarting=!1,this.apiUrl=`${un.apiUrl}/api/system`,console.log(`[INIT] ${new Date().toISOString()} DashboardComponent initialized`);let r=localStorage.getItem("blueorchstudio-dark-mode");this.isDarkMode=r==="true",this._applyTheme()}setTab(t){this.activeTab=t,t==="chat"&&this.chatComp?.loadSidebar()}toggleDarkMode(){this.isDarkMode=!this.isDarkMode,localStorage.setItem("blueorchstudio-dark-mode",String(this.isDarkMode)),this._applyTheme(),console.log(`[SUCCESS] ${new Date().toISOString()} DashboardComponent: dark mode ${this.isDarkMode?"ON":"OFF"}`)}_applyTheme(){document.documentElement.classList.toggle("dark",this.isDarkMode)}restartServer(){this.isRestarting||(this.isRestarting=!0,this.http.post(`${this.apiUrl}/restart`,{}).subscribe({next:()=>this._pollUntilUp(),error:()=>this._pollUntilUp()}))}_pollUntilUp(){let r=0,i=()=>{r++,this.http.get(`${this.apiUrl}/health`).subscribe({next:()=>{this.isRestarting=!1,window.location.reload()},error:()=>{r<30?setTimeout(i,1e3):this.isRestarting=!1}})};setTimeout(i,1500)}static{this.\u0275fac=function(r){return new(r||e)(M(Rt))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-dashboard"]],viewQuery:function(r,i){if(r&1&&tn(ad,5),r&2){let o;xt(o=Pt())&&(i.chatComp=o.first)}},decls:39,vars:21,consts:[[1,"page-wrapper"],[1,"navbar","navbar-dark","bg-primary","shadow-sm","flex-shrink-0"],[1,"container-fluid","px-4"],[1,"navbar-brand","fw-bold","fs-5"],[1,"bi","bi-terminal","me-2"],[1,"dark-mode-toggle","ms-auto",3,"click","title"],[1,"bi",3,"ngClass"],["href","/logs","target","_blank","rel","noopener","title","Open live logs in new tab",1,"logs-nav-btn","ms-2"],[1,"bi","bi-terminal-fill","me-1"],["tooltipPlacement","bottom",1,"restart-btn","ms-2",3,"click","disabled","bsTooltip"],["class","bi bi-arrow-clockwise",4,"ngIf"],[1,"page-content","container-fluid","d-flex","flex-column","py-3","px-4"],[1,"nav","nav-tabs","flex-shrink-0","mb-3"],[1,"nav-item"],[1,"nav-link","d-flex","align-items-center","gap-2",3,"click"],[1,"bi","bi-diagram-3-fill"],[1,"bi","bi-cpu-fill"],[1,"bi","bi-chat-dots-fill"],[1,"bi","bi-folder2-open"],[1,"tab-fill"],[1,"llm-tab-content"],[3,"navigateToWorkspace"],[1,"bi","bi-arrow-clockwise"]],template:function(r,i){r&1&&(_(0,"div",0)(1,"nav",1)(2,"div",2)(3,"span",3),y(4,"i",4),h(5,"BlueOrch \u2014 Studio "),g(),_(6,"button",5),L("click",function(){return i.toggleDarkMode()}),y(7,"i",6),g(),_(8,"a",7),y(9,"i",8),h(10,"Logs "),g(),_(11,"button",9),L("click",function(){return i.restartServer()}),F(12,T3,1,0,"i",10),g()()(),_(13,"div",11)(14,"ul",12)(15,"li",13)(16,"button",14),L("click",function(){return i.setTab("mcp")}),y(17,"i",15),h(18,"MCP Config "),g()(),_(19,"li",13)(20,"button",14),L("click",function(){return i.setTab("llm")}),y(21,"i",16),h(22,"LLM Config "),g()(),_(23,"li",13)(24,"button",14),L("click",function(){return i.setTab("chat")}),y(25,"i",17),h(26,"Chat "),g()(),_(27,"li",13)(28,"button",14),L("click",function(){return i.setTab("workspace")}),y(29,"i",18),h(30,"Workspace "),g()()(),_(31,"div",19),y(32,"app-mcp-config"),g(),_(33,"div",20),y(34,"app-llm-config"),g(),_(35,"div",19)(36,"app-chat",21),L("navigateToWorkspace",function(){return i.setTab("workspace")}),g()(),_(37,"div",19),y(38,"app-workspace-tab"),g()()()),r&2&&(f(6),C("title",i.isDarkMode?"Switch to Light Mode":"Switch to Dark Mode"),f(),C("ngClass",i.isDarkMode?"bi-sun-fill":"bi-moon-stars-fill"),f(4),C("disabled",i.isRestarting)("bsTooltip","Restart backend server"),f(),C("ngIf",!i.isRestarting),f(4),j("active",i.activeTab==="mcp"),f(4),j("active",i.activeTab==="llm"),f(4),j("active",i.activeTab==="chat"),f(4),j("active",i.activeTab==="workspace"),f(3),j("d-none",i.activeTab!=="mcp"),f(2),j("d-none",i.activeTab!=="llm"),f(2),j("d-none",i.activeTab!=="chat"),f(2),j("d-none",i.activeTab!=="workspace"))},dependencies:[vr,Lt,id,iA,aA,ad,mA],styles:[".page-wrapper[_ngcontent-%COMP%]{height:100vh;display:flex;flex-direction:column;overflow:hidden}.page-content[_ngcontent-%COMP%]{flex:1;overflow:hidden;min-height:0;display:flex;flex-direction:column}.tab-fill[_ngcontent-%COMP%]{flex:1;min-height:0;overflow:hidden}.llm-tab-content[_ngcontent-%COMP%]{padding-bottom:1rem}.navbar-logo[_ngcontent-%COMP%]{width:22px;height:22px;vertical-align:middle}.dark-mode-toggle[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;border:1px solid rgba(255,255,255,.3);background:#ffffff1a;color:#fff;cursor:pointer;font-size:.95rem;transition:background .15s,border-color .15s,transform .2s}.dark-mode-toggle[_ngcontent-%COMP%]:hover{background:#fff3;border-color:#fff9;transform:scale(1.08)}.restart-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;border:1px solid rgba(255,255,255,.3);background:#ffffff1a;color:#fff;cursor:pointer;font-size:.95rem;transition:background .15s,border-color .15s,transform .2s}.restart-btn[_ngcontent-%COMP%]:hover:not(:disabled){background:#fff3;border-color:#fff9;transform:rotate(30deg) scale(1.08)}.restart-btn[_ngcontent-%COMP%]:disabled{opacity:.65;cursor:not-allowed}.logs-nav-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:.25rem .75rem;border-radius:6px;border:1px solid rgba(255,255,255,.3);background:#ffffff1a;color:#fff;font-size:.85rem;font-weight:500;text-decoration:none;transition:background .15s,border-color .15s}.logs-nav-btn[_ngcontent-%COMP%]:hover{background:#fff3;border-color:#fff9;color:#fff;text-decoration:none}"]})}}return e})();var gA=(()=>{class e{constructor(t){this.http=t,this.baseUrl=`${un.apiUrl}/api/logs`}getRecentLogs(t=300,r="all"){return this.http.get(`${this.baseUrl}?limit=${t}&level=${r}`)}streamLogs(){return new de(t=>{let r=new EventSource(`${this.baseUrl}/stream`);return r.onmessage=i=>{try{let o=JSON.parse(i.data);t.next(o)}catch{}},r.onerror=()=>{},()=>{r.close()}})}static{this.\u0275fac=function(r){return new(r||e)(k(Rt))}}static{this.\u0275prov=B({token:e,factory:e.\u0275fac,providedIn:"root"})}}return e})();var v3=["logContainer"];function y3(e,n){if(e&1){let t=be();_(0,"button",20),L("click",function(){let i=q(t).$implicit,o=R();return z(o.setLevel(i))}),h(1),St(2,"titlecase"),g()}if(e&2){let t=n.$implicit,r=R();j("active",r.activeLevel===t),f(),ie(" ",sn(2,3,t)," ")}}function I3(e,n){e&1&&(_(0,"div",21),y(1,"i",22),_(2,"span"),h(3,"Waiting for log entries\u2026"),g()())}function O3(e,n){if(e&1&&(_(0,"div",23)(1,"span",24),h(2),g(),_(3,"span",25),h(4),g(),_(5,"span",26),h(6),g()()),e&2){let t=n.$implicit,r=R();C("ngClass",r.tagClass(t)),f(2),J(r.formatTs(t.timestamp)),f(2),J(r.extractTag(t.message)),f(2),J(r.stripTag(t.message))}}function R3(e,n){if(e&1&&(_(0,"span",27),h(1),g()),e&2){let t=R();f(),ie("(filtered: ",t.activeLevel,")")}}var hA=(()=>{class e{constructor(t,r){this.logsService=t,this.cdr=r,this.logs=[],this.activeLevel="all",this.autoScroll=!0,this.isConnected=!1,this._allLogs=[],this._sseSub=null,this.levels=["all","info","warn","error"]}ngOnInit(){this._loadHistory(),this._connectSSE()}ngOnDestroy(){this._sseSub?.unsubscribe()}_loadHistory(){this.logsService.getRecentLogs(300).subscribe({next:t=>{this._allLogs=t.logs,this._applyFilter()},error:()=>{}})}_connectSSE(){this._sseSub=this.logsService.streamLogs().subscribe({next:t=>{this._allLogs.push(t),this._allLogs.length>2e3&&this._allLogs.shift(),this._applyFilter(),this.autoScroll&&setTimeout(()=>this._scrollToBottom(),0),this.isConnected=!0,this.cdr.detectChanges()},error:()=>{this.isConnected=!1,this.cdr.detectChanges()}}),this.isConnected=!0}setLevel(t){this.activeLevel=t,this._applyFilter()}_applyFilter(){this.activeLevel==="all"?this.logs=[...this._allLogs]:this.logs=this._allLogs.filter(t=>t.level===this.activeLevel)}clearLogs(){this._allLogs=[],this.logs=[]}toggleAutoScroll(){this.autoScroll=!this.autoScroll,this.autoScroll&&this._scrollToBottom()}_scrollToBottom(){try{let t=this.logContainer?.nativeElement;t&&(t.scrollTop=t.scrollHeight)}catch{}}tagClass(t){let r=t.message??"";return r.includes("[ERROR]")?"tag-error":r.includes("[SUCCESS]")?"tag-success":r.includes("[INIT]")?"tag-init":t.level==="error"?"tag-error":t.level==="warn"?"tag-warn":"tag-info"}extractTag(t){let r=t.match(/^\[(INIT|SUCCESS|ERROR|WARN)\]/);return r?`[${r[1]}]`:`[${this.activeLevel.toUpperCase()||"INFO"}]`}stripTag(t){return t.replace(/^\[(INIT|SUCCESS|ERROR|WARN)\]\s*/,"")}formatTs(t){try{return new Date(t).toLocaleTimeString("en-US",{hour12:!1})+"."+String(new Date(t).getMilliseconds()).padStart(3,"0")}catch{return t}}trackByIdx(t,r){return t}static{this.\u0275fac=function(r){return new(r||e)(M(gA),M(an))}}static{this.\u0275cmp=Ge({type:e,selectors:[["app-logs"]],viewQuery:function(r,i){if(r&1&&tn(v3,5),r&2){let o;xt(o=Pt())&&(i.logContainer=o.first)}},decls:26,vars:16,consts:[["logContainer",""],[1,"logs-page"],[1,"logs-toolbar"],[1,"d-flex","align-items-center","gap-3"],[1,"logs-title"],[1,"bi","bi-terminal-fill","me-2"],[1,"conn-badge"],[1,"conn-dot"],[1,"d-flex","align-items-center","gap-2"],["role","group",1,"btn-group","btn-group-sm"],["type","button","class","btn level-btn",3,"active","click",4,"ngFor","ngForOf"],[1,"btn","btn-sm","toolbar-btn",3,"click","title"],[1,"bi",3,"ngClass"],["title","Clear displayed logs",1,"btn","btn-sm","toolbar-btn","toolbar-btn--danger",3,"click"],[1,"bi","bi-trash3","me-1"],[1,"logs-body"],["class","logs-empty",4,"ngIf"],["class","log-entry",3,"ngClass",4,"ngFor","ngForOf","ngForTrackBy"],[1,"logs-footer"],["class","ms-2 fst-italic",4,"ngIf"],["type","button",1,"btn","level-btn",3,"click"],[1,"logs-empty"],[1,"bi","bi-hourglass-split","d-block","fs-2","mb-2","opacity-50"],[1,"log-entry",3,"ngClass"],[1,"log-ts"],[1,"log-tag"],[1,"log-msg"],[1,"ms-2","fst-italic"]],template:function(r,i){if(r&1){let o=be();_(0,"div",1)(1,"div",2)(2,"div",3)(3,"span",4),y(4,"i",5),h(5,"BlueOrch Studio \u2014 Live Logs "),g(),_(6,"span",6),y(7,"span",7),h(8),g()(),_(9,"div",8)(10,"div",9),F(11,y3,3,5,"button",10),g(),_(12,"button",11),L("click",function(){return q(o),z(i.toggleAutoScroll())}),y(13,"i",12),h(14," Auto-scroll "),g(),_(15,"button",13),L("click",function(){return q(o),z(i.clearLogs())}),y(16,"i",14),h(17,"Clear "),g()()(),_(18,"div",15,0),F(20,I3,4,0,"div",16)(21,O3,7,4,"div",17),g(),_(22,"div",18)(23,"span"),h(24),g(),F(25,R3,2,1,"span",19),g()()}r&2&&(f(6),j("conn-badge--live",i.isConnected)("conn-badge--off",!i.isConnected),f(2),ie(" ",i.isConnected?"Live":"Disconnected"," "),f(3),C("ngForOf",i.levels),f(),j("toolbar-btn--active",i.autoScroll),C("title",i.autoScroll?"Auto-scroll ON (click to pause)":"Auto-scroll OFF (click to resume)"),f(),C("ngClass",i.autoScroll?"bi-arrow-down-circle-fill":"bi-arrow-down-circle"),f(7),C("ngIf",i.logs.length===0),f(),C("ngForOf",i.logs)("ngForTrackBy",i.trackByIdx),f(3),nn("",i.logs.length," entr",i.logs.length===1?"y":"ies"," displayed"),f(),C("ngIf",i.activeLevel!=="all"))},dependencies:[vr,yr,Lt,Jl],styles:["[_nghost-%COMP%]{display:block;height:100vh;overflow:hidden}.logs-page[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100vh;background:#0d1117;color:#c9d1d9;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:13px}.logs-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.75rem;padding:.6rem 1.25rem;background:#161b22;border-bottom:1px solid #30363d;flex-shrink:0}.logs-title[_ngcontent-%COMP%]{font-size:1rem;font-weight:700;color:#58a6ff;font-family:inherit}.conn-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.35rem;padding:.15rem .6rem;border-radius:999px;font-size:.75rem;font-weight:600;border:1px solid transparent}.conn-badge--live[_ngcontent-%COMP%]{background:#3fb95026;border-color:#3fb950;color:#3fb950}.conn-badge--live[_ngcontent-%COMP%] .conn-dot[_ngcontent-%COMP%]{background:#3fb950;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite}.conn-badge--off[_ngcontent-%COMP%]{background:#f8514926;border-color:#f85149;color:#f85149}.conn-badge--off[_ngcontent-%COMP%] .conn-dot[_ngcontent-%COMP%]{background:#f85149}.conn-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex-shrink:0}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.35}}.level-btn[_ngcontent-%COMP%]{background:#21262d;border-color:#30363d;color:#8b949e;font-size:.72rem;font-family:inherit}.level-btn[_ngcontent-%COMP%]:hover{background:#30363d;color:#c9d1d9}.level-btn.active[_ngcontent-%COMP%]{background:#1f6feb;border-color:#1f6feb;color:#fff}.toolbar-btn[_ngcontent-%COMP%]{background:#21262d;border:1px solid #30363d;color:#8b949e;font-family:inherit;font-size:.72rem}.toolbar-btn[_ngcontent-%COMP%]:hover{background:#30363d;color:#c9d1d9}.toolbar-btn--active[_ngcontent-%COMP%]{background:#1f6feb26;border-color:#1f6feb;color:#58a6ff}.toolbar-btn--danger[_ngcontent-%COMP%]:hover{background:#f8514926;border-color:#f85149;color:#f85149}.logs-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;padding:.5rem 0}.logs-body[_ngcontent-%COMP%]::-webkit-scrollbar{width:6px}.logs-body[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:#0d1117}.logs-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#30363d;border-radius:3px}.logs-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover{background:#484f58}.logs-empty[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#484f58;font-size:.9rem;text-align:center}.log-entry[_ngcontent-%COMP%]{display:flex;align-items:baseline;gap:.75rem;padding:.15rem 1.25rem;line-height:1.55;white-space:pre-wrap;word-break:break-all;border-left:3px solid transparent}.log-entry[_ngcontent-%COMP%]:hover{background:#ffffff08}.log-entry.tag-error[_ngcontent-%COMP%]{border-left-color:#f85149}.log-entry.tag-error[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#f85149}.log-entry.tag-error[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-error[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#ffa198}.log-entry.tag-success[_ngcontent-%COMP%]{border-left-color:#3fb950}.log-entry.tag-success[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#3fb950}.log-entry.tag-success[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-success[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#c9d1d9}.log-entry.tag-init[_ngcontent-%COMP%]{border-left-color:#58a6ff}.log-entry.tag-init[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#58a6ff}.log-entry.tag-init[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-init[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#c9d1d9}.log-entry.tag-warn[_ngcontent-%COMP%]{border-left-color:#d29922}.log-entry.tag-warn[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#d29922}.log-entry.tag-warn[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-warn[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#e3b341}.log-entry.tag-info[_ngcontent-%COMP%]{border-left-color:#484f58}.log-entry.tag-info[_ngcontent-%COMP%] .log-tag[_ngcontent-%COMP%]{color:#8b949e}.log-entry.tag-info[_ngcontent-%COMP%] .log-ts[_ngcontent-%COMP%]{color:#6e7681}.log-entry.tag-info[_ngcontent-%COMP%] .log-msg[_ngcontent-%COMP%]{color:#c9d1d9}.log-ts[_ngcontent-%COMP%]{flex-shrink:0;font-size:.7rem;min-width:82px;color:#6e7681}.log-tag[_ngcontent-%COMP%]{flex-shrink:0;font-weight:700;font-size:.72rem;min-width:72px;letter-spacing:.03em}.log-msg[_ngcontent-%COMP%]{flex:1;color:#c9d1d9}.logs-footer[_ngcontent-%COMP%]{flex-shrink:0;padding:.3rem 1.25rem;background:#161b22;border-top:1px solid #30363d;font-size:.7rem;color:#6e7681}"]})}}return e})();var N3=[{path:"",component:fA},{path:"logs",component:hA}];function D3(){let e=new dn;return e.code=(n,t)=>{console.log(`[INIT] ${new Date().toISOString()} markedRenderer.code | lang: ${t??"auto"}`);let r=t&&rd.getLanguage(t)?t:"",i;try{i=r?rd.highlight(n,{language:r,ignoreIllegals:!0}).value:rd.highlightAuto(n).value}catch{i=n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}let o=(t||"code").toUpperCase(),s=i.split(`
79
79
  `);s[s.length-1]===""&&s.pop();let a=s.map(c=>`<span class="code-line">${c||" "}</span>`).join(`
80
80
  `),l="";return console.log(`[SUCCESS] ${new Date().toISOString()} markedRenderer.code | ${s.length} lines`),['<div class="code-block">','<div class="code-header">',`<span class="code-lang-label">${o}</span>`,'<button class="code-copy-btn" data-copy-btn="true">Copy</button>',"</div>",`<pre class="code-pre"><code class="hljs language-${r||"plaintext"}">${a}</code></pre>`,"</div>"].join("")},{renderer:e}}var EA=(()=>{class e{static{this.\u0275fac=function(r){return new(r||e)}}static{this.\u0275mod=rt({type:e,bootstrap:[KD]})}static{this.\u0275inj=nt({imports:[QS,VS,xb,Pb,OT,vT.forRoot(N3,{useHash:!1}),pA.forRoot({baseUrl:"assets/monaco"}),WT.forRoot({sanitize:Jt.NONE,markedOptions:{provide:wm,useFactory:D3}})]})}}return e})();jS().bootstrapModule(EA).catch(e=>console.error(e));