@things-factory/headless-twin 10.0.8 โ 10.0.10
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/attention-digest.d.ts +52 -0
- package/dist-server/engine/attention-digest.js +76 -0
- package/dist-server/engine/attention-digest.js.map +1 -0
- package/dist-server/engine/canonical-ingest.d.ts +2 -2
- package/dist-server/engine/canonical-ingest.js +24 -2
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/command-routing.d.ts +33 -0
- package/dist-server/engine/command-routing.js +53 -0
- package/dist-server/engine/command-routing.js.map +1 -0
- package/dist-server/engine/energy-topology.d.ts +86 -0
- package/dist-server/engine/energy-topology.js +144 -0
- package/dist-server/engine/energy-topology.js.map +1 -0
- package/dist-server/engine/index.d.ts +11 -0
- package/dist-server/engine/index.js +17 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/kpi-baseline.d.ts +78 -0
- package/dist-server/engine/kpi-baseline.js +123 -0
- package/dist-server/engine/kpi-baseline.js.map +1 -0
- package/dist-server/engine/kpi-fold.d.ts +137 -1
- package/dist-server/engine/kpi-fold.js +225 -0
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.d.ts +32 -1
- package/dist-server/engine/kpi-query.js +262 -20
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/kpi-target.d.ts +17 -0
- package/dist-server/engine/kpi-target.js +24 -2
- package/dist-server/engine/kpi-target.js.map +1 -1
- package/dist-server/engine/live-attentions.d.ts +1 -0
- package/dist-server/engine/live-attentions.js +7 -1
- package/dist-server/engine/live-attentions.js.map +1 -1
- package/dist-server/engine/live-feed-registry.d.ts +25 -0
- package/dist-server/engine/live-feed-registry.js +51 -0
- package/dist-server/engine/live-feed-registry.js.map +1 -0
- package/dist-server/engine/load-meter.d.ts +181 -0
- package/dist-server/engine/load-meter.js +267 -0
- package/dist-server/engine/load-meter.js.map +1 -0
- package/dist-server/engine/local-declarations.d.ts +262 -0
- package/dist-server/engine/local-declarations.js +528 -0
- package/dist-server/engine/local-declarations.js.map +1 -0
- package/dist-server/engine/model-basis.d.ts +39 -6
- package/dist-server/engine/model-basis.js +69 -9
- package/dist-server/engine/model-basis.js.map +1 -1
- package/dist-server/engine/model-vocabulary.d.ts +17 -0
- package/dist-server/engine/model-vocabulary.js +81 -0
- package/dist-server/engine/model-vocabulary.js.map +1 -0
- package/dist-server/engine/oee-accumulator.d.ts +28 -0
- package/dist-server/engine/oee-accumulator.js +26 -1
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/operation-basis.d.ts +32 -0
- package/dist-server/engine/operation-basis.js +87 -0
- package/dist-server/engine/operation-basis.js.map +1 -0
- package/dist-server/engine/property-effects.d.ts +30 -0
- package/dist-server/engine/property-effects.js +192 -0
- package/dist-server/engine/property-effects.js.map +1 -0
- package/dist-server/engine/runtime-key.d.ts +15 -0
- package/dist-server/engine/runtime-key.js +64 -0
- package/dist-server/engine/runtime-key.js.map +1 -0
- package/dist-server/engine/spec-coverage.js +3 -3
- package/dist-server/engine/spec-coverage.js.map +1 -1
- package/dist-server/engine/state-axes.d.ts +21 -0
- package/dist-server/engine/state-axes.js +59 -0
- package/dist-server/engine/state-axes.js.map +1 -0
- package/dist-server/engine/structure-diff.js +1 -1
- package/dist-server/engine/structure-diff.js.map +1 -1
- package/dist-server/engine/travel-estimator.d.ts +9 -2
- package/dist-server/engine/travel-estimator.js +11 -6
- package/dist-server/engine/travel-estimator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +418 -57
- package/dist-server/engine/twin-engine.js +1599 -306
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/engine/warm-start.d.ts +93 -13
- package/dist-server/engine/warm-start.js +114 -14
- package/dist-server/engine/warm-start.js.map +1 -1
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +17 -11
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.d.ts +5 -0
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +48 -0
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -0
- package/dist-server/migrations/index.d.ts +2 -0
- package/dist-server/migrations/index.js +10 -0
- package/dist-server/migrations/index.js.map +1 -0
- package/dist-server/service/index.d.ts +3 -2
- package/dist-server/service/index.js +25 -17
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/discovery-result.d.ts +34 -0
- package/dist-server/service/reference/discovery-result.js +84 -0
- package/dist-server/service/reference/discovery-result.js.map +1 -0
- package/dist-server/service/reference/ingest-space.d.ts +53 -0
- package/dist-server/service/reference/ingest-space.js +79 -0
- package/dist-server/service/reference/ingest-space.js.map +1 -0
- package/dist-server/service/reference/knob-defaults.d.ts +20 -0
- package/dist-server/service/reference/knob-defaults.js +59 -0
- package/dist-server/service/reference/knob-defaults.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +23 -0
- package/dist-server/service/reference/reference-live.js +123 -6
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +227 -11
- package/dist-server/service/reference/reference-master.js +206 -25
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +33 -3
- package/dist-server/service/reference/reference-resolver.js +290 -23
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/template-registry.d.ts +19 -3
- package/dist-server/service/reference/template-registry.js.map +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.d.ts +8 -1
- package/dist-server/service/twin-attention/twin-attention-query.js +39 -8
- package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
- package/dist-server/service/twin-audit/command-audit.d.ts +37 -0
- package/dist-server/service/twin-audit/command-audit.js +53 -0
- package/dist-server/service/twin-audit/command-audit.js.map +1 -0
- package/dist-server/service/twin-audit/index.d.ts +4 -0
- package/dist-server/service/twin-audit/index.js +8 -0
- package/dist-server/service/twin-audit/index.js.map +1 -0
- package/dist-server/service/twin-audit/twin-audit-event.d.ts +24 -0
- package/dist-server/service/twin-audit/twin-audit-event.js +125 -0
- package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -0
- package/dist-server/service/twin-audit/twin-audit-query.d.ts +4 -0
- package/dist-server/service/twin-audit/twin-audit-query.js +76 -0
- package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -0
- package/dist-server/service/twin-control/twin-control-mutation.d.ts +2 -0
- package/dist-server/service/twin-control/twin-control-mutation.js +50 -11
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +1 -1
- package/dist-server/service/twin-event/twin-event-keys.js +1 -1
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +14 -5
- package/dist-server/service/twin-event/twin-event.js +46 -14
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.d.ts +13 -0
- package/dist-server/service/twin-forecast/forecast-metrics.js +57 -0
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -0
- package/dist-server/service/twin-forecast/forecast-tuning.d.ts +12 -0
- package/dist-server/service/twin-forecast/forecast-tuning.js +44 -0
- package/dist-server/service/twin-forecast/forecast-tuning.js.map +1 -0
- package/dist-server/service/twin-forecast/gap-analytics.d.ts +28 -2
- package/dist-server/service/twin-forecast/gap-analytics.js +43 -17
- package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +219 -39
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-instance/twin-instance.d.ts +38 -5
- package/dist-server/service/twin-instance/twin-instance.js +66 -18
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/twin-journal-query.d.ts +11 -4
- package/dist-server/service/twin-journal/twin-journal-query.js +95 -15
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +11 -5
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +46 -27
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.d.ts +1 -0
- package/dist-server/service/twin-metrics/twin-metrics-query.js +63 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
- package/dist-server/service/twin-model/epcis-coverage.d.ts +14 -0
- package/dist-server/service/twin-model/epcis-coverage.js +174 -0
- package/dist-server/service/twin-model/epcis-coverage.js.map +1 -0
- package/dist-server/service/twin-model/iec61850-coverage.d.ts +14 -0
- package/dist-server/service/twin-model/iec61850-coverage.js +98 -0
- package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -0
- package/dist-server/service/twin-model/index.d.ts +13 -0
- package/dist-server/service/twin-model/index.js +29 -0
- package/dist-server/service/twin-model/index.js.map +1 -0
- package/dist-server/service/twin-model/isa95-coverage.d.ts +48 -0
- package/dist-server/service/twin-model/isa95-coverage.js +155 -0
- package/dist-server/service/twin-model/isa95-coverage.js.map +1 -0
- package/dist-server/service/twin-model/project-structure.d.ts +16 -0
- package/dist-server/service/twin-model/project-structure.js +173 -0
- package/dist-server/service/twin-model/project-structure.js.map +1 -0
- package/dist-server/service/twin-model/standard-coverage.d.ts +9 -0
- package/dist-server/service/twin-model/standard-coverage.js +37 -0
- package/dist-server/service/twin-model/standard-coverage.js.map +1 -0
- package/dist-server/service/twin-model/twin-equipment.d.ts +64 -0
- package/dist-server/service/twin-model/twin-equipment.js +134 -0
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -0
- package/dist-server/service/twin-model/twin-lineage-query.d.ts +3 -0
- package/dist-server/service/twin-model/twin-lineage-query.js +206 -0
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-location.d.ts +58 -0
- package/dist-server/service/twin-model/twin-location.js +130 -0
- package/dist-server/service/twin-model/twin-location.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-item-query.d.ts +141 -0
- package/dist-server/service/twin-model/twin-model-item-query.js +852 -0
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-mutation.d.ts +57 -0
- package/dist-server/service/twin-model/twin-model-mutation.js +490 -0
- package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-query.d.ts +43 -0
- package/dist-server/service/twin-model/twin-model-query.js +551 -0
- package/dist-server/service/twin-model/twin-model-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-tree-query.d.ts +3 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js +158 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-operation.d.ts +61 -0
- package/dist-server/service/twin-model/twin-operation.js +137 -0
- package/dist-server/service/twin-model/twin-operation.js.map +1 -0
- package/dist-server/service/twin-space/move-space.d.ts +65 -0
- package/dist-server/service/twin-space/move-space.js +166 -0
- package/dist-server/service/twin-space/move-space.js.map +1 -0
- package/dist-server/service/twin-space/space-integrity.d.ts +97 -0
- package/dist-server/service/twin-space/space-integrity.js +182 -0
- package/dist-server/service/twin-space/space-integrity.js.map +1 -0
- package/dist-server/service/twin-space/twin-space-area.js +4 -4
- package/dist-server/service/twin-space/twin-space-area.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-representation.js +6 -6
- package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.d.ts +63 -1
- package/dist-server/service/twin-space/twin-space-resolver.js +365 -18
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-server/service/twin-space/twin-space.d.ts +17 -1
- package/dist-server/service/twin-space/twin-space.js +15 -5
- package/dist-server/service/twin-space/twin-space.js.map +1 -1
- package/dist-server/service/twin-state/twin-state-subscription.js +1 -1
- package/dist-server/service/twin-state/twin-state-subscription.js.map +1 -1
- package/dist-server/service/twin-structure/twin-structure.d.ts +1 -1
- package/dist-server/service/twin-structure/twin-structure.js +8 -7
- package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
- package/dist-server/service/twin-target/twin-target-resolver.js +21 -4
- package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
- package/dist-shared/axis-read.d.ts +12 -0
- package/dist-shared/axis-read.js +32 -0
- package/dist-shared/axis-read.js.map +1 -0
- package/dist-shared/entity-delta.d.ts +29 -0
- package/dist-shared/entity-delta.js +287 -0
- package/dist-shared/entity-delta.js.map +1 -0
- package/dist-shared/kpi-broadcast.d.ts +4 -0
- package/dist-shared/kpi-broadcast.js +16 -0
- package/dist-shared/kpi-broadcast.js.map +1 -0
- package/dist-shared/twin-level.d.ts +23 -0
- package/dist-shared/twin-level.js +52 -0
- package/dist-shared/twin-level.js.map +1 -0
- package/package.json +14 -12
- package/server/engine/attention-digest.ts +102 -0
- package/server/engine/canonical-ingest.ts +36 -4
- package/server/engine/command-routing.ts +67 -0
- package/server/engine/energy-topology.ts +189 -0
- package/server/engine/index.ts +17 -0
- package/server/engine/kpi-baseline.ts +202 -0
- package/server/engine/kpi-fold.ts +389 -1
- package/server/engine/kpi-query.ts +295 -22
- package/server/engine/kpi-target.ts +24 -2
- package/server/engine/live-attentions.ts +7 -2
- package/server/engine/live-feed-registry.ts +58 -0
- package/server/engine/load-meter.ts +384 -0
- package/server/engine/local-declarations.ts +700 -0
- package/server/engine/model-basis.ts +78 -10
- package/server/engine/model-vocabulary.ts +82 -0
- package/server/engine/oee-accumulator.ts +34 -1
- package/server/engine/operation-basis.ts +100 -0
- package/server/engine/property-effects.ts +199 -0
- package/server/engine/runtime-key.ts +58 -0
- package/server/engine/spec-coverage.ts +3 -3
- package/server/engine/state-axes.ts +60 -0
- package/server/engine/structure-diff.ts +1 -1
- package/server/engine/travel-estimator.ts +11 -6
- package/server/engine/twin-engine.ts +1710 -297
- package/server/engine/warm-start.ts +207 -22
- package/server/index.ts +13 -10
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +43 -0
- package/server/migrations/index.ts +7 -0
- package/server/service/index.ts +9 -1
- package/server/service/reference/discovery-result.ts +95 -0
- package/server/service/reference/ingest-space.ts +104 -0
- package/server/service/reference/knob-defaults.ts +59 -0
- package/server/service/reference/reference-live.ts +121 -6
- package/server/service/reference/reference-master.ts +362 -35
- package/server/service/reference/reference-resolver.ts +307 -23
- package/server/service/reference/template-registry.ts +20 -5
- package/server/service/twin-attention/twin-attention-query.ts +43 -6
- package/server/service/twin-audit/command-audit.ts +81 -0
- package/server/service/twin-audit/index.ts +5 -0
- package/server/service/twin-audit/twin-audit-event.ts +112 -0
- package/server/service/twin-audit/twin-audit-query.ts +72 -0
- package/server/service/twin-control/twin-control-mutation.ts +53 -13
- package/server/service/twin-event/twin-event-keys.ts +1 -1
- package/server/service/twin-event/twin-event.ts +52 -15
- package/server/service/twin-forecast/forecast-metrics.ts +60 -0
- package/server/service/twin-forecast/forecast-tuning.ts +40 -0
- package/server/service/twin-forecast/gap-analytics.ts +48 -9
- package/server/service/twin-forecast/twin-forecast-query.ts +211 -38
- package/server/service/twin-instance/twin-instance.ts +127 -22
- package/server/service/twin-journal/twin-journal-query.ts +108 -14
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +40 -23
- package/server/service/twin-metrics/twin-metrics-query.ts +60 -3
- package/server/service/twin-model/epcis-coverage.ts +195 -0
- package/server/service/twin-model/iec61850-coverage.ts +117 -0
- package/server/service/twin-model/index.ts +25 -0
- package/server/service/twin-model/isa95-coverage.ts +190 -0
- package/server/service/twin-model/project-structure.ts +199 -0
- package/server/service/twin-model/standard-coverage.ts +35 -0
- package/server/service/twin-model/twin-equipment.ts +150 -0
- package/server/service/twin-model/twin-lineage-query.ts +193 -0
- package/server/service/twin-model/twin-location.ts +140 -0
- package/server/service/twin-model/twin-model-item-query.ts +848 -0
- package/server/service/twin-model/twin-model-mutation.ts +503 -0
- package/server/service/twin-model/twin-model-query.ts +537 -0
- package/server/service/twin-model/twin-model-tree-query.ts +180 -0
- package/server/service/twin-model/twin-operation.ts +150 -0
- package/server/service/twin-space/move-space.ts +262 -0
- package/server/service/twin-space/space-integrity.ts +293 -0
- package/server/service/twin-space/twin-space-area.ts +4 -4
- package/server/service/twin-space/twin-space-representation.ts +6 -6
- package/server/service/twin-space/twin-space-resolver.ts +365 -22
- package/server/service/twin-space/twin-space.ts +40 -6
- package/server/service/twin-state/twin-state-subscription.ts +1 -1
- package/server/service/twin-structure/twin-structure.ts +10 -7
- package/server/service/twin-target/twin-target-resolver.ts +22 -4
- package/shared/axis-read.ts +28 -0
- package/shared/entity-delta.ts +286 -0
- package/shared/kpi-broadcast.ts +13 -0
- package/shared/twin-level.ts +48 -0
- package/test/adopt-structure-live.test.ts +133 -0
- package/test/attention-digest.test.ts +135 -0
- package/test/axis-read.test.ts +87 -0
- package/test/boot-resume.test.ts +205 -0
- package/test/canonical-ingest-vocabularies.test.ts +118 -0
- package/test/capability-mapping.test.ts +5 -5
- package/test/command-routing.test.ts +61 -0
- package/test/declaration-reaches-model.test.ts +178 -0
- package/test/discovery-result.test.ts +75 -0
- package/test/energy-topology.test.ts +113 -0
- package/test/entity-delta.test.ts +195 -25
- package/test/event-time-column.test.ts +67 -0
- package/test/forecast-metrics.test.ts +71 -0
- package/test/forecast-tuning.test.ts +42 -0
- package/test/gap-analytics.test.ts +34 -7
- package/test/ingest-bench.test.ts +9 -9
- package/test/ingest-running-guard.test.ts +136 -0
- package/test/ingest-space.test.ts +78 -0
- package/test/instance-cache-lifecycle.test.ts +110 -0
- package/test/kernel-kind-guard.test.ts +96 -0
- package/test/knob-defaults.test.ts +72 -0
- package/test/kpi-baseline-db.test.ts +216 -0
- package/test/kpi-baseline.test.ts +196 -0
- package/test/kpi-fold.test.ts +393 -2
- package/test/kpi-query-bench.test.ts +130 -0
- package/test/lineage-survives-restart.test.ts +203 -0
- package/test/live-feed-registry.test.ts +67 -0
- package/test/live-kernel-facts.test.ts +161 -0
- package/test/live-mirror-parity.test.ts +54 -14
- package/test/load-meter.test.ts +314 -0
- package/test/local-declarations.test.ts +554 -0
- package/test/master-to-twin.test.ts +128 -36
- package/test/model-basis.test.ts +56 -1
- package/test/model-vocabulary.test.ts +114 -0
- package/test/move-space.test.ts +149 -0
- package/test/mutation-gate.test.ts +122 -0
- package/test/oee-accumulator.test.ts +90 -7
- package/test/operation-basis.test.ts +100 -0
- package/test/operations-capability-db.test.ts +165 -0
- package/test/project-structure-db.test.ts +226 -0
- package/test/projection-reaches-screen.test.ts +272 -0
- package/test/property-effects.test.ts +96 -0
- package/test/registry-key-guard.test.ts +80 -0
- package/test/resync-origin-site.test.ts +77 -0
- package/test/runtime-key.test.ts +66 -0
- package/test/scale-twin-bench.test.ts +7 -7
- package/test/snapshot-freshness.test.ts +60 -0
- package/test/space-integrity.test.ts +223 -0
- package/test/standard-coverage.test.ts +94 -0
- package/test/state-axes.test.ts +74 -0
- package/test/streamline-e2e.test.ts +16 -16
- package/test/structure-revision-db.test.ts +16 -15
- package/test/tenant-registry-db.test.ts +149 -0
- package/test/twin-audit.test.ts +83 -0
- package/test/twin-model-item-db.test.ts +275 -0
- package/test/twin-model-tree-db.test.ts +176 -0
- package/test/twin-origin-resync.test.ts +114 -0
- package/test/warm-start-seam.test.ts +140 -0
- package/test/warm-start.test.ts +223 -4
- package/tsconfig.json +6 -1
- package/tsconfig.shared.json +23 -0
- package/tsconfig.shared.tsbuildinfo +1 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/dist-server/engine/entity-delta.d.ts +0 -19
- package/dist-server/engine/entity-delta.js +0 -161
- package/dist-server/engine/entity-delta.js.map +0 -1
- package/dist-server/service/twin-event/backfill-keys.d.ts +0 -11
- package/dist-server/service/twin-event/backfill-keys.js +0 -63
- package/dist-server/service/twin-event/backfill-keys.js.map +0 -1
- package/dist-server/tsconfig.tsbuildinfo +0 -1
- package/server/engine/entity-delta.ts +0 -169
- package/server/service/twin-event/backfill-keys.ts +0 -72
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"twin-model-item-query.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-model-item-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Int, Query, Resolver } from 'type-graphql'\n\nimport { ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { unwrapState } from '../../engine/warm-start.js'\nimport { propertyEffectsOf } from '../../engine/property-effects.js'\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinLocation } from './twin-location.js'\nimport { TwinEquipment } from './twin-equipment.js'\nimport { TwinOperation } from './twin-operation.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\n\n/* ์ปค๋ ๋ฐํ์ ๋ก๋ โ ์ถยท๊ด๊ณยท์์ฑ ์ ์ธ์ SSOT. ์ด ํ์ผ์ ๋๋ฉ์ธ ๋ชจ์์ ์์ง ์๋๋ค. */\nconst { TWIN_AXES, TWIN_RELATIONS, axisInfo, axisSource, documentPath, relationsFrom, relationsTo, propertiesOf } = require('@operato/twin-kernel')\n\n/**\n * ์ถ โ ๊ทธ ์ถ์ด ์ด๋ฏธ **ํ์ผ๋ก ์ฎ๊ฒจ์ก๋**, ๊ทธ๋ฆฌ๊ณ ํ์ ์ด๋ ์ปฌ๋ผ์ด id ์ธ๊ฐ.\n *\n * ์ฎ๊ฒจ์ง ์ถ์ **DB ๊ฐ ํ์ด์งํ๊ณ ์ผ๋ค.** ์์ง์ธ ์ถ์ ๋ฌธ์ ๋ฐฐ์ด์ ์ฝ์ด์ผ ํ๊ณ , ๊ทธ ์ฐจ์ด๋ฅผ ์๋ต์ด\n * `basis` ๋ก ๋ฐํ๋ค โ ๋ฐํ์ง ์์ผ๋ฉด \"์ด ์ถ์ ๊ฒ์์ด ๋๋๋ฐ ์ ์ถ์ ์ ๋๋ฆฐ๊ฐ\" ๋ฅผ ์๋ฌด๋ ์ค๋ช
ํ ์ ์๋ค.\n */\nconst ROW_BACKED: Record<string, { entity: any; idColumn: string; order: any }> = {\n locations: { entity: TwinLocation, idColumn: 'locationId', order: { locationId: 'ASC' } },\n equipment: { entity: TwinEquipment, idColumn: 'equipmentId', order: { equipmentId: 'ASC' } },\n operations: { entity: TwinOperation, idColumn: 'operationKey', order: { seq: 'ASC' } }\n}\n\n/** `productionSpec.definition.recipes` ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ๋ฌธ์์์ ๋ฐ๋ผ๊ฐ๋ค. */\nconst at = (o: any, path: string) => path.split('.').reduce((a: any, k: string) => (a == null ? undefined : a[k]), o)\n\n/**\n * ๋ฌธ์ ํญ๋ชฉ์ **์๋ณ์** โ ์ถ๋ง๋ค ์ด๋ฆ์ด ๋ค๋ฅด๋ค(์๋ฆฌ๋ `id`, ๊ณต์ ์ `key`, ๋ ์ํผ๋ `key`).\n *\n * ๋๋ฉ์ธ ๋ชจ์์ ์ฝ๋๊ฐ ์๋ ๊ฒ์ด ์๋๋ผ **์๋ณ์ ๊ด๋ก**๋ฅผ ์๋ ๊ฒ์ด๋ค. ํ๋ณด๋ฅผ ์์๋๋ก ๋ณด๊ณ ์ฒซ\n * ๊ฐ์ ์ด๋ค. ํ๋๋ ์์ผ๋ฉด ๊ทธ ํญ๋ชฉ์ ๊ฐ๋ฆฌํฌ ์ ์์ผ๋ฏ๋ก `null` โ ๋ชฉ๋ก์์ ๋นผ์ง ์๊ณ **id ์์**์ผ๋ก\n * ๋ธ๋ค(์กฐ์ฉํ ๋น ์ง๋ฉด ๊ฑด์๊ฐ ์ ๋ง๋๋ค).\n */\nconst idOf = (o: any): string | null => (typeof o === 'string' ? o : o?.id ?? o?.key ?? o?.gtin ?? null)\n\n/** ๊ฒ์ โ ํญ๋ชฉ์ ๊ฐ ์ด๋๋ ๊ฑธ๋ฆฌ๋ฉด ๋ง๋ ๊ฒ์ผ๋ก ๋ณธ๋ค. ์ถ๋ง๋ค ๊ฒ์ ์ปฌ๋ผ์ ์ ํด ๋๋ฉด ์ถ์ด ๋ ๋๋ง๋ค ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์ผ ํ๋ค. */\nfunction matches(o: any, q: string): boolean {\n if (!q) return true\n const needle = q.toLowerCase()\n const walk = (v: any, depth: number): boolean => {\n if (v == null || depth > 3) return false\n if (typeof v === 'string' || typeof v === 'number') return String(v).toLowerCase().includes(needle)\n if (Array.isArray(v)) return v.some(x => walk(x, depth + 1))\n if (typeof v === 'object') return Object.values(v).some(x => walk(x, depth + 1))\n return false\n }\n return walk(o, 0)\n}\n\n/**\n * ํญ๋ชฉ ์กฐํ โ **๊ฐ๋
์์ ๋ชฉ๋ก**(โข)๊ณผ **ํญ๋ชฉ ํ๋์ ์์ธ**(โฃ).\n *\n * โโ ์ด ํ์ผ์ด ๋๋ฉ์ธ์ ์์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ด๋ ์ถ์ด ์๊ณ ๋ฌด์์ ๊ฐ๋ฆฌํค๋์ง๋ **์ปค๋ ์นดํ๋ก๊ทธ๊ฐ ์ ์ธ**ํ๋ค(`TWIN_AXES`ยท`TWIN_RELATIONS`).\n * ๊ทธ๋์ ์ผ๋์ ๋ํฌ๋์ด๋ ์๋์ง์ ๊ณ๋๊ธฐ๊ฐ ๋์ด๋ ์ฌ๊ธฐ ์๋ ๊ฒ์ด ์๋ค(ADR-0031). ์ด ํ์ผ์\n * ๋๋ฉ์ธ ์ด๋ฆ์ด ํ ๋ฒ๋ ๋์ค์ง ์๋ ๊ฒ์ด ๊ทธ ์ฆ๊ฑฐ๋ค.\n *\n * โโ ์กฐ์ฉํ ์๋ฅด์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ชฉ๋ก์ ํญ์ **์ด ๊ฑด์**์ ํจ๊ป ์จ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์
๋์ง(`basis`)๋ฅผ ๋ฐํ๋ค โ ํ์ด๋ฉด DB ๊ฐ\n * ํ์ด์งํ๊ณ , ๋ฌธ์๋ฉด ์๋ฒ๊ฐ ๋ฌธ์๋ฅผ ํต์งธ๋ก ์ฝ์ด ์๋ผ ๋๋ค. ํ์๋ ๊ท๋ชจ์์ ํ๊ณ๊ฐ ๋๋ฏ๋ก ๊ทธ ์ฌ์ค์ด\n * ํ๋ฉด์ ๋๋ฌ๋์ผ ์ด์ฃผ ์๋ ฅ์ด ์ด์ ์๋ค.\n */\n@Resolver()\nexport class TwinModelItemQuery {\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'Page through the items of one standard concept in a twin. Always returns the total and how it was counted (rows = the database paged it, document = the server read the whole document and sliced).'\n })\n async twinModelEntities(\n @Arg('instanceId') instanceId: string,\n @Arg('axis') axis: string,\n @Ctx() context: ResolverContext,\n @Arg('search', { nullable: true }) search?: string,\n @Arg('offset', type => Int, { nullable: true }) offset?: number,\n @Arg('limit', type => Int, { nullable: true }) limit?: number,\n /**\n * ์ด๋ ์๊ฐ์ ์ฌ์ค์ธ๊ฐ โ **๊ด์ธก ์ถ์๋ง ๋ป์ด ์๋ค.**\n *\n * ์ ์ธ ์ถ์ ์๊ฐ์ถ์ด ์๋ค(๊ทธ ์์ ์ ์ ์ธ์ ๊ตฌ์กฐ ๋ฆฌ๋น์ ์ด ๋ตํ๋ค). ๊ทธ๋์ ๋ฌธ์ ์ถ์ ์ด ๊ฐ์ ์ฃผ๋ฉด\n * ์ฐ์ง ์๋๋ค โ ๋ฌด์ํ๋ค๋ ์ฌ์ค์ ์๋ต์ `basis` ๊ฐ ๋งํ๋ค(`document`).\n */\n @Arg('untilTime', { nullable: true }) untilTime?: string\n ): Promise<any | null> {\n const domainId = context.state.domain.id\n const info = axisInfo(axis)\n /* ๋ชจ๋ฅด๋ ์ถ์ **๊ฑฐ์ ํ๋ค.** ๋น ๋ชฉ๋ก์ผ๋ก ๋ตํ๋ฉด \"์ด ๊ฐ๋
์ ๋น์ด ์๋ค\" ๋ก ์ฝํ๊ณ , ์คํ ํ๋๊ฐ\n \"์ฐ๋ฆฌ ํธ์์๋ ๊ทธ๊ฒ ์๋ค\" ๋ ๊ฒฐ๋ก ์ผ๋ก ๊ตณ๋๋ค. */\n if (!info) throw new Error(`unknown concept axis: \"${axis}\" โ the kernel catalog does not declare it`)\n\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return null\n\n const take = Math.min(Math.max(limit ?? 50, 1), 200)\n const skip = Math.max(offset ?? 0, 0)\n const q = (search ?? '').trim()\n /* ์๊ฐ ์ปค์๋ ์๊ฐ์ถ์ ๊ฐ์ง ์ถ๋ง ์ด๋ค(`historical`) โ ์ ์ธ ์ถ์์๋ ๋ป์ด ์๋ค. */\n const at_ = axisInfo(axis)?.historical ? untilTime || null : null\n const row = ROW_BACKED[axis]\n\n if (row && !q) {\n /* ๊ฒ์์ด๊ฐ ์์ผ๋ฉด **DB ๊ฐ ํ์ด์งํ๋ค** โ ์ด๊ฒ์ด ๊ท๋ชจ์์ ์ ์ผํ๊ฒ ์ฑ๋ฆฝํ๋ ๊ธธ์ด๋ค. */\n const repo = getRepository(row.entity)\n const where = { domain: { id: domainId } as any, instance: { id: inst.id } as any }\n const [rows, total] = await repo.findAndCount({ where, order: row.order, skip, take })\n return {\n axis,\n label: info.label,\n basis: 'rows',\n total,\n offset: skip,\n /* ๋ชฉ๋ก๋ ๋ฑ๊ธ ์ด๋ฆ์ ์ด๋ค โ ๋ชฉ๋ก ์นธ์ `assembler-op` ์ด ๊ทธ๋๋ก ์๋ฉด ๋ชฉ๋ก์ด ์ ์ผ์ ๋ชป ํ๋ค. */\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n items: rows.map((r: any) => this.rowItem(axis, r))\n }\n }\n\n if (row && q) {\n /*\n * ๊ฒ์์ ์์ง DB ๋ก ๋ด๋ฆฌ์ง ์์๋ค. **๊ทธ ์ฌ์ค์ ๋ฐํ๋ค**(`basis: 'rows-scanned'`) โ\n * ํ๋ด๋ก ๋ฎ์ผ๋ฉด ๊ท๋ชจ๊ฐ ์ค๋ ๋ ๊น์ง ์๋ฌด๋ ์ด ํ๊ณ๋ฅผ ๋ชจ๋ฅธ๋ค. ํ๋ ๊ฑด์๋ฅผ ์ํ์ผ๋ก ๋ง๊ณ ,\n * ์ํ์ ๋ฟ์์ผ๋ฉด ์๋ ธ๋ค๊ณ ๋งํ๋ค(์กฐ์ฉํ ์๋ฅด์ง ์๋๋ค).\n */\n const SCAN_MAX = 5000\n const repo = getRepository(row.entity)\n const where = { domain: { id: domainId } as any, instance: { id: inst.id } as any }\n const rows = await repo.find({ where, order: row.order, take: SCAN_MAX })\n const hit = rows.filter((r: any) => matches(this.rowItem(axis, r), q))\n return {\n axis,\n label: info.label,\n basis: 'rows-scanned',\n total: hit.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n scanned: rows.length,\n truncated: rows.length >= SCAN_MAX,\n ...(() => {\n const items = hit.slice(skip, skip + take).map((r: any) => this.rowItem(axis, r))\n return { items, names: this.namesFor(items, this.nameIndex(inst.model ?? {})) }\n })()\n }\n }\n\n /*\n * **์ ์ธ์ด ์๋ ์ถ** โ ์ผ์ ยท์ค์ (ISA-95 Part 4). ์ด ์ถ์ ์ง์ ํธ์ ๋ชจ๋ธ์ด ์๋๋ผ **์ปค๋ ์ํ**๋ค\n * (์ปค๋์ด `source: 'state'` ๋ก ์ ์ธํ๋ค).\n *\n * โโ ๋ฉ์ถ ํธ์์ 0 ์ด ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์ด ๋์ํ์ง ์์ผ๋ฉด ๊ด์ธก์ด **์๋ค**. ๊ทธ๋ ๋น ๋ชฉ๋ก์ ๋ด๋ฉด \"์์
์ด 0 ๊ฑด\" ์ผ๋ก ์ฝํ๊ณ , ๊ทธ๊ฑด\n * ๊ฑฐ์ง์ด๋ค โ ์ด ํ๋ฉด์ด ๊ด์ธก ์ด์์ ๋ด๋ด ์ง์ผ ์จ ๊ตฌ๋ถ(๊ด์ธก ์์ โ 0)์ ๋ชฉ๋ก์์๋ ์งํจ๋ค.\n *\n * โโ ๊ท๋ชจ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ํ ๋ฐฐ์ด์ ์ง๊ธ์ ์ฌ์ค๋ง ๋ด์ ์ ํํ๋ค(์งํ ์ค ์ค๋ยท์์
). ๊ณผ๊ฑฐ๊น์ง ์ธ๋ ๊ฒ์ ์ ๋์ ์ผ์ด๊ณ \n * ์ปค์ ํ์ด์ง์ด ํ์ํ๋ค โ ๊ทธ๊ฑด `historical` ์ถ์ ํ์์ด๋ฉฐ, ์ฌ๊ธฐ์ ํ๋ด๋ด์ง ์๋๋ค.\n */\n if (axisSource(axis) === 'state') {\n /* ๋ดํฌ๋ฅผ ๋ฒ๊ธด๋ค โ `{revision, state}` ์์ ์ถ์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ **์คํ ์ค์ผ ๋๋ง** ๊ด์ธก์ด๋ค. */\n /*\n * **๋ผ์ด๋ธ๋ ๊ถ์, ํ์คํ ๋ฆฌ๋ ํ์.**\n *\n * ์ง๊ธ ๋๋ ์ปค๋์ ์ํ๊ฐ ์ด ์ถ์ ์ง์ค์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ปค๋์ด ๋ฉ์ถฐ ์๊ฑฐ๋ ์ฌ์ฉ์๊ฐ **๊ณผ๊ฑฐ ์๊ฐ**์\n * ๋ฌผ์ผ๋ฉด ๋ตํ ๊ฒ์ด ์์ด์ง๋ค โ ๊ทธ๋ ์ ๋์ ๊ทธ ์์ ๊น์ง ์ ์ด ๋ตํ๋ค(`recover`). ๋์ ๊ฐ์ ๋ชจ์์ด์ง๋ง\n * **์ฑ์ง์ด ๋ค๋ฅด๋ฏ๋ก `basis` ๋ก ๊ตฌ๋ณํด ๋ธ๋ค**: ํ์์ ๊ถ์์ฒ๋ผ ๋ด๋ฉด ๋ค์ ๊ณ์ฐํ ๊ฐ์ ๋ณด๊ณ \"์ง๊ธ ์ด๋ ๋ค\"\n * ๋ก ์ฝ๊ฒ ๋๋ค.\n *\n * ๊ท๋ชจ: ์ ๊ธฐ ๋น์ฉ์ ์ด๋ฒคํธ ์์ ๋น๋กํ๋ค. ๊ฐ์ถ์ง ์๊ณ **์ด๋ ๋ฆฌ๋น์ ๊น์ง ์ ์๋์ง ํจ๊ป ๋ธ๋ค** โ\n * ์ด ํ๋ฉด์ด ๋ชฉ๋ก๋ง๋ค `basis` ๋ฅผ ๋ฐํ ์จ ๊ท์จ ๊ทธ๋๋ก๋ค.\n */\n const live = TwinEngine.isRunning(domainId, instanceId) && !at_\n let snap = live ? unwrapState(TwinEngine.snapshot(domainId, instanceId)) : null\n let folded: number | undefined\n if (!snap) {\n try {\n const rec = await TwinEngine.recover(domainId, instanceId, undefined, at_ ?? undefined)\n snap = unwrapState(rec)\n folded = Number((rec as any)?.revision) || undefined\n } catch {\n /* ๋ค์ ๊ณ์ฐํ ๊ฒ์ด ์๋ค(๋ชจ๋ธ๋ ์ ๋๋ ์๋ค) โ ์๋ ๊ฒ์ 0 ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค. */\n snap = null\n }\n }\n if (!snap) {\n return { axis, label: info.label, basis: 'state', total: null, observed: false, offset: skip, items: [] }\n }\n const bucket = (snap as any)[axis]\n const list: any[] = Array.isArray(bucket) ? bucket : []\n const hitState = q ? list.filter(o => matches(o, q)) : list\n const items = hitState\n .slice(skip, skip + take)\n .map(o => ({ id: idOf(o), fields: this.withOrderMaterial(axis, inst.model ?? {}, o) }))\n return {\n axis,\n label: info.label,\n /* ๊ถ์(๋ผ์ด๋ธ)์ ํ์(์ ๋)์ ๊ตฌ๋ณํด ๋ธ๋ค โ ํ๋ฉด์ด ์ด ๋ฑ๋ง์ ๊ทธ๋๋ก ๋ณด์ธ๋ค. */\n basis: live ? 'state' : 'journal',\n ...(folded != null ? { foldedRevision: folded } : {}),\n ...(at_ ? { at: at_ } : {}),\n observed: true,\n total: hitState.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n items,\n names: this.namesFor(items, this.nameIndex(inst.model ?? {}))\n }\n }\n\n /* ์์ง ๋ฌธ์ ์์ ์ฌ๋ ์ถ โ ๋ฌธ์๋ฅผ ์ฝ์ด ์๋ฅธ๋ค. ๊ท๋ชจ ํ๊ณ๋ฅผ `basis` ๋ก ๋๋ฌ๋ธ๋ค. */\n const raw = at(inst.model ?? {}, documentPath(axis))\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n const hit = q ? all.filter(o => matches(o, q)) : all\n return {\n axis,\n label: info.label,\n basis: 'document',\n total: hit.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n ...(() => {\n /*\n * **ํ ๋ฒ๋ฟ์ธ ์ ์ธ์ ์ถ ์ด๋ฆ์ด ๊ณง ์๋ณ์๋ค.**\n *\n * `productionSpec` ์ฒ๋ผ ๋ฌธ์์ ๊ฐ์ฒด ํ๋๋ก ์๋ ์ถ์ `id`/`key` ๊ฐ ์๋ค. ๊ทธ๊ฒ์ ๊ทธ๋๋ก\n * ๋ชฉ๋ก์ ์ค์ผ๋ฉด \"์๋ณ์ ์์ โ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค\" ๋ผ๋ ์ค ํ๋๊ฐ ๋จ๊ณ , ์ ์ ๊ทธ ์ ์ธ์\n * ์ด์ด ๋ณผ ๋ฐฉ๋ฒ์ด ์๋ค. ํ๋๋ฟ์ธ ๊ฒ์ ์ถ ์์ ์ผ๋ก ๊ฐ๋ฆฌํจ๋ค(์์ธ๋ ๊ฐ์ ๊ท์น์ผ๋ก ์ฐพ๋๋ค).\n */\n const singular = !Array.isArray(raw) && !!raw\n const items = hit\n .slice(skip, skip + take)\n .map(o => ({ id: idOf(o) ?? (singular ? axis : null), fields: this.withBinding(axis, inst.model ?? {}, o) }))\n return { items, names: this.namesFor(items, this.nameIndex(inst.model ?? {})), singular }\n })()\n }\n }\n\n /**\n * ํ์์ **๋ด๋ถ ๋ฐฐ๊ด์ ๊ฑท์ด๋ธ๋ค** โ ์ฌ์ฉ์๊ฐ ๋ณผ ๊ฒ์ ํ์ฅ์ ์ฌ์ค์ด์ง ์ฐ๋ฆฌ ์คํค๋ง๊ฐ ์๋๋ค.\n *\n * ์์ผ๋ก ๋ชฉ๋ก์ ๋์ง ์๋๋ค. ๊ด๊ณ์ ๊ทธ ์กฐ์ธ ์ปฌ๋ผ์ด ๋ฌด์์ธ์ง๋ **์ํฐํฐ ๋ฉํ๋ฐ์ดํฐ**๊ฐ ์๊ณ ,\n * ํ๋ก ๋๋ฉด ์ปฌ๋ผ์ด ๋ ๋๋ง๋ค ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์ผ ํ๋ฉฐ ์์ผ๋ฉด ๊ทธ๋๋ก ์์ด ๋๊ฐ๋ค โ ์ค์ ๋ก\n * `domainId`ยท`instanceRowId` ๊ฐ์ ๋ด๋ถ UUID ๊ฐ ํ๋ฉด๊น์ง ๊ฐ๋ค.\n *\n * ์๋ณ์๋ ๋บ๋ค: ํญ๋ชฉ ์์ ์ id ๋ ์ด๋ฏธ `id`/`itemId` ๋ก ๋๊ฐ๋ฏ๋ก ๋ ๋ฒ ๋ณด์ผ ์ด์ ๊ฐ ์๋ค.\n */\n private strip(entityClass: any, idColumn: string, r: any): any {\n const meta = getRepository(entityClass).metadata\n const hidden = new Set<string>(['id', 'createdAt', 'updatedAt', 'creator', 'updater', 'creatorId', 'updaterId', idColumn])\n for (const rel of meta.relations) {\n hidden.add(rel.propertyName)\n for (const jc of rel.joinColumns) hidden.add(jc.propertyName)\n }\n /* `@RelationId` ๋ก ์น๊ฒฉํ ๋ด๋ถ UUID(`domainId`ยท`instanceRowId`ยท`areaRowId`) โ ๊ด๊ณ ๋ชฉ๋ก์๋ ์๊ณ \n ์ฌ๊ธฐ์๋ง ์๋ค. ์ด ํ ์ค์ด ์์ด์ ์ค์ ๋ก ํ๋ฉด๊น์ง ์๋ค. */\n for (const rid of meta.relationIds) hidden.add(rid.propertyName)\n const out: any = {}\n for (const [k, v] of Object.entries(r)) if (!hidden.has(k)) out[k] = v\n return out\n }\n\n\n /**\n * **์์ฌ๋ ์๊ธฐ GS1 ํ๋ชฉ ์ฐธ์กฐ๋ฅผ ์๋ค** โ ์ฝ๊ธฐ ๊ฒฝ๊ณ์์ ์ด์ด ๋ถ์ธ๋ค.\n *\n * ์ ๋ณธ์ `productionSpec.binding` ํ๋๋ค(์ปค๋์ด EPCโ์์ฌ๋ฅผ ๊ทธ ํ๋ก ์๋๋ค). ๊ทธ๋ฐ๋ฐ ๊ทธ ์ฌ์ค์\n * **์์ฌ๋ง๋ค์ ์์ฑ**์ด๋ค: ์ด ์์ฌ๊ฐ GS1 ํ๋ชฉ ๋ช ๋ฒ์ธ๊ฐ, ๊ทธ๋์ ๊ฐ์ฒด๋ก ์ถ์ ๋๋๊ฐ(= ๊ณ๋ณด๋ฅผ ๋น๊ตํ \n * ์ ์๋๊ฐ). ์์ฌ ๋ชฉ๋ก์ ๊ทธ๊ฒ์ด ์์ผ๋ฉด ์์ฌ๋ ์๊ธฐ ์ ์ฒด๋ฅผ ๋ชจ๋ฅด๊ณ , ์ฌ์ฉ์๋ ๊ทธ ์ฌ์ค์ ๋ด ์ถ์์\n * ์ฐพ์์ผ ํ๋ค.\n *\n * ๊ทธ๋์ **์ ์ฅ์ ํ ๊ณณ(binding), ํ์๋ ์ฝ๋ ์๋ฆฌ์์ ์ด์ด ๋ถ์** โ ์ด๋ฆํ์ ๊ฐ์ ๋ฐฉ์์ด๋ค.\n * ๊ฐ์ ๋ณต์ ํด ๋๋ฉด ๋ ๊ณณ์ด ์ด๊ธ๋๊ณ , ์ด๊ธ๋ ์ชฝ์ ์๋ฌด๋ ๋ชจ๋ฅธ๋ค.\n */\n private withBinding(axis: string, model: any, fields: any): any {\n if (axis !== 'materials' || !fields || typeof fields !== 'object') return fields\n const binding: Record<string, string> = model?.productionSpec?.binding ?? {}\n const ref = binding[fields.key ?? fields.id]\n /* ์์ผ๋ฉด ํค๋ฅผ ๋ง๋ค์ง ์๋๋ค โ ๋น ๊ฐ์ด ์๋ ๊ฒ๊ณผ ์ ์ธ๋์ง ์์ ๊ฒ์ ๋ค๋ฅด๋ค. */\n return ref ? { ...fields, gs1Ref: ref } : fields\n }\n\n /**\n * **์ค๋๊ฐ ๋ฌด์์ ๋ง๋๋** โ GS1 ํ๋ชฉ ์ฐธ์กฐ๋ฅผ ์์ฌ๋ก ๋ค์ ๊ณ์ฐํด ๋ถ์ธ๋ค.\n *\n * ์ปค๋์ ์ค๋๋ ํ๋ชฉ์ GS1 ์ผ๋ก ๋งํ๋ค(`urn:epc:idpat:sgtin:0614141.078101.*`). ์ฌ๋์๊ฒ ๊ทธ ๋ฌธ์์ด์\n * ์๋ฌด ๋ป์ด ์๊ณ , ๊ทธ ํ๋ชฉ์ ์ด๋ฆ์ **์์ฌ ์ ์ธ**์ด ๊ฐ๊ณ ์๋ค. ๋์ ์๋ ๊ฒ์ `productionSpec.binding`\n * (์์ฌ ํค โ ํ๋ชฉ ์ฐธ์กฐ)์ด๋ฏ๋ก **์ญ๋ฐฉํฅ์ผ๋ก ๋ค์ ๊ณ์ฐํ๋ค.**\n *\n * ์ ๋ณธ์ ๊ทธ๋๋ก ๋๋ค: `gtin` ์ ์ปค๋์ด ๋งํ ๊ฐ์ด๊ณ , ์ฌ๊ธฐ์ ๋ํ๋ ๊ฒ์ **์์ฌ ํค ํ๋**๋ค(๊ทธ ์ด๋ฆ์\n * ์ด๋ฆํ๊ฐ ๋ถ์ธ๋ค โ ๊ฐ์ ๋ณต์ ํ์ง ์๋๋ค). ๋ค์ ๊ณ์ฐํ์ง ๋ชปํ๋ฉด ์๋ฌด๊ฒ๋ ๋ํ์ง ์๋๋ค: ์ง์์ผ๋ก ์ด์ผ๋ฉด\n * \"์ด ์ค๋๋ ์ ๊ฒ์ ๋ง๋ ๋ค\" ๋ ๊ฑฐ์ง์ด ๋๊ณ , ๊ทธ๊ฑด ๋ชจ๋ฅด๋ ๊ฒ๋ณด๋ค ๋์๋ค.\n */\n private withOrderMaterial(axis: string, model: any, fields: any): any {\n if (axis !== 'orders' || !fields || typeof fields !== 'object') return fields\n const binding: Record<string, string> = model?.productionSpec?.binding ?? {}\n const refToMaterial = new Map(Object.entries(binding).map(([mat, r]) => [String(r), mat]))\n /* ๋จ์ผ ํ๋ชฉ ์์
์ง์๋ `gtin`, ์ฌ๋ฌ ํ๋ชฉ์ด๋ฉด ๋ผ์ธ๋ง๋ค ๋งํ๋ค โ ์ฒซ ๋ผ์ธ์ผ๋ก ๋ํํ์ง ์๋๋ค. */\n const refOf = (v: unknown): string | null => {\n const m = typeof v === 'string' ? /sgtin:[^.]+\\.([^.]+)\\./.exec(v) : null\n return m ? m[1] : null\n }\n const mat = refToMaterial.get(String(refOf(fields.gtin) ?? ''))\n if (mat) return { ...fields, material: mat }\n const lineMats = (fields.lines ?? [])\n .map((l: any) => refToMaterial.get(String(refOf(l?.gtin) ?? '')))\n .filter(Boolean)\n return lineMats.length ? { ...fields, materials: [...new Set(lineMats)] } : fields\n }\n\n /** ํ ํ๋ โ ๋ชฉ๋ก ํญ๋ชฉ. ์ปฌ๋ผ ์ด๋ฆ์ ํ๋ฉด์ด ์์ง ์์๋ ๋๊ฒ `id` + ๋๋จธ์ง๋ก ๋ธ๋ค. */\n private rowItem(axis: string, r: any): any {\n const { entity, idColumn } = ROW_BACKED[axis]\n return { id: r[idColumn], fields: this.strip(entity, idColumn, r) }\n }\n\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'One item of a standard concept: what the source declared, what the twin observed, what it links to and is linked from (declared relations, both directions), and where it came from. Never invents a value for a field the source did not provide.'\n })\n async twinModelItem(\n @Arg('instanceId') instanceId: string,\n @Arg('axis') axis: string,\n @Arg('itemId') itemId: string,\n @Ctx() context: ResolverContext\n ): Promise<any | null> {\n const domainId = context.state.domain.id\n const info = axisInfo(axis)\n if (!info) throw new Error(`unknown concept axis: \"${axis}\" โ the kernel catalog does not declare it`)\n\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return null\n\n const model = inst.model ?? {}\n const row = ROW_BACKED[axis]\n let declared: any = null\n let provenance: any = null\n\n /*\n * **๊ด์ธก ์ถ์ ์์ธ** โ ์ผ์ ยท์ค์ ์ ์ํ์์ ์ฐพ๋๋ค. ์ปค๋์ด ๋ฉ์ถฐ ์์ผ๋ฉด ํญ๋ชฉ์ด ์๋๋ผ **๋ชจ๋ฅธ๋ค**๋ฅผ\n * ๋ธ๋ค(๊ทธ ํธ์์ ๊ทธ ์ค๋๊ฐ ์๋ค๋ ๋ป์ด ์๋๋ค โ ์ง๊ธ ๊ด์ธก์ด ์๋ค๋ ๋ป์ด๋ค).\n */\n if (axisSource(axis) === 'state') {\n /*\n * ๋์ํ์ง ์์ผ๋ฉด **๋ชฉ๋ก๊ณผ ๊ฐ์ ๊ธธ๋ก ์ ๋์ ์ ๋๋ค.**\n *\n * ๋ชฉ๋ก๋ง ์ ๊ณ ์์ธ๋ ์ ์ ์๋๋, ๋ชฉ๋ก์๋ 472๊ฑด์ด ๋ณด์ด๋๋ฐ ๊ทธ ์ค์ ์ด๋ฉด \"์๊ธฐ ์์ฑ์ด ์์ต๋๋ค\"\n * ๊ฐ ๋์๋ค โ ํ ํ๋ฉด์์ ๋ ๋ต์ด ๊ฐ๋ฆฌ๋ฉด ์ด๋ ์ชฝ์ด ๋ง๋์ง ์ฌ์ฉ์๊ฐ ์ ์ ์๋ค.\n */\n const liveItem = TwinEngine.isRunning(domainId, instanceId)\n let snap = liveItem ? unwrapState(TwinEngine.snapshot(domainId, instanceId)) : null\n if (!snap) {\n try {\n snap = unwrapState(await TwinEngine.recover(domainId, instanceId))\n } catch {\n /* ๋ค์ ๊ณ์ฐํ ๊ฒ์ด ์๋ค โ ์๋์์ \"๋ชจ๋ฅธ๋ค\" ๋ฅผ ๋ธ๋ค(0 ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค). */\n }\n }\n const bucket = snap ? (snap as any)[axis] : null\n const found = Array.isArray(bucket) ? bucket.find((o: any) => idOf(o) === itemId) : undefined\n if (!snap || !found) {\n return {\n instanceId, axis, label: info.label, itemId,\n identity: { standardClass: info.standardClass ?? null, typeRole: info.typeRole ?? null, kind: info.kind, gs1Scheme: info.gs1Scheme ?? null },\n declared: null, observed: found ?? null, observedOnly: true,\n basis: liveItem ? 'state' : 'journal', observedBasis: liveItem ? 'state' : 'journal', observing: liveItem,\n links: { out: [], incoming: [] }, properties: propertiesOf(axis).map((pr: any) => ({ key: pr.key, label: pr.label, kind: pr.kind, uom: pr.uom ?? null, observedBy: pr.observedBy ?? null })),\n /* ์ด๋ค ์์ฑ์ด **ํจ๊ณผ๊ฐ ์๋** โ ๋ฑ๋ก๋ถ๊ฐ ๋งํ๋ค(ยงproperty-effects). ์๋ ๊ฒ์ ํ์๋ง ๋๋ค. */\n propertyEffects: propertyEffectsOf(axis),\n names: {}, provenance: { basis: 'state' }\n }\n }\n const names = this.namesFor([{ id: itemId, fields: found }], this.nameIndex(inst.model ?? {}))\n return {\n instanceId, axis, label: info.label, itemId,\n identity: { standardClass: info.standardClass ?? null, typeRole: info.typeRole ?? null, kind: info.kind, gs1Scheme: info.gs1Scheme ?? null },\n /*\n * **์ ์ธ์ด ์๋ ์ถ์ด๋ค.** ๋ ์ด ์ค ์ผ์ชฝ์ด ๋น๋ ๊ฒ์ด ์ ์์ด๊ณ , ๊ทธ ์ฌ์ค์ ๊ฐ์ผ๋ก ๋งํ๋ค\n * (`observedOnly`) โ ๋น ์ด์ \"์๋ณธ์ด ์นจ๋ฌตํ๋ค\" ๋ก ์ฝ์ผ๋ฉด ์ ๋๋ค. ์๋ณธ์ ์ ์ด์ ์ด ์ถ์\n * ์ ์ธํ์ง ์๋๋ค.\n */\n declared: null,\n observed: this.withOrderMaterial(axis, inst.model ?? {}, found),\n observedOnly: true,\n basis: liveItem ? 'state' : 'journal',\n /* ๊ด์ธก ์ด์ ๊ทผ๊ฑฐ๋ **ํ ์ด๋ฆ์ผ๋ก** ๋ธ๋ค โ ๋ ์ด๋ฆ์ ๋๋ฉด ํ๋ฉด์ด ํ์ชฝ์ ์๋๋ค. */\n observedBasis: liveItem ? 'state' : 'journal',\n observing: liveItem,\n properties: propertiesOf(axis).map((pr: any) => ({ key: pr.key, label: pr.label, kind: pr.kind, uom: pr.uom ?? null, observedBy: pr.observedBy ?? null })),\n /* ์ด๋ค ์์ฑ์ด **ํจ๊ณผ๊ฐ ์๋** โ ๋ฑ๋ก๋ถ๊ฐ ๋งํ๋ค(ยงproperty-effects). ์๋ ๊ฒ์ ํ์๋ง ๋๋ค. */\n propertyEffects: propertyEffectsOf(axis),\n links: await this.linksOf(domainId, inst, axis, itemId, found),\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n names,\n provenance: { basis: liveItem ? 'state' : 'journal' }\n }\n }\n\n if (row) {\n const found: any = await getRepository(row.entity).findOne({\n where: { domain: { id: domainId } as any, instance: { id: inst.id } as any, [row.idColumn]: itemId } as any\n })\n if (found) {\n const { sourceRef, ingestedAt, ...rest } = this.strip(row.entity, row.idColumn, found)\n declared = rest\n /* ์ถ์ฒ๋ ์์ฑ์ด ์๋๋ผ **๊ทผ๊ฑฐ**๋ค โ ๋ ์ด์ด ์๋๋ผ ์๋ ๊ทผ๊ฑฐ ๋ฌถ์์ผ๋ก ๊ฐ๋ค. */\n provenance = { sourceRef, ingestedAt, basis: 'rows' }\n }\n }\n\n /*\n * ํ์ ์์ผ๋ฉด ๋ฌธ์๋ฅผ ๋ณธ๋ค โ **ํฌ์์ด ๋ก์ ํธ์์์๋ ํญ๋ชฉ์ ๋ณผ ์ ์์ด์ผ ํ๋ค.** ํ๋ง ๋ณด๊ณ \n * \"์๋ค\" ๊ณ ๋ตํ๋ฉด, ๋ฌธ์์๋ ์๋ ์๋ฆฌ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง๋ค(์ด ํ๋ก์ ํธ๊ฐ ๋ด๋ด ์ก์ ์จ ๋ถ๋ฅ).\n */\n if (!declared) {\n const raw = at(model, info.path)\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n /* ํ ๋ฒ๋ฟ์ธ ์ ์ธ์ ์ถ ์ด๋ฆ์ผ๋ก ์ฐพ๋๋ค โ ๋ชฉ๋ก์ด ๊ทธ ์ด๋ฆ์ผ๋ก ๊ฐ๋ฆฌ์ผฐ๊ธฐ ๋๋ฌธ์ด๋ค. */\n const found = all.find(o => idOf(o) === itemId) ?? (!Array.isArray(raw) && raw && itemId === axis ? raw : undefined)\n if (found) {\n declared = typeof found === 'string' ? { id: found } : this.withBinding(axis, model, found)\n provenance = { basis: 'document' }\n }\n }\n\n /* ์ ์ธ์๋ ๋ฌธ์์๋ ์๋ค โ ๊ทธ๋ฐ๋ฐ **๊ด์ธก์๋ ์์ ์ ์๋ค**(์๋ณธ์ด ๋ชจ๋ฅด๋ ์์). ๊ทธ ๊ฒฝ์ฐ๋\n ํญ๋ชฉ์ผ๋ก ์ด๋ ค์ผ ํ๋ค. ๋ ๋ค ์์ผ๋ฉด ์ง์ง๋ก ์๋ ๊ฒ์ด๋ฏ๋ก `null`. */\n const seen = await this.observedOf(domainId, instanceId, axis, itemId)\n const observed = 'value' in seen ? seen.value : null\n if (!declared && !observed) return null\n\n /* ์ด์์ ๋จผ์ ๊ตฌํ๋ค โ ์ด๋ฆํ๊ฐ ์ด์์ id ๊น์ง ๋ฎ์ผ๋ ค๋ฉด ๋ฐํ ์ ์ ์์ ์์ด์ผ ํ๋ค. */\n const links = await this.linksOf(domainId, inst, axis, itemId)\n\n /*\n * **๊ตฌ์ญ ์ด๋ฆ์ ๋ชจ๋ธ์ ์๋ค** โ ๊ตฌ์ญ์ ํธ์คํธ ๊ฐ๋
์ด๊ณ (`TwinArea`), ์ธ์ ์คํธ๊ฐ ๋ชจ๋ธ์์ ๊ฐ๋ผ\n * ๊ณต๊ฐ ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค. ๊ทธ๋์ ๋ชจ๋ธ๋ง ์กฐํํ๋ ์ด๋ฆํ์๋ `a-floor` ์ ์ด๋ฆ์ด ์๊ณ , ๊ด๊ณ ๊ทธ๋ฆผ์ ๊ทธ id ๊ฐ\n * ๊ทธ๋๋ก ์ฐ๋ค. ๊ทธ ํ์์ ๊ฐ์ ธ์ ์ด๋ฆํ์ ํฉ์น๋ค(์ด ํธ์์ ๊ณต๊ฐ ๊ฒ๋ง).\n */\n const areaNames: Record<string, string> = {}\n if (inst.spaceId) {\n const areas = await getRepository(TwinArea)\n .find({ where: { domain: { id: domainId } as any, space: { spaceId: inst.spaceId } as any } as any })\n .catch(() => [] as any[])\n for (const a of areas as any[]) if (a?.areaId && a?.name) areaNames[a.areaId] = a.name\n }\n\n return {\n instanceId,\n axis,\n label: info.label,\n itemId,\n /* ์ ์ฒด โ ํ์ค ํด๋์คยท์๋ณ ์คํด์ ์ ๋ถ ์นดํ๋ก๊ทธ ์ ์ธ์์ ์จ๋ค. */\n identity: {\n standardClass: info.standardClass ?? null,\n typeRole: info.typeRole ?? null,\n kind: info.kind,\n gs1Scheme: info.gs1Scheme ?? null\n },\n /*\n * **๊ทธ๋ฆ์ธ๊ฐ** โ ๋ฌธ์์ ๊ฐ์ฒด ํ๋๋ก ์๋ ์ถ(`productionSpec`)์ธ์ง.\n *\n * `kind` ๋ก๋ ๊ฐ๋ฆฌ์ง ์๋๋ค: ์ปค๋์ ๋ผ์ฐํธยท๋ ์ํผยท๊ณต์ ๋ `spec` ์ด๋ผ ๋ถ๋ฅธ๋ค(๊ฐ์ ์ ์ธ ๋ถ๋ฅ๋ผ๋\n * ๋ป). ํ๋ฉด์ด `kind` ๋ก ๊ฐ๋๋๋ **๋ผ์ฐํธ ์์ธ๊ฐ ๊ทธ๋ฆ ํ๋ก ๊ทธ๋ ค์ ธ** ๊ฐ์ฅ ์ค์ํ ์ ๋ณด(๊ณต์ ์์)๊ฐ\n * ๊ฐ์ ์นฉ ํ๋๋ก ์ค์ด๋ค์๋ค. ๊ทธ๋ฆ์ธ์ง ์๋์ง๋ ๋ชจ์์ด ๋งํ๋ค.\n */\n container:\n axisSource(axis) === 'document' && !Array.isArray(at(model, info.path)) && at(model, info.path) != null,\n /* ๋ ์ด โ ์๋ณธ์ด ๋งํ ๊ฐ, ํธ์์ด ๊ด์ธกํ ๊ฐ. ํ์ชฝ์ด ์์ผ๋ฉด **์๋ค๊ณ ๋ธ๋ค**(0 ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค). */\n declared,\n observed,\n /*\n * ๊ด์ธก ์ด์ด **์๊ธฐ ๊ทผ๊ฑฐ๋ฅผ ๋งํ๋ค** โ ๋ชฉ๋ก์ ๊ทธ ๋ฑ๋ง ๊ทธ๋๋ก(`state`=๋ผ์ด๋ธ ๊ถ์, `journal`=๋ค์ ๊ณ์ฐํ\n * ํ์). ์์ผ๋ฉด ๋น๊ตํ์ง ๋ชปํ ๊ฒ์ด๋ค. ํ์์ด๋ฉด ๋ช ๋ฒ์งธ ๋ฆฌ๋น์ ๊น์ง ์ ์๋์ง ํจ๊ป ๋ธ๋ค.\n */\n ...('value' in seen\n ? { observedBasis: seen.basis, ...(seen.foldedRevision != null ? { observedRevision: seen.foldedRevision } : {}) }\n : { observedAbsence: seen.absence }),\n /* ์ ์ธ๋ ์์ฑ โ ์ด๋ ๊ด์ธก ์ถ์์ ์ค๋์ง๋ ํจ๊ป(์นดํ๋ก๊ทธ๊ฐ ๋งํ ๋๋ก). */\n properties: propertiesOf(axis).map((p: any) => ({ key: p.key, label: p.label, kind: p.kind, uom: p.uom ?? null, observedBy: p.observedBy ?? null })),\n /*\n * **ํจ๊ณผ๊ฐ ์๋ ์์ฑ๊ณผ ํ์๋ง ๋๋ ์์ฑ์ ๋ค๋ฅด๋ค.** ์์ฑ์ ์ด๋ ค ์์ด ์๋ฌด ์ฌ์ค์ด๋ ์ค์ด ๋ณด๋ผ ์\n * ์์ง๋ง, ๊ฐ์ด ๊ณ์ฐ์ ๋ฐ๊พธ๋ ค๋ฉด ๊ทธ ๊ท์น์ ์ฝ๋๊ฐ ์์์ผ ํ๋ค. ์ง๊ธ ๋ฌด์์ด ๊ทธ๋ฐ์ง ํ๋ฉด์ด ๋งํ ์\n * ์๊ฒ ๋ฑ๋ก๋ถ๋ฅผ ํจ๊ป ๋ธ๋ค โ ์ฌ์ฉ์๊ฐ ๋ฃ๊ณ ๋์ ์๋ฌด ์ผ๋ ์ ์ผ์ด๋๋ ์ด์ ๋ฅผ ์ ์ ์๊ฒ.\n */\n propertyEffects: propertyEffectsOf(axis),\n links,\n /*\n * **๋ฑ๊ธ ์ด๋ฆ์ ๋ฑ๊ธ์ด ๊ฐ๊ณ ์๋ค.** ๊ณต์ ์ ์๊ฒฉ์ ๋ฑ๊ธ id ๋ก๋ง ์๊ตฌํ๋ฏ๋ก(ํ์ค์ด ๊ทธ๋ ๋ค),\n * ๊ทธ id ๋ฅผ ๊ทธ๋๋ก ํ๋ฉด์ ๋ด๋ฉด `assembler-op` ์ด ์ฌ์ฉ์์๊ฒ ๊ฐ๋ค. ๋ฑ๊ธ์ ํ์๋ช
์ ๋ฑ๊ธ ์ ์ธ์\n * `description`(i18n ํค)์ ์๊ณ ๊ทธ๊ฒ์ **๋ค๋ฅธ ์ถ**์ด๋ค โ ํ๋ฉด์ด ์ถ์ ํ๋ ๋ ์ฝ์ง ์์๋ ๋๊ฒ\n * ์ฌ๊ธฐ์ ์ด์ด ๋ถ์ธ๋ค(์๋ฒ๋ ์ด๋ฏธ ๋ชจ๋ธ์ ์์ ๋ค๊ณ ์๋ค).\n */\n resourceClassLabels: this.classLabels(model),\n /*\n * **๊ณต์ ์ด๋ฉด ๊ทธ ๊ณต์ ์ ๋ฅ๋ ฅ๋ ํจ๊ป ๋ธ๋ค** โ ISA-95 Part 4 `OperationsCapability`.\n *\n * ๊ณต์ ์์ธ์์ ์ฌ๋์ด ๋ฌป๋ ๊ฒ์ \"์ด ๊ณต์ ์ด ์ง๊ธ ์ผ๋ง๋ ๋ ํ ์ ์๋\" ์ด๊ณ , ๊ทธ ๋ต์ ๋ช
์ธ๋ง\n * ๋ด์๋ ์ ๋์จ๋ค(์ฝ์ ๊ณผ ์ง๊ธ ๋ชป ์ฐ๋ ์์์ ๋นผ์ผ ํ๋ค). ํ๋ฉด์ด ์ถ์ ํ๋ ๋ ์ฝ์ง ์๊ฒ\n * ์ฌ๊ธฐ์ ์ด์ด ๋ถ์ธ๋ค โ ์ด๋ฆํยท๋ฑ๊ธ ๋ผ๋ฒจ์ ๋ถ์ด๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ค.\n */\n ...(await this.capabilityOfOperation(domainId, instanceId, axis, itemId)),\n /*\n * ์์ธ๋ ๊ฐ์ ํ๋ฅผ ์ด๋ค โ ๋ชฉ๋ก๊ณผ ์์ธ๊ฐ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋งํด์ผ ์ฌ์ฉ์๊ฐ ๊ฐ์ ๊ฒ์ผ๋ก ์ฝ๋๋ค.\n *\n * **์ด์์ ์ด๋ฆ๋ ํจ๊ป ์ฃ๋๋ค.** ๊ด๊ณ ๊ทธ๋ฆผ์ ์ด์์ ๋๊ฐ *๋ค์ด์ค๋* ๋งํฌ(์ด ์๋ฆฌ๋ฅผ ๊ธฐ์ค ์๋ฆฌ๋ก\n * ์ผ๋ ์ค๋นยท์ฌ๋)๋ผ, ์ด ํญ๋ชฉ ์์ ์ ํ๋์๋ ๊ทธ id ๊ฐ ์๋ค โ ํ๋๋ง ํ์ผ๋ฉด ๊ทธ๋ฆผ์ด id ๋ก ์ฑ์์ง๋ค.\n */\n names: this.namesFor(\n [{ id: itemId, fields: declared }, { fields: observed }, { fields: links }],\n { ...this.nameIndex(model), ...areaNames }\n ),\n provenance\n }\n }\n\n /**\n * **id โ ์ด๋ฆ**, ๋ชจ๋ ์ถ์ ํ ํ๋ก.\n *\n * โโ ์ ์ด ํ๊ฐ ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ์ ๋ค๋ฅธ ๊ฒ์ **id ๋ก** ๊ฐ๋ฆฌํจ๋ค(์ฌ๋์ `personnelClassIds`, ์ค๋น์ `homeLocationId`, ๊ณต์ ์\n * `locationType`). ๊ทธ id ์ ์ด๋ฆ์ **๊ฐ๋ฆฌ์ผ์ง ์ถ์ ํ**์ ์์ผ๋ฏ๋ก, ํ๋ฉด์ด ๊ทธ๊ฒ์ ์๋ ค๋ฉด ์ถ์\n * ํ๋์ฉ ๋ ์ฝ์ด์ผ ํ๋ค โ ๊ทธ๋์ ์ง๊ธ๊น์ง ํ๋ฉด๋ง๋ค ๊ทธ๋ฅ id ๋ฅผ ์ฐ์๋ค(`cutter-op`, `cut-station`).\n * ํ๋ฉด์ ํ๋์ฉ ๊ณ ์น๋ ๊ฒ์ ๋์ด ์๋ค: ์ ํ๋ฉด์ ์ฒ์๋ถํฐ ๋ค์ id ๋ฅผ ์ฐ๋๋ค.\n *\n * ๊ทธ๋์ **์๋ฒ๊ฐ ๋ถ์ธ๋ค.** ์๋ฒ๋ ์ด๋ฏธ ๋ชจ๋ธ์ ์์ ๋ค๊ณ ์๊ณ , ์ด๋ ์ถ์ด ์๋์ง๋ ์ปค๋ ์นดํ๋ก๊ทธ๊ฐ\n * ์ ์ธํ๋ค(`TWIN_AXES`) โ ๋๋ฉ์ธ์ด ๋์ด๋ ์ด ํจ์๋ ๊ทธ๋๋ก๋ค.\n *\n * ๊ฐ์ ๊ทธ ํญ๋ชฉ์ด **์๊ธฐ ์ด๋ฆ์ด๋ผ๊ณ ๋งํ ๊ฒ**์ด๋ค(`name`ยท`label`ยท`description`). ๊ทธ์ค ์ด๋ค ๊ฒ์\n * i18n ํค์ด๋ฏ๋ก(๋ฑ๊ธ์ `description`) ๋ฒ์ญ์ ํ๋ฉด์ ์ผ๋ก ๋จ๊ธด๋ค. ์ด๋ฆ์ด ์์ผ๋ฉด ํ์ ๋ฃ์ง ์๋๋ค โ\n * ์๋ ๊ฒ์ ์ง์ด๋ด์ง ์๊ณ , ๊ทธ ๊ฒฝ์ฐ ํ๋ฉด์ id ๋ฅผ ๊ทธ๋๋ก ๋ณด์ธ๋ค.\n */\n private nameIndex(model: any): Record<string, string> {\n const out: Record<string, string> = {}\n for (const info of TWIN_AXES as any[]) {\n /* ๊ด์ธก ์ถ(์ํยท์ ๋)์ ๋ฌธ์์ ์๋ค โ ๊ฒฝ๋ก๊ฐ ์๋ ์ถ์ ์ฝ์ผ๋ฉด ๋ชจ๋ธ ๋ฃจํธ๋ฅผ ํ๋๋ค. */\n if (axisSource(info.axis) !== 'document') continue\n const raw = at(model ?? {}, info.path)\n const list = Array.isArray(raw) ? raw : raw ? [raw] : []\n for (const o of list) {\n const id = idOf(o)\n if (!id || typeof o !== 'object') continue\n const label = o.name ?? o.label ?? o.description\n /* ์ด๋ฆ์ด id ์ ๊ฐ์ผ๋ฉด ํ์ ๋ฃ์ง ์๋๋ค โ ๊ฐ์ ๊ฐ์ ๋ ๋ฒ ๋ณด์ด๋ ์
์ด๋ค. */\n if (typeof label === 'string' && label && label !== id && !out[id]) out[id] = label\n }\n }\n return out\n }\n\n /**\n * ์ด ์๋ต์ด **์ค์ ๋ก ๊ฐ๋ฆฌํจ ๊ฒ๋ง** ๊ณจ๋ผ ๋ธ๋ค.\n *\n * ๋ชจ๋ธ ์ ์ฒด ํ๋ฅผ ๊ทธ๋๋ก ์ค์ผ๋ฉด ์๋ฆฌ๊ฐ 10๋ง์ธ ํ์ฅ์์ ๋ชฉ๋ก ํ ํ์ด์ง์ 10๋ง ์ค์ง๋ฆฌ ์ด๋ฆํ๊ฐ\n * ๋ฐ๋ผ์จ๋ค. ๋์จ ๊ฐ์ ๊ฑธ๋ฆฌ๋ ๊ฒ๋ง ์ฃ๋๋ค โ ๊ท๋ชจ์์ ์ฑ๋ฆฝํ๋ ์ ์ผํ ๋ฐฉ์์ด๋ค.\n */\n private namesFor(rows: any[], index: Record<string, string>): Record<string, string> {\n const out: Record<string, string> = {}\n const take = (v: any, depth: number): void => {\n if (v == null || depth > 4) return\n if (typeof v === 'string') { if (index[v]) out[v] = index[v]; return }\n if (Array.isArray(v)) { for (const x of v) take(x, depth + 1); return }\n if (typeof v === 'object') for (const x of Object.values(v)) take(x, depth + 1)\n }\n for (const r of rows) { take(r?.fields ?? r, 0); if (typeof r?.id === 'string' && index[r.id]) out[r.id] = index[r.id] }\n return out\n }\n\n /** ๋ฑ๊ธ id โ ํ์๋ช
ํค. ์ธ์ยท์ค๋นยท์์ฐยทํ๋ชฉ ๋ฑ๊ธ์ ํ ํ๋ก โ ์ด๋ ์์์ด๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๊ตฌ๋๋ค. */\n private classLabels(model: any): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of ['personnelClasses', 'equipmentClasses', 'assetClasses', 'materialClasses'])\n /* ํ์๋ช
์ `name` ์ด ์ ๋ณธ์ด๋ค โ ์ ๋ชจ๋ธ๋ `description` ์ ๋ด๊ณ ์์ด ๋ ๋ค ๋ณธ๋ค(์ฝ๊ธฐ ๊ฒฝ๊ณ ํ๋). */\n for (const c of (model?.[key] ?? []) as any[]) if (c?.id && (c.name || c.description)) out[c.id] = c.name || c.description\n return out\n }\n\n /**\n * ๊ด์ธก์ด ๋ณธ ์ด ํญ๋ชฉ โ ์ปค๋์ด ์คํ ์ค์ผ ๋๋ง. **์คํ ์ค์ด ์๋๋ฉด `null` ์ด์ง ๋น ๊ฐ์ฒด๊ฐ ์๋๋ค**\n * (๊ด์ธก์ด ์๋ ๊ฒ๊ณผ ๋น๊ตํ์ง ๋ชปํ ๊ฒ์ ๋ค๋ฅด๋ค).\n */\n /**\n * ์ด ๊ณต์ ์ **์์ฐ ๋ฅ๋ ฅ** โ ๊ณต์ ์ถ ํญ๋ชฉ์๋ง ๋ถ๋๋ค.\n *\n * ๊ตฌ๊ฐ์ **์์ผ๋ก 24์๊ฐ**์ด๋ค. ํ์ค์ ์ฝ์ ยท๊ฐ์ฉ์ *์์ผ๋ก ์ธ* ์ฉ๋์ด๋ฏ๋ก ์ง๋ ๊ตฌ๊ฐ์ ๋๊ณ ๋งํ๋ฉด\n * ๋ป์ด ์๊ณ , ์ด ํ๋ฉด์๋ ์ฌ์ฉ์๊ฐ ๊ณ ๋ฅธ ์ฐฝ์ด ์๋ค. ๊ทธ๋์ ํ๋ฃจ๋ฅผ ์ฐ๊ณ **๊ทธ ์ฌ์ค์ ๊ฐ๊ณผ ํจ๊ป ๋ธ๋ค**\n * (ํ๋ฉด์ด ๋ผ๋ฒจ๋ก ๋งํ๋ค) โ ์ด๋ ๊ตฌ๊ฐ์ ๊ฐ์ธ์ง ๋ชจ๋ฅด๋ฉด ๋ฅ๋ ฅ์ ์ฝ์ ์ ์๋ค.\n *\n * **์์๋ฅผ ์ง์ด๋ด์ง ์๋๋ค.** ์ฌ๊ธฐ์ ๋ด๋ ๊ฐ(์ํยท์ฝ์ ยท๋ฌ์ฑ๋ถ๊ฐยท๊ฐ์ฉยท์ ์ฝํ๋ ์ถ)์ ์ ๋ถ ๊ณต๊ธ ์ชฝ์ด๋ค โ\n * ์์ ์ยท์ฌ์ดํดยท๊ฐ๋๋ฅ ์์ ๋์จ๋ค. ์์๋ `ok`ยท๋ณ๋ชฉยทํ๋ฃจ ์ํ์๋ง ์ฐ์ด๊ณ ๊ทธ๊ฒ๋ค์ ๋ด์ง ์์ผ๋ฏ๋ก,\n * ๊ณ์ฐ์ ๋๊ธฐ๋ ์์ `1` ์ ๊ฒฐ๊ณผ์ ์์ง ์๋๋ค(์ฑ๊ณผ ํ๋ฉด์ ์ฌ์ฉ์๊ฐ ๊ฑธ์ด ๋ ๋ชฉํ๋ฅผ ์ด๋ค โ ๊ทธ ํ๋ฉด์\n * \"๋ชฉํ๋ฅผ ๋ผ ์ ์๋\" ์ ๋ตํ๊ณ ์ฌ๊ธฐ์๋ \"์ผ๋ง๋ ๋ ํ ์ ์๋\" ์ ๋ตํ๋ค).\n *\n * ์ ์คํ ์ค์ด๋ฉด ๋ถ์ด์ง ์๋๋ค โ ๋ฅ๋ ฅ์ ์ง๊ธ ์์์ ์ฌ์ค์์ ๋์ค๊ณ , ์๋ ๊ฒ์ ์ง์ด๋ด์ง ์๋๋ค.\n */\n private async capabilityOfOperation(\n domainId: string,\n instanceId: string,\n axis: string,\n itemId: string\n ): Promise<{ capability?: any } > {\n if (axis !== 'operations') return {}\n if (!TwinEngine.isRunning(domainId, instanceId)) return {}\n const from = new Date()\n const to = new Date(from.getTime() + 24 * 3_600_000)\n const monday = Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate() - ((from.getUTCDay() + 6) % 7))\n try {\n const rows = await TwinEngine.operationsCapability(\n domainId,\n { instanceId },\n 1,\n monday,\n { fromTime: from.toISOString(), toTime: to.toISOString() }\n )\n const report = rows.find((r: any) => r.instanceId === instanceId)?.report\n const entry = report?.perOperation?.find((o: any) => o.operation === itemId)\n if (!entry) return {}\n /* ๋ณ๋ชฉยท์ํ์ **๋ฃ์ง ์๋๋ค** โ ๊ทธ ๋๋ง ์์์ ๋ฌ๋ ค ์๊ณ , ์ฌ๊ธฐ์๋ ์์๋ฅผ ๋ชจ๋ฅธ๋ค. */\n return { capability: { window: report.window, operationsType: report.operationsType, ...entry } }\n } catch {\n /* ๋ฅ๋ ฅ์ ๋ชป ๋๋ค๊ณ ์์ธ๊ฐ ์ ์ด๋ฆด ์ด์ ๋ ์๋ค โ ์์ผ๋ฉด ์๋ ๋๋ก ๋ธ๋ค(ํ๋ฉด์ด ๊ทธ ์ค์ ์ ๊ทธ๋ฆฐ๋ค). */\n return {}\n }\n }\n\n /**\n * ์ด ํญ๋ชฉ์ ํธ์์ด **๊ด์ธกํ ๊ฐ** โ ๊ทธ๋ฆฌ๊ณ **๋ฌด์์ ๊ทผ๊ฑฐ๋ก** ์๋์ง.\n *\n * ๋ดํฌ๋ฅผ ํธ๋ ๊ฒ์ ๋น ๋จ๋ ค์(`unwrapState`) ๋ฌธ์ ์ถ์ ๊ด์ธก ์ด์ด ํต์งธ๋ก ๋น์ด ์๋ ์๋ฆฌ๋ค(์ฌ๋์ ์ด๋ฉด\n * ํธ์์ด ์๋ ๊ฒ์ด ์ ๋ถ `โ` ์๋ค).\n *\n * ๊ทผ๊ฑฐ๋ฅผ ๊ฐ๊ณผ ํจ๊ป ๋ธ๋ค โ ๋ชฉ๋ก์ด ์ค๋ ํด ์จ ๊ทธ๋๋ก๋ค(ยงtwinModelItemList). ๋ผ์ด๋ธ(๊ถ์)์ ์ ๋\n * ํด๋(ํ์)๋ **๊ฐ์ ๋ชจ์์ ๊ฐ์ฒด**๋ผ์, ๊ทผ๊ฑฐ๊ฐ ์์ผ๋ฉด ๋ค์ ๊ณ์ฐํ ๊ฐ์ \"์ง๊ธ ์ด๋ ๋ค\" ๋ก ์ฝ๋๋ค. ๊ทผ๊ฑฐ๋ฅผ\n * ์ค์ ์๋ฆฌ๊ฐ ์๋ ๋์์๋ ๋ฉ์ถ ํธ์์ ์ ๋์ ์์ ์ ์ง ์๊ณ `โ` ๋ก ๋๋ ํธ์ด ์ ์งํ๋ค. ์ด์ \n * ์๋ฆฌ๊ฐ ์์ผ๋ ์ ๋๋ค โ ๋ฉ์ถ ํธ์์๋ ๋ง์ง๋ง์ผ๋ก ์๋ ์ฌ์ค์ด ์๊ณ , ๊ทธ๊ฒ์ ๊ฐ์ถ ์ด์ ๋ ์๋ค.\n *\n * ๋ค์ ๊ณ์ฐํ ๊ฒ์ด ์์ผ๋ฉด(๋ชจ๋ธ๋ ์ ๋๋ ์๋ค) `null` ์ด๋ค โ **์๋ ๊ฒ๊ณผ ๋น๊ตํ์ง ๋ชปํ ๊ฒ์ ๋ค๋ฅด๋ค.**\n */\n private async observedOf(\n domainId: string,\n instanceId: string,\n axis: string,\n itemId: string\n ): Promise<{ value: any; basis: 'state' | 'journal'; foldedRevision?: number } | { absence: 'not-running' | 'not-observed' }> {\n const live = TwinEngine.isRunning(domainId, instanceId)\n let state: any = null\n let folded: number | undefined\n if (live) {\n state = unwrapState(TwinEngine.snapshot(domainId, instanceId))\n } else {\n try {\n const rec = await TwinEngine.recover(domainId, instanceId)\n folded = Number((rec as any)?.revision) || undefined\n /*\n * **์ด๋ฒคํธ๋ฅผ ํ๋๋ ์ ์ง ์์ ํด๋๋ ๊ด์ธก์ด ์๋๋ค.** ์ ๋์ด ๋น์ด๋ ๋ณต์์ ์ ์ธ์ ๋ค์ ํฌ์ํ\n * ๊ธฐ์ค์ ์ ๋๋ ค์ค๋ค โ ๊ทธ๊ฒ์ \"ํธ์์ด ๊ด์ธกํ ๊ฐ\" ์ด์ ์ค์ผ๋ฉด **์ ์ธ์ด ๊ด์ธก์ผ๋ก ์์ฅํ๋ค**\n * (์๋ณธ์ด ๋งํ ๊ฐ์ด ์ค๋ฅธ์ชฝ์๋ ๋๊ฐ์ด ์์, ๊ฒฌ์ค ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค). ์ ์ ๊ฒ์ด ์์ผ๋ฉด ์๋ค๊ณ ํ๋ค.\n */\n if (folded == null) return { absence: 'not-running' as const }\n state = unwrapState(rec)\n } catch {\n return { absence: 'not-running' as const }\n }\n }\n const bucket = state ? (state as any)[axis] : null\n /*\n * **์ ๊ด์ธก์ด ์๋์ง ๋งํ๋ค.** ์์ ์๋ ๊ทธ๋ฅ `null` ์ด์๊ณ ํ๋ฉด์ ๊ทธ๊ฒ์ \"ํธ์์ด ์คํ ์ค์ด์ง ์์\"\n * ๋ก ์ฝ์๋ค โ ์คํ ์ค์ธ๋ฐ๋ ๊ทธ๋ ๊ฒ ๋งํ๋ค(๊ณต์ ์์ธ์์ ๊ด์ธก๋จ). ๊ณต์ ยท๋ ์ํผ์ฒ๋ผ **๊ด์ธก ์ถ์ด\n * ์๋ ๊ฒ**์ ํธ์์ด ๋๋ ๋ง๋ ๊ด์ธก์ด ์๋ค. ์ด์ ๊ฐ ๋ค๋ฅด๋ฉด ํ๋ฉด์ด ๋ค๋ฅด๊ฒ ๋งํด์ผ ํ๋ค.\n */\n if (!Array.isArray(bucket)) return { absence: 'not-observed' as const }\n const value = bucket.find((x: any) => x?.id === itemId)\n if (!value) return { absence: 'not-observed' as const }\n return { value, basis: live ? 'state' : 'journal', ...(folded != null ? { foldedRevision: folded } : {}) }\n }\n\n /**\n * ์ด์ด์ง ๊ฒ โ **์๋ฐฉํฅ.** ์ ์ธ๋ ๊ด๊ณ(`TWIN_RELATIONS`)๋ง ๋ฐ๋ผ๊ฐ๋ค.\n *\n * ๊ด๊ณ๋ฅผ ์ฝ๋๊ฐ ์์ง ์์ผ๋ฏ๋ก ๋๋ฉ์ธ์ด ๋์ด๋ ์ฌ๊ธฐ ์๋ ๊ฒ์ด ์๋ค. ๋์ **์ ์ธ์ ์๋ ๊ด๊ณ๋\n * ๊ทธ๋ฆฌ์ง ์๋๋ค** โ ์ง๋์ ์๋ ๊ธธ์ ๊ทธ๋ฆฌ๋ ๊ฒ๋ณด๋ค ์๋ค๊ณ ๋๋ ๊ฒ์ด ์ ์งํ๋ค.\n *\n * ๋ค์ด์ค๋ ์ชฝ(๋๊ฐ ๋๋ฅผ ๊ฐ๋ฆฌํค๋)์ ๊ทธ ์ถ์ ํญ๋ชฉ์ ์ดํด์ผ ์๋ค. ๊ท๋ชจ ๊ท์จ์ **๊น์ด 1 ยท ๋ฐฉํฅ๋ณ\n * ์ํ**์ด๊ณ , ๋์น๋ฉด ๋ช์ด ๋ ์๋์ง ๋งํ๋ค(๋ชฉ๋ก์ผ๋ก ๋ณด๋ผ ์ ์๊ฒ).\n */\n private async linksOf(\n domainId: string,\n inst: any,\n axis: string,\n itemId: string,\n /*\n * ์ด ํญ๋ชฉ ์์ โ **์ํ ์ถ์ ๋ฌธ์์์ ์ฐพ์ ์ ์๋ค.** ๋ถ๋ฅด๋ ์ชฝ์ด ์ด๋ฏธ ์์ ๋ค๊ณ ์์ผ๋ฏ๋ก ๋๊ฒจ\n * ๋ฐ๋๋ค. ์์ผ๋ฉด ์์ ์ฒ๋ผ ๋ฌธ์์์ ์ฐพ๋๋ค(๋ฌธ์ ์ถ์ ๊ฑฐ๋์ ๊ทธ๋๋ก).\n */\n self0?: any\n ): Promise<any> {\n const NEIGHBOR_MAX = 20\n const model = inst.model ?? {}\n\n /*\n * ๊ด์ธก ์ถ์ ํญ๋ชฉ๋ค โ **ํ ๋ฒ๋ง** ์ฝ๋๋ค(๊ด๊ณ๋ง๋ค ๋ค์ ์ ์ผ๋ฉด ์ ๋์ ์ฌ๋ฌ ๋ฒ ์ ๋๋ค).\n * ๋ผ์ด๋ธ๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ, ์์ผ๋ฉด ์ ๋ ํด๋. ์์ผ๋ฉด ๋น ๋ฐฐ์ด(์๋ ๊ฒ์ ์ง์ด๋ด์ง ์๋๋ค).\n */\n let observedState: any\n let observedLoaded = false\n const observedBucket = async (a: string): Promise<any[]> => {\n if (!observedLoaded) {\n observedLoaded = true\n try {\n observedState = TwinEngine.isRunning(domainId, inst.instanceId)\n ? unwrapState(TwinEngine.snapshot(domainId, inst.instanceId))\n : unwrapState(await TwinEngine.recover(domainId, inst.instanceId))\n } catch {\n observedState = null\n }\n }\n const b = observedState ? (observedState as any)[a] : null\n return Array.isArray(b) ? b : []\n }\n\n /*\n * **๊ด๊ณ๋ ์ ์ธ ์ดํ๋ก ํผ๋ค** โ ๋ฌธ์์์ ์ด ํญ๋ชฉ์ ์ฐพ์ ๊ทธ๊ฒ์ ๋ณธ๋ค.\n *\n * ๊ด๊ณ ์ ์ธ์ ํ๋ ์ด๋ฆ(`locations.parentId`)์ **์๋ณธ ๋ฌธ์์ ์ดํ**๋ค. ํ์ ๊ฐ์ ์ฌ์ค์ ์๊ธฐ\n * ์ปฌ๋ผ ์ด๋ฆ์ผ๋ก ๋ด๋๋ค(์๋ฆฌ์ ๊ตฌ์ญ์ `area` FK). ํ์ ๋ณด๊ณ `parentId` ๋ฅผ ์ฐพ์ผ๋ฉด ๋ ๋น์ด์\n * \"์ด์ด์ง ๊ฒ์ด ์๋ค\" ๋ก ์กฐ์ฉํ ๋ตํ๋ค โ ์ค์ ๋ก ๊ทธ๋ฌ๋ค.\n *\n * ์ด๋ ์ชฝ์ด ์ ๋ณธ์ธ๊ฐ๋ก ๊ตฌ๋ถํ๋ฉด ๋ต์ด ๋ถ๋ช
ํ๋ค: ๊ด๊ณ๋ฅผ ์ ์ธํ ์ดํ๊ฐ ๋ฌธ์ ์ดํ์ด๋ฏ๋ก **๋ฌธ์์์\n * ํผ๋ค.** ํ์๋ง ์๊ณ ๋ฌธ์์ ์๋ ํญ๋ชฉ(์์ ์ ์๋ค)์ ์ด์ด์ง ๊ฒ์ด ๋น์ง๋ง, ๊ทธ๊ฒ์ ์ฌ์ค์ด๋ค.\n */\n const axisPath = axisSource(axis) === 'document' ? axisInfo(axis)?.path : undefined\n const rawSelf = axisPath ? at(model, axisPath) : undefined\n const selfAll = Array.isArray(rawSelf) ? rawSelf : rawSelf ? [rawSelf] : []\n const self = self0 ?? selfAll.find((o: any) => idOf(o) === itemId)\n\n /* ๋๊ฐ๋ ์ชฝ โ ๋ด ํ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฒ. ์ ์ธ์ด ํ๋ ์ด๋ฆ์ ์๋ ค ์ค๋ค. */\n const out = relationsFrom(axis).map((r: any) => {\n const raw = self ? this.fieldValue(self, r.field) : []\n const ids = raw.filter((v: any) => v != null).map(String)\n return {\n via: r.via,\n field: r.field,\n optional: !!r.optional,\n /* ๋์์ด ์ถ์ด๋ฉด ๊ทธ ์ถ์ ํญ๋ชฉ์ผ๋ก ๊ฐ ์ ์๋ค. ํ์
ยท์ธ๋ถ(๊ตฌ์ญ)๋ฉด **๊ฐ ๊ณณ์ด ๋ค๋ฅด๋ค** โ\n ํ๋ฉด์ด ๋งํฌ๋ฅผ ๋ง๋ค์ง ๋ง์ง ์์์ผ ํ๋ฏ๋ก ๋์ ์ข
๋ฅ๋ฅผ ๊ทธ๋๋ก ๋ธ๋ค(๋ง๋ค๋ฅธ ๋งํฌ ๊ธ์ง). */\n target: r.target,\n ids: ids.slice(0, NEIGHBOR_MAX),\n total: ids.length\n }\n }).filter((l: any) => l.total > 0)\n\n /* ๋ค์ด์ค๋ ์ชฝ โ ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํญ๋ชฉ๋ค. ๊ทธ ์ถ์ด ํ์ด๋ฉด DB ๊ฐ ์ธ๊ณ , ๋ฌธ์๋ฉด ๋ฌธ์๋ฅผ ์ ์ ์กฐํํ๋ค. */\n const incoming: any[] = []\n for (const r of relationsTo(axis)) {\n const fromInfo = axisInfo(r.from)\n if (!fromInfo) continue\n const hits: string[] = []\n const row = ROW_BACKED[r.from]\n if (row) {\n const repo = getRepository(row.entity)\n /*\n * **FK ๋ ๋ถ๋ฅด์ง ์์ผ๋ฉด ์ค์ง ์๋๋ค.** ๊ด๊ณ ํ๋๋ฅผ ๋ก๋ฉํ์ง ์๊ณ ์กฐํํ๋ฉด ๊ฐ์ด ๋ `undefined`\n * ๋ผ์ \"๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ํ๋๋ ์๋ค\" ๋ก ์กฐ์ฉํ ๋ตํ๋ค โ ์ค์ ๋ก ๊ทธ๋ฌ๋ค(์ค๋น ๋์ด ์ด ์๋ฆฌ๋ฅผ\n * ๊ธฐ์ค์ผ๋ก ์ผ๋๋ฐ ์ด์์ด ๋น์ด ์์๋ค).\n *\n * ์ด๋ ํ๋๊ฐ ๊ด๊ณ์ธ์ง๋ **์ํฐํฐ ๋ฉํ๋ฐ์ดํฐ**๊ฐ ์๋ค. ์ถ๋ง๋ค ํ๋ฅผ ๋๋ฉด ์ถ์ด ๋ ๋๋ง๋ค\n * ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์ผ ํ๊ณ , ๊ณ ์น๋ ๊ฒ์ ์์ผ๋ฉด ๊ฐ์ ์นจ๋ฌต์ด ๋ค์ ์๊ธด๋ค.\n */\n const relationNames = new Set(repo.metadata.relations.map(rel => rel.propertyName))\n const field = r.field.replace(/\\[\\]$/, '').split('.')[0]\n const rows: any[] = await repo.find({\n where: { domain: { id: domainId } as any, instance: { id: inst.id } as any },\n ...(relationNames.has(field) ? { relations: [field] } : {}),\n take: 5000\n })\n for (const x of rows) {\n /* ํ์์๋ ๊ด๊ณ๊ฐ FK ๊ฐ์ฒด์ด๊ฑฐ๋ ์ปฌ๋ผ์ด๋ค โ ์ด๋ฆ ํ๋ณด๋ฅผ ์์๋๋ก ๋ณธ๋ค. */\n const v = this.relationValueOfRow(x, r.field, axis)\n if (v.includes(itemId)) hits.push(x[row.idColumn])\n }\n } else {\n /*\n * ๋ค์ด์ค๋ ์ชฝ์ ํ๋๋ค โ **์ด๋๋ฅผ ํ์์ง๋ ๊ทธ ์ถ์ `source` ๊ฐ ์ ํ๋ค.**\n *\n * ๋ฌธ์ ์ถ์ ๋ชจ๋ธ์์, ๊ด์ธก ์ถ์ **์ํ์์** ํ๋๋ค(์์
โ ์ด ์ค๋, ์์
โ ์ด ์๋ฆฌ). ํ๋์\n * ๊ด์ธก ์ถ์ ๊ฑด๋๋ฐ์๋๋ ์ค๋ ์์ธ๊ฐ \"๋ฟ๋ ๊ด๊ณ๊ฐ ์์ต๋๋ค\" ๋ผ๊ณ ๋ตํ๋ค โ `tasks.orderId` ๋ฅผ\n * ์ ์ธํด ๋๊ณ ๋ ๊ทธ ๊ด๊ณ๋ฅผ ๊ทธ๋ฆฌ์ง ์์ ๊ฒ์ด๋ค. ์ ์ธํ ๊ฒ์ ๊ทธ๋ฆฌ์ง ์์ผ๋ฉด ์ ์ธ์ด ๊ฑฐ์ง์ด ๋๋ค.\n *\n * ๊ท๋ชจ: ์ํ๋ ์ง๊ธ์ ์ฌ์ค๋ง ๋ด์ ์ ํํ๊ณ , ์ํ๊ณผ ์ด๊ณ๋ ๋ฌธ์ ์ถ๊ณผ ๊ฐ์ ๊ท์จ์ ์ด๋ค\n * (๋์น๋ฉด ๋ช์ด ๋ ์๋์ง ๋งํ๋ค). ์ ๋ ์ ์ฒด๋ฅผ ์ ์ ์กฐํํ๋ ์ผ์ ์ฌ๊ธฐ์ ํ์ง ์๋๋ค.\n */\n const raw =\n axisSource(r.from) === 'document' ? at(model, fromInfo.path) : (await observedBucket(r.from))\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n for (const x of all) if (this.fieldValue(x, r.field).map(String).includes(itemId)) {\n const id = idOf(x)\n if (id) hits.push(id)\n }\n }\n if (hits.length) incoming.push({ via: r.via, from: r.from, field: r.field, ids: hits.slice(0, NEIGHBOR_MAX), total: hits.length })\n }\n\n return { out, incoming }\n }\n\n /**\n * ์ ์ธ ํ๋ ๊ฒฝ๋ก โ ๊ฐ๋ค. `inputs[].material` ์ฒ๋ผ **๋ฐฐ์ด์ ์ง๋๋ ๊ฒฝ๋ก**๋ฅผ ๋ค๋ฃฌ๋ค.\n * ๋ฐฐ์ด ํ๊ธฐ(`[]`)๊ฐ ๊ด๊ณ ์ ์ธ์ ๋ฌธ๋ฒ์ด๋ฏ๋ก ๊ทธ๊ฒ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๊ณง ์ ์ธ์ ์กด์คํ๋ ๊ฒ์ด๋ค.\n */\n private fieldValue(obj: any, field: string): any[] {\n let cur: any[] = [obj]\n for (const seg of field.split('.')) {\n const isArray = seg.endsWith('[]')\n const key = isArray ? seg.slice(0, -2) : seg\n const next: any[] = []\n for (const c of cur) {\n if (c == null) continue\n const v = c[key]\n if (v == null) continue\n if (Array.isArray(v)) next.push(...v)\n else next.push(v)\n }\n cur = next\n }\n return cur.map(v => (typeof v === 'object' && v !== null ? idOf(v) ?? v : v)).filter(v => v != null)\n }\n\n /**\n * ํ์์ ๊ด๊ณ ๊ฐ์ ๊บผ๋ธ๋ค โ FK ๋ ๊ฐ์ฒด(๊ด๊ณ ๋ฏธ๋ก๋ฉ์ด๋ฉด ์์)์ด๊ณ ๋ฌธ์ ํ๋๋ช
๊ณผ ์ปฌ๋ผ๋ช
์ด ๋ค๋ฅผ ์ ์๋ค.\n *\n * ์ฌ๊ธฐ์ ์ปฌ๋ผ ์ด๋ฆ์ **์ถ๋ง๋ค ํ๋ก ๋์ง ์๋๋ค.** ํ๋ณด๋ฅผ ์์๋๋ก ๋ณด๋ ํธ์ด ์ถ์ด ๋ ๋ ๊ณ ์น ๊ฒ์ด\n * ์๋ค: ๊ด๊ณ ํ๋ ์ด๋ฆ ๊ทธ๋๋ก ยท ๊ทธ ์ด๋ฆ์ FK ๊ฐ์ฒด์ id ์ปฌ๋ผ.\n */\n private relationValueOfRow(rowObj: any, field: string, targetAxis: string): string[] {\n const key = field.replace(/\\[\\]$/, '').split('.')[0]\n const v = rowObj[key]\n if (v == null) return []\n if (typeof v === 'string') return [v]\n if (Array.isArray(v)) return v.map(x => (typeof x === 'string' ? x : idOf(x) ?? '')).filter(Boolean)\n /* FK ๊ฐ์ฒด โ ๋์ ์ถ์ id ์ปฌ๋ผ์ผ๋ก ์ฝ๋๋ค(๊ด๊ณ๋ฅผ ๋ก๋ฉํ์ง ์์์ผ๋ฉด ๊ฐ์ด ์๊ณ , ๊ทธ๊ฒ๋ ์ฌ์ค์ด๋ค). */\n const idCol = ROW_BACKED[targetAxis]?.idColumn\n const got = idCol ? v[idCol] : idOf(v)\n return got ? [String(got)] : []\n }\n}\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export declare class TwinModelMutation {
|
|
2
|
+
reprojectTwinModel(instanceId: string, context: ResolverContext): Promise<any>;
|
|
3
|
+
/**
|
|
4
|
+
* ํ์ฅ์ด ์ ํ๋ ์๋ฅผ ํธ์์ ์น๋๋ค โ **๊ตฌ์กฐ๋ ์์ฒ์ด, ์๋ ํ์ฅ์ด.**
|
|
5
|
+
*
|
|
6
|
+
* โโ ์ ์ด ๋ฌธ์ด ํ์ํ๋ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
7
|
+
* ์ปค๋ฅํฐ๋ก ๋ง๋ ํธ์์ ๊ณํต๋ยท๊ณ๋ ์ง์ ์ ์ ์์คํ
์์ ์ฝ์ด ์จ๋ค. ๊ทธ๋ฐ๋ฐ ์๊ธ ๋จ๊ฐยท๊ณ์ฝ ์ ๋ณดยท
|
|
8
|
+
* ์ถ์ ์ง ์ถฉ์ ์จ์ ์ ์์คํ
์ด ๋ชจ๋ฅธ๋ค(SCADA ๊ฒ์ดํธ์จ์ด๋ ์ฐ๋ฆฌ ์ ๊ธฐ ๊ณ์ฝ์ ์์ง ๋ชปํ๋ค). ๊ทธ๋์
|
|
9
|
+
* ๊ณ๋์ด ํ๋ฅด๋ ํธ์์์๋ **๊ธ์ก์ด ์์ํ ๋์ค์ง ์์๋ค** โ ๋ฃ์ ๋ฌธ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ค.
|
|
10
|
+
*
|
|
11
|
+
* ๊ฐ์ `model` ์ ์ง์ ์ฐ์ง ์๊ณ **๊ฒน**์ผ๋ก ๋ณด๊ดํ๋ค: ๋ชจ๋ธ์ ์์ฒ์ ์ฌ๋ณธ์ด๋ฏ๋ก ๋ค์ ์ฝ๊ธฐ๊ฐ ๊ทธ๊ฒ์
|
|
12
|
+
* ์๋ก ๊ทธ๋ฆฌ๋ฉด ์ง์ ์ด ๊ฐ์ ์กฐ์ฉํ ์ฌ๋ผ์ง๋ค. ๊ฒน์ ๋ชจ๋ธ์ ๊ทธ๋ฆด ๋๋ง๋ค ๋ค์ ์นํ๋ค.
|
|
13
|
+
*
|
|
14
|
+
* โโ ๋๊ณ ์๋ ํธ์์ ์ด๋ป๊ฒ ๋ฐ์ํ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
15
|
+
* ๋ฏธ๋ฌ๋ **๋์ ์ค์** ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋๋ค(ํ์ค์ ๋ฉ์ถ์ง ์๋๋ค). ์๋ฎฌ๋ ์ด์
์ ๋ฐ์ง ์๋๋ค โ ์กฐ๊ฑด์ด
|
|
16
|
+
* ๋ฐ๋ ์คํ์ ๋ค๋ฅธ ์คํ์ด๊ณ , ์ปค๋์ด ๊ทธ๋ ๊ฒ ๊ฑฐ์ ํ๋ค. ๊ทธ๋๋ ์ ์ฅ๋ง ํ๊ณ **๊ทธ ์ฌ์ค์ ๋งํ๋ค**:
|
|
17
|
+
* ์กฐ์ฉํ ์ฑ๊ณต์ผ๋ก ๋ตํ๋ฉด ์ฌ์ฉ์๋ ์ง๊ธ ํ๋ฉด์ ์๊ฐ ์ ์ ์ธ์ผ๋ก ๊ณ์ฐ๋ ์ค๋ก ์ฝ๋๋ค.
|
|
18
|
+
*/
|
|
19
|
+
declareTwinProperties(instanceId: string, declarations: any[], context: ResolverContext): Promise<any>;
|
|
20
|
+
/**
|
|
21
|
+
* ์ ์ธ์ **์ฒ ํํ๋ค** โ ์๋ชป ๋ฃ์ ๊ฐ์ ์์ฒ์ผ๋ก ๋๋๋ฆฌ๋ ๋ฌธ.
|
|
22
|
+
*
|
|
23
|
+
* โโ ์ ๋ฐ๋ก ๋ฌธ์ด ํ์ํ๊ฐ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
24
|
+
* ์ ์ธ์ ๊ฒน์ ๋ณด๊ด๋์ง๋ง **์ ์ฅ๋ ๋ชจ๋ธ์ ๊ตฌ์์ง๋ค.** ๊ทธ๋์ ๊ฒน์์ ์ค๋ง ์ง์๋ ์๋ ๊ฐ์ด ๋์์ค์ง
|
|
25
|
+
* ์๋๋ค โ ๋๋๋ฆด ๋ฐฉ๋ฒ์ด ์์ ์์ด์, ์คํ๋ฅผ ใ์๋ ๊ฐ์ ๋ค์ ์ ์ธํ๋ใ ์ฐํ๋ก๋ง ๊ณ ์น ์ ์์๋ค
|
|
26
|
+
* (์ฌ์ฉ์๊ฐ ์๋ ๊ฐ์ ์๊ณ ์์ด์ผ ํ๋ค๋ ๋ป์ด๊ณ , ๋ชจ๋ฅด๋ฉด ๊ทธ ๊ฐ์ ์๊ตฌํ ์ด๊ธด๋ค).
|
|
27
|
+
*
|
|
28
|
+
* ๊ทธ๋์ ๊ฒน์ด **๋ฌด์์ ๋ฎ์๋์ง** ํจ๊ป ๊ธฐ์ตํ๊ฒ ํ๊ณ (`replaced`), ์ฒ ํ๋ ๊ทธ ๊ธฐ์ต์ผ๋ก ๋๋๋ฆฐ๋ค.
|
|
29
|
+
* ๊ธฐ์ต์ด ์๋ ์ ์ ์ธ์ **์๋์ง ์๊ณ ๊ทธ๋ ๊ฒ ๋งํ๋ค**(`unknownSource`) โ ์๋ ๊ฐ์ ์ง์ด๋ด๋ ๊ฒ์
|
|
30
|
+
* ์๋ชป ๋ฃ์ ๊ฐ์ ๊ทธ๋๋ก ๋๋ ๊ฒ๋ณด๋ค ๋์๋ค. ๊ทธ ์๋ฆฌ๋ ๋ค์ ์์ฒ ์ฌ์ฝ๊ธฐ๊ฐ ๋ฐ๋ก์ก๋๋ค.
|
|
31
|
+
*
|
|
32
|
+
* ๋ฐ์ ๋ฐฉ์์ ์ ์ธ๊ณผ ๊ฐ๋ค: ๋ฏธ๋ฌ๋ ์ง๊ธ ๋ฐ๊ณ (`adoptStructure`), ์๋ฎฌ๋ ์ด์
์ ์ฌ๊ธฐ๋ ๋ ๋ฐ๋๋ค.
|
|
33
|
+
*/
|
|
34
|
+
revokeTwinDeclarations(instanceId: string, revocations: any[], context: ResolverContext): Promise<any>;
|
|
35
|
+
/**
|
|
36
|
+
* **ํ์ฅ์ ๊ฐ์ ์ ์ธํ๋ค** โ ํธ์์ด ์๋๋ผ ํ์ฅ์ด ์ฃผ์ด๋ค.
|
|
37
|
+
*
|
|
38
|
+
* โโ ์ ํธ์ ๋ฌธ๊ณผ ๊ฐ๋๋ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
39
|
+
* ์ฒ์์๋ ํธ์ ๋ฌธ์ ๋ฒ์ ์ธ์๋ฅผ ๋์๋ค. ๊ทธ๋ฌ๋ฉด **ํ์ฅ ๊ฐ์ ๋ฃ์ผ๋ ค๊ณ ํธ์์ ๊ณจ๋ผ์ผ ํ๋ค** โ ํธ์์ ๊ทธ
|
|
40
|
+
* ๊ฐ์ ์ฝ๋ ์ชฝ์ด๋ฏ๋ก ๊ฐ๋
์ด ๊ฑฐ๊พธ๋ก๋ค(์ฌ์ฉ์๊ฐ ๊ทธ ์ด๊ธ๋จ์ ์ง์ ํ๋ค). ์ฃผ์ด๊ฐ ๋ค๋ฅด๋ฉด ๋ฌธ๋ ๋ค๋ฅด๋ค.
|
|
41
|
+
*
|
|
42
|
+
* ์ดํ๋ **๊ทธ ํ์ฅ ํธ์๋ค์ ํฉ์งํฉ**์ผ๋ก ๊ฒ์ฌํ๋ค: ํ ํ์ฅ์ ์ฌ๋ฌ ์ข
๋ฅ๊ฐ ์ด๊ณ , ์๊ธ์ ์๋์ง ํธ์๋ง
|
|
43
|
+
* ์ฝ๋๋ค. ์ด๋ ์ข
๋ฅ๋ ์ฝ์ง ์๋ ์์ฑ์ ๊ฑฐ์ ํ๋ค(๋ชจ๋ฅด๋ ๊ฐ์ ๋ฐ์ ๋๋ฉด ์ฌ์ฉ์๋ ๋ฃ์๋ค๊ณ ๋ฏฟ๋๋ค).
|
|
44
|
+
*
|
|
45
|
+
* ๋ฃ์ ๊ฐ์ ๊ทธ ํ์ฅ์ **ํธ์ ์ ๋ถ**์ ์นํ๋ค โ ํ ํธ์๋ง ๋ฐ๊ฟ ๋๋ฉด ใํ์ฅ ์ ์ฒด๊ฐ ์ฝ๋๋คใ๊ฐ ๊ฑฐ์ง์ด ๋๋ค.
|
|
46
|
+
* ์น์ ์๋ฆฌ๊ฐ ์๋ ํธ์์ ์ ์์ด๊ณ (์ฐฝ๊ณ ํธ์์ ์๊ธ ์๋ฆฌ๊ฐ ์๋ค), ์๋ฌด ํธ์๋ ๋ฐ์ง ์์๋ค๋ฉด ๊ทธ ์ฌ์ค์
|
|
47
|
+
* ๋งํ๋ค.
|
|
48
|
+
*/
|
|
49
|
+
declareSpaceProperties(spaceId: string, declarations: any[], context: ResolverContext): Promise<any>;
|
|
50
|
+
/**
|
|
51
|
+
* ํ์ฅ์ ์ ์ธ์ ์ฒ ํํ๋ค โ ๊ทธ ํ์ฅ์ **๋ชจ๋ ํธ์์์** ์ฌ๋ผ์ง๋ค.
|
|
52
|
+
*
|
|
53
|
+
* ํธ์์ด ๊ฐ์ ์์ฑ์ ์๊ธฐ ๊ฒน์ ๊ฐ๊ณ ์์ผ๋ฉด ๊ทธ ๊ฐ์ ๋จ๋๋ค(์ข์ ๊ฒ์ด ์ด๊ธด๋ค) โ ํ์ฅ ๊ฐ์ ๋บ๋๋ฐ ๊ทธ
|
|
54
|
+
* ํธ์๋ง ๊ทธ๋๋ก์ธ ๊ฒ์ด ์ณ๋ค. ํธ์๋ง๋ค ใ์์ฒ์ผ๋ก ๋๋๋ฆฌ๊ณ ๋จ์ ๋ ๊ฒน์ ๋ค์ ์น๊ธฐใ๋ฅผ ํ๋ค.
|
|
55
|
+
*/
|
|
56
|
+
revokeSpaceDeclarations(spaceId: string, revocations: any[], context: ResolverContext): Promise<any>;
|
|
57
|
+
}
|