@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
|
@@ -28,14 +28,22 @@ const twin_space_js_1 = require("../service/twin-space/twin-space.js");
|
|
|
28
28
|
const twin_target_js_1 = require("../service/twin-target/twin-target.js");
|
|
29
29
|
const kpi_target_js_1 = require("./kpi-target.js");
|
|
30
30
|
const twin_engine_js_1 = require("./twin-engine.js");
|
|
31
|
+
const energy_topology_js_1 = require("./energy-topology.js");
|
|
31
32
|
const kpi_fold_js_1 = require("./kpi-fold.js");
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
const kpi_baseline_js_1 = require("./kpi-baseline.js");
|
|
34
|
+
/**
|
|
35
|
+
* ์
๋ฌด ์ ์ด๋ง ์ฝ๋๋ค โ ์ค๋น ์ํ(equipment.status)๋ OEE ๋์ ๊ธฐ์ ๋ชซ์ด๊ณ ์ฌ๊ธฐ์ ์ฐ์ง ์๋๋ค.
|
|
36
|
+
*
|
|
37
|
+
* **์๋์ง ๊ตฌ๊ฐ ๋ง๊ฐ**์ ํจ๊ป ์ฝ๋๋ค(2026-08-14): ์๋จ์๋ ๋ถ์(์ ๋ ฅ๋)์ ๋ถ๋ชจ(์ฐ์ถ)๋ฅผ **๊ฐ์ ์ฐฝ**์์
|
|
38
|
+
* ๋๋ ๊ฐ์ด๋ผ, ๋ ์ฌ์ค์ด ํ ํด๋์ ๋ค์ด์์ผ ์ฐฝ์ด ์ด๊ธ๋ ์ ์๋ค. ํ๋ณธ(`energy.measured`)์ ์ฝ์ง ์๋๋ค โ
|
|
39
|
+
* ์ ๋์ ์๊ณ (ยง4.1 ์ธ์ ์คํธ ๊ณ์ฝ) ์ฌ๊ธฐ์ ํ์ํ ๊ฒ์ ๋ง๊ฐ๋ ๊ตฌ๊ฐ๋ฟ์ด๋ค.
|
|
40
|
+
*/
|
|
41
|
+
const BUSINESS_EVENTS = ['task.status', 'order.status', 'energy.demand.window'];
|
|
34
42
|
/** ํ ๋ฒ์ ์ ์ ์ด๋ฒคํธ ์ํ โ ํฐ ๊ตฌ๊ฐ์ด ์๋ฒ๋ฅผ ๋ถ์ก์ง ์๊ฒ. */
|
|
35
43
|
const MAX_EVENTS = 20000;
|
|
36
44
|
/**
|
|
37
|
-
* ๋
ธ๋ โ ๊ตฌ์ญ ์ง๋. **์ ๋์๋ ๊ตฌ์ญ์ด ์๋ค**(๋
ธ๋๊น์ง๋ง ์๋ค) โ
|
|
38
|
-
* ๋ง์คํฐ ๊ณ์ธต์์ ์จ ์์์ด๋ค. ๊ธฐ๋ํ์ง ์์ ํธ์๋
|
|
45
|
+
* ๋
ธ๋ โ ๊ตฌ์ญ ์ง๋. **์ ๋์๋ ๊ตฌ์ญ์ด ์๋ค**(๋
ธ๋๊น์ง๋ง ์๋ค) โ ๋ชจ๋ธ ์ ์์ `locations[].parentId` ๊ฐ
|
|
46
|
+
* ๋ง์คํฐ ๊ณ์ธต์์ ์จ ์์์ด๋ค. ๊ธฐ๋ํ์ง ์์ ํธ์๋ ๋ชจ๋ธ์ ๋จ์ ์์ด ์ด ๊ฒฝ๋ก๊ฐ ๊ฐ์ฅ ํผํผํ๋ค.
|
|
39
47
|
*
|
|
40
48
|
* **ํ ํ๋ง ๋ณด๋ฉด ์ ๋๋ค.** `parentId` ๋ ๊ตฌ์ญ์ผ ์๋ ์๊ณ ์ค๊ฐ ๋จ(๋ผ์ธยท์
)์ผ ์๋ ์๋ค. ๋ผ์ธ์ด ๋ผ๋ฉด
|
|
41
49
|
* ํ ํ์ง๋ฆฌ ์ฝ๋๋ "๊ตฌ์ญ์ด LINE-1" ์ด๋ผ๊ณ ๋ตํ๊ณ , ๊ทธ id ๋ ๊ตฌ์ญ ๋ชฉ๋ก์ ์์ผ๋ฏ๋ก ๊ทธ ์๋ ์คํ
์ด์
์ด
|
|
@@ -48,11 +56,11 @@ const MAX_EVENTS = 20000;
|
|
|
48
56
|
* ์ ๋์๋ ์๊ฐ๋ง ์๊ณ ๊ต๋๊ฐ ์๋ค(์ผ๋ถ๋ฌ ๊ทธ๋ ๊ฒ ๋๋ค โ ๊ต๋๋ ํ์์ด๋ผ ์ฐ์ด ๋๋ฉด ๋์ค์ ๊ต๋ ์๊ฐ์
|
|
49
57
|
* ๊ณ ์ณค์ ๋ ๊ณผ๊ฑฐ๊ฐ ์ ๊ตฌ๋ถ์ผ๋ก ๊ตณ๋๋ค). ๊ทธ๋์ ํด๋๊ฐ ๊ณ์ฐํ ์ฌ๋ฃ๋ฅผ ์ฌ๊ธฐ์ ๋ชจ์๋ค.
|
|
50
58
|
*
|
|
51
|
-
* ์ ์ธ์ ์ถ์ฒ๋
|
|
59
|
+
* ์ ์ธ์ ์ถ์ฒ๋ **๋ชจ๋ธ์ ์ค๋น**๋ค. ์ฌ๋ฌ ์ค๋น๊ฐ ์๋ก ๋ค๋ฅธ ๊ต๋๋ฅผ ๊ฐ์ง ์ ์์ง๋ง, ์ถ์ ํ๋์ฌ์ผ ํ๋ฏ๋ก
|
|
52
60
|
* **๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ์ ์ธ ํ ๋ฒ**์ ์ด๋ค โ 3๊ต๋ ๊ณต์ฅ์ ์ ์ค๋น๊ฐ ๊ฐ์ ๊ต๋์ด๋ฏ๋ก ์ด๊ฒ์ด ๊ณง ์ ๋ต์ด๊ณ ,
|
|
53
61
|
* ์์๋ง๋ค ๊ต๋๊ฐ ๋ค๋ฅธ ํ์ฅ์์๋ ์ด ์ถ์ด ๊ฑฐ์น ๋ค๋ ๋ป์ด๋ค(๊ทธ ์ฌ์ค์ ์ฌ๊ธฐ ์ ์ด ๋๋ค).
|
|
54
62
|
*
|
|
55
|
-
* ์๊ฐ ๊ธฐ์ค์
|
|
63
|
+
* ์๊ฐ ๊ธฐ์ค์ ๋ชจ๋ธ์ ์ค๋ ค ์๋ค(`utcOffsetMinutes` โ ๊ณต๊ฐ์ด ๊ฐ๋ ๊ฐ์ ๊ธฐ๋ ์ ํธ์คํธ๊ฐ ํ์ด ๋ฃ๋๋ค).
|
|
56
64
|
* ์์ผ๋ฉด UTC ๋ก ์ฝ๊ณ , ๊ทธ ๊ธฐ๋ณธ๊ฐ์ ์ปค๋ ๊ณ์ฝ์ ๋ฐํ์ ธ ์๋ค.
|
|
57
65
|
*/
|
|
58
66
|
/**
|
|
@@ -74,10 +82,10 @@ async function shiftContext(domainId, instanceIds) {
|
|
|
74
82
|
const tally = new Map();
|
|
75
83
|
let utcOffsetMinutes;
|
|
76
84
|
for (const row of rows) {
|
|
77
|
-
const
|
|
78
|
-
if (utcOffsetMinutes === undefined && typeof
|
|
79
|
-
utcOffsetMinutes =
|
|
80
|
-
for (const e of (
|
|
85
|
+
const model = row.model;
|
|
86
|
+
if (utcOffsetMinutes === undefined && typeof model?.utcOffsetMinutes === 'number')
|
|
87
|
+
utcOffsetMinutes = model.utcOffsetMinutes;
|
|
88
|
+
for (const e of (model?.equipment ?? [])) {
|
|
81
89
|
const decl = e?.workCalendar;
|
|
82
90
|
if (!Array.isArray(decl) || !decl.length)
|
|
83
91
|
continue;
|
|
@@ -102,13 +110,18 @@ async function locationAreaMap(domainId, instanceIds, spaceId) {
|
|
|
102
110
|
where: { domain: { id: domainId }, instanceId: (0, typeorm_1.In)(instanceIds) }
|
|
103
111
|
});
|
|
104
112
|
for (const row of rows) {
|
|
105
|
-
const locations = (row.
|
|
113
|
+
const locations = (row.model?.locations ?? []).filter(n => n?.id);
|
|
106
114
|
if (!locations.length)
|
|
107
115
|
continue;
|
|
108
116
|
/* ์ํ์ hierarchyOf ๊ฐ ๋์ง๋ค โ ํ ํธ์์ ์๋ชป๋ ๊ณ์ธต์ด ๋ค๋ฅธ ํธ์์ ์ง๊ณ๊น์ง ์ฃฝ์ด์ง ์๊ฒ ์ฌ๊ธฐ์ ๊ฐ๋๋ค. */
|
|
109
117
|
let h;
|
|
110
118
|
try {
|
|
111
|
-
|
|
119
|
+
/*
|
|
120
|
+
* ๋จ ํด์๊ธฐ๋ฅผ ํจ๊ป ๋๊ธด๋ค โ ์๋ฆฌ๊ฐ `level` ์ ์ ์ง ์์ผ๋ฉด **ํ์
์ด ๋ตํ๋ค**(์นดํ๋ก๊ทธ ์ ์ธ).
|
|
121
|
+
* ์ด ์ง๊ณ๋ ์ง๊ธ ๊ตฌ์ญ ๋กค์
(`rollupOf`)๋ง ์ฐ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๋๋ค. ๊ทธ๋๋ ์ฌ๊ธฐ์
|
|
122
|
+
* ์๋๋ค: ๋จ์ผ๋ก ๋ฌป๋ ์ง์(`ancestorOfLevel`)๊ฐ ์๊ธธ ๋ ๋ฐฐ์ ์ ๋ค์ ์ฐพ์ง ์๊ฒ ํ๋ค.
|
|
123
|
+
*/
|
|
124
|
+
h = (0, twin_kernel_1.hierarchyOf)({ locations }, t => (0, twin_kernel_1.levelOfLocationType)(t, row.kind));
|
|
112
125
|
}
|
|
113
126
|
catch (e) {
|
|
114
127
|
console.warn(`[twin-kpi] "${row.instanceId}": location hierarchy is broken โ area rollup skipped for this twin: ${e?.message}`);
|
|
@@ -136,6 +149,150 @@ async function locationAreaMap(domainId, instanceIds, spaceId) {
|
|
|
136
149
|
}
|
|
137
150
|
return { locationArea, labels };
|
|
138
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* ์์ โ **๋ฐฐ์ ๊ณํต์ ์๋ฆฌ**(๋ถ๊ธฐยท์์ ) ์ง๋์ ๊ทธ ์๋ฆฌ์ ์ด๋ฆ.
|
|
154
|
+
*
|
|
155
|
+
* โโ ๋ฌด์์ ์ฝ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
156
|
+
* ์๋์ง ํธ์์ ๋ชจ๋ธ์ด ใ์ด ์ค๋น๊ฐ ์ด๋ ์๋ฆฌ์ ๋งค๋ฌ๋ ธ๋ใ๋ฅผ ์ ์ธํ๋ค(`homeLocation`). ๊ทธ ์๋ฆฌ๊ฐ ๋ถ๊ธฐ๊ฐ
|
|
157
|
+
* ์๋๋ผ ํ์ ์๋ฆฌ๋ผ๋ฉด ๋ถ๋ชจ๋ฅผ ํ๊ณ ์ฌ๋ผ๊ฐ **์ ๊ธฐ ๊ณํต์ ์๋ฆฌ**๋ฅผ ์ฐพ๋๋ค โ ์ ๊ธฐ์ ๊ณํต์ ๋ฌผ๋ฆฌ ๊ตฌ์ญ๊ณผ
|
|
158
|
+
* ๋ค๋ฅธ ๋๋ฌด์ด๋ฏ๋ก ๊ตฌ์ญ ๋กค์
(`locationAreaMap`)์ ์ธ ์ ์๋ค.
|
|
159
|
+
*
|
|
160
|
+
* โโ ์ ์๋์ง ํธ์๋ง ์ฝ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
161
|
+
* ๊ฐ์ ์ค๋น๊ฐ ๊ณต์ฅ ํธ์์์๋ ์์(์์
์ ํ๋ค)์ด๊ณ ์๋์ง ํธ์์์๋ ๋ถํ(์ ๊ธฐ๋ฅผ ๋จน๋๋ค)๋ค โ ์ฌ์ค ๋,
|
|
162
|
+
* id ํ๋. ๊ฐ๋์๊ฐ์ ๊ณต์ฅ ํธ์์ ์ ๋์์ ์ค๊ณ , ์ ๊ธฐ ๊ณํต์ ์์์ ์ด ๋ชจ๋ธ์์ ์จ๋ค. ๊ทธ ๋์ id ๋ก
|
|
163
|
+
* ์๋ ๊ฒ์ด ์ด ์ง๋์ ์ผ์ด๋ค.
|
|
164
|
+
*
|
|
165
|
+
* ์๋ฆฌ๋ฅผ ๋งํ์ง ์๋ ์ค๋น๋ **๋ฃ์ง ์๋๋ค** โ ์๋ ์์์ ๋ง๋ค๋ฉด ๊ทธ ๋ชซ์ด ์๋ฑํ ๋ถ๊ธฐ์ ๊ฒ์ด ๋๋ค.
|
|
166
|
+
*/
|
|
167
|
+
/**
|
|
168
|
+
* ์ ์ธ๋ **์ ๊ธฐ์๊ธ ๋จ๊ฐ** โ ์๋์ง ํธ์์ ์๋ฆฌ ์์ฑ์์ ์ฝ๋๋ค(๊ณ์ฝ์ ๋ ฅ๊ณผ ๊ฐ์ ์๋ฆฌ).
|
|
169
|
+
*
|
|
170
|
+
* ์ฌ๋ฌ ์๋์ง ํธ์์ด ํ ํ์ฅ์ ์์ผ๋ฉด **์ฒ์ ์ ์ธ๋ ๊ฒ ํ๋**๋ฅผ ์ด๋ค. ํ๊ท ์ ๋ด๊ฑฐ๋ ํฉ์น์ง ์๋๋ค:
|
|
171
|
+
* ์๊ธ์ ๊ณ์ฝ์ด๊ณ , ๋ ๊ณ์ฝ์ ์์ ๋จ๊ฐ๋ ์ด๋ ๊ณ์ฝ๋ ์๋๋ค. ์๋ก ๋ค๋ฅธ ๋จ๊ฐ๊ฐ ์ ์ธ๋ผ ์์ผ๋ฉด ๊ทธ๊ฒ์
|
|
172
|
+
* ๋ฐํ๋ค(์กฐ์ฉํ ํ๋๋ฅผ ๊ณ ๋ฅด๋ฉด ์ ๊ทธ ๊ธ์ก์ธ์ง ์๋ฌด๋ ์ค๋ช
ํ ์ ์๋ค).
|
|
173
|
+
*/
|
|
174
|
+
async function tariffOf(domainId, instanceIds) {
|
|
175
|
+
if (!instanceIds.length)
|
|
176
|
+
return {};
|
|
177
|
+
const rows = await (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).find({ where: { domain: { id: domainId }, instanceId: (0, typeorm_1.In)(instanceIds) } });
|
|
178
|
+
const found = [];
|
|
179
|
+
for (const row of rows) {
|
|
180
|
+
if (row.kind !== 'ems')
|
|
181
|
+
continue;
|
|
182
|
+
for (const loc of (row.model?.locations ?? [])) {
|
|
183
|
+
const props = new Map((loc?.properties ?? []).map(p => [String(p?.id), p?.value]));
|
|
184
|
+
const num = (id) => {
|
|
185
|
+
const v = Number(props.get(id));
|
|
186
|
+
return Number.isFinite(v) && v > 0 ? v : undefined;
|
|
187
|
+
};
|
|
188
|
+
const d = num(twin_kernel_1.EMS_PROPERTY.demandChargePerKW);
|
|
189
|
+
const e = num(twin_kernel_1.EMS_PROPERTY.energyChargePerKWh);
|
|
190
|
+
const cur = props.get(twin_kernel_1.EMS_PROPERTY.currency);
|
|
191
|
+
if (d === undefined && e === undefined)
|
|
192
|
+
continue;
|
|
193
|
+
found.push({
|
|
194
|
+
...(d !== undefined ? { demandChargePerKW: d } : {}),
|
|
195
|
+
...(e !== undefined ? { energyChargePerKWh: e } : {}),
|
|
196
|
+
...(cur ? { currency: String(cur) } : {})
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (!found.length)
|
|
201
|
+
return {};
|
|
202
|
+
const first = found[0];
|
|
203
|
+
const same = found.every(t => t.demandChargePerKW === first.demandChargePerKW && t.energyChargePerKWh === first.energyChargePerKWh && t.currency === first.currency);
|
|
204
|
+
return { tariff: first, ...(same ? {} : { conflict: true }) };
|
|
205
|
+
}
|
|
206
|
+
async function resourceFeederMap(domainId, instanceIds) {
|
|
207
|
+
const resourceFeeder = {};
|
|
208
|
+
/** ๊ณ๋ ์ง์ โ ๊ทธ๊ฒ์ด ์ฌ๋ ๋ถ๊ธฐ. ์์ผ๋ฉด ๊ทธ ๋ถ๊ธฐ ๊ฐ์ **์ธก์ **์ด๋ค(๋ฐฐ๋ถ๋ณด๋ค ๊ฐํ ๊ทผ๊ฑฐ). */
|
|
209
|
+
const meterFeeder = {};
|
|
210
|
+
const labels = {};
|
|
211
|
+
if (!instanceIds.length)
|
|
212
|
+
return { resourceFeeder, meterFeeder, labels };
|
|
213
|
+
const rows = await (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).find({ where: { domain: { id: domainId }, instanceId: (0, typeorm_1.In)(instanceIds) } });
|
|
214
|
+
for (const row of rows) {
|
|
215
|
+
if (row.kind !== 'ems')
|
|
216
|
+
continue; // ์ ๊ธฐ ๊ณํต์ ์ ์ธํ๋ ๊ฒ์ ์๋์ง ํธ์์ด๋ค
|
|
217
|
+
const model = row.model ?? {};
|
|
218
|
+
const locations = (model.locations ?? []).filter((n) => n?.id);
|
|
219
|
+
const byId = new Map(locations.map((n) => [String(n.id), n]));
|
|
220
|
+
const electrical = new Set(twin_kernel_1.EMS_LOCATION_TYPES);
|
|
221
|
+
/**
|
|
222
|
+
* ์ด ์๋ฆฌ์์ **์ ๊ธฐ ์๋ฅ**๋ก ์ฌ๋ผ๊ฐ ์ฒ์ ๋ง๋๋ ๊ณํต์ ์๋ฆฌ. ์์ผ๋ฉด undefined.
|
|
223
|
+
*
|
|
224
|
+
* ์๋ฅ์ ๋ป์ ์ปค๋์ด ์ฝ๋๋ค(`electricalUpstreamOf`) โ ๊ณต๊ฐ ๋ถ๋ชจ(๊ณต์ฅยท๊ตฌ์ญ)๋ฅผ ๋ฐ๋ผ ์ฌ๋ผ๊ฐ๋ฉด ์ ๊ธฐ์ ์ผ๋ก
|
|
225
|
+
* ๋ป์ด ์๋ ๊ธธ์ ๊ฑท๊ฒ ๋๊ณ , ์ ์ธ๋(๋ถ๊ธฐ์ `parentId` ์ ์์ )์ ์ ์ธ๋(`upstreamId`)๊ฐ ์์ฌ ์์ผ๋ฏ๋ก
|
|
226
|
+
* ๊ทธ ํ์ ์ ์ฌ๊ธฐ์ ๋ค์ ์ฐ๋ฉด ๋ ๋ฒ์ด ๋๋ค.
|
|
227
|
+
*/
|
|
228
|
+
const feederOf = (startId) => {
|
|
229
|
+
const seen = new Set();
|
|
230
|
+
let cur = byId.get(startId);
|
|
231
|
+
while (cur && !seen.has(String(cur.id))) {
|
|
232
|
+
seen.add(String(cur.id)); // ์๋ชป๋ ๋ชจ๋ธ์ ์ํ์ด ์ฌ๊ธฐ์ ๋ฉ์ถ๋ค
|
|
233
|
+
if (electrical.has(String(cur.type)))
|
|
234
|
+
return String(cur.id);
|
|
235
|
+
const up = (0, twin_kernel_1.electricalUpstreamOf)(locations, String(cur.id));
|
|
236
|
+
cur = up ? byId.get(up) : cur.parentId ? byId.get(String(cur.parentId)) : undefined;
|
|
237
|
+
}
|
|
238
|
+
return undefined;
|
|
239
|
+
};
|
|
240
|
+
for (const e of (model.equipment ?? [])) {
|
|
241
|
+
const home = e?.homeLocation ?? e?.homeLocationId;
|
|
242
|
+
if (!e?.id || !home)
|
|
243
|
+
continue;
|
|
244
|
+
/*
|
|
245
|
+
* ๊ณ๋๊ธฐ๋ ๋ถํ๊ฐ ์๋๋ค โ ๊ทธ๊ฒ์ ใ๋ชซใ์ ์ธ๋ฉด ์ด๋์ด ์ด์ค์ผ๋ก ๋๋๋ค. ๋์ **์ด๋๋ฅผ ์ฌ๋์ง**๋ฅผ
|
|
246
|
+
* ๋ฐ๋ก ๋ชจ์๋ค: ๊ณ๋๊ธฐ๊ฐ ๋ถ๊ธฐ์ ์์ผ๋ฉด ๊ทธ ๋ถ๊ธฐ ๊ฐ์ ๋ฐฐ๋ถ์ด ์๋๋ผ **์ธก์ **์ด๋ค(๊ฐ์ฅ ๊ฐํ ๊ทผ๊ฑฐ).
|
|
247
|
+
*/
|
|
248
|
+
if (e.kind === 'meter') {
|
|
249
|
+
const at = feederOf(String(home));
|
|
250
|
+
/* ๋ฟ๋ฆฌ(์์ )๋ฅผ ์ฌ๋ ๊ณ๋๊ธฐ๋ ๋ถ๊ธฐ์ ๊ฒ์ด ์๋๋ค โ ๊ทธ ๊ฐ์ ์ด๋์ด๊ณ , ๋๋จธ์ง๋ ๋บ์
์ผ๋ก ๋์จ๋ค. */
|
|
251
|
+
if (at && String(byId.get(at)?.type) !== 'incoming')
|
|
252
|
+
meterFeeder[String(e.id)] = at;
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
/* ์ฐจ๋จ๊ธฐยทํ์๊ดยท์ถ์ ์ง๋ ๋ถํ๊ฐ ์๋๋ค. */
|
|
256
|
+
if (e.kind === 'breaker' || e.kind === 'pv-array' || e.kind === 'battery')
|
|
257
|
+
continue;
|
|
258
|
+
const feeder = feederOf(String(home));
|
|
259
|
+
if (feeder)
|
|
260
|
+
resourceFeeder[String(e.id)] = feeder;
|
|
261
|
+
}
|
|
262
|
+
for (const n of locations)
|
|
263
|
+
if (electrical.has(String(n.type)) && n.name)
|
|
264
|
+
labels[String(n.id)] = String(n.name);
|
|
265
|
+
}
|
|
266
|
+
return { resourceFeeder, meterFeeder, labels };
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* ์ด ๊ณต๊ฐ์ ์๋์ง ํธ์๋ค์ ๊ณํต๋ โ ๋ชจ๋ธ์ ์ฝ์ด ํธ๋ฆฌ๋ก ์ ๋๋ค.
|
|
270
|
+
*
|
|
271
|
+
* ์ฌ๋ฌ ํธ์์ด ํ ๊ณต๊ฐ์ ์์ผ๋ฉด **๊ฐ ํธ์์ ๋ฟ๋ฆฌ๋ฅผ ๋๋ํ** ๋๋ค(ํ๋๋ก ํฉ์น๋ฉด ์๋ ๊ฒฐ์ ์ ๊ทธ๋ฆฌ๊ฒ ๋๋ค).
|
|
272
|
+
* ์๋์ง ํธ์์ด ์์ผ๋ฉด ๋ง๋ค์ง ์๋๋ค โ ๋น ๊ทธ๋ฆผ์ ๊ณ ์ฅ์ผ๋ก ์ฝํ๋ค.
|
|
273
|
+
*/
|
|
274
|
+
async function energyTopologyOf(domainId, instanceIds, energy) {
|
|
275
|
+
if (!instanceIds.length)
|
|
276
|
+
return undefined;
|
|
277
|
+
const rows = await (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).find({ where: { domain: { id: domainId }, instanceId: (0, typeorm_1.In)(instanceIds) } });
|
|
278
|
+
const ems = rows.filter(r => r.kind === 'ems' && r.model);
|
|
279
|
+
if (!ems.length)
|
|
280
|
+
return undefined;
|
|
281
|
+
const merged = { roots: [], unplaced: [], unmetered: [], loadsOnIncoming: 0 };
|
|
282
|
+
for (const row of ems) {
|
|
283
|
+
/*
|
|
284
|
+
* ์ง๊ธ์ ์ค๋น ์ํ๋ฅผ ํจ๊ป ๋๊ธด๋ค โ ๋ฐ์ ยท์ ์ฅ์ **์ง๊ธ ๊ฐ**์ ๊ตฌ๊ฐ ํด๋๊ฐ ์๋๋ผ ์ค๋
์ท์ด ์๋ค.
|
|
285
|
+
* ์์ผ๋ฉด(์ ์ง๋ ํธ์) ๊ตฌ์กฐ๋ง ๊ทธ๋ฆฐ๋ค.
|
|
286
|
+
*/
|
|
287
|
+
const snap = twin_engine_js_1.TwinEngine.snapshot(domainId, row.instanceId);
|
|
288
|
+
const t = (0, energy_topology_js_1.buildEnergyTopology)(row.model, energy, snap?.equipment);
|
|
289
|
+
merged.roots.push(...t.roots);
|
|
290
|
+
merged.unplaced.push(...t.unplaced);
|
|
291
|
+
merged.unmetered.push(...t.unmetered);
|
|
292
|
+
merged.loadsOnIncoming += t.loadsOnIncoming;
|
|
293
|
+
}
|
|
294
|
+
return merged.roots.length ? merged : undefined;
|
|
295
|
+
}
|
|
139
296
|
/** ์ด ๋์๋ค์ ๋ง์ง๋ง ์
๋ฌด ๊ธฐ๋ก ์๊ฐ(ISO). ๊ธฐ๋ก์ด ์์ผ๋ฉด null. */
|
|
140
297
|
async function latestEventTime(domainId, instanceIds) {
|
|
141
298
|
if (instanceIds.length === 0)
|
|
@@ -144,13 +301,14 @@ async function latestEventTime(domainId, instanceIds) {
|
|
|
144
301
|
where: { domain: { id: domainId }, instanceId: (0, typeorm_1.In)(instanceIds), eventType: (0, typeorm_1.In)(BUSINESS_EVENTS) },
|
|
145
302
|
order: { revision: 'DESC' }
|
|
146
303
|
});
|
|
147
|
-
|
|
304
|
+
/* ์๋น์ฒ๋ ISO ๋ฌธ์์ด์ ๊ธฐ๋ํ๋ค(์๊ฐ ์ถ์ ๊ณต์ฉ ํ๊ธฐ) โ ์ปฌ๋ผ์ด ๋ ์ง๊ฐ ๋์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ์ฎ๊ธด๋ค. */
|
|
305
|
+
return row?.eventTime ? row.eventTime.toISOString() : null;
|
|
148
306
|
}
|
|
149
307
|
/**
|
|
150
308
|
* ์ฐฝ ๊ตฌ๊ฐ์ ์
๋ฌด ์ด๋ฒคํธ โ ์ฐฝ๋ณด๋ค `lookbackMs` ๋งํผ ์๊น์ง ์ฝ๋๋ค(์๋ฃ๋ ์์
์ ์์์ด ์ฐฝ ๋ฐ์ผ ์ ์๋ค).
|
|
151
309
|
*
|
|
152
|
-
* eventTime ์
|
|
153
|
-
*
|
|
310
|
+
* eventTime ์ ๋ ์ง ์ปฌ๋ผ์ด๋ผ DB ๊ฐ ์๊ฐ์ผ๋ก ๋น๊ตํ๋ค โ ์์ ๋ฌธ์์ด ์ปฌ๋ผ ์์ ์ "UTC ISO ๋ง ๋ค์ด์ค๋ฉด
|
|
311
|
+
* ์ฌ์ ์ ๋น๊ต๊ฐ ๋ง๋๋ค" ๋ ์ ์ ๊ฐ ํ์ ์๋ค.
|
|
154
312
|
*/
|
|
155
313
|
async function fetchEvents(domainId, instanceIds, fromMs, toMs, lookbackMs) {
|
|
156
314
|
if (instanceIds.length === 0)
|
|
@@ -160,7 +318,7 @@ async function fetchEvents(domainId, instanceIds, fromMs, toMs, lookbackMs) {
|
|
|
160
318
|
domain: { id: domainId },
|
|
161
319
|
instanceId: (0, typeorm_1.In)(instanceIds),
|
|
162
320
|
eventType: (0, typeorm_1.In)(BUSINESS_EVENTS),
|
|
163
|
-
eventTime: (0, typeorm_1.Between)(new Date(fromMs - lookbackMs)
|
|
321
|
+
eventTime: (0, typeorm_1.Between)(new Date(fromMs - lookbackMs), new Date(toMs))
|
|
164
322
|
},
|
|
165
323
|
order: { revision: 'ASC' },
|
|
166
324
|
take: MAX_EVENTS
|
|
@@ -168,7 +326,8 @@ async function fetchEvents(domainId, instanceIds, fromMs, toMs, lookbackMs) {
|
|
|
168
326
|
/* ์ํ์ ์ ํํ ๋ฟ์ผ๋ฉด **๋ ์์์ ์ ์๋ค** โ ๊ทธ ์ฌ์ค์ ๋๋ ค์ค๋ค. ์กฐ์ฉํ ์๋ผ๋ด๋ฉด ์ซ์๊ฐ ์กฐ์ฉํ
|
|
169
327
|
* ์์์ง๊ณ , ์ฌ์ฉ์๋ ๊ทธ๊ฒ์ ์ฑ๊ณผ ํ๋ฝ์ผ๋ก ์ฝ๋๋ค(๊ฐ์ฅ ๋์ ์ข
๋ฅ์ ๊ฑฐ์ง์ด๋ค). */
|
|
170
328
|
return {
|
|
171
|
-
|
|
329
|
+
/* ํด๋๋ ISO ๋ฌธ์์ด ์ถ์ผ๋ก ์ํ๋๋ค(kpi-fold) โ ๊ฒฝ๊ณ์์ ํ ๋ฒ๋ง ์ฎ๊ธด๋ค. */
|
|
330
|
+
events: rows.map(r => ({ eventType: r.eventType, eventTime: r.eventTime?.toISOString(), payload: r.payload })),
|
|
172
331
|
capped: rows.length >= MAX_EVENTS
|
|
173
332
|
};
|
|
174
333
|
}
|
|
@@ -187,7 +346,8 @@ async function resolveTargets(input) {
|
|
|
187
346
|
: list.filter((x) => x?.running && x.spaceId === input.spaceId && x.purpose !== 'bench' && x.instanceId);
|
|
188
347
|
/* ๋ชฉ๋ก์์ ๋ชป ์ฐพ์๋(์ ์งยท๋น๋ฑ๋ก) ์ง์ ๋ ํธ์์ ๊ทธ๋๋ก ์กฐํํ๋ค โ ์ ๋์ ๋จ์ ์์ ์ ์๋ค. */
|
|
189
348
|
const instanceIds = rows.length ? rows.map((x) => x.instanceId) : input.instanceId ? [input.instanceId] : [];
|
|
190
|
-
|
|
349
|
+
/* ์ปฌ๋ผ์ด NOT NULL ์ด๋ผ 'unknown' ์ผ๋ก ๋ฉ์ธ ์ผ์ด ์๋ค โ ๋น๋ฉด ๊ณ์ฝ์ด ๊นจ์ง ๊ฒ์ด์ง ๋ชจ๋ฅด๋ ์ํ๊ฐ ์๋๋ค. */
|
|
350
|
+
const realityModes = [...new Set(rows.map((x) => String(x.realityMode)))];
|
|
191
351
|
return { instanceIds, realityModes };
|
|
192
352
|
}
|
|
193
353
|
/**
|
|
@@ -242,9 +402,19 @@ async function computeTwinKpi(input) {
|
|
|
242
402
|
/* ๊ตฌ์ญยท๊ต๋ ์ถ์ **์ด๋ฒคํธ ๋ฐ์ ์ง์**์ ํ์๋ก ํ๋ค โ ๋ค๋ฅธ ์ถ์ payload ์์ ๋ฐ๋ก ๋์จ๋ค. */
|
|
243
403
|
const areaMap = input.groupBy === 'area' ? await locationAreaMap(input.domainId, instanceIds, input.spaceId) : { locationArea: {}, labels: {} };
|
|
244
404
|
const shiftCtx = input.groupBy === 'shift' ? await shiftContext(input.domainId, instanceIds) : {};
|
|
405
|
+
/*
|
|
406
|
+
* ์ ๊ธฐ ๊ณํต ์์์ **์ถ๊ณผ ๋ฌด๊ดํ๊ฒ** ์ฝ๋๋ค โ ๋ถ๊ธฐ๋ณ ๋ชซ์ ๊ด์ ์ถ์ด ์๋๋ผ ์๋์ง ์ฌ์ค์ ์ผ๋ถ๋ผ
|
|
407
|
+
* (๊ฐ์ ์ฐฝ์ ์ด๋์ ๋๋ ๊ฒ) ์ด๋ ์ถ์ ๋ณด๊ณ ์๋ ํจ๊ป ๋๊ฐ์ผ ํ๋ค.
|
|
408
|
+
*/
|
|
409
|
+
const feederMap = await resourceFeederMap(input.domainId, instanceIds);
|
|
410
|
+
/* ์๊ธ ๋จ๊ฐ๋ ์ถ๊ณผ ๋ฌด๊ดํ๊ฒ ์ฝ๋๋ค โ ๊ธ์ก์ ๊ฐ์ ์ฐฝ์ ์ ๋ ฅ๋ยท์ต๋์์์์ ๋์ค๋ ์ฌ์ค์ด๋ค. */
|
|
411
|
+
const tariffFound = await tariffOf(input.domainId, instanceIds);
|
|
245
412
|
const kpi = (0, kpi_fold_js_1.foldKpi)(events, { fromMs, toMs }, {
|
|
246
413
|
groupBy: input.groupBy,
|
|
247
414
|
locationArea: areaMap.locationArea,
|
|
415
|
+
resourceFeeder: feederMap.resourceFeeder,
|
|
416
|
+
meterFeeder: feederMap.meterFeeder,
|
|
417
|
+
...(tariffFound.tariff ? { tariff: tariffFound.tariff } : {}),
|
|
248
418
|
...shiftCtx,
|
|
249
419
|
groupLimit: input.groupLimit
|
|
250
420
|
});
|
|
@@ -261,12 +431,47 @@ async function computeTwinKpi(input) {
|
|
|
261
431
|
minutes: Math.round((toMs - fromMs) / 60_000),
|
|
262
432
|
basis
|
|
263
433
|
};
|
|
434
|
+
/**
|
|
435
|
+
* ์ฌ๋ฌ ๊ตฌ๊ฐ ๋ถํฌ๋ฅผ ๋ง๋ ๋ค โ **ํ์ฌ ์ฐฝ์ ๊ธฐ๋ก์ด ์์ด๋ ๋ธ๋ค.**
|
|
436
|
+
*
|
|
437
|
+
* ๊ทธ๋๊ฐ ์คํ๋ ค ๊ฐ์ฅ ์๊ณ ์ถ์ ์๊ฐ์ด๋ค("์ง๊ธ ์๋ฌด ๊ธฐ๋ก์ด ์๋๋ฐ ํ์์ 60๊ฑด์ด์๋ค" = ๋ฉ์ถ ์ ํธ).
|
|
438
|
+
* ๊ทธ๋์ ์กฐ๊ธฐ ๋ฐํ๋ณด๋ค ์์ ๋๊ณ ๋ ๊ฒฝ๋ก๊ฐ ํจ๊ป ์ด๋ค.
|
|
439
|
+
*/
|
|
440
|
+
const computeBaseline = async () => {
|
|
441
|
+
if (!input.baseline || !(input.baseline.periods > 0))
|
|
442
|
+
return undefined;
|
|
443
|
+
const stride = input.baseline.stride ?? 'day';
|
|
444
|
+
const windows = (0, kpi_baseline_js_1.baselineWindows)(fromMs, toMs, input.baseline.periods, stride);
|
|
445
|
+
let baseCapped = false;
|
|
446
|
+
const samples = [];
|
|
447
|
+
for (const w of windows) {
|
|
448
|
+
const { events: pastEvents, capped: pastCapped } = await fetchEvents(input.domainId, instanceIds, w.fromMs, w.toMs, lookbackMs);
|
|
449
|
+
baseCapped = baseCapped || pastCapped;
|
|
450
|
+
/* ์ถ ์์ด, **๊ฐ์ ๊ต๋ ์ ์**๋ก ์ ๋๋ค(์ ์๊ฐ ๋ค๋ฅด๋ฉด ๊ฐ์ ์๊ฐ๋๊ฐ ์๋๊ฒ ๋๋ค). */
|
|
451
|
+
const past = (0, kpi_fold_js_1.foldKpi)(pastEvents, w, { locationArea: areaMap.locationArea, ...shiftCtx });
|
|
452
|
+
const values = {};
|
|
453
|
+
for (const metric of Object.keys(kpi_target_js_1.TWIN_METRIC))
|
|
454
|
+
values[metric] = kpi_target_js_1.TWIN_METRIC[metric].of(past);
|
|
455
|
+
samples.push({ fromMs: w.fromMs, toMs: w.toMs, values });
|
|
456
|
+
}
|
|
457
|
+
const current = {};
|
|
458
|
+
for (const metric of Object.keys(kpi_target_js_1.TWIN_METRIC))
|
|
459
|
+
current[metric] = kpi_target_js_1.TWIN_METRIC[metric].of(kpi);
|
|
460
|
+
return {
|
|
461
|
+
stride,
|
|
462
|
+
periods: windows.length,
|
|
463
|
+
metrics: (0, kpi_baseline_js_1.summarizeBaseline)(kpi_target_js_1.TWIN_METRIC, current, samples),
|
|
464
|
+
...(baseCapped ? { capped: true } : {})
|
|
465
|
+
};
|
|
466
|
+
};
|
|
264
467
|
if (kpi.eventsInWindow === 0) {
|
|
468
|
+
const baseline = await computeBaseline();
|
|
265
469
|
return {
|
|
266
470
|
window,
|
|
267
471
|
measured: false,
|
|
268
472
|
scope,
|
|
269
|
-
note: 'no operational events in this window โ nothing to measure (this is NOT "zero throughput").'
|
|
473
|
+
note: 'no operational events in this window โ nothing to measure (this is NOT "zero throughput").',
|
|
474
|
+
...(baseline ? { baseline } : {})
|
|
270
475
|
};
|
|
271
476
|
}
|
|
272
477
|
/* ๊ตฌ๊ฐ๋ณ ๊ฐ โ ์ชผ๊ฐ๊ธฐ ๊ท์น์ ์์ ๋ชจ๋์ด ์์ ํ๋ค(ํ
์คํธ ๊ฐ๋ฅ). ์ฌ๊ธฐ์๋ ์๊ฐ์ ISO ๋ก ์ฎ๊ธฐ๊ธฐ๋ง. */
|
|
@@ -326,6 +531,15 @@ async function computeTwinKpi(input) {
|
|
|
326
531
|
}
|
|
327
532
|
};
|
|
328
533
|
}
|
|
534
|
+
/*
|
|
535
|
+
* ์ฌ๋ฌ ๊ตฌ๊ฐ ๋์ ๋น๊ต โ **๊ฐ์ ์๊ฐ๋๋ฅผ ๋ฉฐ์น ๋ค๋ก** ์ฎ๊ฒจ ๋ถํฌ๋ฅผ ๋ง๋ ๋ค(์ฑ๊ณผ ๋งต โข).
|
|
536
|
+
*
|
|
537
|
+
* ์ฐฝ๋ง๋ค ์กฐํ๊ฐ ํ ๋ฒ ๋ ๋ถ์ง๋ง ๊ฐ ์ฐฝ์ ํ์ฌ ์ฐฝ๊ณผ ๊ฐ์ ๊ธธ์ด๋ผ(๋ณดํต 1~24h) ๊ฐ์ธ๋ค. ์ถ(groupBy)์
|
|
538
|
+
* ๋๊ธฐ์ง ์๋๋ค โ ๋ถํฌ๋ **์ ์ฒด ์งํ**์ ์ง๋ฌธ์ด๊ณ , ์ถ๋ณ ๋ถํฌ๊น์ง ๋ด๋ฉด ์๋ต์ด ์ถ ์๋งํผ ๋ถํผ๋ค
|
|
539
|
+
* (ํ์ํด์ง๋ฉด ๊ทธ๋ ์ถ์ ์ง์ ํด ๋ค์ ๋ฌป๋ ๊ฒ์ด ์ ์งํ๋ค).
|
|
540
|
+
*
|
|
541
|
+
* ์งํ ์ดํ๋ `TWIN_METRIC` ์ด ๊ณ์ ์์ ํ๊ณ , ์ฌ๊ธฐ์๋ **๊ฐ๋ง ๊บผ๋ด** ๋ถํฌ ๋ชจ๋์ ๋๊ธด๋ค.
|
|
542
|
+
*/
|
|
329
543
|
/* ๊ด์ ๊ฐ์ ์๊ฐ ๋ณํ์ด ์์ด ๊ทธ๋๋ก ํต๊ณผํ๋ค. ๋ถ์ด๋ ๊ฒ์ โ ์ฌ๋์ด ์ฝ๋ ์ด๋ฆ๊ณผ โก ์ถ์ด ํต์งธ๋ก
|
|
330
544
|
* ๋น์์ ๋์ ์ด์ ๋ค โ "๊ตฌ์ญ๋ณ 0๊ฑด" ๊ณผ "๋
ธ๋์ ๊ตฌ์ญ์ด ์ ๋ถ์ด ์๋ค" ๋ ์์ ํ ๋ค๋ฅธ ์ํฉ์ด๋ค. */
|
|
331
545
|
const groups = kpi.groups
|
|
@@ -369,8 +583,35 @@ async function computeTwinKpi(input) {
|
|
|
369
583
|
* **๋ชฉํ๊ฐ ์์ผ๋ฉด ํ์ ํ์ง ์๋๋ค** โ ํ๋ ์์ฒด๋ฅผ ๋ง๋ค์ง ์๋๋ค. ์ ๋ถ "๋ชฉํ ์์" ์ผ๋ก ์ฑ์ฐ๋ฉด
|
|
370
584
|
* ํ๋ฉด์ด ํ์ ๋
ธ์ด์ฆ๊ฐ ๋๊ณ , ๋ชฉํ๊ฐ ์๋ ์งํ๊ฐ ๋ฌปํ๋ค.
|
|
371
585
|
*/
|
|
586
|
+
/* ๋ถํฌ๋ **ํ ๋ฒ๋ง** ๊ณ์ฐํ๋ค โ ์ฐฝ๋ง๋ค ์กฐํ๊ฐ ๋ถ์ผ๋ฏ๋ก ๋ ๋ฒ ๋ถ๋ฅด๋ฉด ์กฐํ๊ฐ ๋ ๋ฐฐ๊ฐ ๋๋ค. */
|
|
587
|
+
const baseline = await computeBaseline();
|
|
372
588
|
/* ํด๋๊ฐ ๋๋ ค์ค raw ์ฐฝ(ms)์ ๋ฒ๋ฆฐ๋ค โ ์์ ISO ์ฐฝ์ด ์ฌ๋์ด ์ฝ์ ์ ๋ณธ์ด๋ค. */
|
|
373
589
|
const { window: _rawWindow, groups: _rawGroups, ...rest } = kpi;
|
|
590
|
+
/*
|
|
591
|
+
* ์๋ฆฌ์ **๋ถ๋ฅด๋ ์ด๋ฆ**์ ๋ถ์ธ๋ค โ `feeder-2` ๋ id ์ด๊ณ ์ฌ๋์ ใ๊ฐ๊ณต ๋ผ์ธใ์ผ๋ก ๋ถ๋ฅธ๋ค.
|
|
592
|
+
* ์ด๋ฆ์ ๋ชจ๋ฅด๋ ์๋ฆฌ๋ id ๊ทธ๋๋ก ๋๋ค(์ง์ด๋ด์ง ์๋๋ค).
|
|
593
|
+
*/
|
|
594
|
+
/* ๋จ๊ฐ๊ฐ ๊ฐ๋ ค ์์ผ๋ฉด ๋ฐํ๋ค โ ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ฅธ ํ๋๋ก ๋ธ ๊ธ์ก์ด๋ผ๋ ์ฌ์ค์ ํ๋ฉด์ด ๋งํ ์ ์๊ฒ. */
|
|
595
|
+
if (rest.energy?.cost && tariffFound.conflict)
|
|
596
|
+
rest.energy = { ...rest.energy, tariffConflict: true };
|
|
597
|
+
if (rest.energy?.byFeeder?.length) {
|
|
598
|
+
rest.energy = {
|
|
599
|
+
...rest.energy,
|
|
600
|
+
byFeeder: rest.energy.byFeeder.map(row => ({ ...row, ...(feederMap.labels[row.key] ? { label: feederMap.labels[row.key] } : {}) }))
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
/*
|
|
604
|
+
* ๊ณํต๋ โ **์ ์ธ๋ ๊ด๊ณ์ ๊ณ๋์ด ๋ฎ๋ ๋ฒ์**๋ฅผ ํจ๊ป ๋ธ๋ค.
|
|
605
|
+
*
|
|
606
|
+
* ๊ฐ์ ์ฌ๊ธฐ์ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ค(ํด๋๊ฐ ๋ธ ๋ถ๊ธฐ๋ณ ๋ชซ์ ๊ทธ๋๋ก ๋
ธ๋์ ์น๋๋ค). ๊ณํต์ ๋ชจ๋ธ์ด ์๋
|
|
607
|
+
* ์ฌ์ค์ด๋ฏ๋ก ์ ๋๋ง ๋ณด๋ ํด๋๊ฐ ์๋๋ผ ์ฌ๊ธฐ์ ์กฐ๋ฆฝํ๋ค โ ํ๋ฉด์ด ๋ชจ๋ธ์ ๋ฐ๋ก ๋ ์กฐํํ์ง ์์๋ ๋๊ณ ,
|
|
608
|
+
* AI ๋ ๊ฐ์ ๊ฐ์ ์ฝ๋๋ค(๊ท์น ํ ๋ฒ).
|
|
609
|
+
*/
|
|
610
|
+
if (rest.energy) {
|
|
611
|
+
const topo = await energyTopologyOf(input.domainId, instanceIds, rest.energy);
|
|
612
|
+
if (topo)
|
|
613
|
+
rest.energy = { ...rest.energy, topology: topo };
|
|
614
|
+
}
|
|
374
615
|
return {
|
|
375
616
|
window,
|
|
376
617
|
measured: true,
|
|
@@ -380,7 +621,8 @@ async function computeTwinKpi(input) {
|
|
|
380
621
|
...(buckets ? { buckets } : {}),
|
|
381
622
|
...(groups ? { groups } : {}),
|
|
382
623
|
...(verdicts.length ? { targets: verdicts } : {}),
|
|
383
|
-
...(comparison ? { comparison } : {})
|
|
624
|
+
...(comparison ? { comparison } : {}),
|
|
625
|
+
...(baseline ? { baseline } : {})
|
|
384
626
|
};
|
|
385
627
|
}
|
|
386
628
|
//# sourceMappingURL=kpi-query.js.map
|