export declare class TwinLifecycleMutation { /** 기동 — model 를 주면 provision+start, 없으면 레지스트리에 저장된 구조로 start. */ startTwinInstance(instanceId: string, context: ResolverContext, kind?: string, model?: any, /** 새 시뮬레이션은 재기동 때 저널을 이어야 한다. 엔진에는 이미 필수지만 이 API가 누락해 * zero-to-twin 경로가 기동 단계에서 막혔다. */ restartPolicy?: 'resync' | 'resume' | 'reset'): Promise; stopTwinInstance(instanceId: string, context: ResolverContext): Promise; /** * 이 트윈이 **자기 과거를 어떻게 대할 것인가**를 다시 선언한다 (2026-08-20). * * ── 왜 이 문이 필요한가 ──────────────────────────────────────────────────── * `restartPolicy` 는 사람이 하는 선언인데, 만들 때 한 번 정하면 **고칠 길이 없었다.** 그래서 「씨앗 * 재현용」으로 세운 트윈이 나중에 사람들이 이력을 보는 트윈이 되어도 선언은 `reset` 으로 남았다. * 선언과 쓰임이 어긋난 채로 두면, 선언대로 구현하는 순간(저널 초기화) 이력을 잃는다. * * ── 지금 도는 것에는 손대지 않는다 ───────────────────────────────────────── * 이 값은 **다음 기동**의 규칙이다. 돌고 있는 런타임의 구동 방식을 바꾸려면 정지·기동이 필요하고, * 그 판단은 사람의 것이다(도는 트윈을 알리지 않고 갈아 끼우면 그 사이의 사실이 어디로 갔는지 알 수 없다). * 그래서 결과에 「지금 도는 것과 다르다」는 사실을 함께 낸다. */ setTwinRestartPolicy(instanceId: string, restartPolicy: string, context: ResolverContext): Promise; /** * 트윈의 **이름을 다시 붙인다** (2026-08-26). * * ── 왜 이 문이 필요한가 ──────────────────────────────────────────────────── * 이름은 트윈을 처음 세울 때 한 번 정해지고(`provision`), 다시 읽기는 그것을 건드리지 않는다. 그 * 자체는 안전하다 — 사람이 붙인 이름을 연결이 덮어쓰면 안 된다. 그런데 그래서 **첫날의 이름에 * 갇힌다.** * * 실제로 그런 일이 났다: 태양광 발전소를 붙일 때 커넥터가 아는 이름이 연결된 시스템의 코드 * (`ES202307202202`)뿐이었다. 뒤에 사람이 부르는 이름(`호현에너지`)이 어디 있는지 알아내 커넥터를 * 고쳤는데, 트윈 이름은 그대로였다. **연결된 시스템을 따라가는 트윈에서는 이름이 나중에 좋아진다** — * 커넥터가 나아질 때마다 이 일이 난다. * * 그때 남은 유일한 길이 트윈을 지우고 다시 세우는 것이었다. 그러면 지난 기록이 사라진다 — **이름 * 하나 때문에 사실을 버리는 선택**이 된다. 그래서 이름만 바꾸는 문을 낸다. * * ── 연결이 따라오게 하지 않는다 ──────────────────────────────────────────── * 다시 읽기가 이름을 따라가게 하면 사람이 붙인 이름을 덮어쓴다. 「사람이 손대지 않았으면 따라간다」가 * 옳아 보이지만, 그러려면 「손댔다」는 표시를 새로 만들어야 하고 그것은 이름 하나 때문에 지기에 무거운 * 빚이다. 사람이 바꾸는 길만 낸다. * * ── 빈 이름은 받지 않는다 ────────────────────────────────────────────────── * 이름을 지우는 것과 바꾸는 것은 다른 일이다. 빈 값을 받으면 그 트윈은 목록에서 식별자만 남는데, * 그것을 「이름을 바꿨다」로 보고하면 거짓이다. 지우고 싶으면 그 뜻의 문이 따로 있어야 한다. */ renameTwinInstance(instanceId: string, name: string, context: ResolverContext): Promise; /** * 폐기 전에 사라질 것을 읽는다. * * 삭제는 레지스트리 행 하나만 없애는 일이 아니다. `TwinEngine.remove` 는 같은 트윈의 저널도 * purge 한다. 그래서 확인 창이 추측한 숫자를 쓰지 않고, **삭제와 같은 domain·instance 범위**를 * 직접 센다. 저널이 비어 있는 트윈도 `0` 과 null 기간을 돌려준다 — 없는 기록을 기간으로 * 꾸며내면 "아무것도 안 지워진다"와 "언제부터인지 모른다"가 섞인다. */ twinDeletionPreview(instanceId: string, context: ResolverContext): Promise; /** 삭제 — 정지 + 레지스트리 삭제 + 저널 purge(domain 스코프). */ deleteTwinInstance(instanceId: string, context: ResolverContext): Promise; /** 관리 목록 — 등록된 인스턴스 전체(kind/status/running/revision/노드·무버 수). 데이터 없으면 빈 배열. */ /** * **이 공간의 트윈 id 들** — 한 현실을 여러 렌즈가 비추므로 공간을 물으면 그 렌즈 전부를 답한다. * * 화면이 전체 목록을 받아 걸러 쓰던 규칙을 서버로 모은다. 예측 화면은 같은 확장을 한 파일에서 * **두 번** 복제하고 있었고, 규칙이 흩어지면 한쪽만 고쳐진다. 떠 있지 않은 것도 포함한다 — * 공간에 무엇이 있는지는 기동 여부와 다른 사실이다. */ twinSpaceInstanceIds(spaceId: string, context: ResolverContext): Promise; twinInstanceList(context: ResolverContext): Promise; /** 단건 상세 — 프로비저닝 에디터용 model(구조+layout) 포함. */ twinInstanceDetail(instanceId: string, context: ResolverContext): Promise; /** * 라이브(메모리) 인스턴스 id 목록 — 콘솔 셀렉터·포트폴리오용. **현재 도메인만**(테넌트 격리). * 과거엔 Object.keys(TwinEngine.instances) 로 전역 반환 → 다른 도메인 트윈이 종합현황/셀렉터에 새던 버그. * 도메인 스코프 목록(twinInstanceList 와 동일 소스)에서 running 만 추린다. */ twinInstances(context: ResolverContext): Promise; /** * 도메인 어휘 카탈로그 — 커널(레퍼런스) SSOT 를 그대로 노출. { wms:{label,locationTypes[]}, yms:…, mes:… }. * 프로비저닝 UI 는 이걸 소싱해 노드 타입/시스템을 채운다(앱 내 하드코딩 금지). */ twinDomainCatalog(): any; }