feat: P&ID 연결 분석, LLM 에이전트 모드, KB 확장, MCP 서버 리팩토링

- P&ID: 연결 분석 API, Prefix 규칙 관리, 카테고리 분류, DXF 그래프 빌드
- LLM: 대화 요약, tool card 영구 보존, 시계열 차트(uPlot), 에이전트 모드
- KB: 청크 미리보기, Field Instrument Inference, 인증/Qdrant 클라이언트
- MCP: 서버 기능 확장, 파이프라인 수정, timeout 개선
- Frontend: P&ID UI, LLM UI, KB UI, OPC UA Write 탭 추가
- 설정: AGENTS.md, plant_context, README, opencode.json 업데이트
- 정리: 진단 체크리스트 문서 삭제
This commit is contained in:
windpacer
2026-05-21 23:36:57 +09:00
parent 960bda4a3c
commit 302183c97e
142 changed files with 2432231 additions and 1082 deletions

69
PROJECT_CONTEXT.md Normal file
View File

@@ -0,0 +1,69 @@
# PROJECT_CONTEXT.md
## 🎯 Project Overview
**ExperionCrawler**는 신암정유 전공장의 제어 시스템인 **Honeywell Experion HS R530**으로부터 실시간 데이터를 수집, 저장, 분석하여 지능형 운영 환경을 제공하는 시스템입니다. OPC UA를 통해 데이터를 획득하며, RAG(Retrieval-Augmented Generation)와 MCP(Model Context Protocol)를 결합하여 LLM이 공정 데이터를 이해하고 운영 가이드를 제공할 수 있도록 설계되었습니다.
## 🏗️ System Architecture
프로젝트는 **Clean Architecture** 패턴을 따르며, `src/` 디렉토리 내의 세 계층으로 구성됩니다. (`Core``Infrastructure``Web` 프로젝트에 포함되어 빌드됩니다.)
### 1. Core Layer (`src/Core/`)
* **Domain/Entities:** 데이터베이스 엔티티 및 도메인 모델.
* **Application/Interfaces:** 모든 서비스의 계약(`IExperionServices.cs`).
* **Application/Services:** 비즈니스 로직 구현 (예: `TextToSqlService`, `PidGraphService`).
* **Application/DTOs:** API 및 서비스 간 데이터 전송 객체.
### 2. Infrastructure Layer (`src/Infrastructure/`)
* **OpcUa/:** OPC UA 클라이언트/서버 로직 및 실시간 데이터 처리.
* **Database/:** Entity Framework Core 및 PostgreSQL/TimescaleDB 연동.
* **Mcp/:** Python 기반 MCP 서버와의 통신을 위한 브릿지 (JSON-RPC over HTTP).
* **Kb/:** Qdrant 기반 지식 베이스(Knowledge Base) 관리.
### 3. Web Layer (`src/Web/`)
* **Program.cs:** 의존성 주입(DI) 및 백그라운드 서비스(HostedServices) 오케스트레이션.
* **Controllers/:** 단일 파일(`ExperionControllers.cs`)로 구성된 API 엔드포인트.
* **wwwroot/:** 빌드 단계가 없는 Vanilla JS SPA.
## ⚙️ Critical Operational Semantics
### ⏰ Timezone & Time Handling
* **Storage:** 모든 데이터베이스 타임스탬프는 **UTC**로 저장됩니다.
* **Presentation:** LLM 및 사용자에게 전달될 때는 반드시 **KST (UTC+9)**로 변환되어야 합니다.
### ⏳ Event Duration Semantics
* **`event_history_table.duration_seconds`**: 이 필드는 **"직전 상태가 유지된 시간(초)"**을 의미합니다. 현재 이벤트의 지속 시간이 아님에 주의하십시오.
### 🔡 JSON Naming Convention (CRITICAL)
* **Backend:** `PropertyNamingPolicy = null` 설정으로 인해 C#의 PascalCase가 JSON 키로 그대로 전달됩니다.
* **Frontend:** 프론트엔드는 **camelCase**를 기대합니다.
* **Rule:** 모든 Controller의 `Ok(...)` 응답 시, 반드시 **익명 객체를 사용하여 명시적으로 camelCase 키를 지정**해야 합니다.
*`return Ok(new { id = x.Id, tagName = x.TagName });`
*`return Ok(new { x.Id, x.TagName });`
## 🔄 Background Services (HostedServices)
| Service | Responsibility |
| :--- | :--- |
| `ExperionRealtimeService` | OPC UA 구독 및 500ms 단위 데이터 DB 플러시 |
| `ExperionHistoryService` | 60초 주기 `realtime_table``history_table` 스냅샷 |
| `ExperionOpcServerService` | 로컬 데이터를 OPC UA 서버(Port 4841)로 노출 |
| `McpServerHostedService` | Python MCP 서버 프로세스 생명주기 관리 |
| `ExperionFastService` | 고주파 데이터 캡처 세션 관리 |
| `ExperionFastCleanupService` | 만료된 Fast 세션 정리 |
## 🛠️ Development & Deployment
### Build & Test
* **Build:** `dotnet build src/Web/ExperionCrawler.csproj`
* **Run (Dev):** `dotnet run` (Working Dir: `src/Web/`)
* **Test:** `dotnet test`
* **Lint/Typecheck:** (사용자 제공 시 실행 필수)
### Deployment
* **Command:** `sudo bash deploy.sh`
* **Target:** `/opt/ExperionCrawler`
* **Service:** `systemd` 서비스 `experioncrawler`로 실행 (User: `www-data`)
## 🤖 Agent Operational Guidelines
1. **Verification:** 코드 수정 후에는 반드시 프로젝트의 Lint 및 Typecheck 명령어를 실행하여 무결성을 검증하십시오.
2. **Search First:** 새로운 기능을 구현하거나 버그를 수정하기 전, 반드시 `Grep``Glob`을 사용하여 기존 패턴과 컨벤션을 확인하십시오.
3. **Data Integrity:** DB 쿼리 시 `duration_seconds`의 의미와 시간대 변환 규칙을 항상 염두에 두십시오.
4. **Commit Policy:** 사용자의 명시적 요청이 없는 한 절대 `git commit`을 수행하지 마십시오.