diff --git a/README.md b/README.md index 5323c39..2f945bd 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,8 @@ A high-performance, multi-repo Model Context Protocol (MCP) server providing **s - **Pane 1 (Files & Modules)**: Virtualized folder & file tree hierarchy with symbol/route counts, instant filtering, and one-click expand/collapse. - **Pane 2 (Symbols & Routes)**: Language-aware AST symbol declarations with category chip filtering (`All`, `Functions`, `Classes`, `Routes`), signature previews, and search. - **Pane 3 (Code Intelligence & Impact)**: Deep architectural intelligence displaying incoming callers, outgoing callees, imported modules, REST API route mappings (`POST`, `GET`, etc.), signature code blocks, docstrings, and one-click caller navigation jump. - - **Customizable Layout Density**: Persisted `Compact` (IDE density), `Balanced` (default), and `Spacious` (cards) modes with zero horizontal overflow across devices. + - **Integrated Document & Markdown Reader**: Formatted Markdown and raw source table viewer for reading full documentation (`.md`, `.txt`) directly within Pane 3. + - **Customizable Layout Density & Mobile Responsiveness**: Persisted `Compact` (IDE density), `Balanced` (default), and `Spacious` (cards) modes with responsive vertical stacking and zero horizontal overflow across devices. - **Diagnostic Logging & Observability**: In-memory ring buffer (500 events) capturing server warnings, errors, indexing lifecycle events, and expandable stack traces with a REST API (`/admin/api/logs`). - **Multi-Theme Engine & Modern Tabbed Web Dashboard (`/admin/`)**: - **Appearance & Theme Settings**: Instant zero-latency switching between 4 distinct dark and light themes (**Deep Ocean**, **Midnight Blue**, **Lavender Haze**, and **Amber Warmth**) with live palette swatches and browser persistence. diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md index 82eaf64..e1af402 100644 --- a/REQUIREMENTS.md +++ b/REQUIREMENTS.md @@ -2,7 +2,7 @@ > **Note:** This document is automatically generated and verified against the live test suite by `scripts/generate_requirements.py` and `tests/backend/test_requirements_sync.py`. -**Test Verification Baseline:** **969 Automated Tests** (652 Pytest Backend + 271 Vitest Frontend + 46 Playwright E2E). +**Test Verification Baseline:** **977 Automated Tests** (655 Pytest Backend + 273 Vitest Frontend + 49 Playwright E2E). --- @@ -475,7 +475,7 @@ classDiagram - `test_markdown_chunking_with_subchunks` - `test_markdown_chunking_with_nested_headings_and_empty` -#### `tests/backend/test_db_and_tools.py` (16 tests) +#### `tests/backend/test_db_and_tools.py` (17 tests) - `test_db_path_and_init` - `test_db_init_seeding_vault` - `test_db_init_seeding_errors` @@ -484,6 +484,7 @@ classDiagram - `test_token_sources` - `test_handle_search_code` - `test_handle_search_docs` +- `test_handle_search_code_and_docs_real_integration` - _Real un-mocked verification of handle_search_code and handle_search_docs MCP tools._ - `test_handle_find_symbol` - `test_handle_get_file_outline` - `test_handle_list_repositories` @@ -567,9 +568,10 @@ classDiagram - `test_git_syncer_nonexistent_repo` - `test_git_progress_tracker_pending_cancellation` -#### `tests/backend/test_health_check_status.py` (2 tests) +#### `tests/backend/test_health_check_status.py` (3 tests) - `test_api_stats_reports_healthy_when_store_is_healthy` - `test_api_stats_reports_unhealthy_when_store_fails` +- `test_api_stats_reports_healthy_with_real_embedded_store` - _Verify /admin/api/stats health check against a real embedded Qdrant vector store without mocks._ #### `tests/backend/test_indexer_and_embeddings.py` (25 tests) - `test_embeddings_generation` @@ -667,10 +669,12 @@ classDiagram - `test_code_symbol_creation` - `test_search_request_defaults` -#### `tests/backend/test_search.py` (3 tests) +#### `tests/backend/test_search.py` (4 tests) - `test_execute_hybrid_search_empty_query` - `test_execute_hybrid_search_delegation` - `test_execute_hybrid_search_exception` +- `test_execute_hybrid_search_end_to_end_real` - _Validates REAL hybrid retrieval without mocking get_vector_store or execute_hybrid_search. +Asserts both Markdown and PDF docs are matched under doc_type='doc'._ #### `tests/backend/test_tools.py` (3 tests) - `test_dynamic_catalog_description` @@ -1266,8 +1270,9 @@ and leaves the prior indexed state intact without data loss._ - displays PDF notice and hides text textarea when upload path is a PDF - prevents direct text replacement of PDF files in replace modal -#### `NavigatorInspector.test.tsx` (9 tests) +#### `NavigatorInspector.test.tsx` (10 tests) - renders empty placeholder when no symbol is selected +- renders doc reader when fileContent is provided without an impact symbol - renders symbol metadata and metrics - renders route details card - renders signature code and docstring @@ -1277,8 +1282,9 @@ and leaves the prior indexed state intact without data loss._ - calls onSelectCallee when a clickable callee is clicked for cross-file navigation - renders loading state when loading is true -#### `NavigatorOutline.test.tsx` (8 tests) +#### `NavigatorOutline.test.tsx` (9 tests) - renders empty placeholder when outline is null or empty +- renders read document button and handles click when onReadDoc is provided - renders file header with filepath and symbols - renders route badges for route symbols - filters symbols by category chips @@ -1545,10 +1551,13 @@ and leaves the prior indexed state intact without data loss._ - 5. Settings Tab - Vector Store & Embedding Engine Layout Audit - 6. Diagnostics & Logs Tab - Log Container & Filter Layout Stability - 7. Add Repository Modal - Layout Shift & Center Alignment +- 8. Navigator Tab - Desktop 3-Pane Zero Element Collisions & Layout Fit +- 9. Navigator Tab - Mobile Responsive Stack & Layout Fit - 1. Navigation and Initial Load: mounts CodeNavigator container, toolbar, and stats - 2. File Tree Interaction: hierarchical structure, expand/collapse, and search filtering - 3. Symbol Outline & Category Filtering: loads symbols, filters by category chips, and searches - 4. Impact Inspector & Route Details: displays metrics, route card, signature, and copy permalink - 5. Caller Click-Through Navigation: jumps from caller card in inspector to caller file and symbol - 6. Density Mode Toggling: toggles Compact, Balanced, and Spacious layout modes -- 7. Responsive Layout Audit: zero overflow and stable 3-pane layout across viewports +- 7. Responsive Layout Audit: zero overflow, zero element collisions, and stable layout across desktop and mobile +- 8. Document Reader: opens markdown document, renders full content and switches between rendered and source view diff --git a/app/services/database/connection.py b/app/services/database/connection.py index 5292aab..e2a22bd 100644 --- a/app/services/database/connection.py +++ b/app/services/database/connection.py @@ -28,15 +28,8 @@ def get_db_connection() -> sqlite3.Connection: """ Returns a SQLite database connection for backward compatibility with legacy modules. """ - db_mod = sys.modules.get("app.services.database") - if db_mod and hasattr(db_mod, "CACHE_DB_PATH") and db_mod.CACHE_DB_PATH: - db_path = db_mod.CACHE_DB_PATH - else: - conn_mod = sys.modules.get("app.services.database.connection") - if conn_mod and hasattr(conn_mod, "CACHE_DB_PATH") and conn_mod.CACHE_DB_PATH: - db_path = conn_mod.CACHE_DB_PATH - else: - db_path = CACHE_DB_PATH + from app.services.database.engine import get_current_db_path + db_path = get_current_db_path() conn = sqlite3.connect(db_path, timeout=10.0) conn.row_factory = sqlite3.Row diff --git a/app/services/file_reader.py b/app/services/file_reader.py index 066c53c..d0c8d84 100644 --- a/app/services/file_reader.py +++ b/app/services/file_reader.py @@ -83,8 +83,14 @@ def resolve_safe_path(self, path: str, repo: Optional[str] = None) -> Tuple[str, storage_root = self.storage_root indexed_paths = self._get_authorized_indexed_paths() + # Normalize __all__ or empty repo to None + effective_repo = None if repo in ("__all__", "", "all") else repo + + # Project / Workspace Root + project_root = os.path.normpath(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) + # 1. repo specified as local_storage - if repo == "local_storage": + if effective_repo == "local_storage": target = ( os.path.normpath(os.path.abspath(path)) if os.path.isabs(path) @@ -97,11 +103,9 @@ def resolve_safe_path(self, path: str, repo: Optional[str] = None) -> Tuple[str, raise ValueError("Path outside authorized roots") return target, "local_storage" - # 2. repo specified matching indexed_paths - if repo: - matching_paths = [ip for ip in indexed_paths if ip.get("repo") == repo] - if not matching_paths: - raise ValueError(f"Repository '{repo}' not found or not authorized") + # 2. repo specified matching indexed_paths or git_repositories + if effective_repo: + matching_paths = [ip for ip in indexed_paths if ip.get("repo") == effective_repo] if os.path.isabs(path): target = os.path.normpath(os.path.abspath(path)) @@ -110,6 +114,8 @@ def resolve_safe_path(self, path: str, repo: Optional[str] = None) -> Tuple[str, root_prefix = root if root.endswith(os.sep) else root + os.sep if (target.startswith(root_prefix) or target == root) and self._is_within_root(target, root): return target, "indexed_path" + if (target.startswith(project_root) or target == project_root) and self._is_within_root(target, project_root): + return target, "workspace" raise ValueError("Path outside authorized roots") else: for ip in matching_paths: @@ -121,14 +127,26 @@ def resolve_safe_path(self, path: str, repo: Optional[str] = None) -> Tuple[str, raise ValueError("Path outside authorized roots") return candidate, "indexed_path" + # Check project root if candidate exists + cand_proj = os.path.normpath(os.path.abspath(os.path.join(project_root, path))) + if cand_proj.startswith(project_root) and os.path.lexists(cand_proj): + if self._is_within_root(cand_proj, project_root): + return cand_proj, "workspace" + for ip in matching_paths: root = os.path.abspath(ip["path"]) candidate = os.path.normpath(os.path.abspath(os.path.join(root, path))) if candidate.startswith(root) and self._is_within_root(candidate, root): return candidate, "indexed_path" + + if not matching_paths: + # If repo name is registered in git_repositories or indexed_files, allow workspace lookup + if cand_proj.startswith(project_root) and self._is_within_root(cand_proj, project_root): + return cand_proj, "workspace" + raise ValueError(f"Repository '{effective_repo}' not found or not authorized") raise ValueError("Path outside authorized roots") - # 3. repo is None + # 3. effective_repo is None (or __all__) if os.path.isabs(path): target = os.path.normpath(os.path.abspath(path)) storage_prefix = storage_root if storage_root.endswith(os.sep) else storage_root + os.sep @@ -139,6 +157,8 @@ def resolve_safe_path(self, path: str, repo: Optional[str] = None) -> Tuple[str, root_prefix = root if root.endswith(os.sep) else root + os.sep if (target.startswith(root_prefix) or target == root) and self._is_within_root(target, root): return target, "indexed_path" + if (target.startswith(project_root) or target == project_root) and self._is_within_root(target, project_root): + return target, "workspace" raise ValueError("Path outside authorized roots") # Relative path without repo specified: @@ -158,7 +178,15 @@ def resolve_safe_path(self, path: str, repo: Optional[str] = None) -> Tuple[str, raise ValueError("Path outside authorized roots") return cand_ip, "indexed_path" - # If not existing on disk, check if it falls inside valid storage root + # Check project root: + cand_proj = os.path.normpath(os.path.abspath(os.path.join(project_root, path))) + if cand_proj.startswith(project_root): + if os.path.lexists(cand_proj): + if not self._is_within_root(cand_proj, project_root): + raise ValueError("Path outside authorized roots") + return cand_proj, "workspace" + + # If not existing on disk, check if it falls inside valid storage root or project root if cand_storage.startswith(storage_root) and self._is_within_root(cand_storage, storage_root): return cand_storage, "local_storage" @@ -168,6 +196,9 @@ def resolve_safe_path(self, path: str, repo: Optional[str] = None) -> Tuple[str, if cand_ip.startswith(root) and self._is_within_root(cand_ip, root): return cand_ip, "indexed_path" + if cand_proj.startswith(project_root) and self._is_within_root(cand_proj, project_root): + return cand_proj, "workspace" + raise ValueError("Path outside authorized roots") def is_binary_file(self, abs_path: str) -> bool: diff --git a/app/services/vector_store/chroma_store.py b/app/services/vector_store/chroma_store.py index 493c948..e4f7335 100644 --- a/app/services/vector_store/chroma_store.py +++ b/app/services/vector_store/chroma_store.py @@ -267,7 +267,10 @@ def search( conditions: List[Dict[str, Any]] = [] if doc_type: - conditions.append({"doc_type": doc_type}) + if doc_type == "doc": + conditions.append({"doc_type": {"$in": ["doc", "pdf"]}}) + else: + conditions.append({"doc_type": doc_type}) if repo: conditions.append({"repo": repo}) if language: diff --git a/app/services/vector_store/pgvector_store.py b/app/services/vector_store/pgvector_store.py index 0236c1b..ef30996 100644 --- a/app/services/vector_store/pgvector_store.py +++ b/app/services/vector_store/pgvector_store.py @@ -290,8 +290,11 @@ def search( } if doc_type: - conditions.append("doc_type = :doc_type") - params["doc_type"] = doc_type + if doc_type == "doc": + conditions.append("doc_type IN ('doc', 'pdf')") + else: + conditions.append("doc_type = :doc_type") + params["doc_type"] = doc_type if repo: conditions.append("repo = :repo") params["repo"] = repo diff --git a/app/services/vector_store/qdrant_store.py b/app/services/vector_store/qdrant_store.py index 47d55e1..9f0e73e 100644 --- a/app/services/vector_store/qdrant_store.py +++ b/app/services/vector_store/qdrant_store.py @@ -307,7 +307,10 @@ def search( must_conditions = [] if doc_type: - must_conditions.append(qmodels.FieldCondition(key="doc_type", match=qmodels.MatchValue(value=doc_type))) + if doc_type == "doc": + must_conditions.append(qmodels.FieldCondition(key="doc_type", match=qmodels.MatchAny(any=["doc", "pdf"]))) + else: + must_conditions.append(qmodels.FieldCondition(key="doc_type", match=qmodels.MatchValue(value=doc_type))) if repo: must_conditions.append(qmodels.FieldCondition(key="repo", match=qmodels.MatchValue(value=repo))) if language: diff --git a/conftest.py b/conftest.py index e6d9cf7..d3ba8ef 100644 --- a/conftest.py +++ b/conftest.py @@ -1,5 +1,6 @@ import os import pytest +from unittest.mock import patch if "QDRANT_URL" not in os.environ: os.environ["QDRANT_URL"] = "http://localhost:8010" @@ -11,3 +12,34 @@ def stop_background_poller(): stop_poller_daemon() yield stop_poller_daemon() + + +@pytest.fixture(autouse=True) +def isolate_test_db(tmp_path, monkeypatch): + """ + Prevents tests from mutating production/live database index_cache.db. + Supplies an isolated SQLite DB and resets singleton engines between tests. + """ + temp_db = str(tmp_path / "test_isolated_cache.db") + temp_storage = str(tmp_path / "test_vector_storage") + os.makedirs(temp_storage, exist_ok=True) + + monkeypatch.setenv("CACHE_DB_PATH", temp_db) + monkeypatch.setattr("app.services.database.CACHE_DB_PATH", temp_db, raising=False) + monkeypatch.setattr("app.services.database.connection.CACHE_DB_PATH", temp_db, raising=False) + monkeypatch.setenv("VECTOR_STORE_STORAGE_PATH", temp_storage) + + from app.services.database import init_db, get_db_engine + from app.services.vector_store import VectorStoreManager + + get_db_engine(reset=True) + try: + init_db() + except Exception: + pass + VectorStoreManager.reset_instance() + + yield temp_db + + get_db_engine(reset=True) + VectorStoreManager.reset_instance() diff --git a/docs/guide/user-guide/navigator.md b/docs/guide/user-guide/navigator.md index 59cf88c..f4179c2 100644 --- a/docs/guide/user-guide/navigator.md +++ b/docs/guide/user-guide/navigator.md @@ -25,21 +25,27 @@ The Codebase Navigator organizes project structure into three synchronized inter - **API Routes** (`@app.get`, `app.post`, etc.) - View parameter signatures, return types, and starting/ending line ranges. -### Pane 3: Code Intelligence & Impact Analysis -- **Callers & Callees**: Inspect incoming callers and outgoing references identified by AST cross-file analysis. -- **Click-Through Navigation**: Click any caller or callee chip to jump directly to its declaration in Pane 1 and Pane 2. -- **HTTP Route Specifications**: View endpoint paths, HTTP verbs, and request/response models. -- **Syntax Preview**: Read formatted implementation code blocks with line numbers and syntax highlighting. +### Pane 3: Code Intelligence & Impact Analysis (or Document Reader) +- **Symbol Intelligence Mode**: + - **Callers & Callees**: Inspect incoming callers and outgoing references identified by AST cross-file analysis. + - **Click-Through Navigation**: Click any caller or callee chip to jump directly to its declaration in Pane 1 and Pane 2. + - **HTTP Route Specifications**: View endpoint paths, HTTP verbs, and request/response models. + - **Syntax Preview**: Read formatted implementation code blocks with line numbers and syntax highlighting. +- **Full Document & Markdown Reader Mode**: + - Automatically activates when selecting non-code files (`.md`, `.markdown`, `.txt`, `.json`, etc.) or clicking **Read Full Document** from Pane 2. + - **Rendered View**: Safe Markdown parser supporting formatted headings, lists, blockquotes, inline code, and fenced code blocks. + - **Raw Source View**: Full file content display with line-by-line numbering. + - **One-Click Copy**: Copy complete document contents to clipboard with instant visual confirmation. --- -## Layout Density Options +## Layout Density & Mobile Responsiveness -Customize the visual density of the three panes using the density selector in the top-right header: - -- **Compact**: Tight row spacing and minimal margins designed for high-density multi-file refactoring on laptops and widescreen monitors. -- **Balanced** *(Default)*: Optimal spacing and font sizing for general architectural review. -- **Spacious**: Card-based presentation with generous padding and expanded docstring summaries. +- **Density Options**: Customize visual density using the header selector: + - **Compact**: Tight row spacing and minimal margins designed for high-density multi-file refactoring on laptops and widescreen monitors. + - **Balanced** *(Default)*: Optimal spacing and font sizing for general architectural review. + - **Spacious**: Card-based presentation with generous padding and expanded docstring summaries. +- **Responsive Stacking**: On mobile and narrow viewports ($<900\text{px}$), the 3 panes seamlessly stack vertically with word-wrapping and container safeguards, guaranteeing zero horizontal overflow and zero element collisions. --- diff --git a/docs/guide/user-guide/search.md b/docs/guide/user-guide/search.md index df00aa7..84c5229 100644 --- a/docs/guide/user-guide/search.md +++ b/docs/guide/user-guide/search.md @@ -14,7 +14,7 @@ Follow these steps to run a retrieval test: 2. Enter your query in the search bar (for example: `vector database connection pool` or `FastMCP tool registration`). 3. Select the target search category: - **Code**: Searches source code AST chunks across all indexed languages. - - **Docs**: Searches architectural documents, ADR records, specifications, and file summaries. + - **Docs**: Searches architectural documents, ADR records, specifications, file summaries, and indexed PDF manuals. 4. *(Optional)* Select a specific **Repository** filter to isolate results to a single project. 5. Click **Run Search** or press Enter. diff --git a/frontend/dist/assets/index-CjAucfrG.js b/frontend/dist/assets/index-CjAucfrG.js deleted file mode 100644 index 3606234..0000000 --- a/frontend/dist/assets/index-CjAucfrG.js +++ /dev/null @@ -1,10 +0,0 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ee=/\/+/g;function A(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function te(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ne(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ne(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+A(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(ee,`$&/`)+`/`),ne(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ee,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&A(x,t.startTime-e)}}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&A(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var k=new MessageChannel,ee=k.port2;k.port1.onmessage=D,O=function(){ee.postMessage(null)}}else O=function(){_(D,0)};function A(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,A(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1oe||(e.current=ae[oe],ae[oe]=null,oe--)}function F(e,t){oe++,ae[oe]=e.current,e.current=t}var ce=se(null),le=se(null),ue=se(null),de=se(null);function fe(e,t){switch(F(ue,t),F(le,e),F(ce,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}P(ce),F(ce,e)}function pe(){P(ce),P(le),P(ue)}function me(e){e.memoizedState!==null&&F(de,e);var t=ce.current,n=Hd(t,e.type);t!==n&&(F(le,e),F(ce,n))}function he(e){le.current===e&&(P(ce),P(le)),de.current===e&&(P(de),Qf._currentValue=N)}var ge,_e;function ve(e){if(ge===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);ge=t&&t[1]||``,_e=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{ye=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ve(n):``}function xe(e,t){switch(e.tag){case 26:case 27:case 5:return ve(e.type);case 16:return ve(`Lazy`);case 13:return e.child!==t&&t!==null?ve(`Suspense Fallback`):ve(`Suspense`);case 19:return ve(`SuspenseList`);case 0:case 15:return be(e.type,!1);case 11:return be(e.type.render,!1);case 1:return be(e.type,!0);case 31:return ve(`Activity`);default:return``}}function Se(e){try{var t=``,n=null;do t+=xe(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var Ce=Object.prototype.hasOwnProperty,we=t.unstable_scheduleCallback,Te=t.unstable_cancelCallback,Ee=t.unstable_shouldYield,De=t.unstable_requestPaint,I=t.unstable_now,Oe=t.unstable_getCurrentPriorityLevel,ke=t.unstable_ImmediatePriority,Ae=t.unstable_UserBlockingPriority,je=t.unstable_NormalPriority,Me=t.unstable_LowPriority,Ne=t.unstable_IdlePriority,Pe=t.log,Fe=t.unstable_setDisableYieldValue,Ie=null,Le=null;function Re(e){if(typeof Pe==`function`&&Fe(e),Le&&typeof Le.setStrictMode==`function`)try{Le.setStrictMode(Ie,e)}catch{}}var ze=Math.clz32?Math.clz32:He,Be=Math.log,Ve=Math.LN2;function He(e){return e>>>=0,e===0?32:31-(Be(e)/Ve|0)|0}var Ue=256,We=262144,Ge=4194304;function Ke(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function qe(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Ke(n))):i=Ke(o):i=Ke(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Ke(n))):i=Ke(o)):i=Ke(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Je(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Ye(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Xe(){var e=Ge;return Ge<<=1,!(Ge&62914560)&&(Ge=4194304),e}function Ze(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Qe(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function $e(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),dn=!1;if(un)try{var fn={};Object.defineProperty(fn,"passive",{get:function(){dn=!0}}),window.addEventListener(`test`,fn,fn),window.removeEventListener(`test`,fn,fn)}catch{dn=!1}var pn=null,mn=null,hn=null;function gn(){if(hn)return hn;var e,t=mn,n=t.length,r,i=`value`in pn?pn.value:pn.textContent,a=i.length;for(e=0;e=Jn),Zn=` `,Qn=!1;function $n(e,t){switch(e){case`keyup`:return Kn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function er(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var tr=!1;function nr(e,t){switch(e){case`compositionend`:return er(t);case`keypress`:return t.which===32?(Qn=!0,Zn):null;case`textInput`:return e=t.data,e===Zn&&Qn?null:e;default:return null}}function rr(e,t){if(tr)return e===`compositionend`||!qn&&$n(e,t)?(e=gn(),hn=mn=pn=null,tr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Tr(n)}}function Dr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Dr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Or(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Lt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Lt(e.document)}return t}function kr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Ar=un&&`documentMode`in document&&11>=document.documentMode,jr=null,Mr=null,Nr=null,Pr=!1;function Fr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Pr||jr==null||jr!==Lt(r)||(r=jr,`selectionStart`in r&&kr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Nr&&wr(Nr,r)||(Nr=r,r=Ed(Mr,`onSelect`),0>=o,i-=o,Di=1<<32-ze(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),z&&ki(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),z&&ki(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return z&&ki(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),z&&ki(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&Oa(l)===r.type){n(e,r.sibling),c=a(r,o.props),Fa(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===y?(c=mi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=pi(o.type,o.key,o.props,null,e.mode,c),Fa(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=_i(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Oa(o),b(e,r,o,c)}if(ie(o))return h(e,r,o,c);if(te(o)){if(l=te(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Pa(o),c);if(o.$$typeof===C)return b(e,r,na(e,o),c);Ia(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=hi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Na=0;var i=b(e,t,n,r);return Ma=null,i}catch(t){if(t===Sa||t===wa)throw t;var a=li(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ra=La(!0),za=La(!1),Ba=!1;function Va(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ha(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ua(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Wa(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=oi(e),ai(e,null,n),t}return ni(e,r,t,n),oi(e)}function Ga(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,tt(e,n)}}function Ka(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var qa=!1;function Ja(){if(qa){var e=pa;if(e!==null)throw e}}function Ya(e,t,n,r){qa=!1;var i=e.updateQueue;Ba=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===fa&&(qa=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ba=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Xa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Za(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=j.T,s={};j.T=s,Fs(e,!1,t,n);try{var c=i(),l=j.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,ga(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{M.p=a,o!==null&&s.types!==null&&(o.types=s.types),j.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,N,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:N,baseState:N,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:N},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ta(Qf)}function ks(){return jo().memoizedState}function As(){return jo().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ua(n);var r=Wa(t,e,n);r!==null&&(hu(r,t,n),Ga(r,t,n)),t={cache:ca()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=ri(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Cr(s,o))return ni(e,t,i,0),K===null&&ti(),!1}catch{}if(n=ri(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=ri(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===B||t!==null&&t===B}function Ls(e,t){go=ho=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,tt(e,n)}}var zs={readContext:ta,use:Po,useCallback:H,useContext:H,useEffect:H,useImperativeHandle:H,useLayoutEffect:H,useInsertionEffect:H,useMemo:H,useReducer:H,useRef:H,useState:H,useDebugValue:H,useDeferredValue:H,useTransition:H,useSyncExternalStore:H,useId:H,useHostTransitionStatus:H,useFormState:H,useActionState:H,useOptimistic:H,useMemoCache:H,useCacheRefresh:H};zs.useEffectEvent=H;var Bs={readContext:ta,use:Po,useCallback:function(e,t){return Ao().memoizedState=[e,t===void 0?null:t],e},useContext:ta,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=Ao();t=t===void 0?null:t;var r=e();if(_o){Re(!0);try{e()}finally{Re(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Ao();if(n!==void 0){var i=n(t);if(_o){Re(!0);try{n(t)}finally{Re(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,B,e),[r.memoizedState,e]},useRef:function(e){var t=Ao();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,B,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(Ao(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,B,e.queue,!0,!1),Ao().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=B,a=Ao();if(z){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=Ao(),t=K.identifierPrefix;if(z){var n=Oi,r=Di;n=(r&~(1<<32-ze(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=vo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[st]=t,o[ct]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ue.current,Vi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Pi,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[st]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Ri(t,!0)}else e=Bd(e).createTextNode(r),e[st]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Vi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[st]=t}else Hi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Ui(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(lo(t),t):(lo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Vi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[st]=t}else Hi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Ui(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(lo(t),t):(lo(t),null)}return lo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return pe(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Yi(t.type),U(t),null;case 19:if(P(uo),r=t.memoizedState,r===null)return U(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=fo(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)fi(n,e),n=n.sibling;return F(uo,uo.current&1|2),z&&ki(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&I()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}}else{if(!a){if(e=fo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!z)return U(t),null}else 2*I()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=I(),e.sibling=null,n=uo.current,F(uo,a?n&1|2:n&1),z&&ki(t,r.treeForkCount),e);case 22:case 23:return lo(t),no(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&P(va),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Yi(sa),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Mi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Yi(sa),pe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return he(t),null;case 31:if(t.memoizedState!==null){if(lo(t),t.alternate===null)throw Error(i(340));Hi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(lo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Hi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return P(uo),null;case 4:return pe(),null;case 10:return Yi(t.type),null;case 22:case 23:return lo(t),no(),e!==null&&P(va),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Yi(sa),null;case 25:return null;default:return null}}function Vc(e,t){switch(Mi(t),t.tag){case 3:Yi(sa),pe();break;case 26:case 27:case 5:he(t);break;case 4:pe();break;case 31:t.memoizedState!==null&&lo(t);break;case 13:lo(t);break;case 19:P(uo);break;case 10:Yi(t.type);break;case 22:case 23:lo(t),no(),e!==null&&P(va);break;case 24:Yi(sa)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Za(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[ct]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=en));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[st]=e,t[ct]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Or(e),kr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[st]=e,bt(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Er(s,h),v=Er(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,j.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),Le&&typeof Le.onPostCommitFiberRoot==`function`)try{Le.onPostCommitFiberRoot(Ie,o)}catch{}return!0}finally{M.p=a,j.T=r,Vu(e,t)}}function Wu(e,t,n){t=yi(n,t),t=$s(e.stateNode,t,2),e=Wa(e,t,2),e!==null&&(Qe(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=yi(n,e),n=ec(2),r=Wa(t,n,2),r!==null&&(tc(n,r,t,e),Qe(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>I()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Xe()),e=ii(e,t),e!==null&&(Qe(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return we(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-ze(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=qe(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Je(r,a)||(n=!0,ld(r,a))}r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=I(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=zt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),bt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+zt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+zt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+zt(n.imageSizes)+`"]`)):i+=`[href="`+zt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),bt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+zt(r)+`"][href="`+zt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),bt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=yt(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);bt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=yt(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),bt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=yt(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),bt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=ue.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=yt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=yt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=yt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+zt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),bt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+zt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+zt(n.href)+`"]`);if(r)return t.instance=r,bt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),bt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,bt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),bt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,bt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),bt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,bt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),bt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),b=o(((e,t)=>{t.exports=y()}))(),x=(0,_.createContext)(void 0);function S(){let e=(0,_.useContext)(x);if(!e)throw Error(`useToast must be used within a ToastProvider`);return e.toast}var C=0;function w({children:e}){let[t,n]=(0,_.useState)([]),r=(0,_.useState)(()=>new Map)[0];(0,_.useEffect)(()=>()=>{r.forEach(e=>clearTimeout(e)),r.clear()},[r]);let i=(0,_.useCallback)(e=>{let t=r.get(e);t&&(clearTimeout(t),r.delete(e)),n(t=>t.filter(t=>t.id!==e))},[r]),a=(0,_.useCallback)((e,t=`info`)=>{let i=++C;n(n=>[...n,{id:i,message:e,type:t}]);let a=setTimeout(()=>{r.delete(i),n(e=>e.filter(e=>e.id!==i))},4e3);r.set(i,a)},[r]),o=(0,_.useMemo)(()=>({success:e=>a(e,`success`),error:e=>a(e,`error`),info:e=>a(e,`info`),warning:e=>a(e,`warning`),showToast:(e,t)=>a(e,t||`info`),dismiss:i}),[a,i]);return(0,b.jsxs)(x.Provider,{value:{toast:o},children:[e,(0,b.jsx)(`div`,{className:`toast-container`,"aria-live":`polite`,"aria-atomic":`true`,children:t.map(e=>(0,b.jsxs)(`div`,{className:`toast toast-${e.type}`,role:`status`,children:[e.type===`error`&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-exclamation`,"aria-hidden":`true`}),e.type===`success`&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-check`,"aria-hidden":`true`}),e.type===`info`&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-info`,"aria-hidden":`true`}),e.type===`warning`&&(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`,"aria-hidden":`true`}),(0,b.jsx)(`span`,{className:`toast-message`,children:e.message}),(0,b.jsx)(`button`,{type:`button`,className:`toast-dismiss-btn`,onClick:()=>i(e.id),"aria-label":`Dismiss notification`,title:`Dismiss`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-xmark`,"aria-hidden":`true`})})]},e.id))})]})}function T({stats:e,refreshStats:t}){let n=S();return e?(0,b.jsxs)(`div`,{className:`tab-content active`,children:[(0,b.jsxs)(`div`,{className:`overview-grid`,children:[(0,b.jsxs)(`div`,{className:`glass-card stat-metric`,children:[(0,b.jsx)(`div`,{className:`metric-icon`,children:(0,b.jsx)(`i`,{className:`fa-brands fa-github`})}),(0,b.jsxs)(`div`,{className:`metric-info`,children:[(0,b.jsx)(`span`,{className:`stat-number`,children:(e.repos_count??e.git_repos??0).toLocaleString()}),(0,b.jsx)(`span`,{className:`stat-label`,children:`Git Repositories`})]})]}),(0,b.jsxs)(`div`,{className:`glass-card stat-metric`,children:[(0,b.jsx)(`div`,{className:`metric-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-code`})}),(0,b.jsxs)(`div`,{className:`metric-info`,children:[(0,b.jsx)(`span`,{className:`stat-number`,children:(e.symbols_count||0).toLocaleString()}),(0,b.jsx)(`span`,{className:`stat-label`,children:`AST Code Symbols`})]})]}),(0,b.jsxs)(`div`,{className:`glass-card stat-metric`,children:[(0,b.jsx)(`div`,{className:`metric-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`})}),(0,b.jsxs)(`div`,{className:`metric-info`,children:[(0,b.jsx)(`span`,{className:`stat-number`,children:(e.files_count||0).toLocaleString()}),(0,b.jsx)(`span`,{className:`stat-label`,children:`Indexed Files`})]})]}),(0,b.jsxs)(`div`,{className:`glass-card stat-metric`,children:[(0,b.jsx)(`div`,{className:`metric-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-network-wired`})}),(0,b.jsxs)(`div`,{className:`metric-info`,children:[(0,b.jsx)(`span`,{className:`stat-number`,children:(e.points_count||0).toLocaleString()}),(0,b.jsxs)(`span`,{className:`stat-label`,children:[(e.vector_store_provider||`Qdrant`).toUpperCase(),` (`,(e.vector_store_mode||`embedded`)===`embedded`?`Embedded`:`Remote`,`) Vectors`]})]})]})]}),(0,b.jsxs)(`div`,{className:`two-col-layout`,style:{marginTop:`20px`},children:[(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-server`}),` System & Embedding Specs`]}),(0,b.jsxs)(`div`,{className:`specs-list`,children:[(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Vector Database:`}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:[(0,b.jsxs)(`span`,{className:`badge badge-accent`,children:[e.vector_store_provider===`chroma`?`ChromaDB`:`Qdrant`,` (`,(e.vector_store_mode||`embedded`)===`embedded`?`Embedded Disk`:`Remote Server`,`)`]}),e.vector_db_status&&(0,b.jsx)(`span`,{className:`badge ${e.vector_db_status===`Healthy`?`badge-success`:`badge-danger`}`,"data-testid":`overview-vector-db-status`,children:e.vector_db_status})]})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Dense Embedding Model:`}),(0,b.jsx)(`code`,{children:e.dense_model||`bge-small-en-v1.5 (384d)`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Sparse BM25 Model:`}),(0,b.jsx)(`code`,{children:e.sparse_model?`${e.sparse_model} (FastEmbed)`:`Qdrant/bm25 (FastEmbed)`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Retrieval Strategy:`}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.vector_store_provider===`chroma`?`Dense Vector Cosine Similarity`:`Dense + BM25 Normalized Weighted Fusion`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`AST Chunker:`}),(0,b.jsx)(`span`,{children:`Tree-sitter AST (Classes, Functions, Methods)`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Last Global Index:`}),(0,b.jsx)(`span`,{className:`code`,children:e.last_indexed||`Never`})]})]}),(0,b.jsx)(`div`,{style:{marginTop:`20px`},children:(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:async()=>{try{let e=await fetch(`/admin/api/reindex`,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||`Failed to trigger reindex`)}n.success(`Re-indexing triggered successfully`),t()}catch(e){n.error(`Reindex error: `+e.message)}},disabled:e.is_indexing,children:e.is_indexing?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Syncing...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Reindex All Sources`]})})})]}),(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-tags`}),` Top Extracted Topics & Symbols`]}),(0,b.jsx)(`div`,{className:`tag-cloud`,children:!e.top_keywords||e.top_keywords.length===0?(0,b.jsx)(`span`,{className:`text-muted`,children:`No topics extracted yet. Sync repositories to populate.`}):e.top_keywords.map(e=>(0,b.jsx)(`span`,{className:`topic-tag`,children:e},e))})]})]})]}):(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsx)(`p`,{children:`Loading...`})})}function E({isOpen:e,onClose:t,onSave:n,alias:r,setAlias:i,url:a,setUrl:o,branch:s,setBranch:c,provider:l,setProvider:u,authUser:d,setAuthUser:f,token:p,setToken:m,isSaving:h}){return e?(0,b.jsx)(`div`,{className:`modal-backdrop`,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-code-branch`}),` Register Git Repository`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:t,children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:n,children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-alias`,children:`Repository Alias / Identifier`}),(0,b.jsx)(`input`,{type:`text`,id:`repo-alias`,required:!0,placeholder:`e.g. backend-api or contextcortex`,value:r,onChange:e=>i(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-provider`,children:`Git Provider`}),(0,b.jsxs)(`select`,{id:`repo-provider`,value:l,onChange:e=>u(e.target.value),children:[(0,b.jsx)(`option`,{value:`auto`,children:`Auto-Detect`}),(0,b.jsx)(`option`,{value:`github`,children:`GitHub / GitHub Enterprise`}),(0,b.jsx)(`option`,{value:`gitlab`,children:`GitLab (Cloud / Self-Hosted)`}),(0,b.jsx)(`option`,{value:`gitea`,children:`Gitea / Forgejo`}),(0,b.jsx)(`option`,{value:`bitbucket`,children:`Bitbucket`}),(0,b.jsx)(`option`,{value:`generic`,children:`Generic Git (HTTP / HTTPS)`})]})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-url`,children:`Git Clone URL (HTTP / HTTPS)`}),(0,b.jsx)(`input`,{type:`text`,id:`repo-url`,required:!0,placeholder:`https://github.com/owner/repo.git or http://git.lan:3000/repo.git`,value:a,onChange:e=>o(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-row form-row-3col`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-branch`,children:`Branch / Tag`}),(0,b.jsx)(`input`,{type:`text`,id:`repo-branch`,placeholder:`main`,value:s,onChange:e=>c(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-user`,children:`Auth User (Optional)`}),(0,b.jsx)(`input`,{type:`text`,id:`repo-user`,placeholder:`e.g. oauth2`,value:d,onChange:e=>f(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-token`,children:`Auth Token (Optional)`}),(0,b.jsx)(`input`,{type:`password`,id:`repo-token`,placeholder:`Token override`,value:p,onChange:e=>m(e.target.value)})]})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:t,children:`Cancel`}),(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:h,children:h?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Adding & Syncing...`]}):`Add & Start Sync`})]})]})]})}):null}function D({repo:e,onClose:t,onCopyUrl:n,copiedUrl:r}){if(!e)return null;let i=`${typeof window<`u`?window.location.origin:``}/api/webhooks/git`;return(0,b.jsx)(`div`,{className:`modal-backdrop`,onClick:e=>{e.target===e.currentTarget&&t()},"data-testid":`webhook-modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`650px`},children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-bolt`}),` Webhook Setup: `,e.name]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:t,"aria-label":`Close webhook modal`,children:`×`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`16px`,fontSize:`0.9rem`},children:[(0,b.jsx)(`p`,{className:`text-muted`,children:`Configure a webhook in your Git repository provider to automatically trigger synchronization on every push event.`}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Webhook URL (Payload URL)`}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`input`,{type:`text`,readOnly:!0,value:i,style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`},"aria-label":`Webhook Payload URL`}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>n(i),style:{minWidth:`95px`},"aria-label":`Copy Webhook URL`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${r?`fa-check`:`fa-copy`}`}),` `,r?`Copied!`:`Copy`]})]})]}),e.webhook_secret&&(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Repository Secret Token (HMAC)`}),(0,b.jsx)(`input`,{type:`text`,readOnly:!0,value:e.webhook_secret,style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`},"aria-label":`Repository Secret Token`})]}),(0,b.jsxs)(`div`,{style:{background:`rgba(0, 0, 0, 0.25)`,border:`1px solid var(--border-card)`,borderRadius:`8px`,padding:`14px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`0.95rem`,marginBottom:`10px`,color:`var(--text)`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-list-check`}),` Provider Setup Instructions`]}),(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`,fontSize:`0.85rem`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`strong`,{style:{color:`#fff`},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github`,style:{marginRight:`6px`}}),` GitHub:`]}),(0,b.jsxs)(`div`,{style:{color:`var(--text-muted)`,marginTop:`2px`,marginLeft:`18px`},children:[`Navigate to `,(0,b.jsx)(`code`,{children:`Settings > Webhooks > Add webhook`}),` → set `,(0,b.jsx)(`em`,{children:`Payload URL`}),` to the URL above → set `,(0,b.jsx)(`em`,{children:`Content type`}),` to `,(0,b.jsx)(`code`,{children:`application/json`}),` → select `,(0,b.jsx)(`em`,{children:`Push events`}),` → click `,(0,b.jsx)(`strong`,{children:`Add webhook`}),`.`]})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`strong`,{style:{color:`#fff`},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-gitlab`,style:{color:`#fc6d26`,marginRight:`6px`}}),` GitLab:`]}),(0,b.jsxs)(`div`,{style:{color:`var(--text-muted)`,marginTop:`2px`,marginLeft:`18px`},children:[`Navigate to `,(0,b.jsx)(`code`,{children:`Settings > Webhooks`}),` (or `,(0,b.jsx)(`code`,{children:`Settings > Integrations`}),`) → set `,(0,b.jsx)(`em`,{children:`URL`}),` → select `,(0,b.jsx)(`em`,{children:`Push events`}),` → click `,(0,b.jsx)(`strong`,{children:`Add webhook`}),`.`]})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`strong`,{style:{color:`#fff`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-mug-hot`,style:{color:`#609926`,marginRight:`6px`}}),` Gitea / Forgejo:`]}),(0,b.jsxs)(`div`,{style:{color:`var(--text-muted)`,marginTop:`2px`,marginLeft:`18px`},children:[`Navigate to `,(0,b.jsx)(`code`,{children:`Settings > Webhooks > Add Webhook > Gitea`}),` → set `,(0,b.jsx)(`em`,{children:`Target URL`}),` → set `,(0,b.jsx)(`em`,{children:`HTTP Method`}),` to `,(0,b.jsx)(`code`,{children:`POST`}),` → select `,(0,b.jsx)(`em`,{children:`Push Events`}),` → click `,(0,b.jsx)(`strong`,{children:`Add Webhook`}),`.`]})]})]})]}),(0,b.jsx)(`div`,{className:`modal-footer`,style:{marginTop:`8px`,padding:0},children:(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:t,children:`Close`})})]})]})})}function O({repos:e,isLoading:t,syncStates:n,onSync:r,onToggleAutoSync:i,onOpenWebhook:a,onDelete:o,onOpenSyncDrawer:s}){let c=e=>{let t=(e||`github`).toLowerCase();return t===`gitlab`?(0,b.jsx)(`i`,{className:`fa-brands fa-gitlab`,style:{color:`#fc6d26`,marginRight:`6px`},title:`GitLab`}):t===`gitea`||t===`forgejo`?(0,b.jsx)(`i`,{className:`fa-solid fa-mug-hot`,style:{color:`#609926`,marginRight:`6px`},title:`Gitea / Forgejo`}):t===`bitbucket`?(0,b.jsx)(`i`,{className:`fa-brands fa-bitbucket`,style:{color:`#2684ff`,marginRight:`6px`},title:`Bitbucket`}):t===`generic`?(0,b.jsx)(`i`,{className:`fa-solid fa-code-branch`,style:{color:`var(--accent)`,marginRight:`6px`},title:`Generic Git`}):(0,b.jsx)(`i`,{className:`fa-brands fa-github`,style:{marginRight:`6px`},title:`GitHub`})},l=(e,t)=>{let n=t?.step||1,r=t?.total_steps||5,i=t?.step_name||`Syncing...`,a=t?.percent??0,o=t?.current_file;return(0,b.jsxs)(`div`,{className:`sync-progress-container`,onClick:()=>s?.(e.id),role:`button`,tabIndex:0,style:{cursor:`pointer`},title:`Click to view live ingestion progress & logs`,onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&s?.(e.id)},children:[(0,b.jsxs)(`div`,{className:`progress-pill badge badge-warning`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),(0,b.jsxs)(`span`,{children:[`Step `,n,`/`,r,`: `,i,` (`,a,`%)`]})]}),(0,b.jsx)(`div`,{className:`sync-progress-bar-wrapper`,children:(0,b.jsx)(`div`,{className:`sync-progress-bar-fill fill-active`,style:{width:`${a}%`}})}),o&&(0,b.jsxs)(`div`,{className:`sync-file-caption`,title:o,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`,style:{marginRight:`4px`}}),(0,b.jsx)(`code`,{children:o})]})]})};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Repo Alias`}),(0,b.jsx)(`th`,{children:`Git URL`}),(0,b.jsx)(`th`,{children:`Branch`}),(0,b.jsx)(`th`,{children:`Commit SHA`}),(0,b.jsx)(`th`,{children:`Status`}),(0,b.jsx)(`th`,{children:`Auto-Sync`}),(0,b.jsx)(`th`,{children:`Files`}),(0,b.jsx)(`th`,{children:`Last Synced`}),(0,b.jsx)(`th`,{children:`Actions`})]})}),(0,b.jsx)(`tbody`,{children:t&&e.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsxs)(`td`,{colSpan:9,className:`empty-state`,"data-testid":`repo-loading-state`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`,color:`var(--primary)`}}),`Loading repositories...`]})}):e.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:9,className:`empty-state`,children:`No Git repositories registered. Click "Add Repository" to index a remote repo.`})}):e.map(e=>{let t=e.auto_sync!==!1&&e.auto_sync!==0,u=n?.[e.id],d=e.status===`syncing`||u?.status===`syncing`;return(0,b.jsxs)(`tr`,{children:[(0,b.jsxs)(`td`,{children:[c(e.provider),(0,b.jsx)(`strong`,{children:e.name})]}),(0,b.jsx)(`td`,{children:(0,b.jsxs)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,className:`repo-url-link`,style:{color:`var(--primary)`,textDecoration:`none`,fontSize:`0.85rem`},title:e.url,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrow-up-right-from-square`}),` `,e.url]})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.branch})}),(0,b.jsx)(`td`,{children:e.commit_sha?(0,b.jsx)(`code`,{children:e.commit_sha.substring(0,8)}):(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{children:d?l(e,u):e.status===`error`||u?.status===`error`?(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`span`,{className:`badge badge-danger`,title:e.last_error||u?.error||`Sync failed`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-exclamation`}),` Error`]}),(e.last_error||u?.error)&&(0,b.jsx)(`div`,{style:{fontSize:`0.75rem`,color:`var(--danger)`,marginTop:`4px`,maxWidth:`180px`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},title:e.last_error||u?.error||``,children:e.last_error||u?.error})]}):e.status===`pending`||u?.status===`pending`?(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-clock`}),` Pending`]}):(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-check`}),` Synced`]})}),(0,b.jsx)(`td`,{children:(0,b.jsxs)(`button`,{type:`button`,className:`badge ${t?`badge-success`:`badge-danger`}`,style:{cursor:`pointer`,background:t?`rgba(16, 185, 129, 0.2)`:`rgba(239, 68, 68, 0.2)`,border:t?`1px solid rgba(16, 185, 129, 0.4)`:`1px solid rgba(239, 68, 68, 0.4)`,color:t?`#6ee7b7`:`#fca5a5`,padding:`4px 8px`,display:`inline-flex`,alignItems:`center`,gap:`6px`},onClick:()=>i(e.id,t),title:`Auto-Sync: ${t?`ON`:`OFF`} (Click to toggle)`,"aria-label":`Toggle auto-sync for ${e.name}`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${t?`fa-toggle-on`:`fa-toggle-off`}`}),`Auto-Sync: `,t?`ON`:`OFF`]})}),(0,b.jsxs)(`td`,{children:[(e.file_count||0).toLocaleString(),` files`]}),(0,b.jsx)(`td`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`},children:e.last_synced||`Never`}),(0,b.jsx)(`td`,{children:(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`6px`},children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`4px 8px`,fontSize:`0.8rem`},onClick:()=>s?.(e.id),title:`View Ingestion Logs`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`}),` Logs`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`4px 8px`,fontSize:`0.8rem`},onClick:()=>r(e.id),title:`Trigger Sync`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Sync`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`4px 8px`,fontSize:`0.8rem`},onClick:()=>a(e),title:`Webhook Setup`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-bolt`}),` Webhook`]}),(0,b.jsx)(`button`,{className:`btn-icon btn-delete`,onClick:()=>o(e.id,e.name),title:`Delete Repo`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`})})]})})]},e.id)})})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:t&&e.length===0?(0,b.jsxs)(`div`,{className:`empty-state`,"data-testid":`repo-loading-state-mobile`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`,color:`var(--primary)`}}),`Loading repositories...`]}):e.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No Git repositories registered. Click "Add Repository" to index a remote repo.`}):e.map(e=>{let t=e.auto_sync!==!1&&e.auto_sync!==0,u=n?.[e.id],d=e.status===`syncing`||u?.status===`syncing`;return(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:[c(e.provider),(0,b.jsx)(`strong`,{style:{fontSize:`1rem`},children:e.name})]}),!d&&(e.status===`error`||u?.status===`error`?(0,b.jsxs)(`span`,{className:`badge badge-danger`,title:e.last_error||u?.error||`Sync failed`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-exclamation`}),` Error`]}):e.status===`pending`||u?.status===`pending`?(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-clock`}),` Pending`]}):(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-check`}),` Synced`]}))]}),d&&(0,b.jsx)(`div`,{style:{margin:`4px 0 2px 0`},children:l(e,u)}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`URL:`}),(0,b.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,style:{color:`var(--primary)`,textDecoration:`none`},children:e.url})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Branch:`}),(0,b.jsx)(`code`,{children:e.branch})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Commit:`}),e.commit_sha?(0,b.jsx)(`code`,{children:e.commit_sha.substring(0,8)}):`-`]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Auto-Sync:`}),(0,b.jsx)(`button`,{type:`button`,className:`badge ${t?`badge-success`:`badge-danger`}`,style:{cursor:`pointer`,padding:`2px 6px`,fontSize:`0.75rem`},onClick:()=>i(e.id,t),title:`Auto-Sync: ${t?`ON`:`OFF`} (Click to toggle)`,"aria-label":`Toggle auto-sync for ${e.name}`,children:t?`ON`:`OFF`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Files:`}),(e.file_count||0).toLocaleString(),` files`]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Last Synced:`}),e.last_synced||`Never`]}),!d&&(e.last_error||u?.error)&&(0,b.jsxs)(`div`,{style:{color:`var(--danger)`,fontSize:`0.75rem`},children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Error:`}),e.last_error||u?.error]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-actions`,children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>s?.(e.id),title:`View Ingestion Logs`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`}),` Logs`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>r(e.id),title:`Trigger Sync`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Sync`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>a(e),title:`Webhook Setup`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-bolt`}),` Webhook`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary btn-delete`,onClick:()=>o(e.id,e.name),title:`Delete Repo`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Delete`]})]})]},`card-${e.id}`)})})]})}var k=[{step:1,title:`1. Connecting & Remote Check`},{step:2,title:`2. Shallow Cloning Repository`},{step:3,title:`3. Computing File Delta & Scanning`},{step:4,title:`4. Parsing AST Symbols & API Routes`},{step:5,title:`5. Upserting Embeddings & Finalizing`}];function ee({isOpen:e,onClose:t,repoId:n,repoName:r,job:i,onCancelSync:a}){let[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!0),[u,d]=(0,_.useState)(!1),[f,p]=(0,_.useState)(0),[m,h]=(0,_.useState)(!1),g=(0,_.useRef)(null),v=(0,_.useRef)(null),y=n??i?.repo_id??null,x=r||i?.repo_name||`Repository`;(0,_.useEffect)(()=>{if(!e||!i?.started_at){p(0);return}let t=()=>{let e=i.started_at>1e11?i.started_at:i.started_at*1e3;return Math.max(0,Math.floor((Date.now()-e)/1e3))};if(p(t()),i.status===`syncing`||i.status===`pending`){let e=setInterval(()=>{p(t())},1e3);return()=>clearInterval(e)}},[e,i?.started_at,i?.status]);let S=e=>{let t=Math.floor(e/60),n=e%60;return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}`},C=i?.logs,w=(0,_.useMemo)(()=>{let e=C||[];if(!o.trim())return e;let t=o.toLowerCase();return e.filter(e=>e.message.toLowerCase().includes(t)||e.level.toLowerCase().includes(t)||e.timestamp.toLowerCase().includes(t))},[C,o]);(0,_.useEffect)(()=>{c&&g.current&&typeof g.current.scrollIntoView==`function`&&g.current.scrollIntoView({behavior:`smooth`})},[w,c]);let T=async()=>{let e=(i?.logs||[]).map(e=>`[${e.timestamp}] [${e.level.toUpperCase()}] ${e.message}`).join(` -`);try{await navigator.clipboard.writeText(e),d(!0),setTimeout(()=>d(!1),2e3)}catch(e){console.error(`Failed to copy logs:`,e)}},E=async()=>{if(!(!y||!a))try{h(!0),await a(y)}catch(e){console.error(`Failed to cancel sync:`,e)}finally{h(!1)}};if(!e)return null;let D=i?.status||`pending`,O=i?.percent??(D===`synced`?100:0),ee=i?.step??(D===`synced`?5:1);return(0,b.jsx)(`div`,{className:`sync-drawer-backdrop`,onClick:e=>{e.target===e.currentTarget&&t()},"data-testid":`sync-drawer-backdrop`,children:(0,b.jsxs)(`div`,{className:`sync-drawer`,children:[(0,b.jsxs)(`div`,{className:`sync-drawer-header`,children:[(0,b.jsxs)(`div`,{className:`sync-drawer-title-group`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,flexWrap:`wrap`},children:[(0,b.jsxs)(`h2`,{style:{fontSize:`1.1rem`,margin:0,fontWeight:700,color:`var(--text)`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-code-branch`,style:{marginRight:`8px`,color:`var(--primary)`}}),x,` Ingestion Progress & Live Logs`]}),D===`syncing`?(0,b.jsxs)(`span`,{className:`badge badge-warning`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Syncing`]}):D===`synced`?(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-check`}),` Synced`]}):D===`error`?(0,b.jsxs)(`span`,{className:`badge badge-danger`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-exclamation`}),` Error`]}):(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-clock`}),` Pending`]})]}),(0,b.jsxs)(`div`,{className:`sync-drawer-meta`,style:{display:`flex`,alignItems:`center`,gap:`12px`,marginTop:`6px`,fontSize:`0.82rem`,color:`var(--text-muted)`},children:[(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`i`,{className:`fa-regular fa-clock`,style:{marginRight:`4px`}}),`Elapsed: `,(0,b.jsx)(`strong`,{children:S(f)})]}),i?.step_name&&(0,b.jsxs)(`span`,{children:[`• Current: `,(0,b.jsx)(`strong`,{children:i.step_name})]})]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[D===`syncing`&&a&&y!=null&&(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary btn-cancel-sync`,onClick:E,disabled:m,style:{fontSize:`0.8rem`,padding:`6px 12px`,color:`var(--danger)`,borderColor:`rgba(239, 68, 68, 0.4)`},children:[(0,b.jsx)(`i`,{className:`fa-solid ${m?`fa-spinner fa-spin`:`fa-stop`}`}),m?`Cancelling...`:`Cancel Sync`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:t,"aria-label":`Close sync drawer`,style:{fontSize:`1.4rem`,lineHeight:1},children:`×`})]})]}),(0,b.jsxs)(`div`,{className:`sync-drawer-body`,children:[(0,b.jsxs)(`div`,{className:`sync-progress-section`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`span`,{style:{fontWeight:600,color:`var(--text)`},children:`Overall Ingestion`}),(0,b.jsxs)(`span`,{style:{fontWeight:700,color:D===`error`?`var(--danger)`:`var(--primary)`},children:[O,`%`]})]}),(0,b.jsx)(`div`,{className:`sync-progress-bar-container`,children:(0,b.jsx)(`div`,{className:`sync-progress-bar-fill ${D===`error`?`fill-error`:D===`synced`?`fill-success`:`fill-active`}`,style:{width:`${O}%`}})})]}),(0,b.jsxs)(`div`,{className:`sync-stepper-container`,children:[(0,b.jsx)(`h4`,{style:{fontSize:`0.82rem`,textTransform:`uppercase`,letterSpacing:`0.05em`,color:`var(--text-muted)`,marginBottom:`10px`},children:`Ingestion Stages`}),(0,b.jsx)(`div`,{className:`sync-stepper-list`,children:k.map(e=>{let t=D===`synced`||D!==`error`&&ee>e.step||D===`error`&&ee>e.step,n=D===`syncing`&&ee===e.step,r=D===`error`&&ee===e.step;return(0,b.jsxs)(`div`,{className:`sync-stepper-item ${t?`item-completed`:n?`item-active`:r?`item-error`:`item-pending`}`,children:[(0,b.jsxs)(`div`,{className:`sync-stepper-icon`,children:[t&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-check`,style:{color:`#10b981`}}),n&&(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{color:`#f59e0b`}}),r&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-xmark`,style:{color:`#ef4444`}}),!t&&!n&&!r&&(0,b.jsx)(`i`,{className:`fa-regular fa-circle`,style:{color:`var(--text-muted)`}})]}),(0,b.jsxs)(`div`,{className:`sync-stepper-content`,children:[(0,b.jsx)(`div`,{className:`sync-stepper-title`,style:{fontWeight:n?600:500},children:e.title}),n&&(0,b.jsxs)(`div`,{className:`sync-stepper-details`,children:[i?.current_file&&(0,b.jsxs)(`div`,{className:`sync-current-file`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`,style:{marginRight:`4px`}}),(0,b.jsx)(`code`,{children:i.current_file})]}),i?.total_files!=null&&i.total_files>0&&(0,b.jsxs)(`div`,{className:`sync-file-count`,style:{marginTop:`2px`,color:`var(--text-muted)`},children:[i.processed_files,` / `,i.total_files,` files (`,O,`%)`]})]}),r&&i?.error&&(0,b.jsxs)(`div`,{className:`sync-stepper-error-msg`,style:{marginTop:`4px`,color:`var(--danger)`,fontSize:`0.82rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`,style:{marginRight:`4px`}}),i.error]})]})]},e.step)})})]}),(0,b.jsxs)(`div`,{className:`sync-terminal-section`,children:[(0,b.jsxs)(`div`,{className:`sync-terminal-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`,style:{color:`var(--accent)`}}),(0,b.jsx)(`span`,{style:{fontSize:`0.85rem`,fontWeight:600,color:`var(--text)`},children:`Live Terminal Output`}),(0,b.jsxs)(`span`,{className:`badge badge-secondary`,style:{fontSize:`0.75rem`,padding:`1px 6px`},children:[w.length,` `,w.length===1?`event`:`events`]})]}),(0,b.jsxs)(`div`,{className:`sync-terminal-actions`,children:[(0,b.jsxs)(`label`,{className:`sync-autoscroll-toggle`,children:[(0,b.jsx)(`input`,{type:`checkbox`,checked:c,onChange:e=>l(e.target.checked),"aria-label":`Autoscroll`}),(0,b.jsx)(`span`,{children:`Autoscroll`})]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary btn-sm`,onClick:T,"aria-label":`Copy logs`,style:{fontSize:`0.75rem`,padding:`3px 8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid ${u?`fa-check`:`fa-copy`}`}),` `,u?`Copied!`:`Copy Logs`]})]})]}),(0,b.jsxs)(`div`,{className:`sync-terminal-search`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass`,style:{color:`var(--text-muted)`,fontSize:`0.8rem`}}),(0,b.jsx)(`input`,{type:`text`,placeholder:`Filter logs by keyword or level...`,value:o,onChange:e=>s(e.target.value),style:{width:`100%`,background:`transparent`,border:`none`,outline:`none`,color:`var(--text)`,fontSize:`0.82rem`,padding:`4px 0`}}),o&&(0,b.jsx)(`button`,{type:`button`,onClick:()=>s(``),style:{background:`transparent`,border:`none`,color:`var(--text-muted)`,cursor:`pointer`,fontSize:`0.8rem`},children:`×`})]}),(0,b.jsx)(`div`,{className:`sync-terminal-body`,ref:v,children:w.length===0?(0,b.jsxs)(`div`,{className:`sync-terminal-empty`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-clock-rotate-left`,style:{marginBottom:`6px`,fontSize:`1.2rem`,opacity:.5}}),(0,b.jsx)(`div`,{children:(C?.length||0)===0?`Waiting for sync activity...`:`No logs matching filter`})]}):(0,b.jsxs)(`div`,{className:`sync-terminal-lines`,children:[w.map((e,t)=>{let n=(e.level||`INFO`).toUpperCase(),r=`level-info`;return(n===`WARN`||n===`WARNING`)&&(r=`level-warn`),(n===`ERROR`||n===`FATAL`)&&(r=`level-error`),(0,b.jsxs)(`div`,{className:`sync-terminal-line`,children:[(0,b.jsxs)(`span`,{className:`log-time`,children:[`[`,e.timestamp,`]`]}),(0,b.jsx)(`span`,{className:`log-badge ${r}`,children:n}),(0,b.jsx)(`span`,{className:`log-msg`,children:e.message})]},t)}),(0,b.jsx)(`div`,{ref:g})]})})]})]})]})})}function A(){let[e,t]=(0,_.useState)({}),[n,r]=(0,_.useState)(!1),i=(0,_.useRef)(null),a=(0,_.useCallback)(async()=>{try{let e=await fetch(`/admin/api/repos/sync-status`);if(e&&e.ok){let n=await e.json();if(n&&typeof n==`object`&&!Array.isArray(n)){let e={};Object.entries(n).forEach(([t,n])=>{let r=n;r&&(r.repo_id!=null||r.step!=null||r.status!=null)&&(e[Number(t)]=r)}),t(t=>({...t,...e}))}else if(Array.isArray(n)){let e={};n.forEach(t=>{t&&t.repo_id!=null&&(t.step!=null||t.status===`syncing`)&&(e[t.repo_id]=t)}),Object.keys(e).length>0&&t(t=>({...t,...e}))}}}catch(e){console.error(`Failed to fetch initial sync status snapshot:`,e)}},[]);return(0,_.useEffect)(()=>{if(a(),typeof EventSource>`u`)return;let e=null;try{e=new EventSource(`/admin/api/repos/sync/stream`),i.current=e,e.onopen=()=>{r(!0)},e.onerror=()=>{r(!1)},e.addEventListener(`init`,e=>{try{let n=JSON.parse(e.data);if(n&&typeof n==`object`){let e={};Object.entries(n).forEach(([t,n])=>{e[Number(t)]=n}),t(e),r(!0)}}catch(e){console.error(`Failed to parse init sync stream event:`,e)}}),e.addEventListener(`progress`,e=>{try{let n=JSON.parse(e.data),i=n.data||n;i&&i.repo_id!=null&&(t(e=>{let t=e[i.repo_id];return{...e,[i.repo_id]:{...t||{},...i,logs:i.logs??t?.logs??[]}}}),r(!0))}catch(e){console.error(`Failed to parse progress event:`,e)}}),e.addEventListener(`log`,e=>{try{let n=JSON.parse(e.data),r=n.repo_id??n.data?.repo_id,i=n.data&&!n.data.repo_id?n.data:n.log||n.data;r!=null&&i&&t(e=>{let t=e[r];if(!t)return e;let n=t.logs||[];return{...e,[r]:{...t,logs:[...n,i]}}})}catch(e){console.error(`Failed to parse log event:`,e)}})}catch(e){console.error(`Failed to initialize EventSource:`,e),r(!1)}return()=>{e&&(e.close(),i.current=null)}},[a]),{syncStates:e,isConnected:n,cancelSync:(0,_.useCallback)(async e=>{try{let t=await fetch(`/admin/api/repos/${e}/cancel-sync`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||`Failed to cancel sync: ${t.statusText}`)}return await t.json()}catch(t){throw console.error(`Error cancelling sync for repo ${e}:`,t),t}},[])}}function te({refreshStats:e}){let[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(!1),[s,c]=(0,_.useState)(null),[l,u]=(0,_.useState)(!1),[d,f]=(0,_.useState)(null),p=S(),{syncStates:m,cancelSync:h}=A(),[g,v]=(0,_.useState)(``),[y,x]=(0,_.useState)(``),[C,w]=(0,_.useState)(`main`),[T,k]=(0,_.useState)(`auto`),[te,ne]=(0,_.useState)(``),[re,ie]=(0,_.useState)(``),[j,M]=(0,_.useState)(!1),N=(0,_.useCallback)(async()=>{try{let e=await fetch(`/admin/api/repos`);if(!e.ok){p.error(`Failed to load repositories`);return}let t=await e.json();n(Array.isArray(t)?t:[])}catch(e){p.error(`Error loading repos: `+e.message),console.error(`Error loading repos:`,e)}finally{i(!1)}},[p]);(0,_.useEffect)(()=>{N();let e=setInterval(N,8e3);return()=>clearInterval(e)},[N]);let ae=async t=>{t.preventDefault(),M(!0);try{let t=await fetch(`/admin/api/repos`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:g.trim(),url:y.trim(),branch:C.trim()||`main`,provider:T===`auto`?void 0:T,auth_user:te.trim()||null,auth_token:re.trim()||null})}),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to add repository`);o(!1),v(``),x(``),w(`main`),k(`auto`),ne(``),ie(``),N(),e(),p.success(`Repository '${g.trim()}' added successfully`)}catch(e){p.error(`Error: ${e.message}`)}finally{M(!1)}},oe=async t=>{n(e=>e.map(e=>e.id===t?{...e,status:`syncing`}:e));try{let n=await fetch(`/admin/api/repos/sync/${t}`,{method:`POST`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to trigger sync`)}N(),e(),p.info(`Sync triggered successfully`)}catch(e){N(),p.error(`Failed to trigger sync: `+e.message)}},se=async(e,t)=>{let r=!t;n(t=>t.map(t=>t.id===e?{...t,auto_sync:r}:t));try{let t=await fetch(`/admin/api/repos/${e}/auto-sync`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({auto_sync:r})});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||e.detail||`Failed to update auto-sync`)}p.info(`Auto-sync ${r?`enabled`:`disabled`}`),N()}catch(e){N(),p.error(`Failed to update auto-sync: `+e.message)}},P=async e=>{try{navigator?.clipboard?.writeText&&await navigator.clipboard.writeText(e),u(!0),p.info(`Webhook URL copied to clipboard`),setTimeout(()=>u(!1),2e3)}catch(e){p.error(`Failed to copy: `+e.message)}},F=async(t,r)=>{if(window.confirm(`Are you sure you want to delete repository '${r}'? All vectors and indexed symbols for this repo will be permanently purged.`)){n(e=>e.filter(e=>e.id!==t));try{let n=await fetch(`/admin/api/repos/${t}`,{method:`DELETE`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to delete repo`)}N(),e(),p.success(`Repository '${r}' deleted successfully`)}catch(e){N(),p.error(`Failed to delete repo: `+e.message)}}},ce=d===null?null:m[d],le=t.find(e=>e.id===d)?.name||ce?.repo_name||``;return(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-code-branch`}),` Registered Git Repositories`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Supports GitHub, GitLab, Gitea, Bitbucket, and custom self-hosted Git repositories over HTTP/HTTPS.`})]}),(0,b.jsxs)(`button`,{className:`btn btn-primary`,onClick:()=>o(!0),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-plus`}),` Add Repository`]})]}),(0,b.jsx)(O,{repos:t,isLoading:r,syncStates:m,onSync:oe,onToggleAutoSync:se,onOpenWebhook:e=>c(e),onDelete:F,onOpenSyncDrawer:e=>f(e)}),(0,b.jsx)(E,{isOpen:a,onClose:()=>o(!1),onSave:ae,alias:g,setAlias:v,url:y,setUrl:x,branch:C,setBranch:w,provider:T,setProvider:k,authUser:te,setAuthUser:ne,token:re,setToken:ie,isSaving:j}),(0,b.jsx)(D,{repo:s,onClose:()=>c(null),onCopyUrl:P,copiedUrl:l}),(0,b.jsx)(ee,{isOpen:d!==null,onClose:()=>f(null),repoId:d,repoName:le,job:ce,onCancelSync:h})]})})}function ne({refreshStats:e}){let[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),a=S(),[o,s]=(0,_.useState)(!1),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)(``),[f,p]=(0,_.useState)(`local`),[m,h]=(0,_.useState)(``),[g,v]=(0,_.useState)(`directory`),[y,x]=(0,_.useState)(1),[C,w]=(0,_.useState)(null),T=(0,_.useCallback)(async()=>{try{let e=await fetch(`/admin/api/paths`);if(!e.ok){a.error(`Failed to load local paths`);return}let t=await e.json();n(t)}catch(e){a.error(`Error loading paths: `+e.message),console.error(`Error loading paths:`,e)}finally{i(!1)}},[a]);(0,_.useEffect)(()=>{T();let e=setInterval(T,8e3);return()=>clearInterval(e)},[T]);let E=async t=>{t.preventDefault();try{let t=await fetch(`/admin/api/paths`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:u.trim(),repo:f.trim()||`local`,category:m.trim()||null,type:g,recursive:y,enabled:1})}),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to add path`);s(!1),d(``),p(`local`),h(``),v(`directory`),x(1),T(),e(),a.success(`Path added successfully`)}catch(e){a.error(`Error: ${e.message}`)}},D=async t=>{if(window.confirm(`Are you sure you want to delete this local search path?`)){n(e=>e.filter(e=>e.id!==t));try{let n=await fetch(`/admin/api/paths/${t}`,{method:`DELETE`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to delete path`)}a.success(`Path deleted successfully`),T(),e()}catch(e){T(),a.error(`Failed to delete path: `+e.message)}}},O=(e=`/`)=>{l(!0),k(e)},k=async e=>{try{let t=await fetch(`/admin/api/browse?path=${encodeURIComponent(e)}`),n=await t.json();if(!t.ok){a.error(n.error||`Failed to browse directory`);return}w(n)}catch(e){a.error(`Browse error: `+e.message),console.error(`Browse error:`,e)}};return(0,b.jsxs)(`div`,{className:`tab-content active`,children:[(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`}),` Monitored Local Paths`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Mounted documentation vaults and local workspaces scanned for changes.`})]}),(0,b.jsxs)(`button`,{className:`btn btn-primary`,onClick:()=>s(!0),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-plus`}),` Add Local Path`]})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Path`}),(0,b.jsx)(`th`,{children:`Repo Alias`}),(0,b.jsx)(`th`,{children:`Type`}),(0,b.jsx)(`th`,{children:`Recursive`}),(0,b.jsx)(`th`,{children:`Category`}),(0,b.jsx)(`th`,{children:`Enabled`}),(0,b.jsx)(`th`,{children:`Actions`})]})}),(0,b.jsx)(`tbody`,{children:r&&t.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsxs)(`td`,{colSpan:7,className:`empty-state`,"data-testid":`path-loading-state`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`,color:`var(--primary)`}}),`Loading local paths...`]})}):t.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:7,className:`empty-state`,children:`No local search paths configured.`})}):t.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.path})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.repo||`local`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.type})}),(0,b.jsx)(`td`,{children:e.recursive?`Yes`:`No`}),(0,b.jsx)(`td`,{children:e.category?(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.category}):(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{children:e.enabled?(0,b.jsx)(`span`,{className:`badge badge-success`,children:`Enabled`}):(0,b.jsx)(`span`,{className:`badge badge-danger`,children:`Disabled`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`button`,{className:`btn-icon btn-delete`,onClick:()=>D(e.id),title:`Delete Path`,"aria-label":`Delete Path`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`})})})]},e.id))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:r&&t.length===0?(0,b.jsxs)(`div`,{className:`empty-state`,"data-testid":`path-loading-state-mobile`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`,color:`var(--primary)`}}),`Loading local paths...`]}):t.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No local search paths configured.`}):t.map(e=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,minWidth:0},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`,style:{color:`var(--accent)`}}),(0,b.jsx)(`strong`,{style:{fontSize:`1rem`},children:e.repo||`local`})]}),e.enabled?(0,b.jsx)(`span`,{className:`badge badge-success`,children:`Enabled`}):(0,b.jsx)(`span`,{className:`badge badge-danger`,children:`Disabled`})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.path})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,flexWrap:`wrap`,alignItems:`center`},children:[(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Type: `}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.type})]}),(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Recursive: `}),(0,b.jsx)(`span`,{children:e.recursive?`Yes`:`No`})]})]}),e.category&&(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Category: `}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.category})]})]}),(0,b.jsx)(`div`,{className:`data-mobile-card-actions`,children:(0,b.jsxs)(`button`,{className:`btn btn-secondary btn-delete`,onClick:()=>D(e.id),title:`Delete Path`,"aria-label":`Delete Path`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Delete`]})})]},`card-${e.id}`))})]}),o&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-open`}),` Add Monitored Local Path`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>s(!1),children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:E,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Selected Directory / File`}),(0,b.jsxs)(`div`,{className:`path-input-row`,children:[(0,b.jsx)(`input`,{type:`text`,readOnly:!0,required:!0,placeholder:`Browse workspace directories...`,value:u}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>O(C?.current_path||`/`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass`}),` Browse`]})]})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`path-repo-alias`,children:`Repo / Vault Alias`}),(0,b.jsx)(`input`,{type:`text`,id:`path-repo-alias`,placeholder:`local`,value:f,onChange:e=>p(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`path-category`,children:`Category Override`}),(0,b.jsx)(`input`,{type:`text`,id:`path-category`,placeholder:`Optional category`,value:m,onChange:e=>h(e.target.value)})]})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`path-type`,children:`Path Type`}),(0,b.jsxs)(`select`,{id:`path-type`,value:g,onChange:e=>v(e.target.value),children:[(0,b.jsx)(`option`,{value:`directory`,children:`Directory`}),(0,b.jsx)(`option`,{value:`file`,children:`Single File`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`path-recursive`,children:`Scan Subfolders`}),(0,b.jsxs)(`select`,{id:`path-recursive`,value:y,onChange:e=>x(parseInt(e.target.value)),children:[(0,b.jsx)(`option`,{value:1,children:`Yes (Recursive)`}),(0,b.jsx)(`option`,{value:0,children:`No (Top-level only)`})]})]})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>s(!1),children:`Cancel`}),(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,children:`Save Path`})]})]})]})}),c&&C&&(0,b.jsx)(`div`,{className:`modal-backdrop`,style:{zIndex:1100},children:(0,b.jsxs)(`div`,{className:`glass-card modal-card browser-card`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-search`}),` Browse Workspace Files`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>l(!1),children:`×`})]}),(0,b.jsxs)(`div`,{className:`browser-body`,children:[(0,b.jsxs)(`div`,{className:`browser-breadcrumbs`,children:[(0,b.jsx)(`span`,{className:`label`,children:`Current: `}),(0,b.jsx)(`span`,{className:`code`,style:{wordBreak:`break-all`},children:C.current_path})]}),(0,b.jsx)(`div`,{className:`browser-list-container`,children:(0,b.jsxs)(`ul`,{className:`browser-list`,children:[C.parent_path&&(0,b.jsxs)(`li`,{className:`browser-item`,onClick:()=>k(C.parent_path),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-level-up-alt`,style:{color:`var(--accent)`}}),` `,(0,b.jsx)(`span`,{children:`.. (Parent Directory)`})]}),C.directories.map(e=>(0,b.jsxs)(`li`,{className:`browser-item`,onClick:()=>k(e.path),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder`,style:{color:`#fbbf24`}}),` `,(0,b.jsx)(`span`,{style:{wordBreak:`break-all`},children:e.name})]},e.path)),C.files.map(e=>(0,b.jsxs)(`li`,{className:`browser-item`,onClick:()=>{d(e.path),v(`file`),l(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`,style:{color:`var(--text-muted)`}}),` `,(0,b.jsx)(`span`,{style:{wordBreak:`break-all`},children:e.name})]},e.path))]})})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>l(!1),children:`Cancel`}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-primary`,onClick:()=>{C&&(d(C.current_path),v(`directory`),l(!1))},children:`Select Current Folder`})]})]})})]})}function re(){let e=S(),[t,n]=(0,_.useState)(``),[r,i]=(0,_.useState)(`code`),[a,o]=(0,_.useState)(``),[s,c]=(0,_.useState)(!1),[l,u]=(0,_.useState)(null),[d,f]=(0,_.useState)(null);return(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass`}),` Live Hybrid Search Inspector`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Test hybrid search results across code and documentation directly from the browser.`}),(0,b.jsx)(`form`,{onSubmit:async n=>{n.preventDefault(),c(!0),f(null),u(null);try{let e=await fetch(`/admin/api/search/test`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({query:t.trim(),type:r,repo:a.trim()||null})}),n=await e.json();if(!e.ok)throw Error(n.error||`Search failed`);u(n.results||[])}catch(t){f(t.message),e.error(`Search failed: `+t.message)}finally{c(!1)}},style:{marginTop:`16px`},children:(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:2},children:[(0,b.jsx)(`label`,{children:`Search Query`}),(0,b.jsx)(`input`,{type:`text`,required:!0,placeholder:`e.g. JWT token authentication or chunk_markdown`,value:t,onChange:e=>n(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Target Type`}),(0,b.jsxs)(`select`,{value:r,onChange:e=>i(e.target.value),children:[(0,b.jsx)(`option`,{value:`code`,children:`Code Snippets & Symbols`}),(0,b.jsx)(`option`,{value:`doc`,children:`Documentation & Notes`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Repo Filter (Optional)`}),(0,b.jsx)(`input`,{type:`text`,placeholder:`All Repos`,value:a,onChange:e=>o(e.target.value)})]}),(0,b.jsx)(`div`,{className:`form-group search-form-btn-group`,style:{alignSelf:`flex-end`},children:(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:s,children:s?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Searching...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-play`}),` Search`]})})})]})}),(0,b.jsxs)(`div`,{style:{marginTop:`20px`},children:[s&&(0,b.jsx)(`div`,{className:`empty-state`,children:`Running hybrid retrieval with Normalized Weighted Fusion...`}),d&&(0,b.jsxs)(`div`,{className:`empty-state`,style:{color:`var(--danger)`},children:[`Search error: `,d]}),!s&&!d&&l===null&&(0,b.jsx)(`div`,{className:`empty-state`,children:`Enter a query above to test hybrid retrieval.`}),!s&&!d&&l!==null&&l.length===0&&(0,b.jsx)(`div`,{className:`empty-state`,children:`No matching results found in index.`}),!s&&!d&&l!==null&&l.length>0&&l.map((e,t)=>{let n=e.payload;return(0,b.jsxs)(`div`,{className:`search-hit-card`,children:[(0,b.jsxs)(`div`,{className:`search-hit-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,flexWrap:`wrap`,alignItems:`center`,gap:`6px`},children:[(0,b.jsx)(`span`,{className:`badge badge-primary`,children:n.repo}),(0,b.jsx)(`strong`,{children:n.rel_path}),n.symbol&&(0,b.jsx)(`span`,{className:`badge badge-accent`,children:n.symbol}),(0,b.jsxs)(`span`,{className:`text-muted`,style:{fontSize:`0.8rem`},children:[`(Lines `,n.start_line,`-`,n.end_line,`)`]}),n.github_url&&(()=>{let e=``;try{e=new URL(n.github_url).hostname.toLowerCase()}catch{}let t=n.github_url.toLowerCase(),r=`View Source`,i=`fa-solid fa-code-branch`;return e===`gitlab.com`||e.endsWith(`.gitlab.com`)||t.includes(`/-/blob/`)?(r=`View on GitLab`,i=`fa-brands fa-gitlab`):e.includes(`gitea`)||e.includes(`forgejo`)?(r=`View on Gitea`,i=`fa-solid fa-mug-hot`):e===`bitbucket.org`||e.endsWith(`.bitbucket.org`)?(r=`View on Bitbucket`,i=`fa-brands fa-bitbucket`):(e===`github.com`||e.endsWith(`.github.com`))&&(r=`View on GitHub`,i=`fa-brands fa-github`),(0,b.jsxs)(`a`,{href:n.github_url,target:`_blank`,rel:`noreferrer`,style:{color:`var(--primary)`,fontSize:`0.8rem`},children:[(0,b.jsx)(`i`,{className:i,style:{marginRight:`4px`}}),r]})})()]}),(0,b.jsx)(`div`,{children:(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[`Score: `,(e.score*100).toFixed(1),`% (`,e.score.toFixed(4),`)`]})})]}),(0,b.jsx)(`pre`,{className:`search-hit-code`,children:n.content})]},t)})]})]})})}function ie({vectorStore:e,isLoadingVs:t,testFeedback:n,vsProvider:r,vsMode:i,vsStoragePath:a,setVsStoragePath:o,vsUrl:s,setVsUrl:c,vsCollection:l,setVsCollection:u,isTestingVs:d,isSwitchingVs:f,onProviderChange:p,onModeChange:m,onTestConnection:h,onSwitchBackend:g}){return(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-database`}),` Vector Database Engine`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Configure and switch between vector database backends (Qdrant & ChromaDB). Switching backends updates system metadata and triggers full re-indexing.`}),(0,b.jsxs)(`div`,{className:`vs-config-layout`,children:[(0,b.jsxs)(`div`,{className:`vs-box`,children:[(0,b.jsxs)(`h3`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-nodes`}),` Active Vector Backend`]}),t&&!e?(0,b.jsx)(`p`,{className:`text-muted`,children:`Loading vector store configuration...`}):e?(0,b.jsxs)(`div`,{className:`specs-list`,style:{marginTop:0},children:[(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Provider:`}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.provider===`chroma`?`ChromaDB`:`Qdrant`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Operating Mode:`}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.mode===`embedded`?`Embedded Disk`:`Remote Server`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:e.mode===`embedded`?`Storage Path:`:`Server URL:`}),(0,b.jsx)(`code`,{children:e.mode===`embedded`?e.storage_path||`data/qdrant_db`:e.url||`http://localhost:6333`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Collection Name:`}),(0,b.jsx)(`code`,{children:e.collection||`knowledge_rag_v1`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Points Count:`}),(0,b.jsx)(`span`,{style:{fontSize:`0.9rem`,fontWeight:600},children:(e.points_count||0).toLocaleString()})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Health Status:`}),e.healthy?(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-check`}),` Healthy`]}):(0,b.jsxs)(`span`,{className:`badge badge-danger`,title:e.health_message||`Unhealthy`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`}),` `,e.health_message?e.health_message.length>35?e.health_message.slice(0,35)+`...`:e.health_message:`Unhealthy`]})]})]}):(0,b.jsx)(`p`,{className:`text-muted`,children:`No vector store configuration found.`})]}),(0,b.jsxs)(`div`,{className:`vs-box`,children:[(0,b.jsxs)(`h3`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-sliders`}),` Configure & Switch Backend`]}),n&&(0,b.jsxs)(`div`,{className:`vs-feedback-banner ${n.success?`feedback-success`:`feedback-error`}`,children:[(0,b.jsx)(`i`,{className:n.success?`fa-solid fa-circle-check`:`fa-solid fa-circle-exclamation`}),(0,b.jsx)(`span`,{children:n.message})]}),(0,b.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),g()},children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-provider`,children:`Vector Store Provider`}),(0,b.jsxs)(`select`,{id:`vs-provider`,value:r,onChange:e=>p(e.target.value),children:[(0,b.jsx)(`option`,{value:`qdrant`,children:`Qdrant (Hybrid Dense + BM25)`}),(0,b.jsx)(`option`,{value:`chroma`,children:`ChromaDB (Dense Vectors)`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-mode`,children:`Operating Mode`}),(0,b.jsxs)(`select`,{id:`vs-mode`,value:i,onChange:e=>m(e.target.value),children:[(0,b.jsx)(`option`,{value:`embedded`,children:`Embedded Disk Storage`}),(0,b.jsx)(`option`,{value:`remote`,children:`Remote Server URL`})]})]})]}),i===`embedded`?(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-storage-path`,children:`Storage Directory Path`}),(0,b.jsx)(`input`,{id:`vs-storage-path`,type:`text`,value:a,onChange:e=>o(e.target.value),placeholder:r===`chroma`?`data/chroma_db`:`data/qdrant_db`})]}):(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-url`,children:`Remote Server URL`}),(0,b.jsx)(`input`,{id:`vs-url`,type:`text`,value:s,onChange:e=>c(e.target.value),placeholder:r===`chroma`?`http://localhost:8000`:`http://localhost:6333`})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-collection`,children:`Collection Name`}),(0,b.jsx)(`input`,{id:`vs-collection`,type:`text`,value:l,onChange:e=>u(e.target.value),placeholder:`knowledge_rag_v1`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,marginTop:`16px`,flexWrap:`wrap`},children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:h,disabled:d||f,children:d?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Testing Connection...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-plug`}),` Test Connection`]})}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-primary`,onClick:g,disabled:d||f,children:f?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Switching Backend...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Save & Switch Backend`]})})]})]})]})]})]})}function j({embeddingConfig:e,isLoadingEmb:t,isSavingEmb:n,embProvider:r,setEmbProvider:i,embThreads:a,setEmbThreads:o,embBatchSize:s,setEmbBatchSize:c,embDenseModel:l,setEmbDenseModel:u,embSparseModel:d,setEmbSparseModel:f,embLitellmUrl:p,setEmbLitellmUrl:m,embLitellmApiKey:h=``,setEmbLitellmApiKey:g,embVisionOcrModel:v=`gemini-2.5-flash`,setEmbVisionOcrModel:y,embChatModel:x=`gemini-2.5-flash`,setEmbChatModel:S,discoveryResult:C=null,isDiscovering:w=!1,onDiscoverModels:T,onSaveEmbeddingSettings:E}){let D=e?.system_cpus||2,O=e?.system_memory_gb||4,[k,ee]=(0,_.useState)(!1),[A,te]=(0,_.useState)(!1),[ne,re]=(0,_.useState)(!1),ie=C?.embedding_models||[],j=C?.vision_models||[],M=C?.chat_models||[];return(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-microchip`}),` Embedding Engine & Resource Limits`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Configure local FastEmbed (ONNX) resource limits, CPU thread concurrency, or remote LiteLLM endpoints with dynamic model discovery for embeddings, Vision AI OCR, and chat synthesis.`}),(0,b.jsxs)(`div`,{className:`vs-config-layout`,children:[(0,b.jsxs)(`div`,{className:`vs-box`,children:[(0,b.jsxs)(`h3`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-gauge-high`}),` Active Embedding Engine`]}),t&&!e?(0,b.jsx)(`p`,{className:`text-muted`,children:`Loading embedding configuration...`}):e?(0,b.jsxs)(`div`,{className:`specs-list`,style:{marginTop:0},children:[(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Execution Provider:`}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.provider===`api`?`Remote API (LiteLLM)`:`Local FastEmbed (ONNX)`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`CPU Threads Allocation:`}),(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[e.threads,` `,e.threads===1?`Core`:`Cores`,` (of `,D,` detected)`]})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Batch Processing Size:`}),(0,b.jsxs)(`span`,{style:{fontSize:`0.9rem`,fontWeight:600},children:[e.batch_size,` chunks/batch`]})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`System RAM Capacity:`}),(0,b.jsxs)(`span`,{style:{fontSize:`0.9rem`,fontWeight:600},children:[O,` GB`]})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Dense Model:`}),(0,b.jsx)(`code`,{children:e.dense_model||`BAAI/bge-small-en-v1.5`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Sparse Model (BM25):`}),(0,b.jsx)(`code`,{children:e.sparse_model||`Qdrant/bm25`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Vision AI OCR Model:`}),(0,b.jsx)(`code`,{children:e.vision_ocr_model||`gemini-2.5-flash`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Chat Completion Model:`}),(0,b.jsx)(`code`,{children:e.chat_model||`gemini-2.5-flash`})]}),e.provider===`api`&&(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`API Endpoint URL:`}),(0,b.jsx)(`code`,{children:e.litellm_url||`http://litellm:4000/v1`})]})]}):(0,b.jsx)(`p`,{className:`text-muted`,children:`No embedding configuration found.`})]}),(0,b.jsxs)(`div`,{className:`vs-box`,children:[(0,b.jsxs)(`h3`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-sliders`}),` Configure Models & Resources`]}),(0,b.jsxs)(`form`,{onSubmit:E,children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-provider`,children:`Embedding Provider`}),(0,b.jsxs)(`select`,{id:`emb-provider`,value:r,onChange:e=>i(e.target.value),children:[(0,b.jsx)(`option`,{value:`local`,children:`Local Model (FastEmbed / ONNX Runtime)`}),(0,b.jsx)(`option`,{value:`api`,children:`API Endpoint (LiteLLM / OpenAI Compatible)`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-threads`,children:`CPU Thread Cap`}),(0,b.jsx)(`input`,{id:`emb-threads`,type:`number`,min:`1`,max:Math.max(D,128),value:a,onChange:e=>o(Math.max(1,parseInt(e.target.value)||1)),placeholder:`2`}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`2px`,display:`block`},children:`Recommended: 2 cores. Prevents container CPU spikes.`})]})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-batch-size`,children:`Embedding Batch Size`}),(0,b.jsxs)(`select`,{id:`emb-batch-size`,value:s,onChange:e=>c(parseInt(e.target.value)||32),children:[(0,b.jsx)(`option`,{value:`16`,children:`16 chunks (Lowest RAM footprint)`}),(0,b.jsx)(`option`,{value:`32`,children:`32 chunks (Balanced Default)`}),(0,b.jsx)(`option`,{value:`64`,children:`64 chunks (High throughput)`}),(0,b.jsx)(`option`,{value:`128`,children:`128 chunks (Large RAM environments)`}),(0,b.jsx)(`option`,{value:`256`,children:`256 chunks (FastEmbed default)`})]})]}),r===`api`?(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-litellm-url`,children:`API Endpoint URL (LiteLLM)`}),(0,b.jsx)(`input`,{id:`emb-litellm-url`,type:`text`,value:p,onChange:e=>m(e.target.value),placeholder:`http://litellm:4000/v1`})]}):(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-dense-model`,children:`Dense Model Name`}),(0,b.jsx)(`input`,{id:`emb-dense-model`,type:`text`,value:l,onChange:e=>u(e.target.value),placeholder:`BAAI/bge-small-en-v1.5`})]})]}),r===`api`&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-litellm-api-key`,children:`LiteLLM API Key (Optional / Bearer)`}),(0,b.jsx)(`input`,{id:`emb-litellm-api-key`,type:`password`,value:h,onChange:e=>g?.(e.target.value),placeholder:`sk-...`,autoComplete:`off`})]}),(0,b.jsx)(`div`,{className:`form-group`,style:{display:`flex`,flexDirection:`column`,justifyContent:`flex-end`},children:(0,b.jsx)(`button`,{type:`button`,id:`btn-discover-models`,className:`btn btn-secondary`,onClick:T,disabled:w,style:{height:`38px`,whiteSpace:`nowrap`},children:w?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Discovering...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-bolt`}),` Discover Models`]})})})]}),C&&(0,b.jsx)(`div`,{style:{marginBottom:`16px`},children:C.status===`success`?(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,padding:`8px 12px`,background:`rgba(16, 185, 129, 0.1)`,border:`1px solid rgba(16, 185, 129, 0.3)`,borderRadius:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-check`,style:{color:`#10b981`}}),(0,b.jsxs)(`span`,{children:[`Connected to LiteLLM — `,(0,b.jsxs)(`strong`,{children:[C.total_models,` models available`]}),` (`,ie.length,` embedding, `,j.length,` vision, `,M.length,` chat)`]})]}):(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,padding:`8px 12px`,background:`rgba(239, 68, 68, 0.1)`,border:`1px solid rgba(239, 68, 68, 0.3)`,borderRadius:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`,style:{color:`#ef4444`}}),(0,b.jsx)(`span`,{children:C.message||`Could not connect to LiteLLM endpoint`})]})}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:`4px`},children:[(0,b.jsx)(`label`,{htmlFor:`emb-dense-model`,style:{marginBottom:0},children:`Dense Embedding Model`}),ie.length>0&&(0,b.jsx)(`button`,{type:`button`,className:`btn-link`,onClick:()=>ee(!k),style:{fontSize:`0.75rem`,background:`none`,border:`none`,color:`#38bdf8`,cursor:`pointer`,padding:0},children:k?`← Select from discovered`:`Enter custom model →`})]}),!k&&ie.length>0?(0,b.jsxs)(`select`,{id:`emb-dense-model`,value:l,onChange:e=>{e.target.value===`__custom__`?ee(!0):u(e.target.value)},children:[ie.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e)),(0,b.jsx)(`option`,{value:`__custom__`,children:`Custom / Enter manually...`})]}):(0,b.jsx)(`input`,{id:`emb-dense-model`,type:`text`,value:l,onChange:e=>u(e.target.value),placeholder:`gemini-embedding-2`})]})]}),r===`local`&&(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-sparse-model`,children:`Sparse BM25 Model`}),(0,b.jsx)(`input`,{id:`emb-sparse-model`,type:`text`,value:d,onChange:e=>f(e.target.value),placeholder:`Qdrant/bm25`})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:`4px`},children:[(0,b.jsxs)(`label`,{htmlFor:`emb-vision-ocr-model`,style:{marginBottom:0},children:[`Vision AI OCR Model `,(0,b.jsx)(`span`,{className:`text-muted`,style:{fontWeight:400,fontSize:`0.8rem`},children:`(PDF Ingestion Fallback)`})]}),j.length>0&&(0,b.jsx)(`button`,{type:`button`,className:`btn-link`,onClick:()=>te(!A),style:{fontSize:`0.75rem`,background:`none`,border:`none`,color:`#38bdf8`,cursor:`pointer`,padding:0},children:A?`← Select from discovered`:`Enter custom model →`})]}),!A&&j.length>0?(0,b.jsxs)(`select`,{id:`emb-vision-ocr-model`,value:v,onChange:e=>{e.target.value===`__custom__`?te(!0):y?.(e.target.value)},children:[j.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e)),(0,b.jsx)(`option`,{value:`__custom__`,children:`Custom / Enter manually...`})]}):(0,b.jsx)(`input`,{id:`emb-vision-ocr-model`,type:`text`,value:v,onChange:e=>y?.(e.target.value),placeholder:`gemini-2.5-flash`})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:`4px`},children:[(0,b.jsx)(`label`,{htmlFor:`emb-chat-model`,style:{marginBottom:0},children:`General Chat & Synthesis Model`}),M.length>0&&(0,b.jsx)(`button`,{type:`button`,className:`btn-link`,onClick:()=>re(!ne),style:{fontSize:`0.75rem`,background:`none`,border:`none`,color:`#38bdf8`,cursor:`pointer`,padding:0},children:ne?`← Select from discovered`:`Enter custom model →`})]}),!ne&&M.length>0?(0,b.jsxs)(`select`,{id:`emb-chat-model`,value:x,onChange:e=>{e.target.value===`__custom__`?re(!0):S?.(e.target.value)},children:[M.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e)),(0,b.jsx)(`option`,{value:`__custom__`,children:`Custom / Enter manually...`})]}):(0,b.jsx)(`input`,{id:`emb-chat-model`,type:`text`,value:x,onChange:e=>S?.(e.target.value),placeholder:`gemini-2.5-flash`})]}),(0,b.jsx)(`div`,{style:{display:`flex`,gap:`10px`,marginTop:`16px`},children:(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:n||t,children:n?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Saving & Applying...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-floppy-disk`}),` Save & Apply Embedding Limits & Model Settings`]})})})]})]})]})]})}function M({isLoadingAutoSync:e,intervalMins:t,setIntervalMins:n,hasGlobalSecret:r,showWebhookSecret:i,setShowWebhookSecret:a,webhookSecret:o,setWebhookSecret:s,fullWebhookUrl:c,copiedWebhookUrl:l,isSavingAutoSync:u,onSaveAutoSync:d,onClearWebhookSecret:f,onCopyWebhookUrl:p}){return(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Auto-Sync & Webhooks`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Configure scheduled background repository polling interval and global incoming webhook triggers.`}),e&&!t?(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`12px`},children:`Loading auto-sync settings...`}):(0,b.jsxs)(`form`,{onSubmit:d,style:{marginTop:`16px`},children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:1},children:[(0,b.jsx)(`label`,{htmlFor:`auto-sync-interval`,children:`Repository Polling Interval`}),(0,b.jsxs)(`select`,{id:`auto-sync-interval`,value:t,onChange:e=>n(Number(e.target.value)),style:{width:`100%`},children:[(0,b.jsx)(`option`,{value:0,children:`Disabled (0m)`}),(0,b.jsx)(`option`,{value:5,children:`5 minutes`}),(0,b.jsx)(`option`,{value:15,children:`15 minutes (Default)`}),(0,b.jsx)(`option`,{value:30,children:`30 minutes`}),(0,b.jsx)(`option`,{value:60,children:`1 hour`}),(0,b.jsx)(`option`,{value:360,children:`6 hours`}),![0,5,15,30,60,360].includes(t)&&(0,b.jsxs)(`option`,{value:t,children:[t,` minutes (Custom)`]})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:1},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:`6px`},children:[(0,b.jsx)(`label`,{htmlFor:`auto-sync-secret`,style:{marginBottom:0},children:`Global Webhook Secret (HMAC / Token)`}),r?(0,b.jsx)(`span`,{className:`badge badge-accent`,children:`Secret Active`}):(0,b.jsx)(`span`,{className:`badge badge-secondary`,style:{color:`var(--text-muted)`},children:`None`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`input`,{id:`auto-sync-secret`,type:i?`text`:`password`,value:o,onChange:e=>s(e.target.value),placeholder:r?`Secret configured (enter new to change)`:`Enter webhook secret (optional)`,style:{flex:1}}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>a(!i),title:i?`Hide secret`:`Reveal secret`,"aria-label":i?`Hide secret`:`Reveal secret`,style:{minWidth:`42px`,padding:`0 12px`},children:(0,b.jsx)(`i`,{className:`fa-solid ${i?`fa-eye-slash`:`fa-eye`}`})}),(r||o)&&(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:f,title:`Clear secret`,"aria-label":`Clear secret`,disabled:u,style:{padding:`0 12px`},children:`Clear`})]})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{marginTop:`14px`,minWidth:0,width:`100%`},children:[(0,b.jsx)(`label`,{htmlFor:`auto-sync-webhook-url`,children:`Incoming Webhook Payload URL`}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,minWidth:0,width:`100%`},children:[(0,b.jsx)(`input`,{id:`auto-sync-webhook-url`,type:`text`,readOnly:!0,value:c,style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`,flex:1,minWidth:0,width:`100%`},"aria-label":`Webhook Payload URL`}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:p,style:{minWidth:`95px`},"aria-label":`Copy Webhook URL`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${l?`fa-check`:`fa-copy`}`}),` `,l?`Copied!`:`Copy`]})]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{fontSize:`0.8rem`,marginTop:`6px`},children:`Payload URL for repository push webhooks. Webhooks trigger immediate background synchronization for registered repositories.`})]}),(0,b.jsx)(`div`,{style:{display:`flex`,gap:`10px`,marginTop:`18px`},children:(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:u,children:u?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Saving...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-floppy-disk`}),` Save Auto-Sync Settings`]})})})]})]})}function N({stats:e,ghAuth:t,glAuth:n,gtAuth:r,ghToken:i,setGhToken:a,glToken:o,setGlToken:s,gtToken:c,setGtToken:l,hostCredentials:u,isHostModalOpen:d,setIsHostModalOpen:f,newHost:p,setNewHost:m,newHostProvider:h,setNewHostProvider:g,newHostUser:_,setNewHostUser:v,newHostToken:y,setNewHostToken:x,isSavingHost:S,onSaveToken:C,onClearToken:w,onSaveHostCredential:T,onDeleteHostCredential:E}){return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-key`}),` Global Git Provider Authentication`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Default tokens are automatically applied to repositories matching these providers when no per-repo or host-specific override exists.`}),(0,b.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(min(100%, 300px), 1fr))`,gap:`20px`,marginTop:`20px`},children:[(0,b.jsxs)(`div`,{className:`settings-provider-box`,style:{background:`rgba(255,255,255,0.02)`,padding:`16px`,borderRadius:`10px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,fontWeight:600},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github fa-lg`}),` GitHub`]}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:t.token_source})]}),(0,b.jsxs)(`div`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`,marginBottom:`8px`,wordBreak:`break-all`},children:[`Active Token: `,(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:t.masked_token})]}),e?.rate_limit&&(0,b.jsxs)(`div`,{style:{fontSize:`0.78rem`,color:`var(--text-muted)`,marginBottom:`12px`},children:[`Rate Limit: `,e.rate_limit.remaining,` / `,e.rate_limit.limit,` requests`]}),(0,b.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),C(`github_token`,i,`GitHub`)},children:[(0,b.jsx)(`div`,{className:`form-group`,style:{marginBottom:`10px`},children:(0,b.jsx)(`input`,{type:`password`,placeholder:`ghp_xxxxxxxxxxxx`,value:i,onChange:e=>a(e.target.value)})}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},children:`Save`}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},onClick:()=>w(`github_token`,`GitHub`),children:`Clear`})]})]})]}),(0,b.jsxs)(`div`,{className:`settings-provider-box`,style:{background:`rgba(255,255,255,0.02)`,padding:`16px`,borderRadius:`10px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,fontWeight:600},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-gitlab fa-lg`,style:{color:`#fc6d26`}}),` GitLab (Global)`]}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:n.token_source})]}),(0,b.jsxs)(`div`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`,marginBottom:`16px`,wordBreak:`break-all`},children:[`Active Token: `,(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:n.masked_token})]}),(0,b.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),C(`gitlab_token`,o,`GitLab`)},children:[(0,b.jsx)(`div`,{className:`form-group`,style:{marginBottom:`10px`},children:(0,b.jsx)(`input`,{type:`password`,placeholder:`glpat-xxxxxxxxxxxx`,value:o,onChange:e=>s(e.target.value)})}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},children:`Save`}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},onClick:()=>w(`gitlab_token`,`GitLab`),children:`Clear`})]})]})]}),(0,b.jsxs)(`div`,{className:`settings-provider-box`,style:{background:`rgba(255,255,255,0.02)`,padding:`16px`,borderRadius:`10px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,fontWeight:600},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-mug-hot fa-lg`,style:{color:`#609926`}}),` Gitea / Forgejo`]}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:r.token_source})]}),(0,b.jsxs)(`div`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`,marginBottom:`16px`,wordBreak:`break-all`},children:[`Active Token: `,(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:r.masked_token})]}),(0,b.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),C(`gitea_token`,c,`Gitea`)},children:[(0,b.jsx)(`div`,{className:`form-group`,style:{marginBottom:`10px`},children:(0,b.jsx)(`input`,{type:`password`,placeholder:`Token / Personal Token`,value:c,onChange:e=>l(e.target.value)})}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},children:`Save`}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},onClick:()=>w(`gitea_token`,`Gitea`),children:`Clear`})]})]})]})]})]}),(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-shield-halved`}),` Custom & Self-Hosted Git Host Vault`]}),(0,b.jsxs)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:[`Define credentials for self-hosted GitLab Enterprise, Gitea, or custom servers (e.g. `,(0,b.jsx)(`code`,{children:`gitlab.mycorp.com`}),` or `,(0,b.jsx)(`code`,{children:`git.lan:3000`}),`).`]})]}),(0,b.jsxs)(`button`,{className:`btn btn-primary`,onClick:()=>f(!0),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-plus`}),` Add Host Credential`]})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,style:{marginTop:`16px`},children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Host Domain / Address`}),(0,b.jsx)(`th`,{children:`Provider Type`}),(0,b.jsx)(`th`,{children:`Auth User`}),(0,b.jsx)(`th`,{children:`Masked Token`}),(0,b.jsx)(`th`,{children:`Added At`}),(0,b.jsx)(`th`,{children:`Actions`})]})}),(0,b.jsx)(`tbody`,{children:u.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:6,className:`empty-state`,children:`No custom host credentials configured. Add a host domain to authenticate self-hosted instances.`})}):u.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.host})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.provider.toUpperCase()})}),(0,b.jsx)(`td`,{children:e.auth_user?(0,b.jsx)(`code`,{children:e.auth_user}):(0,b.jsx)(`span`,{className:`text-muted`,children:`Default`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.masked_token})}),(0,b.jsx)(`td`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`},children:e.added_at}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`button`,{className:`btn-icon btn-delete`,onClick:()=>E(e.id,e.host),title:`Delete Credential`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`})})})]},e.id))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:u.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No custom host credentials configured. Add a host domain to authenticate self-hosted instances.`}):u.map(e=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:(0,b.jsx)(`code`,{style:{fontSize:`0.95rem`},children:e.host})}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.provider.toUpperCase()})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Auth User: `}),e.auth_user?(0,b.jsx)(`code`,{children:e.auth_user}):(0,b.jsx)(`span`,{className:`text-muted`,children:`Default`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Masked Token: `}),(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.masked_token})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Added At: `}),(0,b.jsx)(`span`,{style:{color:`var(--text-muted)`},children:e.added_at})]})]}),(0,b.jsx)(`div`,{className:`data-mobile-card-actions`,children:(0,b.jsxs)(`button`,{className:`btn btn-secondary btn-delete`,onClick:()=>E(e.id,e.host),title:`Delete Credential`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Delete`]})})]},`card-${e.id}`))})]}),d&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-shield-halved`}),` Add Host Credential`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>f(!1),children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:T,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`host-domain`,children:`Host Domain / IP`}),(0,b.jsx)(`input`,{type:`text`,id:`host-domain`,required:!0,placeholder:`e.g. gitlab.mycorp.internal or git.lan:3000`,value:p,onChange:e=>m(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`host-provider`,children:`Provider Type`}),(0,b.jsxs)(`select`,{id:`host-provider`,value:h,onChange:e=>g(e.target.value),children:[(0,b.jsx)(`option`,{value:`gitlab`,children:`GitLab Enterprise / Self-Hosted`}),(0,b.jsx)(`option`,{value:`gitea`,children:`Gitea / Forgejo`}),(0,b.jsx)(`option`,{value:`github`,children:`GitHub Enterprise`}),(0,b.jsx)(`option`,{value:`bitbucket`,children:`Bitbucket Server / Cloud`}),(0,b.jsx)(`option`,{value:`generic`,children:`Generic Git (HTTP / HTTPS)`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`host-user`,children:`Auth User (Optional)`}),(0,b.jsx)(`input`,{type:`text`,id:`host-user`,placeholder:`e.g. oauth2 or gitlab-ci-token`,value:_,onChange:e=>v(e.target.value)})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`host-token`,children:`Personal Access Token / Password`}),(0,b.jsx)(`input`,{type:`password`,id:`host-token`,required:!0,placeholder:`Token or password`,value:y,onChange:e=>x(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>f(!1),children:`Cancel`}),(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:S,children:S?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Saving...`]}):`Save Host Credential`})]})]})]})})]})}var ae=`contextcortex_theme`,oe=`deep-ocean`,se=[{id:`deep-ocean`,name:`Deep Ocean`,mode:`dark`,description:`Monochromatic petrol slate with vibrant cyan and mint accents.`,swatches:[`#07181b`,`#0d2c2f`,`#0891b2`,`#2dd4bf`]},{id:`midnight-blue`,name:`Midnight Blue`,mode:`dark`,description:`Classic deep space navy with cobalt blue and teal highlights.`,swatches:[`#0a0f1d`,`#121a2f`,`#3b82f6`,`#14b8a6`]},{id:`lavender-haze`,name:`Lavender Haze`,mode:`light`,description:`Elegant soft violet canvas with vibrant purple, fuchsia accents, and plum text.`,swatches:[`#f5f3ff`,`#faf8ff`,`#7c3aed`,`#ec4899`]},{id:`amber-warmth`,name:`Amber Warmth`,mode:`light`,description:`Warm sandstone canvas with terracotta orange, amber accents, and espresso text.`,swatches:[`#fdf8f4`,`#ffffff`,`#ea580c`,`#d97706`]}];function P(){if(typeof window>`u`)return oe;try{let e=localStorage.getItem(ae);if(e===`arctic-frost`||e===`aqua-breeze`)return`lavender-haze`;if(e===`solar-daybreak`||e===`azure-daylight`)return`amber-warmth`;if(e&&se.some(t=>t.id===e))return e}catch{}return oe}function F(e){if(!(typeof document>`u`)){document.documentElement.setAttribute(`data-theme`,e);try{localStorage.setItem(ae,e)}catch{}}}function ce(){let[e,t]=(0,_.useState)(`deep-ocean`),n=S();(0,_.useEffect)(()=>{t(P())},[]);let r=(e,r)=>{F(e),t(e),n.success(`Switched theme to ${r}`)};return(0,b.jsxs)(`section`,{className:`settings-section glass-card`,"aria-labelledby":`theme-settings-heading`,children:[(0,b.jsxs)(`div`,{className:`section-header`,children:[(0,b.jsx)(`div`,{className:`header-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-palette`})}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`h2`,{id:`theme-settings-heading`,style:{fontSize:`1.1rem`,fontWeight:600},children:`Appearance & Theme`}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Choose your preferred color scheme. The selected theme will persist across browser sessions.`})]})]}),(0,b.jsx)(`div`,{className:`theme-options-grid`,role:`radiogroup`,"aria-label":`Appearance Themes`,children:se.map(t=>{let n=e===t.id;return(0,b.jsxs)(`button`,{type:`button`,className:`theme-card ${n?`active`:``}`,onClick:()=>r(t.id,t.name),role:`radio`,"aria-checked":n,"aria-label":`Select ${t.name} theme`,children:[(0,b.jsxs)(`div`,{className:`theme-card-header`,children:[(0,b.jsxs)(`div`,{className:`theme-card-title`,children:[(0,b.jsx)(`span`,{children:t.name}),(0,b.jsxs)(`span`,{className:`badge`,style:{fontSize:`0.68rem`,fontWeight:500,opacity:.85,padding:`2px 6px`},children:[(0,b.jsx)(`i`,{className:`fa-solid ${t.mode===`dark`?`fa-moon`:`fa-sun`}`,style:{marginRight:`3px`}}),t.mode===`dark`?`Dark`:`Light`]})]}),n?(0,b.jsxs)(`span`,{className:`badge badge-accent`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-check`,style:{marginRight:`4px`}}),` Active`]}):(0,b.jsx)(`span`,{className:`badge badge-primary`,children:`Select`})]}),(0,b.jsx)(`div`,{className:`theme-card-desc`,children:t.description}),(0,b.jsx)(`div`,{className:`theme-swatches`,"aria-hidden":`true`,children:t.swatches.map((e,t)=>(0,b.jsx)(`span`,{className:`theme-swatch`,style:{backgroundColor:e},title:e},t))})]},t.id)})})]})}function le(){let[e,t]=(0,_.useState)({summary_enabled:!0,summary_threshold_kb:500,summary_max_file_size_mb:10,read_file_max_lines:2e3,summary_chat_model:`gemini-2.5-flash`}),[n,r]=(0,_.useState)(!1),[i,a]=(0,_.useState)(!1),o=S(),s=async()=>{r(!0);try{let e=await fetch(`/admin/api/settings/files`);if(e.ok){let n=await e.json();t({summary_enabled:n.summary_enabled!==!1,summary_threshold_kb:n.summary_threshold_kb??500,summary_max_file_size_mb:n.summary_max_file_size_mb??10,read_file_max_lines:n.read_file_max_lines??2e3,summary_chat_model:n.summary_chat_model||`gemini-2.5-flash`})}}catch(e){console.error(`Failed to load file settings:`,e)}finally{r(!1)}};return(0,_.useEffect)(()=>{s()},[]),(0,b.jsxs)(`section`,{className:`settings-section glass-card`,"aria-labelledby":`file-settings-heading`,children:[(0,b.jsxs)(`div`,{className:`section-header`,children:[(0,b.jsx)(`div`,{className:`header-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-file-lines`})}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`h2`,{id:`file-settings-heading`,style:{fontSize:`1.1rem`,fontWeight:600},children:`Files & Large File Summarization`}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Configure retrieval ceilings for AI agents and automatic LLM summarization thresholds for large files in watched folders and uploads.`})]})]}),n?(0,b.jsxs)(`div`,{style:{padding:`24px`,textAlign:`center`},className:`text-muted`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`}}),` Loading settings...`]}):(0,b.jsx)(`form`,{onSubmit:async n=>{n.preventDefault(),a(!0);try{let n=await fetch(`/admin/api/settings/files`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(n.ok){let e=await n.json();t(e),o.success(`File and summarization settings updated successfully`)}else{let e=await n.json();o.error(e.error||`Failed to save settings`)}}catch(e){o.error(`Save failed: ${e.message}`)}finally{a(!1)}},style:{marginTop:`16px`},children:(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`16px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`12px 16px`,background:`rgba(255,255,255,0.03)`,borderRadius:`8px`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`summary-enabled-toggle`,style:{fontWeight:600,display:`block`,cursor:`pointer`},children:`Enable Large File Summarization`}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.8rem`},children:`Automatically generate and vector-embed an executive summary when files exceed the size threshold instead of skipping them.`})]}),(0,b.jsx)(`input`,{id:`summary-enabled-toggle`,type:`checkbox`,checked:e.summary_enabled,onChange:n=>t({...e,summary_enabled:n.target.checked}),style:{width:`18px`,height:`18px`,cursor:`pointer`},"aria-label":`Enable Large File Summarization`})]}),(0,b.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(220px, 1fr))`,gap:`16px`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`summary-threshold-input`,style:{fontSize:`0.85rem`,fontWeight:500,display:`block`,marginBottom:`6px`},children:`Auto-Summarize Threshold (KB)`}),(0,b.jsx)(`input`,{id:`summary-threshold-input`,type:`number`,min:`10`,max:`50000`,value:e.summary_threshold_kb,onChange:n=>t({...e,summary_threshold_kb:Number(n.target.value)}),className:`input-field`,style:{width:`100%`},disabled:!e.summary_enabled}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`4px`,display:`block`},children:`Files larger than this (default: 500 KB) trigger LLM summarization.`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`summary-max-size-input`,style:{fontSize:`0.85rem`,fontWeight:500,display:`block`,marginBottom:`6px`},children:`Max File Size for Summarization (MB)`}),(0,b.jsx)(`input`,{id:`summary-max-size-input`,type:`number`,min:`1`,max:`100`,value:e.summary_max_file_size_mb,onChange:n=>t({...e,summary_max_file_size_mb:Number(n.target.value)}),className:`input-field`,style:{width:`100%`},disabled:!e.summary_enabled}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`4px`,display:`block`},children:`Files larger than this ceiling (default: 10 MB) are skipped to protect memory.`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`read-file-max-lines-input`,style:{fontSize:`0.85rem`,fontWeight:500,display:`block`,marginBottom:`6px`},children:`Max Lines Per Read`}),(0,b.jsx)(`input`,{id:`read-file-max-lines-input`,type:`number`,min:`50`,max:`20000`,value:e.read_file_max_lines,onChange:n=>t({...e,read_file_max_lines:Number(n.target.value)}),className:`input-field`,style:{width:`100%`}}),(0,b.jsxs)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`4px`,display:`block`},children:[`Default line ceiling for `,(0,b.jsx)(`code`,{children:`read_file`}),` tool calls (default: 2000 lines).`]})]})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`summary-chat-model-input`,style:{fontSize:`0.85rem`,fontWeight:500,display:`block`,marginBottom:`6px`},children:`Summarization Chat Model`}),(0,b.jsx)(`input`,{id:`summary-chat-model-input`,type:`text`,value:e.summary_chat_model,onChange:n=>t({...e,summary_chat_model:n.target.value}),placeholder:`e.g. gemini-2.5-flash or gpt-4o-mini`,className:`input-field`,style:{width:`100%`},disabled:!e.summary_enabled}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`4px`,display:`block`},children:`LiteLLM chat model identifier used for generating file summaries.`})]}),(0,b.jsx)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,marginTop:`8px`},children:(0,b.jsx)(`button`,{type:`submit`,disabled:i,className:`btn btn-primary`,style:{display:`flex`,alignItems:`center`,gap:`8px`},children:i?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Saving...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-floppy-disk`}),` Save File Settings`]})})})]})})]})}function ue({stats:e,refreshStats:t}){let[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)([]),[u,d]=(0,_.useState)(15),[f,p]=(0,_.useState)(``),[m,h]=(0,_.useState)(!1),[g,v]=(0,_.useState)(`/api/webhooks/git`),[y,x]=(0,_.useState)(!1),[C,w]=(0,_.useState)(!1),[T,E]=(0,_.useState)(!1),[D,O]=(0,_.useState)(!1),[k,ee]=(0,_.useState)(!1),[A,te]=(0,_.useState)(``),[ne,re]=(0,_.useState)(`gitlab`),[ae,oe]=(0,_.useState)(``),[se,P]=(0,_.useState)(``),[F,ue]=(0,_.useState)(!1),[de,fe]=(0,_.useState)(null),[pe,me]=(0,_.useState)(!1),[he,ge]=(0,_.useState)(`qdrant`),[_e,ve]=(0,_.useState)(`embedded`),[ye,be]=(0,_.useState)(`data/qdrant_db`),[xe,Se]=(0,_.useState)(`http://localhost:6333`),[Ce,we]=(0,_.useState)(`knowledge_rag_v1`),[Te,Ee]=(0,_.useState)(!1),[De,I]=(0,_.useState)(null),[Oe,ke]=(0,_.useState)(!1),[Ae,je]=(0,_.useState)(null),[Me,Ne]=(0,_.useState)(!1),[Pe,Fe]=(0,_.useState)(!1),[Ie,Le]=(0,_.useState)(`local`),[Re,ze]=(0,_.useState)(2),[Be,Ve]=(0,_.useState)(32),[He,Ue]=(0,_.useState)(`BAAI/bge-small-en-v1.5`),[We,Ge]=(0,_.useState)(`Qdrant/bm25`),[Ke,qe]=(0,_.useState)(`http://litellm:4000/v1`),[Je,Ye]=(0,_.useState)(``),[Xe,Ze]=(0,_.useState)(`gemini-2.5-flash`),[Qe,$e]=(0,_.useState)(`gemini-2.5-flash`),[et,tt]=(0,_.useState)(null),[nt,rt]=(0,_.useState)(!1),L=S(),it=(0,_.useCallback)(async()=>{try{let e=await fetch(`/admin/api/settings/hosts`);if(e.ok){let t=await e.json();l(Array.isArray(t)?t:[])}}catch(e){console.error(`Failed to load host credentials:`,e),l([])}},[]),at=(0,_.useCallback)(async()=>{me(!0);try{let e=await fetch(`/admin/api/vector-store`);if(e.ok){let t=await e.json();fe(t),t.provider&&ge(t.provider),t.mode&&ve(t.mode),t.storage_path&&be(t.storage_path),t.url&&Se(t.url),t.collection&&we(t.collection)}}catch(e){console.error(`Failed to load vector store config:`,e)}finally{me(!1)}},[]),ot=(0,_.useCallback)(async()=>{x(!0);try{let e=await fetch(`/admin/api/settings/auto-sync`);if(e.ok){let t=await e.json();typeof t.interval_mins==`number`&&d(t.interval_mins),typeof t.webhook_url==`string`&&v(t.webhook_url),typeof t.has_global_secret==`boolean`&&h(t.has_global_secret)}}catch(e){console.error(`Failed to load auto-sync settings:`,e)}finally{x(!1)}},[]),st=(0,_.useCallback)(async()=>{Ne(!0);try{let e=await fetch(`/admin/api/settings/embedding`);if(e.ok){let t=await e.json();je(t),t.provider&&Le(t.provider),typeof t.threads==`number`&&ze(t.threads),typeof t.batch_size==`number`&&Ve(t.batch_size),t.dense_model&&Ue(t.dense_model),t.sparse_model&&Ge(t.sparse_model),t.litellm_url&&qe(t.litellm_url),t.litellm_api_key&&Ye(t.litellm_api_key),t.vision_ocr_model&&Ze(t.vision_ocr_model),t.chat_model&&$e(t.chat_model)}}catch(e){console.error(`Failed to load embedding config:`,e)}finally{Ne(!1)}},[]);(0,_.useEffect)(()=>{it(),at(),ot(),st()},[it,at,ot,st]),(0,_.useEffect)(()=>{e?.vector_store?(fe(e.vector_store),e.vector_store.provider&&ge(e.vector_store.provider),e.vector_store.mode&&ve(e.vector_store.mode),e.vector_store.storage_path&&be(e.vector_store.storage_path),e.vector_store.url&&Se(e.vector_store.url),e.vector_store.collection&&we(e.vector_store.collection)):e?.vector_store_provider&&fe(t=>t?{...t,provider:e.vector_store_provider||t.provider,mode:e.vector_store_mode||t.mode,collection:e.vector_store_collection||t.collection,points_count:e.points_count??t.points_count,healthy:e.vector_db_status?e.vector_db_status===`Healthy`:t.healthy}:null)},[e]);let ct=async()=>{rt(!0);try{let e=new URLSearchParams;Ke&&e.set(`url`,Ke.trim()),Je&&e.set(`api_key`,Je.trim());let t=await(await fetch(`/admin/api/models/discover?${e.toString()}`)).json();tt(t),t.status===`success`?L.success(`Discovered ${t.total_models} models from LiteLLM`):L.error(t.message||`Failed to discover models from LiteLLM`)}catch(e){tt({status:`error`,total_models:0,models:[],embedding_models:[],vision_models:[],chat_models:[],message:e.message||`Network error discovering models`}),L.error(`Error discovering models: ${e.message}`)}finally{rt(!1)}},lt=async e=>{e.preventDefault(),Fe(!0);try{let e={provider:Ie,threads:Number(Re),batch_size:Number(Be),dense_model:He.trim()||void 0,sparse_model:We.trim()||void 0,litellm_url:Ie===`api`&&Ke.trim()||void 0,litellm_api_key:Ie===`api`&&Je.trim()||void 0,vision_ocr_model:Xe.trim()||void 0,chat_model:Qe.trim()||void 0},n=await fetch(`/admin/api/settings/embedding`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),r=await n.json();if(!n.ok)throw Error(r.error||r.message||`Failed to save embedding settings`);r.config&&je(r.config),L.success(`Embedding resource limits updated successfully`),t()}catch(e){L.error(`Error saving embedding settings: `+e.message)}finally{Fe(!1)}},ut=`${typeof window<`u`?window.location.origin:``}${g||`/api/webhooks/git`}`,dt=async()=>{try{navigator?.clipboard?.writeText&&await navigator.clipboard.writeText(ut),O(!0),L.info(`Webhook URL copied to clipboard`),setTimeout(()=>O(!1),2e3)}catch(e){L.error(`Failed to copy: `+e.message)}},ft=async e=>{e.preventDefault(),w(!0);try{let e={interval_mins:Number(u)};f.trim()&&(e.global_webhook_secret=f.trim());let t=await fetch(`/admin/api/settings/auto-sync`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to save auto-sync settings`);typeof n.has_global_secret==`boolean`?h(n.has_global_secret):f.trim()&&h(!0),typeof n.interval_mins==`number`&&d(n.interval_mins),p(``),L.success(`Auto-sync settings saved successfully`)}catch(e){L.error(`Error saving auto-sync settings: `+e.message)}finally{w(!1)}},pt=async()=>{if(f&&!m){p(``);return}if(window.confirm(`Clear the global webhook secret? Incoming webhook payloads will no longer require secret verification unless configured per-repository.`)){w(!0);try{let e=await fetch(`/admin/api/settings/auto-sync`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({interval_mins:Number(u),global_webhook_secret:``})}),t=await e.json();if(!e.ok)throw Error(t.error||`Failed to clear global webhook secret`);h(!1),p(``),L.success(`Global webhook secret cleared`)}catch(e){L.error(`Failed to clear webhook secret: `+e.message)}finally{w(!1)}}},mt=e=>{ge(e),e===`qdrant`?((!ye||ye===`data/chroma_db`)&&be(`data/qdrant_db`),(!xe||xe===`http://localhost:8000`)&&Se(`http://localhost:6333`)):((!ye||ye===`data/qdrant_db`)&&be(`data/chroma_db`),(!xe||xe===`http://localhost:6333`)&&Se(`http://localhost:8000`))},ht=e=>{ve(e),e===`embedded`&&!ye&&be(he===`chroma`?`data/chroma_db`:`data/qdrant_db`),e===`remote`&&!xe&&Se(he===`chroma`?`http://localhost:8000`:`http://localhost:6333`)},gt=async()=>{Ee(!0),I(null);try{let e={provider:he,mode:_e,storage_path:_e===`embedded`?ye.trim():null,url:_e===`remote`?xe.trim():null,collection:Ce.trim()||`knowledge_rag_v1`},t=await fetch(`/admin/api/vector-store/test`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),n=await t.json();if(!t.ok||!n.success){let e=n.message||n.error||`Vector store connection test failed`;I({success:!1,message:e}),L.error(`Vector store test: `+e)}else{let e=n.message||`Vector store connection test successful`;I({success:!0,message:e}),L.success(e)}}catch(e){let t=e.message||`Connection error`;I({success:!1,message:t}),L.error(`Vector store test error: `+t)}finally{Ee(!1)}},_t=async()=>{let e=he===`chroma`?`ChromaDB`:`Qdrant`,n=_e===`embedded`?`Embedded Disk`:`Remote Server`;if(window.confirm(`Switch active vector database backend to ${e} (${n})? This will update settings and trigger a full re-indexing of all sources.`)){ke(!0);try{let n={provider:he,mode:_e,storage_path:_e===`embedded`?ye.trim():null,url:_e===`remote`?xe.trim():null,collection:Ce.trim()||`knowledge_rag_v1`},r=await fetch(`/admin/api/vector-store/switch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}),i=await r.json();if(!r.ok||i.status===`error`){let e=i.error||i.message||`Failed to switch vector database backend`;I({success:!1,message:e}),L.error(`Switch error: `+e)}else{let n=i.message||`Switched vector backend to ${e}`;I({success:!0,message:n}),L.success(n),await at(),t()}}catch(e){I({success:!1,message:e.message}),L.error(`Switch error: `+e.message)}finally{ke(!1)}}},vt=async(e,n,i)=>{if(n.trim())try{let o=await fetch(`/admin/api/settings/token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({[e]:n.trim()})}),c=await o.json();if(!o.ok)throw Error(c.error||`Failed to save token`);L.success(`${i} token saved successfully.`),e===`github_token`&&r(``),e===`gitlab_token`&&a(``),e===`gitea_token`&&s(``),t()}catch(e){L.error(`Error saving ${i} token: `+e.message)}},yt=async(e,n)=>{if(window.confirm(`Clear the stored ${n} token from database?`))try{let r=await fetch(`/admin/api/settings/token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({[e]:``})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error||`Failed to clear token`)}L.success(`${n} token cleared`),t()}catch(e){L.error(`Failed to clear ${n} token: `+e.message)}},bt=async e=>{if(e.preventDefault(),!(!A.trim()||!se.trim())){ue(!0);try{let e=await fetch(`/admin/api/settings/hosts`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({host:A.trim(),provider:ne,auth_user:ae.trim()||null,auth_token:se.trim()})}),t=await e.json();if(!e.ok)throw Error(t.error||`Failed to save host credential`);L.success(`Host credential for '${A.trim()}' saved`),ee(!1),te(``),re(`gitlab`),oe(``),P(``),it()}catch(e){L.error(`Error: `+e.message)}finally{ue(!1)}}},xt=async(e,t)=>{if(window.confirm(`Remove stored credentials for host '${t}'?`))try{let n=await fetch(`/admin/api/settings/hosts/${e}`,{method:`DELETE`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to delete`)}L.success(`Removed credentials for '${t}'`),it()}catch(e){L.error(`Failed to remove: `+e.message)}},St=e?.providers_auth?.github||{token_source:e?.token_source||`None`,masked_token:e?.masked_token||`None`},Ct=e?.providers_auth?.gitlab||{token_source:`None`,masked_token:`None`},wt=e?.providers_auth?.gitea||{token_source:`None`,masked_token:`None`};return(0,b.jsxs)(`div`,{className:`tab-content active`,style:{display:`flex`,flexDirection:`column`,gap:`24px`},children:[(0,b.jsx)(ce,{}),(0,b.jsx)(ie,{vectorStore:de,isLoadingVs:pe,testFeedback:De,vsProvider:he,vsMode:_e,vsStoragePath:ye,setVsStoragePath:be,vsUrl:xe,setVsUrl:Se,vsCollection:Ce,setVsCollection:we,isTestingVs:Te,isSwitchingVs:Oe,onProviderChange:mt,onModeChange:ht,onTestConnection:gt,onSwitchBackend:_t}),(0,b.jsx)(j,{embeddingConfig:Ae,isLoadingEmb:Me,isSavingEmb:Pe,embProvider:Ie,setEmbProvider:Le,embThreads:Re,setEmbThreads:ze,embBatchSize:Be,setEmbBatchSize:Ve,embDenseModel:He,setEmbDenseModel:Ue,embSparseModel:We,setEmbSparseModel:Ge,embLitellmUrl:Ke,setEmbLitellmUrl:qe,embLitellmApiKey:Je,setEmbLitellmApiKey:Ye,embVisionOcrModel:Xe,setEmbVisionOcrModel:Ze,embChatModel:Qe,setEmbChatModel:$e,discoveryResult:et,isDiscovering:nt,onDiscoverModels:ct,onSaveEmbeddingSettings:lt}),(0,b.jsx)(M,{isLoadingAutoSync:y,intervalMins:u,setIntervalMins:d,hasGlobalSecret:m,showWebhookSecret:T,setShowWebhookSecret:E,webhookSecret:f,setWebhookSecret:p,fullWebhookUrl:ut,copiedWebhookUrl:D,isSavingAutoSync:C,onSaveAutoSync:ft,onClearWebhookSecret:pt,onCopyWebhookUrl:dt}),(0,b.jsx)(N,{stats:e,ghAuth:St,glAuth:Ct,gtAuth:wt,ghToken:n,setGhToken:r,glToken:i,setGlToken:a,gtToken:o,setGtToken:s,hostCredentials:c,isHostModalOpen:k,setIsHostModalOpen:ee,newHost:A,setNewHost:te,newHostProvider:ne,setNewHostProvider:re,newHostUser:ae,setNewHostUser:oe,newHostToken:se,setNewHostToken:P,isSavingHost:F,onSaveToken:vt,onClearToken:yt,onSaveHostCredential:bt,onDeleteHostCredential:xt}),(0,b.jsx)(le,{})]})}function de(){let e=S(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(`ALL`),[s,c]=(0,_.useState)(``),[l,u]=(0,_.useState)(!0),[d,f]=(0,_.useState)(new Set),p=(0,_.useRef)(null),m=(0,_.useRef)(null),h=(0,_.useCallback)(async()=>{i(!0);try{let e=await fetch(`/admin/api/logs`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();n(Array.isArray(t)?t:[])}catch(t){e.error(`Failed to load diagnostics logs: ${t.message}`)}finally{i(!1)}},[e]);(0,_.useEffect)(()=>{h();let e=setInterval(h,8e3);return()=>clearInterval(e)},[h]),(0,_.useEffect)(()=>{l&&m.current&&(m.current.scrollTop=m.current.scrollHeight)},[t,l]);let g=async()=>{if(window.confirm(`Are you sure you want to clear all server diagnostics logs?`))try{let t=await fetch(`/admin/api/logs`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||`HTTP ${t.status}`)}n([]),f(new Set),e.success(`Diagnostics logs cleared.`)}catch(t){e.error(`Failed to clear logs: ${t.message}`)}},v=e=>{f(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},y=e=>{switch(e.toUpperCase()){case`ERROR`:return`badge badge-danger`;case`WARNING`:return`badge badge-warning`;case`INFO`:return`badge badge-primary`;case`DEBUG`:return`badge badge-secondary`;default:return`badge badge-secondary`}},x=t.filter(e=>{if(a!==`ALL`&&e.level.toUpperCase()!==a)return!1;if(s.trim()){let t=s.toLowerCase(),n=e.message?.toLowerCase().includes(t),r=e.logger?.toLowerCase().includes(t),i=e.traceback?.toLowerCase().includes(t),a=e.level?.toLowerCase().includes(t);if(!n&&!r&&!i&&!a)return!1}return!0}),C={ALL:t.length,INFO:t.filter(e=>e.level===`INFO`).length,WARNING:t.filter(e=>e.level===`WARNING`).length,ERROR:t.filter(e=>e.level===`ERROR`).length,DEBUG:t.filter(e=>e.level===`DEBUG`).length};return(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsxs)(`div`,{className:`glass-card log-viewer-container`,children:[(0,b.jsxs)(`div`,{className:`log-viewer-header`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`}),` Diagnostics & Server Logs`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Inspect real-time server runtime events, tree-sitter AST parsing, background indexing, and MCP tool traces.`})]}),(0,b.jsxs)(`div`,{className:`log-viewer-actions`,children:[(0,b.jsxs)(`label`,{className:`log-autoscroll-label`,children:[(0,b.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),`Auto-scroll`]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:h,disabled:r,title:`Refresh logs`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-rotate ${r?`fa-spin`:``}`}),` Refresh`]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-danger`,onClick:g,title:`Clear all logs`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Clear Logs`]})]})]}),(0,b.jsxs)(`div`,{className:`log-toolbar`,children:[(0,b.jsx)(`div`,{className:`log-filter-pills`,children:[`ALL`,`INFO`,`WARNING`,`ERROR`,`DEBUG`].map(e=>(0,b.jsxs)(`button`,{type:`button`,className:`log-filter-btn ${a===e?`active`:``} ${e.toLowerCase()}`,onClick:()=>o(e),children:[e,` `,(0,b.jsx)(`span`,{className:`pill-count`,children:C[e]})]},e))}),(0,b.jsxs)(`div`,{className:`log-search-wrapper`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass search-icon`}),(0,b.jsx)(`input`,{type:`text`,className:`log-search-input`,placeholder:`Search logs by message, logger, or traceback...`,value:s,onChange:e=>c(e.target.value)}),s&&(0,b.jsx)(`button`,{type:`button`,className:`clear-search-btn`,onClick:()=>c(``),title:`Clear search`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-xmark`})})]})]}),(0,b.jsx)(`div`,{className:`log-stream-container`,ref:m,children:x.length===0?(0,b.jsxs)(`div`,{className:`empty-state`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-info`,style:{fontSize:`2rem`,marginBottom:`12px`,opacity:.5}}),(0,b.jsxs)(`p`,{children:[`No logs available `,s||a!==`ALL`?`matching current filter`:``,`.`]})]}):(0,b.jsxs)(`div`,{className:`log-stream-list`,children:[x.map((e,t)=>{let n=!!e.traceback,r=d.has(t);return(0,b.jsxs)(`div`,{className:`log-entry log-level-${e.level.toLowerCase()} ${n?`has-traceback`:``}`,children:[(0,b.jsxs)(`div`,{className:`log-entry-main`,children:[(0,b.jsx)(`span`,{className:`log-timestamp`,children:e.timestamp}),(0,b.jsx)(`span`,{className:y(e.level),children:e.level}),(0,b.jsx)(`span`,{className:`log-logger code`,children:e.logger}),(0,b.jsx)(`span`,{className:`log-message`,children:e.message}),n&&(0,b.jsxs)(`button`,{type:`button`,className:`btn-traceback-toggle`,onClick:()=>v(t),title:`Toggle traceback details`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${r?`fa-chevron-down`:`fa-chevron-right`}`}),(0,b.jsx)(`span`,{children:r?`Hide Stack Trace`:`View Stack Trace`})]})]}),n&&r&&(0,b.jsx)(`div`,{className:`log-traceback-wrapper`,children:(0,b.jsx)(`pre`,{className:`traceback-box`,children:e.traceback})})]},`${e.timestamp}-${t}`)}),(0,b.jsx)(`div`,{ref:p})]})})]})})}var fe=({repos:e,selectedRepo:t,onSelectRepo:n,density:r,onChangeDensity:i,searchQuery:a=``,onSearchChange:o,totalFiles:s=0,totalSymbols:c=0,onRefresh:l,loading:u=!1})=>(0,b.jsxs)(`div`,{className:`nav-toolbar`,"data-testid":`navigator-toolbar`,children:[(0,b.jsxs)(`div`,{className:`nav-toolbar-left`,children:[(0,b.jsxs)(`div`,{className:`nav-repo-selector-wrapper`,children:[(0,b.jsx)(`label`,{htmlFor:`nav-repo-select`,className:`nav-repo-label`,children:`Repository:`}),(0,b.jsxs)(`select`,{id:`nav-repo-select`,"aria-label":`Repository`,className:`nav-repo-select`,value:t,onChange:e=>n(e.target.value),disabled:u,children:[(0,b.jsx)(`option`,{value:`__all__`,children:`All Repositories (__all__)`}),e.filter(e=>e.name!==`__all__`).map(e=>(0,b.jsx)(`option`,{value:e.name,children:e.name},e.id??e.name))]})]}),(0,b.jsxs)(`div`,{className:`nav-stats-badges`,children:[(0,b.jsxs)(`span`,{className:`nav-stat-badge`,title:`Total Indexed Files`,children:[(0,b.jsx)(`span`,{className:`stat-num`,children:s}),` files`]}),(0,b.jsxs)(`span`,{className:`nav-stat-badge`,title:`Total Extracted AST Symbols`,children:[(0,b.jsx)(`span`,{className:`stat-num`,children:c}),` symbols`]})]})]}),(0,b.jsx)(`div`,{className:`nav-toolbar-center`,children:o&&(0,b.jsxs)(`div`,{className:`nav-global-search`,children:[(0,b.jsxs)(`svg`,{className:`search-icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]}),(0,b.jsx)(`input`,{type:`text`,className:`nav-search-input`,placeholder:`Search files (Ctrl+P / /)...`,value:a,onChange:e=>o(e.target.value),"aria-label":`Quick search files`}),a&&(0,b.jsx)(`button`,{type:`button`,className:`nav-search-clear-btn`,onClick:()=>o(``),"aria-label":`Clear search`,children:`✕`})]})}),(0,b.jsxs)(`div`,{className:`nav-toolbar-right`,children:[(0,b.jsxs)(`div`,{className:`nav-density-switcher`,role:`group`,"aria-label":`Density mode`,children:[(0,b.jsx)(`span`,{className:`density-label`,children:`Density:`}),(0,b.jsx)(`button`,{type:`button`,className:`density-btn ${r===`compact`?`active`:``}`,onClick:()=>i(`compact`),title:`Compact (20px rows - IDE mode)`,"aria-pressed":r===`compact`,children:`Compact`}),(0,b.jsx)(`button`,{type:`button`,className:`density-btn ${r===`balanced`?`active`:``}`,onClick:()=>i(`balanced`),title:`Balanced (28px rows - Default)`,"aria-pressed":r===`balanced`,children:`Balanced`}),(0,b.jsx)(`button`,{type:`button`,className:`density-btn ${r===`spacious`?`active`:``}`,onClick:()=>i(`spacious`),title:`Spacious (36px rows - Cards)`,"aria-pressed":r===`spacious`,children:`Spacious`})]}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-refresh-btn ${u?`spinning`:``}`,onClick:l,title:`Refresh codebase tree`,disabled:u,"aria-label":`Refresh codebase tree`,children:(0,b.jsx)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})})]})]});function pe(e,t){let n=e.toLowerCase();return n.endsWith(`.py`)||t===`python`?{icon:`🐍`,className:`icon-py`}:n.endsWith(`.tsx`)||n.endsWith(`.ts`)||t===`typescript`?{icon:`⚡`,className:`icon-ts`}:n.endsWith(`.jsx`)||n.endsWith(`.js`)||n.endsWith(`.mjs`)||t===`javascript`?{icon:`📜`,className:`icon-js`}:n.endsWith(`.go`)||t===`go`?{icon:`🔷`,className:`icon-go`}:n.endsWith(`.rs`)||t===`rust`?{icon:`🦀`,className:`icon-rs`}:n.endsWith(`.json`)?{icon:`📄`,className:`icon-json`}:n.endsWith(`.md`)||n.endsWith(`.markdown`)?{icon:`📝`,className:`icon-md`}:n.endsWith(`.css`)||n.endsWith(`.scss`)?{icon:`🎨`,className:`icon-css`}:n.endsWith(`.sql`)?{icon:`🗄️`,className:`icon-sql`}:n.endsWith(`.yaml`)||n.endsWith(`.yml`)||n.endsWith(`.toml`)?{icon:`⚙️`,className:`icon-yaml`}:{icon:`📄`,className:`icon-file`}}var me=({nodes:e,selectedPath:t,onSelectFile:n,filterText:r,onFilterChange:i,density:a=`balanced`,loading:o=!1})=>{let[s,c]=(0,_.useState)(``),l=r===void 0?s:r,u=i||c,[d,f]=(0,_.useState)(new Set),[p,m]=(0,_.useState)(-1),h=(0,_.useRef)(null),g=(0,_.useCallback)(e=>{let t=[],n=e=>{if(!(!e||!Array.isArray(e)))for(let r of e)r&&r.is_dir&&(t.push(r.id),Array.isArray(r.children)&&n(r.children))};return n(e),t},[]),v=(0,_.useCallback)((e,t)=>{if(!e||!Array.isArray(e))return{filteredNodes:[],matchedDirIds:new Set};let n=t.toLowerCase().trim(),r=new Set,i=e=>{if(!e)return null;let t=(e.name||``).toLowerCase().includes(n)||(e.path||``).toLowerCase().includes(n);if(e.is_dir){let n=Array.isArray(e.children)?e.children:[],a=n.map(i).filter(e=>e!==null);return a.length>0||t?(r.add(e.id),{...e,children:a.length>0?a:n}):null}return t?e:null};return{filteredNodes:e.map(i).filter(e=>e!==null),matchedDirIds:r}},[]),{filteredNodes:y,matchedDirIds:x}=(0,_.useMemo)(()=>l.trim()?v(e,l):{filteredNodes:Array.isArray(e)?e:[],matchedDirIds:new Set},[e,l,v]);(0,_.useEffect)(()=>{l.trim()&&f(e=>{let t=new Set(e);return x.forEach(e=>t.add(e)),t})},[l,x]),(0,_.useEffect)(()=>{if(t){let e=t.split(`/`),n=[];for(let t=1;t0&&f(e=>{let t=new Set(e);return n.forEach(e=>t.add(e)),t})}},[t]);let S=(0,_.useCallback)(e=>{f(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),C=(0,_.useCallback)(()=>{let t=g(e);f(new Set(t))},[e,g]),w=(0,_.useCallback)(()=>{f(new Set)},[]),T=(0,_.useMemo)(()=>{let e=[],t=!!l.trim(),n=(r,i)=>{if(!(!r||!Array.isArray(r)))for(let a of r){if(!a)continue;let r=!!(a.is_dir&&Array.isArray(a.children)&&a.children.length>0),o=d.has(a.id)||t&&x.has(a.id);e.push({node:a,depth:i,isExpanded:o,hasChildren:r}),a.is_dir&&o&&Array.isArray(a.children)&&n(a.children,i+1)}};return n(y,0),e},[y,d,l,x]);return(0,b.jsxs)(`div`,{className:`nav-tree-pane density-${a}`,"data-testid":`navigator-tree-container`,tabIndex:0,ref:h,onKeyDown:e=>{if(T.length!==0){if(e.key===`ArrowDown`)e.preventDefault(),m(e=>ee>0?e-1:T.length-1);else if(e.key===`ArrowRight`){if(e.preventDefault(),p>=0&&p=0&&p=0&&pu(e.target.value)}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-tree-clear-btn`,onClick:()=>u(``),"aria-label":`Clear filter`,children:`✕`})]})]}),(0,b.jsx)(`div`,{className:`nav-tree-content`,children:o?(0,b.jsxs)(`div`,{className:`nav-loading-wrapper`,"data-testid":`tree-loading-spinner`,children:[(0,b.jsx)(`div`,{className:`nav-spinner`}),(0,b.jsx)(`span`,{children:`Loading codebase tree...`})]}):T.length===0?(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`p`,{children:`No matching files found`}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-clear-filter-btn`,onClick:()=>u(``),children:`Clear filter`})]}):(0,b.jsx)(`div`,{className:`nav-tree-list`,role:`tree`,children:T.map((e,r)=>{let{node:i,depth:a,isExpanded:o}=e,s=!i.is_dir&&i.path===t,c=r===p,{icon:l,className:u}=i.is_dir?{icon:o?`📂`:`📁`,className:`icon-dir`}:pe(i.name,i.language);return(0,b.jsxs)(`div`,{role:`treeitem`,"aria-expanded":i.is_dir?o:void 0,"aria-selected":s,className:`nav-tree-item ${i.is_dir?`dir-item`:`file-item`} ${s?`selected`:``} ${c?`focused`:``}`,style:{paddingLeft:`${a*14+10}px`},onClick:()=>{m(r),i.is_dir?S(i.id):n(i)},children:[(0,b.jsx)(`span`,{className:`tree-chevron`,children:i.is_dir?(0,b.jsx)(`span`,{className:`chevron-arrow ${o?`open`:``}`,children:`▶`}):(0,b.jsx)(`span`,{className:`chevron-spacer`})}),(0,b.jsx)(`span`,{className:`tree-icon ${u}`,"aria-hidden":`true`,children:l}),(0,b.jsx)(`span`,{className:`tree-label`,title:i.path,children:i.name}),(0,b.jsxs)(`div`,{className:`tree-badges`,children:[i.symbol_count>0&&(0,b.jsxs)(`span`,{className:`badge-symbols`,title:`${i.symbol_count} AST Symbols`,children:[i.symbol_count,` sym`]}),i.route_count>0&&(0,b.jsxs)(`span`,{className:`badge-routes`,title:`${i.route_count} API Routes`,children:[i.route_count,` rts`]})]})]},i.id)})})})]})};function he(e){switch(e.toUpperCase()){case`GET`:return`method-get`;case`POST`:return`method-post`;case`PUT`:return`method-put`;case`DELETE`:return`method-delete`;case`PATCH`:return`method-patch`;default:return`method-other`}}function ge(e){switch(e.toLowerCase()){case`class`:return`kind-class`;case`function`:case`method`:case`async function`:return`kind-function`;case`variable`:case`constant`:return`kind-variable`;case`interface`:case`type`:return`kind-type`;default:return`kind-default`}}var _e=({outline:e,selectedSymbolId:t,onSelectSymbol:n,density:r=`balanced`,loading:i=!1})=>{let[a,o]=(0,_.useState)(`all`),[s,c]=(0,_.useState)(``),l=e?.symbols||[],u=(0,_.useMemo)(()=>{let e=0,t=0,n=0;for(let r of l){r.route&&e++;let i=r.kind.toLowerCase();i===`class`||i===`interface`?t++:(i.includes(`func`)||i===`method`)&&(r.route||n++)}return{all:l.length,routes:e,classes:t,functions:n}},[l]),d=(0,_.useMemo)(()=>l.filter(e=>{if(a===`routes`){if(!e.route)return!1}else if(a===`classes`){let t=e.kind.toLowerCase();if(t!==`class`&&t!==`interface`)return!1}else if(a===`functions`){let t=e.kind.toLowerCase();if(!t.includes(`func`)&&t!==`method`||e.route)return!1}if(s.trim()){let t=s.toLowerCase(),n=e.name.toLowerCase().includes(t),r=(e.signature||``).toLowerCase().includes(t),i=e.route?e.route.path_pattern.toLowerCase().includes(t)||e.route.http_method.toLowerCase().includes(t):!1;if(!n&&!r&&!i)return!1}return!0}),[l,a,s]),f=e?.filepath?e.filepath.split(`/`).pop():``;return(0,b.jsxs)(`div`,{className:`nav-outline-pane density-${r}`,"data-testid":`navigator-outline-container`,children:[(0,b.jsxs)(`div`,{className:`nav-outline-header`,children:[(0,b.jsxs)(`div`,{className:`nav-outline-title-row`,children:[(0,b.jsxs)(`div`,{className:`nav-outline-title`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`line`,{x1:`8`,y1:`6`,x2:`21`,y2:`6`}),(0,b.jsx)(`line`,{x1:`8`,y1:`12`,x2:`21`,y2:`12`}),(0,b.jsx)(`line`,{x1:`8`,y1:`18`,x2:`21`,y2:`18`}),(0,b.jsx)(`line`,{x1:`3`,y1:`6`,x2:`3.01`,y2:`6`}),(0,b.jsx)(`line`,{x1:`3`,y1:`12`,x2:`3.01`,y2:`12`}),(0,b.jsx)(`line`,{x1:`3`,y1:`18`,x2:`3.01`,y2:`18`})]}),(0,b.jsx)(`span`,{children:`Symbols & Routes`})]}),e&&(0,b.jsx)(`div`,{className:`nav-file-badge`,title:e.filepath,children:(0,b.jsx)(`span`,{className:`file-name`,children:f})})]}),e&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:`nav-outline-search-bar`,children:[(0,b.jsxs)(`svg`,{className:`search-icon`,width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]}),(0,b.jsx)(`input`,{type:`text`,className:`nav-outline-search-input`,placeholder:`Filter symbols...`,value:s,onChange:e=>c(e.target.value)}),s&&(0,b.jsx)(`button`,{type:`button`,className:`nav-outline-clear-btn`,onClick:()=>c(``),"aria-label":`Clear symbol search`,children:`✕`})]}),(0,b.jsxs)(`div`,{className:`nav-category-chips`,role:`tablist`,"aria-label":`Symbol Category Filter`,children:[(0,b.jsxs)(`button`,{type:`button`,role:`button`,className:`category-chip ${a===`all`?`active`:``}`,onClick:()=>o(`all`),children:[`All `,(0,b.jsx)(`span`,{className:`chip-count`,children:u.all})]}),(0,b.jsxs)(`button`,{type:`button`,role:`button`,className:`category-chip ${a===`routes`?`active`:``}`,onClick:()=>o(`routes`),children:[`Routes `,(0,b.jsx)(`span`,{className:`chip-count`,children:u.routes})]}),(0,b.jsxs)(`button`,{type:`button`,role:`button`,className:`category-chip ${a===`classes`?`active`:``}`,onClick:()=>o(`classes`),children:[`Classes `,(0,b.jsx)(`span`,{className:`chip-count`,children:u.classes})]}),(0,b.jsxs)(`button`,{type:`button`,role:`button`,className:`category-chip ${a===`functions`?`active`:``}`,onClick:()=>o(`functions`),children:[`Functions `,(0,b.jsx)(`span`,{className:`chip-count`,children:u.functions})]})]})]})]}),(0,b.jsx)(`div`,{className:`nav-outline-content`,children:i?(0,b.jsxs)(`div`,{className:`nav-outline-skeleton`,"data-testid":`outline-loading-skeleton`,children:[(0,b.jsx)(`div`,{className:`skeleton-item shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-item shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-item shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-item shimmer`})]}):e?l.length===0?(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`div`,{className:`empty-icon`,children:`⚡`}),(0,b.jsx)(`h4`,{children:`No Symbols Found`}),(0,b.jsx)(`p`,{children:`No symbols found in this file.`})]}):d.length===0?(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`h4`,{children:`No Matching Symbols`}),(0,b.jsx)(`p`,{children:`No symbols match the current category and search filters.`}),(0,b.jsx)(`button`,{type:`button`,className:`nav-clear-filter-btn`,onClick:()=>{o(`all`),c(``)},children:`Reset Filters`})]}):(0,b.jsx)(`div`,{className:`nav-symbol-list`,role:`list`,children:d.map(e=>{let r=e.id===t,i=ge(e.kind);return(0,b.jsxs)(`div`,{"data-testid":`symbol-item-${e.id}`,className:`nav-symbol-item ${r?`active`:``}`,onClick:()=>n(e),role:`listitem`,tabIndex:0,onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),n(e))},children:[(0,b.jsxs)(`div`,{className:`symbol-header-row`,children:[(0,b.jsxs)(`div`,{className:`symbol-name-col`,children:[(0,b.jsx)(`span`,{className:`symbol-kind-badge ${i}`,children:e.kind}),(0,b.jsx)(`span`,{className:`symbol-name-text`,title:e.full_symbol||e.name,children:e.name})]}),(0,b.jsx)(`div`,{className:`symbol-meta-col`,children:(0,b.jsxs)(`span`,{className:`symbol-line-badge`,children:[`L`,e.start_line,e.end_line&&e.end_line!==e.start_line?` - L${e.end_line}`:``]})})]}),e.route&&(0,b.jsxs)(`div`,{className:`symbol-route-row`,children:[(0,b.jsx)(`span`,{className:`route-method-badge ${he(e.route.http_method)}`,children:e.route.http_method}),(0,b.jsx)(`span`,{className:`route-path-text`,title:e.route.path_pattern,children:e.route.path_pattern}),e.route.framework&&(0,b.jsx)(`span`,{className:`route-framework-tag`,children:e.route.framework})]}),e.signature&&(0,b.jsx)(`div`,{className:`symbol-signature-snippet`,children:(0,b.jsx)(`code`,{children:e.signature})})]},e.id)})}):(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`div`,{className:`empty-icon`,children:`📂`}),(0,b.jsx)(`h4`,{children:`No File Selected`}),(0,b.jsx)(`p`,{children:`Select a file from the tree to inspect its symbols and routes.`})]})})]})},ve=({impact:e,onSelectCaller:t,onSelectCallee:n,density:r=`balanced`,loading:i=!1})=>{let[a,o]=(0,_.useState)(!1),s=async()=>{if(!e?.symbol)return;let{filepath:t,start_line:n,end_line:r}=e.symbol,i=`${t}#L${n}${r&&r!==n?`-L${r}`:``}`;try{navigator?.clipboard?.writeText&&await navigator.clipboard.writeText(i),o(!0),setTimeout(()=>o(!1),2e3)}catch{}},c=e?.symbol,l=e?.route,u=e?.callers||[],d=e?.callees||[],f=e?.imports||[];return(0,b.jsxs)(`div`,{className:`nav-inspector-pane density-${r}`,"data-testid":`navigator-inspector-container`,children:[(0,b.jsxs)(`div`,{className:`nav-inspector-header`,children:[(0,b.jsxs)(`div`,{className:`nav-inspector-title`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`path`,{d:`M12 16v-4M12 8h.01`})]}),(0,b.jsx)(`span`,{children:`Code Intelligence & Impact`})]}),c&&(0,b.jsx)(`button`,{type:`button`,className:`nav-copy-permalink-btn`,onClick:s,title:`Copy file path & line range permalink`,"aria-label":`Copy Permalink`,children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:(0,b.jsx)(`polyline`,{points:`20 6 9 17 4 12`})}),(0,b.jsx)(`span`,{children:`Copied!`})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`path`,{d:`M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71`}),(0,b.jsx)(`path`,{d:`M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71`})]}),(0,b.jsx)(`span`,{children:`Copy Permalink`})]})})]}),(0,b.jsx)(`div`,{className:`nav-inspector-content`,children:i?(0,b.jsxs)(`div`,{className:`nav-inspector-skeleton`,"data-testid":`inspector-loading-skeleton`,children:[(0,b.jsx)(`div`,{className:`skeleton-header shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-metrics shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-block shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-block shimmer`})]}):!e||!c?(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`div`,{className:`empty-icon`,children:`🔍`}),(0,b.jsx)(`h4`,{children:`No Symbol Selected`}),(0,b.jsx)(`p`,{children:`Select a symbol from the outline to inspect its callers, dependencies, and impact.`})]}):(0,b.jsxs)(`div`,{className:`nav-inspector-body`,children:[(0,b.jsxs)(`div`,{className:`inspector-card symbol-summary-card`,children:[(0,b.jsxs)(`div`,{className:`summary-title-row`,children:[(0,b.jsx)(`span`,{className:`symbol-kind-badge ${ge(c.kind)}`,children:c.kind}),(0,b.jsx)(`h3`,{className:`summary-name`,title:c.full_symbol||c.name,children:c.name})]}),(0,b.jsxs)(`div`,{className:`summary-location-row`,children:[(0,b.jsxs)(`span`,{className:`summary-file-path`,children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`path`,{d:`M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z`}),(0,b.jsx)(`polyline`,{points:`13 2 13 9 20 9`})]}),c.filepath]}),(0,b.jsxs)(`span`,{className:`summary-line-range`,children:[`L`,c.start_line,` - L`,c.end_line]})]})]}),(0,b.jsxs)(`div`,{className:`inspector-metrics-grid`,children:[(0,b.jsxs)(`div`,{className:`metric-box`,children:[(0,b.jsx)(`span`,{className:`metric-label`,children:`Incoming Callers`}),(0,b.jsx)(`span`,{className:`metric-value`,"data-testid":`metric-callers`,children:u.length})]}),(0,b.jsxs)(`div`,{className:`metric-box`,children:[(0,b.jsx)(`span`,{className:`metric-label`,children:`Outgoing Callees`}),(0,b.jsx)(`span`,{className:`metric-value`,"data-testid":`metric-callees`,children:d.length})]}),(0,b.jsxs)(`div`,{className:`metric-box`,children:[(0,b.jsx)(`span`,{className:`metric-label`,children:`Total Imports`}),(0,b.jsx)(`span`,{className:`metric-value`,"data-testid":`metric-imports`,children:f.length})]}),(0,b.jsxs)(`div`,{className:`metric-box`,children:[(0,b.jsx)(`span`,{className:`metric-label`,children:`Language`}),(0,b.jsx)(`span`,{className:`metric-value metric-lang`,"data-testid":`metric-scope`,children:c.language||`code`})]})]}),l&&(0,b.jsxs)(`div`,{className:`inspector-card route-card`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`line`,{x1:`2`,y1:`12`,x2:`22`,y2:`12`}),(0,b.jsx)(`path`,{d:`M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z`})]}),(0,b.jsx)(`span`,{children:`API Route Mapping`})]}),(0,b.jsxs)(`div`,{className:`route-detail-row`,children:[(0,b.jsx)(`span`,{className:`route-method-badge ${he(l.http_method)}`,children:l.http_method}),(0,b.jsx)(`span`,{className:`route-path-code`,children:l.path_pattern}),l.framework&&(0,b.jsx)(`span`,{className:`route-framework-tag`,children:l.framework})]})]}),c.signature&&(0,b.jsxs)(`div`,{className:`inspector-card code-preview-card`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`polyline`,{points:`16 18 22 12 16 6`}),(0,b.jsx)(`polyline`,{points:`8 6 2 12 8 18`})]}),(0,b.jsx)(`span`,{children:`Signature`})]}),(0,b.jsx)(`pre`,{className:`signature-code-block`,children:(0,b.jsx)(`code`,{children:c.signature})})]}),c.docstring&&(0,b.jsxs)(`div`,{className:`inspector-card docstring-card`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,b.jsx)(`polyline`,{points:`14 2 14 8 20 8`}),(0,b.jsx)(`line`,{x1:`16`,y1:`13`,x2:`8`,y2:`13`}),(0,b.jsx)(`line`,{x1:`16`,y1:`17`,x2:`8`,y2:`17`}),(0,b.jsx)(`polyline`,{points:`10 9 9 9 8 9`})]}),(0,b.jsx)(`span`,{children:`Documentation`})]}),(0,b.jsx)(`p`,{className:`docstring-text`,children:c.docstring})]}),(0,b.jsxs)(`div`,{className:`inspector-card relations-card callers-section`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsx)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:(0,b.jsx)(`path`,{d:`M12 19V5M5 12l7-7 7 7`})}),(0,b.jsxs)(`span`,{children:[`Incoming Callers (`,u.length,`)`]})]}),u.length===0?(0,b.jsx)(`div`,{className:`nav-no-items-text`,children:`No incoming callers found in this repository.`}):(0,b.jsx)(`div`,{className:`relation-list`,children:u.map((e,n)=>(0,b.jsxs)(`div`,{"data-testid":`caller-item-${e.id??n}`,className:`relation-item caller-item`,onClick:()=>{e.source_filepath&&t&&t(e.source_filepath,e.source_symbol,e.source_symbol_id??void 0)},role:`button`,tabIndex:0,title:`Jump to ${e.source_symbol||`caller`} in ${e.source_filepath||``}`,children:[(0,b.jsxs)(`div`,{className:`relation-top`,children:[(0,b.jsx)(`span`,{className:`rel-symbol-name`,children:e.source_symbol||`Unknown Caller`}),(0,b.jsx)(`span`,{className:`rel-jump-hint`,"aria-hidden":`true`,children:`Jump ↗`})]}),(0,b.jsxs)(`div`,{className:`relation-bottom`,children:[e.source_filepath&&(0,b.jsx)(`span`,{className:`rel-filepath`,children:e.source_filepath}),e.all_lines?(0,b.jsxs)(`span`,{className:`rel-line`,title:`Lines: ${e.all_lines}`,children:[`L`,e.all_lines.includes(`,`)?e.all_lines.split(`,`).slice(0,3).join(`, L`)+(e.all_lines.split(`,`).length>3?`...`:``):e.all_lines]}):e.line_number?(0,b.jsxs)(`span`,{className:`rel-line`,children:[`L`,e.line_number]}):null,e.call_count&&e.call_count>1?(0,b.jsxs)(`span`,{className:`rel-count-badge`,children:[e.call_count,` calls`]}):null,e.relationship_type&&(0,b.jsx)(`span`,{className:`rel-type-tag`,children:e.relationship_type})]})]},e.id??n))})]}),(0,b.jsxs)(`div`,{className:`inspector-card relations-card dependencies-section`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsx)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:(0,b.jsx)(`path`,{d:`M12 5v14M5 12l7 7 7-7`})}),(0,b.jsxs)(`span`,{children:[`Outgoing Dependencies (`,d.length+f.length,`)`]})]}),d.length===0&&f.length===0?(0,b.jsx)(`div`,{className:`nav-no-items-text`,children:`No outgoing calls or imports.`}):(0,b.jsxs)(`div`,{className:`relation-list`,children:[d.map((e,t)=>(0,b.jsxs)(`div`,{"data-testid":`callee-item-${e.id??t}`,className:`relation-item callee-item ${e.target_filepath?`is-clickable`:``}`,onClick:()=>{e.target_filepath&&n&&n(e.target_filepath,e.target_symbol)},role:e.target_filepath?`button`:void 0,tabIndex:e.target_filepath?0:void 0,title:e.target_filepath?`Jump to ${e.target_symbol} in ${e.target_filepath}`:void 0,onKeyDown:t=>{e.target_filepath&&n&&(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),n(e.target_filepath,e.target_symbol))},children:[(0,b.jsxs)(`div`,{className:`relation-top`,children:[(0,b.jsx)(`span`,{className:`rel-symbol-name`,children:e.target_symbol}),(0,b.jsxs)(`div`,{className:`rel-top-right`,children:[(0,b.jsx)(`span`,{className:`rel-type-badge`,children:e.relationship_type||`CALLS`}),e.target_filepath&&(0,b.jsx)(`span`,{className:`rel-jump-hint`,"aria-hidden":`true`,children:`Jump ↗`})]})]}),(0,b.jsxs)(`div`,{className:`relation-bottom`,children:[e.target_filepath&&(0,b.jsx)(`span`,{className:`rel-filepath`,children:e.target_filepath}),e.all_lines?(0,b.jsxs)(`span`,{className:`rel-line`,title:`Lines: ${e.all_lines}`,children:[`L`,e.all_lines.includes(`,`)?e.all_lines.split(`,`).slice(0,3).join(`, L`)+(e.all_lines.split(`,`).length>3?`...`:``):e.all_lines]}):e.line_number?(0,b.jsxs)(`span`,{className:`rel-line`,children:[`L`,e.line_number]}):null,e.call_count&&e.call_count>1?(0,b.jsxs)(`span`,{className:`rel-count-badge`,children:[e.call_count,` calls`]}):null]})]},e.id??`callee-${t}`)),f.map((e,t)=>(0,b.jsxs)(`div`,{className:`relation-item import-item`,children:[(0,b.jsxs)(`div`,{className:`relation-top`,children:[(0,b.jsx)(`span`,{className:`rel-symbol-name`,children:e.target_symbol}),(0,b.jsx)(`span`,{className:`rel-type-badge import-badge`,children:`IMPORTS`})]}),(0,b.jsxs)(`div`,{className:`relation-bottom`,children:[e.all_lines?(0,b.jsxs)(`span`,{className:`rel-line`,title:`Lines: ${e.all_lines}`,children:[`L`,e.all_lines.includes(`,`)?e.all_lines.split(`,`).slice(0,3).join(`, L`)+(e.all_lines.split(`,`).length>3?`...`:``):e.all_lines]}):e.line_number?(0,b.jsxs)(`span`,{className:`rel-line`,children:[`L`,e.line_number]}):null,e.import_count&&e.import_count>1?(0,b.jsxs)(`span`,{className:`rel-count-badge`,children:[e.import_count,` imports`]}):null]})]},e.id??`import-${t}`))]})]})]})})]})},ye=`contextcortex_navigator_density`,be=({initialRepo:e=`__all__`,initialPath:t,initialSymbolId:n})=>{let[r,i]=(0,_.useState)(()=>{let e=localStorage.getItem(ye);return e===`compact`||e===`balanced`||e===`spacious`?e:`balanced`}),a=e=>{i(e),localStorage.setItem(ye,e)},[o,s]=(0,_.useState)([]),[c,l]=(0,_.useState)(e),[u,d]=(0,_.useState)(null),[f,p]=(0,_.useState)(!1),[m,h]=(0,_.useState)(``),[g,v]=(0,_.useState)(t||null),[y,x]=(0,_.useState)(null),[S,C]=(0,_.useState)(!1),[w,T]=(0,_.useState)(n||null),[E,D]=(0,_.useState)(null),[O,k]=(0,_.useState)(!1),[ee,A]=(0,_.useState)(null);(0,_.useEffect)(()=>{(async()=>{try{let e=await fetch(`/admin/api/repositories`);if(e.ok){let t=await e.json();s(Array.isArray(t)?t:[])}else{let e=await fetch(`/admin/api/repos`);if(e.ok){let t=await e.json();s(Array.isArray(t)?t:[])}}}catch(e){console.error(`Error fetching repositories:`,e)}})()},[]);let te=(0,_.useCallback)(async e=>{p(!0),A(null);try{let t=await fetch(`/admin/api/navigator/tree?repo=${encodeURIComponent(e)}`);if(!t.ok)throw Error(`Failed to load tree: ${t.status} ${t.statusText}`);let n=await t.json();d(n)}catch(e){console.error(`Error fetching codebase tree:`,e),A(e.message||`Failed to load codebase tree`)}finally{p(!1)}},[]);(0,_.useEffect)(()=>{te(c)},[c,te]);let ne=(0,_.useCallback)(async(e,t)=>{k(!0);try{let n=await fetch(`/admin/api/navigator/symbol-impact?repo=${encodeURIComponent(e)}&symbol_id=${t}`);if(!n.ok)throw Error(`Failed to load symbol impact: ${n.status}`);let r=await n.json();D(r)}catch(e){console.error(`Error fetching symbol impact:`,e),D(null)}finally{k(!1)}},[]),re=(0,_.useCallback)(async(e,t,n)=>{C(!0);try{let r=await fetch(`/admin/api/navigator/file-outline?repo=${encodeURIComponent(e)}&filepath=${encodeURIComponent(t)}`);if(!r.ok)throw Error(`Failed to load file outline: ${r.status}`);let i=await r.json();if(x(i),i.symbols&&i.symbols.length>0){let t;typeof n==`number`?t=i.symbols.find(e=>e.id===n):typeof n==`string`&&(t=i.symbols.find(e=>e.name===n||e.full_symbol===n));let r=t||i.symbols[0];T(r.id),await ne(e,r.id)}else T(null),D(null)}catch(e){console.error(`Error fetching outline:`,e),x(null),T(null),D(null)}finally{C(!1)}},[ne]);return(0,b.jsxs)(`div`,{className:`code-navigator-container density-${r}`,"data-testid":`code-navigator-container`,children:[(0,b.jsx)(fe,{repos:o,selectedRepo:c,onSelectRepo:e=>{l(e),v(null),x(null),T(null),D(null)},density:r,onChangeDensity:a,searchQuery:m,onSearchChange:h,totalFiles:u?.total_files??0,totalSymbols:u?.total_symbols??0,onRefresh:()=>te(c),loading:f}),ee&&(0,b.jsxs)(`div`,{className:`nav-error-banner`,role:`alert`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,b.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,b.jsx)(`span`,{children:ee}),(0,b.jsx)(`button`,{type:`button`,onClick:()=>A(null),className:`error-close-btn`,children:`✕`})]}),(0,b.jsxs)(`div`,{className:`nav-panes-layout`,children:[(0,b.jsx)(`section`,{className:`nav-pane-column nav-pane-tree`,"aria-label":`File Tree`,children:(0,b.jsx)(me,{nodes:u?.tree??[],selectedPath:g,onSelectFile:e=>{e.is_dir||(v(e.path),re(c,e.path))},filterText:m,onFilterChange:h,density:r,loading:f})}),(0,b.jsx)(`section`,{className:`nav-pane-column nav-pane-outline`,"aria-label":`Symbol and Route Outline`,children:(0,b.jsx)(_e,{outline:y,selectedSymbolId:w,onSelectSymbol:e=>{T(e.id),ne(c,e.id)},density:r,loading:S})}),(0,b.jsx)(`section`,{className:`nav-pane-column nav-pane-inspector`,"aria-label":`Code Intelligence and Impact`,children:(0,b.jsx)(ve,{impact:E,onSelectCaller:(e,t,n)=>{v(e),re(c,e,n??t)},onSelectCallee:(e,t)=>{e&&(v(e),re(c,e,t))},density:r,loading:O})})]})]})};function xe({data:e,onConfirm:t,onCancel:n,isIngesting:r=!1}){let[i,a]=(0,_.useState)(`pages`),[o,s]=(0,_.useState)(0),c=e.total_pages||e.pages.length||1,l=e.pages[o]||{page_number:1,text:``,char_count:0,ocr_applied:!1};return(0,b.jsx)(`div`,{className:`modal-backdrop`,"data-testid":`pdf-preview-modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`850px`,width:`95%`,maxHeight:`90vh`,display:`flex`,flexDirection:`column`},"data-testid":`pdf-preview-modal`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,style:{marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,margin:0,fontSize:`1.25rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-pdf text-red-500 mr-2`,style:{color:`#ef4444`}}),(0,b.jsx)(`span`,{children:`PDF Extraction Preview`})]}),(0,b.jsx)(`div`,{style:{fontSize:`0.85rem`,color:`var(--text-muted)`,marginTop:`4px`},children:(0,b.jsx)(`code`,{children:e.filename})})]}),(0,b.jsx)(`button`,{type:`button`,className:`btn-close`,onClick:n,"aria-label":`Close modal`,children:`×`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,flexWrap:`wrap`,gap:`10px`,padding:`10px 14px`,background:`rgba(255, 255, 255, 0.04)`,borderRadius:`6px`,marginBottom:`14px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`14px`,flexWrap:`wrap`,alignItems:`center`,fontSize:`0.85rem`},children:[(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`strong`,{children:`Total Pages:`}),` `,(0,b.jsx)(`span`,{className:`badge badge-primary`,"data-testid":`total-pages-badge`,children:e.total_pages})]}),(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`strong`,{children:`Total Characters:`}),` `,(0,b.jsx)(`span`,{className:`badge badge-primary`,"data-testid":`total-chars-badge`,children:e.total_characters.toLocaleString()})]}),(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`strong`,{children:`OCR Applied:`}),` `,(0,b.jsxs)(`span`,{className:`badge ${e.ocr_pages_count>0?`badge-warning`:`badge-secondary`}`,"data-testid":`ocr-count-badge`,children:[e.ocr_pages_count,` `,e.ocr_pages_count===1?`page`:`pages`]})]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`6px`},children:[(0,b.jsxs)(`button`,{type:`button`,className:`btn ${i===`pages`?`btn-primary`:`btn-secondary`}`,style:{padding:`4px 10px`,fontSize:`0.82rem`},onClick:()=>a(`pages`),"data-testid":`tab-pages-btn`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-lines`,style:{marginRight:`5px`}}),` Page Text`]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn ${i===`chunks`?`btn-primary`:`btn-secondary`}`,style:{padding:`4px 10px`,fontSize:`0.82rem`},onClick:()=>a(`chunks`),"data-testid":`tab-chunks-btn`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-layer-group`,style:{marginRight:`5px`}}),` Sample Chunks (`,e.sample_chunks?.length||0,`)`]})]})]}),(0,b.jsx)(`div`,{style:{flex:1,overflowY:`auto`,minHeight:`320px`,display:`flex`,flexDirection:`column`},children:i===`pages`?(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,flexWrap:`wrap`,gap:`8px`,marginBottom:`10px`,padding:`6px 10px`,background:`rgba(0, 0, 0, 0.2)`,borderRadius:`6px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`3px 8px`,fontSize:`0.8rem`},onClick:()=>{o>0&&s(e=>e-1)},disabled:o<=0,"aria-label":`Previous Page`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-chevron-left`}),` Prev`]}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`span`,{children:`Page`}),(0,b.jsx)(`select`,{value:o,onChange:t=>{let n=parseInt(t.target.value,10);!isNaN(n)&&n>=0&&n(0,b.jsxs)(`option`,{value:t,children:[e.page_number,` `,e.ocr_applied?`(OCR)`:``]},e.page_number))}),(0,b.jsxs)(`span`,{children:[`of `,c]})]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`3px 8px`,fontSize:`0.8rem`},onClick:()=>{oe+1)},disabled:o>=e.pages.length-1,"aria-label":`Next Page`,children:[`Next `,(0,b.jsx)(`i`,{className:`fa-solid fa-chevron-right`})]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[l.ocr_applied?(0,b.jsxs)(`span`,{className:`badge badge-warning`,style:{display:`inline-flex`,alignItems:`center`,gap:`4px`},"data-testid":`page-ocr-applied-badge`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-eye`}),` OCR Fallback`]}):(0,b.jsxs)(`span`,{className:`badge badge-secondary`,style:{display:`inline-flex`,alignItems:`center`,gap:`4px`},"data-testid":`page-digital-badge`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-font`}),` Digital`]}),(0,b.jsxs)(`span`,{className:`text-muted`,style:{fontSize:`0.8rem`},children:[l.char_count.toLocaleString(),` chars`]})]})]}),(0,b.jsx)(`div`,{style:{flex:1,minHeight:`260px`,position:`relative`},children:l.text?(0,b.jsx)(`pre`,{className:`search-hit-code`,style:{maxHeight:`400px`,overflowY:`auto`,margin:0,whiteSpace:`pre-wrap`,wordBreak:`break-word`,fontSize:`0.85rem`,lineHeight:`1.5`,padding:`12px`,background:`rgba(0, 0, 0, 0.3)`,borderRadius:`6px`},"data-testid":`page-text-content`,children:l.text}):(0,b.jsxs)(`div`,{className:`empty-state`,style:{padding:`30px`,textAlign:`center`,color:`var(--text-muted)`},"data-testid":`page-empty-text`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-circle-question`,style:{fontSize:`1.5rem`,marginBottom:`8px`,display:`block`}}),`No text extracted from Page `,l.page_number,`.`]})})]}):(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`},"data-testid":`chunks-container`,children:[(0,b.jsx)(`div`,{style:{fontSize:`0.82rem`,color:`var(--text-muted)`,marginBottom:`4px`},children:`Simulated chunking for vector ingestion (approx. 1000 chars / chunk with 200 char overlap):`}),!e.sample_chunks||e.sample_chunks.length===0?(0,b.jsx)(`div`,{className:`empty-state`,style:{padding:`24px`},children:`No vector chunks generated for this document.`}):e.sample_chunks.map(e=>(0,b.jsxs)(`div`,{style:{border:`1px solid var(--border-card)`,borderRadius:`6px`,background:`rgba(0, 0, 0, 0.25)`,padding:`10px 12px`},"data-testid":`chunk-card-${e.chunk_index}`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,fontSize:`0.8rem`,marginBottom:`6px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,alignItems:`center`},children:[(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[`Chunk #`,e.chunk_index+1]}),(0,b.jsxs)(`span`,{className:`text-muted`,children:[e.heading,` (Page `,e.page_number,`)`]})]}),(0,b.jsxs)(`span`,{className:`badge badge-secondary`,children:[e.char_count,` chars`]})]}),(0,b.jsx)(`pre`,{style:{margin:0,whiteSpace:`pre-wrap`,wordBreak:`break-word`,fontFamily:`var(--font-family-mono)`,fontSize:`0.8rem`,color:`var(--text)`,lineHeight:`1.4`,background:`rgba(0, 0, 0, 0.2)`,padding:`8px`,borderRadius:`4px`},children:e.preview})]},e.chunk_index))]})}),(0,b.jsxs)(`div`,{className:`modal-footer`,style:{marginTop:`16px`,paddingTop:`12px`,borderTop:`1px solid var(--border-card)`,display:`flex`,justifyContent:`flex-end`,gap:`10px`},children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:n,disabled:r,children:`Cancel`}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-primary`,onClick:t,disabled:r,"data-testid":`confirm-ingest-btn`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${r?`fa-spinner fa-spin`:`fa-database`}`,style:{marginRight:`6px`}}),r?`Ingesting...`:`Confirm & Ingest to Vector DB`]})]})]})})}function Se({refreshStats:e}){let t=S(),[n,r]=(0,_.useState)(null),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(!1),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)(``),[f,p]=(0,_.useState)(``),[m,h]=(0,_.useState)(`local_storage`),[g,v]=(0,_.useState)(``),[y,x]=(0,_.useState)(null),[C,w]=(0,_.useState)(!1),[T,E]=(0,_.useState)(!1),[D,O]=(0,_.useState)(!1),[k,ee]=(0,_.useState)(null),[A,te]=(0,_.useState)(!1),[ne,re]=(0,_.useState)(!1),[ie,j]=(0,_.useState)(null),[M,N]=(0,_.useState)(``),[ae,oe]=(0,_.useState)(``),[se,P]=(0,_.useState)(!1),[F,ce]=(0,_.useState)(!1),[le,ue]=(0,_.useState)(!1),[de,fe]=(0,_.useState)(null),[pe,me]=(0,_.useState)(null),[he,ge]=(0,_.useState)(``),[_e,ve]=(0,_.useState)(`local_storage`),[ye,be]=(0,_.useState)(``),[Se,Ce]=(0,_.useState)(!1),we=e=>{if(!e||e===0)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/t**r).toFixed(1))+` `+n[r]},Te=e=>{if(!e)return`-`;let t=e<1e11?e*1e3:e;return new Date(t).toLocaleString()},Ee=(0,_.useCallback)(async(e=i)=>{s(!0);try{let t=e?`/admin/api/storage/tree?folder=${encodeURIComponent(e)}`:`/admin/api/storage/tree`,n=await fetch(t);if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to load storage tree`)}let i=await n.json();r(i),a(i.current_folder||``)}catch(e){t.error(`Error loading storage: `+e.message),console.error(`Error loading storage tree:`,e)}finally{s(!1)}},[i,t]);(0,_.useEffect)(()=>{Ee(``)},[]);let De=e=>{Ee(e)},I=()=>{if(!i)return;let e=i.split(`/`).filter(Boolean);e.pop(),De(e.join(`/`))},Oe=e=>{let t=e===void 0?i:e;d(t?`${t}/`:``),p(``),h(`local_storage`),v(``),x(null),l(!0)},ke=e=>{if(e.preventDefault(),w(!1),e.dataTransfer.files&&e.dataTransfer.files.length>0){let t=e.dataTransfer.files[0];Pe(t)}},Ae=e=>{e.target.files&&e.target.files.length>0&&Pe(e.target.files[0])},je=async(e,n,r,a)=>{ue(!0);try{let t=new FormData;t.append(`file`,e),t.append(`ocr_fallback`,`true`);let o=await fetch(`/admin/api/storage/pdf/preview`,{method:`POST`,body:t}),s=await o.json();if(!o.ok)throw Error(s.error||`Failed to generate PDF preview`);me(e),ge(n||(i?`${i}/${e.name}`:e.name)),ve(r||m||`local_storage`),be(a||f||``),fe(s),l(!1),ce(!0)}catch(e){t.error(`PDF preview error: ${e.message}`)}finally{ue(!1)}},Me=async()=>{if(pe){Ce(!0);try{let n=new FormData;n.append(`file`,pe),n.append(`path`,he||pe.name),n.append(`repo`,_e||`local_storage`),ye&&n.append(`category`,ye);let r=await fetch(`/admin/api/storage/upload`,{method:`POST`,body:n}),a=await r.json();if(!r.ok)throw Error(a.error||`Failed to ingest PDF`);ce(!1),me(null),fe(null);let o=a.chunks_indexed??0;t.success(`PDF uploaded and indexed (${o} chunks)`),Ee(i),e&&e()}catch(e){t.error(`PDF ingestion error: ${e.message}`)}finally{Ce(!1)}}},Ne=()=>{ce(!1),me(null),fe(null)},Pe=e=>{x(e);let t=i?`${i}/${e.name}`:e.name;if(d(t),e.name.toLowerCase().endsWith(`.pdf`)||e.type===`application/pdf`){v(``),je(e,t,m,f);return}let n=new FileReader;n.onload=e=>{typeof e.target?.result==`string`&&v(e.target.result)},n.readAsText(e)},Fe=async n=>{if(n.preventDefault(),!u.trim()){t.error(`File path is required`);return}if(y&&y.name.toLowerCase().endsWith(`.pdf`)){await je(y,u.trim(),m.trim(),f.trim());return}E(!0);try{let n;if(y&&!g){let e=new FormData;e.append(`file`,y),e.append(`path`,u.trim()),e.append(`repo`,m.trim()||`local_storage`),f.trim()&&e.append(`category`,f.trim()),n=await fetch(`/admin/api/storage/upload`,{method:`POST`,body:e})}else n=await fetch(`/admin/api/storage/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:u.trim(),content:g,repo:m.trim()||`local_storage`,category:f.trim()||null})});let r=await n.json();if(!n.ok)throw Error(r.error||`Failed to upload file`);l(!1);let a=r.chunks_indexed??0;t.success(`File uploaded and indexed (${a} chunks)`),Ee(i),e&&e()}catch(e){t.error(`Upload error: ${e.message}`)}finally{E(!1)}},Ie=async e=>{te(!0),O(!0);try{let t=await fetch(`/admin/api/storage/file?path=${encodeURIComponent(e.rel_path)}`),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to read file`);ee(n)}catch(e){t.error(`Preview error: ${e.message}`),O(!1)}finally{te(!1)}},Le=async e=>{if(j(e),oe(``),re(!0),e.rel_path.toLowerCase().endsWith(`.pdf`)){N(``);return}try{let t=await fetch(`/admin/api/storage/file?path=${encodeURIComponent(e.rel_path)}`),n=await t.json();t.ok&&n.content!==void 0?N(n.content):N(``)}catch{N(``)}},Re=async n=>{if(n.preventDefault(),ie){if(ie.rel_path.toLowerCase().endsWith(`.pdf`)){t.error(`PDF files cannot be edited directly via text editor. Upload a new PDF file instead.`);return}P(!0);try{let n=await fetch(`/admin/api/storage/file`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:ie.rel_path,content:M,repo:`local_storage`,category:ae.trim()||``})}),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to update file`);re(!1);let a=r.chunks_indexed??0;t.success(`File updated and indexed (${a} chunks)`),Ee(i),e&&e()}catch(e){t.error(`Replace error: ${e.message}`)}finally{P(!1)}}},ze=async n=>{if(window.confirm(`Are you sure you want to delete '${n.name}' from local storage and purge its vector embeddings?`))try{let r=await fetch(`/admin/api/storage/file?path=${encodeURIComponent(n.rel_path)}`,{method:`DELETE`}),a=await r.json();if(!r.ok)throw Error(a.error||`Failed to delete file`);t.success(`File deleted successfully: ${n.name}`),Ee(i),e&&e()}catch(e){t.error(`Delete error: ${e.message}`)}},Be=i?i.split(`/`).filter(Boolean):[];return(0,b.jsxs)(`div`,{className:`tab-content active`,children:[(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`}),` Local Storage Explorer`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Upload, browse, inspect, replace, and delete managed documents in ContextCortex local storage with real-time vector indexing.`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`10px`},children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Ee(i),title:`Refresh directory`,disabled:o,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate ${o?`fa-spin`:``}`}),` Refresh`]}),(0,b.jsxs)(`button`,{className:`btn btn-primary`,onClick:()=>Oe(),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-upload`}),` Upload File`]})]})]}),(0,b.jsxs)(`div`,{className:`browser-breadcrumbs`,style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,flexWrap:`wrap`,gap:`10px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,flexWrap:`wrap`},children:[(0,b.jsx)(`span`,{className:`label`,style:{fontWeight:600},children:`Location:`}),(0,b.jsxs)(`button`,{className:`btn-icon`,style:{padding:`2px 6px`,fontSize:`0.85rem`,color:i===``?`var(--primary)`:`var(--text)`},onClick:()=>De(``),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-house`}),` root`]}),Be.map((e,t)=>{let n=Be.slice(0,t+1).join(`/`),r=t===Be.length-1;return(0,b.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:`6px`},children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`/`}),(0,b.jsx)(`button`,{className:`btn-icon`,style:{padding:`2px 6px`,fontSize:`0.85rem`,fontWeight:r?`bold`:`normal`,color:r?`var(--primary)`:`var(--text)`},onClick:()=>De(n),children:e})]},n)})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,fontSize:`0.8rem`,color:`var(--text-muted)`},children:[(0,b.jsxs)(`span`,{children:[`Directories: `,(0,b.jsx)(`strong`,{children:n?.directories.length||0})]}),(0,b.jsx)(`span`,{children:`•`}),(0,b.jsxs)(`span`,{children:[`Files: `,(0,b.jsx)(`strong`,{children:n?.files.length||0})]})]})]}),i!==``&&(0,b.jsx)(`div`,{style:{marginTop:`8px`,marginBottom:`8px`},children:(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`4px 10px`,fontSize:`0.82rem`},onClick:I,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-level-up-alt`}),` .. (Parent Directory)`]})}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{style:{width:`40%`},children:`Name`}),(0,b.jsx)(`th`,{children:`Path`}),(0,b.jsx)(`th`,{children:`Size`}),(0,b.jsx)(`th`,{children:`Modified`}),(0,b.jsx)(`th`,{style:{textAlign:`right`},children:`Actions`})]})}),(0,b.jsx)(`tbody`,{children:!n||n.directories.length===0&&n.files.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:5,className:`empty-state`,children:`No files or subdirectories found in this storage directory. Click "Upload File" to add documents.`})}):(0,b.jsxs)(b.Fragment,{children:[n.directories.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsxs)(`button`,{className:`btn-icon`,style:{display:`inline-flex`,alignItems:`center`,gap:`8px`,textAlign:`left`,color:`var(--text)`},onClick:()=>De(e.rel_path),"aria-label":`open ${e.name}`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder`,style:{color:`#fbbf24`,fontSize:`1.05rem`}}),(0,b.jsx)(`strong`,{children:e.name})]})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.rel_path})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{style:{textAlign:`right`},children:(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`3px 8px`,fontSize:`0.8rem`},onClick:()=>De(e.rel_path),title:`Open ${e.name}`,"aria-label":`open ${e.name}`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-open`}),` Open`]})})]},e.rel_path)),n.files.map(e=>{let t=e.name.toLowerCase().endsWith(`.pdf`);return(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[t?(0,b.jsx)(`i`,{className:`fa-solid fa-file-pdf text-red-500 mr-2`,style:{color:`#ef4444`,fontSize:`1.05rem`}}):(0,b.jsx)(`i`,{className:`fa-solid fa-file-lines`,style:{color:`var(--primary)`,fontSize:`1.05rem`}}),(0,b.jsx)(`span`,{children:e.name})]})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.rel_path})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-primary`,children:we(e.size_bytes)})}),(0,b.jsx)(`td`,{style:{fontSize:`0.85rem`},children:Te(e.mtime)}),(0,b.jsx)(`td`,{style:{textAlign:`right`},children:(0,b.jsxs)(`div`,{style:{display:`inline-flex`,gap:`6px`},children:[(0,b.jsx)(`button`,{className:`btn-icon`,onClick:()=>Ie(e),title:`Preview File`,"aria-label":`Preview File`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-eye`})}),(0,b.jsx)(`button`,{className:`btn-icon`,onClick:()=>Le(e),title:`Replace File`,"aria-label":`Replace File`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-file-pen`})}),(0,b.jsx)(`button`,{className:`btn-icon btn-delete`,onClick:()=>ze(e),title:`Delete File`,"aria-label":`Delete File`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`})})]})})]},e.rel_path)})]})})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:!n||n.directories.length===0&&n.files.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No files or subdirectories found.`}):(0,b.jsxs)(b.Fragment,{children:[n.directories.map(e=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder`,style:{color:`#fbbf24`}}),(0,b.jsx)(`strong`,{children:e.name})]}),(0,b.jsx)(`span`,{className:`badge badge-warning`,children:`Directory`})]}),(0,b.jsx)(`div`,{className:`data-mobile-card-body`,children:(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{children:e.rel_path})]})}),(0,b.jsx)(`div`,{className:`data-mobile-card-actions`,children:(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>De(e.rel_path),"aria-label":`open ${e.name}`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-open`}),` Open Folder`]})})]},`m-${e.rel_path}`)),n.files.map(e=>{let t=e.name.toLowerCase().endsWith(`.pdf`);return(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[t?(0,b.jsx)(`i`,{className:`fa-solid fa-file-pdf text-red-500 mr-2`,style:{color:`#ef4444`}}):(0,b.jsx)(`i`,{className:`fa-solid fa-file-lines`,style:{color:`var(--primary)`}}),(0,b.jsx)(`strong`,{children:e.name})]}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:we(e.size_bytes)})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{children:e.rel_path})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Modified: `}),(0,b.jsx)(`span`,{children:Te(e.mtime)})]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-actions`,children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Ie(e),title:`Preview File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-eye`}),` Preview`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Le(e),title:`Replace File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-pen`}),` Replace`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary btn-delete`,onClick:()=>ze(e),title:`Delete File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Delete`]})]})]},`m-${e.rel_path}`)})]})})]}),c&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`640px`},children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-cloud-arrow-up`}),` Upload to Local Storage`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>l(!1),children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:Fe,children:[(0,b.jsxs)(`div`,{style:{border:C?`2px dashed var(--primary)`:`2px dashed rgba(255, 255, 255, 0.15)`,borderRadius:`8px`,padding:`20px`,textAlign:`center`,background:C?`rgba(59, 130, 246, 0.08)`:`rgba(0, 0, 0, 0.15)`,marginBottom:`16px`,cursor:`pointer`,transition:`all 0.2s ease`},onDragOver:e=>{e.preventDefault(),w(!0)},onDragLeave:()=>w(!1),onDrop:ke,onClick:()=>document.getElementById(`storage-file-input`)?.click(),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-arrow-up`,style:{fontSize:`2rem`,color:`var(--primary)`,marginBottom:`8px`}}),(0,b.jsx)(`p`,{style:{margin:`4px 0`,fontSize:`0.9rem`},children:y?`Selected: ${y.name} (${we(y.size)})`:`Drag & drop a file here, or click to browse`}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`},children:`Supports Markdown, code, JSON, YAML, plain text, PDF (up to 50MB)`}),le&&(0,b.jsxs)(`div`,{style:{marginTop:`8px`,fontSize:`0.85rem`,color:`var(--primary)`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`6px`}}),`Extracting and analyzing PDF preview...`]}),(0,b.jsx)(`input`,{id:`storage-file-input`,type:`file`,accept:`.md,.markdown,.txt,.json,.yaml,.yml,.sql,.html,.css,.pdf`,style:{display:`none`},onChange:Ae})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:2},children:[(0,b.jsx)(`label`,{htmlFor:`upload-path`,children:`Relative File Path (e.g. docs/guide.md)`}),(0,b.jsx)(`input`,{id:`upload-path`,type:`text`,required:!0,placeholder:`folder/document.md`,value:u,onChange:e=>d(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:1},children:[(0,b.jsx)(`label`,{htmlFor:`upload-category`,children:`Category Override`}),(0,b.jsx)(`input`,{id:`upload-category`,type:`text`,placeholder:`Optional category`,value:f,onChange:e=>p(e.target.value)})]})]}),y?.name.toLowerCase().endsWith(`.pdf`)||y?.type===`application/pdf`||u.trim().toLowerCase().endsWith(`.pdf`)?(0,b.jsxs)(`div`,{className:`alert alert-info`,style:{margin:`12px 0`,padding:`12px`,background:`rgba(59, 130, 246, 0.1)`,border:`1px solid var(--primary)`,borderRadius:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-pdf`,style:{color:`#ef4444`,marginRight:`8px`}}),(0,b.jsx)(`strong`,{children:`PDF Document Selected:`}),` Binary PDF content cannot be edited manually as text. Extracted text, page segmentation, and vector chunks will be previewed in the extraction modal before ingestion.`]}):(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`upload-content`,children:`File Content (Optional if file uploaded directly)`}),(0,b.jsx)(`textarea`,{id:`upload-content`,rows:8,placeholder:`# Enter or paste text content here...`,value:g,onChange:e=>v(e.target.value),style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`}})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>l(!1),children:`Cancel`}),(0,b.jsxs)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:T,children:[(0,b.jsx)(`i`,{className:`fa-solid ${T?`fa-spinner fa-spin`:`fa-upload`}`}),` Upload & Index`]})]})]})]})}),D&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`750px`,maxHeight:`90vh`,display:`flex`,flexDirection:`column`},children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`}),` File Preview: `,k?.rel_path||`Loading...`]}),k&&(0,b.jsxs)(`span`,{className:`text-muted`,style:{fontSize:`0.8rem`},children:[`Size: `,we(k.size_bytes),` • Modified: `,Te(k.mtime)]})]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>O(!1),children:`×`})]}),(0,b.jsx)(`div`,{style:{flex:1,overflowY:`auto`,margin:`10px 0`},children:A?(0,b.jsxs)(`div`,{className:`empty-state`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Loading content...`]}):(0,b.jsx)(`pre`,{className:`search-hit-code`,style:{maxHeight:`420px`,overflowY:`auto`,margin:0,whiteSpace:`pre-wrap`},children:k?.content||`Empty file.`})}),(0,b.jsx)(`div`,{className:`modal-footer`,children:(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>O(!1),children:`Close`})})]})}),ne&&ie&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`680px`},children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-pen`}),` Replace File: `,ie.name]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>re(!1),children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:Re,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Target File Path`}),(0,b.jsx)(`input`,{type:`text`,readOnly:!0,value:ie.rel_path})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`replace-category`,children:`Category Override`}),(0,b.jsx)(`input`,{id:`replace-category`,type:`text`,placeholder:`Optional category`,value:ae,onChange:e=>oe(e.target.value)})]}),ie.rel_path.toLowerCase().endsWith(`.pdf`)?(0,b.jsxs)(`div`,{className:`alert alert-warning`,style:{margin:`14px 0`,padding:`12px`,background:`rgba(245, 158, 11, 0.1)`,border:`1px solid rgba(245, 158, 11, 0.3)`,borderRadius:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`,style:{marginRight:`8px`,color:`#f59e0b`}}),(0,b.jsx)(`strong`,{children:`PDF Replacement:`}),` PDF documents contain binary page streams and cannot be edited as plain text. To replace this document, please upload a new `,(0,b.jsx)(`code`,{children:`.pdf`}),` file using the "Upload File" tool.`]}):(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`replace-content`,children:`File Content`}),(0,b.jsx)(`textarea`,{id:`replace-content`,rows:10,required:!0,placeholder:`Updated file text...`,value:M,onChange:e=>N(e.target.value),style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`}})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>re(!1),children:`Cancel`}),(0,b.jsxs)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:se||ie.rel_path.toLowerCase().endsWith(`.pdf`),children:[(0,b.jsx)(`i`,{className:`fa-solid ${se?`fa-spinner fa-spin`:`fa-save`}`}),` Save & Re-Index`]})]})]})]})}),F&&de&&(0,b.jsx)(xe,{data:de,onConfirm:Me,onCancel:Ne,isIngesting:Se})]})}function Ce(){let e=S(),[t,n]=(0,_.useState)(null),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(`all`),[s,c]=(0,_.useState)(`summary`),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(``),[p,m]=(0,_.useState)(``),[h,g]=(0,_.useState)(``),v=(0,_.useCallback)(async(t=a,r=s,o=l,c=d,u=p)=>{i(!0);try{let e=new URLSearchParams;e.set(`source_type`,t),e.set(`detail_level`,r),o.trim()&&e.set(`repo_name`,o.trim()),c.trim()&&e.set(`path_prefix`,c.trim()),u.trim()&&e.set(`file_extension`,u.trim());let i=await fetch(`/admin/api/ingestion/catalog?${e.toString()}`);if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error||`Failed to load ingestion catalog`)}let a=await i.json();n(a)}catch(t){e.error(`Error loading catalog: `+t.message),console.error(`Error loading ingestion catalog:`,t)}finally{i(!1)}},[a,s,l,d,p,e]);(0,_.useEffect)(()=>{v(a,s,l,d,p)},[a,s]);let y=e=>{e&&e.preventDefault(),v(a,s,l,d,p)},x=()=>{u(``),f(``),m(``),g(``),v(a,s,``,``,``)},C=e=>{o(e)},w=e=>{c(e)},T=e=>{if(!e)return`-`;if(typeof e==`string`)try{return new Date(e).toLocaleString()}catch{return e}let t=e<1e11?e*1e3:e;return new Date(t).toLocaleString()},E=t?.git_repositories||[],D=t?.monitored_paths||[],O=t?.local_storage,k=(t?.files||[]).filter(e=>{if(!h.trim())return!0;let t=h.toLowerCase();return e.filepath.toLowerCase().includes(t)||e.repo.toLowerCase().includes(t)||e.language&&e.language.toLowerCase().includes(t)}),ee=E.reduce((e,t)=>e+(t.file_count||0),0),A=D.reduce((e,t)=>e+(t.file_count||0),0),te=O?.file_count||0,ne=ee+A+te;return(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-book-bookmark`}),` Unified Ingestion Catalog`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Inspect all indexed Git repositories, monitored local workspaces, and uploaded local storage documents.`})]}),(0,b.jsx)(`div`,{style:{display:`flex`,gap:`10px`},children:(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>y(),disabled:r,title:`Refresh catalog`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate ${r?`fa-spin`:``}`}),` Refresh`]})})]}),(0,b.jsxs)(`div`,{className:`stats-grid`,style:{marginBottom:`20px`},children:[(0,b.jsxs)(`div`,{className:`stat-card`,children:[(0,b.jsx)(`div`,{className:`stat-icon`,children:(0,b.jsx)(`i`,{className:`fa-brands fa-github`})}),(0,b.jsxs)(`div`,{className:`stat-info`,children:[(0,b.jsx)(`span`,{className:`stat-label`,children:`Git Repositories`}),(0,b.jsxs)(`span`,{className:`stat-value`,children:[E.length,` `,(0,b.jsxs)(`small`,{style:{fontSize:`0.75rem`,fontWeight:`normal`,color:`var(--text-muted)`},children:[`(`,ee,` files)`]})]})]})]}),(0,b.jsxs)(`div`,{className:`stat-card`,children:[(0,b.jsx)(`div`,{className:`stat-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`})}),(0,b.jsxs)(`div`,{className:`stat-info`,children:[(0,b.jsx)(`span`,{className:`stat-label`,children:`Monitored Paths`}),(0,b.jsxs)(`span`,{className:`stat-value`,children:[D.length,` `,(0,b.jsxs)(`small`,{style:{fontSize:`0.75rem`,fontWeight:`normal`,color:`var(--text-muted)`},children:[`(`,A,` files)`]})]})]})]}),(0,b.jsxs)(`div`,{className:`stat-card`,children:[(0,b.jsx)(`div`,{className:`stat-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`})}),(0,b.jsxs)(`div`,{className:`stat-info`,children:[(0,b.jsx)(`span`,{className:`stat-label`,children:`Local Storage`}),(0,b.jsxs)(`span`,{className:`stat-value`,children:[te,` `,(0,b.jsx)(`small`,{style:{fontSize:`0.75rem`,fontWeight:`normal`,color:`var(--text-muted)`},children:`files`})]})]})]}),(0,b.jsxs)(`div`,{className:`stat-card`,children:[(0,b.jsx)(`div`,{className:`stat-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-database`})}),(0,b.jsxs)(`div`,{className:`stat-info`,children:[(0,b.jsx)(`span`,{className:`stat-label`,children:`Total Cataloged Files`}),(0,b.jsx)(`span`,{className:`stat-value`,children:ne})]})]})]}),(0,b.jsxs)(`div`,{style:{background:`rgba(0, 0, 0, 0.2)`,padding:`16px`,borderRadius:`10px`,border:`1px solid var(--border-card)`,marginBottom:`20px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,flexWrap:`wrap`,gap:`12px`,marginBottom:`14px`},children:[(0,b.jsxs)(`div`,{className:`log-filter-pills`,role:`group`,"aria-label":`Source Type Filters`,children:[(0,b.jsxs)(`button`,{className:`log-filter-btn ${a===`all`?`active`:``}`,onClick:()=>C(`all`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-layer-group`}),` All Sources`]}),(0,b.jsxs)(`button`,{className:`log-filter-btn ${a===`git`?`active`:``}`,onClick:()=>C(`git`),children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github`}),` Git Repositories`]}),(0,b.jsxs)(`button`,{className:`log-filter-btn ${a===`monitored_path`?`active`:``}`,onClick:()=>C(`monitored_path`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`}),` Monitored Paths`]}),(0,b.jsxs)(`button`,{className:`log-filter-btn ${a===`local_storage`?`active`:``}`,onClick:()=>C(`local_storage`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`}),` Local Storage`]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`6px`},role:`group`,"aria-label":`Detail Level Switch`,children:[(0,b.jsxs)(`button`,{className:`btn ${s===`summary`?`btn-primary`:`btn-secondary`}`,style:{padding:`5px 12px`,fontSize:`0.8rem`},onClick:()=>w(`summary`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-list`}),` Summary`]}),(0,b.jsxs)(`button`,{className:`btn ${s===`detailed`?`btn-primary`:`btn-secondary`}`,style:{padding:`5px 12px`,fontSize:`0.8rem`},onClick:()=>w(`detailed`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-network-wired`}),` Detailed File Tree`]})]})]}),(0,b.jsxs)(`form`,{onSubmit:y,children:[(0,b.jsxs)(`div`,{className:`form-row-3col`,style:{alignItems:`flex-end`},children:[(0,b.jsxs)(`div`,{className:`form-group`,style:{margin:0},children:[(0,b.jsx)(`label`,{htmlFor:`catalog-repo-filter`,style:{fontSize:`0.8rem`},children:`Repository / Alias`}),(0,b.jsx)(`input`,{id:`catalog-repo-filter`,type:`text`,placeholder:`Filter by repo name...`,value:l,onChange:e=>u(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{margin:0},children:[(0,b.jsx)(`label`,{htmlFor:`catalog-prefix-filter`,style:{fontSize:`0.8rem`},children:`Path Prefix`}),(0,b.jsx)(`input`,{id:`catalog-prefix-filter`,type:`text`,placeholder:`e.g. app/api or docs/`,value:d,onChange:e=>f(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{margin:0},children:[(0,b.jsx)(`label`,{htmlFor:`catalog-ext-filter`,style:{fontSize:`0.8rem`},children:`File Extension`}),(0,b.jsx)(`input`,{id:`catalog-ext-filter`,type:`text`,placeholder:`e.g. .md, .py, .ts`,value:p,onChange:e=>m(e.target.value)})]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,gap:`8px`,marginTop:`12px`},children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`6px 12px`,fontSize:`0.85rem`},onClick:x,children:`Clear`}),(0,b.jsxs)(`button`,{type:`submit`,className:`btn btn-primary`,style:{padding:`6px 14px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-filter`}),` Apply`]})]})]})]}),(a===`all`||a===`git`)&&(0,b.jsxs)(`div`,{style:{marginBottom:`28px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`1.05rem`,marginBottom:`10px`,display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github`,style:{color:`var(--primary)`}}),` Git Repositories`,(0,b.jsx)(`span`,{className:`badge badge-primary`,children:E.length})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Name`}),(0,b.jsx)(`th`,{children:`Branch / Commit`}),(0,b.jsx)(`th`,{children:`Status`}),(0,b.jsx)(`th`,{children:`Files`}),(0,b.jsx)(`th`,{children:`Provider`}),(0,b.jsx)(`th`,{children:`URL`})]})}),(0,b.jsx)(`tbody`,{children:E.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:6,className:`empty-state`,children:`No Git repositories match criteria.`})}):E.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.name})}),(0,b.jsxs)(`td`,{children:[(0,b.jsx)(`code`,{children:e.branch}),e.commit_sha&&(0,b.jsxs)(`span`,{className:`text-muted`,style:{marginLeft:`6px`,fontSize:`0.8rem`},children:[`@`,e.commit_sha.substring(0,7)]})]}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge ${e.status===`synced`?`badge-success`:e.status===`syncing`?`badge-warning`:`badge-danger`}`,children:e.status})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.file_count??0})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.provider||`git`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.82rem`,wordBreak:`break-all`},children:e.url})})]},e.id))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:E.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No Git repositories match criteria.`}):E.map(e=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsx)(`strong`,{children:e.name}),(0,b.jsx)(`span`,{className:`badge ${e.status===`synced`?`badge-success`:`badge-warning`}`,children:e.status})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Branch: `}),(0,b.jsx)(`code`,{children:e.branch})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Files: `}),(0,b.jsx)(`strong`,{children:e.file_count??0})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`URL: `}),(0,b.jsx)(`span`,{style:{wordBreak:`break-all`},children:e.url})]})]})]},`gm-${e.id}`))})]}),(a===`all`||a===`monitored_path`)&&(0,b.jsxs)(`div`,{style:{marginBottom:`28px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`1.05rem`,marginBottom:`10px`,display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`,style:{color:`#fbbf24`}}),` Monitored Local Paths`,(0,b.jsx)(`span`,{className:`badge badge-primary`,children:D.length})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Path`}),(0,b.jsx)(`th`,{children:`Repo Alias`}),(0,b.jsx)(`th`,{children:`Category`}),(0,b.jsx)(`th`,{children:`Files Indexed`})]})}),(0,b.jsx)(`tbody`,{children:D.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:4,className:`empty-state`,children:`No monitored paths match criteria.`})}):D.map((e,t)=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.path})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.repo})}),(0,b.jsx)(`td`,{children:e.category?(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.category}):(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.file_count??0})})]},`${e.path}-${t}`))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:D.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No monitored paths match criteria.`}):D.map((e,t)=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsx)(`strong`,{children:e.repo}),(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[e.file_count??0,` files`]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{children:e.path})]}),e.category&&(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Category: `}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.category})]})]})]},`mpm-${t}`))})]}),(a===`all`||a===`local_storage`)&&O&&(0,b.jsxs)(`div`,{style:{marginBottom:`28px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`1.05rem`,marginBottom:`10px`,display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`,style:{color:`var(--accent)`}}),` Local Storage`,(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[O.file_count,` files`]})]}),(0,b.jsxs)(`div`,{style:{background:`rgba(255, 255, 255, 0.02)`,padding:`16px`,borderRadius:`8px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`20px`,flexWrap:`wrap`,marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.85rem`},children:`Storage Root: `}),(0,b.jsx)(`code`,{children:O.root_path})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.85rem`},children:`Total Files: `}),(0,b.jsx)(`strong`,{children:O.file_count})]})]}),O.tree&&(0,b.jsxs)(`div`,{style:{fontSize:`0.85rem`,color:`var(--text-muted)`},children:[`Top-level Subfolders: `,(0,b.jsx)(`strong`,{children:O.tree.directories?.length||0}),` • Top-level Files: `,(0,b.jsx)(`strong`,{children:O.tree.files?.length||0})]})]})]}),s===`detailed`&&(0,b.jsxs)(`div`,{style:{marginTop:`20px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,flexWrap:`wrap`,gap:`10px`,marginBottom:`12px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`1.05rem`,margin:0,display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`,style:{color:`var(--primary)`}}),` Ingested Files Details`,(0,b.jsx)(`span`,{className:`badge badge-primary`,children:k.length})]}),(0,b.jsxs)(`div`,{className:`log-search-wrapper`,style:{maxWidth:`320px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass search-icon`}),(0,b.jsx)(`input`,{type:`text`,className:`log-search-input`,placeholder:`Search in loaded files...`,value:h,onChange:e=>g(e.target.value)}),h&&(0,b.jsx)(`button`,{className:`clear-search-btn`,onClick:()=>g(``),children:`×`})]})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Filepath`}),(0,b.jsx)(`th`,{children:`Repository`}),(0,b.jsx)(`th`,{children:`Type`}),(0,b.jsx)(`th`,{children:`Language`}),(0,b.jsx)(`th`,{children:`Last Modified`})]})}),(0,b.jsx)(`tbody`,{children:k.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:5,className:`empty-state`,children:`No detailed files match current search or filters.`})}):k.map((e,t)=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.filepath})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.repo})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.doc_type})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.language||`text`})}),(0,b.jsx)(`td`,{style:{fontSize:`0.85rem`},children:T(e.mtime)})]},`${e.filepath}-${t}`))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:k.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No detailed files match current search or filters.`}):k.map((e,t)=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsx)(`strong`,{children:e.repo}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.language||`text`})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.filepath})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Type: `}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.doc_type})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Modified: `}),(0,b.jsx)(`span`,{children:T(e.mtime)})]})]})]},`dfm-${t}`))})]})]})})}function we(){let[e,t]=(0,_.useState)(`overview`),[n,r]=(0,_.useState)(!1),[i,a]=(0,_.useState)(null),o=async()=>{try{let e=await fetch(`/admin/api/stats`);if(!e.ok)return;let t=await e.json();a(t)}catch(e){console.error(`Error loading stats:`,e)}};return(0,_.useEffect)(()=>{o();let e=setInterval(o,8e3);return()=>clearInterval(e)},[]),(0,b.jsx)(b.Fragment,{children:(0,b.jsxs)(`div`,{className:`dashboard-container`,children:[(0,b.jsxs)(`header`,{className:`dashboard-header`,children:[(0,b.jsxs)(`div`,{className:`header-top-row`,children:[(0,b.jsxs)(`div`,{className:`header-logo`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-layer-group logo-icon`}),(0,b.jsxs)(`div`,{className:`header-title`,children:[(0,b.jsx)(`h1`,{children:`ContextCortex`}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:`v2.16.0`})]})]}),(0,b.jsx)(`button`,{className:`menu-toggle-btn`,"aria-label":`Toggle navigation`,onClick:()=>r(!n),children:(0,b.jsx)(`i`,{className:`fa-solid ${n?`fa-xmark`:`fa-bars`}`})})]}),(0,b.jsxs)(`div`,{className:`header-status`,children:[(0,b.jsxs)(`div`,{className:`status-item`,children:[(0,b.jsx)(`span`,{className:`label`,children:`Engine State`}),(0,b.jsx)(`span`,{className:`value`,children:i?.is_indexing?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`span`,{className:`indicator indexing`}),` Syncing...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`span`,{className:`indicator online`}),` Idle`]})})]}),(0,b.jsxs)(`div`,{className:`status-item`,children:[(0,b.jsx)(`span`,{className:`label`,children:`Vector Backend`}),(0,b.jsxs)(`span`,{className:`value`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-database`,style:{marginRight:`5px`}}),(0,b.jsxs)(`span`,{children:[i?.vector_store_provider===`chroma`?`ChromaDB`:`Qdrant`,` (`,(i?.vector_store_mode||`embedded`)===`embedded`?`Embedded`:`Remote`,`)`]}),i?.vector_db_status&&(0,b.jsx)(`span`,{className:`badge ${i.vector_db_status===`Healthy`?`badge-success`:`badge-danger`}`,style:{marginLeft:`6px`,fontSize:`0.75rem`,padding:`2px 6px`},"data-testid":`vector-db-status-badge`,children:i.vector_db_status})]})]}),(0,b.jsxs)(`div`,{className:`status-item`,children:[(0,b.jsx)(`span`,{className:`label`,children:`Collection`}),(0,b.jsx)(`span`,{className:`value code`,children:i?.vector_store_collection||`knowledge_rag_v1`})]})]})]}),(0,b.jsxs)(`nav`,{className:`dashboard-nav ${n?`drawer-open`:``}`,children:[(0,b.jsxs)(`button`,{className:`nav-tab ${e===`overview`?`active`:``}`,onClick:()=>{t(`overview`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-chart-pie`}),` Overview`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`navigator`||e===`topology`?`active`:``}`,onClick:()=>{t(`navigator`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-code-fork`}),` Navigator`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`git-repos`?`active`:``}`,onClick:()=>{t(`git-repos`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github`}),` Git Repositories`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`local-paths`?`active`:``}`,onClick:()=>{t(`local-paths`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`}),` Local Paths`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`local-storage`?`active`:``}`,onClick:()=>{t(`local-storage`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`}),` Local Storage`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`ingestion-catalog`?`active`:``}`,onClick:()=>{t(`ingestion-catalog`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-book-bookmark`}),` Ingestion Catalog`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`search-inspector`?`active`:``}`,onClick:()=>{t(`search-inspector`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass`}),` Search & Inspector`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`settings`?`active`:``}`,onClick:()=>{t(`settings`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-gear`}),` Settings`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`diagnostics`?`active`:``}`,onClick:()=>{t(`diagnostics`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`}),` Diagnostics & Logs`]})]}),(0,b.jsxs)(`main`,{className:`dashboard-main`,children:[e===`overview`&&(0,b.jsx)(T,{stats:i,refreshStats:o}),(e===`navigator`||e===`topology`)&&(0,b.jsx)(be,{}),e===`git-repos`&&(0,b.jsx)(te,{refreshStats:o}),e===`local-paths`&&(0,b.jsx)(ne,{refreshStats:o}),e===`local-storage`&&(0,b.jsx)(Se,{refreshStats:o}),e===`ingestion-catalog`&&(0,b.jsx)(Ce,{}),e===`search-inspector`&&(0,b.jsx)(re,{}),e===`settings`&&(0,b.jsx)(ue,{stats:i,refreshStats:o}),e===`diagnostics`&&(0,b.jsx)(de,{})]}),(0,b.jsx)(`footer`,{className:`dashboard-footer`,children:(0,b.jsx)(`p`,{children:`ContextCortex MCP • Universal Code & Knowledge RAG • 2026`})})]})})}(0,v.createRoot)(document.getElementById(`root`)).render((0,b.jsx)(_.StrictMode,{children:(0,b.jsx)(w,{children:(0,b.jsx)(we,{})})})); \ No newline at end of file diff --git a/frontend/dist/assets/index-Ckdwt2bA.js b/frontend/dist/assets/index-Ckdwt2bA.js new file mode 100644 index 0000000..ba3c04b --- /dev/null +++ b/frontend/dist/assets/index-Ckdwt2bA.js @@ -0,0 +1,14 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ee=/\/+/g;function A(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function te(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ne(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ne(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+A(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(ee,`$&/`)+`/`),ne(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ee,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&A(x,t.startTime-e)}}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&A(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var k=new MessageChannel,ee=k.port2;k.port1.onmessage=D,O=function(){ee.postMessage(null)}}else O=function(){_(D,0)};function A(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,A(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1ae||(e.current=ie[ae],ie[ae]=null,ae--)}function I(e,t){ae++,ie[ae]=e.current,e.current=t}var se=oe(null),ce=oe(null),le=oe(null),ue=oe(null);function de(e,t){switch(I(le,t),I(ce,e),I(se,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}F(se),I(se,e)}function fe(){F(se),F(ce),F(le)}function pe(e){e.memoizedState!==null&&I(ue,e);var t=se.current,n=Hd(t,e.type);t!==n&&(I(ce,e),I(se,n))}function me(e){ce.current===e&&(F(se),F(ce)),ue.current===e&&(F(ue),Qf._currentValue=P)}var he,ge;function _e(e){if(he===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);he=t&&t[1]||``,ge=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{ve=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?_e(n):``}function be(e,t){switch(e.tag){case 26:case 27:case 5:return _e(e.type);case 16:return _e(`Lazy`);case 13:return e.child!==t&&t!==null?_e(`Suspense Fallback`):_e(`Suspense`);case 19:return _e(`SuspenseList`);case 0:case 15:return ye(e.type,!1);case 11:return ye(e.type.render,!1);case 1:return ye(e.type,!0);case 31:return _e(`Activity`);default:return``}}function xe(e){try{var t=``,n=null;do t+=be(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var Se=Object.prototype.hasOwnProperty,Ce=t.unstable_scheduleCallback,we=t.unstable_cancelCallback,Te=t.unstable_shouldYield,Ee=t.unstable_requestPaint,De=t.unstable_now,Oe=t.unstable_getCurrentPriorityLevel,ke=t.unstable_ImmediatePriority,Ae=t.unstable_UserBlockingPriority,je=t.unstable_NormalPriority,Me=t.unstable_LowPriority,Ne=t.unstable_IdlePriority,Pe=t.log,Fe=t.unstable_setDisableYieldValue,Ie=null,Le=null;function Re(e){if(typeof Pe==`function`&&Fe(e),Le&&typeof Le.setStrictMode==`function`)try{Le.setStrictMode(Ie,e)}catch{}}var ze=Math.clz32?Math.clz32:He,Be=Math.log,Ve=Math.LN2;function He(e){return e>>>=0,e===0?32:31-(Be(e)/Ve|0)|0}var Ue=256,We=262144,Ge=4194304;function Ke(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function qe(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Ke(n))):i=Ke(o):i=Ke(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Ke(n))):i=Ke(o)):i=Ke(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Je(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Ye(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Xe(){var e=Ge;return Ge<<=1,!(Ge&62914560)&&(Ge=4194304),e}function Ze(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Qe(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function $e(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),dn=!1;if(un)try{var fn={};Object.defineProperty(fn,"passive",{get:function(){dn=!0}}),window.addEventListener(`test`,fn,fn),window.removeEventListener(`test`,fn,fn)}catch{dn=!1}var pn=null,mn=null,hn=null;function gn(){if(hn)return hn;var e,t=mn,n=t.length,r,i=`value`in pn?pn.value:pn.textContent,a=i.length;for(e=0;e=Jn),Zn=` `,Qn=!1;function $n(e,t){switch(e){case`keyup`:return Kn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function er(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var tr=!1;function nr(e,t){switch(e){case`compositionend`:return er(t);case`keypress`:return t.which===32?(Qn=!0,Zn):null;case`textInput`:return e=t.data,e===Zn&&Qn?null:e;default:return null}}function rr(e,t){if(tr)return e===`compositionend`||!qn&&$n(e,t)?(e=gn(),hn=mn=pn=null,tr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Tr(n)}}function Dr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Dr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Or(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Lt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Lt(e.document)}return t}function kr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Ar=un&&`documentMode`in document&&11>=document.documentMode,jr=null,Mr=null,Nr=null,Pr=!1;function Fr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Pr||jr==null||jr!==Lt(r)||(r=jr,`selectionStart`in r&&kr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Nr&&wr(Nr,r)||(Nr=r,r=Ed(Mr,`onSelect`),0>=o,i-=o,Di=1<<32-ze(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),z&&ki(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),z&&ki(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return z&&ki(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),z&&ki(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&Oa(l)===r.type){n(e,r.sibling),c=a(r,o.props),Fa(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===y?(c=mi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=pi(o.type,o.key,o.props,null,e.mode,c),Fa(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=_i(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Oa(o),b(e,r,o,c)}if(j(o))return h(e,r,o,c);if(te(o)){if(l=te(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Pa(o),c);if(o.$$typeof===C)return b(e,r,na(e,o),c);Ia(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=hi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Na=0;var i=b(e,t,n,r);return Ma=null,i}catch(t){if(t===Sa||t===wa)throw t;var a=li(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ra=La(!0),za=La(!1),Ba=!1;function Va(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ha(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ua(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Wa(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=oi(e),ai(e,null,n),t}return ni(e,r,t,n),oi(e)}function Ga(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,tt(e,n)}}function Ka(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var qa=!1;function Ja(){if(qa){var e=pa;if(e!==null)throw e}}function Ya(e,t,n,r){qa=!1;var i=e.updateQueue;Ba=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===fa&&(qa=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ba=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Xa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Za(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=M.T,s={};M.T=s,Fs(e,!1,t,n);try{var c=i(),l=M.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,ga(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{N.p=a,o!==null&&s.types!==null&&(o.types=s.types),M.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,P,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:P,baseState:P,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:P},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ta(Qf)}function ks(){return jo().memoizedState}function As(){return jo().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ua(n);var r=Wa(t,e,n);r!==null&&(hu(r,t,n),Ga(r,t,n)),t={cache:ca()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=ri(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Cr(s,o))return ni(e,t,i,0),K===null&&ti(),!1}catch{}if(n=ri(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=ri(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===B||t!==null&&t===B}function Ls(e,t){go=ho=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,tt(e,n)}}var zs={readContext:ta,use:Po,useCallback:H,useContext:H,useEffect:H,useImperativeHandle:H,useLayoutEffect:H,useInsertionEffect:H,useMemo:H,useReducer:H,useRef:H,useState:H,useDebugValue:H,useDeferredValue:H,useTransition:H,useSyncExternalStore:H,useId:H,useHostTransitionStatus:H,useFormState:H,useActionState:H,useOptimistic:H,useMemoCache:H,useCacheRefresh:H};zs.useEffectEvent=H;var Bs={readContext:ta,use:Po,useCallback:function(e,t){return Ao().memoizedState=[e,t===void 0?null:t],e},useContext:ta,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=Ao();t=t===void 0?null:t;var r=e();if(_o){Re(!0);try{e()}finally{Re(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Ao();if(n!==void 0){var i=n(t);if(_o){Re(!0);try{n(t)}finally{Re(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,B,e),[r.memoizedState,e]},useRef:function(e){var t=Ao();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,B,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(Ao(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,B,e.queue,!0,!1),Ao().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=B,a=Ao();if(z){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=Ao(),t=K.identifierPrefix;if(z){var n=Oi,r=Di;n=(r&~(1<<32-ze(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=vo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[st]=t,o[ct]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=le.current,Vi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Pi,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[st]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Ri(t,!0)}else e=Bd(e).createTextNode(r),e[st]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Vi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[st]=t}else Hi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Ui(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(lo(t),t):(lo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Vi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[st]=t}else Hi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Ui(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(lo(t),t):(lo(t),null)}return lo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return fe(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Yi(t.type),U(t),null;case 19:if(F(uo),r=t.memoizedState,r===null)return U(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=fo(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)fi(n,e),n=n.sibling;return I(uo,uo.current&1|2),z&&ki(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&De()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}}else{if(!a){if(e=fo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!z)return U(t),null}else 2*De()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=De(),e.sibling=null,n=uo.current,I(uo,a?n&1|2:n&1),z&&ki(t,r.treeForkCount),e);case 22:case 23:return lo(t),no(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&F(va),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Yi(sa),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Mi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Yi(sa),fe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return me(t),null;case 31:if(t.memoizedState!==null){if(lo(t),t.alternate===null)throw Error(i(340));Hi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(lo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Hi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return F(uo),null;case 4:return fe(),null;case 10:return Yi(t.type),null;case 22:case 23:return lo(t),no(),e!==null&&F(va),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Yi(sa),null;case 25:return null;default:return null}}function Vc(e,t){switch(Mi(t),t.tag){case 3:Yi(sa),fe();break;case 26:case 27:case 5:me(t);break;case 4:fe();break;case 31:t.memoizedState!==null&&lo(t);break;case 13:lo(t);break;case 19:F(uo);break;case 10:Yi(t.type);break;case 22:case 23:lo(t),no(),e!==null&&F(va);break;case 24:Yi(sa)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Za(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[ct]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=en));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[st]=e,t[ct]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Or(e),kr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[st]=e,bt(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Er(s,h),v=Er(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,M.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),Le&&typeof Le.onPostCommitFiberRoot==`function`)try{Le.onPostCommitFiberRoot(Ie,o)}catch{}return!0}finally{N.p=a,M.T=r,Vu(e,t)}}function Wu(e,t,n){t=yi(n,t),t=$s(e.stateNode,t,2),e=Wa(e,t,2),e!==null&&(Qe(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=yi(n,e),n=ec(2),r=Wa(t,n,2),r!==null&&(tc(n,r,t,e),Qe(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>De()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Xe()),e=ii(e,t),e!==null&&(Qe(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Ce(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-ze(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=qe(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Je(r,a)||(n=!0,ld(r,a))}r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=De(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=zt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),bt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+zt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+zt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+zt(n.imageSizes)+`"]`)):i+=`[href="`+zt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),bt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+zt(r)+`"][href="`+zt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),bt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=yt(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);bt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=yt(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),bt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=yt(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),bt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=le.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=yt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=yt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=yt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+zt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),bt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+zt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+zt(n.href)+`"]`);if(r)return t.instance=r,bt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),bt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,bt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),bt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,bt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),bt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,bt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),bt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),b=o(((e,t)=>{t.exports=y()}))(),x=(0,_.createContext)(void 0);function S(){let e=(0,_.useContext)(x);if(!e)throw Error(`useToast must be used within a ToastProvider`);return e.toast}var C=0;function w({children:e}){let[t,n]=(0,_.useState)([]),r=(0,_.useState)(()=>new Map)[0];(0,_.useEffect)(()=>()=>{r.forEach(e=>clearTimeout(e)),r.clear()},[r]);let i=(0,_.useCallback)(e=>{let t=r.get(e);t&&(clearTimeout(t),r.delete(e)),n(t=>t.filter(t=>t.id!==e))},[r]),a=(0,_.useCallback)((e,t=`info`)=>{let i=++C;n(n=>[...n,{id:i,message:e,type:t}]);let a=setTimeout(()=>{r.delete(i),n(e=>e.filter(e=>e.id!==i))},4e3);r.set(i,a)},[r]),o=(0,_.useMemo)(()=>({success:e=>a(e,`success`),error:e=>a(e,`error`),info:e=>a(e,`info`),warning:e=>a(e,`warning`),showToast:(e,t)=>a(e,t||`info`),dismiss:i}),[a,i]);return(0,b.jsxs)(x.Provider,{value:{toast:o},children:[e,(0,b.jsx)(`div`,{className:`toast-container`,"aria-live":`polite`,"aria-atomic":`true`,children:t.map(e=>(0,b.jsxs)(`div`,{className:`toast toast-${e.type}`,role:`status`,children:[e.type===`error`&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-exclamation`,"aria-hidden":`true`}),e.type===`success`&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-check`,"aria-hidden":`true`}),e.type===`info`&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-info`,"aria-hidden":`true`}),e.type===`warning`&&(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`,"aria-hidden":`true`}),(0,b.jsx)(`span`,{className:`toast-message`,children:e.message}),(0,b.jsx)(`button`,{type:`button`,className:`toast-dismiss-btn`,onClick:()=>i(e.id),"aria-label":`Dismiss notification`,title:`Dismiss`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-xmark`,"aria-hidden":`true`})})]},e.id))})]})}function T({stats:e,refreshStats:t}){let n=S();return e?(0,b.jsxs)(`div`,{className:`tab-content active`,children:[(0,b.jsxs)(`div`,{className:`overview-grid`,children:[(0,b.jsxs)(`div`,{className:`glass-card stat-metric`,children:[(0,b.jsx)(`div`,{className:`metric-icon`,children:(0,b.jsx)(`i`,{className:`fa-brands fa-github`})}),(0,b.jsxs)(`div`,{className:`metric-info`,children:[(0,b.jsx)(`span`,{className:`stat-number`,children:(e.repos_count??e.git_repos??0).toLocaleString()}),(0,b.jsx)(`span`,{className:`stat-label`,children:`Git Repositories`})]})]}),(0,b.jsxs)(`div`,{className:`glass-card stat-metric`,children:[(0,b.jsx)(`div`,{className:`metric-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-code`})}),(0,b.jsxs)(`div`,{className:`metric-info`,children:[(0,b.jsx)(`span`,{className:`stat-number`,children:(e.symbols_count||0).toLocaleString()}),(0,b.jsx)(`span`,{className:`stat-label`,children:`AST Code Symbols`})]})]}),(0,b.jsxs)(`div`,{className:`glass-card stat-metric`,children:[(0,b.jsx)(`div`,{className:`metric-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`})}),(0,b.jsxs)(`div`,{className:`metric-info`,children:[(0,b.jsx)(`span`,{className:`stat-number`,children:(e.files_count||0).toLocaleString()}),(0,b.jsx)(`span`,{className:`stat-label`,children:`Indexed Files`})]})]}),(0,b.jsxs)(`div`,{className:`glass-card stat-metric`,children:[(0,b.jsx)(`div`,{className:`metric-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-network-wired`})}),(0,b.jsxs)(`div`,{className:`metric-info`,children:[(0,b.jsx)(`span`,{className:`stat-number`,children:(e.points_count||0).toLocaleString()}),(0,b.jsxs)(`span`,{className:`stat-label`,children:[(e.vector_store_provider||`Qdrant`).toUpperCase(),` (`,(e.vector_store_mode||`embedded`)===`embedded`?`Embedded`:`Remote`,`) Vectors`]})]})]})]}),(0,b.jsxs)(`div`,{className:`two-col-layout`,style:{marginTop:`20px`},children:[(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-server`}),` System & Embedding Specs`]}),(0,b.jsxs)(`div`,{className:`specs-list`,children:[(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Vector Database:`}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:[(0,b.jsxs)(`span`,{className:`badge badge-accent`,children:[e.vector_store_provider===`chroma`?`ChromaDB`:`Qdrant`,` (`,(e.vector_store_mode||`embedded`)===`embedded`?`Embedded Disk`:`Remote Server`,`)`]}),e.vector_db_status&&(0,b.jsx)(`span`,{className:`badge ${e.vector_db_status===`Healthy`?`badge-success`:`badge-danger`}`,"data-testid":`overview-vector-db-status`,children:e.vector_db_status})]})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Dense Embedding Model:`}),(0,b.jsx)(`code`,{children:e.dense_model||`bge-small-en-v1.5 (384d)`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Sparse BM25 Model:`}),(0,b.jsx)(`code`,{children:e.sparse_model?`${e.sparse_model} (FastEmbed)`:`Qdrant/bm25 (FastEmbed)`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Retrieval Strategy:`}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.vector_store_provider===`chroma`?`Dense Vector Cosine Similarity`:`Dense + BM25 Normalized Weighted Fusion`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`AST Chunker:`}),(0,b.jsx)(`span`,{children:`Tree-sitter AST (Classes, Functions, Methods)`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Last Global Index:`}),(0,b.jsx)(`span`,{className:`code`,children:e.last_indexed||`Never`})]})]}),(0,b.jsx)(`div`,{style:{marginTop:`20px`},children:(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:async()=>{try{let e=await fetch(`/admin/api/reindex`,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||`Failed to trigger reindex`)}n.success(`Re-indexing triggered successfully`),t()}catch(e){n.error(`Reindex error: `+e.message)}},disabled:e.is_indexing,children:e.is_indexing?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Syncing...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Reindex All Sources`]})})})]}),(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-tags`}),` Top Extracted Topics & Symbols`]}),(0,b.jsx)(`div`,{className:`tag-cloud`,children:!e.top_keywords||e.top_keywords.length===0?(0,b.jsx)(`span`,{className:`text-muted`,children:`No topics extracted yet. Sync repositories to populate.`}):e.top_keywords.map(e=>(0,b.jsx)(`span`,{className:`topic-tag`,children:e},e))})]})]})]}):(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsx)(`p`,{children:`Loading...`})})}function E({isOpen:e,onClose:t,onSave:n,alias:r,setAlias:i,url:a,setUrl:o,branch:s,setBranch:c,provider:l,setProvider:u,authUser:d,setAuthUser:f,token:p,setToken:m,isSaving:h}){return e?(0,b.jsx)(`div`,{className:`modal-backdrop`,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-code-branch`}),` Register Git Repository`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:t,children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:n,children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-alias`,children:`Repository Alias / Identifier`}),(0,b.jsx)(`input`,{type:`text`,id:`repo-alias`,required:!0,placeholder:`e.g. backend-api or contextcortex`,value:r,onChange:e=>i(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-provider`,children:`Git Provider`}),(0,b.jsxs)(`select`,{id:`repo-provider`,value:l,onChange:e=>u(e.target.value),children:[(0,b.jsx)(`option`,{value:`auto`,children:`Auto-Detect`}),(0,b.jsx)(`option`,{value:`github`,children:`GitHub / GitHub Enterprise`}),(0,b.jsx)(`option`,{value:`gitlab`,children:`GitLab (Cloud / Self-Hosted)`}),(0,b.jsx)(`option`,{value:`gitea`,children:`Gitea / Forgejo`}),(0,b.jsx)(`option`,{value:`bitbucket`,children:`Bitbucket`}),(0,b.jsx)(`option`,{value:`generic`,children:`Generic Git (HTTP / HTTPS)`})]})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-url`,children:`Git Clone URL (HTTP / HTTPS)`}),(0,b.jsx)(`input`,{type:`text`,id:`repo-url`,required:!0,placeholder:`https://github.com/owner/repo.git or http://git.lan:3000/repo.git`,value:a,onChange:e=>o(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-row form-row-3col`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-branch`,children:`Branch / Tag`}),(0,b.jsx)(`input`,{type:`text`,id:`repo-branch`,placeholder:`main`,value:s,onChange:e=>c(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-user`,children:`Auth User (Optional)`}),(0,b.jsx)(`input`,{type:`text`,id:`repo-user`,placeholder:`e.g. oauth2`,value:d,onChange:e=>f(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`repo-token`,children:`Auth Token (Optional)`}),(0,b.jsx)(`input`,{type:`password`,id:`repo-token`,placeholder:`Token override`,value:p,onChange:e=>m(e.target.value)})]})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:t,children:`Cancel`}),(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:h,children:h?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Adding & Syncing...`]}):`Add & Start Sync`})]})]})]})}):null}function D({repo:e,onClose:t,onCopyUrl:n,copiedUrl:r}){if(!e)return null;let i=`${typeof window<`u`?window.location.origin:``}/api/webhooks/git`;return(0,b.jsx)(`div`,{className:`modal-backdrop`,onClick:e=>{e.target===e.currentTarget&&t()},"data-testid":`webhook-modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`650px`},children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-bolt`}),` Webhook Setup: `,e.name]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:t,"aria-label":`Close webhook modal`,children:`×`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`16px`,fontSize:`0.9rem`},children:[(0,b.jsx)(`p`,{className:`text-muted`,children:`Configure a webhook in your Git repository provider to automatically trigger synchronization on every push event.`}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Webhook URL (Payload URL)`}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`input`,{type:`text`,readOnly:!0,value:i,style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`},"aria-label":`Webhook Payload URL`}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>n(i),style:{minWidth:`95px`},"aria-label":`Copy Webhook URL`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${r?`fa-check`:`fa-copy`}`}),` `,r?`Copied!`:`Copy`]})]})]}),e.webhook_secret&&(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Repository Secret Token (HMAC)`}),(0,b.jsx)(`input`,{type:`text`,readOnly:!0,value:e.webhook_secret,style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`},"aria-label":`Repository Secret Token`})]}),(0,b.jsxs)(`div`,{style:{background:`rgba(0, 0, 0, 0.25)`,border:`1px solid var(--border-card)`,borderRadius:`8px`,padding:`14px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`0.95rem`,marginBottom:`10px`,color:`var(--text)`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-list-check`}),` Provider Setup Instructions`]}),(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`,fontSize:`0.85rem`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`strong`,{style:{color:`#fff`},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github`,style:{marginRight:`6px`}}),` GitHub:`]}),(0,b.jsxs)(`div`,{style:{color:`var(--text-muted)`,marginTop:`2px`,marginLeft:`18px`},children:[`Navigate to `,(0,b.jsx)(`code`,{children:`Settings > Webhooks > Add webhook`}),` → set `,(0,b.jsx)(`em`,{children:`Payload URL`}),` to the URL above → set `,(0,b.jsx)(`em`,{children:`Content type`}),` to `,(0,b.jsx)(`code`,{children:`application/json`}),` → select `,(0,b.jsx)(`em`,{children:`Push events`}),` → click `,(0,b.jsx)(`strong`,{children:`Add webhook`}),`.`]})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`strong`,{style:{color:`#fff`},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-gitlab`,style:{color:`#fc6d26`,marginRight:`6px`}}),` GitLab:`]}),(0,b.jsxs)(`div`,{style:{color:`var(--text-muted)`,marginTop:`2px`,marginLeft:`18px`},children:[`Navigate to `,(0,b.jsx)(`code`,{children:`Settings > Webhooks`}),` (or `,(0,b.jsx)(`code`,{children:`Settings > Integrations`}),`) → set `,(0,b.jsx)(`em`,{children:`URL`}),` → select `,(0,b.jsx)(`em`,{children:`Push events`}),` → click `,(0,b.jsx)(`strong`,{children:`Add webhook`}),`.`]})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`strong`,{style:{color:`#fff`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-mug-hot`,style:{color:`#609926`,marginRight:`6px`}}),` Gitea / Forgejo:`]}),(0,b.jsxs)(`div`,{style:{color:`var(--text-muted)`,marginTop:`2px`,marginLeft:`18px`},children:[`Navigate to `,(0,b.jsx)(`code`,{children:`Settings > Webhooks > Add Webhook > Gitea`}),` → set `,(0,b.jsx)(`em`,{children:`Target URL`}),` → set `,(0,b.jsx)(`em`,{children:`HTTP Method`}),` to `,(0,b.jsx)(`code`,{children:`POST`}),` → select `,(0,b.jsx)(`em`,{children:`Push Events`}),` → click `,(0,b.jsx)(`strong`,{children:`Add Webhook`}),`.`]})]})]})]}),(0,b.jsx)(`div`,{className:`modal-footer`,style:{marginTop:`8px`,padding:0},children:(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:t,children:`Close`})})]})]})})}function O({repos:e,isLoading:t,syncStates:n,onSync:r,onToggleAutoSync:i,onOpenWebhook:a,onDelete:o,onOpenSyncDrawer:s}){let c=e=>{let t=(e||`github`).toLowerCase();return t===`gitlab`?(0,b.jsx)(`i`,{className:`fa-brands fa-gitlab`,style:{color:`#fc6d26`,marginRight:`6px`},title:`GitLab`}):t===`gitea`||t===`forgejo`?(0,b.jsx)(`i`,{className:`fa-solid fa-mug-hot`,style:{color:`#609926`,marginRight:`6px`},title:`Gitea / Forgejo`}):t===`bitbucket`?(0,b.jsx)(`i`,{className:`fa-brands fa-bitbucket`,style:{color:`#2684ff`,marginRight:`6px`},title:`Bitbucket`}):t===`generic`?(0,b.jsx)(`i`,{className:`fa-solid fa-code-branch`,style:{color:`var(--accent)`,marginRight:`6px`},title:`Generic Git`}):(0,b.jsx)(`i`,{className:`fa-brands fa-github`,style:{marginRight:`6px`},title:`GitHub`})},l=(e,t)=>{let n=t?.step||1,r=t?.total_steps||5,i=t?.step_name||`Syncing...`,a=t?.percent??0,o=t?.current_file;return(0,b.jsxs)(`div`,{className:`sync-progress-container`,onClick:()=>s?.(e.id),role:`button`,tabIndex:0,style:{cursor:`pointer`},title:`Click to view live ingestion progress & logs`,onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&s?.(e.id)},children:[(0,b.jsxs)(`div`,{className:`progress-pill badge badge-warning`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),(0,b.jsxs)(`span`,{children:[`Step `,n,`/`,r,`: `,i,` (`,a,`%)`]})]}),(0,b.jsx)(`div`,{className:`sync-progress-bar-wrapper`,children:(0,b.jsx)(`div`,{className:`sync-progress-bar-fill fill-active`,style:{width:`${a}%`}})}),o&&(0,b.jsxs)(`div`,{className:`sync-file-caption`,title:o,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`,style:{marginRight:`4px`}}),(0,b.jsx)(`code`,{children:o})]})]})};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Repo Alias`}),(0,b.jsx)(`th`,{children:`Git URL`}),(0,b.jsx)(`th`,{children:`Branch`}),(0,b.jsx)(`th`,{children:`Commit SHA`}),(0,b.jsx)(`th`,{children:`Status`}),(0,b.jsx)(`th`,{children:`Auto-Sync`}),(0,b.jsx)(`th`,{children:`Files`}),(0,b.jsx)(`th`,{children:`Last Synced`}),(0,b.jsx)(`th`,{children:`Actions`})]})}),(0,b.jsx)(`tbody`,{children:t&&e.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsxs)(`td`,{colSpan:9,className:`empty-state`,"data-testid":`repo-loading-state`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`,color:`var(--primary)`}}),`Loading repositories...`]})}):e.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:9,className:`empty-state`,children:`No Git repositories registered. Click "Add Repository" to index a remote repo.`})}):e.map(e=>{let t=e.auto_sync!==!1&&e.auto_sync!==0,u=n?.[e.id],d=e.status===`syncing`||u?.status===`syncing`;return(0,b.jsxs)(`tr`,{children:[(0,b.jsxs)(`td`,{children:[c(e.provider),(0,b.jsx)(`strong`,{children:e.name})]}),(0,b.jsx)(`td`,{children:(0,b.jsxs)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,className:`repo-url-link`,style:{color:`var(--primary)`,textDecoration:`none`,fontSize:`0.85rem`},title:e.url,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrow-up-right-from-square`}),` `,e.url]})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.branch})}),(0,b.jsx)(`td`,{children:e.commit_sha?(0,b.jsx)(`code`,{children:e.commit_sha.substring(0,8)}):(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{children:d?l(e,u):e.status===`error`||u?.status===`error`?(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`span`,{className:`badge badge-danger`,title:e.last_error||u?.error||`Sync failed`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-exclamation`}),` Error`]}),(e.last_error||u?.error)&&(0,b.jsx)(`div`,{style:{fontSize:`0.75rem`,color:`var(--danger)`,marginTop:`4px`,maxWidth:`180px`,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},title:e.last_error||u?.error||``,children:e.last_error||u?.error})]}):e.status===`pending`||u?.status===`pending`?(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-clock`}),` Pending`]}):(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-check`}),` Synced`]})}),(0,b.jsx)(`td`,{children:(0,b.jsxs)(`button`,{type:`button`,className:`badge ${t?`badge-success`:`badge-danger`}`,style:{cursor:`pointer`,background:t?`rgba(16, 185, 129, 0.2)`:`rgba(239, 68, 68, 0.2)`,border:t?`1px solid rgba(16, 185, 129, 0.4)`:`1px solid rgba(239, 68, 68, 0.4)`,color:t?`#6ee7b7`:`#fca5a5`,padding:`4px 8px`,display:`inline-flex`,alignItems:`center`,gap:`6px`},onClick:()=>i(e.id,t),title:`Auto-Sync: ${t?`ON`:`OFF`} (Click to toggle)`,"aria-label":`Toggle auto-sync for ${e.name}`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${t?`fa-toggle-on`:`fa-toggle-off`}`}),`Auto-Sync: `,t?`ON`:`OFF`]})}),(0,b.jsxs)(`td`,{children:[(e.file_count||0).toLocaleString(),` files`]}),(0,b.jsx)(`td`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`},children:e.last_synced||`Never`}),(0,b.jsx)(`td`,{children:(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`6px`},children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`4px 8px`,fontSize:`0.8rem`},onClick:()=>s?.(e.id),title:`View Ingestion Logs`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`}),` Logs`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`4px 8px`,fontSize:`0.8rem`},onClick:()=>r(e.id),title:`Trigger Sync`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Sync`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`4px 8px`,fontSize:`0.8rem`},onClick:()=>a(e),title:`Webhook Setup`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-bolt`}),` Webhook`]}),(0,b.jsx)(`button`,{className:`btn-icon btn-delete`,onClick:()=>o(e.id,e.name),title:`Delete Repo`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`})})]})})]},e.id)})})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:t&&e.length===0?(0,b.jsxs)(`div`,{className:`empty-state`,"data-testid":`repo-loading-state-mobile`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`,color:`var(--primary)`}}),`Loading repositories...`]}):e.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No Git repositories registered. Click "Add Repository" to index a remote repo.`}):e.map(e=>{let t=e.auto_sync!==!1&&e.auto_sync!==0,u=n?.[e.id],d=e.status===`syncing`||u?.status===`syncing`;return(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:[c(e.provider),(0,b.jsx)(`strong`,{style:{fontSize:`1rem`},children:e.name})]}),!d&&(e.status===`error`||u?.status===`error`?(0,b.jsxs)(`span`,{className:`badge badge-danger`,title:e.last_error||u?.error||`Sync failed`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-exclamation`}),` Error`]}):e.status===`pending`||u?.status===`pending`?(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-clock`}),` Pending`]}):(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-check`}),` Synced`]}))]}),d&&(0,b.jsx)(`div`,{style:{margin:`4px 0 2px 0`},children:l(e,u)}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`URL:`}),(0,b.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,style:{color:`var(--primary)`,textDecoration:`none`},children:e.url})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Branch:`}),(0,b.jsx)(`code`,{children:e.branch})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Commit:`}),e.commit_sha?(0,b.jsx)(`code`,{children:e.commit_sha.substring(0,8)}):`-`]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Auto-Sync:`}),(0,b.jsx)(`button`,{type:`button`,className:`badge ${t?`badge-success`:`badge-danger`}`,style:{cursor:`pointer`,padding:`2px 6px`,fontSize:`0.75rem`},onClick:()=>i(e.id,t),title:`Auto-Sync: ${t?`ON`:`OFF`} (Click to toggle)`,"aria-label":`Toggle auto-sync for ${e.name}`,children:t?`ON`:`OFF`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Files:`}),(e.file_count||0).toLocaleString(),` files`]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Last Synced:`}),e.last_synced||`Never`]}),!d&&(e.last_error||u?.error)&&(0,b.jsxs)(`div`,{style:{color:`var(--danger)`,fontSize:`0.75rem`},children:[(0,b.jsx)(`span`,{className:`data-label`,children:`Error:`}),e.last_error||u?.error]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-actions`,children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>s?.(e.id),title:`View Ingestion Logs`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`}),` Logs`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>r(e.id),title:`Trigger Sync`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Sync`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>a(e),title:`Webhook Setup`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-bolt`}),` Webhook`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary btn-delete`,onClick:()=>o(e.id,e.name),title:`Delete Repo`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Delete`]})]})]},`card-${e.id}`)})})]})}var k=[{step:1,title:`1. Connecting & Remote Check`},{step:2,title:`2. Shallow Cloning Repository`},{step:3,title:`3. Computing File Delta & Scanning`},{step:4,title:`4. Parsing AST Symbols & API Routes`},{step:5,title:`5. Upserting Embeddings & Finalizing`}];function ee({isOpen:e,onClose:t,repoId:n,repoName:r,job:i,onCancelSync:a}){let[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!0),[u,d]=(0,_.useState)(!1),[f,p]=(0,_.useState)(0),[m,h]=(0,_.useState)(!1),g=(0,_.useRef)(null),v=(0,_.useRef)(null),y=n??i?.repo_id??null,x=r||i?.repo_name||`Repository`;(0,_.useEffect)(()=>{if(!e||!i?.started_at){p(0);return}let t=()=>{let e=i.started_at>1e11?i.started_at:i.started_at*1e3;return Math.max(0,Math.floor((Date.now()-e)/1e3))};if(p(t()),i.status===`syncing`||i.status===`pending`){let e=setInterval(()=>{p(t())},1e3);return()=>clearInterval(e)}},[e,i?.started_at,i?.status]);let S=e=>{let t=Math.floor(e/60),n=e%60;return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}`},C=i?.logs,w=(0,_.useMemo)(()=>{let e=C||[];if(!o.trim())return e;let t=o.toLowerCase();return e.filter(e=>e.message.toLowerCase().includes(t)||e.level.toLowerCase().includes(t)||e.timestamp.toLowerCase().includes(t))},[C,o]);(0,_.useEffect)(()=>{c&&g.current&&typeof g.current.scrollIntoView==`function`&&g.current.scrollIntoView({behavior:`smooth`})},[w,c]);let T=async()=>{let e=(i?.logs||[]).map(e=>`[${e.timestamp}] [${e.level.toUpperCase()}] ${e.message}`).join(` +`);try{await navigator.clipboard.writeText(e),d(!0),setTimeout(()=>d(!1),2e3)}catch(e){console.error(`Failed to copy logs:`,e)}},E=async()=>{if(!(!y||!a))try{h(!0),await a(y)}catch(e){console.error(`Failed to cancel sync:`,e)}finally{h(!1)}};if(!e)return null;let D=i?.status||`pending`,O=i?.percent??(D===`synced`?100:0),ee=i?.step??(D===`synced`?5:1);return(0,b.jsx)(`div`,{className:`sync-drawer-backdrop`,onClick:e=>{e.target===e.currentTarget&&t()},"data-testid":`sync-drawer-backdrop`,children:(0,b.jsxs)(`div`,{className:`sync-drawer`,children:[(0,b.jsxs)(`div`,{className:`sync-drawer-header`,children:[(0,b.jsxs)(`div`,{className:`sync-drawer-title-group`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`10px`,flexWrap:`wrap`},children:[(0,b.jsxs)(`h2`,{style:{fontSize:`1.1rem`,margin:0,fontWeight:700,color:`var(--text)`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-code-branch`,style:{marginRight:`8px`,color:`var(--primary)`}}),x,` Ingestion Progress & Live Logs`]}),D===`syncing`?(0,b.jsxs)(`span`,{className:`badge badge-warning`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Syncing`]}):D===`synced`?(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-check`}),` Synced`]}):D===`error`?(0,b.jsxs)(`span`,{className:`badge badge-danger`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-exclamation`}),` Error`]}):(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-clock`}),` Pending`]})]}),(0,b.jsxs)(`div`,{className:`sync-drawer-meta`,style:{display:`flex`,alignItems:`center`,gap:`12px`,marginTop:`6px`,fontSize:`0.82rem`,color:`var(--text-muted)`},children:[(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`i`,{className:`fa-regular fa-clock`,style:{marginRight:`4px`}}),`Elapsed: `,(0,b.jsx)(`strong`,{children:S(f)})]}),i?.step_name&&(0,b.jsxs)(`span`,{children:[`• Current: `,(0,b.jsx)(`strong`,{children:i.step_name})]})]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[D===`syncing`&&a&&y!=null&&(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary btn-cancel-sync`,onClick:E,disabled:m,style:{fontSize:`0.8rem`,padding:`6px 12px`,color:`var(--danger)`,borderColor:`rgba(239, 68, 68, 0.4)`},children:[(0,b.jsx)(`i`,{className:`fa-solid ${m?`fa-spinner fa-spin`:`fa-stop`}`}),m?`Cancelling...`:`Cancel Sync`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:t,"aria-label":`Close sync drawer`,style:{fontSize:`1.4rem`,lineHeight:1},children:`×`})]})]}),(0,b.jsxs)(`div`,{className:`sync-drawer-body`,children:[(0,b.jsxs)(`div`,{className:`sync-progress-section`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`span`,{style:{fontWeight:600,color:`var(--text)`},children:`Overall Ingestion`}),(0,b.jsxs)(`span`,{style:{fontWeight:700,color:D===`error`?`var(--danger)`:`var(--primary)`},children:[O,`%`]})]}),(0,b.jsx)(`div`,{className:`sync-progress-bar-container`,children:(0,b.jsx)(`div`,{className:`sync-progress-bar-fill ${D===`error`?`fill-error`:D===`synced`?`fill-success`:`fill-active`}`,style:{width:`${O}%`}})})]}),(0,b.jsxs)(`div`,{className:`sync-stepper-container`,children:[(0,b.jsx)(`h4`,{style:{fontSize:`0.82rem`,textTransform:`uppercase`,letterSpacing:`0.05em`,color:`var(--text-muted)`,marginBottom:`10px`},children:`Ingestion Stages`}),(0,b.jsx)(`div`,{className:`sync-stepper-list`,children:k.map(e=>{let t=D===`synced`||D!==`error`&&ee>e.step||D===`error`&&ee>e.step,n=D===`syncing`&&ee===e.step,r=D===`error`&&ee===e.step;return(0,b.jsxs)(`div`,{className:`sync-stepper-item ${t?`item-completed`:n?`item-active`:r?`item-error`:`item-pending`}`,children:[(0,b.jsxs)(`div`,{className:`sync-stepper-icon`,children:[t&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-check`,style:{color:`#10b981`}}),n&&(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{color:`#f59e0b`}}),r&&(0,b.jsx)(`i`,{className:`fa-solid fa-circle-xmark`,style:{color:`#ef4444`}}),!t&&!n&&!r&&(0,b.jsx)(`i`,{className:`fa-regular fa-circle`,style:{color:`var(--text-muted)`}})]}),(0,b.jsxs)(`div`,{className:`sync-stepper-content`,children:[(0,b.jsx)(`div`,{className:`sync-stepper-title`,style:{fontWeight:n?600:500},children:e.title}),n&&(0,b.jsxs)(`div`,{className:`sync-stepper-details`,children:[i?.current_file&&(0,b.jsxs)(`div`,{className:`sync-current-file`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`,style:{marginRight:`4px`}}),(0,b.jsx)(`code`,{children:i.current_file})]}),i?.total_files!=null&&i.total_files>0&&(0,b.jsxs)(`div`,{className:`sync-file-count`,style:{marginTop:`2px`,color:`var(--text-muted)`},children:[i.processed_files,` / `,i.total_files,` files (`,O,`%)`]})]}),r&&i?.error&&(0,b.jsxs)(`div`,{className:`sync-stepper-error-msg`,style:{marginTop:`4px`,color:`var(--danger)`,fontSize:`0.82rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`,style:{marginRight:`4px`}}),i.error]})]})]},e.step)})})]}),(0,b.jsxs)(`div`,{className:`sync-terminal-section`,children:[(0,b.jsxs)(`div`,{className:`sync-terminal-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`,style:{color:`var(--accent)`}}),(0,b.jsx)(`span`,{style:{fontSize:`0.85rem`,fontWeight:600,color:`var(--text)`},children:`Live Terminal Output`}),(0,b.jsxs)(`span`,{className:`badge badge-secondary`,style:{fontSize:`0.75rem`,padding:`1px 6px`},children:[w.length,` `,w.length===1?`event`:`events`]})]}),(0,b.jsxs)(`div`,{className:`sync-terminal-actions`,children:[(0,b.jsxs)(`label`,{className:`sync-autoscroll-toggle`,children:[(0,b.jsx)(`input`,{type:`checkbox`,checked:c,onChange:e=>l(e.target.checked),"aria-label":`Autoscroll`}),(0,b.jsx)(`span`,{children:`Autoscroll`})]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary btn-sm`,onClick:T,"aria-label":`Copy logs`,style:{fontSize:`0.75rem`,padding:`3px 8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid ${u?`fa-check`:`fa-copy`}`}),` `,u?`Copied!`:`Copy Logs`]})]})]}),(0,b.jsxs)(`div`,{className:`sync-terminal-search`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass`,style:{color:`var(--text-muted)`,fontSize:`0.8rem`}}),(0,b.jsx)(`input`,{type:`text`,placeholder:`Filter logs by keyword or level...`,value:o,onChange:e=>s(e.target.value),style:{width:`100%`,background:`transparent`,border:`none`,outline:`none`,color:`var(--text)`,fontSize:`0.82rem`,padding:`4px 0`}}),o&&(0,b.jsx)(`button`,{type:`button`,onClick:()=>s(``),style:{background:`transparent`,border:`none`,color:`var(--text-muted)`,cursor:`pointer`,fontSize:`0.8rem`},children:`×`})]}),(0,b.jsx)(`div`,{className:`sync-terminal-body`,ref:v,children:w.length===0?(0,b.jsxs)(`div`,{className:`sync-terminal-empty`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-clock-rotate-left`,style:{marginBottom:`6px`,fontSize:`1.2rem`,opacity:.5}}),(0,b.jsx)(`div`,{children:(C?.length||0)===0?`Waiting for sync activity...`:`No logs matching filter`})]}):(0,b.jsxs)(`div`,{className:`sync-terminal-lines`,children:[w.map((e,t)=>{let n=(e.level||`INFO`).toUpperCase(),r=`level-info`;return(n===`WARN`||n===`WARNING`)&&(r=`level-warn`),(n===`ERROR`||n===`FATAL`)&&(r=`level-error`),(0,b.jsxs)(`div`,{className:`sync-terminal-line`,children:[(0,b.jsxs)(`span`,{className:`log-time`,children:[`[`,e.timestamp,`]`]}),(0,b.jsx)(`span`,{className:`log-badge ${r}`,children:n}),(0,b.jsx)(`span`,{className:`log-msg`,children:e.message})]},t)}),(0,b.jsx)(`div`,{ref:g})]})})]})]})]})})}function A(){let[e,t]=(0,_.useState)({}),[n,r]=(0,_.useState)(!1),i=(0,_.useRef)(null),a=(0,_.useCallback)(async()=>{try{let e=await fetch(`/admin/api/repos/sync-status`);if(e&&e.ok){let n=await e.json();if(n&&typeof n==`object`&&!Array.isArray(n)){let e={};Object.entries(n).forEach(([t,n])=>{let r=n;r&&(r.repo_id!=null||r.step!=null||r.status!=null)&&(e[Number(t)]=r)}),t(t=>({...t,...e}))}else if(Array.isArray(n)){let e={};n.forEach(t=>{t&&t.repo_id!=null&&(t.step!=null||t.status===`syncing`)&&(e[t.repo_id]=t)}),Object.keys(e).length>0&&t(t=>({...t,...e}))}}}catch(e){console.error(`Failed to fetch initial sync status snapshot:`,e)}},[]);return(0,_.useEffect)(()=>{if(a(),typeof EventSource>`u`)return;let e=null;try{e=new EventSource(`/admin/api/repos/sync/stream`),i.current=e,e.onopen=()=>{r(!0)},e.onerror=()=>{r(!1)},e.addEventListener(`init`,e=>{try{let n=JSON.parse(e.data);if(n&&typeof n==`object`){let e={};Object.entries(n).forEach(([t,n])=>{e[Number(t)]=n}),t(e),r(!0)}}catch(e){console.error(`Failed to parse init sync stream event:`,e)}}),e.addEventListener(`progress`,e=>{try{let n=JSON.parse(e.data),i=n.data||n;i&&i.repo_id!=null&&(t(e=>{let t=e[i.repo_id];return{...e,[i.repo_id]:{...t||{},...i,logs:i.logs??t?.logs??[]}}}),r(!0))}catch(e){console.error(`Failed to parse progress event:`,e)}}),e.addEventListener(`log`,e=>{try{let n=JSON.parse(e.data),r=n.repo_id??n.data?.repo_id,i=n.data&&!n.data.repo_id?n.data:n.log||n.data;r!=null&&i&&t(e=>{let t=e[r];if(!t)return e;let n=t.logs||[];return{...e,[r]:{...t,logs:[...n,i]}}})}catch(e){console.error(`Failed to parse log event:`,e)}})}catch(e){console.error(`Failed to initialize EventSource:`,e),r(!1)}return()=>{e&&(e.close(),i.current=null)}},[a]),{syncStates:e,isConnected:n,cancelSync:(0,_.useCallback)(async e=>{try{let t=await fetch(`/admin/api/repos/${e}/cancel-sync`,{method:`POST`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||`Failed to cancel sync: ${t.statusText}`)}return await t.json()}catch(t){throw console.error(`Error cancelling sync for repo ${e}:`,t),t}},[])}}function te({refreshStats:e}){let[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(!1),[s,c]=(0,_.useState)(null),[l,u]=(0,_.useState)(!1),[d,f]=(0,_.useState)(null),p=S(),{syncStates:m,cancelSync:h}=A(),[g,v]=(0,_.useState)(``),[y,x]=(0,_.useState)(``),[C,w]=(0,_.useState)(`main`),[T,k]=(0,_.useState)(`auto`),[te,ne]=(0,_.useState)(``),[re,j]=(0,_.useState)(``),[M,N]=(0,_.useState)(!1),P=(0,_.useCallback)(async()=>{try{let e=await fetch(`/admin/api/repos`);if(!e.ok){p.error(`Failed to load repositories`);return}let t=await e.json();n(Array.isArray(t)?t:[])}catch(e){p.error(`Error loading repos: `+e.message),console.error(`Error loading repos:`,e)}finally{i(!1)}},[p]);(0,_.useEffect)(()=>{P();let e=setInterval(P,8e3);return()=>clearInterval(e)},[P]);let ie=async t=>{t.preventDefault(),N(!0);try{let t=await fetch(`/admin/api/repos`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:g.trim(),url:y.trim(),branch:C.trim()||`main`,provider:T===`auto`?void 0:T,auth_user:te.trim()||null,auth_token:re.trim()||null})}),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to add repository`);o(!1),v(``),x(``),w(`main`),k(`auto`),ne(``),j(``),P(),e(),p.success(`Repository '${g.trim()}' added successfully`)}catch(e){p.error(`Error: ${e.message}`)}finally{N(!1)}},ae=async t=>{n(e=>e.map(e=>e.id===t?{...e,status:`syncing`}:e));try{let n=await fetch(`/admin/api/repos/sync/${t}`,{method:`POST`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to trigger sync`)}P(),e(),p.info(`Sync triggered successfully`)}catch(e){P(),p.error(`Failed to trigger sync: `+e.message)}},oe=async(e,t)=>{let r=!t;n(t=>t.map(t=>t.id===e?{...t,auto_sync:r}:t));try{let t=await fetch(`/admin/api/repos/${e}/auto-sync`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({auto_sync:r})});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||e.detail||`Failed to update auto-sync`)}p.info(`Auto-sync ${r?`enabled`:`disabled`}`),P()}catch(e){P(),p.error(`Failed to update auto-sync: `+e.message)}},F=async e=>{try{navigator?.clipboard?.writeText&&await navigator.clipboard.writeText(e),u(!0),p.info(`Webhook URL copied to clipboard`),setTimeout(()=>u(!1),2e3)}catch(e){p.error(`Failed to copy: `+e.message)}},I=async(t,r)=>{if(window.confirm(`Are you sure you want to delete repository '${r}'? All vectors and indexed symbols for this repo will be permanently purged.`)){n(e=>e.filter(e=>e.id!==t));try{let n=await fetch(`/admin/api/repos/${t}`,{method:`DELETE`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to delete repo`)}P(),e(),p.success(`Repository '${r}' deleted successfully`)}catch(e){P(),p.error(`Failed to delete repo: `+e.message)}}},se=d===null?null:m[d],ce=t.find(e=>e.id===d)?.name||se?.repo_name||``;return(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-code-branch`}),` Registered Git Repositories`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Supports GitHub, GitLab, Gitea, Bitbucket, and custom self-hosted Git repositories over HTTP/HTTPS.`})]}),(0,b.jsxs)(`button`,{className:`btn btn-primary`,onClick:()=>o(!0),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-plus`}),` Add Repository`]})]}),(0,b.jsx)(O,{repos:t,isLoading:r,syncStates:m,onSync:ae,onToggleAutoSync:oe,onOpenWebhook:e=>c(e),onDelete:I,onOpenSyncDrawer:e=>f(e)}),(0,b.jsx)(E,{isOpen:a,onClose:()=>o(!1),onSave:ie,alias:g,setAlias:v,url:y,setUrl:x,branch:C,setBranch:w,provider:T,setProvider:k,authUser:te,setAuthUser:ne,token:re,setToken:j,isSaving:M}),(0,b.jsx)(D,{repo:s,onClose:()=>c(null),onCopyUrl:F,copiedUrl:l}),(0,b.jsx)(ee,{isOpen:d!==null,onClose:()=>f(null),repoId:d,repoName:ce,job:se,onCancelSync:h})]})})}function ne({refreshStats:e}){let[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),a=S(),[o,s]=(0,_.useState)(!1),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)(``),[f,p]=(0,_.useState)(`local`),[m,h]=(0,_.useState)(``),[g,v]=(0,_.useState)(`directory`),[y,x]=(0,_.useState)(1),[C,w]=(0,_.useState)(null),T=(0,_.useCallback)(async()=>{try{let e=await fetch(`/admin/api/paths`);if(!e.ok){a.error(`Failed to load local paths`);return}let t=await e.json();n(t)}catch(e){a.error(`Error loading paths: `+e.message),console.error(`Error loading paths:`,e)}finally{i(!1)}},[a]);(0,_.useEffect)(()=>{T();let e=setInterval(T,8e3);return()=>clearInterval(e)},[T]);let E=async t=>{t.preventDefault();try{let t=await fetch(`/admin/api/paths`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:u.trim(),repo:f.trim()||`local`,category:m.trim()||null,type:g,recursive:y,enabled:1})}),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to add path`);s(!1),d(``),p(`local`),h(``),v(`directory`),x(1),T(),e(),a.success(`Path added successfully`)}catch(e){a.error(`Error: ${e.message}`)}},D=async t=>{if(window.confirm(`Are you sure you want to delete this local search path?`)){n(e=>e.filter(e=>e.id!==t));try{let n=await fetch(`/admin/api/paths/${t}`,{method:`DELETE`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to delete path`)}a.success(`Path deleted successfully`),T(),e()}catch(e){T(),a.error(`Failed to delete path: `+e.message)}}},O=(e=`/`)=>{l(!0),k(e)},k=async e=>{try{let t=await fetch(`/admin/api/browse?path=${encodeURIComponent(e)}`),n=await t.json();if(!t.ok){a.error(n.error||`Failed to browse directory`);return}w(n)}catch(e){a.error(`Browse error: `+e.message),console.error(`Browse error:`,e)}};return(0,b.jsxs)(`div`,{className:`tab-content active`,children:[(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`}),` Monitored Local Paths`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Mounted documentation vaults and local workspaces scanned for changes.`})]}),(0,b.jsxs)(`button`,{className:`btn btn-primary`,onClick:()=>s(!0),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-plus`}),` Add Local Path`]})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Path`}),(0,b.jsx)(`th`,{children:`Repo Alias`}),(0,b.jsx)(`th`,{children:`Type`}),(0,b.jsx)(`th`,{children:`Recursive`}),(0,b.jsx)(`th`,{children:`Category`}),(0,b.jsx)(`th`,{children:`Enabled`}),(0,b.jsx)(`th`,{children:`Actions`})]})}),(0,b.jsx)(`tbody`,{children:r&&t.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsxs)(`td`,{colSpan:7,className:`empty-state`,"data-testid":`path-loading-state`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`,color:`var(--primary)`}}),`Loading local paths...`]})}):t.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:7,className:`empty-state`,children:`No local search paths configured.`})}):t.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.path})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.repo||`local`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.type})}),(0,b.jsx)(`td`,{children:e.recursive?`Yes`:`No`}),(0,b.jsx)(`td`,{children:e.category?(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.category}):(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{children:e.enabled?(0,b.jsx)(`span`,{className:`badge badge-success`,children:`Enabled`}):(0,b.jsx)(`span`,{className:`badge badge-danger`,children:`Disabled`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`button`,{className:`btn-icon btn-delete`,onClick:()=>D(e.id),title:`Delete Path`,"aria-label":`Delete Path`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`})})})]},e.id))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:r&&t.length===0?(0,b.jsxs)(`div`,{className:`empty-state`,"data-testid":`path-loading-state-mobile`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`,color:`var(--primary)`}}),`Loading local paths...`]}):t.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No local search paths configured.`}):t.map(e=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,minWidth:0},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`,style:{color:`var(--accent)`}}),(0,b.jsx)(`strong`,{style:{fontSize:`1rem`},children:e.repo||`local`})]}),e.enabled?(0,b.jsx)(`span`,{className:`badge badge-success`,children:`Enabled`}):(0,b.jsx)(`span`,{className:`badge badge-danger`,children:`Disabled`})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.path})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,flexWrap:`wrap`,alignItems:`center`},children:[(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Type: `}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.type})]}),(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Recursive: `}),(0,b.jsx)(`span`,{children:e.recursive?`Yes`:`No`})]})]}),e.category&&(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Category: `}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.category})]})]}),(0,b.jsx)(`div`,{className:`data-mobile-card-actions`,children:(0,b.jsxs)(`button`,{className:`btn btn-secondary btn-delete`,onClick:()=>D(e.id),title:`Delete Path`,"aria-label":`Delete Path`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Delete`]})})]},`card-${e.id}`))})]}),o&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-open`}),` Add Monitored Local Path`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>s(!1),children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:E,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Selected Directory / File`}),(0,b.jsxs)(`div`,{className:`path-input-row`,children:[(0,b.jsx)(`input`,{type:`text`,readOnly:!0,required:!0,placeholder:`Browse workspace directories...`,value:u}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>O(C?.current_path||`/`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass`}),` Browse`]})]})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`path-repo-alias`,children:`Repo / Vault Alias`}),(0,b.jsx)(`input`,{type:`text`,id:`path-repo-alias`,placeholder:`local`,value:f,onChange:e=>p(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`path-category`,children:`Category Override`}),(0,b.jsx)(`input`,{type:`text`,id:`path-category`,placeholder:`Optional category`,value:m,onChange:e=>h(e.target.value)})]})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`path-type`,children:`Path Type`}),(0,b.jsxs)(`select`,{id:`path-type`,value:g,onChange:e=>v(e.target.value),children:[(0,b.jsx)(`option`,{value:`directory`,children:`Directory`}),(0,b.jsx)(`option`,{value:`file`,children:`Single File`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`path-recursive`,children:`Scan Subfolders`}),(0,b.jsxs)(`select`,{id:`path-recursive`,value:y,onChange:e=>x(parseInt(e.target.value)),children:[(0,b.jsx)(`option`,{value:1,children:`Yes (Recursive)`}),(0,b.jsx)(`option`,{value:0,children:`No (Top-level only)`})]})]})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>s(!1),children:`Cancel`}),(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,children:`Save Path`})]})]})]})}),c&&C&&(0,b.jsx)(`div`,{className:`modal-backdrop`,style:{zIndex:1100},children:(0,b.jsxs)(`div`,{className:`glass-card modal-card browser-card`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-search`}),` Browse Workspace Files`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>l(!1),children:`×`})]}),(0,b.jsxs)(`div`,{className:`browser-body`,children:[(0,b.jsxs)(`div`,{className:`browser-breadcrumbs`,children:[(0,b.jsx)(`span`,{className:`label`,children:`Current: `}),(0,b.jsx)(`span`,{className:`code`,style:{wordBreak:`break-all`},children:C.current_path})]}),(0,b.jsx)(`div`,{className:`browser-list-container`,children:(0,b.jsxs)(`ul`,{className:`browser-list`,children:[C.parent_path&&(0,b.jsxs)(`li`,{className:`browser-item`,onClick:()=>k(C.parent_path),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-level-up-alt`,style:{color:`var(--accent)`}}),` `,(0,b.jsx)(`span`,{children:`.. (Parent Directory)`})]}),C.directories.map(e=>(0,b.jsxs)(`li`,{className:`browser-item`,onClick:()=>k(e.path),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder`,style:{color:`#fbbf24`}}),` `,(0,b.jsx)(`span`,{style:{wordBreak:`break-all`},children:e.name})]},e.path)),C.files.map(e=>(0,b.jsxs)(`li`,{className:`browser-item`,onClick:()=>{d(e.path),v(`file`),l(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`,style:{color:`var(--text-muted)`}}),` `,(0,b.jsx)(`span`,{style:{wordBreak:`break-all`},children:e.name})]},e.path))]})})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>l(!1),children:`Cancel`}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-primary`,onClick:()=>{C&&(d(C.current_path),v(`directory`),l(!1))},children:`Select Current Folder`})]})]})})]})}function re(){let e=S(),[t,n]=(0,_.useState)(``),[r,i]=(0,_.useState)(`code`),[a,o]=(0,_.useState)(``),[s,c]=(0,_.useState)(!1),[l,u]=(0,_.useState)(null),[d,f]=(0,_.useState)(null);return(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass`}),` Live Hybrid Search Inspector`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Test hybrid search results across code and documentation directly from the browser.`}),(0,b.jsx)(`form`,{onSubmit:async n=>{n.preventDefault(),c(!0),f(null),u(null);try{let e=await fetch(`/admin/api/search/test`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({query:t.trim(),type:r,repo:a.trim()||null})}),n=await e.json();if(!e.ok)throw Error(n.error||`Search failed`);u(n.results||[])}catch(t){f(t.message),e.error(`Search failed: `+t.message)}finally{c(!1)}},style:{marginTop:`16px`},children:(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:2},children:[(0,b.jsx)(`label`,{children:`Search Query`}),(0,b.jsx)(`input`,{type:`text`,required:!0,placeholder:`e.g. JWT token authentication or chunk_markdown`,value:t,onChange:e=>n(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Target Type`}),(0,b.jsxs)(`select`,{value:r,onChange:e=>i(e.target.value),children:[(0,b.jsx)(`option`,{value:`code`,children:`Code Snippets & Symbols`}),(0,b.jsx)(`option`,{value:`doc`,children:`Documentation & Notes`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Repo Filter (Optional)`}),(0,b.jsx)(`input`,{type:`text`,placeholder:`All Repos`,value:a,onChange:e=>o(e.target.value)})]}),(0,b.jsx)(`div`,{className:`form-group search-form-btn-group`,style:{alignSelf:`flex-end`},children:(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:s,children:s?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Searching...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-play`}),` Search`]})})})]})}),(0,b.jsxs)(`div`,{style:{marginTop:`20px`},children:[s&&(0,b.jsx)(`div`,{className:`empty-state`,children:`Running hybrid retrieval with Normalized Weighted Fusion...`}),d&&(0,b.jsxs)(`div`,{className:`empty-state`,style:{color:`var(--danger)`},children:[`Search error: `,d]}),!s&&!d&&l===null&&(0,b.jsx)(`div`,{className:`empty-state`,children:`Enter a query above to test hybrid retrieval.`}),!s&&!d&&l!==null&&l.length===0&&(0,b.jsx)(`div`,{className:`empty-state`,children:`No matching results found in index.`}),!s&&!d&&l!==null&&l.length>0&&l.map((e,t)=>{let n=e.payload;return(0,b.jsxs)(`div`,{className:`search-hit-card`,children:[(0,b.jsxs)(`div`,{className:`search-hit-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,flexWrap:`wrap`,alignItems:`center`,gap:`6px`},children:[(0,b.jsx)(`span`,{className:`badge badge-primary`,children:n.repo}),(0,b.jsx)(`strong`,{children:n.rel_path}),n.symbol&&(0,b.jsx)(`span`,{className:`badge badge-accent`,children:n.symbol}),(0,b.jsxs)(`span`,{className:`text-muted`,style:{fontSize:`0.8rem`},children:[`(Lines `,n.start_line,`-`,n.end_line,`)`]}),n.github_url&&(()=>{let e=``;try{e=new URL(n.github_url).hostname.toLowerCase()}catch{}let t=n.github_url.toLowerCase(),r=`View Source`,i=`fa-solid fa-code-branch`;return e===`gitlab.com`||e.endsWith(`.gitlab.com`)||t.includes(`/-/blob/`)?(r=`View on GitLab`,i=`fa-brands fa-gitlab`):e.includes(`gitea`)||e.includes(`forgejo`)?(r=`View on Gitea`,i=`fa-solid fa-mug-hot`):e===`bitbucket.org`||e.endsWith(`.bitbucket.org`)?(r=`View on Bitbucket`,i=`fa-brands fa-bitbucket`):(e===`github.com`||e.endsWith(`.github.com`))&&(r=`View on GitHub`,i=`fa-brands fa-github`),(0,b.jsxs)(`a`,{href:n.github_url,target:`_blank`,rel:`noreferrer`,style:{color:`var(--primary)`,fontSize:`0.8rem`},children:[(0,b.jsx)(`i`,{className:i,style:{marginRight:`4px`}}),r]})})()]}),(0,b.jsx)(`div`,{children:(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[`Score: `,(e.score*100).toFixed(1),`% (`,e.score.toFixed(4),`)`]})})]}),(0,b.jsx)(`pre`,{className:`search-hit-code`,children:n.content})]},t)})]})]})})}function j({vectorStore:e,isLoadingVs:t,testFeedback:n,vsProvider:r,vsMode:i,vsStoragePath:a,setVsStoragePath:o,vsUrl:s,setVsUrl:c,vsCollection:l,setVsCollection:u,isTestingVs:d,isSwitchingVs:f,onProviderChange:p,onModeChange:m,onTestConnection:h,onSwitchBackend:g}){return(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-database`}),` Vector Database Engine`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Configure and switch between vector database backends (Qdrant & ChromaDB). Switching backends updates system metadata and triggers full re-indexing.`}),(0,b.jsxs)(`div`,{className:`vs-config-layout`,children:[(0,b.jsxs)(`div`,{className:`vs-box`,children:[(0,b.jsxs)(`h3`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-nodes`}),` Active Vector Backend`]}),t&&!e?(0,b.jsx)(`p`,{className:`text-muted`,children:`Loading vector store configuration...`}):e?(0,b.jsxs)(`div`,{className:`specs-list`,style:{marginTop:0},children:[(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Provider:`}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.provider===`chroma`?`ChromaDB`:`Qdrant`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Operating Mode:`}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.mode===`embedded`?`Embedded Disk`:`Remote Server`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:e.mode===`embedded`?`Storage Path:`:`Server URL:`}),(0,b.jsx)(`code`,{children:e.mode===`embedded`?e.storage_path||`data/qdrant_db`:e.url||`http://localhost:6333`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Collection Name:`}),(0,b.jsx)(`code`,{children:e.collection||`knowledge_rag_v1`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Points Count:`}),(0,b.jsx)(`span`,{style:{fontSize:`0.9rem`,fontWeight:600},children:(e.points_count||0).toLocaleString()})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Health Status:`}),e.healthy?(0,b.jsxs)(`span`,{className:`badge badge-success`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-check`}),` Healthy`]}):(0,b.jsxs)(`span`,{className:`badge badge-danger`,title:e.health_message||`Unhealthy`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`}),` `,e.health_message?e.health_message.length>35?e.health_message.slice(0,35)+`...`:e.health_message:`Unhealthy`]})]})]}):(0,b.jsx)(`p`,{className:`text-muted`,children:`No vector store configuration found.`})]}),(0,b.jsxs)(`div`,{className:`vs-box`,children:[(0,b.jsxs)(`h3`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-sliders`}),` Configure & Switch Backend`]}),n&&(0,b.jsxs)(`div`,{className:`vs-feedback-banner ${n.success?`feedback-success`:`feedback-error`}`,children:[(0,b.jsx)(`i`,{className:n.success?`fa-solid fa-circle-check`:`fa-solid fa-circle-exclamation`}),(0,b.jsx)(`span`,{children:n.message})]}),(0,b.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),g()},children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-provider`,children:`Vector Store Provider`}),(0,b.jsxs)(`select`,{id:`vs-provider`,value:r,onChange:e=>p(e.target.value),children:[(0,b.jsx)(`option`,{value:`qdrant`,children:`Qdrant (Hybrid Dense + BM25)`}),(0,b.jsx)(`option`,{value:`chroma`,children:`ChromaDB (Dense Vectors)`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-mode`,children:`Operating Mode`}),(0,b.jsxs)(`select`,{id:`vs-mode`,value:i,onChange:e=>m(e.target.value),children:[(0,b.jsx)(`option`,{value:`embedded`,children:`Embedded Disk Storage`}),(0,b.jsx)(`option`,{value:`remote`,children:`Remote Server URL`})]})]})]}),i===`embedded`?(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-storage-path`,children:`Storage Directory Path`}),(0,b.jsx)(`input`,{id:`vs-storage-path`,type:`text`,value:a,onChange:e=>o(e.target.value),placeholder:r===`chroma`?`data/chroma_db`:`data/qdrant_db`})]}):(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-url`,children:`Remote Server URL`}),(0,b.jsx)(`input`,{id:`vs-url`,type:`text`,value:s,onChange:e=>c(e.target.value),placeholder:r===`chroma`?`http://localhost:8000`:`http://localhost:6333`})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`vs-collection`,children:`Collection Name`}),(0,b.jsx)(`input`,{id:`vs-collection`,type:`text`,value:l,onChange:e=>u(e.target.value),placeholder:`knowledge_rag_v1`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`10px`,marginTop:`16px`,flexWrap:`wrap`},children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:h,disabled:d||f,children:d?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Testing Connection...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-plug`}),` Test Connection`]})}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-primary`,onClick:g,disabled:d||f,children:f?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Switching Backend...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Save & Switch Backend`]})})]})]})]})]})]})}function M({embeddingConfig:e,isLoadingEmb:t,isSavingEmb:n,embProvider:r,setEmbProvider:i,embThreads:a,setEmbThreads:o,embBatchSize:s,setEmbBatchSize:c,embDenseModel:l,setEmbDenseModel:u,embSparseModel:d,setEmbSparseModel:f,embLitellmUrl:p,setEmbLitellmUrl:m,embLitellmApiKey:h=``,setEmbLitellmApiKey:g,embVisionOcrModel:v=`gemini-2.5-flash`,setEmbVisionOcrModel:y,embChatModel:x=`gemini-2.5-flash`,setEmbChatModel:S,discoveryResult:C=null,isDiscovering:w=!1,onDiscoverModels:T,onSaveEmbeddingSettings:E}){let D=e?.system_cpus||2,O=e?.system_memory_gb||4,[k,ee]=(0,_.useState)(!1),[A,te]=(0,_.useState)(!1),[ne,re]=(0,_.useState)(!1),j=C?.embedding_models||[],M=C?.vision_models||[],N=C?.chat_models||[];return(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-microchip`}),` Embedding Engine & Resource Limits`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Configure local FastEmbed (ONNX) resource limits, CPU thread concurrency, or remote LiteLLM endpoints with dynamic model discovery for embeddings, Vision AI OCR, and chat synthesis.`}),(0,b.jsxs)(`div`,{className:`vs-config-layout`,children:[(0,b.jsxs)(`div`,{className:`vs-box`,children:[(0,b.jsxs)(`h3`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-gauge-high`}),` Active Embedding Engine`]}),t&&!e?(0,b.jsx)(`p`,{className:`text-muted`,children:`Loading embedding configuration...`}):e?(0,b.jsxs)(`div`,{className:`specs-list`,style:{marginTop:0},children:[(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Execution Provider:`}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.provider===`api`?`Remote API (LiteLLM)`:`Local FastEmbed (ONNX)`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`CPU Threads Allocation:`}),(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[e.threads,` `,e.threads===1?`Core`:`Cores`,` (of `,D,` detected)`]})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Batch Processing Size:`}),(0,b.jsxs)(`span`,{style:{fontSize:`0.9rem`,fontWeight:600},children:[e.batch_size,` chunks/batch`]})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`System RAM Capacity:`}),(0,b.jsxs)(`span`,{style:{fontSize:`0.9rem`,fontWeight:600},children:[O,` GB`]})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Dense Model:`}),(0,b.jsx)(`code`,{children:e.dense_model||`BAAI/bge-small-en-v1.5`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Sparse Model (BM25):`}),(0,b.jsx)(`code`,{children:e.sparse_model||`Qdrant/bm25`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Vision AI OCR Model:`}),(0,b.jsx)(`code`,{children:e.vision_ocr_model||`gemini-2.5-flash`})]}),(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`Chat Completion Model:`}),(0,b.jsx)(`code`,{children:e.chat_model||`gemini-2.5-flash`})]}),e.provider===`api`&&(0,b.jsxs)(`div`,{className:`spec-row`,children:[(0,b.jsx)(`span`,{children:`API Endpoint URL:`}),(0,b.jsx)(`code`,{children:e.litellm_url||`http://litellm:4000/v1`})]})]}):(0,b.jsx)(`p`,{className:`text-muted`,children:`No embedding configuration found.`})]}),(0,b.jsxs)(`div`,{className:`vs-box`,children:[(0,b.jsxs)(`h3`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-sliders`}),` Configure Models & Resources`]}),(0,b.jsxs)(`form`,{onSubmit:E,children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-provider`,children:`Embedding Provider`}),(0,b.jsxs)(`select`,{id:`emb-provider`,value:r,onChange:e=>i(e.target.value),children:[(0,b.jsx)(`option`,{value:`local`,children:`Local Model (FastEmbed / ONNX Runtime)`}),(0,b.jsx)(`option`,{value:`api`,children:`API Endpoint (LiteLLM / OpenAI Compatible)`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-threads`,children:`CPU Thread Cap`}),(0,b.jsx)(`input`,{id:`emb-threads`,type:`number`,min:`1`,max:Math.max(D,128),value:a,onChange:e=>o(Math.max(1,parseInt(e.target.value)||1)),placeholder:`2`}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`2px`,display:`block`},children:`Recommended: 2 cores. Prevents container CPU spikes.`})]})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-batch-size`,children:`Embedding Batch Size`}),(0,b.jsxs)(`select`,{id:`emb-batch-size`,value:s,onChange:e=>c(parseInt(e.target.value)||32),children:[(0,b.jsx)(`option`,{value:`16`,children:`16 chunks (Lowest RAM footprint)`}),(0,b.jsx)(`option`,{value:`32`,children:`32 chunks (Balanced Default)`}),(0,b.jsx)(`option`,{value:`64`,children:`64 chunks (High throughput)`}),(0,b.jsx)(`option`,{value:`128`,children:`128 chunks (Large RAM environments)`}),(0,b.jsx)(`option`,{value:`256`,children:`256 chunks (FastEmbed default)`})]})]}),r===`api`?(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-litellm-url`,children:`API Endpoint URL (LiteLLM)`}),(0,b.jsx)(`input`,{id:`emb-litellm-url`,type:`text`,value:p,onChange:e=>m(e.target.value),placeholder:`http://litellm:4000/v1`})]}):(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-dense-model`,children:`Dense Model Name`}),(0,b.jsx)(`input`,{id:`emb-dense-model`,type:`text`,value:l,onChange:e=>u(e.target.value),placeholder:`BAAI/bge-small-en-v1.5`})]})]}),r===`api`&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-litellm-api-key`,children:`LiteLLM API Key (Optional / Bearer)`}),(0,b.jsx)(`input`,{id:`emb-litellm-api-key`,type:`password`,value:h,onChange:e=>g?.(e.target.value),placeholder:`sk-...`,autoComplete:`off`})]}),(0,b.jsx)(`div`,{className:`form-group`,style:{display:`flex`,flexDirection:`column`,justifyContent:`flex-end`},children:(0,b.jsx)(`button`,{type:`button`,id:`btn-discover-models`,className:`btn btn-secondary`,onClick:T,disabled:w,style:{height:`38px`,whiteSpace:`nowrap`},children:w?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Discovering...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-bolt`}),` Discover Models`]})})})]}),C&&(0,b.jsx)(`div`,{style:{marginBottom:`16px`},children:C.status===`success`?(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,padding:`8px 12px`,background:`rgba(16, 185, 129, 0.1)`,border:`1px solid rgba(16, 185, 129, 0.3)`,borderRadius:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-check`,style:{color:`#10b981`}}),(0,b.jsxs)(`span`,{children:[`Connected to LiteLLM — `,(0,b.jsxs)(`strong`,{children:[C.total_models,` models available`]}),` (`,j.length,` embedding, `,M.length,` vision, `,N.length,` chat)`]})]}):(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,padding:`8px 12px`,background:`rgba(239, 68, 68, 0.1)`,border:`1px solid rgba(239, 68, 68, 0.3)`,borderRadius:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`,style:{color:`#ef4444`}}),(0,b.jsx)(`span`,{children:C.message||`Could not connect to LiteLLM endpoint`})]})}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:`4px`},children:[(0,b.jsx)(`label`,{htmlFor:`emb-dense-model`,style:{marginBottom:0},children:`Dense Embedding Model`}),j.length>0&&(0,b.jsx)(`button`,{type:`button`,className:`btn-link`,onClick:()=>ee(!k),style:{fontSize:`0.75rem`,background:`none`,border:`none`,color:`#38bdf8`,cursor:`pointer`,padding:0},children:k?`← Select from discovered`:`Enter custom model →`})]}),!k&&j.length>0?(0,b.jsxs)(`select`,{id:`emb-dense-model`,value:l,onChange:e=>{e.target.value===`__custom__`?ee(!0):u(e.target.value)},children:[j.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e)),(0,b.jsx)(`option`,{value:`__custom__`,children:`Custom / Enter manually...`})]}):(0,b.jsx)(`input`,{id:`emb-dense-model`,type:`text`,value:l,onChange:e=>u(e.target.value),placeholder:`gemini-embedding-2`})]})]}),r===`local`&&(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`emb-sparse-model`,children:`Sparse BM25 Model`}),(0,b.jsx)(`input`,{id:`emb-sparse-model`,type:`text`,value:d,onChange:e=>f(e.target.value),placeholder:`Qdrant/bm25`})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:`4px`},children:[(0,b.jsxs)(`label`,{htmlFor:`emb-vision-ocr-model`,style:{marginBottom:0},children:[`Vision AI OCR Model `,(0,b.jsx)(`span`,{className:`text-muted`,style:{fontWeight:400,fontSize:`0.8rem`},children:`(PDF Ingestion Fallback)`})]}),M.length>0&&(0,b.jsx)(`button`,{type:`button`,className:`btn-link`,onClick:()=>te(!A),style:{fontSize:`0.75rem`,background:`none`,border:`none`,color:`#38bdf8`,cursor:`pointer`,padding:0},children:A?`← Select from discovered`:`Enter custom model →`})]}),!A&&M.length>0?(0,b.jsxs)(`select`,{id:`emb-vision-ocr-model`,value:v,onChange:e=>{e.target.value===`__custom__`?te(!0):y?.(e.target.value)},children:[M.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e)),(0,b.jsx)(`option`,{value:`__custom__`,children:`Custom / Enter manually...`})]}):(0,b.jsx)(`input`,{id:`emb-vision-ocr-model`,type:`text`,value:v,onChange:e=>y?.(e.target.value),placeholder:`gemini-2.5-flash`})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,marginBottom:`4px`},children:[(0,b.jsx)(`label`,{htmlFor:`emb-chat-model`,style:{marginBottom:0},children:`General Chat & Synthesis Model`}),N.length>0&&(0,b.jsx)(`button`,{type:`button`,className:`btn-link`,onClick:()=>re(!ne),style:{fontSize:`0.75rem`,background:`none`,border:`none`,color:`#38bdf8`,cursor:`pointer`,padding:0},children:ne?`← Select from discovered`:`Enter custom model →`})]}),!ne&&N.length>0?(0,b.jsxs)(`select`,{id:`emb-chat-model`,value:x,onChange:e=>{e.target.value===`__custom__`?re(!0):S?.(e.target.value)},children:[N.map(e=>(0,b.jsx)(`option`,{value:e,children:e},e)),(0,b.jsx)(`option`,{value:`__custom__`,children:`Custom / Enter manually...`})]}):(0,b.jsx)(`input`,{id:`emb-chat-model`,type:`text`,value:x,onChange:e=>S?.(e.target.value),placeholder:`gemini-2.5-flash`})]}),(0,b.jsx)(`div`,{style:{display:`flex`,gap:`10px`,marginTop:`16px`},children:(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:n||t,children:n?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Saving & Applying...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-floppy-disk`}),` Save & Apply Embedding Limits & Model Settings`]})})})]})]})]})]})}function N({isLoadingAutoSync:e,intervalMins:t,setIntervalMins:n,hasGlobalSecret:r,showWebhookSecret:i,setShowWebhookSecret:a,webhookSecret:o,setWebhookSecret:s,fullWebhookUrl:c,copiedWebhookUrl:l,isSavingAutoSync:u,onSaveAutoSync:d,onClearWebhookSecret:f,onCopyWebhookUrl:p}){return(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate`}),` Auto-Sync & Webhooks`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Configure scheduled background repository polling interval and global incoming webhook triggers.`}),e&&!t?(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`12px`},children:`Loading auto-sync settings...`}):(0,b.jsxs)(`form`,{onSubmit:d,style:{marginTop:`16px`},children:[(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:1},children:[(0,b.jsx)(`label`,{htmlFor:`auto-sync-interval`,children:`Repository Polling Interval`}),(0,b.jsxs)(`select`,{id:`auto-sync-interval`,value:t,onChange:e=>n(Number(e.target.value)),style:{width:`100%`},children:[(0,b.jsx)(`option`,{value:0,children:`Disabled (0m)`}),(0,b.jsx)(`option`,{value:5,children:`5 minutes`}),(0,b.jsx)(`option`,{value:15,children:`15 minutes (Default)`}),(0,b.jsx)(`option`,{value:30,children:`30 minutes`}),(0,b.jsx)(`option`,{value:60,children:`1 hour`}),(0,b.jsx)(`option`,{value:360,children:`6 hours`}),![0,5,15,30,60,360].includes(t)&&(0,b.jsxs)(`option`,{value:t,children:[t,` minutes (Custom)`]})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:1},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:`6px`},children:[(0,b.jsx)(`label`,{htmlFor:`auto-sync-secret`,style:{marginBottom:0},children:`Global Webhook Secret (HMAC / Token)`}),r?(0,b.jsx)(`span`,{className:`badge badge-accent`,children:`Secret Active`}):(0,b.jsx)(`span`,{className:`badge badge-secondary`,style:{color:`var(--text-muted)`},children:`None`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`input`,{id:`auto-sync-secret`,type:i?`text`:`password`,value:o,onChange:e=>s(e.target.value),placeholder:r?`Secret configured (enter new to change)`:`Enter webhook secret (optional)`,style:{flex:1}}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>a(!i),title:i?`Hide secret`:`Reveal secret`,"aria-label":i?`Hide secret`:`Reveal secret`,style:{minWidth:`42px`,padding:`0 12px`},children:(0,b.jsx)(`i`,{className:`fa-solid ${i?`fa-eye-slash`:`fa-eye`}`})}),(r||o)&&(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:f,title:`Clear secret`,"aria-label":`Clear secret`,disabled:u,style:{padding:`0 12px`},children:`Clear`})]})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{marginTop:`14px`,minWidth:0,width:`100%`},children:[(0,b.jsx)(`label`,{htmlFor:`auto-sync-webhook-url`,children:`Incoming Webhook Payload URL`}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,minWidth:0,width:`100%`},children:[(0,b.jsx)(`input`,{id:`auto-sync-webhook-url`,type:`text`,readOnly:!0,value:c,style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`,flex:1,minWidth:0,width:`100%`},"aria-label":`Webhook Payload URL`}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:p,style:{minWidth:`95px`},"aria-label":`Copy Webhook URL`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${l?`fa-check`:`fa-copy`}`}),` `,l?`Copied!`:`Copy`]})]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{fontSize:`0.8rem`,marginTop:`6px`},children:`Payload URL for repository push webhooks. Webhooks trigger immediate background synchronization for registered repositories.`})]}),(0,b.jsx)(`div`,{style:{display:`flex`,gap:`10px`,marginTop:`18px`},children:(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:u,children:u?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Saving...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-floppy-disk`}),` Save Auto-Sync Settings`]})})})]})]})}function P({stats:e,ghAuth:t,glAuth:n,gtAuth:r,ghToken:i,setGhToken:a,glToken:o,setGlToken:s,gtToken:c,setGtToken:l,hostCredentials:u,isHostModalOpen:d,setIsHostModalOpen:f,newHost:p,setNewHost:m,newHostProvider:h,setNewHostProvider:g,newHostUser:_,setNewHostUser:v,newHostToken:y,setNewHostToken:x,isSavingHost:S,onSaveToken:C,onClearToken:w,onSaveHostCredential:T,onDeleteHostCredential:E}){return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-key`}),` Global Git Provider Authentication`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Default tokens are automatically applied to repositories matching these providers when no per-repo or host-specific override exists.`}),(0,b.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(min(100%, 300px), 1fr))`,gap:`20px`,marginTop:`20px`},children:[(0,b.jsxs)(`div`,{className:`settings-provider-box`,style:{background:`rgba(255,255,255,0.02)`,padding:`16px`,borderRadius:`10px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,fontWeight:600},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github fa-lg`}),` GitHub`]}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:t.token_source})]}),(0,b.jsxs)(`div`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`,marginBottom:`8px`,wordBreak:`break-all`},children:[`Active Token: `,(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:t.masked_token})]}),e?.rate_limit&&(0,b.jsxs)(`div`,{style:{fontSize:`0.78rem`,color:`var(--text-muted)`,marginBottom:`12px`},children:[`Rate Limit: `,e.rate_limit.remaining,` / `,e.rate_limit.limit,` requests`]}),(0,b.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),C(`github_token`,i,`GitHub`)},children:[(0,b.jsx)(`div`,{className:`form-group`,style:{marginBottom:`10px`},children:(0,b.jsx)(`input`,{type:`password`,placeholder:`ghp_xxxxxxxxxxxx`,value:i,onChange:e=>a(e.target.value)})}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},children:`Save`}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},onClick:()=>w(`github_token`,`GitHub`),children:`Clear`})]})]})]}),(0,b.jsxs)(`div`,{className:`settings-provider-box`,style:{background:`rgba(255,255,255,0.02)`,padding:`16px`,borderRadius:`10px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,fontWeight:600},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-gitlab fa-lg`,style:{color:`#fc6d26`}}),` GitLab (Global)`]}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:n.token_source})]}),(0,b.jsxs)(`div`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`,marginBottom:`16px`,wordBreak:`break-all`},children:[`Active Token: `,(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:n.masked_token})]}),(0,b.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),C(`gitlab_token`,o,`GitLab`)},children:[(0,b.jsx)(`div`,{className:`form-group`,style:{marginBottom:`10px`},children:(0,b.jsx)(`input`,{type:`password`,placeholder:`glpat-xxxxxxxxxxxx`,value:o,onChange:e=>s(e.target.value)})}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},children:`Save`}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},onClick:()=>w(`gitlab_token`,`GitLab`),children:`Clear`})]})]})]}),(0,b.jsxs)(`div`,{className:`settings-provider-box`,style:{background:`rgba(255,255,255,0.02)`,padding:`16px`,borderRadius:`10px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,fontWeight:600},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-mug-hot fa-lg`,style:{color:`#609926`}}),` Gitea / Forgejo`]}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:r.token_source})]}),(0,b.jsxs)(`div`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`,marginBottom:`16px`,wordBreak:`break-all`},children:[`Active Token: `,(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:r.masked_token})]}),(0,b.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),C(`gitea_token`,c,`Gitea`)},children:[(0,b.jsx)(`div`,{className:`form-group`,style:{marginBottom:`10px`},children:(0,b.jsx)(`input`,{type:`password`,placeholder:`Token / Personal Token`,value:c,onChange:e=>l(e.target.value)})}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`},children:[(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},children:`Save`}),(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`4px 10px`,fontSize:`0.8rem`},onClick:()=>w(`gitea_token`,`Gitea`),children:`Clear`})]})]})]})]})]}),(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-shield-halved`}),` Custom & Self-Hosted Git Host Vault`]}),(0,b.jsxs)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:[`Define credentials for self-hosted GitLab Enterprise, Gitea, or custom servers (e.g. `,(0,b.jsx)(`code`,{children:`gitlab.mycorp.com`}),` or `,(0,b.jsx)(`code`,{children:`git.lan:3000`}),`).`]})]}),(0,b.jsxs)(`button`,{className:`btn btn-primary`,onClick:()=>f(!0),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-plus`}),` Add Host Credential`]})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,style:{marginTop:`16px`},children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Host Domain / Address`}),(0,b.jsx)(`th`,{children:`Provider Type`}),(0,b.jsx)(`th`,{children:`Auth User`}),(0,b.jsx)(`th`,{children:`Masked Token`}),(0,b.jsx)(`th`,{children:`Added At`}),(0,b.jsx)(`th`,{children:`Actions`})]})}),(0,b.jsx)(`tbody`,{children:u.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:6,className:`empty-state`,children:`No custom host credentials configured. Add a host domain to authenticate self-hosted instances.`})}):u.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.host})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.provider.toUpperCase()})}),(0,b.jsx)(`td`,{children:e.auth_user?(0,b.jsx)(`code`,{children:e.auth_user}):(0,b.jsx)(`span`,{className:`text-muted`,children:`Default`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.masked_token})}),(0,b.jsx)(`td`,{style:{fontSize:`0.8rem`,color:`var(--text-muted)`},children:e.added_at}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`button`,{className:`btn-icon btn-delete`,onClick:()=>E(e.id,e.host),title:`Delete Credential`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`})})})]},e.id))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:u.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No custom host credentials configured. Add a host domain to authenticate self-hosted instances.`}):u.map(e=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsx)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`},children:(0,b.jsx)(`code`,{style:{fontSize:`0.95rem`},children:e.host})}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.provider.toUpperCase()})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Auth User: `}),e.auth_user?(0,b.jsx)(`code`,{children:e.auth_user}):(0,b.jsx)(`span`,{className:`text-muted`,children:`Default`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Masked Token: `}),(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.masked_token})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Added At: `}),(0,b.jsx)(`span`,{style:{color:`var(--text-muted)`},children:e.added_at})]})]}),(0,b.jsx)(`div`,{className:`data-mobile-card-actions`,children:(0,b.jsxs)(`button`,{className:`btn btn-secondary btn-delete`,onClick:()=>E(e.id,e.host),title:`Delete Credential`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Delete`]})})]},`card-${e.id}`))})]}),d&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-shield-halved`}),` Add Host Credential`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>f(!1),children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:T,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`host-domain`,children:`Host Domain / IP`}),(0,b.jsx)(`input`,{type:`text`,id:`host-domain`,required:!0,placeholder:`e.g. gitlab.mycorp.internal or git.lan:3000`,value:p,onChange:e=>m(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`host-provider`,children:`Provider Type`}),(0,b.jsxs)(`select`,{id:`host-provider`,value:h,onChange:e=>g(e.target.value),children:[(0,b.jsx)(`option`,{value:`gitlab`,children:`GitLab Enterprise / Self-Hosted`}),(0,b.jsx)(`option`,{value:`gitea`,children:`Gitea / Forgejo`}),(0,b.jsx)(`option`,{value:`github`,children:`GitHub Enterprise`}),(0,b.jsx)(`option`,{value:`bitbucket`,children:`Bitbucket Server / Cloud`}),(0,b.jsx)(`option`,{value:`generic`,children:`Generic Git (HTTP / HTTPS)`})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`host-user`,children:`Auth User (Optional)`}),(0,b.jsx)(`input`,{type:`text`,id:`host-user`,placeholder:`e.g. oauth2 or gitlab-ci-token`,value:_,onChange:e=>v(e.target.value)})]})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`host-token`,children:`Personal Access Token / Password`}),(0,b.jsx)(`input`,{type:`password`,id:`host-token`,required:!0,placeholder:`Token or password`,value:y,onChange:e=>x(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>f(!1),children:`Cancel`}),(0,b.jsx)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:S,children:S?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Saving...`]}):`Save Host Credential`})]})]})]})})]})}var ie=`contextcortex_theme`,ae=`deep-ocean`,oe=[{id:`deep-ocean`,name:`Deep Ocean`,mode:`dark`,description:`Monochromatic petrol slate with vibrant cyan and mint accents.`,swatches:[`#07181b`,`#0d2c2f`,`#0891b2`,`#2dd4bf`]},{id:`midnight-blue`,name:`Midnight Blue`,mode:`dark`,description:`Classic deep space navy with cobalt blue and teal highlights.`,swatches:[`#0a0f1d`,`#121a2f`,`#3b82f6`,`#14b8a6`]},{id:`lavender-haze`,name:`Lavender Haze`,mode:`light`,description:`Elegant soft violet canvas with vibrant purple, fuchsia accents, and plum text.`,swatches:[`#f5f3ff`,`#faf8ff`,`#7c3aed`,`#ec4899`]},{id:`amber-warmth`,name:`Amber Warmth`,mode:`light`,description:`Warm sandstone canvas with terracotta orange, amber accents, and espresso text.`,swatches:[`#fdf8f4`,`#ffffff`,`#ea580c`,`#d97706`]}];function F(){if(typeof window>`u`)return ae;try{let e=localStorage.getItem(ie);if(e===`arctic-frost`||e===`aqua-breeze`)return`lavender-haze`;if(e===`solar-daybreak`||e===`azure-daylight`)return`amber-warmth`;if(e&&oe.some(t=>t.id===e))return e}catch{}return ae}function I(e){if(!(typeof document>`u`)){document.documentElement.setAttribute(`data-theme`,e);try{localStorage.setItem(ie,e)}catch{}}}function se(){let[e,t]=(0,_.useState)(`deep-ocean`),n=S();(0,_.useEffect)(()=>{t(F())},[]);let r=(e,r)=>{I(e),t(e),n.success(`Switched theme to ${r}`)};return(0,b.jsxs)(`section`,{className:`settings-section glass-card`,"aria-labelledby":`theme-settings-heading`,children:[(0,b.jsxs)(`div`,{className:`section-header`,children:[(0,b.jsx)(`div`,{className:`header-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-palette`})}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`h2`,{id:`theme-settings-heading`,style:{fontSize:`1.1rem`,fontWeight:600},children:`Appearance & Theme`}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Choose your preferred color scheme. The selected theme will persist across browser sessions.`})]})]}),(0,b.jsx)(`div`,{className:`theme-options-grid`,role:`radiogroup`,"aria-label":`Appearance Themes`,children:oe.map(t=>{let n=e===t.id;return(0,b.jsxs)(`button`,{type:`button`,className:`theme-card ${n?`active`:``}`,onClick:()=>r(t.id,t.name),role:`radio`,"aria-checked":n,"aria-label":`Select ${t.name} theme`,children:[(0,b.jsxs)(`div`,{className:`theme-card-header`,children:[(0,b.jsxs)(`div`,{className:`theme-card-title`,children:[(0,b.jsx)(`span`,{children:t.name}),(0,b.jsxs)(`span`,{className:`badge`,style:{fontSize:`0.68rem`,fontWeight:500,opacity:.85,padding:`2px 6px`},children:[(0,b.jsx)(`i`,{className:`fa-solid ${t.mode===`dark`?`fa-moon`:`fa-sun`}`,style:{marginRight:`3px`}}),t.mode===`dark`?`Dark`:`Light`]})]}),n?(0,b.jsxs)(`span`,{className:`badge badge-accent`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-check`,style:{marginRight:`4px`}}),` Active`]}):(0,b.jsx)(`span`,{className:`badge badge-primary`,children:`Select`})]}),(0,b.jsx)(`div`,{className:`theme-card-desc`,children:t.description}),(0,b.jsx)(`div`,{className:`theme-swatches`,"aria-hidden":`true`,children:t.swatches.map((e,t)=>(0,b.jsx)(`span`,{className:`theme-swatch`,style:{backgroundColor:e},title:e},t))})]},t.id)})})]})}function ce(){let[e,t]=(0,_.useState)({summary_enabled:!0,summary_threshold_kb:500,summary_max_file_size_mb:10,read_file_max_lines:2e3,summary_chat_model:`gemini-2.5-flash`}),[n,r]=(0,_.useState)(!1),[i,a]=(0,_.useState)(!1),o=S(),s=async()=>{r(!0);try{let e=await fetch(`/admin/api/settings/files`);if(e.ok){let n=await e.json();t({summary_enabled:n.summary_enabled!==!1,summary_threshold_kb:n.summary_threshold_kb??500,summary_max_file_size_mb:n.summary_max_file_size_mb??10,read_file_max_lines:n.read_file_max_lines??2e3,summary_chat_model:n.summary_chat_model||`gemini-2.5-flash`})}}catch(e){console.error(`Failed to load file settings:`,e)}finally{r(!1)}};return(0,_.useEffect)(()=>{s()},[]),(0,b.jsxs)(`section`,{className:`settings-section glass-card`,"aria-labelledby":`file-settings-heading`,children:[(0,b.jsxs)(`div`,{className:`section-header`,children:[(0,b.jsx)(`div`,{className:`header-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-file-lines`})}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`h2`,{id:`file-settings-heading`,style:{fontSize:`1.1rem`,fontWeight:600},children:`Files & Large File Summarization`}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Configure retrieval ceilings for AI agents and automatic LLM summarization thresholds for large files in watched folders and uploads.`})]})]}),n?(0,b.jsxs)(`div`,{style:{padding:`24px`,textAlign:`center`},className:`text-muted`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`8px`}}),` Loading settings...`]}):(0,b.jsx)(`form`,{onSubmit:async n=>{n.preventDefault(),a(!0);try{let n=await fetch(`/admin/api/settings/files`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)});if(n.ok){let e=await n.json();t(e),o.success(`File and summarization settings updated successfully`)}else{let e=await n.json();o.error(e.error||`Failed to save settings`)}}catch(e){o.error(`Save failed: ${e.message}`)}finally{a(!1)}},style:{marginTop:`16px`},children:(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`16px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,padding:`12px 16px`,background:`rgba(255,255,255,0.03)`,borderRadius:`8px`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`summary-enabled-toggle`,style:{fontWeight:600,display:`block`,cursor:`pointer`},children:`Enable Large File Summarization`}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.8rem`},children:`Automatically generate and vector-embed an executive summary when files exceed the size threshold instead of skipping them.`})]}),(0,b.jsx)(`input`,{id:`summary-enabled-toggle`,type:`checkbox`,checked:e.summary_enabled,onChange:n=>t({...e,summary_enabled:n.target.checked}),style:{width:`18px`,height:`18px`,cursor:`pointer`},"aria-label":`Enable Large File Summarization`})]}),(0,b.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(220px, 1fr))`,gap:`16px`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`summary-threshold-input`,style:{fontSize:`0.85rem`,fontWeight:500,display:`block`,marginBottom:`6px`},children:`Auto-Summarize Threshold (KB)`}),(0,b.jsx)(`input`,{id:`summary-threshold-input`,type:`number`,min:`10`,max:`50000`,value:e.summary_threshold_kb,onChange:n=>t({...e,summary_threshold_kb:Number(n.target.value)}),className:`input-field`,style:{width:`100%`},disabled:!e.summary_enabled}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`4px`,display:`block`},children:`Files larger than this (default: 500 KB) trigger LLM summarization.`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`summary-max-size-input`,style:{fontSize:`0.85rem`,fontWeight:500,display:`block`,marginBottom:`6px`},children:`Max File Size for Summarization (MB)`}),(0,b.jsx)(`input`,{id:`summary-max-size-input`,type:`number`,min:`1`,max:`100`,value:e.summary_max_file_size_mb,onChange:n=>t({...e,summary_max_file_size_mb:Number(n.target.value)}),className:`input-field`,style:{width:`100%`},disabled:!e.summary_enabled}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`4px`,display:`block`},children:`Files larger than this ceiling (default: 10 MB) are skipped to protect memory.`})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`read-file-max-lines-input`,style:{fontSize:`0.85rem`,fontWeight:500,display:`block`,marginBottom:`6px`},children:`Max Lines Per Read`}),(0,b.jsx)(`input`,{id:`read-file-max-lines-input`,type:`number`,min:`50`,max:`20000`,value:e.read_file_max_lines,onChange:n=>t({...e,read_file_max_lines:Number(n.target.value)}),className:`input-field`,style:{width:`100%`}}),(0,b.jsxs)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`4px`,display:`block`},children:[`Default line ceiling for `,(0,b.jsx)(`code`,{children:`read_file`}),` tool calls (default: 2000 lines).`]})]})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`label`,{htmlFor:`summary-chat-model-input`,style:{fontSize:`0.85rem`,fontWeight:500,display:`block`,marginBottom:`6px`},children:`Summarization Chat Model`}),(0,b.jsx)(`input`,{id:`summary-chat-model-input`,type:`text`,value:e.summary_chat_model,onChange:n=>t({...e,summary_chat_model:n.target.value}),placeholder:`e.g. gemini-2.5-flash or gpt-4o-mini`,className:`input-field`,style:{width:`100%`},disabled:!e.summary_enabled}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`,marginTop:`4px`,display:`block`},children:`LiteLLM chat model identifier used for generating file summaries.`})]}),(0,b.jsx)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,marginTop:`8px`},children:(0,b.jsx)(`button`,{type:`submit`,disabled:i,className:`btn btn-primary`,style:{display:`flex`,alignItems:`center`,gap:`8px`},children:i?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Saving...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-floppy-disk`}),` Save File Settings`]})})})]})})]})}function le({stats:e,refreshStats:t}){let[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)([]),[u,d]=(0,_.useState)(15),[f,p]=(0,_.useState)(``),[m,h]=(0,_.useState)(!1),[g,v]=(0,_.useState)(`/api/webhooks/git`),[y,x]=(0,_.useState)(!1),[C,w]=(0,_.useState)(!1),[T,E]=(0,_.useState)(!1),[D,O]=(0,_.useState)(!1),[k,ee]=(0,_.useState)(!1),[A,te]=(0,_.useState)(``),[ne,re]=(0,_.useState)(`gitlab`),[ie,ae]=(0,_.useState)(``),[oe,F]=(0,_.useState)(``),[I,le]=(0,_.useState)(!1),[ue,de]=(0,_.useState)(null),[fe,pe]=(0,_.useState)(!1),[me,he]=(0,_.useState)(`qdrant`),[ge,_e]=(0,_.useState)(`embedded`),[ve,ye]=(0,_.useState)(`data/qdrant_db`),[be,xe]=(0,_.useState)(`http://localhost:6333`),[Se,Ce]=(0,_.useState)(`knowledge_rag_v1`),[we,Te]=(0,_.useState)(!1),[Ee,De]=(0,_.useState)(null),[Oe,ke]=(0,_.useState)(!1),[Ae,je]=(0,_.useState)(null),[Me,Ne]=(0,_.useState)(!1),[Pe,Fe]=(0,_.useState)(!1),[Ie,Le]=(0,_.useState)(`local`),[Re,ze]=(0,_.useState)(2),[Be,Ve]=(0,_.useState)(32),[He,Ue]=(0,_.useState)(`BAAI/bge-small-en-v1.5`),[We,Ge]=(0,_.useState)(`Qdrant/bm25`),[Ke,qe]=(0,_.useState)(`http://litellm:4000/v1`),[Je,Ye]=(0,_.useState)(``),[Xe,Ze]=(0,_.useState)(`gemini-2.5-flash`),[Qe,$e]=(0,_.useState)(`gemini-2.5-flash`),[et,tt]=(0,_.useState)(null),[nt,rt]=(0,_.useState)(!1),L=S(),it=(0,_.useCallback)(async()=>{try{let e=await fetch(`/admin/api/settings/hosts`);if(e.ok){let t=await e.json();l(Array.isArray(t)?t:[])}}catch(e){console.error(`Failed to load host credentials:`,e),l([])}},[]),at=(0,_.useCallback)(async()=>{pe(!0);try{let e=await fetch(`/admin/api/vector-store`);if(e.ok){let t=await e.json();de(t),t.provider&&he(t.provider),t.mode&&_e(t.mode),t.storage_path&&ye(t.storage_path),t.url&&xe(t.url),t.collection&&Ce(t.collection)}}catch(e){console.error(`Failed to load vector store config:`,e)}finally{pe(!1)}},[]),ot=(0,_.useCallback)(async()=>{x(!0);try{let e=await fetch(`/admin/api/settings/auto-sync`);if(e.ok){let t=await e.json();typeof t.interval_mins==`number`&&d(t.interval_mins),typeof t.webhook_url==`string`&&v(t.webhook_url),typeof t.has_global_secret==`boolean`&&h(t.has_global_secret)}}catch(e){console.error(`Failed to load auto-sync settings:`,e)}finally{x(!1)}},[]),st=(0,_.useCallback)(async()=>{Ne(!0);try{let e=await fetch(`/admin/api/settings/embedding`);if(e.ok){let t=await e.json();je(t),t.provider&&Le(t.provider),typeof t.threads==`number`&&ze(t.threads),typeof t.batch_size==`number`&&Ve(t.batch_size),t.dense_model&&Ue(t.dense_model),t.sparse_model&&Ge(t.sparse_model),t.litellm_url&&qe(t.litellm_url),t.litellm_api_key&&Ye(t.litellm_api_key),t.vision_ocr_model&&Ze(t.vision_ocr_model),t.chat_model&&$e(t.chat_model)}}catch(e){console.error(`Failed to load embedding config:`,e)}finally{Ne(!1)}},[]);(0,_.useEffect)(()=>{it(),at(),ot(),st()},[it,at,ot,st]),(0,_.useEffect)(()=>{e?.vector_store?(de(e.vector_store),e.vector_store.provider&&he(e.vector_store.provider),e.vector_store.mode&&_e(e.vector_store.mode),e.vector_store.storage_path&&ye(e.vector_store.storage_path),e.vector_store.url&&xe(e.vector_store.url),e.vector_store.collection&&Ce(e.vector_store.collection)):e?.vector_store_provider&&de(t=>t?{...t,provider:e.vector_store_provider||t.provider,mode:e.vector_store_mode||t.mode,collection:e.vector_store_collection||t.collection,points_count:e.points_count??t.points_count,healthy:e.vector_db_status?e.vector_db_status===`Healthy`:t.healthy}:null)},[e]);let ct=async()=>{rt(!0);try{let e=new URLSearchParams;Ke&&e.set(`url`,Ke.trim()),Je&&e.set(`api_key`,Je.trim());let t=await(await fetch(`/admin/api/models/discover?${e.toString()}`)).json();tt(t),t.status===`success`?L.success(`Discovered ${t.total_models} models from LiteLLM`):L.error(t.message||`Failed to discover models from LiteLLM`)}catch(e){tt({status:`error`,total_models:0,models:[],embedding_models:[],vision_models:[],chat_models:[],message:e.message||`Network error discovering models`}),L.error(`Error discovering models: ${e.message}`)}finally{rt(!1)}},lt=async e=>{e.preventDefault(),Fe(!0);try{let e={provider:Ie,threads:Number(Re),batch_size:Number(Be),dense_model:He.trim()||void 0,sparse_model:We.trim()||void 0,litellm_url:Ie===`api`&&Ke.trim()||void 0,litellm_api_key:Ie===`api`&&Je.trim()||void 0,vision_ocr_model:Xe.trim()||void 0,chat_model:Qe.trim()||void 0},n=await fetch(`/admin/api/settings/embedding`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),r=await n.json();if(!n.ok)throw Error(r.error||r.message||`Failed to save embedding settings`);r.config&&je(r.config),L.success(`Embedding resource limits updated successfully`),t()}catch(e){L.error(`Error saving embedding settings: `+e.message)}finally{Fe(!1)}},ut=`${typeof window<`u`?window.location.origin:``}${g||`/api/webhooks/git`}`,dt=async()=>{try{navigator?.clipboard?.writeText&&await navigator.clipboard.writeText(ut),O(!0),L.info(`Webhook URL copied to clipboard`),setTimeout(()=>O(!1),2e3)}catch(e){L.error(`Failed to copy: `+e.message)}},ft=async e=>{e.preventDefault(),w(!0);try{let e={interval_mins:Number(u)};f.trim()&&(e.global_webhook_secret=f.trim());let t=await fetch(`/admin/api/settings/auto-sync`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to save auto-sync settings`);typeof n.has_global_secret==`boolean`?h(n.has_global_secret):f.trim()&&h(!0),typeof n.interval_mins==`number`&&d(n.interval_mins),p(``),L.success(`Auto-sync settings saved successfully`)}catch(e){L.error(`Error saving auto-sync settings: `+e.message)}finally{w(!1)}},pt=async()=>{if(f&&!m){p(``);return}if(window.confirm(`Clear the global webhook secret? Incoming webhook payloads will no longer require secret verification unless configured per-repository.`)){w(!0);try{let e=await fetch(`/admin/api/settings/auto-sync`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({interval_mins:Number(u),global_webhook_secret:``})}),t=await e.json();if(!e.ok)throw Error(t.error||`Failed to clear global webhook secret`);h(!1),p(``),L.success(`Global webhook secret cleared`)}catch(e){L.error(`Failed to clear webhook secret: `+e.message)}finally{w(!1)}}},mt=e=>{he(e),e===`qdrant`?((!ve||ve===`data/chroma_db`)&&ye(`data/qdrant_db`),(!be||be===`http://localhost:8000`)&&xe(`http://localhost:6333`)):((!ve||ve===`data/qdrant_db`)&&ye(`data/chroma_db`),(!be||be===`http://localhost:6333`)&&xe(`http://localhost:8000`))},ht=e=>{_e(e),e===`embedded`&&!ve&&ye(me===`chroma`?`data/chroma_db`:`data/qdrant_db`),e===`remote`&&!be&&xe(me===`chroma`?`http://localhost:8000`:`http://localhost:6333`)},gt=async()=>{Te(!0),De(null);try{let e={provider:me,mode:ge,storage_path:ge===`embedded`?ve.trim():null,url:ge===`remote`?be.trim():null,collection:Se.trim()||`knowledge_rag_v1`},t=await fetch(`/admin/api/vector-store/test`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}),n=await t.json();if(!t.ok||!n.success){let e=n.message||n.error||`Vector store connection test failed`;De({success:!1,message:e}),L.error(`Vector store test: `+e)}else{let e=n.message||`Vector store connection test successful`;De({success:!0,message:e}),L.success(e)}}catch(e){let t=e.message||`Connection error`;De({success:!1,message:t}),L.error(`Vector store test error: `+t)}finally{Te(!1)}},_t=async()=>{let e=me===`chroma`?`ChromaDB`:`Qdrant`,n=ge===`embedded`?`Embedded Disk`:`Remote Server`;if(window.confirm(`Switch active vector database backend to ${e} (${n})? This will update settings and trigger a full re-indexing of all sources.`)){ke(!0);try{let n={provider:me,mode:ge,storage_path:ge===`embedded`?ve.trim():null,url:ge===`remote`?be.trim():null,collection:Se.trim()||`knowledge_rag_v1`},r=await fetch(`/admin/api/vector-store/switch`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}),i=await r.json();if(!r.ok||i.status===`error`){let e=i.error||i.message||`Failed to switch vector database backend`;De({success:!1,message:e}),L.error(`Switch error: `+e)}else{let n=i.message||`Switched vector backend to ${e}`;De({success:!0,message:n}),L.success(n),await at(),t()}}catch(e){De({success:!1,message:e.message}),L.error(`Switch error: `+e.message)}finally{ke(!1)}}},vt=async(e,n,i)=>{if(n.trim())try{let o=await fetch(`/admin/api/settings/token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({[e]:n.trim()})}),c=await o.json();if(!o.ok)throw Error(c.error||`Failed to save token`);L.success(`${i} token saved successfully.`),e===`github_token`&&r(``),e===`gitlab_token`&&a(``),e===`gitea_token`&&s(``),t()}catch(e){L.error(`Error saving ${i} token: `+e.message)}},yt=async(e,n)=>{if(window.confirm(`Clear the stored ${n} token from database?`))try{let r=await fetch(`/admin/api/settings/token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({[e]:``})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error||`Failed to clear token`)}L.success(`${n} token cleared`),t()}catch(e){L.error(`Failed to clear ${n} token: `+e.message)}},bt=async e=>{if(e.preventDefault(),!(!A.trim()||!oe.trim())){le(!0);try{let e=await fetch(`/admin/api/settings/hosts`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({host:A.trim(),provider:ne,auth_user:ie.trim()||null,auth_token:oe.trim()})}),t=await e.json();if(!e.ok)throw Error(t.error||`Failed to save host credential`);L.success(`Host credential for '${A.trim()}' saved`),ee(!1),te(``),re(`gitlab`),ae(``),F(``),it()}catch(e){L.error(`Error: `+e.message)}finally{le(!1)}}},xt=async(e,t)=>{if(window.confirm(`Remove stored credentials for host '${t}'?`))try{let n=await fetch(`/admin/api/settings/hosts/${e}`,{method:`DELETE`});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to delete`)}L.success(`Removed credentials for '${t}'`),it()}catch(e){L.error(`Failed to remove: `+e.message)}},St=e?.providers_auth?.github||{token_source:e?.token_source||`None`,masked_token:e?.masked_token||`None`},Ct=e?.providers_auth?.gitlab||{token_source:`None`,masked_token:`None`},wt=e?.providers_auth?.gitea||{token_source:`None`,masked_token:`None`};return(0,b.jsxs)(`div`,{className:`tab-content active`,style:{display:`flex`,flexDirection:`column`,gap:`24px`},children:[(0,b.jsx)(se,{}),(0,b.jsx)(j,{vectorStore:ue,isLoadingVs:fe,testFeedback:Ee,vsProvider:me,vsMode:ge,vsStoragePath:ve,setVsStoragePath:ye,vsUrl:be,setVsUrl:xe,vsCollection:Se,setVsCollection:Ce,isTestingVs:we,isSwitchingVs:Oe,onProviderChange:mt,onModeChange:ht,onTestConnection:gt,onSwitchBackend:_t}),(0,b.jsx)(M,{embeddingConfig:Ae,isLoadingEmb:Me,isSavingEmb:Pe,embProvider:Ie,setEmbProvider:Le,embThreads:Re,setEmbThreads:ze,embBatchSize:Be,setEmbBatchSize:Ve,embDenseModel:He,setEmbDenseModel:Ue,embSparseModel:We,setEmbSparseModel:Ge,embLitellmUrl:Ke,setEmbLitellmUrl:qe,embLitellmApiKey:Je,setEmbLitellmApiKey:Ye,embVisionOcrModel:Xe,setEmbVisionOcrModel:Ze,embChatModel:Qe,setEmbChatModel:$e,discoveryResult:et,isDiscovering:nt,onDiscoverModels:ct,onSaveEmbeddingSettings:lt}),(0,b.jsx)(N,{isLoadingAutoSync:y,intervalMins:u,setIntervalMins:d,hasGlobalSecret:m,showWebhookSecret:T,setShowWebhookSecret:E,webhookSecret:f,setWebhookSecret:p,fullWebhookUrl:ut,copiedWebhookUrl:D,isSavingAutoSync:C,onSaveAutoSync:ft,onClearWebhookSecret:pt,onCopyWebhookUrl:dt}),(0,b.jsx)(P,{stats:e,ghAuth:St,glAuth:Ct,gtAuth:wt,ghToken:n,setGhToken:r,glToken:i,setGlToken:a,gtToken:o,setGtToken:s,hostCredentials:c,isHostModalOpen:k,setIsHostModalOpen:ee,newHost:A,setNewHost:te,newHostProvider:ne,setNewHostProvider:re,newHostUser:ie,setNewHostUser:ae,newHostToken:oe,setNewHostToken:F,isSavingHost:I,onSaveToken:vt,onClearToken:yt,onSaveHostCredential:bt,onDeleteHostCredential:xt}),(0,b.jsx)(ce,{})]})}function ue(){let e=S(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(`ALL`),[s,c]=(0,_.useState)(``),[l,u]=(0,_.useState)(!0),[d,f]=(0,_.useState)(new Set),p=(0,_.useRef)(null),m=(0,_.useRef)(null),h=(0,_.useCallback)(async()=>{i(!0);try{let e=await fetch(`/admin/api/logs`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();n(Array.isArray(t)?t:[])}catch(t){e.error(`Failed to load diagnostics logs: ${t.message}`)}finally{i(!1)}},[e]);(0,_.useEffect)(()=>{h();let e=setInterval(h,8e3);return()=>clearInterval(e)},[h]),(0,_.useEffect)(()=>{l&&m.current&&(m.current.scrollTop=m.current.scrollHeight)},[t,l]);let g=async()=>{if(window.confirm(`Are you sure you want to clear all server diagnostics logs?`))try{let t=await fetch(`/admin/api/logs`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||`HTTP ${t.status}`)}n([]),f(new Set),e.success(`Diagnostics logs cleared.`)}catch(t){e.error(`Failed to clear logs: ${t.message}`)}},v=e=>{f(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},y=e=>{switch(e.toUpperCase()){case`ERROR`:return`badge badge-danger`;case`WARNING`:return`badge badge-warning`;case`INFO`:return`badge badge-primary`;case`DEBUG`:return`badge badge-secondary`;default:return`badge badge-secondary`}},x=t.filter(e=>{if(a!==`ALL`&&e.level.toUpperCase()!==a)return!1;if(s.trim()){let t=s.toLowerCase(),n=e.message?.toLowerCase().includes(t),r=e.logger?.toLowerCase().includes(t),i=e.traceback?.toLowerCase().includes(t),a=e.level?.toLowerCase().includes(t);if(!n&&!r&&!i&&!a)return!1}return!0}),C={ALL:t.length,INFO:t.filter(e=>e.level===`INFO`).length,WARNING:t.filter(e=>e.level===`WARNING`).length,ERROR:t.filter(e=>e.level===`ERROR`).length,DEBUG:t.filter(e=>e.level===`DEBUG`).length};return(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsxs)(`div`,{className:`glass-card log-viewer-container`,children:[(0,b.jsxs)(`div`,{className:`log-viewer-header`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`}),` Diagnostics & Server Logs`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Inspect real-time server runtime events, tree-sitter AST parsing, background indexing, and MCP tool traces.`})]}),(0,b.jsxs)(`div`,{className:`log-viewer-actions`,children:[(0,b.jsxs)(`label`,{className:`log-autoscroll-label`,children:[(0,b.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),`Auto-scroll`]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:h,disabled:r,title:`Refresh logs`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-rotate ${r?`fa-spin`:``}`}),` Refresh`]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-danger`,onClick:g,title:`Clear all logs`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Clear Logs`]})]})]}),(0,b.jsxs)(`div`,{className:`log-toolbar`,children:[(0,b.jsx)(`div`,{className:`log-filter-pills`,children:[`ALL`,`INFO`,`WARNING`,`ERROR`,`DEBUG`].map(e=>(0,b.jsxs)(`button`,{type:`button`,className:`log-filter-btn ${a===e?`active`:``} ${e.toLowerCase()}`,onClick:()=>o(e),children:[e,` `,(0,b.jsx)(`span`,{className:`pill-count`,children:C[e]})]},e))}),(0,b.jsxs)(`div`,{className:`log-search-wrapper`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass search-icon`}),(0,b.jsx)(`input`,{type:`text`,className:`log-search-input`,placeholder:`Search logs by message, logger, or traceback...`,value:s,onChange:e=>c(e.target.value)}),s&&(0,b.jsx)(`button`,{type:`button`,className:`clear-search-btn`,onClick:()=>c(``),title:`Clear search`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-xmark`})})]})]}),(0,b.jsx)(`div`,{className:`log-stream-container`,ref:m,children:x.length===0?(0,b.jsxs)(`div`,{className:`empty-state`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-circle-info`,style:{fontSize:`2rem`,marginBottom:`12px`,opacity:.5}}),(0,b.jsxs)(`p`,{children:[`No logs available `,s||a!==`ALL`?`matching current filter`:``,`.`]})]}):(0,b.jsxs)(`div`,{className:`log-stream-list`,children:[x.map((e,t)=>{let n=!!e.traceback,r=d.has(t);return(0,b.jsxs)(`div`,{className:`log-entry log-level-${e.level.toLowerCase()} ${n?`has-traceback`:``}`,children:[(0,b.jsxs)(`div`,{className:`log-entry-main`,children:[(0,b.jsx)(`span`,{className:`log-timestamp`,children:e.timestamp}),(0,b.jsx)(`span`,{className:y(e.level),children:e.level}),(0,b.jsx)(`span`,{className:`log-logger code`,children:e.logger}),(0,b.jsx)(`span`,{className:`log-message`,children:e.message}),n&&(0,b.jsxs)(`button`,{type:`button`,className:`btn-traceback-toggle`,onClick:()=>v(t),title:`Toggle traceback details`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${r?`fa-chevron-down`:`fa-chevron-right`}`}),(0,b.jsx)(`span`,{children:r?`Hide Stack Trace`:`View Stack Trace`})]})]}),n&&r&&(0,b.jsx)(`div`,{className:`log-traceback-wrapper`,children:(0,b.jsx)(`pre`,{className:`traceback-box`,children:e.traceback})})]},`${e.timestamp}-${t}`)}),(0,b.jsx)(`div`,{ref:p})]})})]})})}var de=({repos:e,selectedRepo:t,onSelectRepo:n,density:r,onChangeDensity:i,searchQuery:a=``,onSearchChange:o,totalFiles:s=0,totalSymbols:c=0,onRefresh:l,loading:u=!1})=>(0,b.jsxs)(`div`,{className:`nav-toolbar`,"data-testid":`navigator-toolbar`,children:[(0,b.jsxs)(`div`,{className:`nav-toolbar-left`,children:[(0,b.jsxs)(`div`,{className:`nav-repo-selector-wrapper`,children:[(0,b.jsx)(`label`,{htmlFor:`nav-repo-select`,className:`nav-repo-label`,children:`Repository:`}),(0,b.jsxs)(`select`,{id:`nav-repo-select`,"aria-label":`Repository`,className:`nav-repo-select`,value:t,onChange:e=>n(e.target.value),disabled:u,children:[(0,b.jsx)(`option`,{value:`__all__`,children:`All Repositories (__all__)`}),e.filter(e=>e.name!==`__all__`).map(e=>(0,b.jsx)(`option`,{value:e.name,children:e.name},e.id??e.name))]})]}),(0,b.jsxs)(`div`,{className:`nav-stats-badges`,children:[(0,b.jsxs)(`span`,{className:`nav-stat-badge`,title:`Total Indexed Files`,children:[(0,b.jsx)(`span`,{className:`stat-num`,children:s}),` files`]}),(0,b.jsxs)(`span`,{className:`nav-stat-badge`,title:`Total Extracted AST Symbols`,children:[(0,b.jsx)(`span`,{className:`stat-num`,children:c}),` symbols`]})]})]}),(0,b.jsx)(`div`,{className:`nav-toolbar-center`,children:o&&(0,b.jsxs)(`div`,{className:`nav-global-search`,children:[(0,b.jsx)(`span`,{className:`search-icon-wrapper`,"aria-hidden":`true`,children:(0,b.jsxs)(`svg`,{className:`search-icon`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]})}),(0,b.jsx)(`input`,{type:`text`,className:`nav-search-input`,placeholder:`Search files (Ctrl+P / /)...`,value:a,onChange:e=>o(e.target.value),"aria-label":`Quick search files`}),a&&(0,b.jsx)(`button`,{type:`button`,className:`nav-search-clear-btn`,onClick:()=>o(``),"aria-label":`Clear search`,children:`✕`})]})}),(0,b.jsxs)(`div`,{className:`nav-toolbar-right`,children:[(0,b.jsxs)(`div`,{className:`nav-density-switcher`,role:`group`,"aria-label":`Density mode`,children:[(0,b.jsx)(`span`,{className:`density-label`,children:`Density:`}),(0,b.jsx)(`button`,{type:`button`,className:`density-btn ${r===`compact`?`active`:``}`,onClick:()=>i(`compact`),title:`Compact (20px rows - IDE mode)`,"aria-pressed":r===`compact`,children:`Compact`}),(0,b.jsx)(`button`,{type:`button`,className:`density-btn ${r===`balanced`?`active`:``}`,onClick:()=>i(`balanced`),title:`Balanced (28px rows - Default)`,"aria-pressed":r===`balanced`,children:`Balanced`}),(0,b.jsx)(`button`,{type:`button`,className:`density-btn ${r===`spacious`?`active`:``}`,onClick:()=>i(`spacious`),title:`Spacious (36px rows - Cards)`,"aria-pressed":r===`spacious`,children:`Spacious`})]}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-refresh-btn ${u?`spinning`:``}`,onClick:l,title:`Refresh codebase tree`,disabled:u,"aria-label":`Refresh codebase tree`,children:(0,b.jsx)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,b.jsx)(`path`,{d:`M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67`})})})]})]});function fe(e,t){let n=e.toLowerCase();return n.endsWith(`.py`)||t===`python`?{icon:`🐍`,className:`icon-py`}:n.endsWith(`.tsx`)||n.endsWith(`.ts`)||t===`typescript`?{icon:`⚡`,className:`icon-ts`}:n.endsWith(`.jsx`)||n.endsWith(`.js`)||n.endsWith(`.mjs`)||t===`javascript`?{icon:`📜`,className:`icon-js`}:n.endsWith(`.go`)||t===`go`?{icon:`🔷`,className:`icon-go`}:n.endsWith(`.rs`)||t===`rust`?{icon:`🦀`,className:`icon-rs`}:n.endsWith(`.json`)?{icon:`📄`,className:`icon-json`}:n.endsWith(`.md`)||n.endsWith(`.markdown`)?{icon:`📝`,className:`icon-md`}:n.endsWith(`.css`)||n.endsWith(`.scss`)?{icon:`🎨`,className:`icon-css`}:n.endsWith(`.sql`)?{icon:`🗄️`,className:`icon-sql`}:n.endsWith(`.yaml`)||n.endsWith(`.yml`)||n.endsWith(`.toml`)?{icon:`⚙️`,className:`icon-yaml`}:{icon:`📄`,className:`icon-file`}}var pe=({nodes:e,selectedPath:t,onSelectFile:n,filterText:r,onFilterChange:i,density:a=`balanced`,loading:o=!1})=>{let[s,c]=(0,_.useState)(``),l=r===void 0?s:r,u=i||c,[d,f]=(0,_.useState)(new Set),[p,m]=(0,_.useState)(-1),h=(0,_.useRef)(null),g=(0,_.useCallback)(e=>{let t=[],n=e=>{if(!(!e||!Array.isArray(e)))for(let r of e)r&&r.is_dir&&(t.push(r.id),Array.isArray(r.children)&&n(r.children))};return n(e),t},[]),v=(0,_.useCallback)((e,t)=>{if(!e||!Array.isArray(e))return{filteredNodes:[],matchedDirIds:new Set};let n=t.toLowerCase().trim(),r=new Set,i=e=>{if(!e)return null;let t=(e.name||``).toLowerCase().includes(n)||(e.path||``).toLowerCase().includes(n);if(e.is_dir){let n=Array.isArray(e.children)?e.children:[],a=n.map(i).filter(e=>e!==null);return a.length>0||t?(r.add(e.id),{...e,children:a.length>0?a:n}):null}return t?e:null};return{filteredNodes:e.map(i).filter(e=>e!==null),matchedDirIds:r}},[]),{filteredNodes:y,matchedDirIds:x}=(0,_.useMemo)(()=>l.trim()?v(e,l):{filteredNodes:Array.isArray(e)?e:[],matchedDirIds:new Set},[e,l,v]);(0,_.useEffect)(()=>{l.trim()&&f(e=>{let t=new Set(e);return x.forEach(e=>t.add(e)),t})},[l,x]),(0,_.useEffect)(()=>{if(t){let e=t.split(`/`),n=[];for(let t=1;t0&&f(e=>{let t=new Set(e);return n.forEach(e=>t.add(e)),t})}},[t]);let S=(0,_.useCallback)(e=>{f(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),C=(0,_.useCallback)(()=>{let t=g(e);f(new Set(t))},[e,g]),w=(0,_.useCallback)(()=>{f(new Set)},[]),T=(0,_.useMemo)(()=>{let e=[],t=!!l.trim(),n=(r,i)=>{if(!(!r||!Array.isArray(r)))for(let a of r){if(!a)continue;let r=!!(a.is_dir&&Array.isArray(a.children)&&a.children.length>0),o=d.has(a.id)||t&&x.has(a.id);e.push({node:a,depth:i,isExpanded:o,hasChildren:r}),a.is_dir&&o&&Array.isArray(a.children)&&n(a.children,i+1)}};return n(y,0),e},[y,d,l,x]);return(0,b.jsxs)(`div`,{className:`nav-tree-pane density-${a}`,"data-testid":`navigator-tree-container`,tabIndex:0,ref:h,onKeyDown:e=>{if(T.length!==0){if(e.key===`ArrowDown`)e.preventDefault(),m(e=>ee>0?e-1:T.length-1);else if(e.key===`ArrowRight`){if(e.preventDefault(),p>=0&&p=0&&p=0&&pu(e.target.value)}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-tree-clear-btn`,onClick:()=>u(``),"aria-label":`Clear filter`,children:`✕`})]})]}),(0,b.jsx)(`div`,{className:`nav-tree-content`,children:o?(0,b.jsxs)(`div`,{className:`nav-loading-wrapper`,"data-testid":`tree-loading-spinner`,children:[(0,b.jsx)(`div`,{className:`nav-spinner`}),(0,b.jsx)(`span`,{children:`Loading codebase tree...`})]}):T.length===0?(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`p`,{children:`No matching files found`}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-clear-filter-btn`,onClick:()=>u(``),children:`Clear filter`})]}):(0,b.jsx)(`div`,{className:`nav-tree-list`,role:`tree`,children:T.map((e,r)=>{let{node:i,depth:a,isExpanded:o}=e,s=!i.is_dir&&i.path===t,c=r===p,{icon:l,className:u}=i.is_dir?{icon:o?`📂`:`📁`,className:`icon-dir`}:fe(i.name,i.language);return(0,b.jsxs)(`div`,{role:`treeitem`,"aria-expanded":i.is_dir?o:void 0,"aria-selected":s,className:`nav-tree-item ${i.is_dir?`dir-item`:`file-item`} ${s?`selected`:``} ${c?`focused`:``}`,style:{paddingLeft:`${a*14+10}px`},onClick:()=>{m(r),i.is_dir?S(i.id):n(i)},children:[(0,b.jsx)(`span`,{className:`tree-chevron`,children:i.is_dir?(0,b.jsx)(`span`,{className:`chevron-arrow ${o?`open`:``}`,children:`▶`}):(0,b.jsx)(`span`,{className:`chevron-spacer`})}),(0,b.jsx)(`span`,{className:`tree-icon ${u}`,"aria-hidden":`true`,children:l}),(0,b.jsx)(`span`,{className:`tree-label`,title:i.path,children:i.name}),(0,b.jsxs)(`div`,{className:`tree-badges`,children:[i.symbol_count>0&&(0,b.jsxs)(`span`,{className:`badge-symbols`,title:`${i.symbol_count} AST Symbols`,children:[i.symbol_count,` sym`]}),i.route_count>0&&(0,b.jsxs)(`span`,{className:`badge-routes`,title:`${i.route_count} API Routes`,children:[i.route_count,` rts`]})]})]},i.id)})})})]})};function me(e){switch(e.toUpperCase()){case`GET`:return`method-get`;case`POST`:return`method-post`;case`PUT`:return`method-put`;case`DELETE`:return`method-delete`;case`PATCH`:return`method-patch`;default:return`method-other`}}function he(e){switch(e.toLowerCase()){case`class`:return`kind-class`;case`function`:case`method`:case`async function`:return`kind-function`;case`variable`:case`constant`:return`kind-variable`;case`interface`:case`type`:return`kind-type`;default:return`kind-default`}}var ge=({outline:e,selectedSymbolId:t,onSelectSymbol:n,onReadDoc:r,density:i=`balanced`,loading:a=!1})=>{let[o,s]=(0,_.useState)(`all`),[c,l]=(0,_.useState)(``),u=(0,_.useMemo)(()=>e?.symbols||[],[e?.symbols]),d=(0,_.useMemo)(()=>{let e=0,t=0,n=0;for(let r of u){r.route&&e++;let i=r.kind.toLowerCase();i===`class`||i===`interface`?t++:(i.includes(`func`)||i===`method`)&&(r.route||n++)}return{all:u.length,routes:e,classes:t,functions:n}},[u]),f=(0,_.useMemo)(()=>u.filter(e=>{if(o===`routes`){if(!e.route)return!1}else if(o===`classes`){let t=e.kind.toLowerCase();if(t!==`class`&&t!==`interface`)return!1}else if(o===`functions`){let t=e.kind.toLowerCase();if(!t.includes(`func`)&&t!==`method`||e.route)return!1}if(c.trim()){let t=c.toLowerCase(),n=e.name.toLowerCase().includes(t),r=(e.signature||``).toLowerCase().includes(t),i=e.route?e.route.path_pattern.toLowerCase().includes(t)||e.route.http_method.toLowerCase().includes(t):!1;if(!n&&!r&&!i)return!1}return!0}),[u,o,c]),p=e?.filepath?e.filepath.split(`/`).pop():``;return(0,b.jsxs)(`div`,{className:`nav-outline-pane density-${i}`,"data-testid":`navigator-outline-container`,children:[(0,b.jsxs)(`div`,{className:`nav-outline-header`,children:[(0,b.jsxs)(`div`,{className:`nav-outline-title-row`,children:[(0,b.jsxs)(`div`,{className:`nav-outline-title`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`line`,{x1:`8`,y1:`6`,x2:`21`,y2:`6`}),(0,b.jsx)(`line`,{x1:`8`,y1:`12`,x2:`21`,y2:`12`}),(0,b.jsx)(`line`,{x1:`8`,y1:`18`,x2:`21`,y2:`18`}),(0,b.jsx)(`line`,{x1:`3`,y1:`6`,x2:`3.01`,y2:`6`}),(0,b.jsx)(`line`,{x1:`3`,y1:`12`,x2:`3.01`,y2:`12`}),(0,b.jsx)(`line`,{x1:`3`,y1:`18`,x2:`3.01`,y2:`18`})]}),(0,b.jsx)(`span`,{children:`Symbols & Routes`})]}),e&&(0,b.jsx)(`div`,{className:`nav-file-badge`,title:e.filepath,children:(0,b.jsx)(`span`,{className:`file-name`,children:p})})]}),e&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:`nav-outline-search-bar`,children:[(0,b.jsx)(`span`,{className:`search-icon-wrapper`,"aria-hidden":`true`,children:(0,b.jsxs)(`svg`,{className:`search-icon`,width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,b.jsx)(`line`,{x1:`21`,y1:`21`,x2:`16.65`,y2:`16.65`})]})}),(0,b.jsx)(`input`,{type:`text`,className:`nav-outline-search-input`,placeholder:`Filter symbols...`,value:c,onChange:e=>l(e.target.value)}),c&&(0,b.jsx)(`button`,{type:`button`,className:`nav-outline-clear-btn`,onClick:()=>l(``),"aria-label":`Clear symbol search`,children:`✕`})]}),(0,b.jsxs)(`div`,{className:`nav-category-chips`,role:`tablist`,"aria-label":`Symbol Category Filter`,children:[(0,b.jsxs)(`button`,{type:`button`,role:`button`,className:`category-chip ${o===`all`?`active`:``}`,onClick:()=>s(`all`),children:[`All `,(0,b.jsx)(`span`,{className:`chip-count`,children:d.all})]}),(0,b.jsxs)(`button`,{type:`button`,role:`button`,className:`category-chip ${o===`routes`?`active`:``}`,onClick:()=>s(`routes`),children:[`Routes `,(0,b.jsx)(`span`,{className:`chip-count`,children:d.routes})]}),(0,b.jsxs)(`button`,{type:`button`,role:`button`,className:`category-chip ${o===`classes`?`active`:``}`,onClick:()=>s(`classes`),children:[`Classes `,(0,b.jsx)(`span`,{className:`chip-count`,children:d.classes})]}),(0,b.jsxs)(`button`,{type:`button`,role:`button`,className:`category-chip ${o===`functions`?`active`:``}`,onClick:()=>s(`functions`),children:[`Functions `,(0,b.jsx)(`span`,{className:`chip-count`,children:d.functions})]})]})]})]}),(0,b.jsx)(`div`,{className:`nav-outline-content`,children:a?(0,b.jsxs)(`div`,{className:`nav-outline-skeleton`,"data-testid":`outline-loading-skeleton`,children:[(0,b.jsx)(`div`,{className:`skeleton-item shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-item shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-item shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-item shimmer`})]}):e?u.length===0?(0,b.jsxs)(`div`,{className:`nav-empty-state doc-file-state`,"data-testid":`outline-doc-state`,children:[(0,b.jsx)(`div`,{className:`empty-icon`,children:`📝`}),(0,b.jsx)(`h4`,{children:`Document File Selected`}),(0,b.jsx)(`p`,{style:{fontSize:`0.82rem`,color:`var(--text-muted)`,margin:`6px 0 12px`},children:`This file contains documentation or text content with no code AST symbols.`}),r&&(0,b.jsx)(`button`,{type:`button`,className:`btn btn-sm btn-primary read-doc-action-btn`,onClick:r,style:{padding:`6px 14px`,fontSize:`0.8rem`},children:`📖 Read Full Document`})]}):f.length===0?(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`h4`,{children:`No Matching Symbols`}),(0,b.jsx)(`p`,{children:`No symbols match the current category and search filters.`}),(0,b.jsx)(`button`,{type:`button`,className:`nav-clear-filter-btn`,onClick:()=>{s(`all`),l(``)},children:`Reset Filters`})]}):(0,b.jsx)(`div`,{className:`nav-symbol-list`,role:`list`,children:f.map(e=>{let r=e.id===t,i=he(e.kind);return(0,b.jsxs)(`div`,{"data-testid":`symbol-item-${e.id}`,className:`nav-symbol-item ${r?`active`:``}`,onClick:()=>n(e),role:`listitem`,tabIndex:0,onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),n(e))},children:[(0,b.jsxs)(`div`,{className:`symbol-header-row`,children:[(0,b.jsxs)(`div`,{className:`symbol-name-col`,children:[(0,b.jsx)(`span`,{className:`symbol-kind-badge ${i}`,children:e.kind}),(0,b.jsx)(`span`,{className:`symbol-name-text`,title:e.full_symbol||e.name,children:e.name})]}),(0,b.jsx)(`div`,{className:`symbol-meta-col`,children:(0,b.jsxs)(`span`,{className:`symbol-line-badge`,children:[`L`,e.start_line,e.end_line&&e.end_line!==e.start_line?` - L${e.end_line}`:``]})})]}),e.route&&(0,b.jsxs)(`div`,{className:`symbol-route-row`,children:[(0,b.jsx)(`span`,{className:`route-method-badge ${me(e.route.http_method)}`,children:e.route.http_method}),(0,b.jsx)(`span`,{className:`route-path-text`,title:e.route.path_pattern,children:e.route.path_pattern}),e.route.framework&&(0,b.jsx)(`span`,{className:`route-framework-tag`,children:e.route.framework})]}),e.signature&&(0,b.jsx)(`div`,{className:`symbol-signature-snippet`,children:(0,b.jsx)(`code`,{children:e.signature})})]},e.id)})}):(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`div`,{className:`empty-icon`,children:`📂`}),(0,b.jsx)(`h4`,{children:`No File Selected`}),(0,b.jsx)(`p`,{children:`Select a file from the tree to inspect its symbols and routes.`})]})})]})},_e=({filepath:e,content:t,totalLines:n,sizeBytes:r,loading:i=!1,error:a=null,onRefresh:o})=>{let s=e.toLowerCase().endsWith(`.md`)||e.toLowerCase().endsWith(`.markdown`),[c,l]=(0,_.useState)(s?`rendered`:`raw`),[u,d]=(0,_.useState)(!1),f=async()=>{if(t)try{navigator?.clipboard?.writeText&&await navigator.clipboard.writeText(t),d(!0),setTimeout(()=>d(!1),2e3)}catch{}},p=e=>e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`,m=e?e.split(`/`).pop()||e:``,h=e=>{let t=e.split(` +`),n=[],r=!1,i=``,a=[];return t.forEach((e,t)=>{if(e.trim().startsWith("```")){r?(n.push((0,b.jsx)(`pre`,{className:`doc-code-block ${i}`.trim(),children:(0,b.jsx)(`code`,{children:a.join(` +`)})},`code-${t}`)),a=[],r=!1):(r=!0,i=e.trim().slice(3));return}if(r){a.push(e);return}if(e.startsWith(`# `))n.push((0,b.jsx)(`h1`,{className:`doc-h1`,children:e.slice(2)},`h1-${t}`));else if(e.startsWith(`## `))n.push((0,b.jsx)(`h2`,{className:`doc-h2`,children:e.slice(3)},`h2-${t}`));else if(e.startsWith(`### `))n.push((0,b.jsx)(`h3`,{className:`doc-h3`,children:e.slice(4)},`h3-${t}`));else if(e.startsWith(`#### `))n.push((0,b.jsx)(`h4`,{className:`doc-h4`,children:e.slice(5)},`h4-${t}`));else if(e.trim()===`---`||e.trim()===`***`)n.push((0,b.jsx)(`hr`,{className:`doc-divider`},`hr-${t}`));else if(e.startsWith(`> `))n.push((0,b.jsx)(`blockquote`,{className:`doc-quote`,children:e.slice(2)},`quote-${t}`));else if(e.trim().startsWith(`- `)||e.trim().startsWith(`* `))n.push((0,b.jsx)(`li`,{className:`doc-list-item`,children:g(e.trim().slice(2))},`li-${t}`));else if(/^\d+\.\s/.test(e.trim())){let r=e.trim().replace(/^\d+\.\s/,``);n.push((0,b.jsx)(`li`,{className:`doc-numbered-item`,children:g(r)},`oli-${t}`))}else e.trim()===``?n.push((0,b.jsx)(`div`,{className:`doc-blank-line`},`blank-${t}`)):n.push((0,b.jsx)(`p`,{className:`doc-paragraph`,children:g(e)},`p-${t}`))}),r&&a.length>0&&n.push((0,b.jsx)(`pre`,{className:`doc-code-block`,children:(0,b.jsx)(`code`,{children:a.join(` +`)})},`code-tail`)),n},g=e=>e.split(/(`[^`]+`)/).map((e,t)=>e.startsWith("`")&&e.endsWith("`")&&e.length>=2?(0,b.jsx)(`code`,{className:`doc-inline-code`,children:e.slice(1,-1)},t):e.split(/(\*\*[^*]+\*\*)/).map((e,n)=>e.startsWith(`**`)&&e.endsWith(`**`)&&e.length>=4?(0,b.jsx)(`strong`,{children:e.slice(2,-2)},`${t}-${n}`):e));return(0,b.jsxs)(`div`,{className:`nav-doc-reader`,"data-testid":`nav-doc-reader`,children:[(0,b.jsxs)(`div`,{className:`doc-reader-header`,children:[(0,b.jsxs)(`div`,{className:`doc-reader-meta`,children:[(0,b.jsx)(`span`,{className:`doc-icon`,children:s?`📝`:`📄`}),(0,b.jsxs)(`div`,{className:`doc-title-wrapper`,children:[(0,b.jsx)(`h3`,{className:`doc-filename`,title:e,children:m}),(0,b.jsxs)(`div`,{className:`doc-meta-badges`,children:[(0,b.jsx)(`span`,{className:`doc-badge badge-path`,children:e}),(0,b.jsxs)(`span`,{className:`doc-badge badge-lines`,children:[n,` lines`]}),(0,b.jsx)(`span`,{className:`doc-badge badge-size`,children:p(r)})]})]})]}),(0,b.jsxs)(`div`,{className:`doc-reader-actions`,children:[s&&(0,b.jsxs)(`div`,{className:`doc-view-toggle`,role:`group`,"aria-label":`View Mode`,children:[(0,b.jsx)(`button`,{type:`button`,className:`toggle-btn ${c===`rendered`?`active`:``}`,onClick:()=>l(`rendered`),children:`Rendered`}),(0,b.jsx)(`button`,{type:`button`,className:`toggle-btn ${c===`raw`?`active`:``}`,onClick:()=>l(`raw`),children:`Raw Source`})]}),(0,b.jsx)(`button`,{type:`button`,className:`doc-copy-btn`,onClick:f,title:`Copy document content`,"aria-label":`Copy Document Content`,children:u?`✓ Copied!`:`Copy Content`})]})]}),(0,b.jsx)(`div`,{className:`doc-reader-body`,children:i?(0,b.jsxs)(`div`,{className:`doc-reader-loading`,"data-testid":`doc-loading`,children:[(0,b.jsx)(`div`,{className:`skeleton-header shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-block shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-block shimmer`})]}):a?(0,b.jsxs)(`div`,{className:`doc-reader-error`,role:`alert`,children:[(0,b.jsxs)(`p`,{children:[`Failed to load file content: `,a]}),o&&(0,b.jsx)(`button`,{type:`button`,className:`btn btn-sm btn-primary`,onClick:o,children:`Retry`})]}):c===`rendered`&&s?(0,b.jsx)(`div`,{className:`doc-rendered-content`,"data-testid":`doc-rendered-content`,children:h(t)}):(0,b.jsx)(`div`,{className:`doc-raw-container`,"data-testid":`doc-raw-content`,children:(0,b.jsx)(`pre`,{className:`doc-raw-pre`,children:(0,b.jsx)(`table`,{className:`doc-lines-table`,children:(0,b.jsx)(`tbody`,{children:t.split(` +`).map((e,t)=>(0,b.jsxs)(`tr`,{className:`doc-line-row`,children:[(0,b.jsx)(`td`,{className:`doc-line-num`,"data-line-number":t+1,children:t+1}),(0,b.jsx)(`td`,{className:`doc-line-code`,children:(0,b.jsx)(`code`,{children:e||` `})})]},t))})})})})})]})},ve=({impact:e,fileContent:t,loadingContent:n=!1,contentError:r=null,activeInspectorTab:i,onChangeInspectorTab:a,onSelectCaller:o,onSelectCallee:s,density:c=`balanced`,loading:l=!1,onRefreshContent:u})=>{let[d,f]=(0,_.useState)(`intelligence`),[p,m]=(0,_.useState)(!1),h=i===void 0?d:i,g=a||f,v=async()=>{if(!e?.symbol)return;let{filepath:t,start_line:n,end_line:r}=e.symbol,i=`${t}#L${n}${r&&r!==n?`-L${r}`:``}`;try{navigator?.clipboard?.writeText&&await navigator.clipboard.writeText(i),m(!0),setTimeout(()=>m(!1),2e3)}catch{}},y=e?.symbol,x=e?.route,S=e?.callers||[],C=e?.callees||[],w=e?.imports||[],T=!y&&(t||n||r)||y&&h===`reader`;return(0,b.jsxs)(`div`,{className:`nav-inspector-pane density-${c}`,"data-testid":`navigator-inspector-container`,children:[(0,b.jsxs)(`div`,{className:`nav-inspector-header`,children:[(0,b.jsxs)(`div`,{className:`nav-inspector-title`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`path`,{d:`M12 16v-4M12 8h.01`})]}),(0,b.jsx)(`span`,{children:T&&!y?`Document & File Reader`:`Code Intelligence & Impact`})]}),(0,b.jsxs)(`div`,{className:`nav-inspector-header-actions`,children:[y&&t&&(0,b.jsxs)(`div`,{className:`nav-inspector-tabs`,role:`tablist`,children:[(0,b.jsx)(`button`,{type:`button`,className:`inspector-tab-btn ${h===`intelligence`?`active`:``}`,onClick:()=>g(`intelligence`),children:`Symbol Intelligence`}),(0,b.jsx)(`button`,{type:`button`,className:`inspector-tab-btn ${h===`reader`?`active`:``}`,onClick:()=>g(`reader`),children:`Read Full File`})]}),y&&h===`intelligence`&&(0,b.jsx)(`button`,{type:`button`,className:`nav-copy-permalink-btn`,onClick:v,title:`Copy file path & line range permalink`,"aria-label":`Copy Permalink`,children:p?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:(0,b.jsx)(`polyline`,{points:`20 6 9 17 4 12`})}),(0,b.jsx)(`span`,{children:`Copied!`})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`path`,{d:`M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71`}),(0,b.jsx)(`path`,{d:`M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71`})]}),(0,b.jsx)(`span`,{children:`Copy Permalink`})]})})]})]}),(0,b.jsx)(`div`,{className:`nav-inspector-content`,children:T&&t?(0,b.jsx)(_e,{filepath:t.filepath,content:t.content,totalLines:t.total_lines,sizeBytes:t.size_bytes,loading:n,error:r,onRefresh:u}):T&&n?(0,b.jsxs)(`div`,{className:`nav-inspector-skeleton`,"data-testid":`inspector-loading-skeleton`,children:[(0,b.jsx)(`div`,{className:`skeleton-header shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-metrics shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-block shimmer`})]}):l?(0,b.jsxs)(`div`,{className:`nav-inspector-skeleton`,"data-testid":`inspector-loading-skeleton`,children:[(0,b.jsx)(`div`,{className:`skeleton-header shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-metrics shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-block shimmer`}),(0,b.jsx)(`div`,{className:`skeleton-block shimmer`})]}):!e||!y?(0,b.jsxs)(`div`,{className:`nav-empty-state`,children:[(0,b.jsx)(`div`,{className:`empty-icon`,children:`🔍`}),(0,b.jsx)(`h4`,{children:`No File or Symbol Selected`}),(0,b.jsx)(`p`,{children:`Select a file from the tree to read its documentation or select a symbol to inspect callers and dependencies.`})]}):(0,b.jsxs)(`div`,{className:`nav-inspector-body`,children:[(0,b.jsxs)(`div`,{className:`inspector-card symbol-summary-card`,children:[(0,b.jsxs)(`div`,{className:`summary-title-row`,children:[(0,b.jsx)(`span`,{className:`symbol-kind-badge ${he(y.kind)}`,children:y.kind}),(0,b.jsx)(`h3`,{className:`summary-name`,title:y.full_symbol||y.name,children:y.name})]}),(0,b.jsxs)(`div`,{className:`summary-location-row`,children:[(0,b.jsxs)(`span`,{className:`summary-file-path`,children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`path`,{d:`M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z`}),(0,b.jsx)(`polyline`,{points:`13 2 13 9 20 9`})]}),y.filepath]}),(0,b.jsxs)(`span`,{className:`summary-line-range`,children:[`L`,y.start_line,` - L`,y.end_line]})]})]}),(0,b.jsxs)(`div`,{className:`inspector-metrics-grid`,children:[(0,b.jsxs)(`div`,{className:`metric-box`,children:[(0,b.jsx)(`span`,{className:`metric-label`,children:`Incoming Callers`}),(0,b.jsx)(`span`,{className:`metric-value`,"data-testid":`metric-callers`,children:S.length})]}),(0,b.jsxs)(`div`,{className:`metric-box`,children:[(0,b.jsx)(`span`,{className:`metric-label`,children:`Outgoing Callees`}),(0,b.jsx)(`span`,{className:`metric-value`,"data-testid":`metric-callees`,children:C.length})]}),(0,b.jsxs)(`div`,{className:`metric-box`,children:[(0,b.jsx)(`span`,{className:`metric-label`,children:`Total Imports`}),(0,b.jsx)(`span`,{className:`metric-value`,"data-testid":`metric-imports`,children:w.length})]}),(0,b.jsxs)(`div`,{className:`metric-box`,children:[(0,b.jsx)(`span`,{className:`metric-label`,children:`Language`}),(0,b.jsx)(`span`,{className:`metric-value metric-lang`,"data-testid":`metric-scope`,children:y.language||`code`})]})]}),x&&(0,b.jsxs)(`div`,{className:`inspector-card route-card`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`line`,{x1:`2`,y1:`12`,x2:`22`,y2:`12`}),(0,b.jsx)(`path`,{d:`M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z`})]}),(0,b.jsx)(`span`,{children:`API Route Mapping`})]}),(0,b.jsxs)(`div`,{className:`route-detail-row`,children:[(0,b.jsx)(`span`,{className:`route-method-badge ${me(x.http_method)}`,children:x.http_method}),(0,b.jsx)(`span`,{className:`route-path-code`,children:x.path_pattern}),x.framework&&(0,b.jsx)(`span`,{className:`route-framework-tag`,children:x.framework})]})]}),y.signature&&(0,b.jsxs)(`div`,{className:`inspector-card code-preview-card`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`polyline`,{points:`16 18 22 12 16 6`}),(0,b.jsx)(`polyline`,{points:`8 6 2 12 8 18`})]}),(0,b.jsx)(`span`,{children:`Signature`})]}),(0,b.jsx)(`pre`,{className:`signature-code-block`,children:(0,b.jsx)(`code`,{children:y.signature})})]}),y.docstring&&(0,b.jsxs)(`div`,{className:`inspector-card docstring-card`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsxs)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,b.jsx)(`polyline`,{points:`14 2 14 8 20 8`}),(0,b.jsx)(`line`,{x1:`16`,y1:`13`,x2:`8`,y2:`13`}),(0,b.jsx)(`line`,{x1:`16`,y1:`17`,x2:`8`,y2:`17`}),(0,b.jsx)(`polyline`,{points:`10 9 9 9 8 9`})]}),(0,b.jsx)(`span`,{children:`Documentation`})]}),(0,b.jsx)(`p`,{className:`docstring-text`,children:y.docstring})]}),(0,b.jsxs)(`div`,{className:`inspector-card relations-card callers-section`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsx)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:(0,b.jsx)(`path`,{d:`M12 19V5M5 12l7-7 7 7`})}),(0,b.jsxs)(`span`,{children:[`Incoming Callers (`,S.length,`)`]})]}),S.length===0?(0,b.jsx)(`div`,{className:`nav-no-items-text`,children:`No incoming callers found in this repository.`}):(0,b.jsx)(`div`,{className:`relation-list`,children:S.map((e,t)=>(0,b.jsxs)(`div`,{"data-testid":`caller-item-${e.id??t}`,className:`relation-item caller-item`,onClick:()=>{e.source_filepath&&o&&o(e.source_filepath,e.source_symbol,e.source_symbol_id??void 0)},role:`button`,tabIndex:0,title:`Jump to ${e.source_symbol||`caller`} in ${e.source_filepath||``}`,children:[(0,b.jsxs)(`div`,{className:`relation-top`,children:[(0,b.jsx)(`span`,{className:`rel-symbol-name`,children:e.source_symbol||`Unknown Caller`}),(0,b.jsx)(`span`,{className:`rel-jump-hint`,"aria-hidden":`true`,children:`Jump ↗`})]}),(0,b.jsxs)(`div`,{className:`relation-bottom`,children:[e.source_filepath&&(0,b.jsx)(`span`,{className:`rel-filepath`,children:e.source_filepath}),e.all_lines?(0,b.jsxs)(`span`,{className:`rel-line`,title:`Lines: ${e.all_lines}`,children:[`L`,e.all_lines.includes(`,`)?e.all_lines.split(`,`).slice(0,3).join(`, L`)+(e.all_lines.split(`,`).length>3?`...`:``):e.all_lines]}):e.line_number?(0,b.jsxs)(`span`,{className:`rel-line`,children:[`L`,e.line_number]}):null,e.call_count&&e.call_count>1?(0,b.jsxs)(`span`,{className:`rel-count-badge`,children:[e.call_count,` calls`]}):null,e.relationship_type&&(0,b.jsx)(`span`,{className:`rel-type-tag`,children:e.relationship_type})]})]},e.id??t))})]}),(0,b.jsxs)(`div`,{className:`inspector-card relations-card dependencies-section`,children:[(0,b.jsxs)(`div`,{className:`card-section-title`,children:[(0,b.jsx)(`svg`,{width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:(0,b.jsx)(`path`,{d:`M12 5v14M5 12l7 7 7-7`})}),(0,b.jsxs)(`span`,{children:[`Outgoing Dependencies (`,C.length+w.length,`)`]})]}),C.length===0&&w.length===0?(0,b.jsx)(`div`,{className:`nav-no-items-text`,children:`No outgoing calls or imports.`}):(0,b.jsxs)(`div`,{className:`relation-list`,children:[C.map((e,t)=>(0,b.jsxs)(`div`,{"data-testid":`callee-item-${e.id??t}`,className:`relation-item callee-item ${e.target_filepath?`is-clickable`:``}`,onClick:()=>{e.target_filepath&&s&&s(e.target_filepath,e.target_symbol)},role:e.target_filepath?`button`:void 0,tabIndex:e.target_filepath?0:void 0,title:e.target_filepath?`Jump to ${e.target_symbol} in ${e.target_filepath}`:void 0,onKeyDown:t=>{e.target_filepath&&s&&(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),s(e.target_filepath,e.target_symbol))},children:[(0,b.jsxs)(`div`,{className:`relation-top`,children:[(0,b.jsx)(`span`,{className:`rel-symbol-name`,children:e.target_symbol}),(0,b.jsxs)(`div`,{className:`rel-top-right`,children:[(0,b.jsx)(`span`,{className:`rel-type-badge`,children:e.relationship_type||`CALLS`}),e.target_filepath&&(0,b.jsx)(`span`,{className:`rel-jump-hint`,"aria-hidden":`true`,children:`Jump ↗`})]})]}),(0,b.jsxs)(`div`,{className:`relation-bottom`,children:[e.target_filepath&&(0,b.jsx)(`span`,{className:`rel-filepath`,children:e.target_filepath}),e.all_lines?(0,b.jsxs)(`span`,{className:`rel-line`,title:`Lines: ${e.all_lines}`,children:[`L`,e.all_lines.includes(`,`)?e.all_lines.split(`,`).slice(0,3).join(`, L`)+(e.all_lines.split(`,`).length>3?`...`:``):e.all_lines]}):e.line_number?(0,b.jsxs)(`span`,{className:`rel-line`,children:[`L`,e.line_number]}):null,e.call_count&&e.call_count>1?(0,b.jsxs)(`span`,{className:`rel-count-badge`,children:[e.call_count,` calls`]}):null]})]},e.id??`callee-${t}`)),w.map((e,t)=>(0,b.jsxs)(`div`,{className:`relation-item import-item`,children:[(0,b.jsxs)(`div`,{className:`relation-top`,children:[(0,b.jsx)(`span`,{className:`rel-symbol-name`,children:e.target_symbol}),(0,b.jsx)(`span`,{className:`rel-type-badge import-badge`,children:`IMPORTS`})]}),(0,b.jsxs)(`div`,{className:`relation-bottom`,children:[e.all_lines?(0,b.jsxs)(`span`,{className:`rel-line`,title:`Lines: ${e.all_lines}`,children:[`L`,e.all_lines.includes(`,`)?e.all_lines.split(`,`).slice(0,3).join(`, L`)+(e.all_lines.split(`,`).length>3?`...`:``):e.all_lines]}):e.line_number?(0,b.jsxs)(`span`,{className:`rel-line`,children:[`L`,e.line_number]}):null,e.import_count&&e.import_count>1?(0,b.jsxs)(`span`,{className:`rel-count-badge`,children:[e.import_count,` imports`]}):null]})]},e.id??`import-${t}`))]})]})]})})]})},ye=`contextcortex_navigator_density`,be=({initialRepo:e=`__all__`,initialPath:t,initialSymbolId:n})=>{let[r,i]=(0,_.useState)(()=>{let e=localStorage.getItem(ye);return e===`compact`||e===`balanced`||e===`spacious`?e:`balanced`}),a=e=>{i(e),localStorage.setItem(ye,e)},[o,s]=(0,_.useState)([]),[c,l]=(0,_.useState)(e),[u,d]=(0,_.useState)(null),[f,p]=(0,_.useState)(!1),[m,h]=(0,_.useState)(``),[g,v]=(0,_.useState)(t||null),[y,x]=(0,_.useState)(null),[S,C]=(0,_.useState)(!1),[w,T]=(0,_.useState)(n||null),[E,D]=(0,_.useState)(null),[O,k]=(0,_.useState)(!1),[ee,A]=(0,_.useState)(null),[te,ne]=(0,_.useState)(!1),[re,j]=(0,_.useState)(null),[M,N]=(0,_.useState)(`intelligence`),[P,ie]=(0,_.useState)(null);(0,_.useEffect)(()=>{(async()=>{try{let e=await fetch(`/admin/api/repositories`);if(e.ok){let t=await e.json();s(Array.isArray(t)?t:[])}else{let e=await fetch(`/admin/api/repos`);if(e.ok){let t=await e.json();s(Array.isArray(t)?t:[])}}}catch(e){console.error(`Error fetching repositories:`,e)}})()},[]);let ae=(0,_.useCallback)(async e=>{p(!0),ie(null);try{let t=await fetch(`/admin/api/navigator/tree?repo=${encodeURIComponent(e)}`);if(!t.ok)throw Error(`Failed to load tree: ${t.status} ${t.statusText}`);let n=await t.json();d(n)}catch(e){console.error(`Error fetching codebase tree:`,e),ie(e.message||`Failed to load codebase tree`)}finally{p(!1)}},[]);(0,_.useEffect)(()=>{ae(c)},[c,ae]);let oe=(0,_.useCallback)(async(e,t)=>{k(!0);try{let n=await fetch(`/admin/api/navigator/symbol-impact?repo=${encodeURIComponent(e)}&symbol_id=${t}`);if(!n.ok)throw Error(`Failed to load symbol impact: ${n.status}`);let r=await n.json();D(r)}catch(e){console.error(`Error fetching symbol impact:`,e),D(null)}finally{k(!1)}},[]),F=(0,_.useCallback)(async(e,t)=>{ne(!0),j(null);try{let n=await fetch(`/admin/api/files/read?path=${encodeURIComponent(t)}&repo=${encodeURIComponent(e)}`);if(!n.ok)throw Error(`Failed to read file: ${n.statusText}`);let r=await n.json();A(r)}catch(e){console.error(`Error fetching file content:`,e),j(e.message||`Failed to read file content`),A(null)}finally{ne(!1)}},[]),I=(0,_.useCallback)(async(e,t,n)=>{C(!0);try{let r=await fetch(`/admin/api/navigator/file-outline?repo=${encodeURIComponent(e)}&filepath=${encodeURIComponent(t)}`);if(!r.ok)throw Error(`Failed to load file outline: ${r.status}`);let i=await r.json();if(x(i),i.symbols&&i.symbols.length>0){let t;typeof n==`number`?t=i.symbols.find(e=>e.id===n):typeof n==`string`&&(t=i.symbols.find(e=>e.name===n||e.full_symbol===n));let r=t||i.symbols[0];T(r.id),N(`intelligence`),await oe(e,r.id)}else T(null),D(null),N(`reader`)}catch(e){console.error(`Error fetching outline:`,e),x(null),T(null),D(null),N(`reader`)}finally{C(!1)}},[oe]);return(0,b.jsxs)(`div`,{className:`code-navigator-container density-${r}`,"data-testid":`code-navigator-container`,children:[(0,b.jsx)(de,{repos:o,selectedRepo:c,onSelectRepo:e=>{l(e),v(null),x(null),T(null),D(null),A(null)},density:r,onChangeDensity:a,searchQuery:m,onSearchChange:h,totalFiles:u?.total_files??0,totalSymbols:u?.total_symbols??0,onRefresh:()=>ae(c),loading:f}),P&&(0,b.jsxs)(`div`,{className:`nav-error-banner`,role:`alert`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,children:[(0,b.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,b.jsx)(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),(0,b.jsx)(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})]}),(0,b.jsx)(`span`,{children:P}),(0,b.jsx)(`button`,{type:`button`,onClick:()=>ie(null),className:`error-close-btn`,children:`✕`})]}),(0,b.jsxs)(`div`,{className:`nav-panes-layout`,children:[(0,b.jsx)(`section`,{className:`nav-pane-column nav-pane-tree`,"aria-label":`File Tree`,children:(0,b.jsx)(pe,{nodes:u?.tree??[],selectedPath:g,onSelectFile:e=>{e.is_dir||(v(e.path),I(c,e.path),F(c,e.path))},filterText:m,onFilterChange:h,density:r,loading:f})}),(0,b.jsx)(`section`,{className:`nav-pane-column nav-pane-outline`,"aria-label":`Symbol and Route Outline`,children:(0,b.jsx)(ge,{outline:y,selectedSymbolId:w,onSelectSymbol:e=>{T(e.id),N(`intelligence`),oe(c,e.id)},onReadDoc:()=>{N(`reader`)},density:r,loading:S})}),(0,b.jsx)(`section`,{className:`nav-pane-column nav-pane-inspector`,"aria-label":`Code Intelligence and Impact`,children:(0,b.jsx)(ve,{impact:E,fileContent:ee,loadingContent:te,contentError:re,activeInspectorTab:M,onChangeInspectorTab:N,onSelectCaller:(e,t,n)=>{v(e),I(c,e,n??t),F(c,e)},onSelectCallee:(e,t)=>{e&&(v(e),I(c,e,t),F(c,e))},density:r,loading:O,onRefreshContent:()=>g&&F(c,g)})})]})]})};function xe({data:e,onConfirm:t,onCancel:n,isIngesting:r=!1}){let[i,a]=(0,_.useState)(`pages`),[o,s]=(0,_.useState)(0),c=e.total_pages||e.pages.length||1,l=e.pages[o]||{page_number:1,text:``,char_count:0,ocr_applied:!1};return(0,b.jsx)(`div`,{className:`modal-backdrop`,"data-testid":`pdf-preview-modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`850px`,width:`95%`,maxHeight:`90vh`,display:`flex`,flexDirection:`column`},"data-testid":`pdf-preview-modal`,children:[(0,b.jsxs)(`div`,{className:`modal-header`,style:{marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{style:{display:`flex`,alignItems:`center`,gap:`8px`,margin:0,fontSize:`1.25rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-pdf text-red-500 mr-2`,style:{color:`#ef4444`}}),(0,b.jsx)(`span`,{children:`PDF Extraction Preview`})]}),(0,b.jsx)(`div`,{style:{fontSize:`0.85rem`,color:`var(--text-muted)`,marginTop:`4px`},children:(0,b.jsx)(`code`,{children:e.filename})})]}),(0,b.jsx)(`button`,{type:`button`,className:`btn-close`,onClick:n,"aria-label":`Close modal`,children:`×`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,flexWrap:`wrap`,gap:`10px`,padding:`10px 14px`,background:`rgba(255, 255, 255, 0.04)`,borderRadius:`6px`,marginBottom:`14px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`14px`,flexWrap:`wrap`,alignItems:`center`,fontSize:`0.85rem`},children:[(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`strong`,{children:`Total Pages:`}),` `,(0,b.jsx)(`span`,{className:`badge badge-primary`,"data-testid":`total-pages-badge`,children:e.total_pages})]}),(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`strong`,{children:`Total Characters:`}),` `,(0,b.jsx)(`span`,{className:`badge badge-primary`,"data-testid":`total-chars-badge`,children:e.total_characters.toLocaleString()})]}),(0,b.jsxs)(`span`,{children:[(0,b.jsx)(`strong`,{children:`OCR Applied:`}),` `,(0,b.jsxs)(`span`,{className:`badge ${e.ocr_pages_count>0?`badge-warning`:`badge-secondary`}`,"data-testid":`ocr-count-badge`,children:[e.ocr_pages_count,` `,e.ocr_pages_count===1?`page`:`pages`]})]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`6px`},children:[(0,b.jsxs)(`button`,{type:`button`,className:`btn ${i===`pages`?`btn-primary`:`btn-secondary`}`,style:{padding:`4px 10px`,fontSize:`0.82rem`},onClick:()=>a(`pages`),"data-testid":`tab-pages-btn`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-lines`,style:{marginRight:`5px`}}),` Page Text`]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn ${i===`chunks`?`btn-primary`:`btn-secondary`}`,style:{padding:`4px 10px`,fontSize:`0.82rem`},onClick:()=>a(`chunks`),"data-testid":`tab-chunks-btn`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-layer-group`,style:{marginRight:`5px`}}),` Sample Chunks (`,e.sample_chunks?.length||0,`)`]})]})]}),(0,b.jsx)(`div`,{style:{flex:1,overflowY:`auto`,minHeight:`320px`,display:`flex`,flexDirection:`column`},children:i===`pages`?(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,height:`100%`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,flexWrap:`wrap`,gap:`8px`,marginBottom:`10px`,padding:`6px 10px`,background:`rgba(0, 0, 0, 0.2)`,borderRadius:`6px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`3px 8px`,fontSize:`0.8rem`},onClick:()=>{o>0&&s(e=>e-1)},disabled:o<=0,"aria-label":`Previous Page`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-chevron-left`}),` Prev`]}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`span`,{children:`Page`}),(0,b.jsx)(`select`,{value:o,onChange:t=>{let n=parseInt(t.target.value,10);!isNaN(n)&&n>=0&&n(0,b.jsxs)(`option`,{value:t,children:[e.page_number,` `,e.ocr_applied?`(OCR)`:``]},e.page_number))}),(0,b.jsxs)(`span`,{children:[`of `,c]})]}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`3px 8px`,fontSize:`0.8rem`},onClick:()=>{oe+1)},disabled:o>=e.pages.length-1,"aria-label":`Next Page`,children:[`Next `,(0,b.jsx)(`i`,{className:`fa-solid fa-chevron-right`})]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[l.ocr_applied?(0,b.jsxs)(`span`,{className:`badge badge-warning`,style:{display:`inline-flex`,alignItems:`center`,gap:`4px`},"data-testid":`page-ocr-applied-badge`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-eye`}),` OCR Fallback`]}):(0,b.jsxs)(`span`,{className:`badge badge-secondary`,style:{display:`inline-flex`,alignItems:`center`,gap:`4px`},"data-testid":`page-digital-badge`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-font`}),` Digital`]}),(0,b.jsxs)(`span`,{className:`text-muted`,style:{fontSize:`0.8rem`},children:[l.char_count.toLocaleString(),` chars`]})]})]}),(0,b.jsx)(`div`,{style:{flex:1,minHeight:`260px`,position:`relative`},children:l.text?(0,b.jsx)(`pre`,{className:`search-hit-code`,style:{maxHeight:`400px`,overflowY:`auto`,margin:0,whiteSpace:`pre-wrap`,wordBreak:`break-word`,fontSize:`0.85rem`,lineHeight:`1.5`,padding:`12px`,background:`rgba(0, 0, 0, 0.3)`,borderRadius:`6px`},"data-testid":`page-text-content`,children:l.text}):(0,b.jsxs)(`div`,{className:`empty-state`,style:{padding:`30px`,textAlign:`center`,color:`var(--text-muted)`},"data-testid":`page-empty-text`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-circle-question`,style:{fontSize:`1.5rem`,marginBottom:`8px`,display:`block`}}),`No text extracted from Page `,l.page_number,`.`]})})]}):(0,b.jsxs)(`div`,{style:{display:`flex`,flexDirection:`column`,gap:`10px`},"data-testid":`chunks-container`,children:[(0,b.jsx)(`div`,{style:{fontSize:`0.82rem`,color:`var(--text-muted)`,marginBottom:`4px`},children:`Simulated chunking for vector ingestion (approx. 1000 chars / chunk with 200 char overlap):`}),!e.sample_chunks||e.sample_chunks.length===0?(0,b.jsx)(`div`,{className:`empty-state`,style:{padding:`24px`},children:`No vector chunks generated for this document.`}):e.sample_chunks.map(e=>(0,b.jsxs)(`div`,{style:{border:`1px solid var(--border-card)`,borderRadius:`6px`,background:`rgba(0, 0, 0, 0.25)`,padding:`10px 12px`},"data-testid":`chunk-card-${e.chunk_index}`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,fontSize:`0.8rem`,marginBottom:`6px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,alignItems:`center`},children:[(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[`Chunk #`,e.chunk_index+1]}),(0,b.jsxs)(`span`,{className:`text-muted`,children:[e.heading,` (Page `,e.page_number,`)`]})]}),(0,b.jsxs)(`span`,{className:`badge badge-secondary`,children:[e.char_count,` chars`]})]}),(0,b.jsx)(`pre`,{style:{margin:0,whiteSpace:`pre-wrap`,wordBreak:`break-word`,fontFamily:`var(--font-family-mono)`,fontSize:`0.8rem`,color:`var(--text)`,lineHeight:`1.4`,background:`rgba(0, 0, 0, 0.2)`,padding:`8px`,borderRadius:`4px`},children:e.preview})]},e.chunk_index))]})}),(0,b.jsxs)(`div`,{className:`modal-footer`,style:{marginTop:`16px`,paddingTop:`12px`,borderTop:`1px solid var(--border-card)`,display:`flex`,justifyContent:`flex-end`,gap:`10px`},children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:n,disabled:r,children:`Cancel`}),(0,b.jsxs)(`button`,{type:`button`,className:`btn btn-primary`,onClick:t,disabled:r,"data-testid":`confirm-ingest-btn`,children:[(0,b.jsx)(`i`,{className:`fa-solid ${r?`fa-spinner fa-spin`:`fa-database`}`,style:{marginRight:`6px`}}),r?`Ingesting...`:`Confirm & Ingest to Vector DB`]})]})]})})}function Se({refreshStats:e}){let t=S(),[n,r]=(0,_.useState)(null),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(!1),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)(``),[f,p]=(0,_.useState)(``),[m,h]=(0,_.useState)(`local_storage`),[g,v]=(0,_.useState)(``),[y,x]=(0,_.useState)(null),[C,w]=(0,_.useState)(!1),[T,E]=(0,_.useState)(!1),[D,O]=(0,_.useState)(!1),[k,ee]=(0,_.useState)(null),[A,te]=(0,_.useState)(!1),[ne,re]=(0,_.useState)(!1),[j,M]=(0,_.useState)(null),[N,P]=(0,_.useState)(``),[ie,ae]=(0,_.useState)(``),[oe,F]=(0,_.useState)(!1),[I,se]=(0,_.useState)(!1),[ce,le]=(0,_.useState)(!1),[ue,de]=(0,_.useState)(null),[fe,pe]=(0,_.useState)(null),[me,he]=(0,_.useState)(``),[ge,_e]=(0,_.useState)(`local_storage`),[ve,ye]=(0,_.useState)(``),[be,Se]=(0,_.useState)(!1),Ce=e=>{if(!e||e===0)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/t**r).toFixed(1))+` `+n[r]},we=e=>{if(!e)return`-`;let t=e<1e11?e*1e3:e;return new Date(t).toLocaleString()},Te=(0,_.useCallback)(async(e=i)=>{s(!0);try{let t=e?`/admin/api/storage/tree?folder=${encodeURIComponent(e)}`:`/admin/api/storage/tree`,n=await fetch(t);if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to load storage tree`)}let i=await n.json();r(i),a(i.current_folder||``)}catch(e){t.error(`Error loading storage: `+e.message),console.error(`Error loading storage tree:`,e)}finally{s(!1)}},[i,t]);(0,_.useEffect)(()=>{Te(``)},[]);let Ee=e=>{Te(e)},De=()=>{if(!i)return;let e=i.split(`/`).filter(Boolean);e.pop(),Ee(e.join(`/`))},Oe=e=>{let t=e===void 0?i:e;d(t?`${t}/`:``),p(``),h(`local_storage`),v(``),x(null),l(!0)},ke=e=>{if(e.preventDefault(),w(!1),e.dataTransfer.files&&e.dataTransfer.files.length>0){let t=e.dataTransfer.files[0];Pe(t)}},Ae=e=>{e.target.files&&e.target.files.length>0&&Pe(e.target.files[0])},je=async(e,n,r,a)=>{le(!0);try{let t=new FormData;t.append(`file`,e),t.append(`ocr_fallback`,`true`);let o=await fetch(`/admin/api/storage/pdf/preview`,{method:`POST`,body:t}),s=await o.json();if(!o.ok)throw Error(s.error||`Failed to generate PDF preview`);pe(e),he(n||(i?`${i}/${e.name}`:e.name)),_e(r||m||`local_storage`),ye(a||f||``),de(s),l(!1),se(!0)}catch(e){t.error(`PDF preview error: ${e.message}`)}finally{le(!1)}},Me=async()=>{if(fe){Se(!0);try{let n=new FormData;n.append(`file`,fe),n.append(`path`,me||fe.name),n.append(`repo`,ge||`local_storage`),ve&&n.append(`category`,ve);let r=await fetch(`/admin/api/storage/upload`,{method:`POST`,body:n}),a=await r.json();if(!r.ok)throw Error(a.error||`Failed to ingest PDF`);se(!1),pe(null),de(null);let o=a.chunks_indexed??0;t.success(`PDF uploaded and indexed (${o} chunks)`),Te(i),e&&e()}catch(e){t.error(`PDF ingestion error: ${e.message}`)}finally{Se(!1)}}},Ne=()=>{se(!1),pe(null),de(null)},Pe=e=>{x(e);let t=i?`${i}/${e.name}`:e.name;if(d(t),e.name.toLowerCase().endsWith(`.pdf`)||e.type===`application/pdf`){v(``),je(e,t,m,f);return}let n=new FileReader;n.onload=e=>{typeof e.target?.result==`string`&&v(e.target.result)},n.readAsText(e)},Fe=async n=>{if(n.preventDefault(),!u.trim()){t.error(`File path is required`);return}if(y&&y.name.toLowerCase().endsWith(`.pdf`)){await je(y,u.trim(),m.trim(),f.trim());return}E(!0);try{let n;if(y&&!g){let e=new FormData;e.append(`file`,y),e.append(`path`,u.trim()),e.append(`repo`,m.trim()||`local_storage`),f.trim()&&e.append(`category`,f.trim()),n=await fetch(`/admin/api/storage/upload`,{method:`POST`,body:e})}else n=await fetch(`/admin/api/storage/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:u.trim(),content:g,repo:m.trim()||`local_storage`,category:f.trim()||null})});let r=await n.json();if(!n.ok)throw Error(r.error||`Failed to upload file`);l(!1);let a=r.chunks_indexed??0;t.success(`File uploaded and indexed (${a} chunks)`),Te(i),e&&e()}catch(e){t.error(`Upload error: ${e.message}`)}finally{E(!1)}},Ie=async e=>{te(!0),O(!0);try{let t=await fetch(`/admin/api/storage/file?path=${encodeURIComponent(e.rel_path)}`),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to read file`);ee(n)}catch(e){t.error(`Preview error: ${e.message}`),O(!1)}finally{te(!1)}},Le=async e=>{if(M(e),ae(``),re(!0),e.rel_path.toLowerCase().endsWith(`.pdf`)){P(``);return}try{let t=await fetch(`/admin/api/storage/file?path=${encodeURIComponent(e.rel_path)}`),n=await t.json();t.ok&&n.content!==void 0?P(n.content):P(``)}catch{P(``)}},Re=async n=>{if(n.preventDefault(),j){if(j.rel_path.toLowerCase().endsWith(`.pdf`)){t.error(`PDF files cannot be edited directly via text editor. Upload a new PDF file instead.`);return}F(!0);try{let n=await fetch(`/admin/api/storage/file`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:j.rel_path,content:N,repo:`local_storage`,category:ie.trim()||``})}),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to update file`);re(!1);let a=r.chunks_indexed??0;t.success(`File updated and indexed (${a} chunks)`),Te(i),e&&e()}catch(e){t.error(`Replace error: ${e.message}`)}finally{F(!1)}}},ze=async n=>{if(window.confirm(`Are you sure you want to delete '${n.name}' from local storage and purge its vector embeddings?`))try{let r=await fetch(`/admin/api/storage/file?path=${encodeURIComponent(n.rel_path)}`,{method:`DELETE`}),a=await r.json();if(!r.ok)throw Error(a.error||`Failed to delete file`);t.success(`File deleted successfully: ${n.name}`),Te(i),e&&e()}catch(e){t.error(`Delete error: ${e.message}`)}},Be=i?i.split(`/`).filter(Boolean):[];return(0,b.jsxs)(`div`,{className:`tab-content active`,children:[(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`}),` Local Storage Explorer`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Upload, browse, inspect, replace, and delete managed documents in ContextCortex local storage with real-time vector indexing.`})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`10px`},children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Te(i),title:`Refresh directory`,disabled:o,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate ${o?`fa-spin`:``}`}),` Refresh`]}),(0,b.jsxs)(`button`,{className:`btn btn-primary`,onClick:()=>Oe(),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-upload`}),` Upload File`]})]})]}),(0,b.jsxs)(`div`,{className:`browser-breadcrumbs`,style:{display:`flex`,alignItems:`center`,justifyContent:`space-between`,flexWrap:`wrap`,gap:`10px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`6px`,flexWrap:`wrap`},children:[(0,b.jsx)(`span`,{className:`label`,style:{fontWeight:600},children:`Location:`}),(0,b.jsxs)(`button`,{className:`btn-icon`,style:{padding:`2px 6px`,fontSize:`0.85rem`,color:i===``?`var(--primary)`:`var(--text)`},onClick:()=>Ee(``),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-house`}),` root`]}),Be.map((e,t)=>{let n=Be.slice(0,t+1).join(`/`),r=t===Be.length-1;return(0,b.jsxs)(`span`,{style:{display:`inline-flex`,alignItems:`center`,gap:`6px`},children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`/`}),(0,b.jsx)(`button`,{className:`btn-icon`,style:{padding:`2px 6px`,fontSize:`0.85rem`,fontWeight:r?`bold`:`normal`,color:r?`var(--primary)`:`var(--text)`},onClick:()=>Ee(n),children:e})]},n)})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`8px`,fontSize:`0.8rem`,color:`var(--text-muted)`},children:[(0,b.jsxs)(`span`,{children:[`Directories: `,(0,b.jsx)(`strong`,{children:n?.directories.length||0})]}),(0,b.jsx)(`span`,{children:`•`}),(0,b.jsxs)(`span`,{children:[`Files: `,(0,b.jsx)(`strong`,{children:n?.files.length||0})]})]})]}),i!==``&&(0,b.jsx)(`div`,{style:{marginTop:`8px`,marginBottom:`8px`},children:(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`4px 10px`,fontSize:`0.82rem`},onClick:De,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-level-up-alt`}),` .. (Parent Directory)`]})}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{style:{width:`40%`},children:`Name`}),(0,b.jsx)(`th`,{children:`Path`}),(0,b.jsx)(`th`,{children:`Size`}),(0,b.jsx)(`th`,{children:`Modified`}),(0,b.jsx)(`th`,{style:{textAlign:`right`},children:`Actions`})]})}),(0,b.jsx)(`tbody`,{children:!n||n.directories.length===0&&n.files.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:5,className:`empty-state`,children:`No files or subdirectories found in this storage directory. Click "Upload File" to add documents.`})}):(0,b.jsxs)(b.Fragment,{children:[n.directories.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsxs)(`button`,{className:`btn-icon`,style:{display:`inline-flex`,alignItems:`center`,gap:`8px`,textAlign:`left`,color:`var(--text)`},onClick:()=>Ee(e.rel_path),"aria-label":`open ${e.name}`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder`,style:{color:`#fbbf24`,fontSize:`1.05rem`}}),(0,b.jsx)(`strong`,{children:e.name})]})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.rel_path})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{style:{textAlign:`right`},children:(0,b.jsxs)(`button`,{className:`btn btn-secondary`,style:{padding:`3px 8px`,fontSize:`0.8rem`},onClick:()=>Ee(e.rel_path),title:`Open ${e.name}`,"aria-label":`open ${e.name}`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-open`}),` Open`]})})]},e.rel_path)),n.files.map(e=>{let t=e.name.toLowerCase().endsWith(`.pdf`);return(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[t?(0,b.jsx)(`i`,{className:`fa-solid fa-file-pdf text-red-500 mr-2`,style:{color:`#ef4444`,fontSize:`1.05rem`}}):(0,b.jsx)(`i`,{className:`fa-solid fa-file-lines`,style:{color:`var(--primary)`,fontSize:`1.05rem`}}),(0,b.jsx)(`span`,{children:e.name})]})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.rel_path})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-primary`,children:Ce(e.size_bytes)})}),(0,b.jsx)(`td`,{style:{fontSize:`0.85rem`},children:we(e.mtime)}),(0,b.jsx)(`td`,{style:{textAlign:`right`},children:(0,b.jsxs)(`div`,{style:{display:`inline-flex`,gap:`6px`},children:[(0,b.jsx)(`button`,{className:`btn-icon`,onClick:()=>Ie(e),title:`Preview File`,"aria-label":`Preview File`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-eye`})}),(0,b.jsx)(`button`,{className:`btn-icon`,onClick:()=>Le(e),title:`Replace File`,"aria-label":`Replace File`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-file-pen`})}),(0,b.jsx)(`button`,{className:`btn-icon btn-delete`,onClick:()=>ze(e),title:`Delete File`,"aria-label":`Delete File`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`})})]})})]},e.rel_path)})]})})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:!n||n.directories.length===0&&n.files.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No files or subdirectories found.`}):(0,b.jsxs)(b.Fragment,{children:[n.directories.map(e=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder`,style:{color:`#fbbf24`}}),(0,b.jsx)(`strong`,{children:e.name})]}),(0,b.jsx)(`span`,{className:`badge badge-warning`,children:`Directory`})]}),(0,b.jsx)(`div`,{className:`data-mobile-card-body`,children:(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{children:e.rel_path})]})}),(0,b.jsx)(`div`,{className:`data-mobile-card-actions`,children:(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Ee(e.rel_path),"aria-label":`open ${e.name}`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-open`}),` Open Folder`]})})]},`m-${e.rel_path}`)),n.files.map(e=>{let t=e.name.toLowerCase().endsWith(`.pdf`);return(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`8px`},children:[t?(0,b.jsx)(`i`,{className:`fa-solid fa-file-pdf text-red-500 mr-2`,style:{color:`#ef4444`}}):(0,b.jsx)(`i`,{className:`fa-solid fa-file-lines`,style:{color:`var(--primary)`}}),(0,b.jsx)(`strong`,{children:e.name})]}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:Ce(e.size_bytes)})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{children:e.rel_path})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Modified: `}),(0,b.jsx)(`span`,{children:we(e.mtime)})]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-actions`,children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Ie(e),title:`Preview File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-eye`}),` Preview`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Le(e),title:`Replace File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-pen`}),` Replace`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary btn-delete`,onClick:()=>ze(e),title:`Delete File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-trash-can`}),` Delete`]})]})]},`m-${e.rel_path}`)})]})})]}),c&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`640px`},children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-cloud-arrow-up`}),` Upload to Local Storage`]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>l(!1),children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:Fe,children:[(0,b.jsxs)(`div`,{style:{border:C?`2px dashed var(--primary)`:`2px dashed rgba(255, 255, 255, 0.15)`,borderRadius:`8px`,padding:`20px`,textAlign:`center`,background:C?`rgba(59, 130, 246, 0.08)`:`rgba(0, 0, 0, 0.15)`,marginBottom:`16px`,cursor:`pointer`,transition:`all 0.2s ease`},onDragOver:e=>{e.preventDefault(),w(!0)},onDragLeave:()=>w(!1),onDrop:ke,onClick:()=>document.getElementById(`storage-file-input`)?.click(),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-arrow-up`,style:{fontSize:`2rem`,color:`var(--primary)`,marginBottom:`8px`}}),(0,b.jsx)(`p`,{style:{margin:`4px 0`,fontSize:`0.9rem`},children:y?`Selected: ${y.name} (${Ce(y.size)})`:`Drag & drop a file here, or click to browse`}),(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.75rem`},children:`Supports Markdown, code, JSON, YAML, plain text, PDF (up to 50MB)`}),ce&&(0,b.jsxs)(`div`,{style:{marginTop:`8px`,fontSize:`0.85rem`,color:`var(--primary)`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`,style:{marginRight:`6px`}}),`Extracting and analyzing PDF preview...`]}),(0,b.jsx)(`input`,{id:`storage-file-input`,type:`file`,accept:`.md,.markdown,.txt,.json,.yaml,.yml,.sql,.html,.css,.pdf`,style:{display:`none`},onChange:Ae})]}),(0,b.jsxs)(`div`,{className:`form-row`,children:[(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:2},children:[(0,b.jsx)(`label`,{htmlFor:`upload-path`,children:`Relative File Path (e.g. docs/guide.md)`}),(0,b.jsx)(`input`,{id:`upload-path`,type:`text`,required:!0,placeholder:`folder/document.md`,value:u,onChange:e=>d(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{flex:1},children:[(0,b.jsx)(`label`,{htmlFor:`upload-category`,children:`Category Override`}),(0,b.jsx)(`input`,{id:`upload-category`,type:`text`,placeholder:`Optional category`,value:f,onChange:e=>p(e.target.value)})]})]}),y?.name.toLowerCase().endsWith(`.pdf`)||y?.type===`application/pdf`||u.trim().toLowerCase().endsWith(`.pdf`)?(0,b.jsxs)(`div`,{className:`alert alert-info`,style:{margin:`12px 0`,padding:`12px`,background:`rgba(59, 130, 246, 0.1)`,border:`1px solid var(--primary)`,borderRadius:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-pdf`,style:{color:`#ef4444`,marginRight:`8px`}}),(0,b.jsx)(`strong`,{children:`PDF Document Selected:`}),` Binary PDF content cannot be edited manually as text. Extracted text, page segmentation, and vector chunks will be previewed in the extraction modal before ingestion.`]}):(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`upload-content`,children:`File Content (Optional if file uploaded directly)`}),(0,b.jsx)(`textarea`,{id:`upload-content`,rows:8,placeholder:`# Enter or paste text content here...`,value:g,onChange:e=>v(e.target.value),style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`}})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>l(!1),children:`Cancel`}),(0,b.jsxs)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:T,children:[(0,b.jsx)(`i`,{className:`fa-solid ${T?`fa-spinner fa-spin`:`fa-upload`}`}),` Upload & Index`]})]})]})]})}),D&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`750px`,maxHeight:`90vh`,display:`flex`,flexDirection:`column`},children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`}),` File Preview: `,k?.rel_path||`Loading...`]}),k&&(0,b.jsxs)(`span`,{className:`text-muted`,style:{fontSize:`0.8rem`},children:[`Size: `,Ce(k.size_bytes),` • Modified: `,we(k.mtime)]})]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>O(!1),children:`×`})]}),(0,b.jsx)(`div`,{style:{flex:1,overflowY:`auto`,margin:`10px 0`},children:A?(0,b.jsxs)(`div`,{className:`empty-state`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-spinner fa-spin`}),` Loading content...`]}):(0,b.jsx)(`pre`,{className:`search-hit-code`,style:{maxHeight:`420px`,overflowY:`auto`,margin:0,whiteSpace:`pre-wrap`},children:k?.content||`Empty file.`})}),(0,b.jsx)(`div`,{className:`modal-footer`,children:(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>O(!1),children:`Close`})})]})}),ne&&j&&(0,b.jsx)(`div`,{className:`modal-backdrop`,children:(0,b.jsxs)(`div`,{className:`glass-card modal-card`,style:{maxWidth:`680px`},children:[(0,b.jsxs)(`div`,{className:`modal-header`,children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-pen`}),` Replace File: `,j.name]}),(0,b.jsx)(`button`,{className:`btn-close`,onClick:()=>re(!1),children:`×`})]}),(0,b.jsxs)(`form`,{onSubmit:Re,children:[(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{children:`Target File Path`}),(0,b.jsx)(`input`,{type:`text`,readOnly:!0,value:j.rel_path})]}),(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`replace-category`,children:`Category Override`}),(0,b.jsx)(`input`,{id:`replace-category`,type:`text`,placeholder:`Optional category`,value:ie,onChange:e=>ae(e.target.value)})]}),j.rel_path.toLowerCase().endsWith(`.pdf`)?(0,b.jsxs)(`div`,{className:`alert alert-warning`,style:{margin:`14px 0`,padding:`12px`,background:`rgba(245, 158, 11, 0.1)`,border:`1px solid rgba(245, 158, 11, 0.3)`,borderRadius:`6px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-triangle-exclamation`,style:{marginRight:`8px`,color:`#f59e0b`}}),(0,b.jsx)(`strong`,{children:`PDF Replacement:`}),` PDF documents contain binary page streams and cannot be edited as plain text. To replace this document, please upload a new `,(0,b.jsx)(`code`,{children:`.pdf`}),` file using the "Upload File" tool.`]}):(0,b.jsxs)(`div`,{className:`form-group`,children:[(0,b.jsx)(`label`,{htmlFor:`replace-content`,children:`File Content`}),(0,b.jsx)(`textarea`,{id:`replace-content`,rows:10,required:!0,placeholder:`Updated file text...`,value:N,onChange:e=>P(e.target.value),style:{fontFamily:`var(--font-family-mono)`,fontSize:`0.85rem`}})]}),(0,b.jsxs)(`div`,{className:`modal-footer`,children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:()=>re(!1),children:`Cancel`}),(0,b.jsxs)(`button`,{type:`submit`,className:`btn btn-primary`,disabled:oe||j.rel_path.toLowerCase().endsWith(`.pdf`),children:[(0,b.jsx)(`i`,{className:`fa-solid ${oe?`fa-spinner fa-spin`:`fa-save`}`}),` Save & Re-Index`]})]})]})]})}),I&&ue&&(0,b.jsx)(xe,{data:ue,onConfirm:Me,onCancel:Ne,isIngesting:be})]})}function Ce(){let e=S(),[t,n]=(0,_.useState)(null),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(`all`),[s,c]=(0,_.useState)(`summary`),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(``),[p,m]=(0,_.useState)(``),[h,g]=(0,_.useState)(``),v=(0,_.useCallback)(async(t=a,r=s,o=l,c=d,u=p)=>{i(!0);try{let e=new URLSearchParams;e.set(`source_type`,t),e.set(`detail_level`,r),o.trim()&&e.set(`repo_name`,o.trim()),c.trim()&&e.set(`path_prefix`,c.trim()),u.trim()&&e.set(`file_extension`,u.trim());let i=await fetch(`/admin/api/ingestion/catalog?${e.toString()}`);if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(e.error||`Failed to load ingestion catalog`)}let a=await i.json();n(a)}catch(t){e.error(`Error loading catalog: `+t.message),console.error(`Error loading ingestion catalog:`,t)}finally{i(!1)}},[a,s,l,d,p,e]);(0,_.useEffect)(()=>{v(a,s,l,d,p)},[a,s]);let y=e=>{e&&e.preventDefault(),v(a,s,l,d,p)},x=()=>{u(``),f(``),m(``),g(``),v(a,s,``,``,``)},C=e=>{o(e)},w=e=>{c(e)},T=e=>{if(!e)return`-`;if(typeof e==`string`)try{return new Date(e).toLocaleString()}catch{return e}let t=e<1e11?e*1e3:e;return new Date(t).toLocaleString()},E=t?.git_repositories||[],D=t?.monitored_paths||[],O=t?.local_storage,k=(t?.files||[]).filter(e=>{if(!h.trim())return!0;let t=h.toLowerCase();return e.filepath.toLowerCase().includes(t)||e.repo.toLowerCase().includes(t)||e.language&&e.language.toLowerCase().includes(t)}),ee=E.reduce((e,t)=>e+(t.file_count||0),0),A=D.reduce((e,t)=>e+(t.file_count||0),0),te=O?.file_count||0,ne=ee+A+te;return(0,b.jsx)(`div`,{className:`tab-content active`,children:(0,b.jsxs)(`div`,{className:`glass-card`,children:[(0,b.jsxs)(`div`,{className:`card-header-btn`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`h2`,{children:[(0,b.jsx)(`i`,{className:`fa-solid fa-book-bookmark`}),` Unified Ingestion Catalog`]}),(0,b.jsx)(`p`,{className:`text-muted`,style:{marginTop:`4px`,fontSize:`0.85rem`},children:`Inspect all indexed Git repositories, monitored local workspaces, and uploaded local storage documents.`})]}),(0,b.jsx)(`div`,{style:{display:`flex`,gap:`10px`},children:(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>y(),disabled:r,title:`Refresh catalog`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-arrows-rotate ${r?`fa-spin`:``}`}),` Refresh`]})})]}),(0,b.jsxs)(`div`,{className:`stats-grid`,style:{marginBottom:`20px`},children:[(0,b.jsxs)(`div`,{className:`stat-card`,children:[(0,b.jsx)(`div`,{className:`stat-icon`,children:(0,b.jsx)(`i`,{className:`fa-brands fa-github`})}),(0,b.jsxs)(`div`,{className:`stat-info`,children:[(0,b.jsx)(`span`,{className:`stat-label`,children:`Git Repositories`}),(0,b.jsxs)(`span`,{className:`stat-value`,children:[E.length,` `,(0,b.jsxs)(`small`,{style:{fontSize:`0.75rem`,fontWeight:`normal`,color:`var(--text-muted)`},children:[`(`,ee,` files)`]})]})]})]}),(0,b.jsxs)(`div`,{className:`stat-card`,children:[(0,b.jsx)(`div`,{className:`stat-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`})}),(0,b.jsxs)(`div`,{className:`stat-info`,children:[(0,b.jsx)(`span`,{className:`stat-label`,children:`Monitored Paths`}),(0,b.jsxs)(`span`,{className:`stat-value`,children:[D.length,` `,(0,b.jsxs)(`small`,{style:{fontSize:`0.75rem`,fontWeight:`normal`,color:`var(--text-muted)`},children:[`(`,A,` files)`]})]})]})]}),(0,b.jsxs)(`div`,{className:`stat-card`,children:[(0,b.jsx)(`div`,{className:`stat-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`})}),(0,b.jsxs)(`div`,{className:`stat-info`,children:[(0,b.jsx)(`span`,{className:`stat-label`,children:`Local Storage`}),(0,b.jsxs)(`span`,{className:`stat-value`,children:[te,` `,(0,b.jsx)(`small`,{style:{fontSize:`0.75rem`,fontWeight:`normal`,color:`var(--text-muted)`},children:`files`})]})]})]}),(0,b.jsxs)(`div`,{className:`stat-card`,children:[(0,b.jsx)(`div`,{className:`stat-icon`,children:(0,b.jsx)(`i`,{className:`fa-solid fa-database`})}),(0,b.jsxs)(`div`,{className:`stat-info`,children:[(0,b.jsx)(`span`,{className:`stat-label`,children:`Total Cataloged Files`}),(0,b.jsx)(`span`,{className:`stat-value`,children:ne})]})]})]}),(0,b.jsxs)(`div`,{style:{background:`rgba(0, 0, 0, 0.2)`,padding:`16px`,borderRadius:`10px`,border:`1px solid var(--border-card)`,marginBottom:`20px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,flexWrap:`wrap`,gap:`12px`,marginBottom:`14px`},children:[(0,b.jsxs)(`div`,{className:`log-filter-pills`,role:`group`,"aria-label":`Source Type Filters`,children:[(0,b.jsxs)(`button`,{className:`log-filter-btn ${a===`all`?`active`:``}`,onClick:()=>C(`all`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-layer-group`}),` All Sources`]}),(0,b.jsxs)(`button`,{className:`log-filter-btn ${a===`git`?`active`:``}`,onClick:()=>C(`git`),children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github`}),` Git Repositories`]}),(0,b.jsxs)(`button`,{className:`log-filter-btn ${a===`monitored_path`?`active`:``}`,onClick:()=>C(`monitored_path`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`}),` Monitored Paths`]}),(0,b.jsxs)(`button`,{className:`log-filter-btn ${a===`local_storage`?`active`:``}`,onClick:()=>C(`local_storage`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`}),` Local Storage`]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`6px`},role:`group`,"aria-label":`Detail Level Switch`,children:[(0,b.jsxs)(`button`,{className:`btn ${s===`summary`?`btn-primary`:`btn-secondary`}`,style:{padding:`5px 12px`,fontSize:`0.8rem`},onClick:()=>w(`summary`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-list`}),` Summary`]}),(0,b.jsxs)(`button`,{className:`btn ${s===`detailed`?`btn-primary`:`btn-secondary`}`,style:{padding:`5px 12px`,fontSize:`0.8rem`},onClick:()=>w(`detailed`),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-network-wired`}),` Detailed File Tree`]})]})]}),(0,b.jsxs)(`form`,{onSubmit:y,children:[(0,b.jsxs)(`div`,{className:`form-row-3col`,style:{alignItems:`flex-end`},children:[(0,b.jsxs)(`div`,{className:`form-group`,style:{margin:0},children:[(0,b.jsx)(`label`,{htmlFor:`catalog-repo-filter`,style:{fontSize:`0.8rem`},children:`Repository / Alias`}),(0,b.jsx)(`input`,{id:`catalog-repo-filter`,type:`text`,placeholder:`Filter by repo name...`,value:l,onChange:e=>u(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{margin:0},children:[(0,b.jsx)(`label`,{htmlFor:`catalog-prefix-filter`,style:{fontSize:`0.8rem`},children:`Path Prefix`}),(0,b.jsx)(`input`,{id:`catalog-prefix-filter`,type:`text`,placeholder:`e.g. app/api or docs/`,value:d,onChange:e=>f(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`form-group`,style:{margin:0},children:[(0,b.jsx)(`label`,{htmlFor:`catalog-ext-filter`,style:{fontSize:`0.8rem`},children:`File Extension`}),(0,b.jsx)(`input`,{id:`catalog-ext-filter`,type:`text`,placeholder:`e.g. .md, .py, .ts`,value:p,onChange:e=>m(e.target.value)})]})]}),(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,gap:`8px`,marginTop:`12px`},children:[(0,b.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,style:{padding:`6px 12px`,fontSize:`0.85rem`},onClick:x,children:`Clear`}),(0,b.jsxs)(`button`,{type:`submit`,className:`btn btn-primary`,style:{padding:`6px 14px`,fontSize:`0.85rem`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-filter`}),` Apply`]})]})]})]}),(a===`all`||a===`git`)&&(0,b.jsxs)(`div`,{style:{marginBottom:`28px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`1.05rem`,marginBottom:`10px`,display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github`,style:{color:`var(--primary)`}}),` Git Repositories`,(0,b.jsx)(`span`,{className:`badge badge-primary`,children:E.length})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Name`}),(0,b.jsx)(`th`,{children:`Branch / Commit`}),(0,b.jsx)(`th`,{children:`Status`}),(0,b.jsx)(`th`,{children:`Files`}),(0,b.jsx)(`th`,{children:`Provider`}),(0,b.jsx)(`th`,{children:`URL`})]})}),(0,b.jsx)(`tbody`,{children:E.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:6,className:`empty-state`,children:`No Git repositories match criteria.`})}):E.map(e=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.name})}),(0,b.jsxs)(`td`,{children:[(0,b.jsx)(`code`,{children:e.branch}),e.commit_sha&&(0,b.jsxs)(`span`,{className:`text-muted`,style:{marginLeft:`6px`,fontSize:`0.8rem`},children:[`@`,e.commit_sha.substring(0,7)]})]}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge ${e.status===`synced`?`badge-success`:e.status===`syncing`?`badge-warning`:`badge-danger`}`,children:e.status})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.file_count??0})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.provider||`git`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.82rem`,wordBreak:`break-all`},children:e.url})})]},e.id))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:E.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No Git repositories match criteria.`}):E.map(e=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsx)(`strong`,{children:e.name}),(0,b.jsx)(`span`,{className:`badge ${e.status===`synced`?`badge-success`:`badge-warning`}`,children:e.status})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Branch: `}),(0,b.jsx)(`code`,{children:e.branch})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Files: `}),(0,b.jsx)(`strong`,{children:e.file_count??0})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`URL: `}),(0,b.jsx)(`span`,{style:{wordBreak:`break-all`},children:e.url})]})]})]},`gm-${e.id}`))})]}),(a===`all`||a===`monitored_path`)&&(0,b.jsxs)(`div`,{style:{marginBottom:`28px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`1.05rem`,marginBottom:`10px`,display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`,style:{color:`#fbbf24`}}),` Monitored Local Paths`,(0,b.jsx)(`span`,{className:`badge badge-primary`,children:D.length})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Path`}),(0,b.jsx)(`th`,{children:`Repo Alias`}),(0,b.jsx)(`th`,{children:`Category`}),(0,b.jsx)(`th`,{children:`Files Indexed`})]})}),(0,b.jsx)(`tbody`,{children:D.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:4,className:`empty-state`,children:`No monitored paths match criteria.`})}):D.map((e,t)=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{children:e.path})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.repo})}),(0,b.jsx)(`td`,{children:e.category?(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.category}):(0,b.jsx)(`span`,{className:`text-muted`,children:`-`})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.file_count??0})})]},`${e.path}-${t}`))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:D.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No monitored paths match criteria.`}):D.map((e,t)=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsx)(`strong`,{children:e.repo}),(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[e.file_count??0,` files`]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{children:e.path})]}),e.category&&(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Category: `}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.category})]})]})]},`mpm-${t}`))})]}),(a===`all`||a===`local_storage`)&&O&&(0,b.jsxs)(`div`,{style:{marginBottom:`28px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`1.05rem`,marginBottom:`10px`,display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`,style:{color:`var(--accent)`}}),` Local Storage`,(0,b.jsxs)(`span`,{className:`badge badge-primary`,children:[O.file_count,` files`]})]}),(0,b.jsxs)(`div`,{style:{background:`rgba(255, 255, 255, 0.02)`,padding:`16px`,borderRadius:`8px`,border:`1px solid var(--border-card)`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,gap:`20px`,flexWrap:`wrap`,marginBottom:`12px`},children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.85rem`},children:`Storage Root: `}),(0,b.jsx)(`code`,{children:O.root_path})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,style:{fontSize:`0.85rem`},children:`Total Files: `}),(0,b.jsx)(`strong`,{children:O.file_count})]})]}),O.tree&&(0,b.jsxs)(`div`,{style:{fontSize:`0.85rem`,color:`var(--text-muted)`},children:[`Top-level Subfolders: `,(0,b.jsx)(`strong`,{children:O.tree.directories?.length||0}),` • Top-level Files: `,(0,b.jsx)(`strong`,{children:O.tree.files?.length||0})]})]})]}),s===`detailed`&&(0,b.jsxs)(`div`,{style:{marginTop:`20px`},children:[(0,b.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`center`,flexWrap:`wrap`,gap:`10px`,marginBottom:`12px`},children:[(0,b.jsxs)(`h3`,{style:{fontSize:`1.05rem`,margin:0,display:`flex`,alignItems:`center`,gap:`8px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-file-code`,style:{color:`var(--primary)`}}),` Ingested Files Details`,(0,b.jsx)(`span`,{className:`badge badge-primary`,children:k.length})]}),(0,b.jsxs)(`div`,{className:`log-search-wrapper`,style:{maxWidth:`320px`},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass search-icon`}),(0,b.jsx)(`input`,{type:`text`,className:`log-search-input`,placeholder:`Search in loaded files...`,value:h,onChange:e=>g(e.target.value)}),h&&(0,b.jsx)(`button`,{className:`clear-search-btn`,onClick:()=>g(``),children:`×`})]})]}),(0,b.jsx)(`div`,{className:`table-container desktop-table-view`,children:(0,b.jsxs)(`table`,{children:[(0,b.jsx)(`thead`,{children:(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`th`,{children:`Filepath`}),(0,b.jsx)(`th`,{children:`Repository`}),(0,b.jsx)(`th`,{children:`Type`}),(0,b.jsx)(`th`,{children:`Language`}),(0,b.jsx)(`th`,{children:`Last Modified`})]})}),(0,b.jsx)(`tbody`,{children:k.length===0?(0,b.jsx)(`tr`,{children:(0,b.jsx)(`td`,{colSpan:5,className:`empty-state`,children:`No detailed files match current search or filters.`})}):k.map((e,t)=>(0,b.jsxs)(`tr`,{children:[(0,b.jsx)(`td`,{children:(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.filepath})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`strong`,{children:e.repo})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.doc_type})}),(0,b.jsx)(`td`,{children:(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.language||`text`})}),(0,b.jsx)(`td`,{style:{fontSize:`0.85rem`},children:T(e.mtime)})]},`${e.filepath}-${t}`))})]})}),(0,b.jsx)(`div`,{className:`mobile-card-list`,children:k.length===0?(0,b.jsx)(`div`,{className:`empty-state`,children:`No detailed files match current search or filters.`}):k.map((e,t)=>(0,b.jsxs)(`div`,{className:`data-mobile-card`,children:[(0,b.jsxs)(`div`,{className:`data-mobile-card-header`,children:[(0,b.jsx)(`strong`,{children:e.repo}),(0,b.jsx)(`span`,{className:`badge badge-accent`,children:e.language||`text`})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-body`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Path: `}),(0,b.jsx)(`code`,{style:{wordBreak:`break-all`},children:e.filepath})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Type: `}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:e.doc_type})]}),(0,b.jsxs)(`div`,{children:[(0,b.jsx)(`span`,{className:`text-muted`,children:`Modified: `}),(0,b.jsx)(`span`,{children:T(e.mtime)})]})]})]},`dfm-${t}`))})]})]})})}function we(){let[e,t]=(0,_.useState)(`overview`),[n,r]=(0,_.useState)(!1),[i,a]=(0,_.useState)(null),o=async()=>{try{let e=await fetch(`/admin/api/stats`);if(!e.ok)return;let t=await e.json();a(t)}catch(e){console.error(`Error loading stats:`,e)}};return(0,_.useEffect)(()=>{o();let e=setInterval(o,8e3);return()=>clearInterval(e)},[]),(0,b.jsx)(b.Fragment,{children:(0,b.jsxs)(`div`,{className:`dashboard-container`,children:[(0,b.jsxs)(`header`,{className:`dashboard-header`,children:[(0,b.jsxs)(`div`,{className:`header-top-row`,children:[(0,b.jsxs)(`div`,{className:`header-logo`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-layer-group logo-icon`}),(0,b.jsxs)(`div`,{className:`header-title`,children:[(0,b.jsx)(`h1`,{children:`ContextCortex`}),(0,b.jsx)(`span`,{className:`badge badge-primary`,children:`v2.16.0`})]})]}),(0,b.jsx)(`button`,{className:`menu-toggle-btn`,"aria-label":`Toggle navigation`,onClick:()=>r(!n),children:(0,b.jsx)(`i`,{className:`fa-solid ${n?`fa-xmark`:`fa-bars`}`})})]}),(0,b.jsxs)(`div`,{className:`header-status`,children:[(0,b.jsxs)(`div`,{className:`status-item`,children:[(0,b.jsx)(`span`,{className:`label`,children:`Engine State`}),(0,b.jsx)(`span`,{className:`value`,children:i?.is_indexing?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`span`,{className:`indicator indexing`}),` Syncing...`]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(`span`,{className:`indicator online`}),` Idle`]})})]}),(0,b.jsxs)(`div`,{className:`status-item`,children:[(0,b.jsx)(`span`,{className:`label`,children:`Vector Backend`}),(0,b.jsxs)(`span`,{className:`value`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-database`,style:{marginRight:`5px`}}),(0,b.jsxs)(`span`,{children:[i?.vector_store_provider===`chroma`?`ChromaDB`:`Qdrant`,` (`,(i?.vector_store_mode||`embedded`)===`embedded`?`Embedded`:`Remote`,`)`]}),i?.vector_db_status&&(0,b.jsx)(`span`,{className:`badge ${i.vector_db_status===`Healthy`?`badge-success`:`badge-danger`}`,style:{marginLeft:`6px`,fontSize:`0.75rem`,padding:`2px 6px`},"data-testid":`vector-db-status-badge`,children:i.vector_db_status})]})]}),(0,b.jsxs)(`div`,{className:`status-item`,children:[(0,b.jsx)(`span`,{className:`label`,children:`Collection`}),(0,b.jsx)(`span`,{className:`value code`,children:i?.vector_store_collection||`knowledge_rag_v1`})]})]})]}),(0,b.jsxs)(`nav`,{className:`dashboard-nav ${n?`drawer-open`:``}`,children:[(0,b.jsxs)(`button`,{className:`nav-tab ${e===`overview`?`active`:``}`,onClick:()=>{t(`overview`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-chart-pie`}),` Overview`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`navigator`||e===`topology`?`active`:``}`,onClick:()=>{t(`navigator`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-code-fork`}),` Navigator`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`git-repos`?`active`:``}`,onClick:()=>{t(`git-repos`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-brands fa-github`}),` Git Repositories`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`local-paths`?`active`:``}`,onClick:()=>{t(`local-paths`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-folder-tree`}),` Local Paths`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`local-storage`?`active`:``}`,onClick:()=>{t(`local-storage`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-hard-drive`}),` Local Storage`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`ingestion-catalog`?`active`:``}`,onClick:()=>{t(`ingestion-catalog`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-book-bookmark`}),` Ingestion Catalog`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`search-inspector`?`active`:``}`,onClick:()=>{t(`search-inspector`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-magnifying-glass`}),` Search & Inspector`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`settings`?`active`:``}`,onClick:()=>{t(`settings`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-gear`}),` Settings`]}),(0,b.jsxs)(`button`,{className:`nav-tab ${e===`diagnostics`?`active`:``}`,onClick:()=>{t(`diagnostics`),r(!1)},children:[(0,b.jsx)(`i`,{className:`fa-solid fa-terminal`}),` Diagnostics & Logs`]})]}),(0,b.jsxs)(`main`,{className:`dashboard-main`,children:[e===`overview`&&(0,b.jsx)(T,{stats:i,refreshStats:o}),(e===`navigator`||e===`topology`)&&(0,b.jsx)(be,{}),e===`git-repos`&&(0,b.jsx)(te,{refreshStats:o}),e===`local-paths`&&(0,b.jsx)(ne,{refreshStats:o}),e===`local-storage`&&(0,b.jsx)(Se,{refreshStats:o}),e===`ingestion-catalog`&&(0,b.jsx)(Ce,{}),e===`search-inspector`&&(0,b.jsx)(re,{}),e===`settings`&&(0,b.jsx)(le,{stats:i,refreshStats:o}),e===`diagnostics`&&(0,b.jsx)(ue,{})]}),(0,b.jsx)(`footer`,{className:`dashboard-footer`,children:(0,b.jsx)(`p`,{children:`ContextCortex MCP • Universal Code & Knowledge RAG • 2026`})})]})})}(0,v.createRoot)(document.getElementById(`root`)).render((0,b.jsx)(_.StrictMode,{children:(0,b.jsx)(w,{children:(0,b.jsx)(we,{})})})); \ No newline at end of file diff --git a/frontend/dist/assets/index-DImjk3Jh.css b/frontend/dist/assets/index-aygUsQiL.css similarity index 66% rename from frontend/dist/assets/index-DImjk3Jh.css rename to frontend/dist/assets/index-aygUsQiL.css index 879c75f..002f141 100644 --- a/frontend/dist/assets/index-DImjk3Jh.css +++ b/frontend/dist/assets/index-aygUsQiL.css @@ -1 +1 @@ -:root,[data-theme=deep-ocean]{--bg-base:#07181b;--bg-card:#0d2c2f;--border-card:#15474d;--primary:#0891b2;--primary-hover:#0e7490;--accent:#14b8a6;--accent-light:#2dd4bf;--danger:#ef4444;--danger-hover:#dc2626;--text:#f8fafc;--text-muted:#94a3b8;--code-bg:#00000059;--radius:10px;--font-family-base:"Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-family-heading:"Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-family-mono:"JetBrains Mono", monospace;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-size-xs:.75rem;--font-size-sm:.85rem;--font-size-base:1rem;--font-size-lg:1.15rem;--font-size-xl:1.35rem;--font-size-2xl:1.65rem}[data-theme=midnight-blue]{--bg-base:#0a0f1d;--bg-card:#121a2fa6;--border-card:#ffffff14;--primary:#3b82f6;--primary-hover:#2563eb;--accent:#14b8a6;--accent-light:#2dd4bf;--danger:#ef4444;--danger-hover:#dc2626;--text:#f8fafc;--text-muted:#94a3b8;--code-bg:#00000059;--radius:12px}[data-theme=lavender-haze],[data-theme=aqua-breeze],[data-theme=arctic-frost]{--bg-base:#f5f3ff;--bg-card:#faf8ff;--border-card:#ddd6fe;--primary:#7c3aed;--primary-hover:#6d28d9;--accent:#ec4899;--accent-light:#f472b6;--danger:#dc2626;--danger-hover:#b91c1c;--text:#1e1035;--text-muted:#6b5b82;--code-bg:#7c3aed14;--radius:10px}[data-theme=amber-warmth],[data-theme=azure-daylight],[data-theme=solar-daybreak]{--bg-base:#fdf8f4;--bg-card:#fff;--border-card:#fed7aa;--primary:#ea580c;--primary-hover:#c2410c;--accent:#d97706;--accent-light:#f59e0b;--danger:#dc2626;--danger-hover:#b91c1c;--text:#291508;--text-muted:#7c5e4a;--code-bg:#ea580c14;--radius:12px}*{box-sizing:border-box;margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-heading)}body{font-family:var(--font-family-base);background-color:var(--bg-base);color:var(--text);min-height:100vh;display:block;position:relative;overflow:hidden scroll}.dashboard-container{z-index:1;flex-direction:column;gap:16px;width:100%;min-width:0;max-width:1400px;margin:0 auto;padding:20px 32px;display:flex}.dashboard-header{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);justify-content:space-between;align-items:center;padding:14px 20px;display:flex}.header-top-row{align-items:center;display:flex}.menu-toggle-btn{border:1px solid var(--border-card);color:var(--text);cursor:pointer;background:#ffffff14;border-radius:8px;padding:8px 12px;font-size:1.25rem;transition:all .2s;display:none}.menu-toggle-btn:hover{background:#ffffff26}.header-logo{align-items:center;gap:16px;display:flex}.logo-icon{color:var(--accent-light);font-size:2rem}.header-title h1{letter-spacing:-.5px;font-size:1.4rem;font-weight:700}.header-status{align-items:center;gap:20px;display:flex}.status-item{flex-direction:column;align-items:flex-end;display:flex}.status-item .label{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;font-size:.75rem}.status-item .value{align-items:center;gap:6px;font-size:.95rem;font-weight:600;display:flex}.indicator{border-radius:50%;width:8px;height:8px;display:inline-block}.indicator.online{background:#10b981;box-shadow:0 0 10px #10b981}.indicator.indexing{background:#f59e0b;animation:1.5s infinite pulse;box-shadow:0 0 10px #f59e0b}@keyframes pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(1.2)}to{opacity:1;transform:scale(1)}}.dashboard-nav{border-bottom:1px solid var(--border-card);flex-wrap:wrap;gap:10px;padding-bottom:8px;display:flex}.nav-tab{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:10px 18px;font-family:inherit;font-size:.95rem;font-weight:600;transition:all .2s;display:flex}.nav-tab:hover{color:var(--text);background:#ffffff0d}.nav-tab.active{color:#fff;background:color-mix(in srgb, var(--primary) 25%, transparent);border:1px solid color-mix(in srgb, var(--primary) 50%, transparent)}.glass-card{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);width:100%;min-width:0;padding:16px 20px}.glass-card h2{align-items:center;gap:8px;margin-bottom:12px;font-size:1.05rem;font-weight:600;display:flex}.tab-content{width:100%;min-width:0;display:none}.tab-content.active{flex-direction:column;gap:16px;width:100%;min-width:0;display:flex}.overview-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:12px;display:grid}.stat-metric{align-items:center;gap:12px;padding:14px 16px;display:flex}.metric-icon{color:var(--accent-light);background:#14b8a626;border-radius:10px;justify-content:center;align-items:center;width:40px;height:40px;font-size:1.4rem;display:flex}.metric-info{flex-direction:column;gap:4px;display:flex}.metric-info .stat-number{font-size:var(--font-size-xl);font-weight:var(--font-weight-extrabold);font-family:var(--font-family-mono);color:var(--text);line-height:1.1}.metric-info .stat-label{color:var(--text-muted);font-size:.85rem}.two-col-layout{grid-template-columns:1fr 1fr;gap:20px;display:grid}@media (width<=900px){.two-col-layout{grid-template-columns:1fr}}.specs-list{flex-direction:column;gap:12px;margin-top:12px;display:flex}.spec-row{border-bottom:1px solid var(--border-card);justify-content:space-between;align-items:center;gap:12px;padding:10px 0;font-size:.9rem;display:flex}.spec-row span:first-child{color:var(--text-muted);flex-shrink:0;font-weight:500}code,.code{background:var(--code-bg);vertical-align:baseline;word-break:break-word;overflow-wrap:break-word;border-radius:4px;max-width:100%;padding:1px 5px;font-family:JetBrains Mono,Fira Code,monospace;font-size:.85em;line-height:1.25;display:inline-block}.spec-row span:last-child,.spec-row code{text-align:right;word-break:break-word;max-width:100%}@media (width<=576px){.spec-row{flex-direction:column;align-items:flex-start;gap:6px}.spec-row span:last-child,.spec-row code{text-align:left}.stat-metric{padding:16px}.path-input-row{flex-direction:column}.browser-breadcrumbs{word-break:break-all}}.tag-cloud{flex-wrap:wrap;gap:8px;max-height:250px;margin-top:12px;display:flex;overflow-y:auto}.topic-tag{background:color-mix(in srgb, var(--accent) 12%, transparent);border:1px solid color-mix(in srgb, var(--accent) 25%, transparent);color:var(--accent);font-size:var(--font-size-xs);font-family:var(--font-family-mono);border-radius:6px;padding:4px 10px}.badge{white-space:nowrap;border-radius:6px;align-items:center;gap:6px;max-width:100%;padding:3px 8px;font-size:.75rem;font-weight:600;display:inline-flex}.badge-primary{background:color-mix(in srgb, var(--primary) 15%, transparent);color:var(--primary);border:1px solid color-mix(in srgb, var(--primary) 30%, transparent)}.badge-accent{background:color-mix(in srgb, var(--accent) 15%, transparent);color:var(--accent);border:1px solid color-mix(in srgb, var(--accent) 30%, transparent)}.badge-success{color:#6ee7b7;background:#10b98133;border:1px solid #10b9814d}.badge-warning{color:#fcd34d;background:#f59e0b33;border:1px solid #f59e0b4d}.badge-danger{color:#fca5a5;background:#ef444433;border:1px solid #ef44444d}code,.code{font-family:var(--font-family-mono);background:var(--code-bg);border-radius:4px;padding:2px 6px;font-size:.85rem}.desktop-table-view{display:block}.mobile-card-list{flex-direction:column;gap:14px;display:none}.data-mobile-card{border:1px solid var(--border-card);background:#ffffff06;border-radius:10px;flex-direction:column;gap:12px;padding:16px;display:flex}.data-mobile-card-header{justify-content:space-between;align-items:center;gap:10px;display:flex}.data-mobile-card-body{flex-direction:column;gap:8px;font-size:.85rem;display:flex}.data-mobile-card-actions{border-top:1px solid #ffffff0f;flex-wrap:wrap;gap:8px;margin-top:4px;padding-top:10px;display:flex}.data-mobile-card-actions .btn{flex:calc(50% - 8px);justify-content:center;min-width:0}.card-header-btn{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px;display:flex}.card-header-btn>div{flex:1 1 0;min-width:0;max-width:100%}.card-header-btn p{overflow-wrap:anywhere;word-break:break-word;margin:0}.table-container{-webkit-overflow-scrolling:touch;max-width:100%;margin-top:10px;overflow-x:auto}table{border-collapse:collapse;table-layout:auto;width:100%;font-size:.9rem}th{text-align:left;color:var(--text-muted);border-bottom:1px solid var(--border-card);white-space:nowrap;padding:12px 14px;font-weight:600}td{border-bottom:1px solid var(--border-card);color:var(--text);padding:14px}td a.repo-url-link,td a[href*=http]{text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:220px;display:inline-block;overflow:hidden}tr:hover td{background:color-mix(in srgb, var(--text) 3%, transparent)}.empty-state{text-align:center;color:var(--text-muted);padding:40px!important}.btn{cursor:pointer;border:none;border-radius:8px;align-items:center;gap:8px;padding:8px 16px;font-family:inherit;font-size:.9rem;font-weight:600;transition:all .2s;display:inline-flex}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-hover)}.btn-secondary{background:color-mix(in srgb, var(--text) 10%, transparent);color:var(--text);border:1px solid var(--border-card)}.btn-secondary:hover{background:color-mix(in srgb, var(--text) 16%, transparent)}.btn-icon{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:6px;font-size:.9rem;transition:all .2s}.btn-icon:hover{color:var(--text);background:color-mix(in srgb, var(--text) 10%, transparent)}.btn-delete:hover{color:var(--danger)}.form-group{flex-direction:column;gap:6px;margin-bottom:14px;display:flex}.form-group label{color:var(--text-muted);font-size:.85rem;font-weight:600}.form-row{box-sizing:border-box;gap:14px;width:100%;display:flex}.form-row>.form-group{flex:1;min-width:0}.form-row-3col{box-sizing:border-box;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px;width:100%;display:grid}.form-row-3col>.form-group{min-width:0}input[type=text],input[type=url],input[type=password],input[type=number],select,textarea{background:var(--code-bg);border:1px solid var(--border-card);color:var(--text);box-sizing:border-box;border-radius:8px;outline:none;width:100%;min-width:0;max-width:100%;padding:10px 14px;font-family:inherit;font-size:.9rem;transition:border-color .2s}input:focus,select:focus,textarea:focus{border-color:var(--primary)}.path-input-row{gap:8px;display:flex}.path-input-row input{flex:1}.modal-backdrop{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:1000;background:#000000b3;justify-content:center;align-items:center;width:100%;max-width:100vw;height:100%;display:flex;position:fixed;inset:0}.modal-card{background:var(--bg-card);border:1px solid var(--border-card);width:90%;max-width:550px}.modal-header{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.modal-header h2{margin-bottom:0}.btn-close{color:var(--text-muted);cursor:pointer;background:0 0;border:none;font-size:1.5rem}.modal-footer{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}.browser-body{margin:16px 0}.browser-breadcrumbs{background:#0000004d;border-radius:6px;margin-bottom:12px;padding:8px 12px;font-size:.85rem}.browser-list-container{background:#0003;border:1px solid #ffffff14;border-radius:6px;max-height:300px;overflow-y:auto}.browser-list{list-style:none}.browser-item{cursor:pointer;border-bottom:1px solid #ffffff0a;align-items:center;gap:10px;padding:8px 12px;font-size:.9rem;display:flex}.browser-item:hover{background:#ffffff0f}.search-hit-card{background:#0000004d;border:1px solid #ffffff14;border-radius:8px;margin-bottom:14px;padding:16px}.search-hit-header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px;display:flex}.search-hit-code{background:var(--code-bg);border:1px solid var(--border-card);font-family:var(--font-family-mono);white-space:pre-wrap;word-break:break-all;color:var(--text);border-radius:6px;padding:12px;font-size:.85rem;overflow-x:auto}.dashboard-footer{text-align:center;color:var(--text-muted);padding:20px 0;font-size:.8rem}@media (width<=768px){.menu-toggle-btn{justify-content:center;align-items:center;display:inline-flex}.dashboard-header{flex-direction:column;align-items:stretch;gap:14px;padding:16px;display:flex}.header-top-row{justify-content:space-between;align-items:center;width:100%;display:flex}.header-status{border-top:1px solid #ffffff0f;flex-wrap:wrap;justify-content:space-between;gap:8px 14px;width:100%;padding-top:10px;display:flex}.status-item{align-items:flex-start}.dashboard-nav{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);flex-direction:column;gap:6px;padding:12px;display:none}.dashboard-nav.drawer-open{animation:.25s ease-out forwards drawer-slide-down;display:flex}.nav-tab{justify-content:flex-start;width:100%;padding:12px 16px}.dashboard-container{box-sizing:border-box;max-width:100vw;padding:16px 12px}.vs-box{box-sizing:border-box;max-width:100%;padding:16px 12px}.glass-card{box-sizing:border-box;max-width:100%;padding:18px 14px}.desktop-table-view{display:none}.mobile-card-list{display:flex}.card-header-btn{flex-direction:column;align-items:stretch;gap:14px}.form-row,.form-row-3col{flex-direction:column;gap:12px;display:flex!important}.search-hit-header{flex-direction:column;align-items:flex-start;gap:8px}.search-form-btn-group{align-self:stretch!important}.search-form-btn-group .btn{justify-content:center;width:100%}.log-viewer-header{flex-direction:column;align-items:stretch;gap:12px}.log-viewer-actions{justify-content:space-between;width:100%}.log-toolbar{flex-direction:column;align-items:stretch;gap:12px}.log-filter-pills{-webkit-overflow-scrolling:touch;padding-bottom:4px;overflow-x:auto}.log-search-wrapper{width:100%;min-width:0;max-width:100%}.log-entry-main{flex-direction:column;align-items:flex-start;gap:4px}.sync-progress-container{min-width:unset;width:100%;max-width:100%}.sync-file-caption{max-width:100%}}@keyframes drawer-slide-down{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.toast-container{z-index:9999;pointer-events:none;flex-direction:column;gap:10px;display:flex;position:fixed;bottom:24px;right:24px}.toast{color:#fff;pointer-events:auto;background:#1e293b;border-left:4px solid #0000;border-radius:8px;align-items:center;gap:12px;max-width:400px;padding:14px 20px;font-size:.95rem;font-weight:500;animation:.3s ease-out forwards toast-slide-in;display:flex;box-shadow:0 10px 25px #00000080}@keyframes toast-slide-in{0%{opacity:0;transform:translate(50px)}to{opacity:1;transform:translate(0)}}.toast-success{border-left-color:#10b981}.toast-success i{color:#10b981}.toast-error{border-left-color:#ef4444}.toast-error i{color:#ef4444}.toast-info{border-left-color:#3b82f6}.toast-info i{color:#3b82f6}.toast-warning{border-left-color:#f59e0b}.toast-warning i{color:#f59e0b}.toast-message{flex:1;line-height:1.4}.toast-dismiss-btn{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;margin-left:6px;padding:4px;font-size:.85rem;transition:all .2s;display:inline-flex}.toast-dismiss-btn:hover{color:#fff;background:#ffffff1f}.log-viewer-container{flex-direction:column;gap:16px;display:flex}.log-viewer-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.log-viewer-actions{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.log-autoscroll-label{color:var(--text-muted);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;font-size:.85rem;font-weight:500;display:inline-flex}.log-autoscroll-label input[type=checkbox]{cursor:pointer;accent-color:var(--primary)}.log-toolbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;display:flex}.log-filter-pills{flex-wrap:wrap;gap:8px;display:flex}.log-filter-btn{color:var(--text-muted);cursor:pointer;background:#ffffff0d;border:1px solid #ffffff1a;border-radius:20px;align-items:center;gap:6px;padding:5px 12px;font-family:inherit;font-size:.8rem;font-weight:600;transition:all .2s;display:inline-flex}.log-filter-btn:hover{color:var(--text);background:#ffffff1a}.log-filter-btn.active{color:#93c5fd;background:#3b82f633;border-color:#3b82f666}.log-filter-btn.warning.active{color:#fcd34d;background:#f59e0b33;border-color:#f59e0b66}.log-filter-btn.error.active{color:#fca5a5;background:#ef444433;border-color:#ef444466}.log-filter-btn.debug.active{color:#cbd5e1;background:#94a3b833;border-color:#94a3b866}.pill-count{background:#0000004d;border-radius:10px;padding:1px 6px;font-size:.72rem}.log-search-wrapper{flex:1;align-items:center;min-width:280px;max-width:480px;display:flex;position:relative}.log-search-wrapper .search-icon{color:var(--text-muted);pointer-events:none;font-size:.85rem;position:absolute;left:12px}.log-search-input{background:var(--code-bg);border:1px solid var(--border-card);width:100%;color:var(--text);border-radius:8px;outline:none;padding:8px 32px 8px 34px;font-family:inherit;font-size:.85rem;transition:border-color .2s}.log-search-input:focus{border-color:var(--primary)}.clear-search-btn{color:var(--text-muted);cursor:pointer;background:0 0;border:none;padding:4px;font-size:.8rem;position:absolute;right:8px}.clear-search-btn:hover{color:var(--text)}.log-stream-container{background:var(--code-bg);border:1px solid var(--border-card);min-height:320px;max-height:580px;font-family:var(--font-family-mono);border-radius:8px;padding:12px;overflow-y:auto}.log-stream-list{flex-direction:column;gap:4px;display:flex}.log-entry{background:#ffffff04;border-left:3px solid #0000;border-radius:6px;padding:8px 12px;font-size:.82rem;line-height:1.5;transition:background .15s}.log-entry:hover{background:#ffffff09}.log-entry.log-level-info{border-left-color:#3b82f6}.log-entry.log-level-warning{background:#f59e0b08;border-left-color:#f59e0b}.log-entry.log-level-error{background:#ef44440f;border-left-color:#ef4444}.log-entry.log-level-debug{opacity:.85;border-left-color:#64748b}.log-entry-main{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.log-timestamp{color:var(--text-muted);white-space:nowrap;font-size:.78rem}.log-logger{color:var(--accent-light);font-size:.78rem}.log-message{color:#e2e8f0;word-break:break-word;flex:1}.btn-traceback-toggle{color:#fca5a5;cursor:pointer;background:#ef44441f;border:1px solid #ef44444d;border-radius:4px;align-items:center;gap:5px;padding:2px 8px;font-family:inherit;font-size:.75rem;transition:all .2s;display:inline-flex}.btn-traceback-toggle:hover{background:#ef444438}.log-traceback-wrapper{margin-top:8px;padding-left:8px}.traceback-box{background:color-mix(in srgb, var(--danger) 10%, transparent);border:1px solid color-mix(in srgb, var(--danger) 30%, transparent);color:var(--danger);font-family:var(--font-family-mono);white-space:pre-wrap;border-radius:6px;padding:10px 14px;font-size:.78rem;line-height:1.45;overflow-x:auto}.vs-config-layout{box-sizing:border-box;grid-template-columns:1fr 1fr;gap:20px;width:100%;min-width:0;margin-top:16px;display:grid}@media (width<=960px){.vs-config-layout{grid-template-columns:1fr}}.vs-box{border:1px solid var(--border-card);box-sizing:border-box;overflow-wrap:break-word;background:#ffffff05;border-radius:10px;width:100%;min-width:0;padding:20px}.vs-box h3{color:var(--text);align-items:center;gap:8px;margin-bottom:14px;font-size:1rem;font-weight:600;display:flex}.vs-feedback-banner{border-radius:8px;align-items:center;gap:10px;margin-bottom:16px;padding:10px 14px;font-size:.85rem;line-height:1.4;display:flex}.feedback-success{color:#6ee7b7;background:#10b9811f;border:1px solid #10b9814d}.feedback-error{color:#fca5a5;background:#ef44441f;border:1px solid #ef44444d}.theme-options-grid{grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;margin-top:12px;display:grid}.theme-card{background:var(--bg-card);border:1.5px solid var(--border-card);border-radius:var(--radius);cursor:pointer;text-align:left;flex-direction:column;gap:8px;padding:12px 14px;transition:all .2s;display:flex;position:relative}.theme-card:hover{border-color:color-mix(in srgb, var(--primary) 60%, transparent);transform:translateY(-2px)}.theme-card.active{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary), 0 4px 14px #00000040}.theme-card-header{justify-content:space-between;align-items:center;display:flex}.theme-card-title{color:var(--text);align-items:center;gap:6px;font-size:.92rem;font-weight:600;display:flex}.theme-card-desc{color:var(--text-muted);font-size:.76rem;line-height:1.35}.theme-swatches{align-items:center;gap:6px;padding-top:2px;display:flex}.theme-swatch{border:1px solid #fff3;border-radius:50%;width:18px;height:18px;box-shadow:0 1px 3px #00000040}.sync-drawer-backdrop{-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);z-index:1100;background:#000000a6;justify-content:flex-end;width:100vw;height:100vh;display:flex;position:fixed;top:0;left:0}.sync-drawer{background:var(--bg-card,#111827);border-left:1px solid var(--border-card);flex-direction:column;width:620px;max-width:95vw;height:100vh;animation:.25s cubic-bezier(.16,1,.3,1) slideInRight;display:flex;box-shadow:-10px 0 35px #0000008c}.sync-drawer-header{border-bottom:1px solid var(--border-card);background:#0003;justify-content:space-between;align-items:flex-start;gap:14px;padding:18px 22px;display:flex}.sync-drawer-title-group{flex-direction:column;flex:1;gap:4px;display:flex}.sync-drawer-body{flex-direction:column;flex:1;gap:18px;padding:20px 22px;display:flex;overflow-y:auto}.sync-progress-section{border:1px solid var(--border-card);background:#0003;border-radius:8px;padding:12px 14px}.sync-progress-bar-container{background:#ffffff14;border-radius:4px;width:100%;height:8px;overflow:hidden}.sync-progress-bar-fill{border-radius:4px;height:100%;transition:width .3s,background .3s}.sync-progress-bar-fill.fill-active{background:var(--primary)}.sync-progress-bar-fill.fill-success{background:#10b981}.sync-progress-bar-fill.fill-error{background:#ef4444}.sync-progress-container{box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none;flex-direction:column;gap:5px;width:100%;min-width:140px;max-width:100%;transition:opacity .2s,transform .15s;display:flex}.sync-progress-container:hover{opacity:.92}.sync-progress-container:focus-visible{outline:2px solid var(--primary);border-radius:6px}.progress-pill{white-space:nowrap;box-sizing:border-box;border-radius:12px;align-items:center;gap:6px;min-width:0;max-width:100%;padding:3px 8px;font-size:.76rem;font-weight:600;display:inline-flex}.progress-pill>span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.sync-progress-bar-wrapper{background:#ffffff14;border-radius:3px;width:100%;height:6px;overflow:hidden}.sync-file-caption{color:var(--text-muted);font-size:.72rem;font-family:var(--font-family-mono);text-overflow:ellipsis;white-space:nowrap;align-items:center;min-width:0;max-width:100%;display:flex;overflow:hidden}.sync-file-caption code{text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:1px 4px;font-size:.72rem;overflow:hidden}.sync-stepper-container{border:1px solid var(--border-card);background:#0003;border-radius:8px;padding:14px 16px}.sync-stepper-list{flex-direction:column;gap:10px;display:flex}.sync-stepper-item{border-radius:6px;align-items:flex-start;gap:12px;padding:8px 10px;transition:background .15s;display:flex}.sync-stepper-item.item-active{background:#f59e0b1a;border:1px solid #f59e0b40}.sync-stepper-item.item-completed{background:#10b9810d}.sync-stepper-item.item-error{background:#ef44441a;border:1px solid #ef444440}.sync-stepper-icon{justify-content:center;align-items:center;min-width:18px;margin-top:1px;font-size:1rem;display:flex}.sync-stepper-content{color:var(--text);flex-direction:column;flex:1;gap:2px;font-size:.88rem;display:flex}.sync-stepper-details{margin-top:4px;font-size:.8rem}.sync-current-file{font-family:var(--font-family-mono);color:var(--accent,#60a5fa);word-break:break-all;font-size:.78rem}.sync-terminal-section{background:#0d1117;border:1px solid #ffffff1f;border-radius:8px;flex-direction:column;flex:1;min-height:260px;display:flex;overflow:hidden}.sync-terminal-header{background:#161b22;border-bottom:1px solid #ffffff1a;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;padding:10px 14px;display:flex}.sync-terminal-actions{align-items:center;gap:12px;display:flex}.sync-autoscroll-toggle{color:var(--text-muted);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;font-size:.78rem;display:flex}.sync-terminal-search{background:#11161d;border-bottom:1px solid #ffffff14;align-items:center;gap:8px;padding:6px 14px;display:flex}.sync-terminal-body{font-family:var(--font-family-mono,monospace);color:#e6edf3;flex:1;min-height:180px;max-height:380px;padding:12px 14px;font-size:.8rem;overflow-y:auto}.sync-terminal-empty{color:#8b949e;flex-direction:column;justify-content:center;align-items:center;height:160px;font-size:.85rem;display:flex}.sync-terminal-lines{flex-direction:column;gap:4px;display:flex}.sync-terminal-line{word-break:break-all;align-items:flex-start;gap:8px;line-height:1.45;display:flex}.log-time{color:#8b949e;flex-shrink:0;font-size:.75rem}.log-badge{border-radius:3px;flex-shrink:0;padding:0 4px;font-size:.7rem;font-weight:700}.log-badge.level-info{color:#38bdf8;background:#38bdf833}.log-badge.level-warn{color:#fbbf24;background:#fbbf2433}.log-badge.level-error{color:#f87171;background:#f8717133}.log-msg{color:#e6edf3;flex:1}theme-editor-overlay{pointer-events:none!important}theme-editor-overlay button,theme-editor-overlay [role=button],theme-editor-overlay a{pointer-events:auto!important}.topology-container{flex-direction:column;gap:16px;display:flex;position:relative}.topology-toolbar{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:14px 18px;display:flex}.topology-toolbar-group{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.topology-select,.topology-input{border:1px solid var(--border-card);color:var(--text);background:#00000059;border-radius:8px;outline:none;padding:7px 12px;font-family:inherit;font-size:.85rem;transition:all .2s}.topology-select:focus,.topology-input:focus{border-color:var(--primary);box-shadow:0 0 0 2px #3b82f633}.topology-view-btn-group{border:1px solid var(--border-card);background:#00000059;border-radius:8px;display:inline-flex;overflow:hidden}.topology-view-btn{color:var(--text-muted);cursor:pointer;background:0 0;border:none;padding:6px 12px;font-size:.82rem;transition:all .15s}.topology-view-btn:hover{color:var(--text)}.topology-view-btn.active{background:var(--primary);color:#fff;font-weight:500}.topology-filter-chip{cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #0000;border-radius:6px;align-items:center;gap:6px;padding:4px 10px;font-size:.78rem;font-weight:500;transition:all .15s;display:inline-flex}.topology-filter-chip.chip-file{color:#38bdf8;background:#0ea5e926;border-color:#0ea5e94d}.topology-filter-chip.chip-class{color:#c084fc;background:#a855f726;border-color:#a855f74d}.topology-filter-chip.chip-function{color:#34d399;background:#10b98126;border-color:#10b9814d}.topology-filter-chip.chip-route{color:#fbbf24;background:#f59e0b26;border-color:#f59e0b4d}.topology-filter-chip.chip-orphan{color:#fb7185;background:#f43f5e26;border-color:#f43f5e4d}.topology-filter-chip.inactive{opacity:.4;filter:grayscale(80%);color:var(--text-muted);border-color:var(--border-card);background:#ffffff0d}.topology-canvas-wrapper{border:1px solid var(--border-card);border-radius:var(--radius);cursor:grab;background:radial-gradient(circle,#121a2fbf 0%,#0a0f1df2 100%);width:100%;height:640px;position:relative;overflow:hidden}.topology-canvas-wrapper:active{cursor:grabbing}.topology-canvas-wrapper svg{width:100%;height:100%;display:block}.topology-node{cursor:pointer;transition:filter .15s,transform .15s}.topology-node:hover{filter:drop-shadow(0 0 8px #3b82f6cc)}.topology-node.selected{filter:drop-shadow(0 0 12px #14b8a6f2)}.topology-node.highlighted{filter:drop-shadow(0 0 14px #f59e0b)}.topology-edge{transition:stroke-opacity .2s,stroke-width .2s}.topology-controls-panel{border:1px solid var(--border-card);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:10;background:#121a2fd9;border-radius:10px;align-items:center;gap:6px;padding:6px 10px;display:flex;position:absolute;bottom:20px;left:20px}.topology-btn-ctrl{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:6px 8px;font-size:.85rem;transition:all .15s}.topology-btn-ctrl:hover{color:var(--text);background:#ffffff1a}.topology-legend{border:1px solid var(--border-card);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:10;background:#121a2fd9;border-radius:10px;flex-wrap:wrap;gap:8px;padding:8px 12px;display:flex;position:absolute;top:20px;left:20px}.topology-minimap{border:1px solid var(--border-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:10;pointer-events:none;background:#0a0f1dd9;border-radius:8px;width:140px;height:95px;position:absolute;bottom:20px;right:20px;overflow:hidden}.topology-minimap svg{width:100%;height:100%}.topology-drawer{border-left:1px solid var(--border-card);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);z-index:50;background:#0f172af2;flex-direction:column;width:440px;max-width:90%;height:100%;animation:.25s cubic-bezier(.16,1,.3,1) slideInRight;display:flex;position:absolute;top:0;right:0;box-shadow:-10px 0 30px #00000080}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.topology-drawer-header{border-bottom:1px solid var(--border-card);justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.topology-drawer-body{flex-direction:column;flex:1;gap:16px;padding:20px;display:flex;overflow-y:auto}.topology-drawer-section{flex-direction:column;gap:8px;display:flex}.topology-drawer-section-title{text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);font-size:.8rem;font-weight:600}.topology-code-snippet{background:var(--code-bg);border:1px solid var(--border-card);font-family:var(--font-family-mono);color:var(--text);white-space:pre-wrap;border-radius:8px;max-height:220px;padding:12px;font-size:.78rem;line-height:1.45;overflow-x:auto}.topology-neighbor-list{flex-direction:column;gap:6px;display:flex}.topology-neighbor-item{border:1px solid var(--border-card);cursor:pointer;background:#ffffff08;border-radius:6px;justify-content:space-between;align-items:center;padding:8px 12px;font-size:.82rem;transition:all .15s;display:flex}.topology-neighbor-item:hover{border-color:var(--primary);background:#ffffff12}.topology-badge-type{text-transform:uppercase;border-radius:4px;align-items:center;gap:4px;padding:2px 8px;font-size:.72rem;font-weight:600;display:inline-flex}.badge-file{color:#38bdf8;background:#0ea5e933}.badge-class{color:#c084fc;background:#a855f733}.badge-function{color:#34d399;background:#10b98133}.badge-route{color:#fbbf24;background:#f59e0b33}.badge-module{color:#818cf8;background:#6366f133}.badge-edge-imports{color:#38bdf8;background:#0ea5e926}.badge-edge-calls{color:#34d399;background:#10b98126}.badge-edge-defines{color:#c084fc;background:#a855f726}.badge-edge-handles{color:#fbbf24;background:#f59e0b26}.badge-edge-routes-to{color:#fb7185;background:#f43f5e26}.badge-edge-doc-links-to{color:#a78bfa;background:#a78bfa26}.topology-search-results{border:1px solid var(--border-card);z-index:60;background:#0f172afa;border-radius:8px;max-height:240px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 10px 25px #00000080}.topology-search-item{cursor:pointer;border-bottom:1px solid #ffffff0d;justify-content:space-between;align-items:center;padding:8px 12px;font-size:.82rem;display:flex}.topology-search-item:hover{background:#3b82f626}.topology-empty-state{height:100%;color:var(--text-muted);flex-direction:column;justify-content:center;align-items:center;gap:12px;display:flex}.neighborhood-view{flex-direction:column;gap:14px;width:100%;display:flex;position:relative}.neighborhood-breadcrumbs{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;display:flex}.neighborhood-breadcrumbs-left{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.neighborhood-breadcrumbs-right{flex-wrap:wrap;align-items:center;gap:14px;display:flex}.neighborhood-focal-selector-wrap{align-items:center;gap:6px;display:inline-flex}.neighborhood-focal-label{color:var(--text-muted);white-space:nowrap;font-size:.78rem;font-weight:600}.neighborhood-focal-select{max-width:260px;padding:4px 10px;font-size:.82rem}.neighborhood-back-btn{align-items:center;gap:6px;padding:5px 10px;font-size:.8rem;display:inline-flex}.neighborhood-breadcrumb-trail{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.neighborhood-breadcrumb-sep{color:var(--text-muted);-webkit-user-select:none;user-select:none;margin:0 2px;font-size:.9rem}.neighborhood-breadcrumb-item{cursor:pointer;color:var(--text-muted);background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:6px;padding:3px 8px;font-size:.82rem;transition:all .15s;display:inline-flex}.neighborhood-breadcrumb-item:hover{color:var(--text);background:#ffffff0f}.neighborhood-breadcrumb-item.active{color:var(--text);background:#3b82f626;border-color:#3b82f64d;font-weight:600}.neighborhood-breadcrumb-badge{padding:1px 5px;font-size:.65rem}.neighborhood-breadcrumb-text{font-family:var(--font-family-mono,monospace)}.neighborhood-hop-selector{align-items:center;gap:8px;display:inline-flex}.neighborhood-hop-label{color:var(--text-muted);font-size:.8rem;font-weight:500}.neighborhood-panels{grid-template-columns:280px 1fr 280px;gap:14px;min-height:640px;display:grid}@media (width<=1100px){.neighborhood-panels{grid-template-columns:1fr}}.neighborhood-panel{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);flex-direction:column;max-height:640px;padding:14px;display:flex;overflow:hidden}.neighborhood-panel-header{border-bottom:1px solid var(--border-card);justify-content:space-between;align-items:center;margin-bottom:10px;padding-bottom:10px;display:flex}.neighborhood-panel-title{color:var(--text);align-items:center;gap:8px;font-size:.85rem;font-weight:600;display:flex}.neighborhood-panel-count{color:var(--text-muted);background:#ffffff14;border-radius:12px;padding:2px 8px;font-size:.75rem;font-weight:600}.neighborhood-panel-list{flex-direction:column;flex:1;gap:8px;padding-right:2px;display:flex;overflow-y:auto}.neighborhood-panel-item{border:1px solid var(--border-card);background:#ffffff05;border-radius:8px;flex-direction:column;gap:6px;padding:10px;transition:all .15s;display:flex}.neighborhood-panel-item:hover{background:#ffffff0d;border-color:#3b82f666}.neighborhood-panel-item-header{justify-content:space-between;align-items:center;gap:6px;display:flex}.neighborhood-panel-item-name{font-family:var(--font-family-mono,monospace);color:var(--text);word-break:break-all;font-size:.8rem}.neighborhood-panel-item-actions{gap:6px;margin-top:4px;display:flex}.neighborhood-panel-empty{text-align:center;color:var(--text-muted);padding:24px 8px;font-size:.8rem}.neighborhood-center{flex-direction:column;min-height:640px;display:flex;position:relative}.neighborhood-canvas-wrapper{border:1px solid var(--border-card);border-radius:var(--radius);background:radial-gradient(circle,#121a2fbf 0%,#0a0f1df2 100%);width:100%;height:100%;min-height:640px;position:relative;overflow:hidden}.neighborhood-svg{width:100%;height:100%;display:block}.neighborhood-orbital-ring{fill:none;stroke:#94a3b82e;stroke-dasharray:4 4;stroke-width:1.5px}.neighborhood-orbital-ring.ring-2{stroke:#94a3b81f}.neighborhood-orbital-label{fill:var(--text-muted);letter-spacing:.04em;pointer-events:none;text-transform:uppercase;font-size:10px}.neighborhood-edge-path{transition:stroke-opacity .2s,stroke-width .2s}.neighborhood-edge-path:hover{stroke-opacity:1;stroke-width:2.5px}.neighborhood-node-item{transition:transform .15s,filter .15s}.neighborhood-node-item:hover{filter:drop-shadow(0 0 10px #3b82f6d9)}.neighborhood-node-circle{transition:filter .15s,stroke-width .15s}.neighborhood-node-name{font-family:var(--font-family-mono,monospace);font-weight:500}.focal-pulse-ring{transform-origin:50%;animation:2.5s cubic-bezier(.4,0,.6,1) infinite pulse-ring}@keyframes pulse-ring{0%{opacity:.8;transform:scale(.95)}50%{opacity:.2;transform:scale(1.15)}to{opacity:.8;transform:scale(.95)}}.neighborhood-focal-node:hover .focal-body{filter:drop-shadow(0 0 12px #3b82f6e6)}.neighborhood-empty-state{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);height:480px}.topology-physics-panel,.topology-physics-popover{z-index:100;border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#0f172af2;flex-direction:column;gap:14px;width:calc(100% - 40px);min-width:320px;max-width:380px;padding:16px;animation:.2s cubic-bezier(.16,1,.3,1) fadeInPhysics;display:flex;position:absolute;top:70px;right:20px;box-shadow:0 12px 32px #0000008c}@keyframes fadeInPhysics{0%{opacity:0;transform:translateY(-8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.topology-physics-header{border-bottom:1px solid var(--border-card);justify-content:space-between;align-items:center;gap:8px;padding-bottom:10px;display:flex}.topology-physics-title-wrap{align-items:center;gap:8px;display:flex}.topology-physics-title{color:var(--text);margin:0;font-size:.9rem;font-weight:600}.topology-physics-body{flex-direction:column;gap:14px;display:flex}.topology-physics-section{flex-direction:column;gap:8px;display:flex}.topology-physics-section-title{text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);font-size:.75rem;font-weight:600}.topology-physics-presets-grid{grid-template-columns:repeat(2,1fr);gap:6px;display:grid}.topology-physics-preset-btn{border:1px solid var(--border-card);color:var(--text-muted);cursor:pointer;background:#ffffff0a;border-radius:6px;align-items:center;gap:6px;padding:6px 10px;font-size:.78rem;font-weight:500;transition:all .15s;display:flex}.topology-physics-preset-btn:hover{color:var(--text);border-color:var(--primary);background:#ffffff14}.topology-physics-preset-btn.active{color:#60a5fa;background:#3b82f633;border-color:#3b82f680;font-weight:600}.topology-physics-sliders-list{flex-direction:column;gap:10px;display:flex}.topology-physics-slider-row{flex-direction:column;gap:4px;display:flex}.topology-physics-slider-header{justify-content:space-between;align-items:center;font-size:.8rem;display:flex}.topology-physics-slider-label{color:var(--text);cursor:pointer;align-items:center;gap:4px;font-weight:500;display:inline-flex}.topology-physics-symbol{color:var(--text-muted);font-size:.72rem;font-family:var(--font-family-mono,monospace)}.topology-physics-value-chip{font-family:var(--font-family-mono,monospace);color:var(--primary,#38bdf8);background:#ffffff0f;border-radius:4px;padding:2px 6px;font-size:.75rem;font-weight:600}.topology-physics-range-input{appearance:none;cursor:pointer;background:#ffffff1f;border-radius:3px;outline:none;width:100%;height:6px;transition:background .15s}.topology-physics-range-input:hover{background:#ffffff2e}.topology-physics-range-input::-webkit-slider-thumb{appearance:none;background:var(--primary,#3b82f6);cursor:pointer;border-radius:50%;width:14px;height:14px;transition:transform .1s;box-shadow:0 0 6px #3b82f699}.topology-physics-range-input::-webkit-slider-thumb:hover{transform:scale(1.2)}.topology-physics-range-input::-moz-range-thumb{background:var(--primary,#3b82f6);cursor:pointer;border:none;border-radius:50%;width:14px;height:14px}.topology-physics-actions{gap:8px;margin-top:4px;display:flex}.topology-physics-action-btn{flex:1;justify-content:center;align-items:center;gap:6px;font-size:.8rem;display:inline-flex}.code-navigator-container,.code-navigator-container.density-balanced{--nav-item-height:28px;--nav-font-size:.84rem;--nav-item-padding:5px 10px;--nav-icon-size:15px;--nav-badge-font-size:.72rem;--nav-card-padding:12px 14px;--nav-header-padding:10px 14px}.code-navigator-container.density-compact{--nav-item-height:22px;--nav-font-size:.76rem;--nav-item-padding:2px 8px;--nav-icon-size:13px;--nav-badge-font-size:.66rem;--nav-card-padding:8px 10px;--nav-header-padding:6px 10px}.code-navigator-container.density-spacious{--nav-item-height:36px;--nav-font-size:.9rem;--nav-item-padding:8px 14px;--nav-icon-size:17px;--nav-badge-font-size:.78rem;--nav-card-padding:16px 18px;--nav-header-padding:14px 18px}.code-navigator-container{background-color:var(--bg-base,#07181b);height:100%;min-height:calc(100vh - 80px);color:var(--text,#f8fafc);font-family:var(--font-family-base,"Outfit", sans-serif);box-sizing:border-box;flex-direction:column;display:flex;overflow:hidden}.nav-toolbar{background:var(--bg-card,#0d2c2f);border-bottom:1px solid var(--border-card,#15474d);z-index:10;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding:8px 16px;display:flex}.nav-toolbar-left{flex-shrink:0;align-items:center;gap:16px;display:flex}.nav-repo-selector-wrapper{align-items:center;gap:8px;display:flex}.nav-repo-label{color:var(--text-muted,#94a3b8);font-size:.82rem;font-weight:500}.nav-repo-select{border:1px solid var(--border-card,#15474d);color:var(--text,#f8fafc);cursor:pointer;background:#0006;border-radius:6px;outline:none;padding:5px 12px;font-size:.84rem;transition:border-color .2s,box-shadow .2s}.nav-repo-select:focus{border-color:var(--primary,#0891b2);box-shadow:0 0 0 2px #0891b240}.nav-stats-badges{align-items:center;gap:8px;display:flex}.nav-stat-badge{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);background:#15474d80;border-radius:12px;padding:3px 8px;font-size:.76rem}.nav-stat-badge .stat-num{color:var(--accent,#14b8a6);font-weight:600}.nav-toolbar-center{flex:1;min-width:200px;max-width:400px}.nav-global-search{align-items:center;width:100%;display:flex;position:relative}.nav-global-search .search-icon{color:var(--text-muted,#94a3b8);pointer-events:none;position:absolute;left:10px}.nav-search-input{border:1px solid var(--border-card,#15474d);width:100%;color:var(--text,#f8fafc);background:#00000059;border-radius:6px;outline:none;padding:6px 30px 6px 32px;font-size:.82rem;transition:all .2s}.nav-search-input:focus{border-color:var(--primary,#0891b2);box-shadow:0 0 0 2px #0891b240}.nav-search-clear-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:.75rem;position:absolute;right:8px}.nav-search-clear-btn:hover{color:var(--text,#f8fafc)}.nav-toolbar-right{flex-shrink:0;align-items:center;gap:12px;display:flex}.nav-density-switcher{border:1px solid var(--border-card,#15474d);background:#0000004d;border-radius:6px;align-items:center;gap:2px;padding:2px;display:flex}.nav-density-switcher .density-label{color:var(--text-muted,#94a3b8);padding:0 6px;font-size:.76rem}.density-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:3px 8px;font-size:.76rem;font-weight:500;transition:all .15s}.density-btn:hover{color:var(--text,#f8fafc);background:#ffffff0d}.density-btn.active{background:var(--primary,#0891b2);color:#fff}.nav-refresh-btn{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);cursor:pointer;background:#0000004d;border-radius:6px;justify-content:center;align-items:center;padding:6px;transition:all .2s;display:flex}.nav-refresh-btn:hover:not(:disabled){color:var(--accent,#14b8a6);border-color:var(--accent,#14b8a6)}.nav-refresh-btn.spinning svg{animation:1s linear infinite spin}.nav-error-banner{border-bottom:1px solid var(--danger,#ef4444);color:#fca5a5;background:#ef444426;align-items:center;gap:10px;padding:8px 16px;font-size:.84rem;display:flex}.nav-error-banner span{flex:1}.error-close-btn{color:#fca5a5;cursor:pointer;background:0 0;border:none;font-size:.9rem}.nav-panes-layout{background:var(--bg-base,#07181b);flex:1;display:flex;position:relative;overflow:hidden}.nav-pane-column{border-right:1px solid var(--border-card,#15474d);flex-direction:column;height:100%;display:flex;overflow:hidden}.nav-pane-column:last-child{border-right:none}.nav-pane-tree{background:#07181bf2;flex:0 0 320px;min-width:250px;max-width:420px}.nav-pane-outline{background:#0a2024f2;flex:0 0 360px;min-width:280px;max-width:480px}.nav-pane-inspector{background:var(--bg-base,#07181b);flex:400px;min-width:320px}.nav-tree-header,.nav-outline-header,.nav-inspector-header{padding:var(--nav-header-padding);background:var(--bg-card,#0d2c2f);border-bottom:1px solid var(--border-card,#15474d);flex-direction:column;flex-shrink:0;gap:8px;display:flex}.nav-inspector-header{flex-direction:row;justify-content:space-between;align-items:center}.nav-tree-title-row,.nav-outline-title-row{justify-content:space-between;align-items:center;gap:8px;display:flex}.nav-tree-title,.nav-outline-title,.nav-inspector-title{color:var(--text,#f8fafc);text-transform:uppercase;letter-spacing:.04em;align-items:center;gap:8px;font-size:.86rem;font-weight:600;display:flex}.nav-tree-actions{align-items:center;gap:4px;display:flex}.nav-icon-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.nav-icon-btn:hover{color:var(--text,#f8fafc);border-color:var(--border-card,#15474d);background:#ffffff0d}.nav-file-badge{color:var(--accent-light,#2dd4bf);text-overflow:ellipsis;white-space:nowrap;background:#14b8a626;border:1px solid #14b8a64d;border-radius:12px;max-width:180px;padding:2px 8px;font-size:.74rem;overflow:hidden}.nav-tree-search-bar,.nav-outline-search-bar{align-items:center;width:100%;display:flex;position:relative}.nav-tree-search-bar .search-icon,.nav-outline-search-bar .search-icon{color:var(--text-muted,#94a3b8);pointer-events:none;position:absolute;left:8px}.nav-tree-search-input,.nav-outline-search-input{border:1px solid var(--border-card,#15474d);width:100%;color:var(--text,#f8fafc);font-size:var(--nav-font-size);background:#0000004d;border-radius:5px;outline:none;padding:4px 24px 4px 28px}.nav-tree-search-input:focus,.nav-outline-search-input:focus{border-color:var(--primary,#0891b2)}.nav-tree-clear-btn,.nav-outline-clear-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;font-size:.72rem;position:absolute;right:6px}.nav-category-chips{align-items:center;gap:4px;padding-bottom:2px;display:flex;overflow-x:auto}.category-chip{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);cursor:pointer;white-space:nowrap;background:#0000004d;border-radius:12px;align-items:center;gap:4px;padding:2px 8px;font-size:.72rem;transition:all .15s;display:flex}.category-chip:hover{color:var(--text,#f8fafc);border-color:#14b8a666}.category-chip.active{border-color:var(--primary,#0891b2);color:var(--accent-light,#2dd4bf);background:#0891b240;font-weight:600}.chip-count{opacity:.8;font-size:.68rem}.nav-tree-content,.nav-outline-content,.nav-inspector-content{flex:1;padding:6px 0;overflow:hidden auto}.nav-inspector-content{padding:14px}.nav-tree-pane{outline:none;flex-direction:column;height:100%;display:flex}.nav-tree-list{flex-direction:column;display:flex}.nav-tree-item{min-height:var(--nav-item-height);padding:var(--nav-item-padding);font-size:var(--nav-font-size);color:var(--text,#f8fafc);cursor:pointer;-webkit-user-select:none;user-select:none;border-left:2px solid #0000;align-items:center;gap:6px;transition:background-color .1s,border-color .1s;display:flex}.nav-tree-item:hover{background:#ffffff0a}.nav-tree-item.selected{border-left-color:var(--accent,#14b8a6);color:#fff;background:#0891b233;font-weight:500}.nav-tree-item.focused{outline:1px dotted var(--accent,#14b8a6);outline-offset:-1px}.tree-chevron{width:14px;color:var(--text-muted,#94a3b8);justify-content:center;align-items:center;font-size:.64rem;display:inline-flex}.chevron-arrow{transition:transform .15s;display:inline-block}.chevron-arrow.open{transform:rotate(90deg)}.chevron-spacer{width:14px}.tree-icon{font-size:var(--nav-icon-size);justify-content:center;align-items:center;width:16px;display:inline-flex}.tree-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.tree-badges{align-items:center;gap:4px;margin-left:auto;padding-right:6px;display:flex}.badge-symbols{font-size:var(--nav-badge-font-size);color:#67e8f9;font-family:var(--font-family-mono,monospace);background:#0891b226;border:1px solid #0891b24d;border-radius:8px;padding:1px 5px}.badge-routes{font-size:var(--nav-badge-font-size);color:#5eead4;font-family:var(--font-family-mono,monospace);background:#14b8a62e;border:1px solid #14b8a659;border-radius:8px;padding:1px 5px;font-weight:600}.nav-outline-pane{flex-direction:column;height:100%;display:flex}.nav-symbol-list{flex-direction:column;gap:4px;padding:6px 8px;display:flex}.nav-symbol-item{border:1px solid var(--border-card,#15474d);padding:var(--nav-card-padding);cursor:pointer;background:#0d2c2f66;border-radius:6px;flex-direction:column;gap:6px;transition:all .15s;display:flex}.nav-symbol-item:hover{background:#15474d66;border-color:#14b8a666}.nav-symbol-item.active{border-color:var(--accent,#14b8a6);background:#0891b238;box-shadow:0 0 10px #14b8a626}.symbol-header-row{justify-content:space-between;align-items:center;gap:8px;display:flex}.symbol-name-col{align-items:center;gap:6px;display:flex;overflow:hidden}.symbol-name-text{font-weight:600;font-size:var(--nav-font-size);color:var(--text,#f8fafc);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.symbol-meta-col{flex-shrink:0}.symbol-line-badge{font-size:var(--nav-badge-font-size);color:var(--text-muted,#94a3b8);font-family:var(--font-family-mono,monospace);background:#00000040;border-radius:4px;padding:1px 6px}.symbol-kind-badge{text-transform:uppercase;letter-spacing:.03em;border-radius:4px;flex-shrink:0;padding:1px 5px;font-size:.65rem;font-weight:700}.kind-class{color:#c084fc;background:#a855f733;border:1px solid #a855f766}.kind-function{color:#60a5fa;background:#3b82f633;border:1px solid #3b82f666}.kind-variable{color:#fbbf24;background:#f59e0b33;border:1px solid #f59e0b66}.kind-type{color:#2dd4bf;background:#14b8a633;border:1px solid #14b8a666}.kind-default{color:#cbd5e1;background:#94a3b833;border:1px solid #94a3b84d}.symbol-route-row{background:#0000004d;border-radius:4px;align-items:center;gap:6px;padding:3px 6px;font-size:.74rem;display:flex;overflow:hidden}.route-method-badge{text-transform:uppercase;border-radius:3px;flex-shrink:0;padding:1px 5px;font-size:.64rem;font-weight:700}.method-get{color:#a7f3d0;background:#065f46}.method-post{color:#bfdbfe;background:#1e40af}.method-put{color:#fde68a;background:#92400e}.method-delete{color:#fecaca;background:#991b1b}.method-patch{color:#ddd6fe;background:#5b21b6}.method-other{color:#e5e7eb;background:#374151}.route-path-text{font-family:var(--font-family-mono,monospace);color:#67e8f9;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.route-framework-tag{color:var(--text-muted,#94a3b8);margin-left:auto;padding-left:4px;font-size:.62rem}.symbol-signature-snippet{background:var(--code-bg,#00000059);font-family:var(--font-family-mono,monospace);color:#cbd5e1;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;padding:4px 6px;font-size:.72rem;overflow-x:hidden}.nav-inspector-pane{flex-direction:column;height:100%;display:flex}.nav-copy-permalink-btn{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);cursor:pointer;background:#00000059;border-radius:6px;align-items:center;gap:6px;padding:4px 10px;font-size:.76rem;transition:all .15s;display:flex}.nav-copy-permalink-btn:hover{color:var(--accent,#14b8a6);border-color:var(--accent,#14b8a6)}.nav-inspector-body{flex-direction:column;gap:12px;max-width:900px;display:flex}.inspector-card{background:var(--bg-card,#0d2c2f);border:1px solid var(--border-card,#15474d);padding:var(--nav-card-padding);border-radius:8px}.card-section-title{color:var(--text-muted,#94a3b8);text-transform:uppercase;letter-spacing:.04em;align-items:center;gap:6px;margin-bottom:8px;font-size:.8rem;font-weight:600;display:flex}.symbol-summary-card{flex-direction:column;gap:6px;display:flex}.summary-title-row{align-items:center;gap:8px;display:flex}.summary-name{color:#fff;font-size:1.15rem;font-weight:700}.summary-location-row{color:var(--text-muted,#94a3b8);align-items:center;gap:12px;font-size:.8rem;display:flex}.summary-file-path{color:var(--accent-light,#2dd4bf);font-family:var(--font-family-mono,monospace);align-items:center;gap:4px;display:flex}.summary-line-range{font-family:var(--font-family-mono,monospace);background:#0000004d;border-radius:4px;padding:1px 6px}.inspector-metrics-grid{grid-template-columns:repeat(4,1fr);gap:10px;display:grid}.metric-box{background:var(--bg-card,#0d2c2f);border:1px solid var(--border-card,#15474d);text-align:center;border-radius:8px;flex-direction:column;align-items:center;padding:10px;display:flex}.metric-label{color:var(--text-muted,#94a3b8);margin-bottom:4px;font-size:.72rem}.metric-value{color:var(--accent,#14b8a6);font-size:1.25rem;font-weight:700}.metric-lang{text-transform:uppercase;font-size:.95rem}.route-detail-row{align-items:center;gap:8px;display:flex}.route-path-code{font-family:var(--font-family-mono,monospace);color:#67e8f9;font-size:.88rem;font-weight:600}.signature-code-block{background:var(--code-bg,#00000059);font-family:var(--font-family-mono,monospace);color:#f1f5f9;white-space:pre-wrap;word-break:break-all;border:1px solid #ffffff0d;border-radius:6px;padding:10px;font-size:.82rem;overflow-x:auto}.docstring-text{color:#cbd5e1;white-space:pre-wrap;font-size:.84rem;line-height:1.5}.relation-list{flex-direction:column;gap:6px;display:flex}.relation-item{border:1px solid var(--border-card,#15474d);background:#00000040;border-radius:6px;flex-direction:column;gap:4px;padding:8px 10px;transition:all .15s;display:flex}.relation-item.caller-item,.relation-item.callee-item.is-clickable{cursor:pointer}.relation-item.caller-item:hover,.relation-item.callee-item.is-clickable:hover{border-color:var(--accent,#14b8a6);background:#0891b22e;transform:translate(2px)}.relation-top{justify-content:space-between;align-items:center;display:flex}.rel-top-right{align-items:center;gap:6px;display:flex}.rel-symbol-name{color:var(--text,#f8fafc);font-size:.82rem;font-weight:600}.rel-jump-hint{color:var(--accent-light,#2dd4bf);font-size:.72rem;font-weight:500}.relation-bottom{color:var(--text-muted,#94a3b8);align-items:center;gap:8px;font-size:.74rem;display:flex}.rel-filepath{font-family:var(--font-family-mono,monospace);color:#93c5fd}.rel-line{font-family:var(--font-family-mono,monospace)}.rel-type-tag,.rel-type-badge{text-transform:uppercase;background:#ffffff14;border-radius:4px;padding:1px 5px;font-size:.64rem}.import-badge{color:#c084fc;background:#a855f726}.rel-count-badge{color:var(--accent-light,#2dd4bf);font-size:.65rem;font-weight:500;font-family:var(--font-family-mono,monospace);background:#14b8a626;border-radius:4px;padding:1px 5px}.nav-no-items-text{color:var(--text-muted,#94a3b8);font-size:.8rem;font-style:italic}.nav-empty-state{text-align:center;color:var(--text-muted,#94a3b8);flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:32px 16px;display:flex}.nav-empty-state .empty-icon{opacity:.5;margin-bottom:4px;font-size:2rem}.nav-empty-state h4{color:var(--text,#f8fafc);font-size:.95rem}.nav-empty-state p{max-width:280px;font-size:.8rem}.nav-clear-filter-btn{background:var(--primary,#0891b2);color:#fff;cursor:pointer;border:none;border-radius:4px;margin-top:6px;padding:4px 10px;font-size:.76rem}.nav-loading-wrapper{color:var(--text-muted,#94a3b8);flex-direction:column;justify-content:center;align-items:center;gap:12px;padding:40px 16px;font-size:.84rem;display:flex}.nav-spinner{border:2px solid var(--border-card,#15474d);border-top-color:var(--accent,#14b8a6);border-radius:50%;width:24px;height:24px;animation:.8s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.nav-outline-skeleton,.nav-inspector-skeleton{flex-direction:column;gap:10px;padding:12px;display:flex}.skeleton-item,.skeleton-header,.skeleton-metrics,.skeleton-block{background:#ffffff0d;border-radius:6px}.skeleton-item{height:48px}.skeleton-header{height:70px}.skeleton-metrics{height:60px}.skeleton-block{height:90px}.shimmer{position:relative;overflow:hidden}.shimmer:after{content:"";background:linear-gradient(90deg,#0000 0%,#ffffff0a 50%,#0000 100%);width:100%;height:100%;animation:1.5s infinite shimmer;position:absolute;top:0;left:0;transform:translate(-100%)}@keyframes shimmer{to{transform:translate(100%)}} +:root,[data-theme=deep-ocean]{--bg-base:#07181b;--bg-card:#0d2c2f;--border-card:#15474d;--primary:#0891b2;--primary-hover:#0e7490;--accent:#14b8a6;--accent-light:#2dd4bf;--danger:#ef4444;--danger-hover:#dc2626;--text:#f8fafc;--text-muted:#94a3b8;--code-bg:#00000059;--radius:10px;--font-family-base:"Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-family-heading:"Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-family-mono:"JetBrains Mono", monospace;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-size-xs:.75rem;--font-size-sm:.85rem;--font-size-base:1rem;--font-size-lg:1.15rem;--font-size-xl:1.35rem;--font-size-2xl:1.65rem}[data-theme=midnight-blue]{--bg-base:#0a0f1d;--bg-card:#121a2fa6;--border-card:#ffffff14;--primary:#3b82f6;--primary-hover:#2563eb;--accent:#14b8a6;--accent-light:#2dd4bf;--danger:#ef4444;--danger-hover:#dc2626;--text:#f8fafc;--text-muted:#94a3b8;--code-bg:#00000059;--radius:12px}[data-theme=lavender-haze],[data-theme=aqua-breeze],[data-theme=arctic-frost]{--bg-base:#f5f3ff;--bg-card:#faf8ff;--border-card:#ddd6fe;--primary:#7c3aed;--primary-hover:#6d28d9;--accent:#ec4899;--accent-light:#f472b6;--danger:#dc2626;--danger-hover:#b91c1c;--text:#1e1035;--text-muted:#6b5b82;--code-bg:#7c3aed14;--radius:10px}[data-theme=amber-warmth],[data-theme=azure-daylight],[data-theme=solar-daybreak]{--bg-base:#fdf8f4;--bg-card:#fff;--border-card:#fed7aa;--primary:#ea580c;--primary-hover:#c2410c;--accent:#d97706;--accent-light:#f59e0b;--danger:#dc2626;--danger-hover:#b91c1c;--text:#291508;--text-muted:#7c5e4a;--code-bg:#ea580c14;--radius:12px}*{box-sizing:border-box;margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-heading)}body{font-family:var(--font-family-base);background-color:var(--bg-base);color:var(--text);min-height:100vh;display:block;position:relative;overflow:hidden scroll}.dashboard-container{z-index:1;flex-direction:column;gap:16px;width:100%;min-width:0;max-width:1400px;margin:0 auto;padding:20px 32px;display:flex}.dashboard-header{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);justify-content:space-between;align-items:center;padding:14px 20px;display:flex}.header-top-row{align-items:center;display:flex}.menu-toggle-btn{border:1px solid var(--border-card);color:var(--text);cursor:pointer;background:#ffffff14;border-radius:8px;padding:8px 12px;font-size:1.25rem;transition:all .2s;display:none}.menu-toggle-btn:hover{background:#ffffff26}.header-logo{align-items:center;gap:16px;display:flex}.logo-icon{color:var(--accent-light);font-size:2rem}.header-title h1{letter-spacing:-.5px;font-size:1.4rem;font-weight:700}.header-status{align-items:center;gap:20px;display:flex}.status-item{flex-direction:column;align-items:flex-end;display:flex}.status-item .label{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;font-size:.75rem}.status-item .value{align-items:center;gap:6px;font-size:.95rem;font-weight:600;display:flex}.indicator{border-radius:50%;width:8px;height:8px;display:inline-block}.indicator.online{background:#10b981;box-shadow:0 0 10px #10b981}.indicator.indexing{background:#f59e0b;animation:1.5s infinite pulse;box-shadow:0 0 10px #f59e0b}@keyframes pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(1.2)}to{opacity:1;transform:scale(1)}}.dashboard-nav{border-bottom:1px solid var(--border-card);flex-wrap:wrap;gap:10px;padding-bottom:8px;display:flex}.nav-tab{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:8px;padding:10px 18px;font-family:inherit;font-size:.95rem;font-weight:600;transition:all .2s;display:flex}.nav-tab:hover{color:var(--text);background:#ffffff0d}.nav-tab.active{color:#fff;background:color-mix(in srgb, var(--primary) 25%, transparent);border:1px solid color-mix(in srgb, var(--primary) 50%, transparent)}.glass-card{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);width:100%;min-width:0;padding:16px 20px}.glass-card h2{align-items:center;gap:8px;margin-bottom:12px;font-size:1.05rem;font-weight:600;display:flex}.tab-content{width:100%;min-width:0;display:none}.tab-content.active{flex-direction:column;gap:16px;width:100%;min-width:0;display:flex}.overview-grid{grid-template-columns:repeat(auto-fit,minmax(min(100%,200px),1fr));gap:12px;display:grid}.stat-metric{align-items:center;gap:12px;padding:14px 16px;display:flex}.metric-icon{color:var(--accent-light);background:#14b8a626;border-radius:10px;justify-content:center;align-items:center;width:40px;height:40px;font-size:1.4rem;display:flex}.metric-info{flex-direction:column;gap:4px;display:flex}.metric-info .stat-number{font-size:var(--font-size-xl);font-weight:var(--font-weight-extrabold);font-family:var(--font-family-mono);color:var(--text);line-height:1.1}.metric-info .stat-label{color:var(--text-muted);font-size:.85rem}.two-col-layout{grid-template-columns:1fr 1fr;gap:20px;display:grid}@media (width<=900px){.two-col-layout{grid-template-columns:1fr}}.specs-list{flex-direction:column;gap:12px;margin-top:12px;display:flex}.spec-row{border-bottom:1px solid var(--border-card);justify-content:space-between;align-items:center;gap:12px;padding:10px 0;font-size:.9rem;display:flex}.spec-row span:first-child{color:var(--text-muted);flex-shrink:0;font-weight:500}code,.code{background:var(--code-bg);vertical-align:baseline;word-break:break-word;overflow-wrap:break-word;border-radius:4px;max-width:100%;padding:1px 5px;font-family:JetBrains Mono,Fira Code,monospace;font-size:.85em;line-height:1.25;display:inline-block}.spec-row span:last-child,.spec-row code{text-align:right;word-break:break-word;max-width:100%}@media (width<=576px){.spec-row{flex-direction:column;align-items:flex-start;gap:6px}.spec-row span:last-child,.spec-row code{text-align:left}.stat-metric{padding:16px}.path-input-row{flex-direction:column}.browser-breadcrumbs{word-break:break-all}}.tag-cloud{flex-wrap:wrap;gap:8px;max-height:250px;margin-top:12px;display:flex;overflow-y:auto}.topic-tag{background:color-mix(in srgb, var(--accent) 12%, transparent);border:1px solid color-mix(in srgb, var(--accent) 25%, transparent);color:var(--accent);font-size:var(--font-size-xs);font-family:var(--font-family-mono);border-radius:6px;padding:4px 10px}.badge{white-space:nowrap;border-radius:6px;align-items:center;gap:6px;max-width:100%;padding:3px 8px;font-size:.75rem;font-weight:600;display:inline-flex}.badge-primary{background:color-mix(in srgb, var(--primary) 15%, transparent);color:var(--primary);border:1px solid color-mix(in srgb, var(--primary) 30%, transparent)}.badge-accent{background:color-mix(in srgb, var(--accent) 15%, transparent);color:var(--accent);border:1px solid color-mix(in srgb, var(--accent) 30%, transparent)}.badge-success{color:#6ee7b7;background:#10b98133;border:1px solid #10b9814d}.badge-warning{color:#fcd34d;background:#f59e0b33;border:1px solid #f59e0b4d}.badge-danger{color:#fca5a5;background:#ef444433;border:1px solid #ef44444d}code,.code{font-family:var(--font-family-mono);background:var(--code-bg);border-radius:4px;padding:2px 6px;font-size:.85rem}.desktop-table-view{display:block}.mobile-card-list{flex-direction:column;gap:14px;display:none}.data-mobile-card{border:1px solid var(--border-card);background:#ffffff06;border-radius:10px;flex-direction:column;gap:12px;padding:16px;display:flex}.data-mobile-card-header{justify-content:space-between;align-items:center;gap:10px;display:flex}.data-mobile-card-body{flex-direction:column;gap:8px;font-size:.85rem;display:flex}.data-mobile-card-actions{border-top:1px solid #ffffff0f;flex-wrap:wrap;gap:8px;margin-top:4px;padding-top:10px;display:flex}.data-mobile-card-actions .btn{flex:calc(50% - 8px);justify-content:center;min-width:0}.card-header-btn{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px;display:flex}.card-header-btn>div{flex:1 1 0;min-width:0;max-width:100%}.card-header-btn p{overflow-wrap:anywhere;word-break:break-word;margin:0}.table-container{-webkit-overflow-scrolling:touch;max-width:100%;margin-top:10px;overflow-x:auto}table{border-collapse:collapse;table-layout:auto;width:100%;font-size:.9rem}th{text-align:left;color:var(--text-muted);border-bottom:1px solid var(--border-card);white-space:nowrap;padding:12px 14px;font-weight:600}td{border-bottom:1px solid var(--border-card);color:var(--text);padding:14px}td a.repo-url-link,td a[href*=http]{text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;max-width:220px;display:inline-block;overflow:hidden}tr:hover td{background:color-mix(in srgb, var(--text) 3%, transparent)}.empty-state{text-align:center;color:var(--text-muted);padding:40px!important}.btn{cursor:pointer;border:none;border-radius:8px;align-items:center;gap:8px;padding:8px 16px;font-family:inherit;font-size:.9rem;font-weight:600;transition:all .2s;display:inline-flex}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-hover)}.btn-secondary{background:color-mix(in srgb, var(--text) 10%, transparent);color:var(--text);border:1px solid var(--border-card)}.btn-secondary:hover{background:color-mix(in srgb, var(--text) 16%, transparent)}.btn-icon{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:6px;font-size:.9rem;transition:all .2s}.btn-icon:hover{color:var(--text);background:color-mix(in srgb, var(--text) 10%, transparent)}.btn-delete:hover{color:var(--danger)}.form-group{flex-direction:column;gap:6px;margin-bottom:14px;display:flex}.form-group label{color:var(--text-muted);font-size:.85rem;font-weight:600}.form-row{box-sizing:border-box;gap:14px;width:100%;display:flex}.form-row>.form-group{flex:1;min-width:0}.form-row-3col{box-sizing:border-box;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px;width:100%;display:grid}.form-row-3col>.form-group{min-width:0}input[type=text],input[type=url],input[type=password],input[type=number],select,textarea{background:var(--code-bg);border:1px solid var(--border-card);color:var(--text);box-sizing:border-box;border-radius:8px;outline:none;width:100%;min-width:0;max-width:100%;padding:10px 14px;font-family:inherit;font-size:.9rem;transition:border-color .2s}input:focus,select:focus,textarea:focus{border-color:var(--primary)}.path-input-row{gap:8px;display:flex}.path-input-row input{flex:1}.modal-backdrop{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:1000;background:#000000b3;justify-content:center;align-items:center;width:100%;max-width:100vw;height:100%;display:flex;position:fixed;inset:0}.modal-card{background:var(--bg-card);border:1px solid var(--border-card);width:90%;max-width:550px}.modal-header{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.modal-header h2{margin-bottom:0}.btn-close{color:var(--text-muted);cursor:pointer;background:0 0;border:none;font-size:1.5rem}.modal-footer{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}.browser-body{margin:16px 0}.browser-breadcrumbs{background:#0000004d;border-radius:6px;margin-bottom:12px;padding:8px 12px;font-size:.85rem}.browser-list-container{background:#0003;border:1px solid #ffffff14;border-radius:6px;max-height:300px;overflow-y:auto}.browser-list{list-style:none}.browser-item{cursor:pointer;border-bottom:1px solid #ffffff0a;align-items:center;gap:10px;padding:8px 12px;font-size:.9rem;display:flex}.browser-item:hover{background:#ffffff0f}.search-hit-card{background:#0000004d;border:1px solid #ffffff14;border-radius:8px;margin-bottom:14px;padding:16px}.search-hit-header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px;display:flex}.search-hit-code{background:var(--code-bg);border:1px solid var(--border-card);font-family:var(--font-family-mono);white-space:pre-wrap;word-break:break-all;color:var(--text);border-radius:6px;padding:12px;font-size:.85rem;overflow-x:auto}.dashboard-footer{text-align:center;color:var(--text-muted);padding:20px 0;font-size:.8rem}@media (width<=768px){.menu-toggle-btn{justify-content:center;align-items:center;display:inline-flex}.dashboard-header{flex-direction:column;align-items:stretch;gap:14px;padding:16px;display:flex}.header-top-row{justify-content:space-between;align-items:center;width:100%;display:flex}.header-status{border-top:1px solid #ffffff0f;flex-wrap:wrap;justify-content:space-between;gap:8px 14px;width:100%;padding-top:10px;display:flex}.status-item{align-items:flex-start}.dashboard-nav{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);flex-direction:column;gap:6px;padding:12px;display:none}.dashboard-nav.drawer-open{animation:.25s ease-out forwards drawer-slide-down;display:flex}.nav-tab{justify-content:flex-start;width:100%;padding:12px 16px}.dashboard-container{box-sizing:border-box;max-width:100vw;padding:16px 12px}.vs-box{box-sizing:border-box;max-width:100%;padding:16px 12px}.glass-card{box-sizing:border-box;max-width:100%;padding:18px 14px}.desktop-table-view{display:none}.mobile-card-list{display:flex}.card-header-btn{flex-direction:column;align-items:stretch;gap:14px}.form-row,.form-row-3col{flex-direction:column;gap:12px;display:flex!important}.search-hit-header{flex-direction:column;align-items:flex-start;gap:8px}.search-form-btn-group{align-self:stretch!important}.search-form-btn-group .btn{justify-content:center;width:100%}.log-viewer-header{flex-direction:column;align-items:stretch;gap:12px}.log-viewer-actions{justify-content:space-between;width:100%}.log-toolbar{flex-direction:column;align-items:stretch;gap:12px}.log-filter-pills{-webkit-overflow-scrolling:touch;padding-bottom:4px;overflow-x:auto}.log-search-wrapper{width:100%;min-width:0;max-width:100%}.log-entry-main{flex-direction:column;align-items:flex-start;gap:4px}.sync-progress-container{min-width:unset;width:100%;max-width:100%}.sync-file-caption{max-width:100%}}@keyframes drawer-slide-down{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.toast-container{z-index:9999;pointer-events:none;flex-direction:column;gap:10px;display:flex;position:fixed;bottom:24px;right:24px}.toast{color:#fff;pointer-events:auto;background:#1e293b;border-left:4px solid #0000;border-radius:8px;align-items:center;gap:12px;max-width:400px;padding:14px 20px;font-size:.95rem;font-weight:500;animation:.3s ease-out forwards toast-slide-in;display:flex;box-shadow:0 10px 25px #00000080}@keyframes toast-slide-in{0%{opacity:0;transform:translate(50px)}to{opacity:1;transform:translate(0)}}.toast-success{border-left-color:#10b981}.toast-success i{color:#10b981}.toast-error{border-left-color:#ef4444}.toast-error i{color:#ef4444}.toast-info{border-left-color:#3b82f6}.toast-info i{color:#3b82f6}.toast-warning{border-left-color:#f59e0b}.toast-warning i{color:#f59e0b}.toast-message{flex:1;line-height:1.4}.toast-dismiss-btn{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;margin-left:6px;padding:4px;font-size:.85rem;transition:all .2s;display:inline-flex}.toast-dismiss-btn:hover{color:#fff;background:#ffffff1f}.log-viewer-container{flex-direction:column;gap:16px;display:flex}.log-viewer-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.log-viewer-actions{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.log-autoscroll-label{color:var(--text-muted);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;font-size:.85rem;font-weight:500;display:inline-flex}.log-autoscroll-label input[type=checkbox]{cursor:pointer;accent-color:var(--primary)}.log-toolbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;display:flex}.log-filter-pills{flex-wrap:wrap;gap:8px;display:flex}.log-filter-btn{color:var(--text-muted);cursor:pointer;background:#ffffff0d;border:1px solid #ffffff1a;border-radius:20px;align-items:center;gap:6px;padding:5px 12px;font-family:inherit;font-size:.8rem;font-weight:600;transition:all .2s;display:inline-flex}.log-filter-btn:hover{color:var(--text);background:#ffffff1a}.log-filter-btn.active{color:#93c5fd;background:#3b82f633;border-color:#3b82f666}.log-filter-btn.warning.active{color:#fcd34d;background:#f59e0b33;border-color:#f59e0b66}.log-filter-btn.error.active{color:#fca5a5;background:#ef444433;border-color:#ef444466}.log-filter-btn.debug.active{color:#cbd5e1;background:#94a3b833;border-color:#94a3b866}.pill-count{background:#0000004d;border-radius:10px;padding:1px 6px;font-size:.72rem}.log-search-wrapper{flex:1;align-items:center;min-width:280px;max-width:480px;display:flex;position:relative}.log-search-wrapper .search-icon{color:var(--text-muted);pointer-events:none;font-size:.85rem;position:absolute;left:12px}.log-search-input{background:var(--code-bg);border:1px solid var(--border-card);width:100%;color:var(--text);border-radius:8px;outline:none;padding:8px 32px 8px 34px;font-family:inherit;font-size:.85rem;transition:border-color .2s}.log-search-input:focus{border-color:var(--primary)}.clear-search-btn{color:var(--text-muted);cursor:pointer;background:0 0;border:none;padding:4px;font-size:.8rem;position:absolute;right:8px}.clear-search-btn:hover{color:var(--text)}.log-stream-container{background:var(--code-bg);border:1px solid var(--border-card);min-height:320px;max-height:580px;font-family:var(--font-family-mono);border-radius:8px;padding:12px;overflow-y:auto}.log-stream-list{flex-direction:column;gap:4px;display:flex}.log-entry{background:#ffffff04;border-left:3px solid #0000;border-radius:6px;padding:8px 12px;font-size:.82rem;line-height:1.5;transition:background .15s}.log-entry:hover{background:#ffffff09}.log-entry.log-level-info{border-left-color:#3b82f6}.log-entry.log-level-warning{background:#f59e0b08;border-left-color:#f59e0b}.log-entry.log-level-error{background:#ef44440f;border-left-color:#ef4444}.log-entry.log-level-debug{opacity:.85;border-left-color:#64748b}.log-entry-main{flex-wrap:wrap;align-items:baseline;gap:10px;display:flex}.log-timestamp{color:var(--text-muted);white-space:nowrap;font-size:.78rem}.log-logger{color:var(--accent-light);font-size:.78rem}.log-message{color:#e2e8f0;word-break:break-word;flex:1}.btn-traceback-toggle{color:#fca5a5;cursor:pointer;background:#ef44441f;border:1px solid #ef44444d;border-radius:4px;align-items:center;gap:5px;padding:2px 8px;font-family:inherit;font-size:.75rem;transition:all .2s;display:inline-flex}.btn-traceback-toggle:hover{background:#ef444438}.log-traceback-wrapper{margin-top:8px;padding-left:8px}.traceback-box{background:color-mix(in srgb, var(--danger) 10%, transparent);border:1px solid color-mix(in srgb, var(--danger) 30%, transparent);color:var(--danger);font-family:var(--font-family-mono);white-space:pre-wrap;border-radius:6px;padding:10px 14px;font-size:.78rem;line-height:1.45;overflow-x:auto}.vs-config-layout{box-sizing:border-box;grid-template-columns:1fr 1fr;gap:20px;width:100%;min-width:0;margin-top:16px;display:grid}@media (width<=960px){.vs-config-layout{grid-template-columns:1fr}}.vs-box{border:1px solid var(--border-card);box-sizing:border-box;overflow-wrap:break-word;background:#ffffff05;border-radius:10px;width:100%;min-width:0;padding:20px}.vs-box h3{color:var(--text);align-items:center;gap:8px;margin-bottom:14px;font-size:1rem;font-weight:600;display:flex}.vs-feedback-banner{border-radius:8px;align-items:center;gap:10px;margin-bottom:16px;padding:10px 14px;font-size:.85rem;line-height:1.4;display:flex}.feedback-success{color:#6ee7b7;background:#10b9811f;border:1px solid #10b9814d}.feedback-error{color:#fca5a5;background:#ef44441f;border:1px solid #ef44444d}.theme-options-grid{grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;margin-top:12px;display:grid}.theme-card{background:var(--bg-card);border:1.5px solid var(--border-card);border-radius:var(--radius);cursor:pointer;text-align:left;flex-direction:column;gap:8px;padding:12px 14px;transition:all .2s;display:flex;position:relative}.theme-card:hover{border-color:color-mix(in srgb, var(--primary) 60%, transparent);transform:translateY(-2px)}.theme-card.active{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary), 0 4px 14px #00000040}.theme-card-header{justify-content:space-between;align-items:center;display:flex}.theme-card-title{color:var(--text);align-items:center;gap:6px;font-size:.92rem;font-weight:600;display:flex}.theme-card-desc{color:var(--text-muted);font-size:.76rem;line-height:1.35}.theme-swatches{align-items:center;gap:6px;padding-top:2px;display:flex}.theme-swatch{border:1px solid #fff3;border-radius:50%;width:18px;height:18px;box-shadow:0 1px 3px #00000040}.sync-drawer-backdrop{-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);z-index:1100;background:#000000a6;justify-content:flex-end;width:100vw;height:100vh;display:flex;position:fixed;top:0;left:0}.sync-drawer{background:var(--bg-card,#111827);border-left:1px solid var(--border-card);flex-direction:column;width:620px;max-width:95vw;height:100vh;animation:.25s cubic-bezier(.16,1,.3,1) slideInRight;display:flex;box-shadow:-10px 0 35px #0000008c}.sync-drawer-header{border-bottom:1px solid var(--border-card);background:#0003;justify-content:space-between;align-items:flex-start;gap:14px;padding:18px 22px;display:flex}.sync-drawer-title-group{flex-direction:column;flex:1;gap:4px;display:flex}.sync-drawer-body{flex-direction:column;flex:1;gap:18px;padding:20px 22px;display:flex;overflow-y:auto}.sync-progress-section{border:1px solid var(--border-card);background:#0003;border-radius:8px;padding:12px 14px}.sync-progress-bar-container{background:#ffffff14;border-radius:4px;width:100%;height:8px;overflow:hidden}.sync-progress-bar-fill{border-radius:4px;height:100%;transition:width .3s,background .3s}.sync-progress-bar-fill.fill-active{background:var(--primary)}.sync-progress-bar-fill.fill-success{background:#10b981}.sync-progress-bar-fill.fill-error{background:#ef4444}.sync-progress-container{box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none;flex-direction:column;gap:5px;width:100%;min-width:140px;max-width:100%;transition:opacity .2s,transform .15s;display:flex}.sync-progress-container:hover{opacity:.92}.sync-progress-container:focus-visible{outline:2px solid var(--primary);border-radius:6px}.progress-pill{white-space:nowrap;box-sizing:border-box;border-radius:12px;align-items:center;gap:6px;min-width:0;max-width:100%;padding:3px 8px;font-size:.76rem;font-weight:600;display:inline-flex}.progress-pill>span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.sync-progress-bar-wrapper{background:#ffffff14;border-radius:3px;width:100%;height:6px;overflow:hidden}.sync-file-caption{color:var(--text-muted);font-size:.72rem;font-family:var(--font-family-mono);text-overflow:ellipsis;white-space:nowrap;align-items:center;min-width:0;max-width:100%;display:flex;overflow:hidden}.sync-file-caption code{text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:1px 4px;font-size:.72rem;overflow:hidden}.sync-stepper-container{border:1px solid var(--border-card);background:#0003;border-radius:8px;padding:14px 16px}.sync-stepper-list{flex-direction:column;gap:10px;display:flex}.sync-stepper-item{border-radius:6px;align-items:flex-start;gap:12px;padding:8px 10px;transition:background .15s;display:flex}.sync-stepper-item.item-active{background:#f59e0b1a;border:1px solid #f59e0b40}.sync-stepper-item.item-completed{background:#10b9810d}.sync-stepper-item.item-error{background:#ef44441a;border:1px solid #ef444440}.sync-stepper-icon{justify-content:center;align-items:center;min-width:18px;margin-top:1px;font-size:1rem;display:flex}.sync-stepper-content{color:var(--text);flex-direction:column;flex:1;gap:2px;font-size:.88rem;display:flex}.sync-stepper-details{margin-top:4px;font-size:.8rem}.sync-current-file{font-family:var(--font-family-mono);color:var(--accent,#60a5fa);word-break:break-all;font-size:.78rem}.sync-terminal-section{background:#0d1117;border:1px solid #ffffff1f;border-radius:8px;flex-direction:column;flex:1;min-height:260px;display:flex;overflow:hidden}.sync-terminal-header{background:#161b22;border-bottom:1px solid #ffffff1a;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;padding:10px 14px;display:flex}.sync-terminal-actions{align-items:center;gap:12px;display:flex}.sync-autoscroll-toggle{color:var(--text-muted);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;font-size:.78rem;display:flex}.sync-terminal-search{background:#11161d;border-bottom:1px solid #ffffff14;align-items:center;gap:8px;padding:6px 14px;display:flex}.sync-terminal-body{font-family:var(--font-family-mono,monospace);color:#e6edf3;flex:1;min-height:180px;max-height:380px;padding:12px 14px;font-size:.8rem;overflow-y:auto}.sync-terminal-empty{color:#8b949e;flex-direction:column;justify-content:center;align-items:center;height:160px;font-size:.85rem;display:flex}.sync-terminal-lines{flex-direction:column;gap:4px;display:flex}.sync-terminal-line{word-break:break-all;align-items:flex-start;gap:8px;line-height:1.45;display:flex}.log-time{color:#8b949e;flex-shrink:0;font-size:.75rem}.log-badge{border-radius:3px;flex-shrink:0;padding:0 4px;font-size:.7rem;font-weight:700}.log-badge.level-info{color:#38bdf8;background:#38bdf833}.log-badge.level-warn{color:#fbbf24;background:#fbbf2433}.log-badge.level-error{color:#f87171;background:#f8717133}.log-msg{color:#e6edf3;flex:1}theme-editor-overlay{pointer-events:none!important}theme-editor-overlay button,theme-editor-overlay [role=button],theme-editor-overlay a{pointer-events:auto!important}.topology-container{flex-direction:column;gap:16px;display:flex;position:relative}.topology-toolbar{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:14px 18px;display:flex}.topology-toolbar-group{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.topology-select,.topology-input{border:1px solid var(--border-card);color:var(--text);background:#00000059;border-radius:8px;outline:none;padding:7px 12px;font-family:inherit;font-size:.85rem;transition:all .2s}.topology-select:focus,.topology-input:focus{border-color:var(--primary);box-shadow:0 0 0 2px #3b82f633}.topology-view-btn-group{border:1px solid var(--border-card);background:#00000059;border-radius:8px;display:inline-flex;overflow:hidden}.topology-view-btn{color:var(--text-muted);cursor:pointer;background:0 0;border:none;padding:6px 12px;font-size:.82rem;transition:all .15s}.topology-view-btn:hover{color:var(--text)}.topology-view-btn.active{background:var(--primary);color:#fff;font-weight:500}.topology-filter-chip{cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #0000;border-radius:6px;align-items:center;gap:6px;padding:4px 10px;font-size:.78rem;font-weight:500;transition:all .15s;display:inline-flex}.topology-filter-chip.chip-file{color:#38bdf8;background:#0ea5e926;border-color:#0ea5e94d}.topology-filter-chip.chip-class{color:#c084fc;background:#a855f726;border-color:#a855f74d}.topology-filter-chip.chip-function{color:#34d399;background:#10b98126;border-color:#10b9814d}.topology-filter-chip.chip-route{color:#fbbf24;background:#f59e0b26;border-color:#f59e0b4d}.topology-filter-chip.chip-orphan{color:#fb7185;background:#f43f5e26;border-color:#f43f5e4d}.topology-filter-chip.inactive{opacity:.4;filter:grayscale(80%);color:var(--text-muted);border-color:var(--border-card);background:#ffffff0d}.topology-canvas-wrapper{border:1px solid var(--border-card);border-radius:var(--radius);cursor:grab;background:radial-gradient(circle,#121a2fbf 0%,#0a0f1df2 100%);width:100%;height:640px;position:relative;overflow:hidden}.topology-canvas-wrapper:active{cursor:grabbing}.topology-canvas-wrapper svg{width:100%;height:100%;display:block}.topology-node{cursor:pointer;transition:filter .15s,transform .15s}.topology-node:hover{filter:drop-shadow(0 0 8px #3b82f6cc)}.topology-node.selected{filter:drop-shadow(0 0 12px #14b8a6f2)}.topology-node.highlighted{filter:drop-shadow(0 0 14px #f59e0b)}.topology-edge{transition:stroke-opacity .2s,stroke-width .2s}.topology-controls-panel{border:1px solid var(--border-card);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:10;background:#121a2fd9;border-radius:10px;align-items:center;gap:6px;padding:6px 10px;display:flex;position:absolute;bottom:20px;left:20px}.topology-btn-ctrl{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:6px 8px;font-size:.85rem;transition:all .15s}.topology-btn-ctrl:hover{color:var(--text);background:#ffffff1a}.topology-legend{border:1px solid var(--border-card);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:10;background:#121a2fd9;border-radius:10px;flex-wrap:wrap;gap:8px;padding:8px 12px;display:flex;position:absolute;top:20px;left:20px}.topology-minimap{border:1px solid var(--border-card);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:10;pointer-events:none;background:#0a0f1dd9;border-radius:8px;width:140px;height:95px;position:absolute;bottom:20px;right:20px;overflow:hidden}.topology-minimap svg{width:100%;height:100%}.topology-drawer{border-left:1px solid var(--border-card);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);z-index:50;background:#0f172af2;flex-direction:column;width:440px;max-width:90%;height:100%;animation:.25s cubic-bezier(.16,1,.3,1) slideInRight;display:flex;position:absolute;top:0;right:0;box-shadow:-10px 0 30px #00000080}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.topology-drawer-header{border-bottom:1px solid var(--border-card);justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.topology-drawer-body{flex-direction:column;flex:1;gap:16px;padding:20px;display:flex;overflow-y:auto}.topology-drawer-section{flex-direction:column;gap:8px;display:flex}.topology-drawer-section-title{text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);font-size:.8rem;font-weight:600}.topology-code-snippet{background:var(--code-bg);border:1px solid var(--border-card);font-family:var(--font-family-mono);color:var(--text);white-space:pre-wrap;border-radius:8px;max-height:220px;padding:12px;font-size:.78rem;line-height:1.45;overflow-x:auto}.topology-neighbor-list{flex-direction:column;gap:6px;display:flex}.topology-neighbor-item{border:1px solid var(--border-card);cursor:pointer;background:#ffffff08;border-radius:6px;justify-content:space-between;align-items:center;padding:8px 12px;font-size:.82rem;transition:all .15s;display:flex}.topology-neighbor-item:hover{border-color:var(--primary);background:#ffffff12}.topology-badge-type{text-transform:uppercase;border-radius:4px;align-items:center;gap:4px;padding:2px 8px;font-size:.72rem;font-weight:600;display:inline-flex}.badge-file{color:#38bdf8;background:#0ea5e933}.badge-class{color:#c084fc;background:#a855f733}.badge-function{color:#34d399;background:#10b98133}.badge-route{color:#fbbf24;background:#f59e0b33}.badge-module{color:#818cf8;background:#6366f133}.badge-edge-imports{color:#38bdf8;background:#0ea5e926}.badge-edge-calls{color:#34d399;background:#10b98126}.badge-edge-defines{color:#c084fc;background:#a855f726}.badge-edge-handles{color:#fbbf24;background:#f59e0b26}.badge-edge-routes-to{color:#fb7185;background:#f43f5e26}.badge-edge-doc-links-to{color:#a78bfa;background:#a78bfa26}.topology-search-results{border:1px solid var(--border-card);z-index:60;background:#0f172afa;border-radius:8px;max-height:240px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 10px 25px #00000080}.topology-search-item{cursor:pointer;border-bottom:1px solid #ffffff0d;justify-content:space-between;align-items:center;padding:8px 12px;font-size:.82rem;display:flex}.topology-search-item:hover{background:#3b82f626}.topology-empty-state{height:100%;color:var(--text-muted);flex-direction:column;justify-content:center;align-items:center;gap:12px;display:flex}.neighborhood-view{flex-direction:column;gap:14px;width:100%;display:flex;position:relative}.neighborhood-breadcrumbs{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;display:flex}.neighborhood-breadcrumbs-left{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.neighborhood-breadcrumbs-right{flex-wrap:wrap;align-items:center;gap:14px;display:flex}.neighborhood-focal-selector-wrap{align-items:center;gap:6px;display:inline-flex}.neighborhood-focal-label{color:var(--text-muted);white-space:nowrap;font-size:.78rem;font-weight:600}.neighborhood-focal-select{max-width:260px;padding:4px 10px;font-size:.82rem}.neighborhood-back-btn{align-items:center;gap:6px;padding:5px 10px;font-size:.8rem;display:inline-flex}.neighborhood-breadcrumb-trail{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.neighborhood-breadcrumb-sep{color:var(--text-muted);-webkit-user-select:none;user-select:none;margin:0 2px;font-size:.9rem}.neighborhood-breadcrumb-item{cursor:pointer;color:var(--text-muted);background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:6px;padding:3px 8px;font-size:.82rem;transition:all .15s;display:inline-flex}.neighborhood-breadcrumb-item:hover{color:var(--text);background:#ffffff0f}.neighborhood-breadcrumb-item.active{color:var(--text);background:#3b82f626;border-color:#3b82f64d;font-weight:600}.neighborhood-breadcrumb-badge{padding:1px 5px;font-size:.65rem}.neighborhood-breadcrumb-text{font-family:var(--font-family-mono,monospace)}.neighborhood-hop-selector{align-items:center;gap:8px;display:inline-flex}.neighborhood-hop-label{color:var(--text-muted);font-size:.8rem;font-weight:500}.neighborhood-panels{grid-template-columns:280px 1fr 280px;gap:14px;min-height:640px;display:grid}@media (width<=1100px){.neighborhood-panels{grid-template-columns:1fr}}.neighborhood-panel{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);flex-direction:column;max-height:640px;padding:14px;display:flex;overflow:hidden}.neighborhood-panel-header{border-bottom:1px solid var(--border-card);justify-content:space-between;align-items:center;margin-bottom:10px;padding-bottom:10px;display:flex}.neighborhood-panel-title{color:var(--text);align-items:center;gap:8px;font-size:.85rem;font-weight:600;display:flex}.neighborhood-panel-count{color:var(--text-muted);background:#ffffff14;border-radius:12px;padding:2px 8px;font-size:.75rem;font-weight:600}.neighborhood-panel-list{flex-direction:column;flex:1;gap:8px;padding-right:2px;display:flex;overflow-y:auto}.neighborhood-panel-item{border:1px solid var(--border-card);background:#ffffff05;border-radius:8px;flex-direction:column;gap:6px;padding:10px;transition:all .15s;display:flex}.neighborhood-panel-item:hover{background:#ffffff0d;border-color:#3b82f666}.neighborhood-panel-item-header{justify-content:space-between;align-items:center;gap:6px;display:flex}.neighborhood-panel-item-name{font-family:var(--font-family-mono,monospace);color:var(--text);word-break:break-all;font-size:.8rem}.neighborhood-panel-item-actions{gap:6px;margin-top:4px;display:flex}.neighborhood-panel-empty{text-align:center;color:var(--text-muted);padding:24px 8px;font-size:.8rem}.neighborhood-center{flex-direction:column;min-height:640px;display:flex;position:relative}.neighborhood-canvas-wrapper{border:1px solid var(--border-card);border-radius:var(--radius);background:radial-gradient(circle,#121a2fbf 0%,#0a0f1df2 100%);width:100%;height:100%;min-height:640px;position:relative;overflow:hidden}.neighborhood-svg{width:100%;height:100%;display:block}.neighborhood-orbital-ring{fill:none;stroke:#94a3b82e;stroke-dasharray:4 4;stroke-width:1.5px}.neighborhood-orbital-ring.ring-2{stroke:#94a3b81f}.neighborhood-orbital-label{fill:var(--text-muted);letter-spacing:.04em;pointer-events:none;text-transform:uppercase;font-size:10px}.neighborhood-edge-path{transition:stroke-opacity .2s,stroke-width .2s}.neighborhood-edge-path:hover{stroke-opacity:1;stroke-width:2.5px}.neighborhood-node-item{transition:transform .15s,filter .15s}.neighborhood-node-item:hover{filter:drop-shadow(0 0 10px #3b82f6d9)}.neighborhood-node-circle{transition:filter .15s,stroke-width .15s}.neighborhood-node-name{font-family:var(--font-family-mono,monospace);font-weight:500}.focal-pulse-ring{transform-origin:50%;animation:2.5s cubic-bezier(.4,0,.6,1) infinite pulse-ring}@keyframes pulse-ring{0%{opacity:.8;transform:scale(.95)}50%{opacity:.2;transform:scale(1.15)}to{opacity:.8;transform:scale(.95)}}.neighborhood-focal-node:hover .focal-body{filter:drop-shadow(0 0 12px #3b82f6e6)}.neighborhood-empty-state{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius);height:480px}.topology-physics-panel,.topology-physics-popover{z-index:100;border:1px solid var(--border-card);border-radius:var(--radius);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#0f172af2;flex-direction:column;gap:14px;width:calc(100% - 40px);min-width:320px;max-width:380px;padding:16px;animation:.2s cubic-bezier(.16,1,.3,1) fadeInPhysics;display:flex;position:absolute;top:70px;right:20px;box-shadow:0 12px 32px #0000008c}@keyframes fadeInPhysics{0%{opacity:0;transform:translateY(-8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.topology-physics-header{border-bottom:1px solid var(--border-card);justify-content:space-between;align-items:center;gap:8px;padding-bottom:10px;display:flex}.topology-physics-title-wrap{align-items:center;gap:8px;display:flex}.topology-physics-title{color:var(--text);margin:0;font-size:.9rem;font-weight:600}.topology-physics-body{flex-direction:column;gap:14px;display:flex}.topology-physics-section{flex-direction:column;gap:8px;display:flex}.topology-physics-section-title{text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);font-size:.75rem;font-weight:600}.topology-physics-presets-grid{grid-template-columns:repeat(2,1fr);gap:6px;display:grid}.topology-physics-preset-btn{border:1px solid var(--border-card);color:var(--text-muted);cursor:pointer;background:#ffffff0a;border-radius:6px;align-items:center;gap:6px;padding:6px 10px;font-size:.78rem;font-weight:500;transition:all .15s;display:flex}.topology-physics-preset-btn:hover{color:var(--text);border-color:var(--primary);background:#ffffff14}.topology-physics-preset-btn.active{color:#60a5fa;background:#3b82f633;border-color:#3b82f680;font-weight:600}.topology-physics-sliders-list{flex-direction:column;gap:10px;display:flex}.topology-physics-slider-row{flex-direction:column;gap:4px;display:flex}.topology-physics-slider-header{justify-content:space-between;align-items:center;font-size:.8rem;display:flex}.topology-physics-slider-label{color:var(--text);cursor:pointer;align-items:center;gap:4px;font-weight:500;display:inline-flex}.topology-physics-symbol{color:var(--text-muted);font-size:.72rem;font-family:var(--font-family-mono,monospace)}.topology-physics-value-chip{font-family:var(--font-family-mono,monospace);color:var(--primary,#38bdf8);background:#ffffff0f;border-radius:4px;padding:2px 6px;font-size:.75rem;font-weight:600}.topology-physics-range-input{appearance:none;cursor:pointer;background:#ffffff1f;border-radius:3px;outline:none;width:100%;height:6px;transition:background .15s}.topology-physics-range-input:hover{background:#ffffff2e}.topology-physics-range-input::-webkit-slider-thumb{appearance:none;background:var(--primary,#3b82f6);cursor:pointer;border-radius:50%;width:14px;height:14px;transition:transform .1s;box-shadow:0 0 6px #3b82f699}.topology-physics-range-input::-webkit-slider-thumb:hover{transform:scale(1.2)}.topology-physics-range-input::-moz-range-thumb{background:var(--primary,#3b82f6);cursor:pointer;border:none;border-radius:50%;width:14px;height:14px}.topology-physics-actions{gap:8px;margin-top:4px;display:flex}.topology-physics-action-btn{flex:1;justify-content:center;align-items:center;gap:6px;font-size:.8rem;display:inline-flex}.code-navigator-container,.code-navigator-container.density-balanced{--nav-item-height:28px;--nav-font-size:.84rem;--nav-item-padding:5px 10px;--nav-icon-size:15px;--nav-badge-font-size:.72rem;--nav-card-padding:12px 14px;--nav-header-padding:10px 14px}.code-navigator-container.density-compact{--nav-item-height:22px;--nav-font-size:.76rem;--nav-item-padding:2px 8px;--nav-icon-size:13px;--nav-badge-font-size:.66rem;--nav-card-padding:8px 10px;--nav-header-padding:6px 10px}.code-navigator-container.density-spacious{--nav-item-height:36px;--nav-font-size:.9rem;--nav-item-padding:8px 14px;--nav-icon-size:17px;--nav-badge-font-size:.78rem;--nav-card-padding:16px 18px;--nav-header-padding:14px 18px}.code-navigator-container{background-color:var(--bg-base,#07181b);height:100%;min-height:calc(100vh - 80px);color:var(--text,#f8fafc);font-family:var(--font-family-base,"Outfit", sans-serif);box-sizing:border-box;flex-direction:column;display:flex;overflow:hidden}.nav-toolbar{background:var(--bg-card,#0d2c2f);border-bottom:1px solid var(--border-card,#15474d);z-index:10;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding:8px 16px;display:flex}.nav-toolbar-left{flex-shrink:0;align-items:center;gap:16px;display:flex}.nav-repo-selector-wrapper{align-items:center;gap:8px;display:flex}.nav-repo-label{color:var(--text-muted,#94a3b8);font-size:.82rem;font-weight:500}.nav-repo-select{border:1px solid var(--border-card,#15474d);color:var(--text,#f8fafc);cursor:pointer;background:#0006;border-radius:6px;outline:none;padding:5px 12px;font-size:.84rem;transition:border-color .2s,box-shadow .2s}.nav-repo-select:focus{border-color:var(--primary,#0891b2);box-shadow:0 0 0 2px #0891b240}.nav-stats-badges{align-items:center;gap:8px;display:flex}.nav-stat-badge{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);background:#15474d80;border-radius:12px;padding:3px 8px;font-size:.76rem}.nav-stat-badge .stat-num{color:var(--accent,#14b8a6);font-weight:600}.nav-toolbar-center{flex:1;min-width:200px;max-width:400px}.nav-global-search{border:1px solid var(--border-card,#15474d);box-sizing:border-box;background:#00000059;border-radius:6px;align-items:center;width:100%;padding:0 10px;transition:all .2s;display:flex;position:relative}.nav-global-search:focus-within{border-color:var(--primary,#0891b2);box-shadow:0 0 0 2px #0891b240}.nav-global-search .search-icon-wrapper{width:16px;height:16px;color:var(--text-muted,#94a3b8);pointer-events:none;flex-shrink:0;justify-content:center;align-items:center;margin-right:8px;display:flex}.nav-search-input{color:var(--text,#f8fafc);background:0 0;border:none;outline:none;flex:1;min-width:0;padding:6px 0;font-size:.82rem}.nav-search-clear-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;flex-shrink:0;margin-left:4px;padding:2px 4px;font-size:.75rem}.nav-search-clear-btn:hover{color:var(--text,#f8fafc)}.nav-toolbar-right{flex-shrink:0;align-items:center;gap:12px;display:flex}.nav-density-switcher{border:1px solid var(--border-card,#15474d);background:#0000004d;border-radius:6px;align-items:center;gap:2px;padding:2px;display:flex}.nav-density-switcher .density-label{color:var(--text-muted,#94a3b8);padding:0 6px;font-size:.76rem}.density-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:3px 8px;font-size:.76rem;font-weight:500;transition:all .15s}.density-btn:hover{color:var(--text,#f8fafc);background:#ffffff0d}.density-btn.active{background:var(--primary,#0891b2);color:#fff}.nav-refresh-btn{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);cursor:pointer;background:#0000004d;border-radius:6px;justify-content:center;align-items:center;padding:6px;transition:all .2s;display:flex}.nav-refresh-btn:hover:not(:disabled){color:var(--accent,#14b8a6);border-color:var(--accent,#14b8a6)}.nav-refresh-btn.spinning svg{animation:1s linear infinite spin}.nav-error-banner{border-bottom:1px solid var(--danger,#ef4444);color:#fca5a5;background:#ef444426;align-items:center;gap:10px;padding:8px 16px;font-size:.84rem;display:flex}.nav-error-banner span{flex:1}.error-close-btn{color:#fca5a5;cursor:pointer;background:0 0;border:none;font-size:.9rem}.nav-panes-layout{background:var(--bg-base,#07181b);flex:1;display:flex;position:relative;overflow:hidden}.nav-pane-column{border-right:1px solid var(--border-card,#15474d);flex-direction:column;height:100%;display:flex;overflow:hidden}.nav-pane-column:last-child{border-right:none}.nav-pane-tree{background:#07181bf2;flex:0 0 320px;min-width:250px;max-width:420px}.nav-pane-outline{background:#0a2024f2;flex:0 0 360px;min-width:280px;max-width:480px}.nav-pane-inspector{background:var(--bg-base,#07181b);flex:400px;min-width:320px}.nav-tree-header,.nav-outline-header,.nav-inspector-header{padding:var(--nav-header-padding);background:var(--bg-card,#0d2c2f);border-bottom:1px solid var(--border-card,#15474d);flex-direction:column;flex-shrink:0;gap:8px;display:flex}.nav-inspector-header{box-sizing:border-box;flex-flow:wrap;justify-content:space-between;align-items:center;gap:8px;min-width:0;max-width:100%}.nav-tree-title-row,.nav-outline-title-row{justify-content:space-between;align-items:center;gap:8px;display:flex}.nav-tree-title,.nav-outline-title,.nav-inspector-title{color:var(--text,#f8fafc);text-transform:uppercase;letter-spacing:.04em;align-items:center;gap:8px;font-size:.86rem;font-weight:600;display:flex}.nav-tree-actions{align-items:center;gap:4px;display:flex}.nav-icon-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.nav-icon-btn:hover{color:var(--text,#f8fafc);border-color:var(--border-card,#15474d);background:#ffffff0d}.nav-file-badge{color:var(--accent-light,#2dd4bf);text-overflow:ellipsis;white-space:nowrap;background:#14b8a626;border:1px solid #14b8a64d;border-radius:12px;max-width:180px;padding:2px 8px;font-size:.74rem;overflow:hidden}.nav-tree-search-bar,.nav-outline-search-bar{border:1px solid var(--border-card,#15474d);box-sizing:border-box;background:#0000004d;border-radius:5px;align-items:center;width:100%;padding:0 8px;display:flex;position:relative}.nav-tree-search-bar:focus-within,.nav-outline-search-bar:focus-within{border-color:var(--primary,#0891b2)}.nav-tree-search-bar .search-icon-wrapper,.nav-outline-search-bar .search-icon-wrapper{width:14px;height:14px;color:var(--text-muted,#94a3b8);pointer-events:none;flex-shrink:0;justify-content:center;align-items:center;margin-right:6px;display:flex}.nav-tree-search-input,.nav-outline-search-input{color:var(--text,#f8fafc);font-size:var(--nav-font-size);background:0 0;border:none;outline:none;flex:1;min-width:0;padding:4px 0}.nav-tree-clear-btn,.nav-outline-clear-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;flex-shrink:0;margin-left:4px;font-size:.72rem}.nav-category-chips{align-items:center;gap:4px;padding-bottom:2px;display:flex;overflow-x:auto}.category-chip{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);cursor:pointer;white-space:nowrap;background:#0000004d;border-radius:12px;align-items:center;gap:4px;padding:2px 8px;font-size:.72rem;transition:all .15s;display:flex}.category-chip:hover{color:var(--text,#f8fafc);border-color:#14b8a666}.category-chip.active{border-color:var(--primary,#0891b2);color:var(--accent-light,#2dd4bf);background:#0891b240;font-weight:600}.chip-count{opacity:.8;font-size:.68rem}.nav-tree-content,.nav-outline-content,.nav-inspector-content{flex:1;padding:6px 0;overflow:hidden auto}.nav-inspector-content{padding:14px}.nav-tree-pane{outline:none;flex-direction:column;height:100%;display:flex}.nav-tree-list{flex-direction:column;display:flex}.nav-tree-item{min-height:var(--nav-item-height);padding:var(--nav-item-padding);font-size:var(--nav-font-size);color:var(--text,#f8fafc);cursor:pointer;-webkit-user-select:none;user-select:none;border-left:2px solid #0000;align-items:center;gap:6px;transition:background-color .1s,border-color .1s;display:flex}.nav-tree-item:hover{background:#ffffff0a}.nav-tree-item.selected{border-left-color:var(--accent,#14b8a6);color:#fff;background:#0891b233;font-weight:500}.nav-tree-item.focused{outline:1px dotted var(--accent,#14b8a6);outline-offset:-1px}.tree-chevron{width:14px;color:var(--text-muted,#94a3b8);justify-content:center;align-items:center;font-size:.64rem;display:inline-flex}.chevron-arrow{transition:transform .15s;display:inline-block}.chevron-arrow.open{transform:rotate(90deg)}.chevron-spacer{width:14px}.tree-icon{font-size:var(--nav-icon-size);justify-content:center;align-items:center;width:16px;display:inline-flex}.tree-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.tree-badges{align-items:center;gap:4px;margin-left:auto;padding-right:6px;display:flex}.badge-symbols{font-size:var(--nav-badge-font-size);color:#67e8f9;font-family:var(--font-family-mono,monospace);background:#0891b226;border:1px solid #0891b24d;border-radius:8px;padding:1px 5px}.badge-routes{font-size:var(--nav-badge-font-size);color:#5eead4;font-family:var(--font-family-mono,monospace);background:#14b8a62e;border:1px solid #14b8a659;border-radius:8px;padding:1px 5px;font-weight:600}.nav-outline-pane{flex-direction:column;height:100%;display:flex}.nav-symbol-list{flex-direction:column;gap:4px;padding:6px 8px;display:flex}.nav-symbol-item{border:1px solid var(--border-card,#15474d);padding:var(--nav-card-padding);cursor:pointer;background:#0d2c2f66;border-radius:6px;flex-direction:column;gap:6px;transition:all .15s;display:flex}.nav-symbol-item:hover{background:#15474d66;border-color:#14b8a666}.nav-symbol-item.active{border-color:var(--accent,#14b8a6);background:#0891b238;box-shadow:0 0 10px #14b8a626}.symbol-header-row{justify-content:space-between;align-items:center;gap:8px;display:flex}.symbol-name-col{align-items:center;gap:6px;display:flex;overflow:hidden}.symbol-name-text{font-weight:600;font-size:var(--nav-font-size);color:var(--text,#f8fafc);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.symbol-meta-col{flex-shrink:0}.symbol-line-badge{font-size:var(--nav-badge-font-size);color:var(--text-muted,#94a3b8);font-family:var(--font-family-mono,monospace);background:#00000040;border-radius:4px;padding:1px 6px}.symbol-kind-badge{text-transform:uppercase;letter-spacing:.03em;border-radius:4px;flex-shrink:0;padding:1px 5px;font-size:.65rem;font-weight:700}.kind-class{color:#c084fc;background:#a855f733;border:1px solid #a855f766}.kind-function{color:#60a5fa;background:#3b82f633;border:1px solid #3b82f666}.kind-variable{color:#fbbf24;background:#f59e0b33;border:1px solid #f59e0b66}.kind-type{color:#2dd4bf;background:#14b8a633;border:1px solid #14b8a666}.kind-default{color:#cbd5e1;background:#94a3b833;border:1px solid #94a3b84d}.symbol-route-row{background:#0000004d;border-radius:4px;align-items:center;gap:6px;padding:3px 6px;font-size:.74rem;display:flex;overflow:hidden}.route-method-badge{text-transform:uppercase;border-radius:3px;flex-shrink:0;padding:1px 5px;font-size:.64rem;font-weight:700}.method-get{color:#a7f3d0;background:#065f46}.method-post{color:#bfdbfe;background:#1e40af}.method-put{color:#fde68a;background:#92400e}.method-delete{color:#fecaca;background:#991b1b}.method-patch{color:#ddd6fe;background:#5b21b6}.method-other{color:#e5e7eb;background:#374151}.route-path-text{font-family:var(--font-family-mono,monospace);color:#67e8f9;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.route-framework-tag{color:var(--text-muted,#94a3b8);margin-left:auto;padding-left:4px;font-size:.62rem}.symbol-signature-snippet{background:var(--code-bg,#00000059);font-family:var(--font-family-mono,monospace);color:#cbd5e1;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;padding:4px 6px;font-size:.72rem;overflow-x:hidden}.nav-inspector-pane{box-sizing:border-box;flex-direction:column;min-width:0;max-width:100%;height:100%;display:flex;overflow-x:hidden}.nav-copy-permalink-btn{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);cursor:pointer;box-sizing:border-box;background:#00000059;border-radius:6px;align-items:center;gap:6px;max-width:100%;padding:4px 10px;font-size:.76rem;transition:all .15s;display:flex}.nav-copy-permalink-btn:hover{color:var(--accent,#14b8a6);border-color:var(--accent,#14b8a6)}.nav-inspector-body{box-sizing:border-box;flex-direction:column;gap:12px;min-width:0;max-width:100%;display:flex}.inspector-card{background:var(--bg-card,#0d2c2f);border:1px solid var(--border-card,#15474d);padding:var(--nav-card-padding);box-sizing:border-box;border-radius:8px;min-width:0;max-width:100%;overflow-x:hidden}.card-section-title{color:var(--text-muted,#94a3b8);text-transform:uppercase;letter-spacing:.04em;align-items:center;gap:6px;margin-bottom:8px;font-size:.8rem;font-weight:600;display:flex}.symbol-summary-card{flex-direction:column;gap:6px;display:flex}.summary-title-row{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;max-width:100%;display:flex}.summary-name{color:#fff;overflow-wrap:anywhere;word-break:break-word;min-width:0;font-size:1.15rem;font-weight:700}.summary-location-row{color:var(--text-muted,#94a3b8);align-items:center;gap:12px;font-size:.8rem;display:flex}.summary-file-path{color:var(--accent-light,#2dd4bf);font-family:var(--font-family-mono,monospace);align-items:center;gap:4px;display:flex}.summary-line-range{font-family:var(--font-family-mono,monospace);background:#0000004d;border-radius:4px;padding:1px 6px}.inspector-metrics-grid{grid-template-columns:repeat(4,1fr);gap:10px;display:grid}.metric-box{background:var(--bg-card,#0d2c2f);border:1px solid var(--border-card,#15474d);text-align:center;border-radius:8px;flex-direction:column;align-items:center;padding:10px;display:flex}.metric-label{color:var(--text-muted,#94a3b8);margin-bottom:4px;font-size:.72rem}.metric-value{color:var(--accent,#14b8a6);font-size:1.25rem;font-weight:700}.metric-lang{text-transform:uppercase;font-size:.95rem}.route-detail-row{align-items:center;gap:8px;display:flex}.route-path-code{font-family:var(--font-family-mono,monospace);color:#67e8f9;font-size:.88rem;font-weight:600}.signature-code-block{background:var(--code-bg,#00000059);font-family:var(--font-family-mono,monospace);color:#f1f5f9;white-space:pre-wrap;word-break:break-all;border:1px solid #ffffff0d;border-radius:6px;padding:10px;font-size:.82rem;overflow-x:auto}.docstring-text{color:#cbd5e1;white-space:pre-wrap;font-size:.84rem;line-height:1.5}.relation-list{flex-direction:column;gap:6px;display:flex}.relation-item{border:1px solid var(--border-card,#15474d);background:#00000040;border-radius:6px;flex-direction:column;gap:4px;padding:8px 10px;transition:all .15s;display:flex}.relation-item.caller-item,.relation-item.callee-item.is-clickable{cursor:pointer}.relation-item.caller-item:hover,.relation-item.callee-item.is-clickable:hover{border-color:var(--accent,#14b8a6);background:#0891b22e;transform:translate(2px)}.relation-top{justify-content:space-between;align-items:center;display:flex}.rel-top-right{align-items:center;gap:6px;display:flex}.rel-symbol-name{color:var(--text,#f8fafc);font-size:.82rem;font-weight:600}.rel-jump-hint{color:var(--accent-light,#2dd4bf);font-size:.72rem;font-weight:500}.relation-bottom{color:var(--text-muted,#94a3b8);align-items:center;gap:8px;font-size:.74rem;display:flex}.rel-filepath{font-family:var(--font-family-mono,monospace);color:#93c5fd}.rel-line{font-family:var(--font-family-mono,monospace)}.rel-type-tag,.rel-type-badge{text-transform:uppercase;background:#ffffff14;border-radius:4px;padding:1px 5px;font-size:.64rem}.import-badge{color:#c084fc;background:#a855f726}.rel-count-badge{color:var(--accent-light,#2dd4bf);font-size:.65rem;font-weight:500;font-family:var(--font-family-mono,monospace);background:#14b8a626;border-radius:4px;padding:1px 5px}.nav-no-items-text{color:var(--text-muted,#94a3b8);font-size:.8rem;font-style:italic}.nav-empty-state{text-align:center;color:var(--text-muted,#94a3b8);flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:32px 16px;display:flex}.nav-empty-state .empty-icon{opacity:.5;margin-bottom:4px;font-size:2rem}.nav-empty-state h4{color:var(--text,#f8fafc);font-size:.95rem}.nav-empty-state p{max-width:280px;font-size:.8rem}.nav-clear-filter-btn{background:var(--primary,#0891b2);color:#fff;cursor:pointer;border:none;border-radius:4px;margin-top:6px;padding:4px 10px;font-size:.76rem}.nav-loading-wrapper{color:var(--text-muted,#94a3b8);flex-direction:column;justify-content:center;align-items:center;gap:12px;padding:40px 16px;font-size:.84rem;display:flex}.nav-spinner{border:2px solid var(--border-card,#15474d);border-top-color:var(--accent,#14b8a6);border-radius:50%;width:24px;height:24px;animation:.8s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.nav-outline-skeleton,.nav-inspector-skeleton{flex-direction:column;gap:10px;padding:12px;display:flex}.skeleton-item,.skeleton-header,.skeleton-metrics,.skeleton-block{background:#ffffff0d;border-radius:6px}.skeleton-item{height:48px}.skeleton-header{height:70px}.skeleton-metrics{height:60px}.skeleton-block{height:90px}.shimmer{position:relative;overflow:hidden}.shimmer:after{content:"";background:linear-gradient(90deg,#0000 0%,#ffffff0a 50%,#0000 100%);width:100%;height:100%;animation:1.5s infinite shimmer;position:absolute;top:0;left:0;transform:translate(-100%)}@keyframes shimmer{to{transform:translate(100%)}}.nav-inspector-header-actions{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;max-width:100%;display:flex}.nav-inspector-tabs{border:1px solid var(--border-card,#15474d);background:#0006;border-radius:6px;gap:2px;padding:2px;display:flex}.inspector-tab-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:4px 10px;font-size:.74rem;font-weight:500;transition:all .15s}.inspector-tab-btn:hover{color:var(--text,#f8fafc)}.inspector-tab-btn.active{background:var(--primary,#0891b2);color:#fff}.nav-doc-reader{background:var(--bg-base,#07181b);flex-direction:column;height:100%;display:flex;overflow:hidden}.doc-reader-header{background:var(--bg-card,#0d2c2f);border-bottom:1px solid var(--border-card,#15474d);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;display:flex}.doc-reader-meta{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.doc-icon{flex-shrink:0;font-size:1.3rem}.doc-title-wrapper{flex-direction:column;gap:2px;min-width:0;display:flex}.doc-filename{color:var(--text,#f8fafc);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:.92rem;font-weight:600;overflow:hidden}.doc-meta-badges{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.doc-badge{color:var(--text-muted,#94a3b8);background:#ffffff0f;border:1px solid #ffffff14;border-radius:4px;padding:1px 6px;font-size:.7rem}.badge-path{color:var(--accent,#14b8a6);white-space:nowrap;text-overflow:ellipsis;max-width:250px;overflow:hidden}.doc-reader-actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.doc-view-toggle{border:1px solid var(--border-card,#15474d);background:#0006;border-radius:5px;padding:2px;display:flex}.doc-view-toggle .toggle-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:3px 8px;font-size:.72rem;transition:all .15s}.doc-view-toggle .toggle-btn.active{background:var(--primary,#0891b2);color:#fff}.doc-copy-btn{border:1px solid var(--border-card,#15474d);color:var(--text,#f8fafc);cursor:pointer;background:#ffffff0f;border-radius:5px;padding:4px 10px;font-size:.74rem;transition:all .2s}.doc-copy-btn:hover{background:var(--primary,#0891b2);color:#fff;border-color:var(--primary,#0891b2)}.doc-reader-body{background:var(--bg-base,#07181b);color:var(--text,#f8fafc);flex:1;padding:16px 20px;font-size:.88rem;line-height:1.6;overflow-y:auto}.doc-rendered-content{max-width:900px;margin:0 auto}.doc-h1{color:var(--text,#f8fafc);border-bottom:1px solid var(--border-card,#15474d);margin:16px 0 12px;padding-bottom:8px;font-size:1.5rem;font-weight:700}.doc-h2{color:var(--text,#f8fafc);border-bottom:1px solid #ffffff0f;margin:14px 0 10px;padding-bottom:6px;font-size:1.25rem;font-weight:600}.doc-h3{color:var(--accent-light,#2dd4bf);margin:12px 0 8px;font-size:1.05rem;font-weight:600}.doc-h4{color:var(--text,#f8fafc);margin:10px 0 6px;font-size:.95rem;font-weight:600}.doc-paragraph{color:#cbd5e1;margin:0 0 10px}.doc-inline-code{font-family:var(--font-family-mono,monospace);color:var(--accent-light,#2dd4bf);background:#00000073;border:1px solid #ffffff1a;border-radius:4px;padding:2px 6px;font-size:.82rem}.doc-code-block{border:1px solid var(--border-card,#15474d);font-family:var(--font-family-mono,monospace);color:#e2e8f0;background:#0000008c;border-radius:6px;margin:12px 0;padding:12px 14px;font-size:.82rem;line-height:1.5;overflow-x:auto}.doc-quote{border-left:3px solid var(--primary,#0891b2);color:var(--text-muted,#94a3b8);background:#0891b214;border-radius:0 6px 6px 0;margin:10px 0;padding:6px 14px;font-style:italic}.doc-list-item,.doc-numbered-item{color:#cbd5e1;margin-bottom:4px;margin-left:20px}.doc-divider{border:none;border-top:1px solid var(--border-card,#15474d);margin:16px 0}.doc-blank-line{height:8px}.doc-raw-container{font-family:var(--font-family-mono,monospace);font-size:.82rem;overflow-x:auto}.doc-raw-pre{margin:0}.doc-lines-table{border-collapse:collapse;width:100%}.doc-line-row:hover{background:#ffffff08}.doc-line-num{text-align:right;color:#94a3b880;-webkit-user-select:none;user-select:none;vertical-align:top;border-right:1px solid #ffffff0f;width:45px;padding:2px 10px 2px 4px}.doc-line-code{white-space:pre-wrap;word-break:break-all;color:#e2e8f0;padding:2px 12px}.doc-reader-loading{flex-direction:column;gap:12px;padding:20px;display:flex}.doc-reader-error{color:var(--danger,#ef4444);flex-direction:column;align-items:flex-start;gap:10px;padding:20px;display:flex}.nav-mobile-pane-switcher{background:var(--bg-card,#0d2c2f);border-bottom:1px solid var(--border-card,#15474d);z-index:5;gap:6px;padding:6px 12px;display:none}.mobile-pane-btn{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);cursor:pointer;text-align:center;background:#0000004d;border-radius:5px;flex:1;padding:6px 8px;font-size:.78rem;font-weight:500;transition:all .15s}.mobile-pane-btn.active{background:var(--primary,#0891b2);color:#fff;border-color:var(--primary,#0891b2)}@media (width<=899px){.nav-mobile-pane-switcher{display:none}.nav-panes-layout{flex-direction:column;flex:1;gap:16px;height:auto;overflow:hidden auto}.nav-pane-column{border-right:none;border-bottom:1px solid var(--border,#334155);height:auto;min-height:320px;flex:none!important;width:100%!important;min-width:0!important;max-width:100%!important;display:flex!important}.nav-toolbar{flex-direction:column;align-items:stretch;gap:10px;padding:10px 12px}.nav-toolbar-left{justify-content:space-between;width:100%}.nav-toolbar-center{width:100%;max-width:100%}.nav-toolbar-right{justify-content:space-between;width:100%}}@media (width>=900px){.nav-mobile-pane-switcher{display:none}.nav-pane-column{display:flex!important}} diff --git a/frontend/dist/index.html b/frontend/dist/index.html index c2bb4bf..bb04f2e 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -17,8 +17,8 @@ } catch (e) {} })(); - - + +
diff --git a/frontend/e2e/layout-inspector.spec.ts b/frontend/e2e/layout-inspector.spec.ts index ff9f545..57f8882 100644 --- a/frontend/e2e/layout-inspector.spec.ts +++ b/frontend/e2e/layout-inspector.spec.ts @@ -162,6 +162,69 @@ async function setupLayoutMocks(page: any) { await page.route('**/admin/api/graph/topology*', async (route: any) => { await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify(mockTopology) }); }); + await page.route('**/admin/api/navigator/tree*', async (route: any) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + repo: '__all__', + total_files: 2, + total_symbols: 4, + tree: [ + { + id: 'dir:app', + name: 'app', + is_dir: true, + path: 'app', + symbol_count: 4, + children: [ + { id: 'file:app/main.py', name: 'main.py', is_dir: false, path: 'app/main.py', language: 'python', symbol_count: 4 } + ] + }, + { id: 'file:README.md', name: 'README.md', is_dir: false, path: 'README.md', language: 'markdown', symbol_count: 0 } + ] + }) + }); + }); + await page.route('**/admin/api/navigator/file-outline*', async (route: any) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + repo: '__all__', + filepath: 'app/main.py', + language: 'python', + symbols: [ + { id: 1, name: 'init_app', full_symbol: 'app.main.init_app', kind: 'function', start_line: 1, end_line: 20, signature: 'def init_app():' } + ] + }) + }); + }); + await page.route('**/admin/api/navigator/symbol-impact*', async (route: any) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + symbol: { id: 1, name: 'init_app', full_symbol: 'app.main.init_app', kind: 'function', filepath: 'app/main.py', start_line: 1, end_line: 20, signature: 'def init_app():', docstring: 'Initializes application.', language: 'python', repo: 'app' }, + route: null, + callers: [], + callees: [], + imports: [] + }) + }); + }); + await page.route('**/admin/api/files/read*', async (route: any) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + filepath: 'README.md', + content: '# ContextCortex\n\nFast code and doc search.', + total_lines: 3, + language: 'markdown' + }) + }); + }); } async function navigateTab(page: any, tabName: string) { @@ -291,4 +354,30 @@ test.describe('Playwright Layout Inspector UI UX Audits', () => { await page.locator('button.btn-close').click(); await expect(page.locator('.modal-card')).not.toBeVisible(); }); + + test('8. Navigator Tab - Desktop 3-Pane Zero Element Collisions & Layout Fit', async ({ page }) => { + await page.setViewportSize({ width: 1920, height: 1080 }); + await navigateTab(page, 'Navigator'); + + await expect(page.locator('[data-testid="code-navigator-container"]')).toBeVisible(); + await expect(page).toHaveNoLayoutOverflow(); + await expect(page).toHaveNoElementCollisions(); + + const inspector = new LayoutInspector(page); + const audit = await inspector.audit({ + device: getDevicePreset('Desktop 1080p'), + includeScreenshot: false, + }); + expect(audit.overflowIssues.length).toBe(0); + }); + + test('9. Navigator Tab - Mobile Responsive Stack & Layout Fit', async ({ page }) => { + const s25 = getDevicePreset('Samsung Galaxy S25'); + await page.setViewportSize({ width: s25.width, height: s25.height }); + await navigateTab(page, 'Navigator'); + + await expect(page.locator('[data-testid="code-navigator-container"]')).toBeVisible(); + await expect(page).toHaveNoLayoutOverflow(); + await expect(page).toHaveNoElementCollisions(); + }); }); diff --git a/frontend/e2e/navigator.spec.ts b/frontend/e2e/navigator.spec.ts index c125b05..a751700 100644 --- a/frontend/e2e/navigator.spec.ts +++ b/frontend/e2e/navigator.spec.ts @@ -338,7 +338,18 @@ async function setupNavigatorMocks(page: any) { await page.route('**/admin/api/navigator/file-outline*', async (route: any) => { const url = decodeURIComponent(route.request().url()); - if (url.includes('tests/e2e/test_chat.py')) { + if (url.includes('README.md')) { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + repo: '__all__', + filepath: 'README.md', + language: 'markdown', + symbols: [], + }), + }); + } else if (url.includes('tests/e2e/test_chat.py')) { await route.fulfill({ status: 200, contentType: 'application/json', @@ -353,6 +364,19 @@ async function setupNavigatorMocks(page: any) { } }); + await page.route('**/admin/api/files/read*', async (route: any) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + filepath: 'README.md', + content: '# ContextCortex Documentation\n\nFull documentation reader is active.\n\n## Features\n\n- Hybrid Vector and Lexical Search\n- Interactive AST Symbol Navigator\n- Markdown and Source Code Viewer', + total_lines: 8, + language: 'markdown', + }), + }); + }); + await page.route('**/admin/api/navigator/symbol-impact*', async (route: any) => { const url = decodeURIComponent(route.request().url()); if (url.includes('symbol_id=301')) { @@ -623,7 +647,8 @@ test.describe('Codebase Navigator End-to-End Suite', () => { await expect(container).toHaveClass(/density-balanced/); }); - test('7. Responsive Layout Audit: zero overflow and stable 3-pane layout across viewports', async ({ page }) => { + test('7. Responsive Layout Audit: zero overflow, zero element collisions, and stable layout across desktop and mobile', async ({ page }) => { + // Desktop 1080p await page.setViewportSize({ width: 1920, height: 1080 }); await navigateToNavigator(page); @@ -631,8 +656,9 @@ test.describe('Codebase Navigator End-to-End Suite', () => { await page.locator('button[aria-label="Expand All"]').click(); await page.locator('.nav-tree-item').filter({ has: page.locator('.tree-label:text-is("chat.py")') }).click(); - // Assert zero horizontal overflow + // Assert zero horizontal overflow and zero element collisions await expect(page).toHaveNoLayoutOverflow(); + await expect(page).toHaveNoElementCollisions(); // Layout Inspector UX Audit const inspector = new LayoutInspector(page); @@ -642,5 +668,44 @@ test.describe('Codebase Navigator End-to-End Suite', () => { }); expect(audit.overflowIssues.length).toBe(0); + + // Mobile Viewport (Samsung Galaxy S25: 360x780) + const s25 = getDevicePreset('Samsung Galaxy S25'); + await page.setViewportSize({ width: s25.width, height: s25.height }); + await page.waitForTimeout(200); + + await expect(page).toHaveNoLayoutOverflow(); + await expect(page).toHaveNoElementCollisions(); + }); + + test('8. Document Reader: opens markdown document, renders full content and switches between rendered and source view', async ({ page }) => { + await navigateToNavigator(page); + + // Locate README.md in tree and click + const readmeFile = page.locator('.nav-tree-item').filter({ has: page.locator('.tree-label:text-is("README.md")') }); + await expect(readmeFile).toBeVisible(); + await readmeFile.click(); + + // Verify Outline shows doc state + const docState = page.locator('[data-testid="outline-doc-state"]'); + await expect(docState).toBeVisible(); + await expect(docState).toContainText('Document File Selected'); + + // Verify Inspector renders NavigatorDocReader + const docReader = page.locator('[data-testid="nav-doc-reader"]'); + await expect(docReader).toBeVisible(); + await expect(docReader.locator('.doc-filename')).toContainText('README.md'); + await expect(docReader.locator('.doc-rendered-content')).toBeVisible(); + await expect(docReader.locator('.doc-rendered-content')).toContainText('ContextCortex Documentation'); + await expect(docReader.locator('.doc-rendered-content')).toContainText('Hybrid Vector and Lexical Search'); + + // Switch to Raw Source tab + await docReader.getByRole('button', { name: 'Raw Source' }).click(); + await expect(docReader.locator('.doc-lines-table')).toBeVisible(); + await expect(docReader.locator('.doc-lines-table')).toContainText('ContextCortex Documentation'); + + // Switch back to Rendered View + await docReader.getByRole('button', { name: 'Rendered' }).click(); + await expect(docReader.locator('.doc-rendered-content')).toBeVisible(); }); }); diff --git a/frontend/package.json b/frontend/package.json index 89891bf..27465d1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,7 +11,7 @@ "test": "vitest run --configLoader native", "test:coverage": "vitest run --coverage --configLoader native", "test:e2e": "playwright test", - "test:layout": "playwright test e2e/layout-inspector.spec.ts", + "test:layout": "playwright test e2e/layout-inspector.spec.ts e2e/navigator.spec.ts", "inspect:layout": "node --experimental-strip-types scripts/inspect_layout.ts" }, "dependencies": { diff --git a/frontend/scripts/inspect_layout.ts b/frontend/scripts/inspect_layout.ts index 99d296a..1579468 100644 --- a/frontend/scripts/inspect_layout.ts +++ b/frontend/scripts/inspect_layout.ts @@ -27,8 +27,11 @@ const VIEWPORTS: ViewportConfig[] = [ const TABS = [ { id: 'overview', name: 'Overview' }, + { id: 'navigator', name: 'Navigator' }, { id: 'git-repos', name: 'Git Repositories' }, { id: 'local-paths', name: 'Local Paths' }, + { id: 'local-storage', name: 'Local Storage' }, + { id: 'ingestion-catalog', name: 'Ingestion Catalog' }, { id: 'search-inspector', name: 'Search & Inspector' }, { id: 'settings', name: 'Settings' }, { id: 'diagnostics', name: 'Diagnostics & Logs' }, @@ -334,6 +337,50 @@ async function setupRouteMocks(page: Page) { body: JSON.stringify({ status: 'indexing_started' }) }); }); + + await page.route('**/admin/api/navigator/tree*', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + repo: '__all__', + total_files: 2, + total_symbols: 4, + tree: [ + { id: 'file:app/main.py', name: 'main.py', is_dir: false, path: 'app/main.py', language: 'python', symbol_count: 4 }, + { id: 'file:README.md', name: 'README.md', is_dir: false, path: 'README.md', language: 'markdown', symbol_count: 0 } + ] + }) + }); + }); + + await page.route('**/admin/api/navigator/file-outline*', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + repo: '__all__', + filepath: 'app/main.py', + language: 'python', + symbols: [ + { id: 1, name: 'init_app', full_symbol: 'app.main.init_app', kind: 'function', start_line: 1, end_line: 20, signature: 'def init_app():' } + ] + }) + }); + }); + + await page.route('**/admin/api/files/read*', async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + filepath: 'README.md', + content: '# ContextCortex\n\nFast code and doc search.', + total_lines: 3, + language: 'markdown' + }) + }); + }); } async function navigateToTab(page: Page, tabName: string, isMobile: boolean) { diff --git a/frontend/src/CodeNavigator.tsx b/frontend/src/CodeNavigator.tsx index 3975f29..d9d65be 100644 --- a/frontend/src/CodeNavigator.tsx +++ b/frontend/src/CodeNavigator.tsx @@ -7,6 +7,7 @@ import type { SymbolOutlineItem, SymbolImpact, RepoOption, + FileContentResult, } from './components/navigator/types'; import { NavigatorToolbar } from './components/navigator/NavigatorToolbar'; import { NavigatorTree } from './components/navigator/NavigatorTree'; @@ -59,6 +60,12 @@ export const CodeNavigator: React.FC = ({ const [symbolImpact, setSymbolImpact] = useState(null); const [loadingImpact, setLoadingImpact] = useState(false); + // Full File / Document Content state + const [fileContent, setFileContent] = useState(null); + const [loadingContent, setLoadingContent] = useState(false); + const [contentError, setContentError] = useState(null); + const [activeInspectorTab, setActiveInspectorTab] = useState<'intelligence' | 'reader'>('intelligence'); + // Error state const [errorMessage, setErrorMessage] = useState(null); @@ -128,7 +135,29 @@ export const CodeNavigator: React.FC = ({ } }, []); - // 4. Fetch file outline when selectedPath changes + // 4. Fetch full file content for document reading + const fetchFileContent = useCallback(async (repoName: string, filePath: string) => { + setLoadingContent(true); + setContentError(null); + try { + const res = await fetch( + `/admin/api/files/read?path=${encodeURIComponent(filePath)}&repo=${encodeURIComponent(repoName)}` + ); + if (!res.ok) { + throw new Error(`Failed to read file: ${res.statusText}`); + } + const data: FileContentResult = await res.json(); + setFileContent(data); + } catch (err: any) { + console.error('Error fetching file content:', err); + setContentError(err.message || 'Failed to read file content'); + setFileContent(null); + } finally { + setLoadingContent(false); + } + }, []); + + // 5. Fetch file outline when selectedPath changes const fetchOutline = useCallback( async (repoName: string, filePath: string, symbolToAutoSelect?: number | string) => { setLoadingOutline(true); @@ -142,7 +171,7 @@ export const CodeNavigator: React.FC = ({ const data: FileOutline = await res.json(); setFileOutline(data); - // Auto-select symbol + // Auto-select symbol or switch to reader mode if (data.symbols && data.symbols.length > 0) { let matched: SymbolOutlineItem | undefined; if (typeof symbolToAutoSelect === 'number') { @@ -154,17 +183,19 @@ export const CodeNavigator: React.FC = ({ } const targetSymbol = matched || data.symbols[0]; setSelectedSymbolId(targetSymbol.id); + setActiveInspectorTab('intelligence'); await fetchImpact(repoName, targetSymbol.id); } else { setSelectedSymbolId(null); setSymbolImpact(null); + setActiveInspectorTab('reader'); } - } catch (err: any) { console.error('Error fetching outline:', err); setFileOutline(null); setSelectedSymbolId(null); setSymbolImpact(null); + setActiveInspectorTab('reader'); } finally { setLoadingOutline(false); } @@ -172,7 +203,6 @@ export const CodeNavigator: React.FC = ({ [fetchImpact] ); - // Handlers const handleSelectRepo = (repo: string) => { setSelectedRepo(repo); @@ -180,16 +210,19 @@ export const CodeNavigator: React.FC = ({ setFileOutline(null); setSelectedSymbolId(null); setSymbolImpact(null); + setFileContent(null); }; const handleSelectFile = (node: NavigatorTreeNode) => { if (node.is_dir) return; setSelectedPath(node.path); fetchOutline(selectedRepo, node.path); + fetchFileContent(selectedRepo, node.path); }; const handleSelectSymbol = (symbol: SymbolOutlineItem) => { setSelectedSymbolId(symbol.id); + setActiveInspectorTab('intelligence'); fetchImpact(selectedRepo, symbol.id); }; @@ -197,12 +230,14 @@ export const CodeNavigator: React.FC = ({ const handleSelectCaller = (filePath: string, symbolName?: string, sourceSymbolId?: number) => { setSelectedPath(filePath); fetchOutline(selectedRepo, filePath, sourceSymbolId ?? symbolName); + fetchFileContent(selectedRepo, filePath); }; const handleSelectCallee = (filePath?: string, symbolName?: string) => { if (filePath) { setSelectedPath(filePath); fetchOutline(selectedRepo, filePath, symbolName); + fetchFileContent(selectedRepo, filePath); } }; @@ -243,7 +278,10 @@ export const CodeNavigator: React.FC = ({ {/* 3-Pane Responsive Layout */}
{/* Pane 1: File & Directory Tree */} -
+
= ({
{/* Pane 2: Symbol & Route Outline */} -
+
{ + setActiveInspectorTab('reader'); + }} density={density} loading={loadingOutline} />
- {/* Pane 3: Impact & Relationship Inspector */} -
+ {/* Pane 3: Impact & Relationship Inspector OR Document Reader */} +
selectedPath && fetchFileContent(selectedRepo, selectedPath)} />
diff --git a/frontend/src/components/navigator/NavigatorDocReader.tsx b/frontend/src/components/navigator/NavigatorDocReader.tsx new file mode 100644 index 0000000..bb74ebd --- /dev/null +++ b/frontend/src/components/navigator/NavigatorDocReader.tsx @@ -0,0 +1,229 @@ +import React, { useState } from 'react'; + +interface NavigatorDocReaderProps { + filepath: string; + content: string; + totalLines: number; + sizeBytes: number; + loading?: boolean; + error?: string | null; + onRefresh?: () => void; +} + +export const NavigatorDocReader: React.FC = ({ + filepath, + content, + totalLines, + sizeBytes, + loading = false, + error = null, + onRefresh, +}) => { + const isMarkdown = filepath.toLowerCase().endsWith('.md') || filepath.toLowerCase().endsWith('.markdown'); + const [viewMode, setViewMode] = useState<'rendered' | 'raw'>(isMarkdown ? 'rendered' : 'raw'); + const [copied, setCopied] = useState(false); + + const handleCopy = async () => { + if (!content) return; + try { + if (navigator?.clipboard?.writeText) { + await navigator.clipboard.writeText(content); + } + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch { + // Fallback + } + }; + + const formatSize = (bytes: number): string => { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; + }; + + const basename = filepath ? filepath.split('/').pop() || filepath : ''; + + // Simple safe Markdown parser for formatted preview + const renderMarkdown = (text: string) => { + const lines = text.split('\n'); + const elements: React.ReactNode[] = []; + let inCodeBlock = false; + let codeBlockLang = ''; + let codeBlockLines: string[] = []; + + lines.forEach((line, index) => { + // Code block toggle + if (line.trim().startsWith('```')) { + if (inCodeBlock) { + elements.push( +
+              {codeBlockLines.join('\n')}
+            
+ ); + codeBlockLines = []; + inCodeBlock = false; + } else { + inCodeBlock = true; + codeBlockLang = line.trim().slice(3); + } + return; + } + + if (inCodeBlock) { + codeBlockLines.push(line); + return; + } + + // Headings + if (line.startsWith('# ')) { + elements.push(

{line.slice(2)}

); + } else if (line.startsWith('## ')) { + elements.push(

{line.slice(3)}

); + } else if (line.startsWith('### ')) { + elements.push(

{line.slice(4)}

); + } else if (line.startsWith('#### ')) { + elements.push(

{line.slice(5)}

); + } else if (line.trim() === '---' || line.trim() === '***') { + elements.push(
); + } else if (line.startsWith('> ')) { + elements.push(
{line.slice(2)}
); + } else if (line.trim().startsWith('- ') || line.trim().startsWith('* ')) { + elements.push( +
  • + {formatInline(line.trim().slice(2))} +
  • + ); + } else if (/^\d+\.\s/.test(line.trim())) { + const itemText = line.trim().replace(/^\d+\.\s/, ''); + elements.push( +
  • + {formatInline(itemText)} +
  • + ); + } else if (line.trim() === '') { + elements.push(
    ); + } else { + elements.push(

    {formatInline(line)}

    ); + } + }); + + if (inCodeBlock && codeBlockLines.length > 0) { + elements.push( +
    +          {codeBlockLines.join('\n')}
    +        
    + ); + } + + return elements; + }; + + // Helper for inline bold, inline code, links + const formatInline = (text: string): React.ReactNode => { + // Process inline code `foo` + const parts = text.split(/(`[^`]+`)/); + return parts.map((part, i) => { + if (part.startsWith('`') && part.endsWith('`') && part.length >= 2) { + return {part.slice(1, -1)}; + } + // Process bold **text** + const boldParts = part.split(/(\*\*[^*]+\*\*)/); + return boldParts.map((bPart, j) => { + if (bPart.startsWith('**') && bPart.endsWith('**') && bPart.length >= 4) { + return {bPart.slice(2, -2)}; + } + return bPart; + }); + }); + }; + + return ( +
    + {/* Doc Reader Header */} +
    +
    + {isMarkdown ? '📝' : '📄'} +
    +

    {basename}

    +
    + {filepath} + {totalLines} lines + {formatSize(sizeBytes)} +
    +
    +
    + +
    + {isMarkdown && ( +
    + + +
    + )} + + +
    +
    + + {/* Doc Reader Body */} +
    + {loading ? ( +
    +
    +
    +
    +
    + ) : error ? ( +
    +

    Failed to load file content: {error}

    + {onRefresh && ( + + )} +
    + ) : viewMode === 'rendered' && isMarkdown ? ( +
    + {renderMarkdown(content)} +
    + ) : ( +
    +
    +              
    +                
    +                  {content.split('\n').map((line, idx) => (
    +                    
    +                      
    +                      
    +                    
    +                  ))}
    +                
    +              
    {idx + 1}{line || ' '}
    +
    +
    + )} +
    +
    + ); +}; diff --git a/frontend/src/components/navigator/NavigatorInspector.tsx b/frontend/src/components/navigator/NavigatorInspector.tsx index 7d5887d..844385f 100644 --- a/frontend/src/components/navigator/NavigatorInspector.tsx +++ b/frontend/src/components/navigator/NavigatorInspector.tsx @@ -1,24 +1,41 @@ import React, { useState } from 'react'; -import type { SymbolImpact, DensityMode } from './types'; +import type { SymbolImpact, DensityMode, FileContentResult } from './types'; import { getMethodBadgeClass, getKindBadgeClass } from './NavigatorOutline'; +import { NavigatorDocReader } from './NavigatorDocReader'; interface NavigatorInspectorProps { impact: SymbolImpact | null; + fileContent?: FileContentResult | null; + loadingContent?: boolean; + contentError?: string | null; + activeInspectorTab?: 'intelligence' | 'reader'; + onChangeInspectorTab?: (tab: 'intelligence' | 'reader') => void; onSelectCaller?: (filePath: string, symbolName?: string, sourceSymbolId?: number) => void; onSelectCallee?: (filePath?: string, symbolName?: string) => void; density?: DensityMode; loading?: boolean; + onRefreshContent?: () => void; } export const NavigatorInspector: React.FC = ({ impact, + fileContent, + loadingContent = false, + contentError = null, + activeInspectorTab, + onChangeInspectorTab, onSelectCaller, onSelectCallee, density = 'balanced', loading = false, + onRefreshContent, }) => { + const [internalTab, setInternalTab] = useState<'intelligence' | 'reader'>('intelligence'); const [copied, setCopied] = useState(false); + const currentTab = activeInspectorTab !== undefined ? activeInspectorTab : internalTab; + const setTab = onChangeInspectorTab || setInternalTab; + const handleCopyPermalink = async () => { if (!impact?.symbol) return; const { filepath, start_line, end_line } = impact.symbol; @@ -40,6 +57,8 @@ export const NavigatorInspector: React.FC = ({ const callees = impact?.callees || []; const imports = impact?.imports || []; + const showDocReader = (!symbol && (fileContent || loadingContent || contentError)) || (symbol && currentTab === 'reader'); + return (
    @@ -57,39 +76,76 @@ export const NavigatorInspector: React.FC = ({ - Code Intelligence & Impact + {showDocReader && !symbol ? 'Document & File Reader' : 'Code Intelligence & Impact'}
    - {symbol && ( - - )} +
    + {symbol && fileContent && ( +
    + + +
    + )} + + {symbol && currentTab === 'intelligence' && ( + + )} +
    - {loading ? ( + {showDocReader && fileContent ? ( + + ) : showDocReader && loadingContent ? ( +
    +
    +
    +
    +
    + ) : loading ? (
    @@ -99,8 +155,8 @@ export const NavigatorInspector: React.FC = ({ ) : !impact || !symbol ? (
    🔍
    -

    No Symbol Selected

    -

    Select a symbol from the outline to inspect its callers, dependencies, and impact.

    +

    No File or Symbol Selected

    +

    Select a file from the tree to read its documentation or select a symbol to inspect callers and dependencies.

    ) : (
    diff --git a/frontend/src/components/navigator/NavigatorOutline.tsx b/frontend/src/components/navigator/NavigatorOutline.tsx index 9c20f8f..df4f9eb 100644 --- a/frontend/src/components/navigator/NavigatorOutline.tsx +++ b/frontend/src/components/navigator/NavigatorOutline.tsx @@ -5,6 +5,7 @@ interface NavigatorOutlineProps { outline: FileOutline | null; selectedSymbolId: number | null; onSelectSymbol: (symbol: SymbolOutlineItem) => void; + onReadDoc?: () => void; density?: DensityMode; loading?: boolean; } @@ -49,13 +50,14 @@ export const NavigatorOutline: React.FC = ({ outline, selectedSymbolId, onSelectSymbol, + onReadDoc, density = 'balanced', loading = false, }) => { const [activeCategory, setActiveCategory] = useState('all'); const [filterQuery, setFilterQuery] = useState(''); - const symbols = outline?.symbols || []; + const symbols = useMemo(() => outline?.symbols || [], [outline?.symbols]); // Compute counts for category chips const counts = useMemo(() => { @@ -146,10 +148,12 @@ export const NavigatorOutline: React.FC = ({ {outline && ( <>
    - - - - + = ({

    Select a file from the tree to inspect its symbols and routes.

    ) : symbols.length === 0 ? ( -
    -
    ⚡
    -

    No Symbols Found

    -

    No symbols found in this file.

    +
    +
    📝
    +

    Document File Selected

    +

    + This file contains documentation or text content with no code AST symbols. +

    + {onReadDoc && ( + + )}
    ) : filteredSymbols.length === 0 ? (
    diff --git a/frontend/src/components/navigator/NavigatorToolbar.tsx b/frontend/src/components/navigator/NavigatorToolbar.tsx index d6846b1..3cc3c16 100644 --- a/frontend/src/components/navigator/NavigatorToolbar.tsx +++ b/frontend/src/components/navigator/NavigatorToolbar.tsx @@ -67,20 +67,22 @@ export const NavigatorToolbar: React.FC = ({
    {onSearchChange && (
    - - - - + = ({
    - - - - + { /> ); - expect(screen.getByText(/select a symbol from the outline/i)).toBeInTheDocument(); + expect(screen.getByText(/no file or symbol selected/i)).toBeInTheDocument(); + }); + + it('renders doc reader when fileContent is provided without an impact symbol', () => { + render( + + ); + + expect(screen.getByTestId('nav-doc-reader')).toBeInTheDocument(); + expect(screen.getByText('ContextCortex')).toBeInTheDocument(); + expect(screen.getByText(/full documentation reader is active/i)).toBeInTheDocument(); }); it('renders symbol metadata and metrics', () => { diff --git a/frontend/src/tests/NavigatorOutline.test.tsx b/frontend/src/tests/NavigatorOutline.test.tsx index 65eb233..1eb9366 100644 --- a/frontend/src/tests/NavigatorOutline.test.tsx +++ b/frontend/src/tests/NavigatorOutline.test.tsx @@ -78,7 +78,24 @@ describe('NavigatorOutline Component', () => { /> ); - expect(screen.getByText(/no symbols found in this file/i)).toBeInTheDocument(); + expect(screen.getByText(/document file selected/i)).toBeInTheDocument(); + }); + + it('renders read document button and handles click when onReadDoc is provided', () => { + const onReadDoc = vi.fn(); + render( + + ); + + const readBtn = screen.getByRole('button', { name: /read full document/i }); + expect(readBtn).toBeInTheDocument(); + fireEvent.click(readBtn); + expect(onReadDoc).toHaveBeenCalledTimes(1); }); it('renders file header with filepath and symbols', () => { diff --git a/tests/backend/test_db_and_tools.py b/tests/backend/test_db_and_tools.py index 2145673..716d6af 100644 --- a/tests/backend/test_db_and_tools.py +++ b/tests/backend/test_db_and_tools.py @@ -13,6 +13,7 @@ handle_index_status, handle_catalog_summary, handle_search_infrastructure_docs, handle_find_implementation_symbol, register_mcp_tools_and_resources ) +from app.services.vector_store import VectorDocument, VectorStoreManager @pytest.fixture def temp_db(tmp_path): @@ -174,6 +175,65 @@ async def test_handle_search_docs(): res_err = await handle_search_docs(query="crash") assert "Error executing doc search" in res_err +@pytest.mark.asyncio +async def test_handle_search_code_and_docs_real_integration(tmp_path): + """Real un-mocked verification of handle_search_code and handle_search_docs MCP tools.""" + storage_path = str(tmp_path / "qdrant_tools_test") + collection_name = "test_tools_rag" + + from app.services.database import set_vector_store_db_config + from app.services.vector_store import get_vector_store + + set_vector_store_db_config( + provider="qdrant", + mode="embedded", + storage_path=storage_path, + url="", + collection=collection_name, + ) + VectorStoreManager.reset_instance() + store = get_vector_store(force_reload=True) + + doc1 = VectorDocument( + id="code-auth-1", + text="def authenticate_jwt_user(token: str) -> bool:\n '''Validates bearer JWT token claims and scopes.'''\n return True", + repo="gateway-core", + doc_type="code", + language="python", + path="app/auth.py", + rel_path="app/auth.py", + title="auth.py", + symbol="authenticate_jwt_user", + start_line=1, + end_line=3, + ) + doc2 = VectorDocument( + id="doc-arch-1", + text="# System Architecture\nContextCortex uses hybrid vector and BM25 lexical retrieval.", + repo="docs-vault", + doc_type="doc", + path="docs/architecture.md", + rel_path="docs/architecture.md", + title="architecture.md", + heading="System Architecture", + start_line=1, + end_line=2, + ) + assert store.upsert_documents([doc1, doc2]) is True + + # Real un-mocked code search via MCP tool + res_code = await handle_search_code(query="authenticate JWT user", repo="gateway-core") + assert "app/auth.py" in res_code + assert "authenticate_jwt_user" in res_code + assert "Validates bearer JWT token" in res_code + assert "Relevance Score" in res_code + + # Real un-mocked doc search via MCP tool + res_doc = await handle_search_docs(query="hybrid BM25 retrieval", repo="docs-vault") + assert "docs/architecture.md" in res_doc + assert "System Architecture" in res_doc + assert "Relevance Score" in res_doc + @pytest.mark.asyncio async def test_handle_find_symbol(temp_db): with get_db_connection() as conn: diff --git a/tests/backend/test_health_check_status.py b/tests/backend/test_health_check_status.py index 696d4e6..357603d 100644 --- a/tests/backend/test_health_check_status.py +++ b/tests/backend/test_health_check_status.py @@ -59,3 +59,26 @@ def test_api_stats_reports_unhealthy_when_store_fails(mock_db): assert res.status_code == 200 data = res.json() assert data["vector_db_status"] == "Unhealthy" + +def test_api_stats_reports_healthy_with_real_embedded_store(tmp_path): + """Verify /admin/api/stats health check against a real embedded Qdrant vector store without mocks.""" + from app.services.database import set_vector_store_db_config + from app.services.vector_store import VectorStoreManager + + qdrant_dir = str(tmp_path / "real_health_qdrant") + set_vector_store_db_config( + provider="qdrant", + mode="embedded", + storage_path=qdrant_dir, + url="", + collection="test_health_check", + ) + VectorStoreManager.reset_instance() + + with patch("app.services.git_manager.check_github_rate_limit", return_value={"remaining": 5000, "limit": 5000}): + res = client.get("/admin/api/stats") + assert res.status_code == 200 + data = res.json() + assert data["vector_db_status"] == "Healthy" + assert data["vector_store_provider"] == "qdrant" + assert data["vector_store_mode"] == "embedded" diff --git a/tests/backend/test_search.py b/tests/backend/test_search.py index bf38626..d64a053 100644 --- a/tests/backend/test_search.py +++ b/tests/backend/test_search.py @@ -51,3 +51,78 @@ def test_execute_hybrid_search_exception(): results = execute_hybrid_search("query") assert results == [] + +def test_execute_hybrid_search_end_to_end_real(tmp_path, monkeypatch): + """ + Validates REAL hybrid retrieval without mocking get_vector_store or execute_hybrid_search. + Asserts both Markdown and PDF docs are matched under doc_type='doc'. + """ + from app.services.vector_store import get_vector_store, VectorStoreManager + from app.services.vector_store.base import VectorDocument + from app.services.database import set_vector_store_db_config + + qdrant_dir = str(tmp_path / "real_qdrant") + set_vector_store_db_config( + provider="qdrant", + mode="embedded", + storage_path=qdrant_dir, + url="", + collection="test_real_search", + ) + VectorStoreManager.reset_instance() + + store = get_vector_store(force_reload=True) + doc1 = VectorDocument( + id="code-1", + text="def authenticate_jwt_user(token: str): return True", + repo="backend", + doc_type="code", + language="python", + path="app/auth.py", + rel_path="app/auth.py", + title="auth.py", + symbol="authenticate_jwt_user", + start_line=1, + end_line=2, + ) + doc2 = VectorDocument( + id="doc-1", + text="ContextCortex Architecture Decision Record for Hybrid Search Retrieval", + repo="docs", + doc_type="doc", + path="docs/adr/001-search.md", + rel_path="docs/adr/001-search.md", + title="001-search.md", + heading="Architecture Decision", + start_line=1, + end_line=5, + ) + doc3 = VectorDocument( + id="pdf-1", + text="Operator Manual and Deployment Runbook for ContextCortex Gateway", + repo="ops", + doc_type="pdf", + path="docs/manual.pdf", + rel_path="docs/manual.pdf", + title="manual.pdf", + heading="Page 1", + start_line=1, + end_line=1, + ) + assert store.upsert_documents([doc1, doc2, doc3]) is True + + # 1. Search code + code_results = execute_hybrid_search("authenticate user", doc_type="code") + assert len(code_results) >= 1 + assert any(h.payload.get("symbol") == "authenticate_jwt_user" for h in code_results) + + # 2. Search doc -> should return Markdown doc + doc_results = execute_hybrid_search("Architecture Decision", doc_type="doc") + assert len(doc_results) >= 1 + assert any(h.payload.get("rel_path") == "docs/adr/001-search.md" for h in doc_results) + + # 3. Search doc -> should also find PDF doc! + pdf_results = execute_hybrid_search("Deployment Runbook Operator Manual", doc_type="doc") + assert len(pdf_results) >= 1 + assert any(h.payload.get("rel_path") == "docs/manual.pdf" for h in pdf_results) +