@g1cloud/entity-modeler-next 5.0.0-beta.9 → 5.0.1

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.
Files changed (55) hide show
  1. package/README.md +19 -5
  2. package/dist/adapter/diagramAdapter.d.ts +6 -0
  3. package/dist/adapter/healBackfill.d.ts +38 -0
  4. package/dist/agent/resolver.d.ts +195 -7
  5. package/dist/agent/symbolicOp.d.ts +53 -4
  6. package/dist/command/op.d.ts +35 -1
  7. package/dist/command/opSync.d.ts +11 -1
  8. package/dist/command/stack.d.ts +11 -1
  9. package/dist/core/associationNav.d.ts +14 -0
  10. package/dist/core/columnResolve.d.ts +36 -0
  11. package/dist/core/embedSlots.d.ts +18 -0
  12. package/dist/core/entityPackage.d.ts +24 -0
  13. package/dist/core/fkDerived.d.ts +22 -2
  14. package/dist/core/indexCleanup.d.ts +16 -0
  15. package/dist/core/indexColumnRef.d.ts +27 -0
  16. package/dist/core/javaTypes.d.ts +5 -0
  17. package/dist/core/opSubject.d.ts +54 -0
  18. package/dist/core/projectActionLog.d.ts +7 -10
  19. package/dist/core/projectSeqDiff.d.ts +41 -0
  20. package/dist/core/propagation.d.ts +33 -2
  21. package/dist/core/quickFix.d.ts +9 -4
  22. package/dist/core/resolve.d.ts +0 -3
  23. package/dist/core/scaffoldJava.d.ts +30 -1
  24. package/dist/core/text.d.ts +2 -1
  25. package/dist/core/validation.d.ts +1 -13
  26. package/dist/editor/association.d.ts +18 -0
  27. package/dist/editor/attribute.d.ts +25 -0
  28. package/dist/editor/clipboardImport.d.ts +23 -0
  29. package/dist/editor/commandPlans.d.ts +111 -0
  30. package/dist/editor/controller.d.ts +61 -20
  31. package/dist/editor/entity.d.ts +19 -0
  32. package/dist/editor/group.d.ts +22 -0
  33. package/dist/editor/hostSync.d.ts +30 -0
  34. package/dist/editor/note.d.ts +11 -0
  35. package/dist/editor/selection.d.ts +22 -0
  36. package/dist/entity-modeler-next.css +1 -1
  37. package/dist/entity-modeler.js +16668 -13678
  38. package/dist/entity-modeler.umd.cjs +33 -29
  39. package/dist/i18n/ko.d.ts +64 -2
  40. package/dist/index.d.ts +26 -23
  41. package/dist/view/ColumnLangSelect.vue.d.ts +16 -0
  42. package/dist/view/DiagramCanvas.vue.d.ts +9 -0
  43. package/dist/view/DiagramExplorer.vue.d.ts +7 -2
  44. package/dist/view/HistoryPanel.vue.d.ts +3 -0
  45. package/dist/view/MultiLangTextField.vue.d.ts +7 -0
  46. package/dist/view/PropertyPanel.vue.d.ts +3 -1
  47. package/dist/view/columnResolution.d.ts +91 -0
  48. package/dist/view/diffOverlay.d.ts +14 -0
  49. package/dist/view/embedSlotCollapse.d.ts +36 -0
  50. package/dist/view/nodeInternals.d.ts +15 -0
  51. package/dist/view/opConflictNotice.d.ts +8 -6
  52. package/dist/view/swatches.d.ts +3 -2
  53. package/dist/view/useAttributeEditing.d.ts +82 -0
  54. package/dist/view/useTreeCollapse.d.ts +16 -0
  55. package/package.json +10 -6
@@ -11,11 +11,6 @@ import { ValidationIssue } from '../core/validation';
11
11
  import { UiLocale, Translator } from '../i18n';
12
12
  import { AssociationEnd, Attribute, DisplayMode, EmbeddableCatalog, Entity, EntityIndex, Geo, GroupCodeCatalog, LangCode, LogicalGroup, ModelId, Multiplicity, Operation, Point, PredefinedCustomTypeCatalog, SuperClassCatalog } from '../core/types';
13
13
  import * as cmd from '../command/commands';
14
- /**
15
- * 관계 파생 FK 직접 삭제 시도 시의 안내 — 뷰 tooltip(어포던스)과 차단 시 토스트(피드백)가 공유한다.
16
- * FK는 관계가 소유·관리하므로 컬럼을 직접 지우는 대신 연관관계선을 삭제해야 한다(Option B).
17
- */
18
- export declare const FK_MANAGED_DELETE_MESSAGE = "\uC678\uB798\uD0A4\uB294 \uC5F0\uAD00\uAD00\uACC4\uC5D0\uC11C \uD30C\uC0DD\uB429\uB2C8\uB2E4. \uC0AD\uC81C\uD558\uB824\uBA74 \uC5F0\uAD00\uAD00\uACC4\uC120\uC744 \uC120\uD0DD\uD574 \uC0AD\uC81C\uD558\uC138\uC694.";
19
14
  /** 엔티티 내부 속성을 가리키는 주소 원자 — 선택·컨텍스트·재정렬·연결 등 속성 단위 기능의 공통 참조점. */
20
15
  export type AttrRef = {
21
16
  entityId: ModelId;
@@ -66,6 +61,24 @@ export interface RestoreOutcome {
66
61
  * forward 보상 쓰기(diagram-wide). 성공 시 라이브 doc이 바뀌므로 controller가 reloadRequest로 재적재를 요청한다.
67
62
  */
68
63
  export type RestoreTransport = (toSeq: number) => Promise<RestoreOutcome>;
64
+ /**
65
+ * 로컬 명령 적용 실패 — `run()`이 `stack.execute` 중 잡은 예외의 표면화 형태.
66
+ *
67
+ * ★`OpConflict`(서버 축)와 **다른 축**이다. 저쪽은 *로컬은 맞는데 서버가 못 따라온* 상태이고,
68
+ * 이쪽은 *로컬이 부분 변형돼 틀렸고 서버는 깨끗한* 상태다 — `execute`가 apply → push → emit 순서라
69
+ * apply 중 throw하면 **op가 나가지 않는다**(서버 문서·이력·CAS 무영향). 그래서 두 상태의 복구가
70
+ * 갈린다: op 전송 실패는 재적재가 미저장 변경을 버리지만, 이쪽은 **버릴 것이 오염된 부분 변형뿐**이라
71
+ * 재적재에 손실이 없다(성공한 이전 편집은 이미 서버에 있다).
72
+ *
73
+ * ⚠️`OpConflict.kind`에 이 축을 얹지 않는 이유: 그 어휘(`missing`/`rev`/`layout`)는 CC-10 ⑥이
74
+ * *"호스트는 `rev`만 낸다 / `missing`은 클라 합성 전용 / `layout`은 미방출 예약값"*으로 정리한
75
+ * 서버 축 전용이고, 호스트 watch의 `else` 분기가 catch-all이라 새 kind가 **"다른 사용자가 변경했습니다"**로
76
+ * 오귀속된다.
77
+ */
78
+ export interface CommandFailure {
79
+ /** 실패한 명령의 label — **진단용**(ko 고정 문자열이라 UI 노출용이 아니다. 배너 문구는 i18n 카탈로그 소유). */
80
+ label: string;
81
+ }
69
82
  export interface EditorController {
70
83
  state: EditorState;
71
84
  resolved: ComputedRef<ResolvedDiagram>;
@@ -131,6 +144,15 @@ export interface EditorController {
131
144
  * `loadDiagram`으로 재적재하면 해소된다(B-5). op-mode가 아니면 항상 null.
132
145
  */
133
146
  opConflict: Ref<OpConflict | null>;
147
+ /**
148
+ * 마지막 로컬 명령 적용 실패 — `run()`이 채운다. null이면 정상. 세팅 시 `editable`이 함께 false로
149
+ * 내려가고(로컬 프리즈), 오염된 상태 위 후속 편집이 차단된다. `loadDiagram` 재적재로 해소된다.
150
+ *
151
+ * ★호스트는 이 값을 watch해 **확인 없이 자동 재적재**하면 된다 — op가 방출되지 않았으므로 서버가
152
+ * 이미 정본이고 손실이 0이다(`opConflict.kind='missing'`이 손실 고지 모달을 받는 것과 갈리는 지점).
153
+ * 미배선이어도 lib 내장 프리즈 배너가 상주 안내한다.
154
+ */
155
+ commandFailure: Ref<CommandFailure | null>;
134
156
  /**
135
157
  * (나) 필드 감사 조회 transport — 호스트가 이력 조회 라우트(`entityDiagramHistory.get`) fetch 래퍼를
136
158
  * 주입(opTransport 미러). 감사 패널이 호출해 이력 레코드를 얻고 `projectEntityAudit`로 투영한다.
@@ -219,7 +241,12 @@ export interface EditorController {
219
241
  undo(): void;
220
242
  redo(): void;
221
243
  markSaved(): void;
222
- addEntity(name?: string, location?: Point): ModelId;
244
+ /**
245
+ * add류 intent 공통 반환 계약: 성공 시 생성된 ModelId, 실패(조회 모드·충돌 프리즈·잠금·가드 차단) 시
246
+ * null. 거짓 성공 id를 돌려주면 뷰가 존재하지 않는 대상을 select(빈 폼)하므로, 소비처는 null 가드 후
247
+ * 후속 동작(자동 선택 등)을 수행해야 한다.
248
+ */
249
+ addEntity(name?: string, location?: Point): ModelId | null;
223
250
  renameEntity(id: ModelId, name: string): void;
224
251
  updateEntity(id: ModelId, patch: Partial<Entity>): void;
225
252
  moveEntity(id: ModelId, location: Point): void;
@@ -237,6 +264,11 @@ export interface EditorController {
237
264
  setEntityLocked(id: ModelId, locked: boolean): void;
238
265
  /** 엔티티 잠금 여부 조회 (레이아웃) */
239
266
  isEntityLocked(id: ModelId): boolean;
267
+ /**
268
+ * 연관 잠금 여부 조회 — 양 끝 엔티티 중 한쪽이라도 잠겼으면 true(내부 게이트 isAssocLockedFn와
269
+ * 동일 의미론 단일 출처). 뷰가 관계 편집 어포던스(삭제 메뉴·인스펙터 폼)를 억제할 때 사용.
270
+ */
271
+ isAssociationLocked(assocId: ModelId): boolean;
240
272
  /** 활성 다이어그램 전체 엔티티 접기/펼치기 — 사전 상태 캡처 단일 커맨드(1 undo 스텝) */
241
273
  collapseAll(): void;
242
274
  expandAll(): void;
@@ -259,10 +291,10 @@ export interface EditorController {
259
291
  setGroupLocked(groupId: ModelId, locked: boolean): void;
260
292
  /** 그룹 잠금 여부 조회 (레이아웃) */
261
293
  isGroupLocked(groupId: ModelId): boolean;
262
- /** 선택 엔티티들로 새 그룹 생성 (멤버 bbox에 박스 배치) */
294
+ /** 선택 엔티티들로 새 그룹 생성 (멤버 bbox에 박스 배치) — 빈 입력·조회 모드 시 null */
263
295
  createGroup(entityIds: ModelId[], name?: string): ModelId | null;
264
296
  /** 빈 그룹 박스 생성 (이후 드래그로 엔티티 편입) */
265
- addEmptyGroup(location: Point, name?: string): ModelId;
297
+ addEmptyGroup(location: Point, name?: string): ModelId | null;
266
298
  removeGroup(groupId: ModelId): void;
267
299
  /** 엔티티 이동 + 컨테인먼트에 따른 그룹 편입/해제를 한 명령으로 */
268
300
  dropEntity(entityId: ModelId, location: Point, targetGroupId: ModelId | null): void;
@@ -338,16 +370,16 @@ export interface EditorController {
338
370
  * dbAttr 슬롯은 레거시 `initAttributeDatabaseAttribute` 동형으로 **빈 골격**(physicalName/dataType
339
371
  * 미설정)만 시드하고, 표시·저장 시 카탈로그 메타모델로 폴백한다(`SVG:976` 대응). 참조가 아니므로
340
372
  * association은 만들지 않는다(entity.attributes 직접 보유 — 레거시 NORMAL 부류). 카탈로그에 없거나
341
- * 대상 엔티티가 없으면 no-op(undefined).
373
+ * 대상 엔티티가 없으면 no-op(null).
342
374
  */
343
- addPredefinedEmbed(entityId: ModelId, embeddableType: string): ModelId | undefined;
344
- addAttribute(entityId: ModelId, partial?: Partial<Attribute>): ModelId;
375
+ addPredefinedEmbed(entityId: ModelId, embeddableType: string): ModelId | null;
376
+ addAttribute(entityId: ModelId, partial?: Partial<Attribute>): ModelId | null;
345
377
  /**
346
378
  * 시각 구획 행(DIVIDER) 추가 — 거대 엔티티에서 속성 묶음을 끊는 구분선. DB 컬럼·타입·식별자 없이
347
379
  * 말미에 추가되며(이후 grip 드래그로 위치 조정), `name`은 선택적 섹션 라벨. divider 기본값을 단일
348
380
  * 출처로 보장하려고 addAttribute에 위임한다.
349
381
  */
350
- addDivider(entityId: ModelId): ModelId;
382
+ addDivider(entityId: ModelId): ModelId | null;
351
383
  updateAttribute(entityId: ModelId, attributeId: ModelId, patch: Partial<Attribute>): void;
352
384
  /**
353
385
  * ⑤ 파생 타입 결합 — 속성 groupCode를 설정/해제하며 type을 동반 조정한다(레거시 정합).
@@ -378,21 +410,21 @@ export interface EditorController {
378
410
  updateIndex(entityId: ModelId, indexId: ModelId, patch: Partial<EntityIndex>): void;
379
411
  removeIndex(entityId: ModelId, indexId: ModelId): void;
380
412
  /** 메서드(operation) 추가 — 신규는 visibility=PACKAGE, order=말미. 생성된 modelId 반환. */
381
- addOperation(entityId: ModelId, partial?: Partial<Operation>): ModelId;
413
+ addOperation(entityId: ModelId, partial?: Partial<Operation>): ModelId | null;
382
414
  updateOperation(entityId: ModelId, operationId: ModelId, patch: Partial<Operation>): void;
383
415
  removeOperation(entityId: ModelId, operationId: ModelId): void;
384
416
  /** 메서드 행 재정렬 — toIndex = 대상 제거 후 배열 기준 삽입 위치(단일 명령, undo 원자). */
385
417
  reorderOperations(entityId: ModelId, operationIds: ModelId[], toIndex: number): void;
386
418
  /** 메서드 강조 색 토큰 지정 (null이면 해제). */
387
419
  setOperationSwatch(entityId: ModelId, operationId: ModelId, token: string | null): void;
388
- addAssociation(sourceEntityId: ModelId, targetEntityId: ModelId, sourceColumnRef?: ModelId, targetColumnRef?: ModelId): ModelId;
420
+ addAssociation(sourceEntityId: ModelId, targetEntityId: ModelId, sourceColumnRef?: ModelId, targetColumnRef?: ModelId): ModelId | null;
389
421
  /**
390
422
  * 임베드 생성 — 소유자에 EMBED_OWN 표시 속성을 물질화(임베더블 source 컬럼 복사 + `embedded` 마커)하고
391
423
  * EMBED association(owner EXACTLY_ONE / embeddable EXACTLY_ONE+composition)을 한 composite로 추가한다.
392
424
  * 가드(결정 2 단일): 대상이 JPA_EMBEDDABLE이 아니거나 소유자가 이미 그 임베더블을 임베드했으면 no-op.
393
- * 반환은 생성된 association id, 가드 차단 시 undefined.
425
+ * 반환은 생성된 association id, 가드 차단 시 null.
394
426
  */
395
- addEmbedAssociation(ownerEntityId: ModelId, embeddableEntityId: ModelId): ModelId | undefined;
427
+ addEmbedAssociation(ownerEntityId: ModelId, embeddableEntityId: ModelId): ModelId | null;
396
428
  /**
397
429
  * 임베드 카디널리티 설정 — 임베더블 end multiplicity를 지정 값으로 바꾼다. 컬렉션(`@ElementCollection`)
398
430
  * 여부는 이 multiplicity에서 파생되는 값(권위=multiplicity, 결정 3): `*_MORE`(0..N / 1..N)면 컬렉션,
@@ -415,7 +447,7 @@ export interface EditorController {
415
447
  addWaypoint(assocId: ModelId, index: number, point: Point): void;
416
448
  removeWaypoint(assocId: ModelId, index: number): void;
417
449
  clearWaypoints(assocId: ModelId): void;
418
- addNote(memo?: string, location?: Point): ModelId;
450
+ addNote(memo?: string, location?: Point): ModelId | null;
419
451
  removeNote(noteId: ModelId): void;
420
452
  moveNote(noteId: ModelId, location: Point): void;
421
453
  resizeNote(noteId: ModelId, size: {
@@ -491,9 +523,11 @@ export declare function createEditorController(initial?: EditorState, options?:
491
523
  /** 시점 복원 transport(`restoreEntityDiagram` 라우트). 주입 + op-mode + editable 시 감사 패널 '복원' 활성. */
492
524
  restoreTransport?: RestoreTransport;
493
525
  /**
494
- * op 전송 실패(4xx/5xx/네트워크로 transport가 throw) 통지 — 진단용(opt-in). 하드 프리즈는 별도로
495
- * 발생하며(opConflict.kind='missing'), 콜백은 소실될 에러를 호스트가 로깅/리포팅하도록 넘긴다.
496
- * 미주입이어도 어댑터가 콘솔에 남긴다(정상 rev/layout 충돌은 이 경로가 아님 — throw만).
526
+ * op 전송 실패(4xx/5xx/네트워크로 transport가 throw) 통지 — 진단용(opt-in). 콜백은 소실될 원
527
+ * 에러를 호스트가 로깅/리포팅하도록 넘긴다. 미주입이어도 어댑터가 콘솔에 남긴다(정상 rev 충돌은
528
+ * 이 경로가 아님 — throw만).
529
+ * ⚠️ **발화 ≠ 프리즈**: 어댑터가 제한 재시도하므로 회복되는 시도도 통지된다(시도마다 1회).
530
+ * 하드 프리즈는 재시도 소진 후에만 발생하며 `opConflict.kind='missing'`으로 별도 노출된다.
497
531
  */
498
532
  onOpError?: (err: unknown) => void;
499
533
  /**
@@ -512,4 +546,11 @@ export declare function createEditorController(initial?: EditorState, options?:
512
546
  largeEntityThreshold?: number;
513
547
  /** CHK-DSN-3 초기 활성 여부 — 기본 false. 런타임은 flagEntitiesWithoutRelations로 사용자가 토글. */
514
548
  flagEntitiesWithoutRelations?: boolean;
549
+ /**
550
+ * 검증(validateModel) 재실행 디바운스 창(ms, 기본 250). validateModel은 전체 모델 스캔이라 키 입력마다
551
+ * 동기 재실행하면 대형 다이어그램에서 입력 지연의 주요 축(VE-1) — 기본은 변경 신호(revision) 기반
552
+ * 트레일링 디바운스. `0` 이하 주입 시 현행 동기 computed 그대로(변경 직후 즉시 일관성이 필요한
553
+ * 테스트·소비자용 escape hatch).
554
+ */
555
+ validationDebounceMs?: number;
515
556
  }): EditorController;
@@ -0,0 +1,19 @@
1
+ import { Ref } from 'vue';
2
+ import { Command, EditorState } from '../command/types';
3
+ import { EditorController } from './controller';
4
+ import { ModelId } from '../core/types';
5
+ /** 이 축이 팩토리 클로저에서 쓰는 것 전부. 늘어나면 여기 선언이 먼저 늘어난다(= 의존 인벤토리). */
6
+ export interface EntityContext {
7
+ /** 편집 대상 reactive 상태(속성만 교체되므로 참조 안정). */
8
+ state: EditorState;
9
+ /** 조회 모드 판정 — `addEntity`가 `null`을 돌려주려면 run()의 no-op 백스톱보다 앞에서 봐야 한다. */
10
+ editable: Ref<boolean>;
11
+ /** 모델 변경의 단일 실행점(조회 모드 no-op + 안내). */
12
+ run: (c: Command) => void;
13
+ /** 잠금 게이트 — 차단 시 true + 안내 emit(사용자 intent 경로). */
14
+ gateEntityLocked: (id: ModelId) => boolean;
15
+ /** 순수 잠금 조회 — 공개 질의의 위임 대상. **안내를 내지 않는다**(위 ⚠️ 참고). */
16
+ isEntityLockedFn: (id: ModelId) => boolean;
17
+ isAssocLockedFn: (assocId: ModelId) => boolean;
18
+ }
19
+ export declare function createEntityApi(ctx: EntityContext): Pick<EditorController, 'addEntity' | 'renameEntity' | 'updateEntity' | 'moveEntity' | 'resizeEntity' | 'removeEntity' | 'setEntitySwatch' | 'setEntityCollapsed' | 'setEntityLocked' | 'isEntityLocked' | 'isAssociationLocked' | 'collapseAll' | 'expandAll'>;
@@ -0,0 +1,22 @@
1
+ import { Ref } from 'vue';
2
+ import { Command, EditorState } from '../command/types';
3
+ import { EditorController, Selection } from './controller';
4
+ import { ModelId } from '../core/types';
5
+ /** 이 축이 팩토리 클로저에서 쓰는 것 전부. 늘어나면 여기 선언이 먼저 늘어난다(= 의존 인벤토리). */
6
+ export interface GroupContext {
7
+ /** 편집 대상 reactive 상태(속성만 교체되므로 참조 안정). */
8
+ state: EditorState;
9
+ /** 조회 모드 판정 — add류가 `null`을 돌려주려면 run()의 no-op 백스톱보다 앞에서 봐야 한다. */
10
+ editable: Ref<boolean>;
11
+ /** 모델 변경의 단일 실행점(조회 모드 no-op + 안내). */
12
+ run: (c: Command) => void;
13
+ /** 그룹 생성 후 선택 해제(사라진 엔티티 선택을 남기지 않는다). */
14
+ selection: Ref<Selection>;
15
+ /** 잠금 게이트(엔티티) — `dropEntity`가 옮기는 대상이 엔티티라서 필요하다. */
16
+ gateEntityLocked: (id: ModelId) => boolean;
17
+ /** 잠금 게이트(그룹) — 차단 시 true + 안내 emit. */
18
+ gateGroupLocked: (groupId: ModelId) => boolean;
19
+ /** 순수 잠금 조회 — 공개 질의 `isGroupLocked`의 위임 대상. **안내를 내지 않는다**(위 ⚠️). */
20
+ isGroupLockedFn: (groupId: ModelId) => boolean;
21
+ }
22
+ export declare function createGroupApi(ctx: GroupContext): Pick<EditorController, 'dragGroup' | 'resizeGroup' | 'setGroupSwatch' | 'setGroupLocked' | 'isGroupLocked' | 'updateGroup' | 'createGroup' | 'addEmptyGroup' | 'removeGroup' | 'dropEntity' | 'ungroupEntity' | 'dropNote'>;
@@ -0,0 +1,30 @@
1
+ import { ComputedRef, Ref } from 'vue';
2
+ import { EditorState } from '../command/types';
3
+ import { CommandStack } from '../command/stack';
4
+ import { DiagramMeta } from '../adapter/diagramAdapter';
5
+ import { OpConflict } from '../command/op';
6
+ import { OpSyncTransport } from '../command/opSync';
7
+ import { EditorController, HistoryTransport, RestoreTransport } from './controller';
8
+ /** 이 축이 팩토리 클로저에서 쓰는 것 전부(주입 옵션 4 + 상태 4). 늘어나면 여기 선언이 먼저 늘어난다. */
9
+ export interface HostSyncContext {
10
+ state: EditorState;
11
+ /** op-mode 게이트(schemaVersion>=2 && opWriteEnabled) — attach·가용성 판정 공용. */
12
+ opMode: ComputedRef<boolean>;
13
+ /** 프리즈 시 편집 잠금(쓰기) + 복원 가용성 판정(읽기). */
14
+ editable: Ref<boolean>;
15
+ /** 하드 프리즈 충돌 노출(쓰기). */
16
+ opConflict: Ref<OpConflict | null>;
17
+ opTransport?: OpSyncTransport;
18
+ onOpError?: (err: unknown) => void;
19
+ historyTransport?: HistoryTransport;
20
+ restoreTransport?: RestoreTransport;
21
+ }
22
+ export interface HostSyncBinding extends Pick<EditorController, 'historyTransport' | 'historyAvailable' | 'restoreTransport' | 'restoreAvailable' | 'restoreToSeq' | 'reloadRequest' | 'flush' | 'whenOpsSettled'> {
23
+ /**
24
+ * op 어댑터 (재)구성 — 최초 생성과 `loadDiagram` 양쪽에서 호출한다.
25
+ * `stack`·`meta`를 **캡처하지 않고 이 시점에 받는 것**이 이 분리의 핵심이다(reload가 둘 다 교체한다).
26
+ */
27
+ setupOpAdapter(stack: CommandStack, meta: DiagramMeta | undefined): void;
28
+ teardownOpAdapter(): void;
29
+ }
30
+ export declare function createHostSync(ctx: HostSyncContext): HostSyncBinding;
@@ -0,0 +1,11 @@
1
+ import { Ref } from 'vue';
2
+ import { Command } from '../command/types';
3
+ import { EditorController } from './controller';
4
+ /** 이 축이 팩토리 클로저에서 쓰는 것 전부. 늘어나면 여기 선언이 먼저 늘어난다(= 의존 인벤토리). */
5
+ export interface NoteContext {
6
+ /** 조회 모드 판정 — `addNote`가 `null`을 돌려주려면 run()의 no-op 백스톱보다 앞에서 봐야 한다. */
7
+ editable: Ref<boolean>;
8
+ /** 모델 변경의 단일 실행점(조회 모드 no-op + 안내). */
9
+ run: (c: Command) => void;
10
+ }
11
+ export declare function createNoteApi(ctx: NoteContext): Pick<EditorController, 'addNote' | 'removeNote' | 'moveNote' | 'resizeNote' | 'setNoteMemo' | 'setNoteSwatch' | 'addNoteConnection' | 'removeNoteConnection' | 'moveNoteConnectionWaypoint' | 'addNoteConnectionWaypoint' | 'removeNoteConnectionWaypoint' | 'clearNoteConnectionWaypoints'>;
@@ -0,0 +1,22 @@
1
+ import { Ref } from 'vue';
2
+ import { Command, EditorState } from '../command/types';
3
+ import { EditorController, Selection } from './controller';
4
+ import { ModelId } from '../core/types';
5
+ /** 이 축이 팩토리 클로저에서 쓰는 것 전부. 늘어나면 여기 선언이 먼저 늘어난다(= 의존 인벤토리). */
6
+ export interface SelectionContext {
7
+ state: EditorState;
8
+ selection: Ref<Selection>;
9
+ /** 캔버스 센터링 요청 신호(requestFocus가 nonce를 올려 발화). */
10
+ focusRequest: Ref<{
11
+ id: ModelId;
12
+ nonce: number;
13
+ } | null>;
14
+ /** 모델 변경의 단일 실행점(조회 모드 no-op + 안내). */
15
+ run: (c: Command) => void;
16
+ /** 잠금 게이트 — 차단 시 true + 안내 emit. */
17
+ gateEntityLocked: (id: ModelId) => boolean;
18
+ /** 순수 잠금 조회(다중 이동에서 잠긴 대상만 건너뛴다 — 안내는 내지 않는다). */
19
+ isEntityLockedFn: (id: ModelId) => boolean;
20
+ isGroupLockedFn: (id: ModelId) => boolean;
21
+ }
22
+ export declare function createSelectionApi(ctx: SelectionContext): Pick<EditorController, 'selectAttribute' | 'moveAttributeFocus' | 'nudgeSelectedAttributes' | 'nudgeNodes' | 'requestFocus'>;