@things-factory/headless-twin 10.0.19 โ 10.1.0
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/dist-server/engine/canonical-ingest.d.ts +10 -1
- package/dist-server/engine/canonical-ingest.js +110 -33
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/event-time.d.ts +25 -0
- package/dist-server/engine/event-time.js +98 -0
- package/dist-server/engine/event-time.js.map +1 -0
- package/dist-server/engine/index.d.ts +2 -0
- package/dist-server/engine/index.js +23 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/ingest-dedupe.d.ts +18 -6
- package/dist-server/engine/ingest-dedupe.js +201 -15
- package/dist-server/engine/ingest-dedupe.js.map +1 -1
- package/dist-server/engine/ingest-health.d.ts +60 -1
- package/dist-server/engine/ingest-health.js +43 -8
- package/dist-server/engine/ingest-health.js.map +1 -1
- package/dist-server/engine/kpi-fold.d.ts +19 -0
- package/dist-server/engine/kpi-fold.js +4 -1
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.js +23 -3
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/oee-accumulator.d.ts +35 -2
- package/dist-server/engine/oee-accumulator.js +56 -4
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +72 -3
- package/dist-server/engine/twin-engine.js +118 -5
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/index.js +21 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.d.ts +5 -0
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js +66 -0
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js.map +1 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.d.ts +5 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js +79 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js.map +1 -0
- package/dist-server/migrations/index.js +5 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/routes.js +12 -20
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/actuation/actuation-advisor.d.ts +60 -0
- package/dist-server/service/actuation/actuation-advisor.js +53 -0
- package/dist-server/service/actuation/actuation-advisor.js.map +1 -0
- package/dist-server/service/actuation/actuation-outcome.d.ts +52 -0
- package/dist-server/service/actuation/actuation-outcome.js +34 -0
- package/dist-server/service/actuation/actuation-outcome.js.map +1 -0
- package/dist-server/service/actuation/actuation-rule-resolver.d.ts +19 -0
- package/dist-server/service/actuation/actuation-rule-resolver.js +161 -0
- package/dist-server/service/actuation/actuation-rule-resolver.js.map +1 -0
- package/dist-server/service/actuation/actuation-rule.d.ts +55 -0
- package/dist-server/service/actuation/actuation-rule.js +130 -0
- package/dist-server/service/actuation/actuation-rule.js.map +1 -0
- package/dist-server/service/actuation/approval-gateway.d.ts +20 -0
- package/dist-server/service/actuation/approval-gateway.js +14 -0
- package/dist-server/service/actuation/approval-gateway.js.map +1 -0
- package/dist-server/service/actuation/catch-up-effects.d.ts +16 -0
- package/dist-server/service/actuation/catch-up-effects.js +120 -0
- package/dist-server/service/actuation/catch-up-effects.js.map +1 -0
- package/dist-server/service/actuation/command-dispatcher.d.ts +206 -8
- package/dist-server/service/actuation/command-dispatcher.js +191 -14
- package/dist-server/service/actuation/command-dispatcher.js.map +1 -1
- package/dist-server/service/actuation/command-store.d.ts +10 -2
- package/dist-server/service/actuation/command-store.js +168 -5
- package/dist-server/service/actuation/command-store.js.map +1 -1
- package/dist-server/service/actuation/dispatch-after-approval.d.ts +11 -0
- package/dist-server/service/actuation/dispatch-after-approval.js +73 -0
- package/dist-server/service/actuation/dispatch-after-approval.js.map +1 -0
- package/dist-server/service/actuation/effect-match.d.ts +53 -0
- package/dist-server/service/actuation/effect-match.js +65 -0
- package/dist-server/service/actuation/effect-match.js.map +1 -0
- package/dist-server/service/actuation/index.d.ts +21 -2
- package/dist-server/service/actuation/index.js +21 -2
- package/dist-server/service/actuation/index.js.map +1 -1
- package/dist-server/service/actuation/retry-plan.d.ts +63 -0
- package/dist-server/service/actuation/retry-plan.js +99 -0
- package/dist-server/service/actuation/retry-plan.js.map +1 -0
- package/dist-server/service/actuation/rule-evaluate.d.ts +127 -0
- package/dist-server/service/actuation/rule-evaluate.js +205 -0
- package/dist-server/service/actuation/rule-evaluate.js.map +1 -0
- package/dist-server/service/actuation/rule-loop.d.ts +5 -0
- package/dist-server/service/actuation/rule-loop.js +156 -0
- package/dist-server/service/actuation/rule-loop.js.map +1 -0
- package/dist-server/service/actuation/rule-runner.d.ts +52 -0
- package/dist-server/service/actuation/rule-runner.js +135 -0
- package/dist-server/service/actuation/rule-runner.js.map +1 -0
- package/dist-server/service/actuation/rule-wiring.d.ts +24 -0
- package/dist-server/service/actuation/rule-wiring.js +80 -0
- package/dist-server/service/actuation/rule-wiring.js.map +1 -0
- package/dist-server/service/actuation/settle-effects.d.ts +21 -0
- package/dist-server/service/actuation/settle-effects.js +101 -0
- package/dist-server/service/actuation/settle-effects.js.map +1 -0
- package/dist-server/service/actuation/sweep-dispatch.d.ts +37 -0
- package/dist-server/service/actuation/sweep-dispatch.js +125 -0
- package/dist-server/service/actuation/sweep-dispatch.js.map +1 -0
- package/dist-server/service/actuation/twin-command-resolver.d.ts +120 -0
- package/dist-server/service/actuation/twin-command-resolver.js +406 -0
- package/dist-server/service/actuation/twin-command-resolver.js.map +1 -0
- package/dist-server/service/actuation/twin-command.d.ts +81 -0
- package/dist-server/service/actuation/twin-command.js +60 -0
- package/dist-server/service/actuation/twin-command.js.map +1 -1
- package/dist-server/service/actuation/twin-now.d.ts +41 -0
- package/dist-server/service/actuation/twin-now.js +65 -0
- package/dist-server/service/actuation/twin-now.js.map +1 -0
- package/dist-server/service/index.d.ts +5 -2
- package/dist-server/service/index.js +8 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/actuation-routing.d.ts +60 -0
- package/dist-server/service/reference/actuation-routing.js +126 -0
- package/dist-server/service/reference/actuation-routing.js.map +1 -0
- package/dist-server/service/reference/actuation-target.d.ts +65 -0
- package/dist-server/service/reference/actuation-target.js +94 -0
- package/dist-server/service/reference/actuation-target.js.map +1 -0
- package/dist-server/service/reference/connection-portability-resolver.d.ts +29 -0
- package/dist-server/service/reference/connection-portability-resolver.js +181 -0
- package/dist-server/service/reference/connection-portability-resolver.js.map +1 -0
- package/dist-server/service/reference/connection-portability.d.ts +138 -0
- package/dist-server/service/reference/connection-portability.js +230 -0
- package/dist-server/service/reference/connection-portability.js.map +1 -0
- package/dist-server/service/reference/fill-cadence.d.ts +17 -0
- package/dist-server/service/reference/fill-cadence.js +31 -0
- package/dist-server/service/reference/fill-cadence.js.map +1 -0
- package/dist-server/service/reference/fill-dedupe.d.ts +16 -0
- package/dist-server/service/reference/fill-dedupe.js +63 -0
- package/dist-server/service/reference/fill-dedupe.js.map +1 -0
- package/dist-server/service/reference/fill-loop.d.ts +35 -0
- package/dist-server/service/reference/fill-loop.js +187 -0
- package/dist-server/service/reference/fill-loop.js.map +1 -0
- package/dist-server/service/reference/fill-span.d.ts +10 -0
- package/dist-server/service/reference/fill-span.js +37 -0
- package/dist-server/service/reference/fill-span.js.map +1 -0
- package/dist-server/service/reference/hook-contract.d.ts +88 -4
- package/dist-server/service/reference/hook-contract.js +105 -4
- package/dist-server/service/reference/hook-contract.js.map +1 -1
- package/dist-server/service/reference/hook-rejected.d.ts +25 -0
- package/dist-server/service/reference/hook-rejected.js +48 -0
- package/dist-server/service/reference/hook-rejected.js.map +1 -0
- package/dist-server/service/reference/index.d.ts +4 -1
- package/dist-server/service/reference/index.js +5 -1
- package/dist-server/service/reference/index.js.map +1 -1
- package/dist-server/service/reference/live-cadence.d.ts +68 -0
- package/dist-server/service/reference/live-cadence.js +44 -0
- package/dist-server/service/reference/live-cadence.js.map +1 -0
- package/dist-server/service/reference/live-feed-lease.d.ts +15 -0
- package/dist-server/service/reference/live-feed-lease.js +56 -0
- package/dist-server/service/reference/live-feed-lease.js.map +1 -0
- package/dist-server/service/reference/live-ingest.d.ts +21 -0
- package/dist-server/service/reference/live-ingest.js +66 -0
- package/dist-server/service/reference/live-ingest.js.map +1 -0
- package/dist-server/service/reference/reference-adapter.d.ts +291 -2
- package/dist-server/service/reference/reference-adapter.js +19 -1
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-fill-run.d.ts +50 -0
- package/dist-server/service/reference/reference-fill-run.js +142 -0
- package/dist-server/service/reference/reference-fill-run.js.map +1 -0
- package/dist-server/service/reference/reference-fill.d.ts +90 -0
- package/dist-server/service/reference/reference-fill.js +141 -0
- package/dist-server/service/reference/reference-fill.js.map +1 -0
- package/dist-server/service/reference/reference-hook.d.ts +22 -0
- package/dist-server/service/reference/reference-hook.js +135 -55
- package/dist-server/service/reference/reference-hook.js.map +1 -1
- package/dist-server/service/reference/reference-link-groups.d.ts +10 -0
- package/dist-server/service/reference/reference-link-groups.js +15 -0
- package/dist-server/service/reference/reference-link-groups.js.map +1 -0
- package/dist-server/service/reference/reference-links.d.ts +14 -0
- package/dist-server/service/reference/reference-links.js +73 -0
- package/dist-server/service/reference/reference-links.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +1 -0
- package/dist-server/service/reference/reference-live.js +32 -6
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +56 -2
- package/dist-server/service/reference/reference-master.js +33 -3
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +27 -0
- package/dist-server/service/reference/reference-resolver.js +79 -1
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +31 -3
- package/dist-server/service/twin-event/twin-event-keys.js +36 -4
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +1 -0
- package/dist-server/service/twin-event/twin-event.js +11 -2
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-model/choose-recipe.d.ts +15 -0
- package/dist-server/service/twin-model/choose-recipe.js +33 -0
- package/dist-server/service/twin-model/choose-recipe.js.map +1 -0
- package/dist-server/service/twin-model/external-resolver.d.ts +76 -0
- package/dist-server/service/twin-model/external-resolver.js +109 -0
- package/dist-server/service/twin-model/external-resolver.js.map +1 -0
- package/dist-server/service/twin-model/project-structure.js +16 -3
- package/dist-server/service/twin-model/project-structure.js.map +1 -1
- package/dist-server/service/twin-model/twin-equipment.d.ts +17 -0
- package/dist-server/service/twin-model/twin-equipment.js +10 -0
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -1
- package/dist-server/service/twin-model/twin-lineage-query.js +75 -1
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.js +94 -5
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-space/twin-space.d.ts +29 -0
- package/dist-server/service/twin-space/twin-space.js +13 -0
- package/dist-server/service/twin-space/twin-space.js.map +1 -1
- package/dist-server/service/twin-subject/event-subjects.d.ts +3 -1
- package/dist-server/service/twin-subject/event-subjects.js +8 -1
- package/dist-server/service/twin-subject/event-subjects.js.map +1 -1
- package/dist-shared/entity-delta.js +1 -1
- package/dist-shared/entity-delta.js.map +1 -1
- package/package.json +7 -7
- package/server/engine/canonical-ingest.ts +119 -33
- package/server/engine/event-time.ts +96 -0
- package/server/engine/index.ts +20 -0
- package/server/engine/ingest-dedupe.ts +203 -27
- package/server/engine/ingest-health.ts +91 -6
- package/server/engine/kpi-fold.ts +24 -1
- package/server/engine/kpi-query.ts +23 -4
- package/server/engine/oee-accumulator.ts +80 -8
- package/server/engine/twin-engine.ts +119 -5
- package/server/index.ts +23 -0
- package/server/migrations/1786600000000-RenameOperatoMesAdapterType.ts +66 -0
- package/server/migrations/1786700000000-AddDispatchRetryColumns.ts +82 -0
- package/server/migrations/index.ts +5 -1
- package/server/routes.ts +12 -24
- package/server/service/actuation/actuation-advisor.ts +124 -0
- package/server/service/actuation/actuation-outcome.ts +97 -0
- package/server/service/actuation/actuation-rule-resolver.ts +147 -0
- package/server/service/actuation/actuation-rule.ts +139 -0
- package/server/service/actuation/approval-gateway.ts +44 -0
- package/server/service/actuation/catch-up-effects.ts +152 -0
- package/server/service/actuation/command-dispatcher.ts +401 -20
- package/server/service/actuation/command-store.ts +182 -8
- package/server/service/actuation/dispatch-after-approval.ts +71 -0
- package/server/service/actuation/effect-match.ts +124 -0
- package/server/service/actuation/index.ts +21 -2
- package/server/service/actuation/retry-plan.ts +145 -0
- package/server/service/actuation/rule-evaluate.ts +352 -0
- package/server/service/actuation/rule-loop.ts +160 -0
- package/server/service/actuation/rule-runner.ts +216 -0
- package/server/service/actuation/rule-wiring.ts +84 -0
- package/server/service/actuation/settle-effects.ts +115 -0
- package/server/service/actuation/sweep-dispatch.ts +179 -0
- package/server/service/actuation/twin-command-resolver.ts +387 -0
- package/server/service/actuation/twin-command.ts +128 -1
- package/server/service/actuation/twin-now.ts +97 -0
- package/server/service/index.ts +9 -1
- package/server/service/reference/actuation-routing.ts +165 -0
- package/server/service/reference/actuation-target.ts +163 -0
- package/server/service/reference/connection-portability-resolver.ts +171 -0
- package/server/service/reference/connection-portability.ts +285 -0
- package/server/service/reference/fill-cadence.ts +29 -0
- package/server/service/reference/fill-dedupe.ts +66 -0
- package/server/service/reference/fill-loop.ts +153 -0
- package/server/service/reference/fill-span.ts +31 -0
- package/server/service/reference/hook-contract.ts +185 -5
- package/server/service/reference/hook-rejected.ts +53 -0
- package/server/service/reference/index.ts +5 -1
- package/server/service/reference/live-cadence.ts +129 -0
- package/server/service/reference/live-feed-lease.ts +56 -0
- package/server/service/reference/live-ingest.ts +94 -0
- package/server/service/reference/reference-adapter.ts +327 -5
- package/server/service/reference/reference-fill-run.ts +165 -0
- package/server/service/reference/reference-fill.ts +223 -0
- package/server/service/reference/reference-hook.ts +162 -56
- package/server/service/reference/reference-link-groups.ts +21 -0
- package/server/service/reference/reference-links.ts +77 -0
- package/server/service/reference/reference-live.ts +30 -5
- package/server/service/reference/reference-master.ts +90 -5
- package/server/service/reference/reference-resolver.ts +77 -2
- package/server/service/twin-event/twin-event-keys.ts +37 -4
- package/server/service/twin-event/twin-event.ts +18 -1
- package/server/service/twin-model/choose-recipe.ts +31 -0
- package/server/service/twin-model/external-resolver.ts +161 -0
- package/server/service/twin-model/project-structure.ts +16 -3
- package/server/service/twin-model/twin-equipment.ts +22 -0
- package/server/service/twin-model/twin-lineage-query.ts +82 -1
- package/server/service/twin-model/twin-model-item-query.ts +95 -4
- package/server/service/twin-model/twin-model-tree-query.ts +1 -1
- package/server/service/twin-space/twin-space.ts +39 -0
- package/server/service/twin-subject/event-subjects.ts +8 -1
- package/shared/entity-delta.ts +1 -1
- package/test/ack-shape-alignment.test.ts +97 -0
- package/test/actuation-approval-door.test.ts +421 -0
- package/test/actuation-dispatch.test.ts +16 -3
- package/test/actuation-effect.test.ts +162 -0
- package/test/actuation-outcome.test.ts +152 -0
- package/test/actuation-rule-runner.test.ts +281 -0
- package/test/actuation-rule.test.ts +266 -0
- package/test/actuation-seam.test.ts +249 -0
- package/test/actuation-settle.test.ts +164 -0
- package/test/actuation-target.test.ts +145 -0
- package/test/canonical-ingest-vocabularies.test.ts +49 -2
- package/test/capability-mapping.test.ts +1 -1
- package/test/choose-recipe.test.ts +117 -0
- package/test/command-store-writes-columns.test.ts +126 -0
- package/test/connection-portability-doors.test.ts +87 -0
- package/test/connector-capability-declaration.test.ts +54 -4
- package/test/declaration-reaches-model.test.ts +43 -0
- package/test/dedupe-transformation.test.ts +112 -0
- package/test/entity-delta.test.ts +1 -1
- package/test/event-subjects.test.ts +2 -1
- package/test/external-resolver.test.ts +171 -0
- package/test/fill-dedupe.test.ts +59 -0
- package/test/fill-loop.test.ts +35 -0
- package/test/first-envelope.test.ts +153 -0
- package/test/fold-shift-dst.test.ts +110 -0
- package/test/home-in-area.test.ts +90 -0
- package/test/hook-rejected-shape.test.ts +86 -0
- package/test/hook-response-sum.test.ts +193 -0
- package/test/hook-sequence.test.ts +1 -1
- package/test/ingest-dedupe.test.ts +56 -0
- package/test/ingest-expected-quiet.test.ts +111 -0
- package/test/ingest-idempotent.test.ts +79 -0
- package/test/ingest-reconcile-four-ways.test.ts +97 -0
- package/test/ingest-rules-header.test.ts +100 -0
- package/test/ingest-window-rolls-unobserved.test.ts +72 -0
- package/test/intake-mapping-parity.test.ts +175 -0
- package/test/live-cadence.test.ts +170 -0
- package/test/live-feed-lease.test.ts +63 -0
- package/test/live-mirror-parity.test.ts +1 -1
- package/test/oee-accumulator.test.ts +3 -3
- package/test/oee-site-calendar.test.ts +146 -0
- package/test/order-and-transaction-split.test.ts +107 -0
- package/test/reference-fill.test.ts +235 -0
- package/test/reference-hook.test.ts +1 -1
- package/test/reference-links.test.ts +56 -0
- package/test/retry-plan.test.ts +139 -0
- package/test/sweep-dispatch.test.ts +191 -0
- package/test/twin-event-keys.test.ts +20 -6
- package/test/twin-model-item-db.test.ts +6 -6
- package/test/twin-model-tree-db.test.ts +6 -6
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -131,6 +131,20 @@ export interface RefTestSpecification {
|
|
|
131
131
|
export interface RefEquipment {
|
|
132
132
|
id: string;
|
|
133
133
|
kind: string;
|
|
134
|
+
/**
|
|
135
|
+
* ์ํ **๋ฑ๊ธ๋ค** โ ๊ณ์ฝ ์ ์ธ์ `equipment[].equipmentClassIds` ๋ก ๊ทธ๋๋ก ๊ฐ๋ค.
|
|
136
|
+
*
|
|
137
|
+
* โโ ์ ๋น ์ ธ ์์๋ (2026-09-04) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
138
|
+
* ์ปค๋์ ์ด ์ถ์ ์ฌ๋ ๋ ๋ชจ๋ธยท์ํยท์ ๋ยท๋ฏธ๋ฌ๊น์ง ๋ฐฐ์ ํ๋๋ฐ **์ ์๋ฉด์ด ๋น ์ก๋ค.** ์ฌ๋๊ณผ ์์ฐ์
|
|
139
|
+
* ๋ฐ๋๋ฐ(`personnelClassIds`ยท`assetClassIds`) ์ค๋น๋ง ์์๋ค.
|
|
140
|
+
*
|
|
141
|
+
* ๊ทธ๋์ ์๋ณธ์ด ์ค๋น 22๋์ ๋ฑ๊ธ์ ๋ค ์ฑ์ ๋ณด๋๋๋ฐ **๋ฌธํฑ์์ ๋ฒ๋ ค์ก๋ค** โ ๊ฑฐ์ ๋ ๊ฒฝ๊ณ ๋ ์์ด.
|
|
142
|
+
* ๋ฑ๊ธ ๋ชฉ๋ก์ ์๊ณ ์์์ ์๋ฌด๋ ์์ด์, ํ๋ฉด์์ ๋ฑ๊ธ์ ๊ณจ๋ผ๋ ์ค๋น๊ฐ ์ ๋์๋ค.
|
|
143
|
+
*
|
|
144
|
+
* ์์์ ์ด ์ ์ธ๊ณผ `kind` ๋ฅผ ํฉ์น ๊ฒ์ด๋ค(ยง`equipmentClassMembership`) โ ํ์ ํ๋ ์ชฝ์ด ๊ทธ ํจ์๋ฅผ
|
|
145
|
+
* ์ง๋๋ค.
|
|
146
|
+
*/
|
|
147
|
+
equipmentClassIds?: string[];
|
|
134
148
|
/** ์ฌ๋์ด ๋ถ๋ฅด๋ ์ด๋ฆ โ ์์ผ๋ฉด ํ๋ฉด์ด id ๋ฅผ ๋ณด์ธ๋ค(id ๋ฅผ ์ด๋ฆ์ผ๋ก ๋ฒ ๋ผ์ง ์๋๋ค). */
|
|
135
149
|
name?: string;
|
|
136
150
|
/** ์ํ ๊ฒฐ๊ณผ โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค(ยงRefTestResult). */
|
|
@@ -266,6 +280,33 @@ export interface RefPerson {
|
|
|
266
280
|
name?: string;
|
|
267
281
|
/** ์ํ ๊ฒฐ๊ณผ โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค(ยงRefTestResult). */
|
|
268
282
|
testResults?: RefTestResult[];
|
|
283
|
+
/**
|
|
284
|
+
* **์ด ์ฌ๋์ ์ ์ญ ์ ์ฒด์ฑ** โ ์ปค๋ ์ ์ธ์ `personnel[].identity` ๋ก ๊ฐ๋ค.
|
|
285
|
+
*
|
|
286
|
+
* โโ ์ ํ์ํ๊ฐ (์ธํฐ๊ทธ๋ ์ด์
๋ ์ธ์ด ๋ฌผ์, 2026-09-05) โโโโโโโโโโโโโโโโโโโโโ
|
|
287
|
+
* ์ค๋น์์ ์ด ์๋ฆฌ๋ฅผ ๋ง๋ ์ด์ ๊ฐ ์ฌ๋์๊ฒ๋ ๊ทธ๋๋ก ๊ฑธ๋ฆฐ๋ค: **์ง์ญ ์ด๋ฆ์ ๊ทธ ํ์ฅ ์์์๋ง
|
|
288
|
+
* ๊ณ ์ ํ๋ค.** ์ธ๋ฒํฐ `001` ์ด ๋ ๋ฐ์ ์์ ์์ด์ ํจ๊ป ์ง๊ณํ๋ ํ์ชฝ ๋ฐ์ ๋์ด ์ฌ๋ผ์ก๋ค.
|
|
289
|
+
* `E-1001` ๋ ๋ค๋ฅธ ๊ณต์ฅ์ ์์ ์ ์๊ณ , ์ฌ๋ฌ ํ์ฅ์ ํจ๊ป ๋ณด๋ ์๊ฐ ๊ฐ์ ์ผ์ด ๋๋ค.
|
|
290
|
+
*
|
|
291
|
+
* โโ **์ฌ๊ธฐ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ฃ์ง ์๋๋ค** โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
292
|
+
* ์ค๋น์ ์ฌ๋์ด ๊ฐ๋ฆฌ๋ ์๋ฆฌ๊ฐ ์ด๊ฒ์ด๋ค. ์ค๋น์ ์ ์ฒด์ฑ์ ํ๋์จ์ด ์ผ๋ จ๋ฒํธ์ด๊ณ ์๋ฌด์๊ฒ๋ ํด๊ฐ
|
|
293
|
+
* ์๋ค. ์ฌ๋์ ใ์ ์ญ์์ ๊ณ ์ ํ ๊ฐใ์ ์ฌ์๋ฒํธยท์ถ์
์นด๋ยท์ฃผ๋ฏผ๋ฑ๋ก์ฒ๋ผ **๊ทธ ์ฌ๋์ ๊ดํ ์ฌ์ค**
|
|
294
|
+
* ์ด๊ณ , ์ ๋์ ๋ํ์ด ์ฝํ๊ณ ๋ฏธ๋ฌ๋ก ๋ณต์ ๋๊ณ ๊ตฌ๋
์ผ๋ก ๋ฐฉ์ก๋๋ค โ ํ ๋ฒ ๋ค์ด๊ฐ๋ฉด ์ง์์ง์ง ์๋๋ค.
|
|
295
|
+
*
|
|
296
|
+
* ๊ทธ๋์ ์ด ์นธ์ด ์๊ตฌํ๋ ๊ฒ์ **ํ์ฅ์ ์์ ๋ถ์ฌ ์ ์ญ์์ ๊ณ ์ ํด์ง ์ด๋ฆ**์ด๋ค. ๊ทธ ์ด์์ด ์๋๋ค.
|
|
297
|
+
*
|
|
298
|
+
* ```
|
|
299
|
+
* ๋ง๋ค urn:hatiolab:mes-line-a:obj:E-1001 (ยง`objectUri` ๊ฐ ๋ง๋ ๋ค)
|
|
300
|
+
* https://hatiotrailer.com/twin/obj/E-1001
|
|
301
|
+
* ์๋๋ค ์นด๋๋ฒํธ ยท ์ฌ์๋ฒํธ ์๋ฌธ ยท ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ ยท ์์ฒด ์๋ณ์
|
|
302
|
+
* ```
|
|
303
|
+
*
|
|
304
|
+
* ใ์ด ์ฌ๋์ด ๋๊ตฌ์ธ๊ฐใ๋ ์ธ์ฌ ์์คํ
์ด ๋ตํ ๋ฌผ์์ด๊ณ ํธ์์ ๋ฌผ์์ด ์๋๋ค. ํธ์์ **๊ฐ์
|
|
305
|
+
* ์ฌ๋์ธ์ง ๋ค๋ฅธ ์ฌ๋์ธ์ง**๋ง ์๋ฉด ๋๋ค โ ๊ทธ ์ผ์ ๊ฐ์ธ์ ๋ณด๋ ํ์ ์๋ค.
|
|
306
|
+
*
|
|
307
|
+
* ๊ฐ์ด ์์ผ๋ฉด ๋น์ด๋ค. ์ง๊ธ ์๋ณธ์ด ๊ทธ๋ฐ ๊ฐ์ ์ฃผ์ง ์์ผ๋ฏ๋ก ๋น๋ถ๊ฐ ๋น์ด ์๋ ๊ฒ์ด ์ ์์ด๋ค.
|
|
308
|
+
*/
|
|
309
|
+
identity?: string;
|
|
269
310
|
/**
|
|
270
311
|
* ์ํ ๋ฑ๊ธ๋ค โ **ํ์ค `Person.PersonnelClassID`, `maxOccurs="unbounded"`**.
|
|
271
312
|
* ๋ณต์์ธ ๊ฒ์ด ํ์ค์ด๊ณ ๊ทธ๊ฒ์ด ์๊ฒฉ ํํ์ด๋ค: ํ ์ฌ๋์ด ์ฉ์ ์๊ฒฉ๊ณผ ์ง๊ฒ์ฐจ ์๊ฒฉ์ ํจ๊ป ๊ฐ๋๋ค.
|
|
@@ -314,8 +355,21 @@ export interface RefAsset {
|
|
|
314
355
|
assetClassIds?: string[];
|
|
315
356
|
/** ๊ธฐ๋ณธ ์์น. */
|
|
316
357
|
homeLocationId?: string;
|
|
317
|
-
/**
|
|
318
|
-
|
|
358
|
+
/**
|
|
359
|
+
* **์ด ์์ฐ์ ์ ์ญ ์ ์ฒด์ฑ** โ ์ค๋น์ ๊ฐ์ ์ด๋ฆ์ด๋ค(ยง`RefEquipment.identity`).
|
|
360
|
+
*
|
|
361
|
+
* โโ ์ ์ด๋ฆ์ ๋ฐ๊ฟจ๋ (2026-09-04) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
362
|
+
* `gs1Id` ์๋ค. ์ค๋น์์ ๊ทธ ์ด๋ฆ์ ๋ฐ๊พผ ์ด์ ๊ฐ ์ฌ๊ธฐ์๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค โ **GS1 ํค๊ฐ ์๋ ๊ฒ์ด
|
|
363
|
+
* ์ ์์ด๋ค.** ์์ฐ์ ์ค์ธก ๊ฐ๋ ์ ์กฐ๋ฒํธยท์ฌ๋ด ๊ด๋ฆฌ๋ฒํธ์ด๊ณ , GS1 ์ ์๊ตฌํ๋ ์ด๋ฆ์ ๋๋ฉด ๊ทธ๊ฒ์
|
|
364
|
+
* ์ฑ์ฐ๋ ์ชฝ์ด ์๋ ํค๋ฅผ ์ง์ด๋ด๊ฑฐ๋ ์นธ์ ๋น์ ๋๋ค.
|
|
365
|
+
*
|
|
366
|
+
* ๊ทธ๋ฆฌ๊ณ ๋ง์คํฐ๋ ์ด๋ฏธ `identity` ๋ก ๋ธ๋ค(์ค๋นยท์์ฐ ๋ ๋ค). ์ด ์๋ฆฌ๋ง ๋ค๋ฅธ ์ด๋ฆ์ด๋ผ **์๋ณธ์ด
|
|
367
|
+
* ์ฑ์ฐ๋ ์๊ฐ ์กฐ์ฉํ ์ฌ๋ผ์ก๋ค.** ์ง๊ธ ์์ฐ 26๋๊ฐ ๋ค ๋น์ด ์์ด ๋ฒ๋ ค์ง๋ ๊ฐ์ ์์๋ค โ
|
|
368
|
+
* ์ธํฐ๊ทธ๋ ์ด์
๋ ์ธ์ด ๊ทธ๊ฒ์ ์ฌ์ ใ๋๊ฐ ์ฑ์ฐ๋ ์๊ฐใ์ด๋ผ๊ณ ์ง์๋ค.
|
|
369
|
+
*
|
|
370
|
+
* ์๋ฆฌ ์ชฝ(`RefLocation.gs1Id`)์ ๊ทธ๋๋ก๋ค โ ๊ฑฐ๊ธฐ๋ ์ค์ ๋ก SGLN ์ด ์จ๋ค.
|
|
371
|
+
*/
|
|
372
|
+
identity?: string;
|
|
319
373
|
/** ์์ ์์ฑ โ ํ์ค `PhysicalAssetProperty`(์ ์ฌ ํ๋ยท๊ท๊ฒฉ ๋ฑ). */
|
|
320
374
|
properties?: RefResourceProperty[];
|
|
321
375
|
/** ์ ๊ฒฉ์ ๊ฒ์ฆํ ์ํ ๋ช
์ธ๋ค โ ํ์ค `TestSpecificationID`. */
|
|
@@ -235,9 +235,26 @@ function masterToTwin(master, catalog) {
|
|
|
235
235
|
*/
|
|
236
236
|
return { id: l.id, type: l.type, ...(l.name ? { name: l.name } : {}), ...(l.description ? { description: l.description } : {}), capacity: l.capacity ?? 0, ...(l.parallelism !== undefined ? { parallelism: l.parallelism } : {}), ...(l.level ? { level: l.level } : {}), ...(l.properties?.length ? { properties: l.properties } : {}), parentId: l.parentId, ...(l.upstreamId ? { upstreamId: l.upstreamId } : {}), gs1Id: l.gs1Id };
|
|
237
237
|
});
|
|
238
|
+
/*
|
|
239
|
+
* โโ ์ค๋น๊ฐ ๊ตฌ์ญ์ ์ ์์ ์ ์๋ค (2026-09-06) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
240
|
+
* ๋ง์คํฐ๋ ์๋ฆฌ์ ๊ตฌ์ญ์ **ํ ๋ชฉ๋ก**์ ๋ด๊ณ `role` ๋ก ๊ฐ๋ฅธ๋ค(ยง`locationEntries` ยท `areaLocs`).
|
|
241
|
+
* ๊ทธ๋์ ์ค๋น์ `homeLocationId` ๊ฐ ๊ตฌ์ญ์ ๊ฐ๋ฆฌํฌ ์ ์๋ค โ ์ค์ ๋ก `EQ-CAM-SHOWER-01` ์ด
|
|
242
|
+
* `LINE-CAM`(๊ตฌ์ญ)์ ์ ์๊ณ , ๊ทธ๊ฒ์ด ์ ์์ด๋ค(์์ด์ค์๋ ๋ผ์ธ ์ ์ฒด์ ๋ธ๋ฆฐ๋ค).
|
|
243
|
+
*
|
|
244
|
+
* ๊ณ์ฝ์ด ๊ทธ ๊ตฌ๋ถ์ ์ํด `homeLocationKind` ๋ฅผ ๋์๋๋ฐ(`HomeKind = 'location' | 'area'`)
|
|
245
|
+
* **์๋ฌด๋ ์ ์ฑ์ฐ๊ณ ์์๋ค.** ๊ทธ๋์ ์ธ์ ์คํธ๊ฐ ๊ทธ ์ฐธ์กฐ๋ฅผ ใ๋์ด์ก๋คใ๊ณ ๊ฒฝ๊ณ ํ๋ค.
|
|
246
|
+
*
|
|
247
|
+
* ์ง์ํ์ง ์๋๋ค โ ๋ง์คํฐ๊ฐ ์ด๋ฏธ `role` ๋ก ๋งํ๊ณ ์์ผ๋ฏ๋ก ๊ทธ๊ฒ์ ์ฝ๋๋ค.
|
|
248
|
+
*/
|
|
249
|
+
const areaIds = new Set(master.locations.filter(l => l.role === 'area').map(l => l.id));
|
|
238
250
|
const equipment = (master.equipment ?? []).map(e => ({
|
|
239
251
|
id: e.id, kind: e.kind, ...(e.name ? { name: e.name } : {}), ...(e.description ? { description: e.description } : {}), ...(e.testResults?.length ? { testResults: e.testResults } : {}),
|
|
240
|
-
|
|
252
|
+
/* ๋ฑ๊ธ ์์ โ ์ฌ๋ยท์์ฐ๊ณผ ๊ฐ์ ์๋ฆฌ. ๋น ๋จ๋ฆฌ๋ฉด ์๋ณธ์ด ์ฑ์ด ๋ฑ๊ธ์ด ๋ฌธํฑ์์ ์กฐ์ฉํ ๋ฒ๋ ค์ง๋ค. */
|
|
253
|
+
...(e.equipmentClassIds?.length ? { equipmentClassIds: e.equipmentClassIds } : {}),
|
|
254
|
+
homeLocation: e.homeLocationId,
|
|
255
|
+
/* ์๋ฆฌ๋ฉด ์ ์ ๋๋ค โ ๊ณ์ฝ์ ๊ธฐ๋ณธ๊ฐ์ด `location` ์ด๊ณ , ์๋ ์นธ์ ๋ง๋ค๋ฉด ํ๋ฉด์ด ๊ทธ๊ฒ์ ๊ทธ๋ฆฐ๋ค. */
|
|
256
|
+
...(e.homeLocationId && areaIds.has(e.homeLocationId) ? { homeLocationKind: 'area' } : {}),
|
|
257
|
+
mtbfMs: e.mtbfMs, mttrMs: e.mttrMs, ...(e.identity ? { identity: e.identity } : {}),
|
|
241
258
|
...(e.window ? { window: e.window } : {}),
|
|
242
259
|
/* ์์ฑ์ ์๋์ง ์๊ณ ํต๊ณผ โ ์ด๋์๊ฐ ์ถ์ ๊ธฐ๊ฐ kind ๋ณ ์๋๋ฅผ ์ฌ๊ธฐ์ ์ฝ๋๋ค(๋จ์ ์ฝ๋ ๊ทธ๋๋ก). */
|
|
243
260
|
...(e.properties?.length ? { properties: e.properties } : {}), ...(e.workCalendar?.length ? { workCalendar: e.workCalendar } : {}), ...(e.testSpecificationIds?.length ? { testSpecificationIds: e.testSpecificationIds } : {}),
|
|
@@ -261,6 +278,18 @@ function masterToTwin(master, catalog) {
|
|
|
261
278
|
if (master.space.timezone && utcOffsetMinutes === undefined) {
|
|
262
279
|
warnings.push((0, exports.unknownTimezone)(String(master.space.timezone)));
|
|
263
280
|
}
|
|
281
|
+
/*
|
|
282
|
+
* โโ ์ด๋ฆ๋ ํจ๊ป ์ฃ๋๋ค (2026-09-07) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
283
|
+
* ์์์ ํผ ์คํ์
์ **์ด ์๊ฐ์** ๊ฐ์ด๊ณ , ์ด ๋ชจ๋ธ์ ์ ์ฅ๋๋ค. ๊ทธ๋์ ๊ทธ ์๋ ๋ง์คํฐ๋ฅผ ๋ฐ์ ๋ ์
|
|
284
|
+
* ๊ณ์ ๋ก ๊ตณ๋๋ค โ `America/Tijuana`(PST โ480 / PDT โ420)๊ฐ ์๋ฃ์ ์๊ณ , ์ง๋ ๊ตฌ๊ฐ์ ๊ต๋๋ณ๋ก ์ ์ผ๋ฉด
|
|
285
|
+
* ๊ทธ ์์ ์ ํ์ด ์ฌ์ค์ ํ ์๊ฐ ๋ฐ์ด **๋ค๋ฅธ ๊ต๋๋ก** ์ธ๊ฒ ํ๋ค. ์ค๋ฅ๋ ๋์ง ์๋๋ค.
|
|
286
|
+
*
|
|
287
|
+
* ์ด๋ฆ์ด ํจ๊ป ์์ผ๋ฉด ์๋น์ฒ๊ฐ ์๊ฐ๋ง๋ค ๋ค์ ํ ์ ์๋ค(ยง`shiftContext`). ์ปค๋์ ์ด ๊ฐ์ ์ฐ์ง ์๋๋ค.
|
|
288
|
+
*
|
|
289
|
+
* ์คํ์
์ด ์ ํ๋ฆฐ ์ด๋ฆ์ ์ฃ์ง ์๋๋ค โ ๊ทธ ๊ฒฝ์ฐ๋ ์์์ ๊ฒฝ๊ณ ๋ก ๋งํ๊ณ , ํ๋ฆฌ์ง ์๋ ์ด๋ฆ์ ์ค์ด
|
|
290
|
+
* ๋๋ฉด ์๋น์ฒ๊ฐ ๊ทธ๊ฒ์ ๋ฏฟ๊ณ ๋งค๋ฒ ์คํจํ๋ค.
|
|
291
|
+
*/
|
|
292
|
+
const timezone = utcOffsetMinutes !== undefined ? master.space.timezone : undefined;
|
|
264
293
|
/*
|
|
265
294
|
* ์คํผ๋ ์ด์
๋ช
์ธ๋ฅผ model ์ ํต๊ณผ์ํจ๋ค โ ์ปค๋์ด `loadOperations` ๋ก ์๋นํ๋ค(TwinModelDef ํ์ฅ ํ๋,
|
|
266
295
|
* ๋ชจ๋ฅด๋ ์ปค๋์ ๋ฌด์). ์ฌ๊ธฐ์ ๊ฐ์ ์๋์ง ์๋๋ค: ๊ธฐ๊ฐ์ ํ์ค ํ๊ธฐ(ISO 8601)๋ก ์ปค๋๊น์ง ๊ทธ๋๋ก ๊ฐ๋ค.
|
|
@@ -273,9 +302,9 @@ function masterToTwin(master, catalog) {
|
|
|
273
302
|
}
|
|
274
303
|
}
|
|
275
304
|
/* ์ฌ๋๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๋ฑ๊ธยท๊ต๋ ๊ทธ๋๋ก ์ปค๋๊น์ง ๊ฐ๋ค(๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค). */
|
|
276
|
-
const persons = master.persons?.map(p => ({ id: p.id, ...(p.name ? { name: p.name } : {}), ...(p.testResults?.length ? { testResults: p.testResults } : {}), personnelClassIds: p.personnelClassIds, ...(p.window ? { window: p.window } : {}), ...(p.workCalendar?.length ? { workCalendar: p.workCalendar } : {}), ...(p.homeLocationId ? { homeLocation: p.homeLocationId } : {}), ...(p.properties?.length ? { properties: p.properties } : {}), ...(p.testSpecificationIds?.length ? { testSpecificationIds: p.testSpecificationIds } : {}), ...(p.effectiveStart ? { effectiveStart: p.effectiveStart } : {}), ...(p.effectiveEnd ? { effectiveEnd: p.effectiveEnd } : {}) }));
|
|
305
|
+
const persons = master.persons?.map(p => ({ id: p.id, ...(p.name ? { name: p.name } : {}), ...(p.testResults?.length ? { testResults: p.testResults } : {}), personnelClassIds: p.personnelClassIds, ...(p.identity ? { identity: p.identity } : {}), ...(p.window ? { window: p.window } : {}), ...(p.workCalendar?.length ? { workCalendar: p.workCalendar } : {}), ...(p.homeLocationId ? { homeLocation: p.homeLocationId } : {}), ...(p.properties?.length ? { properties: p.properties } : {}), ...(p.testSpecificationIds?.length ? { testSpecificationIds: p.testSpecificationIds } : {}), ...(p.effectiveStart ? { effectiveStart: p.effectiveStart } : {}), ...(p.effectiveEnd ? { effectiveEnd: p.effectiveEnd } : {}) }));
|
|
277
306
|
/* ์์ฐ๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๋ฑ๊ธยท์๋ฆฌ ๊ทธ๋๋ก ์ปค๋๊น์ง. */
|
|
278
|
-
const assets = master.assets?.map(a => ({ id: a.id, ...(a.name ? { name: a.name } : {}), ...(a.testResults?.length ? { testResults: a.testResults } : {}), assetClassIds: a.assetClassIds, homeLocation: a.homeLocationId,
|
|
307
|
+
const assets = master.assets?.map(a => ({ id: a.id, ...(a.name ? { name: a.name } : {}), ...(a.testResults?.length ? { testResults: a.testResults } : {}), assetClassIds: a.assetClassIds, homeLocation: a.homeLocationId, ...(a.identity ? { identity: a.identity } : {}), ...(a.properties?.length ? { properties: a.properties } : {}), ...(a.testSpecificationIds?.length ? { testSpecificationIds: a.testSpecificationIds } : {}), ...(a.effectiveStart ? { effectiveStart: a.effectiveStart } : {}), ...(a.effectiveEnd ? { effectiveEnd: a.effectiveEnd } : {}) }));
|
|
279
308
|
/* ํ๋ชฉ ์ ์ยท๋ฑ๊ธ๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค(ํ์ฐ ๊ณ์๋ ์ปค๋์ด ์ฝ๋๋ค). */
|
|
280
309
|
const materialDefinitions = master.materialDefinitions?.map(d => ({
|
|
281
310
|
id: d.id,
|
|
@@ -320,6 +349,7 @@ function masterToTwin(master, catalog) {
|
|
|
320
349
|
...(materialDefinitions?.length ? { materialDefinitions } : {}),
|
|
321
350
|
...(materialClasses?.length ? { materialClasses } : {}),
|
|
322
351
|
...(utcOffsetMinutes !== undefined ? { utcOffsetMinutes } : {}),
|
|
352
|
+
...(timezone ? { timezone } : {}),
|
|
323
353
|
...(operations?.length ? { operations } : {}),
|
|
324
354
|
...(testSpecifications?.length ? { testSpecifications } : {}),
|
|
325
355
|
...(personnelClasses?.length ? { personnelClasses } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference-master.js","sourceRoot":"","sources":["../../../server/service/reference/reference-master.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Face2 ๋ง์คํฐ ์ธ์ ์คํธ(ADR-0018 ๋ฐ์ ๋ชจ๋) โ ๋ ํผ๋ฐ์ค ์์คํ
(์ค WMS/YMS/MES ๋๋ ๊ฐ์ ๋ ํผ๋ฐ์ค)์\n * ๋ง์คํฐ๋ฅผ ์ฝ์ด ํธ์ ๊ตฌ์กฐ(TwinModelDef) + ๊ณต๊ฐ(Space content)์ ์์ฑ. ์๋ฐฐ์ ์ด ์๋๋ผ ์ธ์ ์คํธ๋ก ์ํฐํฐ๊ฐ ํ๋ฅธ๋ค.\n *\n * ๊ท์จ(ADR-0018): ๋๋ฉ์ธ ํ์
(location.type=๋
ธ๋์ฉ)์ ์ปค๋ ์นดํ๋ก๊ทธ ์ดํ๋ฅผ ๊ทธ๋๋ก ๋ฐ์(๋ฐ๋ช
๊ธ์ง).\n * location ์ role ๋ก ๋
ธ๋(์ด์์ )ยทarea(๊ณต๊ฐ์์ญ)ยทboth ๋ฅผ ๊ตฌ๋ถ โ ๋
ธ๋โTwinModelDef, areaโSpace.areas.\n * ์ขํยทrepresentations ๋ ํธ์ ๊ณต๊ฐ์ธต(๋ณด์/์ถ๊ฐ). ์ค ์์คํ
์ด ์ขํ๋ฅผ ์ ์ฃผ๋ฉด layout ์์ด ์์๋ง ์ธ์ ์คํธ.\n */\n\nimport type { DomainSystem, EquipmentLevel, TestSpecificationCriterion, WorkCalendarEntry } from '@operato/ops-contract'\n\nexport interface RefLocation {\n id: string\n type: string // ๋
ธ๋๋ ์ปค๋ ๋
ธ๋ํ์
(dock/storage/yard-slotโฆ), area ๋ ๊ณต๊ฐ region ํ์
\n name?: string\n description?: string\n role: 'location' | 'area' | 'both'\n parentId?: string\n /**\n * **์ ๊ธฐ์ ์ผ๋ก ์ด๋์ ๋ฐ๋๊ฐ** โ ์ด ์๋ฆฌ์ ์ ๊ธฐ๋ฅผ ์ฃผ๋ ์๋ฅ ์๋ฆฌ(์ปค๋ ๊ณ์ฝ์ `upstreamId`).\n *\n * `parentId`(๊ณต๊ฐ ํฌํจ)์ ๋ฐ๋ก ๋๋ ์ด์ ๋ ์ปค๋ ๊ณ์ฝ์ ์ ํ ์๋ค. ์ฌ๊ธฐ์ ๋น ๋จ๋ฆฌ๋ฉด ๋ง์คํฐ๊ฐ ๋งํ ๊ณํต์ด\n * ๋ชจ๋ธ๊น์ง ์ค์ง ๋ชปํ๊ณ , ๋ฟ๋ฆฌ ๊ณ๋ ํ์ ์ด ๋ถ๊ธฐ ๊ณ๋๊ธฐ๊น์ง ๋ฟ๋ฆฌ๋ก ์ธ์ด **๋ถํ๊ฐ ๋ ๋ฐฐ๋ก** ๋ณด์ธ๋ค.\n */\n upstreamId?: string\n /** ์ ์ฅ ์ฉ๋ โ ์ด ์๋ฆฌ์ ๋์์ ๋์ผ ์ ์๋ ๋ฌผํ ์. */\n capacity?: number\n /**\n * ๋์ ์ฒ๋ฆฌ ์ โ ์ด ์๋ฆฌ์์ ํ ๋ฒ์ ์งํ๋ ์ ์๋ ์์
์. **์ ์ฅ ์ฉ๋๊ณผ ๋ค๋ฅธ ์ถ**์ด๋ค\n * (์์ฌ๋ฅผ 20๊ฐ ์์ ๋๋ ์ ๋จ ์คํ
์ด์
์ด ํ ๋ฒ์ ํ ๋๋ง ๊น๋๋ค). ๋ฏธ์ง์ =์ ์ฝ ์์.\n */\n parallelism?: number\n /**\n * **ISA-95 ์ค๋น ๊ณ์ธต ๋จ๊ณ** โ `EquipmentLevel` ์ด๊ฑฐ๊ฐ(`ProductionLine`ยท`StorageZone`ยท`WorkCenter`โฆ).\n *\n * `type` ์ ํ์ฅ์ ๋ฑ๋ง(`paint-booth`)์ด๊ณ ์ด๊ฒ์ **ํ์ค์ด ์ ํ ์ญํ **์ด๋ค. ๋์ ๋ค๋ฅธ ์ถ์ด๋ผ ํจ๊ป ๋ ๋ค โ\n * ์ฐ๋ยท์ง๊ณ๋ ํ์ค ์ถ์ผ๋ก, ํ๋ฉด์ ํ์ฅ ๋ฑ๋ง๋ก. ๋ฏธ์ง์ ์ด๋ฉด ๊ทธ ์๋ฆฌ์ ํ์ค ์ญํ ์ ์์ง ๋ชจ๋ฅธ๋ค๋ ๋ป์ด๊ณ ,\n * ์ง์ํด ์ฑ์ฐ์ง ์๋๋ค.\n */\n level?: EquipmentLevel\n /**\n * ์๋ฆฌ์ **์ด๋ฆฐ ์์ฑ** โ ํ์ค `OperationalLocationProperty`(์ค๋นยท์ฌ๋ยท์์ฐ๊ณผ ๊ฐ์ ๋ชจ์).\n *\n * ๋ฌด์์ด ์ฌ๊ธฐ ์ค๋ฆฌ๋: **์๋ฆฌ์ ๋ฌผ๋ฆฌ๋**์ด๋ค. ์๋์ง์ ๊ณ์ฝ์ ๋ ฅ(`contract.kW`)์ด ์ฒซ ์ฌ๋ก๋ค โ\n * ๊ทธ ๊ฐ์ด ์์ ์๋ฆฌ๊ฐ ์์ด์ EMS ์ปค๋์ ๊ณ์ฝ ๋๋น ํ์ ์ ํ ์ ์์๋ค(์๋ฆฌ๊ฐ ์์ผ๋ฉด ์ฌ์ค์ด\n * ๋ค์ด์ค์ง ๋ชปํ๋ค). ์ปค๋์ ์๊ธฐ๊ฐ **์ฝ๋** ์์ฑ id ๋ง ์ ์ธํ๊ณ (`EMS_PROPERTY`) ๋๋จธ์ง๋ ๋๋ฅธ๋ค.\n */\n properties?: RefResourceProperty[]\n footprint?: { x: number; y: number; w: number; h: number } // ์์ผ๋ฉด area ๊ธฐํ + ๋
ธ๋ ์ค์ฌ์ขํ\n gs1Id?: string // ์ ์ GS1 ์ ์ฒด์ฑ(ยงJ) โ ์์น=SGLN. ๊ฒฐํฉ(tag)/์ถ์ canonical id. ๋ฐ์๋ค์ด๊ธฐ ๊ฒฝ๊ณ์ ๋ถ์ฌ(๋ก์ปฌ id=name/xref ๋ก ๋ณด์กด).\n}\n\n/**\n * ์ค๋น ์์ฑ โ **ISA-95 `EquipmentSpecificationProperty`(`OpEquipmentSpecificationPropertyType`) 1:1.**\n * ๊ทธ ํ์
๋ `ID` + `Value`(`ValueString`ยท`DataType`ยท`UnitOfMeasure`) ์ด๋ฏ๋ก ๊ณต์ ๋ชจ์์ ๊ฐ์ ๋ชจ์์ด๋ค.\n *\n * ๋จ์ ์ฝ๋๋ **UN/CEFACT ๊ถ๊ณ 20 ๊ณตํต์ฝ๋**(EPCIS `uom` ๊ณผ ๊ฐ์ ์ฝ๋๊ณ): ์๋๋ `MTS`(metre per\n * second) ๋๋ `KMH`(kilometre per hour). ์ฝ๋๋ฅผ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ช
ํ์ง ์๋๋ค.\n */\n/**\n * ์์ ์์ฑ โ **์ปค๋ `ResourceProperty` ์ ๊ฐ์ ๋ชจ์**์ด๊ณ , ๊ทธ ๋ชจ์์ ISA-95 ๊ฐ ์ธ ์์์ ๋๊ฐ์ด\n * ์ ์ํ ๊ฒ์ด๋ค(`EquipmentPropertyType` ยท `PersonPropertyType` ยท `PhysicalAssetPropertyType`).\n *\n * ๊ทธ๋์ ์์๋ง๋ค ๋ค๋ฅธ ์์ฑ ํ์
์ ๋์ง ์๋๋ค โ ์์ ์๋ ์ค๋น๋ง ์์ฑ์ ๊ฐ์ก๊ณ (RefEquipmentProperty),\n * ์ธ์ยท์์ฐ์ ๋ถ๋ ์ฌ์ค์ **์ค์ ์๋ฆฌ๊ฐ ์์ด์ ๋ค์ด์ค์ง ๋ชปํ๋ค.**\n */\nexport interface RefResourceProperty {\n id: string\n description?: string\n value?: string\n /** ํ์ค `Value.DataType`. */\n dataType?: string\n /** ํ์ค `Value.UnitOfMeasure` โ UN/CEFACT ๊ณตํต์ฝ๋. ๋ฌผ๋ฆฌ๋์ ๋จ์๊ฐ ์์ผ๋ฉด ์๋น์ฒ๊ฐ ๊ฑฐ์ ํ๋ค. */\n uom?: string\n /** ํ์ ์์ฑ(์ฌ๊ท) โ ํ์ค `<X>PropertyChild`. */\n children?: RefResourceProperty[]\n /** ์ด ๊ฐ์ฒด ์์ฑ์ด ๊ตฌ์ฒดํํ๋ ๋ฑ๊ธ ์์ฑ โ ํ์ค `<X>ClassPropertyID`. */\n classPropertyId?: string\n}\n\n/** ์ ์ด๋ฆ โ ์ค๋น ์ ์ฉ์ด๋ ์์ ์ ๋ณ์นญ(์๋น์ฒ ํธํ). ์ ๊ท ์์ฑ์ `RefResourceProperty`. */\nexport type RefEquipmentProperty = RefResourceProperty\n\n/**\n * ์์ **๋ฑ๊ธ ์ ์** โ ์ปค๋ `ResourceClassDef` ์ ๊ฐ์ ๋ชจ์์ด๊ณ , ๊ทธ ๋ชจ์์ ISA-95 ๊ฐ ์ธ ์์์ ๋๊ฐ์ด\n * ์ ์ํ ๊ฒ์ด๋ค(`PersonnelClassType`ยท`EquipmentClassType`ยท`PhysicalAssetClassType`).\n *\n * ์ ํ์ํ๊ฐ: ์ ์์คํ
์ ๋ฑ๊ธ **์ฒด๊ณ**๋ฅผ ๊ฐ๊ณ ์๋ค(\"6์ถ ์ฉ์ ์๊ฒฉ์\" ๋ \"์ฉ์ ์๊ฒฉ์\" ์ด๊ณ , ๊ทธ๊ฒ์\n * \"์์ฐ์ง\" ์ด๋ค). ๊ทธ ์ฒด๊ณ๊ฐ ๋ค์ด์ฌ ์๋ฆฌ๊ฐ ์์ผ๋ฉด ์๊ตฌ์ ์์์ด **๋ฌธ์์ด์ด ๋๊ฐ์ ๋๋ง** ๋ง์,\n * ํ์ฅ์์๋ ๋๋ ๋ฐฐ์ ์ด ๋ชจ๋ธ์์ ๋งํ๋ค.\n */\nexport interface RefResourceClass {\n id: string\n description?: string\n /** ์์ ๋ฑ๊ธ๋ค โ ํ์ค `<X>ClassBaseID`(๋ณต์ = ๋ค์ค ์์). */\n baseIds?: string[]\n properties?: RefResourceProperty[]\n testSpecificationIds?: string[]\n /** ์ ํจ ๊ธฐ๊ฐ(ISO) โ ํ์ค `EffectiveStartDate`/`EffectiveEndDate`. ๋ฐ์ด๋ฉด ์๊ฒฉ์ด ์ฑ๋ฆฝํ์ง ์๋๋ค. */\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * ๊ฒ์ฌ ๋ช
์ธ โ **์์์ด ๊ฐ๋ฆฌํค๋ ๋์**(ISA-95 `TestSpecification`).\n *\n * ํ์ค ํ๋๋ ์
๋ง ๋ด๋๋ค(`ID`ยท`Description`ยท`Version`) โ ์ฌ๋ ์์ฑ๊ณผ ํฉ๊ฒฉ ๊ธฐ์ค์ ์์ง 1์ฐจ ์ถ์ฒ์\n * ๋์กฐํ์ง ์์๋ค(์ปค๋ ๊ณ์ฝ์ ๋จธ๋ฆฌ๋ง์ด ๊ทธ ์ฌ์ค์ ์ ์ด ๋์๋ค).\n */\n/**\n * ์ํ ๊ฒฐ๊ณผ โ **\"์ด ๊ฐ์ฒด๊ฐ ๊ทธ ์ํ์ ํต๊ณผํ๋ค\"** ๋ ๊ธฐ๋ก(ISA-95 ๊ฒฐ๊ณผ).\n *\n * ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋ ๊ณณ์ ํธ์์ด ์๋๋ค(์ธ์ฌยท์ ๋น ์์คํ
์ด ๊ธฐ๋กํ๋ค) โ ๊ทธ๋์ ๊ด์ธก์ด๋ฉด์ **์ ์ธ ๊ฒฝ๋ก๋ก** ์จ๋ค.\n * ์ปค๋์ ์ด ๊ฐ์ด ์์ ๋๋ง ์๊ฒฉ์ ํ์ ํ๋ค: ์์ผ๋ฉด ์ ์ฝ์ด ์๋๊ณ (๋ผ์ธ์ด ๊ตถ์ง ์๋๋ค), ์์ผ๋ฉด ๋ง๋ฃยท\n * ๋ถํฉ๊ฒฉ์ด ๋ฐฐ์ ์ ๋ง๋๋ค.\n */\nexport interface RefTestResult {\n specId: string\n result: 'pass' | 'fail'\n at?: string\n /** ์์ผ๋ฉด ๋ฌด๊ธฐํ โ ์ง์์ผ๋ก ๊ธฐํ์ ๋ง๋ค๋ฉด ๋ฉ์ฉกํ ์๊ฒฉ์๊ฐ ์ค๋ฅ ์์ด ์ฌ๋ผ์ง๋ค. */\n expiresAt?: string\n}\n\nexport interface RefTestSpecification {\n id: string\n /** ํ์๋ช
โ i18n ํค์ผ ์ ์๋ค. ์ฝ๋ ์ดํ๋ฅผ ํ๋๋ก ๋ง์ถ๋ ค๊ณ ์ธ์ ์คํธ๊ฐ `name` ์ผ๋ก ์ฎ๊ธด๋ค. */\n description?: string\n version?: string\n /**\n * ํ์ ๊ธฐ์ค๋ค โ ์ปค๋ ๊ณ์ฝ์ `TestSpecification.criteria` ๋ฅผ ๊ทธ๋๋ก ๋๋ฅธ๋ค.\n *\n * **๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค.** ์ปค๋ ํ์
์ ๊ทธ๋๋ก ์ฐ๋ฏ๋ก `limit.{minimum,maximum,uom}` ยท\n * `expression` ยท `evaluatedPropertyId` ๊ฐ ์๋ณธ์์ ์ปค๋๊น์ง ํ ์ด๋ฆ์ผ๋ก ๊ฐ๋ค.\n *\n * ์ ์ธํ์ง ์์๋ ๋ช
์ธ๋ ์ฑ๋ฆฝํ๋ค(์ด๋ฆ๋ง์ผ๋ก ใ๋ฌด์์ผ๋ก ๊ฒ์ฆํ๋ใ์ ๋ตํ๋ค). ์ ์ธํ๋ฉด **ํ์ ์\n * ๊ทผ๊ฑฐ๊ฐ ์๋์ง**๋ฅผ ๋ฌผ์ ์ ์๊ฒ ๋๋ค โ ์ปค๋์ `criterionSaysNothing` ์ด ๊ทธ๊ฒ์ ์ผ๋ค.\n */\n criteria?: TestSpecificationCriterion[]\n}\n\nexport interface RefEquipment {\n id: string\n kind: string\n /** ์ฌ๋์ด ๋ถ๋ฅด๋ ์ด๋ฆ โ ์์ผ๋ฉด ํ๋ฉด์ด id ๋ฅผ ๋ณด์ธ๋ค(id ๋ฅผ ์ด๋ฆ์ผ๋ก ๋ฒ ๋ผ์ง ์๋๋ค). */\n name?: string\n /** ์ํ ๊ฒฐ๊ณผ โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค(ยงRefTestResult). */\n testResults?: RefTestResult[]\n description?: string\n homeLocationId: string\n mtbfMs?: number // ํ๊ท ๊ณ ์ฅ ๊ฐ๊ฒฉ(ํ๋ฅ ์ ๊ณ ์ฅ) โ ์ง์ ์ ์ปค๋์ด breakdown ์๋ฎฌ โ ์ฃผ๋ชฉ(๊ณ ์ฅ) ๋ฐ์\n mttrMs?: number // ํ๊ท ์๋ฆฌ ์๊ฐ\n /**\n * **์ด ์ค๋น์ ์ ์ญ ์ ์ฒด์ฑ** โ ์ปค๋ ์ ์ธ์ `equipment[].identity` ๋ก ๊ทธ๋๋ก ๊ฐ๋ค.\n *\n * ์์ ์ด๋ฆ์ `gs1Id` ์๋ค. ๊ทธ๋ฐ๋ฐ **GS1 ํค๊ฐ ์๋ ๊ฒ์ด ์ ์์ด๋ค** โ ์ค์ธกํ ๊ฐ์ ์ธ๋ฒํฐ์\n * ํ๋์จ์ด ์๋ณ์(`ES100000007d8d061d-1`)์ด๊ณ , ์๋ณธ์ด GIAI ๋ฅผ ์ฃผ๋ฉด ๊ทธ๊ฒ๋ ์ฌ๊ธฐ ๋ค์ด์จ๋ค.\n * ์ด๋ฆ์ด ํ ์ข
๋ฅ๋ง ๊ฐ๋ฆฌํค๋ฉด ๋ค๋ฅธ ์ข
๋ฅ๊ฐ ๋ค์ด์ฌ ๋ ๊ทธ ์๋ฆฌ๋ฅผ ๋ชป ์ด๋ค.\n *\n * ์๋ฆฌ(`RefLocation.gs1Id`)๋ ๊ทธ๋๋ก๋ค โ ๊ทธ์ชฝ์ ์ค์ ๋ก SGLN ์ด ์จ๋ค.\n */\n identity?: string\n /**\n * ๊ต๋(๊ฐ๋์๊ฐ) โ ์ด ์๊ฐ๋์๋ง ๋ฐฐ์ ๋๋ค. `startHour <= endHour` ๋ฉด ๊ฐ์ ๋ , ๋์ด๊ฐ๋ฉด ์ผ๊ฐ(22โ6).\n * ๋ฏธ์ง์ =24์๊ฐ ๊ฐ์ฉ. ๊ต๋ ๋ฐ ์์์ ๊ณ ์ฅยท๊ณํ์ ์ง์ **๊ตฌ๋ณ๋๋ ์ด์ **๋ก ์ฐ๋ค(์ํ์ ๋๋ฌ๋๋ค).\n */\n window?: { startHour: number; endHour: number }\n /**\n * ๊ทผ๋ฌด ์บ๋ฆฐ๋ โ ํ์ค `WorkCalendarEntry`(๋ณต์). ์์ผ๋ฉด `window` ๋ณด๋ค ์ด๊ฒ์ ๋ณธ๋ค.\n *\n * ์ถ์ ํ๋ ์์ํฌ `@things-factory/work-shift` ์ `WorkShift`(`fromDate`ยท`fromTime`ยท`toDate`ยท`toTime`)์\n * ๋ง์ถฐ ๋์๋ค โ ๊ทธ ์ํฐํฐ๋ฅผ ๊ต๋์ ์ ๋ณธ์ผ๋ก ๊ฒฐ์ ํ ๋ ์ง์ ๋งคํ์ด ๋๊ฒ. **์์ง ๊ฒฐ์ ํ์ง ์์๋ค**:\n * ๊ทธ ์ํฐํฐ์๋ ์์ ์ฐ๊ฒฐ๊ณผ ๋น๊ทผ๋ฌด(ํด์ผ)๊ฐ ์์ด ํ์ฅ์ด ํจ๊ป ํ์ํ๊ณ , operato-twin ์ ์์กด์ฑ ์ถ๊ฐ๋\n * ์ฑ ์ํคํ
์ฒ ๊ฒฐ์ ์ด๋ค(์ปค๋ฒ๋ฆฌ์ง ยง4-7 ์ ๊ฒฐ์ ์ง์ ์ผ๋ก ๊ธฐ๋ก).\n */\n workCalendar?: WorkCalendarEntry[]\n /**\n * ์ค๋น ์์ฑ(์๋ ๋ฑ) โ ์์ผ๋ฉด **์ด๋์๊ฐ์ ๊ฑฐ๋ฆฌ์์ ๊ณ์ฐํ ์ ์๋ค**(์๋ ์์ด ๊ฑฐ๋ฆฌ๋ง์ผ๋ก๋ ์๊ฐ์ด\n * ์ ๋์จ๋ค). ๊ทธ๋๋ ์ปค๋ ์์๋ก ๋จ์ด์ง๊ณ ๊ทธ ์ฌ์ค์ด `specCoverage()` ์ ๋จ๋๋ค.\n */\n properties?: RefResourceProperty[]\n /** ์ ๊ฒฉ์ ๊ฒ์ฆํ ์ํ ๋ช
์ธ๋ค โ ํ์ค `TestSpecificationID`(๊ต์ ๋ฑ). */\n testSpecificationIds?: string[]\n /**\n * ์ ํจ ๊ธฐ๊ฐ โ **ํ์ค `EffectiveStartDate` / `EffectiveEndDate`**(๊ฐ์ฒด ํ์
์
๋ชจ๋์ ์๋ค).\n *\n * ์์ผ๋ฉด **ํ๊ธฐํ ๊ฒ์ด ์๊ตฌํ ์ด์ ์๋ค**: ๋ฐฐ์ ๋์์ ๋จ๊ณ , ๊ฐ์ฉ ์์ ๋ค์ด๊ฐ๊ณ , ํ๋ฉด์ ๋ฌ๋ค.\n * ๋์
์์ ์ธ ๊ฒ์ ๋ฐ๋๋ก ์ค๋๋ถํฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ๊ธฐ๊ฐ ๋ฐ์ด๋ฉด ์ปค๋์ด ๊ทธ ์๊ฐ์ ๋ชจ๋ธ์์\n * ๋นผ๊ณ **์ด์ ๋ฅผ ๋ฌ์ ๋จ๊ธด๋ค**(`effectivity: 'not-yet' | 'expired'`) โ ์๋ฆฌ์ง ์๊ณ ์ง์ฐ์ง ์๋๋ค.\n */\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * ๊ณต์ ๋ชจ์ โ ์ปค๋ `OperationParameter`(= ISA-95 `ParameterSpecification`/`ParameterType`) ์ **๊ฐ์ ๋ชจ์**.\n * ์ด๋ฆ์ ๋ฐ๊พธ์ง ์๋๋ค: ์ธ์ ์คํธ ๊ฒฝ๊ณ์์ ์ดํ๊ฐ ๊ฐ๋ฆฌ๋ฉด ๊ทธ ์๋ฆฌ์์ ๋ฐฉ์ธ์ด ์๊ธด๋ค.\n * ID ์ดํ์ ์ ๋ณธ์ ์ปค๋ `OP_PARAM`(ํ์ค์ด ํ๋ผ๋ฏธํฐ ID ๋ฅผ ์ ํ์ง ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ํ ๊ณณ์์ ์ ํ๋ค).\n */\nexport interface RefOperationParameter {\n id: string\n /** ISA-95 `Value.ValueString` โ ํ์ค์ด ๋ฌธ์์ด๋ก ์ฃ๋๋ค. ๊ธฐ๊ฐ ๋ชจ์๋ ISO 8601(`PT8M`). */\n value: string\n /** ISA-95 `Value.UnitOfMeasure`. ๋ฌด์ฐจ์(๋น์จ)์ด๋ฉด ์๋ต. */\n uom?: string\n}\n\n/**\n * ๊ณต์ ์ ์์ฌ ์๊ตฌยท์ฐ์ถ โ **ISA-95 `OperationsSegment.MaterialSpecification`** ๊ณผ ๊ฐ์ ๋ชจ์.\n * ์ธ์ยท์ค๋นยท์์ฐ ๋ช
์ธ์ ๊ฐ์ ์๋ฆฌ์ ์์ด์ผ 4๋ ์์์ด ๋์นญ์ด ๋๋ค(์์ฌ๋ง ๋น ์ ธ ์์๋ค).\n */\nexport interface RefOpMaterialSpecification {\n id?: string\n /** ํ๋ชฉ ๋ฑ๊ธ์ผ๋ก ์๊ตฌ โ ํ์ค `MaterialClassID`. */\n materialClass?: string\n /** ํน์ ํ๋ชฉ์ผ๋ก ์๊ตฌ โ ํ์ค `MaterialDefinitionID`. */\n materialDefinition?: string\n /** ํ์ค `MaterialUse` โ ์ด ๊ณต์ ์์์ ์ฐ์. */\n use: 'consumed' | 'produced' | 'consumable'\n /** ํ์ค `Quantity`. ๋จ์ ๋ฏธ์ง์ ์ด๋ฉด ๊ฐ์. */\n quantity: number\n uom?: string\n}\n\n/** ์์์๊ฐ ๋ณ๋ โ **ํ์ค ๋ฐ ํ์ฅ**(ISA-95 Duration ์ ์ค์นผ๋ผ). ์ปค๋ `DurationVariability` ์ ๋ํ. */\nexport interface RefOperationVariability {\n distribution: 'constant' | 'exponential' | 'uniform' | 'triangular'\n min?: string\n max?: string\n mode?: string\n}\n\n/**\n * ์คํผ๋ ์ด์
๋ช
์ธ โ ISA-95 `OperationsSegment`. ์ปค๋ `OperationDef` ์ ํ๋ ์ด๋ฆ์ด 1:1์ด๋ค.\n *\n * **์ด๊ฒ์ด ์์ผ๋ฉด ์๋ฎฌ๋ ์ด์
์ ์๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์ฝ๋์ ๊ณ ์ ํ ์์๋ค.** ์ ์์คํ
(๋๋ ๊ฐ์ ๋ ํผ๋ฐ์ค)์ด\n * ๊ณต์ ๋ณ ์์ยท๋ณ๋ยท์์จ์ ๋งํด ์ค์ผ ์์ธก์ด ๊ทธ ํ์ฅ์ ์์ธก์ด ๋๋ค. ์ฃผ์ง ์์ผ๋ฉด ์ปค๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก\n * ๊ตด๋ฌ๊ฐ๊ณ , **๊ธฐ๋ณธ๊ฐ์ ์ผ๋ค๋ ์ฌ์ค์ ์ปค๋ `specCoverage()` ๊ฐ ๋ฐํ๋ค**(์๋ฆฌ์ง ์๊ณ ๋์ด๊ฐ์ง ์๋๋ค).\n */\nexport interface RefOperation {\n /** ์์
์ข
๋ฅ ํค โ ์ปค๋ `FlowTask.kind` ์ ๊ฐ์ ๊ฐ์ด์ด์ผ ๋ช
์ธ๊ฐ ๊ทธ ์์
์ ๋ถ๋๋ค. */\n key: string\n label: string\n intent: 'transport' | 'process' | 'dwell'\n locationType?: string\n resourceType?: string\n bizStep?: string\n /** ISA-95 `OperationsSegment.Duration` โ ISO 8601 ๊ธฐ๊ฐ(`PT12M`). */\n duration?: string\n variability?: RefOperationVariability\n parameters?: RefOperationParameter[]\n /**\n * ํ์ ์ธ์ โ ISA-95 `PersonnelSpecification`(`PersonnelClassID` + `Quantity`) 1:1.\n * ์์ผ๋ฉด ์ฌ๋ ์์ด ๋๋ ๊ณต์ ์ด๋ค(์ค๋น๋ง ์ก๋๋ค).\n */\n personnelSpecification?: { personnelClass?: string; quantity: number }[]\n /** ํ์ ๋ฌผ๋ฆฌ ์์ฐ โ ISA-95 `PhysicalAssetSpecification`(๋ฑ๊ธ + ์๋). ๋น ํ๋ ํธ๊ฐ ์์ผ๋ฉด ๋ชป ๋๊ฐ๋ค. */\n physicalAssetSpecification?: { assetClass?: string; quantity: number }[]\n /**\n * ํ์ยท์ฐ์ถ ์์ฌ โ ISA-95 `MaterialSpecification`. **4๋ ์์ ์ค ์์ฌ๋ง ์ด ์๋ฆฌ๊ฐ ์์๋ค** โ\n * ๊ทธ๋์ ๋ถํ์ด ๋จ์ด์ ธ ๋ผ์ธ์ด ์๋ ์ํฉ์ด ์์ธก์ ๋ํ๋์ง ์์๋ค.\n * BOM ์ \"๋ช ๊ฐ\" ๋ ์ฌ๊ธฐ๋ค(ํ๋ชฉ ์ ์์ ์กฐ๋ฆฝ ๊ตฌ์กฐ์๋ ์๋์ด ์๋ค โ 1์ฐจ ์ถ์ฒ ํ์ธ).\n */\n materialSpecification?: RefOpMaterialSpecification[]\n}\n\n/**\n * ์ฌ๋ โ **ISA-95 `Person`.** ์ค๋น์ ๋ณ๊ฐ ์์์ด๋ค(๊ณ ์ฅยท์ค๋นํจ์จ์ด ์๋๋ผ ๋ฑ๊ธยท๊ต๋๋ก ์ฐ๋ค).\n * `personnelClass` ๊ฐ ISA-95 `PersonnelClassID` โ ๊ณต์ ์ ํน์ ์ธ์ด ์๋๋ผ **๋ฑ๊ธ์ผ๋ก** ์ธ์์ ์๊ตฌํ๋ค.\n */\nexport interface RefPerson {\n id: string\n name?: string\n /** ์ํ ๊ฒฐ๊ณผ โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค(ยงRefTestResult). */\n testResults?: RefTestResult[]\n /**\n * ์ํ ๋ฑ๊ธ๋ค โ **ํ์ค `Person.PersonnelClassID`, `maxOccurs=\"unbounded\"`**.\n * ๋ณต์์ธ ๊ฒ์ด ํ์ค์ด๊ณ ๊ทธ๊ฒ์ด ์๊ฒฉ ํํ์ด๋ค: ํ ์ฌ๋์ด ์ฉ์ ์๊ฒฉ๊ณผ ์ง๊ฒ์ฐจ ์๊ฒฉ์ ํจ๊ป ๊ฐ๋๋ค.\n */\n personnelClassIds?: string[]\n /** ๊ต๋ โ ์ค๋น์ ๊ฐ์ ๋ชจ์. ๋ฏธ์ง์ =24์๊ฐ ๊ฐ์ฉ. */\n window?: { startHour: number; endHour: number }\n /** ๊ทผ๋ฌด ์บ๋ฆฐ๋ โ ํ์ค `WorkCalendarEntry`(๋ณต์). 2๊ต๋ยทํด๊ฒยทํด์ผ์ ํจ๊ป ํํํ๋ค. */\n workCalendar?: WorkCalendarEntry[]\n /**\n * ๊ธฐ๋ณธ ์์น โ ํ์ค `Person.OperationalLocation`. ์์ผ๋ฉด \"์ด ๋ผ์ธ์ ๋ช ๋ช
์๋\" ๋ฅผ ๋ฌผ์ ์ ์๋ค.\n * ์ฌ๋์ ์์ง์ด๋ฏ๋ก ์ด ๊ฐ์ **์ถ๋ฐ์ **์ด๊ณ , ์ค์ ์์น๋ ๊ด์ธก(person.status)์ด ๊ฐฑ์ ํ๋ค.\n */\n homeLocationId?: string\n /**\n * ์์ ์์ฑ โ ํ์ค `PersonProperty`. **์๊ฒฉ์ฆยท์๋ จ๋๊ฐ ์ฌ๊ธฐ ๋ค์ด๊ฐ๋ค.**\n *\n * ํ์ค์๋ ์๊ฒฉ(Qualification)์ด๋ผ๋ ๋ณ๋ ์์๊ฐ ์๋ค(`B2MML-Personnel.xsd` ํ์ธ). ์๊ฒฉ์\n * โ ๋ฑ๊ธ ๋ณต์ ์์์ผ๋ก(`personnelClassIds: ['welder-certified','forklift-licensed']`) โก\n * ์ฆ๋น์ ์ด ์์ฑ์ผ๋ก(์๊ฒฉ์ฆ ๋ฒํธยท๋ง๋ฃ์ผ), โข ๊ฒ์ฆ ์ํ์ ํ์ค `TestSpecificationID`(์์ง ๋ฏธ๊ตฌํ).\n */\n properties?: RefResourceProperty[]\n /** ์๊ฒฉ์ ๊ฒ์ฆํ ์ํ ๋ช
์ธ๋ค โ ํ์ค `TestSpecificationID`(์ฐธ์กฐ๋ง; ์ํ ๋ช
์ธยท๊ฒฐ๊ณผ ๋ชจ๋ธ์ ์์ง ์๋ค). */\n testSpecificationIds?: string[]\n /** ์ ํจ ๊ธฐ๊ฐ โ ์ฌ๋์๊ฒ๋ **์
์ฌ ์ ยทํด์ฌ ํ**๋ค(์๊ฒฉ ๋ง๋ฃ๋ ๋ฑ๊ธ ์ชฝ ๊ธฐ๊ฐ์ด๋ค: ์ฌ๋์ ๋จ๊ณ ์๊ฒฉ๋ง ๋๊ธด๋ค). */\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * ๋ฌผ๋ฆฌ ์์ฐ(๋ฐ๋ณต์ฌ์ฉ) โ **ISA-95 `PhysicalAsset`, GS1 `GRAI`.**\n * ํ๋ ํธยท๋ยท์ฉ๊ธฐ์ฒ๋ผ **๋๊ฐ๋ค ๋์์ค๋** ๊ฒ. ๋ฌผ๋ฅ๋จ์(SSCC)์ ๋ค๋ฅด๋ค: SSCC ๋ ๊ทธ ํ๋ ํธ์ ์ค๋ฆฐ ํ๋ฌผ\n * ํ ๋ฉ์ด๋ฆฌ์ด๊ณ , GRAI ๋ ํ๋ ํธ ์์ฒด๋ค(์ค๋์ ์ด ํ๋ฌผ, ๋ด์ผ์ ์ ํ๋ฌผ์ ์ฃ๋๋ค).\n */\nexport interface RefAsset {\n id: string\n name?: string\n /** ์ํ ๊ฒฐ๊ณผ โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค(ยงRefTestResult). */\n testResults?: RefTestResult[]\n /**\n * ์ํ ๋ฑ๊ธ๋ค โ ํ์ค `PhysicalAssetClassID`(๋ณต์). ํ๋ ํธ๊ฐ 'euro-pallet' ์ด๋ฉด์ 'food-grade' ์ผ ์ ์๋ค.\n * ๊ณต์ ์ ์๊ตฌ๋ ๋ฑ๊ธ ํ๋ + ์๋์ด๋ค(ํ์ค `PhysicalAssetSpecification`).\n */\n assetClassIds?: string[]\n /** ๊ธฐ๋ณธ ์์น. */\n homeLocationId?: string\n /** ์ ์ GS1 ์ ์ฒด์ฑ โ ๋ฐ๋ณต์ฌ์ฉ ์์ฐ=GRAI. */\n gs1Id?: string\n /** ์์ ์์ฑ โ ํ์ค `PhysicalAssetProperty`(์ ์ฌ ํ๋ยท๊ท๊ฒฉ ๋ฑ). */\n properties?: RefResourceProperty[]\n /** ์ ๊ฒฉ์ ๊ฒ์ฆํ ์ํ ๋ช
์ธ๋ค โ ํ์ค `TestSpecificationID`. */\n testSpecificationIds?: string[]\n /** ์ ํจ ๊ธฐ๊ฐ โ ์์ฐ์์๋ **ํ๊ธฐํ ํ๋ ํธ๊ฐ ํ์์ ๋น ์ง๋ ๊ฒ**์ด๋ค(ํ์ ๋์ ์๊ฐ ๋ถํ์ง ์๊ฒ). */\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * ํ๋ชฉ ์ ์ โ **ISA-95 `MaterialDefinition`.**\n *\n * ์์ผ๋ฉด ๋กํธ๋ง ๊ด์ธก์ผ๋ก ๋ค์ด์ค๊ณ **ํ๋ชฉ์ด ๋ฌด์์ธ์ง๋ ์๋ฌด ๋ฐ๋ ์๋ค.** ๊ทธ๋์ ๊ฐ์ ๋กํธ๋ฅผ 100๊ฐ๋ก\n * ๋ฐ์๋ \"๋ช kg ์ธ๊ฐ\" ์ ๋ตํ ์ ์๋ค(์ปค๋ `quantityIn` ์ด ํ์ฐ์ ๊ฑฐ๋ถํ๋ ๊ทผ๊ฑฐ).\n *\n * **ํ์ค์ ๋จ์ ํ์ฐ ์์๋ ์๋ค**(1์ฐจ ์ถ์ฒ ์ ์ ํ์ธ) โ ์์ฑ ์ฃผ๋จธ๋๋ฟ์ด๋ค. ๊ทธ๋์ ํ์ฐ ๊ณ์๋\n * ์ปค๋์ด ์ ํ ์์ฑ ์ด๋ฆ(`perBaseUnit`, `uom` ์ด ๋์ ๋จ์)์ผ๋ก `properties` ์ ์ฃ๋๋ค.\n */\nexport interface RefMaterialDefinition {\n /** ํ์ค `ID` โ GTIN(`urn:epc:idpat:sgtin:โฆ`)์ ์ด๋ค(์ ์ฒด์ฑ์ ์ ๋ณธ์ด EPCIS ๋ค). */\n id: string\n name?: string\n /** ์ํ ๋ฑ๊ธ๋ค โ ํ์ค `MaterialClassID`(๋ณต์). */\n materialClassIds?: string[]\n /** ํ๋ชฉ ์์ฑ โ ํ์ค `MaterialDefinitionProperty`. ํ์ฐ ๊ณ์๊ฐ ์ฌ๊ธฐ ๋ค์ด๊ฐ๋ค. */\n properties?: RefResourceProperty[]\n testSpecificationIds?: string[]\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * **์ด ๋ง์คํฐ๋ฅผ ๋ค์ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ** โ ํธ์์ด ์๊ธฐ ์๋ณธ์ ๊ธฐ์ตํ๋ ์๋ฆฌ.\n *\n * ํธ์์ ์๋ณธ์ ๋น์ถ ๋ฟ์ด๋ฏ๋ก(ADR-0028), ์๋ณธ์ด ๋ฌ๋ผ์ง๋ฉด **๋ค์ ์ฝ์ด์ผ** ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ง๊ธ๊น์ง\n * ํธ์์ \"๋ด๊ฐ ๋ฌด์์์ ๋์๋\" ๋ฅผ ๋จ๊ธฐ์ง ์์๋ค โ ์ด๋ํฐ๋ก ๋ค์ด์จ ํธ์์ `TwinReference` ํ์ด\n * ์์์ง๋ง ํ
ํ๋ฆฟ์ผ๋ก ์ธ์ด ํธ์์๋ ์๋ฌด๊ฒ๋ ์์๊ณ , ๊ทธ๋์ **๋ค์ ์ฝ์ ๋์์ด ์๋ ํธ์**์ด\n * ๋ง๋ค์ด์ก๋ค. ์๋ณธ์ ์์ ํธ์์ ์ฒซ๋ ์ ๋ชจ์ต์ ์์ํ ๋จธ๋ฌธ๋ค.\n *\n * ๊ทธ๋์ ์์ฒ์ด ๋ฌด์์ด๋ ์ฌ๊ธฐ ํ ์๋ฆฌ์ ๋จ๊ธด๋ค. ๋ค์ ์ฝ๊ธฐ๋ ์ด ๊ฐ ํ๋๋ง ๋ณด๋ฉด ๋๋ค.\n */\nexport type MasterOrigin =\n /**\n * ๋ฑ๋ก๋ ๋ ํผ๋ฐ์ค(์ด๋ํฐ)์์ ์๋ค โ ๋ค์ ์ฝ๊ธฐ = ๊ทธ ์ด๋ํฐ๋ก ๋ง์คํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค.\n *\n * `source` ๋ **๋ ํผ๋ฐ์ค ๋ฑ๋ก ์ด๋ฆ**์ด๊ณ ๊ทธ ์ฐธ์กฐ๊ฐ ๋ณด๊ณ ํ๋ ์ฌ์ดํธ ์ ๋ถ์ ๊ฐ๋ค. ๊ทธ๋์ ์ด๋ ์ฌ์ดํธ์์\n * ์จ ํธ์์ธ์ง๋ `siteId` ๊ฐ ์์ด์ผ ์๋ค โ ์์ผ๋ฉด ๋ค์ ์ฝ๊ธฐ๊ฐ ์ฌ์ดํธ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค(2026-08-18 ์ค์ธก:\n * ์ฌ์ดํธ๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ์ฐธ์กฐ์์ ์จ ํธ์์ ์ฌ๋๊ธฐ๊ฐ ์ ๋ถ ๊ฑฐ์ ๋๋ค. ์ฐธ์กฐ ์ด๋ฆ์ ์ฌ์ดํธ๋ณ ๋ง์คํฐ์\n * `source`(=์ธ์คํด์ค id)์ ๋น๊ตํ๊ณ ์์๋ค โ ์๋ก ๋ค๋ฅธ ๊ฒ์ ๋น๊ตํ ๊ฒ์ด๋ค).\n */\n | { kind: 'reference'; source: string; siteId?: string; spaceId?: string }\n /**\n * ํ
ํ๋ฆฟ + ๋
ธ๋ธ๋ก ํฉ์ฑํ๋ค โ ๋ค์ ์ฝ๊ธฐ = ๊ฐ์ ๋
ธ๋ธ๋ก ๋ค์ ์ง๋๋ค(ํฉ์ฑ์ ๊ฒฐ์ ์ ์ด๋ค).\n *\n * `spaceId` ๋ **๋ง๋ค ๋ ๊ณ ๋ฅธ ํ์ฅ**์ด๋ค(ํฉ์ณ ๋ฃ๊ธฐ). ๊ธฐ์ตํ์ง ์์ผ๋ฉด ๋ค์ ์ฝ์ ๋ ํธ์์ด ์๋ฆฌ์ง ์๊ณ ์๊ธฐ\n * ํ์ฅ์ ๋ ๋๋ค โ ํ
ํ๋ฆฟ์ด ๋ธ ๊ธฐ๋ณธ ๊ณต๊ฐ์ผ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ ํ์ฅ์ ๊ฐ(์๊ธ ๋ฑ)๋ ํจ๊ป\n * ์๋๋ค(2026-08-18 ์ค์ธก: ํ ํ์ฅ์ ํฉ์ณ ๋ EMS ํธ์ ์ฌ๋์ด ์ฌ๋๊ธฐ ๋ค ๊ฐ์ ๊ณต๊ฐ์ผ๋ก ํฉ์ด์ก๋ค).\n */\n | { kind: 'template'; templateId: string; params: Record<string, unknown>; spaceId?: string }\n\nexport interface ReferenceMaster {\n source: string\n /**\n * ์ด๋ ์ข
๋ฅ์ ํธ์์ธ๊ฐ โ **์ปค๋ ์นดํ๋ก๊ทธ๊ฐ ์ ๋ณธ**์ด๋ค(`DomainSystem`).\n *\n * ์์ ์๋ `'wms' | 'yms' | 'mes'` ๋ฅผ ์ฌ๊ธฐ ์ ์ด ๋๋ค. ์ปค๋์ ์ข
๋ฅ๊ฐ ํ๋ ๋ ๋(์๋์ง) ์ด ์ค์ด\n * ํจ๊ป ์์ง์ฌ์ผ ํ๋๋ฐ, ์์ผ๋ก ์ ํ ๋ชฉ๋ก์ ๊ทธ๊ฒ์ ์๋ ค ์ฃผ์ง ์๋๋ค โ ์ดํ์ ์ง์ ํ ๊ณณ์ด์ด์ผ ํ๋ค.\n */\n system: DomainSystem\n siteName: string\n /** ๊ฒ์ฌ ๋ช
์ธ โ ์์ยท๋ฑ๊ธ์ `testSpecificationIds` ๊ฐ ๊ฐ๋ฆฌํค๋ ๋์. */\n testSpecifications?: RefTestSpecification[]\n /**\n * ์ด ๋ง์คํฐ๊ฐ ์ด๋์ ๋์๋ โ **๋ค์ ์ฝ๊ธฐ์ ์ ์ผํ ๊ทผ๊ฑฐ.** ์์ผ๋ฉด ๊ทธ ํธ์์ ๋ค์ ์ฝ์ ์ ์๊ณ ,\n * ์กฐํ ํ๋ฉด์ด ๊ทธ ์ฌ์ค์ ๊ทธ๋๋ก ๋งํ๋ค(์๋ ๊ฒ์ ์๋ ์ฒํ์ง ์๋๋ค).\n */\n origin?: MasterOrigin\n /* spaceId ๋ช
์ ์ ๊ทธ ๊ณต๊ฐ์ ์ฐธ์กฐ(์ฌ๋ฌ ํธ์์ด ํ ๊ณต๊ฐ ๊ณต์ , N:1). ์์ผ๋ฉด source ์์ ํ์(1:1). */\n /**\n * ํ์ฅ(๊ณต๊ฐ). **์๊ฐ ๊ธฐ์ค(`timezone`)์ด ์ฌ๊ธฐ ์๋ ์ด์ **: ํ ํ
๋ํธ๊ฐ Rosarito(ํํ์)์ ํ๊ตญ\n * ๊ณต์ฅ์ ํจ๊ป ๊ฐ์ง ์ ์๋ค. ํ
๋ํธ ๋จ์(`Domain.timezone`)๋ก ๋๋ฉด **๋ ์ค ํ๋๋ ๋ฐ๋์ ํ๋ฆฐ๋ค.**\n * ์๊ฐ ๊ธฐ์ค์ **๋ฌผ๋ฆฌ ํ์ฅ์ ์ฑ์ง**์ด๋ฏ๋ก ๊ณต๊ฐ์ด ๊ทธ๊ฒ์ ๊ฐ๋๋ค(๊ณต๊ฐ ์ค์ฌ ์์น).\n *\n * `timezone` ์ IANA ์ด๋ฆ(`'America/Tijuana'`) โ ์คํ์
์ซ์๊ฐ ์๋๋ค. ์ซ์๋ก ๋๋ฉด ์ผ๊ด์ ์ฝ์๊ฐ์\n * ํํํ ์ ์๊ณ , ๋์ค์ ์ ๋ ๊ตฌ๊ฐ์ผ๋ก ์ฎ๊ธธ ๋๋ ์ด๋ฆ์ด ์์ด์ผ ๊ณ์ฐํ ์ ์๋ค.\n */\n space: { spaceId?: string; width: number; depth: number; unit?: string; timezone?: string; geo?: { lat: number; lon: number; rotation?: number }; representations?: any[]; primaryId?: string }\n locations: RefLocation[]\n equipment?: RefEquipment[]\n /** ๊ณต์ ๋ช
์ธ(์์ยท๋ณ๋ยท์์จ) โ ์์ผ๋ฉด ์ปค๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ตด๋ฌ๊ฐ๋ค(๊ทธ ์ฌ์ค์ specCoverage ๊ฐ ๋ณด๊ณ ). */\n operations?: RefOperation[]\n /**\n * **์์ฐ ์ ์**(๋ ์ํผยท๋ผ์ฐํธยท์์ฌ ๋ฐ์ธ๋ฉ) โ ์ปค๋์ ์ ์-๊ตฌ๋ MES ๋ชจ๋ ์
๊ตฌ.\n *\n * ์์ผ๋ฉด ์ปค๋์ ๋ ๊ฑฐ์(ํ๋์ฝ๋ฉ) ํ๋ฆ์ผ๋ก ๋์ํ๋ค. ์ฆ **ํ์ฅ ๋ ์ํผ๋ฅผ ์ ์ด๋ ์ด ์๋ฆฌ์ ์ค๋ฆฌ์ง ์์ผ๋ฉด\n * ์ปค๋์ ๊ทธ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค** โ ์ ์ธ๊ณผ ์คํ์ด ์ด๊ธ๋๋ ์ง์ ์ด๋ผ ์๋ฆฌ๋ฅผ ์ฐ๋ค.\n */\n /**\n * ์์ฐ ์ ์ธ โ `TwinModelDef.productionSpec` ์ผ๋ก ํต๊ณผํ๋ค(ISA-95 OperationsSegment + BOM).\n *\n * ์์ ์ด๋ฆ์ `mesSpec` ์ด์๋ค. ๋ด๊ธด ๊ฒ์ MES ๋ง์ ๊ฒ์ด ์๋๋ผ \"์์ฌ๋ฅผ ์๋นํด ์์ฌ๋ฅผ ์ฐ์ถํ๋\n * ๊ณต์ \" ์ด๊ณ , ์ด๋ฆ์ด MES ์๊ธฐ ๋๋ฌธ์ ์ฐฝ๊ณ ํธ์์ ์ด ์๋ฆฌ๋ฅผ ์ธ ์๊ฐ์กฐ์ฐจ ํ์ง ๋ชปํ๋ค(์ ํต๊ฐ๊ณต ์ฐฝ๊ณ ๊ฐ\n * BOM ์ ์ค๋ช
๋ฌธ์์๋ง ์ ์ด ๋ ์ฑ ํคํธ๋ฅผ ๋ชป ๋ง๋๋ ํธ์์ ๋ง๋ ์์ธ). ๊ทผ๊ฑฐ๋ ์ปค๋ ๊ณ์ฝ ์ฃผ์์.\n */\n productionSpec?: unknown\n /**\n * **์ด ์๋ณธ์ด ์๋ณ์๋ฅผ ๋ง๋๋ ์ด๋ฆ๊ณต๊ฐ** โ `TwinModelDef.identity` ๋ก ํต๊ณผํ๋ค.\n *\n * **์ ์ธ์ด ์์ผ๋ฉด ์ปค๋์ด ๊ฑฐ์ ํ๋ค** (0.7.45~). ์์ ์๋ ์์ ํ๋ฆฌํฝ์ค๋ก ํ๋ ํธยทํธ๋ ์ผ๋ฌยท๋ฌธ์๋ฅผ\n * ๋ง๋ค์๋๋ฐ(`0614141` โ GS1 ์ด ๊ท๊ฒฉ ์์ ๋ก ์ฐ๋ค ๋ฒ๋ฆฐ ๊ฐ์ด๊ณ `06โฆ` ์ ์ค ๋ฐฐ์ ๋์ญ์ด๋ค), ๊ทธ ๊ฐ์\n * ์ ๋์ ์์ํ ๋จ์ผ๋ฉด์ ์ง์ด๋ธ ๊ฒ์ด๋ผ๊ณ ๋งํด ์ฃผ๋ ๋ฐ๊ฐ ์์๋ค. ๊ทธ๋์ ์ปค๋์ด ๋ง๋ค์ง ์๋๋ค.\n *\n * ์๋ณธ์ด ์๊ธฐ ๋๋ฉ์ธ์ ๋งํ๋ฉด ๊ทธ ์๋์์ ๋ง๋ ๋ค โ ๊ทธ๊ฒ์ด ํ์ค ์ ํฉ์ด๋ค(CBV 2.0 ยง8.2.4ยทยง8.5.5,\n * ใ๊ทธ ์ธํฐ๋ท ๋๋ฉ์ธ ์์ ์๊ฐ ๋ฐฐ์ ํ๋คใ). GS1 ํค๋ฅผ ์ฐ๋ ค๋ฉด `documentTypes` + `companyPrefix` ์ด๊ณ ,\n * ๊ทธ๋ **์๋ฆฌ ์๊ฐ ๋ง์์ผ ํ๋ค**(SGTIN ์ ํ๋ฆฌํฝ์ค + ํ๋ชฉ์ฐธ์กฐ = 13์๋ฆฌ, GS1 TDS).\n *\n * ์ ์ฒด์ฑ์ ์์ฐ๊ณผ ๋ฌด๊ดํ๋ฏ๋ก `productionSpec` ์ด ์๋๋ผ **๋ชจ๋ธ**์ด ๊ฐ๋๋ค โ ์ฐฝ๊ณ ยท์ผ๋๋ ์๋ฌด๊ฒ๋\n * ์์ฐํ์ง ์์ผ๋ฉด์ ํ๋ ํธยทํธ๋ ์ผ๋ฌ๋ฅผ ์๋ณํ๋ค.\n */\n identity?: unknown\n /**\n * ์ฌ๋ โ ์ ์ธํ์ง ์์ผ๋ฉด **์ธ์ ์ ์ฝ์ด ์๋ ํธ์**์ด ๋๋ค(์ค๋น๋ง ์์ผ๋ฉด ์ธ์ ๋ ๊ฐ๋๋๋ ๊ณต์ฅ).\n * ๊ณต์ ์ด ์ธ์์ ์๊ตฌํ๋๋ฐ ์ฌ๋์ด ์์ผ๋ฉด ๊ทธ ์์
์ ์์๋์ง ์๋๋ค โ ๊ทธ๊ฒ์ด ์ฌ์ค์ด๋ฏ๋ก ๊ทธ๋๋ก ๋๋ค.\n */\n persons?: RefPerson[]\n /**\n * ๋ฌผ๋ฆฌ ์์ฐ(๋ฐ๋ณต์ฌ์ฉ) โ ์ ์ธํ์ง ์์ผ๋ฉด ์์ฐ ์ ์ฝ์ด ์๋ ํธ์์ด๋ค.\n * ๊ณต์ ์ด ์์ฐ์ ์๊ตฌํ๋๋ฐ ์์ผ๋ฉด ๊ทธ ์์
์ ์์๋์ง ์๋๋ค โ ๊ทธ๊ฒ์ด ์ฌ์ค์ด๋ฏ๋ก ๊ทธ๋๋ก ๋๋ค.\n */\n assets?: RefAsset[]\n /**\n * ๋ฑ๊ธ ์ ์ โ ํ์ค `PersonnelClass`ยท`EquipmentClass`ยท`PhysicalAssetClass`.\n * ์ ์ค์ด๋ ํธ์์ ๋์ํ๋ค(์์ ๋ฌธ์์ด ๊ทธ๋๋ก ํ์ ). ์ค์ผ๋ฉด ์์ยท์ ํจ๊ธฐ๊ฐ์ด ์ด์๋๋ค.\n */\n personnelClasses?: RefResourceClass[]\n equipmentClasses?: RefResourceClass[]\n assetClasses?: RefResourceClass[]\n /** ํ๋ชฉ ์ ์ยท๋ฑ๊ธ โ ํ์ค `MaterialDefinition` / `MaterialClass`. ์์ผ๋ฉด ๋จ์ ํ์ฐ์ ํ ์ ์๋ค. */\n materialDefinitions?: RefMaterialDefinition[]\n materialClasses?: RefResourceClass[]\n /**\n * ์ปค๋ฅํฐ๊ฐ **์ฎ๊ธฐ๋ ๋์ ์๊ฒ ๋ ๊ฒ.** ์ธ๋ถ ์์คํ
์ ๊ฐ์ ์ฐ๋ฆฌ ์ดํ๋ก ๋ชป ์ฎ๊ฒจ ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์๋ค๋ฉด\n * ์ฌ๊ธฐ์ ๋ด์ ๋ณด๋ธ๋ค โ ๊ทธ๋ฌ๋ฉด `masterToTwin` ์ ๊ฒฝ๊ณ ์ ํ ์ค๊ธฐ๋ก ํฉ์ณ์ ธ ํ๋ฉด๊น์ง ๊ฐ๋ค.\n *\n * ์ด ์๋ฆฌ๊ฐ ์๋ ๋์ ์ปค๋ฅํฐ๋ ํ ๋ง์ด ์์ด๋ **๋งํ ๊ณณ์ด ์์๋ค.** ๊ทธ๋์ ๋ํฌ๋ฅผ ๋์ผ๋ก ๋ฐ๊ฟ\n * ๋๊ณ ๋ ์๋ฆฌ์ง ์๊ณ ์ฑ๊ณตํ๋ค. ์ฎ๊ธฐ๋ ์ฌ๋๋ง ์๋ ์ฌ์ค์ ์ฎ๊ธฐ๋ ์๋ฆฌ์์ ์ค์ด์ผ ํ๋ค.\n */\n warnings?: IngestWarning[]\n /**\n * **์๋ณธ์ด ๊ฐ์ง ์** โ ์ฎ๊ธด ์์ ๋ถ๋ชจ๋ค.\n *\n * ์ดํ์ ๋์ฐฉํ ๋ชจ๋ธ๋ง ๋ณผ ์ ์์ด์ ใ๋ ์ํผ 1,261ใ๊น์ง๋ง ๋งํ ์ ์์๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๋์ด ๋ฌป๋ ๊ฒ์\n * ใ๊ทธ๊ฒ ์ ๋ถ์ธ๊ฐใ๋ค โ ์๋ณธ์ 1,408๊ฐ๊ฐ ์์๊ณ 147๊ฐ๋ฅผ ์ฎ๊ธฐ์ง ๋ชปํ๋ค๋ฉด ๊ทธ ์ฌ์ค์ด ์ดํ์ ์ฒซ ์ค์\n * ์์ด์ผ ํ๋ค. ์ค์ ๋ก ์ฌ์ฉ์๊ฐ ํ๋ชฉ 2,789 ์ ์์ฌ 1,789 ์ ์ฐจ์ด๋ฅผ ํ๋ฉด์์ ์ฝ์ด ๋ด์ง ๋ชปํด ์ง์ \n * ๋ฌผ์๋ค(2026-08-22).\n *\n * ๋ถ๋ชจ๋ฅผ ์๋ ๊ฒ์ **์ปค๋ฅํฐ๋ฟ์ด๋ค.** ๊ทธ๋์ ์ปค๋ฅํฐ๊ฐ ์ค์ด ๋ณด๋ธ๋ค. ๋ณด๋ด์ง ์์ผ๋ฉด ์ดํ์ ๋ถ๋ชจ ์์ด\n * ์ฎ๊ธด ์๋ง ๋งํ๋ค โ **์ง์ด๋ด์ง ์๋๋ค.**\n *\n * ์ด์ ๋ ์ดํ์ด ์ธ๋ ์ด๋ฆ๊ณผ ๊ฐ๋ค(`recipes`ยท`materials`ยท`totalInputs`ยทโฆ). ๊ฐ์ **์๋ณธ์ ๋๊น์ง ์ฝ์ด์\n * ์ผ ๊ฒ**์ด์ด์ผ ํ๋ค. ์๋ฆฐ ์ฝ๊ธฐ์ ์๋ฅผ ์ฌ๊ธฐ ๋ด์ผ๋ฉด ใ์ ๋ถ ์ฎ๊ฒผ๋คใ๋ ๊ฑฐ์ง์ด ๋๋ค.\n */\n originCounts?: Record<string, number>\n}\n\nexport interface IngestedTwin {\n model: any // TwinModelDef(+layout+spaceId) โ ์ปค๋ ์๋น\n spaceContent: any // TwinSpace content โ ๋ทฐ ์๋น\n warnings: IngestWarning[]\n}\n\n/**\n * ๋ง์คํฐ โ ํธ์ ๊ตฌ์กฐ ๋งคํ(์์). ๋
ธ๋ํ์
์ ์นดํ๋ก๊ทธ๋ก ๊ฒ์ฆ(๋ชจ๋ฅด๋ ํ์
์ warning, ๋ฒ๋ฆฌ์ง ์์ โ ๋ฐ์ ์ฐ์ ).\n * @param catalog DOMAIN_CATALOG (์ปค๋ SSOT). ์์ผ๋ฉด ๊ฒ์ฆ ์๋ต.\n */\n/**\n * IANA ์๊ฐ๋ ์ด๋ฆ โ **๊ทธ ์๊ฐ์** UTC ์คํ์
(๋ถ). ์์กด์ฑ ์์ด `Intl` ๋ก ํผ๋ค.\n *\n * `Intl.DateTimeFormat` ์ `longOffset` ์ `\"GMT-07:00\"` ์ฒ๋ผ ๋์ค๊ณ , ์ด๊ฒ์ **์ผ๊ด์ ์ฝ์๊ฐ์ ๋ฐ์ํ**\n * ๊ฐ์ด๋ค. ๊ทธ๋์ 8์์ `America/Tijuana` ๋ โ420(PDT), 1์์ โ480(PST)์ด ๋๋ค.\n *\n * **ํ๊ณ๋ฅผ ๋ฐํ๋ค**: ์ฌ๊ธฐ์ ๋์ค๋ ๊ฒ์ **ํ ์์ ์** ์คํ์
์ด๋ค. ์ปค๋์ ๊ณ ์ ์คํ์
์ผ๋ก ํ๋ฃจ ์ค ๋ถ์\n * ์ฝ์ผ๋ฏ๋ก, ๋ชจ๋ธ์ ๋ง๋ ๊ณ์ ๊ณผ ๋ค๋ฅธ ๊ณ์ ์ ๊ธธ๊ฒ ์์ธกํ๋ฉด ํ ์๊ฐ ์ด๊ธ๋๋ค. ํ์ค์ ์ถฉ์คํ ๋ ๋ชจ์ต์\n * ํธ์คํธ๊ฐ ์ ๋ ๊ตฌ๊ฐ(`StartDateTime`/`FinishDateTime`)์ ๊ณ์ฐํด ๋ฃ๋ ๊ฒ์ด๊ณ , ๊ทธ๋ ์ด ํจ์๋ ์ฌ๋ผ์ง๋ค.\n *\n * ๋ชจ๋ฅด๋ ์ด๋ฆ์๋ **0 ์ ๋ตํ์ง ์๋๋ค**(`undefined`) โ 0 ์ \"UTC ๋ผ๊ณ ์ ์ธํ๋ค\" ๋ ๋ป์ด๊ณ , ๋ชจ๋ฅด๋ ๊ฒ์\n * ๊ทธ๋ ๊ฒ ๋ฐ๊พธ๋ฉด ํ์ ์ด ์ค๋ฅ ์์ด ํ๋ฆฐ ๊ฐ์ ๋ธ๋ค.\n */\nexport function utcOffsetOf(timezone?: string, at: Date = new Date()): number | undefined {\n if (!timezone) return undefined\n try {\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, timeZoneName: 'longOffset' }).formatToParts(at)\n const name = parts.find(p => p.type === 'timeZoneName')?.value ?? ''\n if (name === 'GMT') return 0 // UTC ๊ณ์ด์ ์คํ์
ํ๊ธฐ๊ฐ ์๋ค\n const m = /^GMT([+-])(\\d{1,2})(?::(\\d{2}))?$/.exec(name)\n if (!m) return undefined\n const sign = m[1] === '-' ? -1 : 1\n return sign * (Number(m[2]) * 60 + Number(m[3] ?? 0))\n } catch {\n return undefined // ์ ์ ์๋ ์ด๋ฆ โ Intl ์ด ์ค๋ฅ๋ฅผ ๋ธ๋ค\n }\n}\n\n\n/* โโ ์ธ์ ์คํธ ๊ฒฝ๊ณ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ธ์ ์คํธ๋ ๊ตฌ์กฐ์ ๋ฌธ์ ๊ฐ ์์ด๋ ํธ์์ ๋ง๋ค์ด ์ค๋ค(๋ง์ง ์๋ ๊ฒ์ด ์ณ๋ค โ ๋ถ๋ถ์ ์ผ๋ก๋ผ๋ ์ธ์ฐ๊ณ \n * ๊ณ ์ณ ๋๊ฐ๋ ๊ฒ์ด ์ด ์์คํ
์ ๋ฐฉ์์ด๋ค). ๊ทธ๋์ **๊ฒฝ๊ณ ๊ฐ ์ ์ผํ ์ ํธ**์ธ๋ฐ, ๊ทธ ๊ฒฝ๊ณ ๋ฅผ ํ๋ฉด์ด ํ๋๋\n * ๋ณด์ฌ์ฃผ์ง ์๊ณ ์์๋ค: ์ ํต๊ฐ๊ณต ์ฐฝ๊ณ ํ
ํ๋ฆฟ์ ์ปค๋์ด ๋ชจ๋ฅด๋ ์๋ฆฌ ํ์
(`vas-station`)์ผ๋ก ํธ์์\n * ๋ง๋ค๋ฉด์ ๊ฒฝ๊ณ ๋ฅผ ๋์ง๋ง, ์์๋๋ ๊ทธ๊ฒ์ ๋ฒ๋ ธ๊ณ ์ฌ์ฉ์๋ ์๋ฌด ๋ง ์์ด ๋งํ๋ ํธ์์ ๋ฐ์๋ค.\n *\n * ๋ฌธ์ฅ์ด ์๋๋ผ ์ฝ๋๋ก ์ค์ด ๋ณด๋ธ๋ค. ์์ ๊ฒฝ๊ณ ๋ ํ๋ก์ฆ์๊ณ ๊ทธ์ค ํ๋์๋ ํ๊ธ์ด ์์ฌ ์์๋ค\n * (`โ ์นดํ๋ก๊ทธ์ ์์`) โ ๋ค์ฏ ์ธ์ด ํ๋ฉด์ ๊ทธ๋๋ก ๋ด๋ณด๋ด๋ฉด ์ด๋ฒ์ ๊ฑท์ด๋ธ ๋ฌธ์ ๋ฅผ ๋ค์ ๋ง๋ ๋ค.\n * ์ด ํ๋ก์ ํธ๊ฐ ์ด๋ฏธ ์ฐ๋ ๊ท์ฝ๊ณผ ๊ฐ์ ๋ชจ์์ด๋ค: ์ฃผ์ ์ ํธ(kind+params)ยท์ปค๋งจ๋ ๊ฑฐ์ (errorCode+params)ยท\n * ๋ง๋งํจ ํ์ (code+์์ด canonical message).\n *\n * code ์ธ์ด ์ค๋ฆฝ โ ํ๋ฉด์ด `twin.ingest.<code>` ๋ก ์ฌ๋ ๋ง์ ๋ง๋ ๋ค\n * params ๋ฌธ์ฅ์ ๋ผ์ธ ๊ฐ โ ๋ฒ์ญ์ด ์ธ์ด๋ง๋ค ์ด์์ ๋ฐ๊ฟ ์ ์๊ฒ\n * message ์์ด canonical โ ๋ก๊ทธ์ ๋จ๊ณ , ๋ฒ์ญ์ด ์์ ๋ ๊ทธ๋๋ก ๋ณด์ธ๋ค(๋น์นธ๋ณด๋ค ๋ซ๋ค)\n *\n * **์ฌ๊ธฐ ์ฌ๋ ์ด์ **: ์ด ํ์ผ์ด ๊ฒฝ๊ณ ์ ์์ฐ์์ด๊ณ , ํ
์คํธ๊ฐ ์์ค์์ ์ง์ ์ฝ๋ ๋ชจ๋์ด๋ผ\n * ๋ฐํ์ ์๋ import ๋ฅผ ๊ฐ์ง ์ ์๋ค(์ด ์ ์ฅ์์ ๊ท์ฝ โ ๊ทธ๋ฐ ๋ชจ๋์ ์๊ธฐ์๊ฒฐ์ด๋ค).\n * โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ */\n/** ์ธ์ ์คํธ๊ฐ ์๋ฆฌ๋ ํ ๊ฐ์ง. */\nexport interface IngestWarning {\n /** ์ธ์ด ์ค๋ฆฝ ์ฝ๋. ํ๋ฉด์ `twin.ingest.<code>` ๋ก ๋ ๋ํ๋ค. */\n code: string\n /** ๋ฌธ์ฅ์ ๋ผ์ธ ๊ฐ. ๋ฒ์ญ์ด ์ด์์ ๋ฐ๊ฟ ์ ์๊ฒ ์ด๋ฆ์ผ๋ก ๋๊ธด๋ค. */\n params?: Record<string, string | number>\n /** ์์ด canonical ๋ฌธ์ฅ โ ๋ก๊ทธยทํด๋ฐฑ์ฉ. ๋ฒ์ญ์ด ์์ด๋ ์ฝ์ ์ ์์ด์ผ ํ๋ค. */\n message: string\n}\n\n/**\n * **์๊ฐ์ ๋ชจ๋ฅด๋ ์ฑ ์๊ฐ์ผ๋ก ํ์ ํ๋ ค ํ๋ค** โ ๋ฐ์ ํ์์ ํ๋ฃจ์ ์๊ฐ์ ์ฝ๋๋ฐ ์ด ํธ์์ ๊ณต๊ฐ์ด\n * ์๊ฐ๋๋ฅผ ๋งํ์ง ์์๋ค.\n *\n * โโ ์ ๊ฒฝ๊ณ ์ธ๊ฐ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์ ์๊ฐ๋๋ฅผ ๋ชจ๋ฅด๋ฉด UTC ๋ก ์ฝ๋๋ค(๊ณ์ฝ์ ๋ฐํ ๋ ๊ท์จ โ ๋ชจ๋ฅด๋ ๊ฐ์ ์ง์ด๋ด์ง ์๋๋ค). ๊ทธ๋ฐ๋ฐ ๋ฐ์ \n * ํ์์ **์๊ฐ๋ณ ๋น์จ**์ด๋ผ, ์๊ฐ๋๊ฐ ์์ผ๋ฉด ํ์ฅ ์ ์ค๊ฐ ์๋๋ผ UTC ์ ์ค์ ํผํฌ๊ฐ ์ ๋ค(KST ํ์ฅ์ด๋ฉด\n * ๋ฐค 9์). ๊ฐ์ด ๊ทธ๋ด๋ฏํ๊ฒ ๋์ค๋ฏ๋ก ์๋ฌด๋ ์์์ฑ์ง ๋ชปํ๋ค.\n *\n * ๊ทธ๋์ ์๊ฐ๋๋ฅผ **์ง์ด๋ด์ง ์๊ณ **(์๋ฒ ๋ก์ปฌ์ด๋ ์์ ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์ผ๋ฉด ๊ทธ ํธ์์ ๋ชจ๋ ์๊ฐ ํ์ ์ด ์๋ฆฌ์ง ์๊ณ \n * ๊ทธ ๊ฐ์ ์์ ์ ๋ค) ๋์ **๊ทธ ์กฐํฉ์ ๋งํ๋ค** โ ๊ณต๊ฐ์ ์๊ฐ๋๋ฅผ ์ ์ธํ๋ฉด ์ฌ๋ผ์ง๋ ๊ฒฝ๊ณ ๋ค.\n */\nexport const generationWithoutTimeZone = (spaceId: string, equipmentId: string): IngestWarning => ({\n code: 'generation-without-time-zone',\n params: { spaceId, equipmentId },\n message:\n `\"${equipmentId}\" declares a daily generation shape but space \"${spaceId}\" declares no time zone โ the hourly fractions will be read in UTC, ` +\n 'so the generation peak will not land at local noon. Declare the space time zone (we do not guess one).'\n})\n\n/**\n * ์๋ฌด๋ ์ ์ธํ์ง ์์ ์๋ฆฌ ํ์
โ ๊ทธ ์๋ฆฌ๋ ํ๋ฆ์ ์ฐธ์ฌํ์ง ๋ชปํ ์ ์๋ค.\n *\n * **๋ฌป๋ ์๋๋ฅผ ๊ณ ์ณค๋ค (2026-08-20).** ์์ ์๋ ๋ด์ฅ ์นดํ๋ก๊ทธ์๊ฒ๋ง ๋ฌผ์๋ค. ๊ทธ๋ฐ๋ฐ ์๋ณธ์ด ์๊ธฐ\n * `DomainDefinition.locationTypes` ๋ฅผ ํจ๊ป ๋ณด๋ด๋ฉด **๊ทธ ์ ์ธ์ด ์ ๋ณธ**์ด๋ค โ ์นดํ๋ก๊ทธ๋ ์ฐ๋ฆฌ๊ฐ ์๋\n * ๋๋ฉ์ธ๋ค์ ๊ธฐ๋ณธ ์ดํ์ผ ๋ฟ์ด๋ค. ๋ฌผ์ ์๋๊ฐ ํ๋ ธ์ผ๋, ์๊ธฐ ์ดํ๋ฅผ ์ ์ธํ ์๋ณธ์ ์ ์์ ์ธ ํ์
๋ง๋ค\n * ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์๋ค(F&B ๋ผ์ธ์ ๋ถ์ด๋ฉด ์๋ฆฌ๋ง๋ค ํ๋์ฉ). ์์์ด ๋๋ฉด ์ฌ๋์ ๊ฒฝ๊ณ ๋ฅผ ์ฝ์ง ์๊ฒ ๋๊ณ , ๊ทธ๋\n * ์ง์ง ๊ฒฝ๊ณ ๋ ํจ๊ป ์ฃฝ๋๋ค.\n */\nexport const unknownLocationType = (system: string, type: string, id: string): IngestWarning => ({\n code: 'unknown-location-type',\n params: { system, type, id },\n /*\n * โโ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์ง ๋งํ๋ค (2026-08-25) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์์ ๋ฌธ์ฅ์ ใํ๋ฆ์ ์ฐธ์ฌํ์ง ๋ชปํ ์ ์๋คใ์๋ค. ๋ฌผ๊ฑด์ด ํ๋ฅด๋ ๋๋ฉ์ธ์์๋ ๋ง๋ ๋ง์ธ๋ฐ,\n * ์๋์ง ํธ์์๋ ํ๋ฆ์ด ์์ด์ ๊ทธ ๋ฌธ์ฅ์ด ์๋ฌด๊ฒ๋ ์๋ ค ์ฃผ์ง ์์๋ค(์ค์ ๋ก ํ์๊ด ๋ฐ์ ์๋ฅผ\n * ๋ถ์ด๋ฉด์ ์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์ ์ฌ๋์ด ใ์ด ๊ฒฝ๊ณ ๊ฐ ๋ป์ด ์๋๊ฐใ๋ฅผ ๋๋ฌผ์๋ค).\n *\n * ์ข
๋ฅ๋ฅผ ๋ชจ๋ฅด๋ฉด ์ค์ ๋ก ์ผ์ด๋๋ ์ผ์ ํ๋๋ค: **๊ทธ ์๋ฆฌ์ ๋ฅ๋ ฅ์ด ๋ถ์ง ์๋๋ค.** ๋ฅ๋ ฅ์ด ์์ผ๋ฉด\n * ์ํ ํ๋๋ ์๊ณ , ๋กค์
์๋ ๋ค์ด๊ฐ์ง ์๊ณ , ์ ์๋ฉด ํ๋ ํธ์๋ ์์ง ์๋๋ค. ๋๋ฉ์ธ์ ๊ฐ๋ฆฌ์ง ์๊ณ \n * ์ฐธ์ธ ๋ฌธ์ฅ์ด๋ฏ๋ก ์ด๊ฒ์ ์ ๋๋ค.\n */\n message:\n `\"${type}\" is declared nowhere for ${system} (${id}) โ neither in the master's own locationTypes nor in the built-in ` +\n `catalog. A location whose type is unknown gets no capabilities, so it carries no state, joins no rollup, ` +\n `and (in domains that move things) may be left out of the flow.`\n})\n\n/**\n * ์๋ณธ์ด ํจ๊ป ๋ณด๋ธ ์๋ฆฌ ํ์
์ ์ธ โ ์์ผ๋ฉด **์ด๊ฒ์ด ์ ๋ณธ**์ด๋ค.\n *\n * ์ปค๋ ๊ณ์ฝ์ `DomainDefinition.locationTypes` ๋ `{ key, label, โฆ }` ๋ชฉ๋ก์ด๋ค. ์ฝ์ ์ ์๋ ๋ชจ์์ด๋ฉด\n * `undefined` ๋ฅผ ๋๋ ค **์นดํ๋ก๊ทธ๋ก ๋จ์ด์ง๋ค** โ ๋น ๋ฐฐ์ด์ ๋๋ ค์ฃผ๋ฉด ใ์๋ฌด ํ์
๋ ์ ์ธ๋์ง ์์๋คใ๊ฐ\n * ๋์ด ๋ชจ๋ ์๋ฆฌ๊ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๋๋ค(์๋ ๊ฒ๊ณผ ๋ชป ์ฝ์ ๊ฒ์ ๋ค๋ฅด๋ค).\n */\nexport function declaredLocationTypes(productionSpec: unknown): string[] | undefined {\n const list = (productionSpec as any)?.definition?.locationTypes\n if (!Array.isArray(list) || !list.length) return undefined\n const keys = list.map((t: any) => (typeof t === 'string' ? t : t?.key)).filter((k: any) => typeof k === 'string' && k)\n return keys.length ? keys : undefined\n}\n\n/** ์๊ฐ๋ ๋ฌธ์์ด์ ๋ชป ์ฝ์๋ค โ ์๊ฐ ํด์์ด UTC ๋ก ๋จ์ด์ง๋ค(์๋ฆฌ์ง ์๊ณ ํ์ง ์๊ฐ์ผ๋ก ๊ฐ์ ํ์ง ์๋๋ค). */\nexport const unknownTimezone = (timezone: string): IngestWarning => ({\n code: 'unknown-timezone',\n params: { timezone },\n message: `space timezone \"${timezone}\" is not a known IANA zone โ the twin will read times as UTC`\n})\n\n/** ์์
์ ์์ ์์์๊ฐยทํ๋ผ๋ฏธํฐ๊ฐ ์๋ค โ ์ปค๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์ํ๋ค. */\nexport const operationWithoutDuration = (operation: string): IngestWarning => ({\n code: 'operation-without-duration',\n params: { operation },\n message: `operation \"${operation}\" has no duration or parameters โ kernel defaults will be used`\n})\n\n/** ๋ณผ ์ ์๋ ํํ์ด ์๋ค โ ํ์ฅ์ด ํ๋ฉด์ ๋จ์ง ์๋๋ค. */\nexport const noViewableRepresentation = (): IngestWarning => ({\n code: 'no-viewable-representation',\n message: 'the space has no viewable representation (no representations and no geo) โ add one, or provide geo/board'\n})\n\n/**\n * ๊ตฌ์กฐ ํฌ์์์ **๊ฐ๋ฆฌํค๋ ๋์์ ๋ชป ์ฐพ์๋ค.**\n *\n * ์์ ์๋ ์ด๋ฐ ์ฐธ์กฐ๊ฐ model JSON ์์ ๋งจ ๋ฌธ์์ด์ด๋ผ ํ๋ฉด๋ง ๊ฒฝ๊ณ ํ ์ ์์๊ณ , ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ๋ค์ด์จ\n * ๋ฐ์ดํฐ๋ ์๋ฌด๋ ์ ๋ดค๋ค. ์ด์ ํ์ผ๋ก ํ๋ฉด์ **์ธ์ ์คํธ๊ฐ ์ง์ ์๋ค** โ ๊ทธ๋ฌ๋ ์ธ์ ์คํธ๊ฐ ๋งํ๋ค.\n * ๋ง์ง๋ ์๋๋ค(ํธ์์ model ๋ก ์ด๋ฏธ ๋์ํ๋ค). ๋ค๋ง ์๋ฆฌ์ง ์๊ณ ๋๊ธฐ์ง ์๋๋ค.\n */\nexport const unresolvedReference = (field: string, ref: string): IngestWarning => ({\n code: 'unresolved-reference',\n params: { field, ref },\n message: `${field} points at something that is not in this twin (${ref}) โ the link was left empty`\n})\n\n/**\n * ๊ตฌ์กฐ ํฌ์ ์์ฒด๊ฐ ์คํจํ๋ค โ ์กฐํ๋ ๋ชป ํ์ง๋ง **ํธ์์ ๋์ํ๋ค**(์ปค๋์ model ๋ฅผ ์ด๋ฏธ ๋ฐ์๋ค).\n * ํ์ ์๋ณธ์์ ๋ค์ ๊ทธ๋ฆด ์ ์์ผ๋ฏ๋ก ์ธ์ ์คํธ๋ฅผ ์คํจ๋ก ๋ง๋ค์ง ์๋, ์นจ๋ฌตํ์ง๋ ์๋๋ค.\n */\nexport const projectionFailed = (reason: string): IngestWarning => ({\n code: 'projection-failed',\n params: { reason },\n message: `structure projection failed (${reason}) โ the twin runs, but model inspection will be stale until the next ingest`\n})\n\n/**\n * **๋์ ์ค์ ๊ณต์ฅ์ ์ ํํ๋ค** โ ๋ฏธ๋ฌ๋ ๋ฉ์ถ์ง ์์ผ๋ฏ๋ก, ๋ฌด์์ด ์ฌ๋ผ์ก๋์ง ์ฌ๊ธฐ์ ๋งํ๋ค.\n *\n * ๋ฉ์ท๋ค ์ธ์ฐ๋ ๊ตฌ์กฐ ์ ํ์ด๋ผ๋ฉด ์ฌ์ฉ์๊ฐ \"๋ค์ ์ธ์ ๋ค\" ๋ ๊ฒ์ ์๋ค. ๋ฏธ๋ฌ๋ ๊ทธ ๋ง๋๊ฐ ์์ด์\n * ์๋ฆฌ ํ๋ยท์ค๋น ํ ๋๊ฐ ์๋ฆฌ์ง ์๊ณ ์์ด์ง ์ ์๋ค โ ์๋ฆฌ๊ฐ ์์ฒ์ธ ํ์ฅ์์ ํ๋ฉด์ ์๋ฅผ ์ธ์ด\n * ๋์น์ฑ๊ธฐ๋ฅผ ๊ธฐ๋ํ ์๋ ์๋ค. ๋์ด๋ ๊ฒ๋ ํจ๊ป ๋งํ๋ค(๋ฌด์์ด ๋ฐ์๋์๋๊ฐ ๊ณง ์ธ์ ์คํธ์ ๋ต์ด๋ค).\n */\nexport const structureAdopted = (rev: number, shift: { locationsAdded: number; locationsDropped: number; equipmentDropped: number; personsDropped: number; assetsDropped: number }): IngestWarning => ({\n code: 'structure-adopted',\n params: { rev, ...shift },\n message:\n `the running mirror adopted a new structure (revision ${rev}) โ ` +\n `+${shift.locationsAdded} location(s), -${shift.locationsDropped} location(s), ` +\n `-${shift.equipmentDropped} equipment, -${shift.personsDropped} person(s), -${shift.assetsDropped} asset(s)`\n})\n\n/**\n * ์ปค๋ฅํฐ๊ฐ ์ธ๋ถ ์์คํ
์ ๊ฐ์ **์ฐ๋ฆฌ ์ดํ๋ก ์ฎ๊ธฐ์ง ๋ชปํด ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์๋ค.**\n *\n * ์: Oracle WMS ๊ฐ ์ฐ๋ฆฌ ํ์ ์๋ `locn_type` ์ ์ฃผ๋ฉด ๊ทธ ์๋ฆฌ๋ `storage` ๊ฐ ๋๋ค โ ๋ํฌ๊ฐ ๋์ผ๋ก\n * ๋ชจ๋ธ๋ง๋๋ ๊ฒ์ด๋ค. ์ธ์ ์คํธ๋ฅผ ํต์งธ๋ก ์คํจ์ํฌ ์ผ์ ์๋์ง๋ง(๋ก์ผ์ด์
ํ๋ ๋๋ฌธ์ ํ์ฅ ์ ์ฒด๊ฐ\n * ์ ๋ค์ด์ค๋ ํธ์ด ๋ ๋์๋ค), **์๋ฆฌ์ง ์๊ณ ๋์ด๊ฐ๋ฉด ์ ๋๋ค.** ํธ์์ด ์ค๋ฌผ๊ณผ ๋ค๋ฅด๊ฒ ์๊ฒผ๋๋ฐ\n * ์๋ฌด๋ ๊ทธ ์ฌ์ค์ ๋ชจ๋ฅธ ์ฑ ๊ทธ ์์์ ํ๋ฆ์ ๋
ผํ๊ฒ ๋๋ค.\n *\n * ๊ฐ์ ๋์ดํ๋ ์ด์ : \"3๊ฑด\" ๋ง์ผ๋ก๋ ์ปค๋ฅํฐ ๋งคํ์ ๋ฌด์์ ๋ํด์ผ ํ๋์ง ์ ์ ์๋ค.\n */\nexport const connectorMappingFallback = (field: string, fallback: string, values: readonly string[], count: number): IngestWarning => ({\n code: 'connector-mapping-fallback',\n params: { field, fallback, values: values.join(', '), count },\n message: `${count} ${field} value(s) had no mapping and fell back to \"${fallback}\" (${values.join(', ')}) โ the twin's shape differs from the source system here`\n})\n\n\n/** ๋ก๊ทธ ํ ์ค โ ๊ฐ๋ฐ์๊ฐ ์ฝ๋ ๊ฒ์ด๋ฏ๋ก ์์ด canonical ๋ฌธ์ฅ์ ์ด๋ค. */\nexport const describeWarnings = (warnings: readonly IngestWarning[]): string =>\n warnings.map(w => `${w.code}: ${w.message}`).join(' | ')\n\n/**\n * ์๋ฒ๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฑ์ด ๋
ธ๋ธ๋ค โ ์ฌ์ฉ์๊ฐ ์ค ์ ์๋ ๊ฐ์ผ๋ก ํธ์์ด ๋ง๋ค์ด์ก์์ ์๋ฆฐ๋ค.\n *\n * ์๋ฆฌ์ง ์๊ณ ์ฑ์ฐ๋ฉด ๋์ค์ \"์ ์ด ์์น์ธ๊ฐ\" ๋ฅผ ์๋ฌด๋ ๋ตํ ์ ์๋ค. ๋ง์ ์ผ์ ์๋๋ค(๊ธฐ๋ณธ๊ฐ์ ํ
ํ๋ฆฟ์ด\n * ํ์ ์ ๊ฐ๊ณ ์ ์ธํ ๊ฐ์ด๋ค) โ ๋ค๋ง ๋ฐํ๋ค.\n */\nexport const knobDefaultsFilled = (keys: readonly string[]): IngestWarning => ({\n code: 'knob-defaults-filled',\n params: { keys: keys.join(', '), count: keys.length },\n message: `values you did not provide were filled from the template defaults: ${keys.join(', ')}`\n})\n\n/**\n * ์ด ํ์ฅ์ ์ค๋น๋ฅผ ๋
ธ๋ธ ๊ฐ์ผ๋ก ์ฑ์ ๋ค โ **์๋ฆฌ์ง ์๊ณ ์ฑ์ฐ์ง ์๋๋ค.**\n *\n * ์๋์ง ํธ์์ ๋ถํ๋ฅผ ์ด์ ์ค๋น id ๋ก ์ ์ธํ ๋ ์ด๋ค. ๋ช ๊ฐ๋ฅผ ๊ฐ์ ธ์๋์ง ๋งํด ์ฃผ์ง ์์ผ๋ฉด, ์ฌ์ฉ์๋\n * ์๊ธฐ๊ฐ ๊ณ ๋ฅด์ง ์์ ์ค๋น๋ค์ด ๋ถํ๋ก ์กํ ๊ฒ์ ๋์ค์ ํ๋ฉด์์์ผ ์๊ฒ ๋๋ค.\n */\nexport const siteEquipmentAdopted = (key: string, count: number): IngestWarning => ({\n code: 'site-equipment-adopted',\n params: { key, count },\n message: `${count} piece(s) of equipment already on this site were adopted as loads (knob \"${key}\") โ set their coefficients before trusting the numbers`\n})\n\nexport function masterToTwin(master: ReferenceMaster, catalog?: any): IngestedTwin {\n /* ์ปค๋ฅํฐ๊ฐ ์ฎ๊ธฐ๋ฉฐ ์๊ฒ ๋ ๊ฒ์ ๋จผ์ ์ฃ๋๋ค โ ์์ธ์ด ์์ ์ค๋ ํธ์ด ์ฝ๊ธฐ ์ฝ๋ค(๋์ฒด๊ฐ ๋จผ์ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋ค). */\n const warnings: IngestWarning[] = [...(master.warnings ?? [])]\n /*\n * ์๋ณธ์ด ์๊ธฐ ์ดํ๋ฅผ ์ ์ธํ์ผ๋ฉด **๊ทธ๊ฒ์ ๋์กฐํ๋ค.** ๋ด์ฅ ์นดํ๋ก๊ทธ๋ ๊ทธ ์ ์ธ์ด ์์ ๋์ ๊ธฐ๋ณธ์ด๋ค โ\n * ์๋๋ฅผ ๋ฐ๊พธ์ง ์์ผ๋ฉด, ์๊ธฐ ์ดํ๋ฅผ ์ ์ธํ ์๋ณธ์ด ์ ์์ ์ธ ์๋ฆฌ๋ง๋ค ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๋๋ค.\n */\n const known: string[] = declaredLocationTypes(master.productionSpec) ?? catalog?.[master.system]?.locationTypes ?? []\n\n const locationEntries = master.locations.filter(l => l.role === 'location' || l.role === 'both')\n const areaLocs = master.locations.filter(l => l.role === 'area' || l.role === 'both')\n\n const locations = locationEntries.map(l => {\n if (known.length && !known.includes(l.type)) warnings.push(unknownLocationType(master.system, l.type, l.id))\n // gs1Id(์ ์ ์ ์ฒด์ฑ)๋ฅผ ๋ชจ๋ธ์ ์๋ฆฌ๋ก ํต๊ณผ โ ๊ฒฐํฉ(tag)/์ถ์ ์ด GS1 ๋ก(ยงJ). ๋ก์ปฌ id ๋ ๊ทธ๋๋ก ์ ์ง(name/xref).\n /*\n * **์ด๋ฆ์ ํต๊ณผ์ํจ๋ค.** ์ฌ๊ธฐ์ ๋ฒ๋ฆฌ๊ณ ์์๋ค โ ๊ทธ๋์ ๋ชจ๋ธ์๋, ํฌ์ํ ํ์๋ ์ด๋ฆ์ด ์๊ณ \n * ํ๋ฉด์ ์๋ฆฌ id ๋ฅผ ๊ทธ๋๋ก ์ฐ์๋ค(`cut-station`). ๋ชฉ๋กยทํยท๊ด๊ณ ๊ทธ๋ฆผ์์ ๊ฐ์ ๊ฒฐํจ์ด ๋ฐ๋ก\n * ๋ณด์๋ ์ด์ ๊ฐ ์ด ํ ์ค์ด๋ค. ์ด๋ฆ ์๋ ์๋ณธ์ ์ด๋ฆ ์์ด ํต๊ณผํ๋ค(id ๋ก ๋ฉ์ฐ์ง ์๋๋ค).\n */\n /*\n * **์์ฑ๋ ํต๊ณผ์ํจ๋ค** โ ์ค๋น์ ๊ฐ์ ๊ท์จ(์๋์ง ์๊ณ ๋๋ฅธ๋ค). ์ฌ๊ธฐ๊ฐ ์์ผ๋ฉด ์๋ฆฌ์ ์ค์ ๊ฐ์ด\n * ์ปค๋์ ๋ฟ์ง ์๋๋ค: ์๋์ง์ ๊ณ์ฝ์ ๋ ฅ(`contract.kW`)์ด ๊ทธ ๊ฒฝ๋ก์ด๊ณ , ํต๊ณผํ์ง ์์ผ๋ฉด ์ปค๋์ด\n * ๊ณ์ฝ์ ๋ชจ๋ฅด๋ ์ฑ๋ก ์์ **ํ์ ์ ์์ ํ์ง ์๋๋ค**(์ค๋ฅ ์์ด ์๋ฆฌ์ง ์๊ณ ).\n */\n return { id: l.id, type: l.type, ...(l.name ? { name: l.name } : {}), ...(l.description ? { description: l.description } : {}), capacity: l.capacity ?? 0, ...(l.parallelism !== undefined ? { parallelism: l.parallelism } : {}), ...(l.level ? { level: l.level } : {}), ...(l.properties?.length ? { properties: l.properties } : {}), parentId: l.parentId, ...(l.upstreamId ? { upstreamId: l.upstreamId } : {}), gs1Id: l.gs1Id }\n })\n\n const equipment = (master.equipment ?? []).map(e => ({\n id: e.id, kind: e.kind, ...(e.name ? { name: e.name } : {}), ...(e.description ? { description: e.description } : {}), ...(e.testResults?.length ? { testResults: e.testResults } : {}),\n homeLocation: e.homeLocationId, mtbfMs: e.mtbfMs, mttrMs: e.mttrMs, ...(e.identity ? { identity: e.identity } : {}),\n ...(e.window ? { window: e.window } : {}),\n /* ์์ฑ์ ์๋์ง ์๊ณ ํต๊ณผ โ ์ด๋์๊ฐ ์ถ์ ๊ธฐ๊ฐ kind ๋ณ ์๋๋ฅผ ์ฌ๊ธฐ์ ์ฝ๋๋ค(๋จ์ ์ฝ๋ ๊ทธ๋๋ก). */\n ...(e.properties?.length ? { properties: e.properties } : {}), ...(e.workCalendar?.length ? { workCalendar: e.workCalendar } : {}), ...(e.testSpecificationIds?.length ? { testSpecificationIds: e.testSpecificationIds } : {}),\n /* ์ ํจ ๊ธฐ๊ฐ๋ ์๋์ง ์๊ณ ํต๊ณผ โ ํ์ ์ ์ปค๋์ด ์๊ธฐ ์๊ณ๋ก ํ๋ค(ํธ์คํธ๊ฐ ๋ฏธ๋ฆฌ ์๋ฅด์ง ์๋๋ค). */\n ...(e.effectiveStart ? { effectiveStart: e.effectiveStart } : {}), ...(e.effectiveEnd ? { effectiveEnd: e.effectiveEnd } : {})\n }))\n\n // ์ขํ(layout) โ footprint ์ค์ฌ. ์์ผ๋ฉด ์๋ต(coordinate-free ์ ์ง).\n const layout: Record<string, { x: number; y: number }> = {}\n for (const l of locationEntries) if (l.footprint) layout[l.id] = { x: l.footprint.x + l.footprint.w / 2, y: l.footprint.y + l.footprint.h / 2 }\n\n const spaceId = master.space.spaceId ?? `${master.source}-site`\n /*\n * ์๊ฐ ๊ธฐ์ค์ ์ปค๋์ด ์ฝ์ ํํ๋ก ํผ๋ค โ ์ปค๋์ zero-dep ์ด๋ผ ์๊ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค์ด์ง ์๊ณ \n * **๋ถ ์คํ์
**๋ง ๋ฐ๋๋ค(๊ณ์ฝ `TwinModelDef.utcOffsetMinutes`). ํธ๋ ์ผ์ ํธ์คํธ์ ๋ชซ์ด๋ค.\n *\n * ์ ์ธ์ด ์์ผ๋ฉด **ํ๋๋ฅผ ๋ง๋ค์ง ์๋๋ค** โ ๊ทธ๋ฌ๋ฉด ์ปค๋์ด UTC ๋ก ์ฝ๊ณ , ๊ทธ ๊ธฐ๋ณธ๊ฐ์ ๊ณ์ฝ์ ๋ฐํ์ ธ ์๋ค.\n * ์ฌ๊ธฐ์ 0 ์ ๋ฃ์ผ๋ฉด \"UTC ๋ผ๊ณ ์ ์ธํ๋ค\" ์ \"์ ์ธํ์ง ์์๋ค\" ๊ฐ ๊ตฌ๋ณ๋์ง ์๋๋ค.\n */\n const utcOffsetMinutes = utcOffsetOf(master.space.timezone)\n if (master.space.timezone && utcOffsetMinutes === undefined) {\n warnings.push(unknownTimezone(String(master.space.timezone)))\n }\n /*\n * ์คํผ๋ ์ด์
๋ช
์ธ๋ฅผ model ์ ํต๊ณผ์ํจ๋ค โ ์ปค๋์ด `loadOperations` ๋ก ์๋นํ๋ค(TwinModelDef ํ์ฅ ํ๋,\n * ๋ชจ๋ฅด๋ ์ปค๋์ ๋ฌด์). ์ฌ๊ธฐ์ ๊ฐ์ ์๋์ง ์๋๋ค: ๊ธฐ๊ฐ์ ํ์ค ํ๊ธฐ(ISO 8601)๋ก ์ปค๋๊น์ง ๊ทธ๋๋ก ๊ฐ๋ค.\n */\n const operations = master.operations\n if (operations?.length) {\n for (const o of operations) {\n if (!o.duration && !o.parameters?.length) warnings.push(operationWithoutDuration(o.key))\n }\n }\n /* ์ฌ๋๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๋ฑ๊ธยท๊ต๋ ๊ทธ๋๋ก ์ปค๋๊น์ง ๊ฐ๋ค(๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค). */\n const persons = master.persons?.map(p => ({ id: p.id, ...(p.name ? { name: p.name } : {}), ...(p.testResults?.length ? { testResults: p.testResults } : {}), personnelClassIds: p.personnelClassIds, ...(p.window ? { window: p.window } : {}), ...(p.workCalendar?.length ? { workCalendar: p.workCalendar } : {}), ...(p.homeLocationId ? { homeLocation: p.homeLocationId } : {}), ...(p.properties?.length ? { properties: p.properties } : {}), ...(p.testSpecificationIds?.length ? { testSpecificationIds: p.testSpecificationIds } : {}), ...(p.effectiveStart ? { effectiveStart: p.effectiveStart } : {}), ...(p.effectiveEnd ? { effectiveEnd: p.effectiveEnd } : {}) }))\n /* ์์ฐ๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๋ฑ๊ธยท์๋ฆฌ ๊ทธ๋๋ก ์ปค๋๊น์ง. */\n const assets = master.assets?.map(a => ({ id: a.id, ...(a.name ? { name: a.name } : {}), ...(a.testResults?.length ? { testResults: a.testResults } : {}), assetClassIds: a.assetClassIds, homeLocation: a.homeLocationId, gs1Id: a.gs1Id, ...(a.properties?.length ? { properties: a.properties } : {}), ...(a.testSpecificationIds?.length ? { testSpecificationIds: a.testSpecificationIds } : {}), ...(a.effectiveStart ? { effectiveStart: a.effectiveStart } : {}), ...(a.effectiveEnd ? { effectiveEnd: a.effectiveEnd } : {}) }))\n /* ํ๋ชฉ ์ ์ยท๋ฑ๊ธ๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค(ํ์ฐ ๊ณ์๋ ์ปค๋์ด ์ฝ๋๋ค). */\n const materialDefinitions = master.materialDefinitions?.map(d => ({\n id: d.id,\n /* ์ด๋ฆ์ ์ด๋ฆ ์๋ฆฌ์ โ ์์ ์๋ `name` ์ `description` ์ผ๋ก ์ฎ๊ฒจ ๋ด์๋ค(์ดํ๊ฐ ๋ค์งํ ์์๋ค). */\n ...(d.name ? { name: d.name } : {}),\n ...(d.materialClassIds?.length ? { materialClassIds: d.materialClassIds } : {}),\n ...(d.properties?.length ? { properties: d.properties } : {}),\n ...(d.testSpecificationIds?.length ? { testSpecificationIds: d.testSpecificationIds } : {}),\n ...(d.effectiveStart ? { effectiveStart: d.effectiveStart } : {}),\n ...(d.effectiveEnd ? { effectiveEnd: d.effectiveEnd } : {})\n }))\n /*\n * **๋ฑ๊ธ์ ํ์๋ช
์ `name` ์ด๋ค.**\n *\n * ํ์ค ๋ง์คํฐ๋ ๋ฑ๊ธ์ ํ์๋ช
์ `description` ์ ๋ด๋๋ค(`RefResourceClass.description` = i18n ํค).\n * ๊ทธ๊ฒ์ ๊ทธ๋๋ก ๋ชจ๋ธ์ ์ค์ผ๋ฉด ํ๋ฉด์ \"์ค๋ช
\" ์ด์ ์ด๋ฆ์ด ์๋๋ค โ ์ฌ์ฉ์์๊ฒ๋ ์ด๋ฆ์ธ๋ฐ ๋จธ๋ฆฌ๊ธ์\n * ์ค๋ช
์ด๋ผ, ๊ฐ์ ๊ฒ์ ์ถ๋ง๋ค ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ถ๋ฅด๊ฒ ๋๋ค.\n *\n * ๊ทธ๋์ **๋ฌธ ํ๋์์ ์ดํ๋ฅผ ๋ง์ถ๋ค**: ํ์๋ช
์ ์ด๋ ์ถ์ด๋ `name`. ์๋์ `description` ์\n * ๋จ๊ฒจ ๋์ง ์๋๋ค โ ๋ ์๋ฆฌ์ ๊ฐ์ ๊ฐ์ด ์์ผ๋ฉด ์ด๋ ๊ฒ์ด ์ ๋ณธ์ธ์ง ๋ค์ ํท๊ฐ๋ฆฐ๋ค.\n */\n const asName = (list?: RefResourceClass[]) =>\n list?.map(({ description, ...rest }) => ({ ...rest, ...(description ? { name: description } : {}) }))\n /*\n * ๊ฒ์ฌ ๋ช
์ธ๋ **ํ์๋ช
์ `name`** ์ด๋ค โ ๋ฑ๊ธ๊ณผ ๊ฐ์ ๊ท์น์ ์ด๋ค(์ดํ๋ฅผ ํ๋๋ก). ํ์ค ๋ง์คํฐ๋\n * ํ์๋ช
์ `description` ์ ๋ด์ผ๋ฏ๋ก ๋ฌธ ํ๋์์ ์ฎ๊ธด๋ค. ๊ทธ๋ฌ์ง ์์ผ๋ฉด ํ๋ฉด์ \"์ค๋ช
\" ์ด์ ์ด๋ฆ์ด\n * ์์ ์ถ๋ง๋ค ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๊ฐ์ ๊ฒ์ ๋ถ๋ฅด๊ฒ ๋๋ค(๋ฑ๊ธ์์ ์ด๋ฏธ ๊ฒช์๋ค).\n */\n const testSpecifications = master.testSpecifications?.map(({ description, ...rest }) => ({\n ...rest,\n ...(description ? { name: description } : {})\n }))\n const personnelClasses = asName(master.personnelClasses)\n const equipmentClasses = asName(master.equipmentClasses)\n const assetClasses = asName(master.assetClasses)\n const materialClasses = asName(master.materialClasses)\n\n const model = {\n locations, equipment, layout, spaceId,\n /* ์์ฐ ์ ์๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค(์ปค๋์ด ๊ทธ๋๋ก ์๋นํ๋ค). */\n ...(master.productionSpec ? { productionSpec: master.productionSpec } : {}),\n /* ์ ์ฒด์ฑ ์ ์ธ๋ ๊ทธ๋๋ก ํต๊ณผํ๋ค โ ์์ผ๋ฉด ๋ง๋ค์ง ์๋๋ค(์ปค๋์ด ๋ ๊ฑฐ์ ์์๋ก ๋จ์ด์ง๋ค). */\n ...(master.identity ? { identity: master.identity } : {}),\n ...(materialDefinitions?.length ? { materialDefinitions } : {}),\n ...(materialClasses?.length ? { materialClasses } : {}),\n ...(utcOffsetMinutes !== undefined ? { utcOffsetMinutes } : {}),\n ...(operations?.length ? { operations } : {}),\n ...(testSpecifications?.length ? { testSpecifications } : {}),\n ...(personnelClasses?.length ? { personnelClasses } : {}),\n ...(equipmentClasses?.length ? { equipmentClasses } : {}),\n ...(assetClasses?.length ? { assetClasses } : {}),\n ...(persons?.length ? { persons } : {}),\n ...(assets?.length ? { assets } : {})\n }\n\n const areas = areaLocs.map(l => ({\n id: l.id, type: l.type, name: l.name ?? l.id, parentId: l.parentId, ...(l.upstreamId ? { upstreamId: l.upstreamId } : {}),\n x: l.footprint?.x ?? 0, y: l.footprint?.y ?? 0, w: l.footprint?.w ?? 10, h: l.footprint?.h ?? 10\n }))\n // ์ธ์ ์คํธ ํ์ฅ ๋ฌผ์งํ(space facet #4) โ ํํ์ด ์๊ณ geo ๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ map ํํ ํฉ์ฑ.\n // \"์ธ์ ์คํธํ๋ฉด ์์๋ณผ ํ์ฅ(๋ด place)์ด ๋ฌ๋ค\"๋ ๊ณต๊ฐ ์ค์ฌ ์ ์ ๋ณด์ฅ(zero-to-twin): ์ปค๋ฅํฐ/ํ
ํ๋ฆฟ์ด\n // ํํ์ ์ ์ค๋ geo ๋ง ์์ผ๋ฉด ์์ฑ ์ง๋๋ก ์ฐฉ์ง. (area ํด๋ฆฌ๊ณค ๋ฌผ์งํ๋ ์ขํ ํฌ์ ํ์ โ space #3.)\n const geo = master.space.geo\n const givenReps = master.space.representations ?? []\n /*\n * โโ ์ด๋ฆ์ ์ง์ด๋ด์ง ์๋๋ค (2026-08-26) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ๊ธฐ๊ฐ ํฉ์ฑํ ํํ์ `name: '์์ฑ ์ง๋'` ๋ฅผ ๋ฃ๊ณ ์์๋ค. ์ด ์ธต์ ์ธ์ด ์ค๋ฆฝ์ด์ด์ผ ํ๋๋ฐ ํ๊ตญ์ด๊ฐ\n * ๊ทธ๋๋ก ์ ์ฅ๋๋ค.\n *\n * ๋ฑ๋ง ์ด์ (`twin.representation.map` ๊ฐ์ ๊ฒ)๋ฅผ ๋ฃ๋ ๊ธธ๋ ์๋๋ฐ ํํ์ง ์์๋ค. **ํํ์ ์ด๋ฆ์\n * ์ฌ๋์ด ๋ฐ๊ฟ ์ ์๋ ๊ฐ**์ด๊ณ , ๋ฐ๊ฟ ์ ์๋ ๊ฐ ์์ ์ด์ ๊ฐ ๋ค์ด ์์ผ๋ฉด ์ฌ๋์ด ํ ๋ฒ ๊ณ ์น๋ ์๊ฐ\n * ๊ทธ ์๋ฆฌ๋ง ์ด์ ๊ฐ ์๋๊ฒ ๋์ด ๊ท์น์ด ๋์ด ๋๋ค.\n *\n * ๊ทธ๋์ ์ด๋ฆ์ ๋ฃ์ง ์๋๋ค. ํ๋ฉด์ด ์ข
๋ฅ(`map`)๋ก ๋ถ๋ฅด๊ณ , ์ฌ๋์ด ๋ถ์ด๋ฉด ๊ทธ๋๋ถํฐ ๊ทธ ์ด๋ฆ์ด๋ค.\n */\n const representations =\n givenReps.length > 0\n ? givenReps\n : geo\n ? [{ id: 'r-map', type: 'map', primary: true, center: { lat: geo.lat, lon: geo.lon }, zoom: 17 }]\n : []\n if (representations.length === 0) {\n warnings.push(noViewableRepresentation())\n }\n const spaceContent = {\n width: master.space.width, depth: master.space.depth, unit: master.space.unit ?? 'm',\n geo, representations, primaryId: master.space.primaryId ?? representations[0]?.id,\n areas\n }\n\n return { model, spaceContent, warnings }\n}\n\n/**\n * ๋ค์ ์ฝ์ ์ฌ์ดํธ๋ฅผ ๊ณ ๋ฅธ๋ค โ **๊ธฐ์ตํด ๋ ์ฌ์ดํธ ํ๋๋ง**.\n *\n * ๋ชป ์ฐพ์ผ๋ฉด **์ฒซ ์ฌ์ดํธ๋ก ๋์ฐ์ง ์๋๋ค**: ๋ค๋ฅธ ํ์ฅ์ ๊ตฌ์กฐ๋ฅผ ์ด ํธ์์ ๋ฎ์ด์ฐ๋ ์ผ์ด๊ณ , ๊ทธ๊ฒ์ ์ค๋ฅ๊ฐ\n * ์๋๋ผ **์ค๋ฅ ์์ด ํ๋ฆฐ ๊ณต์ฅ**์ผ๋ก ๋ํ๋๋ค. ๊ธฐ์ต์ด ์๋ ์ ํธ์์ `undefined` ๋ฅผ ๋๋ ค์ฃผ๊ณ , ๋ถ๋ฅด๋ ์ชฝ์ด\n * ๋ง์คํฐ์ ์ ์ฒด(`source` = ์ธ์คํด์ค id)๋ก ์ฐพ๋ ๊ธธ์ ํํ๋ค.\n */\nexport function pickOriginSite<T extends { siteId: string }>(\n sites: readonly T[],\n origin: { siteId?: string } | undefined | null\n): { site?: T; reason?: 'no-remembered-site' | 'site-gone' } {\n const wanted = String(origin?.siteId ?? '').trim()\n if (!wanted) return { reason: 'no-remembered-site' }\n const site = sites.find(s => String(s.siteId) === wanted)\n return site ? { site } : { reason: 'site-gone' }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"reference-master.js","sourceRoot":"","sources":["../../../server/service/reference/reference-master.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Face2 ๋ง์คํฐ ์ธ์ ์คํธ(ADR-0018 ๋ฐ์ ๋ชจ๋) โ ๋ ํผ๋ฐ์ค ์์คํ
(์ค WMS/YMS/MES ๋๋ ๊ฐ์ ๋ ํผ๋ฐ์ค)์\n * ๋ง์คํฐ๋ฅผ ์ฝ์ด ํธ์ ๊ตฌ์กฐ(TwinModelDef) + ๊ณต๊ฐ(Space content)์ ์์ฑ. ์๋ฐฐ์ ์ด ์๋๋ผ ์ธ์ ์คํธ๋ก ์ํฐํฐ๊ฐ ํ๋ฅธ๋ค.\n *\n * ๊ท์จ(ADR-0018): ๋๋ฉ์ธ ํ์
(location.type=๋
ธ๋์ฉ)์ ์ปค๋ ์นดํ๋ก๊ทธ ์ดํ๋ฅผ ๊ทธ๋๋ก ๋ฐ์(๋ฐ๋ช
๊ธ์ง).\n * location ์ role ๋ก ๋
ธ๋(์ด์์ )ยทarea(๊ณต๊ฐ์์ญ)ยทboth ๋ฅผ ๊ตฌ๋ถ โ ๋
ธ๋โTwinModelDef, areaโSpace.areas.\n * ์ขํยทrepresentations ๋ ํธ์ ๊ณต๊ฐ์ธต(๋ณด์/์ถ๊ฐ). ์ค ์์คํ
์ด ์ขํ๋ฅผ ์ ์ฃผ๋ฉด layout ์์ด ์์๋ง ์ธ์ ์คํธ.\n */\n\nimport type { DomainSystem, EquipmentLevel, TestSpecificationCriterion, WorkCalendarEntry } from '@operato/ops-contract'\n\nexport interface RefLocation {\n id: string\n type: string // ๋
ธ๋๋ ์ปค๋ ๋
ธ๋ํ์
(dock/storage/yard-slotโฆ), area ๋ ๊ณต๊ฐ region ํ์
\n name?: string\n description?: string\n role: 'location' | 'area' | 'both'\n parentId?: string\n /**\n * **์ ๊ธฐ์ ์ผ๋ก ์ด๋์ ๋ฐ๋๊ฐ** โ ์ด ์๋ฆฌ์ ์ ๊ธฐ๋ฅผ ์ฃผ๋ ์๋ฅ ์๋ฆฌ(์ปค๋ ๊ณ์ฝ์ `upstreamId`).\n *\n * `parentId`(๊ณต๊ฐ ํฌํจ)์ ๋ฐ๋ก ๋๋ ์ด์ ๋ ์ปค๋ ๊ณ์ฝ์ ์ ํ ์๋ค. ์ฌ๊ธฐ์ ๋น ๋จ๋ฆฌ๋ฉด ๋ง์คํฐ๊ฐ ๋งํ ๊ณํต์ด\n * ๋ชจ๋ธ๊น์ง ์ค์ง ๋ชปํ๊ณ , ๋ฟ๋ฆฌ ๊ณ๋ ํ์ ์ด ๋ถ๊ธฐ ๊ณ๋๊ธฐ๊น์ง ๋ฟ๋ฆฌ๋ก ์ธ์ด **๋ถํ๊ฐ ๋ ๋ฐฐ๋ก** ๋ณด์ธ๋ค.\n */\n upstreamId?: string\n /** ์ ์ฅ ์ฉ๋ โ ์ด ์๋ฆฌ์ ๋์์ ๋์ผ ์ ์๋ ๋ฌผํ ์. */\n capacity?: number\n /**\n * ๋์ ์ฒ๋ฆฌ ์ โ ์ด ์๋ฆฌ์์ ํ ๋ฒ์ ์งํ๋ ์ ์๋ ์์
์. **์ ์ฅ ์ฉ๋๊ณผ ๋ค๋ฅธ ์ถ**์ด๋ค\n * (์์ฌ๋ฅผ 20๊ฐ ์์ ๋๋ ์ ๋จ ์คํ
์ด์
์ด ํ ๋ฒ์ ํ ๋๋ง ๊น๋๋ค). ๋ฏธ์ง์ =์ ์ฝ ์์.\n */\n parallelism?: number\n /**\n * **ISA-95 ์ค๋น ๊ณ์ธต ๋จ๊ณ** โ `EquipmentLevel` ์ด๊ฑฐ๊ฐ(`ProductionLine`ยท`StorageZone`ยท`WorkCenter`โฆ).\n *\n * `type` ์ ํ์ฅ์ ๋ฑ๋ง(`paint-booth`)์ด๊ณ ์ด๊ฒ์ **ํ์ค์ด ์ ํ ์ญํ **์ด๋ค. ๋์ ๋ค๋ฅธ ์ถ์ด๋ผ ํจ๊ป ๋ ๋ค โ\n * ์ฐ๋ยท์ง๊ณ๋ ํ์ค ์ถ์ผ๋ก, ํ๋ฉด์ ํ์ฅ ๋ฑ๋ง๋ก. ๋ฏธ์ง์ ์ด๋ฉด ๊ทธ ์๋ฆฌ์ ํ์ค ์ญํ ์ ์์ง ๋ชจ๋ฅธ๋ค๋ ๋ป์ด๊ณ ,\n * ์ง์ํด ์ฑ์ฐ์ง ์๋๋ค.\n */\n level?: EquipmentLevel\n /**\n * ์๋ฆฌ์ **์ด๋ฆฐ ์์ฑ** โ ํ์ค `OperationalLocationProperty`(์ค๋นยท์ฌ๋ยท์์ฐ๊ณผ ๊ฐ์ ๋ชจ์).\n *\n * ๋ฌด์์ด ์ฌ๊ธฐ ์ค๋ฆฌ๋: **์๋ฆฌ์ ๋ฌผ๋ฆฌ๋**์ด๋ค. ์๋์ง์ ๊ณ์ฝ์ ๋ ฅ(`contract.kW`)์ด ์ฒซ ์ฌ๋ก๋ค โ\n * ๊ทธ ๊ฐ์ด ์์ ์๋ฆฌ๊ฐ ์์ด์ EMS ์ปค๋์ ๊ณ์ฝ ๋๋น ํ์ ์ ํ ์ ์์๋ค(์๋ฆฌ๊ฐ ์์ผ๋ฉด ์ฌ์ค์ด\n * ๋ค์ด์ค์ง ๋ชปํ๋ค). ์ปค๋์ ์๊ธฐ๊ฐ **์ฝ๋** ์์ฑ id ๋ง ์ ์ธํ๊ณ (`EMS_PROPERTY`) ๋๋จธ์ง๋ ๋๋ฅธ๋ค.\n */\n properties?: RefResourceProperty[]\n footprint?: { x: number; y: number; w: number; h: number } // ์์ผ๋ฉด area ๊ธฐํ + ๋
ธ๋ ์ค์ฌ์ขํ\n gs1Id?: string // ์ ์ GS1 ์ ์ฒด์ฑ(ยงJ) โ ์์น=SGLN. ๊ฒฐํฉ(tag)/์ถ์ canonical id. ๋ฐ์๋ค์ด๊ธฐ ๊ฒฝ๊ณ์ ๋ถ์ฌ(๋ก์ปฌ id=name/xref ๋ก ๋ณด์กด).\n}\n\n/**\n * ์ค๋น ์์ฑ โ **ISA-95 `EquipmentSpecificationProperty`(`OpEquipmentSpecificationPropertyType`) 1:1.**\n * ๊ทธ ํ์
๋ `ID` + `Value`(`ValueString`ยท`DataType`ยท`UnitOfMeasure`) ์ด๋ฏ๋ก ๊ณต์ ๋ชจ์์ ๊ฐ์ ๋ชจ์์ด๋ค.\n *\n * ๋จ์ ์ฝ๋๋ **UN/CEFACT ๊ถ๊ณ 20 ๊ณตํต์ฝ๋**(EPCIS `uom` ๊ณผ ๊ฐ์ ์ฝ๋๊ณ): ์๋๋ `MTS`(metre per\n * second) ๋๋ `KMH`(kilometre per hour). ์ฝ๋๋ฅผ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ช
ํ์ง ์๋๋ค.\n */\n/**\n * ์์ ์์ฑ โ **์ปค๋ `ResourceProperty` ์ ๊ฐ์ ๋ชจ์**์ด๊ณ , ๊ทธ ๋ชจ์์ ISA-95 ๊ฐ ์ธ ์์์ ๋๊ฐ์ด\n * ์ ์ํ ๊ฒ์ด๋ค(`EquipmentPropertyType` ยท `PersonPropertyType` ยท `PhysicalAssetPropertyType`).\n *\n * ๊ทธ๋์ ์์๋ง๋ค ๋ค๋ฅธ ์์ฑ ํ์
์ ๋์ง ์๋๋ค โ ์์ ์๋ ์ค๋น๋ง ์์ฑ์ ๊ฐ์ก๊ณ (RefEquipmentProperty),\n * ์ธ์ยท์์ฐ์ ๋ถ๋ ์ฌ์ค์ **์ค์ ์๋ฆฌ๊ฐ ์์ด์ ๋ค์ด์ค์ง ๋ชปํ๋ค.**\n */\nexport interface RefResourceProperty {\n id: string\n description?: string\n value?: string\n /** ํ์ค `Value.DataType`. */\n dataType?: string\n /** ํ์ค `Value.UnitOfMeasure` โ UN/CEFACT ๊ณตํต์ฝ๋. ๋ฌผ๋ฆฌ๋์ ๋จ์๊ฐ ์์ผ๋ฉด ์๋น์ฒ๊ฐ ๊ฑฐ์ ํ๋ค. */\n uom?: string\n /** ํ์ ์์ฑ(์ฌ๊ท) โ ํ์ค `<X>PropertyChild`. */\n children?: RefResourceProperty[]\n /** ์ด ๊ฐ์ฒด ์์ฑ์ด ๊ตฌ์ฒดํํ๋ ๋ฑ๊ธ ์์ฑ โ ํ์ค `<X>ClassPropertyID`. */\n classPropertyId?: string\n}\n\n/** ์ ์ด๋ฆ โ ์ค๋น ์ ์ฉ์ด๋ ์์ ์ ๋ณ์นญ(์๋น์ฒ ํธํ). ์ ๊ท ์์ฑ์ `RefResourceProperty`. */\nexport type RefEquipmentProperty = RefResourceProperty\n\n/**\n * ์์ **๋ฑ๊ธ ์ ์** โ ์ปค๋ `ResourceClassDef` ์ ๊ฐ์ ๋ชจ์์ด๊ณ , ๊ทธ ๋ชจ์์ ISA-95 ๊ฐ ์ธ ์์์ ๋๊ฐ์ด\n * ์ ์ํ ๊ฒ์ด๋ค(`PersonnelClassType`ยท`EquipmentClassType`ยท`PhysicalAssetClassType`).\n *\n * ์ ํ์ํ๊ฐ: ์ ์์คํ
์ ๋ฑ๊ธ **์ฒด๊ณ**๋ฅผ ๊ฐ๊ณ ์๋ค(\"6์ถ ์ฉ์ ์๊ฒฉ์\" ๋ \"์ฉ์ ์๊ฒฉ์\" ์ด๊ณ , ๊ทธ๊ฒ์\n * \"์์ฐ์ง\" ์ด๋ค). ๊ทธ ์ฒด๊ณ๊ฐ ๋ค์ด์ฌ ์๋ฆฌ๊ฐ ์์ผ๋ฉด ์๊ตฌ์ ์์์ด **๋ฌธ์์ด์ด ๋๊ฐ์ ๋๋ง** ๋ง์,\n * ํ์ฅ์์๋ ๋๋ ๋ฐฐ์ ์ด ๋ชจ๋ธ์์ ๋งํ๋ค.\n */\nexport interface RefResourceClass {\n id: string\n description?: string\n /** ์์ ๋ฑ๊ธ๋ค โ ํ์ค `<X>ClassBaseID`(๋ณต์ = ๋ค์ค ์์). */\n baseIds?: string[]\n properties?: RefResourceProperty[]\n testSpecificationIds?: string[]\n /** ์ ํจ ๊ธฐ๊ฐ(ISO) โ ํ์ค `EffectiveStartDate`/`EffectiveEndDate`. ๋ฐ์ด๋ฉด ์๊ฒฉ์ด ์ฑ๋ฆฝํ์ง ์๋๋ค. */\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * ๊ฒ์ฌ ๋ช
์ธ โ **์์์ด ๊ฐ๋ฆฌํค๋ ๋์**(ISA-95 `TestSpecification`).\n *\n * ํ์ค ํ๋๋ ์
๋ง ๋ด๋๋ค(`ID`ยท`Description`ยท`Version`) โ ์ฌ๋ ์์ฑ๊ณผ ํฉ๊ฒฉ ๊ธฐ์ค์ ์์ง 1์ฐจ ์ถ์ฒ์\n * ๋์กฐํ์ง ์์๋ค(์ปค๋ ๊ณ์ฝ์ ๋จธ๋ฆฌ๋ง์ด ๊ทธ ์ฌ์ค์ ์ ์ด ๋์๋ค).\n */\n/**\n * ์ํ ๊ฒฐ๊ณผ โ **\"์ด ๊ฐ์ฒด๊ฐ ๊ทธ ์ํ์ ํต๊ณผํ๋ค\"** ๋ ๊ธฐ๋ก(ISA-95 ๊ฒฐ๊ณผ).\n *\n * ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋ ๊ณณ์ ํธ์์ด ์๋๋ค(์ธ์ฌยท์ ๋น ์์คํ
์ด ๊ธฐ๋กํ๋ค) โ ๊ทธ๋์ ๊ด์ธก์ด๋ฉด์ **์ ์ธ ๊ฒฝ๋ก๋ก** ์จ๋ค.\n * ์ปค๋์ ์ด ๊ฐ์ด ์์ ๋๋ง ์๊ฒฉ์ ํ์ ํ๋ค: ์์ผ๋ฉด ์ ์ฝ์ด ์๋๊ณ (๋ผ์ธ์ด ๊ตถ์ง ์๋๋ค), ์์ผ๋ฉด ๋ง๋ฃยท\n * ๋ถํฉ๊ฒฉ์ด ๋ฐฐ์ ์ ๋ง๋๋ค.\n */\nexport interface RefTestResult {\n specId: string\n result: 'pass' | 'fail'\n at?: string\n /** ์์ผ๋ฉด ๋ฌด๊ธฐํ โ ์ง์์ผ๋ก ๊ธฐํ์ ๋ง๋ค๋ฉด ๋ฉ์ฉกํ ์๊ฒฉ์๊ฐ ์ค๋ฅ ์์ด ์ฌ๋ผ์ง๋ค. */\n expiresAt?: string\n}\n\nexport interface RefTestSpecification {\n id: string\n /** ํ์๋ช
โ i18n ํค์ผ ์ ์๋ค. ์ฝ๋ ์ดํ๋ฅผ ํ๋๋ก ๋ง์ถ๋ ค๊ณ ์ธ์ ์คํธ๊ฐ `name` ์ผ๋ก ์ฎ๊ธด๋ค. */\n description?: string\n version?: string\n /**\n * ํ์ ๊ธฐ์ค๋ค โ ์ปค๋ ๊ณ์ฝ์ `TestSpecification.criteria` ๋ฅผ ๊ทธ๋๋ก ๋๋ฅธ๋ค.\n *\n * **๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค.** ์ปค๋ ํ์
์ ๊ทธ๋๋ก ์ฐ๋ฏ๋ก `limit.{minimum,maximum,uom}` ยท\n * `expression` ยท `evaluatedPropertyId` ๊ฐ ์๋ณธ์์ ์ปค๋๊น์ง ํ ์ด๋ฆ์ผ๋ก ๊ฐ๋ค.\n *\n * ์ ์ธํ์ง ์์๋ ๋ช
์ธ๋ ์ฑ๋ฆฝํ๋ค(์ด๋ฆ๋ง์ผ๋ก ใ๋ฌด์์ผ๋ก ๊ฒ์ฆํ๋ใ์ ๋ตํ๋ค). ์ ์ธํ๋ฉด **ํ์ ์\n * ๊ทผ๊ฑฐ๊ฐ ์๋์ง**๋ฅผ ๋ฌผ์ ์ ์๊ฒ ๋๋ค โ ์ปค๋์ `criterionSaysNothing` ์ด ๊ทธ๊ฒ์ ์ผ๋ค.\n */\n criteria?: TestSpecificationCriterion[]\n}\n\nexport interface RefEquipment {\n id: string\n kind: string\n /**\n * ์ํ **๋ฑ๊ธ๋ค** โ ๊ณ์ฝ ์ ์ธ์ `equipment[].equipmentClassIds` ๋ก ๊ทธ๋๋ก ๊ฐ๋ค.\n *\n * โโ ์ ๋น ์ ธ ์์๋ (2026-09-04) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์ ์ด ์ถ์ ์ฌ๋ ๋ ๋ชจ๋ธยท์ํยท์ ๋ยท๋ฏธ๋ฌ๊น์ง ๋ฐฐ์ ํ๋๋ฐ **์ ์๋ฉด์ด ๋น ์ก๋ค.** ์ฌ๋๊ณผ ์์ฐ์\n * ๋ฐ๋๋ฐ(`personnelClassIds`ยท`assetClassIds`) ์ค๋น๋ง ์์๋ค.\n *\n * ๊ทธ๋์ ์๋ณธ์ด ์ค๋น 22๋์ ๋ฑ๊ธ์ ๋ค ์ฑ์ ๋ณด๋๋๋ฐ **๋ฌธํฑ์์ ๋ฒ๋ ค์ก๋ค** โ ๊ฑฐ์ ๋ ๊ฒฝ๊ณ ๋ ์์ด.\n * ๋ฑ๊ธ ๋ชฉ๋ก์ ์๊ณ ์์์ ์๋ฌด๋ ์์ด์, ํ๋ฉด์์ ๋ฑ๊ธ์ ๊ณจ๋ผ๋ ์ค๋น๊ฐ ์ ๋์๋ค.\n *\n * ์์์ ์ด ์ ์ธ๊ณผ `kind` ๋ฅผ ํฉ์น ๊ฒ์ด๋ค(ยง`equipmentClassMembership`) โ ํ์ ํ๋ ์ชฝ์ด ๊ทธ ํจ์๋ฅผ\n * ์ง๋๋ค.\n */\n equipmentClassIds?: string[]\n /** ์ฌ๋์ด ๋ถ๋ฅด๋ ์ด๋ฆ โ ์์ผ๋ฉด ํ๋ฉด์ด id ๋ฅผ ๋ณด์ธ๋ค(id ๋ฅผ ์ด๋ฆ์ผ๋ก ๋ฒ ๋ผ์ง ์๋๋ค). */\n name?: string\n /** ์ํ ๊ฒฐ๊ณผ โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค(ยงRefTestResult). */\n testResults?: RefTestResult[]\n description?: string\n homeLocationId: string\n mtbfMs?: number // ํ๊ท ๊ณ ์ฅ ๊ฐ๊ฒฉ(ํ๋ฅ ์ ๊ณ ์ฅ) โ ์ง์ ์ ์ปค๋์ด breakdown ์๋ฎฌ โ ์ฃผ๋ชฉ(๊ณ ์ฅ) ๋ฐ์\n mttrMs?: number // ํ๊ท ์๋ฆฌ ์๊ฐ\n /**\n * **์ด ์ค๋น์ ์ ์ญ ์ ์ฒด์ฑ** โ ์ปค๋ ์ ์ธ์ `equipment[].identity` ๋ก ๊ทธ๋๋ก ๊ฐ๋ค.\n *\n * ์์ ์ด๋ฆ์ `gs1Id` ์๋ค. ๊ทธ๋ฐ๋ฐ **GS1 ํค๊ฐ ์๋ ๊ฒ์ด ์ ์์ด๋ค** โ ์ค์ธกํ ๊ฐ์ ์ธ๋ฒํฐ์\n * ํ๋์จ์ด ์๋ณ์(`ES100000007d8d061d-1`)์ด๊ณ , ์๋ณธ์ด GIAI ๋ฅผ ์ฃผ๋ฉด ๊ทธ๊ฒ๋ ์ฌ๊ธฐ ๋ค์ด์จ๋ค.\n * ์ด๋ฆ์ด ํ ์ข
๋ฅ๋ง ๊ฐ๋ฆฌํค๋ฉด ๋ค๋ฅธ ์ข
๋ฅ๊ฐ ๋ค์ด์ฌ ๋ ๊ทธ ์๋ฆฌ๋ฅผ ๋ชป ์ด๋ค.\n *\n * ์๋ฆฌ(`RefLocation.gs1Id`)๋ ๊ทธ๋๋ก๋ค โ ๊ทธ์ชฝ์ ์ค์ ๋ก SGLN ์ด ์จ๋ค.\n */\n identity?: string\n /**\n * ๊ต๋(๊ฐ๋์๊ฐ) โ ์ด ์๊ฐ๋์๋ง ๋ฐฐ์ ๋๋ค. `startHour <= endHour` ๋ฉด ๊ฐ์ ๋ , ๋์ด๊ฐ๋ฉด ์ผ๊ฐ(22โ6).\n * ๋ฏธ์ง์ =24์๊ฐ ๊ฐ์ฉ. ๊ต๋ ๋ฐ ์์์ ๊ณ ์ฅยท๊ณํ์ ์ง์ **๊ตฌ๋ณ๋๋ ์ด์ **๋ก ์ฐ๋ค(์ํ์ ๋๋ฌ๋๋ค).\n */\n window?: { startHour: number; endHour: number }\n /**\n * ๊ทผ๋ฌด ์บ๋ฆฐ๋ โ ํ์ค `WorkCalendarEntry`(๋ณต์). ์์ผ๋ฉด `window` ๋ณด๋ค ์ด๊ฒ์ ๋ณธ๋ค.\n *\n * ์ถ์ ํ๋ ์์ํฌ `@things-factory/work-shift` ์ `WorkShift`(`fromDate`ยท`fromTime`ยท`toDate`ยท`toTime`)์\n * ๋ง์ถฐ ๋์๋ค โ ๊ทธ ์ํฐํฐ๋ฅผ ๊ต๋์ ์ ๋ณธ์ผ๋ก ๊ฒฐ์ ํ ๋ ์ง์ ๋งคํ์ด ๋๊ฒ. **์์ง ๊ฒฐ์ ํ์ง ์์๋ค**:\n * ๊ทธ ์ํฐํฐ์๋ ์์ ์ฐ๊ฒฐ๊ณผ ๋น๊ทผ๋ฌด(ํด์ผ)๊ฐ ์์ด ํ์ฅ์ด ํจ๊ป ํ์ํ๊ณ , operato-twin ์ ์์กด์ฑ ์ถ๊ฐ๋\n * ์ฑ ์ํคํ
์ฒ ๊ฒฐ์ ์ด๋ค(์ปค๋ฒ๋ฆฌ์ง ยง4-7 ์ ๊ฒฐ์ ์ง์ ์ผ๋ก ๊ธฐ๋ก).\n */\n workCalendar?: WorkCalendarEntry[]\n /**\n * ์ค๋น ์์ฑ(์๋ ๋ฑ) โ ์์ผ๋ฉด **์ด๋์๊ฐ์ ๊ฑฐ๋ฆฌ์์ ๊ณ์ฐํ ์ ์๋ค**(์๋ ์์ด ๊ฑฐ๋ฆฌ๋ง์ผ๋ก๋ ์๊ฐ์ด\n * ์ ๋์จ๋ค). ๊ทธ๋๋ ์ปค๋ ์์๋ก ๋จ์ด์ง๊ณ ๊ทธ ์ฌ์ค์ด `specCoverage()` ์ ๋จ๋๋ค.\n */\n properties?: RefResourceProperty[]\n /** ์ ๊ฒฉ์ ๊ฒ์ฆํ ์ํ ๋ช
์ธ๋ค โ ํ์ค `TestSpecificationID`(๊ต์ ๋ฑ). */\n testSpecificationIds?: string[]\n /**\n * ์ ํจ ๊ธฐ๊ฐ โ **ํ์ค `EffectiveStartDate` / `EffectiveEndDate`**(๊ฐ์ฒด ํ์
์
๋ชจ๋์ ์๋ค).\n *\n * ์์ผ๋ฉด **ํ๊ธฐํ ๊ฒ์ด ์๊ตฌํ ์ด์ ์๋ค**: ๋ฐฐ์ ๋์์ ๋จ๊ณ , ๊ฐ์ฉ ์์ ๋ค์ด๊ฐ๊ณ , ํ๋ฉด์ ๋ฌ๋ค.\n * ๋์
์์ ์ธ ๊ฒ์ ๋ฐ๋๋ก ์ค๋๋ถํฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ๊ธฐ๊ฐ ๋ฐ์ด๋ฉด ์ปค๋์ด ๊ทธ ์๊ฐ์ ๋ชจ๋ธ์์\n * ๋นผ๊ณ **์ด์ ๋ฅผ ๋ฌ์ ๋จ๊ธด๋ค**(`effectivity: 'not-yet' | 'expired'`) โ ์๋ฆฌ์ง ์๊ณ ์ง์ฐ์ง ์๋๋ค.\n */\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * ๊ณต์ ๋ชจ์ โ ์ปค๋ `OperationParameter`(= ISA-95 `ParameterSpecification`/`ParameterType`) ์ **๊ฐ์ ๋ชจ์**.\n * ์ด๋ฆ์ ๋ฐ๊พธ์ง ์๋๋ค: ์ธ์ ์คํธ ๊ฒฝ๊ณ์์ ์ดํ๊ฐ ๊ฐ๋ฆฌ๋ฉด ๊ทธ ์๋ฆฌ์์ ๋ฐฉ์ธ์ด ์๊ธด๋ค.\n * ID ์ดํ์ ์ ๋ณธ์ ์ปค๋ `OP_PARAM`(ํ์ค์ด ํ๋ผ๋ฏธํฐ ID ๋ฅผ ์ ํ์ง ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ํ ๊ณณ์์ ์ ํ๋ค).\n */\nexport interface RefOperationParameter {\n id: string\n /** ISA-95 `Value.ValueString` โ ํ์ค์ด ๋ฌธ์์ด๋ก ์ฃ๋๋ค. ๊ธฐ๊ฐ ๋ชจ์๋ ISO 8601(`PT8M`). */\n value: string\n /** ISA-95 `Value.UnitOfMeasure`. ๋ฌด์ฐจ์(๋น์จ)์ด๋ฉด ์๋ต. */\n uom?: string\n}\n\n/**\n * ๊ณต์ ์ ์์ฌ ์๊ตฌยท์ฐ์ถ โ **ISA-95 `OperationsSegment.MaterialSpecification`** ๊ณผ ๊ฐ์ ๋ชจ์.\n * ์ธ์ยท์ค๋นยท์์ฐ ๋ช
์ธ์ ๊ฐ์ ์๋ฆฌ์ ์์ด์ผ 4๋ ์์์ด ๋์นญ์ด ๋๋ค(์์ฌ๋ง ๋น ์ ธ ์์๋ค).\n */\nexport interface RefOpMaterialSpecification {\n id?: string\n /** ํ๋ชฉ ๋ฑ๊ธ์ผ๋ก ์๊ตฌ โ ํ์ค `MaterialClassID`. */\n materialClass?: string\n /** ํน์ ํ๋ชฉ์ผ๋ก ์๊ตฌ โ ํ์ค `MaterialDefinitionID`. */\n materialDefinition?: string\n /** ํ์ค `MaterialUse` โ ์ด ๊ณต์ ์์์ ์ฐ์. */\n use: 'consumed' | 'produced' | 'consumable'\n /** ํ์ค `Quantity`. ๋จ์ ๋ฏธ์ง์ ์ด๋ฉด ๊ฐ์. */\n quantity: number\n uom?: string\n}\n\n/** ์์์๊ฐ ๋ณ๋ โ **ํ์ค ๋ฐ ํ์ฅ**(ISA-95 Duration ์ ์ค์นผ๋ผ). ์ปค๋ `DurationVariability` ์ ๋ํ. */\nexport interface RefOperationVariability {\n distribution: 'constant' | 'exponential' | 'uniform' | 'triangular'\n min?: string\n max?: string\n mode?: string\n}\n\n/**\n * ์คํผ๋ ์ด์
๋ช
์ธ โ ISA-95 `OperationsSegment`. ์ปค๋ `OperationDef` ์ ํ๋ ์ด๋ฆ์ด 1:1์ด๋ค.\n *\n * **์ด๊ฒ์ด ์์ผ๋ฉด ์๋ฎฌ๋ ์ด์
์ ์๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์ฝ๋์ ๊ณ ์ ํ ์์๋ค.** ์ ์์คํ
(๋๋ ๊ฐ์ ๋ ํผ๋ฐ์ค)์ด\n * ๊ณต์ ๋ณ ์์ยท๋ณ๋ยท์์จ์ ๋งํด ์ค์ผ ์์ธก์ด ๊ทธ ํ์ฅ์ ์์ธก์ด ๋๋ค. ์ฃผ์ง ์์ผ๋ฉด ์ปค๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก\n * ๊ตด๋ฌ๊ฐ๊ณ , **๊ธฐ๋ณธ๊ฐ์ ์ผ๋ค๋ ์ฌ์ค์ ์ปค๋ `specCoverage()` ๊ฐ ๋ฐํ๋ค**(์๋ฆฌ์ง ์๊ณ ๋์ด๊ฐ์ง ์๋๋ค).\n */\nexport interface RefOperation {\n /** ์์
์ข
๋ฅ ํค โ ์ปค๋ `FlowTask.kind` ์ ๊ฐ์ ๊ฐ์ด์ด์ผ ๋ช
์ธ๊ฐ ๊ทธ ์์
์ ๋ถ๋๋ค. */\n key: string\n label: string\n intent: 'transport' | 'process' | 'dwell'\n locationType?: string\n resourceType?: string\n bizStep?: string\n /** ISA-95 `OperationsSegment.Duration` โ ISO 8601 ๊ธฐ๊ฐ(`PT12M`). */\n duration?: string\n variability?: RefOperationVariability\n parameters?: RefOperationParameter[]\n /**\n * ํ์ ์ธ์ โ ISA-95 `PersonnelSpecification`(`PersonnelClassID` + `Quantity`) 1:1.\n * ์์ผ๋ฉด ์ฌ๋ ์์ด ๋๋ ๊ณต์ ์ด๋ค(์ค๋น๋ง ์ก๋๋ค).\n */\n personnelSpecification?: { personnelClass?: string; quantity: number }[]\n /** ํ์ ๋ฌผ๋ฆฌ ์์ฐ โ ISA-95 `PhysicalAssetSpecification`(๋ฑ๊ธ + ์๋). ๋น ํ๋ ํธ๊ฐ ์์ผ๋ฉด ๋ชป ๋๊ฐ๋ค. */\n physicalAssetSpecification?: { assetClass?: string; quantity: number }[]\n /**\n * ํ์ยท์ฐ์ถ ์์ฌ โ ISA-95 `MaterialSpecification`. **4๋ ์์ ์ค ์์ฌ๋ง ์ด ์๋ฆฌ๊ฐ ์์๋ค** โ\n * ๊ทธ๋์ ๋ถํ์ด ๋จ์ด์ ธ ๋ผ์ธ์ด ์๋ ์ํฉ์ด ์์ธก์ ๋ํ๋์ง ์์๋ค.\n * BOM ์ \"๋ช ๊ฐ\" ๋ ์ฌ๊ธฐ๋ค(ํ๋ชฉ ์ ์์ ์กฐ๋ฆฝ ๊ตฌ์กฐ์๋ ์๋์ด ์๋ค โ 1์ฐจ ์ถ์ฒ ํ์ธ).\n */\n materialSpecification?: RefOpMaterialSpecification[]\n}\n\n/**\n * ์ฌ๋ โ **ISA-95 `Person`.** ์ค๋น์ ๋ณ๊ฐ ์์์ด๋ค(๊ณ ์ฅยท์ค๋นํจ์จ์ด ์๋๋ผ ๋ฑ๊ธยท๊ต๋๋ก ์ฐ๋ค).\n * `personnelClass` ๊ฐ ISA-95 `PersonnelClassID` โ ๊ณต์ ์ ํน์ ์ธ์ด ์๋๋ผ **๋ฑ๊ธ์ผ๋ก** ์ธ์์ ์๊ตฌํ๋ค.\n */\nexport interface RefPerson {\n id: string\n name?: string\n /** ์ํ ๊ฒฐ๊ณผ โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค(ยงRefTestResult). */\n testResults?: RefTestResult[]\n /**\n * **์ด ์ฌ๋์ ์ ์ญ ์ ์ฒด์ฑ** โ ์ปค๋ ์ ์ธ์ `personnel[].identity` ๋ก ๊ฐ๋ค.\n *\n * โโ ์ ํ์ํ๊ฐ (์ธํฐ๊ทธ๋ ์ด์
๋ ์ธ์ด ๋ฌผ์, 2026-09-05) โโโโโโโโโโโโโโโโโโโโโ\n * ์ค๋น์์ ์ด ์๋ฆฌ๋ฅผ ๋ง๋ ์ด์ ๊ฐ ์ฌ๋์๊ฒ๋ ๊ทธ๋๋ก ๊ฑธ๋ฆฐ๋ค: **์ง์ญ ์ด๋ฆ์ ๊ทธ ํ์ฅ ์์์๋ง\n * ๊ณ ์ ํ๋ค.** ์ธ๋ฒํฐ `001` ์ด ๋ ๋ฐ์ ์์ ์์ด์ ํจ๊ป ์ง๊ณํ๋ ํ์ชฝ ๋ฐ์ ๋์ด ์ฌ๋ผ์ก๋ค.\n * `E-1001` ๋ ๋ค๋ฅธ ๊ณต์ฅ์ ์์ ์ ์๊ณ , ์ฌ๋ฌ ํ์ฅ์ ํจ๊ป ๋ณด๋ ์๊ฐ ๊ฐ์ ์ผ์ด ๋๋ค.\n *\n * โโ **์ฌ๊ธฐ์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ฃ์ง ์๋๋ค** โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ค๋น์ ์ฌ๋์ด ๊ฐ๋ฆฌ๋ ์๋ฆฌ๊ฐ ์ด๊ฒ์ด๋ค. ์ค๋น์ ์ ์ฒด์ฑ์ ํ๋์จ์ด ์ผ๋ จ๋ฒํธ์ด๊ณ ์๋ฌด์๊ฒ๋ ํด๊ฐ\n * ์๋ค. ์ฌ๋์ ใ์ ์ญ์์ ๊ณ ์ ํ ๊ฐใ์ ์ฌ์๋ฒํธยท์ถ์
์นด๋ยท์ฃผ๋ฏผ๋ฑ๋ก์ฒ๋ผ **๊ทธ ์ฌ๋์ ๊ดํ ์ฌ์ค**\n * ์ด๊ณ , ์ ๋์ ๋ํ์ด ์ฝํ๊ณ ๋ฏธ๋ฌ๋ก ๋ณต์ ๋๊ณ ๊ตฌ๋
์ผ๋ก ๋ฐฉ์ก๋๋ค โ ํ ๋ฒ ๋ค์ด๊ฐ๋ฉด ์ง์์ง์ง ์๋๋ค.\n *\n * ๊ทธ๋์ ์ด ์นธ์ด ์๊ตฌํ๋ ๊ฒ์ **ํ์ฅ์ ์์ ๋ถ์ฌ ์ ์ญ์์ ๊ณ ์ ํด์ง ์ด๋ฆ**์ด๋ค. ๊ทธ ์ด์์ด ์๋๋ค.\n *\n * ```\n * ๋ง๋ค urn:hatiolab:mes-line-a:obj:E-1001 (ยง`objectUri` ๊ฐ ๋ง๋ ๋ค)\n * https://hatiotrailer.com/twin/obj/E-1001\n * ์๋๋ค ์นด๋๋ฒํธ ยท ์ฌ์๋ฒํธ ์๋ฌธ ยท ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ ยท ์์ฒด ์๋ณ์\n * ```\n *\n * ใ์ด ์ฌ๋์ด ๋๊ตฌ์ธ๊ฐใ๋ ์ธ์ฌ ์์คํ
์ด ๋ตํ ๋ฌผ์์ด๊ณ ํธ์์ ๋ฌผ์์ด ์๋๋ค. ํธ์์ **๊ฐ์\n * ์ฌ๋์ธ์ง ๋ค๋ฅธ ์ฌ๋์ธ์ง**๋ง ์๋ฉด ๋๋ค โ ๊ทธ ์ผ์ ๊ฐ์ธ์ ๋ณด๋ ํ์ ์๋ค.\n *\n * ๊ฐ์ด ์์ผ๋ฉด ๋น์ด๋ค. ์ง๊ธ ์๋ณธ์ด ๊ทธ๋ฐ ๊ฐ์ ์ฃผ์ง ์์ผ๋ฏ๋ก ๋น๋ถ๊ฐ ๋น์ด ์๋ ๊ฒ์ด ์ ์์ด๋ค.\n */\n identity?: string\n /**\n * ์ํ ๋ฑ๊ธ๋ค โ **ํ์ค `Person.PersonnelClassID`, `maxOccurs=\"unbounded\"`**.\n * ๋ณต์์ธ ๊ฒ์ด ํ์ค์ด๊ณ ๊ทธ๊ฒ์ด ์๊ฒฉ ํํ์ด๋ค: ํ ์ฌ๋์ด ์ฉ์ ์๊ฒฉ๊ณผ ์ง๊ฒ์ฐจ ์๊ฒฉ์ ํจ๊ป ๊ฐ๋๋ค.\n */\n personnelClassIds?: string[]\n /** ๊ต๋ โ ์ค๋น์ ๊ฐ์ ๋ชจ์. ๋ฏธ์ง์ =24์๊ฐ ๊ฐ์ฉ. */\n window?: { startHour: number; endHour: number }\n /** ๊ทผ๋ฌด ์บ๋ฆฐ๋ โ ํ์ค `WorkCalendarEntry`(๋ณต์). 2๊ต๋ยทํด๊ฒยทํด์ผ์ ํจ๊ป ํํํ๋ค. */\n workCalendar?: WorkCalendarEntry[]\n /**\n * ๊ธฐ๋ณธ ์์น โ ํ์ค `Person.OperationalLocation`. ์์ผ๋ฉด \"์ด ๋ผ์ธ์ ๋ช ๋ช
์๋\" ๋ฅผ ๋ฌผ์ ์ ์๋ค.\n * ์ฌ๋์ ์์ง์ด๋ฏ๋ก ์ด ๊ฐ์ **์ถ๋ฐ์ **์ด๊ณ , ์ค์ ์์น๋ ๊ด์ธก(person.status)์ด ๊ฐฑ์ ํ๋ค.\n */\n homeLocationId?: string\n /**\n * ์์ ์์ฑ โ ํ์ค `PersonProperty`. **์๊ฒฉ์ฆยท์๋ จ๋๊ฐ ์ฌ๊ธฐ ๋ค์ด๊ฐ๋ค.**\n *\n * ํ์ค์๋ ์๊ฒฉ(Qualification)์ด๋ผ๋ ๋ณ๋ ์์๊ฐ ์๋ค(`B2MML-Personnel.xsd` ํ์ธ). ์๊ฒฉ์\n * โ ๋ฑ๊ธ ๋ณต์ ์์์ผ๋ก(`personnelClassIds: ['welder-certified','forklift-licensed']`) โก\n * ์ฆ๋น์ ์ด ์์ฑ์ผ๋ก(์๊ฒฉ์ฆ ๋ฒํธยท๋ง๋ฃ์ผ), โข ๊ฒ์ฆ ์ํ์ ํ์ค `TestSpecificationID`(์์ง ๋ฏธ๊ตฌํ).\n */\n properties?: RefResourceProperty[]\n /** ์๊ฒฉ์ ๊ฒ์ฆํ ์ํ ๋ช
์ธ๋ค โ ํ์ค `TestSpecificationID`(์ฐธ์กฐ๋ง; ์ํ ๋ช
์ธยท๊ฒฐ๊ณผ ๋ชจ๋ธ์ ์์ง ์๋ค). */\n testSpecificationIds?: string[]\n /** ์ ํจ ๊ธฐ๊ฐ โ ์ฌ๋์๊ฒ๋ **์
์ฌ ์ ยทํด์ฌ ํ**๋ค(์๊ฒฉ ๋ง๋ฃ๋ ๋ฑ๊ธ ์ชฝ ๊ธฐ๊ฐ์ด๋ค: ์ฌ๋์ ๋จ๊ณ ์๊ฒฉ๋ง ๋๊ธด๋ค). */\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * ๋ฌผ๋ฆฌ ์์ฐ(๋ฐ๋ณต์ฌ์ฉ) โ **ISA-95 `PhysicalAsset`, GS1 `GRAI`.**\n * ํ๋ ํธยท๋ยท์ฉ๊ธฐ์ฒ๋ผ **๋๊ฐ๋ค ๋์์ค๋** ๊ฒ. ๋ฌผ๋ฅ๋จ์(SSCC)์ ๋ค๋ฅด๋ค: SSCC ๋ ๊ทธ ํ๋ ํธ์ ์ค๋ฆฐ ํ๋ฌผ\n * ํ ๋ฉ์ด๋ฆฌ์ด๊ณ , GRAI ๋ ํ๋ ํธ ์์ฒด๋ค(์ค๋์ ์ด ํ๋ฌผ, ๋ด์ผ์ ์ ํ๋ฌผ์ ์ฃ๋๋ค).\n */\nexport interface RefAsset {\n id: string\n name?: string\n /** ์ํ ๊ฒฐ๊ณผ โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค(ยงRefTestResult). */\n testResults?: RefTestResult[]\n /**\n * ์ํ ๋ฑ๊ธ๋ค โ ํ์ค `PhysicalAssetClassID`(๋ณต์). ํ๋ ํธ๊ฐ 'euro-pallet' ์ด๋ฉด์ 'food-grade' ์ผ ์ ์๋ค.\n * ๊ณต์ ์ ์๊ตฌ๋ ๋ฑ๊ธ ํ๋ + ์๋์ด๋ค(ํ์ค `PhysicalAssetSpecification`).\n */\n assetClassIds?: string[]\n /** ๊ธฐ๋ณธ ์์น. */\n homeLocationId?: string\n /**\n * **์ด ์์ฐ์ ์ ์ญ ์ ์ฒด์ฑ** โ ์ค๋น์ ๊ฐ์ ์ด๋ฆ์ด๋ค(ยง`RefEquipment.identity`).\n *\n * โโ ์ ์ด๋ฆ์ ๋ฐ๊ฟจ๋ (2026-09-04) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `gs1Id` ์๋ค. ์ค๋น์์ ๊ทธ ์ด๋ฆ์ ๋ฐ๊พผ ์ด์ ๊ฐ ์ฌ๊ธฐ์๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค โ **GS1 ํค๊ฐ ์๋ ๊ฒ์ด\n * ์ ์์ด๋ค.** ์์ฐ์ ์ค์ธก ๊ฐ๋ ์ ์กฐ๋ฒํธยท์ฌ๋ด ๊ด๋ฆฌ๋ฒํธ์ด๊ณ , GS1 ์ ์๊ตฌํ๋ ์ด๋ฆ์ ๋๋ฉด ๊ทธ๊ฒ์\n * ์ฑ์ฐ๋ ์ชฝ์ด ์๋ ํค๋ฅผ ์ง์ด๋ด๊ฑฐ๋ ์นธ์ ๋น์ ๋๋ค.\n *\n * ๊ทธ๋ฆฌ๊ณ ๋ง์คํฐ๋ ์ด๋ฏธ `identity` ๋ก ๋ธ๋ค(์ค๋นยท์์ฐ ๋ ๋ค). ์ด ์๋ฆฌ๋ง ๋ค๋ฅธ ์ด๋ฆ์ด๋ผ **์๋ณธ์ด\n * ์ฑ์ฐ๋ ์๊ฐ ์กฐ์ฉํ ์ฌ๋ผ์ก๋ค.** ์ง๊ธ ์์ฐ 26๋๊ฐ ๋ค ๋น์ด ์์ด ๋ฒ๋ ค์ง๋ ๊ฐ์ ์์๋ค โ\n * ์ธํฐ๊ทธ๋ ์ด์
๋ ์ธ์ด ๊ทธ๊ฒ์ ์ฌ์ ใ๋๊ฐ ์ฑ์ฐ๋ ์๊ฐใ์ด๋ผ๊ณ ์ง์๋ค.\n *\n * ์๋ฆฌ ์ชฝ(`RefLocation.gs1Id`)์ ๊ทธ๋๋ก๋ค โ ๊ฑฐ๊ธฐ๋ ์ค์ ๋ก SGLN ์ด ์จ๋ค.\n */\n identity?: string\n /** ์์ ์์ฑ โ ํ์ค `PhysicalAssetProperty`(์ ์ฌ ํ๋ยท๊ท๊ฒฉ ๋ฑ). */\n properties?: RefResourceProperty[]\n /** ์ ๊ฒฉ์ ๊ฒ์ฆํ ์ํ ๋ช
์ธ๋ค โ ํ์ค `TestSpecificationID`. */\n testSpecificationIds?: string[]\n /** ์ ํจ ๊ธฐ๊ฐ โ ์์ฐ์์๋ **ํ๊ธฐํ ํ๋ ํธ๊ฐ ํ์์ ๋น ์ง๋ ๊ฒ**์ด๋ค(ํ์ ๋์ ์๊ฐ ๋ถํ์ง ์๊ฒ). */\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * ํ๋ชฉ ์ ์ โ **ISA-95 `MaterialDefinition`.**\n *\n * ์์ผ๋ฉด ๋กํธ๋ง ๊ด์ธก์ผ๋ก ๋ค์ด์ค๊ณ **ํ๋ชฉ์ด ๋ฌด์์ธ์ง๋ ์๋ฌด ๋ฐ๋ ์๋ค.** ๊ทธ๋์ ๊ฐ์ ๋กํธ๋ฅผ 100๊ฐ๋ก\n * ๋ฐ์๋ \"๋ช kg ์ธ๊ฐ\" ์ ๋ตํ ์ ์๋ค(์ปค๋ `quantityIn` ์ด ํ์ฐ์ ๊ฑฐ๋ถํ๋ ๊ทผ๊ฑฐ).\n *\n * **ํ์ค์ ๋จ์ ํ์ฐ ์์๋ ์๋ค**(1์ฐจ ์ถ์ฒ ์ ์ ํ์ธ) โ ์์ฑ ์ฃผ๋จธ๋๋ฟ์ด๋ค. ๊ทธ๋์ ํ์ฐ ๊ณ์๋\n * ์ปค๋์ด ์ ํ ์์ฑ ์ด๋ฆ(`perBaseUnit`, `uom` ์ด ๋์ ๋จ์)์ผ๋ก `properties` ์ ์ฃ๋๋ค.\n */\nexport interface RefMaterialDefinition {\n /** ํ์ค `ID` โ GTIN(`urn:epc:idpat:sgtin:โฆ`)์ ์ด๋ค(์ ์ฒด์ฑ์ ์ ๋ณธ์ด EPCIS ๋ค). */\n id: string\n name?: string\n /** ์ํ ๋ฑ๊ธ๋ค โ ํ์ค `MaterialClassID`(๋ณต์). */\n materialClassIds?: string[]\n /** ํ๋ชฉ ์์ฑ โ ํ์ค `MaterialDefinitionProperty`. ํ์ฐ ๊ณ์๊ฐ ์ฌ๊ธฐ ๋ค์ด๊ฐ๋ค. */\n properties?: RefResourceProperty[]\n testSpecificationIds?: string[]\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * **์ด ๋ง์คํฐ๋ฅผ ๋ค์ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ** โ ํธ์์ด ์๊ธฐ ์๋ณธ์ ๊ธฐ์ตํ๋ ์๋ฆฌ.\n *\n * ํธ์์ ์๋ณธ์ ๋น์ถ ๋ฟ์ด๋ฏ๋ก(ADR-0028), ์๋ณธ์ด ๋ฌ๋ผ์ง๋ฉด **๋ค์ ์ฝ์ด์ผ** ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ง๊ธ๊น์ง\n * ํธ์์ \"๋ด๊ฐ ๋ฌด์์์ ๋์๋\" ๋ฅผ ๋จ๊ธฐ์ง ์์๋ค โ ์ด๋ํฐ๋ก ๋ค์ด์จ ํธ์์ `TwinReference` ํ์ด\n * ์์์ง๋ง ํ
ํ๋ฆฟ์ผ๋ก ์ธ์ด ํธ์์๋ ์๋ฌด๊ฒ๋ ์์๊ณ , ๊ทธ๋์ **๋ค์ ์ฝ์ ๋์์ด ์๋ ํธ์**์ด\n * ๋ง๋ค์ด์ก๋ค. ์๋ณธ์ ์์ ํธ์์ ์ฒซ๋ ์ ๋ชจ์ต์ ์์ํ ๋จธ๋ฌธ๋ค.\n *\n * ๊ทธ๋์ ์์ฒ์ด ๋ฌด์์ด๋ ์ฌ๊ธฐ ํ ์๋ฆฌ์ ๋จ๊ธด๋ค. ๋ค์ ์ฝ๊ธฐ๋ ์ด ๊ฐ ํ๋๋ง ๋ณด๋ฉด ๋๋ค.\n */\nexport type MasterOrigin =\n /**\n * ๋ฑ๋ก๋ ๋ ํผ๋ฐ์ค(์ด๋ํฐ)์์ ์๋ค โ ๋ค์ ์ฝ๊ธฐ = ๊ทธ ์ด๋ํฐ๋ก ๋ง์คํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์จ๋ค.\n *\n * `source` ๋ **๋ ํผ๋ฐ์ค ๋ฑ๋ก ์ด๋ฆ**์ด๊ณ ๊ทธ ์ฐธ์กฐ๊ฐ ๋ณด๊ณ ํ๋ ์ฌ์ดํธ ์ ๋ถ์ ๊ฐ๋ค. ๊ทธ๋์ ์ด๋ ์ฌ์ดํธ์์\n * ์จ ํธ์์ธ์ง๋ `siteId` ๊ฐ ์์ด์ผ ์๋ค โ ์์ผ๋ฉด ๋ค์ ์ฝ๊ธฐ๊ฐ ์ฌ์ดํธ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค(2026-08-18 ์ค์ธก:\n * ์ฌ์ดํธ๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ์ฐธ์กฐ์์ ์จ ํธ์์ ์ฌ๋๊ธฐ๊ฐ ์ ๋ถ ๊ฑฐ์ ๋๋ค. ์ฐธ์กฐ ์ด๋ฆ์ ์ฌ์ดํธ๋ณ ๋ง์คํฐ์\n * `source`(=์ธ์คํด์ค id)์ ๋น๊ตํ๊ณ ์์๋ค โ ์๋ก ๋ค๋ฅธ ๊ฒ์ ๋น๊ตํ ๊ฒ์ด๋ค).\n */\n | { kind: 'reference'; source: string; siteId?: string; spaceId?: string }\n /**\n * ํ
ํ๋ฆฟ + ๋
ธ๋ธ๋ก ํฉ์ฑํ๋ค โ ๋ค์ ์ฝ๊ธฐ = ๊ฐ์ ๋
ธ๋ธ๋ก ๋ค์ ์ง๋๋ค(ํฉ์ฑ์ ๊ฒฐ์ ์ ์ด๋ค).\n *\n * `spaceId` ๋ **๋ง๋ค ๋ ๊ณ ๋ฅธ ํ์ฅ**์ด๋ค(ํฉ์ณ ๋ฃ๊ธฐ). ๊ธฐ์ตํ์ง ์์ผ๋ฉด ๋ค์ ์ฝ์ ๋ ํธ์์ด ์๋ฆฌ์ง ์๊ณ ์๊ธฐ\n * ํ์ฅ์ ๋ ๋๋ค โ ํ
ํ๋ฆฟ์ด ๋ธ ๊ธฐ๋ณธ ๊ณต๊ฐ์ผ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ ํ์ฅ์ ๊ฐ(์๊ธ ๋ฑ)๋ ํจ๊ป\n * ์๋๋ค(2026-08-18 ์ค์ธก: ํ ํ์ฅ์ ํฉ์ณ ๋ EMS ํธ์ ์ฌ๋์ด ์ฌ๋๊ธฐ ๋ค ๊ฐ์ ๊ณต๊ฐ์ผ๋ก ํฉ์ด์ก๋ค).\n */\n | { kind: 'template'; templateId: string; params: Record<string, unknown>; spaceId?: string }\n\nexport interface ReferenceMaster {\n source: string\n /**\n * ์ด๋ ์ข
๋ฅ์ ํธ์์ธ๊ฐ โ **์ปค๋ ์นดํ๋ก๊ทธ๊ฐ ์ ๋ณธ**์ด๋ค(`DomainSystem`).\n *\n * ์์ ์๋ `'wms' | 'yms' | 'mes'` ๋ฅผ ์ฌ๊ธฐ ์ ์ด ๋๋ค. ์ปค๋์ ์ข
๋ฅ๊ฐ ํ๋ ๋ ๋(์๋์ง) ์ด ์ค์ด\n * ํจ๊ป ์์ง์ฌ์ผ ํ๋๋ฐ, ์์ผ๋ก ์ ํ ๋ชฉ๋ก์ ๊ทธ๊ฒ์ ์๋ ค ์ฃผ์ง ์๋๋ค โ ์ดํ์ ์ง์ ํ ๊ณณ์ด์ด์ผ ํ๋ค.\n */\n system: DomainSystem\n siteName: string\n /** ๊ฒ์ฌ ๋ช
์ธ โ ์์ยท๋ฑ๊ธ์ `testSpecificationIds` ๊ฐ ๊ฐ๋ฆฌํค๋ ๋์. */\n testSpecifications?: RefTestSpecification[]\n /**\n * ์ด ๋ง์คํฐ๊ฐ ์ด๋์ ๋์๋ โ **๋ค์ ์ฝ๊ธฐ์ ์ ์ผํ ๊ทผ๊ฑฐ.** ์์ผ๋ฉด ๊ทธ ํธ์์ ๋ค์ ์ฝ์ ์ ์๊ณ ,\n * ์กฐํ ํ๋ฉด์ด ๊ทธ ์ฌ์ค์ ๊ทธ๋๋ก ๋งํ๋ค(์๋ ๊ฒ์ ์๋ ์ฒํ์ง ์๋๋ค).\n */\n origin?: MasterOrigin\n /* spaceId ๋ช
์ ์ ๊ทธ ๊ณต๊ฐ์ ์ฐธ์กฐ(์ฌ๋ฌ ํธ์์ด ํ ๊ณต๊ฐ ๊ณต์ , N:1). ์์ผ๋ฉด source ์์ ํ์(1:1). */\n /**\n * ํ์ฅ(๊ณต๊ฐ). **์๊ฐ ๊ธฐ์ค(`timezone`)์ด ์ฌ๊ธฐ ์๋ ์ด์ **: ํ ํ
๋ํธ๊ฐ Rosarito(ํํ์)์ ํ๊ตญ\n * ๊ณต์ฅ์ ํจ๊ป ๊ฐ์ง ์ ์๋ค. ํ
๋ํธ ๋จ์(`Domain.timezone`)๋ก ๋๋ฉด **๋ ์ค ํ๋๋ ๋ฐ๋์ ํ๋ฆฐ๋ค.**\n * ์๊ฐ ๊ธฐ์ค์ **๋ฌผ๋ฆฌ ํ์ฅ์ ์ฑ์ง**์ด๋ฏ๋ก ๊ณต๊ฐ์ด ๊ทธ๊ฒ์ ๊ฐ๋๋ค(๊ณต๊ฐ ์ค์ฌ ์์น).\n *\n * `timezone` ์ IANA ์ด๋ฆ(`'America/Tijuana'`) โ ์คํ์
์ซ์๊ฐ ์๋๋ค. ์ซ์๋ก ๋๋ฉด ์ผ๊ด์ ์ฝ์๊ฐ์\n * ํํํ ์ ์๊ณ , ๋์ค์ ์ ๋ ๊ตฌ๊ฐ์ผ๋ก ์ฎ๊ธธ ๋๋ ์ด๋ฆ์ด ์์ด์ผ ๊ณ์ฐํ ์ ์๋ค.\n */\n space: { spaceId?: string; width: number; depth: number; unit?: string; timezone?: string; geo?: { lat: number; lon: number; rotation?: number }; representations?: any[]; primaryId?: string }\n locations: RefLocation[]\n equipment?: RefEquipment[]\n /** ๊ณต์ ๋ช
์ธ(์์ยท๋ณ๋ยท์์จ) โ ์์ผ๋ฉด ์ปค๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ตด๋ฌ๊ฐ๋ค(๊ทธ ์ฌ์ค์ specCoverage ๊ฐ ๋ณด๊ณ ). */\n operations?: RefOperation[]\n /**\n * **์์ฐ ์ ์**(๋ ์ํผยท๋ผ์ฐํธยท์์ฌ ๋ฐ์ธ๋ฉ) โ ์ปค๋์ ์ ์-๊ตฌ๋ MES ๋ชจ๋ ์
๊ตฌ.\n *\n * ์์ผ๋ฉด ์ปค๋์ ๋ ๊ฑฐ์(ํ๋์ฝ๋ฉ) ํ๋ฆ์ผ๋ก ๋์ํ๋ค. ์ฆ **ํ์ฅ ๋ ์ํผ๋ฅผ ์ ์ด๋ ์ด ์๋ฆฌ์ ์ค๋ฆฌ์ง ์์ผ๋ฉด\n * ์ปค๋์ ๊ทธ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค** โ ์ ์ธ๊ณผ ์คํ์ด ์ด๊ธ๋๋ ์ง์ ์ด๋ผ ์๋ฆฌ๋ฅผ ์ฐ๋ค.\n */\n /**\n * ์์ฐ ์ ์ธ โ `TwinModelDef.productionSpec` ์ผ๋ก ํต๊ณผํ๋ค(ISA-95 OperationsSegment + BOM).\n *\n * ์์ ์ด๋ฆ์ `mesSpec` ์ด์๋ค. ๋ด๊ธด ๊ฒ์ MES ๋ง์ ๊ฒ์ด ์๋๋ผ \"์์ฌ๋ฅผ ์๋นํด ์์ฌ๋ฅผ ์ฐ์ถํ๋\n * ๊ณต์ \" ์ด๊ณ , ์ด๋ฆ์ด MES ์๊ธฐ ๋๋ฌธ์ ์ฐฝ๊ณ ํธ์์ ์ด ์๋ฆฌ๋ฅผ ์ธ ์๊ฐ์กฐ์ฐจ ํ์ง ๋ชปํ๋ค(์ ํต๊ฐ๊ณต ์ฐฝ๊ณ ๊ฐ\n * BOM ์ ์ค๋ช
๋ฌธ์์๋ง ์ ์ด ๋ ์ฑ ํคํธ๋ฅผ ๋ชป ๋ง๋๋ ํธ์์ ๋ง๋ ์์ธ). ๊ทผ๊ฑฐ๋ ์ปค๋ ๊ณ์ฝ ์ฃผ์์.\n */\n productionSpec?: unknown\n /**\n * **์ด ์๋ณธ์ด ์๋ณ์๋ฅผ ๋ง๋๋ ์ด๋ฆ๊ณต๊ฐ** โ `TwinModelDef.identity` ๋ก ํต๊ณผํ๋ค.\n *\n * **์ ์ธ์ด ์์ผ๋ฉด ์ปค๋์ด ๊ฑฐ์ ํ๋ค** (0.7.45~). ์์ ์๋ ์์ ํ๋ฆฌํฝ์ค๋ก ํ๋ ํธยทํธ๋ ์ผ๋ฌยท๋ฌธ์๋ฅผ\n * ๋ง๋ค์๋๋ฐ(`0614141` โ GS1 ์ด ๊ท๊ฒฉ ์์ ๋ก ์ฐ๋ค ๋ฒ๋ฆฐ ๊ฐ์ด๊ณ `06โฆ` ์ ์ค ๋ฐฐ์ ๋์ญ์ด๋ค), ๊ทธ ๊ฐ์\n * ์ ๋์ ์์ํ ๋จ์ผ๋ฉด์ ์ง์ด๋ธ ๊ฒ์ด๋ผ๊ณ ๋งํด ์ฃผ๋ ๋ฐ๊ฐ ์์๋ค. ๊ทธ๋์ ์ปค๋์ด ๋ง๋ค์ง ์๋๋ค.\n *\n * ์๋ณธ์ด ์๊ธฐ ๋๋ฉ์ธ์ ๋งํ๋ฉด ๊ทธ ์๋์์ ๋ง๋ ๋ค โ ๊ทธ๊ฒ์ด ํ์ค ์ ํฉ์ด๋ค(CBV 2.0 ยง8.2.4ยทยง8.5.5,\n * ใ๊ทธ ์ธํฐ๋ท ๋๋ฉ์ธ ์์ ์๊ฐ ๋ฐฐ์ ํ๋คใ). GS1 ํค๋ฅผ ์ฐ๋ ค๋ฉด `documentTypes` + `companyPrefix` ์ด๊ณ ,\n * ๊ทธ๋ **์๋ฆฌ ์๊ฐ ๋ง์์ผ ํ๋ค**(SGTIN ์ ํ๋ฆฌํฝ์ค + ํ๋ชฉ์ฐธ์กฐ = 13์๋ฆฌ, GS1 TDS).\n *\n * ์ ์ฒด์ฑ์ ์์ฐ๊ณผ ๋ฌด๊ดํ๋ฏ๋ก `productionSpec` ์ด ์๋๋ผ **๋ชจ๋ธ**์ด ๊ฐ๋๋ค โ ์ฐฝ๊ณ ยท์ผ๋๋ ์๋ฌด๊ฒ๋\n * ์์ฐํ์ง ์์ผ๋ฉด์ ํ๋ ํธยทํธ๋ ์ผ๋ฌ๋ฅผ ์๋ณํ๋ค.\n */\n identity?: unknown\n /**\n * ์ฌ๋ โ ์ ์ธํ์ง ์์ผ๋ฉด **์ธ์ ์ ์ฝ์ด ์๋ ํธ์**์ด ๋๋ค(์ค๋น๋ง ์์ผ๋ฉด ์ธ์ ๋ ๊ฐ๋๋๋ ๊ณต์ฅ).\n * ๊ณต์ ์ด ์ธ์์ ์๊ตฌํ๋๋ฐ ์ฌ๋์ด ์์ผ๋ฉด ๊ทธ ์์
์ ์์๋์ง ์๋๋ค โ ๊ทธ๊ฒ์ด ์ฌ์ค์ด๋ฏ๋ก ๊ทธ๋๋ก ๋๋ค.\n */\n persons?: RefPerson[]\n /**\n * ๋ฌผ๋ฆฌ ์์ฐ(๋ฐ๋ณต์ฌ์ฉ) โ ์ ์ธํ์ง ์์ผ๋ฉด ์์ฐ ์ ์ฝ์ด ์๋ ํธ์์ด๋ค.\n * ๊ณต์ ์ด ์์ฐ์ ์๊ตฌํ๋๋ฐ ์์ผ๋ฉด ๊ทธ ์์
์ ์์๋์ง ์๋๋ค โ ๊ทธ๊ฒ์ด ์ฌ์ค์ด๋ฏ๋ก ๊ทธ๋๋ก ๋๋ค.\n */\n assets?: RefAsset[]\n /**\n * ๋ฑ๊ธ ์ ์ โ ํ์ค `PersonnelClass`ยท`EquipmentClass`ยท`PhysicalAssetClass`.\n * ์ ์ค์ด๋ ํธ์์ ๋์ํ๋ค(์์ ๋ฌธ์์ด ๊ทธ๋๋ก ํ์ ). ์ค์ผ๋ฉด ์์ยท์ ํจ๊ธฐ๊ฐ์ด ์ด์๋๋ค.\n */\n personnelClasses?: RefResourceClass[]\n equipmentClasses?: RefResourceClass[]\n assetClasses?: RefResourceClass[]\n /** ํ๋ชฉ ์ ์ยท๋ฑ๊ธ โ ํ์ค `MaterialDefinition` / `MaterialClass`. ์์ผ๋ฉด ๋จ์ ํ์ฐ์ ํ ์ ์๋ค. */\n materialDefinitions?: RefMaterialDefinition[]\n materialClasses?: RefResourceClass[]\n /**\n * ์ปค๋ฅํฐ๊ฐ **์ฎ๊ธฐ๋ ๋์ ์๊ฒ ๋ ๊ฒ.** ์ธ๋ถ ์์คํ
์ ๊ฐ์ ์ฐ๋ฆฌ ์ดํ๋ก ๋ชป ์ฎ๊ฒจ ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์๋ค๋ฉด\n * ์ฌ๊ธฐ์ ๋ด์ ๋ณด๋ธ๋ค โ ๊ทธ๋ฌ๋ฉด `masterToTwin` ์ ๊ฒฝ๊ณ ์ ํ ์ค๊ธฐ๋ก ํฉ์ณ์ ธ ํ๋ฉด๊น์ง ๊ฐ๋ค.\n *\n * ์ด ์๋ฆฌ๊ฐ ์๋ ๋์ ์ปค๋ฅํฐ๋ ํ ๋ง์ด ์์ด๋ **๋งํ ๊ณณ์ด ์์๋ค.** ๊ทธ๋์ ๋ํฌ๋ฅผ ๋์ผ๋ก ๋ฐ๊ฟ\n * ๋๊ณ ๋ ์๋ฆฌ์ง ์๊ณ ์ฑ๊ณตํ๋ค. ์ฎ๊ธฐ๋ ์ฌ๋๋ง ์๋ ์ฌ์ค์ ์ฎ๊ธฐ๋ ์๋ฆฌ์์ ์ค์ด์ผ ํ๋ค.\n */\n warnings?: IngestWarning[]\n /**\n * **์๋ณธ์ด ๊ฐ์ง ์** โ ์ฎ๊ธด ์์ ๋ถ๋ชจ๋ค.\n *\n * ์ดํ์ ๋์ฐฉํ ๋ชจ๋ธ๋ง ๋ณผ ์ ์์ด์ ใ๋ ์ํผ 1,261ใ๊น์ง๋ง ๋งํ ์ ์์๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๋์ด ๋ฌป๋ ๊ฒ์\n * ใ๊ทธ๊ฒ ์ ๋ถ์ธ๊ฐใ๋ค โ ์๋ณธ์ 1,408๊ฐ๊ฐ ์์๊ณ 147๊ฐ๋ฅผ ์ฎ๊ธฐ์ง ๋ชปํ๋ค๋ฉด ๊ทธ ์ฌ์ค์ด ์ดํ์ ์ฒซ ์ค์\n * ์์ด์ผ ํ๋ค. ์ค์ ๋ก ์ฌ์ฉ์๊ฐ ํ๋ชฉ 2,789 ์ ์์ฌ 1,789 ์ ์ฐจ์ด๋ฅผ ํ๋ฉด์์ ์ฝ์ด ๋ด์ง ๋ชปํด ์ง์ \n * ๋ฌผ์๋ค(2026-08-22).\n *\n * ๋ถ๋ชจ๋ฅผ ์๋ ๊ฒ์ **์ปค๋ฅํฐ๋ฟ์ด๋ค.** ๊ทธ๋์ ์ปค๋ฅํฐ๊ฐ ์ค์ด ๋ณด๋ธ๋ค. ๋ณด๋ด์ง ์์ผ๋ฉด ์ดํ์ ๋ถ๋ชจ ์์ด\n * ์ฎ๊ธด ์๋ง ๋งํ๋ค โ **์ง์ด๋ด์ง ์๋๋ค.**\n *\n * ์ด์ ๋ ์ดํ์ด ์ธ๋ ์ด๋ฆ๊ณผ ๊ฐ๋ค(`recipes`ยท`materials`ยท`totalInputs`ยทโฆ). ๊ฐ์ **์๋ณธ์ ๋๊น์ง ์ฝ์ด์\n * ์ผ ๊ฒ**์ด์ด์ผ ํ๋ค. ์๋ฆฐ ์ฝ๊ธฐ์ ์๋ฅผ ์ฌ๊ธฐ ๋ด์ผ๋ฉด ใ์ ๋ถ ์ฎ๊ฒผ๋คใ๋ ๊ฑฐ์ง์ด ๋๋ค.\n */\n originCounts?: Record<string, number>\n}\n\nexport interface IngestedTwin {\n model: any // TwinModelDef(+layout+spaceId) โ ์ปค๋ ์๋น\n spaceContent: any // TwinSpace content โ ๋ทฐ ์๋น\n warnings: IngestWarning[]\n}\n\n/**\n * ๋ง์คํฐ โ ํธ์ ๊ตฌ์กฐ ๋งคํ(์์). ๋
ธ๋ํ์
์ ์นดํ๋ก๊ทธ๋ก ๊ฒ์ฆ(๋ชจ๋ฅด๋ ํ์
์ warning, ๋ฒ๋ฆฌ์ง ์์ โ ๋ฐ์ ์ฐ์ ).\n * @param catalog DOMAIN_CATALOG (์ปค๋ SSOT). ์์ผ๋ฉด ๊ฒ์ฆ ์๋ต.\n */\n/**\n * IANA ์๊ฐ๋ ์ด๋ฆ โ **๊ทธ ์๊ฐ์** UTC ์คํ์
(๋ถ). ์์กด์ฑ ์์ด `Intl` ๋ก ํผ๋ค.\n *\n * `Intl.DateTimeFormat` ์ `longOffset` ์ `\"GMT-07:00\"` ์ฒ๋ผ ๋์ค๊ณ , ์ด๊ฒ์ **์ผ๊ด์ ์ฝ์๊ฐ์ ๋ฐ์ํ**\n * ๊ฐ์ด๋ค. ๊ทธ๋์ 8์์ `America/Tijuana` ๋ โ420(PDT), 1์์ โ480(PST)์ด ๋๋ค.\n *\n * **ํ๊ณ๋ฅผ ๋ฐํ๋ค**: ์ฌ๊ธฐ์ ๋์ค๋ ๊ฒ์ **ํ ์์ ์** ์คํ์
์ด๋ค. ์ปค๋์ ๊ณ ์ ์คํ์
์ผ๋ก ํ๋ฃจ ์ค ๋ถ์\n * ์ฝ์ผ๋ฏ๋ก, ๋ชจ๋ธ์ ๋ง๋ ๊ณ์ ๊ณผ ๋ค๋ฅธ ๊ณ์ ์ ๊ธธ๊ฒ ์์ธกํ๋ฉด ํ ์๊ฐ ์ด๊ธ๋๋ค. ํ์ค์ ์ถฉ์คํ ๋ ๋ชจ์ต์\n * ํธ์คํธ๊ฐ ์ ๋ ๊ตฌ๊ฐ(`StartDateTime`/`FinishDateTime`)์ ๊ณ์ฐํด ๋ฃ๋ ๊ฒ์ด๊ณ , ๊ทธ๋ ์ด ํจ์๋ ์ฌ๋ผ์ง๋ค.\n *\n * ๋ชจ๋ฅด๋ ์ด๋ฆ์๋ **0 ์ ๋ตํ์ง ์๋๋ค**(`undefined`) โ 0 ์ \"UTC ๋ผ๊ณ ์ ์ธํ๋ค\" ๋ ๋ป์ด๊ณ , ๋ชจ๋ฅด๋ ๊ฒ์\n * ๊ทธ๋ ๊ฒ ๋ฐ๊พธ๋ฉด ํ์ ์ด ์ค๋ฅ ์์ด ํ๋ฆฐ ๊ฐ์ ๋ธ๋ค.\n */\nexport function utcOffsetOf(timezone?: string, at: Date = new Date()): number | undefined {\n if (!timezone) return undefined\n try {\n const parts = new Intl.DateTimeFormat('en-US', { timeZone: timezone, timeZoneName: 'longOffset' }).formatToParts(at)\n const name = parts.find(p => p.type === 'timeZoneName')?.value ?? ''\n if (name === 'GMT') return 0 // UTC ๊ณ์ด์ ์คํ์
ํ๊ธฐ๊ฐ ์๋ค\n const m = /^GMT([+-])(\\d{1,2})(?::(\\d{2}))?$/.exec(name)\n if (!m) return undefined\n const sign = m[1] === '-' ? -1 : 1\n return sign * (Number(m[2]) * 60 + Number(m[3] ?? 0))\n } catch {\n return undefined // ์ ์ ์๋ ์ด๋ฆ โ Intl ์ด ์ค๋ฅ๋ฅผ ๋ธ๋ค\n }\n}\n\n\n/* โโ ์ธ์ ์คํธ ๊ฒฝ๊ณ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ธ์ ์คํธ๋ ๊ตฌ์กฐ์ ๋ฌธ์ ๊ฐ ์์ด๋ ํธ์์ ๋ง๋ค์ด ์ค๋ค(๋ง์ง ์๋ ๊ฒ์ด ์ณ๋ค โ ๋ถ๋ถ์ ์ผ๋ก๋ผ๋ ์ธ์ฐ๊ณ \n * ๊ณ ์ณ ๋๊ฐ๋ ๊ฒ์ด ์ด ์์คํ
์ ๋ฐฉ์์ด๋ค). ๊ทธ๋์ **๊ฒฝ๊ณ ๊ฐ ์ ์ผํ ์ ํธ**์ธ๋ฐ, ๊ทธ ๊ฒฝ๊ณ ๋ฅผ ํ๋ฉด์ด ํ๋๋\n * ๋ณด์ฌ์ฃผ์ง ์๊ณ ์์๋ค: ์ ํต๊ฐ๊ณต ์ฐฝ๊ณ ํ
ํ๋ฆฟ์ ์ปค๋์ด ๋ชจ๋ฅด๋ ์๋ฆฌ ํ์
(`vas-station`)์ผ๋ก ํธ์์\n * ๋ง๋ค๋ฉด์ ๊ฒฝ๊ณ ๋ฅผ ๋์ง๋ง, ์์๋๋ ๊ทธ๊ฒ์ ๋ฒ๋ ธ๊ณ ์ฌ์ฉ์๋ ์๋ฌด ๋ง ์์ด ๋งํ๋ ํธ์์ ๋ฐ์๋ค.\n *\n * ๋ฌธ์ฅ์ด ์๋๋ผ ์ฝ๋๋ก ์ค์ด ๋ณด๋ธ๋ค. ์์ ๊ฒฝ๊ณ ๋ ํ๋ก์ฆ์๊ณ ๊ทธ์ค ํ๋์๋ ํ๊ธ์ด ์์ฌ ์์๋ค\n * (`โ ์นดํ๋ก๊ทธ์ ์์`) โ ๋ค์ฏ ์ธ์ด ํ๋ฉด์ ๊ทธ๋๋ก ๋ด๋ณด๋ด๋ฉด ์ด๋ฒ์ ๊ฑท์ด๋ธ ๋ฌธ์ ๋ฅผ ๋ค์ ๋ง๋ ๋ค.\n * ์ด ํ๋ก์ ํธ๊ฐ ์ด๋ฏธ ์ฐ๋ ๊ท์ฝ๊ณผ ๊ฐ์ ๋ชจ์์ด๋ค: ์ฃผ์ ์ ํธ(kind+params)ยท์ปค๋งจ๋ ๊ฑฐ์ (errorCode+params)ยท\n * ๋ง๋งํจ ํ์ (code+์์ด canonical message).\n *\n * code ์ธ์ด ์ค๋ฆฝ โ ํ๋ฉด์ด `twin.ingest.<code>` ๋ก ์ฌ๋ ๋ง์ ๋ง๋ ๋ค\n * params ๋ฌธ์ฅ์ ๋ผ์ธ ๊ฐ โ ๋ฒ์ญ์ด ์ธ์ด๋ง๋ค ์ด์์ ๋ฐ๊ฟ ์ ์๊ฒ\n * message ์์ด canonical โ ๋ก๊ทธ์ ๋จ๊ณ , ๋ฒ์ญ์ด ์์ ๋ ๊ทธ๋๋ก ๋ณด์ธ๋ค(๋น์นธ๋ณด๋ค ๋ซ๋ค)\n *\n * **์ฌ๊ธฐ ์ฌ๋ ์ด์ **: ์ด ํ์ผ์ด ๊ฒฝ๊ณ ์ ์์ฐ์์ด๊ณ , ํ
์คํธ๊ฐ ์์ค์์ ์ง์ ์ฝ๋ ๋ชจ๋์ด๋ผ\n * ๋ฐํ์ ์๋ import ๋ฅผ ๊ฐ์ง ์ ์๋ค(์ด ์ ์ฅ์์ ๊ท์ฝ โ ๊ทธ๋ฐ ๋ชจ๋์ ์๊ธฐ์๊ฒฐ์ด๋ค).\n * โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ */\n/** ์ธ์ ์คํธ๊ฐ ์๋ฆฌ๋ ํ ๊ฐ์ง. */\nexport interface IngestWarning {\n /** ์ธ์ด ์ค๋ฆฝ ์ฝ๋. ํ๋ฉด์ `twin.ingest.<code>` ๋ก ๋ ๋ํ๋ค. */\n code: string\n /** ๋ฌธ์ฅ์ ๋ผ์ธ ๊ฐ. ๋ฒ์ญ์ด ์ด์์ ๋ฐ๊ฟ ์ ์๊ฒ ์ด๋ฆ์ผ๋ก ๋๊ธด๋ค. */\n params?: Record<string, string | number>\n /** ์์ด canonical ๋ฌธ์ฅ โ ๋ก๊ทธยทํด๋ฐฑ์ฉ. ๋ฒ์ญ์ด ์์ด๋ ์ฝ์ ์ ์์ด์ผ ํ๋ค. */\n message: string\n}\n\n/**\n * **์๊ฐ์ ๋ชจ๋ฅด๋ ์ฑ ์๊ฐ์ผ๋ก ํ์ ํ๋ ค ํ๋ค** โ ๋ฐ์ ํ์์ ํ๋ฃจ์ ์๊ฐ์ ์ฝ๋๋ฐ ์ด ํธ์์ ๊ณต๊ฐ์ด\n * ์๊ฐ๋๋ฅผ ๋งํ์ง ์์๋ค.\n *\n * โโ ์ ๊ฒฝ๊ณ ์ธ๊ฐ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์ ์๊ฐ๋๋ฅผ ๋ชจ๋ฅด๋ฉด UTC ๋ก ์ฝ๋๋ค(๊ณ์ฝ์ ๋ฐํ ๋ ๊ท์จ โ ๋ชจ๋ฅด๋ ๊ฐ์ ์ง์ด๋ด์ง ์๋๋ค). ๊ทธ๋ฐ๋ฐ ๋ฐ์ \n * ํ์์ **์๊ฐ๋ณ ๋น์จ**์ด๋ผ, ์๊ฐ๋๊ฐ ์์ผ๋ฉด ํ์ฅ ์ ์ค๊ฐ ์๋๋ผ UTC ์ ์ค์ ํผํฌ๊ฐ ์ ๋ค(KST ํ์ฅ์ด๋ฉด\n * ๋ฐค 9์). ๊ฐ์ด ๊ทธ๋ด๋ฏํ๊ฒ ๋์ค๋ฏ๋ก ์๋ฌด๋ ์์์ฑ์ง ๋ชปํ๋ค.\n *\n * ๊ทธ๋์ ์๊ฐ๋๋ฅผ **์ง์ด๋ด์ง ์๊ณ **(์๋ฒ ๋ก์ปฌ์ด๋ ์์ ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์ผ๋ฉด ๊ทธ ํธ์์ ๋ชจ๋ ์๊ฐ ํ์ ์ด ์๋ฆฌ์ง ์๊ณ \n * ๊ทธ ๊ฐ์ ์์ ์ ๋ค) ๋์ **๊ทธ ์กฐํฉ์ ๋งํ๋ค** โ ๊ณต๊ฐ์ ์๊ฐ๋๋ฅผ ์ ์ธํ๋ฉด ์ฌ๋ผ์ง๋ ๊ฒฝ๊ณ ๋ค.\n */\nexport const generationWithoutTimeZone = (spaceId: string, equipmentId: string): IngestWarning => ({\n code: 'generation-without-time-zone',\n params: { spaceId, equipmentId },\n message:\n `\"${equipmentId}\" declares a daily generation shape but space \"${spaceId}\" declares no time zone โ the hourly fractions will be read in UTC, ` +\n 'so the generation peak will not land at local noon. Declare the space time zone (we do not guess one).'\n})\n\n/**\n * ์๋ฌด๋ ์ ์ธํ์ง ์์ ์๋ฆฌ ํ์
โ ๊ทธ ์๋ฆฌ๋ ํ๋ฆ์ ์ฐธ์ฌํ์ง ๋ชปํ ์ ์๋ค.\n *\n * **๋ฌป๋ ์๋๋ฅผ ๊ณ ์ณค๋ค (2026-08-20).** ์์ ์๋ ๋ด์ฅ ์นดํ๋ก๊ทธ์๊ฒ๋ง ๋ฌผ์๋ค. ๊ทธ๋ฐ๋ฐ ์๋ณธ์ด ์๊ธฐ\n * `DomainDefinition.locationTypes` ๋ฅผ ํจ๊ป ๋ณด๋ด๋ฉด **๊ทธ ์ ์ธ์ด ์ ๋ณธ**์ด๋ค โ ์นดํ๋ก๊ทธ๋ ์ฐ๋ฆฌ๊ฐ ์๋\n * ๋๋ฉ์ธ๋ค์ ๊ธฐ๋ณธ ์ดํ์ผ ๋ฟ์ด๋ค. ๋ฌผ์ ์๋๊ฐ ํ๋ ธ์ผ๋, ์๊ธฐ ์ดํ๋ฅผ ์ ์ธํ ์๋ณธ์ ์ ์์ ์ธ ํ์
๋ง๋ค\n * ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์๋ค(F&B ๋ผ์ธ์ ๋ถ์ด๋ฉด ์๋ฆฌ๋ง๋ค ํ๋์ฉ). ์์์ด ๋๋ฉด ์ฌ๋์ ๊ฒฝ๊ณ ๋ฅผ ์ฝ์ง ์๊ฒ ๋๊ณ , ๊ทธ๋\n * ์ง์ง ๊ฒฝ๊ณ ๋ ํจ๊ป ์ฃฝ๋๋ค.\n */\nexport const unknownLocationType = (system: string, type: string, id: string): IngestWarning => ({\n code: 'unknown-location-type',\n params: { system, type, id },\n /*\n * โโ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์ง ๋งํ๋ค (2026-08-25) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์์ ๋ฌธ์ฅ์ ใํ๋ฆ์ ์ฐธ์ฌํ์ง ๋ชปํ ์ ์๋คใ์๋ค. ๋ฌผ๊ฑด์ด ํ๋ฅด๋ ๋๋ฉ์ธ์์๋ ๋ง๋ ๋ง์ธ๋ฐ,\n * ์๋์ง ํธ์์๋ ํ๋ฆ์ด ์์ด์ ๊ทธ ๋ฌธ์ฅ์ด ์๋ฌด๊ฒ๋ ์๋ ค ์ฃผ์ง ์์๋ค(์ค์ ๋ก ํ์๊ด ๋ฐ์ ์๋ฅผ\n * ๋ถ์ด๋ฉด์ ์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์ ์ฌ๋์ด ใ์ด ๊ฒฝ๊ณ ๊ฐ ๋ป์ด ์๋๊ฐใ๋ฅผ ๋๋ฌผ์๋ค).\n *\n * ์ข
๋ฅ๋ฅผ ๋ชจ๋ฅด๋ฉด ์ค์ ๋ก ์ผ์ด๋๋ ์ผ์ ํ๋๋ค: **๊ทธ ์๋ฆฌ์ ๋ฅ๋ ฅ์ด ๋ถ์ง ์๋๋ค.** ๋ฅ๋ ฅ์ด ์์ผ๋ฉด\n * ์ํ ํ๋๋ ์๊ณ , ๋กค์
์๋ ๋ค์ด๊ฐ์ง ์๊ณ , ์ ์๋ฉด ํ๋ ํธ์๋ ์์ง ์๋๋ค. ๋๋ฉ์ธ์ ๊ฐ๋ฆฌ์ง ์๊ณ \n * ์ฐธ์ธ ๋ฌธ์ฅ์ด๋ฏ๋ก ์ด๊ฒ์ ์ ๋๋ค.\n */\n message:\n `\"${type}\" is declared nowhere for ${system} (${id}) โ neither in the master's own locationTypes nor in the built-in ` +\n `catalog. A location whose type is unknown gets no capabilities, so it carries no state, joins no rollup, ` +\n `and (in domains that move things) may be left out of the flow.`\n})\n\n/**\n * ์๋ณธ์ด ํจ๊ป ๋ณด๋ธ ์๋ฆฌ ํ์
์ ์ธ โ ์์ผ๋ฉด **์ด๊ฒ์ด ์ ๋ณธ**์ด๋ค.\n *\n * ์ปค๋ ๊ณ์ฝ์ `DomainDefinition.locationTypes` ๋ `{ key, label, โฆ }` ๋ชฉ๋ก์ด๋ค. ์ฝ์ ์ ์๋ ๋ชจ์์ด๋ฉด\n * `undefined` ๋ฅผ ๋๋ ค **์นดํ๋ก๊ทธ๋ก ๋จ์ด์ง๋ค** โ ๋น ๋ฐฐ์ด์ ๋๋ ค์ฃผ๋ฉด ใ์๋ฌด ํ์
๋ ์ ์ธ๋์ง ์์๋คใ๊ฐ\n * ๋์ด ๋ชจ๋ ์๋ฆฌ๊ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๋๋ค(์๋ ๊ฒ๊ณผ ๋ชป ์ฝ์ ๊ฒ์ ๋ค๋ฅด๋ค).\n */\nexport function declaredLocationTypes(productionSpec: unknown): string[] | undefined {\n const list = (productionSpec as any)?.definition?.locationTypes\n if (!Array.isArray(list) || !list.length) return undefined\n const keys = list.map((t: any) => (typeof t === 'string' ? t : t?.key)).filter((k: any) => typeof k === 'string' && k)\n return keys.length ? keys : undefined\n}\n\n/** ์๊ฐ๋ ๋ฌธ์์ด์ ๋ชป ์ฝ์๋ค โ ์๊ฐ ํด์์ด UTC ๋ก ๋จ์ด์ง๋ค(์๋ฆฌ์ง ์๊ณ ํ์ง ์๊ฐ์ผ๋ก ๊ฐ์ ํ์ง ์๋๋ค). */\nexport const unknownTimezone = (timezone: string): IngestWarning => ({\n code: 'unknown-timezone',\n params: { timezone },\n message: `space timezone \"${timezone}\" is not a known IANA zone โ the twin will read times as UTC`\n})\n\n/** ์์
์ ์์ ์์์๊ฐยทํ๋ผ๋ฏธํฐ๊ฐ ์๋ค โ ์ปค๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์ํ๋ค. */\nexport const operationWithoutDuration = (operation: string): IngestWarning => ({\n code: 'operation-without-duration',\n params: { operation },\n message: `operation \"${operation}\" has no duration or parameters โ kernel defaults will be used`\n})\n\n/** ๋ณผ ์ ์๋ ํํ์ด ์๋ค โ ํ์ฅ์ด ํ๋ฉด์ ๋จ์ง ์๋๋ค. */\nexport const noViewableRepresentation = (): IngestWarning => ({\n code: 'no-viewable-representation',\n message: 'the space has no viewable representation (no representations and no geo) โ add one, or provide geo/board'\n})\n\n/**\n * ๊ตฌ์กฐ ํฌ์์์ **๊ฐ๋ฆฌํค๋ ๋์์ ๋ชป ์ฐพ์๋ค.**\n *\n * ์์ ์๋ ์ด๋ฐ ์ฐธ์กฐ๊ฐ model JSON ์์ ๋งจ ๋ฌธ์์ด์ด๋ผ ํ๋ฉด๋ง ๊ฒฝ๊ณ ํ ์ ์์๊ณ , ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ๋ค์ด์จ\n * ๋ฐ์ดํฐ๋ ์๋ฌด๋ ์ ๋ดค๋ค. ์ด์ ํ์ผ๋ก ํ๋ฉด์ **์ธ์ ์คํธ๊ฐ ์ง์ ์๋ค** โ ๊ทธ๋ฌ๋ ์ธ์ ์คํธ๊ฐ ๋งํ๋ค.\n * ๋ง์ง๋ ์๋๋ค(ํธ์์ model ๋ก ์ด๋ฏธ ๋์ํ๋ค). ๋ค๋ง ์๋ฆฌ์ง ์๊ณ ๋๊ธฐ์ง ์๋๋ค.\n */\nexport const unresolvedReference = (field: string, ref: string): IngestWarning => ({\n code: 'unresolved-reference',\n params: { field, ref },\n message: `${field} points at something that is not in this twin (${ref}) โ the link was left empty`\n})\n\n/**\n * ๊ตฌ์กฐ ํฌ์ ์์ฒด๊ฐ ์คํจํ๋ค โ ์กฐํ๋ ๋ชป ํ์ง๋ง **ํธ์์ ๋์ํ๋ค**(์ปค๋์ model ๋ฅผ ์ด๋ฏธ ๋ฐ์๋ค).\n * ํ์ ์๋ณธ์์ ๋ค์ ๊ทธ๋ฆด ์ ์์ผ๋ฏ๋ก ์ธ์ ์คํธ๋ฅผ ์คํจ๋ก ๋ง๋ค์ง ์๋, ์นจ๋ฌตํ์ง๋ ์๋๋ค.\n */\nexport const projectionFailed = (reason: string): IngestWarning => ({\n code: 'projection-failed',\n params: { reason },\n message: `structure projection failed (${reason}) โ the twin runs, but model inspection will be stale until the next ingest`\n})\n\n/**\n * **๋์ ์ค์ ๊ณต์ฅ์ ์ ํํ๋ค** โ ๋ฏธ๋ฌ๋ ๋ฉ์ถ์ง ์์ผ๋ฏ๋ก, ๋ฌด์์ด ์ฌ๋ผ์ก๋์ง ์ฌ๊ธฐ์ ๋งํ๋ค.\n *\n * ๋ฉ์ท๋ค ์ธ์ฐ๋ ๊ตฌ์กฐ ์ ํ์ด๋ผ๋ฉด ์ฌ์ฉ์๊ฐ \"๋ค์ ์ธ์ ๋ค\" ๋ ๊ฒ์ ์๋ค. ๋ฏธ๋ฌ๋ ๊ทธ ๋ง๋๊ฐ ์์ด์\n * ์๋ฆฌ ํ๋ยท์ค๋น ํ ๋๊ฐ ์๋ฆฌ์ง ์๊ณ ์์ด์ง ์ ์๋ค โ ์๋ฆฌ๊ฐ ์์ฒ์ธ ํ์ฅ์์ ํ๋ฉด์ ์๋ฅผ ์ธ์ด\n * ๋์น์ฑ๊ธฐ๋ฅผ ๊ธฐ๋ํ ์๋ ์๋ค. ๋์ด๋ ๊ฒ๋ ํจ๊ป ๋งํ๋ค(๋ฌด์์ด ๋ฐ์๋์๋๊ฐ ๊ณง ์ธ์ ์คํธ์ ๋ต์ด๋ค).\n */\nexport const structureAdopted = (rev: number, shift: { locationsAdded: number; locationsDropped: number; equipmentDropped: number; personsDropped: number; assetsDropped: number }): IngestWarning => ({\n code: 'structure-adopted',\n params: { rev, ...shift },\n message:\n `the running mirror adopted a new structure (revision ${rev}) โ ` +\n `+${shift.locationsAdded} location(s), -${shift.locationsDropped} location(s), ` +\n `-${shift.equipmentDropped} equipment, -${shift.personsDropped} person(s), -${shift.assetsDropped} asset(s)`\n})\n\n/**\n * ์ปค๋ฅํฐ๊ฐ ์ธ๋ถ ์์คํ
์ ๊ฐ์ **์ฐ๋ฆฌ ์ดํ๋ก ์ฎ๊ธฐ์ง ๋ชปํด ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์๋ค.**\n *\n * ์: Oracle WMS ๊ฐ ์ฐ๋ฆฌ ํ์ ์๋ `locn_type` ์ ์ฃผ๋ฉด ๊ทธ ์๋ฆฌ๋ `storage` ๊ฐ ๋๋ค โ ๋ํฌ๊ฐ ๋์ผ๋ก\n * ๋ชจ๋ธ๋ง๋๋ ๊ฒ์ด๋ค. ์ธ์ ์คํธ๋ฅผ ํต์งธ๋ก ์คํจ์ํฌ ์ผ์ ์๋์ง๋ง(๋ก์ผ์ด์
ํ๋ ๋๋ฌธ์ ํ์ฅ ์ ์ฒด๊ฐ\n * ์ ๋ค์ด์ค๋ ํธ์ด ๋ ๋์๋ค), **์๋ฆฌ์ง ์๊ณ ๋์ด๊ฐ๋ฉด ์ ๋๋ค.** ํธ์์ด ์ค๋ฌผ๊ณผ ๋ค๋ฅด๊ฒ ์๊ฒผ๋๋ฐ\n * ์๋ฌด๋ ๊ทธ ์ฌ์ค์ ๋ชจ๋ฅธ ์ฑ ๊ทธ ์์์ ํ๋ฆ์ ๋
ผํ๊ฒ ๋๋ค.\n *\n * ๊ฐ์ ๋์ดํ๋ ์ด์ : \"3๊ฑด\" ๋ง์ผ๋ก๋ ์ปค๋ฅํฐ ๋งคํ์ ๋ฌด์์ ๋ํด์ผ ํ๋์ง ์ ์ ์๋ค.\n */\nexport const connectorMappingFallback = (field: string, fallback: string, values: readonly string[], count: number): IngestWarning => ({\n code: 'connector-mapping-fallback',\n params: { field, fallback, values: values.join(', '), count },\n message: `${count} ${field} value(s) had no mapping and fell back to \"${fallback}\" (${values.join(', ')}) โ the twin's shape differs from the source system here`\n})\n\n\n/** ๋ก๊ทธ ํ ์ค โ ๊ฐ๋ฐ์๊ฐ ์ฝ๋ ๊ฒ์ด๋ฏ๋ก ์์ด canonical ๋ฌธ์ฅ์ ์ด๋ค. */\nexport const describeWarnings = (warnings: readonly IngestWarning[]): string =>\n warnings.map(w => `${w.code}: ${w.message}`).join(' | ')\n\n/**\n * ์๋ฒ๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฑ์ด ๋
ธ๋ธ๋ค โ ์ฌ์ฉ์๊ฐ ์ค ์ ์๋ ๊ฐ์ผ๋ก ํธ์์ด ๋ง๋ค์ด์ก์์ ์๋ฆฐ๋ค.\n *\n * ์๋ฆฌ์ง ์๊ณ ์ฑ์ฐ๋ฉด ๋์ค์ \"์ ์ด ์์น์ธ๊ฐ\" ๋ฅผ ์๋ฌด๋ ๋ตํ ์ ์๋ค. ๋ง์ ์ผ์ ์๋๋ค(๊ธฐ๋ณธ๊ฐ์ ํ
ํ๋ฆฟ์ด\n * ํ์ ์ ๊ฐ๊ณ ์ ์ธํ ๊ฐ์ด๋ค) โ ๋ค๋ง ๋ฐํ๋ค.\n */\nexport const knobDefaultsFilled = (keys: readonly string[]): IngestWarning => ({\n code: 'knob-defaults-filled',\n params: { keys: keys.join(', '), count: keys.length },\n message: `values you did not provide were filled from the template defaults: ${keys.join(', ')}`\n})\n\n/**\n * ์ด ํ์ฅ์ ์ค๋น๋ฅผ ๋
ธ๋ธ ๊ฐ์ผ๋ก ์ฑ์ ๋ค โ **์๋ฆฌ์ง ์๊ณ ์ฑ์ฐ์ง ์๋๋ค.**\n *\n * ์๋์ง ํธ์์ ๋ถํ๋ฅผ ์ด์ ์ค๋น id ๋ก ์ ์ธํ ๋ ์ด๋ค. ๋ช ๊ฐ๋ฅผ ๊ฐ์ ธ์๋์ง ๋งํด ์ฃผ์ง ์์ผ๋ฉด, ์ฌ์ฉ์๋\n * ์๊ธฐ๊ฐ ๊ณ ๋ฅด์ง ์์ ์ค๋น๋ค์ด ๋ถํ๋ก ์กํ ๊ฒ์ ๋์ค์ ํ๋ฉด์์์ผ ์๊ฒ ๋๋ค.\n */\nexport const siteEquipmentAdopted = (key: string, count: number): IngestWarning => ({\n code: 'site-equipment-adopted',\n params: { key, count },\n message: `${count} piece(s) of equipment already on this site were adopted as loads (knob \"${key}\") โ set their coefficients before trusting the numbers`\n})\n\nexport function masterToTwin(master: ReferenceMaster, catalog?: any): IngestedTwin {\n /* ์ปค๋ฅํฐ๊ฐ ์ฎ๊ธฐ๋ฉฐ ์๊ฒ ๋ ๊ฒ์ ๋จผ์ ์ฃ๋๋ค โ ์์ธ์ด ์์ ์ค๋ ํธ์ด ์ฝ๊ธฐ ์ฝ๋ค(๋์ฒด๊ฐ ๋จผ์ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋ค). */\n const warnings: IngestWarning[] = [...(master.warnings ?? [])]\n /*\n * ์๋ณธ์ด ์๊ธฐ ์ดํ๋ฅผ ์ ์ธํ์ผ๋ฉด **๊ทธ๊ฒ์ ๋์กฐํ๋ค.** ๋ด์ฅ ์นดํ๋ก๊ทธ๋ ๊ทธ ์ ์ธ์ด ์์ ๋์ ๊ธฐ๋ณธ์ด๋ค โ\n * ์๋๋ฅผ ๋ฐ๊พธ์ง ์์ผ๋ฉด, ์๊ธฐ ์ดํ๋ฅผ ์ ์ธํ ์๋ณธ์ด ์ ์์ ์ธ ์๋ฆฌ๋ง๋ค ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๋๋ค.\n */\n const known: string[] = declaredLocationTypes(master.productionSpec) ?? catalog?.[master.system]?.locationTypes ?? []\n\n const locationEntries = master.locations.filter(l => l.role === 'location' || l.role === 'both')\n const areaLocs = master.locations.filter(l => l.role === 'area' || l.role === 'both')\n\n const locations = locationEntries.map(l => {\n if (known.length && !known.includes(l.type)) warnings.push(unknownLocationType(master.system, l.type, l.id))\n // gs1Id(์ ์ ์ ์ฒด์ฑ)๋ฅผ ๋ชจ๋ธ์ ์๋ฆฌ๋ก ํต๊ณผ โ ๊ฒฐํฉ(tag)/์ถ์ ์ด GS1 ๋ก(ยงJ). ๋ก์ปฌ id ๋ ๊ทธ๋๋ก ์ ์ง(name/xref).\n /*\n * **์ด๋ฆ์ ํต๊ณผ์ํจ๋ค.** ์ฌ๊ธฐ์ ๋ฒ๋ฆฌ๊ณ ์์๋ค โ ๊ทธ๋์ ๋ชจ๋ธ์๋, ํฌ์ํ ํ์๋ ์ด๋ฆ์ด ์๊ณ \n * ํ๋ฉด์ ์๋ฆฌ id ๋ฅผ ๊ทธ๋๋ก ์ฐ์๋ค(`cut-station`). ๋ชฉ๋กยทํยท๊ด๊ณ ๊ทธ๋ฆผ์์ ๊ฐ์ ๊ฒฐํจ์ด ๋ฐ๋ก\n * ๋ณด์๋ ์ด์ ๊ฐ ์ด ํ ์ค์ด๋ค. ์ด๋ฆ ์๋ ์๋ณธ์ ์ด๋ฆ ์์ด ํต๊ณผํ๋ค(id ๋ก ๋ฉ์ฐ์ง ์๋๋ค).\n */\n /*\n * **์์ฑ๋ ํต๊ณผ์ํจ๋ค** โ ์ค๋น์ ๊ฐ์ ๊ท์จ(์๋์ง ์๊ณ ๋๋ฅธ๋ค). ์ฌ๊ธฐ๊ฐ ์์ผ๋ฉด ์๋ฆฌ์ ์ค์ ๊ฐ์ด\n * ์ปค๋์ ๋ฟ์ง ์๋๋ค: ์๋์ง์ ๊ณ์ฝ์ ๋ ฅ(`contract.kW`)์ด ๊ทธ ๊ฒฝ๋ก์ด๊ณ , ํต๊ณผํ์ง ์์ผ๋ฉด ์ปค๋์ด\n * ๊ณ์ฝ์ ๋ชจ๋ฅด๋ ์ฑ๋ก ์์ **ํ์ ์ ์์ ํ์ง ์๋๋ค**(์ค๋ฅ ์์ด ์๋ฆฌ์ง ์๊ณ ).\n */\n return { id: l.id, type: l.type, ...(l.name ? { name: l.name } : {}), ...(l.description ? { description: l.description } : {}), capacity: l.capacity ?? 0, ...(l.parallelism !== undefined ? { parallelism: l.parallelism } : {}), ...(l.level ? { level: l.level } : {}), ...(l.properties?.length ? { properties: l.properties } : {}), parentId: l.parentId, ...(l.upstreamId ? { upstreamId: l.upstreamId } : {}), gs1Id: l.gs1Id }\n })\n\n /*\n * โโ ์ค๋น๊ฐ ๊ตฌ์ญ์ ์ ์์ ์ ์๋ค (2026-09-06) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ง์คํฐ๋ ์๋ฆฌ์ ๊ตฌ์ญ์ **ํ ๋ชฉ๋ก**์ ๋ด๊ณ `role` ๋ก ๊ฐ๋ฅธ๋ค(ยง`locationEntries` ยท `areaLocs`).\n * ๊ทธ๋์ ์ค๋น์ `homeLocationId` ๊ฐ ๊ตฌ์ญ์ ๊ฐ๋ฆฌํฌ ์ ์๋ค โ ์ค์ ๋ก `EQ-CAM-SHOWER-01` ์ด\n * `LINE-CAM`(๊ตฌ์ญ)์ ์ ์๊ณ , ๊ทธ๊ฒ์ด ์ ์์ด๋ค(์์ด์ค์๋ ๋ผ์ธ ์ ์ฒด์ ๋ธ๋ฆฐ๋ค).\n *\n * ๊ณ์ฝ์ด ๊ทธ ๊ตฌ๋ถ์ ์ํด `homeLocationKind` ๋ฅผ ๋์๋๋ฐ(`HomeKind = 'location' | 'area'`)\n * **์๋ฌด๋ ์ ์ฑ์ฐ๊ณ ์์๋ค.** ๊ทธ๋์ ์ธ์ ์คํธ๊ฐ ๊ทธ ์ฐธ์กฐ๋ฅผ ใ๋์ด์ก๋คใ๊ณ ๊ฒฝ๊ณ ํ๋ค.\n *\n * ์ง์ํ์ง ์๋๋ค โ ๋ง์คํฐ๊ฐ ์ด๋ฏธ `role` ๋ก ๋งํ๊ณ ์์ผ๋ฏ๋ก ๊ทธ๊ฒ์ ์ฝ๋๋ค.\n */\n const areaIds = new Set(master.locations.filter(l => l.role === 'area').map(l => l.id))\n\n const equipment = (master.equipment ?? []).map(e => ({\n id: e.id, kind: e.kind, ...(e.name ? { name: e.name } : {}), ...(e.description ? { description: e.description } : {}), ...(e.testResults?.length ? { testResults: e.testResults } : {}),\n /* ๋ฑ๊ธ ์์ โ ์ฌ๋ยท์์ฐ๊ณผ ๊ฐ์ ์๋ฆฌ. ๋น ๋จ๋ฆฌ๋ฉด ์๋ณธ์ด ์ฑ์ด ๋ฑ๊ธ์ด ๋ฌธํฑ์์ ์กฐ์ฉํ ๋ฒ๋ ค์ง๋ค. */\n ...(e.equipmentClassIds?.length ? { equipmentClassIds: e.equipmentClassIds } : {}),\n homeLocation: e.homeLocationId,\n /* ์๋ฆฌ๋ฉด ์ ์ ๋๋ค โ ๊ณ์ฝ์ ๊ธฐ๋ณธ๊ฐ์ด `location` ์ด๊ณ , ์๋ ์นธ์ ๋ง๋ค๋ฉด ํ๋ฉด์ด ๊ทธ๊ฒ์ ๊ทธ๋ฆฐ๋ค. */\n ...(e.homeLocationId && areaIds.has(e.homeLocationId) ? { homeLocationKind: 'area' as const } : {}),\n mtbfMs: e.mtbfMs, mttrMs: e.mttrMs, ...(e.identity ? { identity: e.identity } : {}),\n ...(e.window ? { window: e.window } : {}),\n /* ์์ฑ์ ์๋์ง ์๊ณ ํต๊ณผ โ ์ด๋์๊ฐ ์ถ์ ๊ธฐ๊ฐ kind ๋ณ ์๋๋ฅผ ์ฌ๊ธฐ์ ์ฝ๋๋ค(๋จ์ ์ฝ๋ ๊ทธ๋๋ก). */\n ...(e.properties?.length ? { properties: e.properties } : {}), ...(e.workCalendar?.length ? { workCalendar: e.workCalendar } : {}), ...(e.testSpecificationIds?.length ? { testSpecificationIds: e.testSpecificationIds } : {}),\n /* ์ ํจ ๊ธฐ๊ฐ๋ ์๋์ง ์๊ณ ํต๊ณผ โ ํ์ ์ ์ปค๋์ด ์๊ธฐ ์๊ณ๋ก ํ๋ค(ํธ์คํธ๊ฐ ๋ฏธ๋ฆฌ ์๋ฅด์ง ์๋๋ค). */\n ...(e.effectiveStart ? { effectiveStart: e.effectiveStart } : {}), ...(e.effectiveEnd ? { effectiveEnd: e.effectiveEnd } : {})\n }))\n\n // ์ขํ(layout) โ footprint ์ค์ฌ. ์์ผ๋ฉด ์๋ต(coordinate-free ์ ์ง).\n const layout: Record<string, { x: number; y: number }> = {}\n for (const l of locationEntries) if (l.footprint) layout[l.id] = { x: l.footprint.x + l.footprint.w / 2, y: l.footprint.y + l.footprint.h / 2 }\n\n const spaceId = master.space.spaceId ?? `${master.source}-site`\n /*\n * ์๊ฐ ๊ธฐ์ค์ ์ปค๋์ด ์ฝ์ ํํ๋ก ํผ๋ค โ ์ปค๋์ zero-dep ์ด๋ผ ์๊ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค์ด์ง ์๊ณ \n * **๋ถ ์คํ์
**๋ง ๋ฐ๋๋ค(๊ณ์ฝ `TwinModelDef.utcOffsetMinutes`). ํธ๋ ์ผ์ ํธ์คํธ์ ๋ชซ์ด๋ค.\n *\n * ์ ์ธ์ด ์์ผ๋ฉด **ํ๋๋ฅผ ๋ง๋ค์ง ์๋๋ค** โ ๊ทธ๋ฌ๋ฉด ์ปค๋์ด UTC ๋ก ์ฝ๊ณ , ๊ทธ ๊ธฐ๋ณธ๊ฐ์ ๊ณ์ฝ์ ๋ฐํ์ ธ ์๋ค.\n * ์ฌ๊ธฐ์ 0 ์ ๋ฃ์ผ๋ฉด \"UTC ๋ผ๊ณ ์ ์ธํ๋ค\" ์ \"์ ์ธํ์ง ์์๋ค\" ๊ฐ ๊ตฌ๋ณ๋์ง ์๋๋ค.\n */\n const utcOffsetMinutes = utcOffsetOf(master.space.timezone)\n if (master.space.timezone && utcOffsetMinutes === undefined) {\n warnings.push(unknownTimezone(String(master.space.timezone)))\n }\n /*\n * โโ ์ด๋ฆ๋ ํจ๊ป ์ฃ๋๋ค (2026-09-07) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์์์ ํผ ์คํ์
์ **์ด ์๊ฐ์** ๊ฐ์ด๊ณ , ์ด ๋ชจ๋ธ์ ์ ์ฅ๋๋ค. ๊ทธ๋์ ๊ทธ ์๋ ๋ง์คํฐ๋ฅผ ๋ฐ์ ๋ ์\n * ๊ณ์ ๋ก ๊ตณ๋๋ค โ `America/Tijuana`(PST โ480 / PDT โ420)๊ฐ ์๋ฃ์ ์๊ณ , ์ง๋ ๊ตฌ๊ฐ์ ๊ต๋๋ณ๋ก ์ ์ผ๋ฉด\n * ๊ทธ ์์ ์ ํ์ด ์ฌ์ค์ ํ ์๊ฐ ๋ฐ์ด **๋ค๋ฅธ ๊ต๋๋ก** ์ธ๊ฒ ํ๋ค. ์ค๋ฅ๋ ๋์ง ์๋๋ค.\n *\n * ์ด๋ฆ์ด ํจ๊ป ์์ผ๋ฉด ์๋น์ฒ๊ฐ ์๊ฐ๋ง๋ค ๋ค์ ํ ์ ์๋ค(ยง`shiftContext`). ์ปค๋์ ์ด ๊ฐ์ ์ฐ์ง ์๋๋ค.\n *\n * ์คํ์
์ด ์ ํ๋ฆฐ ์ด๋ฆ์ ์ฃ์ง ์๋๋ค โ ๊ทธ ๊ฒฝ์ฐ๋ ์์์ ๊ฒฝ๊ณ ๋ก ๋งํ๊ณ , ํ๋ฆฌ์ง ์๋ ์ด๋ฆ์ ์ค์ด\n * ๋๋ฉด ์๋น์ฒ๊ฐ ๊ทธ๊ฒ์ ๋ฏฟ๊ณ ๋งค๋ฒ ์คํจํ๋ค.\n */\n const timezone = utcOffsetMinutes !== undefined ? master.space.timezone : undefined\n /*\n * ์คํผ๋ ์ด์
๋ช
์ธ๋ฅผ model ์ ํต๊ณผ์ํจ๋ค โ ์ปค๋์ด `loadOperations` ๋ก ์๋นํ๋ค(TwinModelDef ํ์ฅ ํ๋,\n * ๋ชจ๋ฅด๋ ์ปค๋์ ๋ฌด์). ์ฌ๊ธฐ์ ๊ฐ์ ์๋์ง ์๋๋ค: ๊ธฐ๊ฐ์ ํ์ค ํ๊ธฐ(ISO 8601)๋ก ์ปค๋๊น์ง ๊ทธ๋๋ก ๊ฐ๋ค.\n */\n const operations = master.operations\n if (operations?.length) {\n for (const o of operations) {\n if (!o.duration && !o.parameters?.length) warnings.push(operationWithoutDuration(o.key))\n }\n }\n /* ์ฌ๋๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๋ฑ๊ธยท๊ต๋ ๊ทธ๋๋ก ์ปค๋๊น์ง ๊ฐ๋ค(๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค). */\n const persons = master.persons?.map(p => ({ id: p.id, ...(p.name ? { name: p.name } : {}), ...(p.testResults?.length ? { testResults: p.testResults } : {}), personnelClassIds: p.personnelClassIds, ...(p.identity ? { identity: p.identity } : {}), ...(p.window ? { window: p.window } : {}), ...(p.workCalendar?.length ? { workCalendar: p.workCalendar } : {}), ...(p.homeLocationId ? { homeLocation: p.homeLocationId } : {}), ...(p.properties?.length ? { properties: p.properties } : {}), ...(p.testSpecificationIds?.length ? { testSpecificationIds: p.testSpecificationIds } : {}), ...(p.effectiveStart ? { effectiveStart: p.effectiveStart } : {}), ...(p.effectiveEnd ? { effectiveEnd: p.effectiveEnd } : {}) }))\n /* ์์ฐ๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๋ฑ๊ธยท์๋ฆฌ ๊ทธ๋๋ก ์ปค๋๊น์ง. */\n const assets = master.assets?.map(a => ({ id: a.id, ...(a.name ? { name: a.name } : {}), ...(a.testResults?.length ? { testResults: a.testResults } : {}), assetClassIds: a.assetClassIds, homeLocation: a.homeLocationId, ...(a.identity ? { identity: a.identity } : {}), ...(a.properties?.length ? { properties: a.properties } : {}), ...(a.testSpecificationIds?.length ? { testSpecificationIds: a.testSpecificationIds } : {}), ...(a.effectiveStart ? { effectiveStart: a.effectiveStart } : {}), ...(a.effectiveEnd ? { effectiveEnd: a.effectiveEnd } : {}) }))\n /* ํ๋ชฉ ์ ์ยท๋ฑ๊ธ๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค(ํ์ฐ ๊ณ์๋ ์ปค๋์ด ์ฝ๋๋ค). */\n const materialDefinitions = master.materialDefinitions?.map(d => ({\n id: d.id,\n /* ์ด๋ฆ์ ์ด๋ฆ ์๋ฆฌ์ โ ์์ ์๋ `name` ์ `description` ์ผ๋ก ์ฎ๊ฒจ ๋ด์๋ค(์ดํ๊ฐ ๋ค์งํ ์์๋ค). */\n ...(d.name ? { name: d.name } : {}),\n ...(d.materialClassIds?.length ? { materialClassIds: d.materialClassIds } : {}),\n ...(d.properties?.length ? { properties: d.properties } : {}),\n ...(d.testSpecificationIds?.length ? { testSpecificationIds: d.testSpecificationIds } : {}),\n ...(d.effectiveStart ? { effectiveStart: d.effectiveStart } : {}),\n ...(d.effectiveEnd ? { effectiveEnd: d.effectiveEnd } : {})\n }))\n /*\n * **๋ฑ๊ธ์ ํ์๋ช
์ `name` ์ด๋ค.**\n *\n * ํ์ค ๋ง์คํฐ๋ ๋ฑ๊ธ์ ํ์๋ช
์ `description` ์ ๋ด๋๋ค(`RefResourceClass.description` = i18n ํค).\n * ๊ทธ๊ฒ์ ๊ทธ๋๋ก ๋ชจ๋ธ์ ์ค์ผ๋ฉด ํ๋ฉด์ \"์ค๋ช
\" ์ด์ ์ด๋ฆ์ด ์๋๋ค โ ์ฌ์ฉ์์๊ฒ๋ ์ด๋ฆ์ธ๋ฐ ๋จธ๋ฆฌ๊ธ์\n * ์ค๋ช
์ด๋ผ, ๊ฐ์ ๊ฒ์ ์ถ๋ง๋ค ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ถ๋ฅด๊ฒ ๋๋ค.\n *\n * ๊ทธ๋์ **๋ฌธ ํ๋์์ ์ดํ๋ฅผ ๋ง์ถ๋ค**: ํ์๋ช
์ ์ด๋ ์ถ์ด๋ `name`. ์๋์ `description` ์\n * ๋จ๊ฒจ ๋์ง ์๋๋ค โ ๋ ์๋ฆฌ์ ๊ฐ์ ๊ฐ์ด ์์ผ๋ฉด ์ด๋ ๊ฒ์ด ์ ๋ณธ์ธ์ง ๋ค์ ํท๊ฐ๋ฆฐ๋ค.\n */\n const asName = (list?: RefResourceClass[]) =>\n list?.map(({ description, ...rest }) => ({ ...rest, ...(description ? { name: description } : {}) }))\n /*\n * ๊ฒ์ฌ ๋ช
์ธ๋ **ํ์๋ช
์ `name`** ์ด๋ค โ ๋ฑ๊ธ๊ณผ ๊ฐ์ ๊ท์น์ ์ด๋ค(์ดํ๋ฅผ ํ๋๋ก). ํ์ค ๋ง์คํฐ๋\n * ํ์๋ช
์ `description` ์ ๋ด์ผ๋ฏ๋ก ๋ฌธ ํ๋์์ ์ฎ๊ธด๋ค. ๊ทธ๋ฌ์ง ์์ผ๋ฉด ํ๋ฉด์ \"์ค๋ช
\" ์ด์ ์ด๋ฆ์ด\n * ์์ ์ถ๋ง๋ค ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๊ฐ์ ๊ฒ์ ๋ถ๋ฅด๊ฒ ๋๋ค(๋ฑ๊ธ์์ ์ด๋ฏธ ๊ฒช์๋ค).\n */\n const testSpecifications = master.testSpecifications?.map(({ description, ...rest }) => ({\n ...rest,\n ...(description ? { name: description } : {})\n }))\n const personnelClasses = asName(master.personnelClasses)\n const equipmentClasses = asName(master.equipmentClasses)\n const assetClasses = asName(master.assetClasses)\n const materialClasses = asName(master.materialClasses)\n\n const model = {\n locations, equipment, layout, spaceId,\n /* ์์ฐ ์ ์๋ ์๋์ง ์๊ณ ํต๊ณผ โ ๊ฒฝ๊ณ์์ ์ดํ๋ฅผ ๊ฐ์ง ์๋๋ค(์ปค๋์ด ๊ทธ๋๋ก ์๋นํ๋ค). */\n ...(master.productionSpec ? { productionSpec: master.productionSpec } : {}),\n /* ์ ์ฒด์ฑ ์ ์ธ๋ ๊ทธ๋๋ก ํต๊ณผํ๋ค โ ์์ผ๋ฉด ๋ง๋ค์ง ์๋๋ค(์ปค๋์ด ๋ ๊ฑฐ์ ์์๋ก ๋จ์ด์ง๋ค). */\n ...(master.identity ? { identity: master.identity } : {}),\n ...(materialDefinitions?.length ? { materialDefinitions } : {}),\n ...(materialClasses?.length ? { materialClasses } : {}),\n ...(utcOffsetMinutes !== undefined ? { utcOffsetMinutes } : {}),\n ...(timezone ? { timezone } : {}),\n ...(operations?.length ? { operations } : {}),\n ...(testSpecifications?.length ? { testSpecifications } : {}),\n ...(personnelClasses?.length ? { personnelClasses } : {}),\n ...(equipmentClasses?.length ? { equipmentClasses } : {}),\n ...(assetClasses?.length ? { assetClasses } : {}),\n ...(persons?.length ? { persons } : {}),\n ...(assets?.length ? { assets } : {})\n }\n\n const areas = areaLocs.map(l => ({\n id: l.id, type: l.type, name: l.name ?? l.id, parentId: l.parentId, ...(l.upstreamId ? { upstreamId: l.upstreamId } : {}),\n x: l.footprint?.x ?? 0, y: l.footprint?.y ?? 0, w: l.footprint?.w ?? 10, h: l.footprint?.h ?? 10\n }))\n // ์ธ์ ์คํธ ํ์ฅ ๋ฌผ์งํ(space facet #4) โ ํํ์ด ์๊ณ geo ๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ map ํํ ํฉ์ฑ.\n // \"์ธ์ ์คํธํ๋ฉด ์์๋ณผ ํ์ฅ(๋ด place)์ด ๋ฌ๋ค\"๋ ๊ณต๊ฐ ์ค์ฌ ์ ์ ๋ณด์ฅ(zero-to-twin): ์ปค๋ฅํฐ/ํ
ํ๋ฆฟ์ด\n // ํํ์ ์ ์ค๋ geo ๋ง ์์ผ๋ฉด ์์ฑ ์ง๋๋ก ์ฐฉ์ง. (area ํด๋ฆฌ๊ณค ๋ฌผ์งํ๋ ์ขํ ํฌ์ ํ์ โ space #3.)\n const geo = master.space.geo\n const givenReps = master.space.representations ?? []\n /*\n * โโ ์ด๋ฆ์ ์ง์ด๋ด์ง ์๋๋ค (2026-08-26) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ๊ธฐ๊ฐ ํฉ์ฑํ ํํ์ `name: '์์ฑ ์ง๋'` ๋ฅผ ๋ฃ๊ณ ์์๋ค. ์ด ์ธต์ ์ธ์ด ์ค๋ฆฝ์ด์ด์ผ ํ๋๋ฐ ํ๊ตญ์ด๊ฐ\n * ๊ทธ๋๋ก ์ ์ฅ๋๋ค.\n *\n * ๋ฑ๋ง ์ด์ (`twin.representation.map` ๊ฐ์ ๊ฒ)๋ฅผ ๋ฃ๋ ๊ธธ๋ ์๋๋ฐ ํํ์ง ์์๋ค. **ํํ์ ์ด๋ฆ์\n * ์ฌ๋์ด ๋ฐ๊ฟ ์ ์๋ ๊ฐ**์ด๊ณ , ๋ฐ๊ฟ ์ ์๋ ๊ฐ ์์ ์ด์ ๊ฐ ๋ค์ด ์์ผ๋ฉด ์ฌ๋์ด ํ ๋ฒ ๊ณ ์น๋ ์๊ฐ\n * ๊ทธ ์๋ฆฌ๋ง ์ด์ ๊ฐ ์๋๊ฒ ๋์ด ๊ท์น์ด ๋์ด ๋๋ค.\n *\n * ๊ทธ๋์ ์ด๋ฆ์ ๋ฃ์ง ์๋๋ค. ํ๋ฉด์ด ์ข
๋ฅ(`map`)๋ก ๋ถ๋ฅด๊ณ , ์ฌ๋์ด ๋ถ์ด๋ฉด ๊ทธ๋๋ถํฐ ๊ทธ ์ด๋ฆ์ด๋ค.\n */\n const representations =\n givenReps.length > 0\n ? givenReps\n : geo\n ? [{ id: 'r-map', type: 'map', primary: true, center: { lat: geo.lat, lon: geo.lon }, zoom: 17 }]\n : []\n if (representations.length === 0) {\n warnings.push(noViewableRepresentation())\n }\n const spaceContent = {\n width: master.space.width, depth: master.space.depth, unit: master.space.unit ?? 'm',\n geo, representations, primaryId: master.space.primaryId ?? representations[0]?.id,\n areas\n }\n\n return { model, spaceContent, warnings }\n}\n\n/**\n * ๋ค์ ์ฝ์ ์ฌ์ดํธ๋ฅผ ๊ณ ๋ฅธ๋ค โ **๊ธฐ์ตํด ๋ ์ฌ์ดํธ ํ๋๋ง**.\n *\n * ๋ชป ์ฐพ์ผ๋ฉด **์ฒซ ์ฌ์ดํธ๋ก ๋์ฐ์ง ์๋๋ค**: ๋ค๋ฅธ ํ์ฅ์ ๊ตฌ์กฐ๋ฅผ ์ด ํธ์์ ๋ฎ์ด์ฐ๋ ์ผ์ด๊ณ , ๊ทธ๊ฒ์ ์ค๋ฅ๊ฐ\n * ์๋๋ผ **์ค๋ฅ ์์ด ํ๋ฆฐ ๊ณต์ฅ**์ผ๋ก ๋ํ๋๋ค. ๊ธฐ์ต์ด ์๋ ์ ํธ์์ `undefined` ๋ฅผ ๋๋ ค์ฃผ๊ณ , ๋ถ๋ฅด๋ ์ชฝ์ด\n * ๋ง์คํฐ์ ์ ์ฒด(`source` = ์ธ์คํด์ค id)๋ก ์ฐพ๋ ๊ธธ์ ํํ๋ค.\n */\nexport function pickOriginSite<T extends { siteId: string }>(\n sites: readonly T[],\n origin: { siteId?: string } | undefined | null\n): { site?: T; reason?: 'no-remembered-site' | 'site-gone' } {\n const wanted = String(origin?.siteId ?? '').trim()\n if (!wanted) return { reason: 'no-remembered-site' }\n const site = sites.find(s => String(s.siteId) === wanted)\n return site ? { site } : { reason: 'site-gone' }\n}\n"]}
|
|
@@ -21,6 +21,33 @@ export declare class TwinReferenceResolver {
|
|
|
21
21
|
* `origin` ์ด ์๋ ํธ์(์ด ์๋ฆฌ๊ฐ ์๊ธฐ๊ธฐ ์ ์ ๋ง๋ค์ด์ง ๊ฒ)์ ๋ค์ ์ฝ์ ์ ์๋ค. ์ง์์ผ๋ก
|
|
22
22
|
* ํ
ํ๋ฆฟ์ ๊ณ ๋ฅด๊ฑฐ๋ ์ฒซ ๋ ํผ๋ฐ์ค๋ฅผ ์ง์ง ์๋๋ค โ ์๋ฑํ ์๋ณธ์ผ๋ก ํ์ฅ์ ๋ฎ๋ ๊ฒ์ด ํจ์ฌ ๋์๋ค.
|
|
23
23
|
*/
|
|
24
|
+
/**
|
|
25
|
+
* **๊ทธ ๋ฒํธ๋ค์ด ๋ฌด์์ด์๋** โ ๊ตฌ๋ฉ์ ๋ง๋ฌ์ ๋ ์๋ณธ์ ๋ฌป๋๋ค.
|
|
26
|
+
*
|
|
27
|
+
* `fillTwinScope` ๊ฐ ใ418 ๋ค์์ด 420ใ์ด๋ผ๊ณ ๋ฉ์ถ๋ฉด, ๊ทธ 419 ๊ฐ ๋ฌด์์ด์๋์ง ์์์ผ ๋ค์์
|
|
28
|
+
* ์ ํ ์ ์๋ค. ๊ทธ ๊ธธ์ด ์์ด์ ์ฌ๋์ด ์๋ณธ DB ๋ฅผ ์์ผ๋ก ๋ค์ก๋ค.
|
|
29
|
+
*
|
|
30
|
+
* **ํ์ ํ์ง ์๋๋ค.** ์๋ณธ์ด ์๋ ๊ฒ์ ๊ทธ๋๋ก ๋ธ๋ค โ `lost` ๋ ใ๋ฒํธ๋ ๋๊ฐ๋๋ฐ ํ์ด ์๋คใ์ด์ง
|
|
31
|
+
* ใํฌ๊ธฐํด๋ ๋๋คใ๊ฐ ์๋๋ค. ๊ทธ ํ๋จ์ ๋๋๋ฆด ์ ์์ด์(์ปค์๊ฐ ์ง๋๊ฐ๋ฉด ๋์ด๋ค) ์ฌ๋์ ๋ชซ์ด๋ค.
|
|
32
|
+
*/
|
|
33
|
+
twinSeqReport(instanceId: string, scope: string, from: number, to: number, context: ResolverContext): Promise<any>;
|
|
34
|
+
/**
|
|
35
|
+
* **๋น ์ง ๊ตฌ๊ฐ์ ๋ค์ ๋ฐ๋๋ค** โ ํ
์ ๋ฐ๋์ ๋์นฉ๋๋ค: ์ฐ๋ฆฌ๊ฐ ๋ด๋ ค๊ฐ ์์ ๋, ๊ทธ์ชฝ์ด ๋ชป ๋ณด๋์ ๋.
|
|
36
|
+
*
|
|
37
|
+
* โโ ์ ๋ฌธ์ด ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
38
|
+
* ๋ฒํธ๊ฐ ๋น๋ฉด `takeInSequence` ๊ฐ ์์์ฑ๋๋ค. ๊ทธ๋ฐ๋ฐ **์์์ฑ ๋ค ๊ทธ ์ฌ์ด๋ฅผ ์ฑ์ฐ๋ ๊ธธ์ด ์์์ต๋๋ค.**
|
|
39
|
+
* `fillSince` ๋ 2026-08-31 ๋ถํฐ ์์๊ณ ๋ถ๋ฅด๋ ๊ณณ์ด 0๊ณณ์ด์์ต๋๋ค.
|
|
40
|
+
*
|
|
41
|
+
* ์ค์ ๋ก plant ์์๋ฐ์ค์ 1~20 ์ ์๊ณ ๋์ฐพ์ ๋ฐฉ๋ฒ์ด ์๋ ์ํ๋ฅผ ๋ง๋ฌ์ต๋๋ค.
|
|
42
|
+
*
|
|
43
|
+
* โโ `from` ์ ์์ ๊ตฌ๊ฐ์ ๋์ฐพ์ ๋๋ง โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
44
|
+
* ์ฃผ์ง ์์ผ๋ฉด ์ปค์๋ถํฐ ์ด์ด ๋ฐ์ต๋๋ค. ์ฃผ๋ฉด **๊ทธ ๋ฒํธ๋ถํฐ ๋ค์ ๋ฌป์ต๋๋ค** โ ์ด๋ฏธ ๋ค์ด๊ฐ ๊ฒ์ ์ ์
|
|
45
|
+
* ๊ฒฝ๊ณ๊ฐ ๋ํ์ด๋ก ๊ฑฐ๋ฅด๋ฏ๋ก ๋ ๋ฒ ์์ง ์์ต๋๋ค.
|
|
46
|
+
*
|
|
47
|
+
* ์ ์ฅ๋ ์ปค์๋ฅผ ๋๋๋ฆฌ์ง ์์ต๋๋ค. `fillSince` ๋ ๋ฒํธ ๊ฒ์ฌ๋ฅผ ์ง๋ ๋งํผ๋ง ์ ์ผ๋ฏ๋ก, ๋์ฐพ์ ๋ค
|
|
48
|
+
* ์ปค์๊ฐ ์๋ ์๋ฆฌ๋ณด๋ค ์์์ง ์์ต๋๋ค.
|
|
49
|
+
*/
|
|
50
|
+
fillTwinScope(instanceId: string, scope: string, context: ResolverContext, from?: number, maxPages?: number): Promise<any>;
|
|
24
51
|
resyncTwin(instanceId: string, context: ResolverContext): Promise<any>;
|
|
25
52
|
/** ๊ธฐ์ตํด ๋ ์์ฒ์์ ๋ง์คํฐ๋ฅผ ๋ค์ ์ป๋๋ค โ ์ด๋ํฐ๋ ํ
ํ๋ฆฟ์ด๋ ์ด ํ ๊ณณ์์ ๊ฐ๋ฆฐ๋ค. */
|
|
26
53
|
private masterFromOrigin;
|