@dssp/supervision 1.0.18 โ†’ 1.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"building-inspection-detail-ai-measurement.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-ai-measurement.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ๊ฒ€์ธก ๊ด€๋ฆฌ ์ƒ์„ธ - AI ์ž๋™ ๊ฒ€์ธก (๋™์˜์ƒ ์„ธํŠธ + ์ธก์ • ๋ชจ๋ธ 2์ข…)\n *\n * ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์„ AI ์—”์ง„(inspection-ai)๊ณผ ์ธก์ • ์„œ๋ฒ„(measure-engine)์— ์—ฐ๋™ํ•ด:\n * 1) ์ดฌ์˜ ๊ฐ€์ด๋“œ(plan-shots, ๋™์˜์ƒ ์ตœ๋Œ€ 3๊ฑด)๋ฅผ ํ‘œ์‹œํ•˜๊ณ \n * 2) LidarInspector ์•ฑ์ด ๋งŒ๋“  ์„ธํŠธ(video.mov/poses.jsonl/meta.json)๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด\n * 3) ์„ธํŠธ๋ณ„ ๋Œ€ํ‘œ 3ํ”„๋ ˆ์ž„์œผ๋กœ ์ž๋™ ํŒ์ •(inspect, input_kind=video_frames)์„ ์‹คํ–‰ํ•œ ๋’ค\n * 4) ใ€Œ์ถ”๊ฐ€ ์ž‘์—… ํ•„์š”ใ€(์žฌ์ดฌ์˜/๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ/AI ๋ฏธ์ง€์›)๋ฅผ ๋ถ„๋ฅ˜ํ•ด ์ธก์ • UI(์ฒ ๊ทผ ๋ฐฐ๊ทผ ๊ธธ์ดยท๊ธฐ๋‘ฅ๋ฒฝ์ฒด ๋‘๊ป˜)๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ \n * 5) ์ธก์ • ๊ฒฐ๊ณผ๋Š” apply-measurement๋กœ ํŒ์ • ํ™•์ • โ†’ ๊ฒ€์‚ฌ ๋“ฑ๋ก ์‹œ ๊ฐ๋ฆฌ์ž ์ ํ•ฉ/๋ถ€์ ํ•ฉ ์ž๋™ ๋ฐ˜์˜ + ๊ทผ๊ฑฐ ์ฒจ๋ถ€ํ•œ๋‹ค.\n */\nimport '@material/web/icon/icon.js'\nimport '@material/web/progress/circular-progress.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, state, query } from 'lit/decorators.js'\n\nimport { PageView, navigate } from '@operato/shell'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport { canDcspMutate } from '@dssp/building-complex/dist-client/utils/privilege'\n\nimport './component/building-inspection-detail-header'\n\nconst ENGINE_BASE_URL = 'https://hatiolab-korea-uni.nruing.com'\nconst ENGINE_RUN_URL = `${ENGINE_BASE_URL}/api/run/inspection-ai`\nconst ENGINE_AUTH = `Basic ${btoa('admin:admin1234')}`\n/* ์ธก์ • ์„œ๋ฒ„(measure-engine/server.py). ๋ฐฐํฌ ์‹œ ์‹ค์ œ ์ฃผ์†Œ๋กœ ์ˆ˜์ • โ€” https ํŽ˜์ด์ง€์—์„œ๋Š” https(๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ) ํ•„์š” */\nconst MEASURE_BASE_URL = 'https://hatiolab-korea-uni.nruing.com/measure'\nconst MEASURE_AUTH = ENGINE_AUTH\n\n/* ์ดฌ์˜ ์•ˆ๋‚ด ์ด๋ฏธ์ง€ (์—”์ง„ ์ „๋‹ฌ๋ฌผ ๊ณ ์ • ๊ทธ๋ฆผ + ํ”ฝํ† ๊ทธ๋žจ) */\nconst captureGuideImg = new URL('../../assets/ai-measurement/capture_guide.png', import.meta.url).href\nconst pictoRebarImg = new URL('../../assets/ai-measurement/picto-rebar-parallel.svg', import.meta.url).href\nconst pictoMemberImg = new URL('../../assets/ai-measurement/picto-member-corner.svg', import.meta.url).href\n\n/* ์„ธํŠธ ํด๋” ํ•„์ˆ˜ ํŒŒ์ผ (LidarInspector ์•ฑ์ด ์ดฌ์˜ 1ํšŒ๋‹น ์ƒ์„ฑ) */\nconst SET_FILES = ['video.mov', 'poses.jsonl', 'meta.json']\n\n/* ์ดฌ์˜ ์•ฑ ์‹คํ–‰ ๋งํฌ โ€” iPad์—์„œ ์ด ํ™”๋ฉด์„ ์—ด์—ˆ์„ ๋•Œ ์•ฑ์ด ๋ฐ”๋กœ ์ดฌ์˜ ํ™”๋ฉด์œผ๋กœ ๋œฌ๋‹ค.\n server ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์—…๋กœ๋“œ ์ฃผ์†Œ๊นŒ์ง€ ๋„˜๊ฒจ์„œ ์•ฑ ์„ค์ •์„ ๋”ฐ๋กœ ์•ˆ ๋งŒ์ ธ๋„ ๋˜๊ฒŒ ํ•œ๋‹ค. */\nfunction appCaptureLink(tech: 'cover' | 'thick') {\n return `gamri://${tech}?server=${encodeURIComponent(MEASURE_BASE_URL)}`\n}\n\n/* set_id(YYYYmmdd-HHMMSS_xxxxxx) โ†’ \"9/11 14:30\" ํ‘œ๊ธฐ */\nfunction _setTimeLabel(setId: string) {\n const m = /^(\\d{4})(\\d{2})(\\d{2})-(\\d{2})(\\d{2})/.exec(setId || '')\n return m ? `${Number(m[2])}/${Number(m[3])} ${m[4]}:${m[5]}` : setId\n}\n\n/* ์—”์ง„ verdict(๊ธฐ๊ณ„๊ฐ’) โ†’ ํ™”๋ฉด ๋ผ๋ฒจ. pass/fail๋งŒ ํ•ฉ/๋ถˆ๋กœ ์ž๋™ ์ฒดํฌ, ๋‚˜๋จธ์ง€๋Š” ๊ฐ๋ฆฌ์ž ํŒ๋‹จ */\nconst VERDICT_LABEL = {\n pass: '์ ํ•ฉ',\n fail: '๋ถ€์ ํ•ฉ',\n hold: '์žฌ์ดฌ์˜ ํ•„์š”',\n pending: 'AI ๋ฏธ์ง€์›',\n error: '๋ถ„์„ ์˜ค๋ฅ˜'\n}\n\n/* ์—”์ง„ routing(๊ธฐ๊ณ„๊ฐ’) โ†’ ํ™”๋ฉด ๋ผ๋ฒจ. cv ๊ณ„์—ด์€ CVํŒ€ ๋ช…์„ธ ๊ณ ์ • ๋ฌธ๊ตฌ \"3D ๊ณ„์ธก\" */\nconst ROUTING_LABEL = {\n vlm: 'AI ์‚ฌ์ง„ํŒ๋…',\n cv: '3D ๊ณ„์ธก',\n cv_missing: '3D ๊ณ„์ธก'\n}\n\n/* operator_inputs ํ•„๋“œ ํ‚ค โ†’ ํ•œ๊ธ€ ๋ผ๋ฒจ (๋ชจ๋ฅด๋Š” ํ‚ค๋Š” ํ‚ค ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ) */\nconst FIELD_LABEL = {\n name: '๋ถ€์žฌ/๋ณ€ ์ด๋ฆ„',\n member_dim_mm: '์„ค๊ณ„ ๋‹จ๋ฉด ์น˜์ˆ˜ (mm)',\n cover_spec_mm: '๊ธฐ์ค€(์ตœ์†Œ) ํ”ผ๋ณต๋‘๊ป˜ (mm)',\n design_mm: '์„ค๊ณ„ ๋‘๊ป˜ (mm)',\n tol_mm: 'ํ—ˆ์šฉ ๊ณต์ฐจ ยฑ (mm)'\n}\n\ntype PanelMode = 'none' | 'detail' | 'recapture' | 'measure' | 'report'\n\ntype SetInfo = {\n setId: string\n technique?: string\n label: string\n warnings: string[]\n}\n\n@customElement('building-inspection-detail-ai-measurement')\nexport class BuildingInspectionAiMeasurement extends PageView {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px 1fr;\n color: #4e5055;\n width: 100%;\n height: 100%;\n background-color: #f7f7f7;\n }\n\n * {\n box-sizing: border-box;\n }\n\n div[body] {\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n padding: var(--spacing-medium);\n gap: 12px;\n }\n\n .page-title {\n text-align: center;\n font-size: 16px;\n font-weight: 700;\n color: #333;\n }\n\n .page-title span[target] {\n color: #7d2f2f;\n text-decoration: underline;\n }\n\n /* โ”€โ”€โ”€ 1๋‹จ๊ณ„: ์ดฌ์˜ ๊ฐ€์ด๋“œ โ”€โ”€โ”€ */\n .guide-container {\n max-width: 560px;\n width: 100%;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .step-badge {\n align-self: flex-start;\n background: #f7e9e9;\n color: #7d2f2f;\n font-size: 12px;\n font-weight: 700;\n padding: 4px 10px;\n border-radius: 12px;\n }\n\n .guide-title {\n font-size: 26px;\n font-weight: 800;\n color: #222;\n line-height: 1.3;\n white-space: pre-line;\n }\n\n .guide-desc {\n font-size: 13px;\n color: #777;\n }\n\n .card {\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 16px;\n }\n\n .card h4 {\n margin: 0 0 10px 0;\n font-size: 14px;\n color: #333;\n }\n\n .card ul {\n margin: 0;\n padding-left: 4px;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .card ul li {\n font-size: 13px;\n color: #555;\n display: flex;\n gap: 8px;\n }\n\n .card ul li::before {\n content: '';\n flex-shrink: 0;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #7d2f2f;\n margin-top: 6px;\n }\n\n /* ์ดฌ์˜ ์•ˆ๋‚ด ๊ทธ๋ฆผ โ€” ํ”ฝํ† ๊ทธ๋žจ์€ ๋ฐฐ๊ฒฝ ํˆฌ๋ช…ยท์ง™์€ ๊ธ€์ž๋ผ ๋ฐ์€ ์นด๋“œ ์œ„์—๋งŒ ์–น๋Š”๋‹ค */\n .capture-guide-img {\n width: 100%;\n border-radius: 8px;\n display: block;\n }\n\n /* ์ดฌ์˜ ์•ฑ ์‹คํ–‰ ๋งํฌ */\n .app-links {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n font-size: 12px;\n color: #777;\n }\n\n /* ์ดฌ์˜ ์นธ์˜ ใ€Œ์•ฑ์œผ๋กœ ์ดฌ์˜ใ€ */\n .shoot-link {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n padding: 7px 12px;\n border-radius: 999px;\n background: #7d2f2f;\n color: #fff;\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n .shoot-link md-icon {\n --md-icon-size: 16px;\n color: #fff;\n }\n\n .app-links a {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #7d2f2f;\n border-radius: 999px;\n color: #7d2f2f;\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n /* ์•ฑ์ด ์˜ฌ๋ฆฐ ์„ธํŠธ ๊ณ ๋ฅด๊ธฐ */\n .set-chooser {\n border: 1px solid #e5e5e5;\n border-radius: 8px;\n background: #fff;\n margin: -4px 0 4px 38px;\n padding: 6px;\n max-height: 220px;\n overflow-y: auto;\n }\n\n .chooser-row {\n display: block;\n width: 100%;\n text-align: left;\n border: 0;\n background: transparent;\n border-radius: 6px;\n padding: 8px 10px;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n }\n\n .chooser-row:hover {\n background: #f5f5f5;\n }\n\n .chooser-row b {\n display: block;\n font-size: 13px;\n color: #333;\n }\n\n .chooser-empty {\n padding: 12px 10px;\n font-size: 12px;\n color: #999;\n }\n\n .chooser-actions {\n display: flex;\n justify-content: flex-end;\n gap: 4px;\n border-top: 1px solid #f0f0f0;\n padding-top: 4px;\n }\n\n .set-chooser .app-links {\n border-top: 1px solid #f0f0f0;\n padding: 8px 4px 6px;\n }\n\n /* ์„ธํŠธ ์—…๋กœ๋“œ ์นด๋“œ */\n .set-card {\n display: flex;\n align-items: center;\n gap: 10px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: #fafafa;\n padding: 12px;\n cursor: pointer;\n }\n\n .set-card[uploaded] {\n border-style: solid;\n border-color: #bfd8bf;\n background: #f2f8f2;\n cursor: default;\n }\n\n .set-card md-icon {\n --md-icon-size: 28px;\n color: #b5b5b5;\n flex-shrink: 0;\n }\n\n .set-card[uploaded] md-icon {\n color: #2e7d32;\n }\n\n .set-card .set-main {\n flex: 1;\n min-width: 0;\n font-size: 13px;\n color: #555;\n }\n\n .set-card .set-main b {\n display: block;\n color: #333;\n margin-bottom: 2px;\n }\n\n .set-card .set-warn {\n font-size: 11px;\n color: #b7791f;\n }\n\n .progress-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 13px;\n color: #555;\n font-weight: 600;\n }\n\n .progress-bar {\n height: 6px;\n border-radius: 3px;\n background: #eee;\n overflow: hidden;\n }\n\n .progress-bar div {\n height: 100%;\n background: #7d2f2f;\n transition: width 0.3s;\n }\n\n .primary-button {\n width: 100%;\n border: none;\n border-radius: 8px;\n background: #7d2f2f;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n padding: 14px;\n cursor: pointer;\n }\n\n .primary-button:disabled {\n background: #ccc;\n cursor: default;\n }\n\n .text-button {\n border: 1px solid #ddd;\n border-radius: 8px;\n background: #fff;\n color: #555;\n font-size: 13px;\n padding: 8px 14px;\n cursor: pointer;\n }\n\n input[type='file'] {\n display: none;\n }\n\n /* โ”€โ”€โ”€ 2๋‹จ๊ณ„: ํŒ์ • ๊ฒฐ๊ณผ โ”€โ”€โ”€ */\n /* ๊ฒฐ๊ณผ ํ™”๋ฉด์€ ๋†’์ด๋ฅผ ํ™”๋ฉด์— ๊ณ ์ •ํ•˜๊ณ  ์ปฌ๋Ÿผ(ํ”„๋ ˆ์ž„/ํŒ์ • ๋ฆฌ์ŠคํŠธ/์ƒ์„ธ)๋ณ„๋กœ ๋‚ด๋ถ€ ์Šคํฌ๋กค */\n .result-body {\n display: flex;\n gap: 14px;\n flex: 1;\n min-height: 0;\n }\n\n .photo-pane {\n flex: 1.1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .photo-pane .caption {\n text-align: center;\n font-size: 12px;\n color: #999;\n }\n\n .photo-main {\n border-radius: 10px;\n overflow: hidden;\n background: #000;\n display: flex;\n justify-content: center;\n max-height: 480px;\n }\n\n .photo-main img {\n max-width: 100%;\n max-height: 480px;\n object-fit: contain;\n }\n\n .photo-thumbs {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding-bottom: 4px;\n }\n\n .photo-thumbs img {\n width: 96px;\n height: 72px;\n object-fit: cover;\n border-radius: 6px;\n cursor: pointer;\n border: 2px solid transparent;\n }\n\n .photo-thumbs img[selected] {\n border-color: #7d2f2f;\n }\n\n .items-pane {\n flex: 1.4;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 10px;\n overflow-y: auto;\n padding-right: 4px;\n }\n\n .photo-pane,\n .side-pane {\n overflow-y: auto;\n }\n\n .summary-banner {\n background: #f7e9e9;\n border: 1px solid #eedada;\n color: #7d2f2f;\n font-size: 13px;\n font-weight: 700;\n border-radius: 8px;\n padding: 10px 14px;\n }\n\n .group-title {\n font-size: 14px;\n font-weight: 700;\n color: #333;\n margin-top: 4px;\n }\n\n .group-subtitle {\n font-size: 12px;\n font-weight: 700;\n color: #777;\n margin: 2px 0 0 4px;\n }\n\n .item-card {\n display: flex;\n gap: 10px;\n align-items: flex-start;\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 12px;\n cursor: pointer;\n }\n\n .item-card[selected] {\n border-color: #7d2f2f;\n box-shadow: 0 0 0 1px #7d2f2f inset;\n }\n\n .item-no {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: #7d2f2f;\n color: #fff;\n font-size: 12px;\n font-weight: 700;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .item-main {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: 14px;\n font-weight: 700;\n color: #222;\n margin-bottom: 4px;\n }\n\n .item-desc {\n font-size: 12px;\n color: #777;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .chip {\n display: inline-block;\n font-size: 11px;\n font-weight: 700;\n border-radius: 4px;\n padding: 2px 6px;\n margin-right: 6px;\n background: #eef2f7;\n color: #3f71a0;\n }\n\n .chip-verdict {\n font-size: 12px;\n font-weight: 700;\n color: #555;\n }\n\n .badge {\n flex-shrink: 0;\n font-size: 12px;\n font-weight: 700;\n border-radius: 14px;\n padding: 5px 12px;\n white-space: nowrap;\n }\n\n .badge[pass] {\n background: #e8f5e9;\n color: #2e7d32;\n }\n\n .badge[fail] {\n background: #fdecea;\n color: #c62828;\n }\n\n .badge[etc] {\n background: #fff8e1;\n color: #b7791f;\n }\n\n .capture-button {\n flex-shrink: 0;\n border: none;\n border-radius: 14px;\n background: #fff3e0;\n color: #b7791f;\n font-size: 12px;\n font-weight: 700;\n padding: 6px 12px;\n cursor: pointer;\n }\n\n .measure-button {\n flex-shrink: 0;\n border: none;\n border-radius: 14px;\n background: #e8eef7;\n color: #2f5d8a;\n font-size: 12px;\n font-weight: 700;\n padding: 6px 12px;\n cursor: pointer;\n }\n\n /* โ”€โ”€โ”€ ์šฐ์ธก ํŒจ๋„ (์ƒ์„ธ/์žฌ์ดฌ์˜/์ธก์ •/๋ฆฌํฌํŠธ) โ”€โ”€โ”€ */\n .side-pane {\n flex: 1;\n min-width: 300px;\n max-width: 400px;\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .side-pane h3 {\n margin: 0;\n font-size: 16px;\n color: #222;\n }\n\n .detail-header {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .detail-header h3 {\n font-size: 18px;\n }\n\n .detail-summary {\n font-size: 12px;\n color: #555;\n line-height: 1.7;\n white-space: pre-line;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 10px;\n }\n\n .kv-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n }\n\n .kv {\n display: flex;\n flex-direction: column;\n gap: 2px;\n border: 1px solid #eee;\n border-radius: 8px;\n padding: 10px 12px;\n background: #fff;\n }\n\n .kv label {\n font-size: 11px;\n color: #999;\n }\n\n .kv span {\n font-size: 15px;\n font-weight: 700;\n color: #333;\n }\n\n .kv .verdict-value[pass] {\n color: #2e7d32;\n }\n\n .kv .verdict-value[fail] {\n color: #c62828;\n }\n\n .reason-box {\n display: flex;\n flex-direction: column;\n gap: 10px;\n font-size: 12px;\n line-height: 1.7;\n }\n\n .reason-verdict {\n border-left: 3px solid #7d2f2f;\n background: #fdf6f6;\n color: #333;\n padding: 8px 10px;\n }\n\n .evidence-img {\n width: 100%;\n border-radius: 8px;\n border: 1px solid #eee;\n }\n\n .why-box {\n background: #fff8e1;\n border: 1px solid #f4e4b5;\n border-radius: 8px;\n padding: 10px;\n font-size: 12px;\n color: #7a5c14;\n line-height: 1.6;\n }\n\n /* ์ธก์ • ํŒจ๋„ */\n .measure-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n color: #555;\n }\n\n .measure-field input,\n .measure-field select {\n padding: 9px 10px;\n border: 1px solid #ccc;\n border-radius: 6px;\n font-size: 14px;\n }\n\n .measure-msg {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: #7d2f2f;\n font-weight: 600;\n }\n\n .measure-msg md-circular-progress {\n --md-circular-progress-size: 22px;\n }\n\n .frame-strip {\n display: flex;\n gap: 6px;\n overflow-x: auto;\n padding-bottom: 4px;\n }\n\n .frame-strip img {\n height: 60px;\n border-radius: 6px;\n border: 2px solid transparent;\n cursor: pointer;\n opacity: 0.7;\n }\n\n .frame-strip img[selected] {\n border-color: #7d2f2f;\n opacity: 1;\n }\n\n .click-stage {\n position: relative;\n line-height: 0;\n }\n\n .click-stage img {\n width: 100%;\n border-radius: 8px;\n cursor: crosshair;\n }\n\n .click-dot {\n position: absolute;\n width: 24px;\n height: 24px;\n margin: -12px 0 0 -12px;\n border: 3px solid #ffd400;\n border-radius: 50%;\n pointer-events: none;\n }\n\n .measure-summary {\n background: #f7f7f7;\n border-radius: 8px;\n padding: 10px;\n font-size: 12px;\n color: #333;\n line-height: 1.7;\n white-space: pre-line;\n }\n\n .report-counts {\n display: flex;\n text-align: center;\n border: 1px solid #eee;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .report-counts div {\n flex: 1;\n padding: 10px 0;\n }\n\n .report-counts b {\n display: block;\n font-size: 20px;\n }\n\n .report-counts small {\n font-size: 11px;\n color: #888;\n }\n\n .report-counts div[pass] b {\n color: #2e7d32;\n }\n\n .report-counts div[fail] b {\n color: #c62828;\n }\n\n .report-counts div[etc] b {\n color: #b7791f;\n }\n\n .report-item {\n border-bottom: 1px solid #f0f0f0;\n font-size: 13px;\n color: #333;\n }\n\n .report-head {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 0;\n cursor: pointer;\n }\n\n .report-head .report-text {\n flex: 1;\n min-width: 0;\n }\n\n .report-caret {\n --md-icon-size: 20px;\n color: #999;\n transition: transform 0.2s;\n }\n\n .report-caret[open] {\n transform: rotate(180deg);\n }\n\n .report-basis {\n display: flex;\n flex-direction: column;\n gap: 6px;\n font-size: 12px;\n color: #555;\n background: #f7f7f7;\n border-radius: 6px;\n padding: 10px;\n margin: 0 0 10px 0;\n }\n\n .report-basis .report-ai {\n white-space: pre-line;\n color: #333;\n }\n\n .report-basis .report-used {\n color: #888;\n }\n\n .report-item .verdict {\n font-weight: 700;\n flex-shrink: 0;\n }\n\n .report-item .verdict[pass] {\n color: #2e7d32;\n }\n\n .report-item .verdict[fail] {\n color: #c62828;\n }\n\n .report-item .verdict[etc] {\n color: #b7791f;\n }\n\n /* โ”€โ”€โ”€ ๋กœ๋”ฉ ์˜ค๋ฒ„๋ ˆ์ด โ”€โ”€โ”€ */\n .loading-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 2000;\n }\n\n .loading-overlay .box {\n background: #fff;\n padding: 32px 48px;\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n font-size: 14px;\n color: #555;\n }\n\n .empty-state {\n text-align: center;\n color: #999;\n font-size: 14px;\n padding: 60px 0;\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n\n @state() guide: any = null // plan-shots ์‘๋‹ต {shots, total_shots, markdown}\n @state() sets: (SetInfo | null)[] = [] // ์ดฌ์˜ ๊ฑด๋ณ„ ์—…๋กœ๋“œ๋œ ์„ธํŠธ (shots ์ˆœ์„œ)\n @state() photos: { file: File; url: string; setIndex: number }[] = [] // inspect์— ๋ณด๋‚ธ ๋Œ€ํ‘œ ํ”„๋ ˆ์ž„(ํ‘œ์‹œ/์ฒจ๋ถ€์šฉ)\n @state() result: any = null // inspect ์‘๋‹ต\n @state() mainPhotoIndex: number = 0\n\n @state() panel: PanelMode = 'none'\n @state() selectedItem: any = null\n @state() recaptureBase: number = 0 // ์žฌ๊ฒ€์‚ฌ ์ง„์ž… ์‹œ์ ์˜ ํ”„๋ ˆ์ž„ ์ˆ˜ (used_images ๋ณด์ •์šฉ)\n @state() recaptureSet: SetInfo | null = null // ์žฌ์ดฌ์˜์œผ๋กœ ์ƒˆ๋กœ ์˜ฌ๋ฆฐ ์„ธํŠธ\n @state() setPickerFor: number | null = null // ์„ธํŠธ ๊ณ ๋ฅด๋Š” ์ค‘์ธ ์ดฌ์˜ ๋ฒˆํ˜ธ (-1 = ์žฌ์ดฌ์˜)\n @state() recentSets: any[] = [] // ์ธก์ • ์„œ๋ฒ„์— ์˜ฌ๋ผ์˜จ ์ตœ๊ทผ ์„ธํŠธ (์•ฑ์ด ์ดฌ์˜ ์งํ›„ ์ž๋™ ์ „์†ก)\n @state() recentLoading: boolean = false\n @state() expandedReportId: string | null = null // ์ข…ํ•ฉ ๋ฆฌํฌํŠธ์—์„œ ํŽผ์นœ ํ•ญ๋ชฉ(์•„์ฝ”๋””์–ธ)\n\n /* ์ธก์ • ํŒจ๋„ ์ƒํƒœ */\n @state() measureSetIndex: number = 0\n @state() measureInputs: Record<string, string> = {}\n @state() measureRunning: boolean = false\n @state() measureMsg: string = ''\n @state() measureResult: any = null // ์ธก์ • ์„œ๋ฒ„ ์›๋ณธ ์‘๋‹ต โ€” apply-measurement์— ๊ฐ€๊ณต ์—†์ด ์ „๋‹ฌ\n @state() measureImageUrl: string = '' // ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€(์˜ค๋ฒ„๋ ˆ์ด/๊ฒฐ๊ณผ์‚ฌ์ง„)\n @state() thicknessFrames: { slot: number; index: number; thumbUrl?: string }[] = []\n @state() thicknessSlot: number | null = null\n @state() thicknessFrameUrl: string = ''\n @state() thicknessClick: { x: number; y: number } | null = null\n\n @state() loading: boolean = false\n @state() loadingText: string = ''\n /** ๋ฎคํ…Œ์ด์…˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€('dcsp guest' ๊ถŒํ•œ ๋ณด์œ  ์‹œ false) โ€” ๊ฒŒ์ŠคํŠธ์—๊ฒŒ๋Š” ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ ๋ฒ„ํŠผ์„ ์ˆจ๊ธด๋‹ค */\n @state() private canMutate = false\n\n @query('#setInput') private setInputEl!: HTMLInputElement\n\n /* ์„ธํŠธ ์—…๋กœ๋“œ ๋Œ€์ƒ: ์ดฌ์˜ ๊ฑด ์ธ๋ฑ์Šค(๊ฐ€์ด๋“œ ํ™”๋ฉด) ๋˜๋Š” -1(์žฌ์ดฌ์˜ ํŒจ๋„) */\n private pendingSetIndex: number | null = null\n private objectUrls: string[] = [] // ํŽ˜์ด์ง€ ์ดํƒˆ ์‹œ ์ •๋ฆฌํ•  blob URL๋“ค\n\n /* ์ดฌ์˜ ์•ฑ์— ๋‹ค๋…€์˜จ ๋’ค ํ™”๋ฉด์ด ๋‹ค์‹œ ๋ณด์ด๋ฉด ์˜ฌ๋ผ์˜จ ์„ธํŠธ๋ฅผ ์ฐพ์•„ ์ž๋™ ๋“ฑ๋กํ•œ๋‹ค */\n private _onVisible = () => {\n if (document.visibilityState === 'visible' && this.guide && !this.result) this._autoAttachTaggedSets()\n }\n\n async connectedCallback() {\n super.connectedCallback()\n document.addEventListener('visibilitychange', this._onVisible)\n this.canMutate = await canDcspMutate()\n this.updateContext()\n }\n\n disconnectedCallback() {\n document.removeEventListener('visibilitychange', this._onVisible)\n super.disconnectedCallback()\n }\n\n get context() {\n return {\n title: '๊ฒ€์ธก ๊ด€๋ฆฌ ์ƒ์„ธ - AI ์ž๋™ ๊ฒ€์ธก'\n }\n }\n\n /* ์—”์ง„์— ๋ณด๋‚ผ ๊ฒ€์ธก์š”์ฒญ์„œ: ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ โ†’ {item_id, category, text} */\n get engineChecklist() {\n const items = this.buildingInspection?.checklist?.checklistItems || []\n return [...items]\n .filter(item => (item.name || '').trim()) // ์ด๋ฆ„ ์—†๋Š” ํ•ญ๋ชฉ์€ ๊ฒ€์ธก ๋ถˆ๊ฐ€ โ€” ์—”์ง„ ๊ฒ€์ฆ ์‹คํŒจ ๋ฐฉ์ง€\n .sort((a, b) => (a.sequence || 0) - (b.sequence || 0))\n .map(item => ({\n item_id: item.id,\n category: [item.mainType, item.detailType].filter(Boolean).join(' ยท '),\n text: item.name || ''\n }))\n }\n\n get uploadedSets(): SetInfo[] {\n return this.sets.filter((s): s is SetInfo => !!s)\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n .projectId=${this.project.id}\n ></building-inspection-detail-header>\n\n <div body>\n <div class=\"page-title\">\n AI ์ž๋™ ๊ฒ€์ธก โ€“ ${this.buildingInspection?.checklist?.location || ''}\n <span target>${this.buildingInspection?.checklist?.name || ''}</span>\n </div>\n\n ${this.result ? this._renderResult() : this._renderGuide()}\n </div>\n\n <!-- ์„ธํŠธ ํŒŒ์ผ ์„ ํƒ: video.mov/poses.jsonl/meta.json 3๊ฐœ ๋ฉ€ํ‹ฐ์„ ํƒ ๋˜๋Š” zip 1๊ฐœ -->\n <input\n id=\"setInput\"\n type=\"file\"\n accept=\".mov,.jsonl,.json,.zip,video/quicktime\"\n multiple\n @change=${this._onSetFilesSelected}\n />\n\n ${\n this.loading\n ? html`\n <div class=\"loading-overlay\">\n <div class=\"box\">\n <md-circular-progress indeterminate></md-circular-progress>\n <span>${this.loadingText}</span>\n </div>\n </div>\n `\n : ''\n }\n `\n }\n\n /* โ”€โ”€โ”€ 1๋‹จ๊ณ„: ์ดฌ์˜ ๊ฐ€์ด๋“œ + ์„ธํŠธ ์—…๋กœ๋“œ ํ™”๋ฉด โ”€โ”€โ”€ */\n private _renderGuide() {\n if (!this.guide) {\n return html`<div class=\"empty-state\">์ดฌ์˜ ๊ฐ€์ด๋“œ๋ฅผ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค...</div>`\n }\n\n const shots = this.guide.shots || []\n const total = this.guide.total_shots || shots.length\n const uploaded = this.uploadedSets.length\n const current = shots[Math.min(uploaded, shots.length - 1)]\n const done = uploaded >= total\n\n return html`\n <div class=\"guide-container\">\n <div class=\"step-badge\">๋™์˜์ƒ ${Math.min(uploaded + 1, total)}/${total} ยท ${current?.target || '์ดฌ์˜'}</div>\n <div class=\"guide-title\">${current?.target || ''}${done ? ' ์ดฌ์˜ ์™„๋ฃŒ' : ''}</div>\n <div class=\"guide-desc\">\n ์ „์šฉ ์ดฌ์˜ ์•ฑ(LidarInspector)์œผ๋กœ ๋™์˜์ƒ์„ ์ดฌ์˜ํ•œ ๋’ค, ์•ฑ์ด ๋งŒ๋“  ํŒŒ์ผ 3๊ฐœ(video.movยทposes.jsonlยทmeta.json)๋ฅผ ์ดฌ์˜ ๊ฑด๋งˆ๋‹ค\n ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”. ์ผ๋ฐ˜ ์นด๋ฉ”๋ผ ๋™์˜์ƒ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n </div>\n\n <div class=\"card\">\n <h4>์ดฌ์˜ ๊ฐ€์ด๋“œ (๋™์˜์ƒ ${total}๊ฑด)</h4>\n <ul>\n ${shots.map(s => html`<li>์ดฌ์˜ ${s.shot_no || ''} ยท ${s.target} โ€” ${s.how}</li>`)}\n </ul>\n </div>\n\n <div class=\"card\">\n <h4>๊ณตํ†ต ์ดฌ์˜๋ฒ• โ€” ์˜†์œผ๋กœ ์ด๋™ ยท ๋Œ€์ƒ ์ •๋ฉด ์œ ์ง€ ยท ๋Œ€์ƒ ์ „์ฒด ํฌํ•จ</h4>\n <img class=\"capture-guide-img\" src=${captureGuideImg} alt=\"์ดฌ์˜ ์•ˆ๋‚ด\" />\n </div>\n\n <div class=\"card\" style=\"display: flex; flex-direction: column; gap: 10px;\">\n <div class=\"progress-row\">\n <span>์ดฌ์˜ ์„ธํŠธ ์—…๋กœ๋“œ</span>\n <span>${uploaded} / ${total}</span>\n </div>\n <div class=\"progress-bar\"><div style=\"width: ${total ? (uploaded / total) * 100 : 0}%\"></div></div>\n ${shots.map((s, i) => {\n const set = this.sets[i]\n return html`\n <div class=\"set-card\" ?uploaded=${!!set} @click=${() => !set && this._openSetChooser(i)}>\n <md-icon>${set ? 'check_circle' : 'video_file'}</md-icon>\n <div class=\"set-main\">\n <b>์ดฌ์˜ ${s.shot_no || i + 1} ยท ${s.target}</b>\n ${\n set\n ? html`์„ธํŠธ ์—ฐ๊ฒฐ ์™„๋ฃŒ (${set.setId}) ${set.warnings.map(w => html`<div class=\"set-warn\">โš  ${w}</div>`)}`\n : html`ใ€Œ์•ฑ์œผ๋กœ ์ดฌ์˜ใ€์„ ๋ˆ„๋ฅด๋ฉด ์ดฌ์˜ ํ›„ ์ด ์นธ์— ์ž๋™ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค ยท ํƒญํ•˜๋ฉด ์ง์ ‘ ์„ ํƒ`\n }\n </div>\n ${\n set\n ? html`<button\n class=\"text-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openSetChooser(i)\n }}\n >\n ๊ต์ฒด\n </button>`\n : html`<a class=\"shoot-link\" href=${this._shotAppLink(s, i)} @click=${(e: Event) => e.stopPropagation()}>\n <md-icon>photo_camera</md-icon>์•ฑ์œผ๋กœ ์ดฌ์˜\n </a>`\n }\n </div>\n ${this.setPickerFor === i ? this._renderSetChooser(i) : ''}\n `\n })}\n </div>\n\n <button class=\"primary-button\" ?disabled=${uploaded === 0} @click=${() => this._runInspection()}>\n AI ์ž๋™ ํŒ์ • ์‹คํ–‰ ${uploaded ? `(์„ธํŠธ ${uploaded}/${total})` : ''}\n </button>\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ 2๋‹จ๊ณ„: ํŒ์ • ๊ฒฐ๊ณผ ํ™”๋ฉด โ”€โ”€โ”€ */\n\n /* ํ•ญ๋ชฉ ๊ทธ๋ฃน: auto(ํŒ์ •์™„๋ฃŒ) / recapture(์žฌ์ดฌ์˜) / measure(๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ) / manual(AI ๋ฏธ์ง€์›ยท์˜ค๋ฅ˜) */\n private _groupOf(item: any): 'auto' | 'recapture' | 'measure' | 'manual' {\n if (item.verdict === 'pass' || item.verdict === 'fail') return 'auto'\n if (item.verdict === 'hold') return 'recapture'\n if (item.verdict === 'pending' && item.pending_reason === 'measure') return 'measure'\n return 'manual'\n }\n\n /* verdict โ†’ ํ™”๋ฉด ๋ผ๋ฒจ (pending์€ pending_reason์œผ๋กœ ์„ธ๋ถ„) */\n private _verdictLabel(item: any): string {\n if (item.verdict === 'pending') {\n return item.pending_reason === 'measure' ? '๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ ํ•„์š”' : 'AI ๋ฏธ์ง€์›'\n }\n return VERDICT_LABEL[item.verdict] || item.verdict\n }\n\n private _renderResult() {\n const items = this._sortedItems()\n const autoItems = items.filter(it => this._groupOf(it) === 'auto')\n const recaptureItems = items.filter(it => this._groupOf(it) === 'recapture')\n const measureItems = items.filter(it => this._groupOf(it) === 'measure')\n const manualItems = items.filter(it => this._groupOf(it) === 'manual')\n const moreCount = recaptureItems.length + measureItems.length + manualItems.length\n\n // ํด๋ฆญํ•œ ํ•ญ๋ชฉ์˜ used_images๋งŒ ํ‘œ์‹œ (์„ ํƒ ์—†์œผ๋ฉด ์ „์ฒด ํ•ญ๋ชฉ ํ•ฉ์ง‘ํ•ฉ). used_images๋Š” ์ „์ฒด ํ”„๋ ˆ์ž„ ๊ธฐ์ค€ 1-based\n const focusItems = this.selectedItem ? [this.selectedItem] : items\n const usedNos = new Set<number>()\n for (const it of focusItems) for (const n of it.used_images || []) usedNos.add(n)\n const usedPhotos = this.photos.map((photo, i) => ({ photo, no: i + 1 })).filter(x => usedNos.has(x.no))\n const mainPhoto = usedPhotos[this.mainPhotoIndex]\n\n let no = 0\n\n return html`\n <div class=\"result-body\">\n <div class=\"photo-pane\">\n <div class=\"caption\">ํŒ์ •์— ์‚ฌ์šฉ๋œ ํ”„๋ ˆ์ž„ (๋™์˜์ƒ์—์„œ ์ถ”์ถœ)</div>\n <div class=\"photo-main\">${mainPhoto ? html`<img src=${mainPhoto.photo.url} alt=\"ํ˜„์žฅ ํ”„๋ ˆ์ž„\" />` : ''}</div>\n <div class=\"photo-thumbs\">\n ${usedPhotos.map(\n (x, i) => html`\n <img\n src=${x.photo.url}\n alt=\"ํ”„๋ ˆ์ž„ ${x.no}\"\n ?selected=${i === this.mainPhotoIndex}\n @click=${() => (this.mainPhotoIndex = i)}\n />\n `\n )}\n </div>\n </div>\n\n <div class=\"items-pane\">\n <div class=\"summary-banner\">\n ์ ์šฉ ํ•ญ๋ชฉ ${items.length}๊ฐœ ยท ์ž๋™ ํŒ์ • ${autoItems.length}๊ฐœ ยท ์ถ”๊ฐ€ ์ž‘์—… ${moreCount}๊ฐœ\n </div>\n\n ${\n autoItems.length\n ? html`\n <div class=\"group-title\">์ž๋™ ํŒ์ • ์™„๋ฃŒ (${autoItems.length})</div>\n ${autoItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n moreCount\n ? html`\n <div class=\"group-title\">์ถ”๊ฐ€ ์ž‘์—… ํ•„์š” (${moreCount} ๋‚จ์Œ)</div>\n ${\n recaptureItems.length\n ? html`\n <div class=\"group-subtitle\">์žฌ์ดฌ์˜ ํ•„์š” (${recaptureItems.length})</div>\n ${recaptureItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n measureItems.length\n ? html`\n <div class=\"group-subtitle\">๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ ํ•„์š” โ€” 3D ๊ณ„์ธก (${measureItems.length})</div>\n ${measureItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n manualItems.length\n ? html`\n <div class=\"group-subtitle\">AI ๋ฏธ์ง€์› โ€” ๊ฐ๋ฆฌ์ž ์ˆ˜๋™ ํ™•์ธ (${manualItems.length})</div>\n ${manualItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n `\n : ''\n }\n\n <button class=\"primary-button\" @click=${this._openReport}>์ข…ํ•ฉ ๊ฒ€์‚ฌ ๋ฆฌํฌํŠธ</button>\n </div>\n\n ${this.panel !== 'none' ? this._renderSidePane() : ''}\n </div>\n `\n }\n\n private _renderItemCard(item: any, no: number) {\n const group = this._groupOf(item)\n // ์ธก์ • ์™„๋ฃŒ ํ•ญ๋ชฉ์€ summary(์ธก์ • ํ•œ ์ค„ ์„ค๋ช…)๋ฅผ ์ž๋ฅด์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ, VLM ํ•ญ๋ชฉ์€ ๊ด€์ฐฐ/์‚ฌ์œ \n const desc =\n item.measurements && item.reason\n ? item.reason\n : item.observation\n ? `๊ด€์ฐฐ: ${item.observation}`\n : item.reason || item.measure?.question || ''\n\n return html`\n <div class=\"item-card\" ?selected=${this.selectedItem?.item_id === item.item_id} @click=${() => this._openDetail(item)}>\n <div class=\"item-no\">${no}</div>\n <div class=\"item-main\">\n <div class=\"item-name\">${item.text}</div>\n <div>\n ${\n group === 'auto'\n ? html`<span class=\"chip\">${ROUTING_LABEL[item.routing] || item.routing}</span>\n <span class=\"chip-verdict\">${this._verdictLabel(item)}</span>`\n : group === 'recapture'\n ? html`<span class=\"chip\">์ถ”๊ฐ€ ์ดฌ์˜ ํ•„์š”</span>`\n : group === 'measure'\n ? html`<span class=\"chip\">AI ์ธก์ • ๋ชจ๋ธ</span> <span class=\"chip-verdict\">๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ ํ•„์š”</span>`\n : html`<span class=\"chip\">๋ฏธ์ง€์›</span>`\n }\n </div>\n <div class=\"item-desc\">${desc}</div>\n </div>\n ${\n group === 'auto'\n ? html`\n <div class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${VERDICT_LABEL[item.verdict]}\n </div>\n `\n : group === 'recapture'\n ? html`\n <button\n class=\"capture-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openRecapture(item)\n }}\n >\n ์ดฌ์˜ํ•˜๊ธฐ\n </button>\n `\n : group === 'measure'\n ? html`\n <button\n class=\"measure-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openMeasure(item)\n }}\n >\n ${item.measure?.next_action === 'select_and_input' ? '์ธก์ • ์ง„ํ–‰' : '๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ'}\n </button>\n `\n : html`<div class=\"badge\" etc>${this._verdictLabel(item)}</div>`\n }\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ ์šฐ์ธก ํŒจ๋„: ์ƒ์„ธ / ์žฌ์ดฌ์˜ / ์ธก์ • / ๋ฆฌํฌํŠธ โ”€โ”€โ”€ */\n private _renderSidePane() {\n if (this.panel === 'detail' && this.selectedItem) return this._renderDetailPane(this.selectedItem)\n if (this.panel === 'recapture' && this.selectedItem) return this._renderRecapturePane(this.selectedItem)\n if (this.panel === 'measure' && this.selectedItem) return this._renderMeasurePane(this.selectedItem)\n if (this.panel === 'report') return this._renderReportPane()\n return ''\n }\n\n private _renderDetailPane(item: any) {\n const auto = item.verdict === 'pass' || item.verdict === 'fail'\n const routingLabel = ROUTING_LABEL[item.routing] || item.routing\n const verdictLabel = this._verdictLabel(item)\n const measured = !!item.measurements // ์ธก์ • ๋ชจ๋ธ๋กœ ํŒ์ •๋œ ํ•ญ๋ชฉ โ€” ์‹ ๋ขฐ๋„๋Š” ํ™•๋ฅ ์ด ์—†์–ด ๋น„์šด๋‹ค\n\n return html`\n <div class=\"side-pane\">\n <div class=\"detail-header\">\n <span class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'} ?etc=${!auto}>\n ${routingLabel}\n </span>\n <h3>${verdictLabel}</h3>\n </div>\n <div class=\"detail-summary\">${(item.observation || item.ai_report || '').trim()}</div>\n <div class=\"kv-grid\">\n <div class=\"kv\">\n <label>ํŒ์ •</label>\n <span class=\"verdict-value\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${verdictLabel || '-'}\n </span>\n </div>\n ${\n !measured && item.confidence != null\n ? html`\n <div class=\"kv\">\n <label>์‹ ๋ขฐ๋„</label>\n <span>${Math.round(item.confidence * 100)}%</span>\n </div>\n `\n : ''\n }\n <div class=\"kv\">\n <label>์ฒ˜๋ฆฌ</label>\n <span>${routingLabel || '-'}</span>\n </div>\n </div>\n\n <div class=\"reason-box\">\n <div class=\"reason-verdict\">\n <label style=\"font-size: 11px;color: #7d2f2f; display: block; font-weight: bold;\">ํŒ๋‹จ ๊ทผ๊ฑฐ</label>\n ${item.reason}\n </div>\n </div>\n\n ${item.image_data ? html`<img class=\"evidence-img\" src=${item.image_data} alt=\"์ธก์ • ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€\" />` : ''}\n\n <button class=\"text-button\" @click=${this._closePanel}>๋‹ซ๊ธฐ</button>\n </div>\n `\n }\n\n private _renderRecapturePane(item: any) {\n const shot = item.recapture_shots?.[0]\n\n return html`\n <div class=\"side-pane\">\n <h3>${item.text}</h3>\n <div class=\"why-box\">\n <b>์™œ ์žฌ์ดฌ์˜์ด ํ•„์š”ํ•œ๊ฐ€์š”?</b><br />\n ${item.reason || 'ํŒ์ •์„ ์œ„ํ•ด ์ถ”๊ฐ€ ์ดฌ์˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'}\n </div>\n ${\n shot\n ? html`\n <div>\n <h4 style=\"margin: 0 0 8px 0; font-size: 13px;\">์ดฌ์˜ ๊ฐ€์ด๋“œ</h4>\n <div style=\"font-size: 12px; color: #555;\">${shot.target} โ€” ${shot.how}</div>\n </div>\n `\n : ''\n }\n <div class=\"app-links\">\n <span>์•ฑ์œผ๋กœ ์žฌ์ดฌ์˜</span>\n <a href=${`${appCaptureLink(this._shotTechnique(shot))}&set=${encodeURIComponent(this._shotTag(0))}`}> ์ดฌ์˜ ์‹œ์ž‘ </a>\n </div>\n <div class=\"set-card\" ?uploaded=${!!this.recaptureSet} @click=${() => this._openSetChooser(-1)}>\n <md-icon>${this.recaptureSet ? 'check_circle' : 'video_file'}</md-icon>\n <div class=\"set-main\">\n <b>์žฌ์ดฌ์˜ ์„ธํŠธ</b>\n ${\n this.recaptureSet\n ? html`์„ธํŠธ ์—…๋กœ๋“œ ์™„๋ฃŒ ${this.recaptureSet.warnings.map(w => html`<div class=\"set-warn\">โš  ${w}</div>`)}`\n : html`์•ฑ์œผ๋กœ ์žฌ์ดฌ์˜ํ•œ ์„ธํŠธ๋ฅผ ์„ ํƒ (๋˜๋Š” ํŒŒ์ผ ์ง์ ‘ ์„ ํƒ)`\n }\n </div>\n </div>\n ${this.setPickerFor === -1 ? this._renderSetChooser(-1) : ''}\n ${\n this.recaptureSet ? html`<button class=\"primary-button\" @click=${() => this._runInspection()}>์žฌ๊ฒ€์‚ฌ ์‹คํ–‰</button>` : ''\n }\n <button class=\"text-button\" @click=${this._closePanel}>๋‹ซ๊ธฐ</button>\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ ์ธก์ • ํŒจ๋„ (โ‘ฃ ์ฒ ๊ทผ ๋ฐฐ๊ทผ ๊ธธ์ด / โ‘ค ๊ธฐ๋‘ฅยท๋ฒฝ์ฒด ๋‘๊ป˜) โ”€โ”€โ”€ */\n\n /* operator_inputs ์ •์˜ ๊ธฐ๋ฐ˜ ์ˆซ์ž/ํ…์ŠคํŠธ ์ž…๋ ฅ ๋ Œ๋” (slotยทclickยทn_frames๋Š” ๋ณ„๋„ UI/๊ณ ์ •) */\n private _renderMeasureFields(item: any) {\n const defs = item.measure?.operator_inputs || []\n const fields: { key: string; label: string; desc?: string; def?: any }[] = []\n for (const d of defs) {\n if (d.key === 'n_frames' || d.key === 'slot' || d.key === 'click') continue\n if (d.fields) {\n // ๋ณตํ•ฉ ์ž…๋ ฅ(targets ๋“ฑ): ํ•˜์œ„ ํ•„๋“œ๋ฅผ ๊ฐ๊ฐ ์ž…๋ ฅ์œผ๋กœ ํŽผ์นœ๋‹ค\n for (const [k, desc] of Object.entries(d.fields)) {\n if (k === 'name') continue // ๋ถ€์žฌ๋ช…์€ ๊ฒ€์‚ฌ ํ•ญ๋ชฉ๋ช…์œผ๋กœ ์ž๋™ ์ง€์ •\n fields.push({ key: k, label: FIELD_LABEL[k] || k, desc: String(desc) })\n }\n } else {\n fields.push({ key: d.key, label: FIELD_LABEL[d.key] || d.key, desc: d.desc, def: d.default })\n }\n }\n return fields.map(\n f => html`\n <div class=\"measure-field\">\n <label title=${f.desc || ''}>${f.label}${f.desc ? html` <span style=\"color:#aaa\">โ€” ${f.desc}</span>` : ''}</label>\n <input\n type=\"number\"\n inputmode=\"decimal\"\n .value=${this.measureInputs[f.key] ?? (f.def != null ? String(f.def) : '')}\n placeholder=\"๋„๋ฉด๊ฐ’\"\n @input=${(e: Event) => {\n this.measureInputs = { ...this.measureInputs, [f.key]: (e.target as HTMLInputElement).value }\n }}\n />\n </div>\n `\n )\n }\n\n private _renderMeasurePane(item: any) {\n const measure = item.measure || {}\n const isThickness = measure.next_action === 'select_and_input'\n const setOptions = this.uploadedSets\n const done = !!this.measureResult\n\n return html`\n <div class=\"side-pane\">\n <h3>${item.text}</h3>\n <div class=\"detail-header\">\n <span class=\"chip\">3D ๊ณ„์ธก</span>\n <span style=\"font-size: 12px; color: #777;\">${measure.name || ''} (${measure.status || ''})</span>\n </div>\n ${measure.capture_guide ? html`<div class=\"why-box\">๐Ÿ“ท ${measure.capture_guide}</div>` : ''}\n <img\n class=\"capture-guide-img\"\n style=\"background: #fff; border: 1px solid #eee; padding: 6px;\"\n src=${isThickness ? pictoMemberImg : pictoRebarImg}\n alt=\"์ดฌ์˜ ์•ˆ๋‚ด\"\n />\n\n ${\n setOptions.length > 1\n ? html`\n <div class=\"measure-field\">\n <label>์ธก์ •ํ•  ์ดฌ์˜ ์„ธํŠธ</label>\n <select\n .value=${String(this.measureSetIndex)}\n @change=${(e: Event) => this._onMeasureSetChange(parseInt((e.target as HTMLSelectElement).value))}\n >\n ${setOptions.map(\n (s, i) =>\n html`<option value=${i} ?selected=${i === this.measureSetIndex}>\n ์„ธํŠธ ${i + 1}${s.technique ? ` (${s.technique})` : ''}\n </option>`\n )}\n </select>\n </div>\n `\n : ''\n }\n ${isThickness ? this._renderThicknessPicker() : ''} ${this._renderMeasureFields(item)}\n ${\n this.measureRunning\n ? html`\n <div class=\"measure-msg\">\n <md-circular-progress indeterminate></md-circular-progress>\n <span>${this.measureMsg || '์ธก์ • ์ค‘...'}</span>\n </div>\n `\n : html`\n <button\n class=\"primary-button\"\n ?disabled=${isThickness && (this.thicknessSlot === null || !this.thicknessClick)}\n @click=${() => (isThickness ? this._runThicknessMeasure(item) : this._runRebarMeasure(item))}\n >\n ${done ? '๋‹ค์‹œ ์ธก์ •' : isThickness ? '์ธก์ • ์‹คํ–‰ (30~40์ดˆ)' : '์ธก์ • ์‹œ์ž‘ (์•ฝ 45์ดˆ)'}\n </button>\n `\n }\n ${\n done\n ? html`\n ${\n this.measureResult.summary || this.measureResult.summary_line || this.measureResult.headline\n ? html`<div class=\"measure-summary\">\n ${this.measureResult.summary || this.measureResult.summary_line || this.measureResult.headline}\n </div>`\n : ''\n }\n ${this.measureImageUrl ? html`<img class=\"evidence-img\" src=${this.measureImageUrl} alt=\"์ธก์ • ๊ทผ๊ฑฐ\" />` : ''}\n ${\n this.canMutate\n ? html`<button class=\"primary-button\" @click=${() => this._applyMeasurement(item)}>ํŒ์ • ํ™•์ •</button>`\n : ''\n }\n `\n : ''\n }\n\n <button class=\"text-button\" @click=${this._closePanel}>๋‹ซ๊ธฐ</button>\n </div>\n `\n }\n\n /* โ‘ค ๋‘๊ป˜: ํ”„๋ ˆ์ž„ ์„ ํƒ + ์ธก์ •๋ฉด ํด๋ฆญ (์ž๋™ ๋ฉด ์„ ํƒ์€ ์ •ํ™•๋„๊ฐ€ ๋‚ฎ์•„ ํด๋ฆญ ๋‹จ๊ณ„ ์ƒ๋žต ๋ถˆ๊ฐ€) */\n private _renderThicknessPicker() {\n return html`\n <div class=\"measure-field\">\n <label>โ‘  ๋ชจ์„œ๋ฆฌ๊ฐ€ ์ž˜ ๋ณด์ด๋Š” ํ”„๋ ˆ์ž„์„ ๊ณ ๋ฅด์„ธ์š”</label>\n <div class=\"frame-strip\">\n ${this.thicknessFrames.map(\n f => html`\n <img\n src=${f.thumbUrl || ''}\n alt=\"ํ”„๋ ˆ์ž„ ${f.index}\"\n ?selected=${this.thicknessSlot === f.slot}\n @click=${() => this._selectThicknessFrame(f.slot)}\n />\n `\n )}\n </div>\n </div>\n ${\n this.thicknessFrameUrl\n ? html`\n <div class=\"measure-field\">\n <label>โ‘ก ์žด ๋ฉด์˜ ๊ฐ€์šด๋ฐ๋ฅผ ํ•œ ๋ฒˆ ํƒญํ•˜์„ธ์š” (๋ชจ์„œ๋ฆฌยท์ฒ ๊ทผ ์œ„ ๋ง๊ณ  <b>๋ฉด ์œ„</b>)</label>\n <div class=\"click-stage\">\n <img src=${this.thicknessFrameUrl} alt=\"์„ ํƒ ํ”„๋ ˆ์ž„\" @click=${this._onThicknessClick} />\n ${\n this.thicknessClick\n ? html`<div\n class=\"click-dot\"\n style=\"left: ${this.thicknessClick.x * 100}%; top: ${this.thicknessClick.y * 100}%\"\n ></div>`\n : ''\n }\n </div>\n </div>\n `\n : ''\n }\n `\n }\n\n private _renderReportPane() {\n const items = this._sortedItems()\n const summary = this.result?.summary || {}\n const etcCount = (summary.hold || 0) + (summary.pending || 0) + (summary.error || 0)\n\n return html`\n <div class=\"side-pane\">\n <h3>์ข…ํ•ฉ ๊ฒ€์‚ฌ ๋ฆฌํฌํŠธ</h3>\n <div class=\"report-counts\">\n <div pass><b>${summary.pass || 0}</b><small>์ ํ•ฉ</small></div>\n <div fail><b>${summary.fail || 0}</b><small>๋ถ€์ ํ•ฉ</small></div>\n <div etc><b>${etcCount}</b><small>๋ฏธ๊ฒ€์‚ฌ</small></div>\n </div>\n <div style=\"overflow-y: auto; max-height: 380px;\">\n ${items.map((it, i) => {\n const expanded = this.expandedReportId === it.item_id\n return html`\n <div class=\"report-item\">\n <div class=\"report-head\" @click=${() => this._toggleReportItem(it.item_id)}>\n <span class=\"report-text\">${i + 1}. ${it.text}</span>\n <span\n class=\"verdict\"\n ?pass=${it.verdict === 'pass'}\n ?fail=${it.verdict === 'fail'}\n ?etc=${it.verdict !== 'pass' && it.verdict !== 'fail'}\n >\n ${this._verdictLabel(it)}\n </span>\n <md-icon class=\"report-caret\" ?open=${expanded}>expand_more</md-icon>\n </div>\n ${\n expanded\n ? html`\n <div class=\"report-basis\">\n ${it.ai_report ? html`<div class=\"report-ai\">${(it.ai_report || '').trim()}</div>` : ''}\n ${it.observation ? html`<div>๊ด€์ฐฐ: ${it.observation}</div>` : ''}\n ${it.reason ? html`<div>ํŒ๋‹จ: ${it.reason}</div>` : ''}\n ${\n it.used_images?.length\n ? html`<div class=\"report-used\">๊ทผ๊ฑฐ ํ”„๋ ˆ์ž„: ${it.used_images.map(n => `#${n}`).join(', ')}</div>`\n : ''\n }\n </div>\n `\n : ''\n }\n </div>\n `\n })}\n </div>\n ${this.canMutate ? html`<button class=\"primary-button\" @click=${this._registerInspection}>๊ฒ€์‚ฌ ๋“ฑ๋ก</button>` : ''}\n <button class=\"text-button\" @click=${this._closePanel}>๋‹ซ๊ธฐ</button>\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ ๋ผ์ดํ”„์‚ฌ์ดํด โ”€โ”€โ”€ */\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this._resetAll()\n this.buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(this.buildingInspectionId)\n await this._loadShotGuide()\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n checklist {\n id\n name\n location\n checklistItems {\n id\n sequence\n mainType\n detailType\n name\n }\n }\n buildingLevel {\n id\n floor\n building {\n id\n name\n buildingComplex {\n id\n }\n }\n }\n }\n }\n `,\n variables: { buildingInspectionId }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: { buildingComplexId }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n /* โ”€โ”€โ”€ ์„œ๋ฒ„ ํ˜ธ์ถœ ๊ณตํ†ต โ”€โ”€โ”€ */\n\n /* ์—”์ง„ ์‹คํ–‰ ๊ณตํ†ต ํ˜ธ์ถœ: input(JSON) + ํŒŒ์ผ๋“ค์„ multipart๋กœ ์ „์†ก */\n private async _callEngine(input: any, files: File[] = []) {\n const form = new FormData()\n form.append('input', JSON.stringify(input))\n for (const file of files) form.append('files', file, file.name)\n\n const response = await fetch(ENGINE_RUN_URL, {\n method: 'POST',\n headers: { Authorization: ENGINE_AUTH },\n body: form\n })\n const raw = await response.json()\n const data = raw?.result || {}\n if (data?.status !== 'success') {\n throw new Error(data?.error || raw?.error || 'AI ์—”์ง„ ํ˜ธ์ถœ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')\n }\n return data.result\n }\n\n /* ์ธก์ • ์„œ๋ฒ„ ํ˜ธ์ถœ (JSON ์‘๋‹ต) */\n private async _callMeasure(path: string, init: RequestInit = {}) {\n const response = await fetch(`${MEASURE_BASE_URL}${path}`, {\n ...init,\n headers: { ...((init.headers as any) || {}), Authorization: MEASURE_AUTH }\n })\n const data = await response.json().catch(() => ({}))\n if (!response.ok) {\n const msg = data?.errors?.join('\\n') || data?.detail || data?.error || `์ธก์ • ์„œ๋ฒ„ ์˜ค๋ฅ˜ (${response.status})`\n throw new Error(msg)\n }\n return data\n }\n\n /* ์ธก์ • ์„œ๋ฒ„ ์ด๋ฏธ์ง€ โ†’ blob URL (img src๋Š” ์ธ์ฆ ํ—ค๋”๋ฅผ ๋ชป ์‹ค์–ด์„œ fetch๋กœ ๋ฐ›๋Š”๋‹ค) */\n private async _fetchMeasureImage(path: string): Promise<string> {\n const response = await fetch(`${MEASURE_BASE_URL}${path}`, { headers: { Authorization: MEASURE_AUTH } })\n if (!response.ok) throw new Error(`์ด๋ฏธ์ง€ ์ˆ˜์‹  ์‹คํŒจ (${response.status})`)\n const url = URL.createObjectURL(await response.blob())\n this.objectUrls.push(url)\n return url\n }\n\n /* [1๋‹จ๊ณ„] ์ดฌ์˜ ๊ฐ€์ด๋“œ ์ƒ์„ฑ (plan-shots) */\n private async _loadShotGuide() {\n const checklist = this.engineChecklist\n if (!checklist.length) {\n notify({ message: '์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n\n try {\n this.loading = true\n this.loadingText = 'AI ์ดฌ์˜ ๊ฐ€์ด๋“œ ์ƒ์„ฑ ์ค‘...'\n this.guide = await this._callEngine({ action: 'plan-shots', checklist })\n this.sets = new Array((this.guide?.shots || []).length).fill(null)\n } catch (error) {\n console.error('์ดฌ์˜ ๊ฐ€์ด๋“œ ์ƒ์„ฑ ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* ์ดฌ์˜ ์นธ๋งˆ๋‹ค ๊ณ ์œ  ํƒœ๊ทธ โ€” ์•ฑ์— ๋ถ€์žฌ ID๋กœ ๋„˜๊ฒจ ๋‘๋ฉด, ์˜ฌ๋ผ์˜จ ์„ธํŠธ์˜ member_id๋กœ\n \"์–ด๋А ์ดฌ์˜ ์นธ์˜ ๊ฒƒ์ธ์ง€\" ๋˜์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค (์•ฑโ†”ํ”Œ๋žซํผ ์™•๋ณต์— ์‹๋ณ„์ž๊ฐ€ ์—†์–ด์„œ ์“ฐ๋Š” ๋ฐฉ๋ฒ•) */\n private _shotTag(shotNo: number) {\n return `${(this.buildingInspectionId || 'ins').replace(/-/g, '').slice(0, 6)}-${shotNo}`\n }\n\n /* ์ดฌ์˜ ์ง€์‹œ๋ฌธ์—์„œ ๊ธฐ์ˆ  ์ถ”๋ก  โ€” ์•ฑ์˜ ์ดฌ์˜ ์•ˆ๋‚ด๋งŒ ๋‹ฌ๋ผ์ง„๋‹ค(์ธก์ •์€ meta.technique๋ฅผ ์•ˆ ๋ด„) */\n private _shotTechnique(shot: any): 'cover' | 'thick' {\n const text = `${shot?.target || ''} ${shot?.how || ''}`\n if (/๋‘๊ป˜|์ฝ˜ํฌ๋ฆฌํŠธ\\s*๋ฉด|๊ฑฐํ‘ธ์ง‘|ํƒˆํ˜•|๋ฒฝ์ฒด\\s*๋ฉด/.test(text)) return 'thick'\n return 'cover'\n }\n\n private _shotAppLink(shot: any, index: number) {\n const tag = this._shotTag(shot?.shot_no || index + 1)\n return `${appCaptureLink(this._shotTechnique(shot))}&set=${encodeURIComponent(tag)}`\n }\n\n /* ์•ฑ์—์„œ ์ดฌ์˜ํ•˜๊ณ  ๋Œ์•„์˜ค๋ฉด ํƒœ๊ทธ๋กœ ์ฐพ์•„ ํ•ด๋‹น ์ดฌ์˜ ์นธ์— ์ž๋™ ๋“ฑ๋ก */\n private async _autoAttachTaggedSets() {\n if (!this.guide?.shots?.length) return\n await this._loadRecentSets()\n const used = new Set(this.uploadedSets.map(s => s.setId))\n let changed = false\n const next = [...this.sets]\n\n this.guide.shots.forEach((shot: any, i: number) => {\n if (next[i]) return\n const tag = this._shotTag(shot?.shot_no || i + 1)\n const hit = this.recentSets.find(s => s.member_id === tag && !used.has(s.set_id))\n if (!hit) return\n used.add(hit.set_id)\n next[i] = { setId: hit.set_id, technique: hit.technique, label: `์„ธํŠธ ${hit.set_id}`, warnings: [] }\n changed = true\n })\n\n if (changed) {\n this.sets = next\n notify({ message: '์ดฌ์˜ํ•œ ์„ธํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.' })\n }\n }\n\n /* ์„ธํŠธ ์„ ํƒ ๋ชฉ๋ก โ€” ์•ฑ์ด ์˜ฌ๋ฆฐ ์ตœ๊ทผ ์„ธํŠธ + ํŒŒ์ผ ์ง์ ‘ ์„ ํƒ ํด๋ฐฑ */\n private _renderSetChooser(index: number) {\n return html`\n <div class=\"set-chooser\">\n ${\n this.recentLoading\n ? html`<div class=\"chooser-empty\">๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...</div>`\n : this.recentSets.length\n ? this.recentSets.map(\n s => html`\n <button class=\"chooser-row\" @click=${() => this._pickExistingSet(index, s)}>\n <b>${_setTimeLabel(s.set_id)}</b>\n <span>\n ${s.member_id ? `${s.member_id} ยท ` : ''}${s.technique || '๊ธฐ์ˆ  ๋ฏธ์ƒ'}\n ${s.duration_sec ? ` ยท ${Math.round(s.duration_sec)}์ดˆ` : ''}\n </span>\n </button>\n `\n )\n : html`<div class=\"chooser-empty\">\n ์˜ฌ๋ผ์˜จ ์„ธํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์นด๋“œ์˜ ใ€Œ์•ฑ์œผ๋กœ ์ดฌ์˜ใ€์œผ๋กœ ์ฐ์œผ๋ฉด ์—ฌ๊ธฐ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.\n </div>`\n }\n <div class=\"chooser-actions\">\n <button class=\"text-button\" @click=${() => this._loadRecentSets()}>์ƒˆ๋กœ๊ณ ์นจ</button>\n <button class=\"text-button\" @click=${() => this._openSetPicker(index)}>ํŒŒ์ผ ์ง์ ‘ ์„ ํƒ</button>\n </div>\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ ์„ธํŠธ ์„ ํƒ/์—…๋กœ๋“œ โ”€โ”€โ”€ */\n\n /* ์ดฌ์˜ ์•ฑ์ด ์ธก์ • ์„œ๋ฒ„๋กœ ๋ฐ”๋กœ ์˜ฌ๋ฆฐ ์„ธํŠธ ๋ชฉ๋ก (์•ฑ์—์„œ ์ดฌ์˜ ํ›„ ์ €์žฅํ•˜๋ฉด ์ž๋™ ์ „์†ก๋œ๋‹ค) */\n private async _loadRecentSets() {\n try {\n this.recentLoading = true\n const data = await this._callMeasure('/api/sets?limit=20')\n this.recentSets = data.sets || []\n } catch (error) {\n console.error('์„ธํŠธ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ:', error)\n this.recentSets = []\n } finally {\n this.recentLoading = false\n }\n }\n\n /* ์นด๋“œ ํƒญ โ†’ ๋ชฉ๋ก ํŽผ์น˜๊ธฐ (์ด๋ฏธ ๊ณ ๋ฅธ ์„ธํŠธ๋Š” ์ œ์™ธํ•˜๊ณ  ๋ณด์—ฌ์ค€๋‹ค) */\n private _openSetChooser(index: number) {\n this.setPickerFor = this.setPickerFor === index ? null : index\n if (this.setPickerFor !== null) this._loadRecentSets()\n }\n\n /* ๋ชฉ๋ก์—์„œ ์„ธํŠธ ์„ ํƒ โ€” ์ด๋ฏธ ์„œ๋ฒ„์— ์žˆ์œผ๋ฏ€๋กœ ์—…๋กœ๋“œ ์—†์ด ์—ฐ๊ฒฐ๋งŒ ํ•œ๋‹ค */\n private _pickExistingSet(index: number, s: any) {\n const set: SetInfo = {\n setId: s.set_id,\n technique: s.technique,\n label: `์„ธํŠธ ${s.set_id}`,\n warnings: []\n }\n if (index === -1) {\n this.recaptureSet = set\n } else {\n const next = [...this.sets]\n next[index] = set\n this.sets = next\n }\n this.setPickerFor = null\n }\n\n private _openSetPicker(index: number) {\n this.pendingSetIndex = index\n this.setPickerFor = null\n this.setInputEl?.click()\n }\n\n private async _onSetFilesSelected(event: Event) {\n const input = event.target as HTMLInputElement\n const files = Array.from(input?.files || [])\n input.value = ''\n const index = this.pendingSetIndex\n this.pendingSetIndex = null\n if (!files.length || index === null) return\n\n // zip 1๊ฐœ ๋˜๋Š” ํ•„์ˆ˜ 3ํŒŒ์ผ ๊ฒ€์ฆ (ํ•œ ๋ฒˆ์˜ ์„ ํƒ์œผ๋กœ 3๊ฐœ ๋ฉ€ํ‹ฐ์„ ํƒ)\n const isZip = files.length === 1 && /\\.zip$/i.test(files[0].name)\n if (!isZip) {\n const names = files.map(f => f.name.toLowerCase())\n const missing = SET_FILES.filter(n => !names.includes(n))\n if (missing.length) {\n notify({\n message: `์„ธํŠธ ํŒŒ์ผ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ: ${missing.join(', ')} โ€” ์ดฌ์˜ ์•ฑ์ด ๋งŒ๋“  3๊ฐœ ํŒŒ์ผ์„ ํ•œ ๋ฒˆ์— ์„ ํƒํ•ด์ฃผ์„ธ์š”.`,\n level: 'warn'\n })\n return\n }\n }\n\n try {\n this.loading = true\n this.loadingText = '์ดฌ์˜ ์„ธํŠธ ์—…๋กœ๋“œ ์ค‘...'\n const form = new FormData()\n for (const f of files) if (isZip || SET_FILES.includes(f.name.toLowerCase())) form.append('files', f, f.name)\n const data = await this._callMeasure('/api/sets', { method: 'POST', body: form })\n\n const set: SetInfo = {\n setId: data.set_id,\n technique: data.technique,\n label: `์„ธํŠธ ${data.set_id}`,\n warnings: data.warnings || []\n }\n if (index === -1) {\n this.recaptureSet = set\n } else {\n const next = [...this.sets]\n next[index] = set\n this.sets = next\n }\n for (const w of set.warnings) notify({ message: `์—…๋กœ๋“œ ๊ฒฝ๊ณ : ${w}`, level: 'warn' })\n } catch (error) {\n console.error('์„ธํŠธ ์—…๋กœ๋“œ ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* ์„ธํŠธ์˜ ๋Œ€ํ‘œ 3ํ”„๋ ˆ์ž„(vlm)์„ ๋ฐ›์•„ File ๋ชฉ๋ก์œผ๋กœ (์‹œ๊ฐ„์ˆœ ์œ ์ง€) */\n private async _fetchVlmFrames(set: SetInfo, setIndex: number): Promise<{ file: File; url: string; setIndex: number }[]> {\n const data = await this._callMeasure(`/api/sets/${set.setId}/vlm-frames`)\n const out: { file: File; url: string; setIndex: number }[] = []\n for (const f of data.frames || []) {\n const response = await fetch(`${MEASURE_BASE_URL}${f.url}`, { headers: { Authorization: MEASURE_AUTH } })\n if (!response.ok) throw new Error(`ํ”„๋ ˆ์ž„ ์ˆ˜์‹  ์‹คํŒจ (${response.status})`)\n const blob = await response.blob()\n const file = new File([blob], `set${setIndex + 1}_${f.name}`, { type: 'image/jpeg' })\n const url = URL.createObjectURL(file)\n this.objectUrls.push(url)\n out.push({ file, url, setIndex })\n }\n return out\n }\n\n /* [2๋‹จ๊ณ„] ์ž๋™ ํŒ์ • ์‹คํ–‰ (inspect)\n * - ์ตœ์ดˆ ํŒ์ •: ์—…๋กœ๋“œ๋œ ๋ชจ๋“  ์„ธํŠธ์˜ ๋Œ€ํ‘œ 3ํ”„๋ ˆ์ž„ + ์ „์ฒด ์ฒดํฌ๋ฆฌ์ŠคํŠธ (input_kind=video_frames)\n * - ์žฌ๊ฒ€์‚ฌ(์žฌ์ดฌ์˜ ํŒจ๋„): ์ƒˆ ์„ธํŠธ์˜ 3ํ”„๋ ˆ์ž„๋งŒ + ํ•ด๋‹น ํ•ญ๋ชฉ๋งŒ ์žฌํŒ์ • ํ›„ ๊ฒฐ๊ณผ ๋ณ‘ํ•ฉ */\n private async _runInspection() {\n const isRecapture = this.panel === 'recapture' && !!this.selectedItem\n\n try {\n this.loading = true\n this.loadingText = '๋™์˜์ƒ ํ”„๋ ˆ์ž„ ์ถ”์ถœ ์ค‘...'\n\n let newPhotos: { file: File; url: string; setIndex: number }[] = []\n if (isRecapture) {\n if (!this.recaptureSet) {\n notify({ message: '์žฌ์ดฌ์˜ ์„ธํŠธ๋ฅผ ๋จผ์ € ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”.', level: 'warn' })\n return\n }\n this.recaptureBase = this.photos.length\n newPhotos = await this._fetchVlmFrames(this.recaptureSet, this.sets.length)\n } else {\n const sets = this.uploadedSets\n if (!sets.length) {\n notify({ message: '์—…๋กœ๋“œ๋œ ์ดฌ์˜ ์„ธํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n for (let i = 0; i < sets.length; i++) {\n newPhotos = [...newPhotos, ...(await this._fetchVlmFrames(sets[i], i))]\n }\n }\n\n const files = newPhotos.map(p => p.file)\n const checklist = isRecapture\n ? this.engineChecklist.filter(c => c.item_id === this.selectedItem.item_id)\n : this.engineChecklist\n\n this.loadingText = 'AI ์ž๋™ ํŒ์ • ์ค‘... (์ตœ๋Œ€ 1~2๋ถ„ ์†Œ์š”)'\n const result = await this._callEngine({ action: 'inspect', checklist, input_kind: 'video_frames' }, files)\n\n if (isRecapture) {\n this.photos = [...this.photos, ...newPhotos]\n this._mergeItems(result?.items_sorted || result?.items || [], this.recaptureBase)\n this.recaptureSet = null\n } else {\n this.photos = newPhotos\n this.result = result\n }\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n } catch (error) {\n console.error('AI ์ž๋™ ํŒ์ • ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* ๋ถ€๋ถ„ ์žฌํŒ์ •/์ธก์ • ํ™•์ • ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์กด ์ „์ฒด ๊ฒฐ๊ณผ์— ๋ณ‘ํ•ฉํ•˜๊ณ  summary ์žฌ๊ณ„์‚ฐ\n * - usedImageBase: used_images(๋ถ€๋ถ„์ง‘ํ•ฉ 1-based) โ†’ ์ „์ฒด ํ”„๋ ˆ์ž„ ์ธ๋ฑ์Šค ๋ณด์ •๊ฐ’ */\n private _mergeItems(updatedItems: any[], usedImageBase: number = 0) {\n const updated = updatedItems.map((it: any) => ({\n ...it,\n used_images: (it.used_images || []).map((n: number) => n + usedImageBase)\n }))\n const byId = new Map(updated.map((it: any) => [it.item_id, it]))\n const replace = (arr: any[]) => (arr || []).map(it => byId.get(it.item_id) || it)\n\n const items = replace(this.result?.items)\n const itemsSorted = this.result?.items_sorted ? replace(this.result.items_sorted) : undefined\n\n const summary: Record<string, number> = { pass: 0, fail: 0, hold: 0, pending: 0, error: 0, measure: 0 }\n for (const it of itemsSorted || items) {\n summary[it.verdict] = (summary[it.verdict] || 0) + 1\n if (it.verdict === 'pending' && it.pending_reason === 'measure') summary.measure += 1\n }\n summary.total = (itemsSorted || items).length\n\n this.result = { ...this.result, items, ...(itemsSorted ? { items_sorted: itemsSorted } : {}), summary }\n }\n\n private _resetAll() {\n this.objectUrls.forEach(u => URL.revokeObjectURL(u))\n this.objectUrls = []\n this.guide = null\n this.sets = []\n this.photos = []\n this.result = null\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n this.recaptureBase = 0\n this.recaptureSet = null\n this._resetMeasureState()\n }\n\n private _resetMeasureState() {\n this.measureInputs = {}\n this.measureRunning = false\n this.measureMsg = ''\n this.measureResult = null\n this.measureImageUrl = ''\n this.thicknessFrames = []\n this.thicknessSlot = null\n this.thicknessFrameUrl = ''\n this.thicknessClick = null\n }\n\n /* โ”€โ”€โ”€ ํŒจ๋„ ์—ด๊ธฐ/๋‹ซ๊ธฐ โ”€โ”€โ”€ */\n private _openDetail(item: any) {\n const group = this._groupOf(item)\n // ์žฌ์ดฌ์˜/์ธก์ • ํ•ญ๋ชฉ์€ ์ƒ์„ธ ๋Œ€์‹  ํ•ด๋‹น ์ž‘์—… ํŒจ๋„์„ ๋ฐ”๋กœ ํ‘œ์‹œ\n if (group === 'recapture') {\n this._openRecapture(item)\n return\n }\n if (group === 'measure') {\n this._openMeasure(item)\n return\n }\n this.selectedItem = item\n this.mainPhotoIndex = 0 // ์„ ํƒ ํ•ญ๋ชฉ์˜ ์ฒซ ์‚ฌ์šฉ ํ”„๋ ˆ์ž„๋ถ€ํ„ฐ ํ‘œ์‹œ\n this.panel = 'detail'\n }\n\n private _openRecapture(item: any) {\n this.selectedItem = item\n this.recaptureSet = null\n this.panel = 'recapture'\n }\n\n private async _openMeasure(item: any) {\n this.selectedItem = item\n this._resetMeasureState()\n this.panel = 'measure'\n\n // ์ดฌ์˜ ๊ธฐ์ˆ ์ด ๋งž๋Š” ์„ธํŠธ๋ฅผ ๊ธฐ๋ณธ ์„ ํƒ (โ‘ฃ=04_cover, โ‘ค=05_thickness)\n const wantTech = item.measure?.model_id?.startsWith('rebar') ? '04_cover' : '05_thickness'\n const sets = this.uploadedSets\n const found = sets.findIndex(s => s.technique === wantTech)\n this.measureSetIndex = found >= 0 ? found : 0\n\n if (item.measure?.next_action === 'select_and_input') {\n await this._loadThicknessFrames()\n }\n }\n\n private async _onMeasureSetChange(index: number) {\n this.measureSetIndex = index\n this.measureResult = null\n this.measureImageUrl = ''\n if (this.selectedItem?.measure?.next_action === 'select_and_input') {\n this.thicknessSlot = null\n this.thicknessFrameUrl = ''\n this.thicknessClick = null\n await this._loadThicknessFrames()\n }\n }\n\n private _openReport = () => {\n this.panel = 'report'\n this.selectedItem = null\n this.expandedReportId = null\n // ๋ฆฌํฌํŠธ ํŒจ๋„์ด ์šฐ์ธก ์ƒ๋‹จ์— ๋œจ๋ฏ€๋กœ ์Šคํฌ๋กค์„ ๋งจ ์œ„๋กœ (ํŒ์ • ๋ฆฌ์ŠคํŠธ๋Š” ์ž์ฒด ์Šคํฌ๋กค)\n this.updateComplete.then(() => {\n this.renderRoot.querySelector('div[body]')?.scrollTo({ top: 0, behavior: 'smooth' })\n this.renderRoot.querySelector('.items-pane')?.scrollTo({ top: 0, behavior: 'smooth' })\n })\n }\n\n /* ์ข…ํ•ฉ ๋ฆฌํฌํŠธ ํ•ญ๋ชฉ ํŽผ์น˜๊ธฐ/์ ‘๊ธฐ (ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ํŽผ์นจ) */\n private _toggleReportItem(id: string) {\n this.expandedReportId = this.expandedReportId === id ? null : id\n }\n\n private _closePanel = () => {\n this.panel = 'none'\n this.selectedItem = null\n }\n\n private _sortedItems(): any[] {\n return this.result?.items_sorted || this.result?.items || []\n }\n\n /* โ”€โ”€โ”€ โ‘ฃ ์ฒ ๊ทผ ๋ฐฐ๊ทผ ๊ธธ์ด ์ธก์ • (๋น„๋™๊ธฐ job + ์ง„ํ–‰๋ฅ  ํด๋ง) โ”€โ”€โ”€ */\n private async _runRebarMeasure(item: any) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) {\n notify({ message: '์ธก์ •ํ•  ์ดฌ์˜ ์„ธํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n const memberDim = parseFloat(this.measureInputs.member_dim_mm)\n const coverSpec = parseFloat(this.measureInputs.cover_spec_mm)\n if (!memberDim || !coverSpec) {\n notify({ message: '์„ค๊ณ„ ๋‹จ๋ฉด ์น˜์ˆ˜์™€ ๊ธฐ์ค€ ํ”ผ๋ณต๋‘๊ป˜๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. (๋„๋ฉด๊ฐ’)', level: 'warn' })\n return\n }\n\n try {\n this.measureRunning = true\n this.measureMsg = '์ธก์ • ์‹œ์ž‘...'\n this.measureResult = null\n this.measureImageUrl = ''\n\n const { job } = await this._callMeasure('/api/rebar/measure', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n set_id: set.setId,\n targets: [{ name: item.text || '์ธก์ • ๋Œ€์ƒ', member_dim_mm: memberDim, cover_spec_mm: coverSpec }]\n })\n })\n\n // ์ง„ํ–‰๋ฅ  ํด๋ง โ€” msg๋Š” ์„œ๋ฒ„๊ฐ€ ์ฃผ๋Š” ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ ๊ทธ๋Œ€๋กœ ํ‘œ์‹œ\n let status: any\n do {\n await new Promise(r => setTimeout(r, 1500))\n status = await this._callMeasure(`/api/job/${job}`)\n this.measureMsg = status.msg || '์ธก์ • ์ค‘...'\n } while (status.state !== 'done' && this.panel === 'measure')\n\n if (this.panel !== 'measure') return // ํŒจ๋„์„ ๋‹ซ์•˜์œผ๋ฉด ๊ฒฐ๊ณผ ๋ฌด์‹œ\n const r = status.result || {}\n if (!r.ok) {\n notify({ message: r.why || '์ธก์ •์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.', level: 'error' })\n // ์‹คํŒจ ๊ฒฐ๊ณผ๋„ ํ™•์ • ๊ฐ€๋Šฅ(์—”์ง„์ด hold๋กœ ๋ณ€ํ™˜) โ€” ๊ฒฐ๊ณผ๋Š” ๋ณด๊ด€ํ•˜๋˜ ์ด๋ฏธ์ง€ ์—†์Œ\n this.measureResult = r\n return\n }\n this.measureResult = r\n // ์ธก์ •์— ์“ด ํ”„๋ ˆ์ž„ ์ค‘ ๊ฐ€์šด๋ฐ ํ”„๋ ˆ์ž„์— ์ธก์ •์„  ์˜ค๋ฒ„๋ ˆ์ด\n const frames = r.frames_used || []\n const overlayIdx = frames.length ? frames[Math.floor(frames.length / 2)] : 0\n try {\n this.measureImageUrl = await this._fetchMeasureImage(`/api/rebar/overlay/${job}/${overlayIdx}?w=1280`)\n } catch (e) {\n console.warn('์˜ค๋ฒ„๋ ˆ์ด ์ˆ˜์‹  ์‹คํŒจ:', e)\n }\n } catch (error) {\n console.error('์ฒ ๊ทผ ์ธก์ • ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n /* โ”€โ”€โ”€ โ‘ค ๊ธฐ๋‘ฅยท๋ฒฝ์ฒด ๋‘๊ป˜ ์ธก์ • (ํ”„๋ ˆ์ž„ ์„ ํƒ + ๋ฉด ํด๋ฆญ, ๋™๊ธฐ) โ”€โ”€โ”€ */\n private async _loadThicknessFrames() {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) return\n try {\n this.measureRunning = true\n this.measureMsg = '์Šค์œ•์—์„œ ํ”„๋ ˆ์ž„ ๋ฝ‘๋Š” ์ค‘... (์ฒซ ํ˜ธ์ถœ์€ 10์ดˆ์ฏค)'\n const data = await this._callMeasure(`/api/thickness/frames/${set.setId}`)\n const frames = (data.frames || []) as { slot: number; index: number }[]\n // ์ธ๋„ค์ผ์€ ์ธ์ฆ ๋•Œ๋ฌธ์— fetch๋กœ ๋ฐ›์•„ blob URL๋กœ\n const withThumbs: { slot: number; index: number; thumbUrl?: string }[] = []\n for (const f of frames) {\n try {\n const thumbUrl = await this._fetchMeasureImage(`/api/thickness/frame/${set.setId}/${f.slot}?thumb=1`)\n withThumbs.push({ ...f, thumbUrl })\n } catch {\n withThumbs.push(f)\n }\n }\n this.thicknessFrames = withThumbs\n if (withThumbs.length) await this._selectThicknessFrame(withThumbs[Math.floor(withThumbs.length / 2)].slot)\n } catch (error) {\n console.error('ํ”„๋ ˆ์ž„ ๋ชฉ๋ก ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n private async _selectThicknessFrame(slot: number) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) return\n this.thicknessSlot = slot\n this.thicknessClick = null\n try {\n this.thicknessFrameUrl = await this._fetchMeasureImage(`/api/thickness/frame/${set.setId}/${slot}`)\n } catch (error) {\n notify({ message: (error as Error).message, level: 'error' })\n }\n }\n\n /* ํด๋ฆญ ์ขŒํ‘œ๋ฅผ ํ‘œ์‹œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ  0~1 ์ •๊ทœํ™” โ€” ์›๋ณธ ํ•ด์ƒ๋„๋Š” ์•Œ ํ•„์š” ์—†๋‹ค */\n private _onThicknessClick = (e: MouseEvent) => {\n if (this.measureRunning) return\n const rect = (e.target as HTMLElement).getBoundingClientRect()\n this.thicknessClick = {\n x: (e.clientX - rect.left) / rect.width,\n y: (e.clientY - rect.top) / rect.height\n }\n }\n\n private async _runThicknessMeasure(item: any) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set || this.thicknessSlot === null || !this.thicknessClick) {\n notify({ message: 'ํ”„๋ ˆ์ž„์„ ๊ณ ๋ฅด๊ณ  ์žด ๋ฉด์„ ํƒญํ•ด์ฃผ์„ธ์š”.', level: 'warn' })\n return\n }\n\n try {\n this.measureRunning = true\n this.measureMsg = '์ธก์ • ์ค‘... (์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„ ํ•ฉ์˜ ์ธก์ •, 30~40์ดˆ)'\n this.measureResult = null\n this.measureImageUrl = ''\n\n const form = new FormData()\n form.append('set_id', set.setId)\n form.append('slot', String(this.thicknessSlot))\n form.append('x', String(this.thicknessClick.x))\n form.append('y', String(this.thicknessClick.y))\n if (this.measureInputs.design_mm) form.append('design_mm', this.measureInputs.design_mm)\n if (this.measureInputs.tol_mm) form.append('tol_mm', this.measureInputs.tol_mm)\n\n const r = await this._callMeasure('/api/thickness/measure', { method: 'POST', body: form })\n this.measureResult = r\n if (r.image_data) this.measureImageUrl = r.image_data\n if (!r.ok) notify({ message: r.summary || r.headline || '์ธก์ •์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n } catch (error) {\n console.error('๋‘๊ป˜ ์ธก์ • ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n /* โ”€โ”€โ”€ ์ธก์ • ๊ฒฐ๊ณผ โ†’ ํŒ์ • ํ™•์ • (apply-measurement, OpenAI ๋ฏธํ˜ธ์ถœยท์ฆ‰์‹œ ์‘๋‹ต) โ”€โ”€โ”€ */\n private async _applyMeasurement(item: any) {\n if (!this.measureResult) return\n try {\n this.loading = true\n this.loadingText = 'ํŒ์ • ํ™•์ • ์ค‘...'\n // ์ธก์ • ์„œ๋ฒ„ ์‘๋‹ต์„ ๊ฐ€๊ณต ์—†์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ โ€” ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ/hold ์Šน๊ฒฉ์€ ์—”์ง„์ด ์ฒ˜๋ฆฌํ•œ๋‹ค\n const result = await this._callEngine({\n action: 'apply-measurement',\n item: { item_id: item.item_id, text: item.text, category: item.category },\n model_id: item.measure?.model_id || this.measureResult.model_id,\n result: this.measureResult\n })\n\n const judged = { ...item, ...result.item }\n this._mergeItems([judged])\n this._resetMeasureState()\n this.panel = 'none'\n this.selectedItem = null\n\n if (judged.verdict === 'hold') {\n notify({ message: '์ธก์ • ํ’ˆ์งˆ์ด ๊ธฐ์ค€์— ๋ชป ๋ฏธ์ณ ๋ณด๋ฅ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ดฌ์˜์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.', level: 'warn' })\n } else {\n notify({ message: `ํŒ์ •์ด ํ™•์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค: ${this._verdictLabel(judged)}` })\n }\n } catch (error) {\n console.error('ํŒ์ • ํ™•์ • ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* base64 data URL โ†’ File (์ธก์ • ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€์šฉ) */\n private _dataUrlToFile(dataUrl: string, name: string): File | null {\n try {\n const [head, body] = dataUrl.split(',')\n const mime = head.match(/data:(.*?);/)?.[1] || 'image/jpeg'\n const bin = atob(body)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return new File([bytes], name, { type: mime })\n } catch {\n return null\n }\n }\n\n /* โ”€โ”€โ”€ ๊ฒ€์‚ฌ ๋“ฑ๋ก: ๊ฐ๋ฆฌ์ž ํŒ์ • ์ž๋™ ๋ฐ˜์˜ + AIํŒ๋‹จ ๊ทผ๊ฑฐ ์ฒจ๋ถ€ โ”€โ”€โ”€ */\n private async _registerInspection() {\n const items = this._sortedItems()\n if (!items.length) {\n notify({ message: 'ํŒ์ • ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n // ์ ํ•ฉ/๋ถ€์ ํ•ฉ์œผ๋กœ ์ž๋™ ํŒ์ •๋œ ํ•ญ๋ชฉ๋งŒ ๋ฐ˜์˜ (๋ณด๋ฅ˜/๋ฏธ์ง€์›/์˜ค๋ฅ˜๋Š” ๋ฏธ๊ฒ€์‚ฌ๋กœ ๊ฑด๋„ˆ๋œ€)\n const judged = items.filter(it => it.verdict === 'pass' || it.verdict === 'fail')\n\n try {\n this.loading = true\n this.loadingText = '๊ฒ€์‚ฌ ๊ฒฐ๊ณผ ๋“ฑ๋ก ์ค‘...'\n\n // 1) ๊ฐ๋ฆฌ์ž ์ ํ•ฉ/๋ถ€์ ํ•ฉ ์ž๋™ ์ฑ„์›€ (์ ํ•ฉ/๋ถ€์ ํ•ฉ ํŒ์ •๋œ ํ•ญ๋ชฉ๋งŒ, ์—†์œผ๋ฉด ๊ฑด๋„ˆ๋œ€)\n if (judged.length) {\n const response = await client.mutate({\n mutation: gql`\n mutation UpdateChecklistItemsAiJudgment($items: [ChecklistItemAiJudgment!]!) {\n updateChecklistItemsAiJudgment(items: $items)\n }\n `,\n variables: {\n items: judged.map(it => ({\n id: it.item_id,\n supervisoryConfirmStatus: it.verdict === 'pass' ? 'T' : 'F'\n }))\n }\n })\n\n if (response.errors) throw new Error(response.errors[0]?.message || '๊ฒ€์‚ฌ ๋“ฑ๋ก์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')\n }\n\n // 2) ํ•ญ๋ชฉ๋ณ„ ์ฒจ๋ถ€: ํŒ๋‹จ ๊ทผ๊ฑฐ(AIํŒ๋‹จ ํ…์ŠคํŠธ) + ๊ทผ๊ฑฐ ํ”„๋ ˆ์ž„/์ธก์ • ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€\n // ai_report๋Š” pending/error์—์„œ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์˜ค๋ฏ€๋กœ ๊ทธ ํ•ญ๋ชฉ์€ ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๋Š”๋‹ค\n const attachments: any[] = []\n for (const it of items) {\n if (it.ai_report) {\n attachments.push({\n file: new File([it.ai_report], `AIํŒ๋‹จ_${(it.text || it.item_id).slice(0, 30)}.txt`, { type: 'text/plain' }),\n refBy: it.item_id,\n refType: 'ChecklistItem',\n description: 'AIํŒ๋‹จ'\n })\n }\n for (const n of it.used_images || []) {\n const photo = this.photos[n - 1]\n if (photo) {\n attachments.push({ file: photo.file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AIํŒ๋‹จ' })\n }\n }\n // ์ธก์ • ํ•ญ๋ชฉ์˜ ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€ (apply-measurement ์‘๋‹ต์˜ base64)\n if (it.image_data) {\n const file = this._dataUrlToFile(it.image_data, `AI์ธก์ •๊ทผ๊ฑฐ_${(it.text || it.item_id).slice(0, 30)}.jpg`)\n if (file) attachments.push({ file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AIํŒ๋‹จ' })\n }\n }\n\n if (attachments.length) {\n const attachResponse = await client.mutate({\n mutation: gql`\n mutation CreateAttachments($attachments: [NewAttachment!]!) {\n createAttachments(attachments: $attachments) {\n id\n }\n }\n `,\n variables: { attachments },\n context: { hasUpload: true }\n })\n\n if (attachResponse.errors) throw new Error(attachResponse.errors[0]?.message || 'AIํŒ๋‹จ ์ž๋ฃŒ ์ฒจ๋ถ€์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')\n }\n\n notify({ message: `๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ๋“ฑ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค. (์ž๋™ ํŒ์ • ${judged.length}๊ฑด ๋ฐ˜์˜)` })\n\n // ๋“ฑ๋ก ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด์œผ๋กœ ์ด๋™\n navigate(`building-inspection-detail-checklist/${this.buildingInspectionId}`)\n } catch (error) {\n console.error('๊ฒ€์‚ฌ ๋“ฑ๋ก ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n}\n"]}
1
+ {"version":3,"file":"building-inspection-detail-ai-measurement.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-ai-measurement.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ๊ฒ€์ธก ๊ด€๋ฆฌ ์ƒ์„ธ - AI ์ž๋™ ๊ฒ€์ธก (๋™์˜์ƒ ์„ธํŠธ + ์ธก์ • ๋ชจ๋ธ 2์ข…)\n *\n * ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์„ AI ์—”์ง„(inspection-ai)๊ณผ ์ธก์ • ์„œ๋ฒ„(measure-engine)์— ์—ฐ๋™ํ•ด:\n * 1) ์ดฌ์˜ ๊ฐ€์ด๋“œ(plan-shots, ๋™์˜์ƒ ์ตœ๋Œ€ 3๊ฑด)๋ฅผ ํ‘œ์‹œํ•˜๊ณ \n * 2) LidarInspector ์•ฑ์ด ๋งŒ๋“  ์„ธํŠธ(video.mov/poses.jsonl/meta.json)๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด\n * 3) ์„ธํŠธ๋ณ„ ๋Œ€ํ‘œ 3ํ”„๋ ˆ์ž„์œผ๋กœ ์ž๋™ ํŒ์ •(inspect, input_kind=video_frames)์„ ์‹คํ–‰ํ•œ ๋’ค\n * 4) ใ€Œ์ถ”๊ฐ€ ์ž‘์—… ํ•„์š”ใ€(์žฌ์ดฌ์˜/๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ/AI ๋ฏธ์ง€์›)๋ฅผ ๋ถ„๋ฅ˜ํ•ด ์ธก์ • UI(์ฒ ๊ทผ ๋ฐฐ๊ทผ ๊ธธ์ดยท๊ธฐ๋‘ฅ๋ฒฝ์ฒด ๋‘๊ป˜)๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ \n * 5) ์ธก์ • ๊ฒฐ๊ณผ๋Š” apply-measurement๋กœ ํŒ์ • ํ™•์ • โ†’ ๊ฒ€์‚ฌ ๋“ฑ๋ก ์‹œ ๊ฐ๋ฆฌ์ž ์ ํ•ฉ/๋ถ€์ ํ•ฉ ์ž๋™ ๋ฐ˜์˜ + ๊ทผ๊ฑฐ ์ฒจ๋ถ€ํ•œ๋‹ค.\n */\nimport '@material/web/icon/icon.js'\nimport '@material/web/progress/circular-progress.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, state, query } from 'lit/decorators.js'\n\nimport { PageView, navigate } from '@operato/shell'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport { canDcspMutate } from '@dssp/building-complex/dist-client/utils/privilege'\n\nimport './component/building-inspection-detail-header'\n\nconst ENGINE_BASE_URL = 'https://hatiolab-korea-uni.nruing.com'\nconst ENGINE_RUN_URL = `${ENGINE_BASE_URL}/api/run/inspection-ai`\nconst ENGINE_AUTH = `Basic ${btoa('admin:admin1234')}`\n/* ์ธก์ • ์„œ๋ฒ„(measure-engine/server.py). ๋ฐฐํฌ ์‹œ ์‹ค์ œ ์ฃผ์†Œ๋กœ ์ˆ˜์ • โ€” https ํŽ˜์ด์ง€์—์„œ๋Š” https(๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ) ํ•„์š” */\nconst MEASURE_BASE_URL = 'https://hatiolab-korea-uni.nruing.com/measure'\nconst MEASURE_AUTH = ENGINE_AUTH\n\n/* ์ดฌ์˜ ์•ˆ๋‚ด ์ด๋ฏธ์ง€ (์—”์ง„ ์ „๋‹ฌ๋ฌผ ๊ณ ์ • ๊ทธ๋ฆผ + ํ”ฝํ† ๊ทธ๋žจ) */\nconst captureGuideImg = new URL('../../assets/ai-measurement/capture_guide.png', import.meta.url).href\nconst pictoRebarImg = new URL('../../assets/ai-measurement/picto-rebar-parallel.svg', import.meta.url).href\nconst pictoMemberImg = new URL('../../assets/ai-measurement/picto-member-corner.svg', import.meta.url).href\n\n/* ์„ธํŠธ ํด๋” ํ•„์ˆ˜ ํŒŒ์ผ (LidarInspector ์•ฑ์ด ์ดฌ์˜ 1ํšŒ๋‹น ์ƒ์„ฑ) */\nconst SET_FILES = ['video.mov', 'poses.jsonl', 'meta.json']\n\n/* ์ดฌ์˜ ์•ฑ ์‹คํ–‰ ๋งํฌ โ€” iPad์—์„œ ์ด ํ™”๋ฉด์„ ์—ด์—ˆ์„ ๋•Œ ์•ฑ์ด ๋ฐ”๋กœ ์ดฌ์˜ ํ™”๋ฉด์œผ๋กœ ๋œฌ๋‹ค.\n server ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์—…๋กœ๋“œ ์ฃผ์†Œ๊นŒ์ง€ ๋„˜๊ฒจ์„œ ์•ฑ ์„ค์ •์„ ๋”ฐ๋กœ ์•ˆ ๋งŒ์ ธ๋„ ๋˜๊ฒŒ ํ•œ๋‹ค. */\nfunction appCaptureLink(tech: 'cover' | 'thick') {\n return `gamri://${tech}?server=${encodeURIComponent(MEASURE_BASE_URL)}`\n}\n\n/* KCS ๊ธฐ์ค€์€ ๋งค์นญ ๊ฒฐ๊ณผ JSON(kcs_matches[0])์œผ๋กœ ์ €์žฅ๋ผ ์žˆ๋‹ค โ†’ ์—”์ง„์— ๋ณด๋‚ผ ์กฐ๋ฌธ ํ…์ŠคํŠธ๋กœ ํŽธ๋‹ค.\n ๋ฌธ์„œ/์กฐํ•ญ ๋ผ๋ฒจ์„ ์•ž์— ๋ถ™์—ฌ์•ผ ๋ชจ๋ธ์ด ์–ด๋А ๊ธฐ์ค€์„ ์ธ์šฉํ•˜๋Š”์ง€ reason ์— ์“ธ ์ˆ˜ ์žˆ๋‹ค. */\nfunction _kcsCriteriaText(raw?: string) {\n if (!raw) return ''\n try {\n const kcs = JSON.parse(raw)\n const label = [kcs.file_label, kcs.clause_no, kcs.clause_title].filter(Boolean).join(' ')\n const body = (kcs.matched_item || kcs.text || '').trim()\n return body ? `${label}\\n${body}`.trim() : label\n } catch {\n return raw.trim() // ๊ตฌํ˜• ๋ฐ์ดํ„ฐ(๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ์ €์žฅ๋œ ๊ฒฝ์šฐ)\n }\n}\n\n/* set_id(YYYYmmdd-HHMMSS_xxxxxx) โ†’ \"9/11 14:30\" ํ‘œ๊ธฐ */\nfunction _setTimeLabel(setId: string) {\n const m = /^(\\d{4})(\\d{2})(\\d{2})-(\\d{2})(\\d{2})/.exec(setId || '')\n return m ? `${Number(m[2])}/${Number(m[3])} ${m[4]}:${m[5]}` : setId\n}\n\n/* ์—”์ง„ verdict(๊ธฐ๊ณ„๊ฐ’) โ†’ ํ™”๋ฉด ๋ผ๋ฒจ. pass/fail๋งŒ ํ•ฉ/๋ถˆ๋กœ ์ž๋™ ์ฒดํฌ, ๋‚˜๋จธ์ง€๋Š” ๊ฐ๋ฆฌ์ž ํŒ๋‹จ */\nconst VERDICT_LABEL = {\n pass: '์ ํ•ฉ',\n fail: '๋ถ€์ ํ•ฉ',\n hold: '์žฌ์ดฌ์˜ ํ•„์š”',\n pending: 'AI ๋ฏธ์ง€์›',\n error: '๋ถ„์„ ์˜ค๋ฅ˜'\n}\n\n/* ์—”์ง„ routing(๊ธฐ๊ณ„๊ฐ’) โ†’ ํ™”๋ฉด ๋ผ๋ฒจ. cv ๊ณ„์—ด์€ CVํŒ€ ๋ช…์„ธ ๊ณ ์ • ๋ฌธ๊ตฌ \"3D ๊ณ„์ธก\" */\nconst ROUTING_LABEL = {\n vlm: 'AI ์‚ฌ์ง„ํŒ๋…',\n cv: '3D ๊ณ„์ธก',\n cv_missing: '3D ๊ณ„์ธก'\n}\n\n/* operator_inputs ํ•„๋“œ ํ‚ค โ†’ ํ•œ๊ธ€ ๋ผ๋ฒจ (๋ชจ๋ฅด๋Š” ํ‚ค๋Š” ํ‚ค ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ) */\nconst FIELD_LABEL = {\n name: '๋ถ€์žฌ/๋ณ€ ์ด๋ฆ„',\n member_dim_mm: '์„ค๊ณ„ ๋‹จ๋ฉด ์น˜์ˆ˜ (mm)',\n cover_spec_mm: '๊ธฐ์ค€(์ตœ์†Œ) ํ”ผ๋ณต๋‘๊ป˜ (mm)',\n design_mm: '์„ค๊ณ„ ๋‘๊ป˜ (mm)',\n tol_mm: 'ํ—ˆ์šฉ ๊ณต์ฐจ ยฑ (mm)'\n}\n\ntype PanelMode = 'none' | 'detail' | 'recapture' | 'measure' | 'report'\n\ntype SetInfo = {\n setId: string\n technique?: string\n label: string\n warnings: string[]\n}\n\n@customElement('building-inspection-detail-ai-measurement')\nexport class BuildingInspectionAiMeasurement extends PageView {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px 1fr;\n color: #4e5055;\n width: 100%;\n height: 100%;\n background-color: #f7f7f7;\n }\n\n * {\n box-sizing: border-box;\n }\n\n div[body] {\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n padding: var(--spacing-medium);\n gap: 12px;\n }\n\n .page-title {\n text-align: center;\n font-size: 16px;\n font-weight: 700;\n color: #333;\n }\n\n .page-title span[target] {\n color: #7d2f2f;\n text-decoration: underline;\n }\n\n /* โ”€โ”€โ”€ 1๋‹จ๊ณ„: ์ดฌ์˜ ๊ฐ€์ด๋“œ โ”€โ”€โ”€ */\n .guide-container {\n max-width: 560px;\n width: 100%;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n\n .step-badge {\n align-self: flex-start;\n background: #f7e9e9;\n color: #7d2f2f;\n font-size: 12px;\n font-weight: 700;\n padding: 4px 10px;\n border-radius: 12px;\n }\n\n .guide-title {\n font-size: 26px;\n font-weight: 800;\n color: #222;\n line-height: 1.3;\n white-space: pre-line;\n }\n\n .guide-desc {\n font-size: 13px;\n color: #777;\n }\n\n .card {\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 16px;\n }\n\n .card h4 {\n margin: 0 0 10px 0;\n font-size: 14px;\n color: #333;\n }\n\n .card ul {\n margin: 0;\n padding-left: 4px;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .card ul li {\n font-size: 13px;\n color: #555;\n display: flex;\n gap: 8px;\n }\n\n .card ul li::before {\n content: '';\n flex-shrink: 0;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #7d2f2f;\n margin-top: 6px;\n }\n\n /* ์ดฌ์˜ ์•ˆ๋‚ด ๊ทธ๋ฆผ โ€” ํ”ฝํ† ๊ทธ๋žจ์€ ๋ฐฐ๊ฒฝ ํˆฌ๋ช…ยท์ง™์€ ๊ธ€์ž๋ผ ๋ฐ์€ ์นด๋“œ ์œ„์—๋งŒ ์–น๋Š”๋‹ค */\n .capture-guide-img {\n width: 100%;\n border-radius: 8px;\n display: block;\n }\n\n /* ์ดฌ์˜ ์•ฑ ์‹คํ–‰ ๋งํฌ */\n .app-links {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n font-size: 12px;\n color: #777;\n }\n\n /* ์ดฌ์˜ ์นธ์˜ ใ€Œ์•ฑ์œผ๋กœ ์ดฌ์˜ใ€ */\n .shoot-link {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n padding: 7px 12px;\n border-radius: 999px;\n background: #7d2f2f;\n color: #fff;\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n .shoot-link md-icon {\n --md-icon-size: 16px;\n color: #fff;\n }\n\n .app-links a {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #7d2f2f;\n border-radius: 999px;\n color: #7d2f2f;\n font-size: 12px;\n font-weight: 600;\n text-decoration: none;\n }\n\n /* ์•ฑ์ด ์˜ฌ๋ฆฐ ์„ธํŠธ ๊ณ ๋ฅด๊ธฐ */\n .set-chooser {\n border: 1px solid #e5e5e5;\n border-radius: 8px;\n background: #fff;\n margin: -4px 0 4px 38px;\n padding: 6px;\n max-height: 220px;\n overflow-y: auto;\n }\n\n .chooser-row {\n display: block;\n width: 100%;\n text-align: left;\n border: 0;\n background: transparent;\n border-radius: 6px;\n padding: 8px 10px;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n }\n\n .chooser-row:hover {\n background: #f5f5f5;\n }\n\n .chooser-row b {\n display: block;\n font-size: 13px;\n color: #333;\n }\n\n .chooser-empty {\n padding: 12px 10px;\n font-size: 12px;\n color: #999;\n }\n\n .chooser-actions {\n display: flex;\n justify-content: flex-end;\n gap: 4px;\n border-top: 1px solid #f0f0f0;\n padding-top: 4px;\n }\n\n .set-chooser .app-links {\n border-top: 1px solid #f0f0f0;\n padding: 8px 4px 6px;\n }\n\n /* ์„ธํŠธ ์—…๋กœ๋“œ ์นด๋“œ */\n .set-card {\n display: flex;\n align-items: center;\n gap: 10px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: #fafafa;\n padding: 12px;\n cursor: pointer;\n }\n\n .set-card[uploaded] {\n border-style: solid;\n border-color: #bfd8bf;\n background: #f2f8f2;\n cursor: default;\n }\n\n .set-card md-icon {\n --md-icon-size: 28px;\n color: #b5b5b5;\n flex-shrink: 0;\n }\n\n .set-card[uploaded] md-icon {\n color: #2e7d32;\n }\n\n .set-card .set-main {\n flex: 1;\n min-width: 0;\n font-size: 13px;\n color: #555;\n }\n\n .set-card .set-main b {\n display: block;\n color: #333;\n margin-bottom: 2px;\n }\n\n .set-card .set-warn {\n font-size: 11px;\n color: #b7791f;\n }\n\n .progress-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 13px;\n color: #555;\n font-weight: 600;\n }\n\n .progress-bar {\n height: 6px;\n border-radius: 3px;\n background: #eee;\n overflow: hidden;\n }\n\n .progress-bar div {\n height: 100%;\n background: #7d2f2f;\n transition: width 0.3s;\n }\n\n .primary-button {\n width: 100%;\n border: none;\n border-radius: 8px;\n background: #7d2f2f;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n padding: 14px;\n cursor: pointer;\n }\n\n .primary-button:disabled {\n background: #ccc;\n cursor: default;\n }\n\n .text-button {\n border: 1px solid #ddd;\n border-radius: 8px;\n background: #fff;\n color: #555;\n font-size: 13px;\n padding: 8px 14px;\n cursor: pointer;\n }\n\n input[type='file'] {\n display: none;\n }\n\n /* โ”€โ”€โ”€ 2๋‹จ๊ณ„: ํŒ์ • ๊ฒฐ๊ณผ โ”€โ”€โ”€ */\n /* ๊ฒฐ๊ณผ ํ™”๋ฉด์€ ๋†’์ด๋ฅผ ํ™”๋ฉด์— ๊ณ ์ •ํ•˜๊ณ  ์ปฌ๋Ÿผ(ํ”„๋ ˆ์ž„/ํŒ์ • ๋ฆฌ์ŠคํŠธ/์ƒ์„ธ)๋ณ„๋กœ ๋‚ด๋ถ€ ์Šคํฌ๋กค */\n .result-body {\n display: flex;\n gap: 14px;\n flex: 1;\n min-height: 0;\n }\n\n .photo-pane {\n flex: 1.1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .photo-pane .caption {\n text-align: center;\n font-size: 12px;\n color: #999;\n }\n\n .photo-main {\n border-radius: 10px;\n overflow: hidden;\n background: #000;\n display: flex;\n justify-content: center;\n max-height: 480px;\n }\n\n .photo-main img {\n max-width: 100%;\n max-height: 480px;\n object-fit: contain;\n }\n\n .photo-thumbs {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n padding-bottom: 4px;\n }\n\n .photo-thumbs img {\n width: 96px;\n height: 72px;\n object-fit: cover;\n border-radius: 6px;\n cursor: pointer;\n border: 2px solid transparent;\n }\n\n .photo-thumbs img[selected] {\n border-color: #7d2f2f;\n }\n\n .items-pane {\n flex: 1.4;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 10px;\n overflow-y: auto;\n padding-right: 4px;\n }\n\n .photo-pane,\n .side-pane {\n overflow-y: auto;\n }\n\n .summary-banner {\n background: #f7e9e9;\n border: 1px solid #eedada;\n color: #7d2f2f;\n font-size: 13px;\n font-weight: 700;\n border-radius: 8px;\n padding: 10px 14px;\n }\n\n .group-title {\n font-size: 14px;\n font-weight: 700;\n color: #333;\n margin-top: 4px;\n }\n\n .group-subtitle {\n font-size: 12px;\n font-weight: 700;\n color: #777;\n margin: 2px 0 0 4px;\n }\n\n .item-card {\n display: flex;\n gap: 10px;\n align-items: flex-start;\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 12px;\n cursor: pointer;\n }\n\n .item-card[selected] {\n border-color: #7d2f2f;\n box-shadow: 0 0 0 1px #7d2f2f inset;\n }\n\n .item-no {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: #7d2f2f;\n color: #fff;\n font-size: 12px;\n font-weight: 700;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .item-main {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: 14px;\n font-weight: 700;\n color: #222;\n margin-bottom: 4px;\n }\n\n .item-desc {\n font-size: 12px;\n color: #777;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .chip {\n display: inline-block;\n font-size: 11px;\n font-weight: 700;\n border-radius: 4px;\n padding: 2px 6px;\n margin-right: 6px;\n background: #eef2f7;\n color: #3f71a0;\n }\n\n .chip-verdict {\n font-size: 12px;\n font-weight: 700;\n color: #555;\n }\n\n .badge {\n flex-shrink: 0;\n font-size: 12px;\n font-weight: 700;\n border-radius: 14px;\n padding: 5px 12px;\n white-space: nowrap;\n }\n\n .badge[pass] {\n background: #e8f5e9;\n color: #2e7d32;\n }\n\n .badge[fail] {\n background: #fdecea;\n color: #c62828;\n }\n\n .badge[etc] {\n background: #fff8e1;\n color: #b7791f;\n }\n\n .capture-button {\n flex-shrink: 0;\n border: none;\n border-radius: 14px;\n background: #fff3e0;\n color: #b7791f;\n font-size: 12px;\n font-weight: 700;\n padding: 6px 12px;\n cursor: pointer;\n }\n\n .measure-button {\n flex-shrink: 0;\n border: none;\n border-radius: 14px;\n background: #e8eef7;\n color: #2f5d8a;\n font-size: 12px;\n font-weight: 700;\n padding: 6px 12px;\n cursor: pointer;\n }\n\n /* โ”€โ”€โ”€ ์šฐ์ธก ํŒจ๋„ (์ƒ์„ธ/์žฌ์ดฌ์˜/์ธก์ •/๋ฆฌํฌํŠธ) โ”€โ”€โ”€ */\n .side-pane {\n flex: 1;\n min-width: 300px;\n max-width: 400px;\n background: #fff;\n border: 1px solid #e5e5e5;\n border-radius: 10px;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .side-pane h3 {\n margin: 0;\n font-size: 16px;\n color: #222;\n }\n\n .detail-header {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .detail-header h3 {\n font-size: 18px;\n }\n\n .detail-summary {\n font-size: 12px;\n color: #555;\n line-height: 1.7;\n white-space: pre-line;\n border-bottom: 1px solid #f0f0f0;\n padding-bottom: 10px;\n }\n\n .kv-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n }\n\n .kv {\n display: flex;\n flex-direction: column;\n gap: 2px;\n border: 1px solid #eee;\n border-radius: 8px;\n padding: 10px 12px;\n background: #fff;\n }\n\n .kv label {\n font-size: 11px;\n color: #999;\n }\n\n .kv span {\n font-size: 15px;\n font-weight: 700;\n color: #333;\n }\n\n .kv .verdict-value[pass] {\n color: #2e7d32;\n }\n\n .kv .verdict-value[fail] {\n color: #c62828;\n }\n\n .reason-box {\n display: flex;\n flex-direction: column;\n gap: 10px;\n font-size: 12px;\n line-height: 1.7;\n }\n\n .reason-verdict {\n border-left: 3px solid #7d2f2f;\n background: #fdf6f6;\n color: #333;\n padding: 8px 10px;\n }\n\n .evidence-img {\n width: 100%;\n border-radius: 8px;\n border: 1px solid #eee;\n }\n\n .why-box {\n background: #fff8e1;\n border: 1px solid #f4e4b5;\n border-radius: 8px;\n padding: 10px;\n font-size: 12px;\n color: #7a5c14;\n line-height: 1.6;\n }\n\n /* ์ธก์ • ํŒจ๋„ */\n .measure-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n color: #555;\n }\n\n .measure-field input,\n .measure-field select {\n padding: 9px 10px;\n border: 1px solid #ccc;\n border-radius: 6px;\n font-size: 14px;\n }\n\n .measure-msg {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: #7d2f2f;\n font-weight: 600;\n }\n\n .measure-msg md-circular-progress {\n --md-circular-progress-size: 22px;\n }\n\n .frame-strip {\n display: flex;\n gap: 6px;\n overflow-x: auto;\n padding-bottom: 4px;\n }\n\n .frame-strip img {\n height: 60px;\n border-radius: 6px;\n border: 2px solid transparent;\n cursor: pointer;\n opacity: 0.7;\n }\n\n .frame-strip img[selected] {\n border-color: #7d2f2f;\n opacity: 1;\n }\n\n .click-stage {\n position: relative;\n line-height: 0;\n }\n\n .click-stage img {\n width: 100%;\n border-radius: 8px;\n cursor: crosshair;\n }\n\n .click-dot {\n position: absolute;\n width: 24px;\n height: 24px;\n margin: -12px 0 0 -12px;\n border: 3px solid #ffd400;\n border-radius: 50%;\n pointer-events: none;\n }\n\n .measure-summary {\n background: #f7f7f7;\n border-radius: 8px;\n padding: 10px;\n font-size: 12px;\n color: #333;\n line-height: 1.7;\n white-space: pre-line;\n }\n\n .report-counts {\n display: flex;\n text-align: center;\n border: 1px solid #eee;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .report-counts div {\n flex: 1;\n padding: 10px 0;\n }\n\n .report-counts b {\n display: block;\n font-size: 20px;\n }\n\n .report-counts small {\n font-size: 11px;\n color: #888;\n }\n\n .report-counts div[pass] b {\n color: #2e7d32;\n }\n\n .report-counts div[fail] b {\n color: #c62828;\n }\n\n .report-counts div[etc] b {\n color: #b7791f;\n }\n\n .report-item {\n border-bottom: 1px solid #f0f0f0;\n font-size: 13px;\n color: #333;\n }\n\n .report-head {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 0;\n cursor: pointer;\n }\n\n .report-head .report-text {\n flex: 1;\n min-width: 0;\n }\n\n .report-caret {\n --md-icon-size: 20px;\n color: #999;\n transition: transform 0.2s;\n }\n\n .report-caret[open] {\n transform: rotate(180deg);\n }\n\n .report-basis {\n display: flex;\n flex-direction: column;\n gap: 6px;\n font-size: 12px;\n color: #555;\n background: #f7f7f7;\n border-radius: 6px;\n padding: 10px;\n margin: 0 0 10px 0;\n }\n\n .report-basis .report-ai {\n white-space: pre-line;\n color: #333;\n }\n\n .report-basis .report-used {\n color: #888;\n }\n\n .report-item .verdict {\n font-weight: 700;\n flex-shrink: 0;\n }\n\n .report-item .verdict[pass] {\n color: #2e7d32;\n }\n\n .report-item .verdict[fail] {\n color: #c62828;\n }\n\n .report-item .verdict[etc] {\n color: #b7791f;\n }\n\n /* โ”€โ”€โ”€ ๋กœ๋”ฉ ์˜ค๋ฒ„๋ ˆ์ด โ”€โ”€โ”€ */\n .loading-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 2000;\n }\n\n .loading-overlay .box {\n background: #fff;\n padding: 32px 48px;\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n font-size: 14px;\n color: #555;\n }\n\n .empty-state {\n text-align: center;\n color: #999;\n font-size: 14px;\n padding: 60px 0;\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n\n @state() guide: any = null // plan-shots ์‘๋‹ต {shots, total_shots, markdown}\n @state() sets: (SetInfo | null)[] = [] // ์ดฌ์˜ ๊ฑด๋ณ„ ์—…๋กœ๋“œ๋œ ์„ธํŠธ (shots ์ˆœ์„œ)\n @state() photos: { file: File; url: string; setIndex: number }[] = [] // inspect์— ๋ณด๋‚ธ ๋Œ€ํ‘œ ํ”„๋ ˆ์ž„(ํ‘œ์‹œ/์ฒจ๋ถ€์šฉ)\n @state() result: any = null // inspect ์‘๋‹ต\n @state() mainPhotoIndex: number = 0\n\n @state() panel: PanelMode = 'none'\n @state() selectedItem: any = null\n @state() recaptureBase: number = 0 // ์žฌ๊ฒ€์‚ฌ ์ง„์ž… ์‹œ์ ์˜ ํ”„๋ ˆ์ž„ ์ˆ˜ (used_images ๋ณด์ •์šฉ)\n @state() recaptureSet: SetInfo | null = null // ์žฌ์ดฌ์˜์œผ๋กœ ์ƒˆ๋กœ ์˜ฌ๋ฆฐ ์„ธํŠธ\n @state() setPickerFor: number | null = null // ์„ธํŠธ ๊ณ ๋ฅด๋Š” ์ค‘์ธ ์ดฌ์˜ ๋ฒˆํ˜ธ (-1 = ์žฌ์ดฌ์˜)\n @state() recentSets: any[] = [] // ์ธก์ • ์„œ๋ฒ„์— ์˜ฌ๋ผ์˜จ ์ตœ๊ทผ ์„ธํŠธ (์•ฑ์ด ์ดฌ์˜ ์งํ›„ ์ž๋™ ์ „์†ก)\n @state() recentLoading: boolean = false\n private autoAttachSince: number = 0 // ์ด ์‹œ๊ฐ(์ดˆ) ์ดํ›„ ์—…๋กœ๋“œ๋œ ์„ธํŠธ๋งŒ ์ž๋™ ๋“ฑ๋ก\n @state() expandedReportId: string | null = null // ์ข…ํ•ฉ ๋ฆฌํฌํŠธ์—์„œ ํŽผ์นœ ํ•ญ๋ชฉ(์•„์ฝ”๋””์–ธ)\n\n /* ์ธก์ • ํŒจ๋„ ์ƒํƒœ */\n @state() measureSetIndex: number = 0\n @state() measureInputs: Record<string, string> = {}\n @state() measureRunning: boolean = false\n @state() measureMsg: string = ''\n @state() measureResult: any = null // ์ธก์ • ์„œ๋ฒ„ ์›๋ณธ ์‘๋‹ต โ€” apply-measurement์— ๊ฐ€๊ณต ์—†์ด ์ „๋‹ฌ\n @state() measureImageUrl: string = '' // ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€(์˜ค๋ฒ„๋ ˆ์ด/๊ฒฐ๊ณผ์‚ฌ์ง„)\n @state() thicknessFrames: { slot: number; index: number; thumbUrl?: string }[] = []\n @state() thicknessSlot: number | null = null\n @state() thicknessFrameUrl: string = ''\n @state() thicknessClick: { x: number; y: number } | null = null\n\n @state() loading: boolean = false\n @state() loadingText: string = ''\n /** ๋ฎคํ…Œ์ด์…˜ ๊ฐ€๋Šฅ ์—ฌ๋ถ€('dcsp guest' ๊ถŒํ•œ ๋ณด์œ  ์‹œ false) โ€” ๊ฒŒ์ŠคํŠธ์—๊ฒŒ๋Š” ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ ๋ฒ„ํŠผ์„ ์ˆจ๊ธด๋‹ค */\n @state() private canMutate = false\n\n @query('#setInput') private setInputEl!: HTMLInputElement\n\n /* ์„ธํŠธ ์—…๋กœ๋“œ ๋Œ€์ƒ: ์ดฌ์˜ ๊ฑด ์ธ๋ฑ์Šค(๊ฐ€์ด๋“œ ํ™”๋ฉด) ๋˜๋Š” -1(์žฌ์ดฌ์˜ ํŒจ๋„) */\n private pendingSetIndex: number | null = null\n private objectUrls: string[] = [] // ํŽ˜์ด์ง€ ์ดํƒˆ ์‹œ ์ •๋ฆฌํ•  blob URL๋“ค\n\n /* ์ดฌ์˜ ์•ฑ์— ๋‹ค๋…€์˜จ ๋’ค ํ™”๋ฉด์ด ๋‹ค์‹œ ๋ณด์ด๋ฉด ์˜ฌ๋ผ์˜จ ์„ธํŠธ๋ฅผ ์ฐพ์•„ ์ž๋™ ๋“ฑ๋กํ•œ๋‹ค */\n private _onVisible = () => {\n if (document.visibilityState === 'visible' && this.guide && !this.result) this._autoAttachTaggedSets()\n }\n\n async connectedCallback() {\n super.connectedCallback()\n document.addEventListener('visibilitychange', this._onVisible)\n this.canMutate = await canDcspMutate()\n this.updateContext()\n }\n\n disconnectedCallback() {\n document.removeEventListener('visibilitychange', this._onVisible)\n super.disconnectedCallback()\n }\n\n get context() {\n return {\n title: '๊ฒ€์ธก ๊ด€๋ฆฌ ์ƒ์„ธ - AI ์ž๋™ ๊ฒ€์ธก'\n }\n }\n\n /* ์—”์ง„์— ๋ณด๋‚ผ ๊ฒ€์ธก์š”์ฒญ์„œ: ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ โ†’ {item_id, category, text} */\n get engineChecklist() {\n const items = this.buildingInspection?.checklist?.checklistItems || []\n return [...items]\n .filter(item => (item.name || '').trim()) // ์ด๋ฆ„ ์—†๋Š” ํ•ญ๋ชฉ์€ ๊ฒ€์ธก ๋ถˆ๊ฐ€ โ€” ์—”์ง„ ๊ฒ€์ฆ ์‹คํŒจ ๋ฐฉ์ง€\n .sort((a, b) => (a.sequence || 0) - (b.sequence || 0))\n .map(item => ({\n item_id: item.id,\n category: [item.mainType, item.detailType].filter(Boolean).join(' ยท '),\n text: item.name || '',\n // ๊ฒ€์‚ฌ ๊ธฐ์ค€์€ ์กฐ๋ฌธ '๋ฒˆํ˜ธ'๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณธ๋ฌธ์„ ๋ณด๋‚ด์•ผ ํŒ์ • ๊ทผ๊ฑฐ๊ฐ€ ์‹ค์ œ ๊ธฐ์ค€์— ๋ถ™๋Š”๋‹ค.\n // (์กฐ๋ฌธ ๋ฒˆํ˜ธ๋งŒ ์ฃผ๋ฉด ๋ชจ๋ธ์ด ๊ทธ ๋‚ด์šฉ์„ ๋ชจ๋ฅด๋Š” ์ƒํƒœ๋กœ ํŒ๋‹จํ•œ๋‹ค โ€” ์—”์ง„ ์•ˆ๋‚ด)\n criteria_kcs: _kcsCriteriaText(item.kcsCriteria),\n criteria_site: (item.siteSpecCriteria || '').trim()\n }))\n }\n\n get uploadedSets(): SetInfo[] {\n return this.sets.filter((s): s is SetInfo => !!s)\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n .projectId=${this.project.id}\n ></building-inspection-detail-header>\n\n <div body>\n <div class=\"page-title\">\n AI ์ž๋™ ๊ฒ€์ธก โ€“ ${this.buildingInspection?.checklist?.location || ''}\n <span target>${this.buildingInspection?.checklist?.name || ''}</span>\n </div>\n\n ${this.result ? this._renderResult() : this._renderGuide()}\n </div>\n\n <!-- ์„ธํŠธ ํŒŒ์ผ ์„ ํƒ: video.mov/poses.jsonl/meta.json 3๊ฐœ ๋ฉ€ํ‹ฐ์„ ํƒ ๋˜๋Š” zip 1๊ฐœ.\n accept์„ ๋‘์ง€ ์•Š๋Š”๋‹ค โ€” iOS๋Š” ํ™•์žฅ์ž๋ฅผ UTI๋กœ ๋ฐ”๊ฟ” ๊ฑฐ๋ฅด๋Š”๋ฐ .jsonl์€ ๋งคํ•‘์ด ์—†์–ด\n ํŒŒ์ผ ์•ฑ์—์„œ poses.jsonl์ด ๋น„ํ™œ์„ฑ์œผ๋กœ ๋ณด์ธ๋‹ค. ํŒŒ์ผ๋ช… ๊ฒ€์ฆ์€ ์•„๋ž˜ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ•œ๋‹ค. -->\n <input id=\"setInput\" type=\"file\" multiple @change=${this._onSetFilesSelected} />\n\n ${\n this.loading\n ? html`\n <div class=\"loading-overlay\">\n <div class=\"box\">\n <md-circular-progress indeterminate></md-circular-progress>\n <span>${this.loadingText}</span>\n </div>\n </div>\n `\n : ''\n }\n `\n }\n\n /* โ”€โ”€โ”€ 1๋‹จ๊ณ„: ์ดฌ์˜ ๊ฐ€์ด๋“œ + ์„ธํŠธ ์—…๋กœ๋“œ ํ™”๋ฉด โ”€โ”€โ”€ */\n private _renderGuide() {\n if (!this.guide) {\n return html`<div class=\"empty-state\">์ดฌ์˜ ๊ฐ€์ด๋“œ๋ฅผ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค...</div>`\n }\n\n const shots = this.guide.shots || []\n const total = this.guide.total_shots || shots.length\n const uploaded = this.uploadedSets.length\n const current = shots[Math.min(uploaded, shots.length - 1)]\n const done = uploaded >= total\n\n return html`\n <div class=\"guide-container\">\n <div class=\"step-badge\">๋™์˜์ƒ ${Math.min(uploaded + 1, total)}/${total} ยท ${current?.target || '์ดฌ์˜'}</div>\n <div class=\"guide-title\">${current?.target || ''}${done ? ' ์ดฌ์˜ ์™„๋ฃŒ' : ''}</div>\n <div class=\"guide-desc\">\n ์ „์šฉ ์ดฌ์˜ ์•ฑ(LidarInspector)์œผ๋กœ ๋™์˜์ƒ์„ ์ดฌ์˜ํ•œ ๋’ค, ์•ฑ์ด ๋งŒ๋“  ํŒŒ์ผ 3๊ฐœ(video.movยทposes.jsonlยทmeta.json)๋ฅผ ์ดฌ์˜ ๊ฑด๋งˆ๋‹ค\n ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”. ์ผ๋ฐ˜ ์นด๋ฉ”๋ผ ๋™์˜์ƒ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\n </div>\n\n <div class=\"card\">\n <h4>์ดฌ์˜ ๊ฐ€์ด๋“œ (๋™์˜์ƒ ${total}๊ฑด)</h4>\n <ul>\n ${shots.map(s => html`<li>์ดฌ์˜ ${s.shot_no || ''} ยท ${s.target} โ€” ${s.how}</li>`)}\n </ul>\n </div>\n\n <div class=\"card\">\n <h4>๊ณตํ†ต ์ดฌ์˜๋ฒ• โ€” ์˜†์œผ๋กœ ์ด๋™ ยท ๋Œ€์ƒ ์ •๋ฉด ์œ ์ง€ ยท ๋Œ€์ƒ ์ „์ฒด ํฌํ•จ</h4>\n <img class=\"capture-guide-img\" src=${captureGuideImg} alt=\"์ดฌ์˜ ์•ˆ๋‚ด\" />\n </div>\n\n <div class=\"card\" style=\"display: flex; flex-direction: column; gap: 10px;\">\n <div class=\"progress-row\">\n <span>์ดฌ์˜ ์„ธํŠธ ์—…๋กœ๋“œ</span>\n <span>${uploaded} / ${total}</span>\n </div>\n <div class=\"progress-bar\"><div style=\"width: ${total ? (uploaded / total) * 100 : 0}%\"></div></div>\n ${shots.map((s, i) => {\n const set = this.sets[i]\n return html`\n <div class=\"set-card\" ?uploaded=${!!set} @click=${() => !set && this._openSetChooser(i)}>\n <md-icon>${set ? 'check_circle' : 'video_file'}</md-icon>\n <div class=\"set-main\">\n <b>์ดฌ์˜ ${s.shot_no || i + 1} ยท ${s.target}</b>\n ${\n set\n ? html`์„ธํŠธ ์—ฐ๊ฒฐ ์™„๋ฃŒ (${set.setId}) ${set.warnings.map(w => html`<div class=\"set-warn\">โš  ${w}</div>`)}`\n : html`ใ€Œ์•ฑ์œผ๋กœ ์ดฌ์˜ใ€์„ ๋ˆ„๋ฅด๋ฉด ์ดฌ์˜ ํ›„ ์ด ์นธ์— ์ž๋™ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค ยท ํƒญํ•˜๋ฉด ์ง์ ‘ ์„ ํƒ`\n }\n </div>\n ${\n set\n ? html`<button\n class=\"text-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openSetChooser(i)\n }}\n >\n ๊ต์ฒด\n </button>`\n : html`<a class=\"shoot-link\" href=${this._shotAppLink(s, i)} @click=${(e: Event) => e.stopPropagation()}>\n <md-icon>photo_camera</md-icon>์•ฑ์œผ๋กœ ์ดฌ์˜\n </a>`\n }\n </div>\n ${this.setPickerFor === i ? this._renderSetChooser(i) : ''}\n `\n })}\n </div>\n\n <button class=\"primary-button\" ?disabled=${uploaded === 0} @click=${() => this._runInspection()}>\n AI ์ž๋™ ํŒ์ • ์‹คํ–‰ ${uploaded ? `(์„ธํŠธ ${uploaded}/${total})` : ''}\n </button>\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ 2๋‹จ๊ณ„: ํŒ์ • ๊ฒฐ๊ณผ ํ™”๋ฉด โ”€โ”€โ”€ */\n\n /* ํ•ญ๋ชฉ ๊ทธ๋ฃน: auto(ํŒ์ •์™„๋ฃŒ) / recapture(์žฌ์ดฌ์˜) / measure(๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ) / manual(AI ๋ฏธ์ง€์›ยท์˜ค๋ฅ˜) */\n private _groupOf(item: any): 'auto' | 'recapture' | 'measure' | 'manual' {\n if (item.verdict === 'pass' || item.verdict === 'fail') return 'auto'\n if (item.verdict === 'hold') return 'recapture'\n if (item.verdict === 'pending' && item.pending_reason === 'measure') return 'measure'\n return 'manual'\n }\n\n /* verdict โ†’ ํ™”๋ฉด ๋ผ๋ฒจ (pending์€ pending_reason์œผ๋กœ ์„ธ๋ถ„) */\n private _verdictLabel(item: any): string {\n if (item.verdict === 'pending') {\n return item.pending_reason === 'measure' ? '๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ ํ•„์š”' : 'AI ๋ฏธ์ง€์›'\n }\n return VERDICT_LABEL[item.verdict] || item.verdict\n }\n\n private _renderResult() {\n const items = this._sortedItems()\n const autoItems = items.filter(it => this._groupOf(it) === 'auto')\n const recaptureItems = items.filter(it => this._groupOf(it) === 'recapture')\n const measureItems = items.filter(it => this._groupOf(it) === 'measure')\n const manualItems = items.filter(it => this._groupOf(it) === 'manual')\n const moreCount = recaptureItems.length + measureItems.length + manualItems.length\n\n // ํด๋ฆญํ•œ ํ•ญ๋ชฉ์˜ used_images๋งŒ ํ‘œ์‹œ (์„ ํƒ ์—†์œผ๋ฉด ์ „์ฒด ํ•ญ๋ชฉ ํ•ฉ์ง‘ํ•ฉ). used_images๋Š” ์ „์ฒด ํ”„๋ ˆ์ž„ ๊ธฐ์ค€ 1-based\n const focusItems = this.selectedItem ? [this.selectedItem] : items\n const usedNos = new Set<number>()\n for (const it of focusItems) for (const n of it.used_images || []) usedNos.add(n)\n const usedPhotos = this.photos.map((photo, i) => ({ photo, no: i + 1 })).filter(x => usedNos.has(x.no))\n const mainPhoto = usedPhotos[this.mainPhotoIndex]\n\n let no = 0\n\n return html`\n <div class=\"result-body\">\n <div class=\"photo-pane\">\n <div class=\"caption\">ํŒ์ •์— ์‚ฌ์šฉ๋œ ํ”„๋ ˆ์ž„ (๋™์˜์ƒ์—์„œ ์ถ”์ถœ)</div>\n <div class=\"photo-main\">${mainPhoto ? html`<img src=${mainPhoto.photo.url} alt=\"ํ˜„์žฅ ํ”„๋ ˆ์ž„\" />` : ''}</div>\n <div class=\"photo-thumbs\">\n ${usedPhotos.map(\n (x, i) => html`\n <img\n src=${x.photo.url}\n alt=\"ํ”„๋ ˆ์ž„ ${x.no}\"\n ?selected=${i === this.mainPhotoIndex}\n @click=${() => (this.mainPhotoIndex = i)}\n />\n `\n )}\n </div>\n </div>\n\n <div class=\"items-pane\">\n <div class=\"summary-banner\">\n ์ ์šฉ ํ•ญ๋ชฉ ${items.length}๊ฐœ ยท ์ž๋™ ํŒ์ • ${autoItems.length}๊ฐœ ยท ์ถ”๊ฐ€ ์ž‘์—… ${moreCount}๊ฐœ\n </div>\n\n ${\n autoItems.length\n ? html`\n <div class=\"group-title\">์ž๋™ ํŒ์ • ์™„๋ฃŒ (${autoItems.length})</div>\n ${autoItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n moreCount\n ? html`\n <div class=\"group-title\">์ถ”๊ฐ€ ์ž‘์—… ํ•„์š” (${moreCount} ๋‚จ์Œ)</div>\n ${\n recaptureItems.length\n ? html`\n <div class=\"group-subtitle\">์žฌ์ดฌ์˜ ํ•„์š” (${recaptureItems.length})</div>\n ${recaptureItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n measureItems.length\n ? html`\n <div class=\"group-subtitle\">๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ ํ•„์š” โ€” 3D ๊ณ„์ธก (${measureItems.length})</div>\n ${measureItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n ${\n manualItems.length\n ? html`\n <div class=\"group-subtitle\">AI ๋ฏธ์ง€์› โ€” ๊ฐ๋ฆฌ์ž ์ˆ˜๋™ ํ™•์ธ (${manualItems.length})</div>\n ${manualItems.map(it => this._renderItemCard(it, ++no))}\n `\n : ''\n }\n `\n : ''\n }\n\n <button class=\"primary-button\" @click=${this._openReport}>์ข…ํ•ฉ ๊ฒ€์‚ฌ ๋ฆฌํฌํŠธ</button>\n </div>\n\n ${this.panel !== 'none' ? this._renderSidePane() : ''}\n </div>\n `\n }\n\n private _renderItemCard(item: any, no: number) {\n const group = this._groupOf(item)\n // ์ธก์ • ์™„๋ฃŒ ํ•ญ๋ชฉ์€ summary(์ธก์ • ํ•œ ์ค„ ์„ค๋ช…)๋ฅผ ์ž๋ฅด์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ, VLM ํ•ญ๋ชฉ์€ ๊ด€์ฐฐ/์‚ฌ์œ \n const desc =\n item.measurements && item.reason\n ? item.reason\n : item.observation\n ? `๊ด€์ฐฐ: ${item.observation}`\n : item.reason || item.measure?.question || ''\n\n return html`\n <div class=\"item-card\" ?selected=${this.selectedItem?.item_id === item.item_id} @click=${() => this._openDetail(item)}>\n <div class=\"item-no\">${no}</div>\n <div class=\"item-main\">\n <div class=\"item-name\">${item.text}</div>\n <div>\n ${\n group === 'auto'\n ? html`<span class=\"chip\">${ROUTING_LABEL[item.routing] || item.routing}</span>\n <span class=\"chip-verdict\">${this._verdictLabel(item)}</span>`\n : group === 'recapture'\n ? html`<span class=\"chip\">์ถ”๊ฐ€ ์ดฌ์˜ ํ•„์š”</span>`\n : group === 'measure'\n ? html`<span class=\"chip\">AI ์ธก์ • ๋ชจ๋ธ</span> <span class=\"chip-verdict\">๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ ํ•„์š”</span>`\n : html`<span class=\"chip\">๋ฏธ์ง€์›</span>`\n }\n </div>\n <div class=\"item-desc\">${desc}</div>\n </div>\n ${\n group === 'auto'\n ? html`\n <div class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${VERDICT_LABEL[item.verdict]}\n </div>\n `\n : group === 'recapture'\n ? html`\n <button\n class=\"capture-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openRecapture(item)\n }}\n >\n ์ดฌ์˜ํ•˜๊ธฐ\n </button>\n `\n : group === 'measure'\n ? html`\n <button\n class=\"measure-button\"\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openMeasure(item)\n }}\n >\n ${item.measure?.next_action === 'select_and_input' ? '์ธก์ • ์ง„ํ–‰' : '๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ'}\n </button>\n `\n : html`<div class=\"badge\" etc>${this._verdictLabel(item)}</div>`\n }\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ ์šฐ์ธก ํŒจ๋„: ์ƒ์„ธ / ์žฌ์ดฌ์˜ / ์ธก์ • / ๋ฆฌํฌํŠธ โ”€โ”€โ”€ */\n private _renderSidePane() {\n if (this.panel === 'detail' && this.selectedItem) return this._renderDetailPane(this.selectedItem)\n if (this.panel === 'recapture' && this.selectedItem) return this._renderRecapturePane(this.selectedItem)\n if (this.panel === 'measure' && this.selectedItem) return this._renderMeasurePane(this.selectedItem)\n if (this.panel === 'report') return this._renderReportPane()\n return ''\n }\n\n private _renderDetailPane(item: any) {\n const auto = item.verdict === 'pass' || item.verdict === 'fail'\n const routingLabel = ROUTING_LABEL[item.routing] || item.routing\n const verdictLabel = this._verdictLabel(item)\n const measured = !!item.measurements // ์ธก์ • ๋ชจ๋ธ๋กœ ํŒ์ •๋œ ํ•ญ๋ชฉ โ€” ์‹ ๋ขฐ๋„๋Š” ํ™•๋ฅ ์ด ์—†์–ด ๋น„์šด๋‹ค\n\n return html`\n <div class=\"side-pane\">\n <div class=\"detail-header\">\n <span class=\"badge\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'} ?etc=${!auto}>\n ${routingLabel}\n </span>\n <h3>${verdictLabel}</h3>\n </div>\n <div class=\"detail-summary\">${(item.observation || item.ai_report || '').trim()}</div>\n <div class=\"kv-grid\">\n <div class=\"kv\">\n <label>ํŒ์ •</label>\n <span class=\"verdict-value\" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>\n ${verdictLabel || '-'}\n </span>\n </div>\n ${\n !measured && item.confidence != null\n ? html`\n <div class=\"kv\">\n <label>์‹ ๋ขฐ๋„</label>\n <span>${Math.round(item.confidence * 100)}%</span>\n </div>\n `\n : ''\n }\n <div class=\"kv\">\n <label>์ฒ˜๋ฆฌ</label>\n <span>${routingLabel || '-'}</span>\n </div>\n </div>\n\n <div class=\"reason-box\">\n <div class=\"reason-verdict\">\n <label style=\"font-size: 11px;color: #7d2f2f; display: block; font-weight: bold;\">ํŒ๋‹จ ๊ทผ๊ฑฐ</label>\n ${item.reason}\n </div>\n </div>\n\n ${item.image_data ? html`<img class=\"evidence-img\" src=${item.image_data} alt=\"์ธก์ • ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€\" />` : ''}\n\n <button class=\"text-button\" @click=${this._closePanel}>๋‹ซ๊ธฐ</button>\n </div>\n `\n }\n\n private _renderRecapturePane(item: any) {\n const shot = item.recapture_shots?.[0]\n\n return html`\n <div class=\"side-pane\">\n <h3>${item.text}</h3>\n <div class=\"why-box\">\n <b>์™œ ์žฌ์ดฌ์˜์ด ํ•„์š”ํ•œ๊ฐ€์š”?</b><br />\n ${item.reason || 'ํŒ์ •์„ ์œ„ํ•ด ์ถ”๊ฐ€ ์ดฌ์˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'}\n </div>\n ${\n shot\n ? html`\n <div>\n <h4 style=\"margin: 0 0 8px 0; font-size: 13px;\">์ดฌ์˜ ๊ฐ€์ด๋“œ</h4>\n <div style=\"font-size: 12px; color: #555;\">${shot.target} โ€” ${shot.how}</div>\n </div>\n `\n : ''\n }\n <div class=\"app-links\">\n <span>์•ฑ์œผ๋กœ ์žฌ์ดฌ์˜</span>\n <a href=${`${appCaptureLink(this._shotTechnique(shot))}&set=${encodeURIComponent(this._shotTag(0))}`}> ์ดฌ์˜ ์‹œ์ž‘ </a>\n </div>\n <div class=\"set-card\" ?uploaded=${!!this.recaptureSet} @click=${() => this._openSetChooser(-1)}>\n <md-icon>${this.recaptureSet ? 'check_circle' : 'video_file'}</md-icon>\n <div class=\"set-main\">\n <b>์žฌ์ดฌ์˜ ์„ธํŠธ</b>\n ${\n this.recaptureSet\n ? html`์„ธํŠธ ์—…๋กœ๋“œ ์™„๋ฃŒ ${this.recaptureSet.warnings.map(w => html`<div class=\"set-warn\">โš  ${w}</div>`)}`\n : html`์•ฑ์œผ๋กœ ์žฌ์ดฌ์˜ํ•œ ์„ธํŠธ๋ฅผ ์„ ํƒ (๋˜๋Š” ํŒŒ์ผ ์ง์ ‘ ์„ ํƒ)`\n }\n </div>\n </div>\n ${this.setPickerFor === -1 ? this._renderSetChooser(-1) : ''}\n ${\n this.recaptureSet ? html`<button class=\"primary-button\" @click=${() => this._runInspection()}>์žฌ๊ฒ€์‚ฌ ์‹คํ–‰</button>` : ''\n }\n <button class=\"text-button\" @click=${this._closePanel}>๋‹ซ๊ธฐ</button>\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ ์ธก์ • ํŒจ๋„ (โ‘ฃ ์ฒ ๊ทผ ๋ฐฐ๊ทผ ๊ธธ์ด / โ‘ค ๊ธฐ๋‘ฅยท๋ฒฝ์ฒด ๋‘๊ป˜) โ”€โ”€โ”€ */\n\n /* operator_inputs ์ •์˜ ๊ธฐ๋ฐ˜ ์ˆซ์ž/ํ…์ŠคํŠธ ์ž…๋ ฅ ๋ Œ๋” (slotยทclickยทn_frames๋Š” ๋ณ„๋„ UI/๊ณ ์ •) */\n private _renderMeasureFields(item: any) {\n const defs = item.measure?.operator_inputs || []\n const fields: { key: string; label: string; desc?: string; def?: any }[] = []\n for (const d of defs) {\n if (d.key === 'n_frames' || d.key === 'slot' || d.key === 'click') continue\n if (d.fields) {\n // ๋ณตํ•ฉ ์ž…๋ ฅ(targets ๋“ฑ): ํ•˜์œ„ ํ•„๋“œ๋ฅผ ๊ฐ๊ฐ ์ž…๋ ฅ์œผ๋กœ ํŽผ์นœ๋‹ค\n for (const [k, desc] of Object.entries(d.fields)) {\n if (k === 'name') continue // ๋ถ€์žฌ๋ช…์€ ๊ฒ€์‚ฌ ํ•ญ๋ชฉ๋ช…์œผ๋กœ ์ž๋™ ์ง€์ •\n fields.push({ key: k, label: FIELD_LABEL[k] || k, desc: String(desc) })\n }\n } else {\n fields.push({ key: d.key, label: FIELD_LABEL[d.key] || d.key, desc: d.desc, def: d.default })\n }\n }\n return fields.map(\n f => html`\n <div class=\"measure-field\">\n <label title=${f.desc || ''}>${f.label}${f.desc ? html` <span style=\"color:#aaa\">โ€” ${f.desc}</span>` : ''}</label>\n <input\n type=\"number\"\n inputmode=\"decimal\"\n .value=${this.measureInputs[f.key] ?? (f.def != null ? String(f.def) : '')}\n placeholder=\"๋„๋ฉด๊ฐ’\"\n @input=${(e: Event) => {\n this.measureInputs = { ...this.measureInputs, [f.key]: (e.target as HTMLInputElement).value }\n }}\n />\n </div>\n `\n )\n }\n\n private _renderMeasurePane(item: any) {\n const measure = item.measure || {}\n const isThickness = measure.next_action === 'select_and_input'\n const setOptions = this.uploadedSets\n const done = !!this.measureResult\n\n return html`\n <div class=\"side-pane\">\n <h3>${item.text}</h3>\n <div class=\"detail-header\">\n <span class=\"chip\">3D ๊ณ„์ธก</span>\n <span style=\"font-size: 12px; color: #777;\">${measure.name || ''} (${measure.status || ''})</span>\n </div>\n ${measure.capture_guide ? html`<div class=\"why-box\">๐Ÿ“ท ${measure.capture_guide}</div>` : ''}\n <img\n class=\"capture-guide-img\"\n style=\"background: #fff; border: 1px solid #eee; padding: 6px;\"\n src=${isThickness ? pictoMemberImg : pictoRebarImg}\n alt=\"์ดฌ์˜ ์•ˆ๋‚ด\"\n />\n\n ${\n setOptions.length > 1\n ? html`\n <div class=\"measure-field\">\n <label>์ธก์ •ํ•  ์ดฌ์˜ ์„ธํŠธ</label>\n <select\n .value=${String(this.measureSetIndex)}\n @change=${(e: Event) => this._onMeasureSetChange(parseInt((e.target as HTMLSelectElement).value))}\n >\n ${setOptions.map(\n (s, i) =>\n html`<option value=${i} ?selected=${i === this.measureSetIndex}>\n ์„ธํŠธ ${i + 1}${s.technique ? ` (${s.technique})` : ''}\n </option>`\n )}\n </select>\n </div>\n `\n : ''\n }\n ${isThickness ? this._renderThicknessPicker() : ''} ${this._renderMeasureFields(item)}\n ${\n this.measureRunning\n ? html`\n <div class=\"measure-msg\">\n <md-circular-progress indeterminate></md-circular-progress>\n <span>${this.measureMsg || '์ธก์ • ์ค‘...'}</span>\n </div>\n `\n : html`\n <button\n class=\"primary-button\"\n ?disabled=${isThickness && (this.thicknessSlot === null || !this.thicknessClick)}\n @click=${() => (isThickness ? this._runThicknessMeasure(item) : this._runRebarMeasure(item))}\n >\n ${done ? '๋‹ค์‹œ ์ธก์ •' : isThickness ? '์ธก์ • ์‹คํ–‰ (30~40์ดˆ)' : '์ธก์ • ์‹œ์ž‘ (์•ฝ 45์ดˆ)'}\n </button>\n `\n }\n ${\n done\n ? html`\n ${\n this.measureResult.summary || this.measureResult.summary_line || this.measureResult.headline\n ? html`<div class=\"measure-summary\">\n ${this.measureResult.summary || this.measureResult.summary_line || this.measureResult.headline}\n </div>`\n : ''\n }\n ${this.measureImageUrl ? html`<img class=\"evidence-img\" src=${this.measureImageUrl} alt=\"์ธก์ • ๊ทผ๊ฑฐ\" />` : ''}\n ${\n this.canMutate\n ? html`<button class=\"primary-button\" @click=${() => this._applyMeasurement(item)}>ํŒ์ • ํ™•์ •</button>`\n : ''\n }\n `\n : ''\n }\n\n <button class=\"text-button\" @click=${this._closePanel}>๋‹ซ๊ธฐ</button>\n </div>\n `\n }\n\n /* โ‘ค ๋‘๊ป˜: ํ”„๋ ˆ์ž„ ์„ ํƒ + ์ธก์ •๋ฉด ํด๋ฆญ (์ž๋™ ๋ฉด ์„ ํƒ์€ ์ •ํ™•๋„๊ฐ€ ๋‚ฎ์•„ ํด๋ฆญ ๋‹จ๊ณ„ ์ƒ๋žต ๋ถˆ๊ฐ€) */\n private _renderThicknessPicker() {\n return html`\n <div class=\"measure-field\">\n <label>โ‘  ๋ชจ์„œ๋ฆฌ๊ฐ€ ์ž˜ ๋ณด์ด๋Š” ํ”„๋ ˆ์ž„์„ ๊ณ ๋ฅด์„ธ์š”</label>\n <div class=\"frame-strip\">\n ${this.thicknessFrames.map(\n f => html`\n <img\n src=${f.thumbUrl || ''}\n alt=\"ํ”„๋ ˆ์ž„ ${f.index}\"\n ?selected=${this.thicknessSlot === f.slot}\n @click=${() => this._selectThicknessFrame(f.slot)}\n />\n `\n )}\n </div>\n </div>\n ${\n this.thicknessFrameUrl\n ? html`\n <div class=\"measure-field\">\n <label>โ‘ก ์žด ๋ฉด์˜ ๊ฐ€์šด๋ฐ๋ฅผ ํ•œ ๋ฒˆ ํƒญํ•˜์„ธ์š” (๋ชจ์„œ๋ฆฌยท์ฒ ๊ทผ ์œ„ ๋ง๊ณ  <b>๋ฉด ์œ„</b>)</label>\n <div class=\"click-stage\">\n <img src=${this.thicknessFrameUrl} alt=\"์„ ํƒ ํ”„๋ ˆ์ž„\" @click=${this._onThicknessClick} />\n ${\n this.thicknessClick\n ? html`<div\n class=\"click-dot\"\n style=\"left: ${this.thicknessClick.x * 100}%; top: ${this.thicknessClick.y * 100}%\"\n ></div>`\n : ''\n }\n </div>\n </div>\n `\n : ''\n }\n `\n }\n\n private _renderReportPane() {\n const items = this._sortedItems()\n const summary = this.result?.summary || {}\n const etcCount = (summary.hold || 0) + (summary.pending || 0) + (summary.error || 0)\n\n return html`\n <div class=\"side-pane\">\n <h3>์ข…ํ•ฉ ๊ฒ€์‚ฌ ๋ฆฌํฌํŠธ</h3>\n <div class=\"report-counts\">\n <div pass><b>${summary.pass || 0}</b><small>์ ํ•ฉ</small></div>\n <div fail><b>${summary.fail || 0}</b><small>๋ถ€์ ํ•ฉ</small></div>\n <div etc><b>${etcCount}</b><small>๋ฏธ๊ฒ€์‚ฌ</small></div>\n </div>\n <div style=\"overflow-y: auto; max-height: 380px;\">\n ${items.map((it, i) => {\n const expanded = this.expandedReportId === it.item_id\n return html`\n <div class=\"report-item\">\n <div class=\"report-head\" @click=${() => this._toggleReportItem(it.item_id)}>\n <span class=\"report-text\">${i + 1}. ${it.text}</span>\n <span\n class=\"verdict\"\n ?pass=${it.verdict === 'pass'}\n ?fail=${it.verdict === 'fail'}\n ?etc=${it.verdict !== 'pass' && it.verdict !== 'fail'}\n >\n ${this._verdictLabel(it)}\n </span>\n <md-icon class=\"report-caret\" ?open=${expanded}>expand_more</md-icon>\n </div>\n ${\n expanded\n ? html`\n <div class=\"report-basis\">\n ${it.ai_report ? html`<div class=\"report-ai\">${(it.ai_report || '').trim()}</div>` : ''}\n ${it.observation ? html`<div>๊ด€์ฐฐ: ${it.observation}</div>` : ''}\n ${it.reason ? html`<div>ํŒ๋‹จ: ${it.reason}</div>` : ''}\n ${\n it.used_images?.length\n ? html`<div class=\"report-used\">๊ทผ๊ฑฐ ํ”„๋ ˆ์ž„: ${it.used_images.map(n => `#${n}`).join(', ')}</div>`\n : ''\n }\n </div>\n `\n : ''\n }\n </div>\n `\n })}\n </div>\n ${this.canMutate ? html`<button class=\"primary-button\" @click=${this._registerInspection}>๊ฒ€์‚ฌ ๋“ฑ๋ก</button>` : ''}\n <button class=\"text-button\" @click=${this._closePanel}>๋‹ซ๊ธฐ</button>\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ ๋ผ์ดํ”„์‚ฌ์ดํด โ”€โ”€โ”€ */\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this._resetAll()\n this.buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(this.buildingInspectionId)\n await this._loadShotGuide()\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n checklist {\n id\n name\n location\n checklistItems {\n id\n sequence\n mainType\n detailType\n name\n kcsCriteria\n siteSpecCriteria\n }\n }\n buildingLevel {\n id\n floor\n building {\n id\n name\n buildingComplex {\n id\n }\n }\n }\n }\n }\n `,\n variables: { buildingInspectionId }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n // ์‚ญ์ œ(soft delete)๋๊ฑฐ๋‚˜ ๋‹ค๋ฅธ projectType์˜ ๊ฒ€์ธก์ด๋ฉด ์„œ๋ฒ„๊ฐ€ null์„ ์ค€๋‹ค.\n // ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋’ค ์ฟผ๋ฆฌ์— undefined๊ฐ€ ์‹ค๋ ค GraphQL ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.\n if (!this.buildingInspection) {\n notify({ message: '์‚ญ์ œ๋˜์—ˆ๊ฑฐ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฒ€์ธก์ž…๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: { buildingComplexId }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n /* โ”€โ”€โ”€ ์„œ๋ฒ„ ํ˜ธ์ถœ ๊ณตํ†ต โ”€โ”€โ”€ */\n\n /* ์—”์ง„ ์‹คํ–‰ ๊ณตํ†ต ํ˜ธ์ถœ: input(JSON) + ํŒŒ์ผ๋“ค์„ multipart๋กœ ์ „์†ก */\n private async _callEngine(input: any, files: File[] = []) {\n const form = new FormData()\n form.append('input', JSON.stringify(input))\n for (const file of files) form.append('files', file, file.name)\n\n const response = await fetch(ENGINE_RUN_URL, {\n method: 'POST',\n headers: { Authorization: ENGINE_AUTH },\n body: form\n })\n const raw = await response.json()\n const data = raw?.result || {}\n if (data?.status !== 'success') {\n throw new Error(data?.error || raw?.error || 'AI ์—”์ง„ ํ˜ธ์ถœ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')\n }\n return data.result\n }\n\n /* ์ธก์ • ์„œ๋ฒ„ ํ˜ธ์ถœ (JSON ์‘๋‹ต) */\n private async _callMeasure(path: string, init: RequestInit = {}) {\n const response = await fetch(`${MEASURE_BASE_URL}${path}`, {\n ...init,\n headers: { ...((init.headers as any) || {}), Authorization: MEASURE_AUTH }\n })\n const data = await response.json().catch(() => ({}))\n if (!response.ok) {\n const msg = data?.errors?.join('\\n') || data?.detail || data?.error || `์ธก์ • ์„œ๋ฒ„ ์˜ค๋ฅ˜ (${response.status})`\n throw new Error(msg)\n }\n return data\n }\n\n /* ์ธก์ • ์„œ๋ฒ„ ์ด๋ฏธ์ง€ โ†’ blob URL (img src๋Š” ์ธ์ฆ ํ—ค๋”๋ฅผ ๋ชป ์‹ค์–ด์„œ fetch๋กœ ๋ฐ›๋Š”๋‹ค) */\n private async _fetchMeasureImage(path: string): Promise<string> {\n const response = await fetch(`${MEASURE_BASE_URL}${path}`, { headers: { Authorization: MEASURE_AUTH } })\n if (!response.ok) throw new Error(`์ด๋ฏธ์ง€ ์ˆ˜์‹  ์‹คํŒจ (${response.status})`)\n const url = URL.createObjectURL(await response.blob())\n this.objectUrls.push(url)\n return url\n }\n\n /* [1๋‹จ๊ณ„] ์ดฌ์˜ ๊ฐ€์ด๋“œ ์ƒ์„ฑ (plan-shots) */\n private async _loadShotGuide() {\n const checklist = this.engineChecklist\n if (!checklist.length) {\n notify({ message: '์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n\n try {\n this.loading = true\n this.loadingText = 'AI ์ดฌ์˜ ๊ฐ€์ด๋“œ ์ƒ์„ฑ ์ค‘...'\n this.guide = await this._callEngine({ action: 'plan-shots', checklist })\n this.sets = new Array((this.guide?.shots || []).length).fill(null)\n // ์–ด๋А ์ดฌ์˜์—๋„ ๋ฐฐ์ •๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด ๊ทธ ํ•ญ๋ชฉ์€ ํŒ์ • ๊ทผ๊ฑฐ๊ฐ€ ์—†๋‹ค โ†’ ์žฌ์ƒ์„ฑ ๊ถŒ๊ณ \n const unassigned = this.guide?.unassigned_items || []\n if (unassigned.length) {\n notify({\n message: `์ดฌ์˜์— ๋ฐฐ์ •๋˜์ง€ ์•Š์€ ๊ฒ€์‚ฌํ•ญ๋ชฉ์ด ${unassigned.length}๊ฑด ์žˆ์Šต๋‹ˆ๋‹ค. ์ดฌ์˜ ๊ฐ€์ด๋“œ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ด๋ณด์„ธ์š”.`,\n level: 'warn'\n })\n }\n // ์ž๋™ ๋“ฑ๋ก ๊ธฐ์ค€ ์‹œ๊ฐ โ€” ์ด ์‹œ์  ์ดํ›„ ์˜ฌ๋ผ์˜จ ์„ธํŠธ๋งŒ ์ž๋™์œผ๋กœ ๋ถ™์ธ๋‹ค.\n // (์˜ˆ์ „ ํ…Œ์ŠคํŠธ ์„ธํŠธ๊ฐ€ ํƒœ๊ทธ๋งŒ ๊ฐ™๋‹ค๊ณ  ์ฑ„์›Œ์ง€๋ฉด \"์ฐ์ง€๋„ ์•Š์•˜๋Š”๋ฐ ์™„๋ฃŒ\"๋กœ ๋ณด์ธ๋‹ค)\n this.autoAttachSince = Date.now() / 1000\n } catch (error) {\n console.error('์ดฌ์˜ ๊ฐ€์ด๋“œ ์ƒ์„ฑ ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* plan-shots๊ฐ€ ์ค€ ์ดฌ์˜๋ณ„ ํ•ญ๋ชฉ ๋ฐฐ์ • โ†’ {์ดฌ์˜๋ฒˆํ˜ธ: [ํ•ญ๋ชฉID]} (์—”์ง„ inspect ์˜ shot_items).\n ๋ฐฐ์ • ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ตฌ๋ฒ„์ „ ์‘๋‹ต์ด๋ฉด null ์„ ๋Œ๋ ค ์ข…์ „๋Œ€๋กœ(์ „ ํ•ญ๋ชฉ์ด ์ „ ์‚ฌ์ง„) ๋™์ž‘์‹œํ‚จ๋‹ค. */\n private _shotItemsMap(): Record<string, string[]> | null {\n const shots = this.guide?.shots || []\n const map: Record<string, string[]> = {}\n for (let i = 0; i < shots.length; i++) {\n const items = shots[i]?.items\n if (!Array.isArray(items) || !items.length) continue\n map[String(shots[i]?.shot_no || i + 1)] = items\n }\n return Object.keys(map).length ? map : null\n }\n\n /* ์„ธํŠธ๊ฐ€ ์•„์ง ์•ˆ ์˜ฌ๋ผ์˜จ ์ดฌ์˜์— ๋ฐฐ์ •๋œ ํ•ญ๋ชฉ ID ์ง‘ํ•ฉ (๊ทธ ํ•ญ๋ชฉ์€ ํŒ์ •ํ•  ์‚ฌ์ง„์ด ์—†๋‹ค) */\n private _itemsAwaitingShot(): Set<string> {\n const pending = new Set<string>()\n const shots = this.guide?.shots || []\n for (let i = 0; i < shots.length; i++) {\n if (this.sets[i]) continue\n for (const id of shots[i]?.items || []) pending.add(id)\n }\n return pending\n }\n\n /* ์ดฌ์˜ ์นธ๋งˆ๋‹ค ๊ณ ์œ  ํƒœ๊ทธ โ€” ์•ฑ์— ๋ถ€์žฌ ID๋กœ ๋„˜๊ฒจ ๋‘๋ฉด, ์˜ฌ๋ผ์˜จ ์„ธํŠธ์˜ member_id๋กœ\n \"์–ด๋А ์ดฌ์˜ ์นธ์˜ ๊ฒƒ์ธ์ง€\" ๋˜์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค (์•ฑโ†”ํ”Œ๋žซํผ ์™•๋ณต์— ์‹๋ณ„์ž๊ฐ€ ์—†์–ด์„œ ์“ฐ๋Š” ๋ฐฉ๋ฒ•) */\n private _shotTag(shotNo: number) {\n return `${(this.buildingInspectionId || 'ins').replace(/-/g, '').slice(0, 6)}-${shotNo}`\n }\n\n /* ์ดฌ์˜ ์ง€์‹œ๋ฌธ์—์„œ ๊ธฐ์ˆ  ์ถ”๋ก  โ€” ์•ฑ์˜ ์ดฌ์˜ ์•ˆ๋‚ด๋งŒ ๋‹ฌ๋ผ์ง„๋‹ค(์ธก์ •์€ meta.technique๋ฅผ ์•ˆ ๋ด„) */\n private _shotTechnique(shot: any): 'cover' | 'thick' {\n const text = `${shot?.target || ''} ${shot?.how || ''}`\n if (/๋‘๊ป˜|์ฝ˜ํฌ๋ฆฌํŠธ\\s*๋ฉด|๊ฑฐํ‘ธ์ง‘|ํƒˆํ˜•|๋ฒฝ์ฒด\\s*๋ฉด/.test(text)) return 'thick'\n return 'cover'\n }\n\n private _shotAppLink(shot: any, index: number) {\n const tag = this._shotTag(shot?.shot_no || index + 1)\n return `${appCaptureLink(this._shotTechnique(shot))}&set=${encodeURIComponent(tag)}`\n }\n\n /* ์•ฑ์—์„œ ์ดฌ์˜ํ•˜๊ณ  ๋Œ์•„์˜ค๋ฉด ํƒœ๊ทธ๋กœ ์ฐพ์•„ ํ•ด๋‹น ์ดฌ์˜ ์นธ์— ์ž๋™ ๋“ฑ๋ก */\n private async _autoAttachTaggedSets() {\n if (!this.guide?.shots?.length) return\n await this._loadRecentSets()\n const used = new Set(this.uploadedSets.map(s => s.setId))\n const attached: number[] = []\n const next = [...this.sets]\n\n this.guide.shots.forEach((shot: any, i: number) => {\n if (next[i]) return\n const tag = this._shotTag(shot?.shot_no || i + 1)\n // ์ด ํ™”๋ฉด์„ ์—ฐ ๋’ค์— ์˜ฌ๋ผ์˜จ ๊ฒƒ๋งŒ โ€” ์˜ˆ์ „ ์„ธํŠธ๋Š” ๋ชฉ๋ก์—์„œ ์ง์ ‘ ๊ณ ๋ฅด๊ฒŒ ๋‘”๋‹ค\n const hit = this.recentSets.find(\n s => s.member_id === tag && !used.has(s.set_id) && (s.uploaded_at || 0) >= this.autoAttachSince\n )\n if (!hit) return\n used.add(hit.set_id)\n next[i] = { setId: hit.set_id, technique: hit.technique, label: `์„ธํŠธ ${hit.set_id}`, warnings: [] }\n attached.push(shot?.shot_no || i + 1)\n })\n\n if (attached.length) {\n this.sets = next\n notify({ message: `์ดฌ์˜ ${attached.join('ยท')} ์„ธํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.` })\n }\n }\n\n /* ์„ธํŠธ ์„ ํƒ ๋ชฉ๋ก โ€” ์•ฑ์ด ์˜ฌ๋ฆฐ ์ตœ๊ทผ ์„ธํŠธ + ํŒŒ์ผ ์ง์ ‘ ์„ ํƒ ํด๋ฐฑ */\n private _renderSetChooser(index: number) {\n return html`\n <div class=\"set-chooser\">\n ${\n this.recentLoading\n ? html`<div class=\"chooser-empty\">๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...</div>`\n : this.recentSets.length\n ? this.recentSets.map(\n s => html`\n <button class=\"chooser-row\" @click=${() => this._pickExistingSet(index, s)}>\n <b>${_setTimeLabel(s.set_id)}</b>\n <span>\n ${s.member_id ? `${s.member_id} ยท ` : ''}${s.technique || '๊ธฐ์ˆ  ๋ฏธ์ƒ'}\n ${s.duration_sec ? ` ยท ${Math.round(s.duration_sec)}์ดˆ` : ''}\n </span>\n </button>\n `\n )\n : html`<div class=\"chooser-empty\">\n ์˜ฌ๋ผ์˜จ ์„ธํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์นด๋“œ์˜ ใ€Œ์•ฑ์œผ๋กœ ์ดฌ์˜ใ€์œผ๋กœ ์ฐ์œผ๋ฉด ์—ฌ๊ธฐ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.\n </div>`\n }\n <div class=\"chooser-actions\">\n <button class=\"text-button\" @click=${() => this._loadRecentSets()}>์ƒˆ๋กœ๊ณ ์นจ</button>\n <button class=\"text-button\" @click=${() => this._openSetPicker(index)}>ํŒŒ์ผ ์ง์ ‘ ์„ ํƒ</button>\n </div>\n </div>\n `\n }\n\n /* โ”€โ”€โ”€ ์„ธํŠธ ์„ ํƒ/์—…๋กœ๋“œ โ”€โ”€โ”€ */\n\n /* ์ดฌ์˜ ์•ฑ์ด ์ธก์ • ์„œ๋ฒ„๋กœ ๋ฐ”๋กœ ์˜ฌ๋ฆฐ ์„ธํŠธ ๋ชฉ๋ก (์•ฑ์—์„œ ์ดฌ์˜ ํ›„ ์ €์žฅํ•˜๋ฉด ์ž๋™ ์ „์†ก๋œ๋‹ค) */\n private async _loadRecentSets() {\n try {\n this.recentLoading = true\n const data = await this._callMeasure('/api/sets?limit=20')\n this.recentSets = data.sets || []\n } catch (error) {\n console.error('์„ธํŠธ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ:', error)\n this.recentSets = []\n } finally {\n this.recentLoading = false\n }\n }\n\n /* ์นด๋“œ ํƒญ โ†’ ๋ชฉ๋ก ํŽผ์น˜๊ธฐ (์ด๋ฏธ ๊ณ ๋ฅธ ์„ธํŠธ๋Š” ์ œ์™ธํ•˜๊ณ  ๋ณด์—ฌ์ค€๋‹ค) */\n private _openSetChooser(index: number) {\n this.setPickerFor = this.setPickerFor === index ? null : index\n if (this.setPickerFor !== null) this._loadRecentSets()\n }\n\n /* ๋ชฉ๋ก์—์„œ ์„ธํŠธ ์„ ํƒ โ€” ์ด๋ฏธ ์„œ๋ฒ„์— ์žˆ์œผ๋ฏ€๋กœ ์—…๋กœ๋“œ ์—†์ด ์—ฐ๊ฒฐ๋งŒ ํ•œ๋‹ค */\n private _pickExistingSet(index: number, s: any) {\n const set: SetInfo = {\n setId: s.set_id,\n technique: s.technique,\n label: `์„ธํŠธ ${s.set_id}`,\n warnings: []\n }\n if (index === -1) {\n this.recaptureSet = set\n } else {\n const next = [...this.sets]\n next[index] = set\n this.sets = next\n }\n this.setPickerFor = null\n }\n\n private _openSetPicker(index: number) {\n this.pendingSetIndex = index\n this.setPickerFor = null\n this.setInputEl?.click()\n }\n\n private async _onSetFilesSelected(event: Event) {\n const input = event.target as HTMLInputElement\n const files = Array.from(input?.files || [])\n input.value = ''\n const index = this.pendingSetIndex\n this.pendingSetIndex = null\n if (!files.length || index === null) return\n\n // zip 1๊ฐœ ๋˜๋Š” ํ•„์ˆ˜ 3ํŒŒ์ผ ๊ฒ€์ฆ (ํ•œ ๋ฒˆ์˜ ์„ ํƒ์œผ๋กœ 3๊ฐœ ๋ฉ€ํ‹ฐ์„ ํƒ)\n const isZip = files.length === 1 && /\\.zip$/i.test(files[0].name)\n if (!isZip) {\n const names = files.map(f => f.name.toLowerCase())\n const missing = SET_FILES.filter(n => !names.includes(n))\n if (missing.length) {\n notify({\n message: `์„ธํŠธ ํŒŒ์ผ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ: ${missing.join(', ')} โ€” ์ดฌ์˜ ์•ฑ์ด ๋งŒ๋“  3๊ฐœ ํŒŒ์ผ์„ ํ•œ ๋ฒˆ์— ์„ ํƒํ•ด์ฃผ์„ธ์š”.`,\n level: 'warn'\n })\n return\n }\n }\n\n try {\n this.loading = true\n this.loadingText = '์ดฌ์˜ ์„ธํŠธ ์—…๋กœ๋“œ ์ค‘...'\n const form = new FormData()\n for (const f of files) if (isZip || SET_FILES.includes(f.name.toLowerCase())) form.append('files', f, f.name)\n const data = await this._callMeasure('/api/sets', { method: 'POST', body: form })\n\n const set: SetInfo = {\n setId: data.set_id,\n technique: data.technique,\n label: `์„ธํŠธ ${data.set_id}`,\n warnings: data.warnings || []\n }\n if (index === -1) {\n this.recaptureSet = set\n } else {\n const next = [...this.sets]\n next[index] = set\n this.sets = next\n }\n for (const w of set.warnings) notify({ message: `์—…๋กœ๋“œ ๊ฒฝ๊ณ : ${w}`, level: 'warn' })\n } catch (error) {\n console.error('์„ธํŠธ ์—…๋กœ๋“œ ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* ์„ธํŠธ์˜ ๋Œ€ํ‘œ 3ํ”„๋ ˆ์ž„(vlm)์„ ๋ฐ›์•„ File ๋ชฉ๋ก์œผ๋กœ (์‹œ๊ฐ„์ˆœ ์œ ์ง€) */\n private async _fetchVlmFrames(set: SetInfo, setIndex: number): Promise<{ file: File; url: string; setIndex: number }[]> {\n const data = await this._callMeasure(`/api/sets/${set.setId}/vlm-frames`)\n const out: { file: File; url: string; setIndex: number }[] = []\n for (const f of data.frames || []) {\n const response = await fetch(`${MEASURE_BASE_URL}${f.url}`, { headers: { Authorization: MEASURE_AUTH } })\n if (!response.ok) throw new Error(`ํ”„๋ ˆ์ž„ ์ˆ˜์‹  ์‹คํŒจ (${response.status})`)\n const blob = await response.blob()\n const file = new File([blob], `set${setIndex + 1}_${f.name}`, { type: 'image/jpeg' })\n const url = URL.createObjectURL(file)\n this.objectUrls.push(url)\n out.push({ file, url, setIndex })\n }\n return out\n }\n\n /* [2๋‹จ๊ณ„] ์ž๋™ ํŒ์ • ์‹คํ–‰ (inspect)\n * - ์ตœ์ดˆ ํŒ์ •: ์—…๋กœ๋“œ๋œ ๋ชจ๋“  ์„ธํŠธ์˜ ๋Œ€ํ‘œ 3ํ”„๋ ˆ์ž„ + ์ „์ฒด ์ฒดํฌ๋ฆฌ์ŠคํŠธ (input_kind=video_frames)\n * - ์žฌ๊ฒ€์‚ฌ(์žฌ์ดฌ์˜ ํŒจ๋„): ์ƒˆ ์„ธํŠธ์˜ 3ํ”„๋ ˆ์ž„๋งŒ + ํ•ด๋‹น ํ•ญ๋ชฉ๋งŒ ์žฌํŒ์ • ํ›„ ๊ฒฐ๊ณผ ๋ณ‘ํ•ฉ */\n private async _runInspection() {\n const isRecapture = this.panel === 'recapture' && !!this.selectedItem\n\n try {\n this.loading = true\n this.loadingText = '๋™์˜์ƒ ํ”„๋ ˆ์ž„ ์ถ”์ถœ ์ค‘...'\n\n let newPhotos: { file: File; url: string; setIndex: number }[] = []\n const imageShots: number[] = [] // ์‚ฌ์ง„๋งˆ๋‹ค ์–ด๋А ์ดฌ์˜(shot_no)์˜ ๊ฒƒ์ธ์ง€\n if (isRecapture) {\n if (!this.recaptureSet) {\n notify({ message: '์žฌ์ดฌ์˜ ์„ธํŠธ๋ฅผ ๋จผ์ € ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”.', level: 'warn' })\n return\n }\n this.recaptureBase = this.photos.length\n newPhotos = await this._fetchVlmFrames(this.recaptureSet, this.sets.length)\n } else {\n if (!this.uploadedSets.length) {\n notify({ message: '์—…๋กœ๋“œ๋œ ์ดฌ์˜ ์„ธํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n // ์ดฌ์˜ ์นธ ์ˆœ์„œ๋Œ€๋กœ โ€” ๋น„์–ด ์žˆ๋Š” ์นธ์€ ๊ฑด๋„ˆ๋›ฐ๋˜ ์ดฌ์˜๋ฒˆํ˜ธ๋Š” ๊ฐ€์ด๋“œ ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค\n for (let i = 0; i < this.sets.length; i++) {\n const set = this.sets[i]\n if (!set) continue\n const frames = await this._fetchVlmFrames(set, i)\n const shotNo = this.guide?.shots?.[i]?.shot_no || i + 1\n for (const _ of frames) imageShots.push(shotNo)\n newPhotos = [...newPhotos, ...frames]\n }\n }\n\n const files = newPhotos.map(p => p.file)\n let checklist = isRecapture\n ? this.engineChecklist.filter(c => c.item_id === this.selectedItem.item_id)\n : this.engineChecklist\n\n // ์•„์ง ์•ˆ ์˜ฌ๋ผ์˜จ ์ดฌ์˜์— ๋ฐฐ์ •๋œ ํ•ญ๋ชฉ์€ ์ด๋ฒˆ ํŒ์ •์—์„œ ๋บ€๋‹ค.\n // ์—”์ง„์€ ๊ทธ๋Ÿฐ ํ•ญ๋ชฉ์˜ ์‚ฌ์ง„ ๋ฒ”์œ„๋ฅผ ๋น„์šฐ๋Š” ๋Œ€์‹  '์ „์ฒด ์‚ฌ์ง„'์„ ์ฃผ๋ฏ€๋กœ, ๊ทธ๋ƒฅ ๋‘๋ฉด\n // ํƒ€์„ค ํ›„ ํ•ญ๋ชฉ์ด ๋ฐฐ๊ทผ ์‚ฌ์ง„์œผ๋กœ ํŒ์ •๋œ๋‹ค (๋ฐฐ๊ทผยทํƒ€์„ค์€ ๋ฉฐ์น  ๊ฐ„๊ฒฉ์œผ๋กœ ์ฐ๋Š”๋‹ค).\n if (!isRecapture) {\n const pending = this._itemsAwaitingShot()\n if (pending.size) {\n checklist = checklist.filter(c => !pending.has(c.item_id))\n notify({\n message: `์•„์ง ์ดฌ์˜๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ ${pending.size}๊ฑด์€ ์ด๋ฒˆ ํŒ์ •์—์„œ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ดฌ์˜์„ ์˜ฌ๋ฆฐ ๋’ค ๋‹ค์‹œ ์‹คํ–‰ํ•˜์„ธ์š”.`,\n level: 'warn'\n })\n }\n }\n\n const input: any = { action: 'inspect', checklist, input_kind: 'video_frames' }\n // ์ดฌ์˜ ๋ฐฐ์ • ๋˜๋Œ๋ฆฌ๊ธฐ โ€” ์ด๊ฑธ ์•ˆ ๋ณด๋‚ด๋ฉด ๋ชจ๋“  ํ•ญ๋ชฉ์ด ๋ชจ๋“  ์‚ฌ์ง„์„ ๋ณด๊ฒŒ ๋˜์–ด\n // \"ํƒ€์„ค ํ›„ ํ•ญ๋ชฉ์ด ๋ฐฐ๊ทผ ์‚ฌ์ง„์œผ๋กœ ํŒ์ •๋˜๋Š”\" ์˜คํŒ์ด ๋‚œ๋‹ค (์—”์ง„ ์‹ค์ฆ์—์„œ ์‹ค์ œ ๋ฐœ์ƒ).\n // ๋ฐฐ์ •๋œ ์ดฌ์˜์ด ์•ˆ ์˜ฌ๋ผ์˜จ ํ•ญ๋ชฉ์€ ์—”์ง„์ด hold ๋กœ ๋‘”๋‹ค โ€” ๋‚จ์˜ ์‚ฌ์ง„์œผ๋กœ ํŒ์ •ํ•˜์ง€ ์•Š๊ฒŒ.\n const shotItems = this._shotItemsMap()\n if (!isRecapture && shotItems && imageShots.length === files.length) {\n input.image_shots = imageShots.join(',')\n input.shot_items = JSON.stringify(shotItems)\n }\n\n this.loadingText = 'AI ์ž๋™ ํŒ์ • ์ค‘... (์ตœ๋Œ€ 1~2๋ถ„ ์†Œ์š”)'\n const result = await this._callEngine(input, files)\n\n if (isRecapture) {\n this.photos = [...this.photos, ...newPhotos]\n this._mergeItems(result?.items_sorted || result?.items || [], this.recaptureBase)\n this.recaptureSet = null\n } else {\n this.photos = newPhotos\n this.result = result\n }\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n } catch (error) {\n console.error('AI ์ž๋™ ํŒ์ • ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* ๋ถ€๋ถ„ ์žฌํŒ์ •/์ธก์ • ํ™•์ • ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์กด ์ „์ฒด ๊ฒฐ๊ณผ์— ๋ณ‘ํ•ฉํ•˜๊ณ  summary ์žฌ๊ณ„์‚ฐ\n * - usedImageBase: used_images(๋ถ€๋ถ„์ง‘ํ•ฉ 1-based) โ†’ ์ „์ฒด ํ”„๋ ˆ์ž„ ์ธ๋ฑ์Šค ๋ณด์ •๊ฐ’ */\n private _mergeItems(updatedItems: any[], usedImageBase: number = 0) {\n const updated = updatedItems.map((it: any) => ({\n ...it,\n used_images: (it.used_images || []).map((n: number) => n + usedImageBase)\n }))\n const byId = new Map(updated.map((it: any) => [it.item_id, it]))\n const replace = (arr: any[]) => (arr || []).map(it => byId.get(it.item_id) || it)\n\n const items = replace(this.result?.items)\n const itemsSorted = this.result?.items_sorted ? replace(this.result.items_sorted) : undefined\n\n const summary: Record<string, number> = { pass: 0, fail: 0, hold: 0, pending: 0, error: 0, measure: 0 }\n for (const it of itemsSorted || items) {\n summary[it.verdict] = (summary[it.verdict] || 0) + 1\n if (it.verdict === 'pending' && it.pending_reason === 'measure') summary.measure += 1\n }\n summary.total = (itemsSorted || items).length\n\n this.result = { ...this.result, items, ...(itemsSorted ? { items_sorted: itemsSorted } : {}), summary }\n }\n\n private _resetAll() {\n this.objectUrls.forEach(u => URL.revokeObjectURL(u))\n this.objectUrls = []\n this.guide = null\n this.sets = []\n this.photos = []\n this.result = null\n this.panel = 'none'\n this.selectedItem = null\n this.mainPhotoIndex = 0\n this.recaptureBase = 0\n this.recaptureSet = null\n this._resetMeasureState()\n }\n\n private _resetMeasureState() {\n this.measureInputs = {}\n this.measureRunning = false\n this.measureMsg = ''\n this.measureResult = null\n this.measureImageUrl = ''\n this.thicknessFrames = []\n this.thicknessSlot = null\n this.thicknessFrameUrl = ''\n this.thicknessClick = null\n }\n\n /* โ”€โ”€โ”€ ํŒจ๋„ ์—ด๊ธฐ/๋‹ซ๊ธฐ โ”€โ”€โ”€ */\n private _openDetail(item: any) {\n const group = this._groupOf(item)\n // ์žฌ์ดฌ์˜/์ธก์ • ํ•ญ๋ชฉ์€ ์ƒ์„ธ ๋Œ€์‹  ํ•ด๋‹น ์ž‘์—… ํŒจ๋„์„ ๋ฐ”๋กœ ํ‘œ์‹œ\n if (group === 'recapture') {\n this._openRecapture(item)\n return\n }\n if (group === 'measure') {\n this._openMeasure(item)\n return\n }\n this.selectedItem = item\n this.mainPhotoIndex = 0 // ์„ ํƒ ํ•ญ๋ชฉ์˜ ์ฒซ ์‚ฌ์šฉ ํ”„๋ ˆ์ž„๋ถ€ํ„ฐ ํ‘œ์‹œ\n this.panel = 'detail'\n }\n\n private _openRecapture(item: any) {\n this.selectedItem = item\n this.recaptureSet = null\n this.panel = 'recapture'\n }\n\n private async _openMeasure(item: any) {\n this.selectedItem = item\n this._resetMeasureState()\n this.panel = 'measure'\n\n // ์ดฌ์˜ ๊ธฐ์ˆ ์ด ๋งž๋Š” ์„ธํŠธ๋ฅผ ๊ธฐ๋ณธ ์„ ํƒ (โ‘ฃ=04_cover, โ‘ค=05_thickness)\n const wantTech = item.measure?.model_id?.startsWith('rebar') ? '04_cover' : '05_thickness'\n const sets = this.uploadedSets\n const found = sets.findIndex(s => s.technique === wantTech)\n this.measureSetIndex = found >= 0 ? found : 0\n\n if (item.measure?.next_action === 'select_and_input') {\n await this._loadThicknessFrames()\n }\n }\n\n private async _onMeasureSetChange(index: number) {\n this.measureSetIndex = index\n this.measureResult = null\n this.measureImageUrl = ''\n if (this.selectedItem?.measure?.next_action === 'select_and_input') {\n this.thicknessSlot = null\n this.thicknessFrameUrl = ''\n this.thicknessClick = null\n await this._loadThicknessFrames()\n }\n }\n\n private _openReport = () => {\n this.panel = 'report'\n this.selectedItem = null\n this.expandedReportId = null\n // ๋ฆฌํฌํŠธ ํŒจ๋„์ด ์šฐ์ธก ์ƒ๋‹จ์— ๋œจ๋ฏ€๋กœ ์Šคํฌ๋กค์„ ๋งจ ์œ„๋กœ (ํŒ์ • ๋ฆฌ์ŠคํŠธ๋Š” ์ž์ฒด ์Šคํฌ๋กค)\n this.updateComplete.then(() => {\n this.renderRoot.querySelector('div[body]')?.scrollTo({ top: 0, behavior: 'smooth' })\n this.renderRoot.querySelector('.items-pane')?.scrollTo({ top: 0, behavior: 'smooth' })\n })\n }\n\n /* ์ข…ํ•ฉ ๋ฆฌํฌํŠธ ํ•ญ๋ชฉ ํŽผ์น˜๊ธฐ/์ ‘๊ธฐ (ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ํŽผ์นจ) */\n private _toggleReportItem(id: string) {\n this.expandedReportId = this.expandedReportId === id ? null : id\n }\n\n private _closePanel = () => {\n this.panel = 'none'\n this.selectedItem = null\n }\n\n private _sortedItems(): any[] {\n return this.result?.items_sorted || this.result?.items || []\n }\n\n /* โ”€โ”€โ”€ โ‘ฃ ์ฒ ๊ทผ ๋ฐฐ๊ทผ ๊ธธ์ด ์ธก์ • (๋น„๋™๊ธฐ job + ์ง„ํ–‰๋ฅ  ํด๋ง) โ”€โ”€โ”€ */\n private async _runRebarMeasure(item: any) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) {\n notify({ message: '์ธก์ •ํ•  ์ดฌ์˜ ์„ธํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n const memberDim = parseFloat(this.measureInputs.member_dim_mm)\n const coverSpec = parseFloat(this.measureInputs.cover_spec_mm)\n if (!memberDim || !coverSpec) {\n notify({ message: '์„ค๊ณ„ ๋‹จ๋ฉด ์น˜์ˆ˜์™€ ๊ธฐ์ค€ ํ”ผ๋ณต๋‘๊ป˜๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. (๋„๋ฉด๊ฐ’)', level: 'warn' })\n return\n }\n\n try {\n this.measureRunning = true\n this.measureMsg = '์ธก์ • ์‹œ์ž‘...'\n this.measureResult = null\n this.measureImageUrl = ''\n\n const { job } = await this._callMeasure('/api/rebar/measure', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n set_id: set.setId,\n targets: [{ name: item.text || '์ธก์ • ๋Œ€์ƒ', member_dim_mm: memberDim, cover_spec_mm: coverSpec }]\n })\n })\n\n // ์ง„ํ–‰๋ฅ  ํด๋ง โ€” msg๋Š” ์„œ๋ฒ„๊ฐ€ ์ฃผ๋Š” ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ ๊ทธ๋Œ€๋กœ ํ‘œ์‹œ\n let status: any\n do {\n await new Promise(r => setTimeout(r, 1500))\n status = await this._callMeasure(`/api/job/${job}`)\n this.measureMsg = status.msg || '์ธก์ • ์ค‘...'\n } while (status.state !== 'done' && this.panel === 'measure')\n\n if (this.panel !== 'measure') return // ํŒจ๋„์„ ๋‹ซ์•˜์œผ๋ฉด ๊ฒฐ๊ณผ ๋ฌด์‹œ\n const r = status.result || {}\n if (!r.ok) {\n notify({ message: r.why || '์ธก์ •์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.', level: 'error' })\n // ์‹คํŒจ ๊ฒฐ๊ณผ๋„ ํ™•์ • ๊ฐ€๋Šฅ(์—”์ง„์ด hold๋กœ ๋ณ€ํ™˜) โ€” ๊ฒฐ๊ณผ๋Š” ๋ณด๊ด€ํ•˜๋˜ ์ด๋ฏธ์ง€ ์—†์Œ\n this.measureResult = r\n return\n }\n this.measureResult = r\n // ์ธก์ •์— ์“ด ํ”„๋ ˆ์ž„ ์ค‘ ๊ฐ€์šด๋ฐ ํ”„๋ ˆ์ž„์— ์ธก์ •์„  ์˜ค๋ฒ„๋ ˆ์ด\n const frames = r.frames_used || []\n const overlayIdx = frames.length ? frames[Math.floor(frames.length / 2)] : 0\n try {\n this.measureImageUrl = await this._fetchMeasureImage(`/api/rebar/overlay/${job}/${overlayIdx}?w=1280`)\n } catch (e) {\n console.warn('์˜ค๋ฒ„๋ ˆ์ด ์ˆ˜์‹  ์‹คํŒจ:', e)\n }\n } catch (error) {\n console.error('์ฒ ๊ทผ ์ธก์ • ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n /* โ”€โ”€โ”€ โ‘ค ๊ธฐ๋‘ฅยท๋ฒฝ์ฒด ๋‘๊ป˜ ์ธก์ • (ํ”„๋ ˆ์ž„ ์„ ํƒ + ๋ฉด ํด๋ฆญ, ๋™๊ธฐ) โ”€โ”€โ”€ */\n private async _loadThicknessFrames() {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) return\n try {\n this.measureRunning = true\n this.measureMsg = '์Šค์œ•์—์„œ ํ”„๋ ˆ์ž„ ๋ฝ‘๋Š” ์ค‘... (์ฒซ ํ˜ธ์ถœ์€ 10์ดˆ์ฏค)'\n const data = await this._callMeasure(`/api/thickness/frames/${set.setId}`)\n const frames = (data.frames || []) as { slot: number; index: number }[]\n // ์ธ๋„ค์ผ์€ ์ธ์ฆ ๋•Œ๋ฌธ์— fetch๋กœ ๋ฐ›์•„ blob URL๋กœ\n const withThumbs: { slot: number; index: number; thumbUrl?: string }[] = []\n for (const f of frames) {\n try {\n const thumbUrl = await this._fetchMeasureImage(`/api/thickness/frame/${set.setId}/${f.slot}?thumb=1`)\n withThumbs.push({ ...f, thumbUrl })\n } catch {\n withThumbs.push(f)\n }\n }\n this.thicknessFrames = withThumbs\n if (withThumbs.length) await this._selectThicknessFrame(withThumbs[Math.floor(withThumbs.length / 2)].slot)\n } catch (error) {\n console.error('ํ”„๋ ˆ์ž„ ๋ชฉ๋ก ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n private async _selectThicknessFrame(slot: number) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set) return\n this.thicknessSlot = slot\n this.thicknessClick = null\n try {\n this.thicknessFrameUrl = await this._fetchMeasureImage(`/api/thickness/frame/${set.setId}/${slot}`)\n } catch (error) {\n notify({ message: (error as Error).message, level: 'error' })\n }\n }\n\n /* ํด๋ฆญ ์ขŒํ‘œ๋ฅผ ํ‘œ์‹œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ  0~1 ์ •๊ทœํ™” โ€” ์›๋ณธ ํ•ด์ƒ๋„๋Š” ์•Œ ํ•„์š” ์—†๋‹ค */\n private _onThicknessClick = (e: MouseEvent) => {\n if (this.measureRunning) return\n const rect = (e.target as HTMLElement).getBoundingClientRect()\n this.thicknessClick = {\n x: (e.clientX - rect.left) / rect.width,\n y: (e.clientY - rect.top) / rect.height\n }\n }\n\n private async _runThicknessMeasure(item: any) {\n const set = this.uploadedSets[this.measureSetIndex]\n if (!set || this.thicknessSlot === null || !this.thicknessClick) {\n notify({ message: 'ํ”„๋ ˆ์ž„์„ ๊ณ ๋ฅด๊ณ  ์žด ๋ฉด์„ ํƒญํ•ด์ฃผ์„ธ์š”.', level: 'warn' })\n return\n }\n\n try {\n this.measureRunning = true\n this.measureMsg = '์ธก์ • ์ค‘... (์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„ ํ•ฉ์˜ ์ธก์ •, 30~40์ดˆ)'\n this.measureResult = null\n this.measureImageUrl = ''\n\n const form = new FormData()\n form.append('set_id', set.setId)\n form.append('slot', String(this.thicknessSlot))\n form.append('x', String(this.thicknessClick.x))\n form.append('y', String(this.thicknessClick.y))\n if (this.measureInputs.design_mm) form.append('design_mm', this.measureInputs.design_mm)\n if (this.measureInputs.tol_mm) form.append('tol_mm', this.measureInputs.tol_mm)\n\n const r = await this._callMeasure('/api/thickness/measure', { method: 'POST', body: form })\n this.measureResult = r\n if (r.image_data) this.measureImageUrl = r.image_data\n if (!r.ok) notify({ message: r.summary || r.headline || '์ธก์ •์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n } catch (error) {\n console.error('๋‘๊ป˜ ์ธก์ • ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.measureRunning = false\n this.measureMsg = ''\n }\n }\n\n /* โ”€โ”€โ”€ ์ธก์ • ๊ฒฐ๊ณผ โ†’ ํŒ์ • ํ™•์ • (apply-measurement, OpenAI ๋ฏธํ˜ธ์ถœยท์ฆ‰์‹œ ์‘๋‹ต) โ”€โ”€โ”€ */\n private async _applyMeasurement(item: any) {\n if (!this.measureResult) return\n try {\n this.loading = true\n this.loadingText = 'ํŒ์ • ํ™•์ • ์ค‘...'\n // ์ธก์ • ์„œ๋ฒ„ ์‘๋‹ต์„ ๊ฐ€๊ณต ์—†์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ โ€” ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ/hold ์Šน๊ฒฉ์€ ์—”์ง„์ด ์ฒ˜๋ฆฌํ•œ๋‹ค\n const result = await this._callEngine({\n action: 'apply-measurement',\n item: { item_id: item.item_id, text: item.text, category: item.category },\n model_id: item.measure?.model_id || this.measureResult.model_id,\n result: this.measureResult\n })\n\n const judged = { ...item, ...result.item }\n this._mergeItems([judged])\n this._resetMeasureState()\n this.panel = 'none'\n this.selectedItem = null\n\n if (judged.verdict === 'hold') {\n notify({ message: '์ธก์ • ํ’ˆ์งˆ์ด ๊ธฐ์ค€์— ๋ชป ๋ฏธ์ณ ๋ณด๋ฅ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ดฌ์˜์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.', level: 'warn' })\n } else {\n notify({ message: `ํŒ์ •์ด ํ™•์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค: ${this._verdictLabel(judged)}` })\n }\n } catch (error) {\n console.error('ํŒ์ • ํ™•์ • ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n\n /* base64 data URL โ†’ File (์ธก์ • ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€์šฉ) */\n private _dataUrlToFile(dataUrl: string, name: string): File | null {\n try {\n const [head, body] = dataUrl.split(',')\n const mime = head.match(/data:(.*?);/)?.[1] || 'image/jpeg'\n const bin = atob(body)\n const bytes = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i)\n return new File([bytes], name, { type: mime })\n } catch {\n return null\n }\n }\n\n /* โ”€โ”€โ”€ ๊ฒ€์‚ฌ ๋“ฑ๋ก: ๊ฐ๋ฆฌ์ž ํŒ์ • ์ž๋™ ๋ฐ˜์˜ + AIํŒ๋‹จ ๊ทผ๊ฑฐ ์ฒจ๋ถ€ โ”€โ”€โ”€ */\n private async _registerInspection() {\n const items = this._sortedItems()\n if (!items.length) {\n notify({ message: 'ํŒ์ • ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', level: 'warn' })\n return\n }\n // ์ ํ•ฉ/๋ถ€์ ํ•ฉ์œผ๋กœ ์ž๋™ ํŒ์ •๋œ ํ•ญ๋ชฉ๋งŒ ๋ฐ˜์˜ (๋ณด๋ฅ˜/๋ฏธ์ง€์›/์˜ค๋ฅ˜๋Š” ๋ฏธ๊ฒ€์‚ฌ๋กœ ๊ฑด๋„ˆ๋œ€)\n const judged = items.filter(it => it.verdict === 'pass' || it.verdict === 'fail')\n\n try {\n this.loading = true\n this.loadingText = '๊ฒ€์‚ฌ ๊ฒฐ๊ณผ ๋“ฑ๋ก ์ค‘...'\n\n // 1) ๊ฐ๋ฆฌ์ž ์ ํ•ฉ/๋ถ€์ ํ•ฉ ์ž๋™ ์ฑ„์›€ (์ ํ•ฉ/๋ถ€์ ํ•ฉ ํŒ์ •๋œ ํ•ญ๋ชฉ๋งŒ, ์—†์œผ๋ฉด ๊ฑด๋„ˆ๋œ€)\n if (judged.length) {\n const response = await client.mutate({\n mutation: gql`\n mutation UpdateChecklistItemsAiJudgment($items: [ChecklistItemAiJudgment!]!) {\n updateChecklistItemsAiJudgment(items: $items)\n }\n `,\n variables: {\n items: judged.map(it => ({\n id: it.item_id,\n supervisoryConfirmStatus: it.verdict === 'pass' ? 'T' : 'F'\n }))\n }\n })\n\n if (response.errors) throw new Error(response.errors[0]?.message || '๊ฒ€์‚ฌ ๋“ฑ๋ก์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')\n }\n\n // 2) ํ•ญ๋ชฉ๋ณ„ ์ฒจ๋ถ€: ํŒ๋‹จ ๊ทผ๊ฑฐ(AIํŒ๋‹จ ํ…์ŠคํŠธ) + ๊ทผ๊ฑฐ ํ”„๋ ˆ์ž„/์ธก์ • ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€\n // ai_report๋Š” pending/error์—์„œ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์˜ค๋ฏ€๋กœ ๊ทธ ํ•ญ๋ชฉ์€ ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๋Š”๋‹ค\n const attachments: any[] = []\n for (const it of items) {\n if (it.ai_report) {\n attachments.push({\n file: new File([it.ai_report], `AIํŒ๋‹จ_${(it.text || it.item_id).slice(0, 30)}.txt`, { type: 'text/plain' }),\n refBy: it.item_id,\n refType: 'ChecklistItem',\n description: 'AIํŒ๋‹จ'\n })\n }\n for (const n of it.used_images || []) {\n const photo = this.photos[n - 1]\n if (photo) {\n attachments.push({ file: photo.file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AIํŒ๋‹จ' })\n }\n }\n // ์ธก์ • ํ•ญ๋ชฉ์˜ ๊ทผ๊ฑฐ ์ด๋ฏธ์ง€ (apply-measurement ์‘๋‹ต์˜ base64)\n if (it.image_data) {\n const file = this._dataUrlToFile(it.image_data, `AI์ธก์ •๊ทผ๊ฑฐ_${(it.text || it.item_id).slice(0, 30)}.jpg`)\n if (file) attachments.push({ file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AIํŒ๋‹จ' })\n }\n }\n\n if (attachments.length) {\n const attachResponse = await client.mutate({\n mutation: gql`\n mutation CreateAttachments($attachments: [NewAttachment!]!) {\n createAttachments(attachments: $attachments) {\n id\n }\n }\n `,\n variables: { attachments },\n context: { hasUpload: true }\n })\n\n if (attachResponse.errors) throw new Error(attachResponse.errors[0]?.message || 'AIํŒ๋‹จ ์ž๋ฃŒ ์ฒจ๋ถ€์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.')\n }\n\n notify({ message: `๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ๋“ฑ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค. (์ž๋™ ํŒ์ • ${judged.length}๊ฑด ๋ฐ˜์˜)` })\n\n // ๋“ฑ๋ก ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด์œผ๋กœ ์ด๋™\n navigate(`building-inspection-detail-checklist/${this.buildingInspectionId}`)\n } catch (error) {\n console.error('๊ฒ€์‚ฌ ๋“ฑ๋ก ์‹คํŒจ:', error)\n notify({ message: (error as Error).message, level: 'error' })\n } finally {\n this.loading = false\n }\n }\n}\n"]}