@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,43 @@
|
|
|
1
|
+
export declare class TwinModelQuery {
|
|
2
|
+
/**
|
|
3
|
+
* 이 선이 **얼마나 이어져 있나** — 그리고 **얼마나 끊겨 있나.**
|
|
4
|
+
*
|
|
5
|
+
* 선이 "선언되었고 양끝이 존재한다" 만 말하면 지도는 그림일 뿐이다. 관계에서 가장 중요한 정보는
|
|
6
|
+
* 대개 **부재**다 — 기준 자리가 비어 있는 설비 열두 대, 어느 라우트에도 안 실린 공정. 그것이
|
|
7
|
+
* 조감도에서 보여야 사람이 끊긴 데를 찾아다니지 않는다.
|
|
8
|
+
*
|
|
9
|
+
* 셋을 센다:
|
|
10
|
+
* · `linked` — 값이 있고 그 값이 상대편에 **실제로 있다**
|
|
11
|
+
* · `dangling` — 값은 있는데 **가리키는 것이 없다**(끊어진 참조 — 가장 나쁜 부류)
|
|
12
|
+
* · `missing` — 값 자체가 없다(선택 관계면 정상, 필수 관계면 결손)
|
|
13
|
+
*
|
|
14
|
+
* 문서 어휘로 푼다 — 관계 선언의 필드 이름이 원본 문서의 어휘이기 때문이다(행은 자기 컬럼
|
|
15
|
+
* 이름을 쓴다). 그 사실을 `fillBasis` 로 함께 낸다.
|
|
16
|
+
*/
|
|
17
|
+
private edgeFill;
|
|
18
|
+
twinModelSummary(instanceId: string, context: ResolverContext): Promise<any | null>;
|
|
19
|
+
/**
|
|
20
|
+
* **이 트윈에 무엇을 선언할 수 있나** — 값을 넣는 화면이 도메인의 모양을 알지 않게.
|
|
21
|
+
*
|
|
22
|
+
* 커널이 정한 명세(속성 id·단위·범위·설명)를 그대로 낸다. 화면이 「에너지 트윈이면 계약전력·요금
|
|
23
|
+
* 단가…」를 알고 있으면 도메인이 늘 때마다 화면을 고쳐야 하고 단위가 두 곳에 적힌다(ADR-0031).
|
|
24
|
+
*
|
|
25
|
+
* 지금 무엇이 선언돼 있는지도 함께 낸다(`declared`) — 화면이 두 번 묻지 않게, 그리고 「원천이 말한
|
|
26
|
+
* 값」과 「우리가 정한 값」을 한자리에서 견줄 수 있게(`PropertySource`, ADR-0034).
|
|
27
|
+
*
|
|
28
|
+
* 어휘가 없는 종류는 `properties: []` 다 — 「아직 없다」와 「아무 값이나 받는다」는 다르다.
|
|
29
|
+
*/
|
|
30
|
+
twinDeclarations(instanceId: string, context: ResolverContext): Promise<any | null>;
|
|
31
|
+
/**
|
|
32
|
+
* **이 현장에 무엇을 선언할 수 있나** — 현장 값은 트윈의 것이 아니므로 트윈 없이 묻는다.
|
|
33
|
+
*
|
|
34
|
+
* ── 왜 트윈으로 묻지 않나 (2026-08-18) ─────────────────────────────────────
|
|
35
|
+
* 처음에는 트윈 화면에서 범위만 골라 현장 값을 넣게 했다. 그런데 **현장 값을 넣으려고 트윈을 골라야
|
|
36
|
+
* 하는 것**은 개념이 거꾸로다 — 트윈은 그 값을 읽는 쪽이다(사용자가 그 어긋남을 지적했다).
|
|
37
|
+
*
|
|
38
|
+
* 어휘와 대상은 **그 현장 트윈들의 합집합**이다: 한 현장에 여러 종류가 살고(에너지·창고·야드), 요금은
|
|
39
|
+
* 에너지 트윈만 읽는다. 합집합으로 내되 **어느 트윈이 그 대상을 가졌는지** 함께 낸다 — 아무 트윈도
|
|
40
|
+
* 읽지 않는 값을 넣는 일을 화면이 미리 보여 줄 수 있어야 한다.
|
|
41
|
+
*/
|
|
42
|
+
spaceDeclarations(spaceId: string, context: ResolverContext): Promise<any | null>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TwinModelQuery = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const shell_1 = require("@things-factory/shell");
|
|
7
|
+
const index_js_1 = require("../../engine/index.js");
|
|
8
|
+
const twin_kernel_1 = require("@operato/twin-kernel");
|
|
9
|
+
const twin_instance_js_1 = require("../twin-instance/twin-instance.js");
|
|
10
|
+
const twin_space_js_1 = require("../twin-space/twin-space.js");
|
|
11
|
+
const twin_reference_js_1 = require("../reference/twin-reference.js");
|
|
12
|
+
const local_declarations_js_1 = require("../../engine/local-declarations.js");
|
|
13
|
+
const operation_basis_js_1 = require("../../engine/operation-basis.js");
|
|
14
|
+
const twin_location_js_1 = require("./twin-location.js");
|
|
15
|
+
const twin_equipment_js_1 = require("./twin-equipment.js");
|
|
16
|
+
const twin_operation_js_1 = require("./twin-operation.js");
|
|
17
|
+
const standard_coverage_js_1 = require("./standard-coverage.js");
|
|
18
|
+
const isa95_coverage_js_1 = require("./isa95-coverage.js");
|
|
19
|
+
const iec61850_coverage_js_1 = require("./iec61850-coverage.js");
|
|
20
|
+
const epcis_coverage_js_1 = require("./epcis-coverage.js");
|
|
21
|
+
/**
|
|
22
|
+
* 이 공정에 선언된 시간을 **겹에서** 든다 — 좁은 겹이 이긴다(트윈 먼저, 없으면 현장).
|
|
23
|
+
*
|
|
24
|
+
* 모델에는 ISO 8601 로 구워지지만 화면에는 **사용자가 넣은 수와 단위**를 보인다: 「PT240S」를 보이면
|
|
25
|
+
* 자기가 넣은 값인지 알아볼 수 없다. 선언이 없으면 빈 배열이다(빈 값을 지어내지 않는다).
|
|
26
|
+
*/
|
|
27
|
+
function declaredDurationProperty(kind, instanceLayer, spaceLayer) {
|
|
28
|
+
const find = (layer) => {
|
|
29
|
+
const d = (layer ?? []).find(x => x?.target === 'operation' && String(x?.id ?? '') === kind);
|
|
30
|
+
return (d?.properties ?? []).find((p) => p?.id === 'operation.duration');
|
|
31
|
+
};
|
|
32
|
+
const p = find(instanceLayer) ?? find(spaceLayer);
|
|
33
|
+
if (!p)
|
|
34
|
+
return [];
|
|
35
|
+
return [{ id: 'operation.duration', value: String(p.value ?? ''), ...(p.uom ? { uom: String(p.uom) } : {}), source: 'local' }];
|
|
36
|
+
}
|
|
37
|
+
/** 표준 id → 그 표의 함수. 정책은 `standardsForKind` 가, 표는 각 파일이 가진다. */
|
|
38
|
+
const COVERAGE = { isa95: isa95_coverage_js_1.isa95Coverage, epcis: epcis_coverage_js_1.epcisCoverage, iec61850: iec61850_coverage_js_1.iec61850Coverage };
|
|
39
|
+
const warm_start_js_1 = require("../../engine/warm-start.js");
|
|
40
|
+
/* 공유 모듈은 빌드 산출물로 참조한다 — 서버·클라이언트가 같은 규칙을 쓰는 자리다(같은 관행: entity-delta). */
|
|
41
|
+
const axis_read_js_1 = require("@things-factory/headless-twin/dist-shared/axis-read.js");
|
|
42
|
+
/* 커널 런타임 로드 — CJS 번들(엔진과 같은 방식). 축·관계 선언의 SSOT 다. */
|
|
43
|
+
const { TWIN_AXES, TWIN_RELATIONS, axisInfo, axisSource, axisAppliesTo } = require('@operato/twin-kernel');
|
|
44
|
+
/**
|
|
45
|
+
* 축 → 그 축이 이미 **행으로 옮겨졌나**. 옮겨진 축은 DB 가 세고, 아직인 축은 문서를 세어야 한다.
|
|
46
|
+
*
|
|
47
|
+
* 이 표가 곧 `ADR-0032` 이주의 진척이다 — 여기 없는 축은 아직 `TwinModelDef` 문서 안에 산다.
|
|
48
|
+
*/
|
|
49
|
+
const ROW_BACKED = {
|
|
50
|
+
locations: twin_location_js_1.TwinLocation,
|
|
51
|
+
equipment: twin_equipment_js_1.TwinEquipment,
|
|
52
|
+
operations: twin_operation_js_1.TwinOperation
|
|
53
|
+
};
|
|
54
|
+
/** `productionSpec.definition.recipes` 같은 경로를 문서에서 따라간다. */
|
|
55
|
+
const at = (o, path) => path.split('.').reduce((a, k) => (a == null ? undefined : a[k]), o);
|
|
56
|
+
function countInDocument(model, path) {
|
|
57
|
+
const v = at(model, path);
|
|
58
|
+
if (Array.isArray(v))
|
|
59
|
+
return v.length;
|
|
60
|
+
return v ? 1 : 0;
|
|
61
|
+
}
|
|
62
|
+
/*
|
|
63
|
+
* 트윈 모델 조회 — **이 트윈은 표준 모델의 어디를 채우고 있나**(`plans/twin-inspection.md` §2 ②).
|
|
64
|
+
*
|
|
65
|
+
* ── 답의 크기가 개념 수에 비례한다 ─────────────────────────────────────────
|
|
66
|
+
* 엔티티를 **절대 싣지 않는다.** 실으면 계약이 곧 무너지고, 규모가 오는 날 이 질의가 그대로
|
|
67
|
+
* 병목이 된다. 항목은 별도 질의(`twinModelEntities`)가 페이징으로 낸다.
|
|
68
|
+
*
|
|
69
|
+
* ── 개념 목록을 이 코드가 갖지 않는다 ───────────────────────────────────────
|
|
70
|
+
* 축·관계는 **커널 카탈로그가 선언**한다(`TWIN_AXES`·`TWIN_RELATIONS`). 그래서 야드의 `dock-door`
|
|
71
|
+
* 나 에너지의 계량기가 늘어도 여기 손댈 것이 없다 — 도메인마다 화면·질의가 하나씩 늘어나던
|
|
72
|
+
* 구조를 끊는 것이 이 설계의 요점이다(`ADR-0031`).
|
|
73
|
+
*
|
|
74
|
+
* ── 어떻게 셌는지 밝힌다 ───────────────────────────────────────────────────
|
|
75
|
+
* 지금은 축 셋만 행이고 나머지는 문서 안에 있다. 그 사실을 `basis` 로 **축마다** 말한다.
|
|
76
|
+
* 밝히지 않으면 "이 트윈은 3개 축뿐" 으로 읽히고, 이주가 어디까지 왔는지도 아무도 모른다.
|
|
77
|
+
*/
|
|
78
|
+
/** `inputs[].material` 처럼 배열을 지나는 선언 경로를 따라간다 — 배열 표기가 관계 선언의 문법이다. */
|
|
79
|
+
function valuesAt(obj, field) {
|
|
80
|
+
let cur = [obj];
|
|
81
|
+
for (const seg of field.split('.')) {
|
|
82
|
+
const key = seg.endsWith('[]') ? seg.slice(0, -2) : seg;
|
|
83
|
+
const next = [];
|
|
84
|
+
for (const c of cur) {
|
|
85
|
+
if (c == null)
|
|
86
|
+
continue;
|
|
87
|
+
const v = c[key];
|
|
88
|
+
if (v == null)
|
|
89
|
+
continue;
|
|
90
|
+
if (Array.isArray(v))
|
|
91
|
+
next.push(...v);
|
|
92
|
+
else
|
|
93
|
+
next.push(v);
|
|
94
|
+
}
|
|
95
|
+
cur = next;
|
|
96
|
+
}
|
|
97
|
+
return cur.filter(v => v != null);
|
|
98
|
+
}
|
|
99
|
+
const idOf = (o) => (typeof o === 'string' ? o : o?.id ?? o?.key ?? o?.gtin ?? null);
|
|
100
|
+
let TwinModelQuery = class TwinModelQuery {
|
|
101
|
+
/**
|
|
102
|
+
* 이 선이 **얼마나 이어져 있나** — 그리고 **얼마나 끊겨 있나.**
|
|
103
|
+
*
|
|
104
|
+
* 선이 "선언되었고 양끝이 존재한다" 만 말하면 지도는 그림일 뿐이다. 관계에서 가장 중요한 정보는
|
|
105
|
+
* 대개 **부재**다 — 기준 자리가 비어 있는 설비 열두 대, 어느 라우트에도 안 실린 공정. 그것이
|
|
106
|
+
* 조감도에서 보여야 사람이 끊긴 데를 찾아다니지 않는다.
|
|
107
|
+
*
|
|
108
|
+
* 셋을 센다:
|
|
109
|
+
* · `linked` — 값이 있고 그 값이 상대편에 **실제로 있다**
|
|
110
|
+
* · `dangling` — 값은 있는데 **가리키는 것이 없다**(끊어진 참조 — 가장 나쁜 부류)
|
|
111
|
+
* · `missing` — 값 자체가 없다(선택 관계면 정상, 필수 관계면 결손)
|
|
112
|
+
*
|
|
113
|
+
* 문서 어휘로 푼다 — 관계 선언의 필드 이름이 원본 문서의 어휘이기 때문이다(행은 자기 컬럼
|
|
114
|
+
* 이름을 쓴다). 그 사실을 `fillBasis` 로 함께 낸다.
|
|
115
|
+
*/
|
|
116
|
+
edgeFill(model, r) {
|
|
117
|
+
const fromInfo = axisInfo(r.from);
|
|
118
|
+
const toInfo = axisInfo(r.target.axis);
|
|
119
|
+
if (!fromInfo || !toInfo)
|
|
120
|
+
return {};
|
|
121
|
+
/*
|
|
122
|
+
* **문서로 셀 수 없는 관계는 세지 않는다.** 선 채움(이어짐·끊어짐·빈 것)은 두 축을 문서에서
|
|
123
|
+
* 살펴 센다. 그런데 일정·실적은 문서에 없다(관측 축) — 그 관계를 문서로 세면 언제나 0 이 나오고,
|
|
124
|
+
* 화면은 그것을 "전부 끊어졌다" 로 읽는다. 셀 수 없으면 **수를 내지 않는 편이 정직하다.**
|
|
125
|
+
*/
|
|
126
|
+
if (axisSource(r.from) !== 'document' || axisSource(r.target.axis) !== 'document')
|
|
127
|
+
return {};
|
|
128
|
+
const listOf = (info) => {
|
|
129
|
+
const raw = at(model, info.path);
|
|
130
|
+
return Array.isArray(raw) ? raw : raw ? [raw] : [];
|
|
131
|
+
};
|
|
132
|
+
const targets = new Set(listOf(toInfo).map(idOf).filter(Boolean));
|
|
133
|
+
let linked = 0;
|
|
134
|
+
let dangling = 0;
|
|
135
|
+
let missing = 0;
|
|
136
|
+
for (const item of listOf(fromInfo)) {
|
|
137
|
+
const vals = valuesAt(item, r.field).map(v => (typeof v === 'object' ? idOf(v) : v)).filter(v => v != null).map(String);
|
|
138
|
+
if (!vals.length) {
|
|
139
|
+
missing++;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
/* 한 항목이 여럿을 가리킬 수 있다(`steps[]`). 하나라도 끊겼으면 끊긴 쪽으로 센다 —
|
|
143
|
+
"대체로 이어져 있다" 는 진단이 아니다. */
|
|
144
|
+
if (vals.every(v => targets.has(v)))
|
|
145
|
+
linked++;
|
|
146
|
+
else
|
|
147
|
+
dangling++;
|
|
148
|
+
}
|
|
149
|
+
return { linked, dangling, missing, fillBasis: 'document' };
|
|
150
|
+
}
|
|
151
|
+
async twinModelSummary(instanceId, context) {
|
|
152
|
+
const domainId = context.state.domain.id;
|
|
153
|
+
const inst = await (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } });
|
|
154
|
+
if (!inst)
|
|
155
|
+
return null;
|
|
156
|
+
/* 어느 원본을 반영하나 — 없을 수 있다(템플릿으로 세운 트윈). 그 사실도 사실이다. */
|
|
157
|
+
const ref = await (0, shell_1.getRepository)(twin_reference_js_1.TwinReference)
|
|
158
|
+
.findOne({ where: { domain: { id: domainId }, source: instanceId } })
|
|
159
|
+
.catch(() => null);
|
|
160
|
+
const model = inst.model ?? {};
|
|
161
|
+
/*
|
|
162
|
+
* **한 요청에 저널은 한 번만 접는다.**
|
|
163
|
+
*
|
|
164
|
+
* 관측 축(`orders`·`tasks`)은 상태에서 센다. 그 둘이 각자 `recover()` 를 부르고 있었고, 커널이
|
|
165
|
+
* 멈춰 있으면 그것은 **저널 전체를 다시 접는 일**이다(23,731건짜리 트윈에서 4.6초, 두 번이면 곱절).
|
|
166
|
+
* 트윈을 전부 멈춰도 이 화면이 5~7초 걸린 이유가 이것이다 — 부하가 아니라 같은 일을 두 번 한 것이다.
|
|
167
|
+
*
|
|
168
|
+
* 한 번만 접어 나눠 쓴다. 값이 같아지는 것은 덤이 아니라 **옳음**이다: 두 번 접으면 그 사이에
|
|
169
|
+
* 들어온 이벤트 때문에 오더와 작업이 서로 다른 시점의 사실이 될 수 있다.
|
|
170
|
+
*/
|
|
171
|
+
let statePromise = null;
|
|
172
|
+
const stateOnce = () => (statePromise ??= (async () => {
|
|
173
|
+
const observing = index_js_1.TwinEngine.isRunning(domainId, instanceId);
|
|
174
|
+
let snap = observing ? (0, warm_start_js_1.unwrapState)(index_js_1.TwinEngine.snapshot(domainId, instanceId)) : null;
|
|
175
|
+
let folded = false;
|
|
176
|
+
if (!snap) {
|
|
177
|
+
try {
|
|
178
|
+
snap = (0, warm_start_js_1.unwrapState)(await index_js_1.TwinEngine.recover(domainId, instanceId));
|
|
179
|
+
folded = !!snap;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
/* 다시 계산할 것이 없다 — 0 으로 메우지 않는다(카드는 "모름" 을 낸다). */
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return { snap, folded, observing };
|
|
186
|
+
})());
|
|
187
|
+
const concepts = await Promise.all(TWIN_AXES.map(async (a) => {
|
|
188
|
+
/*
|
|
189
|
+
* **이 종류에 없는 개념인가** — 「아직 없음」과 「해당 없음」은 다른 말이다.
|
|
190
|
+
*
|
|
191
|
+
* 에너지 트윈에는 옮겨 다니는 물건도, 배정할 사람도, 공정도 없다(커널이 축마다 선언한다).
|
|
192
|
+
* 그것을 「로트 0」으로 그리면 사용자는 채우러 갈 곳을 찾고, 적합성 표는 채우지 못한 것으로
|
|
193
|
+
* 센다 — 둘 다 거짓이다. 수는 `null`(모름이 아니라 셀 대상이 아님)이고 이유를 코드로 낸다.
|
|
194
|
+
*
|
|
195
|
+
* 세지도 않는다: 없는 개념을 행에서 세는 것은 질의만 늘리고 답을 바꾸지 않는다.
|
|
196
|
+
*/
|
|
197
|
+
if (!axisAppliesTo(a.axis, inst.kind)) {
|
|
198
|
+
return {
|
|
199
|
+
axis: a.axis,
|
|
200
|
+
label: a.label,
|
|
201
|
+
kind: a.kind,
|
|
202
|
+
container: false,
|
|
203
|
+
standardClass: a.standardClass,
|
|
204
|
+
typeRole: a.typeRole ?? null,
|
|
205
|
+
count: null,
|
|
206
|
+
notApplicable: true,
|
|
207
|
+
emptyBecause: 'not-applicable',
|
|
208
|
+
basis: 'declaration'
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const entity = ROW_BACKED[a.axis];
|
|
212
|
+
/* 문서 축만 문서로 센다 — 경로 없는 축을 세면 모델 루트를 훑는다(상태 축은 아래에서 센다). */
|
|
213
|
+
const inDocument = axisSource(a.axis) === 'document' ? countInDocument(model, a.path) : 0;
|
|
214
|
+
const inRows = entity
|
|
215
|
+
? await (0, shell_1.getRepository)(entity).count({ where: { domain: { id: domainId }, instance: { id: inst.id } } })
|
|
216
|
+
: undefined;
|
|
217
|
+
/*
|
|
218
|
+
* **둘을 함께 세고 어긋나면 말한다.**
|
|
219
|
+
*
|
|
220
|
+
* 행으로 옮긴 축이라도 그 트윈이 투영을 거치지 않았으면 행은 0이다(인제스트 없이
|
|
221
|
+
* warm-start 된 트윈이 그렇다). 행만 보고 답하면 문서에 자리 6개가 있는데 화면은
|
|
222
|
+
* **0 이라고 말한다** — 조용한 거짓이고, 이 프로젝트가 내내 잡아 온 바로 그 부류다.
|
|
223
|
+
*
|
|
224
|
+
* 그래서 어느 하나로 메우지 않는다. 행 수를 답하되 문서 수를 함께 내고, 다르면
|
|
225
|
+
* `stale` 로 표시한다 — 그 차이 자체가 "이 트윈은 투영 이후 인제스트되지 않았다" 는 정보다.
|
|
226
|
+
*/
|
|
227
|
+
const stale = entity !== undefined && inRows !== inDocument;
|
|
228
|
+
/*
|
|
229
|
+
* **그릇인가** — 문서에 객체 하나로 있는 축(`productionSpec`).
|
|
230
|
+
*
|
|
231
|
+
* `kind` 로는 갈리지 않는다: 커널은 공정·레시피·라우트도 `spec` 이라 부른다(같은 선언 부류라는
|
|
232
|
+
* 뜻이다). 그릇인지 아닌지는 **모양**이 말한다 — 목록이 되는 축은 배열이고, 한 벌뿐인 선언은
|
|
233
|
+
* 객체 하나다. 개념 지도는 개체를 세는 면이므로 그릇은 자기 면에서 통째로 읽는다.
|
|
234
|
+
*/
|
|
235
|
+
const raw = axisSource(a.axis) === 'document' ? at(model, a.path) : undefined;
|
|
236
|
+
/*
|
|
237
|
+
* **관측 축은 상태가 센다**(일정·실적 — ISA-95 Part 4). 커널이 멈춰 있으면 `null` 이다:
|
|
238
|
+
* 0 으로 내면 "작업이 없는 공장" 으로 읽히고, 그건 거짓이다(관측이 없는 것과 0 건은 다르다).
|
|
239
|
+
* 이 화면이 관측 열에서 내내 지켜 온 구분을 카드에서도 지킨다.
|
|
240
|
+
*/
|
|
241
|
+
if (axisSource(a.axis) === 'state') {
|
|
242
|
+
/* 스냅샷은 `{revision, state}` 봉투다 — 벗기지 않으면 축이 한 겹 안에 있어 언제나 `null` 이
|
|
243
|
+
된다(커널은 도는데 카드가 "모름" 으로 보였다). 벗기는 규칙의 집은 `warm-start` 하나다. */
|
|
244
|
+
/*
|
|
245
|
+
* 관측 중인지는 **런타임이 있는지**로 본다 — 캐시된 스냅샷은 관측이 아니다.
|
|
246
|
+
*
|
|
247
|
+
* 동작하지 않으면 저널을 접어 답한다(라이브=권위 · 히스토리=파생). 카드는 그 차이를 `basis` 로
|
|
248
|
+
* 말한다: 파생을 권위처럼 내면 다시 계산한 수를 "지금 이만큼" 으로 읽게 된다.
|
|
249
|
+
*/
|
|
250
|
+
const { snap, folded, observing } = await stateOnce();
|
|
251
|
+
/* 축이 사는 자리는 **커널 선언이 말한다**(`path`) — 축 이름으로만 읽으면 중첩된 축이
|
|
252
|
+
언제나 「관측 없음」이 된다(에너지의 수요 구간이 그렇다). 규칙은 `axisValueOf` 한 곳. */
|
|
253
|
+
const bucket = snap ? (0, axis_read_js_1.axisValueOf)(snap, a) ?? null : null;
|
|
254
|
+
return {
|
|
255
|
+
axis: a.axis,
|
|
256
|
+
label: a.label,
|
|
257
|
+
kind: a.kind,
|
|
258
|
+
container: false,
|
|
259
|
+
standardClass: a.standardClass,
|
|
260
|
+
typeRole: a.typeRole ?? null,
|
|
261
|
+
count: Array.isArray(bucket) ? bucket.length : null,
|
|
262
|
+
/*
|
|
263
|
+
* **비었으면 왜 비었는지 말한다.** 0 과 `null` 만 내면 화면은 "없다" 까지만 말하고, 사용자는
|
|
264
|
+
* "안 적어 놨나 · 아직 안 일어났나 · 못 세었나" 를 구별할 수 없다. 이 화면이 관측 열에서
|
|
265
|
+
* 내내 지켜 온 구분(§observedAbsence)을 카드에서도 지킨다.
|
|
266
|
+
*/
|
|
267
|
+
...(Array.isArray(bucket) ? (bucket.length ? {} : { emptyBecause: 'none-yet' }) : { emptyBecause: 'not-observed' }),
|
|
268
|
+
basis: folded ? 'journal' : 'state',
|
|
269
|
+
observing,
|
|
270
|
+
/* 선언이 아니라 관측인 축 — 화면이 "원본이 침묵했다" 로 읽지 않게 사실로 말한다. */
|
|
271
|
+
observedOnly: true,
|
|
272
|
+
standardUndeclared: !a.standardClass?.isa95 && !a.standardClass?.epcis && !a.standardClass?.iso55000
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
axis: a.axis,
|
|
277
|
+
label: a.label,
|
|
278
|
+
kind: a.kind,
|
|
279
|
+
container: !Array.isArray(raw) && raw != null,
|
|
280
|
+
standardClass: a.standardClass,
|
|
281
|
+
typeRole: a.typeRole ?? null,
|
|
282
|
+
count: entity ? inRows : inDocument,
|
|
283
|
+
/*
|
|
284
|
+
* 비었으면 왜 비었는지 — 선언 쪽은 세 갈래다.
|
|
285
|
+
* · `not-declared` 이 트윈의 모델이 그 축을 아예 말하지 않는다(대개 템플릿이 안 적었다)
|
|
286
|
+
* · `declared-empty` 선언은 있는데 목록이 비어 있다(적었다가 지운 것도 사실이다)
|
|
287
|
+
* · `not-projected` 문서엔 있는데 행에 없다 — 투영을 거치지 않은 트윈이다(`stale` 과 같은 사실)
|
|
288
|
+
*
|
|
289
|
+
* 셋을 "0" 하나로 합치면 사용자가 손볼 곳을 찾지 못한다: 첫째는 템플릿, 둘째는 원본,
|
|
290
|
+
* 셋째는 다시 읽기다. 셋 다 다른 일이다.
|
|
291
|
+
*/
|
|
292
|
+
...((entity ? inRows : inDocument)
|
|
293
|
+
? {}
|
|
294
|
+
: {
|
|
295
|
+
emptyBecause: entity && inDocument > 0 ? 'not-projected' : raw == null ? 'not-declared' : 'declared-empty'
|
|
296
|
+
}),
|
|
297
|
+
/* 'rows' = DB 가 셌다(질의 가능) · 'document' = 문서를 세었다(아직 이주 전). */
|
|
298
|
+
basis: entity ? 'rows' : 'document',
|
|
299
|
+
...(entity ? { documentCount: inDocument, stale } : {}),
|
|
300
|
+
/* 표준 투영이 없는 축은 **숨기지 않고** 그 사실을 낸다(ADR-0031). */
|
|
301
|
+
standardUndeclared: !a.standardClass?.isa95 && !a.standardClass?.epcis && !a.standardClass?.iso55000
|
|
302
|
+
};
|
|
303
|
+
}));
|
|
304
|
+
/*
|
|
305
|
+
* **원본이 모르는데 실행 중인 것** — 커널은 마스터에 없던 자원도 이벤트로 알게 되고
|
|
306
|
+
* `origin: 'observed'` 를 단다(`observed-reducer`). 그것을 표에 밀어 넣지 않는다 — 그러면
|
|
307
|
+
* 틱 루프에서 DB 로 쓰는 **두 번째 쓰기 경로**가 생기고, 실패하면 조용히 어긋난다
|
|
308
|
+
* (쓰기 경로는 인제스트 하나, ADR-0032-D).
|
|
309
|
+
*
|
|
310
|
+
* 대신 **여기서 비교해 낸다.** 이 차이는 숨겨야 할 불일치가 아니라 인스펙션이 답해야 할
|
|
311
|
+
* 질문이다 — "원본이 말한 적 없는 설비가 실제로 실행 중이다."
|
|
312
|
+
*
|
|
313
|
+
* 트윈이 안 실행 중이면 비교할 상대가 없다 — 그때는 `null` 이다(0 이 아니다. 없는 것과
|
|
314
|
+
* 세어 보지 못한 것은 다르다).
|
|
315
|
+
*/
|
|
316
|
+
const snap = index_js_1.TwinEngine.snapshot(domainId, instanceId);
|
|
317
|
+
const observedOnly = snap
|
|
318
|
+
? {
|
|
319
|
+
equipment: (snap.equipment ?? []).filter((e) => e?.origin === 'observed').map((e) => e.id),
|
|
320
|
+
locations: (snap.locations ?? []).filter((l) => l?.origin === 'observed').map((l) => l.id),
|
|
321
|
+
persons: (snap.persons ?? []).filter((p) => p?.origin === 'observed').map((p) => p.id)
|
|
322
|
+
}
|
|
323
|
+
: null;
|
|
324
|
+
/* 지도의 선 — 선언된 관계 중 **양끝이 이 트윈에 실재하는 것만**. 없는 선을 그리지 않는다. */
|
|
325
|
+
/* 선의 양끝 판정은 **문서든 행이든 있으면 있는 것**으로 본다 — 투영이 낡았다고 관계가 없어지진 않는다. */
|
|
326
|
+
const nonEmpty = new Set(concepts.filter(c => (c.count ?? 0) > 0 || (c.documentCount ?? 0) > 0).map(c => c.axis));
|
|
327
|
+
/* 선은 **얼마나 이어졌고 얼마나 끊겼는지**까지 말한다 — 관계에서 가장 중요한 정보는 대개 부재다. */
|
|
328
|
+
const edges = await Promise.all(TWIN_RELATIONS.filter((r) => r.target.kind === 'axis' && nonEmpty.has(r.from) && nonEmpty.has(r.target.axis)).map(async (r) => ({ from: r.from, to: r.target.axis, via: r.via, optional: !!r.optional, ...this.edgeFill(model, r) })));
|
|
329
|
+
return {
|
|
330
|
+
instanceId,
|
|
331
|
+
/* 사람이 부르는 이름 — 결선 줄이 업무키만 보이지 않게(업무키는 곁에 남는다). */
|
|
332
|
+
name: inst.name ?? null,
|
|
333
|
+
/*
|
|
334
|
+
* **생산 선언에서 갈 곳이 없는 두 값** — GS1 발행자와 대표 산출물.
|
|
335
|
+
*
|
|
336
|
+
* 나머지 선언(자재·레시피·라우트·공정)은 각자 개념 축이 있고, 자재의 GS1 참조는 자재가 보인다.
|
|
337
|
+
* 이 둘만 자기 축이 없다: 회사 접두사는 이 트윈의 **정체**(발행자)이고, 대표 레시피는 이 공장이
|
|
338
|
+
* 무엇을 만드는 곳인가다. 둘 다 결선 줄(어느 원본을 반영하나)과 같은 성격이라 그 줄에 둔다.
|
|
339
|
+
*/
|
|
340
|
+
/*
|
|
341
|
+
* **표준 적합성** — 채운 것과 빠진 것을 함께.
|
|
342
|
+
*
|
|
343
|
+
* 이 화면은 "이 트윈이 표준 모델의 어디를 채우고 있나" 를 묻는다. 그런데 지금까지 답은 우리
|
|
344
|
+
* 축만 세었다 — 없는 것은 화면에 없으므로 아무도 묻지 않았다. 기준(표준의 목록)을 함께 내면
|
|
345
|
+
* 그 질문이 실제로 답을 갖는다(`isa95-coverage.ts` 의 머리말 참조).
|
|
346
|
+
*/
|
|
347
|
+
/* 종류가 기대는 표준을 **모두** 낸다 — 하나만 말하면 그 트윈의 다른 기준이 보이지 않는다. */
|
|
348
|
+
standards: (0, standard_coverage_js_1.standardsForKind)(inst.kind).map(id => COVERAGE[id](TWIN_AXES.map(a => a.axis))),
|
|
349
|
+
production: (() => {
|
|
350
|
+
const spec = inst.model?.productionSpec;
|
|
351
|
+
if (!spec)
|
|
352
|
+
return null;
|
|
353
|
+
const key = spec.recipeKey ?? null;
|
|
354
|
+
const material = (spec.definition?.materials ?? []).find((m) => (m.key ?? m.id) === key);
|
|
355
|
+
return {
|
|
356
|
+
companyPrefix: spec.companyPrefix ?? null,
|
|
357
|
+
recipeKey: key,
|
|
358
|
+
/* 이름은 자재 선언이 말한다(i18n 키일 수 있으므로 번역은 화면의 일). */
|
|
359
|
+
recipeLabel: material?.label ?? material?.name ?? null
|
|
360
|
+
};
|
|
361
|
+
})(),
|
|
362
|
+
description: inst.description ?? null,
|
|
363
|
+
kind: inst.kind,
|
|
364
|
+
realityMode: inst.realityMode,
|
|
365
|
+
source: ref
|
|
366
|
+
? { referenceId: ref.source, adapterType: ref.adapterType, status: ref.status, lastSyncedAt: ref.lastSyncedAt }
|
|
367
|
+
: null,
|
|
368
|
+
/*
|
|
369
|
+
* **다시 읽을 수 있는가** — 이 트윈이 자기 원본을 기억하고 있나(`TwinInstance.origin`).
|
|
370
|
+
*
|
|
371
|
+
* 없는 트윈이 실제로 있다(이 자리가 생기기 전에 만들어진 것). 그때 화면이 버튼을 그대로
|
|
372
|
+
* 내면 누를 때마다 실패하고, 사용자는 무엇이 잘못됐는지 알 수 없다. 그래서 **할 수 있는지를
|
|
373
|
+
* 먼저 답한다** — 못 하는 것을 못 한다고 말하는 것도 이 화면의 일이다.
|
|
374
|
+
*/
|
|
375
|
+
origin: inst.origin ?? null,
|
|
376
|
+
canResync: !!inst.origin?.kind,
|
|
377
|
+
concepts,
|
|
378
|
+
edges,
|
|
379
|
+
/* 원본이 모르는데 관측에는 있는 것. `null` = 트윈이 실행 중이 아니어서 비교하지 못했다. */
|
|
380
|
+
observedOnly,
|
|
381
|
+
/*
|
|
382
|
+
* 축 셋만 행이고 나머지는 문서에서 셌다는 사실. 축마다 `basis` 가 있지만 여기서도 한 번 말한다 —
|
|
383
|
+
* 화면이 "이 숫자는 무엇으로 셌나" 를 한눈에 보여야 규모 한계가 드러난다(ADR-0032 이주 압력).
|
|
384
|
+
*/
|
|
385
|
+
basis: {
|
|
386
|
+
rows: Object.keys(ROW_BACKED),
|
|
387
|
+
document: TWIN_AXES.filter((a) => !ROW_BACKED[a.axis]).map((a) => a.axis),
|
|
388
|
+
/* 투영이 낡은 축 — 있으면 이 트윈은 인제스트를 한 번 더 태워야 한다. */
|
|
389
|
+
stale: concepts.filter((c) => c.stale).map((c) => c.axis)
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* **이 트윈에 무엇을 선언할 수 있나** — 값을 넣는 화면이 도메인의 모양을 알지 않게.
|
|
395
|
+
*
|
|
396
|
+
* 커널이 정한 명세(속성 id·단위·범위·설명)를 그대로 낸다. 화면이 「에너지 트윈이면 계약전력·요금
|
|
397
|
+
* 단가…」를 알고 있으면 도메인이 늘 때마다 화면을 고쳐야 하고 단위가 두 곳에 적힌다(ADR-0031).
|
|
398
|
+
*
|
|
399
|
+
* 지금 무엇이 선언돼 있는지도 함께 낸다(`declared`) — 화면이 두 번 묻지 않게, 그리고 「원천이 말한
|
|
400
|
+
* 값」과 「우리가 정한 값」을 한자리에서 견줄 수 있게(`PropertySource`, ADR-0034).
|
|
401
|
+
*
|
|
402
|
+
* 어휘가 없는 종류는 `properties: []` 다 — 「아직 없다」와 「아무 값이나 받는다」는 다르다.
|
|
403
|
+
*/
|
|
404
|
+
async twinDeclarations(instanceId, context) {
|
|
405
|
+
const domainId = context.state.domain.id;
|
|
406
|
+
const inst = await (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } });
|
|
407
|
+
if (!inst)
|
|
408
|
+
return null;
|
|
409
|
+
const model = (inst.model ?? {});
|
|
410
|
+
/*
|
|
411
|
+
* 겹이 둘이다 — **현장의 것과 이 트윈의 것**. 화면이 둘을 함께 봐야 「이 값이 어느 범위의 것인가」를
|
|
412
|
+
* 말할 수 있고, 철회 버튼이 어느 겹을 겨눌지 고를 수 있다(요금을 현장에 넣었는데 트윈에서 철회하려
|
|
413
|
+
* 하면 「겹에 없다」로 끝난다 — 사용자는 이유를 알 수 없다).
|
|
414
|
+
*/
|
|
415
|
+
const space = inst.spaceId
|
|
416
|
+
? await (0, shell_1.getRepository)(twin_space_js_1.TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId: inst.spaceId } })
|
|
417
|
+
: null;
|
|
418
|
+
/*
|
|
419
|
+
* 돌고 있으면 커널이 「무엇으로 돌고 있나」를 스스로 답한다. 그 보고는 **작업이 새로 생길 때** 채워지
|
|
420
|
+
* 므로 재기동 직후에는 비는데, 이력에서 배운 종류는 그때도 남아 있다(실측으로 이 빈칸에 부딪혔다).
|
|
421
|
+
*/
|
|
422
|
+
const operations = (0, operation_basis_js_1.operationBasis)(model, index_js_1.TwinEngine.kernel(domainId, instanceId), await index_js_1.TwinEngine.measuredOperationKinds(domainId, instanceId));
|
|
423
|
+
return {
|
|
424
|
+
instanceId,
|
|
425
|
+
kind: inst.kind,
|
|
426
|
+
spaceId: inst.spaceId,
|
|
427
|
+
spaceName: space?.name,
|
|
428
|
+
properties: (0, local_declarations_js_1.declarablePropertySpecs)(inst.kind),
|
|
429
|
+
declared: (inst.localDeclarations ?? []),
|
|
430
|
+
declaredAtSpace: (space?.localDeclarations ?? []),
|
|
431
|
+
/* 어디에 얹을 수 있나 — 모델의 자리·설비·공정. 화면이 대상을 지어내지 않게 목록으로 준다. */
|
|
432
|
+
targets: [
|
|
433
|
+
...(model.locations ?? []).map((l) => ({ target: 'location', id: l.id, name: l.name, type: l.type, properties: l.properties ?? [] })),
|
|
434
|
+
...((0, twin_kernel_1.readBoardEquipment)(model) ?? []).map((e) => ({ target: 'equipment', id: e.id, name: e.name, type: e.type ?? e.kind, properties: e.properties ?? [] })),
|
|
435
|
+
/*
|
|
436
|
+
* 공정은 **자원이 아니다** — 값은 종류에 붙고, 그 종류에 명세 행이 없어도 된다(창고·야드에는 행이
|
|
437
|
+
* 0개다). 그래서 대상 목록을 커널의 자기보고까지 합쳐 만든다(`operationBasis`).
|
|
438
|
+
*
|
|
439
|
+
* 지금 값은 **겹에서** 든다(사용자가 넣은 수와 단위 그대로). 모델에는 ISO 8601 로 구워지지만
|
|
440
|
+
* 화면에 「PT240S」를 보이면 자기가 넣은 값인지 알아볼 수 없다.
|
|
441
|
+
*/
|
|
442
|
+
...operations.map(op => ({
|
|
443
|
+
target: 'operation',
|
|
444
|
+
id: op.kind,
|
|
445
|
+
name: op.label,
|
|
446
|
+
properties: declaredDurationProperty(op.kind, inst.localDeclarations, space?.localDeclarations)
|
|
447
|
+
}))
|
|
448
|
+
],
|
|
449
|
+
/*
|
|
450
|
+
* 이 트윈이 돌리는 공정과 **그 시간이 어디서 오나** — 선언 화면이 「무엇이 상수로 도나」를 보여야
|
|
451
|
+
* 사람이 채울 곳을 안다. `basis` 가 비면 아직 돌지 않은 것이다(공정이 없는 것이 아니다).
|
|
452
|
+
*/
|
|
453
|
+
operations
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* **이 현장에 무엇을 선언할 수 있나** — 현장 값은 트윈의 것이 아니므로 트윈 없이 묻는다.
|
|
458
|
+
*
|
|
459
|
+
* ── 왜 트윈으로 묻지 않나 (2026-08-18) ─────────────────────────────────────
|
|
460
|
+
* 처음에는 트윈 화면에서 범위만 골라 현장 값을 넣게 했다. 그런데 **현장 값을 넣으려고 트윈을 골라야
|
|
461
|
+
* 하는 것**은 개념이 거꾸로다 — 트윈은 그 값을 읽는 쪽이다(사용자가 그 어긋남을 지적했다).
|
|
462
|
+
*
|
|
463
|
+
* 어휘와 대상은 **그 현장 트윈들의 합집합**이다: 한 현장에 여러 종류가 살고(에너지·창고·야드), 요금은
|
|
464
|
+
* 에너지 트윈만 읽는다. 합집합으로 내되 **어느 트윈이 그 대상을 가졌는지** 함께 낸다 — 아무 트윈도
|
|
465
|
+
* 읽지 않는 값을 넣는 일을 화면이 미리 보여 줄 수 있어야 한다.
|
|
466
|
+
*/
|
|
467
|
+
async spaceDeclarations(spaceId, context) {
|
|
468
|
+
const domainId = context.state.domain.id;
|
|
469
|
+
const space = await (0, shell_1.getRepository)(twin_space_js_1.TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId } });
|
|
470
|
+
if (!space)
|
|
471
|
+
return null;
|
|
472
|
+
const twins = await (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).find({ where: { domain: { id: domainId }, spaceId } });
|
|
473
|
+
/* 어휘 합집합 — 같은 속성이 여러 종류에 있어도 한 번만 낸다(명세는 커널 하나에서 온다). */
|
|
474
|
+
const byId = new Map();
|
|
475
|
+
for (const t of twins)
|
|
476
|
+
for (const spec of (0, local_declarations_js_1.declarablePropertySpecs)(t.kind))
|
|
477
|
+
if (!byId.has(spec.id))
|
|
478
|
+
byId.set(spec.id, spec);
|
|
479
|
+
/* 대상 합집합 — 같은 id 가 여러 트윈에 있으면 **그 트윈들을 함께** 든다(현장 값은 그 전부에 얹힌다). */
|
|
480
|
+
const targets = new Map();
|
|
481
|
+
for (const t of twins) {
|
|
482
|
+
const model = (t.model ?? {});
|
|
483
|
+
const add = (target, e) => {
|
|
484
|
+
const key = `${target}:${e.id}`;
|
|
485
|
+
const cur = targets.get(key);
|
|
486
|
+
if (cur) {
|
|
487
|
+
cur.twins.push(t.instanceId);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
targets.set(key, { target, id: e.id, name: e.name, type: e.type ?? e.kind, twins: [t.instanceId] });
|
|
491
|
+
};
|
|
492
|
+
for (const l of model.locations ?? [])
|
|
493
|
+
add('location', l);
|
|
494
|
+
for (const e of (0, twin_kernel_1.readBoardEquipment)(model) ?? [])
|
|
495
|
+
add('equipment', e);
|
|
496
|
+
/*
|
|
497
|
+
* 공정도 대상이다 — 「우리 현장의 적재는 4분」은 그 현장 창고 전부가 읽어야 하는 수다. 목록은 각
|
|
498
|
+
* 트윈의 것을 합집합으로 든다(돌고 있으면 커널이 스스로 답한다).
|
|
499
|
+
*/
|
|
500
|
+
for (const op of (0, operation_basis_js_1.operationBasis)(model, index_js_1.TwinEngine.kernel(domainId, t.instanceId), await index_js_1.TwinEngine.measuredOperationKinds(domainId, t.instanceId)))
|
|
501
|
+
add('operation', { id: op.kind, name: op.label });
|
|
502
|
+
}
|
|
503
|
+
return {
|
|
504
|
+
spaceId,
|
|
505
|
+
spaceName: space.name,
|
|
506
|
+
properties: [...byId.values()],
|
|
507
|
+
declared: (space.localDeclarations ?? []),
|
|
508
|
+
targets: [...targets.values()],
|
|
509
|
+
/* 이 현장에 사는 트윈들 — 화면이 「누가 이 값을 읽나」를 말할 수 있게. */
|
|
510
|
+
twins: twins.map(t => ({ instanceId: t.instanceId, kind: t.kind, name: t.name }))
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
exports.TwinModelQuery = TwinModelQuery;
|
|
515
|
+
tslib_1.__decorate([
|
|
516
|
+
(0, type_graphql_1.Query)(returns => shell_1.ScalarObject, {
|
|
517
|
+
nullable: true,
|
|
518
|
+
description: 'What this twin reflects and where it fills the standard model: per-concept counts, how each was counted, and the declared relations between concepts. Never carries entities — use twinModelEntities for items.'
|
|
519
|
+
}),
|
|
520
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('instanceId')),
|
|
521
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
522
|
+
tslib_1.__metadata("design:type", Function),
|
|
523
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
524
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
525
|
+
], TwinModelQuery.prototype, "twinModelSummary", null);
|
|
526
|
+
tslib_1.__decorate([
|
|
527
|
+
(0, type_graphql_1.Query)(returns => shell_1.ScalarObject, {
|
|
528
|
+
nullable: true,
|
|
529
|
+
description: "What can be declared on this twin and what already is: the kernel's property specification (id, unit, range, note) plus the current local declarations at both scopes — this twin and its facility — each with the value it overrode. Empty properties mean this kind has no declaration vocabulary yet — not that anything goes."
|
|
530
|
+
}),
|
|
531
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('instanceId')),
|
|
532
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
533
|
+
tslib_1.__metadata("design:type", Function),
|
|
534
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
535
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
536
|
+
], TwinModelQuery.prototype, "twinDeclarations", null);
|
|
537
|
+
tslib_1.__decorate([
|
|
538
|
+
(0, type_graphql_1.Query)(returns => shell_1.ScalarObject, {
|
|
539
|
+
nullable: true,
|
|
540
|
+
description: 'What can be declared for a whole facility (space) and what already is: the union of the property specifications of the twin kinds living there, the union of their declarable targets (with which twins carry each), and the current facility-scope declarations.'
|
|
541
|
+
}),
|
|
542
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('spaceId')),
|
|
543
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
544
|
+
tslib_1.__metadata("design:type", Function),
|
|
545
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
546
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
547
|
+
], TwinModelQuery.prototype, "spaceDeclarations", null);
|
|
548
|
+
exports.TwinModelQuery = TwinModelQuery = tslib_1.__decorate([
|
|
549
|
+
(0, type_graphql_1.Resolver)()
|
|
550
|
+
], TwinModelQuery);
|
|
551
|
+
//# sourceMappingURL=twin-model-query.js.map
|