@things-factory/headless-twin 10.1.277 โ 10.1.279
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/package.json +21 -7
- package/dist-server/engine/attention-digest.js.map +0 -1
- package/dist-server/engine/canonical-ingest.js.map +0 -1
- package/dist-server/engine/checkpoint-fold.js.map +0 -1
- package/dist-server/engine/command-routing.js.map +0 -1
- package/dist-server/engine/declared-stimulus.js.map +0 -1
- package/dist-server/engine/energy-topology.js.map +0 -1
- package/dist-server/engine/event-time.js.map +0 -1
- package/dist-server/engine/index.js.map +0 -1
- package/dist-server/engine/ingest-dedupe.js.map +0 -1
- package/dist-server/engine/ingest-health.js.map +0 -1
- package/dist-server/engine/integration-coverage.js.map +0 -1
- package/dist-server/engine/integration-probes.js.map +0 -1
- package/dist-server/engine/integration-runner.js.map +0 -1
- package/dist-server/engine/integration-target-profile.js.map +0 -1
- package/dist-server/engine/kpi-baseline.js.map +0 -1
- package/dist-server/engine/kpi-fold.js.map +0 -1
- package/dist-server/engine/kpi-query.js.map +0 -1
- package/dist-server/engine/kpi-target.js.map +0 -1
- package/dist-server/engine/live-attentions.js.map +0 -1
- package/dist-server/engine/live-feed-registry.js.map +0 -1
- package/dist-server/engine/load-meter.js.map +0 -1
- package/dist-server/engine/local-declarations.js.map +0 -1
- package/dist-server/engine/log.js.map +0 -1
- package/dist-server/engine/loop-lag.js.map +0 -1
- package/dist-server/engine/measured-estimator.js.map +0 -1
- package/dist-server/engine/measured-yield.js.map +0 -1
- package/dist-server/engine/model-basis.js.map +0 -1
- package/dist-server/engine/model-gap.js.map +0 -1
- package/dist-server/engine/model-refusal.js.map +0 -1
- package/dist-server/engine/model-vocabulary.js.map +0 -1
- package/dist-server/engine/oee-accumulator.js.map +0 -1
- package/dist-server/engine/operation-basis.js.map +0 -1
- package/dist-server/engine/producer-guard.js.map +0 -1
- package/dist-server/engine/property-effects.js.map +0 -1
- package/dist-server/engine/read-time.js.map +0 -1
- package/dist-server/engine/restart-policy.js.map +0 -1
- package/dist-server/engine/runtime-key.js.map +0 -1
- package/dist-server/engine/spec-coverage.js.map +0 -1
- package/dist-server/engine/stage-path.js.map +0 -1
- package/dist-server/engine/state-axes.js.map +0 -1
- package/dist-server/engine/structure-diff.js.map +0 -1
- package/dist-server/engine/travel-estimator.js.map +0 -1
- package/dist-server/engine/twin-engine.js.map +0 -1
- package/dist-server/engine/twin-state-channel.js.map +0 -1
- package/dist-server/engine/warm-start.js.map +0 -1
- package/dist-server/index.js.map +0 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +0 -1
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +0 -1
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +0 -1
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js.map +0 -1
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js.map +0 -1
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js.map +0 -1
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js.map +0 -1
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js.map +0 -1
- package/dist-server/migrations/1786800000000-CreateTwinReferenceReconciliations.js.map +0 -1
- package/dist-server/migrations/index.js.map +0 -1
- package/dist-server/routes.js.map +0 -1
- package/dist-server/service/actuation/actuation-advisor.js.map +0 -1
- package/dist-server/service/actuation/actuation-outcome.js.map +0 -1
- package/dist-server/service/actuation/actuation-rule-resolver.js.map +0 -1
- package/dist-server/service/actuation/actuation-rule.js.map +0 -1
- package/dist-server/service/actuation/approval-gateway.js.map +0 -1
- package/dist-server/service/actuation/catch-up-effects.js.map +0 -1
- package/dist-server/service/actuation/command-dispatcher.js.map +0 -1
- package/dist-server/service/actuation/command-store.js.map +0 -1
- package/dist-server/service/actuation/dispatch-after-approval.js.map +0 -1
- package/dist-server/service/actuation/effect-match.js.map +0 -1
- package/dist-server/service/actuation/index.js.map +0 -1
- package/dist-server/service/actuation/retry-plan.js.map +0 -1
- package/dist-server/service/actuation/rule-evaluate.js.map +0 -1
- package/dist-server/service/actuation/rule-loop.js.map +0 -1
- package/dist-server/service/actuation/rule-runner.js.map +0 -1
- package/dist-server/service/actuation/rule-wiring.js.map +0 -1
- package/dist-server/service/actuation/settle-effects.js.map +0 -1
- package/dist-server/service/actuation/sweep-dispatch.js.map +0 -1
- package/dist-server/service/actuation/twin-command-resolver.js.map +0 -1
- package/dist-server/service/actuation/twin-command.js.map +0 -1
- package/dist-server/service/actuation/twin-now.js.map +0 -1
- package/dist-server/service/index.js.map +0 -1
- package/dist-server/service/reference/actuation-routing.js.map +0 -1
- package/dist-server/service/reference/actuation-target.js.map +0 -1
- package/dist-server/service/reference/actuation-verification.js.map +0 -1
- package/dist-server/service/reference/attention-lane.js.map +0 -1
- package/dist-server/service/reference/connection-portability-resolver.js.map +0 -1
- package/dist-server/service/reference/connection-portability.js.map +0 -1
- package/dist-server/service/reference/control-routing.js.map +0 -1
- package/dist-server/service/reference/discovery-result.js.map +0 -1
- package/dist-server/service/reference/fill-cadence.js.map +0 -1
- package/dist-server/service/reference/fill-dedupe.js.map +0 -1
- package/dist-server/service/reference/fill-loop.js.map +0 -1
- package/dist-server/service/reference/fill-span.js.map +0 -1
- package/dist-server/service/reference/hook-contract.js.map +0 -1
- package/dist-server/service/reference/hook-rejected.js.map +0 -1
- package/dist-server/service/reference/hook-store.js.map +0 -1
- package/dist-server/service/reference/index.js.map +0 -1
- package/dist-server/service/reference/ingest-space.js.map +0 -1
- package/dist-server/service/reference/knob-defaults.js.map +0 -1
- package/dist-server/service/reference/live-cadence.js.map +0 -1
- package/dist-server/service/reference/live-feed-lease.js.map +0 -1
- package/dist-server/service/reference/live-ingest.js.map +0 -1
- package/dist-server/service/reference/reference-adapter.js.map +0 -1
- package/dist-server/service/reference/reference-assessment.js.map +0 -1
- package/dist-server/service/reference/reference-fill-run.js.map +0 -1
- package/dist-server/service/reference/reference-fill.js.map +0 -1
- package/dist-server/service/reference/reference-hook.js.map +0 -1
- package/dist-server/service/reference/reference-link-groups.js.map +0 -1
- package/dist-server/service/reference/reference-links.js.map +0 -1
- package/dist-server/service/reference/reference-live.js.map +0 -1
- package/dist-server/service/reference/reference-master.js.map +0 -1
- package/dist-server/service/reference/reference-probe.js.map +0 -1
- package/dist-server/service/reference/reference-progress-channel.js.map +0 -1
- package/dist-server/service/reference/reference-progress-subscription.js.map +0 -1
- package/dist-server/service/reference/reference-progress.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation-query.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation-writer.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation.js.map +0 -1
- package/dist-server/service/reference/reference-registry.js.map +0 -1
- package/dist-server/service/reference/reference-resolver.js.map +0 -1
- package/dist-server/service/reference/template-registry.js.map +0 -1
- package/dist-server/service/reference/twin-reference-reconciliation.js.map +0 -1
- package/dist-server/service/reference/twin-reference.js.map +0 -1
- package/dist-server/service/twin-attention/index.js.map +0 -1
- package/dist-server/service/twin-attention/twin-attention-query.js.map +0 -1
- package/dist-server/service/twin-audit/command-audit.js.map +0 -1
- package/dist-server/service/twin-audit/index.js.map +0 -1
- package/dist-server/service/twin-audit/twin-audit-event.js.map +0 -1
- package/dist-server/service/twin-audit/twin-audit-query.js.map +0 -1
- package/dist-server/service/twin-backfill/backfill-period-facts.js.map +0 -1
- package/dist-server/service/twin-backfill/backfill-shape.js.map +0 -1
- package/dist-server/service/twin-backfill/index.js.map +0 -1
- package/dist-server/service/twin-backfill/twin-backfill-resolver.js.map +0 -1
- package/dist-server/service/twin-control/index.js.map +0 -1
- package/dist-server/service/twin-control/twin-control-mutation.js.map +0 -1
- package/dist-server/service/twin-event/index.js.map +0 -1
- package/dist-server/service/twin-event/journal-count.js.map +0 -1
- package/dist-server/service/twin-event/twin-event-keys.js.map +0 -1
- package/dist-server/service/twin-event/twin-event-type.js.map +0 -1
- package/dist-server/service/twin-event/twin-event.js.map +0 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +0 -1
- package/dist-server/service/twin-forecast/forecast-tuning.js.map +0 -1
- package/dist-server/service/twin-forecast/gap-analytics.js.map +0 -1
- package/dist-server/service/twin-forecast/index.js.map +0 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +0 -1
- package/dist-server/service/twin-ingest-window/index.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window.js.map +0 -1
- package/dist-server/service/twin-instance/index.js.map +0 -1
- package/dist-server/service/twin-instance/twin-instance.js.map +0 -1
- package/dist-server/service/twin-journal/event-type-split-shape.js.map +0 -1
- package/dist-server/service/twin-journal/event-type-split.js.map +0 -1
- package/dist-server/service/twin-journal/index.js.map +0 -1
- package/dist-server/service/twin-journal/journal-order.js.map +0 -1
- package/dist-server/service/twin-journal/twin-journal-query.js.map +0 -1
- package/dist-server/service/twin-lifecycle/domain-catalog.js.map +0 -1
- package/dist-server/service/twin-lifecycle/index.js.map +0 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +0 -1
- package/dist-server/service/twin-metrics/index.js.map +0 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +0 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js.map +0 -1
- package/dist-server/service/twin-model/choose-recipe.js.map +0 -1
- package/dist-server/service/twin-model/epcis-coverage.js.map +0 -1
- package/dist-server/service/twin-model/external-resolver.js.map +0 -1
- package/dist-server/service/twin-model/iec61850-coverage.js.map +0 -1
- package/dist-server/service/twin-model/index.js.map +0 -1
- package/dist-server/service/twin-model/isa95-coverage.js.map +0 -1
- package/dist-server/service/twin-model/item-ref.js.map +0 -1
- package/dist-server/service/twin-model/name-index.js.map +0 -1
- package/dist-server/service/twin-model/project-structure.js.map +0 -1
- package/dist-server/service/twin-model/standard-coverage.js.map +0 -1
- package/dist-server/service/twin-model/status-tally.js.map +0 -1
- package/dist-server/service/twin-model/twin-equipment.js.map +0 -1
- package/dist-server/service/twin-model/twin-lineage-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-location.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-item-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-mutation.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-operation.js.map +0 -1
- package/dist-server/service/twin-readiness/index.js.map +0 -1
- package/dist-server/service/twin-readiness/twin-readiness-query.js.map +0 -1
- package/dist-server/service/twin-space/area-resolver.js.map +0 -1
- package/dist-server/service/twin-space/index.js.map +0 -1
- package/dist-server/service/twin-space/move-space.js.map +0 -1
- package/dist-server/service/twin-space/representation-role.js.map +0 -1
- package/dist-server/service/twin-space/space-integrity.js.map +0 -1
- package/dist-server/service/twin-space/twin-area.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-area.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-representation.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-resolver.js.map +0 -1
- package/dist-server/service/twin-space/twin-space.js.map +0 -1
- package/dist-server/service/twin-state/index.js.map +0 -1
- package/dist-server/service/twin-state/twin-state-subscription.js.map +0 -1
- package/dist-server/service/twin-structure/index.js.map +0 -1
- package/dist-server/service/twin-structure/twin-structure.js.map +0 -1
- package/dist-server/service/twin-subject/event-subjects.js.map +0 -1
- package/dist-server/service/twin-subject/index.js.map +0 -1
- package/dist-server/service/twin-subject/item-resolver.js.map +0 -1
- package/dist-server/service/twin-subject/subject-query-shape.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-backfill.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-event.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-fast-path.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-query.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-writer.js.map +0 -1
- package/dist-server/service/twin-target/index.js.map +0 -1
- package/dist-server/service/twin-target/twin-target-resolver.js.map +0 -1
- package/dist-server/service/twin-target/twin-target.js.map +0 -1
- package/dist-shared/axis-read.js.map +0 -1
- package/dist-shared/entity-delta.js.map +0 -1
- package/dist-shared/kpi-broadcast.js.map +0 -1
- package/dist-shared/touched-items.js.map +0 -1
- package/dist-shared/twin-level.js.map +0 -1
- package/server/engine/attention-digest.ts +0 -102
- package/server/engine/canonical-ingest.ts +0 -511
- package/server/engine/checkpoint-fold.ts +0 -12
- package/server/engine/command-routing.ts +0 -67
- package/server/engine/declared-stimulus.ts +0 -66
- package/server/engine/energy-topology.ts +0 -189
- package/server/engine/event-time.ts +0 -96
- package/server/engine/index.ts +0 -51
- package/server/engine/ingest-dedupe.ts +0 -24
- package/server/engine/ingest-health.ts +0 -24
- package/server/engine/integration-coverage.ts +0 -147
- package/server/engine/integration-probes.ts +0 -144
- package/server/engine/integration-runner.ts +0 -95
- package/server/engine/integration-target-profile.ts +0 -103
- package/server/engine/kpi-baseline.ts +0 -202
- package/server/engine/kpi-fold.ts +0 -1516
- package/server/engine/kpi-query.ts +0 -1210
- package/server/engine/kpi-target.ts +0 -248
- package/server/engine/live-attentions.ts +0 -30
- package/server/engine/live-feed-registry.ts +0 -59
- package/server/engine/load-meter.ts +0 -393
- package/server/engine/local-declarations.ts +0 -779
- package/server/engine/log.ts +0 -72
- package/server/engine/loop-lag.ts +0 -120
- package/server/engine/measured-estimator.ts +0 -91
- package/server/engine/measured-yield.ts +0 -89
- package/server/engine/model-basis.ts +0 -162
- package/server/engine/model-gap.ts +0 -168
- package/server/engine/model-refusal.ts +0 -31
- package/server/engine/model-vocabulary.ts +0 -82
- package/server/engine/oee-accumulator.ts +0 -195
- package/server/engine/operation-basis.ts +0 -131
- package/server/engine/producer-guard.ts +0 -64
- package/server/engine/property-effects.ts +0 -216
- package/server/engine/read-time.ts +0 -77
- package/server/engine/restart-policy.ts +0 -55
- package/server/engine/runtime-key.ts +0 -58
- package/server/engine/spec-coverage.ts +0 -105
- package/server/engine/stage-path.ts +0 -172
- package/server/engine/state-axes.ts +0 -60
- package/server/engine/structure-diff.ts +0 -88
- package/server/engine/travel-estimator.ts +0 -138
- package/server/engine/twin-engine.ts +0 -4979
- package/server/engine/twin-state-channel.ts +0 -39
- package/server/engine/warm-start.ts +0 -265
- package/server/index.ts +0 -90
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +0 -43
- package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +0 -54
- package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +0 -53
- package/server/migrations/1786300000000-IndexEventTypeByTime.ts +0 -48
- package/server/migrations/1786400000000-IndexEventCreatedAt.ts +0 -38
- package/server/migrations/1786500000000-CreateTwinSubjectEvents.ts +0 -93
- package/server/migrations/1786600000000-RenameOperatoMesAdapterType.ts +0 -66
- package/server/migrations/1786700000000-AddDispatchRetryColumns.ts +0 -82
- package/server/migrations/1786800000000-CreateTwinReferenceReconciliations.ts +0 -39
- package/server/migrations/index.ts +0 -25
- package/server/routes.ts +0 -75
- package/server/service/actuation/actuation-advisor.ts +0 -131
- package/server/service/actuation/actuation-outcome.ts +0 -97
- package/server/service/actuation/actuation-rule-resolver.ts +0 -147
- package/server/service/actuation/actuation-rule.ts +0 -139
- package/server/service/actuation/approval-gateway.ts +0 -44
- package/server/service/actuation/catch-up-effects.ts +0 -152
- package/server/service/actuation/command-dispatcher.ts +0 -474
- package/server/service/actuation/command-store.ts +0 -236
- package/server/service/actuation/dispatch-after-approval.ts +0 -71
- package/server/service/actuation/effect-match.ts +0 -124
- package/server/service/actuation/index.ts +0 -27
- package/server/service/actuation/retry-plan.ts +0 -145
- package/server/service/actuation/rule-evaluate.ts +0 -352
- package/server/service/actuation/rule-loop.ts +0 -160
- package/server/service/actuation/rule-runner.ts +0 -216
- package/server/service/actuation/rule-wiring.ts +0 -84
- package/server/service/actuation/settle-effects.ts +0 -115
- package/server/service/actuation/sweep-dispatch.ts +0 -179
- package/server/service/actuation/twin-command-resolver.ts +0 -387
- package/server/service/actuation/twin-command.ts +0 -232
- package/server/service/actuation/twin-now.ts +0 -97
- package/server/service/index.ts +0 -100
- package/server/service/reference/actuation-routing.ts +0 -192
- package/server/service/reference/actuation-target.ts +0 -163
- package/server/service/reference/actuation-verification.ts +0 -85
- package/server/service/reference/attention-lane.ts +0 -21
- package/server/service/reference/connection-portability-resolver.ts +0 -171
- package/server/service/reference/connection-portability.ts +0 -329
- package/server/service/reference/control-routing.ts +0 -62
- package/server/service/reference/discovery-result.ts +0 -95
- package/server/service/reference/fill-cadence.ts +0 -29
- package/server/service/reference/fill-dedupe.ts +0 -66
- package/server/service/reference/fill-loop.ts +0 -153
- package/server/service/reference/fill-span.ts +0 -31
- package/server/service/reference/hook-contract.ts +0 -364
- package/server/service/reference/hook-rejected.ts +0 -53
- package/server/service/reference/hook-store.ts +0 -28
- package/server/service/reference/index.ts +0 -18
- package/server/service/reference/ingest-space.ts +0 -104
- package/server/service/reference/knob-defaults.ts +0 -59
- package/server/service/reference/live-cadence.ts +0 -129
- package/server/service/reference/live-feed-lease.ts +0 -56
- package/server/service/reference/live-ingest.ts +0 -94
- package/server/service/reference/reference-adapter.ts +0 -985
- package/server/service/reference/reference-assessment.ts +0 -250
- package/server/service/reference/reference-fill-run.ts +0 -179
- package/server/service/reference/reference-fill.ts +0 -223
- package/server/service/reference/reference-hook.ts +0 -479
- package/server/service/reference/reference-link-groups.ts +0 -21
- package/server/service/reference/reference-links.ts +0 -77
- package/server/service/reference/reference-live.ts +0 -420
- package/server/service/reference/reference-master.ts +0 -999
- package/server/service/reference/reference-probe.ts +0 -264
- package/server/service/reference/reference-progress-channel.ts +0 -26
- package/server/service/reference/reference-progress-subscription.ts +0 -78
- package/server/service/reference/reference-progress.ts +0 -95
- package/server/service/reference/reference-reconciliation-query.ts +0 -28
- package/server/service/reference/reference-reconciliation-writer.ts +0 -38
- package/server/service/reference/reference-reconciliation.ts +0 -55
- package/server/service/reference/reference-registry.ts +0 -17
- package/server/service/reference/reference-resolver.ts +0 -969
- package/server/service/reference/template-registry.ts +0 -85
- package/server/service/reference/twin-reference-reconciliation.ts +0 -27
- package/server/service/reference/twin-reference.ts +0 -190
- package/server/service/twin-attention/index.ts +0 -3
- package/server/service/twin-attention/twin-attention-query.ts +0 -70
- package/server/service/twin-audit/command-audit.ts +0 -114
- package/server/service/twin-audit/index.ts +0 -5
- package/server/service/twin-audit/twin-audit-event.ts +0 -158
- package/server/service/twin-audit/twin-audit-query.ts +0 -72
- package/server/service/twin-backfill/backfill-period-facts.ts +0 -168
- package/server/service/twin-backfill/backfill-shape.ts +0 -86
- package/server/service/twin-backfill/index.ts +0 -3
- package/server/service/twin-backfill/twin-backfill-resolver.ts +0 -35
- package/server/service/twin-control/index.ts +0 -3
- package/server/service/twin-control/twin-control-mutation.ts +0 -150
- package/server/service/twin-event/index.ts +0 -3
- package/server/service/twin-event/journal-count.ts +0 -53
- package/server/service/twin-event/twin-event-keys.ts +0 -215
- package/server/service/twin-event/twin-event-type.ts +0 -68
- package/server/service/twin-event/twin-event.ts +0 -250
- package/server/service/twin-forecast/forecast-metrics.ts +0 -106
- package/server/service/twin-forecast/forecast-tuning.ts +0 -40
- package/server/service/twin-forecast/gap-analytics.ts +0 -139
- package/server/service/twin-forecast/index.ts +0 -3
- package/server/service/twin-forecast/twin-forecast-query.ts +0 -486
- package/server/service/twin-ingest-window/index.ts +0 -7
- package/server/service/twin-ingest-window/twin-ingest-window-query.ts +0 -125
- package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +0 -57
- package/server/service/twin-ingest-window/twin-ingest-window.ts +0 -113
- package/server/service/twin-instance/index.ts +0 -3
- package/server/service/twin-instance/twin-instance.ts +0 -199
- package/server/service/twin-journal/event-type-split-shape.ts +0 -112
- package/server/service/twin-journal/event-type-split.ts +0 -144
- package/server/service/twin-journal/index.ts +0 -3
- package/server/service/twin-journal/journal-order.ts +0 -20
- package/server/service/twin-journal/twin-journal-query.ts +0 -615
- package/server/service/twin-lifecycle/domain-catalog.ts +0 -51
- package/server/service/twin-lifecycle/index.ts +0 -3
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +0 -285
- package/server/service/twin-metrics/index.ts +0 -3
- package/server/service/twin-metrics/twin-metrics-query.ts +0 -172
- package/server/service/twin-model/axis-journal-evidence.ts +0 -57
- package/server/service/twin-model/choose-recipe.ts +0 -31
- package/server/service/twin-model/epcis-coverage.ts +0 -251
- package/server/service/twin-model/external-resolver.ts +0 -173
- package/server/service/twin-model/iec61850-coverage.ts +0 -111
- package/server/service/twin-model/index.ts +0 -25
- package/server/service/twin-model/isa95-coverage.ts +0 -320
- package/server/service/twin-model/item-ref.ts +0 -80
- package/server/service/twin-model/name-index.ts +0 -94
- package/server/service/twin-model/project-structure.ts +0 -213
- package/server/service/twin-model/standard-coverage.ts +0 -35
- package/server/service/twin-model/status-tally.ts +0 -37
- package/server/service/twin-model/twin-equipment.ts +0 -191
- package/server/service/twin-model/twin-lineage-query.ts +0 -327
- package/server/service/twin-model/twin-location.ts +0 -147
- package/server/service/twin-model/twin-model-item-query.ts +0 -1029
- package/server/service/twin-model/twin-model-mutation.ts +0 -503
- package/server/service/twin-model/twin-model-query.ts +0 -792
- package/server/service/twin-model/twin-model-tree-query.ts +0 -211
- package/server/service/twin-model/twin-operation.ts +0 -157
- package/server/service/twin-readiness/index.ts +0 -3
- package/server/service/twin-readiness/twin-readiness-query.ts +0 -96
- package/server/service/twin-space/area-resolver.ts +0 -75
- package/server/service/twin-space/index.ts +0 -8
- package/server/service/twin-space/move-space.ts +0 -262
- package/server/service/twin-space/representation-role.ts +0 -15
- package/server/service/twin-space/space-integrity.ts +0 -293
- package/server/service/twin-space/twin-area.ts +0 -63
- package/server/service/twin-space/twin-space-area.ts +0 -66
- package/server/service/twin-space/twin-space-representation.ts +0 -99
- package/server/service/twin-space/twin-space-resolver.ts +0 -582
- package/server/service/twin-space/twin-space.ts +0 -148
- package/server/service/twin-state/index.ts +0 -3
- package/server/service/twin-state/twin-state-subscription.ts +0 -62
- package/server/service/twin-structure/index.ts +0 -3
- package/server/service/twin-structure/twin-structure.ts +0 -96
- package/server/service/twin-subject/event-subjects.ts +0 -162
- package/server/service/twin-subject/index.ts +0 -10
- package/server/service/twin-subject/item-resolver.ts +0 -92
- package/server/service/twin-subject/subject-query-shape.ts +0 -84
- package/server/service/twin-subject/twin-subject-backfill.ts +0 -196
- package/server/service/twin-subject/twin-subject-event.ts +0 -101
- package/server/service/twin-subject/twin-subject-fast-path.ts +0 -346
- package/server/service/twin-subject/twin-subject-query.ts +0 -210
- package/server/service/twin-subject/twin-subject-writer.ts +0 -189
- package/server/service/twin-target/index.ts +0 -5
- package/server/service/twin-target/twin-target-resolver.ts +0 -142
- package/server/service/twin-target/twin-target.ts +0 -97
- package/server/types/global.d.ts +0 -22
- package/shared/axis-read.ts +0 -28
- package/shared/entity-delta.ts +0 -335
- package/shared/kpi-broadcast.ts +0 -13
- package/shared/touched-items.ts +0 -73
- package/shared/twin-level.ts +0 -48
- package/test/ack-shape-alignment.test.ts +0 -97
- package/test/actuation-advisor.test.ts +0 -55
- package/test/actuation-approval-door.test.ts +0 -411
- package/test/actuation-dispatch.test.ts +0 -209
- package/test/actuation-effect.test.ts +0 -162
- package/test/actuation-outcome.test.ts +0 -152
- package/test/actuation-rule-runner.test.ts +0 -281
- package/test/actuation-rule.test.ts +0 -266
- package/test/actuation-seam.test.ts +0 -255
- package/test/actuation-settle.test.ts +0 -164
- package/test/actuation-target.test.ts +0 -145
- package/test/actuation-verification-state.test.ts +0 -139
- package/test/adopt-structure-live.test.ts +0 -133
- package/test/aggregate-not-findone.test.ts +0 -112
- package/test/area-resolver-db.test.ts +0 -110
- package/test/attention-digest.test.ts +0 -161
- package/test/axis-declaration-passthrough-db.test.ts +0 -152
- package/test/axis-journal-evidence.test.ts +0 -71
- package/test/axis-read.test.ts +0 -188
- package/test/backfill-shape.test.ts +0 -89
- package/test/boot-resume.test.ts +0 -287
- package/test/broadcast-cost-baseline.test.ts +0 -201
- package/test/broadcast-period.test.ts +0 -58
- package/test/broadcast-queue-overflow.test.ts +0 -244
- package/test/canonical-ingest-vocabularies.test.ts +0 -451
- package/test/canonical-quantity-door.test.ts +0 -61
- package/test/capability-mapping.test.ts +0 -89
- package/test/checkpoint-refuses-empty.test.ts +0 -103
- package/test/choose-recipe.test.ts +0 -117
- package/test/column-type-portability.test.ts +0 -122
- package/test/command-routing.test.ts +0 -61
- package/test/command-store-writes-columns.test.ts +0 -126
- package/test/connection-portability-doors.test.ts +0 -87
- package/test/connector-capability-declaration.test.ts +0 -195
- package/test/contract-layer-guard.test.ts +0 -48
- package/test/control-capability.test.ts +0 -98
- package/test/cursor-stall-not-read-failure.test.ts +0 -126
- package/test/declaration-reaches-model.test.ts +0 -226
- package/test/declared-location-types.test.ts +0 -89
- package/test/declared-stimulus.test.ts +0 -88
- package/test/dedupe-transformation.test.ts +0 -112
- package/test/discovery-result.test.ts +0 -75
- package/test/dispatch-after-approval-source.test.ts +0 -81
- package/test/duration-estimators.test.ts +0 -144
- package/test/energy-topology.test.ts +0 -113
- package/test/entity-delta.test.ts +0 -352
- package/test/equipment-identity-reaches.test.ts +0 -57
- package/test/event-subjects.test.ts +0 -148
- package/test/event-time-column.test.ts +0 -67
- package/test/event-type-split.test.ts +0 -178
- package/test/external-resolver.test.ts +0 -177
- package/test/fact-scope-wiring.test.ts +0 -96
- package/test/fill-dedupe.test.ts +0 -59
- package/test/fill-loop.test.ts +0 -35
- package/test/first-envelope.test.ts +0 -153
- package/test/fold-gap-speaks.test.ts +0 -53
- package/test/fold-shift-dst.test.ts +0 -110
- package/test/forecast-metrics.test.ts +0 -157
- package/test/forecast-tuning.test.ts +0 -42
- package/test/gap-analytics.test.ts +0 -113
- package/test/generated-not-counted.test.ts +0 -99
- package/test/guard-roots.ts +0 -76
- package/test/home-in-area.test.ts +0 -90
- package/test/hook-address.test.ts +0 -28
- package/test/hook-rejected-shape.test.ts +0 -86
- package/test/hook-response-sum.test.ts +0 -193
- package/test/hook-sequence.test.ts +0 -333
- package/test/ingest-bench.test.ts +0 -70
- package/test/ingest-dedupe.test.ts +0 -56
- package/test/ingest-expected-quiet.test.ts +0 -111
- package/test/ingest-health-engine.test.ts +0 -248
- package/test/ingest-health-wiring.test.ts +0 -120
- package/test/ingest-health.test.ts +0 -306
- package/test/ingest-history.test.ts +0 -247
- package/test/ingest-idempotent.test.ts +0 -211
- package/test/ingest-reconcile-four-ways.test.ts +0 -97
- package/test/ingest-rules-header.test.ts +0 -100
- package/test/ingest-running-guard.test.ts +0 -136
- package/test/ingest-space.test.ts +0 -78
- package/test/ingest-window-rolls-unobserved.test.ts +0 -72
- package/test/ingest-wiring-guard.test.ts +0 -197
- package/test/instance-cache-lifecycle.test.ts +0 -110
- package/test/intake-mapping-parity.test.ts +0 -175
- package/test/integration-probes.test.ts +0 -103
- package/test/integration-runner.test.ts +0 -95
- package/test/item-ref.test.ts +0 -78
- package/test/journal-order-axis.test.ts +0 -80
- package/test/journal-read-discipline.test.ts +0 -186
- package/test/journal-retention.test.ts +0 -275
- package/test/journal-sort-axis.test.ts +0 -142
- package/test/journal-write-door.test.ts +0 -110
- package/test/journal-write-trend.test.ts +0 -115
- package/test/kernel-kind-guard.test.ts +0 -98
- package/test/knob-defaults.test.ts +0 -72
- package/test/kpi-baseline-db.test.ts +0 -216
- package/test/kpi-baseline.test.ts +0 -196
- package/test/kpi-fold.test.ts +0 -1456
- package/test/kpi-query-bench.test.ts +0 -130
- package/test/lens-own-places.test.ts +0 -50
- package/test/lineage-survives-restart.test.ts +0 -234
- package/test/live-cadence.test.ts +0 -170
- package/test/live-cursor-wiring.test.ts +0 -87
- package/test/live-feed-lease.test.ts +0 -63
- package/test/live-feed-registry.test.ts +0 -75
- package/test/live-kernel-facts.test.ts +0 -161
- package/test/live-mirror-parity.test.ts +0 -286
- package/test/load-meter.test.ts +0 -328
- package/test/local-declarations.test.ts +0 -662
- package/test/log-stamp.test.ts +0 -59
- package/test/loop-lag.test.ts +0 -82
- package/test/master-to-twin.test.ts +0 -279
- package/test/measured-yield.test.ts +0 -90
- package/test/merge-streams.test.ts +0 -70
- package/test/mirror-resumes-from-checkpoint.test.ts +0 -192
- package/test/model-basis.test.ts +0 -141
- package/test/model-gap.test.ts +0 -153
- package/test/model-refusal.test.ts +0 -75
- package/test/model-vocabulary.test.ts +0 -114
- package/test/move-space.test.ts +0 -149
- package/test/mutation-gate.test.ts +0 -122
- package/test/oee-accumulator.test.ts +0 -204
- package/test/oee-site-calendar.test.ts +0 -146
- package/test/open-doors.test.ts +0 -197
- package/test/operation-basis.test.ts +0 -127
- package/test/operational-vocabulary.test.ts +0 -108
- package/test/operations-capability-db.test.ts +0 -165
- package/test/order-and-transaction-split.test.ts +0 -107
- package/test/order-fold-host.test.ts +0 -112
- package/test/producer-guard.test.ts +0 -66
- package/test/project-structure-db.test.ts +0 -226
- package/test/projection-reaches-screen.test.ts +0 -277
- package/test/projection-reads-declared.test.ts +0 -109
- package/test/property-effects.test.ts +0 -128
- package/test/provenance-promotion.test.ts +0 -99
- package/test/read-failure-ledger.test.ts +0 -106
- package/test/read-failure-visible.test.ts +0 -145
- package/test/read-time.test.ts +0 -118
- package/test/reference-fill.test.ts +0 -235
- package/test/reference-grounding.test.ts +0 -70
- package/test/reference-hook.test.ts +0 -177
- package/test/reference-links.test.ts +0 -56
- package/test/reference-reconciliation.test.ts +0 -39
- package/test/registry-key-guard.test.ts +0 -80
- package/test/rejection-carries-event-id.test.ts +0 -101
- package/test/rename-twin.test.ts +0 -89
- package/test/resolve-ts-siblings.mjs +0 -52
- package/test/restart-policy.test.ts +0 -111
- package/test/resync-origin-site.test.ts +0 -83
- package/test/retry-plan.test.ts +0 -139
- package/test/revision-axis.test.ts +0 -110
- package/test/runtime-key.test.ts +0 -66
- package/test/save-intake-collision.test.ts +0 -91
- package/test/scale-twin-bench.test.ts +0 -103
- package/test/secrets-at-rest.test.ts +0 -135
- package/test/snapshot-freshness.test.ts +0 -60
- package/test/source-outcome-audit.test.ts +0 -104
- package/test/space-integrity.test.ts +0 -223
- package/test/space-representation.test.ts +0 -66
- package/test/space-scope-includes-stopped.test.ts +0 -55
- package/test/spec-coverage.test.ts +0 -113
- package/test/stage-path.test.ts +0 -95
- package/test/standard-coverage.test.ts +0 -148
- package/test/state-axes.test.ts +0 -74
- package/test/status-tally.test.ts +0 -55
- package/test/streamline-e2e.test.ts +0 -76
- package/test/structure-revision-db.test.ts +0 -315
- package/test/subject-fast-path.test.ts +0 -148
- package/test/subject-read-model.test.ts +0 -175
- package/test/sweep-dispatch.test.ts +0 -191
- package/test/tenant-registry-db.test.ts +0 -149
- package/test/time-range.test.ts +0 -152
- package/test/touched-items.test.ts +0 -61
- package/test/twin-audit.test.ts +0 -83
- package/test/twin-event-keys.test.ts +0 -193
- package/test/twin-model-item-db.test.ts +0 -319
- package/test/twin-model-parent-relation-db.test.ts +0 -125
- package/test/twin-model-tree-db.test.ts +0 -209
- package/test/twin-origin-resync.test.ts +0 -133
- package/test/twin-state-channel.test.ts +0 -111
- package/test/vocabulary-guard.test.ts +0 -43
- package/test/warm-start-seam.test.ts +0 -162
- package/test/warm-start.test.ts +0 -297
- package/test/withheld-door.test.ts +0 -95
- package/test/yield-loop.test.ts +0 -199
- package/tsconfig.json +0 -15
- package/tsconfig.shared.json +0 -23
- package/tsconfig.shared.tsbuildinfo +0 -1
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"standard-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/standard-coverage.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAWH,4CASC;AAfD;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,IAAa;IAC5C;;;;OAIG;IACH,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAChD,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACjF,OAAO,CAAC,OAAO,CAAC,CAAA;AAClB,CAAC","sourcesContent":["/*\n * ์ด ํธ์์ด ๊ธฐ๋๋ **ํ์ค๋ค** โ ์ข
๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.\n *\n * ์ ํฉ์ฑ ํจ๋์ด ํธ์ ์ข
๋ฅ์ ๋ฌด๊ดํ๊ฒ ISA-95 ํ๋๋ง ๋งํ๊ณ ์์๋ค. ์๋์ง ํธ์์์ ๊ทธ๊ฒ์ ๊ฑฐ์ง์\n * ์๋์ง๋ง ๋ถ์กฑํ๋ค: ๊ณ๋๊ธฐยท์ฐจ๋จ๊ธฐยทํ์๊ดยท์ถ์ ์ง์ ์ดํ๋ฅผ ์ฃผ๋ ๊ฒ์ IEC 61850 ์ด๊ณ , ๋ฌด์์ด ๋น์๋์ง๋\n * ๊ทธ ๋ชฉ๋ก์ผ๋ก๋ง ์
์ ์๋ค.\n *\n * โโ ์ฌ๊ธฐ ๋ฃ์ง ์๋ ๊ฒ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ISO 50001ยทISO 55000 ์ **๊ฒฝ์ ์์คํ
**์ด๋ค. ๋ฐ์ดํฐ ์คํค๋ง๊ฐ ์๋๋ผ ์๊ตฌ์ฌํญ์ ๋ตํด์ผ ํ๋ ๋์์ด๋ผ\n * ใํ๋ ์ปค๋ฒ๋ฆฌ์งใ๋ก ๋งํ ์ ์๋ค โ ๋ฐฐ์ฐ๊ธฐ ๋ฌธ์๊ฐ ๊ฐ์ ๊ตฌ๋ถ์ ์งํค๊ณ ์๊ณ , ํ๋ฉด๋ ๊ทธ๋์ผ ํ๋ค.\n *\n * โโ ์ ํ๋ฅผ ์ฌ๊ธฐ์ ๋ถ๋ฅด์ง ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ด ํ์ผ์ **์ ์ฑ
**๋ง ๋ด๋๋ค(์ด๋ ์ข
๋ฅ๊ฐ ์ด๋ ํ์ค์ ๊ธฐ๋ํ๋). ํ๋ฅผ ์ง์ ๋ถ๋ฌ์ค๋ฉด ๊ทธ ์๊ฐ ์ด ๊ท์น์\n * ๋จ์ ์ํ์ด ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋๋ค(๋ชจ๋ ์ฌ์ฌ์ด ๋ฐํ์ ํด์์ ํ๋ค). ์กฐ๋ฆฝ์ ์ง์๊ฐ ํ ์ค๋ก ํ๋ค.\n */\n\n/** ์ฐ๋ฆฌ๊ฐ ์ ํฉ์ฑ ํ๋ฅผ ๊ฐ์ง ํ์ค๋ค. */\nexport type StandardId = 'isa95' | 'epcis' | 'iec61850'\n\n/**\n * ์ด ์ข
๋ฅ์ ํธ์์ด ๊ธฐ๋๋ ํ์ค โ **์์ = ํ๋ฉด์ ๋์ด๋ ์์.**\n *\n * ISA-95 ๋ ์ข
๋ฅ์ ์๊ด์์ด ๋ธ๋ค: ์์๊ณผ ๊ณ์ธต์ ์ด๋ ๋๋ฉ์ธ์์๋ ๊ทธ ํ์ค์ ๊ฒ์ด๋ค.\n * ์ข
๋ฅ๊ฐ ๋ํ๋ ํ์ค๋ง ๋ค์ ๋ถ์ธ๋ค.\n */\nexport function standardsForKind(kind?: string): StandardId[] {\n /*\n * ๋ฌผ๋ฅยท์ ์กฐ๋ **EPCIS** ๋ก ใ๋ฌด์จ ์ผ์ด ์์๋ใ์ ใ์ด ๋ฒํธ๊ฐ ๋ฌด์์ ๊ฐ๋ฆฌํค๋ใ๋ฅผ ์ ํ๋ค.\n * ์๋์ง์๋ ๋ถ์ด์ง ์๋๋ค โ ๊ทธ ํธ์์๋ ์ค๊ฐ๋ ๋ฌผ๊ฑด์ด ์๊ณ , ๊ณ์ธก์ EPCIS ์ฌ๊ฑด์ด ์๋๋ผ ํ๋ณธ์ผ๋ก\n * ๋ค์ด์จ๋ค(์ฌ๊ฑด๊ณผ ์๊ณ์ด์ ๋ค๋ฅธ ์ธต์ด๋ค).\n */\n if (kind === 'ems') return ['isa95', 'iec61850']\n if (kind === 'wms' || kind === 'yms' || kind === 'mes') return ['isa95', 'epcis']\n return ['isa95']\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status-tally.js","sourceRoot":"","sources":["../../../server/service/twin-model/status-tally.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AASH,kCAUC;AAXD,mDAAmD;AACnD,SAAgB,WAAW,CAAC,MAAe;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAI,CAAS,EAAE,MAAM,CAAA;QAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;YAAE,SAAQ;QACzC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;AACrH,CAAC","sourcesContent":["/*\n * **์ ํ๋๊ฐ ๋ป์ ๋ฐ๊พธ๋ ์๋ฆฌ** โ ์ํ๋ณ๋ก ๊ฐ๋ผ ์ผ๋ค (2026-08-23).\n *\n * โโ ๋ฌด์์ด ์์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ฏธ๋ฌ๊ฐ ์๋ฃ๋ ์์
๊น์ง ์ํ์ ๋ค๊ณ ์๊ฒ ๋๋ฉด์(๊ด์ธก ํก์์์ `completed` ๋ฅผ ๋จ์ด๋จ๋ฆฌ์ง ์๊ฒ ์ปค๋์\n * ๊ณ ์น ๋ค) ๊ฐ๋
์ง๋์ ์์
์นด๋๊ฐ ใ0ใ์์ ใ2,820ใ์ด ๋์๋ค. ์ด ์นด๋๋ **์ํ์ ์ธ๊ตฌ์กฐ์ฌ**์ด๋ฏ๋ก\n * ๊ทธ ์๊ฐ ๋ง๋ค โ ๊ทธ๋ฐ๋ฐ ์ฌ๋์ ๊ทธ๊ฒ์ ใ์ง๊ธ ํ ์ผ 2,820๊ฑดใ์ผ๋ก ์ฝ๋๋ค.\n *\n * ์๋ฅผ ์ค์ฌ ๋ง๋ ์ฒํ๊ฒ ๋ง๋ค์ง ์๋๋ค(๊ทธ๋ฌ๋ฉด ์ธ๊ตฌ์กฐ์ฌ๊ฐ ๊ฑฐ์ง์ด ๋๋ค). ๋์ **๋ฌด์์ผ๋ก ์ด๋ฃจ์ด์ง\n * ์์ธ์ง** ํจ๊ป ๋ธ๋ค: ใ์งํ ์ค 28 ยท ์๋ฃ 2,792ใ.\n *\n * โโ ์งํค๋ ๊ฒ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ยท ๋ฑ๋ง์ **์ปค๋์ด ์ค์ด ๋ณด๋ธ ๊ทธ๋๋ก**๋ค. ์ฌ๊ธฐ์ ๋ฌถ๊ฑฐ๋ ๊ณ ์ณ ๋ถ๋ฅด์ง ์๋๋ค(ํ๋ฉด์ด ๋ผ๋ฒจ์ ์
ํ๊ณ ,\n * ๋ผ๋ฒจ์ด ์์ผ๋ฉด ๋ฑ๋ง์ด ๊ทธ๋๋ก ๋ณด์ฌ ๋๋ฝ์ด ๋๋ฌ๋๋ค).\n * ยท ์ํ๋ฅผ ๋งํ์ง ์๋ ์ถ์ **์๋ฌด๊ฒ๋ ๋ด์ง ์๋๋ค.** ๋น ํ๋ฅผ ๋ด๋ฉด ํ๋ฉด์ด ใ์ํ๊ฐ ์๋ ์ถใ๊ณผ\n * ใ์ํ๋ฅผ ๋ชป ์ฝ์ ์ถใ์ ๊ตฌ๋ณํ ์ ์๋ค.\n * ยท ํ ๋ฒ๋ง ํ๋๋ค. ์นด๋๊ฐ ์ด๋ฏธ ๊ฐ์ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์ธ๋ฏ๋ก ์
์ด ํ ๋ฒ ๋์ง ์๋๋ค.\n */\n\n/** ์ํ ํ ๊ฐ๋์ ๊ทธ ๊ฑด์. */\nexport interface StatusCount {\n status: string\n count: number\n}\n\n/** ์ด ์ถ์ ๊ฐ์ฒด๋ฅผ ์ํ๋ณ๋ก ์ผ๋ค. ์ํ๊ฐ ์์ผ๋ฉด ๋น ๊ฐ์ฒด(ํ๋๋ฅผ ๋ง๋ค์ง ์๋๋ค). */\nexport function statusTally(bucket: unknown): { statusCounts?: StatusCount[] } {\n if (!Array.isArray(bucket) || !bucket.length) return {}\n const tally = new Map<string, number>()\n for (const e of bucket) {\n const s = (e as any)?.status\n if (typeof s !== 'string' || !s) continue\n tally.set(s, (tally.get(s) ?? 0) + 1)\n }\n if (!tally.size) return {}\n return { statusCounts: [...tally].map(([status, count]) => ({ status, count })).sort((x, y) => y.count - x.count) }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-equipment.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-equipment.ts"],"names":[],"mappings":"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","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 { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinLocation } from './twin-location.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\n\n/*\n * TwinEquipment โ ์ด ํธ์์ด ๋ฐ์ํ๋ **์ค๋น**. ISA-95 `Equipment` / ISO 55000 `Asset` / EPCIS `GIAI`.\n *\n * ์๋ฆฌ์ ๊ฐ์ ๊ท์จ์ ๋ฐ๋ฅธ๋ค(`twin-location.ts` ๋จธ๋ฆฌ๋ง) โ ์ด๊ฒ๋ **์๋ณธ์์ ์จ ์บ์**์ด๊ณ ,\n * `sourceRef`ยท`ingestedAt` ์ด ํ์์ด๋ฉฐ, ์ฐ๊ธฐ ๊ฒฝ๋ก๋ ์ธ์ ์คํธ ํ๋๋ค.\n *\n * โโ ํ
์ด๋ธ ์ด๋ฆ์ ๋ช
์ํ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `equipment` ๋ ์์ด์์ **๋ถ๊ฐ์ฐ**์ด๋ผ ์๋ ๋ณต์ํ๊ฐ ๋ค๋ฅธ ํ๋ค๊ณผ ๊ท์น์ด ์ด๊ธ๋๋ค\n * (`twin_locations` ์ธ๋ฐ `twin_equipment`). ๋ค์ด์จ ๊ฒ์ด ์๋ ๋น์ผ๊ด์ ๋์ค์ \"์ ์ด๊ฒ๋ง ๋ค๋ฅด์ง\" ๋ฅผ\n * ๋ง๋ค๋ฏ๋ก ์ด๋ฆ์ ๊ณ ์ ํ๋ค(ADR-0032-I).\n */\n@Entity({ name: 'twin_equipment' })\n@Index('ix_twin_equipment_0', (e: TwinEquipment) => [e.domain, e.instance, e.equipmentId], { unique: true })\n/* ์ข
๋ฅ๋ก ์ขํ ๋ณด๊ธฐ โ ๊ณต์ ์ด `resourceType` ์ผ๋ก ์ข
๋ฅ๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ์ฆ์ ์ง์๋ค. */\n@Index('ix_twin_equipment_1', (e: TwinEquipment) => [e.domain, e.instance, e.kind])\n@ObjectType({ description: 'Equipment reflected into the twin (ISA-95 Equipment / ISO 55000 Asset). Projected from the source; never authored here.' })\nexport class TwinEquipment {\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: TwinEquipment) => e.domain)\n domainId?: string\n\n @ManyToOne(type => TwinInstance, { onDelete: 'CASCADE' })\n @Field(type => TwinInstance, { nullable: true, description: 'Owning twin instance.' })\n instance?: TwinInstance\n\n @RelationId((e: TwinEquipment) => e.instance)\n instanceRowId?: string\n\n /** ์ปค๋ ๊ณ์ฝ์ `TwinModelDef.equipment[].id` ๊ทธ๋๋ก. */\n @Column()\n @Field({ description: 'Equipment id as declared by the source (kernel TwinModelDef.equipment[].id).' })\n equipmentId: string\n\n /**\n * **์ฌ๋์ด ๋ถ๋ฅด๋ ์ด๋ฆ** โ ํ๋ ์์ํฌ ์ํฐํฐ ๊ท์ฝ์ `name`/`description`.\n *\n * โโ ์ ์ด๊ฒ์ด ๋น ์ ธ ์์๊ณ , ๋ฌด์์ด ๋ง๊ฐ์ก๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํฌ์์ด ๋ง์คํฐ์ `name` ์ ๋ฒ๋ฆฌ๊ณ ์์๋ค. ๊ทธ๋์ ํ์๋ id ๋ง ๋จ๊ณ , ํ๋ฉด์ ์ด๋ฆ์ ๋ง๋ค ์ฌ๋ฃ๊ฐ\n * ์์ด `cut-station` ์ ๊ทธ๋๋ก ์ฐ์๋ค โ ๊ทธ ๊ฒฐํจ์ด ๋ชฉ๋กยทํยท๊ด๊ณ ๊ทธ๋ฆผ๋ง๋ค ๋ฐ๋ก ๋ํ๋์ ํ๋ฉด์\n * ํ๋์ฉ ๊ณ ์น๊ฒ ๋ง๋ค์๋ค. ํ๋ฉด์ ๋ฌธ์ ๊ฐ ์๋๋ผ **ํ์ ์ด๋ฆ์ด ์๋ ๋ฌธ์ **๋ค.\n *\n * ์๋ณธ์ด ์ด๋ฆ์ ๋งํ์ง ์์ผ๋ฉด ๋น์ด๋ค(id ๋ฅผ ์ด๋ฆ์ผ๋ก ๋ฒ ๋ผ์ง ์๋๋ค โ ๊ทธ๋ฌ๋ฉด \"์ด๋ฆ์ด ์๋ค\" ๋\n * ๊ฑฐ์ง์ด ๋๊ณ , ํ๋ฉด์ด ์ด๋ฆ ์์์ ์์๋ณผ ์ ์๊ฒ ๋๋ค).\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Human name as declared by the source. Empty when the source does not name it (never copied from the id).' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Longer description when the source provides one.' })\n description?: string\n\n /** ์ปค๋ ์นดํ๋ก๊ทธ์ ์ค๋น ์ข
๋ฅ ํค(`forklift`ยท`welder`โฆ). FK ์๋ โ ์นดํ๋ก๊ทธ๋ ์ปค๋ SSOT. */\n @Column()\n @Field({ description: 'Equipment kind key from the kernel catalog (not an FK โ the catalog is the kernel SSOT).' })\n kind: string\n\n /**\n * ์์ ์์ฑ โ **ISA-95 `Property`**(๊ฐยท๋ฐ์ดํฐํยท๋จ์ยทํ์ ์์ฑ).\n *\n * ๋ชจ๋ธ์๋ ์๋๋ฐ ํ์ ์๋ฆฌ๊ฐ ์์ด ํฌ์์ด ํ๋ฆฌ๊ณ ์์๋ค. ๊ทธ๋ฌ๋ฉด ์กฐํ ํ๋ฉด์ \"์๋ณธ์ด ๋งํ ๊ฐ\" ์ด๋ผ\n * ์ ๊ณ ๋ ์์ฑ์ ๋ณด์ด์ง ๋ชปํ๋ค โ ์ด๋ฆ์ด ๊ฐ์ ์์ผ๋ก ์ฌ๋ผ์ก๋ ๊ฒ๊ณผ ๊ฐ์ ๋ถ๋ฅ๋ค(2026-08-11).\n *\n * ์๋น์ฒ๊ฐ ์ค์ ๋ก ์ฝ๋ ์ฌ์ค์ด๋ค: ์ฃผํ ์ถ์ ๊ธฐ๊ฐ `speed` ๋ก ์ด๋ ์๊ฐ์ ๋ง๋ ๋ค. ๋จ์๊ฐ ๊ฐ ์์ ๋ถ์ด\n * ์์ด์ผ ๋ป์ด ์๋ฏ๋ก **๋ชจ์ ๊ทธ๋๋ก** ๋ด๋๋ค(๋ฌธ์์ด ๊ฐ + `uom` + `dataType`).\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Resource properties as declared by the source (ISA-95 Property: value + dataType + unit of measure, optional children).' })\n properties?: any\n\n /**\n * ์ด ์ค๋น์ ์ ๊ฒฉ์ ๊ฒ์ฆํ **์ํ ๋ช
์ธ๋ค** โ ํ์ค `TestSpecificationID`(`maxOccurs=\"unbounded\"`).\n *\n * ์ฐธ์กฐ๋ง ๋ด๋๋ค(๋์์ `testSpecifications` ์ถ). ์์ฑ๊ณผ **๊ฐ์ ๋ถ๋ฅ์ ๊ฒฐ์**์ด์๋ค: ๋ชจ๋ธ์๋ ์๋๋ฐ\n * ํ์ ์๋ฆฌ๊ฐ ์์ด ํฌ์์ด ํ๋ ธ๊ณ , ๊ทธ๋์ ๋ช
์ธ ์ชฝ์์ \"๋๊ฐ ๋๋ฅผ ๊ฐ๋ฆฌํค๋\" ๋ฅผ ๋ฌผ์ผ๋ฉด ์ค๋น๊ฐ ๋น ์ก๋ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true, description: 'Test specifications that verified this equipment (ISA-95 TestSpecificationID, unbounded). References only โ the specifications themselves live on the testSpecifications axis.' })\n testSpecificationIds?: string[]\n\n /**\n * ๊ทธ ์ํ๋ค์ **๊ฒฐ๊ณผ** โ ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง๋ ์ด๊ฒ์ด ๋งํ๋ค.\n *\n * ์ฐธ์กฐ๋ง ์์ผ๋ฉด \"๋ฌด์์ผ๋ก ๊ฒ์ฆํ๋ค\" ๊น์ง๋ค. ์ค๋ ์ด ์ ์ฅ์์์ ๋ค ๋ฒ ๋์จ ๊ฒฐ์๊ณผ ๊ฐ์ ๋ถ๋ฅ์ด๋ฏ๋ก\n * ํ์ ์๋ฆฌ๋ฅผ ํจ๊ป ๋ง๋ ๋ค โ ๋ชจ๋ธ์๋ ์๋๋ฐ ํ์ ์์ผ๋ฉด ํ๋ฉด์ด ์๋ฆฌ์ง ์๊ณ ์๋๋ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Results of those tests (pass/fail with dates). Declared by the source โ the twin does not produce them.' })\n testResults?: any\n\n /**\n * ๊ธฐ์ค ์๋ฆฌ โ **์ค์ FK**. ์์ ์๋ `homeLocation` ๋ฌธ์์ด์ด๋ผ ๋์ด์ง ์ฐธ์กฐ๋ฅผ ํ๋ฉด์ด ๊ฒฝ๊ณ ํ๊ณ \n * (`brokenHomeRefs`), ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ ์๋ฌด๋ ์ ๋ดค๋ค. ์ด์ DB ๊ฐ ๋ง๋๋ค.\n */\n @ManyToOne(type => TwinLocation, { nullable: true, onDelete: 'SET NULL' })\n @Field(type => TwinLocation, { nullable: true, description: 'Home location this equipment belongs to.' })\n homeLocation?: TwinLocation\n\n @RelationId((e: TwinEquipment) => e.homeLocation)\n homeLocationRowId?: string\n\n /**\n * ๊ธฐ์ค **๊ตฌ์ญ** โ ์ค๋น๊ฐ ์๋ฆฌ๊ฐ ์๋๋ผ ๊ตฌ์ญ์ ์ ์์ ๋.\n *\n * โโ ์ ์นธ์ด ๋์ธ๊ฐ (2026-09-06) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ณ์ฝ์ด `homeLocationKind = 'location' | 'area'` ๋ก ๊ทธ ๊ฐ๋ฆผ์ ๋งํ๋ค. ์ค๋ฌผ์ด ์๋ค โ\n * `EQ-CAM-SHOWER-01`(์์ด์ค์)์ด `LINE-CAM` ์ด๋ผ๋ **๊ตฌ์ญ**์ ๋ธ๋ ค ์๊ณ , ๊ทธ๊ฒ์ด ์ ์์ด๋ค.\n * ๋ผ์ธ ์ ์ฒด์ ๋ถ๋ ์ค๋น๋ ์๋ฆฌ ํ๋๋ฅผ ๊ณ ๋ฅผ ์ ์๋ค.\n *\n * ๊ทธ๋์ ์ด ์นธ์ด ์์ด์ ์ธ์ ์คํธ๊ฐ ๊ทธ ์ฐธ์กฐ๋ฅผ **ใ๋์ด์ก๋คใ๊ณ ๊ฒฝ๊ณ **ํ๋ค. ์๋ฆฌ ๋ชฉ๋ก์์ ๋ชป ์ฐพ์ผ๋ฉด\n * ์๋ ๊ฒ์ผ๋ก ๋ดค๊ธฐ ๋๋ฌธ์ด๋ค.\n *\n * ํ ์นธ์ ๋ ๋์์ ๋ด์ง ์๋๋ค โ FK ๊ฐ ์๋ก ๋ค๋ฅธ ํ๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ํฉ์น๋ฉด DB ๊ฐ ๋ชป ๋ง๋๋ค.\n * **๋ ๋ค ์ฐจ๋ ์ผ์ ์๋ค**(๋ง์คํฐ์ `role` ์ด ํ๋๋ฅผ ์ ํ๋ค).\n */\n @ManyToOne(type => TwinArea, { nullable: true, onDelete: 'SET NULL' })\n @Field(type => TwinArea, { nullable: true, description: 'Home area this equipment belongs to, when it stands in an area rather than a location.' })\n homeArea?: TwinArea\n\n @RelationId((e: TwinEquipment) => e.homeArea)\n homeAreaRowId?: string\n\n /*\n * ๊ณ ์ฅ ๋ชจ๋ธ โ ์๋ณธ์ด ์ ์ธํ ๋๋ง ์๋ค. ์์ผ๋ฉด ๊ณ ์ฅ ์๋ ์ค๋น๋ก ๋์ํ๋ค(์ปค๋ ๊ณ์ฝ).\n * **๊ด์ธก(๊ฐ๋๋ฅ )์ ์ฌ๊ธฐ ๋์ง ์๋๋ค** โ ๊ทธ๊ฑด ํธ์์ด ์ ๋์์ ๋ง๋ ๊ฒ์ด๋ผ ์ฑ์ง์ด ๋ค๋ฅด๊ณ ,\n * ์ด ํ๋ ์๋ณธ์์ ์ฌ์์ฑ ๊ฐ๋ฅํด์ผ ํ๋ค(ADR-0032-D).\n */\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'Declared mean time between failures in ms. Absent = no failure model.' })\n mtbfMs?: number\n\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'Declared mean time to repair in ms.' })\n mttrMs?: number\n\n /*\n * โโ **์ ์ธ๋ ์ค๋น ์ ์ฒด์ฑ** (2026-08-30) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n *\n * ์์ ์ด๋ฆ์ `gs1Id` ์๊ณ , ํฌ์์ด ์ ์ธ์ `m.gs1Id` ๋ฅผ ์ฝ์๋ค. **๊ทธ๋ฐ ํ๋๊ฐ ์ ์ธ์ ์๋ค** โ ๊ทธ๋์\n * ์ด ์นธ์ ์ผ๊ณฑ ๋ ๋ชจ๋ ์์ํ ๋น์ด ์์๋ค. ์๋ฆฌ๋ ์๊ณ ๊ธธ์ด ์์๋ค.\n *\n * ๊ทธ ์ฌ์ด ์ปค๋์ `TwinModelDef.equipment[].identity` ๋ฅผ ์ด์์ผ๋ฏ๋ก ์ดํ๊ฐ ๋ ๋ฒ์ด ๋๋ค. ํ๋๋ก\n * ํฉ์น๋ค. ์ด๋ฆ์ `identity` ๋ก ๋๋ ์ด์ ๋ **GS1 ํค๊ฐ ์๋ ์ ์ฒด์ฑ์ด ์ ์**์ด๊ธฐ ๋๋ฌธ์ด๋ค โ\n * ์ค์ธกํ ๊ฐ์ ์ธ๋ฒํฐ์ ํ๋์จ์ด ์๋ณ์(`ES100000007d8d061d-1`)์ด๊ณ GS1 ํค๊ฐ ์๋๋ค.\n *\n * ์๋ฆฌ(`twin_location`)์ `gs1Id` ๋ ๊ทธ๋๋ก ๋๋ค. ๊ทธ์ชฝ์ ์ค์ ๋ก SGLN ์ด ์จ๋ค.\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Declared global identity of this equipment (TwinModelDef.equipment[].identity). Not necessarily a GS1 key.' })\n identity?: string\n\n /* โโ ์บ์๋ผ๋ ์ฌ์ค์ ๊ตฌ์กฐ๋ก (ADR-0032-D) โโ */\n @Column()\n @Field({ description: 'Which reference (source system) this row came from. Required.' })\n sourceRef: string\n\n /*\n * **ํ์
์ด๋ฆ์ ์ ์ง ์๋๋ค** (2026-08-19 Postgres ๋ถํ
์คํจ๋ก ๊ณ ์นจ).\n *\n * `datetime` ์ sqliteยทMySQL ์ ์ด๋ฆ์ด๊ณ Postgres ๋ `timestamp` ๋ง ์๋ค โ ๊ฑฐ๊พธ๋ก `timestamp` ๋\n * sqlite ๊ฐ ๋ชจ๋ฅธ๋ค. **๋ค์ฏ ๋๋ผ์ด๋ฒ์ ๋ค ํตํ๋ ์ด๋ฆ์ด ์๋ค.** ๊ทธ๋์ ์ด๋ฆ ๊ณ ๋ฅด๋ ์ผ์ TypeORM ์\n * ๋งก๊ธด๋ค(`emitDecoratorMetadata` ๊ฐ ์ผ์ ธ ์์ด `Date` ์์ ๋๋ผ์ด๋ฒ๋ณ ํ์
์ ๊ณ ๋ฅธ๋ค).\n */\n @Column()\n @Field({ description: 'When this row was projected from the source.' })\n ingestedAt: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-lineage-query.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-lineage-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Int, Query, Resolver } from 'type-graphql'\n\nimport { ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { itemRefOf, resolveByDeclaration } from './item-ref.js'\nimport { chooseRecipe } from './choose-recipe.js'\n\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinEvent } from '../twin-event/twin-event.js'\n\n/*\n * ๊ณ๋ณด โ **์ด ๊ฐ์ฒด๋ ๋ฌด์์์ ๋์๋**, ๊ทธ๋ฆฌ๊ณ **์ค๊ณ๋๋ก ๋ง๋ค์ด์ก๋.**\n *\n * โโ ๊ตฌ์ฑ๊ณผ ๊ณ๋ณด๋ ์ฃผ์ด๊ฐ ๋ค๋ฅด๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ตฌ์ฑ(BOM)์ ์ฃผ์ด๋ ํ๋ชฉ **์ ์**๋ค โ \"ํธ๋ ์ผ๋ฌ๋ ํ๋ ์ 1๊ฐ๋ก ๋ง๋ ๋ค\"(์ ์ธ).\n * ๊ณ๋ณด์ ์ฃผ์ด๋ ํ๋ชฉ **๊ฐ์ฒด**๋ค โ \"์ด ํธ๋ ์ผ๋ฌ๋ ์ ํ๋ ์ ๋กํธ์์ ๋์๋ค\"(๊ด์ธก).\n * ๋์ ๊ฐ์ ๋ชจ์์ด๋ผ ๊ฒน์ณ ๋ณผ ์ ์๊ณ , **๊ทธ ์ฐจ์ด๊ฐ ๊ณง ์ง๋จ**์ด๋ค: \"์ค๊ณ๋ 1๊ฐ์ธ๋ฐ ์ด๊ฑด 2๊ฐ๋ฅผ ๋จน์๋ค\".\n * ํธ์์ด ์๋๋ฉด ๋ชป ํ๋ ๋ต์ด๊ณ , ์ด ์ง์๊ฐ ๊ทธ ๋ต์ ์ฌ๋ฃ๋ค.\n *\n * โโ ์ด๋์ ์ฝ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ณ๋ณด๋ ์ํ๊ฐ ์๋๋ผ **์ ๋**์ ์๋ค(EPCIS `TransformationEvent` ์ ์
๋ ฅยท์ฐ์ถ ๋ชฉ๋ก). ์ํ๋\n * ์ง๊ธ ๋ฌด์์ด ์๋์ง๋ง ์๊ณ , ์์ด์ง ์์์ฌ๊ฐ ๋ฌด์์ด์๋์ง๋ ์ด๋ฒคํธ๋ง ์๋ค.\n *\n * โโ ๊ท๋ชจ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์
๋ ฅ ๋ชฉ๋ก์ **์ปฌ๋ผ์ด ์๋๋ผ ๋ดํฌ ์**์ ์์ด์ ์ธ๋ฑ์ค๋ก ์ขํ ์ ์๋ค. ๊ทธ๋์ ๋ณํ ์ด๋ฒคํธ๋ง\n * ์ฐฝ์ผ๋ก ๋์ด ์ฝ๊ณ , **๋์์ผ๋ฉด ๋์๋ค๊ณ ๋งํ๋ค.** ๊ทธ ์ฌ์ค์ ๊ฐ์ถ๋ฉด \"์ด ๊ฐ์ฒด๋ ์์์ฌ๊ฐ ์๋ค\" ๋ก\n * ์ฝํ๊ณ , ๊ณ๋ณด์์ ๊ทธ ์คํด๋ ๋ฆฌ์ฝ ๋ฒ์๋ฅผ ์ข๊ฒ ์ก๋ ๊ฒฐ๊ณผ๋ก ์ด์ด์ง๋ค.\n */\n\n\n@Resolver()\nexport class TwinLineageQuery {\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'Where one item came from (observed) laid next to what its type declares (BOM). Walks TransformationEvent input/output lists in the journal; reports the window it read and whether it was truncated. The declared|observed difference is the diagnosis: \"the recipe says one frame, this one consumed two\".'\n })\n async twinItemLineage(\n @Arg('instanceId') instanceId: string,\n @Arg('epc') epc: string,\n @Ctx() context: ResolverContext,\n @Arg('maxDepth', type => Int, { nullable: true }) maxDepth?: number,\n @Arg('window', type => Int, { nullable: true }) window?: number\n ): Promise<any | null> {\n const domainId = context.state.domain.id\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return null\n\n const depthCap = Math.min(Math.max(maxDepth ?? 6, 1), 12)\n const windowCap = Math.min(Math.max(window ?? 5000, 1), 50000)\n\n /*\n * ๋ณํ ์ด๋ฒคํธ๋ง ์ฝ๋๋ค. **์ต์ ๋ถํฐ** ์ฝ๋๋ค โ ๊ณ๋ณด๋ฅผ ๋ฌป๋ ๊ฐ์ฒด๋ ๋๊ฐ ์ต๊ทผ์ ๋ง๋ค์ด์ง ๊ฒ์ด๊ณ ,\n * ์ฐฝ์ ๋๊ฒจ ์๋ฆด ๋ ์๋ ์ชฝ์ด ์ค๋๋ ๊ฒ์ด์ด์ผ ๋ ์ํ๋ค.\n */\n /*\n * ๊ด๊ณ๋ฅผ **์ปฌ๋ผ์ผ๋ก** ๋ฌป๋๋ค (2026-08-28). `find({ where: { domain: { id } } })` ์ ๊ด๊ณ๋ฅผ ๊ฐ์ง\n * ์ํฐํฐ์์ ๋ ๋จ๊ณ ์ง์๊ฐ ๋๊ณ **์์ชฝ์ ์ํ์ด ์๋ค** โ `take` ๊ฐ ์์ด๋ ์กฐ๊ฑด์ ๋ง๋ ํ์ ์ ๋ถ\n * ๋ง๋ ๋ค ๋ฐ์์ ์๋ฅธ๋ค. ๋ณํ ์ฌ๊ฑด์ด ์ ์ ํธ์์์๋ ํ๊ฐ ์ ๋์ง๋ง, ๋ณํ์ ๋ง์ด ๋ด๋ ํธ์์์๋\n * ์ด ํ ๋ฒ์ด ๊ทธ ์ข
๋ฅ ์ ์ฒด๋ฅผ ๋ง๋ ๋ค. ์ง์ ๋น๋๋ก ๋ฌผ์ผ๋ฉด ์ํ์ด ์์ชฝ์ ๊ฑธ๋ฆฐ๋ค.\n *\n * ์ข
๋ฅ๊ฐ ์ ํ์ผ์น์ด๋ฏ๋ก `(domain, instance, event_type, event_time)` ์์ธ์ด ์๊ฐ ์์๊น์ง ์ค๋ค.\n */\n const rows: any[] = await getRepository(TwinEvent)\n .createQueryBuilder('e')\n .where('e.domain = :domainId', { domainId })\n .andWhere('e.instanceId = :instanceId', { instanceId })\n .andWhere('e.eventType = :eventType', { eventType: 'epcis.TransformationEvent' })\n .orderBy('e.eventTime', 'DESC')\n .limit(windowCap)\n .getMany()\n const truncated = rows.length >= windowCap\n\n /* ์ฐ์ถ โ ๊ทธ ๋ณํ. ํ ๊ฐ์ฒด๋ ํ ๋ฒ๋ง ๋ง๋ค์ด์ง์ง๋ง, ๋ฐ์ดํฐ๊ฐ ๊ทธ๋ ์ง ์์ ์ ์์ผ๋ฏ๋ก ๋ชฉ๋ก์ผ๋ก ๋ ๋ค. */\n const madeBy = new Map<string, { inputs: string[]; at?: string; tx?: string }[]>()\n for (const r of rows) {\n const d = r.payload?.data ?? {}\n const outs: string[] = d.outputEPCList ?? []\n const ins: string[] = d.inputEPCList ?? []\n const step = { inputs: ins, at: r.eventTime, tx: d.bizTransactionList?.[0]?.bizTransaction }\n for (const o of outs) {\n const list = madeBy.get(o) ?? []\n list.push(step)\n madeBy.set(o, list)\n }\n }\n\n /* ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ค โ ๋๋น ์ฐ์ , ์ง๋์จ ๊ฒ์ ๋ค์ ํ์ง ์๋๋ค(์ฌ์ดํดยท๊ณต์ ๋ถํ). */\n const items: any[] = [{ epc, itemRef: itemRefOf(epc), depth: 0 }]\n const edges: any[] = []\n const seen = new Set<string>([epc])\n let depthTruncated = false\n let frontier = [{ epc, depth: 0 }]\n while (frontier.length) {\n const next: typeof frontier = []\n for (const cur of frontier) {\n if (cur.depth >= depthCap) { depthTruncated = true; continue }\n for (const step of madeBy.get(cur.epc) ?? []) {\n for (const input of step.inputs) {\n edges.push({ from: cur.epc, to: input, at: step.at, tx: step.tx, depth: cur.depth + 1 })\n if (seen.has(input)) continue\n seen.add(input)\n items.push({ epc: input, itemRef: itemRefOf(input), depth: cur.depth + 1 })\n next.push({ epc: input, depth: cur.depth + 1 })\n }\n }\n }\n frontier = next\n }\n\n /*\n * **๊ฒน์ณ ๋ณธ๋ค.** ์ด ๊ฐ์ฒด์ ํ๋ชฉ์ด ์ด๋ ๋ ์ํผ์ ์ฐ์ถ์ด๋ฉด, ๊ทธ ๋ ์ํผ๊ฐ ์ ์ธํ ํฌ์
๊ณผ ์ค์ ๋ก\n * ์๋น๋ ๊ฒ์ ์์ฌ๋ณ๋ก ๋๋ํ ์ผ๋ค.\n *\n * ๊ฐ์ฒด(EPC)์ ์์ฌ ํค๋ฅผ ์๋ ๊ฒ์ `productionSpec.binding`(์์ฌ ํค โ GS1 ํ๋ชฉ ์ฐธ์กฐ)์ด๋ค.\n * ๋ฐ์ธ๋ฉ์ด ์์ผ๋ฉด **๋น๊ตํ์ง ์๋๋ค** โ ์ง์์ผ๋ก ์ด์ผ๋ฉด \"์ค๊ณ์ ๋ค๋ฅด๋ค\" ๋ ๊ฑฐ์ง ์ง๋จ์ด ๋์ค๊ณ ,\n * ๊ทธ๊ฑด ์๋ฌด ๋ง๋ ์ ํ๋ ๊ฒ๋ณด๋ค ๋์๋ค.\n */\n const spec: any = (inst.model as any)?.productionSpec\n const binding: Record<string, string> = spec?.binding ?? {}\n const refToMaterial = new Map(Object.entries(binding).map(([mat, ref]) => [String(ref), mat]))\n /*\n * โโ **ํ๋ฉด์ ๋๋ง๋๋ก ๋ฌป๋๋ค** (2026-08-23) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n *\n * ์๋์ ํฌ์ปค์ค ์๋ณ์๋ ํด๋์ค์ ๋๋ง๋๋ค(`net/class/product-M0000438`). ๋์ ํ์ ๊ฐ์ ์ ์ฒด\n * ์๋ณ์(`https://โฆ/class/product-M0000438`)์ด๋ฏ๋ก ๊ณง๋ฐ๋ก๋ ๋ง์ง ์๊ณ , ๊ทธ๋์ ใ์ ์ธ๋ ์์ฌ๊ฐ\n * ์๋๋๋คใ๊ฐ ๋ด๋ค โ ๊ทธ ํ๋ชฉ์ ๋์ ํ์ ์์๋ค.\n *\n * ๋๋ง๋๋ก๋ ์ฐพ๋ **ํ๋๋ฟ์ผ ๋๋ง** ์ธ์ ํ๋ค. ๋ ์ด์์ด ๊ฐ์ ๋๋ง๋๋ฅผ ๊ฐ์ง๋ฉด ์ด๋ ๊ฒ์ธ์ง ๋ชจ๋ฅด๋ฏ๋ก\n * ์๋ฌด ๋ง๋ ํ์ง ์๋๋ค โ ์ง์์ผ๋ก ์ด์ผ๋ฉด ๋จ์ ๋ ์ํผ์ ๊ฒฌ์ฃผ๊ฒ ๋๊ณ , ๊ทธ๊ฒ์ด ใ์ค๊ณ์ ๋ค๋ฅด๋คใ๋\n * ๊ฑฐ์ง ์ง๋จ์ด ๋๋ค.\n */\n const materialOf = (e: string) => resolveByDeclaration(itemRefOf(e), refToMaterial) ?? null\n\n const myMaterial = materialOf(epc)\n const recipes: any[] = spec?.definition?.recipes ?? []\n\n /*\n * โโ ใ๋ฌด์์ผ๋ก ๋ง๋ค์๋ใ๋ **์ ํ ์๋ค** (2026-09-05) โโโโโโโโโโโโโโโโโโโโโโโ\n *\n * ์์ ์๋ ์ด ์๋ฆฌ๊ฐ ์์ฌ๋ก ๋์ง์ด `recipes.find(...)` ๋ก **๋จผ์ ๊ฑธ๋ฆฌ๋ ํ๋**๋ฅผ ๊ณจ๋๋ค. ๋ฐฐ์ด\n * ์์๊ฐ ๋ต์ ์ ํ๋ค๋ ๋ป์ด๊ณ , ํ ์์ฌ์ ๋ ์ํผ๊ฐ ๋์ด๋ฉด ํ๋ฆฐ ๋ต์ด ํ์ ์ ์ฐฌ ์ผ๊ตด๋ก ๋์จ๋ค.\n * ์ค์ ๋ก ๊ทธ๋ฐ ์์ฌ๊ฐ ์๋ค โ `BOLT-M8` ์ `RCP-BOLT-STD` ยท `RCP-BOLT-FAST` ๋์ด๋ค.\n *\n * ๊ทธ๋ฐ๋ฐ ๋ต์ ์ด๋ฏธ ๊ธฐ๋ก๋์ด ์๋ค. ๋ง๋ค ๋ ์ ํด์ง๋ ์ฌ์ค์ด๊ณ ์ปค๋์ด ์ค๋์ ์ฃ๋๋ค\n * (`FlowOrder.recipeKey`). ๋ณํ ์ฌ๊ฑด์ ๊ทธ ์ค๋๋ฅผ ๊ฑฐ๋ ์๋ณ์๋ก ๊ฐ๋ฆฌํค๊ณ (`bizTransactionList`),\n * ์ด ํจ์๋ ๊ทธ ๊ฐ์ ์ด๋ฏธ `tx` ๋ก ๊บผ๋ด ๋๊ณ ๋ ์ฐ์ง ์์๋ค.\n *\n * ์ธ ์๋ฆฌ๊ฐ ๋ค ์์๊ณ ๋ง์ง๋ง ์ฐ๊ฒฐ๋ง ์์๋ค. ใ๊ฐ๋ฆด ์ ์๋คใ๊ฐ ์๋๋ผ **์ ์ฝ๊ณ ์์๋ค.**\n *\n * โโ ๊ท์น ์
โ ์ง์ํ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ค๋๊ฐ ๋งํ๋ค ๊ทธ๊ฒ์ ์ด๋ค. ๋ฒ์ ์ด ๋์ด๋ ์ด์ด๋ ์๊ด์๋ค\n * ์ค๋๊ฐ ๋ง ์ ํ๊ณ \n * ํ๋ณด๊ฐ ํ๋ ๊ทธ๊ฒ์ ์ด๋ค โ ๊ณ ๋ฅผ ๊ฒ์ด ์์ผ๋ฉด ์ง์์ด ์๋๋ค\n * ํ๋ณด๊ฐ ๋ ์ด์ **๋ตํ์ง ์๋๋ค.** ์ด๋ ๊ฒ์ธ์ง ๋ชจ๋ฅด๋ ์ฑ๋ก ๊ฒฌ์ฃผ๋ฉด ๊ฑฐ์ง ์ง๋จ์ด ๋๋ค\n *\n * ๋ง์ง๋ง ์ค์ด ์ด ํจ์๊ฐ ์๋ณ์ ๋์ฐพ๊ธฐ์ ์ด๋ฏธ ์ ์ฉํ๋ ๊ท์จ์ด๋ค(ใํ๋ณด๊ฐ ๋ ์ด์์ด๋ฉด ๋ตํ์ง\n * ์๋๋คใ). ๋ ์ค ์์์๋ง ์ ์งํค๊ณ ์์๋ค.\n */\n const candidates = myMaterial\n ? recipes.filter((r: any) => (r.outputs ?? []).some((o: any) => o.material === myMaterial))\n : []\n\n /* ์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ณํ์ด ๊ฐ๋ฆฌํค๋ ๊ฑฐ๋ โ ๊ทธ ์ค๋๊ฐ ๋ ์ํผ๋ฅผ ๋งํ๋ค. */\n const madeTx = (madeBy.get(epc) ?? []).map(s => s.tx).find(Boolean)\n const saidRecipeKey = madeTx ? await recipeKeyOfTransaction(domainId, instanceId, String(madeTx)) : undefined\n\n const chosen = chooseRecipe(recipes, candidates, saidRecipeKey)\n const recipe = chosen.recipe\n\n /*\n * โโ ใ๋ชจ๋ฅด๋ ๊ฐ์ฒดใ์ ใ๋์์ด ์๋ ๊ฐ์ฒดใ๋ ๋ค๋ฅธ ์ฌ์ค์ด๋ค (2026-08-23) โโโโโโ\n *\n * ํ๋ฉด์ด ใ์ด ๊ฐ์ฒด๋ ์ ์ธ๋ ์์ฌ๊ฐ ์๋๋๋ค(๋ผ์ธ ๋ด๋ถ์ ์ค๊ฐ ์ฐ๋ฌผ์ผ ์ ์์ต๋๋ค)ใ๋ผ๊ณ ๋งํ๋๋ฐ,\n * ๊ทธ ํ๋ชฉ์ ์๋ณธ์ ํ๋ชฉ ์ ์ธ์ **์ด๋ฆ๊น์ง ์์๋ค**(ใ๋๋๊ทธ๋ฆฐ๋น์คใ). ๋ฐ์ธ๋ฉ ํ๊ฐ ๊ทธ ํ๋ชฉ์ ๋ด์ง\n * ๋ชปํ ๊ฒ์ด๊ณ , ๊ทธ๊ฒ์ ใ์ค๊ฐ ์ฐ๋ฌผใ๊ณผ ์ ํ ๋ค๋ฅธ ์ด์ผ๊ธฐ๋ค โ ์ฌ์ฉ์๊ฐ ํ ์ผ๋ ๋ค๋ฅด๋ค(์๋ณธ์ ๋ณผ ์ผ์ด\n * ์๋๋ผ ๋์์ ๊ณ ์น ์ผ์ด๋ค).\n *\n * ๊ทธ๋์ ๊ฐ์ฒด๊ฐ ๊ฐ๋ฆฌํค๋ ํ๋ชฉ์ด **๋ชจ๋ธ์ ํ๋ชฉ ์ ์ธ์ ์๋์ง** ํจ๊ป ๋ณธ๋ค. ์ด๋ฆ์ ๊ทธ ์๋ฆฌ์ ์์ผ๋\n * ํจ๊ป ๋ธ๋ค(ํ๋ฉด์ด ์ฌ๋์๊ฒ ๋ฌด์์ ๋งํ๋์ง ์ ์ ์๊ฒ).\n */\n const definitions: any[] = (inst.model as any)?.materialDefinitions ?? []\n const defByRef = new Map(definitions.filter(d => d?.id).map(d => [String(d.id), d]))\n /* ์ ์๋ ๊ฐ์ ๋ฌธ์ผ๋ก ๋์ฐพ๋๋ค โ ๊ท์น ํ๋, ํ๋ณด๊ฐ ๋ ์ด์์ด๋ฉด ๋ตํ์ง ์๋๋ค. */\n const myRef = itemRefOf(epc)\n const myDef = resolveByDeclaration(myRef, defByRef)\n\n let conformance: any = null\n if (!Object.keys(binding).length) {\n conformance = { comparable: false, reason: 'no-binding' }\n } else if (!myMaterial && myDef) {\n /* ์๋ณธ์ ์ด ํ๋ชฉ์ ์๋ค โ ๊ฐ์ฒด๋ฅผ ์์ฌ์ ์๋ ๋์์ด ์์ด์ ๋น๊ตํ์ง ๋ชปํ๋ค. */\n conformance = {\n comparable: false,\n reason: 'item-known-not-bound',\n ...(typeof myDef.name === 'string' && myDef.name ? { itemName: myDef.name } : {})\n }\n } else if (!myMaterial) {\n conformance = { comparable: false, reason: 'item-not-bound' }\n } else if (chosen.basis === 'said-but-undeclared') {\n /* ์ค๋๋ ๋งํ๋๋ฐ ๊ทธ ๋ ์ํผ๊ฐ ๋ชจ๋ธ์ ์ ์ธ์ ์๋ค โ ์๋ณธ๊ณผ ์ ์ธ์ด ์ด๊ธ๋ ๊ฒ์ด์ง ๋ชจ๋ฅด๋ ๊ฒ์ด ์๋๋ค. */\n conformance = { comparable: false, reason: 'recipe-not-declared', recipe: saidRecipeKey }\n } else if (chosen.basis === 'ambiguous') {\n /* ์ง์ํ์ง ์๋๋ค โ ์ด๋ ๊ฒ์ผ๋ก ๋ง๋ค์๋์ง ๋งํด ์ฃผ๋ ์ฌ์ค์ด ์๋ค. ํ๋ณด๋ฅผ ๋ฐํ ์ฌ๋์ด ํ๋จํ๊ฒ ํ๋ค. */\n conformance = {\n comparable: false,\n reason: 'many-recipes-for-material',\n recipes: candidates.map((r: any) => r.key).sort()\n }\n } else if (!recipe) {\n conformance = { comparable: false, reason: 'no-recipe-for-material' }\n } else if (!(madeBy.get(epc) ?? []).length) {\n /*\n * โโ **์ ๋ณธ ๊ฒ์ ใ๋ค๋ฅด๋คใ๊ณ ํ์ง ์๋๋ค** (2026-09-18 ยท :3000 ํ๋ฉด์์ ํ์ธ) โโโโโโโโโ\n *\n * ์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ณํ์ด ์ ๋์ ํ๋๋ ์์ผ๋ฉด ํฌ์
์ ํ๋๋ ๊ด์ธกํ์ง ๋ชปํ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ\n * ์๋ ์
์ ๊ทธ๋๋ก ๋์ ๊ด์ธก์ ์ ๋ถ 0 ์ผ๋ก ์ ์๊ณ , ๋ ์ํผ๊ฐ ์๊ตฌํ ์์ฌ 23 ์ค์ด ์ ๋ถ\n * ใ์ ๋ง๋๋คใ๊ฐ ๋๋ค โ ํ๋ฉด์ ใ๋ ์ํผ์ ๋ค๋ฆ
๋๋คใ๋ฅผ ํ์ ์ ์ฐฌ ์ผ๊ตด๋ก ๊ทธ๋ ธ๋ค. ์ค์ ๋ก๋\n * ์๋ณธ์ด ๋ณํ์ ์์ง ์ ๋ณด๋์ ๋ฟ์ด๋ค(`mes-miratek` ์ ์นด๋ฉ๋ผ ๋กํธ๊ฐ ๊ทธ ๊ฒฝ์ฐ๋ค).\n *\n * ์ด ํ์ผ์ ๊ท์จ์ด ์ด๋ฏธ ๊ทธ๊ฒ์ ๋งํ๋ค โ ์ง์์ผ๋ก ์ด์ผ๋ฉด ใ์ค๊ณ์ ๋ค๋ฅด๋คใ๋ ๊ฑฐ์ง ์ง๋จ์ด\n * ๋๊ณ , ๊ทธ๊ฑด ์๋ฌด ๋ง๋ ์ ํ๋ ๊ฒ๋ณด๋ค ๋์๋ค. ๊ด์ธก์ด **์๋** ๊ฒ๋ ๊ฐ์ ๋ถ๋ฅ๋ค.\n */\n conformance = { comparable: false, reason: 'made-not-observed', recipe: recipe.key }\n } else {\n /*\n * ๊ด์ธก: **๋ฐ์ธ๋ฉ๋ ์์ฌ๊น์ง ๋ด๋ ค๊ฐ ์ผ๋ค** โ ์ค๊ฐ ์ฐ๋ฌผ(WIP)์ ํต๊ณผํ๋ค.\n *\n * ๋ค๋จ ๋ผ์ธ์์ ์์ ํ์ ์ง์ ํฌ์
์ ์์์ฌ๊ฐ ์๋๋ผ **WIP** ๋ค: ์์์ฌ๋ ์ฒซ ๊ณต์ ์์\n * ์๋น๋๊ณ ์์ ํ์ ๋ง์ง๋ง ๊ณต์ ์์ ๋์จ๋ค. ๊ทธ๋์ ์ง์ ํฌ์
๋ง ์ธ๋ฉด ๋ ์ํผ๊ฐ ์ ์ธํ ์์ฌ์\n * **์์ํ ์ ๋ง๋๋ค**(๊ฒ์ฌ๊ฐ ์ด๊ฒ์ ์ก์๋ค).\n *\n * WIP ์ ๋ผ์ฐํธ์ ๋ด๋ถ ์ฐ๋ฌผ์ด๊ณ ์ ์ธ๋ ์์ฌ๊ฐ ์๋๋ค โ ๋ ์ํผ๋ ์์ฌ๋ก ๋งํ๋ฏ๋ก ๋น๊ต๋\n * ์์ฌ๋ก ํด์ผ ํ๋ค. ๋ฐ์ธ๋ฉ์ ์์ผ๋ฉด ๊ฑฐ๊ธฐ์ ๋ฉ์ถ๊ณ , ์์ผ๋ฉด ๊ทธ ์๋ก ๊ณ์ ๋ฐ๋ผ๊ฐ๋ค.\n *\n * ๋ค๋ง **๋ค๋ฅธ ์์ ํ๊น์ง ๋์ด๊ฐ์ง ์๋๋ค**: ๋ฐ์ธ๋ฉ๋ ๊ฒ์ ๋ง๋๋ฉด ๋ฉ์ถ๋ฏ๋ก, ํ์์กฐ๋ฆฝ๋\n * ์์ฌ๋ก ์ ์ธ๋ผ ์์ผ๋ฉด ๊ทธ ์๋ฆฌ์์ ์ธ์ด์ง๋ค(๊ทธ ์๋๋ ๊ทธ ์์ฌ ์์ ์ ๋ ์ํผ๊ฐ ๋ณผ ์ผ์ด๋ค).\n */\n const observed = new Map<string, number>()\n let unbound = 0\n const parentsOf = (e: string) => edges.filter(x => x.from === e).map(x => x.to)\n const walked = new Set<string>([epc])\n let layer = parentsOf(epc)\n while (layer.length) {\n const deeper: string[] = []\n for (const e of layer) {\n if (walked.has(e)) continue\n walked.add(e)\n const mat = materialOf(e)\n if (mat) { observed.set(mat, (observed.get(mat) ?? 0) + 1); continue }\n const up = parentsOf(e)\n /* ๋ฐ์ธ๋ฉ์๋ ์๊ณ ๋ ์ฌ๋ผ๊ฐ ๊ณณ๋ ์๋ค โ ์ ๋ง ๋ชจ๋ฅด๋ ํฌ์
์ด๋ค(์๋ง ๋ธ๋ค). */\n if (!up.length) { unbound++; continue }\n deeper.push(...up)\n }\n layer = deeper\n }\n const declared = new Map<string, number>((recipe.inputs ?? []).map((i: any) => [i.material, i.qty ?? null]))\n const keys = [...new Set([...declared.keys(), ...observed.keys()])]\n conformance = {\n comparable: true,\n material: myMaterial,\n recipe: recipe.key,\n /* ๊ทธ ๋ ์ํผ๋ฅผ **์ด๋ป๊ฒ ์์๋** โ ํ๋ฉด์ด ใ๊ธฐ๋ก์ผ๋ก ์๋คใ์ ใํ๋๋ฟ์ด๋ผ ์๋คใ๋ฅผ ๊ตฌ๋ณํ ์ ์๊ฒ. */\n recipeBasis: chosen.basis,\n /* ์์ฌ๋ง๋ค ์ ์ธยท๊ด์ธก์ ๋๋ํ. ์ด๋ ํ์ชฝ์๋ง ์๋ ๊ฒ๋ ์ฌ์ค์ด๋ค(๋น ๋จ๋ฆฌ์ง ์๋๋ค). */\n lines: keys.map(m => ({\n material: m,\n declared: declared.has(m) ? declared.get(m) : null,\n observed: observed.get(m) ?? 0,\n matches: declared.get(m) === (observed.get(m) ?? 0)\n })),\n /* ๋ฐ์ธ๋ฉ์ ์๋ ํฌ์
โ ์ค๊ณ์ ์๋ ๊ฒ์ด ๋ค์ด๊ฐ์ ์๋, ๋ฐ์ธ๋ฉ์ด ๋ ์ ์ธ๋์ ์๋ ์๋ค.\n ์ด๋ ์ชฝ์ธ์ง ์ฐ๋ฆฌ๋ ๋ชจ๋ฅด๋ฏ๋ก **์๋ง ๋ธ๋ค.** */\n unboundInputs: unbound\n }\n }\n\n return {\n instanceId,\n epc,\n itemRef: itemRefOf(epc),\n material: myMaterial,\n items,\n edges,\n conformance,\n /* ๋ฌด์์ ๊ทผ๊ฑฐ๋ก ๋ตํ๋ โ ์ฐฝ์ ๋๊ฒจ ๋๊ฒผ์ผ๋ฉด ๊ณ๋ณด๊ฐ ์ค์ ๋ณด๋ค ์๊ฒ ๋ณด์ธ๋ค. */\n basis: { source: 'journal', transformationsRead: rows.length, truncated, depthTruncated, depthCap, windowCap }\n }\n }\n}\n\n/**\n * ๊ทธ ๊ฑฐ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ค๋๊ฐ **์ด๋ ๋ ์ํผ๋ก** ๋ง๋ค์๋ค๊ณ ๋งํ๋๊ฐ.\n *\n * โโ ์ ๊ฑฐ๋ ์๋ณ์๋ก ๋ฌป๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * EPCIS ๋ณํ ์ฌ๊ฑด์๋ ๋ ์ํผ๊ฐ ์๋ค โ ํ์ค์ ๊ทธ ์๋ฆฌ๊ฐ ์๊ณ , ๋์ ์์ฐ ์ค๋๋ฅผ ๊ฑฐ๋๋ก ๊ฐ๋ฆฌํจ๋ค\n * (`bizTransactionList`). ์ค๋ ์ฌ๊ฑด์ `recipeKey` ์ ๊ทธ ๊ฑฐ๋ ์๋ณ์๋ฅผ **๋ ๋ค** ๋ ๋ค. ๊ทธ๋์ ์ด\n * ๋ ์นธ์ด EPCIS ์์ ์ค๋๋ก ๊ฑด๋๊ฐ๋ ๋ค๋ฆฌ๋ค(ยง`twin-event-keys.ts`).\n *\n * โโ ์์ธ์ ํ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `ix_twin_event_9 (domain, instanceId, bizTransaction)` ๋ก ์ขํ๋ค. ์ด ์นธ์ด ์๋ ๋๋ payload ๋ฅผ\n * ๋ฌธ์์ด๋ก ํ์ด์ผ ํ๊ณ 32๋ง ํ์ 3๋ถ์ด ๊ฑธ๋ ธ๋ค โ ํ๋ฉด์ด ๊ธฐ๋ค๋ฆด ๋น์ฉ์ด ์๋๋ค.\n *\n * โโ ๋ชป ์ฐพ์ผ๋ฉด **๋ตํ์ง ์๋๋ค** โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ํ์๋ ์ด ์นธ์ด ๋น์ด ์๋ค(๊ณผ๊ฑฐ ํ์ ์ฑ์ฐ์ง ์๋๋ค๋ ๊ท์จ). ๊ทธ๋๋ `undefined` ๋ฅผ ๋ด๊ณ , ๋ถ๋ฅด๋\n * ์ชฝ์ด ํ๋ณด ์๋ก ํ๋จํ๋ค โ ์ฌ๊ธฐ์ ์๋ฌด๊ฑฐ๋ ๊ณ ๋ฅด๋ฉด ์์ ๊ณผ ๊ฐ์ ๊ฒฐํจ์ด ๋๋ค.\n */\nasync function recipeKeyOfTransaction(\n domainId: string,\n instanceId: string,\n bizTransaction: string\n): Promise<string | undefined> {\n const row = await getRepository(TwinEvent)\n .createQueryBuilder('e')\n .where('e.domain = :domainId', { domainId })\n .andWhere('e.instanceId = :instanceId', { instanceId })\n .andWhere('e.bizTransaction = :tx', { tx: bizTransaction })\n .andWhere('e.eventType = :eventType', { eventType: 'order.status' })\n /* ์ด๋ ์ค์ด๋ ๊ฐ์ ์ค๋๋ฅผ ๋งํ๋ฏ๋ก ํ๋๋ฉด ๋๋ค โ ๊ฐ์ฅ ์ด๋ฅธ ๊ฒ์ด ๊ทธ ์ค๋๊ฐ ์ ์๊ฐ์ด๋ค. */\n .orderBy('e.eventTime', 'ASC')\n .limit(1)\n .getOne()\n\n const said = (row?.payload as any)?.data?.recipeKey\n return typeof said === 'string' && said ? said : undefined\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-location.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-location.ts"],"names":[],"mappings":"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","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 { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\n\n/*\n * TwinLocation โ ์ด ํธ์์ด ๋ฐ์ํ๋ **์๋ฆฌ**. ISA-95 `OperationalLocation` / EPCIS `SGLN`.\n *\n * โโ ์ ํ
์ด๋ธ์ธ๊ฐ (ADR-0032, 2026-08-08) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ง๊ธ๊น์ง ์๋ฆฌ๋ `TwinInstance.model` JSON ์์ ์์๋ค. ๊ทธ๋์ โด ๋ถ๋ถ ๊ฐฑ์ ์ด ์์ด ์ฐ๋ ์ชฝ์ด\n * ๋น ๋จ๋ฆฌ๋ฉด ์ญ์ ์๊ณ โต ๋ผ์ฐํธโ๊ณต์ ยท์ค๋นโ์๋ฆฌ ์ฐธ์กฐ์ FK ๋ฅผ ๋ชป ๊ฑธ์ด **๋์ด์ง ์ฐธ์กฐ๋ฅผ ํ๋ฉด์ด ๋ณด๊ณ ๋ง**\n * ํ๊ณ โถ 5๊ฐ ๋๋ผ์ด๋ฒ์์ JSON ์ง์๊ฐ ์ด์๋์ง ์์ \"์ค๋น ๋ช ๋?\" ์กฐ์ฐจ ์๋ฒ๊ฐ ๋ชป ๋ตํ๋ค.\n *\n * โโ ์ด๊ฒ์ **์๋ณธ์์ ์จ ์บ์**๋ค (ADR-0032-D) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ๋ง๋ ์ํฐํฐ๋ ์ ๋ณธ์ฒ๋ผ **์๊ฒผ๋ค.** ๊ทธ๋์ ์์ ์นจ๋ฒ์ ๋ถ๋ฅธ๋ค โ ๋๊ตฐ๊ฐ \"์ฌ๊ธฐ์๋ง ์๋ ์ปฌ๋ผ\" ์\n * ๋ํ๊ณ , ์ฐ๊ธฐ ๊ฒฝ๋ก๋ฅผ ์ด๊ณ , ๊ทธ๋ฌ๋ฉด `ADR-0028`(ํธ์์ ๋ง๋ค์ง ์๋๋ค)์ด ๋ฌด๋์ง๋ค.\n *\n * ๊ท์จ ์
์ ๊ตฌ์กฐ๋ก ๋ฐ๋๋ค:\n * ยท `sourceRef`ยท`ingestedAt` ํ์ โ ์ด๋์ ์ธ์ ์๋์ง ์๋ ํ์ ๋ง๋ค ์ ์๋ค\n * ยท ์ฐ๊ธฐ ๊ฒฝ๋ก๋ **์ธ์ ์คํธ ํ๋**\n * ยท **์ ๋ถ ์ง์ฐ๊ณ ๋ค์ ๋ง๋ค ์ ์๋ค** โ ์๋ณธ์ด ๋ผ ์ ์๋ ๊ฐ์ ์ฌ๊ธฐ ๋์ง ์๋๋ค\n */\n@Entity({ name: 'twin_locations' })\n@Index('ix_twin_location_0', (e: TwinLocation) => [e.domain, e.instance, e.locationId], { unique: true })\n/* ํ์
์ผ๋ก ์ขํ ๋ณด๊ธฐ(์ธ์คํ์
์ \"์ด ํ์
์ ์๋ฆฌ๋ค\") โ ๊ณต์ ์ด ํ์
์ ๊ฐ๋ฆฌํค๋ฏ๋ก ์ฆ์ ์ง์๋ค. */\n@Index('ix_twin_location_1', (e: TwinLocation) => [e.domain, e.instance, e.type])\n@ObjectType({ description: 'A location reflected into the twin (ISA-95 OperationalLocation / EPCIS SGLN). Projected from the source; never authored here.' })\nexport class TwinLocation {\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: TwinLocation) => e.domain)\n domainId?: string\n\n /* ์ด ์๋ฆฌ๊ฐ ์ํ ํธ์. ํธ์์ด ์ฌ๋ผ์ง๋ฉด ๊ทธ ๊ตฌ์กฐ๋ ํจ๊ป ์ฌ๋ผ์ง๋ค(ํฌ์์ด๋ฏ๋ก ์ฌ์์ฑ ๊ฐ๋ฅ). */\n @ManyToOne(type => TwinInstance, { onDelete: 'CASCADE' })\n @Field(type => TwinInstance, { nullable: true, description: 'Owning twin instance.' })\n instance?: TwinInstance\n\n @RelationId((e: TwinLocation) => e.instance)\n instanceRowId?: string\n\n /** ์ปค๋ ๊ณ์ฝ์ `TwinModelDef.locations[].id` **๊ทธ๋๋ก**. ๋ฐ์ธ๋ฉ์ id===id ๋ค(ADR-0014). */\n @Column()\n @Field({ description: 'Location id as declared by the source (kernel TwinModelDef.locations[].id).' })\n locationId: string\n\n /**\n * **์ฌ๋์ด ๋ถ๋ฅด๋ ์ด๋ฆ** โ ํ๋ ์์ํฌ ์ํฐํฐ ๊ท์ฝ์ `name`/`description`.\n *\n * โโ ์ ์ด๊ฒ์ด ๋น ์ ธ ์์๊ณ , ๋ฌด์์ด ๋ง๊ฐ์ก๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํฌ์์ด ๋ง์คํฐ์ `name` ์ ๋ฒ๋ฆฌ๊ณ ์์๋ค. ๊ทธ๋์ ํ์๋ id ๋ง ๋จ๊ณ , ํ๋ฉด์ ์ด๋ฆ์ ๋ง๋ค ์ฌ๋ฃ๊ฐ\n * ์์ด `cut-station` ์ ๊ทธ๋๋ก ์ฐ์๋ค โ ๊ทธ ๊ฒฐํจ์ด ๋ชฉ๋กยทํยท๊ด๊ณ ๊ทธ๋ฆผ๋ง๋ค ๋ฐ๋ก ๋ํ๋์ ํ๋ฉด์\n * ํ๋์ฉ ๊ณ ์น๊ฒ ๋ง๋ค์๋ค. ํ๋ฉด์ ๋ฌธ์ ๊ฐ ์๋๋ผ **ํ์ ์ด๋ฆ์ด ์๋ ๋ฌธ์ **๋ค.\n *\n * ์๋ณธ์ด ์ด๋ฆ์ ๋งํ์ง ์์ผ๋ฉด ๋น์ด๋ค(id ๋ฅผ ์ด๋ฆ์ผ๋ก ๋ฒ ๋ผ์ง ์๋๋ค โ ๊ทธ๋ฌ๋ฉด \"์ด๋ฆ์ด ์๋ค\" ๋\n * ๊ฑฐ์ง์ด ๋๊ณ , ํ๋ฉด์ด ์ด๋ฆ ์์์ ์์๋ณผ ์ ์๊ฒ ๋๋ค).\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Human name as declared by the source. Empty when the source does not name it (never copied from the id).' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Longer description when the source provides one.' })\n description?: string\n\n /**\n * ์ปค๋ ์นดํ๋ก๊ทธ์ ์๋ฆฌ ํ์
ํค(`storage`ยท`dock`ยท`yard-slot`โฆ).\n *\n * **FK ๋ฅผ ๊ฑธ์ง ์๋๋ค** โ ํ์
์นดํ๋ก๊ทธ๋ ์ปค๋์ด SSOT ์ด๊ณ (ADR-0018) DB ๋ก ๋ด๋ฆฌ๋ฉด\n * **์ปค๋ ์ดํ์ ์ฌ๋ณธ**์ด ์๊ธด๋ค. ๋ฌธ์์ด + ๋ถํ
์ ๊ฒ์ฆ์ด ๋ง๋ค(ADR-0032-F).\n */\n @Column()\n @Field({ description: 'Location type key from the kernel catalog (not an FK โ the catalog is the kernel SSOT).' })\n type: string\n\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'Declared capacity. Absent when the source does not say.' })\n capacity?: number\n\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'How many things can be worked on here at once, when the source declares it.' })\n parallelism?: number\n\n /**\n * ์ํ ๊ตฌ์ญ โ **์ค์ FK**.\n *\n * ์ปค๋ ๊ณ์ฝ์์๋ `locations[].parentId` ๊ฐ model ์์ ๋์์ด ์๋ ์ฐธ์กฐ์๋ค(๋ง์คํฐ์์ ๊ตฌ์ญ๋\n * ์๋ฆฌ์ ํ ๋ชฉ๋ก์ด์๋ค๊ฐ ์ธ์ ์คํธ๊ฐ ๊ฐ๋ผ `TwinArea` ๋ก ๋ณด๋ด๊ธฐ ๋๋ฌธ). ์ปค๋์ ๊ทธ๊ฒ์\n * `external: 'space.area'` ๋ก ์ ์ธํ๊ณ , **ํธ์คํธ์์๋ ํ๋ฒํ FK ๊ฐ ๋๋ค.**\n */\n @ManyToOne(type => TwinArea, { nullable: true, onDelete: 'SET NULL' })\n @Field(type => TwinArea, { nullable: true, description: 'Logical area this location belongs to.' })\n area?: TwinArea\n\n @RelationId((e: TwinLocation) => e.area)\n areaRowId?: string\n\n /** GS1 ์๋ณ์(SGLN ๋ฑ) โ ์๋ณธ์ด ์ฃผ๋ฉด ์ฃ๋๋ค. */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'GS1 identifier supplied by the source (e.g. SGLN).' })\n gs1Id?: string\n\n /**\n * ์ด ์๋ฆฌ์ **์ ์ธ ์์ฑ** โ ๊ณ์ฝ์ ๋ ฅยท์๊ธ ๋จ๊ฐ์ฒ๋ผ ์๋ฆฌ์ ์นํ๋ ์(ISA-95 Property).\n *\n * โโ ์ ๋ฆ๊ฒ ์๊ฒผ๋ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ค๋น ํ์๋ ์ด ์นธ์ด ์์๋๋ฐ ์๋ฆฌ ํ์๋ ์์๋ค. ๊ทธ๋์ ์์ ์ง์ ์ ๊ณ์ฝ์ ๋ ฅยท์๊ธ์ ๋ฃ์ด๋ **ํญ๋ชฉ\n * ํจ๋์ ใ์๋ณธ์ด ๋งํ ๊ฐใ์ ๊ทธ ์ค์ด ์์ ์์๋ค** โ ์ฌ์ฉ์๋ ๊ฐ์ ๋ฃ๊ณ ๋ ํ๋ฉด์์ ์ฐพ์ ์ ์์๊ณ ,\n * ใ์ด ๊ฐ์ด ๋ฌด์์ ๋ฐ๊พธ๋ใ๋ ๋ฌธ์ฅ๋ ๋ถ์ ์๋ฆฌ๊ฐ ์์๋ค(๋ค์ด์จ ๊ฒ์ด ์๋ ๋๋ฝ).\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Properties declared on this location (ISA-95 Property: value + dataType + unit of measure). Carries locally-declared numbers too, with source: local.' })\n properties?: any\n\n /* โโ ์บ์๋ผ๋ ์ฌ์ค์ ๊ตฌ์กฐ๋ก (ADR-0032-D) โโ */\n @Column()\n @Field({ description: 'Which reference (source system) this row came from. Required โ a row with no origin cannot exist.' })\n sourceRef: string\n\n /*\n * **ํ์
์ด๋ฆ์ ์ ์ง ์๋๋ค** (2026-08-19 Postgres ๋ถํ
์คํจ๋ก ๊ณ ์นจ).\n *\n * `datetime` ์ sqliteยทMySQL ์ ์ด๋ฆ์ด๊ณ Postgres ๋ `timestamp` ๋ง ์๋ค โ ๊ฑฐ๊พธ๋ก `timestamp` ๋\n * sqlite ๊ฐ ๋ชจ๋ฅธ๋ค. **๋ค์ฏ ๋๋ผ์ด๋ฒ์ ๋ค ํตํ๋ ์ด๋ฆ์ด ์๋ค.** ๊ทธ๋์ ์ด๋ฆ ๊ณ ๋ฅด๋ ์ผ์ TypeORM ์\n * ๋งก๊ธด๋ค(`emitDecoratorMetadata` ๊ฐ ์ผ์ ธ ์์ด `Date` ์์ ๋๋ผ์ด๋ฒ๋ณ ํ์
์ ๊ณ ๋ฅธ๋ค).\n */\n @Column()\n @Field({ description: 'When this row was projected from the source.' })\n ingestedAt: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-model-item-query.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-model-item-query.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReadBasis } from '@operato/ops-contract'\n\nimport { twinWarn } from '../../engine/log.js'\nimport { Arg, Ctx, Int, Query, Resolver, UseMiddleware } from 'type-graphql'\n\nimport { ScalarObject, SpeakRefusals, getRepository } from '@things-factory/shell'\n\nimport { itemRefOf } from './item-ref.js'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { unwrapState } from '../../engine/warm-start.js'\nimport { propertyEffectsOf } from '../../engine/property-effects.js'\n/* ์ถ์ด ์ฌ๋ ์๋ฆฌ๋ฅผ ์ฝ๋ **ํ ๊ณณ** โ ์นด๋(`twin-model-query`)์ ๊ฐ์ ๊ท์น์ ์ด๋ค. */\nimport { axisValueOf } from '@things-factory/headless-twin/dist-shared/axis-read.js'\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinLocation } from './twin-location.js'\nimport { TwinEquipment } from './twin-equipment.js'\nimport { TwinOperation } from './twin-operation.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\nimport { at, idOf, nameIndex, namesFor } from './name-index.js'\n\n/* ์ปค๋ ๋ฐํ์ ๋ก๋ โ ์ถยท๊ด๊ณยท์์ฑ ์ ์ธ์ SSOT. ์ด ํ์ผ์ ๋๋ฉ์ธ ๋ชจ์์ ์์ง ์๋๋ค. */\nconst { TWIN_AXES, TWIN_RELATIONS, axisInfo, axisSource, documentPath, isCacheableTense, relationsFrom, relationsTo, propertiesOf, splitRelationIds, tenseOf } =\n require('@operato/ops-contract')\n\n/**\n * ๋ชฉ๋ก์ ๋ต โ **๊ทผ๊ฑฐ๋ ๊ณ์ฝ์ด ๋ซ์ ๋ ๋ค์ฏ ์ค ํ๋๋ค**(`READ_BASIS`).\n *\n * 2026-09-18 ํ์ (ADR-0075 ๊ฒฐ์ 3 ์ ์ฝ๋์ ๋์ด ๋ณธ ๊ฒฐ๊ณผ): ์ด ๋ฌธ์ด `'rows-scanned'` ๋ฅผ ๋ด๊ณ ์์๋ค.\n * ๊ทธ๊ฒ์ ์ถ์ฒ๊ฐ ์๋๋ผ **์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์
๋**์ด๊ณ , ๋ชฉ๋ก ์๋น์๊ฐ ๊ทผ๊ฑฐ๋ก ๊ฐ๋๋ฅผ ๋๋ ๋ ๊ณ์ฝ์ ์๋\n * ๊ฐ์ ๋ง๋๊ฒ ๋๋ค. ์ถ์ฒ๋ `rows` ์ด๊ณ , ํ์ด ๊ฑธ๋ ๋ค๋ ์ฌ์ค์ `scanned` ยท `truncated` ๊ฐ ๋งํ๋ค.\n * ์ฌ๊ธฐ์ ์นธ์ ๋ฌถ์ด ๋๋ฉด ๊ณ์ฝ ๋ฐ์ ๊ฐ์ด ๋ค์ ์๊ธธ ๋ ํ์
๊ฒ์ฌ๊ฐ ์ก๋๋ค.\n */\ntype AxisListAnswer = {\n axis: string\n label: string\n basis: ReadBasis\n total: number | null\n offset: number\n /** ํ์ด ์ผ ๊ฒฝ์ฐ์๋ง โ ๋ช ์ค์ ์ฝ์๋, ์ํ์์ ์๋ ธ๋. */\n scanned?: number\n truncated?: boolean\n [key: string]: unknown\n}\nimport { externalIncoming, resolveExternal } from './external-resolver.js'\n\n/**\n * ์ถ โ ๊ทธ ์ถ์ด ์ด๋ฏธ **ํ์ผ๋ก ์ฎ๊ฒจ์ก๋**, ๊ทธ๋ฆฌ๊ณ ํ์ ์ด๋ ์ปฌ๋ผ์ด id ์ธ๊ฐ.\n *\n * ์ฎ๊ฒจ์ง ์ถ์ **DB ๊ฐ ํ์ด์งํ๊ณ ์ผ๋ค.** ์์ง์ธ ์ถ์ ๋ฌธ์ ๋ฐฐ์ด์ ์ฝ์ด์ผ ํ๊ณ , ๊ทธ ์ฐจ์ด๋ฅผ ์๋ต์ด\n * `basis` ๋ก ๋ฐํ๋ค โ ๋ฐํ์ง ์์ผ๋ฉด \"์ด ์ถ์ ๊ฒ์์ด ๋๋๋ฐ ์ ์ถ์ ์ ๋๋ฆฐ๊ฐ\" ๋ฅผ ์๋ฌด๋ ์ค๋ช
ํ ์ ์๋ค.\n */\nconst ROW_BACKED: Record<string, { entity: any; idColumn: string; order: any }> = {\n locations: { entity: TwinLocation, idColumn: 'locationId', order: { locationId: 'ASC' } },\n equipment: { entity: TwinEquipment, idColumn: 'equipmentId', order: { equipmentId: 'ASC' } },\n operations: { entity: TwinOperation, idColumn: 'operationKey', order: { seq: 'ASC' } }\n}\n\n/*\n * `productionSpec.binding` ์ ํค๊ฐ ์ฌ๋ ์ถ โ ์์ฌ๊ฐ ๋๋ก ๊ฐ๋ ค ์๋ค.\n *\n * materials productionSpec.definition.materials ๋ ์ํผ์ ํฌ์
์์ฌ\n * materialDefinitions materialDefinitions ๋ง์คํฐ ํ๋ชฉ ๋ชฉ๋ก\n *\n * ์์ ์๋ `materials` ํ๋๋ง ๋ดค๋ค. ์ปค๋ฅํฐ์ ๋ฐ๋ผ `binding` ํค๊ฐ ์ด๋ ์ถ์ id ์ธ์ง ๋ฌ๋ผ์, MES ์ฐ๊ฒฐ\n * ๋์ ํ๋ชฉ์ด ์๊ธฐ GS1 ์ฐธ์กฐ๋ฅผ ํ ๊ฑด๋ ๋ตํ์ง ๋ชปํ๋ค. ์ค๋ฅ๋ ์ ๋๊ณ ์นธ์ด ๋น์ด์ ๋์จ๋ค.\n *\n * ์ค์ธก(2026-09-06, ์ธํฐ๊ทธ๋ ์ด์
๋ ์ธ์ด ์ฐพ์):\n *\n * ํธ์ binding def.materials ๋ง์ materialDefinitions ๋ง์\n * mes-miratek 106 0 106\n * mes-line-a 21 0 21\n * operato-chef-v1-pocheon 2789 1789 0\n * rosarito-mes 20 20 0\n *\n * **๋ ์ถ์ด ๋์์ ๋ง๋ ํธ์์ ์๋ค**(์์ชฝ id ์ ๋ค ์์ผ๋ฉด์ binding ํค์ธ ๊ฒ 0๊ฐ). ๊ทธ๋์ ๋ ์ถ์\n * ๋ค ๊ฑธ์ด๋ ์ด๋ ์ชฝ์ ๋ถ์ผ์ง ๋ชจํธํด์ง์ง ์๋๋ค. ์กฐํ๊ฐ ํ์ ํ๋ค โ `binding[id]` ๋ ํค๊ฐ ์๋ ์ถ์์\n * ๊ทธ๋ฅ ์๋ค.\n *\n * ๋ ์ถ์ ํ ์ด๋ฆ์ผ๋ก ํฉ์น์ง ์๋๋ค. ๋ ์ํผ ํฌ์
์์ฌ์ ๋ง์คํฐ ํ๋ชฉ์ ์๋ก ๋ค๋ฅธ ๊ฒ์ด๊ณ , ํฉ์น๋ฉด\n * ๋ ๋ค ์๋ ํธ์(chef)์์ ์ด๋ ์ชฝ ๋ชฉ๋ก์ธ์ง ์ ์ ์๊ฒ ๋๋ค.\n */\nconst BINDING_AXES = new Set(['materials', 'materialDefinitions'])\n\n\n/** ๊ฒ์ โ ํญ๋ชฉ์ ๊ฐ ์ด๋๋ ๊ฑธ๋ฆฌ๋ฉด ๋ง๋ ๊ฒ์ผ๋ก ๋ณธ๋ค. ์ถ๋ง๋ค ๊ฒ์ ์ปฌ๋ผ์ ์ ํด ๋๋ฉด ์ถ์ด ๋ ๋๋ง๋ค ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์ผ ํ๋ค. */\nfunction matches(o: any, q: string): boolean {\n if (!q) return true\n const needle = q.toLowerCase()\n const walk = (v: any, depth: number): boolean => {\n if (v == null || depth > 3) return false\n if (typeof v === 'string' || typeof v === 'number') return String(v).toLowerCase().includes(needle)\n if (Array.isArray(v)) return v.some(x => walk(x, depth + 1))\n if (typeof v === 'object') return Object.values(v).some(x => walk(x, depth + 1))\n return false\n }\n return walk(o, 0)\n}\n\n/**\n * ํญ๋ชฉ ์กฐํ โ **๊ฐ๋
์์ ๋ชฉ๋ก**(โข)๊ณผ **ํญ๋ชฉ ํ๋์ ์์ธ**(โฃ).\n *\n * โโ ์ด ํ์ผ์ด ๋๋ฉ์ธ์ ์์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ด๋ ์ถ์ด ์๊ณ ๋ฌด์์ ๊ฐ๋ฆฌํค๋์ง๋ **์ปค๋ ์นดํ๋ก๊ทธ๊ฐ ์ ์ธ**ํ๋ค(`TWIN_AXES`ยท`TWIN_RELATIONS`).\n * ๊ทธ๋์ ์ผ๋์ ๋ํฌ๋์ด๋ ์๋์ง์ ๊ณ๋๊ธฐ๊ฐ ๋์ด๋ ์ฌ๊ธฐ ์๋ ๊ฒ์ด ์๋ค(ADR-0031). ์ด ํ์ผ์\n * ๋๋ฉ์ธ ์ด๋ฆ์ด ํ ๋ฒ๋ ๋์ค์ง ์๋ ๊ฒ์ด ๊ทธ ์ฆ๊ฑฐ๋ค.\n *\n * โโ ์๋ฆฌ์ง ์๊ณ ์๋ฅด์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ชฉ๋ก์ ํญ์ **์ด ๊ฑด์**์ ํจ๊ป ์จ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์
๋์ง(`basis`)๋ฅผ ๋ฐํ๋ค โ ํ์ด๋ฉด DB ๊ฐ\n * ํ์ด์งํ๊ณ , ๋ฌธ์๋ฉด ์๋ฒ๊ฐ ๋ฌธ์๋ฅผ ํต์งธ๋ก ์ฝ์ด ์๋ผ ๋๋ค. ํ์๋ ๊ท๋ชจ์์ ํ๊ณ๊ฐ ๋๋ฏ๋ก ๊ทธ ์ฌ์ค์ด\n * ํ๋ฉด์ ๋๋ฌ๋์ผ ์ด์ฃผ ์๋ ฅ์ด ์ด์ ์๋ค.\n */\n@Resolver()\n@UseMiddleware(SpeakRefusals)\nexport class TwinModelItemQuery {\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'Page through the items of one standard concept in a twin. Always returns the total and how it was counted (rows = the database paged it, document = the server read the whole document and sliced).'\n })\n async twinModelEntities(\n @Arg('instanceId') instanceId: string,\n @Arg('axis') axis: string,\n @Ctx() context: ResolverContext,\n @Arg('search', { nullable: true }) search?: string,\n @Arg('offset', type => Int, { nullable: true }) offset?: number,\n @Arg('limit', type => Int, { nullable: true }) limit?: number,\n /**\n * ์ด๋ ์๊ฐ์ ์ฌ์ค์ธ๊ฐ โ **๊ด์ธก ์ถ์๋ง ๋ป์ด ์๋ค.**\n *\n * ์ ์ธ ์ถ์ ์๊ฐ์ถ์ด ์๋ค(๊ทธ ์์ ์ ์ ์ธ์ ๊ตฌ์กฐ ๋ฆฌ๋น์ ์ด ๋ตํ๋ค). ๊ทธ๋์ ๋ฌธ์ ์ถ์ ์ด ๊ฐ์ ์ฃผ๋ฉด\n * ์ฐ์ง ์๋๋ค โ ๋ฌด์ํ๋ค๋ ์ฌ์ค์ ์๋ต์ `basis` ๊ฐ ๋งํ๋ค(`document`).\n */\n @Arg('untilTime', { nullable: true }) untilTime?: string\n ): Promise<any | null> {\n const domainId = context.state.domain.id\n const info = axisInfo(axis)\n /* ๋ชจ๋ฅด๋ ์ถ์ **๊ฑฐ์ ํ๋ค.** ๋น ๋ชฉ๋ก์ผ๋ก ๋ตํ๋ฉด \"์ด ๊ฐ๋
์ ๋น์ด ์๋ค\" ๋ก ์ฝํ๊ณ , ์คํ ํ๋๊ฐ\n \"์ฐ๋ฆฌ ํธ์์๋ ๊ทธ๊ฒ ์๋ค\" ๋ ๊ฒฐ๋ก ์ผ๋ก ๊ตณ๋๋ค. */\n if (!info) throw new Error(`unknown concept axis: \"${axis}\" โ the kernel catalog does not declare it`)\n\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return null\n\n const take = Math.min(Math.max(limit ?? 50, 1), 200)\n const skip = Math.max(offset ?? 0, 0)\n const q = (search ?? '').trim()\n /* ์๊ฐ ์ปค์๋ ์๊ฐ์ถ์ ๊ฐ์ง ์ถ๋ง ์ด๋ค(`historical`) โ ์ ์ธ ์ถ์์๋ ๋ป์ด ์๋ค. */\n const at_ = axisInfo(axis)?.historical ? untilTime || null : null\n const row = ROW_BACKED[axis]\n\n if (row && !q) {\n /* ๊ฒ์์ด๊ฐ ์์ผ๋ฉด **DB ๊ฐ ํ์ด์งํ๋ค** โ ์ด๊ฒ์ด ๊ท๋ชจ์์ ์ ์ผํ๊ฒ ์ฑ๋ฆฝํ๋ ๊ธธ์ด๋ค. */\n const repo = getRepository(row.entity)\n const where = { domain: { id: domainId } as any, instance: { id: inst.id } as any }\n const [rows, total] = await repo.findAndCount({ where, order: row.order, skip, take })\n const answer: AxisListAnswer = {\n axis,\n label: info.label,\n basis: 'rows',\n total,\n offset: skip,\n /* ๋ชฉ๋ก๋ ๋ฑ๊ธ ์ด๋ฆ์ ์ด๋ค โ ๋ชฉ๋ก ์นธ์ `assembler-op` ์ด ๊ทธ๋๋ก ์๋ฉด ๋ชฉ๋ก์ด ์ ์ผ์ ๋ชป ํ๋ค. */\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n items: rows.map((r: any) => this.rowItem(axis, r))\n }\n return answer\n }\n\n if (row && q) {\n /*\n * ๊ฒ์์ ์์ง DB ๋ก ๋ด๋ฆฌ์ง ์์๋ค. **๊ทธ ์ฌ์ค์ ๋ฐํ๋ค** โ ํ๋ด๋ก ๋ฎ์ผ๋ฉด ๊ท๋ชจ๊ฐ ์ค๋ ๋ ๊น์ง\n * ์๋ฌด๋ ์ด ํ๊ณ๋ฅผ ๋ชจ๋ฅธ๋ค. ํ๋ ๊ฑด์๋ฅผ ์ํ์ผ๋ก ๋ง๊ณ , ์ํ์ ๋ฟ์์ผ๋ฉด ์๋ ธ๋ค๊ณ ๋งํ๋ค\n * (์๋ฆฌ์ง ์๊ณ ์๋ฅด์ง ์๋๋ค).\n *\n * ๋งํ๋ ์๋ฆฌ๋ `scanned` ยท `truncated` ๋ค. ๊ทผ๊ฑฐ(`basis`)๋ ๊ทธ๋๋ก `rows` ์ด๊ณ โ ๊ฐ์ด ์ด๋์\n * ์๋์ง๋ ํ์๋ DB ๊ฐ ๊ณจ๋๋ ๊ฐ์ ํ์ด๋ค โ ๊ณ์ฝ์ด ๋ซ์ ๋ ๋ค์ฏ ๋ฐ์ผ๋ก ๋๊ฐ์ง ์๋๋ค.\n */\n const SCAN_MAX = 5000\n const repo = getRepository(row.entity)\n const where = { domain: { id: domainId } as any, instance: { id: inst.id } as any }\n const rows = await repo.find({ where, order: row.order, take: SCAN_MAX })\n const hit = rows.filter((r: any) => matches(this.rowItem(axis, r), q))\n const answer: AxisListAnswer = {\n axis,\n label: info.label,\n basis: 'rows',\n total: hit.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n scanned: rows.length,\n truncated: rows.length >= SCAN_MAX,\n ...(() => {\n const items = hit.slice(skip, skip + take).map((r: any) => this.rowItem(axis, r))\n return { items, names: namesFor(items, nameIndex(inst.model ?? {})) }\n })()\n }\n return answer\n }\n\n /*\n * **์ ์ธ์ด ์๋ ์ถ** โ ์ผ์ ยท์ค์ (ISA-95 Part 4). ์ด ์ถ์ ์ง์ ํธ์ ๋ชจ๋ธ์ด ์๋๋ผ **์ปค๋ ์ํ**๋ค\n * (์ปค๋์ด `source: 'state'` ๋ก ์ ์ธํ๋ค).\n *\n * โโ ๋ฉ์ถ ํธ์์ 0 ์ด ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์ด ๋์ํ์ง ์์ผ๋ฉด ๊ด์ธก์ด **์๋ค**. ๊ทธ๋ ๋น ๋ชฉ๋ก์ ๋ด๋ฉด \"์์
์ด 0 ๊ฑด\" ์ผ๋ก ์ฝํ๊ณ , ๊ทธ๊ฑด\n * ๊ฑฐ์ง์ด๋ค โ ์ด ํ๋ฉด์ด ๊ด์ธก ์ด์์ ๋ด๋ด ์ง์ผ ์จ ๊ตฌ๋ถ(๊ด์ธก ์์ โ 0)์ ๋ชฉ๋ก์์๋ ์งํจ๋ค.\n *\n * โโ ๊ท๋ชจ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ํ ๋ฐฐ์ด์ ์ง๊ธ์ ์ฌ์ค๋ง ๋ด์ ์ ํํ๋ค(์งํ ์ค ์ค๋ยท์์
). ๊ณผ๊ฑฐ๊น์ง ์ธ๋ ๊ฒ์ ์ ๋์ ์ผ์ด๊ณ \n * ์ปค์ ํ์ด์ง์ด ํ์ํ๋ค โ ๊ทธ๊ฑด `historical` ์ถ์ ํ์์ด๋ฉฐ, ์ฌ๊ธฐ์ ํ๋ด๋ด์ง ์๋๋ค.\n */\n if (axisSource(axis) === 'state') {\n /* ๋ดํฌ๋ฅผ ๋ฒ๊ธด๋ค โ `{revision, state}` ์์ ์ถ์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ **์คํ ์ค์ผ ๋๋ง** ๊ด์ธก์ด๋ค. */\n /*\n * **๋ผ์ด๋ธ๋ ๊ถ์, ํ์คํ ๋ฆฌ๋ ํ์.**\n *\n * ์ง๊ธ ๋๋ ์ปค๋์ ์ํ๊ฐ ์ด ์ถ์ ์ง์ค์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ปค๋์ด ๋ฉ์ถฐ ์๊ฑฐ๋ ์ฌ์ฉ์๊ฐ **๊ณผ๊ฑฐ ์๊ฐ**์\n * ๋ฌผ์ผ๋ฉด ๋ตํ ๊ฒ์ด ์์ด์ง๋ค โ ๊ทธ๋ ์ ๋์ ๊ทธ ์์ ๊น์ง ๊ณ์ฐํด ๋ตํ๋ค(`recover`). ๋์ ๊ฐ์ ๋ชจ์์ด์ง๋ง\n * **์ฑ์ง์ด ๋ค๋ฅด๋ฏ๋ก `basis` ๋ก ๊ตฌ๋ณํด ๋ธ๋ค**: ํ์์ ๊ถ์์ฒ๋ผ ๋ด๋ฉด ๋ค์ ๊ณ์ฐํ ๊ฐ์ ๋ณด๊ณ \"์ง๊ธ ์ด๋ ๋ค\"\n * ๋ก ์ฝ๊ฒ ๋๋ค.\n *\n * ๊ท๋ชจ: ๊ณ์ฐ ๋น์ฉ์ ์ด๋ฒคํธ ์์ ๋น๋กํ๋ค. ๊ฐ์ถ์ง ์๊ณ **์ด๋ ๋ฆฌ๋น์ ๊น์ง ๊ณ์ฐํ๋์ง ํจ๊ป ๋ธ๋ค** โ\n * ์ด ํ๋ฉด์ด ๋ชฉ๋ก๋ง๋ค `basis` ๋ฅผ ๋ฐํ ์จ ๊ท์จ ๊ทธ๋๋ก๋ค.\n */\n const live = TwinEngine.isRunning(domainId, instanceId) && !at_\n let snap = live ? unwrapState(TwinEngine.snapshot(domainId, instanceId)) : null\n let folded: number | undefined\n if (!snap) {\n try {\n const rec = await TwinEngine.recover(domainId, instanceId, undefined, at_ ?? undefined)\n snap = unwrapState(rec)\n folded = Number((rec as any)?.revision) || undefined\n } catch {\n /* ๋ค์ ๊ณ์ฐํ ๊ฒ์ด ์๋ค(๋ชจ๋ธ๋ ์ ๋๋ ์๋ค) โ ์๋ ๊ฒ์ 0 ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค. */\n snap = null\n }\n }\n if (!snap) {\n return { axis, label: info.label, basis: 'state', total: null, observed: false, offset: skip, items: [] }\n }\n /* ์ถ์ด ์ฌ๋ ์๋ฆฌ๋ **์ปค๋ ์ ์ธ์ด ๋งํ๋ค**(`path`) โ ์ถ ์ด๋ฆ์ผ๋ก๋ง ์ฝ์ผ๋ฉด ์ค์ฒฉ๋ ์ถ์ด ์ธ์ ๋\n ๋น์ด ๋ณด์ธ๋ค. ์นด๋๋ `axisValueOf` ๋ก ์ฝ๋๋ฐ ์ฌ๊ธฐ๊ฐ ๊ทธ ๊ท์น์ ์ง๋์ง ์์, ใ42ใ๋ฅผ ์ผ ๊ฐ๋
์\n ๋ชฉ๋ก์ด ใ0๊ฑดใ์ผ๋ก ๋์๋ค(์๋์ง์ ์์ ๊ตฌ๊ฐ). ๊ท์น์ ์ง์ `axisValueOf` ํ๋๋ค. */\n const bucket = axisValueOf(snap, info)\n const list: any[] = Array.isArray(bucket) ? bucket : []\n const hitState = q ? list.filter(o => matches(o, q)) : list\n const items = hitState\n .slice(skip, skip + take)\n .map(o => ({ id: idOf(o, info), fields: this.withOrderMaterial(axis, inst.model ?? {}, o) }))\n return {\n axis,\n label: info.label,\n /* ๊ถ์(๋ผ์ด๋ธ)์ ํ์(์ ๋)์ ๊ตฌ๋ณํด ๋ธ๋ค โ ํ๋ฉด์ด ์ด ๋ฑ๋ง์ ๊ทธ๋๋ก ๋ณด์ธ๋ค. */\n basis: live ? 'state' : 'journal',\n ...(folded != null ? { foldedRevision: folded } : {}),\n ...(at_ ? { at: at_ } : {}),\n observed: true,\n total: hitState.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n items,\n names: namesFor(items, nameIndex(inst.model ?? {}))\n }\n }\n\n /* ์์ง ๋ฌธ์ ์์ ์ฌ๋ ์ถ โ ๋ฌธ์๋ฅผ ์ฝ์ด ์๋ฅธ๋ค. ๊ท๋ชจ ํ๊ณ๋ฅผ `basis` ๋ก ๋๋ฌ๋ธ๋ค. */\n const raw = at(inst.model ?? {}, documentPath(axis))\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n const hit = q ? all.filter(o => matches(o, q)) : all\n return {\n axis,\n label: info.label,\n basis: 'document',\n total: hit.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n ...(() => {\n /*\n * **ํ ๋ฒ๋ฟ์ธ ์ ์ธ์ ์ถ ์ด๋ฆ์ด ๊ณง ์๋ณ์๋ค.**\n *\n * `productionSpec` ์ฒ๋ผ ๋ฌธ์์ ๊ฐ์ฒด ํ๋๋ก ์๋ ์ถ์ `id`/`key` ๊ฐ ์๋ค. ๊ทธ๊ฒ์ ๊ทธ๋๋ก\n * ๋ชฉ๋ก์ ์ค์ผ๋ฉด \"์๋ณ์ ์์ โ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค\" ๋ผ๋ ์ค ํ๋๊ฐ ๋จ๊ณ , ์ ์ ๊ทธ ์ ์ธ์\n * ์ด์ด ๋ณผ ๋ฐฉ๋ฒ์ด ์๋ค. ํ๋๋ฟ์ธ ๊ฒ์ ์ถ ์์ ์ผ๋ก ๊ฐ๋ฆฌํจ๋ค(์์ธ๋ ๊ฐ์ ๊ท์น์ผ๋ก ์ฐพ๋๋ค).\n */\n const singular = !Array.isArray(raw) && !!raw\n const items = hit\n .slice(skip, skip + take)\n .map(o => ({ id: idOf(o) ?? (singular ? axis : null), fields: this.withBinding(axis, inst.model ?? {}, o) }))\n return { items, names: namesFor(items, nameIndex(inst.model ?? {})), singular }\n })()\n }\n }\n\n /**\n * ํ์์ **๋ด๋ถ ๋ฐฐ๊ด์ ๊ฑท์ด๋ธ๋ค** โ ์ฌ์ฉ์๊ฐ ๋ณผ ๊ฒ์ ํ์ฅ์ ์ฌ์ค์ด์ง ์ฐ๋ฆฌ ์คํค๋ง๊ฐ ์๋๋ค.\n *\n * ์์ผ๋ก ๋ชฉ๋ก์ ๋์ง ์๋๋ค. ๊ด๊ณ์ ๊ทธ ์กฐ์ธ ์ปฌ๋ผ์ด ๋ฌด์์ธ์ง๋ **์ํฐํฐ ๋ฉํ๋ฐ์ดํฐ**๊ฐ ์๊ณ ,\n * ํ๋ก ๋๋ฉด ์ปฌ๋ผ์ด ๋ ๋๋ง๋ค ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์ผ ํ๋ฉฐ ์์ผ๋ฉด ๊ทธ๋๋ก ์์ด ๋๊ฐ๋ค โ ์ค์ ๋ก\n * `domainId`ยท`instanceRowId` ๊ฐ์ ๋ด๋ถ UUID ๊ฐ ํ๋ฉด๊น์ง ๊ฐ๋ค.\n *\n * ์๋ณ์๋ ๋บ๋ค: ํญ๋ชฉ ์์ ์ id ๋ ์ด๋ฏธ `id`/`itemId` ๋ก ๋๊ฐ๋ฏ๋ก ๋ ๋ฒ ๋ณด์ผ ์ด์ ๊ฐ ์๋ค.\n */\n private strip(entityClass: any, idColumn: string, r: any): any {\n const meta = getRepository(entityClass).metadata\n const hidden = new Set<string>(['id', 'createdAt', 'updatedAt', 'creator', 'updater', 'creatorId', 'updaterId', idColumn])\n for (const rel of meta.relations) {\n hidden.add(rel.propertyName)\n for (const jc of rel.joinColumns) hidden.add(jc.propertyName)\n }\n /* `@RelationId` ๋ก ์น๊ฒฉํ ๋ด๋ถ UUID(`domainId`ยท`instanceRowId`ยท`areaRowId`) โ ๊ด๊ณ ๋ชฉ๋ก์๋ ์๊ณ \n ์ฌ๊ธฐ์๋ง ์๋ค. ์ด ํ ์ค์ด ์์ด์ ์ค์ ๋ก ํ๋ฉด๊น์ง ์๋ค. */\n for (const rid of meta.relationIds) hidden.add(rid.propertyName)\n const out: any = {}\n for (const [k, v] of Object.entries(r)) if (!hidden.has(k)) out[k] = v\n return out\n }\n\n\n /**\n * **์์ฌ๋ ์๊ธฐ GS1 ํ๋ชฉ ์ฐธ์กฐ๋ฅผ ์๋ค** โ ์ฝ๊ธฐ ๊ฒฝ๊ณ์์ ์ด์ด ๋ถ์ธ๋ค.\n *\n * ์ ๋ณธ์ `productionSpec.binding` ํ๋๋ค(์ปค๋์ด EPCโ์์ฌ๋ฅผ ๊ทธ ํ๋ก ์๋๋ค). ๊ทธ๋ฐ๋ฐ ๊ทธ ์ฌ์ค์\n * **์์ฌ๋ง๋ค์ ์์ฑ**์ด๋ค: ์ด ์์ฌ๊ฐ GS1 ํ๋ชฉ ๋ช ๋ฒ์ธ๊ฐ, ๊ทธ๋์ ๊ฐ์ฒด๋ก ์ถ์ ๋๋๊ฐ(= ๊ณ๋ณด๋ฅผ ๋น๊ตํ \n * ์ ์๋๊ฐ). ์์ฌ ๋ชฉ๋ก์ ๊ทธ๊ฒ์ด ์์ผ๋ฉด ์์ฌ๋ ์๊ธฐ ์ ์ฒด๋ฅผ ๋ชจ๋ฅด๊ณ , ์ฌ์ฉ์๋ ๊ทธ ์ฌ์ค์ ๋ด ์ถ์์\n * ์ฐพ์์ผ ํ๋ค.\n *\n * ๊ทธ๋์ **์ ์ฅ์ ํ ๊ณณ(binding), ํ์๋ ์ฝ๋ ์๋ฆฌ์์ ์ด์ด ๋ถ์** โ ์ด๋ฆํ์ ๊ฐ์ ๋ฐฉ์์ด๋ค.\n * ๊ฐ์ ๋ณต์ ํด ๋๋ฉด ๋ ๊ณณ์ด ์ด๊ธ๋๊ณ , ์ด๊ธ๋ ์ชฝ์ ์๋ฌด๋ ๋ชจ๋ฅธ๋ค.\n */\n private withBinding(axis: string, model: any, fields: any): any {\n if (!BINDING_AXES.has(axis) || !fields || typeof fields !== 'object') return fields\n const binding: Record<string, string> = model?.productionSpec?.binding ?? {}\n const ref = binding[fields.key ?? fields.id]\n /* ์์ผ๋ฉด ํค๋ฅผ ๋ง๋ค์ง ์๋๋ค โ ๋น ๊ฐ์ด ์๋ ๊ฒ๊ณผ ์ ์ธ๋์ง ์์ ๊ฒ์ ๋ค๋ฅด๋ค. */\n return ref ? { ...fields, gs1Ref: ref } : fields\n }\n\n /**\n * **์ค๋๊ฐ ๋ฌด์์ ๋ง๋๋** โ GS1 ํ๋ชฉ ์ฐธ์กฐ๋ฅผ ์์ฌ๋ก ๋ค์ ๊ณ์ฐํด ๋ถ์ธ๋ค.\n *\n * ์ปค๋์ ์ค๋๋ ํ๋ชฉ์ GS1 ์ผ๋ก ๋งํ๋ค(`urn:epc:idpat:sgtin:0614141.078101.*`). ์ฌ๋์๊ฒ ๊ทธ ๋ฌธ์์ด์\n * ์๋ฌด ๋ป์ด ์๊ณ , ๊ทธ ํ๋ชฉ์ ์ด๋ฆ์ **์์ฌ ์ ์ธ**์ด ๊ฐ๊ณ ์๋ค. ๋์ ์๋ ๊ฒ์ `productionSpec.binding`\n * (์์ฌ ํค โ ํ๋ชฉ ์ฐธ์กฐ)์ด๋ฏ๋ก **์ญ๋ฐฉํฅ์ผ๋ก ๋ค์ ๊ณ์ฐํ๋ค.**\n *\n * ์ ๋ณธ์ ๊ทธ๋๋ก ๋๋ค: `gtin` ์ ์ปค๋์ด ๋งํ ๊ฐ์ด๊ณ , ์ฌ๊ธฐ์ ๋ํ๋ ๊ฒ์ **์์ฌ ํค ํ๋**๋ค(๊ทธ ์ด๋ฆ์\n * ์ด๋ฆํ๊ฐ ๋ถ์ธ๋ค โ ๊ฐ์ ๋ณต์ ํ์ง ์๋๋ค). ๋ค์ ๊ณ์ฐํ์ง ๋ชปํ๋ฉด ์๋ฌด๊ฒ๋ ๋ํ์ง ์๋๋ค: ์ง์์ผ๋ก ์ด์ผ๋ฉด\n * \"์ด ์ค๋๋ ์ ๊ฒ์ ๋ง๋ ๋ค\" ๋ ๊ฑฐ์ง์ด ๋๊ณ , ๊ทธ๊ฑด ๋ชจ๋ฅด๋ ๊ฒ๋ณด๋ค ๋์๋ค.\n */\n private withOrderMaterial(axis: string, model: any, fields: any): any {\n if (axis !== 'orders' || !fields || typeof fields !== 'object') return fields\n const binding: Record<string, string> = model?.productionSpec?.binding ?? {}\n const refToMaterial = new Map(Object.entries(binding).map(([mat, r]) => [String(r), mat]))\n /* ๋จ์ผ ํ๋ชฉ ์์
์ง์๋ `gtin`, ์ฌ๋ฌ ํ๋ชฉ์ด๋ฉด ๋ผ์ธ๋ง๋ค ๋งํ๋ค โ ์ฒซ ๋ผ์ธ์ผ๋ก ๋ํํ์ง ์๋๋ค. */\n /* ์ ์ฒด์ฑ ๋ชจ์์ ํ๋๊ฐ ์๋๋ค โ ๊ท์น์ ์ง์ `item-ref` ํ๋๋ค(์น URI ์๋ณธ์์ ์ด ์๋ฆฌ๊ฐ ์ธ์ ๋\n ๋น์นธ์ด์๋ค). */\n const refOf = itemRefOf\n const mat = refToMaterial.get(String(refOf(fields.gtin) ?? ''))\n if (mat) return { ...fields, material: mat }\n const lineMats = (fields.lines ?? [])\n .map((l: any) => refToMaterial.get(String(refOf(l?.gtin) ?? '')))\n .filter(Boolean)\n return lineMats.length ? { ...fields, materials: [...new Set(lineMats)] } : fields\n }\n\n /** ํ ํ๋ โ ๋ชฉ๋ก ํญ๋ชฉ. ์ปฌ๋ผ ์ด๋ฆ์ ํ๋ฉด์ด ์์ง ์์๋ ๋๊ฒ `id` + ๋๋จธ์ง๋ก ๋ธ๋ค. */\n private rowItem(axis: string, r: any): any {\n const { entity, idColumn } = ROW_BACKED[axis]\n return { id: r[idColumn], fields: this.strip(entity, idColumn, r) }\n }\n\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'One item of a standard concept: what the source declared, what the twin observed, what it links to and is linked from (declared relations, both directions), and where it came from. Never invents a value for a field the source did not provide.'\n })\n async twinModelItem(\n @Arg('instanceId') instanceId: string,\n @Arg('axis') axis: string,\n @Arg('itemId') itemId: string,\n @Ctx() context: ResolverContext\n ): Promise<any | null> {\n const domainId = context.state.domain.id\n const info = axisInfo(axis)\n if (!info) throw new Error(`unknown concept axis: \"${axis}\" โ the kernel catalog does not declare it`)\n\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return null\n\n const model = inst.model ?? {}\n const row = ROW_BACKED[axis]\n let declared: any = null\n let provenance: any = null\n\n /*\n * **๊ด์ธก ์ถ์ ์์ธ** โ ์ผ์ ยท์ค์ ์ ์ํ์์ ์ฐพ๋๋ค. ์ปค๋์ด ๋ฉ์ถฐ ์์ผ๋ฉด ํญ๋ชฉ์ด ์๋๋ผ **๋ชจ๋ฅธ๋ค**๋ฅผ\n * ๋ธ๋ค(๊ทธ ํธ์์ ๊ทธ ์ค๋๊ฐ ์๋ค๋ ๋ป์ด ์๋๋ค โ ์ง๊ธ ๊ด์ธก์ด ์๋ค๋ ๋ป์ด๋ค).\n */\n if (axisSource(axis) === 'state') {\n /*\n * ๋์ํ์ง ์์ผ๋ฉด **๋ชฉ๋ก๊ณผ ๊ฐ์ ๊ธธ๋ก ์ ๋์ ๊ณ์ฐํ๋ค.**\n *\n * ๋ชฉ๋ก๋ง ๊ณ์ฐํ๊ณ ์์ธ๋ ์ ๊ณ์ฐํ๋๋, ๋ชฉ๋ก์๋ 472๊ฑด์ด ๋ณด์ด๋๋ฐ ๊ทธ ์ค์ ์ด๋ฉด \"์๊ธฐ ์์ฑ์ด ์์ต๋๋ค\"\n * ๊ฐ ๋์๋ค โ ํ ํ๋ฉด์์ ๋ ๋ต์ด ๊ฐ๋ฆฌ๋ฉด ์ด๋ ์ชฝ์ด ๋ง๋์ง ์ฌ์ฉ์๊ฐ ์ ์ ์๋ค.\n */\n const liveItem = TwinEngine.isRunning(domainId, instanceId)\n let snap = liveItem ? unwrapState(TwinEngine.snapshot(domainId, instanceId)) : null\n if (!snap) {\n try {\n snap = unwrapState(await TwinEngine.recover(domainId, instanceId))\n } catch {\n /* ๋ค์ ๊ณ์ฐํ ๊ฒ์ด ์๋ค โ ์๋์์ \"๋ชจ๋ฅธ๋ค\" ๋ฅผ ๋ธ๋ค(0 ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค). */\n }\n }\n /* ๊ฐ์ ๊ท์น โ ์ถ ์ด๋ฆ์ด ์๋๋ผ ์ ์ธ๋ ์๋ฆฌ์์ ์ฝ๋๋ค(ยงaxisValueOf). */\n const bucket = snap ? axisValueOf(snap, info) : null\n const found = Array.isArray(bucket) ? bucket.find((o: any) => idOf(o, info) === itemId) : undefined\n /*\n * **์ํ๋ฅผ ์ฝ์๋๋ฐ ๊ทธ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด, ๊ทธ๋ฐ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒ์ด๋ค** (2026-09-18).\n *\n * ์ด ๊ฐ๋๊ฐ `!snap || !found` ํ๋์๋ค. ๊ทธ๋์ ์๋ ์๋ณ์๋ก ๋ฌผ์ด๋ ใํธ์์ด ์ค์ ๋ก ๋ณธ ๊ฒ์
๋๋คใ\n * ๋ผ๊ณ ์ ํ ํจ๋์ด ๋์์๋ค โ ํ๋ฉด์ ๊ทธ๊ฒ์ ๊ทธ๋ ค์, ์์ง๋ ์์ ๊ฐ์ฒด๊ฐ ๊ฐ์ด ๋น์ด ์๋ ๊ฐ์ฒด์ฒ๋ผ\n * ๋ณด์๋ค. ๋ฌธ์ ์ถ์ ๊ฐ์ ๋ฌผ์์ `null` ์ ๋ตํ๋ค(์๋ ๊ฒ์ ์๋ค๊ณ ๋ตํ๋ค). ์ํ ์ถ๋ ๊ฐ๋ค.\n *\n * ๋ชป ์ฝ์ ๊ฒ์ ๋ค๋ฅธ ์ฌ์ค์ด๋ผ ์๋์์ ๋ฐ๋ก ๋ตํ๋ค โ ใ์๋คใ๋ก ์ ์ง ์๋๋ค.\n */\n if (snap && !found) return null\n if (!snap) {\n return {\n instanceId, axis, label: info.label, itemId,\n identity: { standardClass: info.standardClass ?? null, typeRole: info.typeRole ?? null, kind: info.kind, gs1Scheme: info.gs1Scheme ?? null, journalAxis: info.journalAxis ?? null, describedBy: info.describedBy ?? null },\n declared: null,\n observed: null,\n observedOnly: true,\n /*\n * **์ ๊ด์ธก ์ด์ด ๋น์๋** โ ์ปค๋์ด ๋ฉ์ถฐ ์๊ณ ์ ๋๋ก๋ ๋์ธ์ฐ์ง ๋ชปํ๋ค. ์ฝ๋๋ ๋ชฉ๋กยท๋น๊ต ์ด์ด\n * ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ์ด๋ค(`not-running`) โ ๊ฐ์ ์ฌ์ค์ ๋ ๋ฑ๋ง์ ๋ง๋ค์ง ์๋๋ค.\n */\n observedAbsence: 'not-running' as const,\n basis: liveItem ? 'state' : 'journal', observedBasis: liveItem ? 'state' : 'journal', observing: liveItem,\n links: { out: [], incoming: [] }, properties: propertiesOf(axis).map((pr: any) => ({ key: pr.key, label: pr.label, kind: pr.kind, uom: pr.uom ?? null, observedBy: pr.observedBy ?? null })),\n /* ์ด๋ค ์์ฑ์ด **ํจ๊ณผ๊ฐ ์๋** โ ๋ฑ๋ก๋ถ๊ฐ ๋งํ๋ค(ยงproperty-effects). ์๋ ๊ฒ์ ํ์๋ง ๋๋ค. */\n propertyEffects: propertyEffectsOf(axis),\n /*\n * ์ถ์ฒ๋ ์ด ๋ต์ `basis` ์ ๊ฐ์ ๊ท์น์ด๋ค(์๋ ์ฝ์ ๊ฐ๋๋ ๊ฐ๋ค). ์ฌ๊ธฐ๋ฅผ `state` ๋ก ๋ฐ์ ๋์ด์, ์ปค๋์ด ๋ฉ์ถฐ\n * ์ ๋๋ก ๋์ธ์ฐ๋ ค๋ ๋ต์ด ใ์ง๊ธ ์ํ์์ ์ฝ์๋คใ๊ณ ๋งํ๋ค(ADR-0075 ๊ฒฐ์ 3 ยท ๊ฒฐํจ ๋๊น 2026-09-24).\n * ์๋ฌด๊ฒ๋ ๋ชป ์ฝ์๋ค๋ ์ฌ์ค์ `observedAbsence` ๊ฐ ๋งํ๋ค โ ์ถ์ฒ๋ฅผ ๋น์ฐ์ง ์๋๋ค(`READ_BASIS` ์ฃผ์).\n */\n names: {}, provenance: { basis: liveItem ? 'state' : 'journal' }\n }\n }\n const names = namesFor([{ id: itemId, fields: found }], nameIndex(inst.model ?? {}))\n return {\n instanceId, axis, label: info.label, itemId,\n identity: { standardClass: info.standardClass ?? null, typeRole: info.typeRole ?? null, kind: info.kind, gs1Scheme: info.gs1Scheme ?? null, journalAxis: info.journalAxis ?? null, describedBy: info.describedBy ?? null },\n /*\n * **์ ์ธ์ด ์๋ ์ถ์ด๋ค.** ๋ ์ด ์ค ์ผ์ชฝ์ด ๋น๋ ๊ฒ์ด ์ ์์ด๊ณ , ๊ทธ ์ฌ์ค์ ๊ฐ์ผ๋ก ๋งํ๋ค\n * (`observedOnly`) โ ๋น ์ด์ \"์๋ณธ์ด ์นจ๋ฌตํ๋ค\" ๋ก ์ฝ์ผ๋ฉด ์ ๋๋ค. ์๋ณธ์ ์ ์ด์ ์ด ์ถ์\n * ์ ์ธํ์ง ์๋๋ค.\n */\n declared: null,\n observed: this.withOrderMaterial(axis, inst.model ?? {}, found),\n observedOnly: true,\n basis: liveItem ? 'state' : 'journal',\n /* ๊ด์ธก ์ด์ ๊ทผ๊ฑฐ๋ **ํ ์ด๋ฆ์ผ๋ก** ๋ธ๋ค โ ๋ ์ด๋ฆ์ ๋๋ฉด ํ๋ฉด์ด ํ์ชฝ์ ์๋๋ค. */\n observedBasis: liveItem ? 'state' : 'journal',\n observing: liveItem,\n properties: propertiesOf(axis).map((pr: any) => ({ key: pr.key, label: pr.label, kind: pr.kind, uom: pr.uom ?? null, observedBy: pr.observedBy ?? null })),\n /* ์ด๋ค ์์ฑ์ด **ํจ๊ณผ๊ฐ ์๋** โ ๋ฑ๋ก๋ถ๊ฐ ๋งํ๋ค(ยงproperty-effects). ์๋ ๊ฒ์ ํ์๋ง ๋๋ค. */\n propertyEffects: propertyEffectsOf(axis),\n links: await this.linksOf(domainId, inst, axis, itemId, found),\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n names,\n provenance: { basis: liveItem ? 'state' : 'journal' }\n }\n }\n\n if (row) {\n const found: any = await getRepository(row.entity).findOne({\n where: { domain: { id: domainId } as any, instance: { id: inst.id } as any, [row.idColumn]: itemId } as any\n })\n if (found) {\n const { sourceRef, ingestedAt, ...rest } = this.strip(row.entity, row.idColumn, found)\n declared = rest\n /* ์ถ์ฒ๋ ์์ฑ์ด ์๋๋ผ **๊ทผ๊ฑฐ**๋ค โ ๋ ์ด์ด ์๋๋ผ ์๋ ๊ทผ๊ฑฐ ๋ฌถ์์ผ๋ก ๊ฐ๋ค. */\n provenance = { sourceRef, ingestedAt, basis: 'rows' }\n }\n }\n\n /*\n * ํ์ ์์ผ๋ฉด ๋ฌธ์๋ฅผ ๋ณธ๋ค โ **ํฌ์์ด ๋ก์ ํธ์์์๋ ํญ๋ชฉ์ ๋ณผ ์ ์์ด์ผ ํ๋ค.** ํ๋ง ๋ณด๊ณ \n * \"์๋ค\" ๊ณ ๋ตํ๋ฉด, ๋ฌธ์์๋ ์๋ ์๋ฆฌ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง๋ค(์ด ํ๋ก์ ํธ๊ฐ ๋ด๋ด ์ก์ ์จ ๋ถ๋ฅ).\n */\n if (!declared) {\n const raw = at(model, info.path)\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n /* ํ ๋ฒ๋ฟ์ธ ์ ์ธ์ ์ถ ์ด๋ฆ์ผ๋ก ์ฐพ๋๋ค โ ๋ชฉ๋ก์ด ๊ทธ ์ด๋ฆ์ผ๋ก ๊ฐ๋ฆฌ์ผฐ๊ธฐ ๋๋ฌธ์ด๋ค. */\n const found = all.find(o => idOf(o) === itemId) ?? (!Array.isArray(raw) && raw && itemId === axis ? raw : undefined)\n if (found) {\n declared = typeof found === 'string' ? { id: found } : this.withBinding(axis, model, found)\n provenance = { basis: 'document' }\n }\n }\n\n /* ์ ์ธ์๋ ๋ฌธ์์๋ ์๋ค โ ๊ทธ๋ฐ๋ฐ **๊ด์ธก์๋ ์์ ์ ์๋ค**(์๋ณธ์ด ๋ชจ๋ฅด๋ ์์). ๊ทธ ๊ฒฝ์ฐ๋\n ํญ๋ชฉ์ผ๋ก ์ด๋ ค์ผ ํ๋ค. ๋ ๋ค ์์ผ๋ฉด ์ง์ง๋ก ์๋ ๊ฒ์ด๋ฏ๋ก `null`. */\n const seen = await this.observedOf(domainId, instanceId, axis, itemId)\n const observed = 'value' in seen ? seen.value : null\n if (!declared && !observed) return null\n\n /* ์ด์์ ๋จผ์ ๊ตฌํ๋ค โ ์ด๋ฆํ๊ฐ ์ด์์ id ๊น์ง ๋ฎ์ผ๋ ค๋ฉด ๋ฐํ ์ ์ ์์ ์์ด์ผ ํ๋ค. */\n const links = await this.linksOf(domainId, inst, axis, itemId)\n\n /*\n * **๊ตฌ์ญ ์ด๋ฆ์ ๋ชจ๋ธ์ ์๋ค** โ ๊ตฌ์ญ์ ํธ์คํธ ๊ฐ๋
์ด๊ณ (`TwinArea`), ์ธ์ ์คํธ๊ฐ ๋ชจ๋ธ์์ ๊ฐ๋ผ\n * ๊ณต๊ฐ ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค. ๊ทธ๋์ ๋ชจ๋ธ๋ง ์กฐํํ๋ ์ด๋ฆํ์๋ `a-floor` ์ ์ด๋ฆ์ด ์๊ณ , ๊ด๊ณ ๊ทธ๋ฆผ์ ๊ทธ id ๊ฐ\n * ๊ทธ๋๋ก ์ฐ๋ค. ๊ทธ ํ์์ ๊ฐ์ ธ์ ์ด๋ฆํ์ ํฉ์น๋ค(์ด ํธ์์ ๊ณต๊ฐ ๊ฒ๋ง).\n */\n const areaNames: Record<string, string> = {}\n if (inst.spaceId) {\n const areas = await getRepository(TwinArea)\n .find({ where: { domain: { id: domainId } as any, space: { spaceId: inst.spaceId } as any } as any })\n .catch(() => [] as any[])\n for (const a of areas as any[]) if (a?.areaId && a?.name) areaNames[a.areaId] = a.name\n }\n\n return {\n instanceId,\n axis,\n label: info.label,\n itemId,\n /* ์ ์ฒด โ ํ์ค ํด๋์คยท์๋ณ ์คํด์ ์ ๋ถ ์นดํ๋ก๊ทธ ์ ์ธ์์ ์จ๋ค. */\n identity: {\n standardClass: info.standardClass ?? null,\n typeRole: info.typeRole ?? null,\n kind: info.kind,\n gs1Scheme: info.gs1Scheme ?? null,\n /*\n * ์ ์ธ ๋์ ๊ทธ๋๋ก ๋๋ฅธ๋ค (ADR-0074) โ ์ด ๊ฐ์ฒด์ ์ด๋ ฅ์ ์ ๋์ ์ด๋ ์ถ์ผ๋ก ๋ฌป๋,\n * ๊ทธ๋ฆฌ๊ณ ์๋ณ์ ๋ง๊ณ ๋ฌด์์ด ์ด ๊ฐ์ฒด๋ฅผ ๋งํ๋. ํ๋ฉด์ด ๊ทธ ๋ชฉ๋ก์ ๊ฐ์ง ์๊ฒ ํ๋ค.\n */\n journalAxis: info.journalAxis ?? null,\n describedBy: info.describedBy ?? null\n },\n /*\n * **๊ทธ๋ฆ์ธ๊ฐ** โ ๋ฌธ์์ ๊ฐ์ฒด ํ๋๋ก ์๋ ์ถ(`productionSpec`)์ธ์ง.\n *\n * `kind` ๋ก๋ ๊ฐ๋ฆฌ์ง ์๋๋ค: ์ปค๋์ ๋ผ์ฐํธยท๋ ์ํผยท๊ณต์ ๋ `spec` ์ด๋ผ ๋ถ๋ฅธ๋ค(๊ฐ์ ์ ์ธ ๋ถ๋ฅ๋ผ๋\n * ๋ป). ํ๋ฉด์ด `kind` ๋ก ๊ฐ๋๋๋ **๋ผ์ฐํธ ์์ธ๊ฐ ๊ทธ๋ฆ ํ๋ก ๊ทธ๋ ค์ ธ** ๊ฐ์ฅ ์ค์ํ ์ ๋ณด(๊ณต์ ์์)๊ฐ\n * ๊ฐ์ ์นฉ ํ๋๋ก ์ค์ด๋ค์๋ค. ๊ทธ๋ฆ์ธ์ง ์๋์ง๋ ๋ชจ์์ด ๋งํ๋ค.\n */\n container:\n axisSource(axis) === 'document' && !Array.isArray(at(model, info.path)) && at(model, info.path) != null,\n /* ๋ ์ด โ ์๋ณธ์ด ๋งํ ๊ฐ, ํธ์์ด ๊ด์ธกํ ๊ฐ. ํ์ชฝ์ด ์์ผ๋ฉด **์๋ค๊ณ ๋ธ๋ค**(0 ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค). */\n declared,\n observed,\n /*\n * ๊ด์ธก ์ด์ด **์๊ธฐ ๊ทผ๊ฑฐ๋ฅผ ๋งํ๋ค** โ ๋ชฉ๋ก์ ๊ทธ ๋ฑ๋ง ๊ทธ๋๋ก(`state`=๋ผ์ด๋ธ ๊ถ์, `journal`=๋ค์ ๊ณ์ฐํ\n * ํ์). ์์ผ๋ฉด ๋น๊ตํ์ง ๋ชปํ ๊ฒ์ด๋ค. ํ์์ด๋ฉด ๋ช ๋ฒ์งธ ๋ฆฌ๋น์ ๊น์ง ๊ณ์ฐํ๋์ง ํจ๊ป ๋ธ๋ค.\n */\n ...('value' in seen\n ? { observedBasis: seen.basis, ...(seen.foldedRevision != null ? { observedRevision: seen.foldedRevision } : {}) }\n : { observedAbsence: seen.absence }),\n /* ์ ์ธ๋ ์์ฑ โ ์ด๋ ๊ด์ธก ์ถ์์ ์ค๋์ง๋ ํจ๊ป(์นดํ๋ก๊ทธ๊ฐ ๋งํ ๋๋ก). */\n properties: propertiesOf(axis).map((p: any) => ({ key: p.key, label: p.label, kind: p.kind, uom: p.uom ?? null, observedBy: p.observedBy ?? null })),\n /*\n * **ํจ๊ณผ๊ฐ ์๋ ์์ฑ๊ณผ ํ์๋ง ๋๋ ์์ฑ์ ๋ค๋ฅด๋ค.** ์์ฑ์ ์ด๋ ค ์์ด ์๋ฌด ์ฌ์ค์ด๋ ์ค์ด ๋ณด๋ผ ์\n * ์์ง๋ง, ๊ฐ์ด ๊ณ์ฐ์ ๋ฐ๊พธ๋ ค๋ฉด ๊ทธ ๊ท์น์ ์ฝ๋๊ฐ ์์์ผ ํ๋ค. ์ง๊ธ ๋ฌด์์ด ๊ทธ๋ฐ์ง ํ๋ฉด์ด ๋งํ ์\n * ์๊ฒ ๋ฑ๋ก๋ถ๋ฅผ ํจ๊ป ๋ธ๋ค โ ์ฌ์ฉ์๊ฐ ๋ฃ๊ณ ๋์ ์๋ฌด ์ผ๋ ์ ์ผ์ด๋๋ ์ด์ ๋ฅผ ์ ์ ์๊ฒ.\n */\n propertyEffects: propertyEffectsOf(axis),\n links,\n /*\n * **๋ฑ๊ธ ์ด๋ฆ์ ๋ฑ๊ธ์ด ๊ฐ๊ณ ์๋ค.** ๊ณต์ ์ ์๊ฒฉ์ ๋ฑ๊ธ id ๋ก๋ง ์๊ตฌํ๋ฏ๋ก(ํ์ค์ด ๊ทธ๋ ๋ค),\n * ๊ทธ id ๋ฅผ ๊ทธ๋๋ก ํ๋ฉด์ ๋ด๋ฉด `assembler-op` ์ด ์ฌ์ฉ์์๊ฒ ๊ฐ๋ค. ๋ฑ๊ธ์ ํ์๋ช
์ ๋ฑ๊ธ ์ ์ธ์\n * `description`(i18n ํค)์ ์๊ณ ๊ทธ๊ฒ์ **๋ค๋ฅธ ์ถ**์ด๋ค โ ํ๋ฉด์ด ์ถ์ ํ๋ ๋ ์ฝ์ง ์์๋ ๋๊ฒ\n * ์ฌ๊ธฐ์ ์ด์ด ๋ถ์ธ๋ค(์๋ฒ๋ ์ด๋ฏธ ๋ชจ๋ธ์ ์์ ๋ค๊ณ ์๋ค).\n */\n resourceClassLabels: this.classLabels(model),\n /*\n * **๊ณต์ ์ด๋ฉด ๊ทธ ๊ณต์ ์ ๋ฅ๋ ฅ๋ ํจ๊ป ๋ธ๋ค** โ ISA-95 Part 4 `OperationsCapability`.\n *\n * ๊ณต์ ์์ธ์์ ์ฌ๋์ด ๋ฌป๋ ๊ฒ์ \"์ด ๊ณต์ ์ด ์ง๊ธ ์ผ๋ง๋ ๋ ํ ์ ์๋\" ์ด๊ณ , ๊ทธ ๋ต์ ๋ช
์ธ๋ง\n * ๋ด์๋ ์ ๋์จ๋ค(์ฝ์ ๊ณผ ์ง๊ธ ๋ชป ์ฐ๋ ์์์ ๋นผ์ผ ํ๋ค). ํ๋ฉด์ด ์ถ์ ํ๋ ๋ ์ฝ์ง ์๊ฒ\n * ์ฌ๊ธฐ์ ์ด์ด ๋ถ์ธ๋ค โ ์ด๋ฆํยท๋ฑ๊ธ ๋ผ๋ฒจ์ ๋ถ์ด๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ค.\n */\n ...(await this.capabilityOfOperation(domainId, instanceId, axis, itemId)),\n /*\n * ์์ธ๋ ๊ฐ์ ํ๋ฅผ ์ด๋ค โ ๋ชฉ๋ก๊ณผ ์์ธ๊ฐ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋งํด์ผ ์ฌ์ฉ์๊ฐ ๊ฐ์ ๊ฒ์ผ๋ก ์ฝ๋๋ค.\n *\n * **์ด์์ ์ด๋ฆ๋ ํจ๊ป ์ฃ๋๋ค.** ๊ด๊ณ ๊ทธ๋ฆผ์ ์ด์์ ๋๊ฐ *๋ค์ด์ค๋* ๋งํฌ(์ด ์๋ฆฌ๋ฅผ ๊ธฐ์ค ์๋ฆฌ๋ก\n * ์ผ๋ ์ค๋นยท์ฌ๋)๋ผ, ์ด ํญ๋ชฉ ์์ ์ ํ๋์๋ ๊ทธ id ๊ฐ ์๋ค โ ํ๋๋ง ํ์ผ๋ฉด ๊ทธ๋ฆผ์ด id ๋ก ์ฑ์์ง๋ค.\n */\n names: namesFor(\n [{ id: itemId, fields: declared }, { fields: observed }, { fields: links }],\n { ...nameIndex(model), ...areaNames }\n ),\n provenance\n }\n }\n\n /**\n * **id โ ์ด๋ฆ**, ๋ชจ๋ ์ถ์ ํ ํ๋ก.\n *\n * โโ ์ ์ด ํ๊ฐ ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ์ ๋ค๋ฅธ ๊ฒ์ **id ๋ก** ๊ฐ๋ฆฌํจ๋ค(์ฌ๋์ `personnelClassIds`, ์ค๋น์ `homeLocationId`, ๊ณต์ ์\n * `locationType`). ๊ทธ id ์ ์ด๋ฆ์ **๊ฐ๋ฆฌ์ผ์ง ์ถ์ ํ**์ ์์ผ๋ฏ๋ก, ํ๋ฉด์ด ๊ทธ๊ฒ์ ์๋ ค๋ฉด ์ถ์\n * ํ๋์ฉ ๋ ์ฝ์ด์ผ ํ๋ค โ ๊ทธ๋์ ์ง๊ธ๊น์ง ํ๋ฉด๋ง๋ค ๊ทธ๋ฅ id ๋ฅผ ์ฐ์๋ค(`cutter-op`, `cut-station`).\n * ํ๋ฉด์ ํ๋์ฉ ๊ณ ์น๋ ๊ฒ์ ๋์ด ์๋ค: ์ ํ๋ฉด์ ์ฒ์๋ถํฐ ๋ค์ id ๋ฅผ ์ฐ๋๋ค.\n *\n * ๊ทธ๋์ **์๋ฒ๊ฐ ๋ถ์ธ๋ค.** ์๋ฒ๋ ์ด๋ฏธ ๋ชจ๋ธ์ ์์ ๋ค๊ณ ์๊ณ , ์ด๋ ์ถ์ด ์๋์ง๋ ์ปค๋ ์นดํ๋ก๊ทธ๊ฐ\n * ์ ์ธํ๋ค(`TWIN_AXES`) โ ๋๋ฉ์ธ์ด ๋์ด๋ ์ด ํจ์๋ ๊ทธ๋๋ก๋ค.\n *\n * ๊ฐ์ ๊ทธ ํญ๋ชฉ์ด **์๊ธฐ ์ด๋ฆ์ด๋ผ๊ณ ๋งํ ๊ฒ**์ด๋ค(`name`ยท`label`ยท`description`). ๊ทธ์ค ์ด๋ค ๊ฒ์\n * i18n ํค์ด๋ฏ๋ก(๋ฑ๊ธ์ `description`) ๋ฒ์ญ์ ํ๋ฉด์ ์ผ๋ก ๋จ๊ธด๋ค. ์ด๋ฆ์ด ์์ผ๋ฉด ํ์ ๋ฃ์ง ์๋๋ค โ\n * ์๋ ๊ฒ์ ์ง์ด๋ด์ง ์๊ณ , ๊ทธ ๊ฒฝ์ฐ ํ๋ฉด์ id ๋ฅผ ๊ทธ๋๋ก ๋ณด์ธ๋ค.\n */\n private nameIndex(model: any): Record<string, string> {\n const out: Record<string, string> = {}\n for (const info of TWIN_AXES as any[]) {\n /* ๊ด์ธก ์ถ(์ํยท์ ๋)์ ๋ฌธ์์ ์๋ค โ ๊ฒฝ๋ก๊ฐ ์๋ ์ถ์ ์ฝ์ผ๋ฉด ๋ชจ๋ธ ๋ฃจํธ๋ฅผ ํ๋๋ค. */\n if (axisSource(info.axis) !== 'document') continue\n const raw = at(model ?? {}, info.path)\n const list = Array.isArray(raw) ? raw : raw ? [raw] : []\n for (const o of list) {\n const id = idOf(o)\n if (!id || typeof o !== 'object') continue\n const label = o.name ?? o.label ?? o.description\n /* ์ด๋ฆ์ด id ์ ๊ฐ์ผ๋ฉด ํ์ ๋ฃ์ง ์๋๋ค โ ๊ฐ์ ๊ฐ์ ๋ ๋ฒ ๋ณด์ด๋ ์
์ด๋ค. */\n if (typeof label === 'string' && label && label !== id && !out[id]) out[id] = label\n }\n }\n return out\n }\n\n /**\n * ์ด ์๋ต์ด **์ค์ ๋ก ๊ฐ๋ฆฌํจ ๊ฒ๋ง** ๊ณจ๋ผ ๋ธ๋ค.\n *\n * ๋ชจ๋ธ ์ ์ฒด ํ๋ฅผ ๊ทธ๋๋ก ์ค์ผ๋ฉด ์๋ฆฌ๊ฐ 10๋ง์ธ ํ์ฅ์์ ๋ชฉ๋ก ํ ํ์ด์ง์ 10๋ง ์ค์ง๋ฆฌ ์ด๋ฆํ๊ฐ\n * ๋ฐ๋ผ์จ๋ค. ๋์จ ๊ฐ์ ๊ฑธ๋ฆฌ๋ ๊ฒ๋ง ์ฃ๋๋ค โ ๊ท๋ชจ์์ ์ฑ๋ฆฝํ๋ ์ ์ผํ ๋ฐฉ์์ด๋ค.\n */\n private namesFor(rows: any[], index: Record<string, string>): Record<string, string> {\n const out: Record<string, string> = {}\n const take = (v: any, depth: number): void => {\n if (v == null || depth > 4) return\n if (typeof v === 'string') { if (index[v]) out[v] = index[v]; return }\n if (Array.isArray(v)) { for (const x of v) take(x, depth + 1); return }\n if (typeof v === 'object') for (const x of Object.values(v)) take(x, depth + 1)\n }\n for (const r of rows) { take(r?.fields ?? r, 0); if (typeof r?.id === 'string' && index[r.id]) out[r.id] = index[r.id] }\n return out\n }\n\n /** ๋ฑ๊ธ id โ ํ์๋ช
ํค. ์ธ์ยท์ค๋นยท์์ฐยทํ๋ชฉ ๋ฑ๊ธ์ ํ ํ๋ก โ ์ด๋ ์์์ด๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๊ตฌ๋๋ค. */\n private classLabels(model: any): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of ['personnelClasses', 'equipmentClasses', 'assetClasses', 'materialClasses'])\n /* ํ์๋ช
์ `name` ์ด ์ ๋ณธ์ด๋ค โ ์ ๋ชจ๋ธ๋ `description` ์ ๋ด๊ณ ์์ด ๋ ๋ค ๋ณธ๋ค(์ฝ๊ธฐ ๊ฒฝ๊ณ ํ๋). */\n for (const c of (model?.[key] ?? []) as any[]) if (c?.id && (c.name || c.description)) out[c.id] = c.name || c.description\n return out\n }\n\n /**\n * ๊ด์ธก์ด ๋ณธ ์ด ํญ๋ชฉ โ ์ปค๋์ด ์คํ ์ค์ผ ๋๋ง. **์คํ ์ค์ด ์๋๋ฉด `null` ์ด์ง ๋น ๊ฐ์ฒด๊ฐ ์๋๋ค**\n * (๊ด์ธก์ด ์๋ ๊ฒ๊ณผ ๋น๊ตํ์ง ๋ชปํ ๊ฒ์ ๋ค๋ฅด๋ค).\n */\n /**\n * ์ด ๊ณต์ ์ **์์ฐ ๋ฅ๋ ฅ** โ ๊ณต์ ์ถ ํญ๋ชฉ์๋ง ๋ถ๋๋ค.\n *\n * ๊ตฌ๊ฐ์ **์์ผ๋ก 24์๊ฐ**์ด๋ค. ํ์ค์ ์ฝ์ ยท๊ฐ์ฉ์ *์์ผ๋ก ์ธ* ์ฉ๋์ด๋ฏ๋ก ์ง๋ ๊ตฌ๊ฐ์ ๋๊ณ ๋งํ๋ฉด\n * ๋ป์ด ์๊ณ , ์ด ํ๋ฉด์๋ ์ฌ์ฉ์๊ฐ ๊ณ ๋ฅธ ์ฐฝ์ด ์๋ค. ๊ทธ๋์ ํ๋ฃจ๋ฅผ ์ฐ๊ณ **๊ทธ ์ฌ์ค์ ๊ฐ๊ณผ ํจ๊ป ๋ธ๋ค**\n * (ํ๋ฉด์ด ๋ผ๋ฒจ๋ก ๋งํ๋ค) โ ์ด๋ ๊ตฌ๊ฐ์ ๊ฐ์ธ์ง ๋ชจ๋ฅด๋ฉด ๋ฅ๋ ฅ์ ์ฝ์ ์ ์๋ค.\n *\n * **์์๋ฅผ ์ง์ด๋ด์ง ์๋๋ค.** ์ฌ๊ธฐ์ ๋ด๋ ๊ฐ(์ํยท์ฝ์ ยท๋ฌ์ฑ๋ถ๊ฐยท๊ฐ์ฉยท์ ์ฝํ๋ ์ถ)์ ์ ๋ถ ๊ณต๊ธ ์ชฝ์ด๋ค โ\n * ์์ ์ยท์ฌ์ดํดยท๊ฐ๋๋ฅ ์์ ๋์จ๋ค. ์์๋ `ok`ยท๋ณ๋ชฉยทํ๋ฃจ ์ํ์๋ง ์ฐ์ด๊ณ ๊ทธ๊ฒ๋ค์ ๋ด์ง ์์ผ๋ฏ๋ก,\n * ๊ณ์ฐ์ ๋๊ธฐ๋ ์์ `1` ์ ๊ฒฐ๊ณผ์ ์์ง ์๋๋ค(์ฑ๊ณผ ํ๋ฉด์ ์ฌ์ฉ์๊ฐ ๊ฑธ์ด ๋ ๋ชฉํ๋ฅผ ์ด๋ค โ ๊ทธ ํ๋ฉด์\n * \"๋ชฉํ๋ฅผ ๋ผ ์ ์๋\" ์ ๋ตํ๊ณ ์ฌ๊ธฐ์๋ \"์ผ๋ง๋ ๋ ํ ์ ์๋\" ์ ๋ตํ๋ค).\n *\n * ์ ์คํ ์ค์ด๋ฉด ๋ถ์ด์ง ์๋๋ค โ ๋ฅ๋ ฅ์ ์ง๊ธ ์์์ ์ฌ์ค์์ ๋์ค๊ณ , ์๋ ๊ฒ์ ์ง์ด๋ด์ง ์๋๋ค.\n */\n private async capabilityOfOperation(\n domainId: string,\n instanceId: string,\n axis: string,\n itemId: string\n ): Promise<{ capability?: any } > {\n if (axis !== 'operations') return {}\n if (!TwinEngine.isRunning(domainId, instanceId)) return {}\n const from = new Date()\n const to = new Date(from.getTime() + 24 * 3_600_000)\n const monday = Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate() - ((from.getUTCDay() + 6) % 7))\n try {\n const rows = await TwinEngine.operationsCapability(\n domainId,\n { instanceId },\n 1,\n monday,\n { fromTime: from.toISOString(), toTime: to.toISOString() }\n )\n const report = rows.find((r: any) => r.instanceId === instanceId)?.report\n const entry = report?.perOperation?.find((o: any) => o.operation === itemId)\n if (!entry) return {}\n /* ๋ณ๋ชฉยท์ํ์ **๋ฃ์ง ์๋๋ค** โ ๊ทธ ๋๋ง ์์์ ๋ฌ๋ ค ์๊ณ , ์ฌ๊ธฐ์๋ ์์๋ฅผ ๋ชจ๋ฅธ๋ค. */\n return { capability: { window: report.window, operationsType: report.operationsType, ...entry } }\n } catch {\n /* ๋ฅ๋ ฅ์ ๋ชป ๋๋ค๊ณ ์์ธ๊ฐ ์ ์ด๋ฆด ์ด์ ๋ ์๋ค โ ์์ผ๋ฉด ์๋ ๋๋ก ๋ธ๋ค(ํ๋ฉด์ด ๊ทธ ์ค์ ์ ๊ทธ๋ฆฐ๋ค). */\n return {}\n }\n }\n\n /**\n * ์ด ํญ๋ชฉ์ ํธ์์ด **๊ด์ธกํ ๊ฐ** โ ๊ทธ๋ฆฌ๊ณ **๋ฌด์์ ๊ทผ๊ฑฐ๋ก** ์๋์ง.\n *\n * ๋ดํฌ๋ฅผ ํธ๋ ๊ฒ์ ๋น ๋จ๋ ค์(`unwrapState`) ๋ฌธ์ ์ถ์ ๊ด์ธก ์ด์ด ํต์งธ๋ก ๋น์ด ์๋ ์๋ฆฌ๋ค(์ฌ๋์ ์ด๋ฉด\n * ํธ์์ด ์๋ ๊ฒ์ด ์ ๋ถ `โ` ์๋ค).\n *\n * ๊ทผ๊ฑฐ๋ฅผ ๊ฐ๊ณผ ํจ๊ป ๋ธ๋ค โ ๋ชฉ๋ก์ด ์ค๋ ํด ์จ ๊ทธ๋๋ก๋ค(ยงtwinModelItemList). ๋ผ์ด๋ธ(๊ถ์)์ ์ ๋\n * ํด๋(ํ์)๋ **๊ฐ์ ๋ชจ์์ ๊ฐ์ฒด**๋ผ์, ๊ทผ๊ฑฐ๊ฐ ์์ผ๋ฉด ๋ค์ ๊ณ์ฐํ ๊ฐ์ \"์ง๊ธ ์ด๋ ๋ค\" ๋ก ์ฝ๋๋ค. ๊ทผ๊ฑฐ๋ฅผ\n * ์ค์ ์๋ฆฌ๊ฐ ์๋ ๋์์๋ ๋ฉ์ถ ํธ์์ ์ ๋์ ์์ ๊ณ์ฐํ์ง ์๊ณ `โ` ๋ก ๋๋ ํธ์ด ์ ์งํ๋ค. ์ด์ \n * ์๋ฆฌ๊ฐ ์์ผ๋ ๊ณ์ฐํ๋ค โ ๋ฉ์ถ ํธ์์๋ ๋ง์ง๋ง์ผ๋ก ์๋ ์ฌ์ค์ด ์๊ณ , ๊ทธ๊ฒ์ ๊ฐ์ถ ์ด์ ๋ ์๋ค.\n *\n * ๋ค์ ๊ณ์ฐํ ๊ฒ์ด ์์ผ๋ฉด(๋ชจ๋ธ๋ ์ ๋๋ ์๋ค) `null` ์ด๋ค โ **์๋ ๊ฒ๊ณผ ๋น๊ตํ์ง ๋ชปํ ๊ฒ์ ๋ค๋ฅด๋ค.**\n */\n private async observedOf(\n domainId: string,\n instanceId: string,\n axis: string,\n itemId: string\n ): Promise<{ value: any; basis: 'state' | 'journal'; foldedRevision?: number } | { absence: 'not-running' | 'not-observed' }> {\n const live = TwinEngine.isRunning(domainId, instanceId)\n let state: any = null\n let folded: number | undefined\n if (live) {\n state = unwrapState(TwinEngine.snapshot(domainId, instanceId))\n } else {\n try {\n const rec = await TwinEngine.recover(domainId, instanceId)\n folded = Number((rec as any)?.revision) || undefined\n /*\n * **์ด๋ฒคํธ๋ฅผ ํ๋๋ ๊ณ์ฐํ์ง ์์ ํด๋๋ ๊ด์ธก์ด ์๋๋ค.** ์ ๋์ด ๋น์ด๋ ๋ณต์์ ์ ์ธ์ ๋ค์ ํฌ์ํ\n * ๊ธฐ์ค์ ์ ๋๋ ค์ค๋ค โ ๊ทธ๊ฒ์ \"ํธ์์ด ๊ด์ธกํ ๊ฐ\" ์ด์ ์ค์ผ๋ฉด **์ ์ธ์ด ๊ด์ธก์ผ๋ก ์์ฅํ๋ค**\n * (์๋ณธ์ด ๋งํ ๊ฐ์ด ์ค๋ฅธ์ชฝ์๋ ๋๊ฐ์ด ์์, ๊ฒฌ์ค ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค). ๊ณ์ฐํ ๊ฒ์ด ์์ผ๋ฉด ์๋ค๊ณ ํ๋ค.\n */\n if (folded == null) return { absence: 'not-running' as const }\n state = unwrapState(rec)\n } catch {\n return { absence: 'not-running' as const }\n }\n }\n /* ๊ฐ์ ๊ท์น โ ์ ์ธ๋ ์๋ฆฌ์์ ์ฝ๋๋ค. ์ถ ์ด๋ฆ์ผ๋ก ์ฝ์ผ๋ฉด ์ค์ฒฉ๋ ์ถ์ด ์ธ์ ๋ ใ๊ด์ธก ์์ใ์ด ๋๋ค. */\n const bucket = state ? axisValueOf(state, axisInfo(axis) ?? { axis }) : null\n /*\n * **์ ๊ด์ธก์ด ์๋์ง ๋งํ๋ค.** ์์ ์๋ ๊ทธ๋ฅ `null` ์ด์๊ณ ํ๋ฉด์ ๊ทธ๊ฒ์ \"ํธ์์ด ์คํ ์ค์ด์ง ์์\"\n * ๋ก ์ฝ์๋ค โ ์คํ ์ค์ธ๋ฐ๋ ๊ทธ๋ ๊ฒ ๋งํ๋ค(๊ณต์ ์์ธ์์ ๊ด์ธก๋จ). ๊ณต์ ยท๋ ์ํผ์ฒ๋ผ **๊ด์ธก ์ถ์ด\n * ์๋ ๊ฒ**์ ํธ์์ด ๋๋ ๋ง๋ ๊ด์ธก์ด ์๋ค. ์ด์ ๊ฐ ๋ค๋ฅด๋ฉด ํ๋ฉด์ด ๋ค๋ฅด๊ฒ ๋งํด์ผ ํ๋ค.\n */\n if (!Array.isArray(bucket)) return { absence: 'not-observed' as const }\n /* ๊ฐ์ ๊ท์น โ ์ ์ธ์ด ๋งํ๋ ์๋ฆฌ๋ก ์ฐพ๋๋ค. `id` ๋ก๋ง ์ฐพ์ผ๋ฉด ์์ ๊ตฌ๊ฐ์ ์ด ์ ์๋ค. */\n const value = bucket.find((x: any) => idOf(x, axisInfo(axis)) === itemId)\n if (!value) return { absence: 'not-observed' as const }\n return { value, basis: live ? 'state' : 'journal', ...(folded != null ? { foldedRevision: folded } : {}) }\n }\n\n /**\n * ์ด์ด์ง ๊ฒ โ **์๋ฐฉํฅ.** ์ ์ธ๋ ๊ด๊ณ(`TWIN_RELATIONS`)๋ง ๋ฐ๋ผ๊ฐ๋ค.\n *\n * ๊ด๊ณ๋ฅผ ์ฝ๋๊ฐ ์์ง ์์ผ๋ฏ๋ก ๋๋ฉ์ธ์ด ๋์ด๋ ์ฌ๊ธฐ ์๋ ๊ฒ์ด ์๋ค. ๋์ **์ ์ธ์ ์๋ ๊ด๊ณ๋\n * ๊ทธ๋ฆฌ์ง ์๋๋ค** โ ์ง๋์ ์๋ ๊ธธ์ ๊ทธ๋ฆฌ๋ ๊ฒ๋ณด๋ค ์๋ค๊ณ ๋๋ ๊ฒ์ด ์ ์งํ๋ค.\n *\n * ๋ค์ด์ค๋ ์ชฝ(๋๊ฐ ๋๋ฅผ ๊ฐ๋ฆฌํค๋)์ ๊ทธ ์ถ์ ํญ๋ชฉ์ ์ดํด์ผ ์๋ค. ๊ท๋ชจ ๊ท์จ์ **๊น์ด 1 ยท ๋ฐฉํฅ๋ณ\n * ์ํ**์ด๊ณ , ๋์น๋ฉด ๋ช์ด ๋ ์๋์ง ๋งํ๋ค(๋ชฉ๋ก์ผ๋ก ๋ณด๋ผ ์ ์๊ฒ).\n */\n private async linksOf(\n domainId: string,\n inst: any,\n axis: string,\n itemId: string,\n /*\n * ์ด ํญ๋ชฉ ์์ โ **์ํ ์ถ์ ๋ฌธ์์์ ์ฐพ์ ์ ์๋ค.** ๋ถ๋ฅด๋ ์ชฝ์ด ์ด๋ฏธ ์์ ๋ค๊ณ ์์ผ๋ฏ๋ก ๋๊ฒจ\n * ๋ฐ๋๋ค. ์์ผ๋ฉด ์์ ์ฒ๋ผ ๋ฌธ์์์ ์ฐพ๋๋ค(๋ฌธ์ ์ถ์ ๊ฑฐ๋์ ๊ทธ๋๋ก).\n */\n self0?: any\n ): Promise<any> {\n const NEIGHBOR_MAX = 20\n const model = inst.model ?? {}\n\n /*\n * ๊ด์ธก ์ถ์ ํญ๋ชฉ๋ค โ **ํ ๋ฒ๋ง** ์ฝ๋๋ค(๊ด๊ณ๋ง๋ค ๋ค์ ๊ณ์ฐํ๋ฉด ์ ๋์ ์ฌ๋ฌ ๋ฒ ๊ณ์ฐํ๋ค).\n * ๋ผ์ด๋ธ๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ, ์์ผ๋ฉด ์ ๋ ํด๋. ์์ผ๋ฉด ๋น ๋ฐฐ์ด(์๋ ๊ฒ์ ์ง์ด๋ด์ง ์๋๋ค).\n */\n let observedState: any\n let observedLoaded = false\n const observedBucket = async (a: string): Promise<any[]> => {\n if (!observedLoaded) {\n observedLoaded = true\n try {\n observedState = TwinEngine.isRunning(domainId, inst.instanceId)\n ? unwrapState(TwinEngine.snapshot(domainId, inst.instanceId))\n : unwrapState(await TwinEngine.recover(domainId, inst.instanceId))\n } catch {\n observedState = null\n }\n }\n const b = observedState ? (observedState as any)[a] : null\n return Array.isArray(b) ? b : []\n }\n\n /*\n * **๊ด๊ณ๋ ์ ์ธ ์ดํ๋ก ํผ๋ค** โ ๋ฌธ์์์ ์ด ํญ๋ชฉ์ ์ฐพ์ ๊ทธ๊ฒ์ ๋ณธ๋ค.\n *\n * ๊ด๊ณ ์ ์ธ์ ํ๋ ์ด๋ฆ(`locations.parentId`)์ **์๋ณธ ๋ฌธ์์ ์ดํ**๋ค. ํ์ ๊ฐ์ ์ฌ์ค์ ์๊ธฐ\n * ์ปฌ๋ผ ์ด๋ฆ์ผ๋ก ๋ด๋๋ค(์๋ฆฌ์ ๊ตฌ์ญ์ `area` FK). ํ์ ๋ณด๊ณ `parentId` ๋ฅผ ์ฐพ์ผ๋ฉด ๋ ๋น์ด์\n * \"์ด์ด์ง ๊ฒ์ด ์๋ค\" ๋ก ์๋ฆฌ์ง ์๊ณ ๋ตํ๋ค โ ์ค์ ๋ก ๊ทธ๋ฌ๋ค.\n *\n * ์ด๋ ์ชฝ์ด ์ ๋ณธ์ธ๊ฐ๋ก ๊ตฌ๋ถํ๋ฉด ๋ต์ด ๋ถ๋ช
ํ๋ค: ๊ด๊ณ๋ฅผ ์ ์ธํ ์ดํ๊ฐ ๋ฌธ์ ์ดํ์ด๋ฏ๋ก **๋ฌธ์์์\n * ํผ๋ค.** ํ์๋ง ์๊ณ ๋ฌธ์์ ์๋ ํญ๋ชฉ(์์ ์ ์๋ค)์ ์ด์ด์ง ๊ฒ์ด ๋น์ง๋ง, ๊ทธ๊ฒ์ ์ฌ์ค์ด๋ค.\n */\n const axisPath = axisSource(axis) === 'document' ? axisInfo(axis)?.path : undefined\n const rawSelf = axisPath ? at(model, axisPath) : undefined\n const selfAll = Array.isArray(rawSelf) ? rawSelf : rawSelf ? [rawSelf] : []\n const self = self0 ?? selfAll.find((o: any) => idOf(o) === itemId)\n\n /*\n * โโ ํ ํ๋๊ฐ ๋ ๊ณณ์ ๊ฐ๋ฆฌํฌ ๋ (๊ณ์ฝ 0.9.24, 2026-09-17) โโโโโโโโโโโโโโโโโโโโโโ\n * `locations.parentId` ๋ ๋ค๋ฅธ ์๋ฆฌ(๋ผ์ธ ยท ์
ยท ์กด)์ด๊ฑฐ๋, ๊ทธ id ์ ์๋ฆฌ๊ฐ ์์ผ๋ฉด ๊ณต๊ฐ์ ๊ตฌ์ญ์ด๋ค\n * (`axis-or-external`). ์ด๋ ์ชฝ์ธ์ง๋ **์กฐํ๋ก** ๊ฐ๋ฆฐ๋ค โ ๊ท์น์ ๊ณ์ฝ์ `splitRelationIds` ํ๋๋ค.\n *\n * ํ๋ฉด์๋ ๋ ์ค๋ก ๋ธ๋ค: ์๋ฆฌ ์ชฝ์ ๊ทธ ์๋ฆฌ๋ก ๊ฑท๋ ๋งํฌ(`target.kind: 'axis'`), ๋๋จธ์ง๋ ๊ตฌ์ญ์ผ๋ก\n * ํ๋ฆฐ ๊ฒ(`external`). ํ ์ค์ ์์ผ๋ฉด ํ๋ฉด์ด ๊ทธ ์ค ์ ์ฒด๋ฅผ ์ธ๋ถ๋ก ๊ทธ๋ฆฌ๊ฑฐ๋ ์ ์ฒด๋ฅผ ๋งํฌ๋ก ๊ทธ๋ ค ๋ ์ค\n * ํ๋๊ฐ ํ๋ฆฐ๋ค. ์ ์ธ์ `declaredTarget` ์ผ๋ก ํจ๊ป ๋จ๊ธด๋ค.\n */\n const axisIdSets = new Map<string, Set<string>>()\n for (const r of relationsFrom(axis)) {\n if (r.target?.kind !== 'axis-or-external' || axisIdSets.has(r.target.axis)) continue\n const tInfo = axisInfo(r.target.axis)\n const raw = tInfo && axisSource(r.target.axis) === 'document' ? at(model, tInfo.path) : await observedBucket(r.target.axis)\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n axisIdSets.set(r.target.axis, new Set(all.map((o: any) => idOf(o)).filter(Boolean).map(String)))\n }\n const inAxis = (a: string, id: string) => axisIdSets.get(a)?.has(id) ?? false\n\n /* ๋๊ฐ๋ ์ชฝ โ ๋ด ํ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฒ. ์ ์ธ์ด ํ๋ ์ด๋ฆ์ ์๋ ค ์ค๋ค. */\n const out = relationsFrom(axis).map((r: any) => {\n const raw = self ? this.fieldValue(self, r.field) : []\n const ids = raw.filter((v: any) => v != null).map(String)\n return {\n via: r.via,\n field: r.field,\n optional: !!r.optional,\n /* ๋์์ด ์ถ์ด๋ฉด ๊ทธ ์ถ์ ํญ๋ชฉ์ผ๋ก ๊ฐ ์ ์๋ค. ํ์
ยท์ธ๋ถ(๊ตฌ์ญ)๋ฉด **๊ฐ ๊ณณ์ด ๋ค๋ฅด๋ค** โ\n ํ๋ฉด์ด ๋งํฌ๋ฅผ ๋ง๋ค์ง ๋ง์ง ์์์ผ ํ๋ฏ๋ก ๋์ ์ข
๋ฅ๋ฅผ ๊ทธ๋๋ก ๋ธ๋ค(๋ง๋ค๋ฅธ ๋งํฌ ๊ธ์ง). */\n target: r.target,\n /*\n * โโ ์ธ์ ์ ์ผ์ธ๊ฐ, ๊ทธ๋ฆฌ๊ณ ๋ด์ ๋ฌ๋ ๋๋ (2026-09-06) โโโโโโโโโโโโโโโโ\n * ํ์ ์ ๊ณ์ฝ์ด ๋ธ๋ค. ํ๋ฉด์ด `standing` ์ ๋ณด๊ณ ์ค์ค๋ก ์ ํ๋ฉด ๊ฐ์ด ํ๋ ๋ ๋ ํ ํ๋ฉด๋ง\n * ๋ฐ๋ผ๊ฐ๋ค. UX ๋ ์ธ์ด ์ด ์นธ์ ์์ฒญํ๊ณ , ๊ทธ์ชฝ์ ์๋ ๊ท์น์ ๊ฑท์๋ค.\n *\n * `tense` ๊ฐ ์๋ ๊ด๊ณ๋ `cacheable: false` ๋ค. ๋ชจ๋ฅผ ๋๋ ๋ค์ ์กฐํํ๋ ์ชฝ์ด ๋ซ๋ค โ\n * ๋ก์ ๊ฐ์ ์์ ์๊ฒ ๋ณด์ฌ ์ฃผ๋ ๊ฒ์ด ๋น์ด ์๋ ๊ฒ๋ณด๋ค ๋์๋ค. ๊ทธ๋์ `tense` ๋ ์์ ์\n * ์๊ณ `cacheable` ์ ์ธ์ ๋ ์๋ค.\n */\n tense: tenseOf(r),\n cacheable: isCacheableTense(tenseOf(r)),\n ids: ids.slice(0, NEIGHBOR_MAX),\n total: ids.length\n }\n }).flatMap((l: any) => {\n if (l.target?.kind !== 'axis-or-external') return [l]\n const all = self ? this.fieldValue(self, l.field).filter((v: any) => v != null).map(String) : []\n const split = splitRelationIds(l.target, all, inAxis)\n const part = (target: any, ids: string[]) => ({ ...l, target, declaredTarget: l.target, ids: ids.slice(0, NEIGHBOR_MAX), total: ids.length })\n const parts = [\n ...(split.axis?.ids.length ? [part({ kind: 'axis', axis: split.axis.axis }, split.axis.ids)] : []),\n ...(split.external?.ids.length ? [part({ kind: 'external', entity: split.external.entity }, split.external.ids)] : [])\n ]\n /* ๋น์ด ์๋ ๊ด๊ณ๋ ๋ธ๋ค(์๋ ์ฃผ์) โ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ์์ผ๋ฉด ์ ์ธ ๊ทธ๋๋ก ํ ์ค. */\n return parts.length ? parts : [l]\n })\n\n /*\n * โโ ๋ฐ์ ๊ฐ๋ฆฌํค๋ ๊ด๊ณ๋ฅผ ํผ๋ค (2026-09-05) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ณ์ฝ์ด `kind: 'external'` ์ ์ ์ธํ๋ฉฐ ใํด์๋ ํธ์คํธ๊ฐ ํ๋คใ๊ณ ์ ์ด ๋์๋๋ฐ **๋ถ๋ฅด๋ ๊ณณ์ด\n * 0์ด์๋ค.** ๊ทธ๋์ ํ๋ฉด์ id ๋ง ๋ฐ๊ณ ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง, ๊ฐ ์ ์๋์ง ๋ชฐ๋๋ค.\n *\n * ๋ชป ํ๋ฉด **๋ชป ํผ๋ค๊ณ ๋งํ๋ค** โ ๋งํฌ๋ฅผ ์ง์ฐ๋ฉด ํ๋ฉด์ด ใ๊ทธ๋ฐ ๊ด๊ณ๊ฐ ์๋คใ๋ก ์ฝ๊ณ , ์ค์ ๋ก๋\n * ใ์๋ฌด๋ ๋ตํ ์ ์๋คใ๋ค. ์ฌ๋์ด ํ ์ผ์ด ๋ค๋ฅด๋ค.\n */\n for (const l of out) {\n if (l.target?.kind !== 'external' || !l.ids.length) continue\n const got = await resolveExternal(l.target.entity, domainId, l.ids, { instanceId: inst.instanceId }, m => twinWarn(m))\n if (got.refs) (l as any).refs = got.refs\n else (l as any).unresolved = got.unresolved\n }\n\n /*\n * **๋น์ด ์๋ ๊ด๊ณ๋ ๋ธ๋ค.** ์์ ์๋ `total > 0` ๋ง ๋๋ค โ ๊ทธ๋ฌ๋ฉด ์ฌ๋์ ์๋ค๋ ๊ฒ์กฐ์ฐจ ๋ชจ๋ฅธ๋ค.\n *\n * ์ค์ธก์ผ๋ก ๊ทธ ๊ฐ์ด ๋๋ฌ๋ฌ๋ค(2026-09-05): ์ค๋น 64๋์ ์ํ ๊ท๊ฒฉ์ด ์ ๋ถ ๋น์ด ์๋ ๊ฒ์ ใ๋น ๋ฌถ์ใ\n * ์ผ๋ก ์ธ์ ๋๋ **ใ์ด ์ค๋น์ ๊ฒ์ฌ ๊ธฐ์ค์ด ์๋คใ์ ใํ๋ฉด์ด ๊ทธ๊ฒ์ ์ ๋ณธ๋คใ๊ฐ ๊ตฌ๋ณ๋๋ค.** ์ง์ฐ๋ฉด\n * ๊ทธ ๊ตฌ๋ณ์ด ์ฌ๋ผ์ง๋ค.\n *\n * ์ ํ์ด ์๋ ๊ด๊ณ(`optional: false`)๊ฐ ๋น์ด ์์ผ๋ฉด ๊ทธ๊ฒ์ **๋์ด์ง ์ฐธ์กฐ**์ด๊ณ , ๊ทธ ์ฌ์ค์ด ํ๋ฉด์\n * ๋ฟ์์ผ ํ๋ค.\n */\n\n /* ๋ค์ด์ค๋ ์ชฝ โ ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํญ๋ชฉ๋ค. ๊ทธ ์ถ์ด ํ์ด๋ฉด DB ๊ฐ ์ธ๊ณ , ๋ฌธ์๋ฉด ๋ฌธ์๋ฅผ ์ ์ ์กฐํํ๋ค. */\n const incoming: any[] = []\n /*\n * ๋ฐ์์ ์ค๋ ๊ฒ์ ํจ๊ป ์ฃ๋๋ค โ ์ ํ์ด ์๊ธฐ ์ ์ฅ์์์ ๋ชจ์๋ค(์ปค๋์ ๊ทธ ํ๋ฅผ ๋ชจ๋ฅธ๋ค).\n * ๊ฝํ ํด์๊ธฐ๊ฐ ์์ผ๋ฉด ๋น ๋ฐฐ์ด์ด๊ณ ๊ทธ๊ฒ์ ์ ์์ด๋ค.\n */\n incoming.push(...(await externalIncoming(domainId, inst.instanceId, axis, itemId, m => twinWarn(m))))\n for (const r of relationsTo(axis)) {\n const fromInfo = axisInfo(r.from)\n if (!fromInfo) continue\n const hits: string[] = []\n /*\n * ํ์ `axis` ๊ด๊ณ๋ง ๋ด๋๋ค. `axis-or-external`(์๋ฆฌ โ ๋ถ๋ชจ ์๋ฆฌ ๋๋ ๊ตฌ์ญ)์ ํ์ ๊ตฌ์ญ FK(`area`)๋ง\n * ์๊ณ ๋ถ๋ชจ **์๋ฆฌ**๋ฅผ ๋ด๋ ์นธ์ด ์์ด์, ํ์์ ์ธ๋ฉด ใ์ด ์กด ์๋ ์๋ฆฌ๋คใ์ด ์กฐ์ฉํ 0์ด ๋๋ค.\n * ๊ทธ ๊ด๊ณ๋ ์ ์ธ ์ดํ๊ฐ ์ฌ๋ ๋ฌธ์์์ ์ผ๋ค.\n */\n const row = r.target?.kind === 'axis' ? ROW_BACKED[r.from] : undefined\n if (row) {\n const repo = getRepository(row.entity)\n /*\n * **FK ๋ ๋ถ๋ฅด์ง ์์ผ๋ฉด ์ค์ง ์๋๋ค.** ๊ด๊ณ ํ๋๋ฅผ ๋ก๋ฉํ์ง ์๊ณ ์กฐํํ๋ฉด ๊ฐ์ด ๋ `undefined`\n * ๋ผ์ \"๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ํ๋๋ ์๋ค\" ๋ก ์๋ฆฌ์ง ์๊ณ ๋ตํ๋ค โ ์ค์ ๋ก ๊ทธ๋ฌ๋ค(์ค๋น ๋์ด ์ด ์๋ฆฌ๋ฅผ\n * ๊ธฐ์ค์ผ๋ก ์ผ๋๋ฐ ์ด์์ด ๋น์ด ์์๋ค).\n *\n * ์ด๋ ํ๋๊ฐ ๊ด๊ณ์ธ์ง๋ **์ํฐํฐ ๋ฉํ๋ฐ์ดํฐ**๊ฐ ์๋ค. ์ถ๋ง๋ค ํ๋ฅผ ๋๋ฉด ์ถ์ด ๋ ๋๋ง๋ค\n * ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์ผ ํ๊ณ , ๊ณ ์น๋ ๊ฒ์ ์์ผ๋ฉด ๊ฐ์ ์นจ๋ฌต์ด ๋ค์ ์๊ธด๋ค.\n */\n const relationNames = new Set(repo.metadata.relations.map(rel => rel.propertyName))\n const field = r.field.replace(/\\[\\]$/, '').split('.')[0]\n const rows: any[] = await repo.find({\n where: { domain: { id: domainId } as any, instance: { id: inst.id } as any },\n ...(relationNames.has(field) ? { relations: [field] } : {}),\n take: 5000\n })\n for (const x of rows) {\n /* ํ์์๋ ๊ด๊ณ๊ฐ FK ๊ฐ์ฒด์ด๊ฑฐ๋ ์ปฌ๋ผ์ด๋ค โ ์ด๋ฆ ํ๋ณด๋ฅผ ์์๋๋ก ๋ณธ๋ค. */\n const v = this.relationValueOfRow(x, r.field, axis)\n if (v.includes(itemId)) hits.push(x[row.idColumn])\n }\n } else {\n /*\n * ๋ค์ด์ค๋ ์ชฝ์ ํ๋๋ค โ **์ด๋๋ฅผ ํ์์ง๋ ๊ทธ ์ถ์ `source` ๊ฐ ์ ํ๋ค.**\n *\n * ๋ฌธ์ ์ถ์ ๋ชจ๋ธ์์, ๊ด์ธก ์ถ์ **์ํ์์** ํ๋๋ค(์์
โ ์ด ์ค๋, ์์
โ ์ด ์๋ฆฌ). ํ๋์\n * ๊ด์ธก ์ถ์ ๊ฑด๋๋ฐ์๋๋ ์ค๋ ์์ธ๊ฐ \"๋ฟ๋ ๊ด๊ณ๊ฐ ์์ต๋๋ค\" ๋ผ๊ณ ๋ตํ๋ค โ `tasks.orderId` ๋ฅผ\n * ์ ์ธํด ๋๊ณ ๋ ๊ทธ ๊ด๊ณ๋ฅผ ๊ทธ๋ฆฌ์ง ์์ ๊ฒ์ด๋ค. ์ ์ธํ ๊ฒ์ ๊ทธ๋ฆฌ์ง ์์ผ๋ฉด ์ ์ธ์ด ๊ฑฐ์ง์ด ๋๋ค.\n *\n * ๊ท๋ชจ: ์ํ๋ ์ง๊ธ์ ์ฌ์ค๋ง ๋ด์ ์ ํํ๊ณ , ์ํ๊ณผ ์ด๊ณ๋ ๋ฌธ์ ์ถ๊ณผ ๊ฐ์ ๊ท์จ์ ์ด๋ค\n * (๋์น๋ฉด ๋ช์ด ๋ ์๋์ง ๋งํ๋ค). ์ ๋ ์ ์ฒด๋ฅผ ์ ์ ์กฐํํ๋ ์ผ์ ์ฌ๊ธฐ์ ํ์ง ์๋๋ค.\n */\n const raw =\n axisSource(r.from) === 'document' ? at(model, fromInfo.path) : (await observedBucket(r.from))\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n for (const x of all) if (this.fieldValue(x, r.field).map(String).includes(itemId)) {\n const id = idOf(x)\n if (id) hits.push(id)\n }\n }\n /*\n * **๋ค์ด์ค๋ ์ชฝ๋ ๋น ๊ฒ์ ๋ธ๋ค** โ ๋๊ฐ๋ ์ชฝ๊ณผ ๊ฐ์ ์ด์ ๋ค(์ ์ฃผ์).\n *\n * ใ์ด ์ค๋น๋ฅผ ๊ฐ๋ฆฌํค๋ ์์
์ด ์๋คใ๋ ์ฌ์ค์ด๊ณ , ๊ทธ๊ฒ์ ์ง์ฐ๋ฉด ํ๋ฉด์ ๊ทธ ๋ฌผ์์ ๋ฌผ์ด๋ณด์ง๋\n * ๋ชปํ๋ค. ์ถ๋น ๋ค์ด์ค๋ ๊ด๊ณ๋ 0~8๊ฐ๋ค(์ค์ธก 2026-09-05: ์ํ๊ท๊ฒฉ 8 ยท ์๋ฆฌ 6 ยท ๋๋จธ์ง 2 ์ดํ)\n * โ ๋ค ๋ด๋ ์ฝ์ ์ ์๋ ๋ถ๋์ด๋ค.\n *\n * ๊ฐ๋ ์ ๋ ๋ค. ํ ์ถ์ 0์ ์์๋ด๋ ค๋ฉด ์ด๋ฏธ `find` ๋ฅผ ๋๋ ธ๊ณ , ๊ทธ 0์ ๋งํ๋ ๋น์ฉ์ ์๋ค.\n *\n * `externalIncoming` ์ ์ฌ๊ธฐ์ ์์ธ๋ค โ ๊ทธ์ชฝ์ ๋น ๋ฌถ์์ ใ๊ทธ ์ ํ์ด ์ด ์ถ์ ์ ๋ณธ๋คใ๋\n * ๋ป์ด๊ณ ์ฐ๋ฆฌ ์ ์ธ์ ์๋ ๊ด๊ณ์ด๋ฏ๋ก ํ ๋ง์ด ์๋ค.\n */\n incoming.push({\n via: r.via,\n from: r.from,\n field: r.field,\n tense: tenseOf(r),\n cacheable: isCacheableTense(tenseOf(r)),\n ids: hits.slice(0, NEIGHBOR_MAX),\n total: hits.length\n })\n }\n\n return { out, incoming }\n }\n\n /**\n * ์ ์ธ ํ๋ ๊ฒฝ๋ก โ ๊ฐ๋ค. `inputs[].material` ์ฒ๋ผ **๋ฐฐ์ด์ ์ง๋๋ ๊ฒฝ๋ก**๋ฅผ ๋ค๋ฃฌ๋ค.\n * ๋ฐฐ์ด ํ๊ธฐ(`[]`)๊ฐ ๊ด๊ณ ์ ์ธ์ ๋ฌธ๋ฒ์ด๋ฏ๋ก ๊ทธ๊ฒ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๊ณง ์ ์ธ์ ์กด์คํ๋ ๊ฒ์ด๋ค.\n */\n private fieldValue(obj: any, field: string): any[] {\n let cur: any[] = [obj]\n for (const seg of field.split('.')) {\n const isArray = seg.endsWith('[]')\n const key = isArray ? seg.slice(0, -2) : seg\n const next: any[] = []\n for (const c of cur) {\n if (c == null) continue\n const v = c[key]\n if (v == null) continue\n if (Array.isArray(v)) next.push(...v)\n else next.push(v)\n }\n cur = next\n }\n return cur.map(v => (typeof v === 'object' && v !== null ? idOf(v) ?? v : v)).filter(v => v != null)\n }\n\n /**\n * ํ์์ ๊ด๊ณ ๊ฐ์ ๊บผ๋ธ๋ค โ FK ๋ ๊ฐ์ฒด(๊ด๊ณ ๋ฏธ๋ก๋ฉ์ด๋ฉด ์์)์ด๊ณ ๋ฌธ์ ํ๋๋ช
๊ณผ ์ปฌ๋ผ๋ช
์ด ๋ค๋ฅผ ์ ์๋ค.\n *\n * ์ฌ๊ธฐ์ ์ปฌ๋ผ ์ด๋ฆ์ **์ถ๋ง๋ค ํ๋ก ๋์ง ์๋๋ค.** ํ๋ณด๋ฅผ ์์๋๋ก ๋ณด๋ ํธ์ด ์ถ์ด ๋ ๋ ๊ณ ์น ๊ฒ์ด\n * ์๋ค: ๊ด๊ณ ํ๋ ์ด๋ฆ ๊ทธ๋๋ก ยท ๊ทธ ์ด๋ฆ์ FK ๊ฐ์ฒด์ id ์ปฌ๋ผ.\n */\n private relationValueOfRow(rowObj: any, field: string, targetAxis: string): string[] {\n const key = field.replace(/\\[\\]$/, '').split('.')[0]\n const v = rowObj[key]\n if (v == null) return []\n if (typeof v === 'string') return [v]\n if (Array.isArray(v)) return v.map(x => (typeof x === 'string' ? x : idOf(x) ?? '')).filter(Boolean)\n /* FK ๊ฐ์ฒด โ ๋์ ์ถ์ id ์ปฌ๋ผ์ผ๋ก ์ฝ๋๋ค(๊ด๊ณ๋ฅผ ๋ก๋ฉํ์ง ์์์ผ๋ฉด ๊ฐ์ด ์๊ณ , ๊ทธ๊ฒ๋ ์ฌ์ค์ด๋ค). */\n const idCol = ROW_BACKED[targetAxis]?.idColumn\n const got = idCol ? v[idCol] : idOf(v)\n return got ? [String(got)] : []\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-model-mutation.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-model-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\n\nimport { ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinSpace } from '../twin-space/twin-space.js'\nimport { TwinEngine } from '../../engine/twin-engine.js'\nimport {\n applyDeclarationLayers,\n applyLocalDeclarations,\n mergeLocalDeclarations,\n restoreRevoked,\n revokeLocalDeclarations,\n validateLocalDeclarations,\n type DeclarationRevocation,\n type LocalDeclaration\n} from '../../engine/local-declarations.js'\nimport { knownOperationKinds } from '../../engine/operation-basis.js'\nimport { projectStructure } from './project-structure.js'\n\n/*\n * ๊ตฌ์กฐ ํ
์ด๋ธ **์ฌ์์ฑ** โ ์ ์ฅ๋ ๋ชจ๋ธ ๋ฌธ์๋ก ์บ์๋ฅผ ๋ค์ ๊ทธ๋ฆฐ๋ค.\n *\n * โโ ์ด๊ฒ์ ์๋ณธ์์ ๋ค์ ์ฝ๋ ๊ฒ๊ณผ ๋ค๋ฅด๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `resyncTwin` ์ **์๋ณธ**์ ๊ฐ์ ํ์ฅ์ด ์ง๊ธ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ค์ ์ฝ๋๋ค(๋ชจ๋ธ์ด ๋ฐ๋ ์ ์๋ค).\n * ์ฌ๊ธฐ๋ **์๋ฌด๊ฒ๋ ๋ค์ ์ฝ์ง ์๋๋ค** โ ์ด๋ฏธ ๊ฐ๊ณ ์๋ ๋ชจ๋ธ ๋ฌธ์๋ฅผ ํ
์ด๋ธ๋ก ๋ค์ ํผ๋ค.\n * ๊ทธ๋์ ๋ชจ๋ธ์ ํ ๊ธ์๋ ๋ฐ๋์ง ์๊ณ , ํ
์ด๋ธ๋ง ๋ฌธ์์ ๊ฐ์์ง๋ค.\n *\n * โโ ์ ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ด ์ฑ์๋ **ํฌ์์ด ์๊ธฐ๊ธฐ ์ ์ ๋ง๋ค์ด์ง ํธ์**์ด ์๋ค. ๋ฌธ์์๋ ์๋ฆฌ 6๊ฐยท์ค๋น 32๋๊ฐ ์๋๋ฐ\n * ํ
์ด๋ธ์ 0ํ์ด๊ณ , ๊ทธ์ค ์ผ๋ถ๋ ์์ฒ๋ ๊ธฐ์ตํ์ง ์์ ๋ค์ ์ฝ์ ์์กฐ์ฐจ ์๋ค โ ์กฐํ ํ๋ฉด์ด\n * ์๊ตฌํ \"ํ
์ด๋ธ์ด ๋ค์ ์์ต๋๋ค\" ๋ง ๋งํ๋ ๋ง๋ค๋ฅธ ์ํ๋ค.\n *\n * โโ ์ฐ๊ธฐ ๊ฒฝ๋ก๊ฐ ๋์ด ๋๋ ๊ฒ ์๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์๋๋ค. ๊ทธ ๊ท์จ(ADR-0032-D)์ด ๋ง๋ ๊ฒ์ **๋ค๋ฅธ ์ง์ค์ด ํ์ ์ฐ๋ ๊ฒ**์ด๋ค(์: ํฑ ๋ฃจํ๊ฐ ๊ด์ธก์\n * ๋ฐ์ด ๋ฃ๊ธฐ). ์ฌ๊ธฐ์ ์ฐ๋ ๊ฒ์ ์ธ์ ์คํธ๊ฐ ์ฐ๋ ๊ฒ๊ณผ **๊ฐ์ ๋ฌธ์ยท๊ฐ์ ํฌ์**์ด๊ณ , ๊ทธ ๊ท์จ์ด ํจ๊ป\n * ์๊ตฌํ \"์ฌ์์ฑ ๊ฐ๋ฅ์ฑ์ ๊ตฌ์กฐ๋ก\" ๊ฐ ๋ฐ๋ก ์ด๊ฒ์ด๋ค. ์บ์๋ ์ธ์ ๋ ๋ค์ ๊ทธ๋ฆด ์ ์์ด์ผ ํ๋ค.\n */\n/**\n * ํ์ฅ ๊ฒน์ **๊ทธ ํ์ฅ์ ํธ์ ์ ๋ถ**์ ์น๋๋ค โ ๊ทธ๋ฌ์ง ์์ผ๋ฉด ใํ์ฅ ์ ์ฒด๊ฐ ์ฝ๋๋คใ๊ฐ ๊ฑฐ์ง์ด ๋๋ค.\n *\n * โโ ์ ํ์ํ๊ฐ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฒ์์๋ ํธ์ถํ ํธ์์๋ง ์น์๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ์ ํ์ฅ์ ๋ค๋ฅธ EMS ํธ์์ **๋ค์์ ์๊ธฐ๊ฐ ๋ค์ ๊ทธ๋ ค์ง ๋\n * ๊น์ง** ์ ๊ฐ์ผ๋ก ๋์๊ฐ๋ค โ ํ๋ฉด์ ใํ์ฅ ์ ์ฒดใ๋ผ๊ณ ๋งํ๋๋ฐ ์ค์ ๋ก๋ ํ ํธ์๋ง ๋ฐ๋ ์ํ๋ค.\n *\n * ํธ์๋ง๋ค ์๊ธฐ ๊ฒน์ ๊ทธ๋๋ก ์น๋๋ค(์ข์ ๊ฒ์ด ์ด๊ธด๋ค). ๋๊ณ ์๋ ๋ฏธ๋ฌ๋ ์ง๊ธ ๋ฐ๊ณ , ์๋ฎฌ๋ ์ด์
ยท์ ์ง\n * ํธ์์ ๋ฌธ์์ ๋ฐ์ํ๋ค(์ฌ๊ธฐ๋ ๋ ๋ฐ๋๋ค) โ ๊ทธ ์ฐจ์ด๋ฅผ ๊ฒฐ๊ณผ์ ์ ์ด ๋๋ ค์ค๋ค.\n *\n * ์น์ ์๋ฆฌ๊ฐ ์๋ ํธ์์ **์ ์**์ด๋ค(์ฐฝ๊ณ ํธ์์ ์๊ธ ์๋ฆฌ๊ฐ ์๋ค). ๊ทธ ์ฌ์ค๋ ์ธ์ด ๋๋ ค์ค๋ค โ\n * ใํ์ฅ์ ๋ฃ์๋๋ฐ ์๋ฌด ํธ์๋ ์ ๋ฐ์๋คใ๋ ์ฌ์ฉ์๊ฐ ์์์ผ ํ ์ฌ์ค์ด๋ค.\n */\nasync function spreadSpaceLayer(\n domainId: string,\n spaceId: string,\n spaceLayer: LocalDeclaration[],\n comment: string\n): Promise<{\n spaceLayerApplied: LocalDeclaration[]\n twins: { instanceId: string; applied: string; landed: boolean; error?: string }[]\n}> {\n const repo = getRepository(TwinInstance)\n const twins = await repo.find({ where: { domain: { id: domainId }, spaceId } })\n const report: { instanceId: string; applied: string; landed: boolean; error?: string }[] = []\n let latest = spaceLayer\n for (const t of twins) {\n if (!t.model) continue\n const out = applyDeclarationLayers(t.model, latest, (t.localDeclarations ?? []) as LocalDeclaration[])\n /* ๊ธฐ์ต(`replaced`)์ **์นํ ํธ์์์๋ง** ์ฑ์์ง๋ค โ ์๋ฆฌ๊ฐ ์๋ ํธ์์ ์ง๋๋ฉฐ ์ง์์ง์ง ์๊ฒ ์ด์ด ๋ ๋ค. */\n latest = out.spaceLayerApplied\n const landed = !out.missingTargets.some(m => m.scope === 'space' && spaceLayer.some(d => d.id === m.id && d.target === m.target))\n t.localDeclarations = out.instanceLayerApplied as any\n const running = TwinEngine.modeOf(domainId, t.instanceId)\n /*\n * **ํธ์ ํ๋๊ฐ ์คํจํด๋ ๋๋จธ์ง๋ ๋ฐ๋๋ค** โ ๋ค๋ง ์๋ฆฌ์ง ์๊ณ ๋๊ธฐ์ง ์๋๋ค(2026-08-18 ์ค์ธก).\n *\n * ํ์ฅ ์ ์ธ์ ์ฒ์ ํผ๋จ๋ ธ์ ๋ ๊ทธ ํ์ฅ์ ์ด๋ค ํธ์์์ ๊ตฌ์กฐ ํฌ์์ด ํฐ์ก๊ณ (๊ทธ ํธ์ ๋ชจ๋ธ์ ์ค๋น id๊ฐ\n * ๊ฒน์ณ ์์๋ค โ ์ ์ฌ ๊ฒฐํจ), ๊ทธ ์์ธ๊ฐ ์ฌ๋ผ์ **ํ ํธ์ ๋๋ฌธ์ ํ์ฅ ์ ์ฒด ์ ์ธ์ด ์คํจ**ํ๋ค. ์ฌ์ฉ์๋\n * ๊ฐ์ ๋ฃ์๋๋ฐ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ ๊ฒ์ผ๋ก ๋ณธ๋ค.\n *\n * ๊ทธ๋ ๋ค๊ณ ์ผํค๋ฉด ๋ ๋์๋ค: ใํ์ฅ ์ ์ฒด๊ฐ ์ฝ๋๋คใ๊ณ ๋งํ ๋ค ๋ช ํธ์์ด ๋ชป ์ฝ๋ ์ํ๊ฐ ๋๋ค. ๊ทธ๋์\n * ํธ์๋ณ๋ก ์ด์ ๋ฅผ ์ ์ด ๋๋ ค์ค๋ค.\n */\n try {\n if (running === 'live') {\n await repo.save(t)\n await TwinEngine.adoptStructure(domainId, t.instanceId, out.model, comment)\n report.push({ instanceId: t.instanceId, applied: 'running', landed })\n continue\n }\n t.model = out.model\n await repo.save(t)\n await projectStructure(domainId, t.instanceId, out.model, t.instanceId)\n report.push({ instanceId: t.instanceId, applied: running ? 'on-restart' : 'stored', landed })\n } catch (e: any) {\n report.push({ instanceId: t.instanceId, applied: 'failed', landed, error: e?.message ?? 'failed' })\n }\n }\n return { spaceLayerApplied: latest, twins: report }\n}\n\n@Resolver()\nexport class TwinModelMutation {\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Rebuild this twin's structure tables from the model document it already holds. Reads nothing from the source: the model is unchanged and only the cache is redrawn. Use resyncTwin instead when the source itself may have changed.\"\n })\n async reprojectTwinModel(@Arg('instanceId') instanceId: string, @Ctx() context: ResolverContext): Promise<any> {\n const domainId = context.state.domain.id\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return { ok: false, error: `unknown twin: ${instanceId}` }\n if (!inst.model) return { ok: false, error: `twin \"${instanceId}\" has no model document โ there is nothing to draw from` }\n\n try {\n /*\n * ์ถ์ฒ ํ์์ **์ด ํธ์ ์์ **์ด๋ค. ์ธ์ ์คํธ๋ ๊ฐ์ ๊ฐ์ ๋ฃ๋๋ค(`master.source` = instanceId) โ\n * ์ฌ๊ธฐ์ ๋ค๋ฅธ ๊ฐ์ ๋ฃ์ผ๋ฉด ๊ฐ์ ํ์ด ์ด๋์ ์๋์ง๊ฐ ๊ฒฝ๋ก๋ง๋ค ๋ฌ๋ผ์ง๋ค.\n */\n const report = await projectStructure(domainId, instanceId, inst.model, instanceId)\n return { ok: true, ...report }\n } catch (e: any) {\n return { ok: false, error: e?.message || 'reprojection failed' }\n }\n }\n\n /**\n * ํ์ฅ์ด ์ ํ๋ ์๋ฅผ ํธ์์ ์น๋๋ค โ **๊ตฌ์กฐ๋ ์์ฒ์ด, ์๋ ํ์ฅ์ด.**\n *\n * โโ ์ ์ด ๋ฌธ์ด ํ์ํ๋ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋ฅํฐ๋ก ๋ง๋ ํธ์์ ๊ณํต๋ยท๊ณ๋ ์ง์ ์ ์ ์์คํ
์์ ์ฝ์ด ์จ๋ค. ๊ทธ๋ฐ๋ฐ ์๊ธ ๋จ๊ฐยท๊ณ์ฝ ์ ๋ณดยท\n * ์ถ์ ์ง ์ถฉ์ ์จ์ ์ ์์คํ
์ด ๋ชจ๋ฅธ๋ค(SCADA ๊ฒ์ดํธ์จ์ด๋ ์ฐ๋ฆฌ ์ ๊ธฐ ๊ณ์ฝ์ ์์ง ๋ชปํ๋ค). ๊ทธ๋์\n * ๊ณ๋์ด ํ๋ฅด๋ ํธ์์์๋ **๊ธ์ก์ด ์์ํ ๋์ค์ง ์์๋ค** โ ๋ฃ์ ๋ฌธ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ค.\n *\n * ๊ฐ์ `model` ์ ์ง์ ์ฐ์ง ์๊ณ **๊ฒน**์ผ๋ก ๋ณด๊ดํ๋ค: ๋ชจ๋ธ์ ์์ฒ์ ์ฌ๋ณธ์ด๋ฏ๋ก ๋ค์ ์ฝ๊ธฐ๊ฐ ๊ทธ๊ฒ์\n * ์๋ก ๊ทธ๋ฆฌ๋ฉด ์ง์ ์ด ๊ฐ์ ์ค๋ฅ ์์ด ์ฌ๋ผ์ง๋ค. ๊ฒน์ ๋ชจ๋ธ์ ๊ทธ๋ฆด ๋๋ง๋ค ๋ค์ ์นํ๋ค.\n *\n * โโ ๋๊ณ ์๋ ํธ์์ ์ด๋ป๊ฒ ๋ฐ์ํ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ฏธ๋ฌ๋ **๋์ ์ค์** ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋๋ค(ํ์ค์ ๋ฉ์ถ์ง ์๋๋ค). ์๋ฎฌ๋ ์ด์
์ ๋ฐ์ง ์๋๋ค โ ์กฐ๊ฑด์ด\n * ๋ฐ๋ ์คํ์ ๋ค๋ฅธ ์คํ์ด๊ณ , ์ปค๋์ด ๊ทธ๋ ๊ฒ ๊ฑฐ์ ํ๋ค. ๊ทธ๋๋ ์ ์ฅ๋ง ํ๊ณ **๊ทธ ์ฌ์ค์ ๋งํ๋ค**:\n * ์๋ฆฌ์ง ์๊ณ ์ฑ๊ณต์ผ๋ก ๋ตํ๋ฉด ์ฌ์ฉ์๋ ์ง๊ธ ํ๋ฉด์ ์๊ฐ ์ ์ ์ธ์ผ๋ก ๊ณ์ฐ๋ ์ค๋ก ์ฝ๋๋ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Declare locally-owned numbers on a twin (tariff, contract, state of charge) as a layer on top of the reference-derived model, so a resync cannot drop them. Values carry source: local, telling every consumer that the authority for them sits here rather than in the source system. Values are validated against the kernel's property specification (unit and range). Mirrors adopt them while running; simulations keep their current declarations until restart, and the result says so.\"\n })\n async declareTwinProperties(\n @Arg('instanceId') instanceId: string,\n @Arg('declarations', type => [ScalarObject]) declarations: any[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinInstance)\n const inst = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return { ok: false, error: `unknown twin: ${instanceId}` }\n if (!inst.model) return { ok: false, error: `twin \"${instanceId}\" has no model document โ provision it before declaring values on it` }\n\n /*\n * **์ ์ธ์ด ํ๋๋ ๋์ฐฉํ์ง ์์ ๊ฒ**๊ณผ **๋ฐ์์ง๋ง ๋ค ๊ฑฐ์ ๋ ๊ฒ**์ ๋ค๋ฅธ ์ผ์ด๋ค.\n *\n * ๋์ ๊ฐ์ ๋ฌธ์ฅ์ผ๋ก ๋ตํ๋๋, ์
๋ ฅ์ด ํต์งธ๋ก ์ฌ๋ผ์ง ํธ์ถ์ด ใ๋ฐ์์ค ์ ์ธ์ด ์๋ค ยท ๊ฑฐ์ ๋ชฉ๋ก ๋น์ด ์์ใ\n * ์ด๋ผ๋ ๋ต์ ๋ฐ์๋ค โ ์ฌ์ฉ์๋ ์๊ธฐ ๊ฐ์ด ์๋ฒ๊น์ง ์ค์ง ๋ชปํ ๊ฒ์ ์ ์ ์๋ค(์ค์ ๋ก ๊ฒช์๋ค: GraphQL\n * `Object` ์ค์นผ๋ผ์ ์ธ๋ผ์ธ ๋ฆฌํฐ๋ด๋ก ์ฃผ๋ฉด ๋น ๋ฐฐ์ด์ด ๋๊ณ , ๋ณ์๋ก ์ฃผ๋ฉด ์จ๋ค).\n */\n if (!declarations?.length) return { ok: false, error: 'no declaration arrived โ the declarations argument was empty' }\n\n /*\n * ๊ฒ์ฌ๋ถํฐ โ ๋ฐ์ง ์์ ๊ฒ์ ์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ์ง ์๋๋ค(์ฌ์ฉ์๋ ๊ฐ์ ๋ฃ์๋ค๊ณ ๋ฏฟ๋๋ค).\n *\n * ๊ณต์ ์ด๋ฆ์ **๋์กฐ๋ก๋ง** ๊ฑธ๋ฌ์ง๋ค(๋ชจ๋ธ์ ํ์ด ์์ด๋ ์ฑ๋ฆฝํ๋ ์ ์ธ์ด๋ผ ๋ค๋ฅธ ์์ ๋ง์ด ์๋ค). ์์ง\n * ๋์ง๋ ์๊ณ ๋ช
์ธ ํ๋ ์๋ ํธ์์ด๋ฉด ๋ชฉ๋ก์ด `undefined` ์ด๊ณ , ๊ทธ๋๋ ๋ฐ์ ์ฃผ๋ ๋ต์ ๊ทธ ์ฌ์ค์ ์ฃ๋๋ค.\n */\n const knownOperations = knownOperationKinds(\n inst.model,\n TwinEngine.kernel(domainId, instanceId),\n await TwinEngine.measuredOperationKinds(domainId, instanceId)\n )\n const { accepted, rejected } = validateLocalDeclarations(inst.kind, declarations as LocalDeclaration[], { knownOperations })\n if (!accepted.length) return { ok: false, error: 'no declaration was accepted', rejected }\n const unverifiedOperations = knownOperations\n ? []\n : accepted.filter(d => d.target === 'operation').map(d => d.id)\n\n /*\n * ํ์ฅ ๋ฒ์๋ฉด **๊ณต๊ฐ์ ์ ๋๋ค** โ ๊ทธ ํ์ฅ์ ํธ์ ์ ๋ถ๊ฐ ์ฝ๋ ์๋ฆฌ๋ค. ๊ณต๊ฐ์ ๋ชจ๋ฅด๋ฉด ๊ฑฐ์ ํ๋ค(ํธ์์\n * ๋ชฐ๋ ์ ์ผ๋ฉด ์ฌ์ฉ์๋ ํ์ฅ์ ๋ฃ์๋ค๊ณ ๋ฏฟ๋๋ค).\n */\n /* ํ์ฅ ๊ฒน์ **์ฝ๊ธฐ๋ง** ํ๋ค โ ์ด ๋ฌธ์ ํธ์์ ๊ฐ๋ง ๋ฃ๋๋ค(ํ์ฅ ๊ฐ์ ์ ์ฉ ๋ฌธ์ด ์๋ค). ์์๋ฅผ ์งํค๋ ค๋ฉด\n ํ์ฅ ๊ฒน์ ํจ๊ป ์น์ด์ผ ํ๋ค: ํ์ฅ ๋จผ์ , ํธ์์ด ๋์ค. */\n const spaceRepo = getRepository(TwinSpace)\n const space =\n inst.spaceId ? await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId: inst.spaceId } }) : null\n const nextSpace = (space?.localDeclarations ?? []) as LocalDeclaration[]\n const nextInst = mergeLocalDeclarations((inst.localDeclarations ?? []) as LocalDeclaration[], accepted)\n\n /* ์น์ผ๋ฉด์ **๋ฌด์์ ๋ฎ์๋์ง** ์ ์ด ์จ ๊ฒน์ ์ ์ฅํ๋ค โ ์ฒ ํ๋ ๊ทธ ๊ธฐ์ต์ด ์์ด์ผ ์ฑ๋ฆฝํ๋ค.\n ์์๊ฐ ๊ท์จ์ด๋ค: ํ์ฅ ๋จผ์ , ํธ์์ด ๋์ค(์ข์ ๊ฒ์ด ์ด๊ธด๋ค). */\n const applied = applyDeclarationLayers(inst.model, nextSpace, nextInst)\n const model = applied.model\n /* ํ์ฅ ๊ฒน์ด ์ด ํธ์์ ์น์ ์๋ฆฌ๊ฐ ์๋ ๊ฒ์ ์ ์์ด๋ค(์ฐฝ๊ณ ํธ์์ ์๊ธ ์๋ฆฌ๊ฐ ์๋ค) โ ๊ฒฝ๊ณ ๋ก ์ฌ๋ฆฌ์ง ์๋๋ค. */\n const missingTargets = applied.missingTargets.filter(t => t.scope === 'instance').map(({ target, id }) => ({ target, id }))\n /* ์ฝ์ ์ ์๋ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ง ๋ชปํ ์ ์ธ โ ๊ฒน์๋ ๋จ์ง๋ง ๊ณ์ฐ์๋ ๋ค์ด๊ฐ์ง ์๋๋ค(๊ทธ ์ฌ์ค์ ๋งํ๋ค). */\n const unreadable = applied.unreadable.map(({ target, id, propertyId }) => ({ target, id, propertyId }))\n\n /* ๊ฒน์ ์ธ์ ๋ ๋จ๊ธด๋ค โ ๋์์ด ์ง๊ธ ์์ด๋(๊ตฌ์กฐ๊ฐ ๋ฐ๋์๋ค) ์ฌ์ฉ์์ ์ ์ธ์ ๋ฒ๋ฆฌ์ง ์๋๋ค. */\n inst.localDeclarations = applied.instanceLayerApplied\n await repo.save(inst)\n if (space) {\n space.localDeclarations = applied.spaceLayerApplied\n await spaceRepo.save(space)\n }\n\n const running = TwinEngine.modeOf(domainId, instanceId)\n if (running === 'live') {\n /* ๋ฏธ๋ฌ๋ ์ง๊ธ ๋ฐ๋๋ค โ ์ ์ฅยท๊ตฌ์กฐ ํยท์ปค๋์ด ํจ๊ป ์์ง์ธ๋ค(adoptStructure ๊ฐ ์
์ ๋ฌถ๋๋ค). */\n const shift = await TwinEngine.adoptStructure(domainId, instanceId, model, 'local declarations (twin)')\n return {\n ok: true,\n applied: 'running',\n scope: 'instance',\n accepted,\n ...(rejected.length ? { rejected } : {}),\n ...(missingTargets.length ? { missingTargets } : {}),\n ...(unreadable.length ? { unreadable } : {}),\n ...(unverifiedOperations.length\n ? {\n unverifiedOperations,\n note: 'this twin has run no operations and declares no operation specification, so the operation name could not be checked โ if it is misspelled the value will simply never be read'\n }\n : {}),\n revision: shift.rev\n }\n }\n\n /* ์๋ฎฌ๋ ์ด์
ยท์ ์ง ํธ์ โ ๋ฌธ์์ ๊ตฌ์กฐ ํ์๋ ๋ฐ์ํ๊ณ , ๋๊ณ ์๋ ์ปค๋์๋ ๋ฐ์ํ์ง ์๋๋ค. */\n inst.model = model\n await repo.save(inst)\n const report = await projectStructure(domainId, instanceId, model, instanceId)\n return {\n ok: true,\n applied: running ? 'on-restart' : 'stored',\n scope: 'instance',\n ...(running ? { note: 'a running simulation keeps its current declarations โ restart it to run on the new numbers' } : {}),\n accepted,\n ...(rejected.length ? { rejected } : {}),\n ...(missingTargets.length ? { missingTargets } : {}),\n ...(unreadable.length ? { unreadable } : {}),\n ...(unverifiedOperations.length\n ? {\n unverifiedOperations,\n note: 'this twin has run no operations and declares no operation specification, so the operation name could not be checked โ if it is misspelled the value will simply never be read'\n }\n : {}),\n ...report\n }\n }\n\n /**\n * ์ ์ธ์ **์ฒ ํํ๋ค** โ ์๋ชป ๋ฃ์ ๊ฐ์ ์์ฒ์ผ๋ก ๋๋๋ฆฌ๋ ๋ฌธ.\n *\n * โโ ์ ๋ฐ๋ก ๋ฌธ์ด ํ์ํ๊ฐ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ์ธ์ ๊ฒน์ ๋ณด๊ด๋์ง๋ง **์ ์ฅ๋ ๋ชจ๋ธ์ ๊ตฌ์์ง๋ค.** ๊ทธ๋์ ๊ฒน์์ ์ค๋ง ์ง์๋ ์๋ ๊ฐ์ด ๋์์ค์ง\n * ์๋๋ค โ ๋๋๋ฆด ๋ฐฉ๋ฒ์ด ์์ ์์ด์, ์คํ๋ฅผ ใ์๋ ๊ฐ์ ๋ค์ ์ ์ธํ๋ใ ์ฐํ๋ก๋ง ๊ณ ์น ์ ์์๋ค\n * (์ฌ์ฉ์๊ฐ ์๋ ๊ฐ์ ์๊ณ ์์ด์ผ ํ๋ค๋ ๋ป์ด๊ณ , ๋ชจ๋ฅด๋ฉด ๊ทธ ๊ฐ์ ์๊ตฌํ ์ด๊ธด๋ค).\n *\n * ๊ทธ๋์ ๊ฒน์ด **๋ฌด์์ ๋ฎ์๋์ง** ํจ๊ป ๊ธฐ์ตํ๊ฒ ํ๊ณ (`replaced`), ์ฒ ํ๋ ๊ทธ ๊ธฐ์ต์ผ๋ก ๋๋๋ฆฐ๋ค.\n * ๊ธฐ์ต์ด ์๋ ์ ์ ์ธ์ **์๋์ง ์๊ณ ๊ทธ๋ ๊ฒ ๋งํ๋ค**(`unknownSource`) โ ์๋ ๊ฐ์ ์ง์ด๋ด๋ ๊ฒ์\n * ์๋ชป ๋ฃ์ ๊ฐ์ ๊ทธ๋๋ก ๋๋ ๊ฒ๋ณด๋ค ๋์๋ค. ๊ทธ ์๋ฆฌ๋ ๋ค์ ์์ฒ ์ฌ์ฝ๊ธฐ๊ฐ ๋ฐ๋ก์ก๋๋ค.\n *\n * ๋ฐ์ ๋ฐฉ์์ ์ ์ธ๊ณผ ๊ฐ๋ค: ๋ฏธ๋ฌ๋ ์ง๊ธ ๋ฐ๊ณ (`adoptStructure`), ์๋ฎฌ๋ ์ด์
์ ์ฌ๊ธฐ๋ ๋ ๋ฐ๋๋ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Revoke locally-declared values on a twin, restoring the value the reference system had when the declaration was applied (or removing the property if the source never had it). Declarations made before the overridden value was remembered are left untouched and reported, rather than guessed.'\n })\n async revokeTwinDeclarations(\n @Arg('instanceId') instanceId: string,\n @Arg('revocations', type => [ScalarObject]) revocations: any[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinInstance)\n const inst = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return { ok: false, error: `unknown twin: ${instanceId}` }\n if (!inst.model) return { ok: false, error: `twin \"${instanceId}\" has no model document` }\n /* ๋์ฐฉ 0๊ฑด๊ณผ ใ๊ฒน์ ์๋คใ๋ ๋ค๋ฅธ ์ผ์ด๋ค โ ์ ์ธ ์ชฝ์์ ๊ฒช์ ์นจ๋ฌต์ ์ฌ๊ธฐ์ ๋ํ์ง ์๋๋ค. */\n if (!revocations?.length) return { ok: false, error: 'no revocation arrived โ the revocations argument was empty' }\n\n const spaceRepo = getRepository(TwinSpace)\n const space =\n inst.spaceId ? await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId: inst.spaceId } }) : null\n const { layer, revoked, notFound } = revokeLocalDeclarations(\n inst.localDeclarations as LocalDeclaration[] | undefined,\n revocations as DeclarationRevocation[]\n )\n /* ์ด ๋ฌธ์ ํธ์ ๊ฒน๋ง ๋ณธ๋ค โ ํ์ฅ ๊ฐ์ ์ฌ๊ธฐ์ ๋นผ๋ ค ํ๋ฉด ใ๊ฒน์ ์๋คใ๋ค(์ ์ฉ ๋ฌธ์ผ๋ก ๊ฐ์ผ ํ๋ค). */\n if (!revoked.length) return { ok: false, error: 'no declaration matched at this twin โ a facility value is revoked at its facility', scope: 'instance', notFound }\n\n /*\n * ๋ชจ๋ธ์ ๋๋๋ฆฌ๋ ์์ โ **๋บ ๋ค ๋จ์ ๋ ๊ฒน์ ๋ค์ ์น๋๋ค.**\n *\n * ๊ฐ์ ใ๊ธฐ์ตํ ์์ฒ ๊ฐใ์ผ๋ก ๊ณง์ฅ ๋๋๋ฆฌ๋ฉด, ํธ์ ๊ฒน์ ๋บ์ ๋ ๊ทธ ์๋ ์๋ **ํ์ฅ ๊ฐ์ด ๋์ด์๋์ง\n * ์๋๋ค**(์์ฒ ๊ฐ์ด ๊ทธ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๋ค). ๊ฒน์ด ๋์ด ๋ ๋ค์๋ ใ๋นผ๊ณ ๋ค์ ์น๊ธฐใ๊ฐ ์ ์ผํ๊ฒ ์ณ์\n * ๋๋๋ฆผ์ด๋ค โ ๊ทธ๋ฌ๋ฉด ํธ์ ๊ฐ์ ๋นผ๋ฉด ํ์ฅ ๊ฐ์ด, ํ์ฅ ๊ฐ์ ๋นผ๋ฉด ์์ฒ ๊ฐ์ด ๋๋ฌ๋๋ค.\n */\n const restore = restoreRevoked(inst.model, revoked)\n const nextSpace = (space?.localDeclarations ?? []) as LocalDeclaration[]\n const nextInst = layer\n\n const relaid = applyDeclarationLayers(restore.model, nextSpace, nextInst)\n\n inst.localDeclarations = relaid.instanceLayerApplied\n await repo.save(inst)\n if (space) {\n space.localDeclarations = relaid.spaceLayerApplied\n await spaceRepo.save(space)\n }\n\n /*\n * **๊ฒน์์ ๋บ ๊ฒ**๊ณผ **๊ฐ์ ๋๋๋ฆฐ ๊ฒ**์ ๋ค๋ฅธ ์ผ์ด๋ค โ ๊ฐ๋ผ์ ๋งํ๋ค.\n *\n * ์ฒ์์๋ ๋๋๋ฆฐ ๊ฒ๋ง `revoked` ๋ก ๋๋ค. ๊ทธ๋์ ๊ธฐ์ต ์๋ ์ ์ ์ธ์ ์ฒ ํํ๋ฉด ใrevoked: [] ใ์ด\n * ๋์์๋ค โ ๊ฒน์์๋ ๋ถ๋ช
ํ ๋บ๋๋ฐ(๋ค์ ์นํ์ง ์๋๋ค) ์๋ฌด ์ผ๋ ์์๋ ๊ฒ์ฒ๋ผ ์ฝํ๋ค.\n */\n const report = {\n scope: 'instance',\n withdrawn: revoked.map(r => ({ target: r.target, id: r.id, propertyId: r.propertyId })),\n restored: restore.restored,\n ...(notFound.length ? { notFound } : {}),\n ...(restore.unknownSource.length\n ? {\n unknownSource: restore.unknownSource,\n note: 'these declarations were made before the overridden value was remembered โ the property keeps its current value until the next resync from the source'\n }\n : {}),\n ...(restore.missingTargets.length ? { missingTargets: restore.missingTargets } : {})\n }\n\n const running = TwinEngine.modeOf(domainId, instanceId)\n if (running === 'live') {\n const shift = await TwinEngine.adoptStructure(domainId, instanceId, relaid.model, 'revoked local declarations (twin)')\n return { ok: true, applied: 'running', ...report, revision: shift.rev }\n }\n\n inst.model = relaid.model\n await repo.save(inst)\n await projectStructure(domainId, instanceId, relaid.model, instanceId)\n return {\n ok: true,\n applied: running ? 'on-restart' : 'stored',\n ...(running ? { note: 'a running simulation keeps its current declarations โ restart it to run without them' } : {}),\n ...report\n }\n }\n /**\n * **ํ์ฅ์ ๊ฐ์ ์ ์ธํ๋ค** โ ํธ์์ด ์๋๋ผ ํ์ฅ์ด ์ฃผ์ด๋ค.\n *\n * โโ ์ ํธ์ ๋ฌธ๊ณผ ๊ฐ๋๋ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฒ์์๋ ํธ์ ๋ฌธ์ ๋ฒ์ ์ธ์๋ฅผ ๋์๋ค. ๊ทธ๋ฌ๋ฉด **ํ์ฅ ๊ฐ์ ๋ฃ์ผ๋ ค๊ณ ํธ์์ ๊ณจ๋ผ์ผ ํ๋ค** โ ํธ์์ ๊ทธ\n * ๊ฐ์ ์ฝ๋ ์ชฝ์ด๋ฏ๋ก ๊ฐ๋
์ด ๊ฑฐ๊พธ๋ก๋ค(์ฌ์ฉ์๊ฐ ๊ทธ ์ด๊ธ๋จ์ ์ง์ ํ๋ค). ์ฃผ์ด๊ฐ ๋ค๋ฅด๋ฉด ๋ฌธ๋ ๋ค๋ฅด๋ค.\n *\n * ์ดํ๋ **๊ทธ ํ์ฅ ํธ์๋ค์ ํฉ์งํฉ**์ผ๋ก ๊ฒ์ฌํ๋ค: ํ ํ์ฅ์ ์ฌ๋ฌ ์ข
๋ฅ๊ฐ ์ด๊ณ , ์๊ธ์ ์๋์ง ํธ์๋ง\n * ์ฝ๋๋ค. ์ด๋ ์ข
๋ฅ๋ ์ฝ์ง ์๋ ์์ฑ์ ๊ฑฐ์ ํ๋ค(๋ชจ๋ฅด๋ ๊ฐ์ ๋ฐ์ ๋๋ฉด ์ฌ์ฉ์๋ ๋ฃ์๋ค๊ณ ๋ฏฟ๋๋ค).\n *\n * ๋ฃ์ ๊ฐ์ ๊ทธ ํ์ฅ์ **ํธ์ ์ ๋ถ**์ ์นํ๋ค โ ํ ํธ์๋ง ๋ฐ๊ฟ ๋๋ฉด ใํ์ฅ ์ ์ฒด๊ฐ ์ฝ๋๋คใ๊ฐ ๊ฑฐ์ง์ด ๋๋ค.\n * ์น์ ์๋ฆฌ๊ฐ ์๋ ํธ์์ ์ ์์ด๊ณ (์ฐฝ๊ณ ํธ์์ ์๊ธ ์๋ฆฌ๊ฐ ์๋ค), ์๋ฌด ํธ์๋ ๋ฐ์ง ์์๋ค๋ฉด ๊ทธ ์ฌ์ค์\n * ๋งํ๋ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Declare values that belong to a whole facility (space) rather than to one twin โ tariff, currency, contracted power. They are applied to every twin in the facility (a twin-scope declaration of the same property still wins), and survive a resync from the source.'\n })\n async declareSpaceProperties(\n @Arg('spaceId') spaceId: string,\n @Arg('declarations', type => [ScalarObject]) declarations: any[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const spaceRepo = getRepository(TwinSpace)\n const space = await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId } })\n if (!space) return { ok: false, error: `unknown facility: ${spaceId}` }\n if (!declarations?.length) return { ok: false, error: 'no declaration arrived โ the declarations argument was empty' }\n\n const twins = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n if (!twins.length) return { ok: false, error: `facility \"${spaceId}\" has no twin โ nothing would read the value` }\n\n /*\n * ๊ฒ์ฌ๋ **์ด๋ ์ข
๋ฅ๋ ์ฝ์ผ๋ฉด ํต๊ณผ**๋ค โ ํ์ฅ์ ์๋์งยท์ฐฝ๊ณ ๊ฐ ํจ๊ป ์์ผ๋ฉด ์๊ธ์ ์๋์ง ์ชฝ ์ดํ๋ก\n * ๋ฐ๋๋ค. ๊ฑฐ์ ์ด์ ๋ ์ข
๋ฅ๋ณ๋ก ๋ค๋ฅผ ์ ์์ผ๋, ํต๊ณผํ ์ข
๋ฅ๊ฐ ํ๋๋ ์์ ๋์ ์ด์ ๋ฅผ ๋๋ ค์ค๋ค.\n */\n /*\n * ๊ณต์ ์ด๋ฆ๋ **ํ์ฅ ํฉ์งํฉ**์ผ๋ก ๋์กฐํ๋ค โ ์ฐฝ๊ณ ๊ฐ ๋๋ฆฌ๋ `putaway` ์ ์ผ๋๊ฐ ๋๋ฆฌ๋ `spot` ์ด ํ\n * ํ์ฅ์ ํจ๊ป ์๊ณ , ํ์ฅ ๊ฐ์ ๊ทธ ์ ๋ถ์ ์นํ๋ค. ํ๋๋ ํ์ธํ ์ ์์ผ๋ฉด ๋ชฉ๋ก์ ์ฃผ์ง ์๋๋ค(๋ชจ๋ฅธ๋ค).\n */\n const knownSet = new Set<string>()\n for (const t of twins)\n for (const k of knownOperationKinds(\n t.model,\n TwinEngine.kernel(domainId, t.instanceId),\n await TwinEngine.measuredOperationKinds(domainId, t.instanceId)\n ) ?? [])\n knownSet.add(k)\n const knownOperations = knownSet.size ? [...knownSet] : undefined\n\n let accepted: LocalDeclaration[] = []\n let rejected: any[] = []\n for (const kind of [...new Set(twins.map(t => t.kind))]) {\n const r = validateLocalDeclarations(kind, declarations as LocalDeclaration[], { knownOperations })\n if (r.accepted.length > accepted.length) accepted = r.accepted\n if (!rejected.length) rejected = r.rejected\n }\n if (!accepted.length) return { ok: false, error: 'no declaration was accepted by any twin kind at this facility', rejected }\n\n const next = mergeLocalDeclarations(space.localDeclarations as LocalDeclaration[] | undefined, accepted)\n const spread = await spreadSpaceLayer(domainId, spaceId, next, 'local declarations (facility)')\n space.localDeclarations = spread.spaceLayerApplied as any\n await spaceRepo.save(space)\n\n const landed = spread.twins.filter(t => t.landed && t.applied !== 'failed')\n return {\n ok: true,\n scope: 'space',\n applied: landed.some(t => t.applied === 'running') ? 'running' : landed.length ? 'stored' : 'nowhere',\n accepted,\n ...(rejected.length ? { rejected } : {}),\n twins: spread.twins,\n ...(landed.length\n ? {}\n : { note: 'no twin at this facility has that target โ the value is kept, but nothing reads it yet' })\n }\n }\n\n /**\n * ํ์ฅ์ ์ ์ธ์ ์ฒ ํํ๋ค โ ๊ทธ ํ์ฅ์ **๋ชจ๋ ํธ์์์** ์ฌ๋ผ์ง๋ค.\n *\n * ํธ์์ด ๊ฐ์ ์์ฑ์ ์๊ธฐ ๊ฒน์ ๊ฐ๊ณ ์์ผ๋ฉด ๊ทธ ๊ฐ์ ๋จ๋๋ค(์ข์ ๊ฒ์ด ์ด๊ธด๋ค) โ ํ์ฅ ๊ฐ์ ๋บ๋๋ฐ ๊ทธ\n * ํธ์๋ง ๊ทธ๋๋ก์ธ ๊ฒ์ด ์ณ๋ค. ํธ์๋ง๋ค ใ์์ฒ์ผ๋ก ๋๋๋ฆฌ๊ณ ๋จ์ ๋ ๊ฒน์ ๋ค์ ์น๊ธฐใ๋ฅผ ํ๋ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Revoke facility-scope declarations, restoring on every twin in the facility the value that sat underneath (a twin-scope declaration of the same property stays, and the source value reappears where nothing else covers it).'\n })\n async revokeSpaceDeclarations(\n @Arg('spaceId') spaceId: string,\n @Arg('revocations', type => [ScalarObject]) revocations: any[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const spaceRepo = getRepository(TwinSpace)\n const space = await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId } })\n if (!space) return { ok: false, error: `unknown facility: ${spaceId}` }\n if (!revocations?.length) return { ok: false, error: 'no revocation arrived โ the revocations argument was empty' }\n\n const { layer, revoked, notFound } = revokeLocalDeclarations(\n space.localDeclarations as LocalDeclaration[] | undefined,\n revocations as DeclarationRevocation[]\n )\n if (!revoked.length) return { ok: false, error: 'no facility declaration matched', scope: 'space', notFound }\n\n const repoAll = getRepository(TwinInstance)\n const twins = await repoAll.find({ where: { domain: { id: domainId }, spaceId } })\n const per: { instanceId: string; applied: string; error?: string }[] = []\n let spaceApplied = layer\n for (const t of twins) {\n if (!t.model) continue\n const back = restoreRevoked(t.model, revoked)\n const out = applyDeclarationLayers(back.model, spaceApplied, (t.localDeclarations ?? []) as LocalDeclaration[])\n spaceApplied = out.spaceLayerApplied\n t.localDeclarations = out.instanceLayerApplied as any\n const running = TwinEngine.modeOf(domainId, t.instanceId)\n /* ํ๋๊ฐ ์คํจํด๋ ๋๋จธ์ง๋ ๋๋๋ฆฐ๋ค โ ์ด์ ๋ ํธ์๋ณ๋ก ์ ์ด ๋๋ ค์ค๋ค. */\n try {\n if (running === 'live') {\n await repoAll.save(t)\n await TwinEngine.adoptStructure(domainId, t.instanceId, out.model, 'revoked local declarations (facility)')\n per.push({ instanceId: t.instanceId, applied: 'running' })\n continue\n }\n t.model = out.model\n await repoAll.save(t)\n await projectStructure(domainId, t.instanceId, out.model, t.instanceId)\n per.push({ instanceId: t.instanceId, applied: running ? 'on-restart' : 'stored' })\n } catch (e: any) {\n per.push({ instanceId: t.instanceId, applied: 'failed', error: e?.message ?? 'failed' })\n }\n }\n space.localDeclarations = spaceApplied as any\n await spaceRepo.save(space)\n\n return {\n ok: true,\n scope: 'space',\n applied: per.some(x => x.applied === 'running') ? 'running' : 'stored',\n withdrawn: revoked.map(r => ({ target: r.target, id: r.id, propertyId: r.propertyId })),\n restored: revoked.filter(r => 'replaced' in r),\n ...(notFound.length ? { notFound } : {}),\n twins: per\n }\n }\n}\n"]}
|