{"version":3,"file":"qodalis-angular-cli.mjs","sources":["../../../packages/angular-cli/src/lib/cli/tokens/index.ts","../../../packages/angular-cli/src/lib/cli/cli.component.ts","../../../packages/angular-cli/src/lib/collapsable-content/collapsable-content.component.ts","../../../packages/angular-cli/src/lib/collapsable-content/collapsable-content.component.html","../../../packages/angular-cli/src/lib/cli-panel/cli-panel-status.service.ts","../../../packages/angular-cli/src/lib/cli-panel/cli-panel.component.ts","../../../packages/angular-cli/src/lib/cli-panel/cli-panel.component.html","../../../packages/angular-cli/src/lib/cli/services/cli-default-ping-server.service.ts","../../../packages/angular-cli/src/lib/index.ts","../../../packages/angular-cli/src/lib/cli.module.ts","../../../packages/angular-cli/src/lib/utils/dependency-injection.ts","../../../packages/angular-cli/src/lib/utils/index.ts","../../../packages/angular-cli/src/public-api.ts","../../../packages/angular-cli/src/qodalis-angular-cli.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport {\n    ICliCommandProcessor,\n    ICliModule,\n    ICliPingServerService,\n    ICliUserSessionService,\n    ICliUsersStoreService,\n} from '@qodalis/cli-core';\n\nexport const CliCommandProcessor_TOKEN = new InjectionToken<\n    ICliCommandProcessor[]\n>('cli-processors');\n\nexport const ICliUserSessionService_TOKEN =\n    new InjectionToken<ICliUserSessionService>('cli-user-session-service');\n\nexport const ICliUsersStoreService_TOKEN = new InjectionToken<\n    ICliUsersStoreService[]\n>('cli-users-store-service');\n\nexport const ICliPingServerService_TOKEN = new InjectionToken<\n    ICliPingServerService[]\n>('cli-ping-server-service');\n\nexport const CliModule_TOKEN = new InjectionToken<ICliModule[]>('cli-modules');\n","import {\n    AfterViewInit,\n    Component,\n    ElementRef,\n    EventEmitter,\n    Inject,\n    Input,\n    OnDestroy,\n    Optional,\n    Output,\n    ViewChild,\n    ViewEncapsulation,\n} from '@angular/core';\nimport {\n    CliEngineSnapshot,\n    ICliCommandProcessor,\n    ICliModule,\n    ICliPingServerService,\n} from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions } from '@qodalis/cli';\nimport {\n    CliCommandProcessor_TOKEN,\n    CliModule_TOKEN,\n    ICliPingServerService_TOKEN,\n} from './tokens';\n\n@Component({\n    standalone: false,\n    selector: 'cli',\n    template: `<div\n        #terminal\n        [style.height]=\"height || '100%'\"\n        style=\"width: 100%;\"\n    ></div>`,\n    styles: [],\n    encapsulation: ViewEncapsulation.None,\n})\nexport class CliComponent implements AfterViewInit, OnDestroy {\n    @Input() options?: CliEngineOptions;\n    @Input() processors?: ICliCommandProcessor[];\n    @Input() modules?: ICliModule[];\n    @Input() height?: string;\n    @Input() snapshot?: CliEngineSnapshot;\n\n    @Output() engineReady = new EventEmitter<CliEngine>();\n\n    @ViewChild('terminal', { static: true }) terminalDiv!: ElementRef;\n\n    private engine?: CliEngine;\n\n    constructor(\n        @Optional()\n        @Inject(CliCommandProcessor_TOKEN)\n        private readonly diProcessors: ICliCommandProcessor[],\n        @Optional()\n        @Inject(CliModule_TOKEN)\n        private readonly diModules: ICliModule[],\n        @Optional()\n        @Inject(ICliPingServerService_TOKEN)\n        private readonly pingServerService: ICliPingServerService,\n    ) {}\n\n    ngAfterViewInit(): void {\n        const engineOptions: CliEngineOptions = {\n            ...(this.options ?? {}),\n            ...(this.snapshot ? { snapshot: this.snapshot } : {}),\n        };\n\n        this.engine = new CliEngine(\n            this.terminalDiv.nativeElement,\n            engineOptions,\n        );\n\n        // Identify the serving framework\n        this.engine.registerService('cli-framework', 'Angular');\n\n        // Bridge Angular DI services into the engine's service container\n        if (this.pingServerService) {\n            this.engine.registerService(\n                'cli-ping-server-service',\n                this.pingServerService,\n            );\n        }\n\n        // Register processors provided via Angular DI (from resolveCommandProcessorProvider).\n        // Exclude processors that already belong to a module — those will be\n        // initialized as part of the module boot (which registers services first).\n        if (this.diProcessors && this.diProcessors.length > 0) {\n            const moduleProcessors = new Set(\n                (this.diModules ?? []).flatMap(m => m.processors ?? []),\n            );\n            const standalone = this.diProcessors.filter(p => !moduleProcessors.has(p));\n            if (standalone.length > 0) {\n                this.engine.registerProcessors(standalone);\n            }\n        }\n\n        // Register processors provided via @Input\n        if (this.processors && this.processors.length > 0) {\n            this.engine.registerProcessors(this.processors);\n        }\n\n        // Register modules provided via Angular DI\n        if (this.diModules && this.diModules.length > 0) {\n            this.engine.registerModules(this.diModules);\n        }\n\n        // Register modules provided via @Input\n        if (this.modules && this.modules.length > 0) {\n            this.engine.registerModules(this.modules);\n        }\n\n        this.engine.start().then(() => {\n            this.engineReady.emit(this.engine!);\n        });\n    }\n\n    ngOnDestroy(): void {\n        this.engine?.destroy();\n    }\n\n    public focus(): void {\n        this.engine?.focus();\n    }\n\n    public getEngine(): CliEngine | undefined {\n        return this.engine;\n    }\n}\n","import {\n    Component,\n    EventEmitter,\n    Input,\n    Output,\n    HostListener,\n} from '@angular/core';\nimport { CliPanelPosition, CliPanelHideAlignment, CliNotification } from '@qodalis/cli-core';\nimport { ServiceDetail, ServerDetail } from '../cli-panel/cli-panel-status.service';\n\nconst HEADER_HEIGHT = 60;\n\n@Component({\n    standalone: false,\n    selector: 'collapsable-content',\n    templateUrl: './collapsable-content.component.html',\n    styleUrls: ['./collapsable-content.component.sass'],\n})\nexport class CollapsableContentComponent {\n    previousPanelHeight = 600;\n    panelHeight = 600;\n    panelWidth = 400;\n    previousPanelWidth = 400;\n\n    isResizing = false;\n    startY = 0;\n    startX = 0;\n    startHeight = 0;\n    startWidth = 0;\n\n    @Input() visible: boolean = true;\n    @Input() isCollapsed: boolean = true;\n    @Input() isMaximized: boolean = false;\n    @Input() position: CliPanelPosition = 'bottom';\n    @Input() closable: boolean = true;\n    @Input() resizable: boolean = true;\n    @Input() hideable: boolean = true;\n    @Input() hideAlignment: CliPanelHideAlignment = 'center';\n    @Input() themeStyles: Record<string, string> = {};\n\n    @Output()\n    public onToggle = new EventEmitter<boolean>();\n\n    @Output()\n    public onContentSizeChange = new EventEmitter<number>();\n\n    @Output()\n    public onClose = new EventEmitter<void>();\n\n    @Output()\n    public onHide = new EventEmitter<void>();\n\n    @Output()\n    public onPositionChange = new EventEmitter<CliPanelPosition>();\n\n    @Input() isHidden = false;\n\n    // Status bar inputs\n    @Input() statusExecutionState: 'idle' | 'running' = 'idle';\n    @Input() statusLastCommand: { name: string; success: boolean } | null = null;\n    @Input() statusServiceCount: { running: number; total: number } = { running: 0, total: 0 };\n    @Input() statusServiceDetails: ServiceDetail[] = [];\n    @Input() statusServerState: 'connected' | 'disconnected' | 'none' = 'none';\n    @Input() statusServerDetails: ServerDetail[] = [];\n    @Input() statusUptime = 0;\n    @Input() notification: CliNotification | null = null;\n\n    positionDropdownOpen = false;\n    dropdownStyle: Record<string, string> = {};\n    private preHideCollapsed = true;\n\n    get isHorizontal(): boolean {\n        return this.position === 'left' || this.position === 'right';\n    }\n\n    get showStatusIndicators(): boolean {\n        return this.position === 'bottom' || this.position === 'top';\n    }\n\n    get connectedServerCount(): number {\n        return this.statusServerDetails.filter(s => s.connected).length;\n    }\n\n    get totalServerCount(): number {\n        return this.statusServerDetails.length;\n    }\n\n    servicesDropdownOpen = false;\n    servicesDropdownStyle: Record<string, string> = {};\n    serversDropdownOpen = false;\n    serversDropdownStyle: Record<string, string> = {};\n\n    toggleServicesDropdown(event: MouseEvent): void {\n        event.stopPropagation();\n        this.servicesDropdownOpen = !this.servicesDropdownOpen;\n        if (this.servicesDropdownOpen) {\n            const el = event.currentTarget as HTMLElement;\n            const rect = el.getBoundingClientRect();\n            switch (this.position) {\n                case 'bottom':\n                    this.servicesDropdownStyle = {\n                        bottom: (window.innerHeight - rect.top + 4) + 'px',\n                        left: rect.left + 'px',\n                    };\n                    break;\n                case 'top':\n                    this.servicesDropdownStyle = {\n                        top: (rect.bottom + 4) + 'px',\n                        left: rect.left + 'px',\n                    };\n                    break;\n                case 'left':\n                    this.servicesDropdownStyle = {\n                        top: rect.top + 'px',\n                        left: (rect.right + 4) + 'px',\n                    };\n                    break;\n                case 'right':\n                    this.servicesDropdownStyle = {\n                        top: rect.top + 'px',\n                        right: (window.innerWidth - rect.left + 4) + 'px',\n                    };\n                    break;\n                default:\n                    this.servicesDropdownStyle = {\n                        bottom: (window.innerHeight - rect.top + 4) + 'px',\n                        left: rect.left + 'px',\n                    };\n            }\n        }\n    }\n\n    toggleServersDropdown(event: MouseEvent): void {\n        event.stopPropagation();\n        this.serversDropdownOpen = !this.serversDropdownOpen;\n        if (this.serversDropdownOpen) {\n            const el = event.currentTarget as HTMLElement;\n            const rect = el.getBoundingClientRect();\n            switch (this.position) {\n                case 'bottom':\n                    this.serversDropdownStyle = {\n                        bottom: (window.innerHeight - rect.top + 4) + 'px',\n                        left: rect.left + 'px',\n                    };\n                    break;\n                case 'top':\n                    this.serversDropdownStyle = {\n                        top: (rect.bottom + 4) + 'px',\n                        left: rect.left + 'px',\n                    };\n                    break;\n                case 'left':\n                    this.serversDropdownStyle = {\n                        top: rect.top + 'px',\n                        left: (rect.right + 4) + 'px',\n                    };\n                    break;\n                case 'right':\n                    this.serversDropdownStyle = {\n                        top: rect.top + 'px',\n                        right: (window.innerWidth - rect.left + 4) + 'px',\n                    };\n                    break;\n                default:\n                    this.serversDropdownStyle = {\n                        bottom: (window.innerHeight - rect.top + 4) + 'px',\n                        left: rect.left + 'px',\n                    };\n            }\n        }\n    }\n\n    get formattedUptime(): string {\n        const mins = Math.floor(this.statusUptime / 60000);\n        if (mins < 60) return `${mins}m`;\n        const hrs = Math.floor(mins / 60);\n        return `${hrs}h${mins % 60}m`;\n    }\n\n    get wrapperStyle(): Record<string, string> {\n        const size: Record<string, string> = this.isHorizontal\n            ? { width: this.panelWidth + 'px' }\n            : { height: this.panelHeight + 'px' };\n        return { ...size, ...this.themeStyles };\n    }\n\n    toggleTerminal(): void {\n        this.isCollapsed = !this.isCollapsed;\n\n        this.onToggle.emit(this.isCollapsed);\n    }\n\n    closeTerminal(): void {\n        this.visible = false;\n        this.onClose.emit();\n    }\n\n    hideTerminal(): void {\n        this.preHideCollapsed = this.isCollapsed;\n        this.isHidden = true;\n        this.onHide.emit();\n    }\n\n    unhideTerminal(): void {\n        this.isHidden = false;\n        this.isCollapsed = this.preHideCollapsed;\n        this.onToggle.emit(this.isCollapsed);\n    }\n\n    togglePositionDropdown(event: MouseEvent): void {\n        event.stopPropagation();\n        this.positionDropdownOpen = !this.positionDropdownOpen;\n        if (this.positionDropdownOpen) {\n            const btn = event.currentTarget as HTMLElement;\n            const rect = btn.getBoundingClientRect();\n            switch (this.position) {\n                case 'bottom':\n                    this.dropdownStyle = {\n                        bottom: (window.innerHeight - rect.top + 4) + 'px',\n                        right: (window.innerWidth - rect.right) + 'px',\n                    };\n                    break;\n                case 'top':\n                    this.dropdownStyle = {\n                        top: (rect.bottom + 4) + 'px',\n                        right: (window.innerWidth - rect.right) + 'px',\n                    };\n                    break;\n                case 'left':\n                    this.dropdownStyle = {\n                        top: rect.top + 'px',\n                        left: (rect.right + 4) + 'px',\n                    };\n                    break;\n                case 'right':\n                    this.dropdownStyle = {\n                        top: rect.top + 'px',\n                        right: (window.innerWidth - rect.left + 4) + 'px',\n                    };\n                    break;\n            }\n        }\n    }\n\n    selectPosition(pos: CliPanelPosition): void {\n        this.positionDropdownOpen = false;\n        this.onPositionChange.emit(pos);\n    }\n\n    @HostListener('document:click')\n    closeDropdowns(): void {\n        this.positionDropdownOpen = false;\n        this.servicesDropdownOpen = false;\n        this.serversDropdownOpen = false;\n    }\n\n    toggleMaximizationTerminal(): void {\n        if (this.isHorizontal) {\n            if (!this.isMaximized) {\n                this.previousPanelWidth = this.panelWidth;\n                this.panelWidth = window.innerWidth;\n            } else {\n                this.panelWidth = this.previousPanelWidth;\n            }\n        } else {\n            if (!this.isMaximized) {\n                this.previousPanelHeight = this.panelHeight;\n                this.panelHeight = window.innerHeight;\n            } else {\n                this.panelHeight = this.previousPanelHeight;\n            }\n        }\n\n        this.isMaximized = !this.isMaximized;\n        this.updateTerminalSize();\n    }\n\n    onResizeStart(event: MouseEvent) {\n        if (!this.resizable) return;\n\n        this.isResizing = true;\n        if (this.isCollapsed) {\n            this.toggleTerminal();\n        }\n\n        if (this.isHorizontal) {\n            this.startX = event.clientX;\n            this.startWidth = this.panelWidth;\n        } else {\n            this.startY = event.clientY;\n            this.startHeight = this.panelHeight;\n        }\n        event.preventDefault();\n    }\n\n    @HostListener('document:mousemove', ['$event'])\n    onMouseMove(event: MouseEvent) {\n        if (!this.isResizing) return;\n\n        if (this.isHorizontal) {\n            const deltaX = this.position === 'left'\n                ? event.clientX - this.startX\n                : this.startX - event.clientX;\n            let nextWidth = Math.max(100, this.startWidth + deltaX);\n\n            if (nextWidth > window.innerWidth) {\n                nextWidth = window.innerWidth;\n            }\n\n            this.panelWidth = nextWidth;\n        } else {\n            const deltaY = this.position === 'top'\n                ? event.clientY - this.startY\n                : this.startY - event.clientY;\n            let nextHeight = Math.max(100, this.startHeight + deltaY);\n\n            if (nextHeight > window.innerHeight) {\n                nextHeight = window.innerHeight;\n            }\n\n            this.panelHeight = nextHeight;\n        }\n        this.updateTerminalSize();\n    }\n\n    @HostListener('document:mouseup')\n    onMouseUp() {\n        this.isResizing = false;\n    }\n\n    /** Set collapsed state directly (called by parent CliPanelComponent). */\n    setCollapsed(value: boolean): void {\n        this.isCollapsed = value;\n        this.onToggle.emit(value);\n    }\n\n    /** Set maximized state directly (called by parent CliPanelComponent). */\n    setMaximized(value: boolean): void {\n        if (value && !this.isMaximized) {\n            if (this.isHorizontal) {\n                this.previousPanelWidth = this.panelWidth;\n                this.panelWidth = window.innerWidth;\n            } else {\n                this.previousPanelHeight = this.panelHeight;\n                this.panelHeight = window.innerHeight;\n            }\n        } else if (!value && this.isMaximized) {\n            if (this.isHorizontal) {\n                this.panelWidth = this.previousPanelWidth;\n            } else {\n                this.panelHeight = this.previousPanelHeight;\n            }\n        }\n        this.isMaximized = value;\n        this.updateTerminalSize();\n    }\n\n    /** Programmatically set panel dimensions. */\n    setDimensions(dims: { height?: number; width?: number }): void {\n        if (dims.height !== undefined) {\n            this.panelHeight = dims.height;\n            this.previousPanelHeight = dims.height;\n        }\n        if (dims.width !== undefined) {\n            this.panelWidth = dims.width;\n            this.previousPanelWidth = dims.width;\n        }\n        this.updateTerminalSize();\n    }\n\n    private updateTerminalSize() {\n        if (this.isHorizontal) {\n            this.onContentSizeChange.emit(this.panelWidth - HEADER_HEIGHT);\n        } else {\n            this.onContentSizeChange.emit(this.panelHeight - HEADER_HEIGHT);\n        }\n    }\n}\n","<!-- Hide tab (shown when panel is hidden) -->\n<button\n  *ngIf=\"visible && isHidden\"\n  class=\"cli-panel-hide-tab\"\n  [attr.data-position]=\"position\"\n  [attr.data-hide-align]=\"hideAlignment\"\n  [ngStyle]=\"themeStyles\"\n  title=\"Show CLI\"\n  (click)=\"unhideTerminal()\"\n>\n  <svg\n    class=\"cli-panel-hide-tab-icon\"\n    width=\"16\"\n    height=\"16\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n  >\n    <polyline points=\"4 17 10 11 4 5\" />\n    <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n  </svg>\n  <span class=\"cli-panel-hide-tab-label\">CLI</span>\n  <svg\n    class=\"cli-panel-hide-tab-arrow\"\n    width=\"14\"\n    height=\"14\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2.5\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n  >\n    <!-- bottom: chevron up -->\n    <polyline *ngIf=\"position === 'bottom'\" points=\"18 15 12 9 6 15\" />\n    <!-- top: chevron down -->\n    <polyline *ngIf=\"position === 'top'\" points=\"6 9 12 15 18 9\" />\n    <!-- left: chevron right -->\n    <polyline *ngIf=\"position === 'left'\" points=\"9 18 15 12 9 6\" />\n    <!-- right: chevron left -->\n    <polyline *ngIf=\"position === 'right'\" points=\"15 6 9 12 15 18\" />\n  </svg>\n</button>\n\n<!-- Main panel (kept in DOM when hidden to preserve terminal state) -->\n<div\n  *ngIf=\"visible\"\n  class=\"terminal-wrapper\"\n  [style.display]=\"isHidden ? 'none' : ''\"\n  [class.collapsed]=\"isCollapsed\"\n  [class.maximized]=\"isMaximized\"\n  [class.resizing]=\"isResizing\"\n  [attr.data-position]=\"position\"\n  [attr.data-resizable]=\"resizable\"\n  [attr.data-closable]=\"closable\"\n  [attr.data-hideable]=\"hideable\"\n  [ngStyle]=\"wrapperStyle\"\n>\n  <div class=\"terminal-header\">\n    <div class=\"resize-bar\" (mousedown)=\"onResizeStart($event)\">\n      <div class=\"resize-grip\"></div>\n    </div>\n    <div class=\"header-content\">\n      <p class=\"terminal-title\">\n        <svg\n          class=\"title-icon\"\n          width=\"22\"\n          height=\"22\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          stroke-width=\"2\"\n          stroke-linecap=\"round\"\n          stroke-linejoin=\"round\"\n        >\n          <polyline points=\"4 17 10 11 4 5\" />\n          <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n        </svg>\n        CLI\n      </p>\n      <!-- Status indicators (bottom/top positions only) -->\n      <div class=\"status-indicators\" *ngIf=\"showStatusIndicators\">\n          <!-- Execution state -->\n          <span class=\"status-item\" [class.status-running]=\"statusExecutionState === 'running'\">\n              <span class=\"status-dot\" [class.dot-idle]=\"statusExecutionState === 'idle'\" [class.dot-running]=\"statusExecutionState === 'running'\"></span>\n              <span class=\"status-label\">{{ statusExecutionState }}</span>\n          </span>\n\n          <!-- Background services (only if any exist) -->\n          <span class=\"status-item status-clickable\" *ngIf=\"statusServiceCount.total > 0\" (click)=\"toggleServicesDropdown($event)\">\n              <span class=\"status-icon\">&#9881;</span>\n              <span class=\"status-label\">{{ statusServiceCount.running }}/{{ statusServiceCount.total }} services</span>\n          </span>\n\n          <!-- Last command -->\n          <span class=\"status-item\" *ngIf=\"statusLastCommand\">\n              <span class=\"status-icon\" [class.status-success]=\"statusLastCommand.success\" [class.status-error]=\"!statusLastCommand.success\">\n                  {{ statusLastCommand.success ? '&#10003;' : '&#10005;' }}\n              </span>\n              <span class=\"status-label\">{{ statusLastCommand.name }}</span>\n          </span>\n\n          <!-- Server connection -->\n          <span class=\"status-item status-clickable\" *ngIf=\"statusServerState !== 'none'\" (click)=\"toggleServersDropdown($event)\">\n              <span class=\"status-dot\" [class.dot-idle]=\"statusServerState === 'connected'\" [class.dot-error]=\"statusServerState === 'disconnected'\"></span>\n              <span class=\"status-label\">{{ connectedServerCount }}/{{ totalServerCount }} servers</span>\n          </span>\n\n          <!-- Uptime -->\n          <span class=\"status-item status-muted\" *ngIf=\"statusUptime > 0\">\n              <span class=\"status-icon\">&uarr;</span>\n              <span class=\"status-label\">{{ formattedUptime }}</span>\n          </span>\n\n          <!-- Custom processor notification -->\n          <span class=\"status-item status-text\" [ngClass]=\"'level-' + notification?.level\" *ngIf=\"notification\">\n              <span class=\"status-label\">{{ notification.message }}</span>\n          </span>\n      </div>\n\n      <!-- Compact status indicators (left/right positions — CSS controls visibility) -->\n      <div class=\"status-indicators-compact\">\n          <!-- Execution state -->\n          <span class=\"compact-item\" [title]=\"statusExecutionState\">\n              <span class=\"status-dot\" [class.dot-idle]=\"statusExecutionState === 'idle'\" [class.dot-running]=\"statusExecutionState === 'running'\"></span>\n          </span>\n\n          <!-- Background services -->\n          <span class=\"compact-item status-clickable\" *ngIf=\"statusServiceCount.total > 0\" [title]=\"statusServiceCount.running + '/' + statusServiceCount.total + ' services'\" (click)=\"toggleServicesDropdown($event)\">\n              <span class=\"status-icon\">&#9881;</span>\n          </span>\n\n          <!-- Last command -->\n          <span class=\"compact-item\" *ngIf=\"statusLastCommand\" [title]=\"(statusLastCommand.success ? '✓ ' : '✗ ') + statusLastCommand.name\">\n              <span class=\"status-icon\" [class.status-success]=\"statusLastCommand.success\" [class.status-error]=\"!statusLastCommand.success\">\n                  {{ statusLastCommand.success ? '&#10003;' : '&#10005;' }}\n              </span>\n          </span>\n\n          <!-- Server connection -->\n          <span class=\"compact-item status-clickable\" *ngIf=\"statusServerState !== 'none'\" [title]=\"connectedServerCount + '/' + totalServerCount + ' servers'\" (click)=\"toggleServersDropdown($event)\">\n              <span class=\"status-dot\" [class.dot-idle]=\"statusServerState === 'connected'\" [class.dot-error]=\"statusServerState === 'disconnected'\"></span>\n          </span>\n\n          <!-- Uptime -->\n          <span class=\"compact-item status-muted\" *ngIf=\"statusUptime > 0\" [title]=\"formattedUptime\">\n              <span class=\"status-icon\">&uarr;</span>\n          </span>\n\n          <!-- Notification -->\n          <span class=\"compact-item\" *ngIf=\"notification\" [title]=\"notification.message\">\n              <span class=\"compact-dot\" [ngClass]=\"'level-' + notification.level\"></span>\n          </span>\n      </div>\n\n      <div class=\"action-buttons\">\n        <!-- Position dropdown -->\n        <div class=\"panel-btn-position-wrapper\" (click)=\"$event.stopPropagation()\">\n          <button\n            class=\"panel-btn panel-btn-position\"\n            title=\"Move panel\"\n            (click)=\"togglePositionDropdown($event)\"\n          >\n            <svg\n              width=\"20\"\n              height=\"20\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"1.8\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n            >\n              <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n              <!-- bottom -->\n              <rect *ngIf=\"position === 'bottom'\" x=\"4\" y=\"15\" width=\"16\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.5\" />\n              <!-- top -->\n              <rect *ngIf=\"position === 'top'\" x=\"4\" y=\"4\" width=\"16\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.5\" />\n              <!-- left -->\n              <rect *ngIf=\"position === 'left'\" x=\"4\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.5\" />\n              <!-- right -->\n              <rect *ngIf=\"position === 'right'\" x=\"15\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.5\" />\n            </svg>\n          </button>\n        </div>\n\n        <!-- Hide button -->\n        <button\n          *ngIf=\"hideable\"\n          class=\"panel-btn panel-btn-hide\"\n          title=\"Hide\"\n          (click)=\"hideTerminal()\"\n        >\n          <svg\n            width=\"20\"\n            height=\"20\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"18\" />\n            <polyline points=\"9 14 12 17 15 14\" />\n          </svg>\n        </button>\n\n        <button\n          class=\"panel-btn\"\n          [title]=\"!isMaximized ? 'Maximize' : 'Restore'\"\n          [disabled]=\"isCollapsed\"\n          (click)=\"toggleMaximizationTerminal()\"\n        >\n          <svg\n            *ngIf=\"!isMaximized\"\n            width=\"20\"\n            height=\"20\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <polyline points=\"15 3 21 3 21 9\" />\n            <polyline points=\"9 21 3 21 3 15\" />\n            <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n            <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n          </svg>\n          <svg\n            *ngIf=\"isMaximized\"\n            width=\"20\"\n            height=\"20\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <polyline points=\"4 14 10 14 10 20\" />\n            <polyline points=\"20 10 14 10 14 4\" />\n            <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\" />\n            <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n          </svg>\n        </button>\n\n        <button\n          class=\"panel-btn\"\n          [title]=\"isCollapsed ? 'Expand' : 'Collapse'\"\n          (click)=\"toggleTerminal()\"\n        >\n          <svg\n            width=\"20\"\n            height=\"20\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <polyline *ngIf=\"position === 'bottom' && isCollapsed\" points=\"18 15 12 9 6 15\" />\n            <polyline *ngIf=\"position === 'bottom' && !isCollapsed\" points=\"6 9 12 15 18 9\" />\n            <polyline *ngIf=\"position === 'top' && isCollapsed\" points=\"6 9 12 15 18 9\" />\n            <polyline *ngIf=\"position === 'top' && !isCollapsed\" points=\"18 15 12 9 6 15\" />\n            <polyline *ngIf=\"position === 'left' && isCollapsed\" points=\"9 18 15 12 9 6\" />\n            <polyline *ngIf=\"position === 'left' && !isCollapsed\" points=\"15 6 9 12 15 18\" />\n            <polyline *ngIf=\"position === 'right' && isCollapsed\" points=\"15 6 9 12 15 18\" />\n            <polyline *ngIf=\"position === 'right' && !isCollapsed\" points=\"9 18 15 12 9 6\" />\n          </svg>\n        </button>\n\n        <button class=\"panel-btn panel-btn-close\" title=\"Close\" (click)=\"closeTerminal()\">\n          <svg\n            width=\"20\"\n            height=\"20\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.8\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n            <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n          </svg>\n        </button>\n      </div>\n    </div>\n    <!-- Ambient glow line -->\n    <div class=\"glow-line\" [class.glow-active]=\"statusExecutionState === 'running'\"></div>\n  </div>\n  <div class=\"terminal-content\" [style.display]=\"isCollapsed ? 'none' : ''\">\n    <ng-content></ng-content>\n  </div>\n</div>\n\n<!-- Services dropdown portaled outside terminal-wrapper -->\n<div class=\"services-dropdown\" *ngIf=\"servicesDropdownOpen\" [ngStyle]=\"servicesDropdownStyle\" (click)=\"$event.stopPropagation()\">\n  <div class=\"services-dropdown-header\">Background Services</div>\n  <div class=\"services-dropdown-list\">\n    <div class=\"services-dropdown-item\" *ngFor=\"let svc of statusServiceDetails\">\n      <span class=\"svc-dot\" [class.svc-running]=\"svc.status === 'running'\" [class.svc-stopped]=\"svc.status !== 'running'\"></span>\n      <div class=\"svc-info\">\n        <span class=\"svc-name\">{{ svc.name }}</span>\n        <span class=\"svc-desc\" *ngIf=\"svc.description\">{{ svc.description }}</span>\n      </div>\n      <span class=\"svc-status\">{{ svc.status }}</span>\n    </div>\n  </div>\n  <div class=\"services-dropdown-empty\" *ngIf=\"statusServiceDetails.length === 0\">\n    No services registered\n  </div>\n</div>\n\n<!-- Servers dropdown portaled outside terminal-wrapper -->\n<div class=\"services-dropdown\" *ngIf=\"serversDropdownOpen\" [ngStyle]=\"serversDropdownStyle\" (click)=\"$event.stopPropagation()\">\n  <div class=\"services-dropdown-header\">Server Connections</div>\n  <div class=\"services-dropdown-list\">\n    <div class=\"services-dropdown-item\" *ngFor=\"let srv of statusServerDetails\">\n      <span class=\"svc-dot\" [class.svc-running]=\"srv.connected\" [class.svc-stopped]=\"!srv.connected\"></span>\n      <div class=\"svc-info\">\n        <span class=\"svc-name\">{{ srv.name }}</span>\n        <span class=\"svc-desc\" *ngIf=\"srv.url\">{{ srv.url }}</span>\n      </div>\n      <div class=\"srv-meta\">\n        <span class=\"svc-status\">{{ srv.connected ? 'connected' : 'disconnected' }}</span>\n        <span class=\"svc-desc\" *ngIf=\"srv.apiVersion\">v{{ srv.apiVersion }}</span>\n        <span class=\"svc-desc\" *ngIf=\"srv.commandCount\">{{ srv.commandCount }} cmds</span>\n      </div>\n    </div>\n  </div>\n  <div class=\"services-dropdown-empty\" *ngIf=\"statusServerDetails.length === 0\">\n    No servers configured\n  </div>\n</div>\n\n<!-- Position dropdown portaled outside terminal-wrapper to escape transform stacking context -->\n<div class=\"position-dropdown\" *ngIf=\"positionDropdownOpen\" [ngStyle]=\"dropdownStyle\" (click)=\"$event.stopPropagation()\">\n  <button\n    class=\"position-dropdown-item\"\n    [class.active]=\"position === 'bottom'\"\n    (click)=\"selectPosition('bottom')\"\n  >\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n      <rect x=\"4\" y=\"15\" width=\"16\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.6\" />\n    </svg>\n    Bottom\n  </button>\n  <button\n    class=\"position-dropdown-item\"\n    [class.active]=\"position === 'top'\"\n    (click)=\"selectPosition('top')\"\n  >\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n      <rect x=\"4\" y=\"4\" width=\"16\" height=\"5\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.6\" />\n    </svg>\n    Top\n  </button>\n  <button\n    class=\"position-dropdown-item\"\n    [class.active]=\"position === 'left'\"\n    (click)=\"selectPosition('left')\"\n  >\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n      <rect x=\"4\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.6\" />\n    </svg>\n    Left\n  </button>\n  <button\n    class=\"position-dropdown-item\"\n    [class.active]=\"position === 'right'\"\n    (click)=\"selectPosition('right')\"\n  >\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n      <rect x=\"15\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.6\" />\n    </svg>\n    Right\n  </button>\n</div>\n","import { BehaviorSubject, Observable, Subject, interval, map, distinctUntilChanged, takeUntil, startWith, merge } from 'rxjs';\nimport { CliEngine } from '@qodalis/cli';\nimport { CliNotification } from '@qodalis/cli-core';\n\nexport interface TabStatus {\n    executionState: 'idle' | 'running';\n    lastCommandStatus: 'success' | 'error' | null;\n    lastCommandName: string | null;\n    notification: CliNotification | null;\n}\n\nexport interface ServiceDetail {\n    name: string;\n    status: string;\n    description?: string;\n}\n\nexport interface ServerDetail {\n    name: string;\n    url: string;\n    connected: boolean;\n    apiVersion?: string;\n    commandCount?: number;\n}\n\nexport interface GlobalStatus {\n    runningServiceCount: number;\n    totalServiceCount: number;\n    serviceDetails: ServiceDetail[];\n    serverConnectionState: 'connected' | 'disconnected' | 'none';\n    serverDetails: ServerDetail[];\n    uptime: number;\n}\n\ninterface TabEntry {\n    engines: Map<number, CliEngine>; // paneId -> engine\n    status$: BehaviorSubject<TabStatus>;\n    destroy$: Subject<void>;\n    refresh$: Subject<void>;\n}\n\n/** Slow poll for uptime display only. */\nconst UPTIME_POLL_MS = 2000;\n\n/** Fast poll to catch execution state changes. */\nconst EXEC_POLL_MS = 300;\n\nconst DEFAULT_TAB_STATUS: TabStatus = {\n    executionState: 'idle',\n    lastCommandStatus: null,\n    lastCommandName: null,\n    notification: null,\n};\n\nconst DEFAULT_GLOBAL_STATUS: GlobalStatus = {\n    runningServiceCount: 0,\n    totalServiceCount: 0,\n    serviceDetails: [],\n    serverConnectionState: 'none',\n    serverDetails: [],\n    uptime: 0,\n};\n\nexport class CliPanelStatusService {\n    private tabs = new Map<number, TabEntry>();\n    private activeTabId: number | undefined;\n    private globalStatus$ = new BehaviorSubject<GlobalStatus>(DEFAULT_GLOBAL_STATUS);\n    private destroy$ = new Subject<void>();\n\n    /** Push to trigger an immediate global status recalculation. */\n    private globalRefresh$ = new Subject<void>();\n\n    /** Cleanup functions for background-service event listeners. */\n    private bgUnsubscribes: Array<() => void> = [];\n\n    private globalPollingStarted = false;\n\n    /**\n     * Register an engine for a specific pane within a tab.\n     */\n    registerEngine(tabId: number, paneId: number, engine: CliEngine): void {\n        let entry = this.tabs.get(tabId);\n        if (!entry) {\n            entry = {\n                engines: new Map(),\n                status$: new BehaviorSubject<TabStatus>(DEFAULT_TAB_STATUS),\n                destroy$: new Subject<void>(),\n                refresh$: new Subject<void>(),\n            };\n            this.tabs.set(tabId, entry);\n            this.startPollingTab(entry);\n        }\n        entry.engines.set(paneId, engine);\n\n        // Listen to notifier changes for immediate tab refresh\n        const context = engine.getContext();\n        if (context?.notifier?.change$) {\n            context.notifier.change$.pipe(\n                takeUntil(entry.destroy$),\n                takeUntil(this.destroy$),\n            ).subscribe(() => {\n                entry!.refresh$.next();\n            });\n        }\n\n        // Listen to background service events for immediate global refresh\n        this.listenToBackgroundServices(engine);\n\n        if (!this.globalPollingStarted) {\n            this.globalPollingStarted = true;\n            this.startGlobalPolling();\n        }\n    }\n\n    /**\n     * Unregister all engines for a tab (called on tab close).\n     */\n    unregisterTab(tabId: number): void {\n        const entry = this.tabs.get(tabId);\n        if (entry) {\n            entry.destroy$.next();\n            entry.destroy$.complete();\n            this.tabs.delete(tabId);\n        }\n    }\n\n    /**\n     * Set the active tab for global status derivation.\n     */\n    setActiveTab(tabId: number): void {\n        this.activeTabId = tabId;\n        this.globalRefresh$.next();\n    }\n\n    /**\n     * Observable of per-tab status.\n     */\n    getTabStatus$(tabId: number): Observable<TabStatus> {\n        const entry = this.tabs.get(tabId);\n        return entry ? entry.status$.asObservable() : new BehaviorSubject(DEFAULT_TAB_STATUS).asObservable();\n    }\n\n    /**\n     * Observable of global status (from active tab).\n     */\n    getGlobalStatus$(): Observable<GlobalStatus> {\n        return this.globalStatus$.asObservable();\n    }\n\n    /**\n     * Clean up all subscriptions.\n     */\n    destroy(): void {\n        this.destroy$.next();\n        this.destroy$.complete();\n        for (const entry of this.tabs.values()) {\n            entry.destroy$.next();\n            entry.destroy$.complete();\n        }\n        this.tabs.clear();\n        for (const unsub of this.bgUnsubscribes) {\n            unsub();\n        }\n        this.bgUnsubscribes.length = 0;\n    }\n\n    /**\n     * Hook into an engine's background service events so that\n     * service start/stop/status-change triggers an immediate refresh.\n     */\n    private listenToBackgroundServices(engine: CliEngine): void {\n        const context = engine.getContext();\n        if (!context?.backgroundServices) return;\n\n        try {\n            const unsub = context.backgroundServices.on(() => {\n                this.globalRefresh$.next();\n            });\n            this.bgUnsubscribes.push(unsub);\n        } catch { /* not available */ }\n    }\n\n    private startPollingTab(entry: TabEntry): void {\n        merge(\n            interval(EXEC_POLL_MS).pipe(startWith(0)),\n            entry.refresh$,\n        ).pipe(\n            map(() => this.computeTabStatus(entry)),\n            distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n            takeUntil(entry.destroy$),\n            takeUntil(this.destroy$),\n        ).subscribe(status => {\n            entry.status$.next(status);\n        });\n    }\n\n    private startGlobalPolling(): void {\n        // Merge: slow timer for uptime ticking + immediate refresh signals\n        merge(\n            interval(UPTIME_POLL_MS).pipe(startWith(0)),\n            this.globalRefresh$,\n        ).pipe(\n            map(() => this.computeGlobalStatus()),\n            distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n            takeUntil(this.destroy$),\n        ).subscribe(status => {\n            this.globalStatus$.next(status);\n        });\n    }\n\n    private computeTabStatus(entry: TabEntry): TabStatus {\n        let running = false;\n        let latestResult: { command: string; success: boolean } | undefined;\n        let notification: CliNotification | null = null;\n\n        for (const engine of entry.engines.values()) {\n            const context = engine.getContext();\n            if (!context) continue;\n\n            // Check if a command is currently executing or a context processor\n            // (raw/fullscreen mode, e.g. games) is active\n            if ((context as any).isExecuting || (context as any).contextProcessor) {\n                running = true;\n            }\n\n            // Check last command result\n            const result = (context as any).lastCommandResult;\n            if (result) {\n                latestResult = result;\n            }\n\n            // Pick up notification from processors\n            const notif = context.notifier?.current;\n            if (notif) {\n                notification = notif;\n            }\n        }\n\n        return {\n            executionState: running ? 'running' : 'idle',\n            lastCommandStatus: latestResult ? (latestResult.success ? 'success' : 'error') : null,\n            lastCommandName: latestResult?.command ?? null,\n            notification,\n        };\n    }\n\n    private computeGlobalStatus(): GlobalStatus {\n        if (this.activeTabId == null) return DEFAULT_GLOBAL_STATUS;\n        const entry = this.tabs.get(this.activeTabId);\n        if (!entry) return DEFAULT_GLOBAL_STATUS;\n\n        // Use the first engine in the active tab for global data\n        const engine = entry.engines.values().next().value;\n        if (!engine) return DEFAULT_GLOBAL_STATUS;\n\n        const context = engine.getContext();\n        if (!context) return DEFAULT_GLOBAL_STATUS;\n\n        // Background services\n        let runningServiceCount = 0;\n        let totalServiceCount = 0;\n        let serviceDetails: ServiceDetail[] = [];\n        try {\n            const services = context.backgroundServices?.list() ?? [];\n            totalServiceCount = services.length;\n            runningServiceCount = services.filter(\n                (s: any) => s.status === 'running',\n            ).length;\n            serviceDetails = services.map((s: any) => ({\n                name: s.name,\n                status: s.status,\n                description: s.description,\n            }));\n        } catch { /* not available */ }\n\n        // Server connection\n        let serverConnectionState: GlobalStatus['serverConnectionState'] = 'none';\n        const serverDetails: ServerDetail[] = [];\n        try {\n            const serverManager = (context as any).services?.get?.('cli-server-manager');\n            if (serverManager?.connections?.size > 0) {\n                let anyConnected = false;\n                for (const [name, conn] of serverManager.connections) {\n                    if (conn.connected) {\n                        anyConnected = true;\n                    }\n                    serverDetails.push({\n                        name,\n                        url: conn.config?.url ?? '',\n                        connected: !!conn.connected,\n                        apiVersion: conn.connected ? conn.apiVersion : undefined,\n                        commandCount: conn.connected ? conn.commands?.length : undefined,\n                    });\n                }\n                serverConnectionState = anyConnected ? 'connected' : 'disconnected';\n            } else {\n                // Fall back to configured servers from engine options\n                const configuredServers = (engine as any).options?.servers;\n                if (Array.isArray(configuredServers) && configuredServers.length > 0) {\n                    for (const srv of configuredServers) {\n                        if (srv.enabled === false) continue;\n                        serverDetails.push({\n                            name: srv.name,\n                            url: srv.url ?? '',\n                            connected: false,\n                        });\n                    }\n                    serverConnectionState = 'disconnected';\n                }\n            }\n        } catch { /* not available */ }\n\n        // Uptime\n        const uptime = engine.startedAt ? Date.now() - engine.startedAt : 0;\n\n        return { runningServiceCount, totalServiceCount, serviceDetails, serverConnectionState, serverDetails, uptime };\n    }\n}\n","import {\n    Component,\n    ElementRef,\n    EventEmitter,\n    HostListener,\n    Input,\n    OnDestroy,\n    OnInit,\n    Output,\n    QueryList,\n    ViewChild,\n    ViewChildren,\n} from '@angular/core';\nimport {\n    CliEngineSnapshot,\n    CliPanelConfig,\n    CliPanelPosition,\n    CliPanelState,\n    ICliCommandProcessor,\n    ICliModule,\n    ICliPanelRef,\n    derivePanelThemeStyles,\n    loadPanelPosition,\n    savePanelPosition,\n} from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions } from '@qodalis/cli';\nimport { CliComponent } from '../cli/cli.component';\nimport { CollapsableContentComponent } from '../collapsable-content/collapsable-content.component';\nimport { CliPanelStatusService, TabStatus, GlobalStatus } from './cli-panel-status.service';\nimport { Subject, takeUntil } from 'rxjs';\n\nexport interface TerminalPane {\n    id: number;\n    widthPercent: number;\n    snapshot?: CliEngineSnapshot;\n}\n\nexport interface TerminalTab {\n    id: number;\n    title: string;\n    isEditing: boolean;\n    panes: TerminalPane[];\n}\n\nexport interface TabContextMenu {\n    visible: boolean;\n    x: number;\n    y: number;\n    tabId: number;\n}\n\nexport type CliPanelOptions = CliEngineOptions & CliPanelConfig;\n\n/**\n * A component that displays the CLI on the bottom of page.\n */\n@Component({\n    standalone: false,\n    selector: 'cli-panel',\n    templateUrl: './cli-panel.component.html',\n    styleUrls: ['./cli-panel.component.sass'],\n})\nexport class CliPanelComponent implements OnInit, OnDestroy, ICliPanelRef<CliEngine> {\n    /**\n     * The options for the CLI.\n     */\n    @Input() options?: CliPanelOptions;\n\n    /**\n     * Optional list of CLI modules to register with each terminal pane.\n     */\n    @Input() modules?: ICliModule[];\n\n    /**\n     * Optional list of command processors to register with each terminal pane.\n     * This allows passing processors without Angular DI (framework-agnostic pattern).\n     * @deprecated Use modules instead.\n     */\n    @Input() processors?: ICliCommandProcessor[];\n\n    @Output() onClose = new EventEmitter<void>();\n\n    // ── Bindable properties (hybrid controlled/uncontrolled) ──\n    @Input() collapsed?: boolean;\n    @Output() collapsedChange = new EventEmitter<boolean>();\n\n    @Input() hidden?: boolean;\n    @Output() hiddenChange = new EventEmitter<boolean>();\n\n    @Input() maximized?: boolean;\n    @Output() maximizedChange = new EventEmitter<boolean>();\n\n    @Input() activeTabId?: number;\n    @Output() activeTabIdChange = new EventEmitter<number>();\n\n    @Input() position?: CliPanelPosition;\n    @Output() positionChange = new EventEmitter<CliPanelPosition>();\n\n    @Input() height?: number;\n    @Output() heightChange = new EventEmitter<number>();\n\n    @Input() width?: number;\n    @Output() widthChange = new EventEmitter<number>();\n\n    // ── Structural events ──\n    @Output() onTabAdded = new EventEmitter<{ tabId: number }>();\n    @Output() onTabClosed = new EventEmitter<{ tabId: number }>();\n    @Output() onPaneSplit = new EventEmitter<{ paneId: number; tabId: number }>();\n    @Output() onPaneClosed = new EventEmitter<{ paneId: number }>();\n\n    @ViewChild(CollapsableContentComponent)\n    collapsableContent!: CollapsableContentComponent;\n    @ViewChildren(CliComponent) cliComponents!: QueryList<CliComponent>;\n\n    currentPosition: CliPanelPosition = 'bottom';\n\n    themeStyles: Record<string, string> = {};\n\n    visible = true;\n\n    tabs: TerminalTab[] = [];\n    tabStatuses: Record<number, TabStatus> = {};\n    activePaneId = 0;\n    private _internalActiveTabId = 0;\n    private _internalCollapsed = true;\n    private _internalHidden = false;\n    private _internalMaximized = false;\n    private _internalHeight = 600;\n    private _internalWidth = 400;\n    private nextTabId = 1;\n    private nextPaneId = 1;\n    private statusService = new CliPanelStatusService();\n    private destroy$ = new Subject<void>();\n    globalStatus: GlobalStatus = {\n        runningServiceCount: 0,\n        totalServiceCount: 0,\n        serviceDetails: [],\n        serverConnectionState: 'none',\n        serverDetails: [],\n        uptime: 0,\n    };\n\n    protected get resolvedCollapsed(): boolean {\n        return this.collapsed !== undefined ? this.collapsed : this._internalCollapsed;\n    }\n    protected get resolvedHidden(): boolean {\n        return this.hidden !== undefined ? this.hidden : this._internalHidden;\n    }\n    protected get resolvedMaximized(): boolean {\n        return this.maximized !== undefined ? this.maximized : this._internalMaximized;\n    }\n    protected get resolvedActiveTabId(): number {\n        return this.activeTabId !== undefined ? this.activeTabId : this._internalActiveTabId;\n    }\n    protected get resolvedHeight(): number {\n        return this.height !== undefined ? this.height : this._internalHeight;\n    }\n    protected get resolvedWidth(): number {\n        return this.width !== undefined ? this.width : this._internalWidth;\n    }\n    protected get resolvedPosition(): CliPanelPosition {\n        return this.position !== undefined ? this.position : this.currentPosition;\n    }\n\n    contextMenu: TabContextMenu = {\n        visible: false,\n        x: 0,\n        y: 0,\n        tabId: 0,\n    };\n\n    paneResizing = false;\n    private paneResizeTabId = 0;\n    private paneResizeDividerIndex = 0;\n    private paneResizeStartX = 0;\n    private paneResizeStartWidths: number[] = [];\n    private paneResizeContainerWidth = 0;\n\n    private static readonly MIN_PANE_WIDTH_PERCENT = 10;\n\n    protected terminalHeight: string = '100%';\n\n    protected initialized: boolean = false;\n\n    private themeObserver?: MutationObserver;\n\n    constructor(private readonly elementRef: ElementRef) {}\n\n    ngOnInit(): void {\n        this.currentPosition = loadPanelPosition() ?? this.options?.position ?? 'bottom';\n        if (this.options?.isHidden != null) {\n            this._internalHidden = this.options.isHidden;\n        }\n        if (this.options?.isCollapsed != null) {\n            this._internalCollapsed = this.options.isCollapsed;\n        }\n        this.statusService.getGlobalStatus$().pipe(\n            takeUntil(this.destroy$),\n        ).subscribe(status => {\n            this.globalStatus = status;\n        });\n    }\n\n    ngOnDestroy(): void {\n        this.themeObserver?.disconnect();\n        this.statusService.destroy();\n        this.destroy$.next();\n        this.destroy$.complete();\n    }\n\n    @HostListener('document:click', ['$event'])\n    onDocumentClick(event: MouseEvent): void {\n        if (this.contextMenu.visible) {\n            this.closeContextMenu();\n        }\n    }\n\n    @HostListener('document:keydown.escape')\n    onEscapeKey(): void {\n        if (this.contextMenu.visible) {\n            this.closeContextMenu();\n        }\n        this.cancelAllEditing();\n    }\n\n    onPositionChange(position: CliPanelPosition): void {\n        this.currentPosition = position;\n        savePanelPosition(this.currentPosition);\n        this.positionChange.emit(position);\n    }\n\n    onToggle($event: boolean): void {\n        this._internalCollapsed = $event;\n        this.collapsedChange.emit($event);\n        if (!$event && !this.initialized) {\n            this.initialized = true;\n            this.addTab();\n            this.setupThemeSync();\n        }\n    }\n\n    onContentSizeChange(_event: number) {\n        // Terminal height is handled via CSS flex layout\n    }\n\n    // --- Tab management ---\n\n    addTab(title?: string): number {\n        const pane: TerminalPane = { id: this.nextPaneId++, widthPercent: 100 };\n        const tabId = this.nextTabId++;\n        const tab: TerminalTab = {\n            id: tabId,\n            title: title ?? `Terminal ${tabId}`,\n            isEditing: false,\n            panes: [pane],\n        };\n        this.tabs.push(tab);\n        this._internalActiveTabId = tabId;\n        this.activeTabIdChange.emit(tabId);\n        this.activePaneId = pane.id;\n        this.statusService.setActiveTab(tabId);\n        this.onTabAdded.emit({ tabId });\n        return tabId;\n    }\n\n    closeTab(id: number): void {\n        const index = this.tabs.findIndex((t) => t.id === id);\n        if (index === -1) return;\n\n        this.tabs.splice(index, 1);\n        this.onTabClosed.emit({ tabId: id });\n        this.statusService.unregisterTab(id);\n        delete this.tabStatuses[id];\n\n        if (this.tabs.length === 0) {\n            this.initialized = false;\n            this.collapsableContent?.toggleTerminal();\n            return;\n        }\n\n        if (this.resolvedActiveTabId === id) {\n            const nextIndex = Math.min(index, this.tabs.length - 1);\n            this.selectTab(this.tabs[nextIndex].id);\n        }\n    }\n\n    selectTab(id: number): void {\n        this._internalActiveTabId = id;\n        this.activeTabIdChange.emit(id);\n        this.statusService.setActiveTab(id);\n        const tab = this.findTab(id);\n        if (tab && tab.panes.length > 0) {\n            this.activePaneId = tab.panes[0].id;\n        }\n        setTimeout(() => {\n            this.focusActiveTerminal();\n        });\n    }\n\n    trackByTabId(_index: number, tab: TerminalTab): number {\n        return tab.id;\n    }\n\n    getTabDotClass(tabId: number): string {\n        const status = this.tabStatuses[tabId];\n        if (!status) return 'dot-idle';\n        if (status.executionState === 'running') return 'dot-running';\n        if (status.lastCommandStatus === 'error') return 'dot-error';\n        return 'dot-idle';\n    }\n\n    onPaneEngineReady(tabId: number, paneId: number, engine: CliEngine): void {\n        this.statusService.registerEngine(tabId, paneId, engine);\n        this.statusService.getTabStatus$(tabId).pipe(\n            takeUntil(this.destroy$),\n        ).subscribe(status => {\n            this.tabStatuses[tabId] = status;\n        });\n    }\n\n    trackByPaneId(_index: number, pane: TerminalPane): number {\n        return pane.id;\n    }\n\n    // --- Inline rename ---\n\n    startRename(tab: TerminalTab): void {\n        this.cancelAllEditing();\n        tab.isEditing = true;\n        setTimeout(() => {\n            const input = this.elementRef.nativeElement.querySelector(\n                '.tab-rename-input',\n            ) as HTMLInputElement | null;\n            if (input) {\n                input.focus();\n                input.select();\n            }\n        });\n    }\n\n    onTabDoubleClick(tab: TerminalTab): void {\n        this.startRename(tab);\n    }\n\n    commitRename(tab: TerminalTab, value: string): void {\n        const trimmed = value.trim();\n        if (trimmed) {\n            tab.title = trimmed;\n        }\n        tab.isEditing = false;\n    }\n\n    onRenameKeydown(event: KeyboardEvent, tab: TerminalTab): void {\n        if (event.key === 'Enter') {\n            this.commitRename(tab, (event.target as HTMLInputElement).value);\n        } else if (event.key === 'Escape') {\n            tab.isEditing = false;\n        }\n    }\n\n    onRenameBlur(event: FocusEvent, tab: TerminalTab): void {\n        if (tab.isEditing) {\n            this.commitRename(tab, (event.target as HTMLInputElement).value);\n        }\n    }\n\n    // --- Context menu ---\n\n    onTabContextMenu(event: MouseEvent, tab: TerminalTab): void {\n        event.preventDefault();\n        event.stopPropagation();\n\n        this.contextMenu = {\n            visible: true,\n            x: event.clientX,\n            y: event.clientY,\n            tabId: tab.id,\n        };\n    }\n\n    closeContextMenu(): void {\n        this.contextMenu = { ...this.contextMenu, visible: false };\n    }\n\n    contextMenuRename(): void {\n        const tab = this.findTab(this.contextMenu.tabId);\n        this.closeContextMenu();\n        if (tab) {\n            this.startRename(tab);\n        }\n    }\n\n    contextMenuDuplicate(): void {\n        const sourceTab = this.findTab(this.contextMenu.tabId);\n        this.closeContextMenu();\n        if (sourceTab) {\n            const snapshot = this.getEngineForTab(sourceTab)?.snapshot();\n\n            const pane: TerminalPane = {\n                id: this.nextPaneId++,\n                widthPercent: 100,\n                snapshot,\n            };\n            const tab: TerminalTab = {\n                id: this.nextTabId++,\n                title: `${sourceTab.title} (copy)`,\n                isEditing: false,\n                panes: [pane],\n            };\n            const sourceIndex = this.tabs.indexOf(sourceTab);\n            this.tabs.splice(sourceIndex + 1, 0, tab);\n            this._internalActiveTabId = tab.id;\n            this.activeTabIdChange.emit(tab.id);\n            this.activePaneId = pane.id;\n        }\n    }\n\n    contextMenuClose(): void {\n        const id = this.contextMenu.tabId;\n        this.closeContextMenu();\n        this.closeTab(id);\n    }\n\n    contextMenuCloseOthers(): void {\n        const id = this.contextMenu.tabId;\n        this.closeContextMenu();\n        this.tabs = this.tabs.filter((t) => t.id === id);\n        this._internalActiveTabId = id;\n        this.activeTabIdChange.emit(id);\n    }\n\n    contextMenuCloseToTheRight(): void {\n        const id = this.contextMenu.tabId;\n        this.closeContextMenu();\n        const index = this.tabs.findIndex((t) => t.id === id);\n        if (index === -1) return;\n        this.tabs = this.tabs.slice(0, index + 1);\n        if (!this.tabs.find((t) => t.id === this.resolvedActiveTabId)) {\n            this._internalActiveTabId = id;\n            this.activeTabIdChange.emit(id);\n        }\n    }\n\n    contextMenuCloseAll(): void {\n        this.closeContextMenu();\n        this.tabs = [];\n        this.initialized = false;\n        this.collapsableContent?.toggleTerminal();\n    }\n\n    // --- Split / close pane ---\n\n    splitPane(tabId?: number): number {\n        const targetTabId = tabId ?? this.resolvedActiveTabId;\n        const tab = this.findTab(targetTabId);\n        if (!tab) return -1;\n\n        const paneId = this.nextPaneId++;\n        const newPane: TerminalPane = { id: paneId, widthPercent: 0 };\n        tab.panes.push(newPane);\n\n        const evenWidth = 100 / tab.panes.length;\n        tab.panes.forEach((p) => (p.widthPercent = evenWidth));\n        this.normalizePaneWidths(tab.panes);\n\n        this.activePaneId = paneId;\n        this.onPaneSplit.emit({ paneId, tabId: targetTabId });\n        return paneId;\n    }\n\n    closePane(paneId: number): void {\n        for (const tab of this.tabs) {\n            const idx = tab.panes.findIndex((p) => p.id === paneId);\n            if (idx === -1) continue;\n\n            if (tab.panes.length <= 1) {\n                this.closeTab(tab.id);\n                return;\n            }\n\n            // Destroy engine at the flat index\n            let flatIndex = 0;\n            for (const t of this.tabs) {\n                for (const p of t.panes) {\n                    if (p.id === paneId) {\n                        const engine = this.cliComponents?.toArray()[flatIndex]?.getEngine();\n                        if (engine) engine.destroy();\n                    }\n                    flatIndex++;\n                }\n            }\n\n            tab.panes.splice(idx, 1);\n            this.normalizePaneWidths(tab.panes);\n\n            if (this.activePaneId === paneId) {\n                this.activePaneId = tab.panes[Math.min(idx, tab.panes.length - 1)].id;\n            }\n\n            this.onPaneClosed.emit({ paneId });\n            setTimeout(() => this.focusActiveTerminal());\n            return;\n        }\n    }\n\n    contextMenuSplitRight(): void {\n        const tabId = this.contextMenu.tabId;\n        this.closeContextMenu();\n        this.splitPane(tabId);\n    }\n\n    // --- Pane resize ---\n\n    onPaneResizeStart(\n        event: MouseEvent,\n        tabId: number,\n        dividerIndex: number,\n    ): void {\n        event.preventDefault();\n        const tab = this.findTab(tabId);\n        if (!tab) return;\n\n        this.paneResizing = true;\n        this.paneResizeTabId = tabId;\n        this.paneResizeDividerIndex = dividerIndex;\n        this.paneResizeStartX = event.clientX;\n        this.paneResizeStartWidths = tab.panes.map((p) => p.widthPercent);\n\n        const container = (event.target as HTMLElement).closest(\n            '.terminal-panes-container',\n        );\n        this.paneResizeContainerWidth = container ? container.clientWidth : 1;\n\n        document.body.classList.add('cli-pane-resizing');\n    }\n\n    @HostListener('document:mousemove', ['$event'])\n    onPaneResizeMove(event: MouseEvent): void {\n        if (!this.paneResizing) return;\n\n        const tab = this.findTab(this.paneResizeTabId);\n        if (!tab) return;\n\n        const deltaX = event.clientX - this.paneResizeStartX;\n        const deltaPct = (deltaX / this.paneResizeContainerWidth) * 100;\n\n        const i = this.paneResizeDividerIndex;\n        const minW = CliPanelComponent.MIN_PANE_WIDTH_PERCENT;\n\n        let leftWidth = this.paneResizeStartWidths[i] + deltaPct;\n        let rightWidth = this.paneResizeStartWidths[i + 1] - deltaPct;\n\n        if (leftWidth < minW) {\n            leftWidth = minW;\n            rightWidth =\n                this.paneResizeStartWidths[i] +\n                this.paneResizeStartWidths[i + 1] -\n                minW;\n        }\n        if (rightWidth < minW) {\n            rightWidth = minW;\n            leftWidth =\n                this.paneResizeStartWidths[i] +\n                this.paneResizeStartWidths[i + 1] -\n                minW;\n        }\n\n        tab.panes[i].widthPercent = leftWidth;\n        tab.panes[i + 1].widthPercent = rightWidth;\n    }\n\n    @HostListener('document:mouseup')\n    onPaneResizeEnd(): void {\n        if (!this.paneResizing) return;\n        this.paneResizing = false;\n        document.body.classList.remove('cli-pane-resizing');\n    }\n\n    // --- Pane focus ---\n\n    onPaneClick(tabId: number, paneId: number): void {\n        this.activePaneId = paneId;\n        if (this.resolvedActiveTabId !== tabId) {\n            this._internalActiveTabId = tabId;\n            this.activeTabIdChange.emit(tabId);\n        }\n        setTimeout(() => this.focusPane(tabId, paneId));\n    }\n\n    // --- ICliPanelRef methods ---\n\n    open(): void {\n        if (!this.visible) {\n            this.visible = true;\n        }\n        if (this.resolvedHidden) {\n            this._internalHidden = false;\n            this.hiddenChange.emit(false);\n        }\n        if (this.resolvedCollapsed) {\n            this._internalCollapsed = false;\n            this.collapsedChange.emit(false);\n            this.collapsableContent?.setCollapsed(false);\n            if (!this.initialized) {\n                this.initialized = true;\n                this.addTab();\n                this.setupThemeSync();\n            }\n        }\n    }\n\n    collapse(): void {\n        if (!this.resolvedCollapsed) {\n            this._internalCollapsed = true;\n            this.collapsedChange.emit(true);\n            this.collapsableContent?.setCollapsed(true);\n        }\n    }\n\n    toggleCollapse(): void {\n        if (this.resolvedCollapsed) {\n            this.open();\n        } else {\n            this.collapse();\n        }\n    }\n\n    hide(): void {\n        if (!this.resolvedHidden) {\n            this._internalHidden = true;\n            this.hiddenChange.emit(true);\n            this.collapsableContent?.hideTerminal();\n        }\n    }\n\n    unhide(): void {\n        if (this.resolvedHidden) {\n            this._internalHidden = false;\n            this.hiddenChange.emit(false);\n            this.collapsableContent?.unhideTerminal();\n        }\n    }\n\n    toggleHide(): void {\n        if (this.resolvedHidden) {\n            this.unhide();\n        } else {\n            this.hide();\n        }\n    }\n\n    close(): void {\n        this.visible = false;\n        this.onClose.emit();\n    }\n\n    maximize(): void {\n        if (!this.resolvedMaximized) {\n            this._internalMaximized = true;\n            this.maximizedChange.emit(true);\n            this.collapsableContent?.setMaximized(true);\n        }\n    }\n\n    restore(): void {\n        if (this.resolvedMaximized) {\n            this._internalMaximized = false;\n            this.maximizedChange.emit(false);\n            this.collapsableContent?.setMaximized(false);\n        }\n    }\n\n    toggleMaximize(): void {\n        if (this.resolvedMaximized) {\n            this.restore();\n        } else {\n            this.maximize();\n        }\n    }\n\n    resize(dimensions: { height?: number; width?: number }): void {\n        if (dimensions.height !== undefined) {\n            this._internalHeight = dimensions.height;\n            this.heightChange.emit(dimensions.height);\n        }\n        if (dimensions.width !== undefined) {\n            this._internalWidth = dimensions.width;\n            this.widthChange.emit(dimensions.width);\n        }\n        this.collapsableContent?.setDimensions(dimensions);\n    }\n\n    setPosition(pos: CliPanelPosition): void {\n        this.currentPosition = pos;\n        savePanelPosition(pos);\n        this.positionChange.emit(pos);\n    }\n\n    renameTab(tabId: number, title: string): void {\n        const tab = this.findTab(tabId);\n        if (tab) {\n            tab.title = title;\n        }\n    }\n\n    getEngine(paneId?: number): CliEngine | undefined {\n        const targetPaneId = paneId ?? this.activePaneId;\n        let flatIndex = 0;\n        for (const tab of this.tabs) {\n            for (const pane of tab.panes) {\n                if (pane.id === targetPaneId) {\n                    const components = this.cliComponents?.toArray();\n                    return components?.[flatIndex]?.getEngine();\n                }\n                flatIndex++;\n            }\n        }\n        return undefined;\n    }\n\n    getState(): CliPanelState {\n        return {\n            collapsed: this.resolvedCollapsed,\n            hidden: this.resolvedHidden,\n            maximized: this.resolvedMaximized,\n            position: this.resolvedPosition,\n            height: this.resolvedHeight,\n            width: this.resolvedWidth,\n            activeTabId: this.resolvedActiveTabId,\n            activePaneId: this.activePaneId,\n            tabs: this.tabs.map((t) => ({\n                id: t.id,\n                title: t.title,\n                panes: t.panes.map((p) => ({ id: p.id, widthPercent: p.widthPercent })),\n            })),\n        };\n    }\n\n    // --- Helpers ---\n\n    private findTab(id: number): TerminalTab | undefined {\n        return this.tabs.find((t) => t.id === id);\n    }\n\n    private getEngineForTab(tab: TerminalTab): CliEngine | undefined {\n        if (!this.cliComponents) return undefined;\n\n        let flatIndex = 0;\n        for (const t of this.tabs) {\n            for (const _pane of t.panes) {\n                if (t.id === tab.id) {\n                    const component = this.cliComponents.toArray()[flatIndex];\n                    return component?.getEngine();\n                }\n                flatIndex++;\n            }\n        }\n        return undefined;\n    }\n\n    private cancelAllEditing(): void {\n        this.tabs.forEach((t) => (t.isEditing = false));\n    }\n\n    private focusActiveTerminal(): void {\n        this.focusPane(this.resolvedActiveTabId, this.activePaneId);\n    }\n\n    private focusPane(tabId: number, paneId: number): void {\n        if (!this.cliComponents) return;\n\n        let flatIndex = 0;\n        for (const tab of this.tabs) {\n            for (const pane of tab.panes) {\n                if (tab.id === tabId && pane.id === paneId) {\n                    const component = this.cliComponents.toArray()[flatIndex];\n                    component?.focus();\n                    return;\n                }\n                flatIndex++;\n            }\n        }\n    }\n\n    private normalizePaneWidths(panes: TerminalPane[]): void {\n        const total = panes.reduce((s, p) => s + p.widthPercent, 0);\n        if (total === 0) return;\n        const scale = 100 / total;\n        panes.forEach((p) => (p.widthPercent = p.widthPercent * scale));\n    }\n\n    private setupThemeSync(): void {\n        if (!this.options?.syncTheme) return;\n\n        // Wait for the first terminal to render, then observe style changes\n        setTimeout(() => {\n            this.syncThemeFromEngine();\n\n            const container = this.elementRef.nativeElement.querySelector(\n                '.terminal-container',\n            );\n            if (!container) return;\n\n            this.themeObserver?.disconnect();\n            this.themeObserver = new MutationObserver(() => {\n                this.syncThemeFromEngine();\n            });\n            this.themeObserver.observe(container, {\n                attributes: true,\n                attributeFilter: ['style'],\n            });\n        }, 200);\n    }\n\n    private syncThemeFromEngine(): void {\n        if (!this.cliComponents) return;\n        const first = this.cliComponents.first;\n        if (!first) return;\n        const engine = first.getEngine();\n        if (!engine) return;\n        const theme = engine.getTerminal().options.theme;\n        if (!theme) return;\n        this.themeStyles = derivePanelThemeStyles(theme);\n    }\n}\n","<collapsable-content\n  [isCollapsed]=\"resolvedCollapsed\"\n  [isHidden]=\"resolvedHidden\"\n  [isMaximized]=\"resolvedMaximized\"\n  [position]=\"resolvedPosition\"\n  [closable]=\"options?.closable ?? true\"\n  [resizable]=\"options?.resizable ?? true\"\n  [hideable]=\"options?.hideable ?? true\"\n  [hideAlignment]=\"options?.hideAlignment ?? 'center'\"\n  [themeStyles]=\"themeStyles\"\n  [statusExecutionState]=\"tabStatuses[resolvedActiveTabId]?.executionState || 'idle'\"\n  [statusLastCommand]=\"tabStatuses[resolvedActiveTabId]?.lastCommandStatus ? { name: tabStatuses[resolvedActiveTabId]?.lastCommandName || '', success: tabStatuses[resolvedActiveTabId]?.lastCommandStatus === 'success' } : null\"\n  [statusServiceCount]=\"{ running: globalStatus.runningServiceCount, total: globalStatus.totalServiceCount }\"\n  [statusServiceDetails]=\"globalStatus.serviceDetails\"\n  [statusServerState]=\"globalStatus.serverConnectionState\"\n  [statusServerDetails]=\"globalStatus.serverDetails\"\n  [statusUptime]=\"globalStatus.uptime\"\n  [notification]=\"tabStatuses[resolvedActiveTabId]?.notification || null\"\n  (onToggle)=\"onToggle($event)\"\n  (onContentSizeChange)=\"onContentSizeChange($event)\"\n  (onPositionChange)=\"onPositionChange($event)\"\n  (onClose)=\"onClose.emit()\"\n  *ngIf=\"visible\"\n>\n  <ng-container *ngIf=\"initialized\">\n    <div class=\"terminal-tabs\">\n      <ul class=\"tab-list\">\n        <li\n          *ngFor=\"let tab of tabs; trackBy: trackByTabId\"\n          class=\"tab\"\n          [class.active]=\"tab.id === resolvedActiveTabId\"\n          (click)=\"selectTab(tab.id)\"\n          (dblclick)=\"onTabDoubleClick(tab)\"\n          (contextmenu)=\"onTabContextMenu($event, tab)\"\n        >\n          <input\n            *ngIf=\"tab.isEditing\"\n            class=\"tab-rename-input\"\n            type=\"text\"\n            [value]=\"tab.title\"\n            (keydown)=\"onRenameKeydown($event, tab)\"\n            (blur)=\"onRenameBlur($event, tab)\"\n            (click)=\"$event.stopPropagation()\"\n            (dblclick)=\"$event.stopPropagation()\"\n            #renameInput\n          />\n          <span *ngIf=\"!tab.isEditing\" class=\"tab-dot\" [ngClass]=\"getTabDotClass(tab.id)\"></span>\n          <span *ngIf=\"!tab.isEditing\" class=\"tab-title\">{{ tab.title }}</span>\n          <button\n            *ngIf=\"!tab.isEditing\"\n            class=\"close-btn\"\n            title=\"Close tab\"\n            (click)=\"closeTab(tab.id); $event.stopPropagation()\"\n          >\n            &times;\n          </button>\n        </li>\n      </ul>\n      <button class=\"add-tab\" title=\"New terminal\" (click)=\"addTab()\">+</button>\n    </div>\n    <div class=\"terminal-instances\">\n      <div\n        *ngFor=\"let tab of tabs; trackBy: trackByTabId\"\n        class=\"terminal-instance\"\n        [hidden]=\"tab.id !== resolvedActiveTabId\"\n      >\n        <div\n          class=\"terminal-panes-container\"\n          [attr.data-tab-id]=\"tab.id\"\n          [class.resizing]=\"paneResizing\"\n        >\n          <ng-container\n            *ngFor=\"\n              let pane of tab.panes;\n              let i = index;\n              trackBy: trackByPaneId\n            \"\n          >\n            <div\n              *ngIf=\"i > 0\"\n              class=\"pane-divider\"\n              (mousedown)=\"onPaneResizeStart($event, tab.id, i - 1)\"\n            >\n              <div class=\"pane-divider-grip\"></div>\n            </div>\n            <div\n              class=\"terminal-pane\"\n              [class.active-pane]=\"\n                pane.id === activePaneId && tab.id === resolvedActiveTabId\n              \"\n              [style.flex]=\"pane.widthPercent + ' 1 0'\"\n              (click)=\"onPaneClick(tab.id, pane.id)\"\n            >\n              <button\n                *ngIf=\"tab.panes.length > 1\"\n                class=\"pane-close-btn\"\n                (click)=\"closePane(pane.id); $event.stopPropagation()\"\n                title=\"Close pane\"\n              >\n                &times;\n              </button>\n              <cli\n                [options]=\"options\"\n                [height]=\"terminalHeight\"\n                [modules]=\"modules\"\n                [processors]=\"processors\"\n                [snapshot]=\"pane.snapshot\"\n                (engineReady)=\"onPaneEngineReady(tab.id, pane.id, $event)\"\n              />\n            </div>\n          </ng-container>\n        </div>\n      </div>\n    </div>\n  </ng-container>\n</collapsable-content>\n\n<!-- Context menu rendered outside collapsable-content to escape transform/overflow clipping -->\n<div\n  class=\"tab-context-menu\"\n  *ngIf=\"contextMenu.visible\"\n  [style.left.px]=\"contextMenu.x\"\n  [style.top.px]=\"contextMenu.y\"\n  (click)=\"$event.stopPropagation()\"\n>\n  <button class=\"context-menu-item\" (click)=\"contextMenuRename()\">\n    Rename\n  </button>\n  <button class=\"context-menu-item\" (click)=\"contextMenuDuplicate()\">\n    Duplicate\n  </button>\n  <button class=\"context-menu-item\" (click)=\"contextMenuSplitRight()\">\n    Split Right\n  </button>\n  <div class=\"context-menu-separator\"></div>\n  <button class=\"context-menu-item\" (click)=\"contextMenuClose()\">Close</button>\n  <button\n    class=\"context-menu-item\"\n    (click)=\"contextMenuCloseOthers()\"\n    [disabled]=\"tabs.length <= 1\"\n  >\n    Close Others\n  </button>\n  <button class=\"context-menu-item\" (click)=\"contextMenuCloseToTheRight()\">\n    Close to the Right\n  </button>\n  <div class=\"context-menu-separator\"></div>\n  <button class=\"context-menu-item destructive\" (click)=\"contextMenuCloseAll()\">\n    Close All\n  </button>\n</div>\n","import { ICliPingServerService } from '@qodalis/cli-core';\n\nexport class CliDefaultPingServerService implements ICliPingServerService {\n    ping(): Promise<void> {\n        // Simulate a server ping\n        return new Promise((resolve) => setTimeout(resolve, 2000));\n    }\n}\n","import { Provider } from '@angular/core';\nimport { ICliPingServerService_TOKEN as CLI_PING_TOKEN } from './cli/tokens';\nimport { CliDefaultPingServerService } from './cli/services';\n\n/**\n * Angular DI providers for services that the framework-agnostic\n * processors in @qodalis/cli need. The CliComponent bridges these\n * into the engine's service container automatically.\n */\nexport const resolveCliProviders = (): Provider[] => {\n    return [\n        {\n            useClass: CliDefaultPingServerService,\n            provide: CLI_PING_TOKEN,\n        },\n    ];\n};\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CliComponent } from './cli/cli.component';\nimport { CollapsableContentComponent } from './collapsable-content/collapsable-content.component';\nimport { CliPanelComponent } from './cli-panel/cli-panel.component';\nimport { resolveCliProviders } from '.';\n\n@NgModule({\n    declarations: [\n        CliComponent,\n        CollapsableContentComponent,\n        CliPanelComponent,\n    ],\n    imports: [CommonModule],\n    providers: [resolveCliProviders()],\n    exports: [CliPanelComponent, CliComponent],\n})\nexport class CliModule {}\n","import { InjectionToken, Provider } from '@angular/core';\nimport { ICliCommandProcessor, ICliModule } from '@qodalis/cli-core';\nimport { CliCommandProcessor_TOKEN, CliModule_TOKEN } from '../cli/tokens';\n\nexport const resolveCliProvider = <T>(\n    token: InjectionToken<T>,\n    provider: new (...args: any[]) => T,\n): Provider => ({\n    provide: token,\n    useExisting: provider,\n    multi: true,\n});\n\n/**\n * @deprecated Use resolveCliModuleProvider() instead.\n */\nexport const resolveCommandProcessorProvider = <T extends ICliCommandProcessor>(\n    provider: new (...args: any[]) => T,\n): Provider => [\n    provider,\n    resolveCliProvider<T>(CliCommandProcessor_TOKEN, provider),\n];\n\n/**\n * Resolve an ICliModule into Angular providers.\n * Registers the module via CliModule_TOKEN and also registers processors\n * individually via CliCommandProcessor_TOKEN for backward compatibility.\n */\nexport const resolveCliModuleProvider = (module: ICliModule): Provider[] => {\n    const providers: Provider[] = [\n        {\n            provide: CliModule_TOKEN,\n            useValue: module,\n            multi: true,\n        },\n    ];\n\n    if (module.processors) {\n        for (const processor of module.processors) {\n            providers.push({\n                provide: CliCommandProcessor_TOKEN,\n                useValue: processor,\n                multi: true,\n            });\n        }\n    }\n\n    return providers;\n};\n","// Re-exports from @qodalis/cli for backwards compatibility\nexport {\n    CommandParser,\n    ParsedArg,\n    CommandParserOutput,\n} from './command-parser';\nexport { openLink, getGreetingBasedOnTime } from '@qodalis/cli';\n\nexport * from './dependency-injection';\n","/*\n * Public API Surface of @qodalis/angular-cli\n */\n\nexport * from './lib/cli.module';\n\nexport { resolveCliProviders } from './lib/index';\n\nexport * from './lib/cli/services';\n\nexport * from './lib/utils';\n\nexport * from './lib/cli/tokens';\n\nexport {\n    CliPanelComponent,\n    CliPanelOptions,\n} from './lib/cli-panel/cli-panel.component';\n\nexport { CliComponent } from './lib/cli/cli.component';\n\n// Re-exports from @qodalis/cli for convenience\nexport { CliEngine, CliEngineOptions } from '@qodalis/cli';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.CliComponent","i3.CollapsableContentComponent","CLI_PING_TOKEN"],"mappings":"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"}