@things-factory/headless-twin 10.0.9 → 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/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.js +1 -1
- package/dist-server/engine/command-routing.js.map +1 -1
- 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 +8 -3
- package/dist-server/engine/index.js +10 -3
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/kpi-baseline.d.ts +1 -1
- package/dist-server/engine/kpi-baseline.js.map +1 -1
- 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 +1 -1
- package/dist-server/engine/kpi-query.js +212 -18
- 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-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/{board-vocabulary.d.ts → model-vocabulary.d.ts} +4 -4
- package/dist-server/engine/{board-vocabulary.js → model-vocabulary.js} +37 -19
- 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 +1 -1
- package/dist-server/engine/runtime-key.js +1 -1
- package/dist-server/engine/runtime-key.js.map +1 -1
- 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 +7 -2
- package/dist-server/engine/state-axes.js +8 -3
- package/dist-server/engine/state-axes.js.map +1 -1
- 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 +332 -47
- package/dist-server/engine/twin-engine.js +1314 -279
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/engine/warm-start.d.ts +38 -4
- package/dist-server/engine/warm-start.js +38 -9
- 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 +1 -1
- package/dist-server/service/reference/discovery-result.js +2 -2
- package/dist-server/service/reference/discovery-result.js.map +1 -1
- package/dist-server/service/reference/ingest-space.d.ts +24 -1
- package/dist-server/service/reference/ingest-space.js +17 -1
- package/dist-server/service/reference/ingest-space.js.map +1 -1
- package/dist-server/service/reference/reference-live.d.ts +23 -0
- package/dist-server/service/reference/reference-live.js +121 -4
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +194 -13
- package/dist-server/service/reference/reference-master.js +159 -28
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +31 -1
- package/dist-server/service/reference/reference-resolver.js +223 -12
- 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-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.js +21 -1
- 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 +217 -38
- 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 -20
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/twin-journal-query.d.ts +5 -2
- package/dist-server/service/twin-journal/twin-journal-query.js +71 -9
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +3 -5
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +24 -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 +62 -0
- 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 +356 -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-structure/twin-structure.d.ts +1 -1
- package/dist-server/service/twin-structure/twin-structure.js +8 -8
- package/dist-server/service/twin-structure/twin-structure.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-server/engine → dist-shared}/entity-delta.d.ts +3 -0
- package/{dist-server/engine → dist-shared}/entity-delta.js +102 -2
- package/dist-shared/entity-delta.js.map +1 -0
- package/dist-shared/kpi-broadcast.js.map +1 -0
- package/dist-shared/twin-level.js.map +1 -0
- package/package.json +14 -12
- package/server/engine/canonical-ingest.ts +36 -4
- package/server/engine/command-routing.ts +1 -1
- package/server/engine/energy-topology.ts +189 -0
- package/server/engine/index.ts +10 -3
- package/server/engine/kpi-baseline.ts +1 -1
- package/server/engine/kpi-fold.ts +389 -1
- package/server/engine/kpi-query.ts +214 -19
- package/server/engine/kpi-target.ts +24 -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/{board-vocabulary.ts → model-vocabulary.ts} +36 -15
- 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 +1 -1
- package/server/engine/spec-coverage.ts +3 -3
- package/server/engine/state-axes.ts +8 -3
- package/server/engine/structure-diff.ts +1 -1
- package/server/engine/travel-estimator.ts +11 -6
- package/server/engine/twin-engine.ts +1414 -274
- package/server/engine/warm-start.ts +83 -12
- 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 +2 -2
- package/server/service/reference/ingest-space.ts +35 -1
- package/server/service/reference/reference-live.ts +119 -4
- package/server/service/reference/reference-master.ts +276 -35
- package/server/service/reference/reference-resolver.ts +232 -12
- package/server/service/reference/template-registry.ts +20 -5
- 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 +22 -1
- 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 +208 -36
- package/server/service/twin-instance/twin-instance.ts +126 -25
- package/server/service/twin-journal/twin-journal-query.ts +74 -10
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +23 -22
- package/server/service/twin-metrics/twin-metrics-query.ts +59 -2
- 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 +355 -21
- package/server/service/twin-space/twin-space.ts +40 -6
- package/server/service/twin-structure/twin-structure.ts +10 -10
- package/shared/axis-read.ts +28 -0
- package/{server/engine → shared}/entity-delta.ts +96 -1
- package/test/adopt-structure-live.test.ts +133 -0
- package/test/attention-digest.test.ts +3 -3
- 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 +1 -1
- package/test/command-routing.test.ts +1 -1
- package/test/declaration-reaches-model.test.ts +178 -0
- package/test/discovery-result.test.ts +1 -1
- package/test/energy-topology.test.ts +113 -0
- package/test/entity-delta.test.ts +171 -1
- 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 +6 -6
- package/test/ingest-running-guard.test.ts +136 -0
- package/test/ingest-space.test.ts +29 -1
- package/test/instance-cache-lifecycle.test.ts +110 -0
- package/test/kernel-kind-guard.test.ts +96 -0
- package/test/kpi-baseline-db.test.ts +3 -1
- package/test/kpi-baseline.test.ts +3 -3
- package/test/kpi-fold.test.ts +393 -2
- package/test/kpi-query-bench.test.ts +5 -3
- 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 +22 -15
- package/test/load-meter.test.ts +314 -0
- package/test/local-declarations.test.ts +554 -0
- package/test/master-to-twin.test.ts +121 -33
- package/test/model-basis.test.ts +56 -1
- package/test/{board-vocabulary.test.ts → model-vocabulary.test.ts} +25 -25
- package/test/move-space.test.ts +149 -0
- package/test/mutation-gate.test.ts +19 -5
- package/test/oee-accumulator.test.ts +26 -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/resync-origin-site.test.ts +77 -0
- package/test/scale-twin-bench.test.ts +5 -5
- 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 +1 -1
- package/test/streamline-e2e.test.ts +14 -14
- package/test/structure-revision-db.test.ts +11 -11
- package/test/tenant-registry-db.test.ts +5 -5
- 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 +6 -6
- package/test/warm-start.test.ts +88 -3
- 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/board-vocabulary.js.map +0 -1
- package/dist-server/engine/entity-delta.js.map +0 -1
- package/dist-server/engine/kpi-broadcast.js.map +0 -1
- package/dist-server/engine/twin-level.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/service/twin-event/backfill-keys.ts +0 -72
- /package/{dist-server/engine → dist-shared}/kpi-broadcast.d.ts +0 -0
- /package/{dist-server/engine → dist-shared}/kpi-broadcast.js +0 -0
- /package/{dist-server/engine → dist-shared}/twin-level.d.ts +0 -0
- /package/{dist-server/engine → dist-shared}/twin-level.js +0 -0
- /package/{server/engine → shared}/kpi-broadcast.ts +0 -0
- /package/{server/engine → shared}/twin-level.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twin-space-representation.js","sourceRoot":"","sources":["../../../server/service/twin-space/twin-space-representation.ts"],"names":[],"mappings":";;;;AAAA,qCAAkI;AAClI,+CAAyD;AAEzD,iDAA4D;AAE5D,mDAA2C;AAE3C;;;;GAIG;AAII,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CA8CnC,CAAA;AA9CY,0DAAuB;AAGzB;IAFR,IAAA,gCAAsB,EAAC,MAAM,CAAC;IAC9B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,CAAC;;mDACC;AAInB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IACzB,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;sCACvE,cAAM;uDAAA;AAGf;IADC,IAAA,oBAAU,EAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;;yDACpC;AAIjB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,yBAAS,CAAC;IAC5B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,yBAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;sCACnE,yBAAS;sDAAA;AAGjB;IADC,IAAA,oBAAU,EAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;;wDACpC;AAIhB;IAFC,IAAA,gBAAM,GAAE;IACR,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;;qDACxD;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;;qDAClD;AAIb;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;;oDAC1D;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1C,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC;;0DACnE;AAInB;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wGAAwG,EAAE,CAAC;;uDAC3J;AAIZ;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACd,IAAI;0DAAA;AAIhB;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACd,IAAI;0DAAA;kCA7CL,uBAAuB;IAHnC,IAAA,gBAAM,GAAE;IACR,IAAA,eAAK,EAAC,qBAAqB,EAAE,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACjF,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,+EAA+E,EAAE,CAAC;GAChG,uBAAuB,CA8CnC","sourcesContent":["import { CreateDateColumn, Entity, Index, Column, RelationId, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'\nimport { ObjectType, Field, ID, Int } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\n\nimport { TwinSpace } from './twin-space.js'\n\n/*\n * TwinSpaceRepresentation — 공간을 보는 한 방식(map|image|
|
|
1
|
+
{"version":3,"file":"twin-space-representation.js","sourceRoot":"","sources":["../../../server/service/twin-space/twin-space-representation.ts"],"names":[],"mappings":";;;;AAAA,qCAAkI;AAClI,+CAAyD;AAEzD,iDAA4D;AAE5D,mDAA2C;AAE3C;;;;GAIG;AAII,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CA8CnC,CAAA;AA9CY,0DAAuB;AAGzB;IAFR,IAAA,gCAAsB,EAAC,MAAM,CAAC;IAC9B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,CAAC;;mDACC;AAInB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IACzB,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;sCACvE,cAAM;uDAAA;AAGf;IADC,IAAA,oBAAU,EAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;;yDACpC;AAIjB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,yBAAS,CAAC;IAC5B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,yBAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;sCACnE,yBAAS;sDAAA;AAGjB;IADC,IAAA,oBAAU,EAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;;wDACpC;AAIhB;IAFC,IAAA,gBAAM,GAAE;IACR,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;;qDACxD;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;;qDAClD;AAIb;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;;oDAC1D;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1C,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC;;0DACnE;AAInB;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wGAAwG,EAAE,CAAC;;uDAC3J;AAIZ;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACd,IAAI;0DAAA;AAIhB;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACd,IAAI;0DAAA;kCA7CL,uBAAuB;IAHnC,IAAA,gBAAM,GAAE;IACR,IAAA,eAAK,EAAC,qBAAqB,EAAE,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACjF,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,+EAA+E,EAAE,CAAC;GAChG,uBAAuB,CA8CnC","sourcesContent":["import { CreateDateColumn, Entity, Index, Column, RelationId, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'\nimport { ObjectType, Field, ID, Int } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\n\nimport { TwinSpace } from './twin-space.js'\n\n/*\n * TwinSpaceRepresentation — 공간을 보는 한 방식(map|image|model), 복수·1개 primary(공간구성 아키텍처, design/ui/space-composition.md).\n * config(simple-json): model={boardId}(board-service 참조) / image={attachmentId|boardId,width,height} / map={center,zoom,provider}.\n * 폴리곤 영역은 TwinSpaceArea(map/image), model 표현은 씬 컴포넌트가 대신.\n */\n@Entity()\n@Index('ix_twin_space_rep_0', (e: TwinSpaceRepresentation) => [e.domain, e.space])\n@ObjectType({ description: 'A way to view a Space (map | image | model). Multiple per space, one primary.' })\nexport class TwinSpaceRepresentation {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'Owning tenant domain.' })\n domain?: Domain\n\n @RelationId((e: TwinSpaceRepresentation) => e.domain)\n domainId?: string\n\n @ManyToOne(type => TwinSpace)\n @Field(type => TwinSpace, { nullable: true, description: 'Owning space.' })\n space?: TwinSpace\n\n @RelationId((e: TwinSpaceRepresentation) => e.space)\n spaceId?: string\n\n @Column()\n @Field({ description: 'Representation type: map | image | model.' })\n type: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Representation name.' })\n name?: string\n\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'Display order.' })\n seq?: number\n\n @Column({ nullable: true, default: false })\n @Field({ nullable: true, description: 'Whether this is the primary representation.' })\n isPrimary?: boolean\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Type config: model {boardId} / image {attachmentId|boardId,width,height} / map {center,zoom,provider}.' })\n config?: any\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n}\n"]}
|
|
@@ -1,9 +1,71 @@
|
|
|
1
1
|
export declare class TwinSpaceResolver {
|
|
2
|
+
/**
|
|
3
|
+
* 이 테넌트의 현장 목록.
|
|
4
|
+
*
|
|
5
|
+
* ── 세 번만 묻는다 (2026-08-13) ──────────────────────────────────────────
|
|
6
|
+
* 예전에는 현장마다 표현 수를 세고 인스턴스를 조회했다 — 현장 13곳이면 **질의 27번**이고, 첫
|
|
7
|
+
* 호출이 2.4초였다(헤더가 뜰 때마다 이 목록을 읽는다). 규모가 커지면 그대로 자란다.
|
|
8
|
+
*
|
|
9
|
+
* 이제 세 번 묻고 메모리에서 맞춘다: 현장 · 표현(공간 id 만) · 인스턴스(필요한 컬럼만).
|
|
10
|
+
* 표현은 **id 만 실어 온다**(`loadRelationIds`) — 설정 blob 을 읽어 세는 것은 낭비다.
|
|
11
|
+
*/
|
|
2
12
|
twinSpaces(context: ResolverContext): Promise<any[]>;
|
|
3
13
|
/** 단건 — 표현(+영역) 트리 포함. */
|
|
4
14
|
twinSpace(spaceId: string, context: ResolverContext): Promise<any | null>;
|
|
5
15
|
saveTwinSpace(spaceId: string, patch: any, context: ResolverContext): Promise<boolean>;
|
|
6
|
-
|
|
16
|
+
/**
|
|
17
|
+
* 공간 삭제 — **이 공간의 트윈이 있으면 거절한다.** 그래서 트윈이 현장을 잃는 일은 없다.
|
|
18
|
+
*
|
|
19
|
+
* ── 왜 모양을 바꿨나 (2026-08-13) ────────────────────────────────────────
|
|
20
|
+
* 예전에는 `Boolean` 을 돌려주고 거절은 **한국어 문장을 던졌다.** 두 가지가 틀렸다:
|
|
21
|
+
* ① 서버가 화면의 말을 정했다 — 일본어·스페인어 사용자에게 한국어가 새어 나간다.
|
|
22
|
+
* ② 던진 예외를 화면이 받지 않아 **아무 일도 없는 것처럼** 보였다. 사용자는 삭제를 눌렀고
|
|
23
|
+
* 화면은 그대로였다. 거절을 조용히 하는 것은 실패보다 나쁘다.
|
|
24
|
+
* 이제 `{ok, errorCode, errorParams}` 로 낸다 — 화면이 `twin.compose.del.<code>` 로 말을 만든다.
|
|
25
|
+
*/
|
|
26
|
+
deleteTwinSpace(spaceId: string, context: ResolverContext): Promise<any>;
|
|
27
|
+
/**
|
|
28
|
+
* 이미 있는 트윈을 이 현장으로 가져온다 — **소속 갱신**(이력 이전이 아니다).
|
|
29
|
+
*
|
|
30
|
+
* 저널·투영 행은 `instanceId` 로 매여 있어 트윈을 따라오고, 구역·표현은 공간의 것이라 남는다
|
|
31
|
+
* (근거·판정: `move-space.ts`). 그래서 이 뮤테이션이 쓰는 것은 두 곳뿐이다 —
|
|
32
|
+
* 레지스트리의 `spaceId` 와 저장된 model 의 `spaceId`(커널·보드가 같은 공간을 가리켜야 한다).
|
|
33
|
+
* 새 공간의 시간대로 `utcOffsetMinutes` 도 다시 파생한다(공간이 시간의 기준이다).
|
|
34
|
+
*
|
|
35
|
+
* `dryRun` 은 **같은 판정을 미리** 보여 준다 — 화면이 잃을 것을 먼저 말하고 사용자가 정한다.
|
|
36
|
+
* 판정을 두 벌로 두면 미리보기와 실제가 어긋나므로 한 함수를 두 번 부른다.
|
|
37
|
+
*/
|
|
38
|
+
moveTwinToSpace(instanceId: string, spaceId: string, context: ResolverContext, dryRun?: boolean): Promise<any>;
|
|
39
|
+
/**
|
|
40
|
+
* 트윈을 현장에서 뗀다 — **어느 현장에도 속하지 않음**으로 되돌린다.
|
|
41
|
+
*
|
|
42
|
+
* 더하기·옮기기만 있으면 잘못 넣은 것을 되돌릴 수 없다. 떼도 저널·로케이션·설비는 트윈에 남고
|
|
43
|
+
* (`instanceId` 로 매여 있다), 구역·표현은 옛 현장에 남는다. 잃는 것은 **볼 무대**다 —
|
|
44
|
+
* 판정이 그것을 말한다(`judgeDetachTwinSpace`). `dryRun` 은 같은 판정을 미리 낸다.
|
|
45
|
+
*/
|
|
46
|
+
detachTwinFromSpace(instanceId: string, context: ResolverContext, dryRun?: boolean): Promise<any>;
|
|
47
|
+
/**
|
|
48
|
+
* 공간 ↔ 트윈 ↔ 가시화 정합성 점검 — **사실을 모아 순수 판정에 넘긴다.**
|
|
49
|
+
*
|
|
50
|
+
* 세 축은 서로를 id 로만 가리키고 DB 가 그 참조를 지켜 주지 않는다. 트윈을 옮기거나 떼거나 원본을
|
|
51
|
+
* 다시 읽으면 아무 오류 없이 **가리킬 것이 없는 도형**과 **소속 없는 로케이션**이 남는다. 사람이
|
|
52
|
+
* 눈으로 대조하던 일을 기계가 한다(판정·근거: `space-integrity.ts`).
|
|
53
|
+
*
|
|
54
|
+
* `spaceId` 를 주면 그 현장만, 없으면 테넌트 전체를 본다.
|
|
55
|
+
*/
|
|
56
|
+
twinSpaceIntegrity(context: ResolverContext, spaceId?: string): Promise<any[]>;
|
|
57
|
+
/**
|
|
58
|
+
* 기계적으로 고칠 수 있는 어긋남만 고친다 — **사람의 판단이 필요한 것은 손대지 않는다.**
|
|
59
|
+
*
|
|
60
|
+
* 지금 고치는 것은 하나다: **대표 표현 포인터**. 공간이 없는 표현 id 를 가리키고 있으면, 행의
|
|
61
|
+
* `isPrimary` 가 켜진 표현(없으면 첫 표현)으로 다시 가리키고, 표현이 없으면 비운다. 근거가 있고
|
|
62
|
+
* 답이 하나뿐인 부류라 자동으로 고쳐도 사실을 바꾸지 않는다.
|
|
63
|
+
*
|
|
64
|
+
* 폴리곤이 없는 구역·개체를 가리키는 것은 **고치지 않는다.** 그 도형을 지워야 하는지, 트윈을 다시
|
|
65
|
+
* 데려와야 하는지, 구역을 다시 그려야 하는지는 사람이 정할 일이다 — 기계가 고르면 사용자가 그린
|
|
66
|
+
* 도형이 조용히 사라진다.
|
|
67
|
+
*/
|
|
68
|
+
repairTwinSpaceIntegrity(context: ResolverContext, spaceId?: string): Promise<any>;
|
|
7
69
|
twinAreas(spaceId: string, context: ResolverContext): Promise<any[]>;
|
|
8
70
|
saveTwinArea(spaceId: string, areaId: string, patch: any, context: ResolverContext): Promise<boolean>;
|
|
9
71
|
deleteTwinArea(spaceId: string, areaId: string, context: ResolverContext): Promise<boolean>;
|
|
@@ -9,26 +9,62 @@ const twin_space_representation_js_1 = require("./twin-space-representation.js")
|
|
|
9
9
|
const twin_space_area_js_1 = require("./twin-space-area.js");
|
|
10
10
|
const twin_area_js_1 = require("./twin-area.js");
|
|
11
11
|
const twin_instance_js_1 = require("../twin-instance/twin-instance.js");
|
|
12
|
+
const twin_audit_event_js_1 = require("../twin-audit/twin-audit-event.js");
|
|
13
|
+
const index_js_1 = require("../../engine/index.js");
|
|
14
|
+
const move_space_js_1 = require("./move-space.js");
|
|
15
|
+
const space_integrity_js_1 = require("./space-integrity.js");
|
|
12
16
|
/*
|
|
13
17
|
* 공간 구성 채널(design/ui/space-composition.md) — Site(Space) + 복수 표현(Representation) + 영역(Area).
|
|
14
|
-
*
|
|
18
|
+
* model 내용은 board-service Board 에(표현 config.boardId 참조, 중복 저장 금지). 모두 domain 스코프.
|
|
15
19
|
*/
|
|
16
20
|
let TwinSpaceResolver = class TwinSpaceResolver {
|
|
17
21
|
/* ── Space(Site) ────────────────────────────────────────────────── */
|
|
22
|
+
/**
|
|
23
|
+
* 이 테넌트의 현장 목록.
|
|
24
|
+
*
|
|
25
|
+
* ── 세 번만 묻는다 (2026-08-13) ──────────────────────────────────────────
|
|
26
|
+
* 예전에는 현장마다 표현 수를 세고 인스턴스를 조회했다 — 현장 13곳이면 **질의 27번**이고, 첫
|
|
27
|
+
* 호출이 2.4초였다(헤더가 뜰 때마다 이 목록을 읽는다). 규모가 커지면 그대로 자란다.
|
|
28
|
+
*
|
|
29
|
+
* 이제 세 번 묻고 메모리에서 맞춘다: 현장 · 표현(공간 id 만) · 인스턴스(필요한 컬럼만).
|
|
30
|
+
* 표현은 **id 만 실어 온다**(`loadRelationIds`) — 설정 blob 을 읽어 세는 것은 낭비다.
|
|
31
|
+
*/
|
|
18
32
|
async twinSpaces(context) {
|
|
19
33
|
const domainId = context.state.domain.id;
|
|
20
|
-
const rows = await
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
34
|
+
const [rows, reps, insts] = await Promise.all([
|
|
35
|
+
(0, shell_1.getRepository)(twin_space_js_1.TwinSpace).find({ where: { domain: { id: domainId } }, order: { createdAt: 'ASC' } }),
|
|
36
|
+
/* 관계를 **조인해서** 읽는다 — `loadRelationIds`+`select` 조합은 관계 자리를 비워 두어
|
|
37
|
+
표현 수가 전부 0 이 됐다(2026-08-13 실측으로 잡음). 조인 한 번이 현장마다 세는 것보다 싸다. */
|
|
38
|
+
(0, shell_1.getRepository)(twin_space_representation_js_1.TwinSpaceRepresentation).find({ where: { domain: { id: domainId } }, relations: { space: true } }),
|
|
39
|
+
(0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).find({ where: { domain: { id: domainId } }, select: { instanceId: true, spaceId: true, purpose: true, copyOf: true } })
|
|
40
|
+
]);
|
|
41
|
+
const repCount = new Map();
|
|
42
|
+
for (const rep of reps) {
|
|
43
|
+
const sid = rep.space?.id;
|
|
44
|
+
if (sid)
|
|
45
|
+
repCount.set(sid, (repCount.get(sid) ?? 0) + 1);
|
|
30
46
|
}
|
|
31
|
-
|
|
47
|
+
/* 벤치 여부·원본 참조 — 인스턴스 purpose 근거(1급). 사본 현장을 헤더 선택기에서 구별·선택 가능하게. */
|
|
48
|
+
const benchOf = new Map();
|
|
49
|
+
for (const i of insts)
|
|
50
|
+
if (i.purpose === 'bench' && i.spaceId && !benchOf.has(i.spaceId))
|
|
51
|
+
benchOf.set(i.spaceId, { copyOf: i.copyOf ?? undefined });
|
|
52
|
+
return rows.map(r => {
|
|
53
|
+
const bench = benchOf.get(r.spaceId);
|
|
54
|
+
return {
|
|
55
|
+
spaceId: r.spaceId,
|
|
56
|
+
name: r.name,
|
|
57
|
+
description: r.description,
|
|
58
|
+
geo: r.geo,
|
|
59
|
+
timezone: r.timezone,
|
|
60
|
+
primaryRepresentationId: r.primaryRepresentationId,
|
|
61
|
+
extentX: r.extentX,
|
|
62
|
+
extentY: r.extentY,
|
|
63
|
+
representationCount: repCount.get(r.id) ?? 0,
|
|
64
|
+
bench: !!bench,
|
|
65
|
+
copyOf: bench?.copyOf
|
|
66
|
+
};
|
|
67
|
+
});
|
|
32
68
|
}
|
|
33
69
|
/** 단건 — 표현(+영역) 트리 포함. */
|
|
34
70
|
async twinSpace(spaceId, context) {
|
|
@@ -42,7 +78,7 @@ let TwinSpaceResolver = class TwinSpaceResolver {
|
|
|
42
78
|
const areas = await (0, shell_1.getRepository)(twin_space_area_js_1.TwinSpaceArea).find({ where: { domain: { id: domainId }, representation: { id: rep.id } }, order: { createdAt: 'ASC' } });
|
|
43
79
|
representations.push({ id: rep.id, type: rep.type, name: rep.name, seq: rep.seq, isPrimary: rep.isPrimary, config: rep.config, areas: areas.map(a => ({ id: a.id, name: a.name, type: a.type, geometry: a.geometry, drillTo: a.drillTo, binding: a.binding, style: a.style })) });
|
|
44
80
|
}
|
|
45
|
-
return { spaceId: r.spaceId, name: r.name, description: r.description, geo: r.geo, timezone: r.timezone, primaryRepresentationId: r.primaryRepresentationId,
|
|
81
|
+
return { spaceId: r.spaceId, name: r.name, description: r.description, geo: r.geo, timezone: r.timezone, primaryRepresentationId: r.primaryRepresentationId, extentX: r.extentX, extentY: r.extentY, representations };
|
|
46
82
|
}
|
|
47
83
|
async saveTwinSpace(spaceId, patch, context) {
|
|
48
84
|
const repo = (0, shell_1.getRepository)(twin_space_js_1.TwinSpace);
|
|
@@ -53,13 +89,29 @@ let TwinSpaceResolver = class TwinSpaceResolver {
|
|
|
53
89
|
await repo.save(repo.create({ ...(existing ?? {}), ...clean, domain: { id: domainId }, spaceId }));
|
|
54
90
|
return true;
|
|
55
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* 공간 삭제 — **이 공간의 트윈이 있으면 거절한다.** 그래서 트윈이 현장을 잃는 일은 없다.
|
|
94
|
+
*
|
|
95
|
+
* ── 왜 모양을 바꿨나 (2026-08-13) ────────────────────────────────────────
|
|
96
|
+
* 예전에는 `Boolean` 을 돌려주고 거절은 **한국어 문장을 던졌다.** 두 가지가 틀렸다:
|
|
97
|
+
* ① 서버가 화면의 말을 정했다 — 일본어·스페인어 사용자에게 한국어가 새어 나간다.
|
|
98
|
+
* ② 던진 예외를 화면이 받지 않아 **아무 일도 없는 것처럼** 보였다. 사용자는 삭제를 눌렀고
|
|
99
|
+
* 화면은 그대로였다. 거절을 조용히 하는 것은 실패보다 나쁘다.
|
|
100
|
+
* 이제 `{ok, errorCode, errorParams}` 로 낸다 — 화면이 `twin.compose.del.<code>` 로 말을 만든다.
|
|
101
|
+
*/
|
|
56
102
|
async deleteTwinSpace(spaceId, context) {
|
|
57
103
|
const domainId = context.state.domain.id;
|
|
58
104
|
// 라이프사이클 가드 — 이 공간에 바인딩된 트윈 인스턴스가 있으면 삭제 차단(dangling 방지).
|
|
59
105
|
// spaceId 컬럼(space #3) 로 직접 질의 — 전 인스턴스 로드+JS필터 제거(효율·1급 질의).
|
|
60
106
|
const bound = await (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).find({ where: { domain: { id: domainId }, spaceId } });
|
|
61
107
|
if (bound.length) {
|
|
62
|
-
|
|
108
|
+
const twins = bound.map(i => i.name || i.instanceId);
|
|
109
|
+
return {
|
|
110
|
+
ok: false,
|
|
111
|
+
errorCode: 'space-has-twins',
|
|
112
|
+
errorParams: { spaceId, count: bound.length, twins: twins.slice(0, 5).join(', ') },
|
|
113
|
+
error: `space "${spaceId}" still has ${bound.length} twin(s) — remove or move them first (${twins.join(', ')})`
|
|
114
|
+
};
|
|
63
115
|
}
|
|
64
116
|
const space = await (0, shell_1.getRepository)(twin_space_js_1.TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId } });
|
|
65
117
|
if (space) {
|
|
@@ -70,7 +122,245 @@ let TwinSpaceResolver = class TwinSpaceResolver {
|
|
|
70
122
|
await (0, shell_1.getRepository)(twin_area_js_1.TwinArea).delete({ domain: { id: domainId }, space: { id: space.id } }); // 논리 area 도 함께 정리
|
|
71
123
|
}
|
|
72
124
|
await (0, shell_1.getRepository)(twin_space_js_1.TwinSpace).delete({ domain: { id: domainId }, spaceId });
|
|
73
|
-
return true;
|
|
125
|
+
return { ok: true };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 이미 있는 트윈을 이 현장으로 가져온다 — **소속 갱신**(이력 이전이 아니다).
|
|
129
|
+
*
|
|
130
|
+
* 저널·투영 행은 `instanceId` 로 매여 있어 트윈을 따라오고, 구역·표현은 공간의 것이라 남는다
|
|
131
|
+
* (근거·판정: `move-space.ts`). 그래서 이 뮤테이션이 쓰는 것은 두 곳뿐이다 —
|
|
132
|
+
* 레지스트리의 `spaceId` 와 저장된 model 의 `spaceId`(커널·보드가 같은 공간을 가리켜야 한다).
|
|
133
|
+
* 새 공간의 시간대로 `utcOffsetMinutes` 도 다시 파생한다(공간이 시간의 기준이다).
|
|
134
|
+
*
|
|
135
|
+
* `dryRun` 은 **같은 판정을 미리** 보여 준다 — 화면이 잃을 것을 먼저 말하고 사용자가 정한다.
|
|
136
|
+
* 판정을 두 벌로 두면 미리보기와 실제가 어긋나므로 한 함수를 두 번 부른다.
|
|
137
|
+
*/
|
|
138
|
+
async moveTwinToSpace(instanceId, spaceId, context, dryRun) {
|
|
139
|
+
const domainId = context.state.domain.id;
|
|
140
|
+
const instRepo = (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance);
|
|
141
|
+
const spaceRepo = (0, shell_1.getRepository)(twin_space_js_1.TwinSpace);
|
|
142
|
+
const inst = await instRepo.findOne({ where: { domain: { id: domainId }, instanceId } });
|
|
143
|
+
const from = inst?.spaceId ? await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId: inst.spaceId } }) : null;
|
|
144
|
+
const to = await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId } });
|
|
145
|
+
/* 판정에 필요한 사실만 모아 넘긴다 — 판정 자체는 순수 모듈이 한다. */
|
|
146
|
+
const toAreaIds = to
|
|
147
|
+
? (await (0, shell_1.getRepository)(twin_area_js_1.TwinArea).find({ where: { domain: { id: domainId }, space: { id: to.id } } })).map(a => a.areaId)
|
|
148
|
+
: [];
|
|
149
|
+
const fromRepresentationCount = from
|
|
150
|
+
? await (0, shell_1.getRepository)(twin_space_representation_js_1.TwinSpaceRepresentation).count({ where: { domain: { id: domainId }, space: { id: from.id } } })
|
|
151
|
+
: 0;
|
|
152
|
+
const model = inst?.model ?? {};
|
|
153
|
+
const areaRefs = (model.locations ?? []).map((l) => l?.parentId);
|
|
154
|
+
const judgement = (0, move_space_js_1.judgeMoveTwinSpace)({
|
|
155
|
+
instanceId: inst?.instanceId,
|
|
156
|
+
fromSpaceId: inst?.spaceId,
|
|
157
|
+
toSpaceId: spaceId,
|
|
158
|
+
toSpaceExists: !!to,
|
|
159
|
+
purpose: inst?.purpose,
|
|
160
|
+
running: !!inst && !!index_js_1.TwinEngine.runtime(domainId, instanceId),
|
|
161
|
+
fromTimezone: from?.timezone ?? undefined,
|
|
162
|
+
toTimezone: to?.timezone ?? undefined,
|
|
163
|
+
areaRefs,
|
|
164
|
+
toAreaIds,
|
|
165
|
+
fromRepresentationCount
|
|
166
|
+
});
|
|
167
|
+
if (judgement.refusal) {
|
|
168
|
+
const r = judgement.refusal;
|
|
169
|
+
return { ok: false, error: r.message, errorCode: r.code, errorParams: r.params, warnings: [] };
|
|
170
|
+
}
|
|
171
|
+
if (dryRun)
|
|
172
|
+
return { ok: true, dryRun: true, warnings: judgement.warnings };
|
|
173
|
+
/* 두 곳을 함께 쓴다 — 레지스트리와 model 이 다른 공간을 가리키면 보드·커널이 갈라진다. */
|
|
174
|
+
const moved = { ...model, spaceId };
|
|
175
|
+
const withTime = await index_js_1.TwinEngine.withSpaceTimeBase(moved, domainId, spaceId);
|
|
176
|
+
await instRepo.save(instRepo.create({ ...inst, spaceId, model: withTime }));
|
|
177
|
+
/*
|
|
178
|
+
* 감사 기록 — 소속을 바꾼 것은 사람의 결정이고, 나중에 "왜 이 트윈이 저 현장에 있나" 를 묻게 된다.
|
|
179
|
+
* 기록이 실패해도 이전 결과는 돌려준다(감사가 본업을 막지 않는다). 다만 삼키지 않고 로그에 남긴다.
|
|
180
|
+
*/
|
|
181
|
+
try {
|
|
182
|
+
const repo = (0, shell_1.getRepository)(twin_audit_event_js_1.TwinAuditEvent);
|
|
183
|
+
await repo.save(repo.create({
|
|
184
|
+
domain: context.state.domain,
|
|
185
|
+
instanceId,
|
|
186
|
+
commandType: 'twin.moveToSpace',
|
|
187
|
+
accepted: true,
|
|
188
|
+
origin: 'user',
|
|
189
|
+
actorId: context.state.user?.id,
|
|
190
|
+
args: { from: inst?.spaceId ?? null, to: spaceId, warnings: judgement.warnings.map(w => w.code) }
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
console.error(`[twin-space] move audit not recorded for "${instanceId}"`, err);
|
|
195
|
+
}
|
|
196
|
+
return { ok: true, warnings: judgement.warnings };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 트윈을 현장에서 뗀다 — **어느 현장에도 속하지 않음**으로 되돌린다.
|
|
200
|
+
*
|
|
201
|
+
* 더하기·옮기기만 있으면 잘못 넣은 것을 되돌릴 수 없다. 떼도 저널·로케이션·설비는 트윈에 남고
|
|
202
|
+
* (`instanceId` 로 매여 있다), 구역·표현은 옛 현장에 남는다. 잃는 것은 **볼 무대**다 —
|
|
203
|
+
* 판정이 그것을 말한다(`judgeDetachTwinSpace`). `dryRun` 은 같은 판정을 미리 낸다.
|
|
204
|
+
*/
|
|
205
|
+
async detachTwinFromSpace(instanceId, context, dryRun) {
|
|
206
|
+
const domainId = context.state.domain.id;
|
|
207
|
+
const instRepo = (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance);
|
|
208
|
+
const inst = await instRepo.findOne({ where: { domain: { id: domainId }, instanceId } });
|
|
209
|
+
const from = inst?.spaceId
|
|
210
|
+
? await (0, shell_1.getRepository)(twin_space_js_1.TwinSpace).findOne({ where: { domain: { id: domainId }, spaceId: inst.spaceId } })
|
|
211
|
+
: null;
|
|
212
|
+
const fromRepresentationCount = from
|
|
213
|
+
? await (0, shell_1.getRepository)(twin_space_representation_js_1.TwinSpaceRepresentation).count({ where: { domain: { id: domainId }, space: { id: from.id } } })
|
|
214
|
+
: 0;
|
|
215
|
+
const judgement = (0, move_space_js_1.judgeDetachTwinSpace)({
|
|
216
|
+
instanceId: inst?.instanceId,
|
|
217
|
+
fromSpaceId: inst?.spaceId,
|
|
218
|
+
purpose: inst?.purpose,
|
|
219
|
+
fromRepresentationCount,
|
|
220
|
+
fromTimezone: from?.timezone ?? undefined
|
|
221
|
+
});
|
|
222
|
+
if (judgement.refusal) {
|
|
223
|
+
const r = judgement.refusal;
|
|
224
|
+
return { ok: false, error: r.message, errorCode: r.code, errorParams: r.params, warnings: [] };
|
|
225
|
+
}
|
|
226
|
+
if (dryRun)
|
|
227
|
+
return { ok: true, dryRun: true, warnings: judgement.warnings };
|
|
228
|
+
/* 두 곳을 함께 비운다 — 레지스트리와 model 이 어긋나면 어느 쪽이 사실인지 알 수 없다.
|
|
229
|
+
시간 기준(utcOffsetMinutes)은 **남긴다**: 지우면 조용히 UTC 로 읽힌다(판정이 그렇게 말했다). */
|
|
230
|
+
const { spaceId: _dropped, ...model } = inst?.model ?? {};
|
|
231
|
+
await instRepo.update({ id: inst.id }, { spaceId: null, model });
|
|
232
|
+
try {
|
|
233
|
+
const repo = (0, shell_1.getRepository)(twin_audit_event_js_1.TwinAuditEvent);
|
|
234
|
+
await repo.save(repo.create({
|
|
235
|
+
domain: context.state.domain,
|
|
236
|
+
instanceId,
|
|
237
|
+
commandType: 'twin.detachFromSpace',
|
|
238
|
+
accepted: true,
|
|
239
|
+
origin: 'user',
|
|
240
|
+
actorId: context.state.user?.id,
|
|
241
|
+
args: { from: inst?.spaceId ?? null, warnings: judgement.warnings.map(w => w.code) }
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.error(`[twin-space] detach audit not recorded for "${instanceId}"`, err);
|
|
246
|
+
}
|
|
247
|
+
return { ok: true, warnings: judgement.warnings };
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 공간 ↔ 트윈 ↔ 가시화 정합성 점검 — **사실을 모아 순수 판정에 넘긴다.**
|
|
251
|
+
*
|
|
252
|
+
* 세 축은 서로를 id 로만 가리키고 DB 가 그 참조를 지켜 주지 않는다. 트윈을 옮기거나 떼거나 원본을
|
|
253
|
+
* 다시 읽으면 아무 오류 없이 **가리킬 것이 없는 도형**과 **소속 없는 로케이션**이 남는다. 사람이
|
|
254
|
+
* 눈으로 대조하던 일을 기계가 한다(판정·근거: `space-integrity.ts`).
|
|
255
|
+
*
|
|
256
|
+
* `spaceId` 를 주면 그 현장만, 없으면 테넌트 전체를 본다.
|
|
257
|
+
*/
|
|
258
|
+
async twinSpaceIntegrity(context, spaceId) {
|
|
259
|
+
const domainId = context.state.domain.id;
|
|
260
|
+
const spaceRows = await (0, shell_1.getRepository)(twin_space_js_1.TwinSpace).find({ where: { domain: { id: domainId } } });
|
|
261
|
+
const instRows = await (0, shell_1.getRepository)(twin_instance_js_1.TwinInstance).find({ where: { domain: { id: domainId } } });
|
|
262
|
+
const repRows = await (0, shell_1.getRepository)(twin_space_representation_js_1.TwinSpaceRepresentation).find({ where: { domain: { id: domainId } }, relations: ['space'] });
|
|
263
|
+
const areaRows = await (0, shell_1.getRepository)(twin_area_js_1.TwinArea).find({ where: { domain: { id: domainId } }, relations: ['space'] });
|
|
264
|
+
const polyRows = await (0, shell_1.getRepository)(twin_space_area_js_1.TwinSpaceArea).find({ where: { domain: { id: domainId } }, relations: ['representation'] });
|
|
265
|
+
const areasBySpace = {};
|
|
266
|
+
for (const a of areaRows) {
|
|
267
|
+
const sid = a.space?.spaceId;
|
|
268
|
+
if (!sid)
|
|
269
|
+
continue;
|
|
270
|
+
(areasBySpace[sid] ??= []).push(a.areaId);
|
|
271
|
+
}
|
|
272
|
+
/*
|
|
273
|
+
* 폴리곤 바인딩의 실제 모양은 `{ groupId?, locationId?, locationIds? }` 다(지도 저작기 기준).
|
|
274
|
+
* 여러 로케이션을 묶은 도형은 **각각을 따로** 본다 — 하나만 끊겨도 그 도형은 반쯤 거짓이 된다.
|
|
275
|
+
*/
|
|
276
|
+
const polysByRep = {};
|
|
277
|
+
for (const p of polyRows) {
|
|
278
|
+
const rid = p.representation?.id;
|
|
279
|
+
if (!rid)
|
|
280
|
+
continue;
|
|
281
|
+
const b = p.binding ?? {};
|
|
282
|
+
const list = polysByRep[rid] ??= [];
|
|
283
|
+
if (b.groupId)
|
|
284
|
+
list.push({ id: p.id, groupId: b.groupId });
|
|
285
|
+
const targets = [...(b.locationId ? [b.locationId] : []), ...(Array.isArray(b.locationIds) ? b.locationIds : [])];
|
|
286
|
+
for (const t of targets)
|
|
287
|
+
list.push({ id: p.id, targetKind: 'location', targetId: t });
|
|
288
|
+
}
|
|
289
|
+
/* 보드 id 는 표현 config 가 들고 있다 — 존재 확인은 보드 서비스의 일이므로, 여기서는 표현이
|
|
290
|
+
가리키는 값이 있는지만 본다(없는 보드까지 보려면 board-service 를 물어야 한다: 아래 주석). */
|
|
291
|
+
const boardIds = repRows.map(r => r.config?.boardId).filter(Boolean);
|
|
292
|
+
const findings = (0, space_integrity_js_1.checkSpaceIntegrity)({
|
|
293
|
+
spaces: spaceRows.map(s => ({ spaceId: s.spaceId, primaryRepresentationId: s.primaryRepresentationId })),
|
|
294
|
+
instances: instRows.map(i => {
|
|
295
|
+
const model = i.model ?? {};
|
|
296
|
+
/*
|
|
297
|
+
* 어휘가 맞는지는 **실행 중인 트윈만** 답할 수 있다 — 커널이 무엇을 버렸는지는 런타임의 사실이다.
|
|
298
|
+
* 정지한 트윈은 `undefined`(모른다)로 둔다. 저널을 다시 접어 알아내지는 않는다: 이 질의는
|
|
299
|
+
* 테넌트 전체를 훑으므로 트윈마다 폴드를 걸면 정합성 점검이 가장 무거운 질의가 된다.
|
|
300
|
+
*/
|
|
301
|
+
const live = index_js_1.TwinEngine.isRunning(domainId, i.instanceId)
|
|
302
|
+
? index_js_1.TwinEngine.snapshot(domainId, i.instanceId)
|
|
303
|
+
: undefined;
|
|
304
|
+
return {
|
|
305
|
+
instanceId: i.instanceId,
|
|
306
|
+
spaceId: i.spaceId,
|
|
307
|
+
modelSpaceId: model.spaceId,
|
|
308
|
+
purpose: i.purpose,
|
|
309
|
+
locationIds: (model.locations ?? []).map((l) => l?.id).filter(Boolean),
|
|
310
|
+
equipmentIds: (model.equipment ?? []).map((e) => e?.id).filter(Boolean),
|
|
311
|
+
areaRefs: (model.locations ?? []).map((l) => l?.parentId),
|
|
312
|
+
...(Array.isArray(live?.unhandled) ? { unhandled: live.unhandled } : {})
|
|
313
|
+
};
|
|
314
|
+
}),
|
|
315
|
+
representations: repRows.map(r => ({
|
|
316
|
+
id: r.id,
|
|
317
|
+
spaceId: r.space?.spaceId ?? '',
|
|
318
|
+
type: r.type,
|
|
319
|
+
boardId: r.config?.boardId ?? null,
|
|
320
|
+
polygons: polysByRep[r.id] ?? []
|
|
321
|
+
})),
|
|
322
|
+
areasBySpace,
|
|
323
|
+
boardIds
|
|
324
|
+
});
|
|
325
|
+
const scoped = spaceId ? findings.filter(f => f.spaceId === spaceId || (!f.spaceId && !spaceId)) : findings;
|
|
326
|
+
return (0, space_integrity_js_1.sortFindings)(scoped);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* 기계적으로 고칠 수 있는 어긋남만 고친다 — **사람의 판단이 필요한 것은 손대지 않는다.**
|
|
330
|
+
*
|
|
331
|
+
* 지금 고치는 것은 하나다: **대표 표현 포인터**. 공간이 없는 표현 id 를 가리키고 있으면, 행의
|
|
332
|
+
* `isPrimary` 가 켜진 표현(없으면 첫 표현)으로 다시 가리키고, 표현이 없으면 비운다. 근거가 있고
|
|
333
|
+
* 답이 하나뿐인 부류라 자동으로 고쳐도 사실을 바꾸지 않는다.
|
|
334
|
+
*
|
|
335
|
+
* 폴리곤이 없는 구역·개체를 가리키는 것은 **고치지 않는다.** 그 도형을 지워야 하는지, 트윈을 다시
|
|
336
|
+
* 데려와야 하는지, 구역을 다시 그려야 하는지는 사람이 정할 일이다 — 기계가 고르면 사용자가 그린
|
|
337
|
+
* 도형이 조용히 사라진다.
|
|
338
|
+
*/
|
|
339
|
+
async repairTwinSpaceIntegrity(context, spaceId) {
|
|
340
|
+
const domainId = context.state.domain.id;
|
|
341
|
+
const spaceRepo = (0, shell_1.getRepository)(twin_space_js_1.TwinSpace);
|
|
342
|
+
const repRepo = (0, shell_1.getRepository)(twin_space_representation_js_1.TwinSpaceRepresentation);
|
|
343
|
+
const spaces = await spaceRepo.find({
|
|
344
|
+
where: spaceId ? { domain: { id: domainId }, spaceId } : { domain: { id: domainId } }
|
|
345
|
+
});
|
|
346
|
+
const repaired = [];
|
|
347
|
+
for (const space of spaces) {
|
|
348
|
+
const reps = await repRepo.find({ where: { domain: { id: domainId }, space: { id: space.id } }, order: { seq: 'ASC' } });
|
|
349
|
+
const pointer = (space.primaryRepresentationId ?? '').trim();
|
|
350
|
+
if (pointer && reps.some(r => r.id === pointer))
|
|
351
|
+
continue; /* 이미 옳다 */
|
|
352
|
+
const primary = reps.find(r => r.isPrimary) ?? reps[0];
|
|
353
|
+
const next = primary?.id ?? null;
|
|
354
|
+
if (pointer === (next ?? ''))
|
|
355
|
+
continue;
|
|
356
|
+
await spaceRepo.save(spaceRepo.create({ ...space, primaryRepresentationId: next }));
|
|
357
|
+
if (primary)
|
|
358
|
+
for (const r of reps)
|
|
359
|
+
if (!!r.isPrimary !== (r.id === primary.id))
|
|
360
|
+
await repRepo.save(repRepo.create({ ...r, isPrimary: r.id === primary.id }));
|
|
361
|
+
repaired.push({ spaceId: space.spaceId, code: 'primary-representation-missing', from: pointer || null, to: next });
|
|
362
|
+
}
|
|
363
|
+
return { ok: true, repaired, count: repaired.length };
|
|
74
364
|
}
|
|
75
365
|
/* ── Area(논리 구역, 표현 무관·공유·계층) — area 단일화 space #2 ─────── */
|
|
76
366
|
async twinAreas(spaceId, context) {
|
|
@@ -196,13 +486,61 @@ tslib_1.__decorate([
|
|
|
196
486
|
], TwinSpaceResolver.prototype, "saveTwinSpace", null);
|
|
197
487
|
tslib_1.__decorate([
|
|
198
488
|
(0, type_graphql_1.Directive)('@privilege(category: "twin", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
199
|
-
(0, type_graphql_1.Mutation)(returns =>
|
|
489
|
+
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, {
|
|
490
|
+
description: 'Delete a Space and its representations/areas. Refused while twins still live in it (a twin never loses its site this way). Returns {ok, errorCode, errorParams}.'
|
|
491
|
+
}),
|
|
200
492
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('spaceId')),
|
|
201
493
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
202
494
|
tslib_1.__metadata("design:type", Function),
|
|
203
495
|
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
204
496
|
tslib_1.__metadata("design:returntype", Promise)
|
|
205
497
|
], TwinSpaceResolver.prototype, "deleteTwinSpace", null);
|
|
498
|
+
tslib_1.__decorate([
|
|
499
|
+
(0, type_graphql_1.Directive)('@privilege(category: "twin", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
500
|
+
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, {
|
|
501
|
+
description: 'Move an existing twin into a space (co-locate it as another lens). The journal and projected rows follow the twin; areas and representations stay with the old space. dryRun returns the same judgement without writing. Returns {ok, warnings, errorCode}.'
|
|
502
|
+
}),
|
|
503
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('instanceId')),
|
|
504
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('spaceId')),
|
|
505
|
+
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
506
|
+
tslib_1.__param(3, (0, type_graphql_1.Arg)('dryRun', { nullable: true, description: 'Judge only — report refusal/warnings without moving.' })),
|
|
507
|
+
tslib_1.__metadata("design:type", Function),
|
|
508
|
+
tslib_1.__metadata("design:paramtypes", [String, String, Object, Boolean]),
|
|
509
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
510
|
+
], TwinSpaceResolver.prototype, "moveTwinToSpace", null);
|
|
511
|
+
tslib_1.__decorate([
|
|
512
|
+
(0, type_graphql_1.Directive)('@privilege(category: "twin", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
513
|
+
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, {
|
|
514
|
+
description: 'Detach a twin from its space (it ends up on no site). The journal and projected rows stay with the twin; areas and representations stay with the space. dryRun returns the same judgement without writing. Returns {ok, warnings, errorCode}.'
|
|
515
|
+
}),
|
|
516
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('instanceId')),
|
|
517
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
518
|
+
tslib_1.__param(2, (0, type_graphql_1.Arg)('dryRun', { nullable: true, description: 'Judge only — report refusal/warnings without detaching.' })),
|
|
519
|
+
tslib_1.__metadata("design:type", Function),
|
|
520
|
+
tslib_1.__metadata("design:paramtypes", [String, Object, Boolean]),
|
|
521
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
522
|
+
], TwinSpaceResolver.prototype, "detachTwinFromSpace", null);
|
|
523
|
+
tslib_1.__decorate([
|
|
524
|
+
(0, type_graphql_1.Query)(returns => [shell_1.ScalarObject], {
|
|
525
|
+
description: 'Check space ↔ twin ↔ visualization integrity: dangling site refs, registry/model mismatch, polygons binding areas or entities that are not there, primary representation, unbound board representations. Pass spaceId to check one site.'
|
|
526
|
+
}),
|
|
527
|
+
tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
|
|
528
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('spaceId', { nullable: true })),
|
|
529
|
+
tslib_1.__metadata("design:type", Function),
|
|
530
|
+
tslib_1.__metadata("design:paramtypes", [Object, String]),
|
|
531
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
532
|
+
], TwinSpaceResolver.prototype, "twinSpaceIntegrity", null);
|
|
533
|
+
tslib_1.__decorate([
|
|
534
|
+
(0, type_graphql_1.Directive)('@privilege(category: "twin", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
535
|
+
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, {
|
|
536
|
+
description: 'Repair mechanically fixable space integrity findings (currently: a primary representation pointer that points nowhere). Dangling polygon bindings are left alone — that is a human decision. Returns {repaired:[{spaceId, code}], skipped}.'
|
|
537
|
+
}),
|
|
538
|
+
tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
|
|
539
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('spaceId', { nullable: true })),
|
|
540
|
+
tslib_1.__metadata("design:type", Function),
|
|
541
|
+
tslib_1.__metadata("design:paramtypes", [Object, String]),
|
|
542
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
543
|
+
], TwinSpaceResolver.prototype, "repairTwinSpaceIntegrity", null);
|
|
206
544
|
tslib_1.__decorate([
|
|
207
545
|
(0, type_graphql_1.Query)(returns => [shell_1.ScalarObject], { description: 'List logical areas (representation-agnostic hierarchy) of a space. (area unification)' }),
|
|
208
546
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('spaceId')),
|
|
@@ -234,7 +572,7 @@ tslib_1.__decorate([
|
|
|
234
572
|
], TwinSpaceResolver.prototype, "deleteTwinArea", null);
|
|
235
573
|
tslib_1.__decorate([
|
|
236
574
|
(0, type_graphql_1.Directive)('@privilege(category: "twin", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
237
|
-
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, { description: 'Create/update a representation (map|image|
|
|
575
|
+
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, { description: 'Create/update a representation (map|image|model). Returns {id}.' }),
|
|
238
576
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('spaceId')),
|
|
239
577
|
tslib_1.__param(1, (0, type_graphql_1.Arg)('rep', type => shell_1.ScalarObject)),
|
|
240
578
|
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
@@ -263,7 +601,7 @@ tslib_1.__decorate([
|
|
|
263
601
|
], TwinSpaceResolver.prototype, "setPrimaryRepresentation", null);
|
|
264
602
|
tslib_1.__decorate([
|
|
265
603
|
(0, type_graphql_1.Directive)('@privilege(category: "twin", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
266
|
-
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, { description: 'Create/update a polygon area (geometry + drillTo
|
|
604
|
+
(0, type_graphql_1.Mutation)(returns => shell_1.ScalarObject, { description: 'Create/update a polygon area (geometry + drillTo model + binding). Returns {id}.' }),
|
|
267
605
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('representationId')),
|
|
268
606
|
tslib_1.__param(1, (0, type_graphql_1.Arg)('area', type => shell_1.ScalarObject)),
|
|
269
607
|
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|