Sync main → gbpark-node: AI 모듈 JSONB 파싱 + audit-log fix #1
Reference in New Issue
Block a user
Delete Branch "main"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
이번 세션 핵심 (3 commits)
🐛 fix(audit-log): URL 단/복수 + DB 컬럼명 + 응답 키 case 일괄 정정 (
53f2638b)/audit-log→ 백엔드/audit-logsCREATED_DATE→CREATED_AT🐛 fix(ai-modules): JSONB ::text 응답 자동 파싱 + workspace 카드 깨짐 (
04cea72f)응답 메서드에서
parseJsonField헬퍼로 JSONB 컬럼 자동 변환MultiAgentExecutionEngine영향 없음 (getEntityById분리)safeArray<T>/safeObject<T>헬퍼 추가📚 docs(notes): 그렘린 카오스 테스트 + JSONB autopilot 작업 노트 (
19f76153)발견 방법
브라우저 그렘린 카오스 테스트 (Claude-in-Chrome MCP + gremlins.js + fetch hook)
상세 리포트:
notes/johngreen/2026-05-02-agents-gremlins-report.mdnotes/johngreen/2026-05-02-gremlins-jsonb-autopilot-report.md⚠️ Follow-up 권장 (별도 PR)
🤖 Generated with Claude Code
기존 server-side redirect("/workspace") 가 invyone SPA 탭 시스템과 충돌해서 사이드바 'AI 어시스턴트' 자식 클릭 시 화이트 스크린 발생. useRouter().replace() 의 client-side 라우팅으로 변경 — AdminPageRenderer 가 dynamic import 한 컴포넌트가 정상으로 mount. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>기존 fromV2 / fromV1 은 BlockV2.xPct 또는 TemplateComponent.order/row 가정이었는데, 실 운영 빌더(templateAdapter.saveTemplate) 는 list 가 컴포넌트 배열이고 각 요소가 position{x,y} + size{w,h} 절대 px, 공통 screenResolution 으로 정규화되는 구조였음. fromStudio 추가: - list 를 배열 / v2.1 layers / { components } 어느 모양이든 평탄화 - screenResolution 우선, 없으면 컴포넌트 bounding box 폴백 - url(v2-table-list 등)/componentType/widgetType 어느 키든 inferKind 로 분류 호출 순서: fromStudio → fromV2 → fromV1 (안전망). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>옛 PLM 시절 Windows 스크립트가 현재 invyone 셋업 (compose: docker/dev/docker-compose.invyone.yml, 포트 9772/8083)과 안 맞아 정리. 삭제: - 루트: start-windows-simple.bat / start-all-separated.bat / stop-all-separated.bat / test-backend-build.bat / run-windows.bat - 루트: docker-compose.backend.win.yml / docker-compose.frontend.win.yml (옛 PLM 컨테이너명/포트, hardcoded credentials, 위 .bat 외엔 참조 없음) - scripts/dev/: start-all-parallel.{bat,ps1} / stop-all.{bat,ps1} (모두 위 .yml 참조) - ※ Mac 스택 (docker-compose.{backend,frontend}.mac.yml + scripts/dev/*.sh) 은 별도 시스템이라 건드리지 않음 신규: - start.bat: scripts/start/invyone-start-docker-all.bat 으로 위임 (단일 진실의 원천) - reload.bat: 프론트 컨테이너 재시작 + 백엔드 'sh ./gradlew classes' 로 재컴파일 (Spring DevTools 가 자동 리로드). Docker Desktop bind mount 가 호스트 변경을 컨테이너 inotify 로 안 넘겨서 자동 핫리로드가 안 되는 환경용. 업데이트: - docs/DOMAIN_MAPPING.md: 개발 환경 표를 현재 포트/compose 로 갱신 + 테넌트 서브도메인 행 추가. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>백엔드: - 6개 AI Service (group/apiKey/provider/conversation/agent/scheduler) 가 응답 메서드에서 `parseJsonField` 헬퍼로 JSONB(::text) 컬럼 (connectors / config / permissions / metadata / tool_calls / notification / tools) 을 String → Object 자동 변환. - 모범 패턴 (`AuditLogService.processChanges`, `BusinessRuleService.parseJsonField`, `DataflowDiagramService.parseJsonbFields`) 동일하게 적용. - model 의 String getter 는 그대로 유지 — `MultiAgentExecutionEngine` 등 내부 LLM 호출 chain 영향 없음 (`getEntityById` 분리). - 컨트롤러 시그니처 generic 만 변경 (return type Map). 프론트엔드: - `safeArray<T>` / `safeObject<T>` 헬퍼 (`lib/utils.ts`) — 백엔드가 미파싱 String 으로 올 때 graceful fallback. 빈 배열/객체 반환. - `workspace/page.tsx` 멤버 카드: - `safeArray(member.connectors)` 적용 → `.map()` 폭발 차단. - 좁은 viewport 에서 한글 텍스트 한 글자씩 세로로 깨지던 문제 해결 (`flex-wrap` + `truncate` + `whitespace-nowrap` + `max-w` + `title`). 그렘린 1000마리 폭격 + architect 자문으로 발견. workspace `Application error`, `memberConnectors.map is not a function` 모두 해결. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>