4447 Commits

Author SHA1 Message Date
sangwook yoo
dbaebf9e2b feat(pdf-import): 외벽선 자동 확정 토글 동작 연결 — ON 확정·지붕형상 직행 / OFF 미확정 유지
- usePdfImport.applyOuterline 에 autoFix 옵션 추가 — outerLineFix 확정 여부를 토글에 따라 분기
- PlacementShapeSetting.handleSaveBtn 에서 토글값으로 메뉴 분기(ON→ROOF_SHAPE_SETTINGS / OFF→EXTERIOR_WALL_LINE); 모달은 MenuDepth01 이 currentMenu 변화로 자동 오픈하므로 직접 addPopup 제거
- fix: basicSettingSave 의 setMenuByRoofSize 를 skipSideEffects 가드 안으로 이동 — ON 인데도 async 저장(await post) 직후 메뉴가 EXTERIOR_WALL_LINE 로 덮어써져 외벽선 작성 팝업으로 되돌아가며 확정이 풀리던 문제 수정
- docs(claude): PDF 임포트 절에 자동 확정 분기·MenuDepth01 메뉴 연동·skipSideEffects 주의 반영

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 23:53:25 +09:00
sangwook yoo
fafee78c8a feat(pdf-import): 외벽선 자동 확정(auto fix) 토글 추가 — 전역 옵션·기본 ON
배치면 초기설정 PDF 입력 화면에 '외벽선 자동 확정' 토글을 추가한다.
- autoOuterLineFixState 전역 atom 신설(기본값 true), outerLineFixState 와 별개의 옵션 플래그
- ko/ja i18n 라벨·설명 키 추가
- toggle-btn 스위치를 읽기 페이지 설정 행 아래 배치, 분석 중에는 비활성화

실제 PDF 자동 확정 동작 연결(usePdfImport)은 별도 작업으로 분리.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 21:34:55 +09:00
sangwook yoo
ce295dd8ff feat(pdf-import): 지정 페이지만 분할·인라인 전송으로 분석 속도 개선
- '읽기 페이지 설정'의 평면도/입면도 페이지 번호가 프롬프트 힌트로만 쓰이고
  PDF 전체가 Gemini 로 전송되던 문제 해결 — pdf-lib 로 지정 페이지만 잘라 전송
- 분할본이 12MB 이하면 inlineData(base64) 즉시 전송 → Files API 업로드·폴링 제거,
  초과 시에만 Files API 로 fallback
- 분할 시 buildPrompt 를 페이지번호 힌트 대신 평면도/입면도 순서 매핑으로 전환
- 유효 페이지 0개 → 422 INVALID_PAGE_RANGE, 분할 실패 → 422 PDF_SPLIT_FAILED
- 설계 문서 추가(docs/superpowers/specs/2026-06-21-pdf-page-split-design.md)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 20:49:11 +09:00
sangwook yoo
f46dc788cc fix(pdf-import): 분석 타임아웃 120s→300s 확대 — 서버 정상 완료 직전 클라이언트 abort 방지
[작업내용] :
- 서버가 120,011ms 에 200 으로 정상 완료했는데 클라이언트 AbortController 가 정확히 120,000ms 에
  fetch 를 끊어 타임아웃 toast 가 뜨던 문제 — gemini-3.1-pro-preview(thinking 비활성 불가)
  + MEDIA_RESOLUTION_HIGH PDF 분석은 정상 응답도 2분을 넘길 수 있어 300초로 확대
- 추후 진단용으로 서버에 단계별 소요시간(fileReady/generate) debug 로그 추가

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 10:28:06 +09:00
sangwook yoo
08ef577260 fix(gemini): floor-plan API 에 세션 인증·레이트리밋 추가
[작업내용] :
- iron-session 세션 검사 추가 — 페이지용 layout redirect 가 API 라우트를 보호하지 않아
  익명 요청으로 Gemini 과금이 가능하던 문제 차단(401)
- 사용자별 분당 5회 in-memory 레이트리밋(429) — 연타 업로드 과금 폭주 방지

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 10:07:01 +09:00
sangwook yoo
7b15b76054 fix(pdf-import): 좌표 축소 스케일 제거 — 치수 라벨 실측 정합(R1)
[작업내용] :
- fitAndCenter 가 큰 도면(9.6m 초과)에 scale<1 을 좌표에 곱해 'QLine 길이×10=표시 mm' 불변식을
  깨뜨리던 문제 해소 — 좌표는 실측 그대로 평행이동만 하는 centerOnCanvas 로 대체
- 화면맞춤은 fitViewport 로 분리: 캔버스 중앙 고정 viewportTransform 줌 + canvasZoomState 동기화
  (useCanvasEvent 의 setZoom 은 동일 zoom 값에서 translation 을 보존)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 10:06:33 +09:00
sangwook yoo
29fd4cbd59 fix(pdf-import): 분석 중 라우팅 이탈 시 늦은 결과 적용·플랜 덮어쓰기 차단
[작업내용] :
- 진행 중인 PDF 분석 요청을 pdfRunRef 로 추적, 모달 언마운트 시 AbortController.abort() 호출
- fetch 완료 후·저신뢰 confirm 후 두 지점에서 컨트롤러 동일성 가드 — 언마운트로 무효화된 늦은 결과가
  비워진 canvas 에 적용되고 saveCanvas 가 이전 플랜 DB 를 outline-only 로 덮어쓰던 데이터 손실 경로 차단

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 10:05:40 +09:00
sangwook yoo
c7757fabda fix(pdf-import): PDF 외곽선을 수동 확정 상태와 동일하게 생성 — 지붕형상 설정 차단 해소
[작업내용] :
- useLine.addLine 경유로 outerLine 생성 — attributes/planeSize/fontSize 부여(지붕형상 설정·처마/케라바 편집·재로드 복원에 필수)
- canvas.outerLineFix + outerLineFixState 설정 — 미설정 시 지붕형상 설정 진입이 wall.line.not.found 로 즉시 차단되던 문제 해소
- skeletonBuilder 가 소비하는 outerLinePoint 정점 circle 생성(수동 플로우와 동일)
- 조기 WALL 폴리곤 생성 제거 — 수동 플로우와 동일하게 지붕형상 설정 적용 시점에 WALL/ROOF 생성
- 짧은엣지 dedup 을 '직전 유지 정점' 기준으로 수정하고 닫힘 엣지(Gemini 닫힌 링 반환 포함)까지 검사, 임계값을 addLine 의 1unit 과 일치
- PDF 적용 후 외벽선 그리기 메뉴(진입 시 재드로잉 강등) 대신 지붕형상 설정 메뉴로 직행

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 10:05:09 +09:00
sangwook yoo
0c1c66f65c chore(debug): 미사용 debugCapture 유틸 제거
LOW-PITCH-DIAG 진단 제거로 debugCapture 사용처가 0 이 되었고, 대상
/api/debug 라우트도 구현된 적이 없어 한 번도 동작하지 않던 죽은 코드다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 18:30:07 +09:00
sangwook yoo
707148ed0f chore(low-pitch): LOW-PITCH-DIAG 임시 진단 로그 제거
/api/debug 라우트가 구현된 적이 없어 debugCapture.log 호출이 매번 404 를
유발하던 콘솔 노이즈를 제거한다. 해당 진단은 주석에 "검증 후 제거"로 표시된
임시 코드였다(앱 동작에는 무영향).

- PlacementShapeSetting.jsx, useRoofAllocationSetting.js 에서 debugCapture
  import 과 LOW-PITCH-DIAG 호출 3건 제거
- 진단 전용으로만 쓰이던 isLowPitchRestricted·LOW_PITCH_RESTRICTED_ROOF_IDS
  import 도 함께 제거(notifyLowPitchRestrictionForRoofs 실기능 import 는 유지)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 18:27:06 +09:00
sangwook yoo
654b8d6e08 fix(gemini): 라우트 정리(deleteFile)를 응답에서 분리
finally 에서 await fileManager.deleteFile(...) 가 catch 의 return 을 게이팅해,
정리용 네트워크 호출이 행되면 500 응답조차 클라이언트로 송신되지 않던 문제를 해소한다.

- deleteFile 을 await 하지 않고 fire-and-forget + .catch 로 분리해 응답을 정리 완료에 묶지 않음
- 상주 Node 서버(PM2 next start)이므로 응답 후에도 detached 삭제가 정상 완료되며,
  미삭제 시에도 Gemini 측에서 자동 만료
- 클라이언트 120s 타임아웃과 짝을 이뤄 한쪽이 행되어도 스피너에 갇히지 않음

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 17:52:20 +09:00
sangwook yoo
49b2d0940f fix(pdf-import): 클라이언트 분석 타임아웃·스피너 해제 보장
PDF 분석 요청 실패/행(hang) 시 전역 스피너가 영구히 멈춰 화면 복귀가
불가능하던 문제를 해소한다.

- 네트워크 구간을 try/finally 로 감싸 성공·실패·타임아웃 어떤 경로든
  스피너(pdfAnalyzing·isGlobalLoading)를 반드시 해제하도록 보장
- AbortController + 120s 타임아웃으로 무한 행 차단
- alert 은 스피너 해제 후 표시(스피너 z-index 가 alert 보다 높아 가려지는 것 방지)
- pdf.import.error.timeout 메시지 키 추가(ko/ja)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 17:52:10 +09:00
sangwook yoo
761c42a637 feat(pdf-import): 분석 신뢰도 게이팅 + 저신뢰 확인 메시지(ko/ja)
- analyzePdfAndApply에서 confidence < 0.6이면 반영 전 useSwal confirm으로 사용자 확인
- pdf.import.confirm.low.confidence 메시지 키 ko/ja 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 09:12:15 +09:00
sangwook yoo
0418dd84ee feat(pdf-import): 외곽선 기하 후처리(축정렬 스냅·단순화·자기교차 복구) 추가
- normalizeGeometry 단계 신설: snapNearAxisEdges(축정렬 스냅) → turf.simplify(과다 정점 단순화) → cleanSelfIntersectingPolygon(자기교차 복구)
- applyOuterline의 중복점 제거 직후·fitAndCenter 전에 삽입(스냅→단순화 순서로 축정렬 보존)
- 기존 검증 순수함수 재사용, 신규 의존성 없음

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 09:12:14 +09:00
sangwook yoo
afda525be9 feat(gemini): 屋根伏図 지붕투영면 외곽선 추출 프롬프트 강화 + media_resolution HIGH
- BASE_PROMPT를 지붕 투영면(屋根伏図 footprint) 기준으로 재작성: 屋根伏図 우선(처마/케라바 포함), 立面図/配置図/求積図/断面図 배제, 도머/개구부 제외
- 寸法線 mm 1순위 축척 규칙, 910/1820mm 모듈 단서, L자/직각 형상 보존 규칙 추가
- generationConfig에 mediaResolution: MEDIA_RESOLUTION_HIGH 추가(미지원 SDK 시 무시), usageMetadata 로깅
- FLOOR_PLAN_SCHEMA 및 응답에 selectedDrawingType 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 09:12:13 +09:00
sangwook yoo
0187b234fb Revert: PDF 도면 파일 업로드 라디오 옵션 재표시
배치면 초기설정 팝업에서 '도면 파일 업로드' 옵션 주석 처리를 해제하여 다시 노출.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 18:17:02 +09:00
sangwook yoo
f8641079e6 Disable PDF input mode option 2026-05-27 17:54:49 +09:00
sangwook yoo
6a99b6de4a Merge remote-tracking branch 'origin/dev' into feature/pv-btob 2026-05-27 16:56:33 +09:00
a4b7f519bb [2173] valleyExt TRIM — hip-presence 원래hip-only + cascade hide 2026-05-27 16:18:33 +09:00
e9f5ceab69 [2173] 골짜기확장라인 TRIM 재활성 + Y junction 보존 + 끝점일치 보존 2026-05-27 15:20:55 +09:00
sangwook yoo
79aafbd613 Merge remote-tracking branch 'origin/dev' into claude/lucid-shaw-91e51f 2026-05-27 14:41:26 +09:00
5ba5623d46 [2173] 골짜기확장라인 self-extension 모델 + TRIM/FIXPOINT-cuts off — 확장만 2026-05-27 13:58:26 +09:00
8d7ffdc957 [2173] KERAB-OFFSET-SURGICAL flag ON — 케라바 토글 出幅 surgical 반영 활성화 2026-05-27 10:09:52 +09:00
f5f8eb9460 [2173] 처마/케라바 토글 KERAB-SIMPLE 알고리즘 + offset-surgical helper(flag off) 2026-05-27 10:03:56 +09:00
sangwook yoo
f8467879a8 Merge remote-tracking branch 'origin/dev' into claude/lucid-shaw-91e51f 2026-05-20 09:41:37 +09:00
sangwook yoo
849f7a1dc9 feat(pdf-gemini): 배치면 초기설정에 PDF 도면 업로드 옵션 추가 — Gemini 외곽선 분석
- 「배치면 초기설정」 모달 寸法入力方法 라디오에 '도면 파일 업로드' 옵션 추가
- 선택 시 PDF 파일 업로드 + 읽기 페이지 설정(전체/입면도·평면도 지정) UI 노출
- 保存 클릭 시 /api/gemini/floor-plan 호출 → 외곽선을 캔버스에 반영한 후 기존 저장 흐름 진행
- Gemini File API 업로드 + finally 파일 폐기, 정점/면적 검증, 페이지 힌트 프롬프트 주입
- usePdfImport 훅: mm→canvas 좌표 변환, CCW 정규화, 기존 외곽선 덮어쓰기 confirm 후 QLine/QPolygon 생성
- @google/generative-ai 의존성 추가, GEMINI_MODEL env 4개 환경에 동기화
- 다국어(ja/ko) 메시지 추가, .playwright-mcp/ gitignore

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 09:39:41 +09:00
dc857b28fa [2173] junction-extended 패턴 outer hip 제거 + strokeWidth SK와 통일
[작업내용] :
- 대전제 반영: 케라바 ridge 가 생기는 분기에서 c1·c2 에 붙은 outer hip 2개 제거
  · inner hip(junction 너머) 보존
  · __removedHipsSnapshot 첨부 → revert 시 hip 2개 자동 복원
- revert 분기에서 hip 스냅샷 + ridge 스냅샷 둘 다 순회 복원하도록 대칭 보강
- 케라바 패턴 생성 라인 strokeWidth 2 → 4 (SK 라인과 동일, 6개소)
2026-05-20 08:46:43 +09:00
eb12b24138 [2173] 처마→케라바 junction-extended 패턴 + RG-1 자동 제거
[작업내용] :
- findHipPairViaJunction: H-7/H-1 의 junction 너머 inner hip(H-4/H-2) 무한확장 교점을 apex 채택
- applyKerabJunctionExtendedPattern (순수 추가):
  · ext hip 2개(junction→apex) + 중앙 ridge(mid→apex) 추가
  · ridgeEndpointsOnBothExtensions 로 RG-1 식별 → 스냅샷 첨부 후 제거 (RG-2 보존)
- applyKerabRevertPattern: __removedRidgesSnapshot(배열) 반복 복원으로 forward 와 대칭
- useRoofAllocationSetting: 분할 직전/후 패턴 라인 진단 로그(KERAB-PATTERN-DIAG)
2026-05-19 17:12:48 +09:00
35ba41a104 탭에 path제거 2026-05-19 12:32:48 +09:00
e74604d3f9 [2240] 손상 plan 좌표 가드/복원 — 로드 가드+저장 차단+복원 자동호출 2026-05-18 16:19:37 +09:00
f32f9187d1 [DB] 컬럼 길이 가드 — addressee 합산 50자 + receiveUser 20자 클립 2026-05-18 15:00:20 +09:00
eaae0f4a84 [1961] hip 라벨 정합성 — SK↔할당 일치 + 0.5 step 표시 통일 2026-05-18 12:41:55 +09:00
116953ee2f 소스정리 2026-05-15 12:28:32 +09:00
905b51b865 [1423] 2차 user 판매점 select 항상 enable + 設計依頼 매핑 실패 시 본인 초기화 2026-05-15 12:19:15 +09:00
bfd9d446a3 [1423] 2차 user 판매점 select 항상 enable + 設計依頼 매핑 실패 시 본인 초기화 2026-05-15 11:09:28 +09:00
e915a386cc [1423] 設計依頼 import 매핑 정책 롤백 — StuffDetail.jsx 7e9ec4e3 복원
운영 배포 후 문제 보고로 PLANREQ-MATCH 2026-05-12 재정의 직전 안정 버전으로 되돌림.
2026-05-15 10:03:23 +09:00
f6652acbd7 2차 로그정리 2026-05-14 17:26:11 +09:00
347536e87a 2차 로그정리 2026-05-14 17:21:46 +09:00
042cdc4b83 1차 로그주석처리 2026-05-14 17:04:43 +09:00
91321745d4 [1423] 設計依頼 import 매핑 정책 재정의 — 미매칭 시 로그인 초기값 reset 2026-05-14 16:29:38 +09:00
7e9ec4e3f2 로그 수정 2026-05-14 14:55:05 +09:00
d60bf27778 로그 수정 2026-05-14 14:49:41 +09:00
281d9bb583 로그 수정 2026-05-14 14:38:27 +09:00
ccca89fef6 [2218] 초기 비밀번호 설정 메시지 수정 2026-05-14 14:32:07 +09:00
9a10186c17 [2218] 초기 비밀번호 설정 메시지 수정 2026-05-14 13:21:54 +09:00
490ab6c49f [1961] split 길이 계산 Math.round(hypot)*10 → calcLinePlaneSize 통일 — 좌우대칭 hip 라벨 1mm 갈림 차단 2026-05-14 10:36:11 +09:00
aac4f1fb50 [VALLEY-SKIP] isValleyVertex 노치 top_in 잘못된 eaveHelpLine 4개 차단 — zero-length neighbor + collinear continuation 2단 가드 2026-05-13 16:43:13 +09:00
25d2fbe419 [2210] 초기 비밀번호 설정 메시지 수정 2026-05-13 16:39:30 +09:00
77bca24e7c [SK-EXTENDED-PERSIST] hip __extended 플래그 save/load 보존 — attributes.extended 동기 + console→logger 2026-05-13 14:27:06 +09:00
cd95b68d96 Merge branch 'dev' of https://git.hanasys.jp/qcast3/qcast-front into hotfix/dev_yscha 2026-05-13 12:16:23 +09:00