마크다운/텍스트 뷰어 툴바에 🖨 PDF 버튼 추가. 렌더된 결과(KaTeX·mermaid
SVG·코드강조·GFM 표)를 깨끗한 새 창에 담아 print() → 인쇄창에서 "PDF로 저장".
- 폐쇄망 OK: 외부 리소스 없이 /lib 로컬 CSS만 사용 (KaTeX 폰트도 로컬)
- 한글: 인쇄 본문 폰트 맑은 고딕 지정 → 윈도우에서 깨짐 없음
- 실제 텍스트(검색·복사 가능), 페이지 잘림 방지(break-inside) 적용
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
index.html(1.7K줄)·app.js(5.1K줄) 모놀리식 분리 방안 — HTML 파셜(fetch),
Razor 파셜, Vite+바닐라 ESM, 프레임워크 비교 및 점진 이관 단계.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
프로젝트 폴더 전체를 안전하게 탐색하고 문서를 보고 편집하는 웹 UI.
- DocBrowserService: 루트 자동탐색(.git/.sln), 경로이탈·심볼릭·제외디렉토리
·민감파일 가드, 목록/읽기/원본/쓰기/이름변경/삭제/폴더/업로드
- DocsController(/api/docs): config·tree·text·raw(공개) / 변경계열은 KB admin 토큰
- 뷰어: md(marked+DOMPurify+hljs+KaTeX+mermaid) / pdf(원본 iframe) / txt(pre) / 그 외 다운로드
- 인라인 편집(md 실시간 분할 미리보기) + 관리(새폴더/업로드/이름변경/삭제)
- 사이드바 nav 스크롤 수정(.nav overflow), 헤더 컴팩트화로 문서 영역 확보
주의: 프론트 라이브러리(marked/mermaid/katex 등)는 wwwroot/lib/(.gitignore)라
미추적 — 별도 처리 필요.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 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 업데이트
- 정리: 진단 체크리스트 문서 삭제
- _PID_LINENO_FULL_RE: 7필드 고정 regex → 5~7필드 통합 (9차 P-9107-25A-F-n 등 미매칭 수정)
- _extract_pid_dxf_fast: 레이어 이름 하드코딩 제거 → FULL_RE 매칭 우선, LINENO 계열 레이어 힌트 보조
- MatchCategoryAsync: 배관번호 regex(_pipeLineNoRe) 체크를 prefix 룰보다 먼저 실행 → P-9117-20A-F-n 등이 power_equipment로 오분류되던 문제 수정
- pump extractor 프롬프트: 배관번호 SKIP/INCLUDE 예시 추가
- DB 기존 레코드 435건 pipings로 재분류 (직접 SQL)
- .claude/settings.json: LLM 모델명 하드코딩 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
git 히스토리에 이미 있는 Phase 0~6 changelog, OPC UA 서버,
버그 수정 이력, 성능 분석, 구현 계획(Task 1~4) 전부 삭제.
작업 규칙 + 최신 1건(Phase 7)만 유지해 세션 컨텍스트 로드량 축소.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
이벤트 중심 도구와 LLM 요약/보고서 도구를 추가해 채팅에서
"활성 알람", "교대 보고서", "이벤트 요약" 같은 운전원 요청을 처리.
신규 MCP 도구 (mcp-server/server.py):
- find_tags(query, area?, top_k):
v_tag_summary 뷰 기반. base_tag 또는 description ILIKE 매칭.
PV/SP/OP/설명/area 함께 반환.
- query_events(tag_name?, event_type?, area?, since?, until?, limit):
event_history_table 필터 조회. since/until 미지정 시 최근 24h.
event_type은 ALARM/TRIP/NORMAL/RUN/CHANGE 5종.
- active_alarms(area?, limit):
DISTINCT ON (tagname)으로 태그별 최신 이벤트 추출 후
ALARM/TRIP만 반환 (NORMAL 들어왔으면 자동 해제).
- summarize_events(since?, area?, event_type?, max_events, focus?):
query_events 결과를 LLM에 넣어 한국어 6~10줄 구조화 요약
(현황/알람/패턴/권고) + by_type/by_area 통계.
- generate_status_report(area?, hours):
활성 알람 + 최근 이벤트 통계/표본을 LLM에 넘겨
교대 보고서 형식(요약/알람/이벤트분석/권고) 마크다운 생성.
윈도우 1~168시간, 기본 24시간.
공통:
- prepared statement(파라미터 바인딩)로 SQL 인젝션 방지
- SET statement_timeout = SQL_STATEMENT_TIMEOUT_MS 적용
- _DB_SCHEMA에 event_history_table 정의 추가 (NL2SQL 인지용)
시스템 프롬프트 (OllamaController):
- ToolGuideKo에 신규 5종 + search_kb + event_type 5종 명시
- run_sql 자동 가드(LIMIT/timeout) 안내 추가
검증:
- dotnet build: 경고 0건, 에러 0건
- python3 -m py_compile: OK
- import server 후 5개 도구 attribute 확인
런타임:
- mcp-server 재시작 시 신규 도구 자동 인식
- 클라이언트는 ListToolsAsync로 동적 수집 — 추가 작업 불필요
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
진단 보고서(plans/...phase5-사용자체크리스트.md) 기반 7건 코드 이슈
수정 + Phase 6 잔여 항목 중 최우선인 run_sql 가드 구현.
핫픽스:
- nl2sql_worker.py: _list_drawings 파싱 버그(문자열 분리) HIGH
- nl2sql_worker.py: 5개 async 함수 blocking DB 연결 → to_thread MED
- ExperionDbContext.cs: KB DDL의 {} 문자가 String.Format placeholder로
오인되어 부팅 실패 → 별도 NpgsqlCommand 사용 HIGH
- KbIngestWorker: 단일 청크 임베딩 실패 시 전체 abort → 부분 인덱싱 LOW
- KbAuthService: 초기 비번 로그 평문 → 마스킹 + 콘솔 분리 출력 LOW
- KbQdrantClient: new HttpClient → IHttpClientFactory LOW
- OllamaController: plant_context.md 매 요청 파일 읽기 → mtime 캐시 LOW
Phase 6 — run_sql 가드:
- _validate_sql 강화: \b 단어 경계로 updated_at 오탐 제거, WITH 허용,
TRUNCATE/COPY 추가, 다중 세미콜론 차단
- _apply_sql_guards: LIMIT 미지정 시 SELECT * FROM (...) _capped LIMIT 1000
- _execute_sql_internal: 매 호출 SET statement_timeout = 30000
- SQL_MAX_ROWS / SQL_STATEMENT_TIMEOUT_MS 환경변수화
- 응답 JSON에 row_limit 필드 추가
- nl2sql_worker.py의 _run_sql / _query_with_nl에도 동일 적용
기타:
- .gitignore: storage/ 추가 (KB 업로드 원본 디렉토리)
- opencode.json: 모델 항목을 실제 서빙 모델(Qwen3.6-27B-FP8 / 256K)로 동기화
검증:
- dotnet build: 경고 0건, 에러 0건
- python3 -m py_compile: OK
- _apply_sql_guards / _validate_sql 스모크 테스트 통과
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- KB RAG 전체 파이프라인: 업로드, 파싱(xlsx/pdf/docx/text), 임베딩, Qdrant 인덱싱
- KB 관리 UI(14번 탭): 로그인, 문서 목록, 업로드, 삭제, 재인덱스
- OllamaController: 한글 시스템 프롬프트, plant_context.md 외부 파일화, SSE tool_start/tool_result 이벤트
- 프론트: 툴 실행 카드, KB 인용 링크, 표 자동 렌더, 추천 질문 칩
- nl2sql_worker: history_table.recorded_at 사용, tag_metadata 응답 개선
- DB: KB 테이블 5개 DDL + 시드, pgcrypto 확장
- OllamaController: Ollama/vLLM 프록시 API (채팅, 스트리밍, 모델 목록, 설정)
- UI: 새 대화 탭, 세션 관리, Markdown 렌더링, 스트리밍 응답
- vLLM: OpenAI-compatible API 지원, MCP function calling 통합
- Fix: McpClient DI 팩토리 등록 (HttpClient BaseAddress 문제 해결)
- Fix: llm-model.json 직렬화 JsonSerializer 사용
- Fix: nl2sql_worker KST 시간대 표시 (AT TIME ZONE Asia/Seoul)
- Program.cs: Ollama/vLLM HttpClient 등록 (1800s timeout)
- mcp-server: 하드코딩된 모델명을 llm-model.json 기반 config.py로 외부화
- C#: AppendPointsAsync로 기존 데이터 유지하면서 포인트 추가
- C#: LlmConfigController로 LLM 모델명 조회/저장 API
- Frontend: LLM 설정 UI 카드 + 포인트 빌더에서 추가하기 버튼
기존 단일 조건(name/dataType) 방식에서 그룹별 패턴 기반 방식으로 개편.
컨트롤러/아날로그/디지털/사용자정의 5개 그룹에 대해 태그 패턴, 속성 체크박스, DataType을 각각 설정 가능.
미리보기(PREVIEW) API 추가하여 조건에 매칭되는 포인트를 확인 후 선택적으로 적용 가능.
- P&ID 그래프 파이프라인 구현 (py)
- pid_geometric_extractor.py: 기하학적 특징 추출
- pid_intelligent_mapper.py: 태그 매핑
- pid_topology_builder.py: 위상 구축
- test_pipeline_phase2.py, test_pipeline_phase3.py: 테스트
- MCP 서버 개선
- server.py: 멀티프로세싱 지원
- pipeline/: 분석, 추출, 매핑, 위상 모듈 추가
- C# P&ID 그래프 서비스
- PidGraphDtos.cs: DTO 정의
- PidGraphService.cs: 비즈니스 로직
- PidGraphController.cs: API 컨트롤러
- OPC UA 서비스 개선
- ExperionOpcServerService.cs
- ExperionRealtimeService.cs
- ExperionFastService.cs
- MCP 클라이언트 및 호스팅 서비스 개선
- McpClient.cs
- McpServerHostedService.cs
- 웹 UI 개선
- pid_graph_view.html: P&ID 그래프 뷰어
- pid-viewer.js: 뷰어 로직
- app.js: 메인 앱
- pid_graph.css: 스타일
- 프로젝트 설정 업데이트
- ExperionCrawler.csproj
- Program.cs
- IMcpService 인터페이스 및 McpClient/McpService 구현 추가
- McpClient: Python MCP 서버(localhost:5001)와 JSON-RPC over HTTP 통신
- McpService: McpClient 위임 래퍼, IMcpService 구현
- [JsonPropertyName], PropertyNameCaseInsensitive 적용으로 JSON 역직렬화 수정
- TextToSqlController에 MCP 엔드포인트 5개 추가
- GET /api/text-to-sql/tools
- POST /api/text-to-sql/execute-mcp
- POST /api/text-to-sql/query-history
- GET /api/text-to-sql/tags/search
- GET /api/text-to-sql/drawings
- HistoryQueryRequestDto 추가 (TextToSqlDtos.cs)
- QueryHistoryWithIntervalAsync 올바른 메서드 호출로 수정 (IExperionDbService)
- Program.cs: McpClient 싱글톤 등록, AddHttpClient 잘못된 등록 수정
- 빌드 에러 0건, 경고 0건
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ExperionCrawler 프로젝트 전체 백업 (11개 커밋 포함)
- OPC UA IIoT 데이터 브리징 인프라
- Text-to-SQL 쿼리 엔진
- 실시간 데이터 스트리밍 서비스
- ASP.NET Core Web API
- TimescaleDB/SQLite 데이터베이스
- 보안 인증서 관리
- 통합 테스트
Major project initialization and feature implementation:
**Core Features:**
- OPC UA client for Honeywell Experion HS R530 integration
- Real-time data streaming and history data retrieval
- Text-to-SQL query engine with TimeScaleDB
- JSON-based node configuration system
- SQLite database with migration support
**Architecture:**
- Clean architecture with Domain, Application, Infrastructure layers
- ASP.NET Core Web API frontend
- Web UI with real-time visualization
- PKI-based OPC UA authentication (TLS)
**Infrastructure Components:**
- ExperionOpcClient: OPC UA connection management
- ExperionRealtimeService: Real-time data streaming
- ExperionHistoryService: Historical data queries
- TextToSqlService: Natural language to SQL queries
- SqlValidator: SQL injection prevention
**Database:**
- TimescaleDB integration (recommended) or SQLite fallback
- Entity Framework Core with Extenstion methods
- OPCTag, KeyValue tables for data storage
**Security:**
- Certificate-based OPC UA endpoint security
- SSL/TLS encryption for database connections
- Output param binding injection prevention
**Testing:**
- Unit tests for TextToSqlService and SqlValidator
- Integration tests for Korean time range extraction
See REVIEW_REQUEST.md for detailed code review information.