@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,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EPCIS_CONCEPTS = void 0;
|
|
4
|
+
exports.epcisCoverage = epcisCoverage;
|
|
5
|
+
/* Part: EPCIS 2.0 의 사건 종류 — 무엇이 일어났는가. */
|
|
6
|
+
const EVENTS = [
|
|
7
|
+
{
|
|
8
|
+
std: 'ObjectEvent',
|
|
9
|
+
part: 'events',
|
|
10
|
+
label: 'twin.epcis.ObjectEvent',
|
|
11
|
+
axis: 'items',
|
|
12
|
+
structure: 'full',
|
|
13
|
+
behavior: 'full',
|
|
14
|
+
surface: 'full',
|
|
15
|
+
note: 'twin.epcis.note.ObjectEvent'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
std: 'AggregationEvent',
|
|
19
|
+
part: 'events',
|
|
20
|
+
label: 'twin.epcis.AggregationEvent',
|
|
21
|
+
axis: null,
|
|
22
|
+
shownOn: ['items'],
|
|
23
|
+
structure: 'full',
|
|
24
|
+
behavior: 'full',
|
|
25
|
+
surface: 'partial',
|
|
26
|
+
note: 'twin.epcis.note.AggregationEvent'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
std: 'TransactionEvent',
|
|
30
|
+
part: 'events',
|
|
31
|
+
label: 'twin.epcis.TransactionEvent',
|
|
32
|
+
axis: 'orders',
|
|
33
|
+
structure: 'full',
|
|
34
|
+
behavior: 'full',
|
|
35
|
+
surface: 'partial',
|
|
36
|
+
note: 'twin.epcis.note.TransactionEvent'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
std: 'TransformationEvent',
|
|
40
|
+
part: 'events',
|
|
41
|
+
label: 'twin.epcis.TransformationEvent',
|
|
42
|
+
axis: null,
|
|
43
|
+
shownOn: ['items', 'operations'],
|
|
44
|
+
structure: 'full',
|
|
45
|
+
behavior: 'full',
|
|
46
|
+
surface: 'full',
|
|
47
|
+
note: 'twin.epcis.note.TransformationEvent'
|
|
48
|
+
},
|
|
49
|
+
/* EPCIS 2.0 이 더한 사건 — 우리는 타입조차 두지 않았다. 없는 것은 없다고 적는다. */
|
|
50
|
+
{
|
|
51
|
+
std: 'AssociationEvent',
|
|
52
|
+
part: 'events',
|
|
53
|
+
label: 'twin.epcis.AssociationEvent',
|
|
54
|
+
axis: null,
|
|
55
|
+
structure: 'none',
|
|
56
|
+
behavior: 'none',
|
|
57
|
+
surface: 'none',
|
|
58
|
+
note: 'twin.epcis.note.AssociationEvent'
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
/* Part: 사건이 답하는 다섯 가지 — 무엇을·어디서·언제·왜, 그리고 어떤 거래로. */
|
|
62
|
+
const FIELDS = [
|
|
63
|
+
{
|
|
64
|
+
std: 'epcList / quantityList',
|
|
65
|
+
part: 'fields',
|
|
66
|
+
label: 'twin.epcis.identity',
|
|
67
|
+
axis: 'items',
|
|
68
|
+
structure: 'full',
|
|
69
|
+
behavior: 'full',
|
|
70
|
+
surface: 'full',
|
|
71
|
+
note: 'twin.epcis.note.identity'
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
std: 'bizStep / disposition (CBV)',
|
|
75
|
+
part: 'fields',
|
|
76
|
+
label: 'twin.epcis.cbv',
|
|
77
|
+
axis: null,
|
|
78
|
+
shownOn: ['items', 'tasks'],
|
|
79
|
+
structure: 'full',
|
|
80
|
+
behavior: 'full',
|
|
81
|
+
surface: 'full',
|
|
82
|
+
note: 'twin.epcis.note.cbv'
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
std: 'readPoint / bizLocation',
|
|
86
|
+
part: 'fields',
|
|
87
|
+
label: 'twin.epcis.where',
|
|
88
|
+
axis: 'locations',
|
|
89
|
+
structure: 'full',
|
|
90
|
+
behavior: 'full',
|
|
91
|
+
surface: 'full',
|
|
92
|
+
note: 'twin.epcis.note.where'
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
std: 'bizTransactionList',
|
|
96
|
+
part: 'fields',
|
|
97
|
+
label: 'twin.epcis.bizTransaction',
|
|
98
|
+
axis: 'orders',
|
|
99
|
+
structure: 'full',
|
|
100
|
+
behavior: 'full',
|
|
101
|
+
surface: 'partial',
|
|
102
|
+
note: 'twin.epcis.note.bizTransaction'
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
std: 'ilmd',
|
|
106
|
+
part: 'fields',
|
|
107
|
+
label: 'twin.epcis.ilmd',
|
|
108
|
+
axis: null,
|
|
109
|
+
shownOn: ['items'],
|
|
110
|
+
structure: 'full',
|
|
111
|
+
behavior: 'full',
|
|
112
|
+
surface: 'partial',
|
|
113
|
+
note: 'twin.epcis.note.ilmd'
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
std: 'errorDeclaration',
|
|
117
|
+
part: 'fields',
|
|
118
|
+
label: 'twin.epcis.errorDeclaration',
|
|
119
|
+
axis: null,
|
|
120
|
+
shownOn: ['items'],
|
|
121
|
+
structure: 'full',
|
|
122
|
+
behavior: 'partial',
|
|
123
|
+
surface: 'none',
|
|
124
|
+
note: 'twin.epcis.note.errorDeclaration'
|
|
125
|
+
},
|
|
126
|
+
/* 모양만 있고 아무도 채우지 않는 것들 — 구조만 있음. */
|
|
127
|
+
{
|
|
128
|
+
std: 'sourceList / destinationList',
|
|
129
|
+
part: 'fields',
|
|
130
|
+
label: 'twin.epcis.sourceDestination',
|
|
131
|
+
axis: null,
|
|
132
|
+
structure: 'partial',
|
|
133
|
+
behavior: 'none',
|
|
134
|
+
surface: 'none',
|
|
135
|
+
note: 'twin.epcis.note.sourceDestination'
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
std: 'persistentDisposition',
|
|
139
|
+
part: 'fields',
|
|
140
|
+
label: 'twin.epcis.persistentDisposition',
|
|
141
|
+
axis: null,
|
|
142
|
+
structure: 'partial',
|
|
143
|
+
behavior: 'none',
|
|
144
|
+
surface: 'none',
|
|
145
|
+
note: 'twin.epcis.note.persistentDisposition'
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
std: 'sensorElementList',
|
|
149
|
+
part: 'fields',
|
|
150
|
+
label: 'twin.epcis.sensorElement',
|
|
151
|
+
axis: null,
|
|
152
|
+
structure: 'partial',
|
|
153
|
+
behavior: 'none',
|
|
154
|
+
surface: 'none',
|
|
155
|
+
note: 'twin.epcis.note.sensorElement'
|
|
156
|
+
}
|
|
157
|
+
];
|
|
158
|
+
exports.EPCIS_CONCEPTS = [...EVENTS, ...FIELDS];
|
|
159
|
+
function epcisCoverage(axes) {
|
|
160
|
+
const known = new Set(axes);
|
|
161
|
+
const concepts = exports.EPCIS_CONCEPTS.map(c => {
|
|
162
|
+
const axisMissing = !!c.axis && !known.has(c.axis);
|
|
163
|
+
const shownOn = c.shownOn?.filter(a => known.has(a));
|
|
164
|
+
const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
|
|
165
|
+
return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
|
|
166
|
+
});
|
|
167
|
+
const count = (k) => concepts.filter(c => c[k] === 'full').length;
|
|
168
|
+
return {
|
|
169
|
+
model: 'GS1 EPCIS 2.0',
|
|
170
|
+
concepts,
|
|
171
|
+
totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=epcis-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epcis-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/epcis-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * GS1 EPCIS 2.0 적합성 기준 — **물류·제조 트윈이 표준의 어디를 채우고 있나.**\n *\n * ── 왜 따로 있나 ────────────────────────────────────────────────────────────\n * 적합성 패널이 ISA-95 하나만 말하고 있었다. 그런데 창고·야드·공장 트윈에서 「무슨 일이 있었나」와\n * 「이 번호가 무엇을 가리키나」를 정하는 것은 EPCIS 다. ISA-95 표만 보이면 그 트윈이 기대는 기준의\n * 절반이 화면에 없다.\n *\n * ── 수준은 근거를 보고 적었다 ───────────────────────────────────────────────\n * 「있다/없다」를 기억으로 적지 않는다. 각 줄의 판단 근거:\n * · 타입 선언 — 커널 `epcis.ts`(이벤트·필드의 모양)\n * · 실제 사용 — 커널 도메인(`mes-kernel`·`face2-adapter`·`observed-reducer`)과 호스트 인제스트\n * · 화면 노출 — 저널·계보·엔티티 360\n * 모양만 있고 아무도 채우지 않는 필드는 **구조만 있음**으로 적는다(그게 사실이다).\n *\n * ISA-95 표와 같은 규율이다(`isa95-coverage.ts` 머리말): 사람이 판단해 적고, 틀리면 여기를 고친다.\n */\nimport type { Isa95Concept, CoverageLevel } from './isa95-coverage.js'\n\n/* Part: EPCIS 2.0 의 사건 종류 — 무엇이 일어났는가. */\nconst EVENTS: Isa95Concept[] = [\n {\n std: 'ObjectEvent',\n part: 'events',\n label: 'twin.epcis.ObjectEvent',\n axis: 'items',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.ObjectEvent'\n },\n {\n std: 'AggregationEvent',\n part: 'events',\n label: 'twin.epcis.AggregationEvent',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.AggregationEvent'\n },\n {\n std: 'TransactionEvent',\n part: 'events',\n label: 'twin.epcis.TransactionEvent',\n axis: 'orders',\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.TransactionEvent'\n },\n {\n std: 'TransformationEvent',\n part: 'events',\n label: 'twin.epcis.TransformationEvent',\n axis: null,\n shownOn: ['items', 'operations'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.TransformationEvent'\n },\n /* EPCIS 2.0 이 더한 사건 — 우리는 타입조차 두지 않았다. 없는 것은 없다고 적는다. */\n {\n std: 'AssociationEvent',\n part: 'events',\n label: 'twin.epcis.AssociationEvent',\n axis: null,\n structure: 'none',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.AssociationEvent'\n }\n]\n\n/* Part: 사건이 답하는 다섯 가지 — 무엇을·어디서·언제·왜, 그리고 어떤 거래로. */\nconst FIELDS: Isa95Concept[] = [\n {\n std: 'epcList / quantityList',\n part: 'fields',\n label: 'twin.epcis.identity',\n axis: 'items',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.identity'\n },\n {\n std: 'bizStep / disposition (CBV)',\n part: 'fields',\n label: 'twin.epcis.cbv',\n axis: null,\n shownOn: ['items', 'tasks'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.cbv'\n },\n {\n std: 'readPoint / bizLocation',\n part: 'fields',\n label: 'twin.epcis.where',\n axis: 'locations',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.where'\n },\n {\n std: 'bizTransactionList',\n part: 'fields',\n label: 'twin.epcis.bizTransaction',\n axis: 'orders',\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.bizTransaction'\n },\n {\n std: 'ilmd',\n part: 'fields',\n label: 'twin.epcis.ilmd',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.ilmd'\n },\n {\n std: 'errorDeclaration',\n part: 'fields',\n label: 'twin.epcis.errorDeclaration',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'partial',\n surface: 'none',\n note: 'twin.epcis.note.errorDeclaration'\n },\n /* 모양만 있고 아무도 채우지 않는 것들 — 구조만 있음. */\n {\n std: 'sourceList / destinationList',\n part: 'fields',\n label: 'twin.epcis.sourceDestination',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.sourceDestination'\n },\n {\n std: 'persistentDisposition',\n part: 'fields',\n label: 'twin.epcis.persistentDisposition',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.persistentDisposition'\n },\n {\n std: 'sensorElementList',\n part: 'fields',\n label: 'twin.epcis.sensorElement',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.sensorElement'\n }\n]\n\nexport const EPCIS_CONCEPTS: Isa95Concept[] = [...EVENTS, ...FIELDS]\n\nexport function epcisCoverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const known = new Set(axes)\n const concepts = EPCIS_CONCEPTS.map(c => {\n const axisMissing = !!c.axis && !known.has(c.axis)\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c\n return axisMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing } : fixed\n })\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n model: 'GS1 EPCIS 2.0',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Isa95Concept } from './isa95-coverage.js';
|
|
2
|
+
export declare const IEC61850_CONCEPTS: Isa95Concept[];
|
|
3
|
+
export declare function iec61850Coverage(axes: string[]): {
|
|
4
|
+
model: string;
|
|
5
|
+
concepts: (Isa95Concept & {
|
|
6
|
+
axisMissing?: boolean;
|
|
7
|
+
})[];
|
|
8
|
+
totals: {
|
|
9
|
+
concepts: number;
|
|
10
|
+
structure: number;
|
|
11
|
+
behavior: number;
|
|
12
|
+
surface: number;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IEC61850_CONCEPTS = void 0;
|
|
4
|
+
exports.iec61850Coverage = iec61850Coverage;
|
|
5
|
+
/*
|
|
6
|
+
* Part 7-4 — 논리 노드 클래스. 이 프로파일이 쓰는 것만 적는다(표준 전체를 옮기지 않는다):
|
|
7
|
+
* 계량·계측·개폐·발전·저장.
|
|
8
|
+
*/
|
|
9
|
+
const LOGICAL_NODES = [
|
|
10
|
+
/*
|
|
11
|
+
* 계량(적산) — 커넥터가 누적 전력량을 실어 오고 상태가 지점별로 들고 있다. 화면은 계량 컴포넌트가
|
|
12
|
+
* 지점의 값을 보인다.
|
|
13
|
+
*/
|
|
14
|
+
{
|
|
15
|
+
std: 'MMTR',
|
|
16
|
+
part: '7-4',
|
|
17
|
+
label: 'twin.iec61850.MMTR',
|
|
18
|
+
axis: 'equipment',
|
|
19
|
+
structure: 'full',
|
|
20
|
+
behavior: 'full',
|
|
21
|
+
surface: 'full',
|
|
22
|
+
note: 'twin.iec61850.note.MMTR'
|
|
23
|
+
},
|
|
24
|
+
/*
|
|
25
|
+
* 계측(유효전력·역률) — 표본이 수요 구간으로 접히고, 구간·피크·계약 대비가 그 위에 선다.
|
|
26
|
+
* 이 프로파일에서 가장 두껍게 채운 자리다.
|
|
27
|
+
*/
|
|
28
|
+
{
|
|
29
|
+
std: 'MMXU',
|
|
30
|
+
part: '7-4',
|
|
31
|
+
label: 'twin.iec61850.MMXU',
|
|
32
|
+
axis: 'demandWindows',
|
|
33
|
+
structure: 'full',
|
|
34
|
+
behavior: 'full',
|
|
35
|
+
surface: 'full',
|
|
36
|
+
note: 'twin.iec61850.note.MMXU'
|
|
37
|
+
},
|
|
38
|
+
/*
|
|
39
|
+
* ── 셋이 함께 올라갔다 (2026-08-15) ──────────────────────────────────────
|
|
40
|
+
* 개폐·발전·저장은 오래 「구조만 있음」이었다. 능력이 상태 필드를 선언해 두었는데 **값을 받는 문이
|
|
41
|
+
* 없었기 때문**이다. 이제 셋 다 실제로 돈다: 설비 상태가 계약에 서고(`EquipmentState`), 커널이
|
|
42
|
+
* `energy.equipment` 로 받아 그 설비에 적고, 씬 컴포넌트가 그린다.
|
|
43
|
+
*
|
|
44
|
+
* 세 층을 함께 올리는 이유: 값이 없는데 화면만 만들면 영원히 「—」인 카드가 되고, 화면이 없는데
|
|
45
|
+
* 기능만 올리면 아무도 그 값을 보지 못한다. 「값이 먼저, 컴포넌트는 그 다음」의 결과다.
|
|
46
|
+
*/
|
|
47
|
+
{
|
|
48
|
+
std: 'XCBR',
|
|
49
|
+
part: '7-4',
|
|
50
|
+
label: 'twin.iec61850.XCBR',
|
|
51
|
+
axis: null,
|
|
52
|
+
shownOn: ['equipment'],
|
|
53
|
+
structure: 'full',
|
|
54
|
+
behavior: 'full',
|
|
55
|
+
surface: 'full',
|
|
56
|
+
note: 'twin.iec61850.note.XCBR'
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
std: 'DPVA',
|
|
60
|
+
part: '7-4',
|
|
61
|
+
label: 'twin.iec61850.DPVA',
|
|
62
|
+
axis: null,
|
|
63
|
+
shownOn: ['equipment'],
|
|
64
|
+
structure: 'full',
|
|
65
|
+
behavior: 'full',
|
|
66
|
+
surface: 'full',
|
|
67
|
+
note: 'twin.iec61850.note.DPVA'
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
std: 'ZBAT',
|
|
71
|
+
part: '7-4',
|
|
72
|
+
label: 'twin.iec61850.ZBAT',
|
|
73
|
+
axis: null,
|
|
74
|
+
shownOn: ['equipment'],
|
|
75
|
+
structure: 'full',
|
|
76
|
+
behavior: 'full',
|
|
77
|
+
surface: 'full',
|
|
78
|
+
note: 'twin.iec61850.note.ZBAT'
|
|
79
|
+
}
|
|
80
|
+
];
|
|
81
|
+
exports.IEC61850_CONCEPTS = [...LOGICAL_NODES]; // vocabulary-guard: allow — 표준 용어(위 주석)
|
|
82
|
+
function iec61850Coverage(axes) {
|
|
83
|
+
const known = new Set(axes);
|
|
84
|
+
const concepts = exports.IEC61850_CONCEPTS.map(c => {
|
|
85
|
+
const axisMissing = !!c.axis && !known.has(c.axis);
|
|
86
|
+
const shownOn = c.shownOn?.filter(a => known.has(a));
|
|
87
|
+
const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
|
|
88
|
+
return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
|
|
89
|
+
});
|
|
90
|
+
const count = (k) => concepts.filter(c => c[k] === 'full').length;
|
|
91
|
+
return {
|
|
92
|
+
/* 이름에 (vocabulary) 를 달아 둔다 — 프로토콜 적합성으로 읽히지 않게. */
|
|
93
|
+
model: 'IEC 61850 (vocabulary)',
|
|
94
|
+
concepts,
|
|
95
|
+
totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=iec61850-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iec61850-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/iec61850-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * IEC 61850 적합성 기준 — **에너지 트윈이 표준의 어디를 채우고 있나.**\n *\n * ── 왜 따로 있나 ────────────────────────────────────────────────────────────\n * 인스펙션의 적합성 패널은 트윈 종류와 무관하게 ISA-95 하나만 말하고 있었다. 에너지 트윈에서 그것은\n * 거짓은 아니지만(설비·계층·속성은 에너지에서도 ISA-95 자원이다) **부족하다** — 계량기·차단기·태양광·\n * 축전지의 어휘를 주는 것은 IEC 61850 이고, 무엇이 비었는지도 그 목록으로만 셀 수 있다.\n *\n * ── 주장 수준을 못 박는다 ───────────────────────────────────────────────────\n * 여기서 재는 것은 **어휘와 모델**이다. 프로토콜(MMS·GOOSE·샘플드값)을 구현했다는 뜻이 아니며,\n * 그 주장은 적합성 시험이 뒷받침해야 한다. 표 이름을 「IEC 61850 (vocabulary)」로 쓰는 이유다.\n *\n * ── 값은 관측이 아니라 선언이다 ─────────────────────────────────────────────\n * ISA-95 표와 같은 규율이다(`isa95-coverage.ts` 머리말): 사람이 판단해 적고, 틀리면 여기를 고친다.\n * 자동으로 알 수 있는 것 하나만 자동으로 한다 — 축 이름이 커널 축 목록에 없으면 구조가 없는 것이다.\n */\nimport type { Isa95Concept, CoverageLevel } from './isa95-coverage.js'\n\n/*\n * Part 7-4 — 논리 노드 클래스. 이 프로파일이 쓰는 것만 적는다(표준 전체를 옮기지 않는다):\n * 계량·계측·개폐·발전·저장.\n */\nconst LOGICAL_NODES: Isa95Concept[] = [ // vocabulary-guard: allow — IEC 61850 의 「논리 노드(logical node)」는 표준 용어다(우리가 은퇴시킨 node 어휘가 아니다)\n /*\n * 계량(적산) — 커넥터가 누적 전력량을 실어 오고 상태가 지점별로 들고 있다. 화면은 계량 컴포넌트가\n * 지점의 값을 보인다.\n */\n {\n std: 'MMTR',\n part: '7-4',\n label: 'twin.iec61850.MMTR',\n axis: 'equipment',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.MMTR'\n },\n /*\n * 계측(유효전력·역률) — 표본이 수요 구간으로 접히고, 구간·피크·계약 대비가 그 위에 선다.\n * 이 프로파일에서 가장 두껍게 채운 자리다.\n */\n {\n std: 'MMXU',\n part: '7-4',\n label: 'twin.iec61850.MMXU',\n axis: 'demandWindows',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.MMXU'\n },\n /*\n * ── 셋이 함께 올라갔다 (2026-08-15) ──────────────────────────────────────\n * 개폐·발전·저장은 오래 「구조만 있음」이었다. 능력이 상태 필드를 선언해 두었는데 **값을 받는 문이\n * 없었기 때문**이다. 이제 셋 다 실제로 돈다: 설비 상태가 계약에 서고(`EquipmentState`), 커널이\n * `energy.equipment` 로 받아 그 설비에 적고, 씬 컴포넌트가 그린다.\n *\n * 세 층을 함께 올리는 이유: 값이 없는데 화면만 만들면 영원히 「—」인 카드가 되고, 화면이 없는데\n * 기능만 올리면 아무도 그 값을 보지 못한다. 「값이 먼저, 컴포넌트는 그 다음」의 결과다.\n */\n {\n std: 'XCBR',\n part: '7-4',\n label: 'twin.iec61850.XCBR',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.XCBR'\n },\n {\n std: 'DPVA',\n part: '7-4',\n label: 'twin.iec61850.DPVA',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.DPVA'\n },\n {\n std: 'ZBAT',\n part: '7-4',\n label: 'twin.iec61850.ZBAT',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.ZBAT'\n }\n]\n\nexport const IEC61850_CONCEPTS: Isa95Concept[] = [...LOGICAL_NODES] // vocabulary-guard: allow — 표준 용어(위 주석)\n\nexport function iec61850Coverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const known = new Set(axes)\n const concepts = IEC61850_CONCEPTS.map(c => {\n const axisMissing = !!c.axis && !known.has(c.axis)\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c\n return axisMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing } : fixed\n })\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n /* 이름에 (vocabulary) 를 달아 둔다 — 프로토콜 적합성으로 읽히지 않게. */\n model: 'IEC 61850 (vocabulary)',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { TwinLocation } from './twin-location.js';
|
|
2
|
+
export { TwinEquipment } from './twin-equipment.js';
|
|
3
|
+
export { TwinOperation } from './twin-operation.js';
|
|
4
|
+
import { TwinLocation } from './twin-location.js';
|
|
5
|
+
import { TwinEquipment } from './twin-equipment.js';
|
|
6
|
+
import { TwinOperation } from './twin-operation.js';
|
|
7
|
+
import { TwinModelQuery } from './twin-model-query.js';
|
|
8
|
+
import { TwinModelItemQuery } from './twin-model-item-query.js';
|
|
9
|
+
import { TwinModelTreeQuery } from './twin-model-tree-query.js';
|
|
10
|
+
import { TwinModelMutation } from './twin-model-mutation.js';
|
|
11
|
+
import { TwinLineageQuery } from './twin-lineage-query.js';
|
|
12
|
+
export declare const entities: (typeof TwinLocation | typeof TwinEquipment | typeof TwinOperation)[];
|
|
13
|
+
export declare const resolvers: (typeof TwinModelQuery | typeof TwinModelItemQuery | typeof TwinModelTreeQuery | typeof TwinModelMutation | typeof TwinLineageQuery)[];
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolvers = exports.entities = exports.TwinOperation = exports.TwinEquipment = exports.TwinLocation = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* 트윈 구조 모델 — `TwinInstance.model`(JSON 덩어리) 에서 풀어낸 **표준 엔티티**(ADR-0032).
|
|
6
|
+
*
|
|
7
|
+
* 여기 있는 것은 전부 **원본에서 온 캐시**다. 정본은 원본 시스템이고(ADR-0028), 이 행들은
|
|
8
|
+
* 인제스트가 만들며 언제든 전부 지우고 다시 만들 수 있어야 한다.
|
|
9
|
+
*
|
|
10
|
+
* 오늘은 **실제로 채워지는 세 축**만 있다 — 자리·설비·공정. 사람·자산·등급·속성·생산 정의는
|
|
11
|
+
* 지금 0건이라 만들지 않는다("설계와 착수는 다르다", ADR-0032-H). 모델은 그때 옳게 세운다.
|
|
12
|
+
*/
|
|
13
|
+
var twin_location_js_1 = require("./twin-location.js");
|
|
14
|
+
Object.defineProperty(exports, "TwinLocation", { enumerable: true, get: function () { return twin_location_js_1.TwinLocation; } });
|
|
15
|
+
var twin_equipment_js_1 = require("./twin-equipment.js");
|
|
16
|
+
Object.defineProperty(exports, "TwinEquipment", { enumerable: true, get: function () { return twin_equipment_js_1.TwinEquipment; } });
|
|
17
|
+
var twin_operation_js_1 = require("./twin-operation.js");
|
|
18
|
+
Object.defineProperty(exports, "TwinOperation", { enumerable: true, get: function () { return twin_operation_js_1.TwinOperation; } });
|
|
19
|
+
const twin_location_js_2 = require("./twin-location.js");
|
|
20
|
+
const twin_equipment_js_2 = require("./twin-equipment.js");
|
|
21
|
+
const twin_operation_js_2 = require("./twin-operation.js");
|
|
22
|
+
const twin_model_query_js_1 = require("./twin-model-query.js");
|
|
23
|
+
const twin_model_item_query_js_1 = require("./twin-model-item-query.js");
|
|
24
|
+
const twin_model_tree_query_js_1 = require("./twin-model-tree-query.js");
|
|
25
|
+
const twin_model_mutation_js_1 = require("./twin-model-mutation.js");
|
|
26
|
+
const twin_lineage_query_js_1 = require("./twin-lineage-query.js");
|
|
27
|
+
exports.entities = [twin_location_js_2.TwinLocation, twin_equipment_js_2.TwinEquipment, twin_operation_js_2.TwinOperation];
|
|
28
|
+
exports.resolvers = [twin_model_query_js_1.TwinModelQuery, twin_model_item_query_js_1.TwinModelItemQuery, twin_model_tree_query_js_1.TwinModelTreeQuery, twin_model_mutation_js_1.TwinModelMutation, twin_lineage_query_js_1.TwinLineageQuery];
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/twin-model/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;GAQG;AACH,uDAAiD;AAAxC,gHAAA,YAAY,OAAA;AACrB,yDAAmD;AAA1C,kHAAA,aAAa,OAAA;AACtB,yDAAmD;AAA1C,kHAAA,aAAa,OAAA;AAEtB,yDAAiD;AACjD,2DAAmD;AACnD,2DAAmD;AAEnD,+DAAsD;AACtD,yEAA+D;AAC/D,yEAA+D;AAC/D,qEAA4D;AAC5D,mEAA0D;AAE7C,QAAA,QAAQ,GAAG,CAAC,+BAAY,EAAE,iCAAa,EAAE,iCAAa,CAAC,CAAA;AACvD,QAAA,SAAS,GAAG,CAAC,oCAAc,EAAE,6CAAkB,EAAE,6CAAkB,EAAE,0CAAiB,EAAE,wCAAgB,CAAC,CAAA","sourcesContent":["/*\n * 트윈 구조 모델 — `TwinInstance.model`(JSON 덩어리) 에서 풀어낸 **표준 엔티티**(ADR-0032).\n *\n * 여기 있는 것은 전부 **원본에서 온 캐시**다. 정본은 원본 시스템이고(ADR-0028), 이 행들은\n * 인제스트가 만들며 언제든 전부 지우고 다시 만들 수 있어야 한다.\n *\n * 오늘은 **실제로 채워지는 세 축**만 있다 — 자리·설비·공정. 사람·자산·등급·속성·생산 정의는\n * 지금 0건이라 만들지 않는다(\"설계와 착수는 다르다\", ADR-0032-H). 모델은 그때 옳게 세운다.\n */\nexport { TwinLocation } from './twin-location.js'\nexport { TwinEquipment } from './twin-equipment.js'\nexport { TwinOperation } from './twin-operation.js'\n\nimport { TwinLocation } from './twin-location.js'\nimport { TwinEquipment } from './twin-equipment.js'\nimport { TwinOperation } from './twin-operation.js'\n\nimport { TwinModelQuery } from './twin-model-query.js'\nimport { TwinModelItemQuery } from './twin-model-item-query.js'\nimport { TwinModelTreeQuery } from './twin-model-tree-query.js'\nimport { TwinModelMutation } from './twin-model-mutation.js'\nimport { TwinLineageQuery } from './twin-lineage-query.js'\n\nexport const entities = [TwinLocation, TwinEquipment, TwinOperation]\nexport const resolvers = [TwinModelQuery, TwinModelItemQuery, TwinModelTreeQuery, TwinModelMutation, TwinLineageQuery]\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** 한 층의 상태 — 있음 · 부분 · 없음. "부분" 을 두는 이유: 절반 있는 것을 있다고 하면 기준이 죽는다. */
|
|
2
|
+
export type CoverageLevel = 'full' | 'partial' | 'none';
|
|
3
|
+
export interface Isa95Concept {
|
|
4
|
+
/** 표준이 부르는 이름 — 이 표의 키다(우리 어휘가 아니라 표준 어휘). */
|
|
5
|
+
std: string;
|
|
6
|
+
/** 표준의 어느 부분인가 — Part 2(자원 모델) · Part 4(일정·실적) 등. */
|
|
7
|
+
part: string;
|
|
8
|
+
/** 사람이 읽는 이름(i18n 키). 화면이 번역한다. */
|
|
9
|
+
label: string;
|
|
10
|
+
/** 우리 커널 축 — 있으면 데이터구조가 있는 것이다. 없으면 `null`. */
|
|
11
|
+
axis: string | null;
|
|
12
|
+
/** 세 층의 상태. `structure` 는 `axis` 로도 검증된다. */
|
|
13
|
+
structure: CoverageLevel;
|
|
14
|
+
behavior: CoverageLevel;
|
|
15
|
+
surface: CoverageLevel;
|
|
16
|
+
/** 왜 그 수준인지 — **모르는 것을 감추지 않기 위해** 한 줄로 적는다(i18n 키). */
|
|
17
|
+
note?: string;
|
|
18
|
+
/**
|
|
19
|
+
* 자기 축이 없을 때 **어디서 보이나** — 그 사실을 들고 있는 축들.
|
|
20
|
+
*
|
|
21
|
+
* 「어디에」칸이 두 가지를 합쳐고 있었다: *아직 축이 없다(부채)* 와 *축일 수 없다(설계)*. 가용 능력은
|
|
22
|
+
* 개체가 아니라 자원의 지금 상태이므로 축이 될 수 없는데, 세 층이 다 완전한 줄이 "개념 축이 없습니다"
|
|
23
|
+
* 라고만 말하면 **표가 스스로 모순된 말을 한다**(다 됐다면서 없다고 한다).
|
|
24
|
+
*
|
|
25
|
+
* 그래서 축일 수 없는 것은 갈 곳을 가리킨다. 여기가 비어 있고 축도 없으면 그것은 **진짜 빈칸**이다.
|
|
26
|
+
*/
|
|
27
|
+
shownOn?: string[];
|
|
28
|
+
}
|
|
29
|
+
/** 표준이 요구하는 것 전부 — 이 배열이 곧 기준이다. */
|
|
30
|
+
export declare const ISA95_CONCEPTS: Isa95Concept[];
|
|
31
|
+
/**
|
|
32
|
+
* 적합성 보고 — **채운 것과 빠진 것을 함께.**
|
|
33
|
+
*
|
|
34
|
+
* `axis` 를 커널 축 목록과 맞춰 본다: 축이 있다고 적혀 있는데 커널에 없으면 그 선언이 낡은 것이므로
|
|
35
|
+
* **구조 없음으로 낮추고 그 사실을 말한다**(조용히 통과시키면 이 표가 거짓이 된다).
|
|
36
|
+
*/
|
|
37
|
+
export declare function isa95Coverage(axes: string[]): {
|
|
38
|
+
model: string;
|
|
39
|
+
concepts: (Isa95Concept & {
|
|
40
|
+
axisMissing?: boolean;
|
|
41
|
+
})[];
|
|
42
|
+
totals: {
|
|
43
|
+
concepts: number;
|
|
44
|
+
structure: number;
|
|
45
|
+
behavior: number;
|
|
46
|
+
surface: number;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* ISA-95 적합성 기준 — **표준이 요구하는 것의 목록.**
|
|
4
|
+
*
|
|
5
|
+
* ── 왜 이 파일이 필요한가 ──────────────────────────────────────────────────────
|
|
6
|
+
* 지금까지 화면은 "우리가 가진 축" 만 보였다. 그러면 채운 것은 세어지지만 **빠진 것은 셀 수 없다** —
|
|
7
|
+
* 없는 것은 화면에 없으므로 아무도 그것을 묻지 않는다. 표준 준수는 "우리 축에 표준 이름을 붙였다"
|
|
8
|
+
* 가 아니라 **표준의 목록을 기준으로 빠진 것이 없다**는 말이어야 한다. 기준이 코드로 있어야 그
|
|
9
|
+
* 문장을 검사할 수 있다.
|
|
10
|
+
*
|
|
11
|
+
* ── 세 층에서 본다 ────────────────────────────────────────────────────────────
|
|
12
|
+
* 표준 준수는 한 층의 일이 아니다. 개념마다 셋을 따로 본다:
|
|
13
|
+
*
|
|
14
|
+
* · `structure` — **데이터구조**가 있나(커널 축·호스트 표에 이 개념의 자리가 있나)
|
|
15
|
+
* · `behavior` — **기능**이 그것을 쓰나(커널이 계획·집행·집계에서 실제로 다루나)
|
|
16
|
+
* · `surface` — **UI 노출**이 있나(사용자가 그것을 볼 수 있나)
|
|
17
|
+
*
|
|
18
|
+
* 셋을 합치면 "구조는 있는데 아무도 안 쓰는 컬럼" 과 "커널은 쓰는데 화면에 없는 사실" 이 같은
|
|
19
|
+
* 값으로 보인다. 실제로 이 프로젝트에서 둘 다 나왔다(인력 명세는 구조·기능이 있었지만 화면에
|
|
20
|
+
* 없었고, `properties` 는 구조만 있다).
|
|
21
|
+
*
|
|
22
|
+
* ── 값은 관측이 아니라 선언이다 ────────────────────────────────────────────────
|
|
23
|
+
* 여기 적힌 것은 **사람이 판단해 적은 사실**이다(자동 판정이 아니다). 그래서 틀릴 수 있고, 틀리면
|
|
24
|
+
* 여기를 고쳐야 한다 — 화면은 이 선언을 그대로 보이고 지어내지 않는다. 자동으로 알 수 있는 것
|
|
25
|
+
* 하나는 자동으로 한다: `axis` 가 커널 축 목록에 없으면 그것은 **구조가 없는 것**이다(오타 방지).
|
|
26
|
+
*
|
|
27
|
+
* ── 이 표가 커널에 없는 이유 ──────────────────────────────────────────────────
|
|
28
|
+
* 커널은 **런타임 모델의 SSOT** 다(무엇이 있는가). 이 표는 **참조 모델의 목록**이다(무엇이 있어야
|
|
29
|
+
* 하는가). 둘은 다른 종류의 사실이고, 후자는 커널을 배포하지 않고도 늘어야 한다.
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.ISA95_CONCEPTS = void 0;
|
|
33
|
+
exports.isa95Coverage = isa95Coverage;
|
|
34
|
+
/*
|
|
35
|
+
* 가용 능력(2026-08-12, 커널 0.6.8) — **판정과 이유가 상태에 실려 온다**(`capability {available, reason}`).
|
|
36
|
+
*
|
|
37
|
+
* 셋 다 완전인 근거: 상태가 판정을 들고 오고(시뮬·미러가 같은 함수로 파생한다), 배정이 같은 판정을
|
|
38
|
+
* 쓰고, 두 화면이 같은 낱말로 그 이유를 보인다(자원 탭 배지 · 인스펙션 관측 열).
|
|
39
|
+
*
|
|
40
|
+
* 왜 축이 없는가 — 가용 능력은 개체가 아니라 **자원의 지금 상태**다. 개념 카드로 세우면 사람·설비와
|
|
41
|
+
* 나란히 놓여 "능력이 몇 개인가" 를 세게 되는데, 그건 물을 일이 아니다.
|
|
42
|
+
*/
|
|
43
|
+
/*
|
|
44
|
+
* 생산 능력(2026-08-13, 커널 0.6.12) — **구간의 양을 표준 종류로 구분한다.**
|
|
45
|
+
*
|
|
46
|
+
* `structure` 완전: 계약이 보고서를 낸다(`operationsCapabilityOf`) — 구간(StartTime·EndTime) · 표준
|
|
47
|
+
* 열거값(Committed·Available·Unattainable) · 공정별 분해 · 제약하는 축. 낱말은 B2MML 대조 후 표준 것을
|
|
48
|
+
* 그대로 쓴다(우리 낱말을 만들지 않았다).
|
|
49
|
+
* `behavior` 완전: 약정은 오더에서, 달성불가는 자원 판정(`capabilityOf`)에서 온다 — 그리고 그 판정은
|
|
50
|
+
* 배정이 쓰는 것과 같은 한 벌이다. 표준의 `Unattainable` 정의가 그 판정과 겹친다.
|
|
51
|
+
* `surface` 완전: 두 자리에서 보인다 — 성과 화면이 현장 전체의 "앞으로 더 받을 수 있는 몫" 을, 공정
|
|
52
|
+
* 상세가 그 공정 하나의 분해(상한·약정·달성불가·가용)와 제약하는 축을 보인다. 두 화면은 **같은 낱말**을
|
|
53
|
+
* 쓴다(같은 i18n 키) — 같은 사실을 다르게 부르면 어느 쪽이 맞는지 아무도 모른다.
|
|
54
|
+
*
|
|
55
|
+
* 남은 것 — 표준은 **게시된(약속된) 능력**도 담는다(계산이 아니라 선언). 값을 실을 소스가 아직
|
|
56
|
+
* 침묵하므로 빈 축을 먼저 만들지 않는다(상태 쪽 `workCalendar` 를 지운 이유와 같다).
|
|
57
|
+
*
|
|
58
|
+
* 과거 분해(Used·Unused)는 이 보고서에 없다 — 그것은 실적이고 이미 두 곳에 있다(설비 OEE 의 가동/유휴,
|
|
59
|
+
* 성과 화면의 구간 가동률). 표준이 그 둘을 다른 종류로 부르므로 **합치지 않는다.**
|
|
60
|
+
*/
|
|
61
|
+
/*
|
|
62
|
+
* Part 2 — 자원 모델. 네 자원 각각이 **등급/정의 ↔ 개체** 이중구조를 갖는 것이 이 부분의 핵심이고,
|
|
63
|
+
* 그 이중성이 이 트윈의 뼈대이기도 하다.
|
|
64
|
+
*/
|
|
65
|
+
const PART2 = [
|
|
66
|
+
{ std: 'PersonnelClass', part: '2', label: 'twin.isa95.PersonnelClass', axis: 'personnelClasses', structure: 'full', behavior: 'full', surface: 'full' },
|
|
67
|
+
{ std: 'Person', part: '2', label: 'twin.isa95.Person', axis: 'persons', structure: 'full', behavior: 'full', surface: 'full' },
|
|
68
|
+
{ std: 'PersonnelCapability', part: '2', label: 'twin.isa95.PersonnelCapability', axis: null, shownOn: ['persons'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },
|
|
69
|
+
{ std: 'EquipmentClass', part: '2', label: 'twin.isa95.EquipmentClass', axis: 'equipmentClasses', structure: 'full', behavior: 'full', surface: 'full' },
|
|
70
|
+
{ std: 'Equipment', part: '2', label: 'twin.isa95.Equipment', axis: 'equipment', structure: 'full', behavior: 'full', surface: 'full' },
|
|
71
|
+
{ std: 'EquipmentCapability', part: '2', label: 'twin.isa95.EquipmentCapability', axis: null, shownOn: ['equipment'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },
|
|
72
|
+
{ std: 'PhysicalAssetClass', part: '2', label: 'twin.isa95.PhysicalAssetClass', axis: 'assetClasses', structure: 'full', behavior: 'full', surface: 'full' },
|
|
73
|
+
{ std: 'PhysicalAsset', part: '2', label: 'twin.isa95.PhysicalAsset', axis: 'assets', structure: 'full', behavior: 'full', surface: 'full' },
|
|
74
|
+
{ std: 'MaterialClass', part: '2', label: 'twin.isa95.MaterialClass', axis: 'materialClasses', structure: 'full', behavior: 'partial', surface: 'full' },
|
|
75
|
+
{ std: 'MaterialDefinition', part: '2', label: 'twin.isa95.MaterialDefinition', axis: 'materialDefinitions', structure: 'full', behavior: 'full', surface: 'full' },
|
|
76
|
+
/* 로트·서브로트는 개체 축이 아니라 **관측**으로 존재한다(EPCIS 개체) — 구조는 저널이 갖는다. */
|
|
77
|
+
{ std: 'MaterialLot', part: '2', label: 'twin.isa95.MaterialLot', axis: null, structure: 'partial', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.lot' },
|
|
78
|
+
{ std: 'MaterialSublot', part: '2', label: 'twin.isa95.MaterialSublot', axis: null, structure: 'none', behavior: 'none', surface: 'none' },
|
|
79
|
+
{ std: 'ProcessSegment', part: '2', label: 'twin.isa95.ProcessSegment', axis: 'operations', structure: 'full', behavior: 'full', surface: 'full' },
|
|
80
|
+
/*
|
|
81
|
+
* 속성은 자원마다 붙는 확장이라 **자기 축이 아니다** — 그래서 `axis` 는 없지만 구조는 완전하다:
|
|
82
|
+
* 계약(`ResourceProperty`: 값·데이터형·단위·하위·등급속성)이 표준을 그대로 담고, 인제스트·상태·
|
|
83
|
+
* 화면이 그것을 통과시킨다.
|
|
84
|
+
*
|
|
85
|
+
* 기능은 **부분**이다: 호스트의 주행 추정기가 `speed` 를 읽어 이동 시간을 만드는 것이 유일한 소비처다
|
|
86
|
+
* (다른 속성은 아직 아무도 읽지 않는다). 그 사실을 `full` 로 올리면 표가 거짓이 된다.
|
|
87
|
+
*/
|
|
88
|
+
{ std: 'Property', part: '2', label: 'twin.isa95.Property', axis: null, structure: 'full', behavior: 'partial', surface: 'full', note: 'twin.isa95.note.property' }
|
|
89
|
+
];
|
|
90
|
+
/*
|
|
91
|
+
* Part 4 — 일정과 실적.
|
|
92
|
+
*
|
|
93
|
+
* **2026-08-11 이전에는 이 부분이 거의 비어 있었다.** 오더·작업은 런타임과 저널에 실재하는데 조회
|
|
94
|
+
* 모델의 축이 아니었고, 그래서 "이 트윈이 표준의 어디를 채우나" 라는 질문에 절반만 답했다.
|
|
95
|
+
*
|
|
96
|
+
* 커널이 계약을 넓혀(`source: 'state'`) 두 축이 추가되었다 — 이제 요구(`orders`)와 응답(`tasks`)을 개념으로
|
|
97
|
+
* 가리켜 걸어 들어갈 수 있다. 남은 것은 **과거로 다시 계산하는 길**(저널 커서 페이징)과 능력·검사 명세다.
|
|
98
|
+
*/
|
|
99
|
+
const PART4 = [
|
|
100
|
+
{ std: 'OperationsDefinition', part: '4', label: 'twin.isa95.OperationsDefinition', axis: 'productionSpec', structure: 'full', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.opsdef' },
|
|
101
|
+
/*
|
|
102
|
+
* 2026-08-11 — **축이 추가되었다**(커널 0.6.3 · `source: 'state'`). 요구는 `orders`, 응답은 `tasks` 다.
|
|
103
|
+
*
|
|
104
|
+
* `structure` 를 `full` 로 올린다: 담을 자리가 계약에 있다(상태 계약 + 축 선언). **테이블 투영이
|
|
105
|
+
* 없는 것은 결손이 아니다** — 이 축의 정본은 저널이고, 투영하지 않는 것이 결정이다(ADR-0032-D).
|
|
106
|
+
*
|
|
107
|
+
* `surface` 도 `full` 이다(같은 날 두 번째 단계): 목록·상세·관계에 더해 **과거로 다시 계산하는 길**이 화면에
|
|
108
|
+
* 있다 — 시각 커서를 옮기면 그 시점의 사실이 나오고, 무엇을 근거로 답했는지도 화면이 말한다
|
|
109
|
+
* (라이브=권위 · 저널=파생 · 접은 리비전). 실측: 이른 시각 0건 · 하루 뒤 504건.
|
|
110
|
+
*/
|
|
111
|
+
{ std: 'OperationsSchedule', part: '4', label: 'twin.isa95.OperationsSchedule', axis: 'orders', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.schedule' },
|
|
112
|
+
{ std: 'OperationsPerformance', part: '4', label: 'twin.isa95.OperationsPerformance', axis: 'tasks', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.performance' },
|
|
113
|
+
{ std: 'OperationsCapability', part: '4', label: 'twin.isa95.OperationsCapability', axis: null, shownOn: ['operations'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.opscapability' },
|
|
114
|
+
/*
|
|
115
|
+
* 2026-08-12 — **축이 추가되었다**(커널 0.6.5). 자원 아홉이 가리키던 참조에 대상이 생겼고, 없는 명세를
|
|
116
|
+
* 가리키면 선 채움이 끊어진 참조로 센다.
|
|
117
|
+
*
|
|
118
|
+
* 기능이 **`partial` 로 살아났다**(커널 0.6.6): 결과(`TestResult`)가 계약에 들어오면서 커널이 배정에서
|
|
119
|
+
* 그것을 본다 — 만료·불합격이면 그 자격은 성립하지 않는다(실측: 만료된 용접사는 용접 작업 5건 중 한
|
|
120
|
+
* 번도 배정되지 않았다).
|
|
121
|
+
*
|
|
122
|
+
* `full` 이 아닌 이유는 둘이다: **사람만 판정한다**(설비·자산의 검사 결과는 아직 배정에 쓰지 않는다),
|
|
123
|
+
* 그리고 결과가 없으면 판정하지 않는다(선언한 것만 제약이 된다 — 그건 결손이 아니라 규율이다).
|
|
124
|
+
*/
|
|
125
|
+
{ std: 'TestSpecification', part: '4', label: 'twin.isa95.TestSpecification', axis: 'testSpecifications', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.test' },
|
|
126
|
+
{ std: 'WorkMaster', part: '4', label: 'twin.isa95.WorkMaster', axis: 'recipes', structure: 'full', behavior: 'full', surface: 'full' },
|
|
127
|
+
{ std: 'WorkDirective', part: '4', label: 'twin.isa95.WorkDirective', axis: null, structure: 'none', behavior: 'none', surface: 'none' }
|
|
128
|
+
];
|
|
129
|
+
/** 표준이 요구하는 것 전부 — 이 배열이 곧 기준이다. */
|
|
130
|
+
exports.ISA95_CONCEPTS = [...PART2, ...PART4];
|
|
131
|
+
/**
|
|
132
|
+
* 적합성 보고 — **채운 것과 빠진 것을 함께.**
|
|
133
|
+
*
|
|
134
|
+
* `axis` 를 커널 축 목록과 맞춰 본다: 축이 있다고 적혀 있는데 커널에 없으면 그 선언이 낡은 것이므로
|
|
135
|
+
* **구조 없음으로 낮추고 그 사실을 말한다**(조용히 통과시키면 이 표가 거짓이 된다).
|
|
136
|
+
*/
|
|
137
|
+
function isa95Coverage(axes) {
|
|
138
|
+
const known = new Set(axes);
|
|
139
|
+
const concepts = exports.ISA95_CONCEPTS.map(c => {
|
|
140
|
+
const axisMissing = !!c.axis && !known.has(c.axis);
|
|
141
|
+
/* 가리키는 곳이 없어진 축은 **가리키지 않는다** — 죽은 문으로 보내면 화면이 거짓말을 한다.
|
|
142
|
+
`axis` 와 같은 규율이고, 여기가 비면 그 줄은 다시 "축이 없다" 로 정직하게 돌아간다. */
|
|
143
|
+
const shownOn = c.shownOn?.filter(a => known.has(a));
|
|
144
|
+
const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
|
|
145
|
+
return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
|
|
146
|
+
});
|
|
147
|
+
/* 채운 수는 `full` 만 센다 — 부분을 채운 것으로 세면 기준이 스스로를 속인다. */
|
|
148
|
+
const count = (k) => concepts.filter(c => c[k] === 'full').length;
|
|
149
|
+
return {
|
|
150
|
+
model: 'ISA-95',
|
|
151
|
+
concepts,
|
|
152
|
+
totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=isa95-coverage.js.map
|