@things-factory/board-ui 10.0.0-beta.64 → 10.0.0-beta.65

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-edit-dispatch.test.js","sourceRoot":"","sources":["../../client/pages/board-edit-dispatch.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * board-edit-dispatch.ts 단위 테스트.\n *\n * 핵심 보호:\n * - 호스트 측 in-place 적용 동작 — scene API (.add/.remove/target.set/.align/...)\n * 호출 인자 + 호출 순서 검증\n * - revert 용 inverse op 정확성 — 적용 직전 좌표/모델 캡처가 정확한가\n * - silent fail (없는 refid, 미만 개수의 refids 등) 분류 — applied:false 반환\n *\n * 호스트 onBoardEditPatch 가 dispatcher 결과를 사용해 missed warning + patchInverses\n * 누적하므로, dispatcher 가 잘못 분류하면 사용자에게는 \"AI 응답이 적용 안 됨\" 또는\n * \"revert 가 동작 안 함\" 회귀로 직접 노출됨.\n */\nimport {\n dispatchBoardEditOp,\n collectAllRefids,\n captureOldKeys,\n computeArrangePositions\n} from './board-edit-dispatch'\nimport type { BoardEditOp } from '@things-factory/board-ai'\n\n// ── Mock things-scene component ─────────────────────────────────────\n// scene 의 컴포넌트는 .model 객체 + .get(key) / .set(merged) / .parent / .components 를 가짐.\n// commander.execute / scene.add / scene.remove / scene.align 등을 mock 으로 캡처.\nfunction makeMockSceneComp(model: any, parent: any = null) {\n const comp: any = {\n model: { ...model },\n parent,\n components: [],\n get(key: string) {\n return this.model[key]\n },\n set(merged: any) {\n this.model = merged\n }\n }\n return comp\n}\n\ninterface SceneOpts {\n components?: Array<{ refid: number; [k: string]: any }>\n rootModel?: any\n}\n\nfunction makeMockScene(opts: SceneOpts = {}) {\n const comps = (opts.components || []).map(m => makeMockSceneComp(m))\n const refidIndexMap = new Map<number, any>()\n for (const c of comps) refidIndexMap.set(c.model.refid, c)\n\n const rootMock: any = opts.rootModel\n ? {\n model: { ...opts.rootModel },\n set(merged: any) {\n this.model = merged\n }\n }\n : null\n\n const calls: any[] = []\n const scene: any = {\n selected: [] as any[],\n rootContainer: { refidIndexMap },\n root: rootMock,\n commander: {\n execute(...args: any[]) {\n calls.push({ method: 'commander.execute', args })\n }\n },\n add(component: any, _bounds: any) {\n calls.push({ method: 'add', component })\n // 새 refid 발급 (auto-increment) — collectAllRefids 가 차집합으로 캡처\n const next = (Math.max(0, ...refidIndexMap.keys()) || 0) + 1\n const newComp = makeMockSceneComp({ ...component, refid: next })\n ;(newComp as any).parent = this.rootContainer\n refidIndexMap.set(next, newComp)\n },\n remove() {\n // selected 의 컴포넌트들을 refidIndexMap 에서 제거\n for (const sel of this.selected) {\n if (sel?.model?.refid != null) refidIndexMap.delete(sel.model.refid)\n }\n calls.push({ method: 'remove', selected: [...this.selected] })\n },\n align(direction: string) {\n calls.push({ method: 'align', direction, selected: [...this.selected] })\n // 좌표 변경 시뮬레이션 — 'left' 면 모든 selected 의 left = 0\n if (direction === 'left') {\n for (const c of this.selected) c.model.left = 0\n }\n },\n distribute(axis: string) {\n calls.push({ method: 'distribute', axis, selected: [...this.selected] })\n },\n group() {\n // group → 새 Group 컴포넌트 1개 생성 + selected 들이 그 자식이 됨\n const next = (Math.max(0, ...refidIndexMap.keys()) || 0) + 1\n const groupComp = makeMockSceneComp({ refid: next, type: 'group' })\n groupComp.components = [...this.selected]\n refidIndexMap.set(next, groupComp)\n calls.push({ method: 'group', children: [...this.selected], newRefid: next })\n },\n ungroup() {\n // selected[0] 의 자식들이 부모로 흡수, group 자체는 제거\n const target = this.selected[0]\n if (target) refidIndexMap.delete(target.model.refid)\n calls.push({ method: 'ungroup', target })\n },\n zorder(direction: string) {\n calls.push({ method: 'zorder', direction, selected: [...this.selected] })\n }\n }\n\n return { scene, calls, refidIndexMap }\n}\n\n// ── collectAllRefids ────────────────────────────────────────────────\ndescribe('collectAllRefids', () => {\n test('refidIndexMap 의 모든 refid 수집', () => {\n const { scene } = makeMockScene({\n components: [{ refid: 1 }, { refid: 35 }, { refid: 99 }]\n })\n expect(collectAllRefids(scene).sort((a, b) => a - b)).toEqual([1, 35, 99])\n })\n\n test('빈 scene → 빈 배열', () => {\n const { scene } = makeMockScene()\n expect(collectAllRefids(scene)).toEqual([])\n })\n\n test('rootContainer 없을 때도 안전', () => {\n expect(collectAllRefids({})).toEqual([])\n expect(collectAllRefids(null)).toEqual([])\n })\n})\n\n// ── captureOldKeys ──────────────────────────────────────────────────\ndescribe('captureOldKeys', () => {\n test('patch 가 건드린 키만 deep-clone 으로 보관', () => {\n const model = { left: 10, top: 20, fillStyle: '#fff', height: 100 }\n const patch = { left: 999, fillStyle: '#000' }\n expect(captureOldKeys(model, patch)).toEqual({ left: 10, fillStyle: '#fff' })\n })\n\n test('원본에 없는 키는 null 보관 (revert 시 명시적 null reset)', () => {\n const model = { left: 10 }\n const patch = { left: 999, newKey: 'x' }\n expect(captureOldKeys(model, patch)).toEqual({ left: 10, newKey: null })\n })\n\n test('nested 값은 통째로 deep-clone (참조 공유 X)', () => {\n const model = { threeD: { material: { color: '#f00' } } }\n const patch = { threeD: { material: { color: '#0f0' } } }\n const out = captureOldKeys(model, patch)\n // 원본 참조와 다른 객체\n expect(out.threeD).not.toBe(model.threeD)\n // 그러나 값은 동일\n expect(out.threeD).toEqual({ material: { color: '#f00' } })\n // 원본 mutate 해도 캡처본은 영향 X\n model.threeD.material.color = '#000'\n expect(out.threeD.material.color).toBe('#f00')\n })\n\n test('patch 가 빈 객체 → 빈 결과', () => {\n expect(captureOldKeys({ a: 1 }, {})).toEqual({})\n expect(captureOldKeys({ a: 1 }, null)).toEqual({})\n })\n\n test('model 이 null 이어도 안전 — 모든 키 null 로', () => {\n expect(captureOldKeys(null, { a: 1, b: 2 })).toEqual({ a: null, b: null })\n })\n})\n\n// ── dispatchBoardEditOp — add ───────────────────────────────────────\ndescribe('dispatchBoardEditOp — add', () => {\n test('정상 — scene.add 호출 + 새 refid 의 inverse remove 반환', () => {\n const { scene, calls, refidIndexMap } = makeMockScene({\n components: [{ refid: 1, type: 'rect' }]\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'add',\n component: { type: 'rect', left: 100 }\n } as BoardEditOp)\n expect(r.applied).toBe(true)\n // mock 의 add 는 refid=2 발급 (max=1 → +1)\n expect(r.inverseOps).toEqual([{ op: 'remove', refid: 2 }])\n expect(calls.find(c => c.method === 'add')).toBeDefined()\n expect(refidIndexMap.has(2)).toBe(true)\n })\n\n test('빈 scene 에 추가 — 첫 refid 1 발급', () => {\n const { scene } = makeMockScene()\n const r = dispatchBoardEditOp(scene, {\n op: 'add',\n component: { type: 'rect' }\n } as BoardEditOp)\n expect(r.applied).toBe(true)\n expect(r.inverseOps).toEqual([{ op: 'remove', refid: 1 }])\n })\n\n test('normalize 콜백 사용 — add 에 전달되는 component 가 normalized', () => {\n const { scene, calls } = makeMockScene()\n const normalize = (c: any) => ({ ...c, value: 50, fillStyle: '#default' })\n dispatchBoardEditOp(\n scene,\n { op: 'add', component: { type: 'gauge' } } as BoardEditOp,\n { normalize }\n )\n const addCall = calls.find(c => c.method === 'add')\n expect(addCall.component.value).toBe(50)\n expect(addCall.component.fillStyle).toBe('#default')\n })\n\n test('normalize 미지정 — component 그대로 전달', () => {\n const { scene, calls } = makeMockScene()\n dispatchBoardEditOp(scene, {\n op: 'add',\n component: { type: 'rect', left: 5 }\n } as BoardEditOp)\n const addCall = calls.find(c => c.method === 'add')\n expect(addCall.component).toEqual({ type: 'rect', left: 5 })\n })\n})\n\n// ── dispatchBoardEditOp — remove ────────────────────────────────────\ndescribe('dispatchBoardEditOp — remove', () => {\n test('정상 — 삭제 직전 model 을 add inverse 로 캡처', () => {\n const { scene, calls, refidIndexMap } = makeMockScene({\n components: [{ refid: 35, type: 'rect', left: 10, name: 'AGV-1' }]\n })\n // 컴포넌트의 parent 를 mock 으로 설정 (remove 가 parent 체크함)\n refidIndexMap.get(35).parent = { fake: 'parent' }\n\n const r = dispatchBoardEditOp(scene, { op: 'remove', refid: 35 })\n expect(r.applied).toBe(true)\n expect(r.inverseOps).toHaveLength(1)\n const inv = r.inverseOps[0] as any\n expect(inv.op).toBe('add')\n expect(inv.component.refid).toBe(35)\n expect(inv.component.name).toBe('AGV-1')\n // scene.remove 호출 + selected 가 target 이었는지\n const removeCall = calls.find(c => c.method === 'remove')\n expect(removeCall.selected[0].model.refid).toBe(35)\n expect(refidIndexMap.has(35)).toBe(false)\n })\n\n test('없는 refid → applied:false, scene.remove 미호출', () => {\n const { scene, calls } = makeMockScene({ components: [{ refid: 1 }] })\n const r = dispatchBoardEditOp(scene, { op: 'remove', refid: 999 })\n expect(r.applied).toBe(false)\n expect(r.inverseOps).toEqual([])\n expect(calls.find(c => c.method === 'remove')).toBeUndefined()\n })\n\n test('parent 가 없는 (orphan) 컴포넌트 → applied:false', () => {\n // 회귀 방지: refidIndexMap 에 있어도 parent 가 없으면 things-scene 의 remove 가\n // 동작하지 않는다 (이미 detach 된 상태). 분명하게 missed 로 분류해야 함.\n const { scene } = makeMockScene({ components: [{ refid: 1 }] })\n // 의도적으로 parent 미설정 (makeMockSceneComp default 가 null)\n const r = dispatchBoardEditOp(scene, { op: 'remove', refid: 1 })\n expect(r.applied).toBe(false)\n })\n\n test('inverse 의 component 는 깊은 클론 — 원본 변형이 복원에 영향 안 줌', () => {\n const { scene, refidIndexMap } = makeMockScene({\n components: [{ refid: 5, threeD: { material: { color: '#f00' } } }]\n })\n refidIndexMap.get(5).parent = { fake: 'p' }\n const original = refidIndexMap.get(5).model\n const r = dispatchBoardEditOp(scene, { op: 'remove', refid: 5 })\n // 원본 model mutate\n original.threeD.material.color = '#0f0'\n const inv = r.inverseOps[0] as any\n expect(inv.component.threeD.material.color).toBe('#f00')\n })\n\n test('selected 복원 — 삭제 대상 외 selected 는 그대로', () => {\n const { scene, refidIndexMap } = makeMockScene({\n components: [{ refid: 1 }, { refid: 2 }]\n })\n refidIndexMap.get(1).parent = { p: 1 }\n const other = refidIndexMap.get(2)\n scene.selected = [refidIndexMap.get(1), other]\n dispatchBoardEditOp(scene, { op: 'remove', refid: 1 })\n expect(scene.selected).toEqual([other])\n })\n})\n\n// ── dispatchBoardEditOp — modify ────────────────────────────────────\ndescribe('dispatchBoardEditOp — modify', () => {\n test('정상 — target.set 에 merged 전달, inverse 는 원본 키 값', () => {\n const { scene, calls, refidIndexMap } = makeMockScene({\n components: [{ refid: 35, type: 'rect', left: 10, top: 20, fillStyle: '#fff' }]\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'modify',\n refid: 35,\n patch: { left: 100, fillStyle: '#000' } as any\n })\n expect(r.applied).toBe(true)\n const target = refidIndexMap.get(35)\n expect(target.model.left).toBe(100)\n expect(target.model.fillStyle).toBe('#000')\n expect(target.model.top).toBe(20) // 다른 키 보존\n // inverse 는 원본 값\n expect(r.inverseOps).toEqual([\n { op: 'modify', refid: 35, patch: { left: 10, fillStyle: '#fff' } }\n ])\n // commander.execute 호출 (snapshot push)\n expect(calls.find(c => c.method === 'commander.execute')).toBeDefined()\n })\n\n test('nested object deep-merge — 색만 바꿀 때 geometry 보존', () => {\n const { scene, refidIndexMap } = makeMockScene({\n components: [\n {\n refid: 1,\n type: 'rect',\n threeD: {\n enabled: true,\n geometry: { type: 'box', size: { x: 100 } },\n material: { color: '#f00', metalness: 0.5 }\n }\n }\n ]\n })\n dispatchBoardEditOp(scene, {\n op: 'modify',\n refid: 1,\n patch: { threeD: { material: { color: '#0f0' } } } as any\n })\n const target = refidIndexMap.get(1)\n expect(target.model.threeD.material.color).toBe('#0f0')\n expect(target.model.threeD.material.metalness).toBe(0.5) // 보존\n expect(target.model.threeD.geometry).toEqual({ type: 'box', size: { x: 100 } })\n expect(target.model.threeD.enabled).toBe(true)\n })\n\n test('없는 refid → applied:false', () => {\n const { scene } = makeMockScene({ components: [{ refid: 1 }] })\n const r = dispatchBoardEditOp(scene, {\n op: 'modify',\n refid: 999,\n patch: { left: 10 } as any\n })\n expect(r.applied).toBe(false)\n expect(r.inverseOps).toEqual([])\n })\n})\n\n// ── dispatchBoardEditOp — modifyBoard ───────────────────────────────\ndescribe('dispatchBoardEditOp — modifyBoard', () => {\n test('정상 — root.set 호출 + inverse 는 root 의 원본 키', () => {\n const { scene, calls } = makeMockScene({\n rootModel: { fillStyle: '#fff', name: 'Floor' },\n components: []\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'modifyBoard',\n patch: { fillStyle: '#0a1929' } as any\n })\n expect(r.applied).toBe(true)\n expect(scene.root.model.fillStyle).toBe('#0a1929')\n expect(scene.root.model.name).toBe('Floor') // 다른 키 보존\n expect(r.inverseOps).toEqual([\n { op: 'modifyBoard', patch: { fillStyle: '#fff' } }\n ])\n expect(calls.find(c => c.method === 'commander.execute')).toBeDefined()\n })\n\n test('patch 의 components 키는 무시 — 자식 변경은 별도 op', () => {\n const { scene } = makeMockScene({\n rootModel: { fillStyle: '#fff' },\n components: [{ refid: 1, type: 'rect' }]\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'modifyBoard',\n patch: { fillStyle: '#000', components: [] } as any\n })\n expect(r.applied).toBe(true)\n expect(scene.root.model.fillStyle).toBe('#000')\n expect(scene.root.model.components).toBeUndefined()\n // inverse 도 components 키 미포함\n const inv = r.inverseOps[0] as any\n expect(Object.keys(inv.patch).sort()).toEqual(['fillStyle'])\n })\n\n test('scene.root 없음 / set 미정의 → applied:false', () => {\n const { scene } = makeMockScene() // rootModel 없음\n const r = dispatchBoardEditOp(scene, {\n op: 'modifyBoard',\n patch: { fillStyle: '#000' } as any\n })\n expect(r.applied).toBe(false)\n })\n\n test('원본에 없는 root 키 → inverse 에 null 보관 (revert 시 reset)', () => {\n const { scene } = makeMockScene({\n rootModel: { fillStyle: '#fff' },\n components: []\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'modifyBoard',\n patch: { sky: 'color', exposure: 0.7 } as any\n })\n expect(r.applied).toBe(true)\n expect(r.inverseOps).toEqual([\n { op: 'modifyBoard', patch: { sky: null, exposure: null } }\n ])\n })\n})\n\n// ── dispatchBoardEditOp — replace ───────────────────────────────────\ndescribe('dispatchBoardEditOp — replace (호스트 wholesale 경로)', () => {\n test('replace 는 dispatcher 가 받지 않음 — applied:false', () => {\n const { scene } = makeMockScene()\n const r = dispatchBoardEditOp(scene, {\n op: 'replace',\n board: { width: 800, height: 600, components: [] } as any\n })\n expect(r.applied).toBe(false)\n expect(r.inverseOps).toEqual([])\n })\n})\n\n// ── dispatchBoardEditOp — align ─────────────────────────────────────\ndescribe('dispatchBoardEditOp — align', () => {\n test('정상 — scene.align 호출 + 직전 좌표를 modify inverse 시퀀스로', () => {\n const { scene, calls, refidIndexMap } = makeMockScene({\n components: [\n { refid: 1, type: 'rect', left: 10, top: 0, width: 100, height: 50 },\n { refid: 2, type: 'rect', left: 50, top: 0, width: 80, height: 40 }\n ]\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'align',\n refids: [1, 2],\n direction: 'left'\n })\n expect(r.applied).toBe(true)\n // mock 의 align('left') 가 모든 selected 의 left=0 으로 만든다\n expect(refidIndexMap.get(1).model.left).toBe(0)\n expect(refidIndexMap.get(2).model.left).toBe(0)\n // inverse 는 직전 좌표를 modify 시퀀스로 — 원래 left 복원\n expect(r.inverseOps).toEqual([\n { op: 'modify', refid: 1, patch: { left: 10, top: 0, width: 100, height: 50 } },\n { op: 'modify', refid: 2, patch: { left: 50, top: 0, width: 80, height: 40 } }\n ])\n const alignCall = calls.find(c => c.method === 'align')\n expect(alignCall.direction).toBe('left')\n })\n\n test('refids 가 1개 미만 — applied:false (align 은 2개 이상 필요)', () => {\n const { scene } = makeMockScene({ components: [{ refid: 1 }] })\n const r = dispatchBoardEditOp(scene, {\n op: 'align',\n refids: [1],\n direction: 'left'\n })\n expect(r.applied).toBe(false)\n })\n\n test('refids 안에 없는 refid 가 있어도 매칭된 게 2개 이상이면 진행', () => {\n const { scene } = makeMockScene({\n components: [\n { refid: 1, left: 10 },\n { refid: 2, left: 20 }\n ]\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'align',\n refids: [1, 999, 2],\n direction: 'left'\n })\n expect(r.applied).toBe(true)\n expect(r.inverseOps).toHaveLength(2)\n })\n\n test('selected 복원 — align 후 직전 selected 으로 되돌림', () => {\n const { scene, refidIndexMap } = makeMockScene({\n components: [{ refid: 1 }, { refid: 2 }]\n })\n const sentinel = { sentinel: true }\n scene.selected = [sentinel]\n dispatchBoardEditOp(scene, {\n op: 'align',\n refids: [1, 2],\n direction: 'left'\n })\n // align 진행 중에는 selected = targets, 완료 후 sentinel 복원\n expect(scene.selected).toEqual([sentinel])\n })\n})\n\n// ── dispatchBoardEditOp — distribute ────────────────────────────────\ndescribe('dispatchBoardEditOp — distribute', () => {\n test('horizontal → scene.distribute(\"HORIZONTAL\") 대문자 매핑', () => {\n const { scene, calls } = makeMockScene({\n components: [{ refid: 1, left: 0, top: 0 }, { refid: 2, left: 100, top: 0 }]\n })\n dispatchBoardEditOp(scene, {\n op: 'distribute',\n refids: [1, 2],\n axis: 'horizontal'\n })\n const dCall = calls.find(c => c.method === 'distribute')\n expect(dCall.axis).toBe('HORIZONTAL') // 대문자 매핑 회귀 방지\n })\n\n test('vertical → scene.distribute(\"VERTICAL\")', () => {\n const { scene, calls } = makeMockScene({\n components: [{ refid: 1, left: 0, top: 0 }, { refid: 2, left: 0, top: 100 }]\n })\n dispatchBoardEditOp(scene, {\n op: 'distribute',\n refids: [1, 2],\n axis: 'vertical'\n })\n expect(calls.find(c => c.method === 'distribute').axis).toBe('VERTICAL')\n })\n\n test('inverse 는 직전 left/top 의 modify 시퀀스 (width/height 미포함)', () => {\n // align 과 달리 distribute 는 좌표만 변경 → inverse 도 좌표만 보관 (size 키 없음)\n const { scene } = makeMockScene({\n components: [\n { refid: 1, left: 10, top: 5, width: 100, height: 50 },\n { refid: 2, left: 50, top: 5, width: 80, height: 40 }\n ]\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'distribute',\n refids: [1, 2],\n axis: 'horizontal'\n })\n expect(r.inverseOps).toEqual([\n { op: 'modify', refid: 1, patch: { left: 10, top: 5 } },\n { op: 'modify', refid: 2, patch: { left: 50, top: 5 } }\n ])\n })\n\n test('refids 부족 (<2 매칭) → applied:false', () => {\n const { scene } = makeMockScene({ components: [{ refid: 1 }] })\n const r = dispatchBoardEditOp(scene, {\n op: 'distribute',\n refids: [1],\n axis: 'horizontal'\n })\n expect(r.applied).toBe(false)\n })\n})\n\n// ── dispatchBoardEditOp — group ─────────────────────────────────────\ndescribe('dispatchBoardEditOp — group', () => {\n test('정상 — scene.group 호출 + 새 group refid 의 ungroup inverse', () => {\n const { scene, calls, refidIndexMap } = makeMockScene({\n components: [{ refid: 1 }, { refid: 2 }]\n })\n const r = dispatchBoardEditOp(scene, { op: 'group', refids: [1, 2] })\n expect(r.applied).toBe(true)\n expect(r.inverseOps).toHaveLength(1)\n const inv = r.inverseOps[0] as any\n expect(inv.op).toBe('ungroup')\n // mock group 은 새 refid 3 발급\n expect(inv.refid).toBe(3)\n expect(refidIndexMap.has(3)).toBe(true)\n expect(calls.find(c => c.method === 'group')).toBeDefined()\n })\n\n test('refids < 2 — applied:false (group 은 2개 이상 필요)', () => {\n const { scene } = makeMockScene({ components: [{ refid: 1 }] })\n const r = dispatchBoardEditOp(scene, { op: 'group', refids: [1] })\n expect(r.applied).toBe(false)\n })\n\n test('selected 복원 — group 직전 selected 로 되돌림', () => {\n const { scene, refidIndexMap } = makeMockScene({\n components: [{ refid: 1 }, { refid: 2 }]\n })\n const sentinel = { id: 'before-group' }\n scene.selected = [sentinel]\n dispatchBoardEditOp(scene, { op: 'group', refids: [1, 2] })\n expect(scene.selected).toEqual([sentinel])\n })\n})\n\n// ── dispatchBoardEditOp — ungroup ───────────────────────────────────\ndescribe('dispatchBoardEditOp — ungroup', () => {\n test('정상 — 자식 refid 들 캡처해 group inverse 생성', () => {\n const { scene, refidIndexMap, calls } = makeMockScene({\n components: [{ refid: 5, type: 'group' }]\n })\n // mock group 자식 — child 의 .get('refid') 가 작동하도록 makeMockSceneComp 형태\n const g = refidIndexMap.get(5)\n g.components = [makeMockSceneComp({ refid: 11 }), makeMockSceneComp({ refid: 12 })]\n\n const r = dispatchBoardEditOp(scene, { op: 'ungroup', refid: 5 })\n expect(r.applied).toBe(true)\n expect(r.inverseOps).toEqual([{ op: 'group', refids: [11, 12] }])\n expect(calls.find(c => c.method === 'ungroup')).toBeDefined()\n })\n\n test('자식이 1개 — inverse 없음 (group 은 2개 이상 필요), applied:true 유지', () => {\n const { scene, refidIndexMap } = makeMockScene({\n components: [{ refid: 5 }]\n })\n const g = refidIndexMap.get(5)\n g.components = [makeMockSceneComp({ refid: 11 })]\n\n const r = dispatchBoardEditOp(scene, { op: 'ungroup', refid: 5 })\n expect(r.applied).toBe(true)\n expect(r.inverseOps).toEqual([])\n })\n\n test('없는 refid → applied:false', () => {\n const { scene } = makeMockScene()\n const r = dispatchBoardEditOp(scene, { op: 'ungroup', refid: 999 })\n expect(r.applied).toBe(false)\n })\n})\n\n// ── dispatchBoardEditOp — zorder ────────────────────────────────────\ndescribe('dispatchBoardEditOp — zorder', () => {\n test('forward → 정상 + inverse 는 backward', () => {\n const { scene, calls } = makeMockScene({ components: [{ refid: 1 }] })\n const r = dispatchBoardEditOp(scene, {\n op: 'zorder',\n refid: 1,\n direction: 'forward'\n })\n expect(r.applied).toBe(true)\n expect(r.inverseOps).toEqual([\n { op: 'zorder', refid: 1, direction: 'backward' }\n ])\n expect(calls.find(c => c.method === 'zorder').direction).toBe('forward')\n })\n\n test('4 direction 모두 — 반대 방향이 inverse', () => {\n const cases: Array<[string, string]> = [\n ['forward', 'backward'],\n ['backward', 'forward'],\n ['front', 'back'],\n ['back', 'front']\n ]\n for (const [dir, opp] of cases) {\n const { scene } = makeMockScene({ components: [{ refid: 1 }] })\n const r = dispatchBoardEditOp(scene, {\n op: 'zorder',\n refid: 1,\n direction: dir as any\n })\n expect(r.inverseOps[0]).toEqual({\n op: 'zorder',\n refid: 1,\n direction: opp\n })\n }\n })\n\n test('없는 refid → applied:false', () => {\n const { scene } = makeMockScene()\n const r = dispatchBoardEditOp(scene, {\n op: 'zorder',\n refid: 999,\n direction: 'forward'\n })\n expect(r.applied).toBe(false)\n })\n})\n\n// ── computeArrangePositions — pure 위치 계산 ─────────────────────────\ndescribe('computeArrangePositions — grid', () => {\n test('2x2 그리드 — 4 컴포넌트 동일 사이즈, 기본 gap=10', () => {\n const r = computeArrangePositions(\n { type: 'grid', cols: 2, anchor: { left: 0, top: 0 } },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 },\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 100, height: 50 },\n { width: 100, height: 50 },\n { width: 100, height: 50 },\n { width: 100, height: 50 }\n ]\n )\n expect(r).toEqual([\n { left: 0, top: 0 }, // (0,0)\n { left: 110, top: 0 }, // (0,1) — width + gap\n { left: 0, top: 60 }, // (1,0)\n { left: 110, top: 60 } // (1,1)\n ])\n })\n\n test('cell 크기 = 모든 사이즈의 max — 다른 사이즈에서도 겹침 없음', () => {\n const r = computeArrangePositions(\n { type: 'grid', cols: 2, gap: 0, anchor: { left: 0, top: 0 } },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 50, height: 100 }, // 가장 키 큰 컴포넌트\n { width: 200, height: 30 }, // 가장 너비 큰 컴포넌트\n { width: 80, height: 60 }\n ]\n )\n // cell = 200 × 100\n expect(r).toEqual([\n { left: 0, top: 0 },\n { left: 200, top: 0 },\n { left: 0, top: 100 }\n ])\n })\n\n test('anchor 미지정 시 첫 컴포넌트의 현재 (left, top) 사용', () => {\n const r = computeArrangePositions(\n { type: 'grid', cols: 2, gap: 0 },\n [\n { left: 100, top: 50 },\n { left: 999, top: 999 }, // 무시\n { left: 0, top: 0 }\n ],\n [\n { width: 50, height: 50 },\n { width: 50, height: 50 },\n { width: 50, height: 50 }\n ]\n )\n expect(r[0]).toEqual({ left: 100, top: 50 })\n expect(r[1]).toEqual({ left: 150, top: 50 })\n expect(r[2]).toEqual({ left: 100, top: 100 })\n })\n\n test('cols 가 floor 처리 (소수도 허용 — Math.floor)', () => {\n const r = computeArrangePositions(\n { type: 'grid', cols: 2.7, anchor: { left: 0, top: 0 } },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 100, height: 100 },\n { width: 100, height: 100 }\n ]\n )\n // 2.7 → 2 cols\n expect(r).toEqual([\n { left: 0, top: 0 },\n { left: 110, top: 0 }\n ])\n })\n})\n\ndescribe('computeArrangePositions — row', () => {\n test('가로 일렬 — 누적 width + gap', () => {\n const r = computeArrangePositions(\n { type: 'row', gap: 10, anchor: { left: 50, top: 100 } },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 80, height: 60 },\n { width: 120, height: 60 },\n { width: 60, height: 60 }\n ]\n )\n expect(r).toEqual([\n { left: 50, top: 100 },\n { left: 140, top: 100 }, // 50 + 80 + 10\n { left: 270, top: 100 } // 140 + 120 + 10\n ])\n })\n\n test('align: center — 다른 height 들이 maxH 기준으로 세로 가운데 정렬', () => {\n const r = computeArrangePositions(\n { type: 'row', gap: 0, anchor: { left: 0, top: 0 }, align: 'center' },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 100, height: 80 }, // maxH\n { width: 100, height: 40 }\n ]\n )\n expect(r[0].top).toBe(0) // tall 한 거 자체는 anchor.top\n expect(r[1].top).toBe(20) // (80 - 40) / 2\n })\n\n test('align: end — 바닥 정렬', () => {\n const r = computeArrangePositions(\n { type: 'row', gap: 0, anchor: { left: 0, top: 0 }, align: 'end' },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 100, height: 80 },\n { width: 100, height: 40 }\n ]\n )\n expect(r[0].top).toBe(0) // tallest stays\n expect(r[1].top).toBe(40) // 80 - 40\n })\n\n test('align 기본값 = start (top-aligned)', () => {\n const r = computeArrangePositions(\n { type: 'row', anchor: { left: 0, top: 50 } },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 100, height: 80 },\n { width: 100, height: 40 }\n ]\n )\n expect(r[0].top).toBe(50)\n expect(r[1].top).toBe(50) // start = same top\n })\n})\n\ndescribe('computeArrangePositions — column', () => {\n test('세로 일렬 — 누적 height + gap', () => {\n const r = computeArrangePositions(\n { type: 'column', gap: 10, anchor: { left: 50, top: 0 } },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 100, height: 60 },\n { width: 100, height: 80 }\n ]\n )\n expect(r).toEqual([\n { left: 50, top: 0 },\n { left: 50, top: 70 } // 0 + 60 + 10\n ])\n })\n\n test('align: center — 다른 width 들이 maxW 기준으로 가로 가운데 정렬', () => {\n const r = computeArrangePositions(\n { type: 'column', gap: 0, anchor: { left: 0, top: 0 }, align: 'center' },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 200, height: 50 },\n { width: 100, height: 50 } // narrower\n ]\n )\n expect(r[0].left).toBe(0)\n expect(r[1].left).toBe(50) // (200 - 100) / 2\n })\n\n test('align: end — 우측 정렬', () => {\n const r = computeArrangePositions(\n { type: 'column', gap: 0, anchor: { left: 0, top: 0 }, align: 'end' },\n [\n { left: 0, top: 0 },\n { left: 0, top: 0 }\n ],\n [\n { width: 200, height: 50 },\n { width: 100, height: 50 }\n ]\n )\n expect(r[1].left).toBe(100) // 200 - 100\n })\n})\n\n// ── dispatchBoardEditOp — arrange ─────────────────────────────────\ndescribe('dispatchBoardEditOp — arrange', () => {\n test('grid: target.set 호출 + 새 좌표 적용 + inverse 는 modify 시퀀스', () => {\n const { scene, calls, refidIndexMap } = makeMockScene({\n components: [\n { refid: 1, type: 'rect', left: 999, top: 999, width: 100, height: 50 },\n { refid: 2, type: 'rect', left: 999, top: 999, width: 100, height: 50 },\n { refid: 3, type: 'rect', left: 999, top: 999, width: 100, height: 50 },\n { refid: 4, type: 'rect', left: 999, top: 999, width: 100, height: 50 }\n ]\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'arrange',\n refids: [1, 2, 3, 4],\n layout: { type: 'grid', cols: 2, gap: 0, anchor: { left: 0, top: 0 } }\n })\n expect(r.applied).toBe(true)\n // 좌표가 grid 에 따라 갱신\n expect(refidIndexMap.get(1).model.left).toBe(0)\n expect(refidIndexMap.get(1).model.top).toBe(0)\n expect(refidIndexMap.get(2).model.left).toBe(100)\n expect(refidIndexMap.get(2).model.top).toBe(0)\n expect(refidIndexMap.get(3).model.left).toBe(0)\n expect(refidIndexMap.get(3).model.top).toBe(50)\n expect(refidIndexMap.get(4).model.left).toBe(100)\n expect(refidIndexMap.get(4).model.top).toBe(50)\n // inverse — 직전 좌표 (모두 999, 999)\n expect(r.inverseOps).toHaveLength(4)\n expect(r.inverseOps[0]).toEqual({\n op: 'modify',\n refid: 1,\n patch: { left: 999, top: 999 }\n })\n // commander.execute (단일 snapshot)\n expect(calls.find(c => c.method === 'commander.execute')).toBeDefined()\n })\n\n test('row: 누적 width + gap', () => {\n const { scene, refidIndexMap } = makeMockScene({\n components: [\n { refid: 1, type: 'rect', left: 0, top: 0, width: 80, height: 50 },\n { refid: 2, type: 'rect', left: 0, top: 0, width: 120, height: 50 }\n ]\n })\n dispatchBoardEditOp(scene, {\n op: 'arrange',\n refids: [1, 2],\n layout: { type: 'row', gap: 10, anchor: { left: 0, top: 0 } }\n })\n expect(refidIndexMap.get(1).model.left).toBe(0)\n expect(refidIndexMap.get(2).model.left).toBe(90) // 0 + 80 + 10\n })\n\n test('refids < 2 → applied:false', () => {\n const { scene } = makeMockScene({ components: [{ refid: 1 }] })\n const r = dispatchBoardEditOp(scene, {\n op: 'arrange',\n refids: [1],\n layout: { type: 'grid', cols: 1 }\n })\n expect(r.applied).toBe(false)\n })\n\n test('일부 refid 누락 — 매칭된 것이 2 이상이면 진행', () => {\n const { scene, refidIndexMap } = makeMockScene({\n components: [\n { refid: 1, left: 0, top: 0, width: 50, height: 50 },\n { refid: 2, left: 0, top: 0, width: 50, height: 50 }\n ]\n })\n const r = dispatchBoardEditOp(scene, {\n op: 'arrange',\n refids: [1, 999, 2],\n layout: { type: 'row', gap: 10, anchor: { left: 0, top: 0 } }\n })\n expect(r.applied).toBe(true)\n expect(refidIndexMap.get(1).model.left).toBe(0)\n expect(refidIndexMap.get(2).model.left).toBe(60)\n })\n})\n\n// ── 방어 ────────────────────────────────────────────────────────────\ndescribe('dispatchBoardEditOp — 방어', () => {\n test('scene null → applied:false', () => {\n expect(\n dispatchBoardEditOp(null, { op: 'add', component: { type: 'rect' } } as BoardEditOp)\n ).toEqual({ applied: false, inverseOps: [] })\n })\n\n test('op null → applied:false', () => {\n const { scene } = makeMockScene()\n expect(dispatchBoardEditOp(scene, null as any)).toEqual({\n applied: false,\n inverseOps: []\n })\n })\n\n test('알 수 없는 op → applied:false', () => {\n const { scene } = makeMockScene()\n expect(dispatchBoardEditOp(scene, { op: 'unknown' } as any)).toEqual({\n applied: false,\n inverseOps: []\n })\n })\n})\n"]}
@@ -4,18 +4,8 @@ import '@operato/oops';
4
4
  import '@things-factory/board-ai';
5
5
  import { BoardModeller } from '@operato/board/ox-board-modeller.js';
6
6
  import { PageView } from '@operato/shell';
7
- /**
8
- * AI 의 BoardEditOp 가 지정한 대상 (id 또는 refid) 으로 things-scene component 검색.
9
- *
10
- * id (사용자/AI 가 명시적으로 설정한 string identifier) 와
11
- * refid (things-scene 이 모든 컴포넌트에 자동 발급하는 numeric identifier) 는
12
- * 서로 별개 개념이고 AI 도 둘을 구별해서 보낸다 — 이 함수는 호스트 측에서 둘 중
13
- * 어느 쪽으로든 lookup 가능하게 통합. refid 가 universal 이므로 우선.
14
- */
15
- export declare function findSceneComponent(scene: any, target: {
16
- id?: string;
17
- refid?: number;
18
- }): any;
7
+ import { findSceneComponent } from './board-action-dispatch.js';
8
+ export { findSceneComponent };
19
9
  export declare class BoardModellerPage extends PageView {
20
10
  constructor();
21
11
  static styles: import("lit").CSSResult[];
@@ -30,8 +20,14 @@ export declare class BoardModellerPage extends PageView {
30
20
  componentGroupList?: any[];
31
21
  propertyEditor: any;
32
22
  preparing?: boolean;
33
- /** AI 협력 세션 id — boardId 변경 시 chatSessionByBoard 또는 startBoardAISession 으로 자동 결정 */
23
+ /** AI 협력 세션 id — 현재 활성 세션. boardId 변경 시 자동 ensure. 다중 세션 활성 1개. */
34
24
  chatSessionId?: string;
25
+ /** 보드의 모든 ChatSession (탭으로 표시). */
26
+ chatSessions: Array<{
27
+ id: string;
28
+ name?: string;
29
+ createdAt?: string;
30
+ }>;
35
31
  /** AI 채팅 패널 열림 상태 (기본 닫힘) */
36
32
  aiPanelOpen: boolean;
37
33
  /**
@@ -71,10 +67,20 @@ export declare class BoardModellerPage extends PageView {
71
67
  description: string;
72
68
  };
73
69
  refresh(): Promise<void>;
74
- /** 패널 토글 시 호출 — 열 때만 chatSession 보장 */
70
+ /** 패널 토글 시 호출 — 열 때만 chatSession 보장 (세션 리스트 로드 + 활성 세션 결정) */
75
71
  private toggleAIPanel;
76
- /** boardId ChatSession 조회 또는 생성 (idempotent). */
72
+ /** 보드의 모든 ChatSession 목록을 로드 + 활성 세션 보장.
73
+ * - 세션이 0 개면 startBoardAISession 으로 첫 세션 생성 (단일 세션 UX 호환)
74
+ * - 활성 세션 미설정 시 첫 번째 세션을 활성으로
75
+ * - 이미 활성 세션 set 돼있고 list 에 포함되면 유지 */
77
76
  private ensureChatSession;
77
+ /** `@` mention popup 의 도메인 사용자 후보 — chat 의 userProvider prop 으로 wire.
78
+ * query 변할 때마다 호출되므로 server query (`domainUsersForMention`) 를 그대로 위임. */
79
+ private fetchDomainUsersForMention;
80
+ /** 채팅 패널의 탭 클릭 — 활성 세션 전환. */
81
+ private onChatSessionSwitch;
82
+ /** 채팅 패널의 "+" 버튼 — 새 세션 생성 후 활성으로 전환. */
83
+ private onChatSessionCreate;
78
84
  /**
79
85
  * 모델러의 selected (things-scene Component 인스턴스 배열) 에서 refid 추출.
80
86
  *
@@ -83,6 +89,17 @@ export declare class BoardModellerPage extends PageView {
83
89
  * 아니라 targeting 에 부적합).
84
90
  */
85
91
  private extractSelectedRefids;
92
+ /**
93
+ * AI 채팅 mention popup (`#`) 검색 위임 — things-scene SceneSearchEngine 으로 wrap.
94
+ *
95
+ * F-key Finder 와 동일한 검색 룰 (id → name → tag → type → class → text → data → property)
96
+ * 을 그대로 mention popup 에 재사용. 컴포넌트 트리를 직접 순회하므로 model JSON 으로
97
+ * 변환할 필요 없음 — 일관성 + 성능 이점.
98
+ *
99
+ * 반환 구조 (FilterResult) 는 chat 의 mention-popup 표시 모델. host 는 things-scene
100
+ * Component 에서 refid/id/type/tag/class/text 를 뽑아 candidate 로 채워 넘긴다.
101
+ */
102
+ private searchSceneForMention;
86
103
  /**
87
104
  * 라이브 보드 모델 — things-scene 캔버스가 들고 있는 가장 최신 상태의 deep clone.
88
105
  *
@@ -117,17 +134,6 @@ export declare class BoardModellerPage extends PageView {
117
134
  * Revert 지원 — replace 직전 보드 model 을 inverse 로 보관 (또 다른 replace).
118
135
  */
119
136
  private applyPatchWholesale;
120
- /**
121
- * scene 의 모든 컴포넌트 refid 수집 — add 의 inverse 계산용.
122
- *
123
- * scene.add 직전/직후 호출해 차집합으로 새 발급된 refid 식별.
124
- */
125
- private collectAllRefids;
126
- /**
127
- * patch 가 변경하려는 키들에 대해 model 의 현재 값을 deep-clone 으로 캡처.
128
- * inverse modify / modifyBoard op 의 patch 로 사용.
129
- */
130
- private captureOldKeys;
131
137
  /**
132
138
  * 채팅에서 board-edit-revert 도착 — 누적된 inverse 를 역순 in-place 적용.
133
139
  *
@@ -139,12 +145,18 @@ export declare class BoardModellerPage extends PageView {
139
145
  private onBoardEditRevert;
140
146
  /**
141
147
  * inverse op 시퀀스를 things-scene 위에 in-place 적용 (snapshot/undo 보존).
142
- * onBoardEditPatchadd/remove/modify/modifyBoard 분기와 동일 패턴이지만
143
- * inverse 누적은 하지 않음 (revert 자체가 revert 가능하지 않은 단방향 동작).
148
+ * dispatcher 재사용 — inverse 누적은 무시 (revert revert redo, 별개 기능).
144
149
  */
145
150
  private applyInverseOpsInPlace;
146
151
  /** 서버 PatchEntry.reverted=true 영속 — fail 해도 UI 는 이미 되돌렸으니 warn 만. */
147
152
  private recordRevertOnServer;
153
+ /**
154
+ * AI 가 ephemeral scene action (selection / view / mode) 을 실행하라고 요청.
155
+ *
156
+ * board-edit-patch 와 별개 채널 — 모델 변경 X, undo 영향 X, dirty flag 무관.
157
+ * things-scene API 직접 호출. 잘못된 action / 누락된 컴포넌트는 console.warn 만.
158
+ */
159
+ private onBoardActionExecute;
148
160
  /**
149
161
  * AI 가 만든 컴포넌트를 things-scene 이 기대하는 완전한 형태로 normalize.
150
162
  * BoardModeller 에 등록된 template.model (default 값) 위에 AI 응답을 덮어쓴다.