From 36857883d0010e253258cf819fe7a013497d6729 Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:17:19 -0500 Subject: [PATCH 1/9] docs(spec): add specification for navigator omni-search and full-file viewer --- ...2026-09-29-navigator-omni-search-design.md | 176 ++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 docs/superpowers/specs/2026-09-29-navigator-omni-search-design.md diff --git a/docs/superpowers/specs/2026-09-29-navigator-omni-search-design.md b/docs/superpowers/specs/2026-09-29-navigator-omni-search-design.md new file mode 100644 index 0000000..f4b74cb --- /dev/null +++ b/docs/superpowers/specs/2026-09-29-navigator-omni-search-design.md @@ -0,0 +1,176 @@ +# Specification: Navigator Omni-Search & Synchronized Full-File Code Viewer + +**Date:** 2026-09-29 +**Status:** Approved +**Target Version:** 2.17.0 +**Initiative:** ContextCortex Codebase Navigator Enhancement + +--- + +## 1. Executive Summary +The Codebase Navigator currently operates with siloed, in-memory filters (tree path filter in Pane 1 and active-file symbol filter in Pane 2) and isolates file inspection to single-symbol snippets. + +This specification introduces: +1. **Unified Omni-Search Engine**: A global search endpoint and UI that searches across Files, AST Symbols, and Raw Code text in parallel with match-type badges and confidence scoring. +2. **Floating Absolute Overlay (`position: absolute; z-index: 50`)**: A non-disruptive command palette dropdown that overlays the 3-pane layout without expanding headers or causing layout shifts. +3. **Synchronized Full-File Code Viewer**: A full source viewer in Pane 3 with language syntax highlighting, 1-based line numbers, auto-scrolling to target line ranges, and a docked "Symbol Intelligence & Impact" drawer for callers and callees. + +--- + +## 2. Architecture & Data Contracts + +### 2.1 Backend API Endpoint +- **Route:** `GET /admin/api/navigator/omni-search` +- **Parameters:** + - `repo` (`str`, required): Target repository or `"__all__"` + - `q` (`str`, required): Search query string + - `limit` (`int`, optional, default `25`): Maximum matches to return + +#### Response Schema: +```json +{ + "query": "api_read_file", + "repo": "__all__", + "total_matches": 3, + "execution_ms": 8.4, + "matches": [ + { + "id": "sym_42", + "type": "symbol", + "name": "api_read_file", + "kind": "function", + "filepath": "app/api/routers/files.py", + "repo": "contextcortex", + "start_line": 22, + "end_line": 49, + "score": 0.99, + "score_label": "99% AST exact match", + "preview": "async def api_read_file(path: str = Query(...), repo: Optional[str] = None...)" + }, + { + "id": "code_108", + "type": "code", + "name": "res = await api_read_file(path=target_path)", + "kind": "code_chunk", + "filepath": "app/mcp/handlers/file_handlers.py", + "repo": "contextcortex", + "start_line": 45, + "end_line": 46, + "score": 0.88, + "score_label": "88% Substring match", + "preview": "res = await api_read_file(path=target_path)" + }, + { + "id": "file_12", + "type": "file", + "name": "files.py", + "kind": "file", + "filepath": "app/api/routers/files.py", + "repo": "contextcortex", + "start_line": 1, + "end_line": 83, + "score": 0.92, + "score_label": "92% Filename match", + "preview": "app/api/routers/files.py (83 lines)" + } + ] +} +``` + +### 2.2 Matching Engine Logic (SQLite) +The service executes three queries against the local SQLite store: +1. **AST Symbols**: + - `SELECT id, name, kind, filepath, start_line, end_line, repo FROM symbols WHERE repo = ? AND name LIKE ? LIMIT ?` + - Exact case-insensitive match = score `0.99`, prefix match = `0.92`, substring = `0.85`. +2. **File Paths**: + - Matches filename or directory paths from indexed files table. + - Exact basename match = score `0.95`, path match = `0.85`. +3. **Full-Text / Code Chunks**: + - Queries `code_chunks` / `file_summaries` using SQLite `LIKE` or FTS. + - Scores normalized between `0.70` and `0.88`. +4. Merges and sorts results by `score DESC`, sliced to `limit`. + +--- + +## 3. Frontend Component Design + +### 3.1 `NavigatorOmniSearch` (Floating Palette) +- **Placement:** Integrated directly into `NavigatorToolbar`. +- **Overlay Positioning:** + ```css + .nav-omni-dropdown { + position: absolute; + top: calc(100% + 6px); + left: 0; + right: 0; + z-index: 50; + max-height: 420px; + overflow-y: auto; + background: var(--bg-card, #0f172a); + border: 1px solid var(--border-color, #334155); + border-radius: 8px; + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.5); + } + ``` + - **Constraint:** Must NEVER change the layout height of `NavigatorToolbar` or cause layout shifts on the 3 panes below. +- **Interactions:** + - `ArrowDown` / `ArrowUp` to cycle through matches. + - `Enter` to select highlighted match. + - `Escape` or clicking outside dismisses the dropdown. + - Type badges (`SYMBOL` in blue, `CODE` in purple, `DOCS` in amber, `FILE` in teal). + - Confidence pills with descriptive match rationale. + +### 3.2 Synchronized 3-Pane Navigation on Selection +When a match is selected: +1. **Pane 1 (File Tree)**: + - Expands parent directories and highlights the target file node. +2. **Pane 2 (Outline)**: + - Loads the file's AST symbols and sets the selected symbol chip. +3. **Pane 3 (Full Code Viewer)**: + - Loads complete file text via `GET /admin/api/files/read`. + - Scrolls smoothly to `start_line` with line range highlight styling. + - Displays header bar: file path, line count, copy permalink button, and "Callers & Impact" toggle button. + +### 3.3 Pane 3 Symbol Intelligence Drawer +- A toggle button in the Pane 3 header: `"Callers & Callees (N)"`. +- When clicked, a docked drawer slides in at the bottom (or side) displaying incoming callers, outgoing callees, and route specifications without displacing the main code viewing area. + +--- + +## 4. Error Handling & Edge Cases +1. **Empty Query / No Results:** + - Clearing search closes the overlay immediately. + - Zero matches displays a clean empty state: *"No matching files, symbols, or code found for '{query}'"*. +2. **Network / Debouncing:** + - Input debounced by 150ms. + - In-flight requests cancelled via `AbortController` on new keystrokes. +3. **Large File Protection:** + - For files $> 1\text{MB}$ or $> 10,000$ lines, renders line pagination with a notice, preventing DOM lockup. + +--- + +## 5. Verification & Testing Strategy (Anti-Theatre) + +### 5.1 Backend Verification (`pytest tests/backend/test_navigator_router.py`) +- Test `GET /admin/api/navigator/omni-search` with real SQLite database populated with multiple files, AST symbols, and code chunks. +- Assert exact symbol matches return `type: "symbol"` and score $\ge 0.95$. +- Assert substring code matches return `type: "code"` and line ranges. +- Assert filename matches return `type: "file"`. +- Assert empty results return 200 with `matches: []`. + +### 5.2 Frontend Component Tests (`vitest frontend/src/tests/`) +- `NavigatorOmniSearch.test.tsx`: + - Renders input with placeholder. + - Fires debounced query on typing. + - Renders match cards with type badges and confidence scores. + - Navigates items with `ArrowDown`/`ArrowUp` and triggers selection callback on `Enter` / click. + - Closes on `Escape` and outside click. +- `NavigatorCodeViewer.test.tsx`: + - Renders line numbers 1 to N. + - Highlights specified line range (`targetStartLine` to `targetEndLine`). + - Toggles callers/callees impact drawer. + +### 5.3 Playwright Layout & E2E Tests (`frontend/e2e/navigator.spec.ts`) +- Use `layout-inspector` to assert `NavigatorToolbar` height remains static when the omni-search overlay opens. +- Assert overlay has `position: absolute` and does not intersect or push Pane 1, Pane 2, or Pane 3. +- Assert selecting a match navigates and highlights target lines across desktop (1080p) and mobile (Samsung Galaxy S25+). From f0a9bc526bd9de52a0a11736487644e574404104 Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:28:07 -0500 Subject: [PATCH 2/9] docs(plan): add implementation plan for navigator omni-search and full-file viewer --- .../2026-09-29-navigator-omni-search-plan.md | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 docs/superpowers/plans/2026-09-29-navigator-omni-search-plan.md diff --git a/docs/superpowers/plans/2026-09-29-navigator-omni-search-plan.md b/docs/superpowers/plans/2026-09-29-navigator-omni-search-plan.md new file mode 100644 index 0000000..1c92447 --- /dev/null +++ b/docs/superpowers/plans/2026-09-29-navigator-omni-search-plan.md @@ -0,0 +1,163 @@ +# Navigator Omni-Search & Synchronized Full-File Code Viewer Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Implement a global Omni-Search engine that searches across AST symbols, files, and raw code text with confidence scores, paired with a floating non-shifting dropdown palette and a synchronized full-file code viewer in Pane 3. + +**Architecture:** A unified backend SQLite query searches indexed symbols, files, and code chunks with confidence scoring. The frontend introduces `NavigatorOmniSearch` as an absolute floating overlay (`z-index: 50`) in the toolbar, and `NavigatorCodeViewer` in Pane 3 with syntax highlighting, 1-based line numbers, auto-scroll to target symbols, and a docked impact drawer. + +**Tech Stack:** FastAPI, SQLite, React 19, TypeScript, Vitest, Playwright Layout Inspector. + +## Global Constraints +- Target version: 2.16.0 (or incremented in release) +- Omni-Search dropdown must have `position: absolute; z-index: 50` and NEVER expand `NavigatorToolbar` height or shift the 3 panes. +- All backend tests must use real SQLite database fixtures (zero mock theatre). +- Line numbers in code viewer are 1-based. +- Zero layout collisions across desktop (1080p) and mobile (Samsung Galaxy S25+). + +--- + +### Task 1: Backend Omni-Search Service & API Endpoint + +**Files:** +- Modify: `app/services/navigator.py` +- Modify: `app/api/routers/navigator.py` +- Test: `tests/backend/test_navigator_router.py` + +**Interfaces:** +- Produces: `get_omni_search(repo: str, query: str, limit: int = 25) -> dict` +- API Route: `GET /admin/api/navigator/omni-search?repo=...&q=...&limit=25` + +- [ ] **Step 1: Write the failing backend test** +Add tests in `tests/backend/test_navigator_router.py` for `api_get_omni_search` asserting symbol matches, file matches, and code matches with scores. + +- [ ] **Step 2: Run test to verify it fails** +Run: `pytest tests/backend/test_navigator_router.py::test_omni_search_endpoint -v` +Expected: FAIL with 404 Not Found. + +- [ ] **Step 3: Implement `get_omni_search` and router endpoint** +Implement multi-layer SQLite search in `app/services/navigator.py` and mount `GET /admin/api/navigator/omni-search` in `app/api/routers/navigator.py`. + +- [ ] **Step 4: Run test to verify it passes** +Run: `pytest tests/backend/test_navigator_router.py -v` +Expected: PASS. + +- [ ] **Step 5: Commit** +`git commit -m "feat(navigator): implement backend omni-search service and API endpoint"` + +--- + +### Task 2: Frontend Types & `NavigatorOmniSearch` Floating Palette Component + +**Files:** +- Modify: `frontend/src/components/navigator/types.ts` +- Create: `frontend/src/components/navigator/NavigatorOmniSearch.tsx` +- Modify: `frontend/src/styles/navigator.css` +- Test: `frontend/src/tests/NavigatorOmniSearch.test.tsx` + +**Interfaces:** +- Produces: `` +- Overlay: `.nav-omni-dropdown` with `position: absolute; top: calc(100% + 4px); z-index: 50`. + +- [ ] **Step 1: Write failing component tests** +Create `frontend/src/tests/NavigatorOmniSearch.test.tsx` testing input debounce, match list rendering, keyboard cycling, and outside dismissal. + +- [ ] **Step 2: Run test to verify it fails** +Run: `npm --prefix frontend run test -- NavigatorOmniSearch.test.tsx` +Expected: FAIL with component missing. + +- [ ] **Step 3: Implement `NavigatorOmniSearch` and CSS** +Implement floating overlay with type badges, confidence labels, and keyboard listeners. + +- [ ] **Step 4: Run test to verify it passes** +Run: `npm --prefix frontend run test -- NavigatorOmniSearch.test.tsx` +Expected: PASS. + +- [ ] **Step 5: Commit** +`git commit -m "feat(navigator): add NavigatorOmniSearch floating command palette"` + +--- + +### Task 3: Full-File Code Viewer (`NavigatorCodeViewer`) with Target Line Highlight & Impact Drawer + +**Files:** +- Create: `frontend/src/components/navigator/NavigatorCodeViewer.tsx` +- Modify: `frontend/src/components/navigator/NavigatorInspector.tsx` +- Modify: `frontend/src/styles/navigator.css` +- Test: `frontend/src/tests/NavigatorCodeViewer.test.tsx` + +**Interfaces:** +- Produces: `` + +- [ ] **Step 1: Write failing unit test** +Create `frontend/src/tests/NavigatorCodeViewer.test.tsx` verifying line rendering, auto-scrolling ref, target range highlighting, and impact drawer toggle. + +- [ ] **Step 2: Run test to verify it fails** +Run: `npm --prefix frontend run test -- NavigatorCodeViewer.test.tsx` +Expected: FAIL. + +- [ ] **Step 3: Implement `NavigatorCodeViewer`** +Implement line-numbered code viewer with target range styling and collapsible impact drawer. + +- [ ] **Step 4: Run test to verify it passes** +Run: `npm --prefix frontend run test -- NavigatorCodeViewer.test.tsx` +Expected: PASS. + +- [ ] **Step 5: Commit** +`git commit -m "feat(navigator): implement NavigatorCodeViewer with target line highlight and impact drawer"` + +--- + +### Task 4: Integrate Omni-Search & Code Viewer in `CodeNavigator` and `NavigatorToolbar` + +**Files:** +- Modify: `frontend/src/components/navigator/NavigatorToolbar.tsx` +- Modify: `frontend/src/CodeNavigator.tsx` +- Modify: `frontend/src/styles/navigator.css` +- Test: `frontend/src/tests/NavigatorInspector.test.tsx` + +- [ ] **Step 1: Update `NavigatorToolbar` and `CodeNavigator` wiring** +Replace simple text input with `NavigatorOmniSearch`. Wire result click to open file, sync outline, and jump to line. + +- [ ] **Step 2: Run all frontend unit tests** +Run: `npm --prefix frontend run test` +Expected: All 29+ test files pass. + +- [ ] **Step 3: Commit** +`git commit -m "feat(navigator): integrate omni-search and full code viewer into CodeNavigator"` + +--- + +### Task 5: Playwright E2E & Layout Inspector Verification + +**Files:** +- Modify: `frontend/e2e/navigator.spec.ts` + +- [ ] **Step 1: Add E2E tests for Omni-Search overlay and line jump** +Add test in `navigator.spec.ts` verifying overlay opens, has `position: absolute`, header height remains unchanged, and selecting match updates all 3 panes. + +- [ ] **Step 2: Run Playwright layout tests** +Run: `npm --prefix frontend run test:layout` +Expected: All tests pass. + +- [ ] **Step 3: Build frontend bundle & commit** +Run: `npm --prefix frontend run build` +`git add -f frontend/dist/ && git commit -m "test(navigator): verify omni-search overlay and full file viewer in layout e2e"` + +--- + +### Task 6: Documentation, Full CI Quality Verification & PR Submission + +**Files:** +- Modify: `docs/guide/user-guide/navigator.md` +- Modify: `README.md` + +- [ ] **Step 1: Update user documentation** +Document Omni-Search with match scores and Full Code Viewer with line jumps. + +- [ ] **Step 2: Run full verification suite** +Run `python3 scripts/verify_release.py --ci`, `pytest tests/`, `npm run docs:build`. + +- [ ] **Step 3: Push branch and create Pull Request** +`git push -u origin feat/navigator-omni-search-viewer` +`gh pr create --title "feat(navigator): add omni-search floating palette and full-file code viewer" ...` From 98dbd11476a885dd5158953bcf1c61d4698ea762 Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:29:03 -0500 Subject: [PATCH 3/9] feat(navigator): implement backend omni-search service and API endpoint --- app/api/routers/navigator.py | 15 +++ app/services/navigator.py | 158 +++++++++++++++++++++++++ tests/backend/test_navigator_router.py | 32 +++++ 3 files changed, 205 insertions(+) diff --git a/app/api/routers/navigator.py b/app/api/routers/navigator.py index 480c043..4b9cb8e 100644 --- a/app/api/routers/navigator.py +++ b/app/api/routers/navigator.py @@ -61,3 +61,18 @@ async def api_get_symbol_impact( except Exception as e: logger.error(f"Error getting symbol impact for {symbol_id} in {repo}: {e}") return JSONResponse(status_code=500, content={"error": "Failed to retrieve symbol impact."}) + + +@router.get("/admin/api/navigator/omni-search") +async def api_get_omni_search( + repo: str = Query(..., description="Repository name or '__all__'"), + q: str = Query("", description="Search query string"), + limit: int = Query(25, ge=1, le=100, description="Max matches to return") +): + try: + data = nav_service.get_omni_search(repo=repo, query=q, limit=limit) + return data + except Exception as e: + logger.error(f"Error executing omni-search for query '{q}' in {repo}: {e}") + return JSONResponse(status_code=500, content={"error": "Failed to execute omni-search."}) + diff --git a/app/services/navigator.py b/app/services/navigator.py index 2f8670b..168f159 100644 --- a/app/services/navigator.py +++ b/app/services/navigator.py @@ -263,3 +263,161 @@ def get_symbol_impact(repo: str, symbol_id: int) -> Optional[Dict[str, Any]]: "callees": [dict(c) for c in callees], "imports": [dict(i) for i in imports] } + + +def get_omni_search(repo: str, query: str, limit: int = 25) -> Dict[str, Any]: + raw_query = (query or "").strip() + if not raw_query: + return { + "query": "", + "repo": repo, + "total_matches": 0, + "matches": [] + } + + matches: List[Dict[str, Any]] = [] + like_q = f"%{raw_query}%" + lower_q = raw_query.lower() + + with get_db_connection() as conn: + repo_clause = "" if repo == "__all__" else " AND repo = ?" + repo_params = [] if repo == "__all__" else [repo] + + # 1. Search AST Symbols + sym_sql = f""" + SELECT id, repo, filepath, name, full_symbol, kind, start_line, end_line, signature + FROM ast_symbols + WHERE (name LIKE ? OR full_symbol LIKE ?){repo_clause} + LIMIT ? + """ + sym_params = [like_q, like_q] + repo_params + [limit] + for row in conn.execute(sym_sql, sym_params).fetchall(): + sym_name = row["name"] or "" + sym_lower = sym_name.lower() + + if sym_lower == lower_q: + score = 0.99 + label = "99% AST exact match" + elif sym_lower.startswith(lower_q): + score = 0.94 + label = "94% AST prefix match" + else: + score = 0.88 + label = "88% AST symbol match" + + preview = row["signature"] or f"{row['kind']} {sym_name}" + matches.append({ + "id": f"sym_{row['id']}", + "type": "symbol", + "symbol_id": row["id"], + "name": sym_name, + "kind": row["kind"], + "filepath": _clean_path(row["filepath"]), + "repo": row["repo"], + "start_line": row["start_line"], + "end_line": row["end_line"], + "score": score, + "score_label": label, + "preview": preview + }) + + # 2. Search File Paths + file_sql = f""" + SELECT filepath, repo, doc_type, language + FROM indexed_files + WHERE filepath LIKE ?{repo_clause} + LIMIT ? + """ + file_params = [like_q] + repo_params + [limit] + for row in conn.execute(file_sql, file_params).fetchall(): + fp = _clean_path(row["filepath"]) + fname = os.path.basename(fp) + fname_lower = fname.lower() + + if fname_lower == lower_q: + score = 0.96 + label = "96% Exact filename" + elif fname_lower.startswith(lower_q): + score = 0.92 + label = "92% Filename prefix" + else: + score = 0.85 + label = "85% Path substring" + + matches.append({ + "id": f"file_{fp}", + "type": "file", + "name": fname, + "kind": "file", + "filepath": fp, + "repo": row["repo"], + "start_line": 1, + "end_line": 1, + "score": score, + "score_label": label, + "preview": fp + }) + + # 3. Search API Routes + route_sql = f""" + SELECT id, repo, filepath, framework, http_method, path_pattern, handler_symbol, start_line, end_line + FROM api_routes + WHERE (path_pattern LIKE ? OR handler_symbol LIKE ?){repo_clause} + LIMIT ? + """ + route_params = [like_q, like_q] + repo_params + [limit] + for row in conn.execute(route_sql, route_params).fetchall(): + pat = row["path_pattern"] or "" + score = 0.95 if pat.lower() == lower_q else 0.89 + matches.append({ + "id": f"route_{row['id']}", + "type": "route", + "name": f"{row['http_method']} {pat}", + "kind": "route", + "filepath": _clean_path(row["filepath"]), + "repo": row["repo"], + "start_line": row["start_line"], + "end_line": row["end_line"], + "score": score, + "score_label": f"{int(score * 100)}% Route match", + "preview": f"{row['http_method']} {pat} -> {row['handler_symbol'] or ''}" + }) + + # 4. Search Code Chunks if table exists + try: + chunk_sql = f""" + SELECT id, repo, filepath, chunk_text, start_line, end_line + FROM code_chunks + WHERE chunk_text LIKE ?{repo_clause} + LIMIT ? + """ + chunk_params = [like_q] + repo_params + [limit] + for row in conn.execute(chunk_sql, chunk_params).fetchall(): + text = (row["chunk_text"] or "").strip() + preview = text.split("\n")[0][:120] + matches.append({ + "id": f"code_{row['id']}", + "type": "code", + "name": preview[:50], + "kind": "code", + "filepath": _clean_path(row["filepath"]), + "repo": row["repo"], + "start_line": row["start_line"], + "end_line": row["end_line"], + "score": 0.86, + "score_label": "86% Code match", + "preview": preview + }) + except Exception: + pass + + matches.sort(key=lambda m: m["score"], reverse=True) + final_matches = matches[:limit] + + return { + "query": raw_query, + "repo": repo, + "total_matches": len(final_matches), + "matches": final_matches + } + diff --git a/tests/backend/test_navigator_router.py b/tests/backend/test_navigator_router.py index e58de44..10437b2 100644 --- a/tests/backend/test_navigator_router.py +++ b/tests/backend/test_navigator_router.py @@ -187,3 +187,35 @@ def test_api_get_symbol_impact_not_found(client: TestClient, test_db): assert response.status_code == 404 data = response.json() assert "error" in data + + +def test_api_get_omni_search_symbols_and_files(client: TestClient, test_db): + # 1. Exact symbol match + res = client.get("/admin/api/navigator/omni-search?repo=test-repo&q=root_handler") + assert res.status_code == 200 + data = res.json() + assert data["query"] == "root_handler" + assert len(data["matches"]) >= 1 + match = data["matches"][0] + assert match["type"] == "symbol" + assert match["name"] == "root_handler" + assert match["filepath"] == "app/main.py" + assert match["score"] >= 0.95 + assert "AST exact" in match["score_label"] + + # 2. File path match + res_file = client.get("/admin/api/navigator/omni-search?repo=test-repo&q=helper.py") + assert res_file.status_code == 200 + file_matches = res_file.json()["matches"] + assert any(m["type"] == "file" and "helper.py" in m["filepath"] for m in file_matches) + + # 3. Empty query + res_empty = client.get("/admin/api/navigator/omni-search?repo=test-repo&q=") + assert res_empty.status_code == 200 + assert res_empty.json()["matches"] == [] + + # 4. No matches + res_none = client.get("/admin/api/navigator/omni-search?repo=test-repo&q=nonexistent_xyz_123") + assert res_none.status_code == 200 + assert res_none.json()["matches"] == [] + From 7bf74544204c1ad36b3cce626e29f78bfbe2e4ac Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:30:24 -0500 Subject: [PATCH 4/9] feat(navigator): add NavigatorOmniSearch floating command palette --- .../navigator/NavigatorOmniSearch.tsx | 252 ++++++++++++++++++ frontend/src/components/navigator/types.ts | 25 ++ frontend/src/styles/navigator.css | 252 ++++++++++++++++++ .../src/tests/NavigatorOmniSearch.test.tsx | 132 +++++++++ 4 files changed, 661 insertions(+) create mode 100644 frontend/src/components/navigator/NavigatorOmniSearch.tsx create mode 100644 frontend/src/tests/NavigatorOmniSearch.test.tsx diff --git a/frontend/src/components/navigator/NavigatorOmniSearch.tsx b/frontend/src/components/navigator/NavigatorOmniSearch.tsx new file mode 100644 index 0000000..f85c2ac --- /dev/null +++ b/frontend/src/components/navigator/NavigatorOmniSearch.tsx @@ -0,0 +1,252 @@ +import React, { useState, useEffect, useRef, useCallback } from 'react'; +import type { OmniSearchResultItem, OmniSearchResponse, OmniSearchMatchKind } from './types'; + +export interface NavigatorOmniSearchProps { + repo: string; + onSelectResult: (result: OmniSearchResultItem) => void; + placeholder?: string; +} + +export function getMatchBadgeClass(type: OmniSearchMatchKind): string { + switch (type) { + case 'symbol': + return 'badge-symbol'; + case 'code': + return 'badge-code'; + case 'file': + return 'badge-file'; + case 'route': + return 'badge-route'; + case 'doc': + return 'badge-doc'; + default: + return 'badge-default'; + } +} + +export const NavigatorOmniSearch: React.FC = ({ + repo, + onSelectResult, + placeholder = 'Search files, symbols, routes, or code text...', +}) => { + const [query, setQuery] = useState(''); + const [results, setResults] = useState([]); + const [loading, setLoading] = useState(false); + const [isOpen, setIsOpen] = useState(false); + const [activeIndex, setActiveIndex] = useState(-1); + + const containerRef = useRef(null); + const inputRef = useRef(null); + const abortControllerRef = useRef(null); + + // Debounced search + useEffect(() => { + const trimmed = query.trim(); + if (!trimmed) { + setResults([]); + setIsOpen(false); + setActiveIndex(-1); + return; + } + + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + } + const controller = new AbortController(); + abortControllerRef.current = controller; + + setLoading(true); + const timer = setTimeout(async () => { + try { + const res = await fetch( + `/admin/api/navigator/omni-search?repo=${encodeURIComponent(repo)}&q=${encodeURIComponent(trimmed)}&limit=25`, + { signal: controller.signal } + ); + if (res.ok) { + const data: OmniSearchResponse = await res.json(); + setResults(data.matches || []); + setIsOpen(true); + setActiveIndex(-1); + } + } catch (err: any) { + if (err.name !== 'AbortError') { + console.error('Omni-search error:', err); + } + } finally { + setLoading(false); + } + }, 150); + + return () => { + clearTimeout(timer); + controller.abort(); + }; + }, [query, repo]); + + // Click outside to dismiss + useEffect(() => { + const handleOutsideClick = (e: MouseEvent) => { + if (containerRef.current && !containerRef.current.contains(e.target as Node)) { + setIsOpen(false); + } + }; + document.addEventListener('mousedown', handleOutsideClick); + return () => document.removeEventListener('mousedown', handleOutsideClick); + }, []); + + // Keyboard navigation + const handleKeyDown = (e: React.KeyboardEvent) => { + if (!isOpen || results.length === 0) { + if (e.key === 'ArrowDown' && results.length > 0) { + setIsOpen(true); + } + return; + } + + if (e.key === 'ArrowDown') { + e.preventDefault(); + setActiveIndex((prev) => (prev < results.length - 1 ? prev + 1 : 0)); + } else if (e.key === 'ArrowUp') { + e.preventDefault(); + setActiveIndex((prev) => (prev > 0 ? prev - 1 : results.length - 1)); + } else if (e.key === 'Enter') { + e.preventDefault(); + if (activeIndex >= 0 && activeIndex < results.length) { + handleSelect(results[activeIndex]); + } + } else if (e.key === 'Escape') { + e.preventDefault(); + setIsOpen(false); + } + }; + + const handleSelect = useCallback( + (item: OmniSearchResultItem) => { + setIsOpen(false); + onSelectResult(item); + }, + [onSelectResult] + ); + + const handleClear = () => { + setQuery(''); + setResults([]); + setIsOpen(false); + setActiveIndex(-1); + inputRef.current?.focus(); + }; + + return ( +
+
+ + + + + + setQuery(e.target.value)} + onKeyDown={handleKeyDown} + onFocus={() => { + if (results.length > 0) setIsOpen(true); + }} + placeholder={placeholder} + aria-label="Omni-Search" + aria-autocomplete="list" + aria-expanded={isOpen} + /> + + {loading &&
} + + {query && ( + + )} +
+ + {/* Floating Absolute Overlay */} + {isOpen && ( +
+
+ + Matches ({results.length}) + + ↑↓ Navigate • Enter Select • Esc Close +
+ + {results.length === 0 && !loading && ( +
+ No matching files, symbols, or code found for "{query}" +
+ )} + +
+ {results.map((item, index) => { + const isSelected = index === activeIndex; + const badgeClass = getMatchBadgeClass(item.type); + + return ( +
handleSelect(item)} + onMouseEnter={() => setActiveIndex(index)} + role="option" + aria-selected={isSelected} + > +
+
+ + {item.type.toUpperCase()} + + {item.name} + {item.kind && item.kind !== item.type && ( + ({item.kind}) + )} +
+ {item.score_label} +
+ +
+ + {item.filepath} + {item.start_line > 0 && `:${item.start_line}`} + + {item.preview && item.preview !== item.name && ( + {item.preview} + )} +
+
+ ); + })} +
+
+ )} +
+ ); +}; diff --git a/frontend/src/components/navigator/types.ts b/frontend/src/components/navigator/types.ts index 26f5dc2..5e50001 100644 --- a/frontend/src/components/navigator/types.ts +++ b/frontend/src/components/navigator/types.ts @@ -118,3 +118,28 @@ export interface FileContentResult { source?: string; language?: string; } + +export type OmniSearchMatchKind = 'symbol' | 'file' | 'code' | 'route' | 'doc'; + +export interface OmniSearchResultItem { + id: string; + type: OmniSearchMatchKind; + name: string; + kind?: string; + filepath: string; + repo?: string; + symbol_id?: number; + start_line: number; + end_line: number; + score: number; + score_label: string; + preview: string; +} + +export interface OmniSearchResponse { + query: string; + repo: string; + total_matches: number; + matches: OmniSearchResultItem[]; +} + diff --git a/frontend/src/styles/navigator.css b/frontend/src/styles/navigator.css index 2369b20..cc56bda 100644 --- a/frontend/src/styles/navigator.css +++ b/frontend/src/styles/navigator.css @@ -180,6 +180,258 @@ color: var(--text, #f8fafc); } +/* ========================================================================== + Omni-Search Floating Command Palette + ========================================================================== */ +.nav-omni-container { + position: relative; + width: 100%; +} + +.nav-omni-input-wrapper { + position: relative; + display: flex; + align-items: center; + width: 100%; + background: rgba(0, 0, 0, 0.35); + border: 1px solid var(--border-card, #15474d); + border-radius: 6px; + padding: 0 10px; + transition: all 0.2s; + box-sizing: border-box; +} + +.nav-omni-input-wrapper:focus-within { + border-color: var(--primary, #0891b2); + box-shadow: 0 0 0 2px rgba(8, 145, 178, 0.25); +} + +.nav-omni-search-icon { + margin-right: 8px; + color: var(--text-muted, #94a3b8); + flex-shrink: 0; + pointer-events: none; +} + +.nav-omni-input { + flex: 1; + background: transparent; + border: none; + padding: 6px 0; + color: var(--text, #f8fafc); + font-size: 0.82rem; + outline: none; + min-width: 0; +} + +.nav-omni-clear-btn { + background: transparent; + border: none; + color: var(--text-muted, #94a3b8); + cursor: pointer; + font-size: 0.75rem; + padding: 2px 4px; + flex-shrink: 0; + margin-left: 4px; +} + +.nav-omni-clear-btn:hover { + color: var(--text, #f8fafc); +} + +.nav-omni-spinner { + width: 12px; + height: 12px; + border: 2px solid rgba(8, 145, 178, 0.3); + border-top-color: var(--primary, #0891b2); + border-radius: 50%; + animation: nav-spin 0.6s linear infinite; + margin-left: 6px; + flex-shrink: 0; +} + +@keyframes nav-spin { + to { transform: rotate(360deg); } +} + +/* Floating Dropdown - Absolute overlay with high z-index */ +.nav-omni-dropdown { + position: absolute; + top: calc(100% + 4px); + left: 0; + right: 0; + z-index: 50; + background: var(--bg-card, #0d2c2f); + border: 1px solid var(--border-card, #15474d); + border-radius: 8px; + box-shadow: 0 15px 30px rgba(0, 0, 0, 0.6), 0 5px 15px rgba(0, 0, 0, 0.4); + max-height: 420px; + display: flex; + flex-direction: column; + overflow: hidden; + backdrop-filter: blur(8px); +} + +.nav-omni-dropdown-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + background: rgba(0, 0, 0, 0.3); + border-bottom: 1px solid var(--border-card, #15474d); + font-size: 0.72rem; + font-weight: 600; + color: var(--text-muted, #94a3b8); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.nav-omni-hint { + font-size: 0.68rem; + color: var(--text-muted, #64748b); + text-transform: none; +} + +.nav-omni-empty { + padding: 16px; + text-align: center; + font-size: 0.8rem; + color: var(--text-muted, #94a3b8); +} + +.nav-omni-list { + overflow-y: auto; + padding: 4px; +} + +.nav-omni-item { + display: flex; + flex-direction: column; + padding: 8px 10px; + border-radius: 6px; + cursor: pointer; + transition: background-color 0.12s ease; + margin-bottom: 2px; + border: 1px solid transparent; +} + +.nav-omni-item:hover, +.nav-omni-item.active { + background: rgba(8, 145, 178, 0.15); + border-color: rgba(8, 145, 178, 0.35); +} + +.nav-omni-item-top { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 4px; + gap: 8px; +} + +.nav-omni-item-title-group { + display: flex; + align-items: center; + gap: 6px; + overflow: hidden; +} + +.nav-omni-badge { + font-size: 0.65rem; + font-weight: 700; + padding: 1px 5px; + border-radius: 3px; + text-transform: uppercase; + letter-spacing: 0.04em; + font-family: var(--font-mono, monospace); + flex-shrink: 0; +} + +.badge-symbol { + background: rgba(14, 165, 233, 0.2); + color: #38bdf8; + border: 1px solid rgba(56, 189, 248, 0.35); +} + +.badge-code { + background: rgba(168, 85, 247, 0.2); + color: #c084fc; + border: 1px solid rgba(192, 132, 252, 0.35); +} + +.badge-file { + background: rgba(20, 184, 166, 0.2); + color: #2dd4bf; + border: 1px solid rgba(45, 212, 191, 0.35); +} + +.badge-route { + background: rgba(34, 197, 94, 0.2); + color: #4ade80; + border: 1px solid rgba(74, 222, 128, 0.35); +} + +.badge-doc { + background: rgba(245, 158, 11, 0.2); + color: #fbbf24; + border: 1px solid rgba(251, 191, 36, 0.35); +} + +.badge-default { + background: rgba(148, 163, 184, 0.2); + color: #cbd5e1; +} + +.nav-omni-item-name { + font-size: 0.82rem; + font-weight: 600; + color: var(--text, #f8fafc); + font-family: var(--font-mono, monospace); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.nav-omni-item-kind { + font-size: 0.72rem; + color: var(--text-muted, #94a3b8); +} + +.nav-omni-score-pill { + font-size: 0.68rem; + font-weight: 600; + padding: 1px 7px; + border-radius: 10px; + background: rgba(16, 185, 129, 0.15); + color: #34d399; + border: 1px solid rgba(52, 211, 153, 0.3); + white-space: nowrap; + flex-shrink: 0; +} + +.nav-omni-item-bottom { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.72rem; + color: var(--text-muted, #94a3b8); + font-family: var(--font-mono, monospace); + overflow: hidden; +} + +.nav-omni-item-path { + color: var(--primary, #38bdf8); + flex-shrink: 0; +} + +.nav-omni-item-preview { + color: var(--text-muted, #94a3b8); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + + .nav-toolbar-right { display: flex; align-items: center; diff --git a/frontend/src/tests/NavigatorOmniSearch.test.tsx b/frontend/src/tests/NavigatorOmniSearch.test.tsx new file mode 100644 index 0000000..de4e7e3 --- /dev/null +++ b/frontend/src/tests/NavigatorOmniSearch.test.tsx @@ -0,0 +1,132 @@ +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import React from 'react'; +import { NavigatorOmniSearch } from '../components/navigator/NavigatorOmniSearch'; +import type { OmniSearchResultItem } from '../components/navigator/types'; + +describe('NavigatorOmniSearch Component', () => { + const mockMatches: OmniSearchResultItem[] = [ + { + id: 'sym_1', + type: 'symbol', + symbol_id: 10, + name: 'api_read_file', + kind: 'function', + filepath: 'app/api/routers/files.py', + repo: 'test-repo', + start_line: 22, + end_line: 49, + score: 0.99, + score_label: '99% AST exact match', + preview: 'async def api_read_file(path: str)...', + }, + { + id: 'file_1', + type: 'file', + name: 'files.py', + kind: 'file', + filepath: 'app/api/routers/files.py', + repo: 'test-repo', + start_line: 1, + end_line: 83, + score: 0.92, + score_label: '92% Filename match', + preview: 'app/api/routers/files.py', + }, + ]; + + beforeEach(() => { + vi.restoreAllMocks(); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it('renders omni-search input with placeholder', () => { + render(); + const input = screen.getByPlaceholderText(/search files, symbols, routes, or code text/i); + expect(input).toBeInTheDocument(); + }); + + it('fetches matches when user types and displays floating overlay', async () => { + const fetchSpy = vi.spyOn(global, 'fetch').mockResolvedValue({ + ok: true, + json: async () => ({ + query: 'api_read', + repo: 'test-repo', + total_matches: 2, + matches: mockMatches, + }), + } as Response); + + const onSelect = vi.fn(); + render(); + + const input = screen.getByPlaceholderText(/search files, symbols, routes, or code text/i); + fireEvent.change(input, { target: { value: 'api_read' } }); + + await waitFor(() => { + expect(fetchSpy).toHaveBeenCalled(); + }); + + // Check overlay items rendered + const symbolBadge = await screen.findByText('SYMBOL'); + expect(symbolBadge).toBeInTheDocument(); + expect(screen.getByText('api_read_file')).toBeInTheDocument(); + expect(screen.getByText('99% AST exact match')).toBeInTheDocument(); + + // Click result triggers onSelectResult + fireEvent.click(screen.getByText('api_read_file')); + expect(onSelect).toHaveBeenCalledWith(mockMatches[0]); + }); + + it('navigates with keyboard and selects on Enter', async () => { + vi.spyOn(global, 'fetch').mockResolvedValue({ + ok: true, + json: async () => ({ + query: 'api_read', + repo: 'test-repo', + total_matches: 2, + matches: mockMatches, + }), + } as Response); + + const onSelect = vi.fn(); + render(); + + const input = screen.getByPlaceholderText(/search files, symbols, routes, or code text/i); + fireEvent.change(input, { target: { value: 'api_read' } }); + + await screen.findByText('api_read_file'); + + // ArrowDown to first match, then Enter + fireEvent.keyDown(input, { key: 'ArrowDown' }); + fireEvent.keyDown(input, { key: 'Enter' }); + + expect(onSelect).toHaveBeenCalledWith(mockMatches[0]); + }); + + it('closes dropdown on Escape key', async () => { + vi.spyOn(global, 'fetch').mockResolvedValue({ + ok: true, + json: async () => ({ + query: 'api_read', + repo: 'test-repo', + total_matches: 2, + matches: mockMatches, + }), + } as Response); + + render(); + + const input = screen.getByPlaceholderText(/search files, symbols, routes, or code text/i); + fireEvent.change(input, { target: { value: 'api_read' } }); + + await screen.findByText('api_read_file'); + expect(screen.getByTestId('nav-omni-dropdown')).toBeInTheDocument(); + + fireEvent.keyDown(input, { key: 'Escape' }); + expect(screen.queryByTestId('nav-omni-dropdown')).not.toBeInTheDocument(); + }); +}); From 6cba1f014ee0df84524d40e5848a242d1a0b694e Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:31:04 -0500 Subject: [PATCH 5/9] feat(navigator): implement NavigatorCodeViewer with target line highlight and impact drawer --- .../navigator/NavigatorCodeViewer.tsx | 321 ++++++++++++++++++ frontend/src/styles/navigator.css | 293 ++++++++++++++++ .../src/tests/NavigatorCodeViewer.test.tsx | 95 ++++++ 3 files changed, 709 insertions(+) create mode 100644 frontend/src/components/navigator/NavigatorCodeViewer.tsx create mode 100644 frontend/src/tests/NavigatorCodeViewer.test.tsx diff --git a/frontend/src/components/navigator/NavigatorCodeViewer.tsx b/frontend/src/components/navigator/NavigatorCodeViewer.tsx new file mode 100644 index 0000000..ae279e4 --- /dev/null +++ b/frontend/src/components/navigator/NavigatorCodeViewer.tsx @@ -0,0 +1,321 @@ +import React, { useState, useEffect, useRef, useMemo } from 'react'; +import type { SymbolImpact, DensityMode } from './types'; +import { getMethodBadgeClass, getKindBadgeClass } from './NavigatorOutline'; + +export interface NavigatorCodeViewerProps { + filepath: string; + content: string; + totalLines: number; + sizeBytes?: number; + targetStartLine?: number; + targetEndLine?: number; + impact?: SymbolImpact | null; + loading?: boolean; + error?: string | null; + onRefresh?: () => void; + onSelectCaller?: (filePath: string, symbolName?: string, sourceSymbolId?: number) => void; + onSelectCallee?: (filePath?: string, symbolName?: string) => void; + density?: DensityMode; +} + +export const NavigatorCodeViewer: React.FC = ({ + filepath, + content, + totalLines, + sizeBytes, + targetStartLine, + targetEndLine, + impact, + loading = false, + error = null, + onRefresh, + onSelectCaller, + onSelectCallee, + density = 'balanced', +}) => { + const [copiedCode, setCopiedCode] = useState(false); + const [copiedLink, setCopiedLink] = useState(false); + const [drawerOpen, setDrawerOpen] = useState(false); + + const targetLineRef = useRef(null); + + // Split content into lines safely + const lines = useMemo(() => { + return content ? content.split('\n') : []; + }, [content]); + + // Auto-scroll to targetStartLine + useEffect(() => { + if (targetStartLine && targetLineRef.current) { + targetLineRef.current.scrollIntoView({ + behavior: 'smooth', + block: 'center', + }); + } + }, [targetStartLine, filepath]); + + const handleCopyCode = async () => { + if (!content) return; + try { + if (navigator?.clipboard?.writeText) { + await navigator.clipboard.writeText(content); + setCopiedCode(true); + setTimeout(() => setCopiedCode(false), 2000); + } + } catch { + // Fallback + } + }; + + const handleCopyPermalink = async () => { + if (!filepath) return; + const lineHash = targetStartLine + ? `#L${targetStartLine}${targetEndLine && targetEndLine !== targetStartLine ? `-L${targetEndLine}` : ''}` + : ''; + const permalink = `${filepath}${lineHash}`; + try { + if (navigator?.clipboard?.writeText) { + await navigator.clipboard.writeText(permalink); + setCopiedLink(true); + setTimeout(() => setCopiedLink(false), 2000); + } + } catch { + // Fallback + } + }; + + const formatSize = (bytes?: number): string => { + if (bytes === undefined || bytes === null) return ''; + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; + }; + + const callers = impact?.callers || []; + const callees = impact?.callees || []; + const totalImpact = callers.length + callees.length; + + return ( +
+ {/* Header Toolbar */} +
+
+ + + + + + + + {filepath} + + + {totalLines || lines.length} lines + + {sizeBytes !== undefined && sizeBytes > 0 && ( + {formatSize(sizeBytes)} + )} +
+ +
+ {/* Impact Drawer Toggle */} + {impact?.symbol && ( + + )} + + {/* Copy Permalink */} + + + {/* Copy Full Code */} + + + {onRefresh && ( + + )} +
+
+ + {/* Error state */} + {error && ( +
+ Failed to load file: {error} +
+ )} + + {/* Loading overlay */} + {loading && ( +
+
+ Loading source code... +
+ )} + + {/* Main Code Table */} +
+
+ {lines.map((line, idx) => { + const lineNum = idx + 1; + const isTarget = + targetStartLine !== undefined && + lineNum >= targetStartLine && + lineNum <= (targetEndLine || targetStartLine); + + const isFirstTarget = targetStartLine !== undefined && lineNum === targetStartLine; + + return ( +
+
+ {lineNum} +
+
+ {line || ' '} +
+
+ ); + })} +
+
+ + {/* Docked Symbol Impact Drawer */} + {drawerOpen && impact?.symbol && ( +
+
+
+ + {impact.symbol.kind} + + {impact.symbol.name} + + Lines {impact.symbol.start_line}–{impact.symbol.end_line} + + {impact.route && ( + + {impact.route.http_method} {impact.route.path_pattern} + + )} +
+ +
+ +
+ {/* Incoming Callers */} +
+
+ Incoming Callers ({callers.length}) +
+ {callers.length === 0 ? ( +
No incoming callers detected
+ ) : ( +
+ {callers.map((c, i) => ( + + ))} +
+ )} +
+ + {/* Outgoing Callees */} +
+
+ Outgoing Callees ({callees.length}) +
+ {callees.length === 0 ? ( +
No outgoing callees detected
+ ) : ( +
+ {callees.map((c, i) => ( + + ))} +
+ )} +
+
+
+ )} +
+ ); +}; diff --git a/frontend/src/styles/navigator.css b/frontend/src/styles/navigator.css index cc56bda..6c9ef05 100644 --- a/frontend/src/styles/navigator.css +++ b/frontend/src/styles/navigator.css @@ -431,6 +431,299 @@ text-overflow: ellipsis; } +/* ========================================================================== + Full Source Code Viewer (NavigatorCodeViewer) & Target Line Highlighting + ========================================================================== */ +.nav-code-viewer-container { + display: flex; + flex-direction: column; + height: 100%; + background: var(--bg-card, #0d2c2f); + border-radius: 8px; + overflow: hidden; + position: relative; + border: 1px solid var(--border-card, #15474d); +} + +.nav-code-viewer-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 14px; + background: rgba(0, 0, 0, 0.4); + border-bottom: 1px solid var(--border-card, #15474d); + gap: 12px; + flex-wrap: wrap; +} + +.nav-code-viewer-meta { + display: flex; + align-items: center; + gap: 8px; + overflow: hidden; +} + +.nav-code-file-icon { + color: var(--primary, #38bdf8); + flex-shrink: 0; +} + +.nav-code-filename { + font-size: 0.84rem; + font-weight: 700; + color: var(--text, #f8fafc); + font-family: var(--font-mono, monospace); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.nav-code-stat-chip { + font-size: 0.72rem; + padding: 1px 6px; + background: rgba(255, 255, 255, 0.08); + border-radius: 4px; + color: var(--text-muted, #94a3b8); + font-family: var(--font-mono, monospace); + flex-shrink: 0; +} + +.nav-code-viewer-actions { + display: flex; + align-items: center; + gap: 6px; +} + +.nav-code-action-btn { + background: rgba(255, 255, 255, 0.06); + border: 1px solid var(--border-card, #15474d); + color: var(--text-muted, #cbd5e1); + padding: 3px 8px; + border-radius: 4px; + font-size: 0.74rem; + cursor: pointer; + transition: all 0.15s; +} + +.nav-code-action-btn:hover { + background: rgba(255, 255, 255, 0.12); + color: var(--text, #f8fafc); + border-color: var(--primary, #0891b2); +} + +.nav-code-impact-toggle-btn { + display: flex; + align-items: center; + gap: 5px; + background: rgba(168, 85, 247, 0.15); + border: 1px solid rgba(168, 85, 247, 0.35); + color: #c084fc; + padding: 3px 9px; + border-radius: 4px; + font-size: 0.74rem; + font-weight: 600; + cursor: pointer; + transition: all 0.15s; +} + +.nav-code-impact-toggle-btn:hover, +.nav-code-impact-toggle-btn.active { + background: rgba(168, 85, 247, 0.28); + border-color: #a855f7; + color: #f3e8ff; +} + +.nav-code-body { + flex: 1; + overflow: auto; + background: #061113; + padding: 8px 0; + position: relative; + outline: none; +} + +.nav-code-lines-wrapper { + display: flex; + flex-direction: column; + min-width: 100%; + width: max-content; +} + +.nav-code-line-row { + display: flex; + min-height: 20px; + line-height: 20px; + transition: background-color 0.1s ease; + padding: 0 4px; +} + +.nav-code-line-row:hover { + background: rgba(255, 255, 255, 0.03); +} + +.nav-code-line-number { + width: 44px; + min-width: 44px; + padding-right: 12px; + text-align: right; + font-size: 0.72rem; + font-family: var(--font-mono, monospace); + color: #475569; + user-select: none; +} + +.nav-code-line-content { + flex: 1; + font-size: 0.78rem; + font-family: var(--font-mono, monospace); + color: #cbd5e1; + white-space: pre; + tab-size: 4; +} + +/* Target line highlight */ +.nav-code-line-target { + background: rgba(14, 165, 233, 0.18) !important; + border-left: 3px solid #38bdf8 !important; +} + +.nav-code-line-target .nav-code-line-number { + color: #38bdf8 !important; + font-weight: 700; +} + +.nav-code-line-target .nav-code-line-content { + color: #ffffff !important; + font-weight: 500; +} + +/* Docked Impact Drawer */ +.nav-code-impact-drawer { + border-top: 1px solid var(--border-card, #15474d); + background: rgba(9, 29, 32, 0.95); + backdrop-filter: blur(8px); + max-height: 260px; + display: flex; + flex-direction: column; + animation: slide-up 0.18s ease-out; +} + +@keyframes slide-up { + from { transform: translateY(12px); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} + +.nav-impact-drawer-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 6px 12px; + background: rgba(0, 0, 0, 0.35); + border-bottom: 1px solid var(--border-card, #15474d); +} + +.nav-impact-drawer-title { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.76rem; +} + +.nav-impact-symbol-name { + color: var(--text, #f8fafc); + font-family: var(--font-mono, monospace); +} + +.nav-impact-symbol-lines { + color: var(--text-muted, #94a3b8); + font-size: 0.7rem; +} + +.nav-impact-close-btn { + background: transparent; + border: none; + color: var(--text-muted, #94a3b8); + cursor: pointer; + font-size: 0.8rem; + padding: 2px 6px; +} + +.nav-impact-close-btn:hover { + color: var(--text, #f8fafc); +} + +.nav-impact-drawer-body { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + padding: 10px 14px; + overflow-y: auto; +} + +.nav-impact-column-title { + font-size: 0.72rem; + font-weight: 600; + text-transform: uppercase; + color: var(--text-muted, #94a3b8); + margin-bottom: 6px; +} + +.nav-impact-empty { + font-size: 0.72rem; + color: var(--text-muted, #64748b); + font-style: italic; +} + +.nav-impact-chips-list { + display: flex; + flex-direction: column; + gap: 4px; +} + +.nav-impact-chip { + display: flex; + align-items: center; + gap: 6px; + background: rgba(0, 0, 0, 0.3); + border: 1px solid var(--border-card, #15474d); + border-radius: 4px; + padding: 3px 8px; + font-size: 0.72rem; + cursor: pointer; + text-align: left; + transition: all 0.12s; + color: var(--text, #f8fafc); +} + +.nav-impact-chip:hover { + background: rgba(8, 145, 178, 0.2); + border-color: var(--primary, #0891b2); +} + +.nav-impact-chip.caller .chip-name { + color: #38bdf8; + font-weight: 600; + font-family: var(--font-mono, monospace); +} + +.nav-impact-chip.callee .chip-name { + color: #a7f3d0; + font-weight: 600; + font-family: var(--font-mono, monospace); +} + +.nav-impact-chip .chip-path { + color: var(--text-muted, #94a3b8); + font-size: 0.68rem; + font-family: var(--font-mono, monospace); +} + +.nav-impact-chip .chip-line { + color: #facc15; + font-size: 0.68rem; +} + + .nav-toolbar-right { display: flex; diff --git a/frontend/src/tests/NavigatorCodeViewer.test.tsx b/frontend/src/tests/NavigatorCodeViewer.test.tsx new file mode 100644 index 0000000..67729e1 --- /dev/null +++ b/frontend/src/tests/NavigatorCodeViewer.test.tsx @@ -0,0 +1,95 @@ +import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import React from 'react'; +import { NavigatorCodeViewer } from '../components/navigator/NavigatorCodeViewer'; +import type { SymbolImpact } from '../components/navigator/types'; + +describe('NavigatorCodeViewer Component', () => { + const sampleCode = `import os\n\ndef hello():\n return "world"\n\ndef goodbye():\n pass`; + + const mockImpact: SymbolImpact = { + symbol: { + id: 1, + name: 'hello', + kind: 'function', + filepath: 'test.py', + start_line: 3, + end_line: 4, + repo: 'test-repo', + }, + route: null, + callers: [ + { + source_symbol: 'main_caller', + source_filepath: 'app/main.py', + line_number: 12, + call_count: 1, + }, + ], + callees: [], + imports: [], + }; + + beforeEach(() => { + // Mock scrollIntoView + window.HTMLElement.prototype.scrollIntoView = vi.fn(); + }); + + it('renders line numbers and code lines', () => { + render( + + ); + + expect(screen.getByText('test.py')).toBeInTheDocument(); + expect(screen.getByText('6 lines')).toBeInTheDocument(); + // Check line numbers 1 and 3 are present + expect(screen.getByText('1')).toBeInTheDocument(); + expect(screen.getByText('3')).toBeInTheDocument(); + expect(screen.getByText(/def hello\(\):/)).toBeInTheDocument(); + }); + + it('highlights target line range and calls scrollIntoView', () => { + render( + + ); + + const targetLine = screen.getByTestId('code-line-3'); + expect(targetLine).toHaveClass('nav-code-line-target'); + expect(window.HTMLElement.prototype.scrollIntoView).toHaveBeenCalled(); + }); + + it('toggles callers and impact drawer', () => { + const onSelectCaller = vi.fn(); + render( + + ); + + const toggleBtn = screen.getByRole('button', { name: /callers & impact/i }); + expect(toggleBtn).toBeInTheDocument(); + + // Click toggle to open drawer + fireEvent.click(toggleBtn); + expect(screen.getByText('main_caller')).toBeInTheDocument(); + + // Click caller chip + fireEvent.click(screen.getByText('main_caller')); + expect(onSelectCaller).toHaveBeenCalledWith('app/main.py', 'main_caller', undefined); + }); +}); From 9739ea2279d3bf6a7946e856452e18c91a4cf133 Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:32:52 -0500 Subject: [PATCH 6/9] feat(navigator): integrate omni-search and full code viewer into CodeNavigator --- frontend/src/CodeNavigator.tsx | 40 +++++++++++++++++- .../navigator/NavigatorInspector.tsx | 41 +++++++++++++++---- .../components/navigator/NavigatorToolbar.tsx | 11 +++-- 3 files changed, 79 insertions(+), 13 deletions(-) diff --git a/frontend/src/CodeNavigator.tsx b/frontend/src/CodeNavigator.tsx index d9d65be..19ae97e 100644 --- a/frontend/src/CodeNavigator.tsx +++ b/frontend/src/CodeNavigator.tsx @@ -8,6 +8,7 @@ import type { SymbolImpact, RepoOption, FileContentResult, + OmniSearchResultItem, } from './components/navigator/types'; import { NavigatorToolbar } from './components/navigator/NavigatorToolbar'; import { NavigatorTree } from './components/navigator/NavigatorTree'; @@ -65,6 +66,8 @@ export const CodeNavigator: React.FC = ({ const [loadingContent, setLoadingContent] = useState(false); const [contentError, setContentError] = useState(null); const [activeInspectorTab, setActiveInspectorTab] = useState<'intelligence' | 'reader'>('intelligence'); + const [targetStartLine, setTargetStartLine] = useState(undefined); + const [targetEndLine, setTargetEndLine] = useState(undefined); // Error state const [errorMessage, setErrorMessage] = useState(null); @@ -211,24 +214,54 @@ export const CodeNavigator: React.FC = ({ setSelectedSymbolId(null); setSymbolImpact(null); setFileContent(null); + setTargetStartLine(undefined); + setTargetEndLine(undefined); + }; + + const handleSelectSearchResult = (result: OmniSearchResultItem) => { + const targetRepo = result.repo && result.repo !== '__all__' ? result.repo : selectedRepo; + if (result.repo && result.repo !== selectedRepo && selectedRepo !== '__all__') { + setSelectedRepo(result.repo); + } + setSelectedPath(result.filepath); + setTargetStartLine(result.start_line); + setTargetEndLine(result.end_line); + + fetchFileContent(targetRepo, result.filepath); + + if (result.type === 'symbol' && result.symbol_id) { + setSelectedSymbolId(result.symbol_id); + fetchOutline(targetRepo, result.filepath, result.symbol_id); + fetchImpact(targetRepo, result.symbol_id); + setActiveInspectorTab('reader'); + } else { + fetchOutline(targetRepo, result.filepath); + setActiveInspectorTab('reader'); + } }; const handleSelectFile = (node: NavigatorTreeNode) => { if (node.is_dir) return; setSelectedPath(node.path); + setTargetStartLine(undefined); + setTargetEndLine(undefined); fetchOutline(selectedRepo, node.path); fetchFileContent(selectedRepo, node.path); }; const handleSelectSymbol = (symbol: SymbolOutlineItem) => { setSelectedSymbolId(symbol.id); - setActiveInspectorTab('intelligence'); + setTargetStartLine(symbol.start_line); + setTargetEndLine(symbol.end_line); + setActiveInspectorTab('reader'); fetchImpact(selectedRepo, symbol.id); }; // Cross-pane click-through navigation for callers const handleSelectCaller = (filePath: string, symbolName?: string, sourceSymbolId?: number) => { setSelectedPath(filePath); + setTargetStartLine(undefined); + setTargetEndLine(undefined); fetchOutline(selectedRepo, filePath, sourceSymbolId ?? symbolName); fetchFileContent(selectedRepo, filePath); }; @@ -236,6 +269,8 @@ export const CodeNavigator: React.FC = ({ const handleSelectCallee = (filePath?: string, symbolName?: string) => { if (filePath) { setSelectedPath(filePath); + setTargetStartLine(undefined); + setTargetEndLine(undefined); fetchOutline(selectedRepo, filePath, symbolName); fetchFileContent(selectedRepo, filePath); } @@ -255,6 +290,7 @@ export const CodeNavigator: React.FC = ({ onChangeDensity={handleDensityChange} searchQuery={treeSearch} onSearchChange={setTreeSearch} + onSelectSearchResult={handleSelectSearchResult} totalFiles={treeData?.total_files ?? 0} totalSymbols={treeData?.total_symbols ?? 0} onRefresh={() => fetchTree(selectedRepo)} @@ -320,6 +356,8 @@ export const CodeNavigator: React.FC = ({ fileContent={fileContent} loadingContent={loadingContent} contentError={contentError} + targetStartLine={targetStartLine} + targetEndLine={targetEndLine} activeInspectorTab={activeInspectorTab} onChangeInspectorTab={setActiveInspectorTab} onSelectCaller={handleSelectCaller} diff --git a/frontend/src/components/navigator/NavigatorInspector.tsx b/frontend/src/components/navigator/NavigatorInspector.tsx index 844385f..68d837c 100644 --- a/frontend/src/components/navigator/NavigatorInspector.tsx +++ b/frontend/src/components/navigator/NavigatorInspector.tsx @@ -2,12 +2,15 @@ import React, { useState } from 'react'; import type { SymbolImpact, DensityMode, FileContentResult } from './types'; import { getMethodBadgeClass, getKindBadgeClass } from './NavigatorOutline'; import { NavigatorDocReader } from './NavigatorDocReader'; +import { NavigatorCodeViewer } from './NavigatorCodeViewer'; interface NavigatorInspectorProps { impact: SymbolImpact | null; fileContent?: FileContentResult | null; loadingContent?: boolean; contentError?: string | null; + targetStartLine?: number; + targetEndLine?: number; activeInspectorTab?: 'intelligence' | 'reader'; onChangeInspectorTab?: (tab: 'intelligence' | 'reader') => void; onSelectCaller?: (filePath: string, symbolName?: string, sourceSymbolId?: number) => void; @@ -22,6 +25,8 @@ export const NavigatorInspector: React.FC = ({ fileContent, loadingContent = false, contentError = null, + targetStartLine, + targetEndLine, activeInspectorTab, onChangeInspectorTab, onSelectCaller, @@ -130,15 +135,33 @@ export const NavigatorInspector: React.FC = ({
{showDocReader && fileContent ? ( - + (fileContent.filepath.toLowerCase().endsWith('.md') || fileContent.filepath.toLowerCase().endsWith('.markdown')) ? ( + + ) : ( + + ) ) : showDocReader && loadingContent ? (
diff --git a/frontend/src/components/navigator/NavigatorToolbar.tsx b/frontend/src/components/navigator/NavigatorToolbar.tsx index 3cc3c16..70fb463 100644 --- a/frontend/src/components/navigator/NavigatorToolbar.tsx +++ b/frontend/src/components/navigator/NavigatorToolbar.tsx @@ -1,5 +1,6 @@ import React from 'react'; -import type { DensityMode, RepoOption } from './types'; +import type { DensityMode, RepoOption, OmniSearchResultItem } from './types'; +import { NavigatorOmniSearch } from './NavigatorOmniSearch'; interface NavigatorToolbarProps { repos: RepoOption[]; @@ -9,6 +10,7 @@ interface NavigatorToolbarProps { onChangeDensity: (density: DensityMode) => void; searchQuery?: string; onSearchChange?: (query: string) => void; + onSelectSearchResult?: (result: OmniSearchResultItem) => void; totalFiles?: number; totalSymbols?: number; onRefresh?: () => void; @@ -23,6 +25,7 @@ export const NavigatorToolbar: React.FC = ({ onChangeDensity, searchQuery = '', onSearchChange, + onSelectSearchResult, totalFiles = 0, totalSymbols = 0, onRefresh, @@ -65,7 +68,9 @@ export const NavigatorToolbar: React.FC = ({
- {onSearchChange && ( + {onSelectSearchResult ? ( + + ) : onSearchChange ? (
- )} + ) : null}
From 83b90bbd41b14ce235f2cf714cf802f49406d5ce Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:37:38 -0500 Subject: [PATCH 7/9] feat(navigator): finalize omni-search overlay, code line wrapping, and layout tests --- frontend/dist/assets/index-Ckdwt2bA.js | 14 -- frontend/dist/assets/index-D6YDOGnZ.js | 15 ++ ...{index-aygUsQiL.css => index-qIBukKNH.css} | 2 +- frontend/dist/index.html | 4 +- frontend/e2e/navigator.spec.ts | 129 ++++++++++++++++-- frontend/src/CodeNavigator.tsx | 15 +- .../navigator/NavigatorOmniSearch.tsx | 2 + frontend/src/styles/navigator.css | 20 ++- .../src/tests/NavigatorCodeViewer.test.tsx | 1 - .../src/tests/NavigatorOmniSearch.test.tsx | 7 +- 10 files changed, 168 insertions(+), 41 deletions(-) delete mode 100644 frontend/dist/assets/index-Ckdwt2bA.js create mode 100644 frontend/dist/assets/index-D6YDOGnZ.js rename frontend/dist/assets/{index-aygUsQiL.css => index-qIBukKNH.css} (60%) diff --git a/frontend/dist/assets/index-Ckdwt2bA.js b/frontend/dist/assets/index-Ckdwt2bA.js deleted file mode 100644 index ba3c04b..0000000 --- a/frontend/dist/assets/index-Ckdwt2bA.js +++ /dev/null @@ -1,14 +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(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-D6YDOGnZ.js b/frontend/dist/assets/index-D6YDOGnZ.js new file mode 100644 index 0000000..42e8600 --- /dev/null +++ b/frontend/dist/assets/index-D6YDOGnZ.js @@ -0,0 +1,15 @@ +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 L(e,t){ae++,ie[ae]=e.current,e.current=t}var oe=F(null),se=F(null),ce=F(null),le=F(null);function ue(e,t){switch(L(ce,t),L(se,e),L(oe,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}}I(oe),L(oe,e)}function de(){I(oe),I(se),I(ce)}function fe(e){e.memoizedState!==null&&L(le,e);var t=oe.current,n=Hd(t,e.type);t!==n&&(L(se,e),L(oe,n))}function pe(e){se.current===e&&(I(oe),I(se)),le.current===e&&(I(le),Qf._currentValue=P)}var me,he;function ge(e){if(me===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);me=t&&t[1]||``,he=-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{_e=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ge(n):``}function ye(e,t){switch(e.tag){case 26:case 27:case 5:return ge(e.type);case 16:return ge(`Lazy`);case 13:return e.child!==t&&t!==null?ge(`Suspense Fallback`):ge(`Suspense`);case 19:return ge(`SuspenseList`);case 0:case 15:return ve(e.type,!1);case 11:return ve(e.type.render,!1);case 1:return ve(e.type,!0);case 31:return ge(`Activity`);default:return``}}function be(e){try{var t=``,n=null;do t+=ye(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var xe=Object.prototype.hasOwnProperty,Se=t.unstable_scheduleCallback,Ce=t.unstable_cancelCallback,we=t.unstable_shouldYield,Te=t.unstable_requestPaint,Ee=t.unstable_now,De=t.unstable_getCurrentPriorityLevel,Oe=t.unstable_ImmediatePriority,ke=t.unstable_UserBlockingPriority,Ae=t.unstable_NormalPriority,je=t.unstable_LowPriority,Me=t.unstable_IdlePriority,Ne=t.log,Pe=t.unstable_setDisableYieldValue,Fe=null,Ie=null;function Le(e){if(typeof Ne==`function`&&Pe(e),Ie&&typeof Ie.setStrictMode==`function`)try{Ie.setStrictMode(Fe,e)}catch{}}var Re=Math.clz32?Math.clz32:Ve,ze=Math.log,Be=Math.LN2;function Ve(e){return e>>>=0,e===0?32:31-(ze(e)/Be|0)|0}var He=256,Ue=262144,We=4194304;function Ge(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 Ke(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=Ge(n))):i=Ge(o):i=Ge(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Ge(n))):i=Ge(o)):i=Ge(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 qe(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Je(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 Ye(){var e=We;return We<<=1,!(We&62914560)&&(We=4194304),e}function Xe(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ze(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Qe(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),un=!1;if(ln)try{var dn={};Object.defineProperty(dn,"passive",{get:function(){un=!0}}),window.addEventListener(`test`,dn,dn),window.removeEventListener(`test`,dn,dn)}catch{un=!1}var fn=null,pn=null,mn=null;function hn(){if(mn)return mn;var e,t=pn,n=t.length,r,i=`value`in fn?fn.value:fn.textContent,a=i.length;for(e=0;e=qn),Xn=` `,Zn=!1;function Qn(e,t){switch(e){case`keyup`:return Gn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function $n(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var er=!1;function tr(e,t){switch(e){case`compositionend`:return $n(t);case`keypress`:return t.which===32?(Zn=!0,Xn):null;case`textInput`:return e=t.data,e===Xn&&Zn?null:e;default:return null}}function nr(e,t){if(er)return e===`compositionend`||!Kn&&Qn(e,t)?(e=hn(),mn=pn=fn=null,er=!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=wr(n)}}function Er(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Er(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=It(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=It(e.document)}return t}function Or(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 kr=ln&&`documentMode`in document&&11>=document.documentMode,Ar=null,jr=null,Mr=null,Nr=!1;function Pr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Nr||Ar==null||Ar!==It(r)||(r=Ar,`selectionStart`in r&&Or(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}),Mr&&Cr(Mr,r)||(Mr=r,r=Ed(jr,`onSelect`),0>=o,i-=o,Ei=1<<32-Re(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),B&&Oi(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),B&&Oi(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 B&&Oi(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)}),B&&Oi(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&&Da(l)===r.type){n(e,r.sibling),c=a(r,o.props),Pa(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===y?(c=pi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=fi(o.type,o.key,o.props,null,e.mode,c),Pa(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=gi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Da(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,Na(o),c);if(o.$$typeof===C)return b(e,r,ta(e,o),c);Fa(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=mi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Ma=0;var i=b(e,t,n,r);return ja=null,i}catch(t){if(t===xa||t===Ca)throw t;var a=ci(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var La=Ia(!0),Ra=Ia(!1),za=!1;function Ba(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Va(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 Ha(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ua(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,K&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ai(e),ii(e,null,n),t}return ti(e,r,t,n),ai(e)}function Wa(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,et(e,n)}}function Ga(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 Ka=!1;function qa(){if(Ka){var e=fa;if(e!==null)throw e}}function Ja(e,t,n,r){Ka=!1;var i=e.updateQueue;za=!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?(Y&f)===f:(r&f)===f){f!==0&&f===da&&(Ka=!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:za=!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 Ya(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Xa(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,Ps(e,!1,t,n);try{var c=i(),l=M.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ns(e,t,ha(c,r),pu(e)):Ns(e,t,r,pu(e))}catch(n){Ns(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 Cs(){}function ws(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Ts(e).queue;Ss(e,a,t,P,n===null?Cs:function(){return Es(e),n(r)})}function Ts(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:Fo,lastRenderedState:P},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Fo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Es(e){var t=Ts(e);t.next===null&&(t=e.alternate.memoizedState),Ns(e,t.next.queue,{},pu())}function Ds(){return ea(Qf)}function Os(){return Ao().memoizedState}function ks(){return Ao().memoizedState}function As(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ha(n);var r=Ua(t,e,n);r!==null&&(hu(r,t,n),Wa(r,t,n)),t={cache:sa()},e.payload=t;return}t=t.return}}function js(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Fs(e)?Is(t,n):(n=ni(e,t,n,r),n!==null&&(hu(n,e,r),Ls(n,t,r)))}function Ms(e,t,n){Ns(e,t,n,pu())}function Ns(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Fs(e))Is(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,Sr(s,o))return ti(e,t,i,0),q===null&&ei(),!1}catch{}if(n=ni(e,t,i,r),n!==null)return hu(n,e,r),Ls(n,t,r),!0}return!1}function Ps(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Fs(e)){if(t)throw Error(i(479))}else t=ni(e,n,r,2),t!==null&&hu(t,e,2)}function Fs(e){var t=e.alternate;return e===V||t!==null&&t===V}function Is(e,t){ho=mo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ls(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,et(e,n)}}var Rs={readContext:ea,use:No,useCallback:U,useContext:U,useEffect:U,useImperativeHandle:U,useLayoutEffect:U,useInsertionEffect:U,useMemo:U,useReducer:U,useRef:U,useState:U,useDebugValue:U,useDeferredValue:U,useTransition:U,useSyncExternalStore:U,useId:U,useHostTransitionStatus:U,useFormState:U,useActionState:U,useOptimistic:U,useMemoCache:U,useCacheRefresh:U};Rs.useEffectEvent=U;var zs={readContext:ea,use:No,useCallback:function(e,t){return ko().memoizedState=[e,t===void 0?null:t],e},useContext:ea,useEffect:ls,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),ss(4194308,4,hs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ss(4194308,4,e,t)},useInsertionEffect:function(e,t){ss(4,2,e,t)},useMemo:function(e,t){var n=ko();t=t===void 0?null:t;var r=e();if(go){Le(!0);try{e()}finally{Le(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ko();if(n!==void 0){var i=n(t);if(go){Le(!0);try{n(t)}finally{Le(!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=js.bind(null,V,e),[r.memoizedState,e]},useRef:function(e){var t=ko();return e={current:e},t.memoizedState=e},useState:function(e){e=Go(e);var t=e.queue,n=Ms.bind(null,V,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:_s,useDeferredValue:function(e,t){return bs(ko(),e,t)},useTransition:function(){var e=Go(!1);return e=Ss.bind(null,V,e.queue,!0,!1),ko().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=V,a=ko();if(B){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),q===null)throw Error(i(349));Y&127||Bo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,ls(Ho.bind(null,r,o,e),[e]),r.flags|=2048,as(9,{destroy:void 0},Vo.bind(null,r,o,n,t),null),n},useId:function(){var e=ko(),t=q.identifierPrefix;if(B){var n=Di,r=Ei;n=(r&~(1<<32-Re(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=_o++,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[ot]=t,o[st]=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&&Nc(t)}}return W(t),Pc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Nc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ce.current,Bi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ni,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[ot]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Li(t,!0)}else e=Bd(e).createTextNode(r),e[ot]=t,t.stateNode=e}return W(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Bi(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[ot]=t}else Vi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;W(t),e=!1}else n=Hi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(co(t),t):(co(t),null);if(t.flags&128)throw Error(i(558))}return W(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Bi(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[ot]=t}else Vi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;W(t),a=!1}else a=Hi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(co(t),t):(co(t),null)}return co(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),Ic(t,t.updateQueue),W(t),null);case 4:return de(),e===null&&Sd(t.stateNode.containerInfo),W(t),null;case 10:return Ji(t.type),W(t),null;case 19:if(I(lo),r=t.memoizedState,r===null)return W(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)Lc(r,!1);else{if(Wl!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=uo(e),o!==null){for(t.flags|=128,Lc(r,!1),e=o.updateQueue,t.updateQueue=e,Ic(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)di(n,e),n=n.sibling;return L(lo,lo.current&1|2),B&&Oi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ee()>tu&&(t.flags|=128,a=!0,Lc(r,!1),t.lanes=4194304)}}else{if(!a){if(e=uo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Ic(t,e),Lc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!B)return W(t),null}else 2*Ee()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Lc(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?(W(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ee(),e.sibling=null,n=lo.current,L(lo,a?n&1|2:n&1),B&&Oi(t,r.treeForkCount),e);case 22:case 23:return co(t),to(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(W(t),t.subtreeFlags&6&&(t.flags|=8192)):W(t),n=t.updateQueue,n!==null&&Ic(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&&I(_a),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Ji(oa),W(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function zc(e,t){switch(ji(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Ji(oa),de(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return pe(t),null;case 31:if(t.memoizedState!==null){if(co(t),t.alternate===null)throw Error(i(340));Vi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(co(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Vi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return I(lo),null;case 4:return de(),null;case 10:return Ji(t.type),null;case 22:case 23:return co(t),to(),e!==null&&I(_a),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Ji(oa),null;case 25:return null;default:return null}}function Bc(e,t){switch(ji(t),t.tag){case 3:Ji(oa),de();break;case 26:case 27:case 5:pe(t);break;case 4:de();break;case 31:t.memoizedState!==null&&co(t);break;case 13:co(t);break;case 19:I(lo);break;case 10:Ji(t.type);break;case 22:case 23:co(t),to(),e!==null&&I(_a);break;case 24:Ji(oa)}}function Vc(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 Hc(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 Uc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Xa(t,n)}catch(t){Z(e,e.return,t)}}}function Wc(e,t,n){n.props=Ks(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Gc(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 Kc(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 qc(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 Jc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[st]=t}catch(t){Z(e,e.return,t)}}function Yc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Xc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Yc(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 Zc(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=$t));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Zc(e,t,n),e=e.sibling;e!==null;)Zc(e,t,n),e=e.sibling}function Qc(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(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(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[ot]=e,t[st]=n}catch(t){Z(e,e.return,t)}}var el=!1,tl=!1,nl=!1,rl=typeof WeakSet==`function`?WeakSet:Set,il=null;function al(e,t){if(e=e.containerInfo,Rd=sp,e=Dr(e),Or(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,il=t;il!==null;)if(t=il,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,il=e;else for(;il!==null;){switch(t=il,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[ot]=e,yt(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 _=Tr(s,h),v=Tr(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,K&6)throw Error(i(331));var c=K;if(K|=4,Pl(o.current),El(o,o.current,s,n),K=c,id(0,!1),Ie&&typeof Ie.onPostCommitFiberRoot==`function`)try{Ie.onPostCommitFiberRoot(Fe,o)}catch{}return!0}finally{N.p=a,M.T=r,Vu(e,t)}}function Wu(e,t,n){t=vi(n,t),t=Qs(e.stateNode,t,2),e=Ua(e,t,2),e!==null&&(Ze(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=vi(n,e),n=$s(2),r=Ua(t,n,2),r!==null&&(ec(n,r,t,e),Ze(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Rl;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)||(Hl=!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,q===e&&(Y&n)===n&&(Wl===4||Wl===3&&(Y&62914560)===Y&&300>Ee()-$l?!(K&2)&&Su(e,0):ql|=n,Yl===Y&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Ye()),e=ri(e,t),e!==null&&(Ze(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 Se(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-Re(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=Y,a=Ke(r,r===q?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||qe(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=Ee(),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=Rt(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),yt(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="`+Rt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Rt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Rt(n.imageSizes)+`"]`)):i+=`[href="`+Rt(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),yt(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="`+Rt(r)+`"][href="`+Rt(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),yt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=vt(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`);yt(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=vt(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`),yt(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=vt(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`),yt(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=ce.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=vt(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=vt(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=vt(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="`+Rt(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),yt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Rt(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~="`+Rt(n.href)+`"]`);if(r)return t.instance=r,yt(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`),yt(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,yt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),yt(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,yt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),yt(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,yt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),yt(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)}},F=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)}},I=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)}},L=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)}}},oe=d===null?null:m[d],se=t.find(e=>e.id===d)?.name||oe?.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:F,onOpenWebhook:e=>c(e),onDelete:L,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:I,copiedUrl:l}),(0,b.jsx)(ee,{isOpen:d!==null,onClose:()=>f(null),repoId:d,repoName:se,job:oe,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`,F=[{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 I(){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&&F.some(t=>t.id===e))return e}catch{}return ae}function L(e){if(!(typeof document>`u`)){document.documentElement.setAttribute(`data-theme`,e);try{localStorage.setItem(ie,e)}catch{}}}function oe(){let[e,t]=(0,_.useState)(`deep-ocean`),n=S();(0,_.useEffect)(()=>{t(I())},[]);let r=(e,r)=>{L(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:F.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 se(){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 ce({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)(``),[F,I]=(0,_.useState)(``),[L,ce]=(0,_.useState)(!1),[le,ue]=(0,_.useState)(null),[de,fe]=(0,_.useState)(!1),[pe,me]=(0,_.useState)(`qdrant`),[he,ge]=(0,_.useState)(`embedded`),[_e,ve]=(0,_.useState)(`data/qdrant_db`),[ye,be]=(0,_.useState)(`http://localhost:6333`),[xe,Se]=(0,_.useState)(`knowledge_rag_v1`),[Ce,we]=(0,_.useState)(!1),[Te,Ee]=(0,_.useState)(null),[De,Oe]=(0,_.useState)(!1),[ke,Ae]=(0,_.useState)(null),[je,Me]=(0,_.useState)(!1),[Ne,Pe]=(0,_.useState)(!1),[Fe,Ie]=(0,_.useState)(`local`),[Le,Re]=(0,_.useState)(2),[ze,Be]=(0,_.useState)(32),[Ve,He]=(0,_.useState)(`BAAI/bge-small-en-v1.5`),[Ue,We]=(0,_.useState)(`Qdrant/bm25`),[Ge,Ke]=(0,_.useState)(`http://litellm:4000/v1`),[qe,Je]=(0,_.useState)(``),[Ye,Xe]=(0,_.useState)(`gemini-2.5-flash`),[Ze,Qe]=(0,_.useState)(`gemini-2.5-flash`),[$e,et]=(0,_.useState)(null),[tt,nt]=(0,_.useState)(!1),R=S(),rt=(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([])}},[]),it=(0,_.useCallback)(async()=>{fe(!0);try{let e=await fetch(`/admin/api/vector-store`);if(e.ok){let t=await e.json();ue(t),t.provider&&me(t.provider),t.mode&&ge(t.mode),t.storage_path&&ve(t.storage_path),t.url&&be(t.url),t.collection&&Se(t.collection)}}catch(e){console.error(`Failed to load vector store config:`,e)}finally{fe(!1)}},[]),at=(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)}},[]),ot=(0,_.useCallback)(async()=>{Me(!0);try{let e=await fetch(`/admin/api/settings/embedding`);if(e.ok){let t=await e.json();Ae(t),t.provider&&Ie(t.provider),typeof t.threads==`number`&&Re(t.threads),typeof t.batch_size==`number`&&Be(t.batch_size),t.dense_model&&He(t.dense_model),t.sparse_model&&We(t.sparse_model),t.litellm_url&&Ke(t.litellm_url),t.litellm_api_key&&Je(t.litellm_api_key),t.vision_ocr_model&&Xe(t.vision_ocr_model),t.chat_model&&Qe(t.chat_model)}}catch(e){console.error(`Failed to load embedding config:`,e)}finally{Me(!1)}},[]);(0,_.useEffect)(()=>{rt(),it(),at(),ot()},[rt,it,at,ot]),(0,_.useEffect)(()=>{e?.vector_store?(ue(e.vector_store),e.vector_store.provider&&me(e.vector_store.provider),e.vector_store.mode&&ge(e.vector_store.mode),e.vector_store.storage_path&&ve(e.vector_store.storage_path),e.vector_store.url&&be(e.vector_store.url),e.vector_store.collection&&Se(e.vector_store.collection)):e?.vector_store_provider&&ue(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 st=async()=>{nt(!0);try{let e=new URLSearchParams;Ge&&e.set(`url`,Ge.trim()),qe&&e.set(`api_key`,qe.trim());let t=await(await fetch(`/admin/api/models/discover?${e.toString()}`)).json();et(t),t.status===`success`?R.success(`Discovered ${t.total_models} models from LiteLLM`):R.error(t.message||`Failed to discover models from LiteLLM`)}catch(e){et({status:`error`,total_models:0,models:[],embedding_models:[],vision_models:[],chat_models:[],message:e.message||`Network error discovering models`}),R.error(`Error discovering models: ${e.message}`)}finally{nt(!1)}},ct=async e=>{e.preventDefault(),Pe(!0);try{let e={provider:Fe,threads:Number(Le),batch_size:Number(ze),dense_model:Ve.trim()||void 0,sparse_model:Ue.trim()||void 0,litellm_url:Fe===`api`&&Ge.trim()||void 0,litellm_api_key:Fe===`api`&&qe.trim()||void 0,vision_ocr_model:Ye.trim()||void 0,chat_model:Ze.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&&Ae(r.config),R.success(`Embedding resource limits updated successfully`),t()}catch(e){R.error(`Error saving embedding settings: `+e.message)}finally{Pe(!1)}},lt=`${typeof window<`u`?window.location.origin:``}${g||`/api/webhooks/git`}`,ut=async()=>{try{navigator?.clipboard?.writeText&&await navigator.clipboard.writeText(lt),O(!0),R.info(`Webhook URL copied to clipboard`),setTimeout(()=>O(!1),2e3)}catch(e){R.error(`Failed to copy: `+e.message)}},dt=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(``),R.success(`Auto-sync settings saved successfully`)}catch(e){R.error(`Error saving auto-sync settings: `+e.message)}finally{w(!1)}},ft=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(``),R.success(`Global webhook secret cleared`)}catch(e){R.error(`Failed to clear webhook secret: `+e.message)}finally{w(!1)}}},pt=e=>{me(e),e===`qdrant`?((!_e||_e===`data/chroma_db`)&&ve(`data/qdrant_db`),(!ye||ye===`http://localhost:8000`)&&be(`http://localhost:6333`)):((!_e||_e===`data/qdrant_db`)&&ve(`data/chroma_db`),(!ye||ye===`http://localhost:6333`)&&be(`http://localhost:8000`))},mt=e=>{ge(e),e===`embedded`&&!_e&&ve(pe===`chroma`?`data/chroma_db`:`data/qdrant_db`),e===`remote`&&!ye&&be(pe===`chroma`?`http://localhost:8000`:`http://localhost:6333`)},ht=async()=>{we(!0),Ee(null);try{let e={provider:pe,mode:he,storage_path:he===`embedded`?_e.trim():null,url:he===`remote`?ye.trim():null,collection:xe.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`;Ee({success:!1,message:e}),R.error(`Vector store test: `+e)}else{let e=n.message||`Vector store connection test successful`;Ee({success:!0,message:e}),R.success(e)}}catch(e){let t=e.message||`Connection error`;Ee({success:!1,message:t}),R.error(`Vector store test error: `+t)}finally{we(!1)}},gt=async()=>{let e=pe===`chroma`?`ChromaDB`:`Qdrant`,n=he===`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.`)){Oe(!0);try{let n={provider:pe,mode:he,storage_path:he===`embedded`?_e.trim():null,url:he===`remote`?ye.trim():null,collection:xe.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`;Ee({success:!1,message:e}),R.error(`Switch error: `+e)}else{let n=i.message||`Switched vector backend to ${e}`;Ee({success:!0,message:n}),R.success(n),await it(),t()}}catch(e){Ee({success:!1,message:e.message}),R.error(`Switch error: `+e.message)}finally{Oe(!1)}}},_t=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`);R.success(`${i} token saved successfully.`),e===`github_token`&&r(``),e===`gitlab_token`&&a(``),e===`gitea_token`&&s(``),t()}catch(e){R.error(`Error saving ${i} token: `+e.message)}},vt=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`)}R.success(`${n} token cleared`),t()}catch(e){R.error(`Failed to clear ${n} token: `+e.message)}},yt=async e=>{if(e.preventDefault(),!(!A.trim()||!F.trim())){ce(!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:F.trim()})}),t=await e.json();if(!e.ok)throw Error(t.error||`Failed to save host credential`);R.success(`Host credential for '${A.trim()}' saved`),ee(!1),te(``),re(`gitlab`),ae(``),I(``),rt()}catch(e){R.error(`Error: `+e.message)}finally{ce(!1)}}},bt=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`)}R.success(`Removed credentials for '${t}'`),rt()}catch(e){R.error(`Failed to remove: `+e.message)}},xt=e?.providers_auth?.github||{token_source:e?.token_source||`None`,masked_token:e?.masked_token||`None`},St=e?.providers_auth?.gitlab||{token_source:`None`,masked_token:`None`},Ct=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)(oe,{}),(0,b.jsx)(j,{vectorStore:le,isLoadingVs:de,testFeedback:Te,vsProvider:pe,vsMode:he,vsStoragePath:_e,setVsStoragePath:ve,vsUrl:ye,setVsUrl:be,vsCollection:xe,setVsCollection:Se,isTestingVs:Ce,isSwitchingVs:De,onProviderChange:pt,onModeChange:mt,onTestConnection:ht,onSwitchBackend:gt}),(0,b.jsx)(M,{embeddingConfig:ke,isLoadingEmb:je,isSavingEmb:Ne,embProvider:Fe,setEmbProvider:Ie,embThreads:Le,setEmbThreads:Re,embBatchSize:ze,setEmbBatchSize:Be,embDenseModel:Ve,setEmbDenseModel:He,embSparseModel:Ue,setEmbSparseModel:We,embLitellmUrl:Ge,setEmbLitellmUrl:Ke,embLitellmApiKey:qe,setEmbLitellmApiKey:Je,embVisionOcrModel:Ye,setEmbVisionOcrModel:Xe,embChatModel:Ze,setEmbChatModel:Qe,discoveryResult:$e,isDiscovering:tt,onDiscoverModels:st,onSaveEmbeddingSettings:ct}),(0,b.jsx)(N,{isLoadingAutoSync:y,intervalMins:u,setIntervalMins:d,hasGlobalSecret:m,showWebhookSecret:T,setShowWebhookSecret:E,webhookSecret:f,setWebhookSecret:p,fullWebhookUrl:lt,copiedWebhookUrl:D,isSavingAutoSync:C,onSaveAutoSync:dt,onClearWebhookSecret:ft,onCopyWebhookUrl:ut}),(0,b.jsx)(P,{stats:e,ghAuth:xt,glAuth:St,gtAuth:Ct,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:F,setNewHostToken:I,isSavingHost:L,onSaveToken:_t,onClearToken:vt,onSaveHostCredential:yt,onDeleteHostCredential:bt}),(0,b.jsx)(se,{})]})}function le(){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})]})})]})})}function ue(e){switch(e){case`symbol`:return`badge-symbol`;case`code`:return`badge-code`;case`file`:return`badge-file`;case`route`:return`badge-route`;case`doc`:return`badge-doc`;default:return`badge-default`}}var de=({repo:e,onSelectResult:t,placeholder:n=`Search files, symbols, routes, or code text...`})=>{let[r,i]=(0,_.useState)(``),[a,o]=(0,_.useState)([]),[s,c]=(0,_.useState)(!1),[l,u]=(0,_.useState)(!1),[d,f]=(0,_.useState)(-1),p=(0,_.useRef)(null),m=(0,_.useRef)(null),h=(0,_.useRef)(null);(0,_.useEffect)(()=>{let t=r.trim();if(!t){o([]),u(!1),f(-1);return}h.current&&h.current.abort();let n=new AbortController;h.current=n,c(!0);let i=setTimeout(async()=>{try{let r=await fetch(`/admin/api/navigator/omni-search?repo=${encodeURIComponent(e)}&q=${encodeURIComponent(t)}&limit=25`,{signal:n.signal});if(r.ok){let e=await r.json();o(e.matches||[]),u(!0),f(-1)}}catch(e){e.name!==`AbortError`&&console.error(`Omni-search error:`,e)}finally{c(!1)}},150);return()=>{clearTimeout(i),n.abort()}},[r,e]),(0,_.useEffect)(()=>{let e=e=>{p.current&&!p.current.contains(e.target)&&u(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]);let g=e=>{if(!l||a.length===0){e.key===`ArrowDown`&&a.length>0&&u(!0);return}e.key===`ArrowDown`?(e.preventDefault(),f(e=>ee>0?e-1:a.length-1)):e.key===`Enter`?(e.preventDefault(),d>=0&&d{u(!1),i(``),o([]),t(e)},[t]);return(0,b.jsxs)(`div`,{className:`nav-omni-container`,ref:p,"data-testid":`navigator-omni-search`,children:[(0,b.jsxs)(`div`,{className:`nav-omni-input-wrapper`,children:[(0,b.jsxs)(`svg`,{className:`nav-omni-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`,{ref:m,type:`text`,className:`nav-omni-input`,value:r,onChange:e=>i(e.target.value),onKeyDown:g,onFocus:()=>{a.length>0&&u(!0)},placeholder:n,"aria-label":`Omni-Search`,"aria-autocomplete":`list`,"aria-expanded":l}),s&&(0,b.jsx)(`div`,{className:`nav-omni-spinner`}),r&&(0,b.jsx)(`button`,{type:`button`,className:`nav-omni-clear-btn`,onClick:()=>{i(``),o([]),u(!1),f(-1),m.current?.focus()},title:`Clear search`,"aria-label":`Clear Search`,children:`✕`})]}),l&&(0,b.jsxs)(`div`,{className:`nav-omni-dropdown`,"data-testid":`nav-omni-dropdown`,role:`listbox`,children:[(0,b.jsxs)(`div`,{className:`nav-omni-dropdown-header`,children:[(0,b.jsxs)(`span`,{children:[`Matches (`,a.length,`)`]}),(0,b.jsx)(`span`,{className:`nav-omni-hint`,children:`↑↓ Navigate • Enter Select • Esc Close`})]}),a.length===0&&!s&&(0,b.jsxs)(`div`,{className:`nav-omni-empty`,children:[`No matching files, symbols, or code found for "`,r,`"`]}),(0,b.jsx)(`div`,{className:`nav-omni-list`,children:a.map((e,t)=>{let n=t===d,r=ue(e.type);return(0,b.jsxs)(`div`,{className:`nav-omni-item ${n?`active`:``}`,onClick:()=>v(e),onMouseEnter:()=>f(t),role:`option`,"aria-selected":n,children:[(0,b.jsxs)(`div`,{className:`nav-omni-item-top`,children:[(0,b.jsxs)(`div`,{className:`nav-omni-item-title-group`,children:[(0,b.jsx)(`span`,{className:`nav-omni-badge ${r}`,children:e.type.toUpperCase()}),(0,b.jsx)(`span`,{className:`nav-omni-item-name`,children:e.name}),e.kind&&e.kind!==e.type&&(0,b.jsxs)(`span`,{className:`nav-omni-item-kind`,children:[`(`,e.kind,`)`]})]}),(0,b.jsx)(`span`,{className:`nav-omni-score-pill`,children:e.score_label})]}),(0,b.jsxs)(`div`,{className:`nav-omni-item-bottom`,children:[(0,b.jsxs)(`span`,{className:`nav-omni-item-path`,children:[e.filepath,e.start_line>0&&`:${e.start_line}`]}),e.preview&&e.preview!==e.name&&(0,b.jsx)(`span`,{className:`nav-omni-item-preview truncate`,children:e.preview})]})]},e.id)})})]})]})},fe=({repos:e,selectedRepo:t,onSelectRepo:n,density:r,onChangeDensity:i,searchQuery:a=``,onSearchChange:o,onSelectSearchResult:s,totalFiles:c=0,totalSymbols:l=0,onRefresh:u,loading:d=!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:d,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:c}),` files`]}),(0,b.jsxs)(`span`,{className:`nav-stat-badge`,title:`Total Extracted AST Symbols`,children:[(0,b.jsx)(`span`,{className:`stat-num`,children:l}),` symbols`]})]})]}),(0,b.jsx)(`div`,{className:`nav-toolbar-center`,children:s?(0,b.jsx)(de,{repo:t,onSelectResult:s}):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:`✕`})]}):null}),(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`})]}),u&&(0,b.jsx)(`button`,{type:`button`,className:`nav-refresh-btn ${d?`spinning`:``}`,onClick:u,title:`Refresh codebase tree`,disabled:d,"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,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=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=({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))})})})})})]})},ye=({filepath:e,content:t,totalLines:n,sizeBytes:r,targetStartLine:i,targetEndLine:a,impact:o,loading:s=!1,error:c=null,onRefresh:l,onSelectCaller:u,onSelectCallee:d,density:f=`balanced`})=>{let[p,m]=(0,_.useState)(!1),[h,g]=(0,_.useState)(!1),[v,y]=(0,_.useState)(!1),x=(0,_.useRef)(null),S=(0,_.useMemo)(()=>t?t.split(` +`):[],[t]);(0,_.useEffect)(()=>{i&&x.current&&x.current.scrollIntoView({behavior:`smooth`,block:`center`})},[i,e]);let C=async()=>{if(t)try{navigator?.clipboard?.writeText&&(await navigator.clipboard.writeText(t),m(!0),setTimeout(()=>m(!1),2e3))}catch{}},w=async()=>{if(!e)return;let t=`${e}${i?`#L${i}${a&&a!==i?`-L${a}`:``}`:``}`;try{navigator?.clipboard?.writeText&&(await navigator.clipboard.writeText(t),g(!0),setTimeout(()=>g(!1),2e3))}catch{}},T=e=>e==null?``:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`,E=o?.callers||[],D=o?.callees||[],O=E.length+D.length;return(0,b.jsxs)(`div`,{className:`nav-code-viewer-container density-${f}`,"data-testid":`navigator-code-viewer`,children:[(0,b.jsxs)(`div`,{className:`nav-code-viewer-header`,children:[(0,b.jsxs)(`div`,{className:`nav-code-viewer-meta`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:`nav-code-file-icon`,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)(`span`,{className:`nav-code-filename`,title:e,children:e}),(0,b.jsxs)(`span`,{className:`nav-code-stat-chip`,children:[n||S.length,` lines`]}),r!==void 0&&r>0&&(0,b.jsx)(`span`,{className:`nav-code-stat-chip`,children:T(r)})]}),(0,b.jsxs)(`div`,{className:`nav-code-viewer-actions`,children:[o?.symbol&&(0,b.jsxs)(`button`,{type:`button`,className:`nav-code-impact-toggle-btn ${v?`active`:``}`,onClick:()=>y(e=>!e),"aria-label":`Callers & Impact`,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)(`path`,{d:`M12 16v-4M12 8h.01`})]}),(0,b.jsxs)(`span`,{children:[`Callers & Impact (`,O,`)`]})]}),(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:w,title:`Copy path and line permalink`,"aria-label":`Copy Permalink`,children:h?`Link Copied!`:`Copy Link`}),(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:C,title:`Copy entire file contents`,"aria-label":`Copy File Code`,children:p?`Copied!`:`Copy Code`}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:l,title:`Refresh file`,"aria-label":`Refresh File`,children:`↻`})]})]}),c&&(0,b.jsx)(`div`,{className:`nav-code-error-banner`,role:`alert`,children:(0,b.jsxs)(`span`,{children:[`Failed to load file: `,c]})}),s&&(0,b.jsxs)(`div`,{className:`nav-code-loading-overlay`,children:[(0,b.jsx)(`div`,{className:`nav-omni-spinner`}),(0,b.jsx)(`span`,{children:`Loading source code...`})]}),(0,b.jsx)(`div`,{className:`nav-code-body`,tabIndex:0,children:(0,b.jsx)(`div`,{className:`nav-code-lines-wrapper`,children:S.map((e,t)=>{let n=t+1;return(0,b.jsxs)(`div`,{ref:i!==void 0&&n===i?x:void 0,className:`nav-code-line-row ${i!==void 0&&n>=i&&n<=(a||i)?`nav-code-line-target`:``}`,"data-testid":`code-line-${n}`,children:[(0,b.jsx)(`div`,{className:`nav-code-line-number select-none`,children:n}),(0,b.jsx)(`div`,{className:`nav-code-line-content font-mono`,children:e||` `})]},n)})})}),v&&o?.symbol&&(0,b.jsxs)(`div`,{className:`nav-code-impact-drawer`,"data-testid":`code-impact-drawer`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-drawer-header`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-drawer-title`,children:[(0,b.jsx)(`span`,{className:`outline-kind-badge ${ge(o.symbol.kind)}`,children:o.symbol.kind}),(0,b.jsx)(`strong`,{className:`nav-impact-symbol-name`,children:o.symbol.name}),(0,b.jsxs)(`span`,{className:`nav-impact-symbol-lines`,children:[`Lines `,o.symbol.start_line,`–`,o.symbol.end_line]}),o.route&&(0,b.jsxs)(`span`,{className:`outline-method-badge ${he(o.route.http_method)}`,children:[o.route.http_method,` `,o.route.path_pattern]})]}),(0,b.jsx)(`button`,{type:`button`,className:`nav-impact-close-btn`,onClick:()=>y(!1),"aria-label":`Close Impact Drawer`,children:`✕`})]}),(0,b.jsxs)(`div`,{className:`nav-impact-drawer-body`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column-title`,children:[`Incoming Callers (`,E.length,`)`]}),E.length===0?(0,b.jsx)(`div`,{className:`nav-impact-empty`,children:`No incoming callers detected`}):(0,b.jsx)(`div`,{className:`nav-impact-chips-list`,children:E.map((t,n)=>(0,b.jsxs)(`button`,{type:`button`,className:`nav-impact-chip caller`,onClick:()=>u&&u(t.source_filepath||e,t.source_symbol,t.source_symbol_id||void 0),children:[(0,b.jsx)(`span`,{className:`chip-name`,children:t.source_symbol||`anonymous`}),(0,b.jsx)(`span`,{className:`chip-path`,children:t.source_filepath}),t.line_number&&(0,b.jsxs)(`span`,{className:`chip-line`,children:[`:`,t.line_number]})]},t.id||n))})]}),(0,b.jsxs)(`div`,{className:`nav-impact-column`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column-title`,children:[`Outgoing Callees (`,D.length,`)`]}),D.length===0?(0,b.jsx)(`div`,{className:`nav-impact-empty`,children:`No outgoing callees detected`}):(0,b.jsx)(`div`,{className:`nav-impact-chips-list`,children:D.map((e,t)=>(0,b.jsxs)(`button`,{type:`button`,className:`nav-impact-chip callee`,onClick:()=>d&&d(e.target_filepath,e.target_symbol),children:[(0,b.jsx)(`span`,{className:`chip-name`,children:e.target_symbol}),e.target_filepath&&(0,b.jsx)(`span`,{className:`chip-path`,children:e.target_filepath}),e.line_number&&(0,b.jsxs)(`span`,{className:`chip-line`,children:[`:`,e.line_number]})]},e.id||t))})]})]})]})]})},be=({impact:e,fileContent:t,loadingContent:n=!1,contentError:r=null,targetStartLine:i,targetEndLine:a,activeInspectorTab:o,onChangeInspectorTab:s,onSelectCaller:c,onSelectCallee:l,density:u=`balanced`,loading:d=!1,onRefreshContent:f})=>{let[p,m]=(0,_.useState)(`intelligence`),[h,g]=(0,_.useState)(!1),v=o===void 0?p:o,y=s||m,x=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),g(!0),setTimeout(()=>g(!1),2e3)}catch{}},S=e?.symbol,C=e?.route,w=e?.callers||[],T=e?.callees||[],E=e?.imports||[],D=!S&&(t||n||r)||S&&v===`reader`;return(0,b.jsxs)(`div`,{className:`nav-inspector-pane density-${u}`,"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:D&&!S?`Document & File Reader`:`Code Intelligence & Impact`})]}),(0,b.jsxs)(`div`,{className:`nav-inspector-header-actions`,children:[S&&t&&(0,b.jsxs)(`div`,{className:`nav-inspector-tabs`,role:`tablist`,children:[(0,b.jsx)(`button`,{type:`button`,className:`inspector-tab-btn ${v===`intelligence`?`active`:``}`,onClick:()=>y(`intelligence`),children:`Symbol Intelligence`}),(0,b.jsx)(`button`,{type:`button`,className:`inspector-tab-btn ${v===`reader`?`active`:``}`,onClick:()=>y(`reader`),children:`Read Full File`})]}),S&&v===`intelligence`&&(0,b.jsx)(`button`,{type:`button`,className:`nav-copy-permalink-btn`,onClick:x,title:`Copy file path & line range permalink`,"aria-label":`Copy Permalink`,children:h?(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:D&&t?t.filepath.toLowerCase().endsWith(`.md`)||t.filepath.toLowerCase().endsWith(`.markdown`)?(0,b.jsx)(ve,{filepath:t.filepath,content:t.content,totalLines:t.total_lines,sizeBytes:t.size_bytes,loading:n,error:r,onRefresh:f}):(0,b.jsx)(ye,{filepath:t.filepath,content:t.content,totalLines:t.total_lines,sizeBytes:t.size_bytes,targetStartLine:i||S?.start_line,targetEndLine:a||S?.end_line,impact:e,loading:n,error:r,onRefresh:f,onSelectCaller:c,onSelectCallee:l,density:u}):D&&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`})]}):d?(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||!S?(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 ${ge(S.kind)}`,children:S.kind}),(0,b.jsx)(`h3`,{className:`summary-name`,title:S.full_symbol||S.name,children:S.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`})]}),S.filepath]}),(0,b.jsxs)(`span`,{className:`summary-line-range`,children:[`L`,S.start_line,` - L`,S.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:w.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:T.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:E.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:S.language||`code`})]})]}),C&&(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(C.http_method)}`,children:C.http_method}),(0,b.jsx)(`span`,{className:`route-path-code`,children:C.path_pattern}),C.framework&&(0,b.jsx)(`span`,{className:`route-framework-tag`,children:C.framework})]})]}),S.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:S.signature})})]}),S.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:S.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 (`,w.length,`)`]})]}),w.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:w.map((e,t)=>(0,b.jsxs)(`div`,{"data-testid":`caller-item-${e.id??t}`,className:`relation-item caller-item`,onClick:()=>{e.source_filepath&&c&&c(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 (`,T.length+E.length,`)`]})]}),T.length===0&&E.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:[T.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&&l&&l(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&&l&&(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(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}`)),E.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}`))]})]})]})})]})},xe=`contextcortex_navigator_density`,Se=({initialRepo:e=`__all__`,initialPath:t,initialSymbolId:n})=>{let[r,i]=(0,_.useState)(()=>{let e=localStorage.getItem(xe);return e===`compact`||e===`balanced`||e===`spacious`?e:`balanced`}),a=e=>{i(e),localStorage.setItem(xe,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)(void 0),[ae,F]=(0,_.useState)(void 0),[I,L]=(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 oe=(0,_.useCallback)(async e=>{p(!0),L(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),L(e.message||`Failed to load codebase tree`)}finally{p(!1)}},[]);(0,_.useEffect)(()=>{oe(c)},[c,oe]);let se=(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)}},[]),ce=(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)}},[]),le=(0,_.useCallback)(async(e,t,n,r)=>{C(!0);try{let i=await fetch(`/admin/api/navigator/file-outline?repo=${encodeURIComponent(e)}&filepath=${encodeURIComponent(t)}`);if(!i.ok)throw Error(`Failed to load file outline: ${i.status}`);let a=await i.json();if(x(a),a.symbols&&a.symbols.length>0){let t;typeof n==`number`?t=a.symbols.find(e=>e.id===n):typeof n==`string`&&(t=a.symbols.find(e=>e.name===n||e.full_symbol===n));let i=t||a.symbols[0];T(i.id),N(r||`intelligence`),await se(e,i.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)}},[se]);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),A(null),ie(void 0),F(void 0)},density:r,onChangeDensity:a,searchQuery:m,onSearchChange:h,onSelectSearchResult:e=>{let t=e.repo&&e.repo!==`__all__`?e.repo:c;e.repo&&e.repo!==c&&c!==`__all__`&&l(e.repo),v(e.filepath),ie(e.start_line),F(e.end_line),ce(t,e.filepath),e.type===`symbol`&&e.symbol_id?(T(e.symbol_id),le(t,e.filepath,e.symbol_id,`reader`),se(t,e.symbol_id),N(`reader`)):(le(t,e.filepath,void 0,`reader`),N(`reader`))},totalFiles:u?.total_files??0,totalSymbols:u?.total_symbols??0,onRefresh:()=>oe(c),loading:f}),I&&(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:I}),(0,b.jsx)(`button`,{type:`button`,onClick:()=>L(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),ie(void 0),F(void 0),le(c,e.path),ce(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),ie(e.start_line),F(e.end_line),N(`intelligence`),se(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)(be,{impact:E,fileContent:ee,loadingContent:te,contentError:re,targetStartLine:P,targetEndLine:ae,activeInspectorTab:M,onChangeInspectorTab:N,onSelectCaller:(e,t,n)=>{v(e),ie(void 0),F(void 0),le(c,e,n??t),ce(c,e)},onSelectCallee:(e,t)=>{e&&(v(e),ie(void 0),F(void 0),le(c,e,t),ce(c,e))},density:r,loading:O,onRefreshContent:()=>g&&ce(c,g)})})]})]})};function Ce({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 we({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)(``),[F,I]=(0,_.useState)(!1),[L,oe]=(0,_.useState)(!1),[se,ce]=(0,_.useState)(!1),[le,ue]=(0,_.useState)(null),[de,fe]=(0,_.useState)(null),[pe,me]=(0,_.useState)(``),[he,ge]=(0,_.useState)(`local_storage`),[_e,ve]=(0,_.useState)(``),[ye,be]=(0,_.useState)(!1),xe=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]},Se=e=>{if(!e)return`-`;let t=e<1e11?e*1e3:e;return new Date(t).toLocaleString()},we=(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)(()=>{we(``)},[]);let Te=e=>{we(e)},Ee=()=>{if(!i)return;let e=i.split(`/`).filter(Boolean);e.pop(),Te(e.join(`/`))},De=e=>{let t=e===void 0?i:e;d(t?`${t}/`:``),p(``),h(`local_storage`),v(``),x(null),l(!0)},Oe=e=>{if(e.preventDefault(),w(!1),e.dataTransfer.files&&e.dataTransfer.files.length>0){let t=e.dataTransfer.files[0];Ne(t)}},ke=e=>{e.target.files&&e.target.files.length>0&&Ne(e.target.files[0])},Ae=async(e,n,r,a)=>{ce(!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`);fe(e),me(n||(i?`${i}/${e.name}`:e.name)),ge(r||m||`local_storage`),ve(a||f||``),ue(s),l(!1),oe(!0)}catch(e){t.error(`PDF preview error: ${e.message}`)}finally{ce(!1)}},je=async()=>{if(de){be(!0);try{let n=new FormData;n.append(`file`,de),n.append(`path`,pe||de.name),n.append(`repo`,he||`local_storage`),_e&&n.append(`category`,_e);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`);oe(!1),fe(null),ue(null);let o=a.chunks_indexed??0;t.success(`PDF uploaded and indexed (${o} chunks)`),we(i),e&&e()}catch(e){t.error(`PDF ingestion error: ${e.message}`)}finally{be(!1)}}},Me=()=>{oe(!1),fe(null),ue(null)},Ne=e=>{x(e);let t=i?`${i}/${e.name}`:e.name;if(d(t),e.name.toLowerCase().endsWith(`.pdf`)||e.type===`application/pdf`){v(``),Ae(e,t,m,f);return}let n=new FileReader;n.onload=e=>{typeof e.target?.result==`string`&&v(e.target.result)},n.readAsText(e)},Pe=async n=>{if(n.preventDefault(),!u.trim()){t.error(`File path is required`);return}if(y&&y.name.toLowerCase().endsWith(`.pdf`)){await Ae(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)`),we(i),e&&e()}catch(e){t.error(`Upload error: ${e.message}`)}finally{E(!1)}},Fe=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)}},Ie=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(``)}},Le=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}I(!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)`),we(i),e&&e()}catch(e){t.error(`Replace error: ${e.message}`)}finally{I(!1)}}},Re=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}`),we(i),e&&e()}catch(e){t.error(`Delete error: ${e.message}`)}},ze=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:()=>we(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:()=>De(),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:()=>Te(``),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-house`}),` root`]}),ze.map((e,t)=>{let n=ze.slice(0,t+1).join(`/`),r=t===ze.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:()=>Te(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:Ee,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:()=>Te(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:()=>Te(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:xe(e.size_bytes)})}),(0,b.jsx)(`td`,{style:{fontSize:`0.85rem`},children:Se(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:()=>Fe(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:()=>Ie(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:()=>Re(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:()=>Te(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:xe(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:Se(e.mtime)})]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-actions`,children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Fe(e),title:`Preview File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-eye`}),` Preview`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Ie(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:()=>Re(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:Pe,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:Oe,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} (${xe(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)`}),se&&(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:ke})]}),(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: `,xe(k.size_bytes),` • Modified: `,Se(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:Le,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:F||j.rel_path.toLowerCase().endsWith(`.pdf`),children:[(0,b.jsx)(`i`,{className:`fa-solid ${F?`fa-spinner fa-spin`:`fa-save`}`}),` Save & Re-Index`]})]})]})]})}),L&&le&&(0,b.jsx)(Ce,{data:le,onConfirm:je,onCancel:Me,isIngesting:ye})]})}function Te(){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 Ee(){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)(Se,{}),e===`git-repos`&&(0,b.jsx)(te,{refreshStats:o}),e===`local-paths`&&(0,b.jsx)(ne,{refreshStats:o}),e===`local-storage`&&(0,b.jsx)(we,{refreshStats:o}),e===`ingestion-catalog`&&(0,b.jsx)(Te,{}),e===`search-inspector`&&(0,b.jsx)(re,{}),e===`settings`&&(0,b.jsx)(ce,{stats:i,refreshStats:o}),e===`diagnostics`&&(0,b.jsx)(le,{})]}),(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)(Ee,{})})})); \ No newline at end of file diff --git a/frontend/dist/assets/index-aygUsQiL.css b/frontend/dist/assets/index-qIBukKNH.css similarity index 60% rename from frontend/dist/assets/index-aygUsQiL.css rename to frontend/dist/assets/index-qIBukKNH.css index 002f141..52e2cc9 100644 --- a/frontend/dist/assets/index-aygUsQiL.css +++ b/frontend/dist/assets/index-qIBukKNH.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{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}} +: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-omni-container{width:100%;position:relative}.nav-omni-input-wrapper{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-omni-input-wrapper:focus-within{border-color:var(--primary,#0891b2);box-shadow:0 0 0 2px #0891b240}.nav-omni-search-icon{color:var(--text-muted,#94a3b8);pointer-events:none;flex-shrink:0;margin-right:8px}.nav-omni-input{color:var(--text,#f8fafc);background:0 0;border:none;outline:none;flex:1;min-width:0;padding:6px 0;font-size:.82rem}.nav-omni-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-omni-clear-btn:hover{color:var(--text,#f8fafc)}.nav-omni-spinner{border:2px solid #0891b24d;border-top-color:var(--primary,#0891b2);border-radius:50%;flex-shrink:0;width:12px;height:12px;margin-left:6px;animation:.6s linear infinite nav-spin}@keyframes nav-spin{to{transform:rotate(360deg)}}.nav-omni-dropdown{z-index:50;background:var(--bg-card,#0d2c2f);border:1px solid var(--border-card,#15474d);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:8px;flex-direction:column;max-height:420px;display:flex;position:absolute;top:calc(100% + 4px);left:0;right:0;overflow:hidden;box-shadow:0 15px 30px #0009,0 5px 15px #0006}.nav-omni-dropdown-header{border-bottom:1px solid var(--border-card,#15474d);color:var(--text-muted,#94a3b8);text-transform:uppercase;letter-spacing:.05em;background:#0000004d;justify-content:space-between;align-items:center;padding:8px 12px;font-size:.72rem;font-weight:600;display:flex}.nav-omni-hint{color:var(--text-muted,#64748b);text-transform:none;font-size:.68rem}.nav-omni-empty{text-align:center;color:var(--text-muted,#94a3b8);padding:16px;font-size:.8rem}.nav-omni-list{padding:4px;overflow-y:auto}.nav-omni-item{cursor:pointer;border:1px solid #0000;border-radius:6px;flex-direction:column;margin-bottom:2px;padding:8px 10px;transition:background-color .12s;display:flex}.nav-omni-item:hover,.nav-omni-item.active{background:#0891b226;border-color:#0891b259}.nav-omni-item-top{justify-content:space-between;align-items:center;gap:8px;margin-bottom:4px;display:flex}.nav-omni-item-title-group{align-items:center;gap:6px;display:flex;overflow:hidden}.nav-omni-badge{text-transform:uppercase;letter-spacing:.04em;font-size:.65rem;font-weight:700;font-family:var(--font-mono,monospace);border-radius:3px;flex-shrink:0;padding:1px 5px}.badge-symbol{color:#38bdf8;background:#0ea5e933;border:1px solid #38bdf859}.badge-code{color:#c084fc;background:#a855f733;border:1px solid #c084fc59}.badge-file{color:#2dd4bf;background:#14b8a633;border:1px solid #2dd4bf59}.badge-route{color:#4ade80;background:#22c55e33;border:1px solid #4ade8059}.badge-doc{color:#fbbf24;background:#f59e0b33;border:1px solid #fbbf2459}.badge-default{color:#cbd5e1;background:#94a3b833}.nav-omni-item-name{color:var(--text,#f8fafc);font-size:.82rem;font-weight:600;font-family:var(--font-mono,monospace);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.nav-omni-item-kind{color:var(--text-muted,#94a3b8);font-size:.72rem}.nav-omni-score-pill{color:#34d399;white-space:nowrap;background:#10b98126;border:1px solid #34d3994d;border-radius:10px;flex-shrink:0;padding:1px 7px;font-size:.68rem;font-weight:600}.nav-omni-item-bottom{color:var(--text-muted,#94a3b8);font-size:.72rem;font-family:var(--font-mono,monospace);align-items:center;gap:8px;display:flex;overflow:hidden}.nav-omni-item-path{color:var(--primary,#38bdf8);flex-shrink:0}.nav-omni-item-preview{color:var(--text-muted,#94a3b8);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.nav-code-viewer-container{background:var(--bg-card,#0d2c2f);border:1px solid var(--border-card,#15474d);border-radius:8px;flex-direction:column;max-width:100%;height:100%;display:flex;position:relative;overflow:hidden}.nav-code-viewer-header{border-bottom:1px solid var(--border-card,#15474d);background:#0006;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;max-width:100%;padding:8px 14px;display:flex}.nav-code-viewer-meta{align-items:center;gap:8px;max-width:100%;display:flex;overflow:hidden}.nav-code-file-icon{color:var(--primary,#38bdf8);flex-shrink:0}.nav-code-filename{color:var(--text,#f8fafc);font-size:.84rem;font-weight:700;font-family:var(--font-mono,monospace);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.nav-code-stat-chip{color:var(--text-muted,#94a3b8);font-size:.72rem;font-family:var(--font-mono,monospace);background:#ffffff14;border-radius:4px;flex-shrink:0;padding:1px 6px}.nav-code-viewer-actions{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.nav-code-action-btn{border:1px solid var(--border-card,#15474d);color:var(--text-muted,#cbd5e1);cursor:pointer;background:#ffffff0f;border-radius:4px;padding:3px 8px;font-size:.74rem;transition:all .15s}.nav-code-action-btn:hover{color:var(--text,#f8fafc);border-color:var(--primary,#0891b2);background:#ffffff1f}.nav-code-impact-toggle-btn{color:#c084fc;cursor:pointer;background:#a855f726;border:1px solid #a855f759;border-radius:4px;align-items:center;gap:5px;padding:3px 9px;font-size:.74rem;font-weight:600;transition:all .15s;display:flex}.nav-code-impact-toggle-btn:hover,.nav-code-impact-toggle-btn.active{color:#f3e8ff;background:#a855f747;border-color:#a855f7}.nav-code-body{background:#061113;outline:none;flex:1;max-width:100%;padding:8px 0;position:relative;overflow:hidden auto}.nav-code-lines-wrapper{flex-direction:column;width:100%;max-width:100%;display:flex}.nav-code-line-row{box-sizing:border-box;max-width:100%;min-height:20px;padding:0 4px;line-height:20px;transition:background-color .1s;display:flex}.nav-code-line-row:hover{background:#ffffff08}.nav-code-line-number{text-align:right;width:44px;min-width:44px;font-size:.72rem;font-family:var(--font-mono,monospace);color:#475569;-webkit-user-select:none;user-select:none;flex-shrink:0;padding-right:12px}.nav-code-line-content{font-size:.78rem;font-family:var(--font-mono,monospace);color:#cbd5e1;white-space:pre-wrap;word-break:break-all;overflow-wrap:anywhere;tab-size:4;flex:1;min-width:0}.nav-code-line-target{background:#0ea5e92e!important;border-left:3px solid #38bdf8!important}.nav-code-line-target .nav-code-line-number{font-weight:700;color:#38bdf8!important}.nav-code-line-target .nav-code-line-content{font-weight:500;color:#fff!important}.nav-code-impact-drawer{border-top:1px solid var(--border-card,#15474d);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#091d20f2;flex-direction:column;max-height:260px;animation:.18s ease-out slide-up;display:flex}@keyframes slide-up{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.nav-impact-drawer-header{border-bottom:1px solid var(--border-card,#15474d);background:#00000059;justify-content:space-between;align-items:center;padding:6px 12px;display:flex}.nav-impact-drawer-title{align-items:center;gap:8px;font-size:.76rem;display:flex}.nav-impact-symbol-name{color:var(--text,#f8fafc);font-family:var(--font-mono,monospace)}.nav-impact-symbol-lines{color:var(--text-muted,#94a3b8);font-size:.7rem}.nav-impact-close-btn{color:var(--text-muted,#94a3b8);cursor:pointer;background:0 0;border:none;padding:2px 6px;font-size:.8rem}.nav-impact-close-btn:hover{color:var(--text,#f8fafc)}.nav-impact-drawer-body{grid-template-columns:1fr 1fr;gap:12px;padding:10px 14px;display:grid;overflow-y:auto}.nav-impact-column-title{text-transform:uppercase;color:var(--text-muted,#94a3b8);margin-bottom:6px;font-size:.72rem;font-weight:600}.nav-impact-empty{color:var(--text-muted,#64748b);font-size:.72rem;font-style:italic}.nav-impact-chips-list{flex-direction:column;gap:4px;display:flex}.nav-impact-chip{border:1px solid var(--border-card,#15474d);cursor:pointer;text-align:left;color:var(--text,#f8fafc);background:#0000004d;border-radius:4px;align-items:center;gap:6px;padding:3px 8px;font-size:.72rem;transition:all .12s;display:flex}.nav-impact-chip:hover{border-color:var(--primary,#0891b2);background:#0891b233}.nav-impact-chip.caller .chip-name{color:#38bdf8;font-weight:600;font-family:var(--font-mono,monospace)}.nav-impact-chip.callee .chip-name{color:#a7f3d0;font-weight:600;font-family:var(--font-mono,monospace)}.nav-impact-chip .chip-path{color:var(--text-muted,#94a3b8);font-size:.68rem;font-family:var(--font-mono,monospace)}.nav-impact-chip .chip-line{color:#facc15;font-size:.68rem}.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 bb04f2e..a11ef77 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -17,8 +17,8 @@ } catch (e) {} })(); - - + +
diff --git a/frontend/e2e/navigator.spec.ts b/frontend/e2e/navigator.spec.ts index a751700..87883e6 100644 --- a/frontend/e2e/navigator.spec.ts +++ b/frontend/e2e/navigator.spec.ts @@ -364,17 +364,75 @@ async function setupNavigatorMocks(page: any) { } }); + await page.route('**/admin/api/navigator/omni-search*', async (route: any) => { + const url = decodeURIComponent(route.request().url()); + if (url.includes('chat_completion')) { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + query: 'chat_completion', + repo: '__all__', + total_matches: 1, + matches: [ + { + id: 'sym_101', + type: 'symbol', + symbol_id: 101, + name: 'chat_completion_endpoint', + kind: 'function', + filepath: 'app/api/routers/chat.py', + repo: 'contextcortex-core', + start_line: 45, + end_line: 85, + score: 0.99, + score_label: '99% AST exact match', + preview: 'async def chat_completion_endpoint(...)', + }, + ], + }), + }); + } else { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ query: '', repo: '__all__', total_matches: 0, matches: [] }), + }); + } + }); + 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', - }), - }); + const url = decodeURIComponent(route.request().url()); + if (url.includes('chat.py')) { + const codeLines = Array.from({ length: 90 }, (_, i) => { + const lineNum = i + 1; + if (lineNum === 45) return 'async def chat_completion_endpoint(request: ChatCompletionRequest):'; + if (lineNum === 46) return ' return {"status": "ok"}'; + return `# Line ${lineNum} sample source code`; + }).join('\n'); + + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + filepath: 'app/api/routers/chat.py', + content: codeLines, + total_lines: 90, + language: 'python', + }), + }); + } else { + 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) => { @@ -708,4 +766,55 @@ test.describe('Codebase Navigator End-to-End Suite', () => { await docReader.getByRole('button', { name: 'Rendered' }).click(); await expect(docReader.locator('.doc-rendered-content')).toBeVisible(); }); + + test('9. Omni-Search & Synchronized Full-File Code Viewer: searches across symbols, opens full source, highlights target line with zero layout shift', async ({ page }) => { + await navigateToNavigator(page); + + const toolbar = page.locator('[data-testid="navigator-toolbar"]'); + const toolbarBoxBefore = await toolbar.boundingBox(); + + // Type query into omni-search input + const omniInput = page.getByRole('textbox', { name: /omni-search/i }); + await expect(omniInput).toBeVisible(); + await omniInput.fill('chat_completion'); + + // Wait for floating dropdown + const dropdown = page.locator('[data-testid="nav-omni-dropdown"]'); + await expect(dropdown).toBeVisible(); + + // Check overlay has position: absolute and z-index >= 50 + const dropdownStyle = await dropdown.evaluate((el) => { + const computed = window.getComputedStyle(el); + return { position: computed.position, zIndex: computed.zIndex }; + }); + expect(dropdownStyle.position).toBe('absolute'); + expect(Number(dropdownStyle.zIndex)).toBeGreaterThanOrEqual(50); + + // Verify toolbar height didn't expand (within 2px tolerance) + const toolbarBoxAfter = await toolbar.boundingBox(); + expect(Math.abs((toolbarBoxAfter?.height || 0) - (toolbarBoxBefore?.height || 0))).toBeLessThanOrEqual(2); + + // Click matching symbol result + const matchItem = dropdown.locator('.nav-omni-item').first(); + await expect(matchItem).toContainText('chat_completion_endpoint'); + await expect(matchItem).toContainText('99% AST exact match'); + await matchItem.click(); + + // Dropdown should dismiss + await expect(dropdown).not.toBeVisible(); + + // Pane 3 should display NavigatorCodeViewer + const codeViewer = page.locator('[data-testid="navigator-code-viewer"]'); + await expect(codeViewer).toBeVisible(); + await expect(codeViewer.locator('.nav-code-filename')).toContainText('chat.py'); + + // Target line 45 should have highlight class + const targetLine = codeViewer.locator('[data-testid="code-line-45"]'); + await expect(targetLine).toHaveClass(/nav-code-line-target/); + + // Check zero layout collisions + await expect(page).toHaveNoLayoutOverflow(); + await expect(page).toHaveNoElementCollisions(); + }); }); + diff --git a/frontend/src/CodeNavigator.tsx b/frontend/src/CodeNavigator.tsx index 19ae97e..7665002 100644 --- a/frontend/src/CodeNavigator.tsx +++ b/frontend/src/CodeNavigator.tsx @@ -162,7 +162,12 @@ export const CodeNavigator: React.FC = ({ // 5. Fetch file outline when selectedPath changes const fetchOutline = useCallback( - async (repoName: string, filePath: string, symbolToAutoSelect?: number | string) => { + async ( + repoName: string, + filePath: string, + symbolToAutoSelect?: number | string, + tabToActivate?: 'intelligence' | 'reader' + ) => { setLoadingOutline(true); try { const res = await fetch( @@ -186,7 +191,7 @@ export const CodeNavigator: React.FC = ({ } const targetSymbol = matched || data.symbols[0]; setSelectedSymbolId(targetSymbol.id); - setActiveInspectorTab('intelligence'); + setActiveInspectorTab(tabToActivate || 'intelligence'); await fetchImpact(repoName, targetSymbol.id); } else { setSelectedSymbolId(null); @@ -231,11 +236,11 @@ export const CodeNavigator: React.FC = ({ if (result.type === 'symbol' && result.symbol_id) { setSelectedSymbolId(result.symbol_id); - fetchOutline(targetRepo, result.filepath, result.symbol_id); + fetchOutline(targetRepo, result.filepath, result.symbol_id, 'reader'); fetchImpact(targetRepo, result.symbol_id); setActiveInspectorTab('reader'); } else { - fetchOutline(targetRepo, result.filepath); + fetchOutline(targetRepo, result.filepath, undefined, 'reader'); setActiveInspectorTab('reader'); } }; @@ -253,7 +258,7 @@ export const CodeNavigator: React.FC = ({ setSelectedSymbolId(symbol.id); setTargetStartLine(symbol.start_line); setTargetEndLine(symbol.end_line); - setActiveInspectorTab('reader'); + setActiveInspectorTab('intelligence'); fetchImpact(selectedRepo, symbol.id); }; diff --git a/frontend/src/components/navigator/NavigatorOmniSearch.tsx b/frontend/src/components/navigator/NavigatorOmniSearch.tsx index f85c2ac..efb9c3d 100644 --- a/frontend/src/components/navigator/NavigatorOmniSearch.tsx +++ b/frontend/src/components/navigator/NavigatorOmniSearch.tsx @@ -123,6 +123,8 @@ export const NavigatorOmniSearch: React.FC = ({ const handleSelect = useCallback( (item: OmniSearchResultItem) => { setIsOpen(false); + setQuery(''); + setResults([]); onSelectResult(item); }, [onSelectResult] diff --git a/frontend/src/styles/navigator.css b/frontend/src/styles/navigator.css index 6c9ef05..eb632c4 100644 --- a/frontend/src/styles/navigator.css +++ b/frontend/src/styles/navigator.css @@ -438,6 +438,7 @@ display: flex; flex-direction: column; height: 100%; + max-width: 100%; background: var(--bg-card, #0d2c2f); border-radius: 8px; overflow: hidden; @@ -454,6 +455,7 @@ border-bottom: 1px solid var(--border-card, #15474d); gap: 12px; flex-wrap: wrap; + max-width: 100%; } .nav-code-viewer-meta { @@ -461,6 +463,7 @@ align-items: center; gap: 8px; overflow: hidden; + max-width: 100%; } .nav-code-file-icon { @@ -492,6 +495,7 @@ display: flex; align-items: center; gap: 6px; + flex-wrap: wrap; } .nav-code-action-btn { @@ -535,7 +539,9 @@ .nav-code-body { flex: 1; - overflow: auto; + overflow-y: auto; + overflow-x: hidden; + max-width: 100%; background: #061113; padding: 8px 0; position: relative; @@ -545,8 +551,8 @@ .nav-code-lines-wrapper { display: flex; flex-direction: column; - min-width: 100%; - width: max-content; + width: 100%; + max-width: 100%; } .nav-code-line-row { @@ -555,6 +561,8 @@ line-height: 20px; transition: background-color 0.1s ease; padding: 0 4px; + max-width: 100%; + box-sizing: border-box; } .nav-code-line-row:hover { @@ -570,6 +578,7 @@ font-family: var(--font-mono, monospace); color: #475569; user-select: none; + flex-shrink: 0; } .nav-code-line-content { @@ -577,8 +586,11 @@ font-size: 0.78rem; font-family: var(--font-mono, monospace); color: #cbd5e1; - white-space: pre; + white-space: pre-wrap; + word-break: break-all; + overflow-wrap: anywhere; tab-size: 4; + min-width: 0; } /* Target line highlight */ diff --git a/frontend/src/tests/NavigatorCodeViewer.test.tsx b/frontend/src/tests/NavigatorCodeViewer.test.tsx index 67729e1..5d759ec 100644 --- a/frontend/src/tests/NavigatorCodeViewer.test.tsx +++ b/frontend/src/tests/NavigatorCodeViewer.test.tsx @@ -1,6 +1,5 @@ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi, beforeEach } from 'vitest'; -import React from 'react'; import { NavigatorCodeViewer } from '../components/navigator/NavigatorCodeViewer'; import type { SymbolImpact } from '../components/navigator/types'; diff --git a/frontend/src/tests/NavigatorOmniSearch.test.tsx b/frontend/src/tests/NavigatorOmniSearch.test.tsx index de4e7e3..5bdaa27 100644 --- a/frontend/src/tests/NavigatorOmniSearch.test.tsx +++ b/frontend/src/tests/NavigatorOmniSearch.test.tsx @@ -1,6 +1,5 @@ import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import React from 'react'; import { NavigatorOmniSearch } from '../components/navigator/NavigatorOmniSearch'; import type { OmniSearchResultItem } from '../components/navigator/types'; @@ -50,7 +49,7 @@ describe('NavigatorOmniSearch Component', () => { }); it('fetches matches when user types and displays floating overlay', async () => { - const fetchSpy = vi.spyOn(global, 'fetch').mockResolvedValue({ + const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue({ ok: true, json: async () => ({ query: 'api_read', @@ -82,7 +81,7 @@ describe('NavigatorOmniSearch Component', () => { }); it('navigates with keyboard and selects on Enter', async () => { - vi.spyOn(global, 'fetch').mockResolvedValue({ + vi.spyOn(globalThis, 'fetch').mockResolvedValue({ ok: true, json: async () => ({ query: 'api_read', @@ -108,7 +107,7 @@ describe('NavigatorOmniSearch Component', () => { }); it('closes dropdown on Escape key', async () => { - vi.spyOn(global, 'fetch').mockResolvedValue({ + vi.spyOn(globalThis, 'fetch').mockResolvedValue({ ok: true, json: async () => ({ query: 'api_read', From e77ba57d65b829c2c7ad3aae3984adb039b2aa34 Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:38:27 -0500 Subject: [PATCH 8/9] docs(navigator): document omni-search command palette and full code viewer --- docs/guide/user-guide/navigator.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/guide/user-guide/navigator.md b/docs/guide/user-guide/navigator.md index f4179c2..eee7ac4 100644 --- a/docs/guide/user-guide/navigator.md +++ b/docs/guide/user-guide/navigator.md @@ -25,12 +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 (or Document Reader) +### Universal Omni-Search +- **Global Command Palette**: Search across AST symbols, files, API routes, and raw code text in real time from the center toolbar. +- **Match Types & Confidence Scoring**: + - `[symbol]` – High confidence AST matches (e.g., `99% AST exact match`, `94% AST prefix match`). + - `[file]` – File path and module matches (`92% filename match`). + - `[route]` – REST endpoint paths (`95% route match`). + - `[code]` – Raw source code substring occurrences (`88% code match`). +- **Keyboard Navigation**: Navigate results with ↑ and ↓, press Enter to jump, or Esc to dismiss. +- **Zero-Shift Floating Overlay**: Floats smoothly over the 3 panes without shifting header layout or altering pane heights. + +### Pane 3: Code Intelligence & Full Source Viewer (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 Source Code Viewer**: + - Automatically loads full file contents with line numbering. + - **Target Line Highlighting**: Seamlessly scrolls to and highlights target line ranges (`targetStartLine` / `targetEndLine`) when jumping from Omni-Search or symbols outline. + - **Docked Symbol Impact Drawer**: Collapsible bottom drawer showing caller and callee counts with instant click-to-jump. + - **Copy Code & Link**: One-click actions to copy clean source code or deep links to specific lines. - **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. From c2829befcee3192eac9f57da2223b7a1a9415a38 Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Tue, 29 Sep 2026 19:50:50 -0500 Subject: [PATCH 9/9] test(navigator): eliminate test theater with rigorous assertions, sync requirements, and harden e2e flow --- REQUIREMENTS.md | 24 ++++- .../{index-D6YDOGnZ.js => index-B8UpBGpc.js} | 2 +- frontend/dist/index.html | 2 +- frontend/e2e/navigator.spec.ts | 23 ++++- .../navigator/NavigatorCodeViewer.tsx | 10 +- .../src/tests/NavigatorCodeViewer.test.tsx | 55 +++++++++++ .../src/tests/NavigatorOmniSearch.test.tsx | 93 +++++++++++++++++++ tests/backend/test_navigator_router.py | 35 ++++++- 8 files changed, 234 insertions(+), 10 deletions(-) rename frontend/dist/assets/{index-D6YDOGnZ.js => index-B8UpBGpc.js} (82%) diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md index e1af402..eda4c5e 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:** **977 Automated Tests** (655 Pytest Backend + 273 Vitest Frontend + 49 Playwright E2E). +**Test Verification Baseline:** **993 Automated Tests** (656 Pytest Backend + 287 Vitest Frontend + 50 Playwright E2E). --- @@ -642,7 +642,7 @@ classDiagram - `test_process_file_content_with_custom_provider` - `test_sync_single_git_repo_triggers_notification` -#### `tests/backend/test_navigator_router.py` (8 tests) +#### `tests/backend/test_navigator_router.py` (9 tests) - `test_db` - `test_api_get_navigator_tree_all` - `test_api_get_navigator_tree_specific_repo` @@ -651,6 +651,7 @@ classDiagram - `test_api_get_file_outline_empty` - `test_api_get_symbol_impact_success` - `test_api_get_symbol_impact_not_found` +- `test_api_get_omni_search_symbols_and_files` #### `tests/backend/test_navigator_service.py` (11 tests) - `test_db` @@ -1270,6 +1271,14 @@ 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 +#### `NavigatorCodeViewer.test.tsx` (6 tests) +- renders line numbers and code lines +- highlights target line range and calls scrollIntoView +- toggles callers and impact drawer +- copies full code to clipboard when clicking Copy Code button +- copies permalink to clipboard when clicking Copy Link button +- renders fallback when content is empty + #### `NavigatorInspector.test.tsx` (10 tests) - renders empty placeholder when no symbol is selected - renders doc reader when fileContent is provided without an impact symbol @@ -1282,6 +1291,16 @@ 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 +#### `NavigatorOmniSearch.test.tsx` (8 tests) +- renders omni-search input with placeholder +- fetches matches when user types and displays floating overlay +- navigates with keyboard and selects on Enter +- closes dropdown on Escape key +- displays empty state when query returns no matches +- handles fetch error gracefully without crashing +- closes dropdown when clicking outside the container +- supports ArrowUp navigation within bounds + #### `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 @@ -1561,3 +1580,4 @@ and leaves the prior indexed state intact without data loss._ - 6. Density Mode Toggling: toggles Compact, Balanced, and Spacious layout modes - 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 +- 9. Omni-Search & Synchronized Full-File Code Viewer: searches across symbols, opens full source, highlights target line with zero layout shift diff --git a/frontend/dist/assets/index-D6YDOGnZ.js b/frontend/dist/assets/index-B8UpBGpc.js similarity index 82% rename from frontend/dist/assets/index-D6YDOGnZ.js rename to frontend/dist/assets/index-B8UpBGpc.js index 42e8600..49b4a57 100644 --- a/frontend/dist/assets/index-D6YDOGnZ.js +++ b/frontend/dist/assets/index-B8UpBGpc.js @@ -12,4 +12,4 @@ Error generating stack: `+e.message+` `)})},`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))})})})})})]})},ye=({filepath:e,content:t,totalLines:n,sizeBytes:r,targetStartLine:i,targetEndLine:a,impact:o,loading:s=!1,error:c=null,onRefresh:l,onSelectCaller:u,onSelectCallee:d,density:f=`balanced`})=>{let[p,m]=(0,_.useState)(!1),[h,g]=(0,_.useState)(!1),[v,y]=(0,_.useState)(!1),x=(0,_.useRef)(null),S=(0,_.useMemo)(()=>t?t.split(` -`):[],[t]);(0,_.useEffect)(()=>{i&&x.current&&x.current.scrollIntoView({behavior:`smooth`,block:`center`})},[i,e]);let C=async()=>{if(t)try{navigator?.clipboard?.writeText&&(await navigator.clipboard.writeText(t),m(!0),setTimeout(()=>m(!1),2e3))}catch{}},w=async()=>{if(!e)return;let t=`${e}${i?`#L${i}${a&&a!==i?`-L${a}`:``}`:``}`;try{navigator?.clipboard?.writeText&&(await navigator.clipboard.writeText(t),g(!0),setTimeout(()=>g(!1),2e3))}catch{}},T=e=>e==null?``:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`,E=o?.callers||[],D=o?.callees||[],O=E.length+D.length;return(0,b.jsxs)(`div`,{className:`nav-code-viewer-container density-${f}`,"data-testid":`navigator-code-viewer`,children:[(0,b.jsxs)(`div`,{className:`nav-code-viewer-header`,children:[(0,b.jsxs)(`div`,{className:`nav-code-viewer-meta`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:`nav-code-file-icon`,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)(`span`,{className:`nav-code-filename`,title:e,children:e}),(0,b.jsxs)(`span`,{className:`nav-code-stat-chip`,children:[n||S.length,` lines`]}),r!==void 0&&r>0&&(0,b.jsx)(`span`,{className:`nav-code-stat-chip`,children:T(r)})]}),(0,b.jsxs)(`div`,{className:`nav-code-viewer-actions`,children:[o?.symbol&&(0,b.jsxs)(`button`,{type:`button`,className:`nav-code-impact-toggle-btn ${v?`active`:``}`,onClick:()=>y(e=>!e),"aria-label":`Callers & Impact`,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)(`path`,{d:`M12 16v-4M12 8h.01`})]}),(0,b.jsxs)(`span`,{children:[`Callers & Impact (`,O,`)`]})]}),(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:w,title:`Copy path and line permalink`,"aria-label":`Copy Permalink`,children:h?`Link Copied!`:`Copy Link`}),(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:C,title:`Copy entire file contents`,"aria-label":`Copy File Code`,children:p?`Copied!`:`Copy Code`}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:l,title:`Refresh file`,"aria-label":`Refresh File`,children:`↻`})]})]}),c&&(0,b.jsx)(`div`,{className:`nav-code-error-banner`,role:`alert`,children:(0,b.jsxs)(`span`,{children:[`Failed to load file: `,c]})}),s&&(0,b.jsxs)(`div`,{className:`nav-code-loading-overlay`,children:[(0,b.jsx)(`div`,{className:`nav-omni-spinner`}),(0,b.jsx)(`span`,{children:`Loading source code...`})]}),(0,b.jsx)(`div`,{className:`nav-code-body`,tabIndex:0,children:(0,b.jsx)(`div`,{className:`nav-code-lines-wrapper`,children:S.map((e,t)=>{let n=t+1;return(0,b.jsxs)(`div`,{ref:i!==void 0&&n===i?x:void 0,className:`nav-code-line-row ${i!==void 0&&n>=i&&n<=(a||i)?`nav-code-line-target`:``}`,"data-testid":`code-line-${n}`,children:[(0,b.jsx)(`div`,{className:`nav-code-line-number select-none`,children:n}),(0,b.jsx)(`div`,{className:`nav-code-line-content font-mono`,children:e||` `})]},n)})})}),v&&o?.symbol&&(0,b.jsxs)(`div`,{className:`nav-code-impact-drawer`,"data-testid":`code-impact-drawer`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-drawer-header`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-drawer-title`,children:[(0,b.jsx)(`span`,{className:`outline-kind-badge ${ge(o.symbol.kind)}`,children:o.symbol.kind}),(0,b.jsx)(`strong`,{className:`nav-impact-symbol-name`,children:o.symbol.name}),(0,b.jsxs)(`span`,{className:`nav-impact-symbol-lines`,children:[`Lines `,o.symbol.start_line,`–`,o.symbol.end_line]}),o.route&&(0,b.jsxs)(`span`,{className:`outline-method-badge ${he(o.route.http_method)}`,children:[o.route.http_method,` `,o.route.path_pattern]})]}),(0,b.jsx)(`button`,{type:`button`,className:`nav-impact-close-btn`,onClick:()=>y(!1),"aria-label":`Close Impact Drawer`,children:`✕`})]}),(0,b.jsxs)(`div`,{className:`nav-impact-drawer-body`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column-title`,children:[`Incoming Callers (`,E.length,`)`]}),E.length===0?(0,b.jsx)(`div`,{className:`nav-impact-empty`,children:`No incoming callers detected`}):(0,b.jsx)(`div`,{className:`nav-impact-chips-list`,children:E.map((t,n)=>(0,b.jsxs)(`button`,{type:`button`,className:`nav-impact-chip caller`,onClick:()=>u&&u(t.source_filepath||e,t.source_symbol,t.source_symbol_id||void 0),children:[(0,b.jsx)(`span`,{className:`chip-name`,children:t.source_symbol||`anonymous`}),(0,b.jsx)(`span`,{className:`chip-path`,children:t.source_filepath}),t.line_number&&(0,b.jsxs)(`span`,{className:`chip-line`,children:[`:`,t.line_number]})]},t.id||n))})]}),(0,b.jsxs)(`div`,{className:`nav-impact-column`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column-title`,children:[`Outgoing Callees (`,D.length,`)`]}),D.length===0?(0,b.jsx)(`div`,{className:`nav-impact-empty`,children:`No outgoing callees detected`}):(0,b.jsx)(`div`,{className:`nav-impact-chips-list`,children:D.map((e,t)=>(0,b.jsxs)(`button`,{type:`button`,className:`nav-impact-chip callee`,onClick:()=>d&&d(e.target_filepath,e.target_symbol),children:[(0,b.jsx)(`span`,{className:`chip-name`,children:e.target_symbol}),e.target_filepath&&(0,b.jsx)(`span`,{className:`chip-path`,children:e.target_filepath}),e.line_number&&(0,b.jsxs)(`span`,{className:`chip-line`,children:[`:`,e.line_number]})]},e.id||t))})]})]})]})]})},be=({impact:e,fileContent:t,loadingContent:n=!1,contentError:r=null,targetStartLine:i,targetEndLine:a,activeInspectorTab:o,onChangeInspectorTab:s,onSelectCaller:c,onSelectCallee:l,density:u=`balanced`,loading:d=!1,onRefreshContent:f})=>{let[p,m]=(0,_.useState)(`intelligence`),[h,g]=(0,_.useState)(!1),v=o===void 0?p:o,y=s||m,x=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),g(!0),setTimeout(()=>g(!1),2e3)}catch{}},S=e?.symbol,C=e?.route,w=e?.callers||[],T=e?.callees||[],E=e?.imports||[],D=!S&&(t||n||r)||S&&v===`reader`;return(0,b.jsxs)(`div`,{className:`nav-inspector-pane density-${u}`,"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:D&&!S?`Document & File Reader`:`Code Intelligence & Impact`})]}),(0,b.jsxs)(`div`,{className:`nav-inspector-header-actions`,children:[S&&t&&(0,b.jsxs)(`div`,{className:`nav-inspector-tabs`,role:`tablist`,children:[(0,b.jsx)(`button`,{type:`button`,className:`inspector-tab-btn ${v===`intelligence`?`active`:``}`,onClick:()=>y(`intelligence`),children:`Symbol Intelligence`}),(0,b.jsx)(`button`,{type:`button`,className:`inspector-tab-btn ${v===`reader`?`active`:``}`,onClick:()=>y(`reader`),children:`Read Full File`})]}),S&&v===`intelligence`&&(0,b.jsx)(`button`,{type:`button`,className:`nav-copy-permalink-btn`,onClick:x,title:`Copy file path & line range permalink`,"aria-label":`Copy Permalink`,children:h?(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:D&&t?t.filepath.toLowerCase().endsWith(`.md`)||t.filepath.toLowerCase().endsWith(`.markdown`)?(0,b.jsx)(ve,{filepath:t.filepath,content:t.content,totalLines:t.total_lines,sizeBytes:t.size_bytes,loading:n,error:r,onRefresh:f}):(0,b.jsx)(ye,{filepath:t.filepath,content:t.content,totalLines:t.total_lines,sizeBytes:t.size_bytes,targetStartLine:i||S?.start_line,targetEndLine:a||S?.end_line,impact:e,loading:n,error:r,onRefresh:f,onSelectCaller:c,onSelectCallee:l,density:u}):D&&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`})]}):d?(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||!S?(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 ${ge(S.kind)}`,children:S.kind}),(0,b.jsx)(`h3`,{className:`summary-name`,title:S.full_symbol||S.name,children:S.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`})]}),S.filepath]}),(0,b.jsxs)(`span`,{className:`summary-line-range`,children:[`L`,S.start_line,` - L`,S.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:w.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:T.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:E.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:S.language||`code`})]})]}),C&&(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(C.http_method)}`,children:C.http_method}),(0,b.jsx)(`span`,{className:`route-path-code`,children:C.path_pattern}),C.framework&&(0,b.jsx)(`span`,{className:`route-framework-tag`,children:C.framework})]})]}),S.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:S.signature})})]}),S.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:S.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 (`,w.length,`)`]})]}),w.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:w.map((e,t)=>(0,b.jsxs)(`div`,{"data-testid":`caller-item-${e.id??t}`,className:`relation-item caller-item`,onClick:()=>{e.source_filepath&&c&&c(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 (`,T.length+E.length,`)`]})]}),T.length===0&&E.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:[T.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&&l&&l(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&&l&&(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(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}`)),E.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}`))]})]})]})})]})},xe=`contextcortex_navigator_density`,Se=({initialRepo:e=`__all__`,initialPath:t,initialSymbolId:n})=>{let[r,i]=(0,_.useState)(()=>{let e=localStorage.getItem(xe);return e===`compact`||e===`balanced`||e===`spacious`?e:`balanced`}),a=e=>{i(e),localStorage.setItem(xe,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)(void 0),[ae,F]=(0,_.useState)(void 0),[I,L]=(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 oe=(0,_.useCallback)(async e=>{p(!0),L(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),L(e.message||`Failed to load codebase tree`)}finally{p(!1)}},[]);(0,_.useEffect)(()=>{oe(c)},[c,oe]);let se=(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)}},[]),ce=(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)}},[]),le=(0,_.useCallback)(async(e,t,n,r)=>{C(!0);try{let i=await fetch(`/admin/api/navigator/file-outline?repo=${encodeURIComponent(e)}&filepath=${encodeURIComponent(t)}`);if(!i.ok)throw Error(`Failed to load file outline: ${i.status}`);let a=await i.json();if(x(a),a.symbols&&a.symbols.length>0){let t;typeof n==`number`?t=a.symbols.find(e=>e.id===n):typeof n==`string`&&(t=a.symbols.find(e=>e.name===n||e.full_symbol===n));let i=t||a.symbols[0];T(i.id),N(r||`intelligence`),await se(e,i.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)}},[se]);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),A(null),ie(void 0),F(void 0)},density:r,onChangeDensity:a,searchQuery:m,onSearchChange:h,onSelectSearchResult:e=>{let t=e.repo&&e.repo!==`__all__`?e.repo:c;e.repo&&e.repo!==c&&c!==`__all__`&&l(e.repo),v(e.filepath),ie(e.start_line),F(e.end_line),ce(t,e.filepath),e.type===`symbol`&&e.symbol_id?(T(e.symbol_id),le(t,e.filepath,e.symbol_id,`reader`),se(t,e.symbol_id),N(`reader`)):(le(t,e.filepath,void 0,`reader`),N(`reader`))},totalFiles:u?.total_files??0,totalSymbols:u?.total_symbols??0,onRefresh:()=>oe(c),loading:f}),I&&(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:I}),(0,b.jsx)(`button`,{type:`button`,onClick:()=>L(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),ie(void 0),F(void 0),le(c,e.path),ce(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),ie(e.start_line),F(e.end_line),N(`intelligence`),se(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)(be,{impact:E,fileContent:ee,loadingContent:te,contentError:re,targetStartLine:P,targetEndLine:ae,activeInspectorTab:M,onChangeInspectorTab:N,onSelectCaller:(e,t,n)=>{v(e),ie(void 0),F(void 0),le(c,e,n??t),ce(c,e)},onSelectCallee:(e,t)=>{e&&(v(e),ie(void 0),F(void 0),le(c,e,t),ce(c,e))},density:r,loading:O,onRefreshContent:()=>g&&ce(c,g)})})]})]})};function Ce({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 we({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)(``),[F,I]=(0,_.useState)(!1),[L,oe]=(0,_.useState)(!1),[se,ce]=(0,_.useState)(!1),[le,ue]=(0,_.useState)(null),[de,fe]=(0,_.useState)(null),[pe,me]=(0,_.useState)(``),[he,ge]=(0,_.useState)(`local_storage`),[_e,ve]=(0,_.useState)(``),[ye,be]=(0,_.useState)(!1),xe=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]},Se=e=>{if(!e)return`-`;let t=e<1e11?e*1e3:e;return new Date(t).toLocaleString()},we=(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)(()=>{we(``)},[]);let Te=e=>{we(e)},Ee=()=>{if(!i)return;let e=i.split(`/`).filter(Boolean);e.pop(),Te(e.join(`/`))},De=e=>{let t=e===void 0?i:e;d(t?`${t}/`:``),p(``),h(`local_storage`),v(``),x(null),l(!0)},Oe=e=>{if(e.preventDefault(),w(!1),e.dataTransfer.files&&e.dataTransfer.files.length>0){let t=e.dataTransfer.files[0];Ne(t)}},ke=e=>{e.target.files&&e.target.files.length>0&&Ne(e.target.files[0])},Ae=async(e,n,r,a)=>{ce(!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`);fe(e),me(n||(i?`${i}/${e.name}`:e.name)),ge(r||m||`local_storage`),ve(a||f||``),ue(s),l(!1),oe(!0)}catch(e){t.error(`PDF preview error: ${e.message}`)}finally{ce(!1)}},je=async()=>{if(de){be(!0);try{let n=new FormData;n.append(`file`,de),n.append(`path`,pe||de.name),n.append(`repo`,he||`local_storage`),_e&&n.append(`category`,_e);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`);oe(!1),fe(null),ue(null);let o=a.chunks_indexed??0;t.success(`PDF uploaded and indexed (${o} chunks)`),we(i),e&&e()}catch(e){t.error(`PDF ingestion error: ${e.message}`)}finally{be(!1)}}},Me=()=>{oe(!1),fe(null),ue(null)},Ne=e=>{x(e);let t=i?`${i}/${e.name}`:e.name;if(d(t),e.name.toLowerCase().endsWith(`.pdf`)||e.type===`application/pdf`){v(``),Ae(e,t,m,f);return}let n=new FileReader;n.onload=e=>{typeof e.target?.result==`string`&&v(e.target.result)},n.readAsText(e)},Pe=async n=>{if(n.preventDefault(),!u.trim()){t.error(`File path is required`);return}if(y&&y.name.toLowerCase().endsWith(`.pdf`)){await Ae(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)`),we(i),e&&e()}catch(e){t.error(`Upload error: ${e.message}`)}finally{E(!1)}},Fe=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)}},Ie=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(``)}},Le=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}I(!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)`),we(i),e&&e()}catch(e){t.error(`Replace error: ${e.message}`)}finally{I(!1)}}},Re=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}`),we(i),e&&e()}catch(e){t.error(`Delete error: ${e.message}`)}},ze=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:()=>we(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:()=>De(),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:()=>Te(``),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-house`}),` root`]}),ze.map((e,t)=>{let n=ze.slice(0,t+1).join(`/`),r=t===ze.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:()=>Te(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:Ee,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:()=>Te(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:()=>Te(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:xe(e.size_bytes)})}),(0,b.jsx)(`td`,{style:{fontSize:`0.85rem`},children:Se(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:()=>Fe(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:()=>Ie(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:()=>Re(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:()=>Te(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:xe(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:Se(e.mtime)})]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-actions`,children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Fe(e),title:`Preview File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-eye`}),` Preview`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Ie(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:()=>Re(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:Pe,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:Oe,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} (${xe(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)`}),se&&(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:ke})]}),(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: `,xe(k.size_bytes),` • Modified: `,Se(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:Le,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:F||j.rel_path.toLowerCase().endsWith(`.pdf`),children:[(0,b.jsx)(`i`,{className:`fa-solid ${F?`fa-spinner fa-spin`:`fa-save`}`}),` Save & Re-Index`]})]})]})]})}),L&&le&&(0,b.jsx)(Ce,{data:le,onConfirm:je,onCancel:Me,isIngesting:ye})]})}function Te(){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 Ee(){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)(Se,{}),e===`git-repos`&&(0,b.jsx)(te,{refreshStats:o}),e===`local-paths`&&(0,b.jsx)(ne,{refreshStats:o}),e===`local-storage`&&(0,b.jsx)(we,{refreshStats:o}),e===`ingestion-catalog`&&(0,b.jsx)(Te,{}),e===`search-inspector`&&(0,b.jsx)(re,{}),e===`settings`&&(0,b.jsx)(ce,{stats:i,refreshStats:o}),e===`diagnostics`&&(0,b.jsx)(le,{})]}),(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)(Ee,{})})})); \ No newline at end of file +`):[],[t]);(0,_.useEffect)(()=>{i&&x.current&&x.current.scrollIntoView({behavior:`smooth`,block:`center`})},[i,e]);let C=async()=>{if(t)try{navigator?.clipboard?.writeText&&(await navigator.clipboard.writeText(t),m(!0),setTimeout(()=>m(!1),2e3))}catch{}},w=async()=>{if(!e)return;let t=`${e}${i?`#L${i}${a&&a!==i?`-L${a}`:``}`:``}`;try{navigator?.clipboard?.writeText&&(await navigator.clipboard.writeText(t),g(!0),setTimeout(()=>g(!1),2e3))}catch{}},T=e=>e==null?``:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(1)} MB`,E=o?.callers||[],D=o?.callees||[],O=E.length+D.length;return(0,b.jsxs)(`div`,{className:`nav-code-viewer-container density-${f}`,"data-testid":`navigator-code-viewer`,children:[(0,b.jsxs)(`div`,{className:`nav-code-viewer-header`,children:[(0,b.jsxs)(`div`,{className:`nav-code-viewer-meta`,children:[(0,b.jsxs)(`svg`,{width:`15`,height:`15`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:`nav-code-file-icon`,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)(`span`,{className:`nav-code-filename`,title:e,children:e}),(0,b.jsxs)(`span`,{className:`nav-code-stat-chip`,children:[n||S.length,` lines`]}),r!==void 0&&r>0&&(0,b.jsx)(`span`,{className:`nav-code-stat-chip`,children:T(r)})]}),(0,b.jsxs)(`div`,{className:`nav-code-viewer-actions`,children:[o?.symbol&&(0,b.jsxs)(`button`,{type:`button`,className:`nav-code-impact-toggle-btn nav-code-drawer-toggle ${v?`active`:``}`,onClick:()=>y(e=>!e),"aria-label":`Callers & Impact`,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)(`path`,{d:`M12 16v-4M12 8h.01`})]}),(0,b.jsxs)(`span`,{children:[`Callers & Impact (`,O,`)`]})]}),(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:w,title:`Copy path and line permalink`,"aria-label":`Copy Permalink`,children:h?`Link Copied!`:`Copy Link`}),(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:C,title:`Copy entire file contents`,"aria-label":`Copy File Code`,children:p?`Copied!`:`Copy Code`}),l&&(0,b.jsx)(`button`,{type:`button`,className:`nav-code-action-btn`,onClick:l,title:`Refresh file`,"aria-label":`Refresh File`,children:`↻`})]})]}),c&&(0,b.jsx)(`div`,{className:`nav-code-error-banner`,role:`alert`,children:(0,b.jsxs)(`span`,{children:[`Failed to load file: `,c]})}),s&&(0,b.jsxs)(`div`,{className:`nav-code-loading-overlay`,children:[(0,b.jsx)(`div`,{className:`nav-omni-spinner`}),(0,b.jsx)(`span`,{children:`Loading source code...`})]}),(0,b.jsx)(`div`,{className:`nav-code-body`,tabIndex:0,children:S.length===0&&!s&&!c?(0,b.jsx)(`div`,{className:`nav-code-empty-state`,style:{padding:`24px`,color:`#64748b`,textAlign:`center`},children:`File is empty.`}):(0,b.jsx)(`div`,{className:`nav-code-lines-wrapper`,children:S.map((e,t)=>{let n=t+1;return(0,b.jsxs)(`div`,{ref:i!==void 0&&n===i?x:void 0,className:`nav-code-line-row ${i!==void 0&&n>=i&&n<=(a||i)?`nav-code-line-target`:``}`,"data-testid":`code-line-${n}`,children:[(0,b.jsx)(`div`,{className:`nav-code-line-number select-none`,children:n}),(0,b.jsx)(`div`,{className:`nav-code-line-content font-mono`,children:e||` `})]},n)})})}),v&&o?.symbol&&(0,b.jsxs)(`div`,{className:`nav-code-impact-drawer`,"data-testid":`code-impact-drawer`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-drawer-header`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-drawer-title`,children:[(0,b.jsx)(`span`,{className:`outline-kind-badge ${ge(o.symbol.kind)}`,children:o.symbol.kind}),(0,b.jsx)(`strong`,{className:`nav-impact-symbol-name`,children:o.symbol.name}),(0,b.jsxs)(`span`,{className:`nav-impact-symbol-lines`,children:[`Lines `,o.symbol.start_line,`–`,o.symbol.end_line]}),o.route&&(0,b.jsxs)(`span`,{className:`outline-method-badge ${he(o.route.http_method)}`,children:[o.route.http_method,` `,o.route.path_pattern]})]}),(0,b.jsx)(`button`,{type:`button`,className:`nav-impact-close-btn`,onClick:()=>y(!1),"aria-label":`Close Impact Drawer`,children:`✕`})]}),(0,b.jsxs)(`div`,{className:`nav-impact-drawer-body`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column-title`,children:[`Incoming Callers (`,E.length,`)`]}),E.length===0?(0,b.jsx)(`div`,{className:`nav-impact-empty`,children:`No incoming callers detected`}):(0,b.jsx)(`div`,{className:`nav-impact-chips-list`,children:E.map((t,n)=>(0,b.jsxs)(`button`,{type:`button`,className:`nav-impact-chip caller`,onClick:()=>u&&u(t.source_filepath||e,t.source_symbol,t.source_symbol_id||void 0),children:[(0,b.jsx)(`span`,{className:`chip-name`,children:t.source_symbol||`anonymous`}),(0,b.jsx)(`span`,{className:`chip-path`,children:t.source_filepath}),t.line_number&&(0,b.jsxs)(`span`,{className:`chip-line`,children:[`:`,t.line_number]})]},t.id||n))})]}),(0,b.jsxs)(`div`,{className:`nav-impact-column`,children:[(0,b.jsxs)(`div`,{className:`nav-impact-column-title`,children:[`Outgoing Callees (`,D.length,`)`]}),D.length===0?(0,b.jsx)(`div`,{className:`nav-impact-empty`,children:`No outgoing callees detected`}):(0,b.jsx)(`div`,{className:`nav-impact-chips-list`,children:D.map((e,t)=>(0,b.jsxs)(`button`,{type:`button`,className:`nav-impact-chip callee`,onClick:()=>d&&d(e.target_filepath,e.target_symbol),children:[(0,b.jsx)(`span`,{className:`chip-name`,children:e.target_symbol}),e.target_filepath&&(0,b.jsx)(`span`,{className:`chip-path`,children:e.target_filepath}),e.line_number&&(0,b.jsxs)(`span`,{className:`chip-line`,children:[`:`,e.line_number]})]},e.id||t))})]})]})]})]})},be=({impact:e,fileContent:t,loadingContent:n=!1,contentError:r=null,targetStartLine:i,targetEndLine:a,activeInspectorTab:o,onChangeInspectorTab:s,onSelectCaller:c,onSelectCallee:l,density:u=`balanced`,loading:d=!1,onRefreshContent:f})=>{let[p,m]=(0,_.useState)(`intelligence`),[h,g]=(0,_.useState)(!1),v=o===void 0?p:o,y=s||m,x=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),g(!0),setTimeout(()=>g(!1),2e3)}catch{}},S=e?.symbol,C=e?.route,w=e?.callers||[],T=e?.callees||[],E=e?.imports||[],D=!S&&(t||n||r)||S&&v===`reader`;return(0,b.jsxs)(`div`,{className:`nav-inspector-pane density-${u}`,"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:D&&!S?`Document & File Reader`:`Code Intelligence & Impact`})]}),(0,b.jsxs)(`div`,{className:`nav-inspector-header-actions`,children:[S&&t&&(0,b.jsxs)(`div`,{className:`nav-inspector-tabs`,role:`tablist`,children:[(0,b.jsx)(`button`,{type:`button`,className:`inspector-tab-btn ${v===`intelligence`?`active`:``}`,onClick:()=>y(`intelligence`),children:`Symbol Intelligence`}),(0,b.jsx)(`button`,{type:`button`,className:`inspector-tab-btn ${v===`reader`?`active`:``}`,onClick:()=>y(`reader`),children:`Read Full File`})]}),S&&v===`intelligence`&&(0,b.jsx)(`button`,{type:`button`,className:`nav-copy-permalink-btn`,onClick:x,title:`Copy file path & line range permalink`,"aria-label":`Copy Permalink`,children:h?(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:D&&t?t.filepath.toLowerCase().endsWith(`.md`)||t.filepath.toLowerCase().endsWith(`.markdown`)?(0,b.jsx)(ve,{filepath:t.filepath,content:t.content,totalLines:t.total_lines,sizeBytes:t.size_bytes,loading:n,error:r,onRefresh:f}):(0,b.jsx)(ye,{filepath:t.filepath,content:t.content,totalLines:t.total_lines,sizeBytes:t.size_bytes,targetStartLine:i||S?.start_line,targetEndLine:a||S?.end_line,impact:e,loading:n,error:r,onRefresh:f,onSelectCaller:c,onSelectCallee:l,density:u}):D&&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`})]}):d?(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||!S?(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 ${ge(S.kind)}`,children:S.kind}),(0,b.jsx)(`h3`,{className:`summary-name`,title:S.full_symbol||S.name,children:S.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`})]}),S.filepath]}),(0,b.jsxs)(`span`,{className:`summary-line-range`,children:[`L`,S.start_line,` - L`,S.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:w.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:T.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:E.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:S.language||`code`})]})]}),C&&(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(C.http_method)}`,children:C.http_method}),(0,b.jsx)(`span`,{className:`route-path-code`,children:C.path_pattern}),C.framework&&(0,b.jsx)(`span`,{className:`route-framework-tag`,children:C.framework})]})]}),S.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:S.signature})})]}),S.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:S.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 (`,w.length,`)`]})]}),w.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:w.map((e,t)=>(0,b.jsxs)(`div`,{"data-testid":`caller-item-${e.id??t}`,className:`relation-item caller-item`,onClick:()=>{e.source_filepath&&c&&c(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 (`,T.length+E.length,`)`]})]}),T.length===0&&E.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:[T.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&&l&&l(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&&l&&(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(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}`)),E.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}`))]})]})]})})]})},xe=`contextcortex_navigator_density`,Se=({initialRepo:e=`__all__`,initialPath:t,initialSymbolId:n})=>{let[r,i]=(0,_.useState)(()=>{let e=localStorage.getItem(xe);return e===`compact`||e===`balanced`||e===`spacious`?e:`balanced`}),a=e=>{i(e),localStorage.setItem(xe,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)(void 0),[ae,F]=(0,_.useState)(void 0),[I,L]=(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 oe=(0,_.useCallback)(async e=>{p(!0),L(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),L(e.message||`Failed to load codebase tree`)}finally{p(!1)}},[]);(0,_.useEffect)(()=>{oe(c)},[c,oe]);let se=(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)}},[]),ce=(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)}},[]),le=(0,_.useCallback)(async(e,t,n,r)=>{C(!0);try{let i=await fetch(`/admin/api/navigator/file-outline?repo=${encodeURIComponent(e)}&filepath=${encodeURIComponent(t)}`);if(!i.ok)throw Error(`Failed to load file outline: ${i.status}`);let a=await i.json();if(x(a),a.symbols&&a.symbols.length>0){let t;typeof n==`number`?t=a.symbols.find(e=>e.id===n):typeof n==`string`&&(t=a.symbols.find(e=>e.name===n||e.full_symbol===n));let i=t||a.symbols[0];T(i.id),N(r||`intelligence`),await se(e,i.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)}},[se]);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),A(null),ie(void 0),F(void 0)},density:r,onChangeDensity:a,searchQuery:m,onSearchChange:h,onSelectSearchResult:e=>{let t=e.repo&&e.repo!==`__all__`?e.repo:c;e.repo&&e.repo!==c&&c!==`__all__`&&l(e.repo),v(e.filepath),ie(e.start_line),F(e.end_line),ce(t,e.filepath),e.type===`symbol`&&e.symbol_id?(T(e.symbol_id),le(t,e.filepath,e.symbol_id,`reader`),se(t,e.symbol_id),N(`reader`)):(le(t,e.filepath,void 0,`reader`),N(`reader`))},totalFiles:u?.total_files??0,totalSymbols:u?.total_symbols??0,onRefresh:()=>oe(c),loading:f}),I&&(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:I}),(0,b.jsx)(`button`,{type:`button`,onClick:()=>L(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),ie(void 0),F(void 0),le(c,e.path),ce(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),ie(e.start_line),F(e.end_line),N(`intelligence`),se(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)(be,{impact:E,fileContent:ee,loadingContent:te,contentError:re,targetStartLine:P,targetEndLine:ae,activeInspectorTab:M,onChangeInspectorTab:N,onSelectCaller:(e,t,n)=>{v(e),ie(void 0),F(void 0),le(c,e,n??t),ce(c,e)},onSelectCallee:(e,t)=>{e&&(v(e),ie(void 0),F(void 0),le(c,e,t),ce(c,e))},density:r,loading:O,onRefreshContent:()=>g&&ce(c,g)})})]})]})};function Ce({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 we({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)(``),[F,I]=(0,_.useState)(!1),[L,oe]=(0,_.useState)(!1),[se,ce]=(0,_.useState)(!1),[le,ue]=(0,_.useState)(null),[de,fe]=(0,_.useState)(null),[pe,me]=(0,_.useState)(``),[he,ge]=(0,_.useState)(`local_storage`),[_e,ve]=(0,_.useState)(``),[ye,be]=(0,_.useState)(!1),xe=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]},Se=e=>{if(!e)return`-`;let t=e<1e11?e*1e3:e;return new Date(t).toLocaleString()},we=(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)(()=>{we(``)},[]);let Te=e=>{we(e)},Ee=()=>{if(!i)return;let e=i.split(`/`).filter(Boolean);e.pop(),Te(e.join(`/`))},De=e=>{let t=e===void 0?i:e;d(t?`${t}/`:``),p(``),h(`local_storage`),v(``),x(null),l(!0)},Oe=e=>{if(e.preventDefault(),w(!1),e.dataTransfer.files&&e.dataTransfer.files.length>0){let t=e.dataTransfer.files[0];Ne(t)}},ke=e=>{e.target.files&&e.target.files.length>0&&Ne(e.target.files[0])},Ae=async(e,n,r,a)=>{ce(!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`);fe(e),me(n||(i?`${i}/${e.name}`:e.name)),ge(r||m||`local_storage`),ve(a||f||``),ue(s),l(!1),oe(!0)}catch(e){t.error(`PDF preview error: ${e.message}`)}finally{ce(!1)}},je=async()=>{if(de){be(!0);try{let n=new FormData;n.append(`file`,de),n.append(`path`,pe||de.name),n.append(`repo`,he||`local_storage`),_e&&n.append(`category`,_e);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`);oe(!1),fe(null),ue(null);let o=a.chunks_indexed??0;t.success(`PDF uploaded and indexed (${o} chunks)`),we(i),e&&e()}catch(e){t.error(`PDF ingestion error: ${e.message}`)}finally{be(!1)}}},Me=()=>{oe(!1),fe(null),ue(null)},Ne=e=>{x(e);let t=i?`${i}/${e.name}`:e.name;if(d(t),e.name.toLowerCase().endsWith(`.pdf`)||e.type===`application/pdf`){v(``),Ae(e,t,m,f);return}let n=new FileReader;n.onload=e=>{typeof e.target?.result==`string`&&v(e.target.result)},n.readAsText(e)},Pe=async n=>{if(n.preventDefault(),!u.trim()){t.error(`File path is required`);return}if(y&&y.name.toLowerCase().endsWith(`.pdf`)){await Ae(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)`),we(i),e&&e()}catch(e){t.error(`Upload error: ${e.message}`)}finally{E(!1)}},Fe=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)}},Ie=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(``)}},Le=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}I(!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)`),we(i),e&&e()}catch(e){t.error(`Replace error: ${e.message}`)}finally{I(!1)}}},Re=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}`),we(i),e&&e()}catch(e){t.error(`Delete error: ${e.message}`)}},ze=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:()=>we(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:()=>De(),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:()=>Te(``),children:[(0,b.jsx)(`i`,{className:`fa-solid fa-house`}),` root`]}),ze.map((e,t)=>{let n=ze.slice(0,t+1).join(`/`),r=t===ze.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:()=>Te(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:Ee,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:()=>Te(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:()=>Te(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:xe(e.size_bytes)})}),(0,b.jsx)(`td`,{style:{fontSize:`0.85rem`},children:Se(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:()=>Fe(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:()=>Ie(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:()=>Re(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:()=>Te(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:xe(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:Se(e.mtime)})]})]}),(0,b.jsxs)(`div`,{className:`data-mobile-card-actions`,children:[(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Fe(e),title:`Preview File`,children:[(0,b.jsx)(`i`,{className:`fa-solid fa-eye`}),` Preview`]}),(0,b.jsxs)(`button`,{className:`btn btn-secondary`,onClick:()=>Ie(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:()=>Re(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:Pe,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:Oe,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} (${xe(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)`}),se&&(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:ke})]}),(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: `,xe(k.size_bytes),` • Modified: `,Se(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:Le,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:F||j.rel_path.toLowerCase().endsWith(`.pdf`),children:[(0,b.jsx)(`i`,{className:`fa-solid ${F?`fa-spinner fa-spin`:`fa-save`}`}),` Save & Re-Index`]})]})]})]})}),L&&le&&(0,b.jsx)(Ce,{data:le,onConfirm:je,onCancel:Me,isIngesting:ye})]})}function Te(){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 Ee(){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)(Se,{}),e===`git-repos`&&(0,b.jsx)(te,{refreshStats:o}),e===`local-paths`&&(0,b.jsx)(ne,{refreshStats:o}),e===`local-storage`&&(0,b.jsx)(we,{refreshStats:o}),e===`ingestion-catalog`&&(0,b.jsx)(Te,{}),e===`search-inspector`&&(0,b.jsx)(re,{}),e===`settings`&&(0,b.jsx)(ce,{stats:i,refreshStats:o}),e===`diagnostics`&&(0,b.jsx)(le,{})]}),(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)(Ee,{})})})); \ No newline at end of file diff --git a/frontend/dist/index.html b/frontend/dist/index.html index a11ef77..56681a4 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -17,7 +17,7 @@ } catch (e) {} })(); - + diff --git a/frontend/e2e/navigator.spec.ts b/frontend/e2e/navigator.spec.ts index 87883e6..287b910 100644 --- a/frontend/e2e/navigator.spec.ts +++ b/frontend/e2e/navigator.spec.ts @@ -808,9 +808,30 @@ test.describe('Codebase Navigator End-to-End Suite', () => { await expect(codeViewer).toBeVisible(); await expect(codeViewer.locator('.nav-code-filename')).toContainText('chat.py'); - // Target line 45 should have highlight class + // Target line 45 should have highlight class and signature text const targetLine = codeViewer.locator('[data-testid="code-line-45"]'); await expect(targetLine).toHaveClass(/nav-code-line-target/); + await expect(targetLine).toContainText('async def chat_completion_endpoint'); + + // Toggle Callers & Impact drawer + const drawerToggle = codeViewer.locator('.nav-code-drawer-toggle'); + await expect(drawerToggle).toBeVisible(); + await expect(drawerToggle).toContainText('Callers & Impact (2)'); + await drawerToggle.click(); + + // Verify caller chip is visible in drawer + const drawer = codeViewer.locator('.nav-code-impact-drawer'); + await expect(drawer).toBeVisible(); + const callerChip = drawer.locator('.nav-impact-chip.caller').first(); + await expect(callerChip.locator('.chip-name')).toContainText('test_chat_completions_e2e'); + + // Click caller chip to navigate cross-file to caller in Symbol Intelligence + await callerChip.click(); + + // Pane 3 switches to intelligence inspector showing the caller symbol + const inspector = page.locator('[data-testid="navigator-inspector-container"]'); + await expect(inspector).toBeVisible(); + await expect(inspector.locator('.summary-name')).toHaveText('test_chat_completions_e2e'); // Check zero layout collisions await expect(page).toHaveNoLayoutOverflow(); diff --git a/frontend/src/components/navigator/NavigatorCodeViewer.tsx b/frontend/src/components/navigator/NavigatorCodeViewer.tsx index ae279e4..22d74f6 100644 --- a/frontend/src/components/navigator/NavigatorCodeViewer.tsx +++ b/frontend/src/components/navigator/NavigatorCodeViewer.tsx @@ -135,7 +135,7 @@ export const NavigatorCodeViewer: React.FC = ({ {impact?.symbol && (