@things-factory/headless-twin 10.0.6 โ 10.0.7
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.
- package/README.md +37 -24
- package/dist-server/engine/entity-delta.d.ts +13 -1
- package/dist-server/engine/entity-delta.js +130 -16
- package/dist-server/engine/entity-delta.js.map +1 -1
- package/dist-server/engine/index.d.ts +4 -0
- package/dist-server/engine/index.js +4 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/kpi-fold.d.ts +20 -3
- package/dist-server/engine/kpi-fold.js +21 -4
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.d.ts +9 -0
- package/dist-server/engine/kpi-query.js +118 -19
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/kpi-target.d.ts +141 -0
- package/dist-server/engine/kpi-target.js +137 -0
- package/dist-server/engine/kpi-target.js.map +1 -0
- package/dist-server/engine/live-attentions.d.ts +4 -2
- package/dist-server/engine/live-attentions.js +5 -1
- package/dist-server/engine/live-attentions.js.map +1 -1
- package/dist-server/engine/measured-estimator.d.ts +50 -0
- package/dist-server/engine/measured-estimator.js +78 -0
- package/dist-server/engine/measured-estimator.js.map +1 -0
- package/dist-server/engine/model-basis.d.ts +23 -0
- package/dist-server/engine/model-basis.js +100 -0
- package/dist-server/engine/model-basis.js.map +1 -0
- package/dist-server/engine/oee-accumulator.d.ts +2 -2
- package/dist-server/engine/oee-accumulator.js +4 -4
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/spec-coverage.d.ts +49 -0
- package/dist-server/engine/spec-coverage.js +60 -0
- package/dist-server/engine/spec-coverage.js.map +1 -0
- package/dist-server/engine/structure-diff.d.ts +25 -0
- package/dist-server/engine/structure-diff.js +63 -0
- package/dist-server/engine/structure-diff.js.map +1 -0
- package/dist-server/engine/travel-estimator.d.ts +57 -0
- package/dist-server/engine/travel-estimator.js +120 -0
- package/dist-server/engine/travel-estimator.js.map +1 -0
- package/dist-server/engine/twin-engine.d.ts +153 -17
- package/dist-server/engine/twin-engine.js +473 -81
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/engine/warm-start.d.ts +5 -5
- package/dist-server/engine/warm-start.js +4 -4
- package/dist-server/engine/warm-start.js.map +1 -1
- package/dist-server/service/index.d.ts +4 -2
- package/dist-server/service/index.js +21 -14
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/reference-live.js +2 -1
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +307 -1
- package/dist-server/service/reference/reference-master.js +96 -8
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.js +3 -3
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/template-registry.d.ts +1 -1
- package/dist-server/service/reference/template-registry.js.map +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.js +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +1 -1
- package/dist-server/service/twin-event/twin-event-keys.js +3 -3
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +11 -0
- package/dist-server/service/twin-event/twin-event.js +6 -1
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +50 -7
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-instance/twin-instance.js +1 -1
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/twin-journal-query.d.ts +9 -0
- package/dist-server/service/twin-journal/twin-journal-query.js +54 -3
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +4 -3
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-area.js +1 -1
- package/dist-server/service/twin-space/twin-space-area.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.js +3 -3
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-server/service/twin-space/twin-space.d.ts +11 -0
- package/dist-server/service/twin-space/twin-space.js +5 -0
- package/dist-server/service/twin-space/twin-space.js.map +1 -1
- package/dist-server/service/twin-structure/index.d.ts +2 -0
- package/dist-server/service/twin-structure/index.js +6 -0
- package/dist-server/service/twin-structure/index.js.map +1 -0
- package/dist-server/service/twin-structure/twin-structure.d.ts +28 -0
- package/dist-server/service/twin-structure/twin-structure.js +97 -0
- package/dist-server/service/twin-structure/twin-structure.js.map +1 -0
- package/dist-server/service/twin-target/index.d.ts +4 -0
- package/dist-server/service/twin-target/index.js +8 -0
- package/dist-server/service/twin-target/index.js.map +1 -0
- package/dist-server/service/twin-target/twin-target-resolver.d.ts +7 -0
- package/dist-server/service/twin-target/twin-target-resolver.js +143 -0
- package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -0
- package/dist-server/service/twin-target/twin-target.d.ts +25 -0
- package/dist-server/service/twin-target/twin-target.js +112 -0
- package/dist-server/service/twin-target/twin-target.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/server/engine/entity-delta.ts +135 -15
- package/server/engine/index.ts +4 -0
- package/server/engine/kpi-fold.ts +40 -8
- package/server/engine/kpi-query.ts +129 -19
- package/server/engine/kpi-target.ts +226 -0
- package/server/engine/live-attentions.ts +12 -2
- package/server/engine/measured-estimator.ts +91 -0
- package/server/engine/model-basis.ts +94 -0
- package/server/engine/oee-accumulator.ts +5 -5
- package/server/engine/spec-coverage.ts +85 -0
- package/server/engine/structure-diff.ts +88 -0
- package/server/engine/travel-estimator.ts +133 -0
- package/server/engine/twin-engine.ts +498 -84
- package/server/engine/warm-start.ts +8 -8
- package/server/service/index.ts +7 -0
- package/server/service/reference/reference-live.ts +2 -1
- package/server/service/reference/reference-master.ts +383 -10
- package/server/service/reference/reference-resolver.ts +3 -3
- package/server/service/reference/template-registry.ts +1 -1
- package/server/service/twin-attention/twin-attention-query.ts +1 -1
- package/server/service/twin-control/twin-control-mutation.ts +1 -1
- package/server/service/twin-event/twin-event-keys.ts +2 -2
- package/server/service/twin-event/twin-event.ts +15 -1
- package/server/service/twin-forecast/twin-forecast-query.ts +56 -8
- package/server/service/twin-instance/twin-instance.ts +1 -1
- package/server/service/twin-journal/twin-journal-query.ts +52 -4
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +4 -3
- package/server/service/twin-space/twin-space-area.ts +1 -1
- package/server/service/twin-space/twin-space-resolver.ts +3 -3
- package/server/service/twin-space/twin-space.ts +14 -0
- package/server/service/twin-structure/index.ts +3 -0
- package/server/service/twin-structure/twin-structure.ts +93 -0
- package/server/service/twin-target/index.ts +5 -0
- package/server/service/twin-target/twin-target-resolver.ts +124 -0
- package/server/service/twin-target/twin-target.ts +97 -0
- package/test/capability-mapping.test.ts +5 -5
- package/test/duration-estimators.test.ts +144 -0
- package/test/entity-delta.test.ts +150 -19
- package/test/ingest-bench.test.ts +9 -9
- package/test/kpi-fold.test.ts +232 -3
- package/test/live-mirror-parity.test.ts +53 -19
- package/test/master-to-twin.test.ts +87 -13
- package/test/model-basis.test.ts +86 -0
- package/test/oee-accumulator.test.ts +9 -9
- package/test/scale-twin-bench.test.ts +22 -22
- package/test/spec-coverage.test.ts +113 -0
- package/test/streamline-e2e.test.ts +10 -10
- package/test/structure-revision-db.test.ts +310 -0
- package/test/twin-event-keys.test.ts +2 -2
- package/test/vocabulary-guard.test.ts +43 -0
- package/test/warm-start.test.ts +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twin-engine.js","sourceRoot":"","sources":["../../server/engine/twin-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * TwinEngine โ operato-twin ์ปค๋ ์ธ์คํด์ค๋ฅผ things-factory ์์์ ํธ์คํ
.\n * integration-base ์ ScenarioEngine ํจํด ๋ฏธ๋ฌ: ๋ฉ๋ชจ๋ฆฌ ์ธ์คํด์ค ๋งต + ๋ฐฑ๊ทธ๋ผ์ด๋ tick + pubsub ์ํ ๋ฐํ.\n *\n * ์ปค๋(zero-dep, ESM+CJS ์ด์ค๋ฐฐํฌ)์ CJS require ๋ก ๋ก๋(Node 20 CommonJS ์๋น โ require(ESM) ํํผ).\n * ์ปค๋์ ๊ฒฐ์ ์ ๋
ผ๋ฆฌ ์ฐ์ฐ ์ฝ์ด โ ์ด host ๊ฐ ์ ์ก(pubsub)ยท์์(TypeORM)ยท์ค์ผ์ค(tick)ยท๋ณต๊ตฌ(replay)๋ง ์๊ฒ ๋ํ.\n * (์ค๊ณ SoT: operato-twin/design/integration/things-factory-host.md)\n */\n\nimport { pubsub, getRepository, Domain } from '@things-factory/shell'\nimport { cacheService } from '@things-factory/cache-service'\n\nimport { TwinEvent } from '../service/twin-event/twin-event.js'\nimport { twinEventKeys } from '../service/twin-event/twin-event-keys.js'\nimport { planWarmStart } from './warm-start.js'\nimport { TwinInstance } from '../service/twin-instance/twin-instance.js'\nimport { TwinSpace } from '../service/twin-space/twin-space.js'\nimport { TwinSpaceRepresentation } from '../service/twin-space/twin-space-representation.js'\nimport { TwinSpaceArea } from '../service/twin-space/twin-space-area.js'\nimport { TwinArea } from '../service/twin-space/twin-area.js'\nimport { masterToTwin, type ReferenceMaster } from '../service/reference/reference-master.js'\nimport { buildEntityDeltas } from './entity-delta.js'\nimport { OeeAccumulator, withLiveOee } from './oee-accumulator.js'\nimport { withLiveAttentions } from './live-attentions.js'\n\nimport type { TwinKernel, BoardDef, SubscriptionMessage, TwinRuntime as TwinRuntimeType, CanonicalEnvelope } from '@operato/twin-kernel'\n\n/* ์ปค๋ ๋ฐํ์ ๋ก๋ โ CJS ๋ฒ๋ค(dist-cjs). ํ์
์ ์ import type ๋ก. replay = ์ด๋ฒคํธ์ดโ์ํ ์ฌ๊ตฌ์ฑ(๋ณต๊ตฌยท์๊ฐ์ฌํ). */\nconst { WmsKernel, YmsKernel, MesKernel, TwinRuntime, StateProjector, replay, DOMAIN_CATALOG, OP_EVENT } = require('@operato/twin-kernel')\n\nconst KERNELS: Record<string, any> = { wms: WmsKernel, yms: YmsKernel, mes: MesKernel }\n\n/* ๋ผ์ด๋ธ ์ฒ๋ฆฌ๋ ๊ณ์ธก(๋ชจ๋ํฐ) โ ์ ์
/๋ฐฉ์ก/์ ๋๋ฅ ยท๋ฐฑ๋ก๊ทธ. ์ค ๋๊ธฐ ์ธํฐํ์ด์ค ๋ถํ๋ฅผ ์ฝ๋ ์ผ๊ธ ์งํ. */\ninterface TwinMetrics {\n ingestedTotal: number // ๋์ ์ ์
์ด๋ฒคํธ\n broadcastTotal: number // ๋์ ๋ฐฉ์ก ํ์\n journaledTotal: number // ๋์ ์ ๋ ๊ธฐ๋ก ์ด๋ฒคํธ\n ingestRate: number // ์ต๊ทผ ์ ์
๋ฅ (ev/s)\n broadcastRate: number // ์ต๊ทผ ๋ฐฉ์ก๋ฅ (ํ/s)\n journalRate: number // ์ต๊ทผ ์ ๋๋ฅ (ev/s)\n backlog: number // ๋ง์ง๋ง flush ์ ๋๊ธฐ ์ ๋ ํฌ๊ธฐ(๋ฐฑํ๋ ์
์ ํธ)\n // ์ฐฝ(window) ์ง๊ณ์ฉ ๋ด๋ถ ๋์ \n _accIngest: number\n _accBroadcast: number\n _accJournal: number\n _windowStartMs: number\n}\n\n/*\n * realityMode โ ์ด ํธ์์ \"ํ์ค์ด ์ด๋์ ์ค๋\"(runtime-state-model ยง0ยทยง1 ํ๋ ์์ โ ์ ์ธ).\n * ๋ถํ
๊ฑฐ๋์ ๊ฒฐ์ ํ๋ 1๊ธ ์ ์ธ: mirror=์ธ๋ถ ์ค๋ฌผ ์ฌ๋๊ธฐ / sim-world=์์ฑ ํ์๋ผ์ธ ์ง์(resume) / sim-experiment=seed ์ฌํ(reset).\n * ๋ฏธ์ ์ธ = 'sim-experiment'(๊ฐ์ฅ ๋ณด์์ โ ๊ธฐ์กด ๋ฐ๋ชจ ๊ฑฐ๋ ๋ณด์กด).\n */\nexport type RealityMode = 'mirror' | 'sim-world' | 'sim-experiment'\nexport const DEFAULT_REALITY_MODE: RealityMode = 'sim-experiment'\n\n/* ์ธ๋ฉ๋ชจ๋ฆฌ ๋ผ์ด๋ธ ๋ฐํ์ ํ๋(์์ ์ํฐํฐ TwinInstance ์ ๊ตฌ๋ถ). */\ninterface InstanceRuntime {\n /** ํ์ค ์ถ์ฒ ์ ์ธ(ยง0 ํ๋ ์ โ ). ๋ถํ
๊ฑฐ๋(reset/resume/resync)์ ๊ทผ๊ฑฐ. */\n realityMode?: RealityMode\n id: string\n domainId: string\n domain?: any // ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ(data ์ฑ๋)์ฉ Domain ๊ฐ์ฒด(subdomain ํํฐ). start ์ ๋น๋๊ธฐ ํด์.\n runtime?: TwinRuntimeType // sim: ์ปค๋ ๋ฐํ์(tick/subscribe/dispatch). live ๋ projector ์ฌ์ฉ.\n kernel?: any // sim: ForecastTwin(fork/getSnapshot/tick/scenario). live ๋ฏธ์ฌ์ฉ.\n mode?: 'sim' | 'live' // ์ํ ๋๋ผ์ด๋ฒ โ sim=์ปค๋ tick / live=projector ๋ฏธ๋ฌ(face2-inbound-live). ๋ฏธ์ง์ =sim.\n projector?: any // live: StateProjector(์ด๋ฒคํธโState ์ฌ๊ตฌ์ฑ). sim ๋ฏธ์ฌ์ฉ.\n oee?: OeeAccumulator // live: OEE ๊ณ์ฐ ์ธต(์ด๋ฒคํธ ๋์ โ mover payload ๋ณด๊ฐ). sim ์ ์ปค๋์ด ๊ณ์ฐ.\n unsub: () => void\n timer?: any\n /** ์ํฐํฐ๋ณ ๋ง์ง๋ง ๋ฐํ ์๊ทธ๋์ฒ โ ๊ฐ์ด ๋ฐ๋ ์ํฐํฐ๋ง ์ฌ๋ฐํ(๋ฌด๋ณํ ๋ฐ๋ณต push ๋ฐฉ์ง). */\n entitySigs?: Map<string, string>\n /** live ๋ฐฉ์ก ๋ณํฉ(ingest-scale ยง4.4) โ ingest ๋ง๋ค ๋ฐฉ์กํ์ง ์๊ณ dirty ํ์ โ coalescer tick ์ด ์ฃผ๊ธฐ ๋ฐฉ์ก. */\n dirty?: boolean\n /** live ์ ๋ ๊ฒฐ์ โ ingest ์ด๋ฒคํธ๋ฅผ ๋ชจ์๋ค๊ฐ coalescer tick ์์ ๋ฐฐ์น ๊ธฐ๋ก(์ด๋ฒคํธ๋ง๋ค DB write ๊ธ์ง). */\n pendingJournal?: any[]\n /** live ์ ๋ revision ์นด์ดํฐ(sim ์ delta revision ๋์ โ ์๊ฐ์ฌํยทํ์คํ ๋ฆฌ ๋
ธ๋ธ ์ต์ปค). */\n revision?: number\n /** live ์ฒ๋ฆฌ๋ ๊ณ์ธก(๋ชจ๋ํฐ, โฃ-1). */\n metrics?: TwinMetrics\n}\n\nexport class TwinEngine {\n static instances: Record<string, InstanceRuntime> = {}\n /** ๋ผ์ด๋ธ ๋ฐํ์์ด ์์ ๋(๋ณต๊ตฌ ํ ๋ฏธ๊ธฐ๋) ์ ๋์์ ์ฌ๊ตฌ์ฑํ ์ํ ์บ์. */\n static recovered: Record<string, any> = {}\n static TICK_MS = 1000\n\n /* ์ต์ ์ค๋
์ท ์์(warm-start) โ ์ฌ๊ธฐ๋ ์ ์ ๋ fold-from-0 replay ๋์ ๋ง์ง๋ง ๋ผ์ด๋ธ ์ค๋
์ท์ผ๋ก ๋ณต์.\n * ํ๋ ์์ํฌ ๊ณตํต cache-service(@things-factory/cache-service) ์ฌ์ฌ์ฉ(์ฌ๋ฐ๋ช
๊ธ์ง, framework-leverage ยง4).\n * ์ ๋์ ๊ทธ๋๋ก ์ง์ค(์๊ฐ์ฌํ/history replay ๋ฌด๋ณ๊ฒฝ) โ ์บ์๋ display-only ์์คํํธ ์ต์ ํ. */\n static SNAPSHOT_CACHE_ID = 'twin-snapshot'\n static SNAPSHOT_TTL_S = 7 * 24 * 3600 // 7์ผ โ ์ ์ ๋ค์ดํ์ ์์กด, ๋ง๋ฃ ์ ์ ๋ replay ํด๋ฐฑ\n static CHECKPOINT_MS = 20000 // ์ฒดํฌํฌ์ธํธ ์ฃผ๊ธฐ(ํซ ๋ธ๋ก๋์บ์คํธ ๊ฒฝ๋ก์ ๋ถ๋ฆฌ, O(state) ์ค๋กํ)\n private static checkpointTimer?: any\n\n /** ์ต์ ์ค๋
์ท์ cache-service ์ ์ฒดํฌํฌ์ธํธ(๋๋ฉ์ธ+instanceId ํค). display-onlyยท๋น์ฐจ๋จยท์ค๋ฅํก์. */\n static async persistSnapshot(domainId: string, instanceId: string): Promise<void> {\n const inst = this.instances[instanceId]\n if (!inst) return\n const state = this.snapshot(instanceId)\n if (!state) return\n const revision = inst.revision ?? state.revision ?? 0\n await cacheService.setInCache(this.SNAPSHOT_CACHE_ID, { domainId, instanceId }, { revision, state }, this.SNAPSHOT_TTL_S)\n }\n\n /** ์ฒดํฌํฌ์ธํธ๋ ์ต์ ์ค๋
์ท ๋ก๋(์์ผ๋ฉด null). getFromCache ๋ CacheStore ์ํฐํฐ๋ฅผ ๋ฐํ โ ํ์ด๋ก๋๋ .value. */\n static async loadSnapshot(domainId: string, instanceId: string): Promise<{ revision: number; state: any } | null> {\n const entry = await cacheService.getFromCache(this.SNAPSHOT_CACHE_ID, { domainId, instanceId })\n return (entry as any)?.value ?? null\n }\n\n /** ์ฒดํฌํฌ์ธํธ ๋ฃจํ ๊ธฐ๋(1ํ) โ ๋ผ์ด๋ธ ์ธ์คํด์ค๋ค์ ์ต์ ์ค๋
์ท์ ์ฃผ๊ธฐ ์์. */\n static startCheckpointLoop(): void {\n if (this.checkpointTimer) return\n this.checkpointTimer = setInterval(() => {\n for (const [instanceId, inst] of Object.entries(this.instances)) {\n this.persistSnapshot(inst.domainId, instanceId).catch(err =>\n console.error(`[twin-engine] snapshot checkpoint fail \"${instanceId}\"`, err?.message ?? err)\n )\n }\n }, this.CHECKPOINT_MS)\n if (typeof this.checkpointTimer?.unref === 'function') this.checkpointTimer.unref()\n }\n\n /**\n * ๋ถํ
ํ
โ DB ์ status='running' ์ผ๋ก ๋จ์ ์ธ์คํด์ค๋ฅผ ์ ๋์์ ์ํ ์ฌ๊ตฌ์ฑ(DBโreplay).\n * ๋ผ์ด๋ธ tick ์ฌ๊ฐ(sim ๊ฒฐ์ ์ re-run / live ์ธ์ ์คํธ ์ง์)๋ ํ์. ์ฌ๊ธฐ์ ์ํ ๋ณต์ + ๋
ธ์ถ.\n */\n static async bootstrap(): Promise<void> {\n try {\n // ๋ฐฑํ(space #3) โ spaceId ์ปฌ๋ผ ์๋ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ board.spaceId ๋ก ์ฑ์(1ํ, ๋ง์ด๊ทธ๋ ์ด์
์์ ).\n const repo = getRepository(TwinInstance)\n const missing = (await repo.find()).filter(r => !r.spaceId && (r.board as any)?.spaceId)\n for (const r of missing) {\n r.spaceId = (r.board as any).spaceId\n r.areaId = (r.board as any).areaId ?? r.areaId\n await repo.save(r)\n }\n if (missing.length) console.log(`[twin-engine] backfilled spaceId for ${missing.length} instance(s).`)\n\n // ๋ฐฑํ(area ๋จ์ผํ P3) โ deprecated content.areas โ TwinArea ์ด๊ด(ํด๋ฐฑ ์ ๊ฑฐ ์ ์์ ์ฑ ๋ณด์ฅ, 1ํ).\n const spaceRepo = getRepository(TwinSpace)\n const twinAreaRepo = getRepository(TwinArea)\n for (const sp of await spaceRepo.find()) {\n const cAreas = ((sp.content as any)?.areas ?? []) as any[]\n for (const a of cAreas) {\n if (!a?.id) continue\n const ex = await twinAreaRepo.findOne({ where: { domain: { id: sp.domainId } as any, space: { id: sp.id } as any, areaId: a.id } })\n if (ex) continue\n await twinAreaRepo.save(twinAreaRepo.create({\n domain: { id: sp.domainId } as any, space: { id: sp.id } as any, areaId: a.id,\n name: a.name ?? a.id, type: a.type, parentId: a.parentId ?? null,\n layout: a.x != null ? { x: a.x, y: a.y, w: a.w, h: a.h } : null\n }))\n }\n }\n\n const rows = await repo.find({ where: { status: 'running' } })\n for (const row of rows) {\n if (!row.domainId || !row.instanceId) continue\n // ์์คํํธ: ์บ์๋ ์ต์ ์ค๋
์ท ์ฐ์ (O(1) + attentions/OEE ๋ฑ ๋ผ์ด๋ธ ํ์์ํ ๋ณด์กด).\n // ์์ผ๋ฉด ์ ๋ fold-from-0 replay(์ง์ค ํด๋ฐฑ โ replay ๋ ๋ผ์ด๋ธ ํ์์ํ๋ฅผ ๋ชป ๋ด์ผ๋ฏ๋ก ์บ์๊ฐ ๋ ์ถฉ์ค).\n const cached = await this.loadSnapshot(row.domainId, row.instanceId).catch(() => null)\n if (cached?.state) {\n this.recovered[row.instanceId] = { revision: cached.revision, state: cached.state }\n console.log(`[twin-engine] warm-started \"${row.instanceId}\" from snapshot cache โ revision ${cached.revision}.`)\n continue\n }\n const state = await this.recover(row.domainId, row.instanceId).catch(() => null)\n if (state) {\n this.recovered[row.instanceId] = { revision: state.revision, state }\n console.log(`[twin-engine] recovered \"${row.instanceId}\" from journal โ revision ${state.revision}.`)\n }\n }\n this.startCheckpointLoop() // ์ดํ ๊ธฐ๋๋๋ ๋ผ์ด๋ธ ์ธ์คํด์ค์ ์ต์ ์ค๋
์ท์ ์ฃผ๊ธฐ ์์\n } catch (err) {\n console.error('[twin-engine] recovery scan failed', err)\n }\n }\n\n /**\n * ์์คํํธ โ ๊ธฐ๋ํ๋ ์ปค๋์ **์ง์ ๊ด์ธก ์ํ**๋ฅผ ์ฌ๋๋ค.\n *\n * โโ ์ ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `loadBoard` ๋ **๊ตฌ์กฐ๋ง** ์ฃ๋๋ค(๋
ธ๋ยท๋ฌด๋ฒ). ์ํ(๋ฌด์์ด ์ด๋์ ์ผ๋ง๋)๋ ์๋ค. ๊ทธ๋์ ์ฌ๊ธฐ๋ํ\n * ํธ์์ ์ ๋์ ์
๊ณ 540๊ฑด์ด ๋จ์ ์์ด๋ ์ฌ๊ณ ๊ฐ 0 ์ด์๊ณ , ํ๋ฉด์ \"๋ณด์ ์ค์ธ ๊ฒ์ด ์์ต๋๋ค\" ๋ผ๊ณ \n * ๋งํ๋ค โ ์๋ ์ฌ๊ณ ๋ฅผ ์๋ค๊ณ ํ๋ ์
์ด๋ค(2026-07-31 hatiolab-wms ์ค์ธก์ผ๋ก ํ์ธ).\n * `bootstrap()` ์ด ์ด๋ฏธ ์ฒดํฌํฌ์ธํธ ์บ์(์์ผ๋ฉด ์ ๋ replay)๋ก ์ํ๋ฅผ ๋ณต๊ตฌํด `recovered` ์ ๋ด์ ๋๋๋ฐ,\n * ๊ธฐ๋ ์๊ฐ ๊ทธ๊ฑธ **๋ฒ๋ฆฌ๊ณ ** ์์๋ค. ๋ฐ๋ง ์ฐ๊ฒฐ๋ผ ์๋ ์ฅ์น๋ฅผ ์๋๋ค.\n *\n * โโ ์ ์งํ ํ๊ณ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ยท **์ค๋๋ ๋ณต์ํ์ง ์๋๋ค.** `hydrateObserved` ์ ์ค๋ ์ธ์๋ requested/fulfilled/lines ๋ฅผ ์๊ตฌํ๋๋ฐ\n * ์ค๋
์ท์ `OrderState` ์๋ `progress` ๋ฐ์ ์๋ค. progress ์์ ์ญ์ฐํ๋ฉด ์๋ ์ซ์๋ฅผ ์ง์ด๋ด๋ ๊ฒ์ด๋ผ\n * ๋๊ธฐ์ง ์๋๋ค โ ์ฌ๊ณ ยท๋
ธ๋ยท๋ฌด๋ฒ๋ง ๋ณต์๋๊ณ ์งํ ์ค ์ค๋๋ ๋น์ด์ ์์ํ๋ค.\n * ยท ์งํ ์ค ๊ฐ๋ณ task ์ ๋ด๋ถ ์ํ๋ ๊ด์ธก๋ง์ผ๋ก๋ ๋ณต์๋์ง ์๋๋ค(์ปค๋์ด ๋ช
์ํ ํ๊ณ, ์ฌ๊ณํ์ ๋งก๊น).\n * ยท ๊ทผ๋ณธ ํด๋ฒ(์ํ ์์ ๊ณ์ฝยทrevision ์ด์ด๋ถ์)์ ๋ณ๋ ๊ณผ์ .\n *\n * โโ ๋ฒค์น๋ ์๋ํ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ถํ ๋ฒค์น๋ **์ ์์์์ ์ฉ๋์ ์ฌ๋ ๊ฒ**์ด ๋ชฉ์ ์ด๋ผ ํ์ฌ ์ํ๋ฅผ ์ฌ์ผ๋ฉด ์ธก์ ์ด ์ค์ผ๋๋ค.\n */\n private static warmStart(id: string, kernel: TwinKernel, purpose?: string): void {\n const hydrate = (kernel as any).hydrateObserved\n const plan = planWarmStart(this.recovered[id]?.state, purpose, typeof hydrate === 'function')\n\n if (plan.action === 'skip') {\n if (plan.reason === 'bench') {\n console.log(`[twin-engine] \"${id}\" is a bench twin โ starting empty on purpose (seeding would skew the measurement).`)\n } else if (plan.reason === 'unsupported') {\n console.warn(\n `[twin-engine] kernel for \"${id}\" cannot be warm-started (no hydrateObserved) โ it starts with structure only, so held stock will read as zero.`\n )\n }\n return\n }\n\n hydrate.call(kernel, plan.seed)\n console.log(\n `[twin-engine] warm-started \"${id}\" โ ${plan.itemCount} item(s), ${plan.moverCount} mover(s) restored. ` +\n 'Open orders are not restored (the snapshot carries no requested/fulfilled counts).'\n )\n }\n\n /** ํธ์ ์ธ์คํด์ค ์์ โ ์ปค๋ ์์ฑ + ๋ณด๋ ๋ก๋ + ์ง์ ์ํ ์์คํํธ + State ์คํธ๋ฆผ ๋ธ๋ฆฌ์ง + ์์ปค tick + ๋ ์ง์คํธ๋ฆฌ ์์. */\n static start(id: string, domainId: string, kind: string, board: BoardDef, realityMode?: RealityMode, purpose?: string): InstanceRuntime {\n if (this.instances[id]) return this.instances[id]\n\n const Kernel = KERNELS[kind] ?? WmsKernel\n const kernel: TwinKernel = new Kernel(domainId)\n kernel.loadBoard(board) // ๊ตฌ์กฐ๋ง. ์ํ๋ ์๋ ์์คํํธ๊ฐ ์ฌ๋๋ค.\n this.warmStart(id, kernel, purpose)\n const runtime: TwinRuntimeType = new TwinRuntime(kernel)\n\n /* subscribe ๋ RuntimeSubscription({ unsubscribe() }) ๋ฐํ โ () => void ๋ก ๊ฐ์. */\n const inst: InstanceRuntime = { id, domainId, runtime, kernel, realityMode: realityMode ?? DEFAULT_REALITY_MODE, unsub: () => {} }\n this.instances[id] = inst\n delete this.recovered[id] // ์์คํํธ๋ก ์ปค๋์ ์ฎ๊ฒจ ์ฌ์๋ค โ ์ด์ ๋ผ์ด๋ธ๊ฐ ์ง์ค์ด๋ค.\n\n /* ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ(P3): data ์ฑ๋ ํํฐ๊ฐ subdomain ์ ๋ณด๋ฏ๋ก Domain ๊ฐ์ฒด๋ฅผ 1ํ ํด์ํด ๋๋ค. */\n getRepository(Domain).findOne({ where: { id: domainId } }).then(d => (inst.domain = d)).catch(() => {})\n\n /* State ์ฑ๋: runtime.subscribe(snapshotโdeltaโclock) โ pubsub ๋ฐฉ์ก(๊ตฌ๋
๋ฆฌ์กธ๋ฒ๊ฐ instanceId ํํฐ). */\n const sub = runtime.subscribe((msg: SubscriptionMessage) => {\n pubsub.publish('twin-state', {\n twinState: { instanceId: id, kind: msg.kind, revision: (msg as any).revision, payload: msg }\n })\n /* ์์ + ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ ๋ธ๋ฆฌ์ง: delta ๋ง๋ค ์ ๋ ์ ์ฅ + ์ํฐํฐ๋ณ data(tag:) publish โ ๋ณด๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ. */\n if (msg.kind === 'delta') {\n this.persist(domainId, id, msg).catch(err => console.error('twin persist fail', err))\n this.publishEntityData(inst)\n }\n })\n inst.unsub = () => sub.unsubscribe()\n\n /* ๋ณต๊ตฌ ์ต์ปค: ๋ ์ง์คํธ๋ฆฌ์ board/kind/status/realityMode ์์(์ฌ๋ถํ
์ ์ด๊ฒ ์์ด์ผ replayยท์ ์ธ ๊ฑฐ๋ ๊ฐ๋ฅ). */\n this.register(domainId, id, kind, board, 'running', inst.realityMode).catch(err => console.error('twin register fail', err))\n\n /* ์์ปค tick โ ์ค์ผ๋ ํค์ setInterval(๋ฉ์ธ ๋ฃจํ). ๊ธด ์๋ฎฌ ์คํ-๋ฃจํ(worker thread)๋ ์ค์ผ์ผ ํ๋๋(ํฅํ, ยงhost ๊ฒฝ๊ณ). */\n inst.timer = setInterval(() => runtime.tick(this.TICK_MS), this.TICK_MS)\n return inst\n }\n\n /**\n * live-๋ชจ๋ ๊ธฐ๋(face2-inbound-live ยง1.1) โ ์ปค๋ tick ๋์ StateProjector ๋ก ์ค ์ด๋ฒคํธ๋ฅผ ๋ฏธ๋ฌ.\n * ๊ด์ธก ์ํ(์ ์ ยท์์นยท์์ดํ
)๋ projector ๊ฐ ์ฌ๊ตฌ์ฑ โ sim ๊ณผ ๋์ผ data(tag) payload โ **๋ณด๋ ์ปดํฌ๋ํธ ๋์ผ ๋ ๋**\n * (live-mirror-parity ๋ก payload ์ธต ๊ฒ์ฆ๋จ). ๊ณ์ฐ ์ธต(attentionsยทOEE)์ ์ด๋ฒคํธ์ ์์ด ๋ถ์ฌ โ derive ์ธต์ ํ์.\n * ์ค ์ด๋ฒคํธ์ = reference ์ด๋ํฐ openLiveFeed โ face2-adapter.ingest โ CanonicalEnvelope โ ingestLive().\n */\n static startLive(id: string, domainId: string, kind: string, board: BoardDef): InstanceRuntime {\n if (this.instances[id]) return this.instances[id]\n const projector = new StateProjector(board)\n const inst: InstanceRuntime = { id, domainId, mode: 'live', realityMode: 'mirror', projector, oee: new OeeAccumulator(), unsub: () => {} }\n inst.metrics = { ingestedTotal: 0, broadcastTotal: 0, journaledTotal: 0, ingestRate: 0, broadcastRate: 0, journalRate: 0, backlog: 0, _accIngest: 0, _accBroadcast: 0, _accJournal: 0, _windowStartMs: Date.now() }\n this.instances[id] = inst\n delete this.recovered[id]\n /* ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ(data ์ฑ๋) subdomain ํํฐ์ฉ Domain 1ํ ํด์(sim ๊ณผ ๋์ผ). */\n getRepository(Domain).findOne({ where: { id: domainId } }).then(d => (inst.domain = d)).catch(() => {})\n /* ์ ๋ revision ์นด์ดํฐ ์๋ โ ๊ธฐ์กด ์ ๋ ์ต๋์น์์ ์ด์ด๋ถ์(์ฌ๊ธฐ๋ ์ revision ์ถฉ๋ ๋ฐฉ์ง). ์ดํ ์ธ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ. */\n getRepository(TwinEvent)\n .findOne({ where: { domain: { id: domainId }, instanceId: id }, order: { revision: 'DESC' } })\n .then(top => (inst.revision = top?.revision ?? 0))\n .catch(() => (inst.revision = 0))\n this.register(domainId, id, kind, board, 'running', 'mirror').catch(err => console.error('twin register fail', err))\n return inst\n }\n\n /**\n * live ์ด๋ฒคํธ ์ธ์ ์คํธ โ projector ๊ตฌ๋ + data(tag) ๋ฐฉ์ก(ํ๋ฃจํ์ ์ธ๋ฐ์ด๋ ๋์ฐฉ ์ง์ , command-routing ยง8.2).\n * reference ์ด๋ํฐ๊ฐ ๋ธ records โ ์ปค๋ face2-adapter.ingest โ CanonicalEnvelope ๋ฅผ ์ฌ๊ธฐ๋ก ๋ฐ์ด๋ฃ๋๋ค.\n * (State ์ฑ๋ ๋ธํ/์ ๋ ๊ฒฐ์ ์ ํ์ โ ์ค์ผ๋ ํค์ data(tag) ๋ฏธ๋ฌ ์ค์ฌ.)\n */\n static ingestLive(id: string, envelopes: CanonicalEnvelope[]): void {\n const inst = this.instances[id]\n if (inst?.mode !== 'live' || !inst.projector) return\n for (const e of envelopes) { inst.projector.apply(e); inst.oee?.apply(e) } // ๊ด์ธก(projector) + ๊ณ์ฐ(OEE ๋์ )\n // ์ ๋ ๊ฒฐ์ (๋ผ์ด๋ธ๋ sim ์ฒ๋ผ ์ด๋ฒคํธ ์์) โ ๋จ ์ด๋ฒคํธ๋ง๋ค DB write ํ๋ฉด ๋ถํํญ๋ฐ์ด๋ผ ๋ชจ์๋๋ค๊ฐ\n // coalescer tick ์์ ๋ฐฐ์น ๊ธฐ๋ก(๋ฐฉ์ก๊ณผ ๋์ผ ์ฃผ๊ธฐ). ํ์คํ ๋ฆฌ ๋
ธ๋ธยทํ์๋ผ์ธยท๋น์ฆ๋์ค ์์ฅ์ด ์ด ์ ๋์ ์ฝ๋๋ค.\n ;(inst.pendingJournal ?? (inst.pendingJournal = [])).push(...envelopes)\n if (inst.metrics) { inst.metrics.ingestedTotal += envelopes.length; inst.metrics._accIngest += envelopes.length } // ๊ณ์ธก(โฃ-1)\n // ๋ฐฉ์ก ๋ณํฉ(ingest-scale ยง1.1/ยง4.4) โ apply ๋ O(1)ยท์ธ๋ค. ๊ทธ๋ฌ๋ ๋ฐฉ์ก(snapshot O(state))์ ๋น์ธ(๋๊ท๋ชจ 5ms+)\n // ์ด๋ฒคํธ๋ง๋ค ๋ฐฉ์กํ๋ฉด ํญ๋ฐ โ dirty ๋ง ์ฐ๊ณ coalescer tick ์ด ์ฃผ๊ธฐ ๋ฐฉ์ก(๋ฐฉ์ก๋ฅ โ ์ธ์ ์คํธ๋ฅ ).\n inst.dirty = true\n this.ensureBroadcastCoalescer()\n }\n\n /** ๋ฐฉ์ก ๋ณํฉ ์ฃผ๊ธฐ(ms) โ ๋ฐฉ์ก๋ฅ ์ํ. ์ธ์ ์คํธ๊ฐ ์๋ฌด๋ฆฌ ๋นจ๋ผ๋ ์ด ์ฃผ๊ธฐ๋ก๋ง ๋ฐฉ์ก. */\n static BROADCAST_COALESCE_MS = 200\n private static broadcastTimer?: any\n\n /** live ๋ฐฉ์ก coalescer โ dirty ์ธ live ์ธ์คํด์ค๋ง ์ฃผ๊ธฐ์ ์ผ๋ก 1ํ ๋ฐฉ์ก(entitySigs ๋ก ๋ณ๊ฒฝ ์ํฐํฐ๋ง). */\n private static ensureBroadcastCoalescer(): void {\n if (this.broadcastTimer) return\n this.broadcastTimer = setInterval(() => this.flushLiveBroadcasts(), this.BROADCAST_COALESCE_MS)\n if (typeof this.broadcastTimer.unref === 'function') this.broadcastTimer.unref() // ์ข
๋ฃ ๋น์ฐจ๋จ\n }\n\n /** dirty live ์ธ์คํด์ค ๋ฐฉ์ก flush(์ฃผ๊ธฐ tick ๋๋ ๋ช
์ ํธ์ถ). ํ
์คํธ/์ฆ์ ๋ฐฉ์ก์ฉ์ผ๋ก public. */\n static flushLiveBroadcasts(): void {\n let anyLive = false\n const now = Date.now()\n for (const inst of Object.values(this.instances)) {\n if (inst.mode !== 'live') continue\n anyLive = true\n // ์ฒ๋ฆฌ๋ ๊ณ์ธก(โฃ-1) โ ์ฐฝ(โฅ1s)๋ง๋ค ์ ์
/๋ฐฉ์ก/์ ๋๋ฅ ๊ฐฑ์ . dirty ๋ฌด๊ด(์ ํด๋ฉด 0์ผ๋ก ์๋ ด). ๋ถํ๋ฅผ ์ฝ๋ ์ ํธ.\n const m = inst.metrics\n if (m) {\n const dt = (now - m._windowStartMs) / 1000\n if (dt >= 1) {\n m.ingestRate = Math.round(m._accIngest / dt)\n m.broadcastRate = Math.round((m._accBroadcast / dt) * 10) / 10\n m.journalRate = Math.round(m._accJournal / dt)\n m._accIngest = 0; m._accBroadcast = 0; m._accJournal = 0; m._windowStartMs = now\n }\n }\n if (!inst.dirty) continue\n inst.dirty = false\n // โ ์ํฐํฐ data(tag) ๋ฐฉ์ก โ ๋ณด๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ ๋ ๋.\n this.publishEntityData(inst)\n if (m) { m.broadcastTotal++; m._accBroadcast++ }\n // โข ์ ๋ ๋ฐฐ์น ๊ธฐ๋ก โ ๋ชจ์๋ ์ด๋ฒคํธ์ revision ๋ถ์ฌํด ๋ฒํฌ ์ ์ฅ(์ด๋ฒคํธ๋ง๋ค write ์๋).\n // revision ์นด์ดํฐ๋ ์ธ๋ฉ๋ชจ๋ฆฌ(startLive ์์ ์ ๋ high-water ๋ก 1ํ ์๋) โ tick ๋ง๋ค DB ์ง์ ์์.\n const batch = inst.pendingJournal\n if (batch?.length && inst.revision != null) {\n inst.pendingJournal = []\n const start = inst.revision\n inst.revision = start + batch.length\n if (m) { m.journaledTotal += batch.length; m._accJournal += batch.length; m.backlog = batch.length }\n this.persistBatch(inst.domainId, inst.id, batch, start).catch(err => console.error('twin live journal fail', err))\n }\n // โก State ์ฑ๋ ๋ฐฉ์ก โ \"๋ฐ๋์๋ค\"๋ ๊ฐ๋ฒผ์ด ์ ํธ๋ง(kind+revision). ๋งต ๊ตฌ๋
(subscribeTwinState)์ ์ด ์ ํธ์\n // scheduleRefresh(250ms ๋๋ฐ์ด์ค)โpollLive ๋ก ๋๋ฌผ์ด๋ด. ์ค๋
์ท(O(state))์ ๋ณด๋ ์ฌ๋์ด ๋ฌผ์ ๋๋ง 1ํ ๊ณ์ฐ.\n // (์ฌ๊ธฐ์ payload ๋ก ์ค๋
์ท์ ์ค์ผ๋ฉด ์๋ฌด๋ ์ ์ฝ๋๋ฐ tick ๋ง๋ค ํต์งธ๋ก ๋ ์ ์์ ๋ญ๋น โ ์ ํธ๋ง ๋ณด๋ธ๋ค.)\n pubsub.publish('twin-state', {\n twinState: { instanceId: inst.id, kind: 'delta', revision: inst.revision ?? 0 }\n })\n }\n if (!anyLive && this.broadcastTimer) { clearInterval(this.broadcastTimer); this.broadcastTimer = undefined } // live ์์ผ๋ฉด tick ์ ์ง\n }\n\n /**\n * ์ ๋ ํ ํ ์ค โ **๊ธฐ๋ก ๊ฒฝ๋ก๊ฐ ๋์ด๋ผ(๋ผ์ด๋ธ ๋ฒํฌยท์ฌ ๋จ๊ฑด) ํ ๋ชจ์์ ๋ฐ๋์ ํ ๊ณณ์์ ๋ง๋ ๋ค.**\n * ๋ ๊ณณ์ ๊ฐ์ ์ ์ผ๋ฉด ์น๊ฒฉ ๊ฒ์ ํค๊ฐ ํ์ชฝ์๋ง ์ฑ์์ง๊ณ , ๋ฐ์ฏค ๋น ์์ธ์ \"์ ๋์๋ ์๋๋ฐ\n * ๊ฒ์์ผ๋ก๋ ์ ๋์ค๋ ์ด๋ฒคํธ\" ๋ฅผ ๋ง๋ ๋ค โ ์ ๋์์ ๊ฐ์ฅ ๋์ ์ข
๋ฅ์ ๊ฒฐํจ์ด๋ค.\n */\n private static journalRow(repo: any, domainId: string, instanceId: string, e: any, revision: number) {\n return repo.create({\n domain: { id: domainId } as any,\n instanceId,\n tenantId: e?.tenantId,\n eventType: e?.eventType,\n revision,\n eventTime: e?.eventTime,\n ...twinEventKeys(e),\n payload: e\n })\n }\n\n /** live ์ ๋ ๋ฐฐ์น ๊ธฐ๋ก โ ๋ชจ์๋ CanonicalEnvelope ๋ค์ startRevision+1.. ์ ๋ถ์ฌํด ๋ฒํฌ ์ ์ฅ(coalescer tick ๋น 1ํ). */\n static async persistBatch(domainId: string, instanceId: string, envelopes: any[], startRevision: number): Promise<void> {\n const repo = getRepository(TwinEvent)\n const rows = envelopes.map((e, i) => this.journalRow(repo, domainId, instanceId, e, startRevision + i + 1))\n await repo.save(rows, { chunk: 500 })\n }\n\n /** ๋ ์ง์คํธ๋ฆฌ upsert(๋๋ฉ์ธ+instanceId ์ ๋ํฌ). status ์ธ์๋ก provision(stopped)/start(running) ๊ณต์ฉ. */\n static async register(\n domainId: string,\n instanceId: string,\n kind: string,\n board: BoardDef,\n status: 'running' | 'stopped' = 'running',\n realityMode?: RealityMode\n ): Promise<void> {\n const repo = getRepository(TwinInstance)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n await repo.save(\n repo.create({\n ...(existing ?? {}),\n domain: { id: domainId } as any,\n instanceId,\n kind,\n board,\n // ์ธ์คํด์คโ๊ณต๊ฐ 1๊ธ ๋งํฌ(space #3) โ board.spaceId/areaId ๋ฅผ ์ปฌ๋ผ์ผ๋ก ์น๊ฒฉ(dual-write). board JSON ๋ ์ ์ง(์ปค๋ยท๋ณต๊ตฌ์ฉ).\n spaceId: (board as any)?.spaceId ?? existing?.spaceId,\n areaId: (board as any)?.areaId ?? existing?.areaId,\n // ํ์ค ์ถ์ฒ ์ ์ธ(ยง0 โ ) โ ๋ช
์๊ฐ ์ฐ์ , ์์ผ๋ฉด ๊ธฐ์กด๊ฐ ๋ณด์กด(์ฌํ๋ก๋น์ ์ด ์ ์ธ์ ์ง์ฐ์ง ์๊ฒ).\n realityMode: realityMode ?? existing?.realityMode ?? undefined,\n status\n })\n )\n }\n\n /**\n * ๋ผ์ด๋ธ ๊ตฌ์กฐ ๋ณ์ด(resource.add ๋ฑ)๋ฅผ ์ ์ฅ๋ board ์ ๋ฐ์ โ ๋ฐํ์ ์ปค๋์ ๋ฌด๋ฒ๋ฅผ registry board.movers ์ ๋๊ธฐ.\n * ์ด๊ฒ ์์ผ๋ฉด ๋ฐํ์์ ์ถ๊ฐ๋ผ๋(์ํยท์ ๋์ ๋ฐ์) ์ ์ฅ board ๋ ์๋ณธ์ด๋ผ ํ๋ก๋น์ ๋ ํธ์ง๊ธฐยท์ฌ๊ธฐ๋(loadBoard)์ด\n * ์ถ๊ฐ๋ถ์ ์๋๋ค. ๊ธฐ์กด board.movers ํญ๋ชฉ์ ๋ณด์กด(homeNode ์ ์ง)ํ๊ณ ์ id ๋ง append(์ถ๊ฐ ์์ location=homeNode).\n * ์ขํ(layout)๋ง ๋ค๋ฃจ๋ register ์ ๋ฌ๋ฆฌ movers ์งํฉ์ ๊ฐฑ์ ํ๋, ์ฌํ๋ก๋น์ (purge)์ด ์๋๋ผ in-place ๊ฐฑ์ ์ด๋ผ\n * ์ ๋์ ๋ณด์กด๋๋ค(์ถ๊ฐ๋ ์ด๋ฏธ equipment ๋ธํ๋ก ์ ๋๋จ โ replay ๋ id-keyed upsert ๋ผ ์ด์ค๊ณ์ฐ ์์).\n */\n static async syncBoardMovers(domainId: string, instanceId: string): Promise<void> {\n const inst = this.instances[instanceId]\n const snap = inst?.kernel?.getSnapshot?.()\n if (!snap?.movers) return\n const repo = getRepository(TwinInstance)\n const reg = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) return\n const board = reg.board as BoardDef\n const known = new Set((board.movers ?? []).map(m => m.id))\n const added = snap.movers\n .filter((m: any) => !known.has(m.id))\n .map((m: any) => ({ id: m.id, kind: m.kind, homeNode: m.location }))\n if (!added.length) return\n board.movers = [...(board.movers ?? []), ...added]\n reg.board = board\n await repo.save(reg)\n }\n\n /**\n * ํ๋ก๋น์ ๋ โ ๋ ์ง์คํธ๋ฆฌ์ ๊ตฌ์กฐ(board)๋ฅผ ๋ฑ๋ก๋ง ํ๊ณ ๊ธฐ๋ํ์ง ์์(status='stopped').\n * ์ฌํ๋ก๋น์ ์ ๊ตฌ์กฐ ์๊ทธ๋์ฒ๊ฐ ๋ฐ๋๋ฉด(๋
ธ๋ยท๋ฌด๋ฒ ์งํฉ/์์ฑ ๋ณ๊ฒฝ) ๊ธฐ์กด ์ ๋์ purge ํ๋ค(ADR-0015):\n * board ๋ replay ์ ๋ง์คํฐ๋ผ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด ๊ณผ๊ฑฐ ์ด๋ฒคํธ์ ์ ์ ๊ฐ ๊นจ์ง๋ค. ์ขํ(layout)๋ง ๋ฐ๋๋ฉด ์ ๋ ๋ณด์กด.\n */\n static async provision(domainId: string, instanceId: string, kind: string, board: BoardDef): Promise<void> {\n if (this.instances[instanceId]) throw new Error(`instance \"${instanceId}\" is running โ stop before re-provisioning`)\n const repo = getRepository(TwinInstance)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n\n if (existing?.board && this.structureSignature(existing.board as BoardDef) !== this.structureSignature(board)) {\n await getRepository(TwinEvent).delete({ domain: { id: domainId } as any, instanceId })\n delete this.recovered[instanceId]\n }\n await this.register(domainId, instanceId, kind, board, existing?.status === 'running' ? 'stopped' : (existing?.status as any) ?? 'stopped')\n }\n\n /** ๊ตฌ์กฐ ๋์ผ์ฑ ์ง๋ฌธ โ ์ขํ(layout) ๋ฑ ๋ทฐ ๊ด์ฌ์ฌ๋ ์ ์ธํ๊ณ ์ปค๋์ด ๋ณด๋ ์์ยท์ฉ๋ยท๋ฌด๋ฒ๋ง. */\n private static structureSignature(board: BoardDef): string {\n const nodes = [...(board.nodes ?? [])]\n .map(n => `${n.id}:${n.type}:${n.capacity}`)\n .sort()\n .join('|')\n const movers = [...(board.movers ?? [])]\n .map(m => `${m.id}:${m.kind}:${m.homeNode}`)\n .sort()\n .join('|')\n return `N[${nodes}]M[${movers}]`\n }\n\n /** ๋ ์ง์คํธ๋ฆฌ board ๋ก ๊ธฐ๋(ํ๋ก๋น์ ๋ ์ธ์คํด์ค start). board ์ธ์ ์์ด ์ ์ฅ๋ ๊ตฌ์กฐ๋ก ์ฌ๊ธฐ๋. */\n static async startFromRegistry(domainId: string, instanceId: string, realityMode?: RealityMode): Promise<InstanceRuntime> {\n if (this.instances[instanceId]) return this.instances[instanceId]\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) throw new Error(`instance \"${instanceId}\" not provisioned (no board)`)\n\n /*\n * ์์คํํธ ์ฌ๋ฃ๋ฅผ **์ฌ๊ธฐ์ ํ์คํ ํ๋ณดํ๋ค.**\n * `start()` ๋ ๋๊ธฐ๋ผ ์ค์ค๋ก ์บ์๋ฅผ ์ฝ์ ์ ์์ด์ `recovered` ์ ๋ฏธ๋ฆฌ ๋ด๊ฒจ ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๋๋ฐ,\n * ๊ทธ๊ฑด `bootstrap()` ์ด ๋จผ์ ๋์์ ๋๋ง ์ฐธ์ด๋ค. ๋ถํ
์์์ ๊ธฐ๋๋ฉด ์ด๋ค ๋ ์ ์ฌ๊ณ ๊ฐ ์ด์๋๊ณ \n * ์ด๋ค ๋ ์ ์กฐ์ฉํ ๋น ์ฑ๋ก ๋ฌ๋ค โ ์ฌํ๋์ง ์๋ ๊ฒฐํจ์ด ๊ฐ์ฅ ๋์๋ค.\n * ์ฒดํฌํฌ์ธํธ ์บ์ ์ฐ์ (O(1) + ๋ผ์ด๋ธ ํ์์ํ ๋ณด์กด), ์์ผ๋ฉด ์ ๋ replay ํด๋ฐฑ(๋ถํ
๊ณผ ๊ฐ์ ์์).\n */\n if (!this.recovered[instanceId] && reg.purpose !== 'bench') {\n const cached = await this.loadSnapshot(domainId, instanceId).catch(() => null)\n if (cached?.state) {\n this.recovered[instanceId] = { revision: cached.revision, state: cached.state }\n } else {\n const state = await this.recover(domainId, instanceId).catch(() => null)\n if (state) this.recovered[instanceId] = { revision: state.revision, state }\n }\n }\n\n return this.start(\n instanceId,\n domainId,\n reg.kind ?? 'wms',\n reg.board as BoardDef,\n realityMode ?? (reg.realityMode as RealityMode) ?? undefined,\n reg.purpose ?? undefined\n )\n }\n\n /**\n * ์ ์ธ ๊ธฐ๋ฐ ๋ถํ
(ยง0 ํ๋ ์ โ โ ๋ถํ
๊ฑฐ๋ ๋งคํ) โ ํธ์์ด ์ ์ธํ realityMode ์ ๋ฐ๋ผ ์ฌ๊ธฐ๋ ๋ฐฉ์์ ๊ฐ๋ฅธ๋ค.\n * ๋ถํ
๊ฒฝ๋ก๋ฅผ ํ ๊ณณ์ ๋ชจ์ \"๋ฐํ์ โ ํ์ค\" ๋ฒ์ฃผ์ค๋ฅ๋ฅผ ์ฝ๋๋ก ๊ฐ์ ํ๋ค.\n * - 'mirror' : ํ์ค=์ธ๋ถ ์ค๋ฌผ โ startLive(์ฌ๋๊ธฐ). ์ด๋ฒคํธ๋ ์ด๋ํฐ ingest ๋ก ์ ์
, ์ปค๋ tick ์์.\n * - 'sim-world' : ์์ฑ ํ์๋ผ์ธ ์ง์ โ ์ ๋ ๋ณด์กด + resume(ํ์ค ์ด์ด๊ฐ).\n * โ GATE(ยง8 โกโข): ์ปค๋ ์ํ ์ง๋ ฌํ/์ฌ๊ฐ๊ฐ ์์ง ์์ด ์ง์ง resume ๋ถ๊ฐ โ ์ค ํ์ยท์ค๋ถํ ์ ๊ตฌํ.\n * ๊ทธ๋๊น์ง๋ ์ ๋์ ๋ณด์กดํ๋ revision ์ถฉ๋์ ํผํ๋ ค fresh ๋ก ๊ธฐ๋ํ๊ณ , ์ ์ธ๊ณผ ๊ตฌํ์ ๊ฐ๊ทน์ ํฌ๊ฒ ๊ฒฝ๊ณ ํ๋ค.\n * - 'sim-experiment' : seed ์ฌํ โ resetJournal + fresh ๊ธฐ๋(๋ฐฑ์ง ์์์ด ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์ ์ธ๋ ๊ฑฐ๋).\n * ๋ฐํ: ๊ธฐ๋๋ InstanceRuntime.\n */\n static async bootDeclared(domainId: string, instanceId: string, mode: RealityMode = DEFAULT_REALITY_MODE): Promise<InstanceRuntime> {\n if (mode === 'mirror') {\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) throw new Error(`instance \"${instanceId}\" not provisioned (no board)`)\n return this.startLive(instanceId, domainId, reg.kind ?? 'wms', reg.board as BoardDef)\n }\n if (mode === 'sim-world') {\n // ์ ์ธ์ world(์ง์)์ง๋ง resume ๊ธฐ๊ณ์ฅ์น(์ปค๋ ์ํ ๋ณต์)๊ฐ ์์ง ์๋ค โ ์ ์งํ๊ฒ ํฐ ๊ฒฝ๊ณ ํ fresh ๊ธฐ๋.\n console.warn(\n `[twin-engine] \"${instanceId}\" declared sim-world but resume is not yet implemented (runtime-state-model ยง8 gate โกโข) โ booting FRESH (journal reset). Persisted continuity will attach here once kernel-state resume lands.`\n )\n await this.resetJournal(domainId, instanceId)\n return this.startFromRegistry(domainId, instanceId, 'sim-world')\n }\n // sim-experiment(๊ธฐ๋ณธ): seed ์ฌํ โ ์ ๋ ์ด๊ธฐํ ํ revision 0 ๋ถํฐ ์ฌ์คํ.\n await this.resetJournal(domainId, instanceId)\n return this.startFromRegistry(domainId, instanceId, 'sim-experiment')\n }\n\n /**\n * ์ ๋ ์ด๊ธฐํ โ ์ธ์คํด์ค ์ด๋ฒคํธ ์ ๋ purge(๋ ์ง์คํธ๋ฆฌยท์ํ๋ ์ ์ง).\n * ๋ฐ๋ชจ fresh-start ์ฉ: ๋งค ๋ถํ
seed ๋ถํฐ ์๋ก ์คํํ๋ ๋ฐ๋ชจ์์, ๋ณต๊ตฌ๋ณธ ํ๊ธฐ ํ revision 0 ๋ถํฐ ์ฌ์คํํ๋ฉด\n * ์ ๋ฐ๊ณผ revision ์ด ๊ฒน์ณ ์ ๋์ด ์ค์ผ๋๋ค โ start ์ ์ ํธ์ถํด ํ์ฌ ๋ฐ๋ง ๋จ๊ธด๋ค.\n */\n static async resetJournal(domainId: string, instanceId: string): Promise<void> {\n await getRepository(TwinEvent).delete({ domain: { id: domainId } as any, instanceId })\n delete this.recovered[instanceId]\n }\n\n /** ์ญ์ โ ์ ์ง + ๋ ์ง์คํธ๋ฆฌ ์ญ์ + ์ ๋ purge(domain ์ค์ฝํ). */\n static async remove(domainId: string, instanceId: string): Promise<void> {\n await this.stop(instanceId)\n delete this.recovered[instanceId]\n await getRepository(TwinEvent).delete({ domain: { id: domainId } as any, instanceId })\n await getRepository(TwinInstance).delete({ domain: { id: domainId } as any, instanceId })\n }\n\n /** ๊ด๋ฆฌ ๋ชฉ๋ก โ domain ์ ๋ฑ๋ก ์ธ์คํด์ค ์ ์ฒด(๋ผ์ด๋ธ ์ฌ๋ถยท์ต์ ์ ๋ revisionยท๋
ธ๋/๋ฌด๋ฒ ์ ํฌํจ). */\n static async list(domainId: string): Promise<any[]> {\n const rows = await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })\n const out: any[] = []\n for (const r of rows) {\n const board = (r.board as BoardDef) ?? { nodes: [], movers: [] }\n const last = await getRepository(TwinEvent).findOne({\n where: { domain: { id: domainId } as any, instanceId: r.instanceId },\n order: { revision: 'DESC' }\n })\n out.push({\n instanceId: r.instanceId,\n kind: r.kind,\n status: r.status,\n spaceId: r.spaceId, // co-location: ๊ฐ์ spaceId ์ธ์คํด์ค๋ค์ด ํ ๊ณต๊ฐ(๊ณต์ฅ) ๊ณต์ โ ๊ณต๊ฐ๋ทฐ ์ง์ฝ ํค(G7)\n realityMode: r.realityMode ?? DEFAULT_REALITY_MODE, // ํ์ค ์ถ์ฒ ์ ์ธ(ยง0 โ ) โ mirror/sim-world/sim-experiment\n purpose: r.purpose ?? 'operational', // ์ด์ vs ๋ฒค์น ์ฌ๋ณธ(1๊ธ ๊ตฌ๋ณ โ ์ด๋ฆ ์ ๋์ฌ ์๋)\n copyOf: r.copyOf ?? undefined,\n running: !!this.instances[r.instanceId],\n revision: last?.revision ?? 0,\n nodeCount: board.nodes?.length ?? 0,\n moverCount: board.movers?.length ?? 0\n })\n }\n return out\n }\n\n /** ๋ ๊ฑฐ์ ๋ฒค์น ์์ฌ ๊ฐ๋ โ purpose ๋์
์ ๋ง๋ค์ด์ง ๋ฒค์น/๋ถํ ๊ณต๊ฐ(์ด๋ฆ ๊ท์ฝ)๊น์ง ๊ฑธ๋ฌ๋ธ๋ค. */\n static isBenchSpace(spaceId?: string): boolean {\n return !!spaceId && (/^bench-/.test(spaceId) || spaceId === 'rosarito-load' || /^loadtest/.test(spaceId))\n }\n\n /** ์ด์ ๊ณต๊ฐ ๋ชฉ๋ก(๋ฒค์น ์์ค ์ ํ๊ธฐ) โ ์ด๋ฆยท๊ท๋ชจ ํฌํจ, ๋ฒค์น ์ฌ๋ณธยท์์ฌ ์ ์ธ. */\n static async listSpaces(domainId: string): Promise<{ spaceId: string; name: string; instances: number; nodes: number; movers: number }[]> {\n const nameOf = new Map((await getRepository(TwinSpace).find({ where: { domain: { id: domainId } } })).map(s => [s.spaceId, s.name]))\n const insts = await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })\n const agg = new Map<string, { spaceId: string; name: string; instances: number; nodes: number; movers: number }>()\n for (const r of insts) {\n if (!r.spaceId || r.purpose === 'bench' || this.isBenchSpace(r.spaceId)) continue // ๋ฒค์นยท์์ฌ ์ ์ธ\n const board: any = r.board ?? {}\n const a = agg.get(r.spaceId) ?? { spaceId: r.spaceId, name: nameOf.get(r.spaceId) ?? r.spaceId, instances: 0, nodes: 0, movers: 0 }\n a.instances++\n a.nodes += board.nodes?.length ?? 0\n a.movers += board.movers?.length ?? 0\n agg.set(r.spaceId, a)\n }\n return [...agg.values()]\n }\n\n /** ์ธ์คํด์ค ๋ชฉ์ ํ์(์ด์/๋ฒค์น) ์ค์ โ ๋ฒค์น ์ฌ๋ณธ์ 1๊ธ ์์ฑ์ผ๋ก ๊ตฌ๋ณ(์ด๋ฆ ์ ๋์ฌ ์๋). */\n static async setPurpose(domainId: string, instanceId: string, purpose: 'operational' | 'bench', copyOf?: string): Promise<void> {\n await getRepository(TwinInstance).update({ domain: { id: domainId } as any, instanceId }, { purpose, copyOf: copyOf ?? null } as any)\n }\n\n /**\n * ๊ณต๊ฐ ๊ตฌ์กฐ ํ๋
โ ์์ ๋ณต์ (๋ฒค์น ์ฌ๋ณธ)์ ์์ค. ์ ์ฅ๋ฌผ์ด board(์์)ยทTwinSpace.content(์น์ยทgeoยทํํ)ยทTwinArea(์์ญ)๋ก\n * ๋ถ์ฐ๋ผ ์์ผ๋ฏ๋ก ์
์ ๋ชจ์ ๋๋ ค์ค๋ค. ํธ์ถ์ธก์ด ReferenceMaster ๋ก ์ฌ๊ตฌ์ฑ โ ์ฌ์๋ณ โ ingestMaster.\n */\n static async spaceStructure(domainId: string, spaceId: string): Promise<{ name?: string; content: any; areas: any[]; instances: { instanceId: string; kind?: string; board: any }[] } | null> {\n const sp = await getRepository(TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId } })\n const areas = sp\n ? (await getRepository(TwinArea).find({ where: { domain: { id: domainId } as any, space: { id: sp.id } as any } })).map(a => ({ id: a.areaId, type: a.type, name: a.name, parentId: a.parentId, layout: a.layout }))\n : []\n const insts = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n if (!insts.length) return null\n return { name: sp?.name, content: sp?.content ?? {}, areas, instances: insts.map(i => ({ instanceId: i.instanceId, kind: i.kind, board: i.board })) }\n }\n\n /** ๊ณต๊ฐ(+ํํยท์์ญ) ์ญ์ โ ๋ฒค์น ์ ๋ฆฌ ๋ฑ. ํธ์ถ์ธก์ด ๋ฐ์ธ๋ฉ ์ธ์คํด์ค๋ฅผ ๋จผ์ ์ ๊ฑฐํ๋ ์ ์ (๊ฐ๋ ์์). deleteTwinSpace ๋ฆฌ์กธ๋ฒ์ ๋ํ. */\n static async deleteSpace(domainId: string, spaceId: string): Promise<void> {\n const space = await getRepository(TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId } })\n if (space) {\n const reps = await getRepository(TwinSpaceRepresentation).find({ where: { domain: { id: domainId }, space: { id: space.id } } })\n for (const rep of reps) await getRepository(TwinSpaceArea).delete({ domain: { id: domainId } as any, representation: { id: rep.id } as any })\n await getRepository(TwinSpaceRepresentation).delete({ domain: { id: domainId } as any, space: { id: space.id } as any })\n await getRepository(TwinArea).delete({ domain: { id: domainId } as any, space: { id: space.id } as any })\n }\n await getRepository(TwinSpace).delete({ domain: { id: domainId } as any, spaceId })\n }\n\n /**\n * Face2 ๋ง์คํฐ ์ธ์ ์คํธ(ADR-0018) โ ๋ ํผ๋ฐ์ค ์์คํ
(์ค ๋๋ ๊ฐ์)์ ๋ง์คํฐ๋ฅผ ์ฝ์ด ํธ์์ ์์ฑ.\n * ์ํฐํฐ๋ฅผ ์๋ฐฐ์ /๋ฐ๋ช
ํ์ง ์๊ณ ๋ง์คํฐ์์ ๋ฐ์: ๊ณต๊ฐ(Space) upsert + ์ธ์คํด์ค provision(๋ฏธ๊ธฐ๋).\n * ๋
ธ๋ํ์
์ ์ปค๋ ์นดํ๋ก๊ทธ๋ก ๊ฒ์ฆ(warning). start ๋ ํธ์ถ์ธก(bootstrap/mutation)์ด ๊ฒฐ์ .\n */\n static async ingestMaster(domainId: string, master: ReferenceMaster): Promise<{ instanceId: string; spaceId: string; warnings: string[] }> {\n const { board, spaceContent, warnings } = masterToTwin(master, DOMAIN_CATALOG)\n const spaceId: string = board.spaceId\n const repo = getRepository(TwinSpace)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, spaceId } })\n /*\n * ๊ณต์ ๊ณต๊ฐ(์ฌ๋ฌ ํธ์์ด ํ spaceId, N:1) content ๋ณํฉ โ ๋ง์ง๋ง ์ธ์ ์คํธ๊ฐ ํต์งธ๋ก ๋ฎ์ด์จ area(๊ทธ๋ฃน)ยทํํ์ด\n * ์ ์ค๋๋ ๋ฌธ์ ๋ณด์ . areaยทlandmark ๋ id ํฉ์งํฉ, representations ๋ ๋น์ด์์ง ์์ ์ชฝ ๋ณด์กด, ๋๋จธ์ง๋ first-wins.\n */\n const prev: any = existing?.content ?? {}\n const cur: any = spaceContent\n const unionById = (a: any[] = [], b: any[] = []) => {\n const m = new Map<string, any>()\n for (const x of [...a, ...b]) if (x?.id) m.set(x.id, x)\n return [...m.values()]\n }\n const mergedContent = {\n width: prev.width ?? cur.width,\n depth: prev.depth ?? cur.depth,\n unit: prev.unit ?? cur.unit,\n geo: prev.geo ?? cur.geo,\n primaryId: prev.primaryId ?? cur.primaryId,\n representations: (cur.representations?.length ? cur.representations : prev.representations) ?? [],\n // areas ๋ content ์ ๋ ์ด์ ์ฐ์ง ์๋๋ค(area ๋จ์ผํ P3) โ ๊ถ์=TwinArea. ์๋ TwinArea ๋ก๋ง ๊ธฐ๋ก.\n landmarks: unionById(prev.landmarks, cur.landmarks)\n }\n const savedSpace = await repo.save(repo.create({ ...(existing ?? {}), domain: { id: domainId } as any, spaceId, name: existing?.name || master.siteName, content: mergedContent }))\n /*\n * ํํ์ twin_space_representations ํ
์ด๋ธ์ ์ ์ฅํ๋ค โ ๋ทฐ(twin-map-page ๋ฑ)๋ content ๊ฐ ์๋๋ผ ํ
์ด๋ธ ํํ์ ์์ฑํ๋ฏ๋ก,\n * ์ ์ฅํ์ง ์์ผ๋ฉด ์ธ์ ์คํธ ์ฌ์ดํธ์ \"๋ํ ํํ\" ์ด ์์ด ์ง๋๋ก ์์ํ์ง ๋ชปํ๋ค. rep.areas ๊ฐ ์์ผ๋ฉด TwinSpaceArea ๋ ํจ๊ป ์ ์ฅ.\n * ์ต์ด ์ธ์ ์คํธ๋ง(๊ธฐ์กด ํํ ์์ผ๋ฉด ์ฌ์ฉ์ ํธ์ง ๋ณด์กด).\n */\n const repRepo = getRepository(TwinSpaceRepresentation)\n const areaRepo = getRepository(TwinSpaceArea)\n if ((await repRepo.count({ where: { space: { id: savedSpace.id } } })) === 0) {\n const reps: any[] = (spaceContent as any).representations ?? []\n for (let i = 0; i < reps.length; i++) {\n const rep = reps[i]\n const config =\n rep.type === 'map' ? { center: rep.center, zoom: rep.zoom }\n : rep.type === 'board' ? { boardId: rep.boardId }\n : rep.type === 'image' ? { imageUrl: rep.imageUrl, width: rep.width, height: rep.height }\n : {}\n const savedRep = await repRepo.save(repRepo.create({ domain: { id: domainId } as any, space: { id: savedSpace.id } as any, type: rep.type, name: rep.name, seq: i, isPrimary: !!rep.primary || rep.id === (spaceContent as any).primaryId, config }))\n for (const area of (rep.areas ?? []) as any[]) {\n await areaRepo.save(areaRepo.create({ domain: { id: domainId } as any, representation: { id: savedRep.id } as any, name: area.name, type: area.type, geometry: area.geometry, drillTo: area.drillTo ?? null, binding: area.binding ?? null, style: area.style ?? null }))\n }\n }\n }\n /*\n * area ๋จ์ผํ(space #2, P1) โ ๋
ผ๋ฆฌ ๊ตฌ์ญ์ TwinArea(์ ๊ทยทํํ๋ฌด๊ดยท๊ณต์ )์ dual-write(upsert by areaId).\n * P3: content.areas ์ ์ฅ ํ๊ธฐ โ TwinArea ๊ฐ ์ ์ผ ๊ถ์. ์์ค = masterToTwin ์ฐ์ถ spaceContent.areas(cur).\n * (์์ฒ diff ์ ๊ฑฐ[master ์์ ๋น ์ง area ์ญ์ ]๋ ์ฌ์ฉ์์ ์ area ๋ณดํธ ์ํด per-area provenance ํ์ โ ํ์.)\n */\n const twinAreaRepo = getRepository(TwinArea)\n for (const a of ((spaceContent as any).areas ?? []) as any[]) {\n if (!a?.id) continue\n const existingArea = await twinAreaRepo.findOne({ where: { domain: { id: domainId }, space: { id: savedSpace.id }, areaId: a.id } })\n await twinAreaRepo.save(\n twinAreaRepo.create({\n ...(existingArea ?? {}),\n domain: { id: domainId } as any,\n space: { id: savedSpace.id } as any,\n areaId: a.id,\n name: a.name ?? a.id,\n type: a.type,\n parentId: a.parentId ?? null,\n layout: a.x != null || a.w != null ? { x: a.x, y: a.y, w: a.w, h: a.h } : null\n })\n )\n }\n\n await this.provision(domainId, master.source, master.system, board)\n if (warnings.length) console.warn(`[twin-engine] ingest \"${master.source}\" warnings:`, warnings)\n return { instanceId: master.source, spaceId, warnings }\n }\n\n /** ๋จ๊ฑด ์์ธ โ ํ๋ก๋น์ ๋ ์๋ํฐ๊ฐ ํธ์งํ board(๊ตฌ์กฐ+layout) ํฌํจ. */\n static async detail(domainId: string, instanceId: string): Promise<any | null> {\n const r = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!r) return null\n return {\n instanceId: r.instanceId,\n kind: r.kind,\n status: r.status,\n running: !!this.instances[r.instanceId],\n realityMode: r.realityMode, // ํ์ค ์ ์ธ โ what-if ์ ์ฉ ๊ฐ๋์ฉ(mirror=์์ธก ์ ์ฉ, ์๊ทน ์ฃผ์
๋ถ๊ฐ)\n board: r.board\n }\n }\n\n /**\n * ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ ๋ธ๋ฆฌ์ง(P3, ADR-0018) โ ํธ์ ์ํฐํฐ ์ํ๋ฅผ `data(tag=์ํฐํฐid)` ์ฑ๋๋ก publish.\n * ๋ณด๋ ์ปดํฌ๋ํธ๊ฐ tag ๋ก ๊ตฌ๋
(board-ui provider)ํด `component.data` ๋ก ๋ผ์ด๋ธ ๊ฐฑ์ . delta ์์๋ง(ํฌ์).\n * tag=์ํฐํฐ id(๋ฐ๋ชจ=๋จ์ผ ์ธ์คํด์ค). ๋ฉํฐ ์ธ์คํด์ค/๋ณด๋ ์ฌ์ฌ์ฉ ์ tag ๋ค์์คํ์ด์ค๋ ํ์.\n */\n static publishEntityData(inst: InstanceRuntime): void {\n const domain = inst.domain\n if (!domain) return\n /* ์ํ ์ถ์ฒ ์ค์ โ sim: ์ปค๋ runtime, live: projector ๋ฏธ๋ฌ(+OEE ๊ณ์ฐ ์ธต ๋ณด๊ฐ). ๊ณ์ฝยทpayload ๋์ผ, ๋๋ผ์ด๋ฒ๋ง ๋ค๋ฆ. */\n const st: any =\n inst.mode === 'live'\n ? inst.oee\n ? withLiveOee(inst.projector?.snapshot?.(), inst.oee) // ๊ด์ธก ๋ฏธ๋ฌ + ๊ณ์ฐ(OEE) โ mover payload ์ oee ํฌํจ(sim ๋ํ)\n : inst.projector?.snapshot?.()\n : inst.runtime?.resync?.()?.state\n if (!st) return\n /*\n * ๋ณํํ ์ํฐํฐ๋ง ๋ฐํ โ ์ด์ ์ delta ๋ง๋ค ์ ์ํฐํฐ(๋
ธ๋+๋ฌด๋ฒ+์ค๋)๋ฅผ ๊ฐ ๋ณํ์ ๋ฌด๊ดํ๊ฒ ์ ๋ ์ฌ๋ฐํํด\n * ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋งค์ด ๋ฐ๋ณต push ํ๊ณ ์์๋ค(์ค์ฉ). ์ต์ -์ํ ์ฑ๋์ด๋ฏ๋ก ๋ฌด๋ณํ ์ฌ๋ฐฉ์ก์ ๋ฌด์๋ฏธํ๋ค.\n * ์ํฐํฐ๋ณ ์๊ทธ๋์ฒ๋ฅผ ๋น๊ตํด ๋ฐ๋ ๊ฒ๋ง push.\n */\n const sigs = inst.entitySigs ?? (inst.entitySigs = new Map())\n const seen = new Set<string>()\n /* payload ๋งคํ์ ์์ ํจ์(buildEntityDeltas)๋ก ๋ถ๋ฆฌ โ ์ฌ๊ธฐ์ ์๊ทธ๋์ฒ dedup + ๋ฐํ๋ง.\n * ๋ณํํ ์ํฐํฐ๋ง ๋ฐํ(์ต์ -์ํ ์ฑ๋์ด๋ผ ๋ฌด๋ณํ ์ฌ๋ฐฉ์ก ๋ฌด์๋ฏธ). */\n for (const { tag, data } of buildEntityDeltas(st)) {\n seen.add(tag)\n const sig = JSON.stringify(data)\n if (sigs.get(tag) === sig) continue // ๋ฌด๋ณํ โ ๋ฐํ ์๋ต\n sigs.set(tag, sig)\n pubsub.publish('data', { data: { domain, tag, data } })\n }\n /* ์ฌ๋ผ์ง ์ํฐํฐ์ ์๊ทธ๋์ฒ ์ ๋ฆฌ(๋งต ๋ฌดํ ์ฑ์ฅ ๋ฐฉ์ง). */\n if (sigs.size > seen.size) for (const tag of sigs.keys()) if (!seen.has(tag)) sigs.delete(tag)\n }\n\n static async persist(domainId: string, instanceId: string, msg: any): Promise<void> {\n const repo = getRepository(TwinEvent)\n await repo.save(this.journalRow(repo, domainId, instanceId, msg.event, msg.revision))\n }\n\n /**\n * ์ฌ๋ถํ
๋ณต๊ตฌ / ์๊ฐ์ฌํ โ DB ์ ๋์ replay ํด ์ํ ์ฌ๊ตฌ์ฑ.\n * board ๋ ๋ ์ง์คํธ๋ฆฌ(TwinInstance)์์, ์ด๋ฒคํธ๋ TwinEvent(revision ASC)์์.\n * ์ปค์ ๋ ์ถ(runtime-state-model ยง4): **์๊ฐ(untilTime, ์ฌ์ฉ์ ๋ชจ๊ตญ์ดยท๊ณต๊ฐ ๊ณตํต์ถ)** ์ฐ์ , ์์ผ๋ฉด ๋ฆฌ๋น์ (untilRevision, ๋ ์ฆ ๋ด๋ถ).\n * - untilTime ์ฃผ๋ฉด `eventTime โค T` ์ธ ์ด๋ฒคํธ๋ง(๊ทธ ์์ watermark) โ ๊ณต๋๋ฐฐ์น ์ฌ๋ฌ ํธ์์ ํ๋์ ์๊ฐ T๋ก ํต์ผ ํด์.\n * - ๋ ๋ค ์์ผ๋ฉด ์ต์ (๋ผ์ด๋ธ ์ธ๋ฉ๋ชจ๋ฆฌ ์ง์ค).\n * ์ด๋ฒคํธ๋ ํญ์ revision ASC(์ธ๊ณผ ์์)๋ก ์ ์ฉ โ ์๊ฐ ํํฐ๋ ์ปท์คํ ์งํฉ๋ง ์ ํ๋ค.\n */\n static async recover(domainId: string, instanceId: string, untilRevision?: number, untilTime?: string): Promise<any> {\n // ๋ผ์ด๋ธ ์ต์ (์๊ฐ์ฌํ ์๋) + ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์คํด์ค โ ๋ผ์ด๋ธ ์ปค๋ ์ค๋
์ท์ ์ง์ ์ฌ์ฉ.\n // replay(StateProjector)๋ attentionsยทack ๋ฑ ๋ผ์ด๋ธ ์ ์ฉ ํ์ ์ํ๋ฅผ ๋ด์ง ๋ชปํ๋ฏ๋ก, ์ต์ ์ ์ปค๋ ์ง์ค์ ์ด๋ค.\n if (untilRevision == null && untilTime == null) {\n const live = this.instances[instanceId]\n if (live?.kernel?.getSnapshot) return live.kernel.getSnapshot()\n // live ๋ชจ๋๋ kernel ์ด ์๊ณ projector ๋ฏธ๋ฌ โ ์ธ๋ฉ๋ชจ๋ฆฌ ์ต์ ์ค๋
์ท(projector+OEE+attentions) ์ง์ ์ฌ์ฉ.\n // (์ ๋์ด ์์ด๋ ์ต์ ์ ์ธ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ง์ค โ replay ๋ ์๊ฐ์ฌํ/๋ณต๊ตฌ ์ ์ฉ.)\n if (live?.mode === 'live' && live.projector) return this.snapshot(instanceId)\n }\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) throw new Error(`twin instance \"${instanceId}\" not registered (no board to replay)`)\n\n const rows = await getRepository(TwinEvent).find({\n where: { domain: { id: domainId }, instanceId },\n order: { revision: 'ASC' }\n })\n const cutoffMs = untilTime != null ? Date.parse(untilTime) : NaN\n const events = rows\n .filter(r => {\n if (untilTime != null && !Number.isNaN(cutoffMs)) {\n const t = r.eventTime != null ? Date.parse(String(r.eventTime)) : NaN\n return Number.isNaN(t) ? true : t <= cutoffMs // eventTime ์๋ ๋ ๊ฑฐ์ ํ์ ํฌํจ(๋ณด์์ )\n }\n return untilRevision == null || (r.revision ?? 0) <= untilRevision\n })\n .map(r => r.payload)\n .filter(Boolean)\n\n return replay(reg.board as BoardDef, events)\n }\n\n /**\n * ๊ณต๊ฐ(๊ณต๋๋ฐฐ์น) ์๊ฐ ๋ฒ์ โ ์คํฌ๋ฌ๋ฒ ์ต์ปค(runtime-state-model ยง4ยทยง6). ๊ทธ ๊ณต๊ฐ ์ ์ธ์คํด์ค ์ ๋์ min/max eventTime.\n * ๋ฐํ {minTime, maxTime}(ISO) โ ์ด๋ฒคํธ/์๊ฐ ์์ผ๋ฉด null. ํด๋ผ ํ์คํ ๋ฆฌ ์คํฌ๋ฌ๋ฒ๊ฐ ์ด ๋ฒ์๋ฅผ ์๊ฐ์ถ์ผ๋ก ๊ทธ๋ฆฐ๋ค.\n */\n static async timeRange(domainId: string, spaceId: string): Promise<{ minTime: string | null; maxTime: string | null }> {\n const regs = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n const ids = regs.map(r => r.instanceId)\n if (!ids.length) return { minTime: null, maxTime: null }\n let min = Infinity\n let max = -Infinity\n for (const instanceId of ids) {\n const rows = await getRepository(TwinEvent).find({ where: { domain: { id: domainId }, instanceId } })\n for (const r of rows) {\n const t = r.eventTime != null ? Date.parse(String(r.eventTime)) : NaN\n if (Number.isNaN(t)) continue\n if (t < min) min = t\n if (t > max) max = t\n }\n }\n if (min === Infinity) return { minTime: null, maxTime: null }\n return { minTime: new Date(min).toISOString(), maxTime: new Date(max).toISOString() }\n }\n\n /** ์ ์ง ํ
โ ์ธ์คํด์ค ์ ์ง ์ ๋ถ์์์ ์ ๋ฆฌ(์: reference-live ํผ๋ unsubscribe). ์ํ ์ํฌํธ ์์ด ๊ฒฐ์ . */\n static stopHooks: ((id: string) => void)[] = []\n static onStop(fn: (id: string) => void): void {\n this.stopHooks.push(fn)\n }\n\n static async stop(id: string): Promise<void> {\n const i = this.instances[id]\n if (i) {\n clearInterval(i.timer)\n i.unsub()\n delete this.instances[id]\n await getRepository(TwinInstance)\n .update({ domain: { id: i.domainId }, instanceId: id }, { status: 'stopped' })\n .catch(err => console.error('twin deregister fail', err))\n }\n for (const hook of this.stopHooks) { try { hook(id) } catch { /* ํ
๊ฒฉ๋ฆฌ */ } }\n }\n\n static runtime(id: string): TwinRuntimeType | undefined {\n return this.instances[id]?.runtime\n }\n\n /**\n * ๋๋ฉ์ธ ์์ ๊ฒ์ดํธ โ ์ธ์คํด์ค๊ฐ ์ด ๋๋ฉ์ธ ์์ ์ผ ๋๋ง true(ํ
๋ํธ ๊ฒฉ๋ฆฌ).\n * ์๊ฑฐ๋ ๋ค๋ฅธ ๋๋ฉ์ธ์ด๋ฉด false. ๋
ธ์ถ ๋ฆฌ์กธ๋ฒ(per-id metrics/attentions/state/stop/forecast)๊ฐ\n * this.instances[id] ๋ฅผ ๋ง์ง๊ธฐ ์ ์ ๋ฐ๋์ ์ด๊ฑธ๋ก ํ์ธํด์ผ ํ๋ค. ์ธ์คํด์ค id ๋ ์ถ์ธก ๊ฐ๋ฅํ๋ฏ๋ก\n * ๊ฒ์ฆ ์์ด ์ ๊ทผํ๋ฉด ํฌ๋ก์คํ
๋ํธ ์ฝ๊ธฐ/์ ์ง๊ฐ ๊ฐ๋ฅํด์ง๋ค.\n */\n static owns(domainId: string, id: string): boolean {\n return this.instances[id]?.domainId === domainId\n }\n\n /** ๋ผ์ด๋ธ ์ปค๋(ForecastTwin) โ forecast/divergence ์์ธก ์ฐ์ฐ์ฉ. */\n static kernel(id: string): any {\n return this.instances[id]?.kernel\n }\n\n /** ๋ผ์ด๋ธ ์ฒ๋ฆฌ๋ ๊ณ์ธก ์ค๋
์ท(๋ชจ๋ํฐ, โฃ-1) โ ๋ด๋ถ ๋์ (_acc*) ์ ์ธํ ๊ณต๊ฐ ์งํ. live ์๋๋ฉด null. */\n static metrics(id: string): any {\n const m = this.instances[id]?.metrics\n if (!m) return null\n return {\n instanceId: id,\n ingestedTotal: m.ingestedTotal, broadcastTotal: m.broadcastTotal, journaledTotal: m.journaledTotal,\n ingestRate: m.ingestRate, broadcastRate: m.broadcastRate, journalRate: m.journalRate,\n backlog: m.backlog, broadcastCoalesceMs: this.BROADCAST_COALESCE_MS\n }\n }\n\n /** ์ ์ฒด ๋ผ์ด๋ธ ์ธ์คํด์ค ๊ณ์ธก(๋ชจ๋ํฐ ๋์๋ณด๋์ฉ). */\n static async allMetrics(domainId?: string): Promise<any[]> {\n const rows = Object.keys(this.instances)\n .filter(id => !domainId || this.instances[id].domainId === domainId)\n .map(id => this.metrics(id))\n .filter(Boolean)\n if (!rows.length || !domainId) return rows\n // ํ์ ์ด๋ฆ ๋ถ์ฌ โ ์คํ์ค ์นด๋๊ฐ id ๋ง ๋ณด์ด์ง ์๋๋ก ๊ณต๊ฐ๋ช
์ ์ค์ด์ค๋ค(๊ณต๊ฐ ์นด๋์ ๋์ผ). name=๊ณต๊ฐ๋ช
ํด๋ฐฑ spaceId ํด๋ฐฑ instanceId.\n const insts = await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })\n const spaceOf = new Map(insts.map(i => [i.instanceId, i.spaceId]))\n const nameOf = new Map((await getRepository(TwinSpace).find({ where: { domain: { id: domainId } } })).map(s => [s.spaceId, s.name]))\n for (const r of rows) {\n const sp = spaceOf.get(r.instanceId)\n r.spaceId = sp\n r.name = (sp && nameOf.get(sp)) || sp || r.instanceId\n }\n return rows\n }\n\n /**\n * ๋ผ์ด๋ธ ์์ธก์ฉ ์์ ์ปค๋(kernel-unification P1) โ ๋ผ์ด๋ธ๋ projector ๋ฏธ๋ฌ๋ผ ์ปค๋์ด ์์ด ์์ธก์ ๋ชป ํ๋ค.\n * ๊ด์ธก ์ค๋
์ท(์ฌ๊ณ ยท๋ฌด๋ฒยท๋
ธ๋) + ์ ๋์ ์ค๋ ์๊ฐยท๋ผ์ธ์ hydrate ํด ์์ธก ๊ฐ๋ฅํ ์์ ์ปค๋์ ๋ง๋ ๋ค.\n * ๋ผ์ด๋ธ ๋ฐํ์์ ๋ฌด๊ฐ์ญ(์ด ์ปค๋์ fork ๋์ ์์๋ณธ, instances ์ ๋ฃ์ง ์์). sim ์ธ์คํด์ค๋ฉด null(๊ทธ์ชฝ์ kernel() ์ฌ์ฉ).\n */\n static async buildForecastKernel(domainId: string, instanceId: string): Promise<any | null> {\n const inst = this.instances[instanceId]\n if (inst?.mode !== 'live' || !inst.projector) return null\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) return null\n const Kernel = KERNELS[reg.kind ?? 'wms'] ?? WmsKernel\n const k = new Kernel(domainId)\n k.loadBoard(reg.board as BoardDef)\n // ์ ๋์์ ์ค๋๋ณ ์ต์ ๊ด์ธก(์๊ฐ+๋ผ์ธ) ์์ง โ projector ์ค๋
์ท์ ์ค๋์ ์์ค์ (progress ๋ง)์ด๋ผ ์ ๋์ ์ด๋ค.\n const rows = await getRepository(TwinEvent).find({ where: { domain: { id: domainId }, instanceId, eventType: OP_EVENT.order }, order: { revision: 'ASC' } })\n const latest = new Map<string, any>()\n for (const r of rows) { const d = (r.payload as any)?.data; if (d?.orderId) latest.set(d.orderId, d) }\n k.hydrateObserved(this.snapshot(instanceId), [...latest.values()])\n return k\n }\n\n /**\n * ์์ธก์ฉ ์ปค๋์ **์์ ์๊ฐ T ๊ธฐ์ค**์ผ๋ก ์ฌ๊ตฌ์ฑ โ ๊ณผ๊ฑฐ-vantage ์์ธก(๋ฐฑํ
์คํธ)ยท\"๊ทธ๋ ์์ ๋ณธ ๋ฏธ๋\".\n * recover(untilTime)๋ก T ์์ ์ํ๋ฅผ, T ์ดํ ์ค๋ ๊ด์ธก์ ๋ชจ์ hydrate โ monteCarloForecast ๊ฐ T ์์ ์์ผ๋ก ๊ตด๋ฆฐ๋ค.\n * sim/live ๋ฌด๊ด(์ ๋ ๊ธฐ๋ฐ ์ฌ๊ตฌ์ฑ). untilTime ์๋ต ์ ์ต์ . ๋๋ฉ์ธ ์ค์ฝํ(regยทjournal ์กฐํ๊ฐ domainId).\n */\n static async buildForecastKernelAt(domainId: string, instanceId: string, untilTime?: string): Promise<any | null> {\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) return null\n const Kernel = KERNELS[reg.kind ?? 'wms'] ?? WmsKernel\n const k = new Kernel(domainId)\n k.loadBoard(reg.board as BoardDef)\n const state = await this.recover(domainId, instanceId, undefined, untilTime).catch(() => null)\n if (!state) return null\n const cutoff = untilTime != null ? Date.parse(untilTime) : Infinity\n const rows = await getRepository(TwinEvent).find({ where: { domain: { id: domainId }, instanceId, eventType: OP_EVENT.order }, order: { revision: 'ASC' } })\n const latest = new Map<string, any>()\n for (const r of rows) {\n if (Number.isFinite(cutoff) && Date.parse(r.eventTime) > cutoff) continue\n const d = (r.payload as any)?.data\n if (d?.orderId) latest.set(d.orderId, d)\n }\n k.hydrateObserved(state, [...latest.values()])\n return k\n }\n\n /** ํ์ฌ ์ ์ฒด ์ค๋
์ท โ ๋ผ์ด๋ธ ์ฐ์ , ์์ผ๋ฉด ์ ๋ ๋ณต๊ตฌ ์บ์. */\n static snapshot(id: string): any {\n const inst = this.instances[id]\n if (inst?.mode === 'live' && inst.projector) {\n // live: projector ๋ฏธ๋ฌ + ๊ณ์ฐ ์ธต(OEEยทattentions) ๋ณด๊ฐ โ ์ง์(attention ๋ฑ)๊ฐ sim ๋ํ ์ค๋
์ท์ ๋ด.\n const st = inst.oee ? withLiveOee(inst.projector.snapshot(), inst.oee) : inst.projector.snapshot()\n return withLiveAttentions(st)\n }\n return inst?.runtime?.resync() ?? this.recovered[id]\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"twin-engine.js","sourceRoot":"","sources":["../../server/engine/twin-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * TwinEngine โ operato-twin ์ปค๋ ์ธ์คํด์ค๋ฅผ things-factory ์์์ ํธ์คํ
.\n * integration-base ์ ScenarioEngine ํจํด ๋ฏธ๋ฌ: ๋ฉ๋ชจ๋ฆฌ ์ธ์คํด์ค ๋งต + ๋ฐฑ๊ทธ๋ผ์ด๋ tick + pubsub ์ํ ๋ฐํ.\n *\n * ์ปค๋(zero-dep, ESM+CJS ์ด์ค๋ฐฐํฌ)์ CJS require ๋ก ๋ก๋(Node 20 CommonJS ์๋น โ require(ESM) ํํผ). (vocabulary-guard: allow โ Node ๋ฐํ์ ๋ฒ์ ํ๊ธฐ)\n * ์ปค๋์ ๊ฒฐ์ ์ ๋
ผ๋ฆฌ ์ฐ์ฐ ์ฝ์ด โ ์ด host ๊ฐ ์ ์ก(pubsub)ยท์์(TypeORM)ยท์ค์ผ์ค(tick)ยท๋ณต๊ตฌ(replay)๋ง ์๊ฒ ๋ํ.\n * (์ค๊ณ SoT: operato-twin/design/integration/things-factory-host.md)\n */\n\nimport { pubsub, getRepository, Domain } from '@things-factory/shell'\nimport { cacheService } from '@things-factory/cache-service'\n\nimport { TwinEvent } from '../service/twin-event/twin-event.js'\nimport { twinEventKeys } from '../service/twin-event/twin-event-keys.js'\nimport { planWarmStart } from './warm-start.js'\nimport { TwinInstance } from '../service/twin-instance/twin-instance.js'\nimport { TwinStructure } from '../service/twin-structure/twin-structure.js'\nimport { TwinSpace } from '../service/twin-space/twin-space.js'\nimport { utcOffsetOf } from '../service/reference/reference-master.js'\nimport { TwinSpaceRepresentation } from '../service/twin-space/twin-space-representation.js'\nimport { TwinSpaceArea } from '../service/twin-space/twin-space-area.js'\nimport { TwinArea } from '../service/twin-space/twin-area.js'\nimport { masterToTwin, type ReferenceMaster } from '../service/reference/reference-master.js'\nimport { buildTravelEstimator, chainEstimators } from './travel-estimator.js'\nimport { buildMeasuredEstimator } from './measured-estimator.js'\nimport { describeModelBasis, type ModelBasis } from './model-basis.js'\nimport { computeTwinKpi } from './kpi-query.js'\nimport { createHash } from 'node:crypto'\n\nimport { buildEntityDeltas } from './entity-delta.js'\nimport { diffStructures, type StructureDiff } from './structure-diff.js'\nimport { OeeAccumulator, withLiveOee } from './oee-accumulator.js'\n\nimport type { TwinKernel, BoardDef, SubscriptionMessage, TwinRuntime as TwinRuntimeType, CanonicalEnvelope } from '@operato/twin-kernel'\n\n/* ์ปค๋ ๋ฐํ์ ๋ก๋ โ CJS ๋ฒ๋ค(dist-cjs). ํ์
์ ์ import type ๋ก. replay = ์ด๋ฒคํธ์ดโ์ํ ์ฌ๊ตฌ์ฑ(๋ณต๊ตฌยท์๊ฐ์ฌํ). */\nconst { WmsKernel, YmsKernel, MesKernel, TwinRuntime, StateProjector, replay, replaySegments, DOMAIN_CATALOG, OP_EVENT } = require('@operato/twin-kernel')\n\nconst KERNELS: Record<string, any> = { wms: WmsKernel, yms: YmsKernel, mes: MesKernel }\n\n/* ๋ผ์ด๋ธ ์ฒ๋ฆฌ๋ ๊ณ์ธก(๋ชจ๋ํฐ) โ ์ ์
/๋ฐฉ์ก/์ ๋๋ฅ ยท๋ฐฑ๋ก๊ทธ. ์ค ๋๊ธฐ ์ธํฐํ์ด์ค ๋ถํ๋ฅผ ์ฝ๋ ์ผ๊ธ ์งํ. */\ninterface TwinMetrics {\n ingestedTotal: number // ๋์ ์ ์
์ด๋ฒคํธ\n broadcastTotal: number // ๋์ ๋ฐฉ์ก ํ์\n journaledTotal: number // ๋์ ์ ๋ ๊ธฐ๋ก ์ด๋ฒคํธ\n ingestRate: number // ์ต๊ทผ ์ ์
๋ฅ (ev/s)\n broadcastRate: number // ์ต๊ทผ ๋ฐฉ์ก๋ฅ (ํ/s)\n journalRate: number // ์ต๊ทผ ์ ๋๋ฅ (ev/s)\n backlog: number // ๋ง์ง๋ง flush ์ ๋๊ธฐ ์ ๋ ํฌ๊ธฐ(๋ฐฑํ๋ ์
์ ํธ)\n // ์ฐฝ(window) ์ง๊ณ์ฉ ๋ด๋ถ ๋์ \n _accIngest: number\n _accBroadcast: number\n _accJournal: number\n _windowStartMs: number\n}\n\n/*\n * realityMode โ ์ด ํธ์์ \"ํ์ค์ด ์ด๋์ ์ค๋\"(runtime-state-model ยง0ยทยง1 ํ๋ ์์ โ ์ ์ธ).\n * ๋ถํ
๊ฑฐ๋์ ๊ฒฐ์ ํ๋ 1๊ธ ์ ์ธ: mirror=์ธ๋ถ ์ค๋ฌผ ์ฌ๋๊ธฐ / sim-world=์์ฑ ํ์๋ผ์ธ ์ง์(resume) / sim-experiment=seed ์ฌํ(reset).\n * ๋ฏธ์ ์ธ = 'sim-experiment'(๊ฐ์ฅ ๋ณด์์ โ ๊ธฐ์กด ๋ฐ๋ชจ ๊ฑฐ๋ ๋ณด์กด).\n */\nexport type RealityMode = 'mirror' | 'sim-world' | 'sim-experiment'\nexport const DEFAULT_REALITY_MODE: RealityMode = 'sim-experiment'\n\n/* ์ธ๋ฉ๋ชจ๋ฆฌ ๋ผ์ด๋ธ ๋ฐํ์ ํ๋(์์ ์ํฐํฐ TwinInstance ์ ๊ตฌ๋ถ). */\ninterface InstanceRuntime {\n /** ํ์ค ์ถ์ฒ ์ ์ธ(ยง0 ํ๋ ์ โ ). ๋ถํ
๊ฑฐ๋(reset/resume/resync)์ ๊ทผ๊ฑฐ. */\n realityMode?: RealityMode\n id: string\n domainId: string\n domain?: any // ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ(data ์ฑ๋)์ฉ Domain ๊ฐ์ฒด(subdomain ํํฐ). start ์ ๋น๋๊ธฐ ํด์.\n runtime?: TwinRuntimeType // sim: ์ปค๋ ๋ฐํ์(tick/subscribe/dispatch). live ๋ projector ์ฌ์ฉ.\n kernel?: any // sim: ForecastTwin(fork/getSnapshot/tick/scenario). live ๋ฏธ์ฌ์ฉ.\n mode?: 'sim' | 'live' // ์ํ ๋๋ผ์ด๋ฒ โ sim=์ปค๋ tick / live=projector ๋ฏธ๋ฌ(face2-inbound-live). ๋ฏธ์ง์ =sim.\n /**\n * live ์ ์ํ ์ ๊ทผ ์ด๋ํฐ โ ์ด์ **๊ด์ธก ๋ชจ๋ ์ปค๋**์ ๊ฐ๋ฆฌํจ๋ค(`kernel` ๊ณผ ๊ฐ์ ๊ฒ).\n * ์ด๋ฆ์ ์๋น์ฒ ํธํ์ผ๋ก ๋จ์๊ณ , P3 ์์ ์ปค๋ ์ดํ๋ก ์ ๋ฆฌํ๋ฉด ์ฌ๋ผ์ง๋ค.\n */\n projector?: any\n oee?: OeeAccumulator // live: OEE ๊ณ์ฐ ์ธต(์ด๋ฒคํธ ๋์ โ equipment payload ๋ณด๊ฐ). sim ์ ์ปค๋์ด ๊ณ์ฐ.\n unsub: () => void\n timer?: any\n /** ์ํฐํฐ๋ณ ๋ง์ง๋ง ๋ฐํ ์๊ทธ๋์ฒ โ ๊ฐ์ด ๋ฐ๋ ์ํฐํฐ๋ง ์ฌ๋ฐํ(๋ฌด๋ณํ ๋ฐ๋ณต push ๋ฐฉ์ง). */\n entitySigs?: Map<string, string>\n /** live ๋ฐฉ์ก ๋ณํฉ(ingest-scale ยง4.4) โ ingest ๋ง๋ค ๋ฐฉ์กํ์ง ์๊ณ dirty ํ์ โ coalescer tick ์ด ์ฃผ๊ธฐ ๋ฐฉ์ก. */\n dirty?: boolean\n /** live ์ ๋ ๊ฒฐ์ โ ingest ์ด๋ฒคํธ๋ฅผ ๋ชจ์๋ค๊ฐ coalescer tick ์์ ๋ฐฐ์น ๊ธฐ๋ก(์ด๋ฒคํธ๋ง๋ค DB write ๊ธ์ง). */\n pendingJournal?: any[]\n /** live ์ ๋ revision ์นด์ดํฐ(sim ์ delta revision ๋์ โ ์๊ฐ์ฌํยทํ์คํ ๋ฆฌ ๋
ธ๋ธ ์ต์ปค). */\n revision?: number\n /** live ์ฒ๋ฆฌ๋ ๊ณ์ธก(๋ชจ๋ํฐ, โฃ-1). */\n metrics?: TwinMetrics\n}\n\nexport class TwinEngine {\n static instances: Record<string, InstanceRuntime> = {}\n /** ๋ผ์ด๋ธ ๋ฐํ์์ด ์์ ๋(๋ณต๊ตฌ ํ ๋ฏธ๊ธฐ๋) ์ ๋์์ ์ฌ๊ตฌ์ฑํ ์ํ ์บ์. */\n static recovered: Record<string, any> = {}\n static TICK_MS = 1000\n\n /* ์ต์ ์ค๋
์ท ์์(warm-start) โ ์ฌ๊ธฐ๋ ์ ์ ๋ fold-from-0 replay ๋์ ๋ง์ง๋ง ๋ผ์ด๋ธ ์ค๋
์ท์ผ๋ก ๋ณต์.\n * ํ๋ ์์ํฌ ๊ณตํต cache-service(@things-factory/cache-service) ์ฌ์ฌ์ฉ(์ฌ๋ฐ๋ช
๊ธ์ง, framework-leverage ยง4).\n * ์ ๋์ ๊ทธ๋๋ก ์ง์ค(์๊ฐ์ฌํ/history replay ๋ฌด๋ณ๊ฒฝ) โ ์บ์๋ display-only ์์คํํธ ์ต์ ํ. */\n static SNAPSHOT_CACHE_ID = 'twin-snapshot'\n static SNAPSHOT_TTL_S = 7 * 24 * 3600 // 7์ผ โ ์ ์ ๋ค์ดํ์ ์์กด, ๋ง๋ฃ ์ ์ ๋ replay ํด๋ฐฑ\n static CHECKPOINT_MS = 20000 // ์ฒดํฌํฌ์ธํธ ์ฃผ๊ธฐ(ํซ ๋ธ๋ก๋์บ์คํธ ๊ฒฝ๋ก์ ๋ถ๋ฆฌ, O(state) ์ค๋กํ)\n private static checkpointTimer?: any\n\n /** ์ต์ ์ค๋
์ท์ cache-service ์ ์ฒดํฌํฌ์ธํธ(๋๋ฉ์ธ+instanceId ํค). display-onlyยท๋น์ฐจ๋จยท์ค๋ฅํก์. */\n static async persistSnapshot(domainId: string, instanceId: string): Promise<void> {\n const inst = this.instances[instanceId]\n if (!inst) return\n const state = this.snapshot(instanceId)\n if (!state) return\n const revision = inst.revision ?? state.revision ?? 0\n await cacheService.setInCache(this.SNAPSHOT_CACHE_ID, { domainId, instanceId }, { revision, state }, this.SNAPSHOT_TTL_S)\n }\n\n /** ์ฒดํฌํฌ์ธํธ๋ ์ต์ ์ค๋
์ท ๋ก๋(์์ผ๋ฉด null). getFromCache ๋ CacheStore ์ํฐํฐ๋ฅผ ๋ฐํ โ ํ์ด๋ก๋๋ .value. */\n static async loadSnapshot(domainId: string, instanceId: string): Promise<{ revision: number; state: any } | null> {\n const entry = await cacheService.getFromCache(this.SNAPSHOT_CACHE_ID, { domainId, instanceId })\n return (entry as any)?.value ?? null\n }\n\n /** ์ฒดํฌํฌ์ธํธ ๋ฃจํ ๊ธฐ๋(1ํ) โ ๋ผ์ด๋ธ ์ธ์คํด์ค๋ค์ ์ต์ ์ค๋
์ท์ ์ฃผ๊ธฐ ์์. */\n static startCheckpointLoop(): void {\n if (this.checkpointTimer) return\n this.checkpointTimer = setInterval(() => {\n for (const [instanceId, inst] of Object.entries(this.instances)) {\n this.persistSnapshot(inst.domainId, instanceId).catch(err =>\n console.error(`[twin-engine] snapshot checkpoint fail \"${instanceId}\"`, err?.message ?? err)\n )\n }\n }, this.CHECKPOINT_MS)\n if (typeof this.checkpointTimer?.unref === 'function') this.checkpointTimer.unref()\n }\n\n /**\n * ๋ถํ
ํ
โ DB ์ status='running' ์ผ๋ก ๋จ์ ์ธ์คํด์ค๋ฅผ ์ ๋์์ ์ํ ์ฌ๊ตฌ์ฑ(DBโreplay).\n * ๋ผ์ด๋ธ tick ์ฌ๊ฐ(sim ๊ฒฐ์ ์ re-run / live ์ธ์ ์คํธ ์ง์)๋ ํ์. ์ฌ๊ธฐ์ ์ํ ๋ณต์ + ๋
ธ์ถ.\n */\n static async bootstrap(): Promise<void> {\n try {\n // ๋ฐฑํ(space #3) โ spaceId ์ปฌ๋ผ ์๋ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ board.spaceId ๋ก ์ฑ์(1ํ, ๋ง์ด๊ทธ๋ ์ด์
์์ ).\n const repo = getRepository(TwinInstance)\n const missing = (await repo.find()).filter(r => !r.spaceId && (r.board as any)?.spaceId)\n for (const r of missing) {\n r.spaceId = (r.board as any).spaceId\n r.areaId = (r.board as any).areaId ?? r.areaId\n await repo.save(r)\n }\n if (missing.length) console.log(`[twin-engine] backfilled spaceId for ${missing.length} instance(s).`)\n\n // ๋ฐฑํ(area ๋จ์ผํ P3) โ deprecated content.areas โ TwinArea ์ด๊ด(ํด๋ฐฑ ์ ๊ฑฐ ์ ์์ ์ฑ ๋ณด์ฅ, 1ํ).\n const spaceRepo = getRepository(TwinSpace)\n const twinAreaRepo = getRepository(TwinArea)\n for (const sp of await spaceRepo.find()) {\n const cAreas = ((sp.content as any)?.areas ?? []) as any[]\n for (const a of cAreas) {\n if (!a?.id) continue\n const ex = await twinAreaRepo.findOne({ where: { domain: { id: sp.domainId } as any, space: { id: sp.id } as any, areaId: a.id } })\n if (ex) continue\n await twinAreaRepo.save(twinAreaRepo.create({\n domain: { id: sp.domainId } as any, space: { id: sp.id } as any, areaId: a.id,\n name: a.name ?? a.id, type: a.type, parentId: a.parentId ?? null,\n layout: a.x != null ? { x: a.x, y: a.y, w: a.w, h: a.h } : null\n }))\n }\n }\n\n const rows = await repo.find({ where: { status: 'running' } })\n for (const row of rows) {\n if (!row.domainId || !row.instanceId) continue\n // ์์คํํธ: ์บ์๋ ์ต์ ์ค๋
์ท ์ฐ์ (O(1) + attentions/OEE ๋ฑ ๋ผ์ด๋ธ ํ์์ํ ๋ณด์กด).\n // ์์ผ๋ฉด ์ ๋ fold-from-0 replay(์ง์ค ํด๋ฐฑ โ replay ๋ ๋ผ์ด๋ธ ํ์์ํ๋ฅผ ๋ชป ๋ด์ผ๋ฏ๋ก ์บ์๊ฐ ๋ ์ถฉ์ค).\n const cached = await this.loadSnapshot(row.domainId, row.instanceId).catch(() => null)\n if (cached?.state) {\n this.recovered[row.instanceId] = { revision: cached.revision, state: cached.state }\n console.log(`[twin-engine] warm-started \"${row.instanceId}\" from snapshot cache โ revision ${cached.revision}.`)\n continue\n }\n const state = await this.recover(row.domainId, row.instanceId).catch(() => null)\n if (state) {\n this.recovered[row.instanceId] = { revision: state.revision, state }\n console.log(`[twin-engine] recovered \"${row.instanceId}\" from journal โ revision ${state.revision}.`)\n }\n }\n this.startCheckpointLoop() // ์ดํ ๊ธฐ๋๋๋ ๋ผ์ด๋ธ ์ธ์คํด์ค์ ์ต์ ์ค๋
์ท์ ์ฃผ๊ธฐ ์์\n } catch (err) {\n console.error('[twin-engine] recovery scan failed', err)\n }\n }\n\n /**\n * ์์คํํธ โ ๊ธฐ๋ํ๋ ์ปค๋์ **์ง์ ๊ด์ธก ์ํ**๋ฅผ ์ฌ๋๋ค.\n *\n * โโ ์ ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `loadBoard` ๋ **๊ตฌ์กฐ๋ง** ์ฃ๋๋ค(๋
ธ๋ยท๋ฌด๋ฒ). ์ํ(๋ฌด์์ด ์ด๋์ ์ผ๋ง๋)๋ ์๋ค. ๊ทธ๋์ ์ฌ๊ธฐ๋ํ\n * ํธ์์ ์ ๋์ ์
๊ณ 540๊ฑด์ด ๋จ์ ์์ด๋ ์ฌ๊ณ ๊ฐ 0 ์ด์๊ณ , ํ๋ฉด์ \"๋ณด์ ์ค์ธ ๊ฒ์ด ์์ต๋๋ค\" ๋ผ๊ณ \n * ๋งํ๋ค โ ์๋ ์ฌ๊ณ ๋ฅผ ์๋ค๊ณ ํ๋ ์
์ด๋ค(2026-07-31 hatiolab-wms ์ค์ธก์ผ๋ก ํ์ธ).\n * `bootstrap()` ์ด ์ด๋ฏธ ์ฒดํฌํฌ์ธํธ ์บ์(์์ผ๋ฉด ์ ๋ replay)๋ก ์ํ๋ฅผ ๋ณต๊ตฌํด `recovered` ์ ๋ด์ ๋๋๋ฐ,\n * ๊ธฐ๋ ์๊ฐ ๊ทธ๊ฑธ **๋ฒ๋ฆฌ๊ณ ** ์์๋ค. ๋ฐ๋ง ์ฐ๊ฒฐ๋ผ ์๋ ์ฅ์น๋ฅผ ์๋๋ค.\n *\n * โโ ์ ์งํ ํ๊ณ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ยท **์ค๋๋ ๋ณต์ํ์ง ์๋๋ค.** `hydrateObserved` ์ ์ค๋ ์ธ์๋ requested/fulfilled/lines ๋ฅผ ์๊ตฌํ๋๋ฐ\n * ์ค๋
์ท์ `OrderState` ์๋ `progress` ๋ฐ์ ์๋ค. progress ์์ ์ญ์ฐํ๋ฉด ์๋ ์ซ์๋ฅผ ์ง์ด๋ด๋ ๊ฒ์ด๋ผ\n * ๋๊ธฐ์ง ์๋๋ค โ ์ฌ๊ณ ยท๋
ธ๋ยท๋ฌด๋ฒ๋ง ๋ณต์๋๊ณ ์งํ ์ค ์ค๋๋ ๋น์ด์ ์์ํ๋ค.\n * ยท ์งํ ์ค ๊ฐ๋ณ task ์ ๋ด๋ถ ์ํ๋ ๊ด์ธก๋ง์ผ๋ก๋ ๋ณต์๋์ง ์๋๋ค(์ปค๋์ด ๋ช
์ํ ํ๊ณ, ์ฌ๊ณํ์ ๋งก๊น).\n * ยท ๊ทผ๋ณธ ํด๋ฒ(์ํ ์์ ๊ณ์ฝยทrevision ์ด์ด๋ถ์)์ ๋ณ๋ ๊ณผ์ .\n *\n * โโ ๋ฒค์น๋ ์๋ํ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ถํ ๋ฒค์น๋ **์ ์์์์ ์ฉ๋์ ์ฌ๋ ๊ฒ**์ด ๋ชฉ์ ์ด๋ผ ํ์ฌ ์ํ๋ฅผ ์ฌ์ผ๋ฉด ์ธก์ ์ด ์ค์ผ๋๋ค.\n */\n private static warmStart(id: string, kernel: TwinKernel, purpose?: string): void {\n const hydrate = (kernel as any).hydrateObserved\n const plan = planWarmStart(this.recovered[id]?.state, purpose, typeof hydrate === 'function')\n\n if (plan.action === 'skip') {\n if (plan.reason === 'bench') {\n console.log(`[twin-engine] \"${id}\" is a bench twin โ starting empty on purpose (seeding would skew the measurement).`)\n } else if (plan.reason === 'unsupported') {\n console.warn(\n `[twin-engine] kernel for \"${id}\" cannot be warm-started (no hydrateObserved) โ it starts with structure only, so held stock will read as zero.`\n )\n }\n return\n }\n\n hydrate.call(kernel, plan.seed)\n console.log(\n `[twin-engine] warm-started \"${id}\" โ ${plan.itemCount} item(s), ${plan.equipmentCount} equipment restored. ` +\n 'Open orders are not restored (the snapshot carries no requested/fulfilled counts).'\n )\n }\n\n /** ํธ์ ์ธ์คํด์ค ์์ โ ์ปค๋ ์์ฑ + ๋ณด๋ ๋ก๋ + ์ง์ ์ํ ์์คํํธ + State ์คํธ๋ฆผ ๋ธ๋ฆฌ์ง + ์์ปค tick + ๋ ์ง์คํธ๋ฆฌ ์์. */\n /**\n * ๊ณต์ ๋ช
์ธ๋ฅผ ์ปค๋์ ์ฃ๋๋ค โ **์๋ฎฌ๋ ์ด์
์ ์๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋งํ๊ฒ ํ๋ ๋ง์ง๋ง ํ ์นธ.**\n *\n * `board.operations`(๋ง์คํฐ ์ธ์ ์คํธ๊ฐ ํต๊ณผ์ํจ ISA-95 OperationsSegment ๋ช
์ธ)๋ฅผ ์ปค๋์ด ์๋นํ๋ค.\n * ์์ผ๋ฉด ์ปค๋ ๊ธฐ๋ณธ ์์๋ก ๊ตด๋ฌ๊ฐ๊ณ , ์ปค๋ `specCoverage()` ๊ฐ ๋ฌด์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ผ๋์ง ๋ณด๊ณ ํ๋ค.\n *\n * ์ปค๋์ด ์์ง ์ด API ๋ฅผ ๊ฐ์ง ์์ ๋ฒ์ ์ด๋ฉด(๋ฐํ ์ด์ ) **์กฐ์ฉํ ๋์ด๊ฐ์ง ์๊ณ ๊ฒฝ๊ณ ํ๋ค** โ ๋ช
์ธ๋ฅผ\n * ์ ์ธํ๋๋ฐ ๋ฐ์๋์ง ์๋ ์ํ๋ฅผ ๋ชจ๋ฅด๊ณ ์ง๋๊ฐ๋ฉด, ์์ธก์ด ์์๋ก ๋์๊ฐ ๊ฒ์ ์๋ฌด๋ ์ ์ ์๋ค.\n */\n private static applyOperations(kernel: any, board: any, id: string): void {\n const ops = board?.operations\n if (!ops?.length) return\n if (typeof kernel?.loadOperations !== 'function') {\n console.warn(`[twin-engine] \"${id}\": board declares ${ops.length} operation spec(s) but the kernel cannot consume them (loadOperations missing โ kernel needs publishing). Simulation will use built-in default durations.`)\n return\n }\n kernel.loadOperations(ops)\n }\n\n /**\n * ์์์๊ฐ ์ถ์ ๊ธฐ ์ฃผ์
โ **์์๋ฅผ ๋ฐ์ดํฐ๋ก ๋ฐ๊พธ๋ ๋ ๋ฒ์งธยท์ธ ๋ฒ์งธ ์ธต.**\n *\n * ์ปค๋ `durationOf` ์ ์ฐ์ ์์๋ ์ถ์ ๊ธฐ > ๋ช
์ธ > ์์๋ค. ๊ทธ ์ถ์ ๊ธฐ ์๋ฆฌ์ ๋ ๊ฐ์ง๋ฅผ ์ฌ์ฌ๋ก ๋ฃ๋๋ค:\n * โ **์ค์ธก**(์ ๋์ ์์
์ข
๋ฅ๋ณ ์์
์๊ฐ p50) โ ๊ทธ ํ์ฅ์์ ์ค์ ๋ก ์ผ๋ง ๊ฑธ๋ ธ๋. ๊ฐ์ฅ ๊ฐํ ๊ทผ๊ฑฐ.\n * โก **๊ฑฐ๋ฆฌ ร ์๋**(board.layout + ์ค๋น ์๋ ์์ฑ) โ ์ด๋์ ๊ฑฐ๋ฆฌ์ ๋น๋กํ๋ค. ์ปค๋์ ์ขํ๋ฅผ ๋ชจ๋ฅด๋ฏ๋ก\n * ํธ์คํธ๊ฐ ๊ณ์ฐํด ๋ฃ๋๋ค.\n * ๋ ๋ค ๋ชป ๋ง๋ค๋ฉด ์ฃผ์
ํ์ง ์๋๋ค โ ์ปค๋์ด ๋ช
์ธยท์์๋ก ๊ตด๋ฌ๊ฐ๊ณ `specCoverage()` ๊ฐ ๊ทธ ์ฌ์ค์ ๋จ๊ธด๋ค.\n *\n * ์ค์ธก์ DB ์กฐํ๋ผ ๋น๋๊ธฐ๋ค. ๊ทธ๋์ ์ด ํจ์๋ **await ํ์ง ์๋ ์ชฝ์์๋ ์์ **ํ๋๋ก ์คํจ๋ฅผ ์ผํค๋,\n * ๋ฌด์์ ์ ๋ชป ๋ฃ์๋์ง๋ ๋ก๊ทธ๋ก ๋จ๊ธด๋ค(์กฐ์ฉํ ๋ฌดํจํ ๊ธ์ง).\n */\n static async installEstimators(kernel: any, domainId: string, instanceId: string, board: any): Promise<void> {\n if (!kernel || typeof kernel !== 'object') return\n const travel = buildTravelEstimator({ layout: board?.layout, equipment: board?.equipment, unit: board?.unit })\n const measured = await this.measuredEstimator(domainId, instanceId)\n const chained = chainEstimators([measured?.estimator, travel.estimator])\n if (!chained) {\n /* ์ ๋ชป ๋ฃ์๋์ง ํ ๋ฒ๋ง ์๋ฆฐ๋ค โ ์ด๋์๊ฐ์ด ์์๋ก ๋จ์ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ณ ์ง๋๊ฐ์ง ์๊ฒ. */\n if (travel.reasons.length) console.warn(`[twin-engine] \"${instanceId}\": no duration estimator installed โ ${travel.reasons.join('; ')}`)\n return\n }\n kernel.durationEstimator = chained\n const learned = Object.keys(measured?.learned ?? {})\n const spread = Object.keys(measured?.spreads ?? {})\n console.log(\n `[twin-engine] \"${instanceId}\": duration estimator installed โ measured kinds: ${learned.length ? learned.join(',') : 'none'}` +\n ` (with observed spread: ${spread.length ? spread.join(',') : 'none'})` +\n `${travel.estimator ? `, travel from distance (speeds: ${Object.keys(travel.speedsByKind).join(',')})` : `, travel not derived (${travel.reasons.join('; ')})`}`\n )\n }\n\n /**\n * ์ค์ธก ์ถ์ ๊ธฐ โ **์์ธก ์์ฒญ๋ง๋ค ์ ๋์ ๋ค์ ์ ์ง ์๋๋ค.**\n *\n * ์์ธก ์ปค๋์ ์์ฒญ๋ง๋ค ์๋ก ์ธ์์ง๊ณ (๋ฏธ๋ฌ ์์ธกยท๋ฐฑํ
์คํธ), ํ๋ฉด์ ์๊ฐ์ ๊ธ์ผ๋ฉด ๊ณ์ ์ฌ์์ธกํ๋ค.\n * ๊ฑฐ๊ธฐ์ KPI ์กฐํ๋ฅผ ๊ทธ๋๋ก ๋ฌ๋ฉด ์์ฒญ๋น ์ ๋ ์ค์บ์ด ํ๋์ฉ ๋ถ๋๋ค โ ์ค์ธก์ ๋ถ ๋จ์๋ก ๋ฐ๋์ง ์์ผ๋ฏ๋ก\n * ์งง์ TTL ๋ก ์ฌ์ฌ์ฉํ๋ค. ์บ์๋ ์ธ์คํด์ค๋ณ์ด๊ณ , ๋ง๋ฃ ์ ์๋ ๊ฐ์ ๊ฐ์ ์ด๋ค(์์ธก ๊ฐ ์ผ๊ด์ฑ๋ ์ป๋๋ค).\n */\n private static measuredCache = new Map<string, { at: number; value: ReturnType<typeof buildMeasuredEstimator> | undefined }>()\n private static readonly MEASURED_TTL_MS = 60_000\n\n private static async measuredEstimator(domainId: string, instanceId: string) {\n const key = `${domainId}:${instanceId}`\n const hit = this.measuredCache.get(key)\n if (hit && Date.now() - hit.at < this.MEASURED_TTL_MS) return hit.value\n let value: ReturnType<typeof buildMeasuredEstimator> | undefined\n try {\n /* ์์
์ข
๋ฅ๋ณ ์ค์ธก โ ์ฐฝ์ ๋๋ํ(ํ๋ฃจ) ๋๊ณ ํ๋ณธ์ด ๋ชจ์๋ ์ข
๋ฅ๋ ์ถ์ ๊ธฐ๊ฐ ์ค์ค๋ก ๋บ๋ค. */\n const kpi: any = await computeTwinKpi({ domainId, instanceId, windowMinutes: 24 * 60, groupBy: 'taskKind' })\n value = buildMeasuredEstimator(kpi?.groups?.items, {})\n } catch (err) {\n console.warn(`[twin-engine] \"${instanceId}\": measured duration lookup failed โ falling back to declared/default durations.`, (err as any)?.message)\n }\n this.measuredCache.set(key, { at: Date.now(), value })\n return value\n }\n\n /**\n * ์ง๊ธ ์ด ํธ์์ด ์ด๋ค ๋ชจ๋ธ๋ก ๊ตด๋ฌ๊ฐ๋๊ฐ โ ์์ธก ์ถ๋ ฅ ๋ณด์ ์ด **์๊ธฐ๊ฐ ๋ฐฐ์ด ๋ชจ๋ธ**์๋ง ์ ์ฉ๋๋๋ก\n * ๋น๊ตํ๋ ์ง๋ฌธ. ์ฌ๋ฃ๋ ํธ์คํธ๊ฐ ์๋ ๊ฒ(์ค์ธกยท์๋ยท์ ์ธ ๋ช
์ธ)์ด๋ผ ์ปค๋ ๋ฐํ ์ํ์ ๋ฌด๊ดํ๋ค.\n * ์คํจํ๋ฉด undefined โ ๊ทธ๋๋ ๋น๊ต๋ฅผ ํ์ง ์๋๋ค(๋ชจ๋ฅด๋ ๊ฒ์ ๊ทผ๊ฑฐ๋ก ๋ณด์ ์ ๋์ง ์๋๋ค).\n */\n static async modelBasis(domainId: string, instanceId: string): Promise<ModelBasis | undefined> {\n try {\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n const board: any = reg?.board\n const measured = await this.measuredEstimator(domainId, instanceId)\n const travel = buildTravelEstimator({ layout: board?.layout, equipment: board?.equipment, unit: board?.unit })\n return { measured: measured?.learned, speeds: travel.speedsByKind, declared: board?.operations }\n } catch {\n return undefined\n }\n }\n\n /**\n * **์ด ํธ์์ด ํ๋ฃจ ๋ช ๋๋ฅผ ๋ผ ์ ์๋๊ฐ** โ ๊ตด๋ ค ๋ณด์ง ์๊ณ ๋ตํ๋ค.\n *\n * ๊ณ์ฐ์ ์ปค๋์ด ์๊ธฐ ์ํ์์ ํ๋ค(`kernel.capacity`). ์ฌ๊ธฐ์ ํ๋ ์ผ์ **๊ธฐ์ค ์ฃผ๋ฅผ ์ ํด ์ฃผ๋\n * ๊ฒ**๋ฟ์ด๋ค: ๊ณตํด์ผ์ด ์๋ ํ์์ฃผ์ฌ์ผ ํ๋ค โ ๊ณตํด์ผ์ ์ฐ๊ฐ ๊ฐ์ฉ๋์ ๋ฐ๋ก ๊น์ง, ์ด ๊ณต์ฅ์ ํ์์\n * ์ฒ์ฅ์ ์ ํ์ง ์๋๋ค. ์ปค๋์ด ์์๋ก ๊ณ ๋ฅด๊ฒ ๋๋ฉด ๊ทธ ์ฃผ์ ๊ณตํด์ผ์ด ๋ผ์์ ๋ ์ฒ์ฅ์ด ์กฐ์ฉํ ๋ฎ์์ง๋ค.\n *\n * ํธ์์ด ์ ๋ ์์ผ๋ฉด `undefined` ๋ค โ 0 ์ด ์๋๋ค. ์ ๋ฌ ํธ์์ ์ฒ์ฅ์ 0 ์ด๋ผ๊ณ ๋ตํ๋ฉด ํ๋ฉด์\n * \"์ด ๊ณต์ฅ์ ์๋ฌด๊ฒ๋ ๋ชป ๋ง๋ ๋ค\" ๊ณ ๋งํ๋ค.\n */\n static async capacity(\n domainId: string,\n target: { instanceId?: string; spaceId?: string },\n unitsPerDay: number,\n sampleWeekStartMs: number\n ): Promise<{ instanceId: string; kind?: string; analysis?: any; reason?: 'not-running' | 'no-operations' }[]> {\n /* ๋์์ **๋ฑ๋ก๋ถ**๊ฐ ์ ํ๋ค โ ๋ ์๋ ๋ฐํ์๋ง ํ์ผ๋ฉด \"์ ๋ ์์ด์ ์ ๋ณด์ด๋ ๊ฒ\" ๊ณผ \"์๋ ๊ฒ\" ์ด\n ๊ตฌ๋ณ๋์ง ์๋๋ค. ํ๋ฉด์ ๊ทธ ๋์ ๋ค๋ฅด๊ฒ ๋งํด์ผ ํ๋ค. */\n const where: any = { domain: { id: domainId } }\n if (target.instanceId) where.instanceId = target.instanceId\n else where.spaceId = target.spaceId\n const registered = await getRepository(TwinInstance).find({ where })\n\n return registered.map(reg => {\n const rt = this.instances[reg.instanceId]\n const kernel: any = rt?.domainId === domainId ? rt.kernel : undefined\n if (typeof kernel?.capacity !== 'function') return { instanceId: reg.instanceId, kind: reg.kind, reason: 'not-running' as const }\n\n const analysis = kernel.capacity({ unitsPerDay, sampleWeekStartMs })\n /* ๊ณต์ ์ ์ ์ธํ์ง ์์ ํธ์(๋๊ฐ YMSยทWMS)์ **ํ์ ๋์์ด ์๋๋ค.** 0 ์ผ๋ก ์ฑ์ ๋ฃ์ผ๋ฉด\n \"์ผ๋๊ฐ ๋ณ๋ชฉ\" ์ด๋ผ๋ ์๋ ์ฌ์ค์ด ์๊ธด๋ค โ ์ด ๊ฒ์ด ์๋ค๊ณ ๋งํ๋ค. */\n if (!analysis?.operations?.length) return { instanceId: reg.instanceId, kind: reg.kind, reason: 'no-operations' as const }\n return { instanceId: reg.instanceId, kind: reg.kind, analysis }\n })\n }\n\n static start(id: string, domainId: string, kind: string, board: BoardDef, realityMode?: RealityMode, purpose?: string, resumeFrom?: number): InstanceRuntime {\n if (this.instances[id]) return this.instances[id]\n\n const Kernel = KERNELS[kind] ?? WmsKernel\n const kernel: TwinKernel = new Kernel(domainId, undefined, this.mesSpecOf(board))\n kernel.loadBoard(board) // ๊ตฌ์กฐ๋ง. ์ํ๋ ์๋ ์์คํํธ๊ฐ ์ฌ๋๋ค.\n this.applyOperations(kernel, board, id) // ์๊ฐยท์์จ ๋ช
์ธ(์์ผ๋ฉด) โ ์์ผ๋ฉด ์ปค๋ ๊ธฐ๋ณธ๊ฐ\n /* ์ถ์ ๊ธฐ๋ DB ์กฐํ๋ฅผ ํฌํจํด ๋น๋๊ธฐ โ ๊ธฐ๋์ ๋ง์ง ์๊ณ ๋ถ๋๋ค(๋ถ๊ธฐ ์ ์์
์ ๋ช
์ธยท์์๋ก ์ฐ์ถ). */\n this.installEstimators(kernel, domainId, id, board).catch(err => console.warn('[twin-engine] estimator install failed', err?.message))\n this.warmStart(id, kernel, purpose)\n /*\n * **๋ฒํธ๋ฅผ ์ด์ด ์ผ๋ค** โ ์ ๋์ ์ด๋ฏธ ์๋ ๋ฒํธ์ ๊ฒน์น์ง ์๊ฒ.\n *\n * ์ ๋์ด ๋น์ด ์์ผ๋ฉด(0) ์๋ฌด ์ผ๋ ์ ํ๋ค. ๋น์ด ์์ง ์์๋ฐ 0๋ถํฐ ๋ค์ ์ธ๋ฉด ๊ฐ์ ํธ์์ ๊ฐ์\n * ๋ฆฌ๋น์ ์ด ๋ ์๊ธฐ๊ณ , ์ฌ์ ์์๊ฐ ๋ค์์ด๋ฉฐ, ์๊ฐ์ฌํ์ด ์๋ฑํ ์์ ์ ๋ตํ๋ค โ ์ค๋ฅ๋ ์ ๋๋ค.\n */\n if (resumeFrom && typeof (kernel as any).resumeRevision === 'function') (kernel as any).resumeRevision(resumeFrom)\n const runtime: TwinRuntimeType = new TwinRuntime(kernel)\n\n /* subscribe ๋ RuntimeSubscription({ unsubscribe() }) ๋ฐํ โ () => void ๋ก ๊ฐ์. */\n const inst: InstanceRuntime = { id, domainId, runtime, kernel, realityMode: realityMode ?? DEFAULT_REALITY_MODE, unsub: () => {} }\n this.instances[id] = inst\n delete this.recovered[id] // ์์คํํธ๋ก ์ปค๋์ ์ฎ๊ฒจ ์ฌ์๋ค โ ์ด์ ๋ผ์ด๋ธ๊ฐ ์ง์ค์ด๋ค.\n\n /* ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ(P3): data ์ฑ๋ ํํฐ๊ฐ subdomain ์ ๋ณด๋ฏ๋ก Domain ๊ฐ์ฒด๋ฅผ 1ํ ํด์ํด ๋๋ค. */\n getRepository(Domain).findOne({ where: { id: domainId } }).then(d => (inst.domain = d)).catch(() => {})\n\n /* State ์ฑ๋: runtime.subscribe(snapshotโdeltaโclock) โ pubsub ๋ฐฉ์ก(๊ตฌ๋
๋ฆฌ์กธ๋ฒ๊ฐ instanceId ํํฐ). */\n const sub = runtime.subscribe((msg: SubscriptionMessage) => {\n pubsub.publish('twin-state', {\n twinState: { instanceId: id, kind: msg.kind, revision: (msg as any).revision, payload: msg }\n })\n /* ์์ + ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ ๋ธ๋ฆฌ์ง: delta ๋ง๋ค ์ ๋ ์ ์ฅ + ์ํฐํฐ๋ณ data(tag:) publish โ ๋ณด๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ. */\n if (msg.kind === 'delta') {\n this.persist(domainId, id, msg).catch(err => console.error('twin persist fail', err))\n this.publishEntityData(inst)\n }\n })\n inst.unsub = () => sub.unsubscribe()\n\n /* ๋ณต๊ตฌ ์ต์ปค: ๋ ์ง์คํธ๋ฆฌ์ board/kind/status/realityMode ์์(์ฌ๋ถํ
์ ์ด๊ฒ ์์ด์ผ replayยท์ ์ธ ๊ฑฐ๋ ๊ฐ๋ฅ). */\n this.register(domainId, id, kind, board, 'running', inst.realityMode).catch(err => console.error('twin register fail', err))\n\n /* ์์ปค tick โ ์ค์ผ๋ ํค์ setInterval(๋ฉ์ธ ๋ฃจํ). ๊ธด ์๋ฎฌ ์คํ-๋ฃจํ(worker thread)๋ ์ค์ผ์ผ ํ๋๋(ํฅํ, ยงhost ๊ฒฝ๊ณ). */\n inst.timer = setInterval(() => runtime.tick(this.TICK_MS), this.TICK_MS)\n return inst\n }\n\n /**\n * live-๋ชจ๋ ๊ธฐ๋ โ **๊ด์ธก ๋ชจ๋ ์ปค๋**๋ก ์ค ์ด๋ฒคํธ๋ฅผ ๋ฏธ๋ฌํ๋ค(ํตํฉ P2).\n *\n * ์์ ์๋ `StateProjector` ๋ฅผ ์ธ์ ๋ค. ๊ทธ๋์ ๋ผ์ด๋ธ์๋ **์ปค๋์ด ์์๊ณ **, ๊ทธ ํ๋ ๋๋ฌธ์ ์ฐํ๊ฐ\n * ์ค์ค์ด ์๊ฒผ๋ค: ์์ธกํ๋ ค๋ฉด ์์ ์ปค๋์ ์ธ์์ผ ํ๊ณ (`buildForecastKernel`), ์ฃผ๋ชฉ ์ ํธ๋ฅผ ํธ์คํธ๊ฐ\n * ๋ง๋ถ์ฌ์ผ ํ๊ณ (`withLiveAttentions`), AI ์์ธก ๋๊ตฌ๋ ๋ฏธ๋ฌ์์ \"์ฐพ์ ์ ์๋ค\" ๋ก ๋๋ฌ๋ค.\n *\n * ์ด์ ๋ผ์ด๋ธ ์ธ์คํด์ค๋ **์ปค๋์ด๋ค.** ๊ฐ์ ๊ท์น(`ObservedReducer`)์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ ๊ณ , ์ฃผ๋ชฉ ์ ํธ๋ฅผ\n * ์ค์ค๋ก ๋ด๊ณ , ๊ทธ ์๋ฆฌ์์ `fork` ํด ์์ธกํ๋ค. ๊ตฌ๋๋ง ๋ค๋ฅด๋ค โ sim ์ `tick`, live ๋ `apply`.\n *\n * ์ค ์ด๋ฒคํธ์ = reference ์ด๋ํฐ openLiveFeed โ face2-adapter.ingest โ CanonicalEnvelope โ ingestLive().\n */\n /**\n * ๋ณด๋๊ฐ ์ค์ **์์ฐ ์ ์**(๋ ์ํผยท๋ผ์ฐํธยท๋ฐ์ธ๋ฉ)๋ฅผ ๊บผ๋ธ๋ค โ ์ปค๋์ ์ ์-๊ตฌ๋ ๋ชจ๋ ์
๊ตฌ.\n *\n * โโ ์์ ๋ ๋ฌด์์ด ์ผ์ด๋ฌ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์๋ ์ ์-๊ตฌ๋ MES ๊ฒฝ๋ก๊ฐ ์๋๋ฐ **ํธ์คํธ๊ฐ ๊ทธ๊ฒ์ ํ ๋ฒ๋ ๋๊ธฐ์ง ์์๋ค.** ๊ทธ๋์ ๋ชจ๋ MES\n * ํธ์์ด **ํ๋์ฝ๋ฉ๋ ๋ ๊ฑฐ์ ํ๋ฆ**์ผ๋ก ๋์๋ค โ ํ์ฅ ๋ ์ํผ๋ฅผ ์๋ฌด๋ฆฌ ์ ์ฑ๊ป ์ ์ด๋ ์ปค๋์ ๊ทธ๊ฒ์\n * ๋ณด์ง ๋ชปํ๊ณ ํ ์ด ๋ถํ์ผ๋ก ํ ์ด ์ ํ์ ๋ง๋ค์๋ค. ์ ์ธ๊ณผ ์คํ์ด ๊ฐ๋ผ์ ธ ์๋ ์๋ฆฌ๋ค.\n *\n * ๋ณด๋์ ์์ผ๋ฉด `undefined` โ ๋ ๊ฑฐ์ ๊ฒฝ๋ก ๊ทธ๋๋ก๋ค(๊ธฐ์กด ํธ์์ ๊ฑฐ๋์ ๋ฐ๊พธ์ง ์๋๋ค).\n */\n private static mesSpecOf(board: BoardDef | undefined): any {\n return (board as any)?.mesSpec\n }\n\n /**\n * ํ์ฅ(๊ณต๊ฐ)์ **์๊ฐ ๊ธฐ์ค**์ ๋ณด๋์ ์น๋๋ค โ ์ปค๋์ด ๊ต๋์ `HH:MM` ์ ์ฝ์ ๊ธฐ์ค.\n *\n * **ํ
๋ํธ๊ฐ ์๋๋ผ ๊ณต๊ฐ์ด ๊ถ์๋ค.** ํ ํ
๋ํธ๊ฐ Rosarito(ํํ์)์ ํ๊ตญ ๊ณต์ฅ์ ํจ๊ป ๊ฐ์ง ์ ์๊ณ ,\n * ํ
๋ํธ ๋จ์(`Domain.timezone`)๋ก ๋๋ฉด ๋ ์ค ํ๋๋ ๋ฐ๋์ ํ๋ฆฐ๋ค. ๊ทธ๋์ ์ธ์คํด์ค๊ฐ ๋ฌถ์ธ ๊ณต๊ฐ์\n * `timezone` ์ ์ฝ๋๋ค. ๊ณต๊ฐ์ด ๋งํ์ง ์์ผ๋ฉด **ํ
๋ํธ๋ก ๋ด๋ ค๊ฐ์ง ์๋๋ค** โ ์๋ชป๋ ์
์๋ก ๋ตํ๋ ๊ฒ์ด\n * ๋ชจ๋ฅด๋ ๊ฒ๋ณด๋ค ๋์๋ค(๊ทธ๋๋ ์ปค๋์ด UTC ๋ก ์ฝ๊ณ , ๊ทธ ๊ธฐ๋ณธ๊ฐ์ ๊ณ์ฝ์ ๋ฐํ์ ธ ์๋ค).\n *\n * ์ปค๋์ zero-dep ์ด๋ผ ์๊ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฐ์ง ์์ผ๋ฏ๋ก **๋ถ ์คํ์
**์ผ๋ก ํ์ด ๋๊ธด๋ค. ๊ทธ ๊ฐ์\n * ์ง๊ธ ๊ณ์ ์ ๊ฒ์ด๋ค(์ผ๊ด์ ์ฝ์๊ฐ) โ ๊ณ์ ์ ๋๋ ๊ธด ์์ธก์ ํ ์๊ฐ ์ด๊ธ๋๋ค(๊ณ์ฝ์ ๋ช
์).\n */\n static async withSpaceTimeBase(board: BoardDef, domainId: string, spaceId?: string): Promise<BoardDef> {\n const sid = spaceId ?? (board as any)?.spaceId\n if (!sid) return board\n const space = await getRepository(TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId: sid } }).catch(() => null)\n const offset = utcOffsetOf(space?.timezone)\n if (offset === undefined) {\n if (space?.timezone) console.warn(`[twin-engine] space \"${sid}\" declares time zone \"${space.timezone}\" but it is not a known IANA zone โ times will be read as UTC.`)\n return board\n }\n return { ...board, utcOffsetMinutes: offset }\n }\n\n static startLive(id: string, domainId: string, kind: string, board: BoardDef): InstanceRuntime {\n if (this.instances[id]) return this.instances[id]\n const Kernel = KERNELS[kind] ?? WmsKernel\n const kernel: any = new Kernel(domainId, undefined, this.mesSpecOf(board))\n kernel.loadBoard(board)\n this.applyOperations(kernel, board, id) // ๋ช
์ธ๋ ๋ผ์ด๋ธ์๋ ์ค๋ฆฐ๋ค(์์ธก ์๊ฒฉ์ด sim ๊ณผ ๊ฐ์์ง๋ค)\n /* `projector` ํ๋๋ ์ ์ด๋ฆ์ผ๋ก ๋จ๊ธด๋ค โ ์๋น์ฒ๊ฐ `snapshot()` ์ ๋ถ๋ฅด๋ฏ๋ก ์์ ์ด๋ํฐ๋ก ์๋๋ค.\n * (P3 ์์ ์๋น์ฒ๋ฅผ ์ปค๋ ์ดํ๋ก ๋ฐ๊พธ๋ฉด ์ฌ๋ผ์ง๋ค.) */\n const projector = { apply: (e: CanonicalEnvelope) => kernel.apply(e), snapshot: () => kernel.getSnapshot() }\n const inst: InstanceRuntime = { id, domainId, mode: 'live', realityMode: 'mirror', kernel, projector, oee: new OeeAccumulator(), unsub: () => {} }\n /* ์ถ์ ๊ธฐ(์ค์ธกยท๊ฑฐ๋ฆฌ)๋ ๋ผ์ด๋ธ์ ๋ถ์ธ๋ค โ ์์ธก์ด ์์๋ก ๋์ง ์๊ฒ. ๊ธฐ๋์ ๋ง์ง ์๋๋ค. */\n this.installEstimators(kernel, domainId, id, board).catch(err => console.warn('[twin-engine] estimator install failed', err?.message))\n inst.metrics = { ingestedTotal: 0, broadcastTotal: 0, journaledTotal: 0, ingestRate: 0, broadcastRate: 0, journalRate: 0, backlog: 0, _accIngest: 0, _accBroadcast: 0, _accJournal: 0, _windowStartMs: Date.now() }\n this.instances[id] = inst\n delete this.recovered[id]\n /* ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ(data ์ฑ๋) subdomain ํํฐ์ฉ Domain 1ํ ํด์(sim ๊ณผ ๋์ผ). */\n getRepository(Domain).findOne({ where: { id: domainId } }).then(d => (inst.domain = d)).catch(() => {})\n /* ์ ๋ revision ์นด์ดํฐ ์๋ โ ๊ธฐ์กด ์ ๋ ์ต๋์น์์ ์ด์ด๋ถ์(์ฌ๊ธฐ๋ ์ revision ์ถฉ๋ ๋ฐฉ์ง). ์ดํ ์ธ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ. */\n getRepository(TwinEvent)\n .findOne({ where: { domain: { id: domainId }, instanceId: id }, order: { revision: 'DESC' } })\n .then(top => (inst.revision = top?.revision ?? 0))\n .catch(() => (inst.revision = 0))\n this.register(domainId, id, kind, board, 'running', 'mirror').catch(err => console.error('twin register fail', err))\n return inst\n }\n\n /**\n * live ์ด๋ฒคํธ ์ธ์ ์คํธ โ projector ๊ตฌ๋ + data(tag) ๋ฐฉ์ก(ํ๋ฃจํ์ ์ธ๋ฐ์ด๋ ๋์ฐฉ ์ง์ , command-routing ยง8.2).\n * reference ์ด๋ํฐ๊ฐ ๋ธ records โ ์ปค๋ face2-adapter.ingest โ CanonicalEnvelope ๋ฅผ ์ฌ๊ธฐ๋ก ๋ฐ์ด๋ฃ๋๋ค.\n * (State ์ฑ๋ ๋ธํ/์ ๋ ๊ฒฐ์ ์ ํ์ โ ์ค์ผ๋ ํค์ data(tag) ๋ฏธ๋ฌ ์ค์ฌ.)\n */\n static ingestLive(id: string, envelopes: CanonicalEnvelope[]): void {\n const inst = this.instances[id]\n if (inst?.mode !== 'live' || !inst.projector) return\n for (const e of envelopes) { inst.projector.apply(e); inst.oee?.apply(e) } // ๊ด์ธก(projector) + ๊ณ์ฐ(OEE ๋์ )\n // ์ ๋ ๊ฒฐ์ (๋ผ์ด๋ธ๋ sim ์ฒ๋ผ ์ด๋ฒคํธ ์์) โ ๋จ ์ด๋ฒคํธ๋ง๋ค DB write ํ๋ฉด ๋ถํํญ๋ฐ์ด๋ผ ๋ชจ์๋๋ค๊ฐ\n // coalescer tick ์์ ๋ฐฐ์น ๊ธฐ๋ก(๋ฐฉ์ก๊ณผ ๋์ผ ์ฃผ๊ธฐ). ํ์คํ ๋ฆฌ ๋
ธ๋ธยทํ์๋ผ์ธยท๋น์ฆ๋์ค ์์ฅ์ด ์ด ์ ๋์ ์ฝ๋๋ค.\n ;(inst.pendingJournal ?? (inst.pendingJournal = [])).push(...envelopes)\n if (inst.metrics) { inst.metrics.ingestedTotal += envelopes.length; inst.metrics._accIngest += envelopes.length } // ๊ณ์ธก(โฃ-1)\n // ๋ฐฉ์ก ๋ณํฉ(ingest-scale ยง1.1/ยง4.4) โ apply ๋ O(1)ยท์ธ๋ค. ๊ทธ๋ฌ๋ ๋ฐฉ์ก(snapshot O(state))์ ๋น์ธ(๋๊ท๋ชจ 5ms+)\n // ์ด๋ฒคํธ๋ง๋ค ๋ฐฉ์กํ๋ฉด ํญ๋ฐ โ dirty ๋ง ์ฐ๊ณ coalescer tick ์ด ์ฃผ๊ธฐ ๋ฐฉ์ก(๋ฐฉ์ก๋ฅ โ ์ธ์ ์คํธ๋ฅ ).\n inst.dirty = true\n this.ensureBroadcastCoalescer()\n }\n\n /** ๋ฐฉ์ก ๋ณํฉ ์ฃผ๊ธฐ(ms) โ ๋ฐฉ์ก๋ฅ ์ํ. ์ธ์ ์คํธ๊ฐ ์๋ฌด๋ฆฌ ๋นจ๋ผ๋ ์ด ์ฃผ๊ธฐ๋ก๋ง ๋ฐฉ์ก. */\n static BROADCAST_COALESCE_MS = 200\n private static broadcastTimer?: any\n\n /** live ๋ฐฉ์ก coalescer โ dirty ์ธ live ์ธ์คํด์ค๋ง ์ฃผ๊ธฐ์ ์ผ๋ก 1ํ ๋ฐฉ์ก(entitySigs ๋ก ๋ณ๊ฒฝ ์ํฐํฐ๋ง). */\n private static ensureBroadcastCoalescer(): void {\n if (this.broadcastTimer) return\n this.broadcastTimer = setInterval(() => this.flushLiveBroadcasts(), this.BROADCAST_COALESCE_MS)\n if (typeof this.broadcastTimer.unref === 'function') this.broadcastTimer.unref() // ์ข
๋ฃ ๋น์ฐจ๋จ\n }\n\n /** dirty live ์ธ์คํด์ค ๋ฐฉ์ก flush(์ฃผ๊ธฐ tick ๋๋ ๋ช
์ ํธ์ถ). ํ
์คํธ/์ฆ์ ๋ฐฉ์ก์ฉ์ผ๋ก public. */\n static flushLiveBroadcasts(): void {\n let anyLive = false\n const now = Date.now()\n for (const inst of Object.values(this.instances)) {\n if (inst.mode !== 'live') continue\n anyLive = true\n // ์ฒ๋ฆฌ๋ ๊ณ์ธก(โฃ-1) โ ์ฐฝ(โฅ1s)๋ง๋ค ์ ์
/๋ฐฉ์ก/์ ๋๋ฅ ๊ฐฑ์ . dirty ๋ฌด๊ด(์ ํด๋ฉด 0์ผ๋ก ์๋ ด). ๋ถํ๋ฅผ ์ฝ๋ ์ ํธ.\n const m = inst.metrics\n if (m) {\n const dt = (now - m._windowStartMs) / 1000\n if (dt >= 1) {\n m.ingestRate = Math.round(m._accIngest / dt)\n m.broadcastRate = Math.round((m._accBroadcast / dt) * 10) / 10\n m.journalRate = Math.round(m._accJournal / dt)\n m._accIngest = 0; m._accBroadcast = 0; m._accJournal = 0; m._windowStartMs = now\n }\n }\n if (!inst.dirty) continue\n inst.dirty = false\n // โ ์ํฐํฐ data(tag) ๋ฐฉ์ก โ ๋ณด๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ ๋ ๋.\n this.publishEntityData(inst)\n if (m) { m.broadcastTotal++; m._accBroadcast++ }\n // โข ์ ๋ ๋ฐฐ์น ๊ธฐ๋ก โ ๋ชจ์๋ ์ด๋ฒคํธ์ revision ๋ถ์ฌํด ๋ฒํฌ ์ ์ฅ(์ด๋ฒคํธ๋ง๋ค write ์๋).\n // revision ์นด์ดํฐ๋ ์ธ๋ฉ๋ชจ๋ฆฌ(startLive ์์ ์ ๋ high-water ๋ก 1ํ ์๋) โ tick ๋ง๋ค DB ์ง์ ์์.\n const batch = inst.pendingJournal\n if (batch?.length && inst.revision != null) {\n inst.pendingJournal = []\n const start = inst.revision\n inst.revision = start + batch.length\n if (m) { m.journaledTotal += batch.length; m._accJournal += batch.length; m.backlog = batch.length }\n this.persistBatch(inst.domainId, inst.id, batch, start).catch(err => console.error('twin live journal fail', err))\n }\n // โก State ์ฑ๋ ๋ฐฉ์ก โ \"๋ฐ๋์๋ค\"๋ ๊ฐ๋ฒผ์ด ์ ํธ๋ง(kind+revision). ๋งต ๊ตฌ๋
(subscribeTwinState)์ ์ด ์ ํธ์\n // scheduleRefresh(250ms ๋๋ฐ์ด์ค)โpollLive ๋ก ๋๋ฌผ์ด๋ด. ์ค๋
์ท(O(state))์ ๋ณด๋ ์ฌ๋์ด ๋ฌผ์ ๋๋ง 1ํ ๊ณ์ฐ.\n // (์ฌ๊ธฐ์ payload ๋ก ์ค๋
์ท์ ์ค์ผ๋ฉด ์๋ฌด๋ ์ ์ฝ๋๋ฐ tick ๋ง๋ค ํต์งธ๋ก ๋ ์ ์์ ๋ญ๋น โ ์ ํธ๋ง ๋ณด๋ธ๋ค.)\n pubsub.publish('twin-state', {\n twinState: { instanceId: inst.id, kind: 'delta', revision: inst.revision ?? 0 }\n })\n }\n if (!anyLive && this.broadcastTimer) { clearInterval(this.broadcastTimer); this.broadcastTimer = undefined } // live ์์ผ๋ฉด tick ์ ์ง\n }\n\n /**\n * ์ ๋ ํ ํ ์ค โ **๊ธฐ๋ก ๊ฒฝ๋ก๊ฐ ๋์ด๋ผ(๋ผ์ด๋ธ ๋ฒํฌยท์ฌ ๋จ๊ฑด) ํ ๋ชจ์์ ๋ฐ๋์ ํ ๊ณณ์์ ๋ง๋ ๋ค.**\n * ๋ ๊ณณ์ ๊ฐ์ ์ ์ผ๋ฉด ์น๊ฒฉ ๊ฒ์ ํค๊ฐ ํ์ชฝ์๋ง ์ฑ์์ง๊ณ , ๋ฐ์ฏค ๋น ์์ธ์ \"์ ๋์๋ ์๋๋ฐ\n * ๊ฒ์์ผ๋ก๋ ์ ๋์ค๋ ์ด๋ฒคํธ\" ๋ฅผ ๋ง๋ ๋ค โ ์ ๋์์ ๊ฐ์ฅ ๋์ ์ข
๋ฅ์ ๊ฒฐํจ์ด๋ค.\n */\n private static journalRow(repo: any, domainId: string, instanceId: string, e: any, revision: number, structureRev?: number) {\n return repo.create({\n domain: { id: domainId } as any,\n instanceId,\n tenantId: e?.tenantId,\n eventType: e?.eventType,\n revision,\n /* **์ด ์ฌ์ค์ด ์ผ์ด๋ ๊ณต์ฅ**์ ํจ๊ป ์ฐ๋๋ค โ ์ด๊ฒ์ด ์์ผ๋ฉด ๋์ค์ ๊ตฌ์กฐ๊ฐ ๋ฐ๋์์ ๋ ์ด ํ์\n ์ ๊ณต์ฅ์ ๋๊ณ ์ ๊ฒ ๋๊ณ , ๊ทธ๋ ์๋ ์ค๋น์์ ์ผ์ด ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. */\n ...(structureRev === undefined ? {} : { structureRev }),\n eventTime: e?.eventTime,\n ...twinEventKeys(e),\n payload: e\n })\n }\n\n /**\n * ์ด ํธ์์ด ์ง๊ธ ์ด๋ ๊ตฌ์กฐ๋ก ๋๋๊ฐ โ ์ด๋ฒคํธ์ ์ฐ์ ๋ฒํธ. ํ ๋ฒ ์ฝ๊ณ ์บ์ํ๋ค(์ฐ๊ธฐ๋ง๋ค ์กฐํ ๊ธ์ง).\n *\n * ์์ผ๋ฉด `undefined` ๋ค โ 0 ์ด ์๋๋ค. ๊ตฌ์กฐ ๋ฆฌ๋น์ ์ด ์๊ธฐ๊ธฐ ์ ์ ๋ง๋ค์ด์ง ํธ์์ ์์ง ๋ฆฌ๋น์ ์ด\n * ์๊ณ , ๊ทธ ์ฌ์ค์ 0 ์ด๋ผ๋ **์ ํจํด ๋ณด์ด๋ ๋ฒํธ**๋ก ์์ฅํ๋ฉด ์ ๋๋ค.\n */\n private static structureRevCache: Record<string, number> = {}\n static async structureRevOf(domainId: string, instanceId: string): Promise<number | undefined> {\n const key = `${domainId}:${instanceId}`\n const cached = this.structureRevCache[key]\n if (cached !== undefined) return cached\n const latest = await getRepository(TwinStructure).findOne({ where: { domain: { id: domainId }, instanceId }, order: { rev: 'DESC' } })\n if (latest) this.structureRevCache[key] = latest.rev\n return latest?.rev\n }\n\n /** live ์ ๋ ๋ฐฐ์น ๊ธฐ๋ก โ ๋ชจ์๋ CanonicalEnvelope ๋ค์ startRevision+1.. ์ ๋ถ์ฌํด ๋ฒํฌ ์ ์ฅ(coalescer tick ๋น 1ํ). */\n static async persistBatch(domainId: string, instanceId: string, envelopes: any[], startRevision: number): Promise<void> {\n const repo = getRepository(TwinEvent)\n const structureRev = await this.structureRevOf(domainId, instanceId)\n const rows = envelopes.map((e, i) => this.journalRow(repo, domainId, instanceId, e, startRevision + i + 1, structureRev))\n await repo.save(rows, { chunk: 500 })\n }\n\n /** ๋ ์ง์คํธ๋ฆฌ upsert(๋๋ฉ์ธ+instanceId ์ ๋ํฌ). status ์ธ์๋ก provision(stopped)/start(running) ๊ณต์ฉ. */\n static async register(\n domainId: string,\n instanceId: string,\n kind: string,\n board: BoardDef,\n status: 'running' | 'stopped' = 'running',\n realityMode?: RealityMode\n ): Promise<void> {\n const repo = getRepository(TwinInstance)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n await repo.save(\n repo.create({\n ...(existing ?? {}),\n domain: { id: domainId } as any,\n instanceId,\n kind,\n board,\n // ์ธ์คํด์คโ๊ณต๊ฐ 1๊ธ ๋งํฌ(space #3) โ board.spaceId/areaId ๋ฅผ ์ปฌ๋ผ์ผ๋ก ์น๊ฒฉ(dual-write). board JSON ๋ ์ ์ง(์ปค๋ยท๋ณต๊ตฌ์ฉ).\n spaceId: (board as any)?.spaceId ?? existing?.spaceId,\n areaId: (board as any)?.areaId ?? existing?.areaId,\n // ํ์ค ์ถ์ฒ ์ ์ธ(ยง0 โ ) โ ๋ช
์๊ฐ ์ฐ์ , ์์ผ๋ฉด ๊ธฐ์กด๊ฐ ๋ณด์กด(์ฌํ๋ก๋น์ ์ด ์ ์ธ์ ์ง์ฐ์ง ์๊ฒ).\n realityMode: realityMode ?? existing?.realityMode ?? undefined,\n status\n })\n )\n }\n\n /**\n * ๋ผ์ด๋ธ ๊ตฌ์กฐ ๋ณ์ด(resource.add ๋ฑ)๋ฅผ ์ ์ฅ๋ board ์ ๋ฐ์ โ ๋ฐํ์ ์ปค๋์ ๋ฌด๋ฒ๋ฅผ registry board.equipment ์ ๋๊ธฐ.\n * ์ด๊ฒ ์์ผ๋ฉด ๋ฐํ์์ ์ถ๊ฐ๋ผ๋(์ํยท์ ๋์ ๋ฐ์) ์ ์ฅ board ๋ ์๋ณธ์ด๋ผ ํ๋ก๋น์ ๋ ํธ์ง๊ธฐยท์ฌ๊ธฐ๋(loadBoard)์ด\n * ์ถ๊ฐ๋ถ์ ์๋๋ค. ๊ธฐ์กด board.equipment ํญ๋ชฉ์ ๋ณด์กด(homeLocation ์ ์ง)ํ๊ณ ์ id ๋ง append(์ถ๊ฐ ์์ location=homeLocation).\n * ์ขํ(layout)๋ง ๋ค๋ฃจ๋ register ์ ๋ฌ๋ฆฌ equipment ์งํฉ์ ๊ฐฑ์ ํ๋, ์ฌํ๋ก๋น์ (purge)์ด ์๋๋ผ in-place ๊ฐฑ์ ์ด๋ผ\n * ์ ๋์ ๋ณด์กด๋๋ค(์ถ๊ฐ๋ ์ด๋ฏธ equipment ๋ธํ๋ก ์ ๋๋จ โ replay ๋ id-keyed upsert ๋ผ ์ด์ค๊ณ์ฐ ์์).\n */\n static async syncBoardEquipment(domainId: string, instanceId: string): Promise<void> {\n const inst = this.instances[instanceId]\n const snap = inst?.kernel?.getSnapshot?.()\n if (!snap?.equipment) return\n const repo = getRepository(TwinInstance)\n const reg = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) return\n const board = reg.board as BoardDef\n const known = new Set((board.equipment ?? []).map(m => m.id))\n const added = snap.equipment\n .filter((m: any) => !known.has(m.id))\n .map((m: any) => ({ id: m.id, kind: m.kind, homeLocation: m.location }))\n if (!added.length) return\n board.equipment = [...(board.equipment ?? []), ...added]\n reg.board = board\n await repo.save(reg)\n }\n\n /**\n * ํ๋ก๋น์ ๋ โ ๋ ์ง์คํธ๋ฆฌ์ ๊ตฌ์กฐ(board)๋ฅผ ๋ฑ๋ก๋ง ํ๊ณ ๊ธฐ๋ํ์ง ์์(status='stopped').\n * ์ฌํ๋ก๋น์ ์ ๊ตฌ์กฐ ์๊ทธ๋์ฒ๊ฐ ๋ฐ๋๋ฉด(๋
ธ๋ยท๋ฌด๋ฒ ์งํฉ/์์ฑ ๋ณ๊ฒฝ) ๊ธฐ์กด ์ ๋์ purge ํ๋ค(ADR-0015):\n * board ๋ replay ์ ๋ง์คํฐ๋ผ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด ๊ณผ๊ฑฐ ์ด๋ฒคํธ์ ์ ์ ๊ฐ ๊นจ์ง๋ค. ์ขํ(layout)๋ง ๋ฐ๋๋ฉด ์ ๋ ๋ณด์กด.\n */\n static async provision(domainId: string, instanceId: string, kind: string, board: BoardDef, comment?: string): Promise<void> {\n if (this.instances[instanceId]) throw new Error(`instance \"${instanceId}\" is running โ stop before re-provisioning`)\n const repo = getRepository(TwinInstance)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n\n /*\n * **๊ตฌ์กฐ๊ฐ ๋ฐ๋์ด๋ ์ญ์ฌ๋ฅผ ์ง์ฐ์ง ์๋๋ค.**\n *\n * ์์ ์๋ ์๋ช
์ด ๋ค๋ฅด๋ฉด ๊ทธ ํธ์์ ์ ๋์ ํต์งธ๋ก ์ง์ ๋ค. ์ ์ง์ฐ๋ฉด ์ ์ด๋ฒคํธ๋ฅผ ์ ๊ณต์ฅ์ ๋๊ณ \n * ์ ๊ฒ ๋์ด ์ด๋ ฅ์ด ๊ฑฐ์ง๋ง์ ํ๊ธฐ ๋๋ฌธ์ด๋ค โ ๋ถ์ค๊ฐ ๋์ด๋ ์์ ์ ์ฌ์ค์ ์ฌ์ฏ ๊ฐ์ง๋ฆฌ ๊ณต์ฅ์\n * ์ ์ผ๋ฉด ๊ทธ๋ ์๋ ๋ถ์ค์์ ์ผ์ด ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ์ ํ์ง๊ฐ **์ญ์ฌ๋ฅผ ์๊ฑฐ๋ ๊ฑฐ์ง๋ง์\n * ํ๊ฑฐ๋** ๋๋ฟ์ด์๊ณ , ๊ทธ๋์ ๊ณต์ฅ์ ๊ณ ์น ๋๋ง๋ค ์ด๋ ฅ์ ๋ฒ๋ ค์ผ ํ๋ค.\n *\n * ์ด์ ์
์งธ ๊ธธ๋ก ๊ฐ๋ค: ๋ฐ๋ ๊ตฌ์กฐ๋ฅผ **์ ๋ฆฌ๋น์ **์ผ๋ก ๋จ๊ธฐ๊ณ , ์์ผ๋ก ์ฐ์ด๋ ์ด๋ฒคํธ๊ฐ ๊ทธ ๋ฒํธ๋ฅผ\n * ๋ฌ๊ณ ๋ค๋๋ค. ์ฌ์์ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ ์ง์ ์์ ๊ฐ์ํ ๋ค ์ด์ด ์ ๋๋ค(`replaySegments`).\n */\n await this.recordStructure(domainId, instanceId, board, comment)\n await this.register(domainId, instanceId, kind, board, existing?.status === 'running' ? 'stopped' : (existing?.status as any) ?? 'stopped')\n }\n\n /**\n * ์ด ๊ตฌ์กฐ๋ฅผ ๋ฆฌ๋น์ ์ผ๋ก ๋จ๊ธฐ๊ณ ๊ทธ ๋ฒํธ๋ฅผ ๋๋ ค์ค๋ค โ **๋ฐ๋์์ ๋๋ง** ์ ๋ฒํธ๊ฐ ์๊ธด๋ค.\n *\n * ํ๋ก๋น์ ๋์ ๋ถํ
๋ง๋ค ๋ค์ ๋๋๋ฐ, ๊ทธ๋๋ง๋ค ๋ฆฌ๋น์ ์ด ๋๋ฉด ์ด๋ ฅ์ด ๋ป ์๋ ๋ง๋๋ก ์๊ฒ ์ชผ๊ฐ์ง๋ค.\n * ๊ทธ๋์ **๊ตฌ์กฐ ์๋ช
์ด ๊ฐ์ผ๋ฉด ์๋ ๋ฆฌ๋น์ ์ ๊ทธ๋๋ก ์ด๋ค.**\n */\n static async recordStructure(domainId: string, instanceId: string, board: BoardDef, comment?: string): Promise<number> {\n const repo = getRepository(TwinStructure)\n const signature = this.structureFingerprint(board)\n const latest = await repo.findOne({ where: { domain: { id: domainId }, instanceId }, order: { rev: 'DESC' } })\n\n /*\n * **์ ์ฅ๋ ์ง๋ฌธ์ด ์๋๋ผ ์ ์ฅ๋ ๊ณต์ฅ๊ณผ ๋น๊ตํ๋ค.**\n *\n * ์ง๋ฌธ ๊ณ์ฐ ๋ฐฉ์์ ํ ๋ฒ์ด๋ผ๋ ๋ฐ๊พธ๋ฉด(์๋ฌธ โ ํด์๋ก ๋ฐ๊ฟจ๋ค) ์ ์ฅ๋ ๋ฌธ์์ด์ ์ ๋ถ ์ ๋ฐฉ์์\n * ๊ฒ์ด๋ผ ๋ฌด์๊ณผ๋ ์ ๋ง๋๋ค. ๊ทธ๋ฌ๋ฉด **์๋ฌด๊ฒ๋ ์ ๋ฐ๋ ํธ์๋ค์ด ์ ๋ถ \"๊ตฌ์กฐ๊ฐ ๋ฐ๋์๋ค\"** ๋ก\n * ๊ธฐ๋ก๋๋ค โ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋๊ณ , ์ฌ๊ธฐ๋ ํ ๋ฒ์ ๋ฆฌ๋น์ ์ด ํต์งธ๋ก ํ๋์ฉ ๋์๋ค.\n *\n * ๊ทธ๋์ ์ ๋ง์ ๋ ํ ๋ฒ ๋ ๋ฌป๋๋ค: ์ ์ฅ๋ **๋ณด๋**๋ก ์ง๋ฌธ์ ๋ค์ ๊ณ์ฐํ๋ฉด ๊ฐ์๊ฐ? ๊ฐ๋ค๋ฉด\n * ๊ณต์ฅ์ ๊ทธ๋๋ก์ด๊ณ ์ง๋ฌธ ํ๊ธฐ๋ง ๋ก์ ๊ฒ์ด๋, ๋ฆฌ๋น์ ์ ๋ง๋ค์ง ์๊ณ ํ๊ธฐ๋ง ๊ณ ์น๋ค.\n */\n if (latest && latest.signature !== signature && this.structureFingerprint(latest.board as BoardDef) === signature) {\n latest.signature = signature\n await repo.save(latest)\n }\n\n if (latest?.signature === signature) {\n this.structureRevCache[`${domainId}:${instanceId}`] = latest.rev\n return latest.rev\n }\n\n const rev = (latest?.rev ?? 0) + 1\n await repo.save(repo.create({ domain: { id: domainId } as any, instanceId, rev, signature, board: board as any, ...(comment ? { comment } : {}) }))\n this.structureRevCache[`${domainId}:${instanceId}`] = rev\n /* ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด ์ฌ๊ตฌ์ฑ ์บ์๋ ์ ๊ณต์ฅ์ ๊ฒ์ด๋ค โ ๋ฒ๋ฆฐ๋ค(์ง์ฐ๋ ๊ฑด ์บ์๋ฟ, ์ฌ์ค์ ๋จ๋๋ค). */\n delete this.recovered[instanceId]\n if (latest) console.info(`[twin-engine] \"${instanceId}\" structure changed โ revision ${rev} (history kept; older events stay under revision ${latest.rev}).`)\n return rev\n }\n\n /**\n * ์ด ํธ์์ด ๊ฑฐ์ณ ์จ ๊ตฌ์กฐ๋ค โ **๋ฌด์์ด ์ธ์ ๋ฌ๋ผ์ก๋.**\n *\n * ๋ฆฌ๋น์ ์ ๊ทธ ์์ ๊ณต์ฅ์ ํต์งธ๋ก ๋ด์ง๋ง(์ฌ์์ ํ์ํ๋ค), ์ฌ๋์ด ๋ณด๊ณ ์ถ์ ๊ฒ์ ํต์งธ๊ฐ ์๋๋ผ\n * ์ฐจ์ด๋ค. ๋ณด๋๋ ๋นผ๊ณ **์ฐจ์ด ์์ฝ๋ง** ๋ด๋ณด๋ธ๋ค โ 62KB ์ง๋ฆฌ ๋ณด๋๋ฅผ ํ๋ฉด์ ์ค์ด ๋ณด๋ผ ์ด์ ๊ฐ ์๋ค.\n */\n static async structureHistory(\n domainId: string,\n instanceId: string\n ): Promise<{ rev: number; createdAt?: Date; comment?: string; events: number; diff: StructureDiff }[]> {\n const revs = await getRepository(TwinStructure).find({ where: { domain: { id: domainId }, instanceId }, order: { rev: 'ASC' } })\n if (!revs.length) return []\n\n /* ๋ฆฌ๋น์ ๋ง๋ค ๊ทธ ์๋์์ ๋ช ๊ฑด์ด ์ผ์ด๋ฌ๋ โ ์ด๋ ฅ์ ๋ฌด๊ฒ๋ฅผ ๋ณด์ฌ์ค๋ค(์งง๊ฒ ์ค์ณ๊ฐ ๊ตฌ์กฐ์ธ์ง). */\n const counts = new Map<number | null, number>()\n for (const row of await getRepository(TwinEvent)\n .createQueryBuilder('e')\n .select('e.structureRev', 'rev')\n .addSelect('COUNT(1)', 'n')\n .where('e.domain = :domainId', { domainId })\n .andWhere('e.instanceId = :instanceId', { instanceId })\n .groupBy('e.structureRev')\n .getRawMany())\n counts.set(row.rev === null || row.rev === undefined ? null : Number(row.rev), Number(row.n))\n\n /* ๋ฒํธ ์๋ ์ ํ์ **๊ฐ์ฅ ์ค๋๋ ๋ฆฌ๋น์ **์ ๋ชซ์ด๋ค โ ์ฌ์์ด ๊ทธ๋ ๊ฒ ์ ์ผ๋ฏ๋ก ์ธ๋ ๊ฒ๋ ๊ฐ์์ผ ํ๋ค. */\n const oldest = revs[0].rev\n const legacy = counts.get(null) ?? 0\n\n return revs.map((r, i) => ({\n rev: r.rev,\n createdAt: r.createdAt,\n ...(r.comment ? { comment: r.comment } : {}),\n events: (counts.get(r.rev) ?? 0) + (r.rev === oldest ? legacy : 0),\n diff: diffStructures(i === 0 ? undefined : (revs[i - 1].board as any), r.board as any)\n }))\n }\n\n /** ์ง๊ธ ์ฐ์ด๋ ๊ตฌ์กฐ ๋ฆฌ๋น์ โ ์ด๋ฒคํธ์ ์ฐ์ ๋ฒํธ. ์์ง ์์ผ๋ฉด ๊ธฐ๋กํ๋ฉฐ ๋ง๋ ๋ค. */\n static async currentStructureRev(domainId: string, instanceId: string, board?: BoardDef): Promise<number | undefined> {\n const latest = await getRepository(TwinStructure).findOne({ where: { domain: { id: domainId }, instanceId }, order: { rev: 'DESC' } })\n if (latest) return latest.rev\n return board ? this.recordStructure(domainId, instanceId, board) : undefined\n }\n\n /** ๊ตฌ์กฐ ๋์ผ์ฑ ์ง๋ฌธ โ ์ขํ(layout) ๋ฑ ๋ทฐ ๊ด์ฌ์ฌ๋ ์ ์ธํ๊ณ ์ปค๋์ด ๋ณด๋ ์์ยท์ฉ๋ยท๋ฌด๋ฒ๋ง. */\n /**\n * ์ง๋ฌธ์ **64์๋ก ์ค์ธ๋ค** โ ์ปฌ๋ผ์ด varchar(64) ๋ค.\n *\n * ์๋ฌธ ์ง๋ฌธ์ ์๋ฆฌยท์ค๋น๋ฅผ ์ ๋ถ ์ด์ด ๋ถ์ธ ๋ฌธ์์ด์ด๋ผ ํฐ ๊ณต์ฅ์์๋ ์๋ง ์๊ฐ ๋๋ค. sqlite ๋\n * ๊ธธ์ด๋ฅผ ๊ฐ์ ํ์ง ์์ ๊ทธ๋ฅ ๋ค์ด๊ฐ์ง๋ง **Postgres ๋ ๊ฑฐ๊ธฐ์ ํฐ์ง๋ค** โ ๊ฐ๋ฐ์์๋ ๋ฉ์ฉกํ๊ณ \n * ์ด์์์๋ง ์ฃฝ๋ ์ข
๋ฅ์ ์คํจ๋ค. ๋น๊ต์๋ง ์ฐ๋ ๊ฐ์ด๋ฏ๋ก ํด์๋ก ์ถฉ๋ถํ๋ค.\n */\n private static structureFingerprint(board: BoardDef): string {\n return createHash('sha256').update(this.structureSignature(board)).digest('hex')\n }\n\n private static structureSignature(board: BoardDef): string {\n const locations = [...(board.locations ?? [])]\n .map(n => `${n.id}:${n.type}:${n.capacity}`)\n .sort()\n .join('|')\n const equipment = [...(board.equipment ?? [])]\n .map(m => `${m.id}:${m.kind}:${m.homeLocation}`)\n .sort()\n .join('|')\n return `N[${locations}]M[${equipment}]`\n }\n\n /** ๋ ์ง์คํธ๋ฆฌ board ๋ก ๊ธฐ๋(ํ๋ก๋น์ ๋ ์ธ์คํด์ค start). board ์ธ์ ์์ด ์ ์ฅ๋ ๊ตฌ์กฐ๋ก ์ฌ๊ธฐ๋. */\n static async startFromRegistry(domainId: string, instanceId: string, realityMode?: RealityMode): Promise<InstanceRuntime> {\n if (this.instances[instanceId]) return this.instances[instanceId]\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) throw new Error(`instance \"${instanceId}\" not provisioned (no board)`)\n\n /*\n * ์์คํํธ ์ฌ๋ฃ๋ฅผ **์ฌ๊ธฐ์ ํ์คํ ํ๋ณดํ๋ค.**\n * `start()` ๋ ๋๊ธฐ๋ผ ์ค์ค๋ก ์บ์๋ฅผ ์ฝ์ ์ ์์ด์ `recovered` ์ ๋ฏธ๋ฆฌ ๋ด๊ฒจ ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๋๋ฐ,\n * ๊ทธ๊ฑด `bootstrap()` ์ด ๋จผ์ ๋์์ ๋๋ง ์ฐธ์ด๋ค. ๋ถํ
์์์ ๊ธฐ๋๋ฉด ์ด๋ค ๋ ์ ์ฌ๊ณ ๊ฐ ์ด์๋๊ณ \n * ์ด๋ค ๋ ์ ์กฐ์ฉํ ๋น ์ฑ๋ก ๋ฌ๋ค โ ์ฌํ๋์ง ์๋ ๊ฒฐํจ์ด ๊ฐ์ฅ ๋์๋ค.\n * ์ฒดํฌํฌ์ธํธ ์บ์ ์ฐ์ (O(1) + ๋ผ์ด๋ธ ํ์์ํ ๋ณด์กด), ์์ผ๋ฉด ์ ๋ replay ํด๋ฐฑ(๋ถํ
๊ณผ ๊ฐ์ ์์).\n */\n if (!this.recovered[instanceId] && reg.purpose !== 'bench') {\n const cached = await this.loadSnapshot(domainId, instanceId).catch(() => null)\n if (cached?.state) {\n this.recovered[instanceId] = { revision: cached.revision, state: cached.state }\n } else {\n const state = await this.recover(domainId, instanceId).catch(() => null)\n if (state) this.recovered[instanceId] = { revision: state.revision, state }\n }\n }\n\n /*\n * ์ ๋์ ๋จ์ ์๋ ๋ง์ง๋ง ๋ฒํธ โ **๋ชจ๋์ ๋ฌด๊ดํ๊ฒ** ์ด๊ฒ์ ์ด์ด ์ผ๋ค.\n *\n * ์ ๋์ ์ด๊ธฐํํ๊ณ ๊ธฐ๋ํ๋ ๋ชจ๋(sim-experiment)๋ผ๋ฉด ์ด ๊ฐ์ด 0์ด๋ผ ์๋ฌด ์ํฅ์ด ์๋ค. ๊ท์น์\n * ๋ชจ๋๋ณ๋ก ๊ฐ๋ฅด์ง ์๋ ์ด์ : \"์ ๋์ด ๋น์ด ์์ง ์์ผ๋ฉด ๊ทธ ๋ค๋ถํฐ\" ํ๋๋ฉด ์ด๋ ๋ชจ๋์์๋\n * ๊ฒน์น ์ ์๊ณ , ๋ชจ๋๊ฐ ๋์ด๋ ์ด ์๋ฆฌ๋ฅผ ๋ค์ ์๋ณผ ์ผ์ด ์๋ค.\n */\n const last = await getRepository(TwinEvent)\n .createQueryBuilder('e')\n .select('MAX(e.revision)', 'max')\n .where('e.domain = :domainId', { domainId })\n .andWhere('e.instanceId = :instanceId', { instanceId })\n .getRawOne()\n\n return this.start(\n instanceId,\n domainId,\n reg.kind ?? 'wms',\n reg.board as BoardDef,\n realityMode ?? (reg.realityMode as RealityMode) ?? undefined,\n reg.purpose ?? undefined,\n Number(last?.max ?? 0) || 0\n )\n }\n\n /**\n * ์ ์ธ ๊ธฐ๋ฐ ๋ถํ
(ยง0 ํ๋ ์ โ โ ๋ถํ
๊ฑฐ๋ ๋งคํ) โ ํธ์์ด ์ ์ธํ realityMode ์ ๋ฐ๋ผ ์ฌ๊ธฐ๋ ๋ฐฉ์์ ๊ฐ๋ฅธ๋ค.\n * ๋ถํ
๊ฒฝ๋ก๋ฅผ ํ ๊ณณ์ ๋ชจ์ \"๋ฐํ์ โ ํ์ค\" ๋ฒ์ฃผ์ค๋ฅ๋ฅผ ์ฝ๋๋ก ๊ฐ์ ํ๋ค.\n * - 'mirror' : ํ์ค=์ธ๋ถ ์ค๋ฌผ โ startLive(์ฌ๋๊ธฐ). ์ด๋ฒคํธ๋ ์ด๋ํฐ ingest ๋ก ์ ์
, ์ปค๋ tick ์์.\n * - 'sim-world' : ์์ฑ ํ์๋ผ์ธ ์ง์ โ ์ ๋ ๋ณด์กด + resume(ํ์ค ์ด์ด๊ฐ).\n * โ GATE(ยง8 โกโข): ์ปค๋ ์ํ ์ง๋ ฌํ/์ฌ๊ฐ๊ฐ ์์ง ์์ด ์ง์ง resume ๋ถ๊ฐ โ ์ค ํ์ยท์ค๋ถํ ์ ๊ตฌํ.\n * ๊ทธ๋๊น์ง๋ ์ ๋์ ๋ณด์กดํ๋ revision ์ถฉ๋์ ํผํ๋ ค fresh ๋ก ๊ธฐ๋ํ๊ณ , ์ ์ธ๊ณผ ๊ตฌํ์ ๊ฐ๊ทน์ ํฌ๊ฒ ๊ฒฝ๊ณ ํ๋ค.\n * - 'sim-experiment' : seed ์ฌํ โ resetJournal + fresh ๊ธฐ๋(๋ฐฑ์ง ์์์ด ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์ ์ธ๋ ๊ฑฐ๋).\n * ๋ฐํ: ๊ธฐ๋๋ InstanceRuntime.\n */\n static async bootDeclared(domainId: string, instanceId: string, mode: RealityMode = DEFAULT_REALITY_MODE): Promise<InstanceRuntime> {\n if (mode === 'mirror') {\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) throw new Error(`instance \"${instanceId}\" not provisioned (no board)`)\n return this.startLive(instanceId, domainId, reg.kind ?? 'wms', reg.board as BoardDef)\n }\n if (mode === 'sim-world') {\n /*\n * **์ด์ด์ง๋ ํ์ค** โ ์ ๋์ ์ง์ฐ์ง ์๋๋ค.\n *\n * ์์ ์๋ ์ฌ๊ธฐ์ ์ ๋์ ์ง์ฐ๊ณ fresh ๋ก ๋์ ๋ค. resume ๊ธฐ๊ณ์ฅ์น๊ฐ ์๋ค๊ณ ๋ดค๊ธฐ ๋๋ฌธ์ธ๋ฐ,\n * ์ค์ ๋ก ์๋ ๊ฒ์ **๋ฒํธ ์ด์ด ์ธ๊ธฐ ํ๋**์๋ค: ์ํ ๋ณต์์ ์ด๋ฏธ `startFromRegistry` ๊ฐ\n * ์ ๋ ์ฌ์(๋๋ ์ฒดํฌํฌ์ธํธ)์ผ๋ก ํ๊ณ ์์๊ณ , ๋งํ ๊ฒ์ ์ปค๋์ด ๋ฆฌ๋น์ ์ 0๋ถํฐ ๋ค์ ์ธ์ด\n * ๊ธฐ์กด ํ๊ณผ ๊ฒน์น๋ ๋ฌธ์ ์๋ค. ๊ทธ ํ๋๋ฅผ `resumeRevision` ์ผ๋ก ํ์์ผ๋ฏ๋ก ์ด์ ์ด์ด ๊ฐ๋ค.\n *\n * ์์ง ์ด์ด์ง์ง ์๋ ๊ฒ(์ ์งํ๊ฒ): ์๋๋ฆฌ์ค ์์ฑ๊ธฐ์ ๋์ ํ๋ฆ์ ์ฌ๊ธฐ๋์ ์ด์ด์ง์ง ์๋๋ค โ\n * ๊ฐ์ ์จ์์์ ๋ค์ ์์ํ๋ฏ๋ก ์๊ทน์ ํจํด์ด ์ฌ๊ธฐ๋ ์ง์ ์์ ํ ๋ฒ ๋๊ธด๋ค. ์์ธ ์ฌ์ค๊ณผ\n * ์ํ๋ ์ด์ด์ง๊ณ , ์์ผ๋ก ์ผ์ด๋ ์ผ์ ๋ฌด์์ ์์๋ง ์๋ก ์์ํ๋ค.\n */\n return this.startFromRegistry(domainId, instanceId, 'sim-world')\n }\n // sim-experiment(๊ธฐ๋ณธ): seed ์ฌํ โ ์ ๋ ์ด๊ธฐํ ํ revision 0 ๋ถํฐ ์ฌ์คํ.\n await this.resetJournal(domainId, instanceId)\n return this.startFromRegistry(domainId, instanceId, 'sim-experiment')\n }\n\n /**\n * ์ ๋ ์ด๊ธฐํ โ ์ธ์คํด์ค ์ด๋ฒคํธ ์ ๋ purge(๋ ์ง์คํธ๋ฆฌยท์ํ๋ ์ ์ง).\n * ๋ฐ๋ชจ fresh-start ์ฉ: ๋งค ๋ถํ
seed ๋ถํฐ ์๋ก ์คํํ๋ ๋ฐ๋ชจ์์, ๋ณต๊ตฌ๋ณธ ํ๊ธฐ ํ revision 0 ๋ถํฐ ์ฌ์คํํ๋ฉด\n * ์ ๋ฐ๊ณผ revision ์ด ๊ฒน์ณ ์ ๋์ด ์ค์ผ๋๋ค โ start ์ ์ ํธ์ถํด ํ์ฌ ๋ฐ๋ง ๋จ๊ธด๋ค.\n */\n static async resetJournal(domainId: string, instanceId: string): Promise<void> {\n await getRepository(TwinEvent).delete({ domain: { id: domainId } as any, instanceId })\n delete this.recovered[instanceId]\n }\n\n /** ์ญ์ โ ์ ์ง + ๋ ์ง์คํธ๋ฆฌ ์ญ์ + ์ ๋ purge(domain ์ค์ฝํ). */\n static async remove(domainId: string, instanceId: string): Promise<void> {\n await this.stop(instanceId)\n delete this.recovered[instanceId]\n await getRepository(TwinEvent).delete({ domain: { id: domainId } as any, instanceId })\n await getRepository(TwinInstance).delete({ domain: { id: domainId } as any, instanceId })\n }\n\n /** ๊ด๋ฆฌ ๋ชฉ๋ก โ domain ์ ๋ฑ๋ก ์ธ์คํด์ค ์ ์ฒด(๋ผ์ด๋ธ ์ฌ๋ถยท์ต์ ์ ๋ revisionยท๋
ธ๋/๋ฌด๋ฒ ์ ํฌํจ). */\n static async list(domainId: string): Promise<any[]> {\n const rows = await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })\n const out: any[] = []\n for (const r of rows) {\n const board = (r.board as BoardDef) ?? { locations: [], equipment: [] }\n const last = await getRepository(TwinEvent).findOne({\n where: { domain: { id: domainId } as any, instanceId: r.instanceId },\n order: { revision: 'DESC' }\n })\n out.push({\n instanceId: r.instanceId,\n kind: r.kind,\n status: r.status,\n spaceId: r.spaceId, // co-location: ๊ฐ์ spaceId ์ธ์คํด์ค๋ค์ด ํ ๊ณต๊ฐ(๊ณต์ฅ) ๊ณต์ โ ๊ณต๊ฐ๋ทฐ ์ง์ฝ ํค(G7)\n realityMode: r.realityMode ?? DEFAULT_REALITY_MODE, // ํ์ค ์ถ์ฒ ์ ์ธ(ยง0 โ ) โ mirror/sim-world/sim-experiment\n purpose: r.purpose ?? 'operational', // ์ด์ vs ๋ฒค์น ์ฌ๋ณธ(1๊ธ ๊ตฌ๋ณ โ ์ด๋ฆ ์ ๋์ฌ ์๋)\n copyOf: r.copyOf ?? undefined,\n running: !!this.instances[r.instanceId],\n revision: last?.revision ?? 0,\n locationCount: board.locations?.length ?? 0,\n equipmentCount: board.equipment?.length ?? 0\n })\n }\n return out\n }\n\n /** ๋ ๊ฑฐ์ ๋ฒค์น ์์ฌ ๊ฐ๋ โ purpose ๋์
์ ๋ง๋ค์ด์ง ๋ฒค์น/๋ถํ ๊ณต๊ฐ(์ด๋ฆ ๊ท์ฝ)๊น์ง ๊ฑธ๋ฌ๋ธ๋ค. */\n static isBenchSpace(spaceId?: string): boolean {\n return !!spaceId && (/^bench-/.test(spaceId) || spaceId === 'rosarito-load' || /^loadtest/.test(spaceId))\n }\n\n /** ์ด์ ๊ณต๊ฐ ๋ชฉ๋ก(๋ฒค์น ์์ค ์ ํ๊ธฐ) โ ์ด๋ฆยท๊ท๋ชจ ํฌํจ, ๋ฒค์น ์ฌ๋ณธยท์์ฌ ์ ์ธ. */\n static async listSpaces(domainId: string): Promise<{ spaceId: string; name: string; instances: number; locations: number; equipment: number }[]> {\n const nameOf = new Map((await getRepository(TwinSpace).find({ where: { domain: { id: domainId } } })).map(s => [s.spaceId, s.name]))\n const insts = await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })\n const agg = new Map<string, { spaceId: string; name: string; instances: number; locations: number; equipment: number }>()\n for (const r of insts) {\n if (!r.spaceId || r.purpose === 'bench' || this.isBenchSpace(r.spaceId)) continue // ๋ฒค์นยท์์ฌ ์ ์ธ\n const board: any = r.board ?? {}\n const a = agg.get(r.spaceId) ?? { spaceId: r.spaceId, name: nameOf.get(r.spaceId) ?? r.spaceId, instances: 0, locations: 0, equipment: 0 }\n a.instances++\n a.locations += board.locations?.length ?? 0\n a.equipment += board.equipment?.length ?? 0\n agg.set(r.spaceId, a)\n }\n return [...agg.values()]\n }\n\n /** ์ธ์คํด์ค ๋ชฉ์ ํ์(์ด์/๋ฒค์น) ์ค์ โ ๋ฒค์น ์ฌ๋ณธ์ 1๊ธ ์์ฑ์ผ๋ก ๊ตฌ๋ณ(์ด๋ฆ ์ ๋์ฌ ์๋). */\n static async setPurpose(domainId: string, instanceId: string, purpose: 'operational' | 'bench', copyOf?: string): Promise<void> {\n await getRepository(TwinInstance).update({ domain: { id: domainId } as any, instanceId }, { purpose, copyOf: copyOf ?? null } as any)\n }\n\n /**\n * ๊ณต๊ฐ ๊ตฌ์กฐ ํ๋
โ ์์ ๋ณต์ (๋ฒค์น ์ฌ๋ณธ)์ ์์ค. ์ ์ฅ๋ฌผ์ด board(์์)ยทTwinSpace.content(์น์ยทgeoยทํํ)ยทTwinArea(์์ญ)๋ก\n * ๋ถ์ฐ๋ผ ์์ผ๋ฏ๋ก ์
์ ๋ชจ์ ๋๋ ค์ค๋ค. ํธ์ถ์ธก์ด ReferenceMaster ๋ก ์ฌ๊ตฌ์ฑ โ ์ฌ์๋ณ โ ingestMaster.\n */\n static async spaceStructure(domainId: string, spaceId: string): Promise<{ name?: string; content: any; areas: any[]; instances: { instanceId: string; kind?: string; board: any }[] } | null> {\n const sp = await getRepository(TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId } })\n const areas = sp\n ? (await getRepository(TwinArea).find({ where: { domain: { id: domainId } as any, space: { id: sp.id } as any } })).map(a => ({ id: a.areaId, type: a.type, name: a.name, parentId: a.parentId, layout: a.layout }))\n : []\n const insts = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n if (!insts.length) return null\n return { name: sp?.name, content: sp?.content ?? {}, areas, instances: insts.map(i => ({ instanceId: i.instanceId, kind: i.kind, board: i.board })) }\n }\n\n /** ๊ณต๊ฐ(+ํํยท์์ญ) ์ญ์ โ ๋ฒค์น ์ ๋ฆฌ ๋ฑ. ํธ์ถ์ธก์ด ๋ฐ์ธ๋ฉ ์ธ์คํด์ค๋ฅผ ๋จผ์ ์ ๊ฑฐํ๋ ์ ์ (๊ฐ๋ ์์). deleteTwinSpace ๋ฆฌ์กธ๋ฒ์ ๋ํ. */\n static async deleteSpace(domainId: string, spaceId: string): Promise<void> {\n const space = await getRepository(TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId } })\n if (space) {\n const reps = await getRepository(TwinSpaceRepresentation).find({ where: { domain: { id: domainId }, space: { id: space.id } } })\n for (const rep of reps) await getRepository(TwinSpaceArea).delete({ domain: { id: domainId } as any, representation: { id: rep.id } as any })\n await getRepository(TwinSpaceRepresentation).delete({ domain: { id: domainId } as any, space: { id: space.id } as any })\n await getRepository(TwinArea).delete({ domain: { id: domainId } as any, space: { id: space.id } as any })\n }\n await getRepository(TwinSpace).delete({ domain: { id: domainId } as any, spaceId })\n }\n\n /**\n * Face2 ๋ง์คํฐ ์ธ์ ์คํธ(ADR-0018) โ ๋ ํผ๋ฐ์ค ์์คํ
(์ค ๋๋ ๊ฐ์)์ ๋ง์คํฐ๋ฅผ ์ฝ์ด ํธ์์ ์์ฑ.\n * ์ํฐํฐ๋ฅผ ์๋ฐฐ์ /๋ฐ๋ช
ํ์ง ์๊ณ ๋ง์คํฐ์์ ๋ฐ์: ๊ณต๊ฐ(Space) upsert + ์ธ์คํด์ค provision(๋ฏธ๊ธฐ๋).\n * ๋
ธ๋ํ์
์ ์ปค๋ ์นดํ๋ก๊ทธ๋ก ๊ฒ์ฆ(warning). start ๋ ํธ์ถ์ธก(bootstrap/mutation)์ด ๊ฒฐ์ .\n */\n static async ingestMaster(domainId: string, master: ReferenceMaster): Promise<{ instanceId: string; spaceId: string; warnings: string[] }> {\n const { board, spaceContent, warnings } = masterToTwin(master, DOMAIN_CATALOG)\n const spaceId: string = board.spaceId\n const repo = getRepository(TwinSpace)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, spaceId } })\n /*\n * ๊ณต์ ๊ณต๊ฐ(์ฌ๋ฌ ํธ์์ด ํ spaceId, N:1) content ๋ณํฉ โ ๋ง์ง๋ง ์ธ์ ์คํธ๊ฐ ํต์งธ๋ก ๋ฎ์ด์จ area(๊ทธ๋ฃน)ยทํํ์ด\n * ์ ์ค๋๋ ๋ฌธ์ ๋ณด์ . areaยทlandmark ๋ id ํฉ์งํฉ, representations ๋ ๋น์ด์์ง ์์ ์ชฝ ๋ณด์กด, ๋๋จธ์ง๋ first-wins.\n */\n const prev: any = existing?.content ?? {}\n const cur: any = spaceContent\n const unionById = (a: any[] = [], b: any[] = []) => {\n const m = new Map<string, any>()\n for (const x of [...a, ...b]) if (x?.id) m.set(x.id, x)\n return [...m.values()]\n }\n const mergedContent = {\n width: prev.width ?? cur.width,\n depth: prev.depth ?? cur.depth,\n unit: prev.unit ?? cur.unit,\n geo: prev.geo ?? cur.geo,\n primaryId: prev.primaryId ?? cur.primaryId,\n representations: (cur.representations?.length ? cur.representations : prev.representations) ?? [],\n // areas ๋ content ์ ๋ ์ด์ ์ฐ์ง ์๋๋ค(area ๋จ์ผํ P3) โ ๊ถ์=TwinArea. ์๋ TwinArea ๋ก๋ง ๊ธฐ๋ก.\n landmarks: unionById(prev.landmarks, cur.landmarks)\n }\n /*\n * **ํ์ฅ์ ์๊ฐ ๊ธฐ์ค์ ๊ณต๊ฐ์ ๋จ๊ธด๋ค** โ ๊ทธ๋ฌ์ง ์์ผ๋ฉด ๊ณต๊ฐ์ด ๊ถ์์ธ๋ฐ ๊ทธ ๊ฐ์ ์์ํ ๋ชจ๋ฅธ๋ค.\n *\n * ๋ง์คํฐ๊ฐ ๋ณด๋์ ์คํ์
์ ์ค์ด ์ฃผ๋ฏ๋ก ๊ฐ ํ๋ก๋น์ ๋ํ ํธ์์ ๋ง๊ฒ ๋์ง๋ง, `withSpaceTimeBase` ๊ฐ\n * ์ฝ๋ ๊ณณ์ **๊ณต๊ฐ**์ด๋ค. ์ฌ๊ธฐ์ ์ฎ๊ธฐ์ง ์์ผ๋ฉด ๊ณต๊ฐ์ ์๊ฐ๋๊ฐ ๊ณ์ ๋น์ด ์๊ณ , ์ฌ์ฉ์๊ฐ ํ๋ฉด์์\n * ๊ทธ๊ฒ์ ๋ณด๊ฑฐ๋ ๊ณ ์น ์๋ ์๋ค(๋ง๋ค๊ณ ์์ง ์์ผ๋ฉด ์๋ ๊ฒ์ด๋ค).\n *\n * **์ฌ์ฉ์๊ฐ ๊ณ ์น ๊ฐ์ ๋ง์คํฐ๊ฐ ๋ฎ์ง ์๋๋ค** โ ์ด๋ฏธ ์์ผ๋ฉด ๊ทธ๋๋ก ๋๋ค(ํ์ฅ์ด ์ ๋ณธ์ ์ด๊ธด๋ค).\n */\n const timezone = existing?.timezone || master.space.timezone\n const savedSpace = await repo.save(repo.create({ ...(existing ?? {}), domain: { id: domainId } as any, spaceId, name: existing?.name || master.siteName, ...(timezone ? { timezone } : {}), content: mergedContent }))\n /*\n * ํํ์ twin_space_representations ํ
์ด๋ธ์ ์ ์ฅํ๋ค โ ๋ทฐ(twin-map-page ๋ฑ)๋ content ๊ฐ ์๋๋ผ ํ
์ด๋ธ ํํ์ ์์ฑํ๋ฏ๋ก,\n * ์ ์ฅํ์ง ์์ผ๋ฉด ์ธ์ ์คํธ ์ฌ์ดํธ์ \"๋ํ ํํ\" ์ด ์์ด ์ง๋๋ก ์์ํ์ง ๋ชปํ๋ค. rep.areas ๊ฐ ์์ผ๋ฉด TwinSpaceArea ๋ ํจ๊ป ์ ์ฅ.\n * ์ต์ด ์ธ์ ์คํธ๋ง(๊ธฐ์กด ํํ ์์ผ๋ฉด ์ฌ์ฉ์ ํธ์ง ๋ณด์กด).\n */\n const repRepo = getRepository(TwinSpaceRepresentation)\n const areaRepo = getRepository(TwinSpaceArea)\n if ((await repRepo.count({ where: { space: { id: savedSpace.id } } })) === 0) {\n const reps: any[] = (spaceContent as any).representations ?? []\n for (let i = 0; i < reps.length; i++) {\n const rep = reps[i]\n const config =\n rep.type === 'map' ? { center: rep.center, zoom: rep.zoom }\n : rep.type === 'board' ? { boardId: rep.boardId }\n : rep.type === 'image' ? { imageUrl: rep.imageUrl, width: rep.width, height: rep.height }\n : {}\n const savedRep = await repRepo.save(repRepo.create({ domain: { id: domainId } as any, space: { id: savedSpace.id } as any, type: rep.type, name: rep.name, seq: i, isPrimary: !!rep.primary || rep.id === (spaceContent as any).primaryId, config }))\n for (const area of (rep.areas ?? []) as any[]) {\n await areaRepo.save(areaRepo.create({ domain: { id: domainId } as any, representation: { id: savedRep.id } as any, name: area.name, type: area.type, geometry: area.geometry, drillTo: area.drillTo ?? null, binding: area.binding ?? null, style: area.style ?? null }))\n }\n }\n }\n /*\n * area ๋จ์ผํ(space #2, P1) โ ๋
ผ๋ฆฌ ๊ตฌ์ญ์ TwinArea(์ ๊ทยทํํ๋ฌด๊ดยท๊ณต์ )์ dual-write(upsert by areaId).\n * P3: content.areas ์ ์ฅ ํ๊ธฐ โ TwinArea ๊ฐ ์ ์ผ ๊ถ์. ์์ค = masterToTwin ์ฐ์ถ spaceContent.areas(cur).\n * (์์ฒ diff ์ ๊ฑฐ[master ์์ ๋น ์ง area ์ญ์ ]๋ ์ฌ์ฉ์์ ์ area ๋ณดํธ ์ํด per-area provenance ํ์ โ ํ์.)\n */\n const twinAreaRepo = getRepository(TwinArea)\n for (const a of ((spaceContent as any).areas ?? []) as any[]) {\n if (!a?.id) continue\n const existingArea = await twinAreaRepo.findOne({ where: { domain: { id: domainId }, space: { id: savedSpace.id }, areaId: a.id } })\n await twinAreaRepo.save(\n twinAreaRepo.create({\n ...(existingArea ?? {}),\n domain: { id: domainId } as any,\n space: { id: savedSpace.id } as any,\n areaId: a.id,\n name: a.name ?? a.id,\n type: a.type,\n parentId: a.parentId ?? null,\n layout: a.x != null || a.w != null ? { x: a.x, y: a.y, w: a.w, h: a.h } : null\n })\n )\n }\n\n await this.provision(domainId, master.source, master.system, board)\n if (warnings.length) console.warn(`[twin-engine] ingest \"${master.source}\" warnings:`, warnings)\n return { instanceId: master.source, spaceId, warnings }\n }\n\n /** ๋จ๊ฑด ์์ธ โ ํ๋ก๋น์ ๋ ์๋ํฐ๊ฐ ํธ์งํ board(๊ตฌ์กฐ+layout) ํฌํจ. */\n static async detail(domainId: string, instanceId: string): Promise<any | null> {\n const r = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!r) return null\n return {\n instanceId: r.instanceId,\n kind: r.kind,\n status: r.status,\n running: !!this.instances[r.instanceId],\n realityMode: r.realityMode, // ํ์ค ์ ์ธ โ what-if ์ ์ฉ ๊ฐ๋์ฉ(mirror=์์ธก ์ ์ฉ, ์๊ทน ์ฃผ์
๋ถ๊ฐ)\n board: r.board\n }\n }\n\n /**\n * ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ ๋ธ๋ฆฌ์ง(P3, ADR-0018) โ ํธ์ ์ํฐํฐ ์ํ๋ฅผ `data(tag=์ํฐํฐid)` ์ฑ๋๋ก publish.\n * ๋ณด๋ ์ปดํฌ๋ํธ๊ฐ tag ๋ก ๊ตฌ๋
(board-ui provider)ํด `component.data` ๋ก ๋ผ์ด๋ธ ๊ฐฑ์ . delta ์์๋ง(ํฌ์).\n * tag=์ํฐํฐ id(๋ฐ๋ชจ=๋จ์ผ ์ธ์คํด์ค). ๋ฉํฐ ์ธ์คํด์ค/๋ณด๋ ์ฌ์ฌ์ฉ ์ tag ๋ค์์คํ์ด์ค๋ ํ์.\n */\n static publishEntityData(inst: InstanceRuntime): void {\n const domain = inst.domain\n if (!domain) return\n /* ์ํ ์ถ์ฒ ์ค์ โ sim: ์ปค๋ runtime, live: projector ๋ฏธ๋ฌ(+OEE ๊ณ์ฐ ์ธต ๋ณด๊ฐ). ๊ณ์ฝยทpayload ๋์ผ, ๋๋ผ์ด๋ฒ๋ง ๋ค๋ฆ. */\n const st: any =\n inst.mode === 'live'\n ? inst.oee\n ? withLiveOee(inst.projector?.snapshot?.(), inst.oee) // ๊ด์ธก ์ปค๋ + ๊ณ์ฐ(OEE) โ equipment payload ์ oee ํฌํจ(sim ๋ํ)\n : inst.projector?.snapshot?.()\n : inst.runtime?.resync?.()?.state\n if (!st) return\n /*\n * ๋ณํํ ์ํฐํฐ๋ง ๋ฐํ โ ์ด์ ์ delta ๋ง๋ค ์ ์ํฐํฐ(๋
ธ๋+๋ฌด๋ฒ+์ค๋)๋ฅผ ๊ฐ ๋ณํ์ ๋ฌด๊ดํ๊ฒ ์ ๋ ์ฌ๋ฐํํด\n * ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋งค์ด ๋ฐ๋ณต push ํ๊ณ ์์๋ค(์ค์ฉ). ์ต์ -์ํ ์ฑ๋์ด๋ฏ๋ก ๋ฌด๋ณํ ์ฌ๋ฐฉ์ก์ ๋ฌด์๋ฏธํ๋ค.\n * ์ํฐํฐ๋ณ ์๊ทธ๋์ฒ๋ฅผ ๋น๊ตํด ๋ฐ๋ ๊ฒ๋ง push.\n */\n const sigs = inst.entitySigs ?? (inst.entitySigs = new Map())\n const seen = new Set<string>()\n /* payload ๋งคํ์ ์์ ํจ์(buildEntityDeltas)๋ก ๋ถ๋ฆฌ โ ์ฌ๊ธฐ์ ์๊ทธ๋์ฒ dedup + ๋ฐํ๋ง.\n * ๋ณํํ ์ํฐํฐ๋ง ๋ฐํ(์ต์ -์ํ ์ฑ๋์ด๋ผ ๋ฌด๋ณํ ์ฌ๋ฐฉ์ก ๋ฌด์๋ฏธ). */\n for (const { tag, data } of buildEntityDeltas(st)) {\n seen.add(tag)\n const sig = JSON.stringify(data)\n if (sigs.get(tag) === sig) continue // ๋ฌด๋ณํ โ ๋ฐํ ์๋ต\n sigs.set(tag, sig)\n pubsub.publish('data', { data: { domain, tag, data } })\n }\n /* ์ฌ๋ผ์ง ์ํฐํฐ์ ์๊ทธ๋์ฒ ์ ๋ฆฌ(๋งต ๋ฌดํ ์ฑ์ฅ ๋ฐฉ์ง). */\n if (sigs.size > seen.size) for (const tag of sigs.keys()) if (!seen.has(tag)) sigs.delete(tag)\n }\n\n static async persist(domainId: string, instanceId: string, msg: any): Promise<void> {\n const repo = getRepository(TwinEvent)\n await repo.save(this.journalRow(repo, domainId, instanceId, msg.event, msg.revision, await this.structureRevOf(domainId, instanceId)))\n }\n\n /**\n * ์ฌ๋ถํ
๋ณต๊ตฌ / ์๊ฐ์ฌํ โ DB ์ ๋์ replay ํด ์ํ ์ฌ๊ตฌ์ฑ.\n * board ๋ ๋ ์ง์คํธ๋ฆฌ(TwinInstance)์์, ์ด๋ฒคํธ๋ TwinEvent(revision ASC)์์.\n * ์ปค์ ๋ ์ถ(runtime-state-model ยง4): **์๊ฐ(untilTime, ์ฌ์ฉ์ ๋ชจ๊ตญ์ดยท๊ณต๊ฐ ๊ณตํต์ถ)** ์ฐ์ , ์์ผ๋ฉด ๋ฆฌ๋น์ (untilRevision, ๋ ์ฆ ๋ด๋ถ).\n * - untilTime ์ฃผ๋ฉด `eventTime โค T` ์ธ ์ด๋ฒคํธ๋ง(๊ทธ ์์ watermark) โ ๊ณต๋๋ฐฐ์น ์ฌ๋ฌ ํธ์์ ํ๋์ ์๊ฐ T๋ก ํต์ผ ํด์.\n * - ๋ ๋ค ์์ผ๋ฉด ์ต์ (๋ผ์ด๋ธ ์ธ๋ฉ๋ชจ๋ฆฌ ์ง์ค).\n * ์ด๋ฒคํธ๋ ํญ์ revision ASC(์ธ๊ณผ ์์)๋ก ์ ์ฉ โ ์๊ฐ ํํฐ๋ ์ปท์คํ ์งํฉ๋ง ์ ํ๋ค.\n */\n static async recover(domainId: string, instanceId: string, untilRevision?: number, untilTime?: string): Promise<any> {\n // ๋ผ์ด๋ธ ์ต์ (์๊ฐ์ฌํ ์๋) + ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์คํด์ค โ ๋ผ์ด๋ธ ์ปค๋ ์ค๋
์ท์ ์ง์ ์ฌ์ฉ.\n // replay(StateProjector)๋ attentionsยทack ๋ฑ ๋ผ์ด๋ธ ์ ์ฉ ํ์ ์ํ๋ฅผ ๋ด์ง ๋ชปํ๋ฏ๋ก, ์ต์ ์ ์ปค๋ ์ง์ค์ ์ด๋ค.\n if (untilRevision == null && untilTime == null) {\n const live = this.instances[instanceId]\n if (live?.kernel?.getSnapshot) return live.kernel.getSnapshot()\n // live ๋ชจ๋๋ kernel ์ด ์๊ณ projector ๋ฏธ๋ฌ โ ์ธ๋ฉ๋ชจ๋ฆฌ ์ต์ ์ค๋
์ท(projector+OEE+attentions) ์ง์ ์ฌ์ฉ.\n // (์ ๋์ด ์์ด๋ ์ต์ ์ ์ธ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ง์ค โ replay ๋ ์๊ฐ์ฌํ/๋ณต๊ตฌ ์ ์ฉ.)\n if (live?.mode === 'live' && live.projector) return this.snapshot(instanceId)\n }\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) throw new Error(`twin instance \"${instanceId}\" not registered (no board to replay)`)\n\n const rows = await getRepository(TwinEvent).find({\n where: { domain: { id: domainId }, instanceId },\n order: { revision: 'ASC' }\n })\n const cutoffMs = untilTime != null ? Date.parse(untilTime) : NaN\n const wanted = rows.filter(r => {\n if (untilTime != null && !Number.isNaN(cutoffMs)) {\n const t = r.eventTime != null ? Date.parse(String(r.eventTime)) : NaN\n return Number.isNaN(t) ? true : t <= cutoffMs // eventTime ์๋ ๋ ๊ฑฐ์ ํ์ ํฌํจ(๋ณด์์ )\n }\n return untilRevision == null || (r.revision ?? 0) <= untilRevision\n })\n\n /*\n * **๊ทธ๋์ ๊ณต์ฅ์ผ๋ก ์ ๋๋ค.**\n *\n * ์์ ์๋ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์ง๊ธ ๋ฑ๋ก๋ ๋ณด๋ ํ๋๋ก ์ ์๋ค. ๊ตฌ์กฐ๊ฐ ๋ฐ๋ ์ ์์ผ๋ฉด ๋ง์ง๋ง, ๋ฐ๋\n * ๋ค์๋ ์ ์ฌ์ค์ ์ ๊ณต์ฅ์ ๋๊ณ ์ ๊ฒ ๋์ด โ ๊ทธ๋ ์๋ ์ค๋น์์ ์ผ์ด ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.\n * (๊ทธ๋์ ์์ ํ๋ก๋น์ ๋์ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด ์ ๋์ ์์ ์ง์ ๋ค. ์ญ์ฌ๋ฅผ ์๊ฑฐ๋ ๊ฑฐ์ง๋ง์ ํ๊ฑฐ๋.)\n *\n * ์ด์ ์ด๋ฒคํธ๊ฐ ์๊ธฐ ๊ตฌ์กฐ๋ฅผ ๋ฌ๊ณ ์ค๋ฏ๋ก, ๋ฆฌ๋น์ ์ด ๋ฐ๋๋ ์ง์ ์์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ํ๋ฉฐ ์ด์ด ์ ๋๋ค.\n * ๋ฆฌ๋น์ ์ด ํ๋๋ฟ์ด๊ฑฐ๋(๋๋ค์) ์์ ์์ผ๋ฉด(๊ตฌ์กฐ ์ด๋ ฅ ์ด์ ) ์์ ๊ณผ ๋๊ฐ์ด ํ ๋ฒ์ ์ ๋๋ค.\n */\n const structures = await getRepository(TwinStructure).find({\n where: { domain: { id: domainId }, instanceId },\n order: { rev: 'ASC' }\n })\n const boardOf = new Map<number, BoardDef>(structures.map(x => [x.rev, x.board as BoardDef]))\n /* ์ปฌ๋ผ์ด ์๊ธฐ๊ธฐ ์ ํ์ ๋ฆฌ๋น์ ์ด ๋น์ด ์๋ค โ **๊ฐ์ฅ ์ค๋๋ ๊ตฌ์กฐ**์ ์ํ๋ค(0 ์ผ๋ก ์ฑ์ฐ์ง ์๋๋ค). */\n const oldest = structures[0]?.rev\n const revOf = (r: { structureRev?: number }): number | undefined => r.structureRev ?? oldest\n\n const segments: { board: BoardDef; events: any[] }[] = []\n for (const r of wanted) {\n if (!r.payload) continue\n const rev = revOf(r)\n const board = (rev !== undefined && boardOf.get(rev)) || (reg.board as BoardDef)\n const last = segments[segments.length - 1]\n if (last && last.board === board) last.events.push(r.payload)\n else segments.push({ board, events: [r.payload] })\n }\n /*\n * **๊ฐ์ฅ ์ ๊ตฌ์กฐ๊ฐ ์ง๊ธ์ ๊ณต์ฅ์ด๋ค** โ ๊ทธ ์๋์์ ์์ง ์๋ฌด ์ผ๋ ์์๋๋ผ๋.\n *\n * ์ฌํ๋ก๋น์ ๋ ์งํ๊ฐ ์ ํํ ๊ทธ ์ํ๋ค: ๋ถ์ค๋ฅผ ๋ท ๋๋ ธ๋๋ฐ ์ ์ด๋ฒคํธ๋ ์์ง ํ๋๋ ์๋ค. ์ด๋\n * ๋ง์ง๋ง ์ด๋ฒคํธ์ ๊ตฌ์กฐ๋ก๋ง ์ ์ผ๋ฉด ํ๋ฉด์ **์ ๊ณต์ฅ**์ ๋ณด์ฌ์ค๋ค โ ๋ฐฉ๊ธ ๋๋ฆฐ ๊ฒ์ด ์ ๋ณด์ธ๋ค.\n * ๊ทธ๋์ ๋ง๋์ ๋์ ์ง๊ธ ๊ตฌ์กฐ๋ฅผ ํ ๋ฒ ๋ ์น๋๋ค(์ด๋ฒคํธ ์๋ ๋ง๋).\n *\n * **๋ค๋ง \"์ง๊ธ\" ์ ๋ฌผ์์ ๋๋ง์ด๋ค.** ๊ณผ๊ฑฐ ์์ ์ ๋ฌผ์๋๋ฐ ์ต์ ๊ตฌ์กฐ๋ฅผ ์น์ผ๋ฉด, ๊ทธ ์์ ์ ์๋\n * ์ค๋น๊ฐ ํ๋ฉด์ ์๊ณ โ ์ด ์์
์ด ๋ง์ผ๋ ค๋ ๋ฐ๋ก ๊ทธ ๊ฑฐ์ง๋ง์ด ๋๋ค.\n */\n const asOfNow = untilRevision == null && untilTime == null\n const newest = structures[structures.length - 1]?.board as BoardDef | undefined\n if (asOfNow && newest && segments[segments.length - 1]?.board !== newest) segments.push({ board: newest, events: [] })\n\n if (!segments.length) return replay(((asOfNow && newest) || reg.board) as BoardDef, [])\n if (segments.length === 1) return replay(segments[0].board, segments[0].events)\n\n const { state, shifts } = replaySegments(segments)\n /* ๊ฒฝ๊ณ์์ ์ฌ๋ผ์ง ๊ฒ์ ์กฐ์ฉํ ๋๊ธฐ์ง ์๋๋ค โ ์๊ฐ ์ค์ด๋ ์ด์ ๋ฅผ ์ด๋๊ฐ์๋ ๋จ๊ฒจ์ผ ํ๋ค. */\n for (const sh of shifts)\n if (sh.equipmentDropped || sh.locationsDropped || sh.personsDropped || sh.assetsDropped)\n console.info(`[twin-engine] \"${instanceId}\" replay crossed a structure change โ dropped ${sh.equipmentDropped} equipment, ${sh.locationsDropped} locations, ${sh.personsDropped} persons, ${sh.assetsDropped} assets that no longer exist.`)\n return state\n }\n\n /**\n * ๊ณต๊ฐ(๊ณต๋๋ฐฐ์น) ์๊ฐ ๋ฒ์ โ ์คํฌ๋ฌ๋ฒ ์ต์ปค(runtime-state-model ยง4ยทยง6). ๊ทธ ๊ณต๊ฐ ์ ์ธ์คํด์ค ์ ๋์ min/max eventTime.\n * ๋ฐํ {minTime, maxTime}(ISO) โ ์ด๋ฒคํธ/์๊ฐ ์์ผ๋ฉด null. ํด๋ผ ํ์คํ ๋ฆฌ ์คํฌ๋ฌ๋ฒ๊ฐ ์ด ๋ฒ์๋ฅผ ์๊ฐ์ถ์ผ๋ก ๊ทธ๋ฆฐ๋ค.\n */\n static async timeRange(domainId: string, spaceId: string): Promise<{ minTime: string | null; maxTime: string | null }> {\n const regs = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n const ids = regs.map(r => r.instanceId)\n if (!ids.length) return { minTime: null, maxTime: null }\n let min = Infinity\n let max = -Infinity\n for (const instanceId of ids) {\n const rows = await getRepository(TwinEvent).find({ where: { domain: { id: domainId }, instanceId } })\n for (const r of rows) {\n const t = r.eventTime != null ? Date.parse(String(r.eventTime)) : NaN\n if (Number.isNaN(t)) continue\n if (t < min) min = t\n if (t > max) max = t\n }\n }\n if (min === Infinity) return { minTime: null, maxTime: null }\n return { minTime: new Date(min).toISOString(), maxTime: new Date(max).toISOString() }\n }\n\n /** ์ ์ง ํ
โ ์ธ์คํด์ค ์ ์ง ์ ๋ถ์์์ ์ ๋ฆฌ(์: reference-live ํผ๋ unsubscribe). ์ํ ์ํฌํธ ์์ด ๊ฒฐ์ . */\n static stopHooks: ((id: string) => void)[] = []\n static onStop(fn: (id: string) => void): void {\n this.stopHooks.push(fn)\n }\n\n static async stop(id: string): Promise<void> {\n const i = this.instances[id]\n if (i) {\n clearInterval(i.timer)\n i.unsub()\n delete this.instances[id]\n await getRepository(TwinInstance)\n .update({ domain: { id: i.domainId }, instanceId: id }, { status: 'stopped' })\n .catch(err => console.error('twin deregister fail', err))\n }\n for (const hook of this.stopHooks) { try { hook(id) } catch { /* ํ
๊ฒฉ๋ฆฌ */ } }\n }\n\n static runtime(id: string): TwinRuntimeType | undefined {\n return this.instances[id]?.runtime\n }\n\n /**\n * ๋๋ฉ์ธ ์์ ๊ฒ์ดํธ โ ์ธ์คํด์ค๊ฐ ์ด ๋๋ฉ์ธ ์์ ์ผ ๋๋ง true(ํ
๋ํธ ๊ฒฉ๋ฆฌ).\n * ์๊ฑฐ๋ ๋ค๋ฅธ ๋๋ฉ์ธ์ด๋ฉด false. ๋
ธ์ถ ๋ฆฌ์กธ๋ฒ(per-id metrics/attentions/state/stop/forecast)๊ฐ\n * this.instances[id] ๋ฅผ ๋ง์ง๊ธฐ ์ ์ ๋ฐ๋์ ์ด๊ฑธ๋ก ํ์ธํด์ผ ํ๋ค. ์ธ์คํด์ค id ๋ ์ถ์ธก ๊ฐ๋ฅํ๋ฏ๋ก\n * ๊ฒ์ฆ ์์ด ์ ๊ทผํ๋ฉด ํฌ๋ก์คํ
๋ํธ ์ฝ๊ธฐ/์ ์ง๊ฐ ๊ฐ๋ฅํด์ง๋ค.\n */\n static owns(domainId: string, id: string): boolean {\n return this.instances[id]?.domainId === domainId\n }\n\n /**\n * ์ด ํธ์์ด ์ด ํ
๋ํธ ๊ฒ์ธ๊ฐ โ **๋ ์๋ ์๋๋ .**\n *\n * `owns()` ๋ **๋ ์๋** ๋ฐํ์๋ง ์๋ค. ๊ทธ๊ฒ์ ์ด๋ ฅ ์กฐํ์ ๊ด๋ฌธ์ผ๋ก ์ฐ๋ฉด, ๊บผ์ง ํธ์์ ์ ๋์\n * ์ฝ์ผ๋ ค ํ ๋ \"์ด ํ
๋ํธ์ ์๋ค\" ๋ ๋ต์ด ๋์์จ๋ค โ ๋ ๊ฐ์ง๊ฐ ํ๋ ธ๋ค. ์ฒซ์งธ, ์ ๋์ ํธ์์ด ๊บผ์ ธ\n * ์์ ๋ **๊ฐ์ฅ ํ์ํ ๊ฒ**์ด๋ค(๊ทธ๊ฒ ์ด๋ ฅ์ ์กด์ฌ ์ด์ ๋ค). ๋์งธ, ๊ทธ ๋ฌธ์ฅ์ ๋จ์ ๊ฒ์ด๋ผ๋ ๋ป์ด๋ผ\n * ์ฌ์ฉ์๊ฐ ๊ถํ ๋ฌธ์ ๋ก ์คํดํ๋ค. ์ค์ ๋ก๋ ๊ทธ๋ฅ ์ ๋๊ณ ์์ ๋ฟ์ด๋ค.\n *\n * ์์ ๋ **๋ฑ๋ก๋ถ**๊ฐ ์๋ค. ์ด๋ ฅยท์ง๊ณ์ฒ๋ผ ๋ฐํ์๊ณผ ๋ฌด๊ดํ ์ง๋ฌธ์ ์ด์ชฝ์ ๋ฌป๋๋ค.\n */\n static async ownsRegistered(domainId: string, instanceId: string): Promise<boolean> {\n if (this.owns(domainId, instanceId)) return true\n return !!(await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } }))\n }\n\n /** ๋ผ์ด๋ธ ์ปค๋(ForecastTwin) โ forecast/divergence ์์ธก ์ฐ์ฐ์ฉ. */\n static kernel(id: string): any {\n return this.instances[id]?.kernel\n }\n\n /** ๋ผ์ด๋ธ ์ฒ๋ฆฌ๋ ๊ณ์ธก ์ค๋
์ท(๋ชจ๋ํฐ, โฃ-1) โ ๋ด๋ถ ๋์ (_acc*) ์ ์ธํ ๊ณต๊ฐ ์งํ. live ์๋๋ฉด null. */\n static metrics(id: string): any {\n const m = this.instances[id]?.metrics\n if (!m) return null\n return {\n instanceId: id,\n ingestedTotal: m.ingestedTotal, broadcastTotal: m.broadcastTotal, journaledTotal: m.journaledTotal,\n ingestRate: m.ingestRate, broadcastRate: m.broadcastRate, journalRate: m.journalRate,\n backlog: m.backlog, broadcastCoalesceMs: this.BROADCAST_COALESCE_MS\n }\n }\n\n /** ์ ์ฒด ๋ผ์ด๋ธ ์ธ์คํด์ค ๊ณ์ธก(๋ชจ๋ํฐ ๋์๋ณด๋์ฉ). */\n static async allMetrics(domainId?: string): Promise<any[]> {\n const rows = Object.keys(this.instances)\n .filter(id => !domainId || this.instances[id].domainId === domainId)\n .map(id => this.metrics(id))\n .filter(Boolean)\n if (!rows.length || !domainId) return rows\n // ํ์ ์ด๋ฆ ๋ถ์ฌ โ ์คํ์ค ์นด๋๊ฐ id ๋ง ๋ณด์ด์ง ์๋๋ก ๊ณต๊ฐ๋ช
์ ์ค์ด์ค๋ค(๊ณต๊ฐ ์นด๋์ ๋์ผ). name=๊ณต๊ฐ๋ช
ํด๋ฐฑ spaceId ํด๋ฐฑ instanceId.\n const insts = await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })\n const spaceOf = new Map(insts.map(i => [i.instanceId, i.spaceId]))\n const nameOf = new Map((await getRepository(TwinSpace).find({ where: { domain: { id: domainId } } })).map(s => [s.spaceId, s.name]))\n for (const r of rows) {\n const sp = spaceOf.get(r.instanceId)\n r.spaceId = sp\n r.name = (sp && nameOf.get(sp)) || sp || r.instanceId\n }\n return rows\n }\n\n /*\n * `buildForecastKernel` ์ **์ฌ๋ผ์ก๋ค**(ํตํฉ P3, 2026-08-01).\n *\n * ๋ผ์ด๋ธ๊ฐ `StateProjector` ์์ ๋๋ ์ปค๋์ด ์์ด์, ์์ธกํ๋ ค๋ฉด ๊ด์ธก ์ค๋
์ท + ์ ๋์ ์ค๋ ์๊ฐ์ผ๋ก\n * **์ผํ์ฉ ์ปค๋์ ์ธ์์ผ** ํ๋ค. ์ด์ ๋ผ์ด๋ธ ์ธ์คํด์ค๊ฐ ๊ณง ์ปค๋์ด๋ฏ๋ก(`startLive`) ๊ทธ ์๋ฆฌ์์\n * `fork` ํ๋ฉด ๋๋ค โ `TwinEngine.kernel(id)` ๊ฐ simยทlive ๋ ๋ค ๋๋ ค์ค๋ค.\n *\n * (์ค๋ ์๊ฐ์ ์ ๋์์ ๋์ฐพ๋ ์ด์ ๋ ์ฌ๋ผ์ก๋ค โ ์ํ๊ฐ requestedยทfulfilledยทlines ๋ฅผ ์งํจ๋ค.)\n */\n\n /**\n * ์์ธก์ฉ ์ปค๋์ **์์ ์๊ฐ T ๊ธฐ์ค**์ผ๋ก ์ฌ๊ตฌ์ฑ โ ๊ณผ๊ฑฐ-vantage ์์ธก(๋ฐฑํ
์คํธ)ยท\"๊ทธ๋ ์์ ๋ณธ ๋ฏธ๋\".\n * recover(untilTime)๋ก T ์์ ์ํ๋ฅผ, T ์ดํ ์ค๋ ๊ด์ธก์ ๋ชจ์ hydrate โ monteCarloForecast ๊ฐ T ์์ ์์ผ๋ก ๊ตด๋ฆฐ๋ค.\n * sim/live ๋ฌด๊ด(์ ๋ ๊ธฐ๋ฐ ์ฌ๊ตฌ์ฑ). untilTime ์๋ต ์ ์ต์ . ๋๋ฉ์ธ ์ค์ฝํ(regยทjournal ์กฐํ๊ฐ domainId).\n */\n static async buildForecastKernelAt(domainId: string, instanceId: string, untilTime?: string): Promise<any | null> {\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!reg?.board) return null\n const Kernel = KERNELS[reg.kind ?? 'wms'] ?? WmsKernel\n const k = new Kernel(domainId, undefined, this.mesSpecOf(reg.board as BoardDef))\n k.loadBoard(reg.board as BoardDef)\n this.applyOperations(k, reg.board, instanceId) // ์์ธก๋ ๊ฐ์ ๋ช
์ธ๋ก ๊ตด๋ฌ์ผ ํ๋ค(ํ๋ฉด๊ณผ ๋ค๋ฅธ ์ซ์ ๊ธ์ง)\n await this.installEstimators(k, domainId, instanceId, reg.board) // ์์ธก์ ๊ธฐ๋ค๋ฆฐ๋ค โ ์ค์ธก์ ๋์น๋ฉด ์์ธก์ด ์์๋ก ๋๋ค\n const state = await this.recover(domainId, instanceId, undefined, untilTime).catch(() => null)\n if (!state) return null\n const cutoff = untilTime != null ? Date.parse(untilTime) : Infinity\n const rows = await getRepository(TwinEvent).find({ where: { domain: { id: domainId }, instanceId, eventType: OP_EVENT.order }, order: { revision: 'ASC' } })\n const latest = new Map<string, any>()\n for (const r of rows) {\n if (Number.isFinite(cutoff) && Date.parse(r.eventTime) > cutoff) continue\n const d = (r.payload as any)?.data\n if (d?.orderId) latest.set(d.orderId, d)\n }\n k.hydrateObserved(state, [...latest.values()])\n return k\n }\n\n /** ํ์ฌ ์ ์ฒด ์ค๋
์ท โ ๋ผ์ด๋ธ ์ฐ์ , ์์ผ๋ฉด ์ ๋ ๋ณต๊ตฌ ์บ์. */\n static snapshot(id: string): any {\n const inst = this.instances[id]\n if (inst?.mode === 'live' && inst.projector) {\n /* live: **์ปค๋์ด ์ฃผ๋ชฉ ์ ํธ๋ฅผ ์ค์ค๋ก ๋ธ๋ค**(๊ด์ธก ๋ชจ๋) โ ํธ์คํธ๊ฐ ๋ง๋ถ์ด๋ withLiveAttentions ๋\n * ํ์ ์๋ค. OEE ๋ง ํธ์คํธ๊ฐ ์ฑ์ด๋ค: ์ ์์คํ
์ด ์๊ฐ ๋์ ์ ๋ณด๋ด ์ฃผ์ง ์์ ์ํ ์ ์ด๋ฅผ ์ ๋ถํด\n * ๋ง๋๋ ๊ฐ์ด๋ผ ์ปค๋์ด ๋์ ํ ์ ์๋ค(์ ํฉ์ฑ ํ๋ค์ค์ ์ ์ผํ ์์ธ). */\n const st = inst.projector.snapshot()\n return inst.oee ? withLiveOee(st, inst.oee) : st\n }\n return inst?.runtime?.resync() ?? this.recovered[id]\n }\n}\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/** ์ปค๋์ ์ฌ์ ๊ด์ธก ์ํ โ ๊ตฌ์กฐ๊ฐ ์๋๋ผ "๋ฌด์์ด ์ด๋์ ์ผ๋ง๋". */
|
|
2
2
|
export interface ObservedSeed {
|
|
3
|
-
|
|
3
|
+
locations: unknown[];
|
|
4
4
|
items: unknown[];
|
|
5
|
-
|
|
5
|
+
equipment: unknown[];
|
|
6
6
|
}
|
|
7
7
|
export type WarmStartPlan = {
|
|
8
8
|
action: 'hydrate';
|
|
9
9
|
seed: ObservedSeed;
|
|
10
10
|
itemCount: number;
|
|
11
|
-
|
|
11
|
+
equipmentCount: number;
|
|
12
12
|
}
|
|
13
13
|
/** ๋ฒค์น ํธ์ โ ์ ์์์์ ์ฉ๋์ ์ฌ๋ ๊ฒ ๋ชฉ์ ์ด๋ผ ํ์ฌ ์ํ๋ฅผ ์ฌ์ผ๋ฉด ์ธก์ ์ด ์ค์ผ๋๋ค. */
|
|
14
14
|
| {
|
|
@@ -33,7 +33,7 @@ export type WarmStartPlan = {
|
|
|
33
33
|
* ๋๊ธฐ์ง ์๋๋ค โ ์ฌ๊ณ ยท๋
ธ๋ยท๋ฌด๋ฒ๋ง ๋ณต์๋๊ณ ์งํ ์ค ์ค๋๋ ๋น์ด์ ์์ํ๋ ํธ์ด ์ ์งํ๋ค.
|
|
34
34
|
*/
|
|
35
35
|
export declare function planWarmStart(state: {
|
|
36
|
-
|
|
36
|
+
locations?: unknown[];
|
|
37
37
|
items?: unknown[];
|
|
38
|
-
|
|
38
|
+
equipment?: unknown[];
|
|
39
39
|
} | null | undefined, purpose: string | undefined, canHydrate: boolean): WarmStartPlan;
|