fix(agent-office): critical bug fixes from code review — wall pathfinding, drag/click, DPR, culling

- Pathfinder.setBlocked: remove blocked.clear() to preserve wall tiles set by setWalls()
- Pathfinder.findPath: fix dead-code goal exception — remove redundant isBlocked check, keep goal-tile exception in single guard
- OfficeRenderer: track mouseDownPos/_wasDragging; expose wasDragging() method for click-after-drag suppression
- OfficeRenderer._render: track _lastDpr to detect monitor DPR changes; use setTransform instead of scale to avoid accumulation
- TileMap.render: use clientWidth/clientHeight for viewport culling (CSS space, not buffer pixels)
- TaskTab: wrap JSON.parse in try/catch to prevent crash on malformed result_data

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-27 09:40:08 +09:00
parent 3e4f2e0934
commit 6cbdf95596
6 changed files with 37 additions and 11 deletions

View File

@@ -14,7 +14,7 @@ export default function AgentOffice() {
const {
canvasRef, updateAgentState, setAgentNotification,
setTheme, setZoom, hitTest, getZoom
setTheme, setZoom, hitTest, getZoom, wasDragging
} = useOfficeCanvas();
const [selectedAgent, setSelectedAgent] = useState(null);
@@ -37,6 +37,7 @@ export default function AgentOffice() {
// 캔버스 클릭 핸들러
const handleCanvasClick = useCallback((e) => {
if (wasDragging()) return; // 드래그 후 발생하는 클릭 무시
const result = hitTest(e.clientX, e.clientY);
if (result.type === 'agent') {
setSelectedAgent(result.id);
@@ -45,7 +46,7 @@ export default function AgentOffice() {
} else {
setSelectedAgent(null);
}
}, [hitTest, clearNotifications, setAgentNotification]);
}, [hitTest, clearNotifications, setAgentNotification, wasDragging]);
// 테마 변경
const handleThemeChange = useCallback((name) => {