@things-factory/headless-twin 10.1.278 โ 10.1.280
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":"reference-resolver.js","sourceRoot":"","sources":["../../../server/service/reference/reference-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { pubsub } from '@things-factory/shell'\nimport { HOST_STEPS, type ReferenceProgress } from './reference-progress.js'\nimport { REFERENCE_PROGRESS_TOPIC, referenceProgressPayload } from './reference-progress-channel.js'\nimport { assessMaster } from './reference-assessment.js'\nimport { Arg, Ctx, Int, Mutation, Query, Resolver, Directive } from 'type-graphql'\n\nimport { Refusal, ScalarObject, getRepository, refusalKey } from '@things-factory/shell'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { readRestartPolicy } from '../../engine/restart-policy.js'\nimport { readBoardEquipment } from '@operato/ops-contract'\n\nimport { applyKnobDefaults, filledKnobKeys } from './knob-defaults.js'\nimport type { KnobDef } from './template-registry.js'\nimport { knobDefaultsFilled, pickOriginSite, siteEquipmentAdopted } from './reference-master.js'\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinReference } from './twin-reference.js'\nimport { runFill, seqReportOf } from './reference-fill-run.js'\nimport { listReferences, getReference } from './reference-registry.js'\nimport { getAdapter, listAdapterTypes, listAdapters } from './reference-adapter.js'\nimport {\n discovered, failed, detailOf,\n referenceNotFound, adapterUnknown, discoveryFailed, discoveryTimedOut\n} from './discovery-result.js'\nimport { refuseImportSpace } from './ingest-space.js'\nimport { actuationAddressed, actuationResetPatch } from './actuation-verification.js'\nimport { refuseIntakeCollision } from './connection-portability.js'\nimport { startReferenceLiveFeed } from './reference-live.js'\nimport { listTemplates, getTemplate } from './template-registry.js'\n\n/*\n * Face2 ๋ ํผ๋ฐ์ค ์ธ์ ์คํธ ์ฑ๋(ADR-0018) โ ๋ฑ๋ก๋ ๋ ํผ๋ฐ์ค ์์ค๋ฅผ ์ด๊ฑฐํ๊ณ , ๊ณจ๋ผ์ ํธ์์ผ๋ก ์ธ์ ์คํธ.\n * \"์ฐ๊ฒฐํ๊ณ ๋ด ๊ฒ์ ๋ถ๋ฌ์จ๋ค\" โ ์ํฐํฐ๋ ๋ ํผ๋ฐ์ค์์ ์ค์ง ์๋ฐฐ์ /๋ฐ๋ช
์ด ์๋๋ค.\n */\n\n/**\n * ๋ฐ๊ฒฌ ์กฐํ์ ์๊ฐ ์ํ โ 15์ด.\n *\n * ์ด๋ํฐ ๊ณ์ฝ์ ์๊ฐ ์ ํ์ด ์๋ค. ์ฃผ์๊ฐ ํ๋ฆฐ ์๋ํฌ์ธํธ๋ ๋ตํ์ง ์๊ณ , ๊ทธ๋ฌ๋ฉด ํ๋ฉด์ด ๋ฌดํํ ๋ก๋ฉ๋๋ค โ\n * ์ฌ์ฉ์์๊ฒ๋ \"์คํจ\" ๋ณด๋ค ๋ชปํ ์ํ๋ค(๋ฌด์์ ๊ธฐ๋ค๋ฆฌ๋์ง ๋ชจ๋ฅธ ์ฑ ๊ธฐ๋ค๋ฆฐ๋ค). ์ค ์์คํ
์กฐํ๊ฐ ๋ช ์ด\n * ๊ฑธ๋ฆฌ๋ ๊ฒ์ ์ ์์ด๋ฏ๋ก ๋๋ํ ๋๋, ๋์ ์์ด์ผ ํ๋ค.\n */\nconst DISCOVER_TIMEOUT_MS = 15_000\nconst TIMEOUT = 'discover-timeout'\n\nfunction withTimeout<T>(work: Promise<T>, ms: number): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(Object.assign(new Error('timeout'), { code: TIMEOUT })), ms)\n work.then(\n v => { clearTimeout(timer); resolve(v) },\n e => { clearTimeout(timer); reject(e) }\n )\n })\n}\n\n/**\n * ๊ฑฐ์ ์ **์ฌ์ฉ์ ์ธ์ด๋ก ์ฎ๊ฒจ ๋ณด๋ธ๋ค** โ ๋ฒ์ญ์ ํ ๊ณณ์์ ํ๋ค.\n *\n * โโ ์ ์๋ฒ์ธ๊ฐ (2026-08-14) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ค์ธก: ์คํ ์ค์ธ ํธ์์ ๋ค์ ํ๋ก๋น์ ๋ํ๋ฉด ใinstance \"order-check\" is running โ stop before\n * re-provisioningใ ์ด๋ผ๋ **์์ด ํ ์ค์ด ํ ์คํธ๋ก** ๋ด๋ค(๋ค์ฏ ์ธ์ด ์ ํ์์).\n *\n * ์๋ฒ์ ์ฑ์ **๊ฐ์ ์ฌ์ **์ ์ฐ๊ณ , ์ฌ์ฉ์์ ํ์ฌ ์ธ์ด๊ฐ ๋ฐฑ์๋์ ๋ฐ์๋๋ค. ๊ทธ๋์ ์ด ๋ฌธ๊ตฌ๋ ์๋ฒ๊ฐ\n * ์ฎ๊ธฐ๋ ๊ฒ์ด ๋ง๋ค โ ํ๋ ์์ํฌ๊ฐ ์ด๋ฏธ ๊ฐ์ ๊ท์ฝ์ด๋ค(`authenticate-401-middleware` ๊ฐ\n * `context.t('error.' + errorCode, detail)` ๋ก ์ฎ๊ธด๋ค).\n *\n * โโ ๊ทธ๋ฌ๋ฉด ์ฝ๋๋ ์ ํจ๊ป ๋ณด๋ด๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ๋ฉด์ด **๊ตฌ์กฐ๋ก** ๋ค๋ค์ผ ํ๋ ๊ฑฐ์ ์ด ๋ฐ๋ก ์๋ค(์ ํฉ์ฑ ํ์ ํยท์ฌ๊ฐ๋ยท์๋ฆฌ ๋ฒํผ โ ๊ทธ๊ฒ๋ค์\n * `twin.compose.chk.*` ์ฒ๋ผ ํ๋ฉด์ด ์ฎ๊ธด๋ค). ๊ทธ๋ฆฌ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์๋น์(AIยท์คํฌ๋ฆฝํธยทAPI)์๊ฒ๋\n * ์ฝ๋๊ฐ ๊ณ์ฝ์ด๋ค. ๋ฌธ์ฅ๊ณผ ์ฝ๋๋ ์๋ก๋ฅผ ๋์ ํ์ง ์๋๋ค.\n *\n * **๋ ๊ณณ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฎ๊ธฐ์ง ์๋๋ค** โ ๋ฌธ์ฅ์ด ๋ ๋ฒ์ด ๋๋ฉด ๋ฐ๋์ ์ด๊ธ๋๋ค.\n */\nfunction refusal(context: ResolverContext, e: any, fallback: string): Record<string, unknown> {\n const code = typeof e?.code === 'string' ? e.code : undefined\n const params = e?.params && typeof e.params === 'object' ? e.params : undefined\n /* ์์ด canonical ์ ํญ์ ๋จ๊ธด๋ค โ ๋ฒ์ญ ํค๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ์ด ๋ณด์ด๊ณ , ๋ก๊ทธ์๋ ๊ทธ๊ฒ์ด ๋จ๋๋ค. */\n const canonical = e?.message || fallback\n /* A shell `Refusal` (a kernel refusal of the model, `asModelRefusal`) has one sentence, under `error.<code>`\n โ the same key `SpeakRefusals` reads on every other road, so it is not written twice. */\n const key = e instanceof Refusal ? refusalKey(e.code) : `twin.provision.err.${code}`\n const message =\n code && typeof context.t === 'function'\n ? String(context.t(key, { ...(params ?? {}), defaultValue: canonical }))\n : canonical\n return { ok: false, error: message, ...(code ? { errorCode: code } : {}), ...(params ? { errorParams: params } : {}) }\n}\n\n/**\n * `siteEquipmentIds` ๋
ธ๋ธ๋ฅผ ์ด ํ์ฅ์ ์ค๋น๋ก ์ฑ์ด๋ค โ **๋น์ด ์์ ๋๋ง.**\n *\n * ์ฌ์ฉ์๊ฐ ๋ชฉ๋ก์ ์ง์ ์ค ๊ฒฝ์ฐ์๋ ์๋์ง ์๋๋ค(๊ณ ๋ฅธ ๊ฒ์ด ์ ๋ณธ์ด๋ค). ํ์ฅ์ด ์์ผ๋ฉด ์ฑ์ธ ๊ฒ๋ ์๋ค.\n * ๋ฑ๋ก๋ถ์ ๋ชจ๋ธ์์ ์ฝ๋๋ค(๋ฐํ์์ด ์๋๋ค) โ ํธ์์ด ๋๋ ์ค์ด ์๋์ด๋ ๊ทธ ํ์ฅ์ ์ค๋น๋ ์ฌ์ค์ด๋ค.\n */\nasync function resolveSiteEquipmentKnobs(\n knobs: readonly KnobDef[] | undefined,\n effective: Record<string, any>,\n domainId: string,\n spaceId?: string\n): Promise<{ key: string; count: number }[]> {\n const targets = (knobs ?? []).filter(k => k?.type === 'siteEquipment')\n if (!targets.length) return []\n const out: { key: string; count: number }[] = []\n let ids: { id: string; kind: string }[] | undefined\n for (const k of targets) {\n const given = effective[k.key]\n if (Array.isArray(given) && given.length) continue // ์ฌ์ฉ์๊ฐ ๊ณ ๋ฅธ ๊ฒ์ด ์ ๋ณธ์ด๋ค\n if (!spaceId) {\n effective[k.key] = []\n continue\n }\n if (ids === undefined) {\n const rows = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n const seen = new Map<string, { id: string; kind: string }>()\n for (const r of rows) {\n for (const e of readBoardEquipment((r.model as any) ?? {})) {\n if (!e?.id || seen.has(String(e.id))) continue\n seen.set(String(e.id), { id: String(e.id), kind: String((e as any).kind ?? '') })\n }\n }\n ids = [...seen.values()]\n }\n effective[k.key] = ids\n out.push({ key: k.key, count: ids.length })\n }\n return out\n}\n\n@Resolver()\nexport class TwinReferenceResolver {\n /** ๋ฑ๋ก๋ ๋ ํผ๋ฐ์ค ์์ค ๋ชฉ๋ก(์์ฝ + ์ด๋ฏธ ์ธ์ ์คํธ๋๋์ง). */\n @Query(returns => [ScalarObject], { description: 'List registered reference sources (virtual or real adapters) available to ingest.' })\n async referenceSources(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const out: any[] = []\n for (const m of listReferences()) {\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId: m.source } })\n out.push({\n source: m.source,\n system: m.system,\n siteName: m.siteName,\n locationCount: m.locations.filter(l => l.role === 'location' || l.role === 'both').length,\n areaCount: m.locations.filter(l => l.role === 'area' || l.role === 'both').length,\n equipmentCount: (m.equipment ?? []).length,\n imported: !!reg,\n running: TwinEngine.owns(domainId, m.source)\n })\n }\n return out\n }\n\n /** ์์ค๋ฅผ ์ธ์ ์คํธ โ ๊ณต๊ฐ + ์ธ์คํด์ค ์์ฑ(provision). start ๋ฉด ๊ธฐ๋๊น์ง. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Ingest a registered reference source into a twin (space + instance). Optionally start it. restartPolicy declares how the new twin treats its own past on reboot: 'resync' (read the source again) | 'resume' (continue its journal) | 'reset' (wipe and replay from the seed). It has no default โ a twin cannot exist without the declaration.\"\n })\n async importFromReference(\n @Arg('source') source: string,\n @Arg('restartPolicy') restartPolicy: string,\n @Ctx() context: ResolverContext,\n @Arg('start', { nullable: true }) start?: boolean\n ): Promise<any> {\n const master = getReference(source)\n if (!master) return { ok: false, error: `unknown reference source: ${source}` }\n const domainId = context.state.domain.id\n try {\n /* ์ด๋์ ์๋์ง ๋จ๊ธด๋ค โ ์ด๊ฒ์ด ์์ผ๋ฉด ์ด ํธ์์ ๋ ๋ฒ ๋ค์ ์ฝ์ ์ ์๋ค.\n ์ด ๊ฒฝ๋ก๋ **๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋ก๋ ๋ง์คํฐ ํ๋**๋ฅผ ๊ทธ๋๋ก ์ฐ๋ฏ๋ก ์ฌ์ดํธ ์์ ์๊ฐ ์๋ค(์ฌ์ดํธ ์ ์ฒด๋ฅผ\n ์ ์ ๊ฒ์ด ์๋ค). ๋ค์ ์ฝ๊ธฐ๋ ๊ฐ์ ๋ฑ๋ก๋ณธ์ ์ง์ผ๋ฏ๋ก ์ฌ์ดํธ๋ฅผ ์ฐพ์ ํ์๊ฐ ์๋ค. */\n const res = await TwinEngine.ingestMaster(\n domainId,\n { ...master, origin: { kind: 'reference', source } },\n readRestartPolicy(restartPolicy, 'importFromReference'),\n undefined,\n context.state.user\n )\n if (start) await TwinEngine.startFromRegistry(domainId, res.instanceId)\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings: res.warnings }\n } catch (e: any) {\n return refusal(context, e, 'ingest failed')\n }\n }\n\n /**\n * **์๋ณธ์์ ๋ค์ ์ฝ๋๋ค** โ ์ด ํธ์์ ๊ตฌ์กฐ๋ฅผ ์ง๊ธ์ ์๋ณธ ๋ชจ์ต์ผ๋ก ๊ฐฑ์ ํ๋ค.\n *\n * โโ ์ ์ง์
์ ์ด ํ๋์ฌ์ผ ํ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ง๊ธ๊น์ง ๋ค์ ์ฝ๊ธฐ๋ **๋ง๋๋ ๊ฒฝ๋ก์ ์นํ ์์๋ค**(`importFromReference`ยท`createFromTemplate`).\n * ๊ทธ๋์ ์ด๋ฏธ ์๋ ํธ์์ ๊ฐฑ์ ํ๋ ค๋ฉด ๋ง๋ค ๋ ๋ฌด์์ ๊ณจ๋๋์ง ์ฌ๋์ด ๊ธฐ์ตํด ๊ฐ์ ํ๋ฉด์ ๋ค์\n * ๊ฑฐ์ณ์ผ ํ๊ณ , ํ
ํ๋ฆฟ์ผ๋ก ์ธ์ด ํธ์์ ๋
ธ๋ธ๋ฅผ ์ด๋์๋ ์ ๋จ๊ฒจ์ **์์ ๊ฐฑ์ ํ ๋ฐฉ๋ฒ์ด ์์๋ค.**\n * ์์ฒ์ด ๋ฌด์์ด๋ ํธ์ ์์ ์ด ๊ธฐ์ตํ๊ฒ ํ๊ณ (`TwinInstance.origin`), ์ฌ๊ธฐ ํ ๊ณณ์์ ๊ทธ๊ฒ์ ๋ฐ๋ฅธ๋ค.\n *\n * โโ ๋ฌด์์ด ์ผ์ด๋๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์๋ณธ์์ ๋ง์คํฐ๋ฅผ ๋ค์ ์ป์ด ์ธ์ ์คํธ์ ๊ทธ๋๋ก ํ์ด๋ค. ๊ทธ๋ค์์ ์ธ์ ์คํธ๊ฐ ์๋ ์ผ์ด๋ค โ\n * ๊ตฌ์กฐ๊ฐ ๋ฌ๋ผ์ก์ผ๋ฉด ์ ๋ฆฌ๋น์ ์ด ๋จ๊ณ , ๊ตฌ์กฐ ํ์ด ๋ค์ ๊ทธ๋ ค์ง๊ณ , **์คํ ์ค์ธ ๋ฏธ๋ฌ๋ ๋ฉ์ถ์ง ์๊ณ \n * ์ ํํ๋ค.** ์คํ ์ค์ธ ์๋ฎฌ๋ ์ด์
์ ๊ฑฐ์ ๋๋ค(์กฐ๊ฑด์ด ๋ฐ๋ ์คํ์ ๋ค๋ฅธ ์คํ์ด๋ค).\n *\n * โโ ๋ชป ํ ๋๋ ๋ชป ํ๋ค๊ณ ํ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `origin` ์ด ์๋ ํธ์(์ด ์๋ฆฌ๊ฐ ์๊ธฐ๊ธฐ ์ ์ ๋ง๋ค์ด์ง ๊ฒ)์ ๋ค์ ์ฝ์ ์ ์๋ค. ์ง์์ผ๋ก\n * ํ
ํ๋ฆฟ์ ๊ณ ๋ฅด๊ฑฐ๋ ์ฒซ ๋ ํผ๋ฐ์ค๋ฅผ ์ง์ง ์๋๋ค โ ์๋ฑํ ์๋ณธ์ผ๋ก ํ์ฅ์ ๋ฎ๋ ๊ฒ์ด ํจ์ฌ ๋์๋ค.\n */\n /**\n * **๊ทธ ๋ฒํธ๋ค์ด ๋ฌด์์ด์๋** โ ๊ตฌ๋ฉ์ ๋ง๋ฌ์ ๋ ์๋ณธ์ ๋ฌป๋๋ค.\n *\n * `fillTwinScope` ๊ฐ ใ418 ๋ค์์ด 420ใ์ด๋ผ๊ณ ๋ฉ์ถ๋ฉด, ๊ทธ 419 ๊ฐ ๋ฌด์์ด์๋์ง ์์์ผ ๋ค์์\n * ์ ํ ์ ์๋ค. ๊ทธ ๊ธธ์ด ์์ด์ ์ฌ๋์ด ์๋ณธ DB ๋ฅผ ์์ผ๋ก ๋ค์ก๋ค.\n *\n * **ํ์ ํ์ง ์๋๋ค.** ์๋ณธ์ด ์๋ ๊ฒ์ ๊ทธ๋๋ก ๋ธ๋ค โ `lost` ๋ ใ๋ฒํธ๋ ๋๊ฐ๋๋ฐ ํ์ด ์๋คใ์ด์ง\n * ใํฌ๊ธฐํด๋ ๋๋คใ๊ฐ ์๋๋ค. ๊ทธ ํ๋จ์ ๋๋๋ฆด ์ ์์ด์(์ปค์๊ฐ ์ง๋๊ฐ๋ฉด ๋์ด๋ค) ์ฌ๋์ ๋ชซ์ด๋ค.\n */\n /*\n * **์ฝ๊ธฐ์ธ๋ฐ ์ฐ๊ธฐ์ ๊ฐ์ ๋ฌธ์ ์ด๋ค.** ์ด ๋ฌธ์ ์๋ณธ์ ๋ดํฌ๋ฅผ ๊ทธ๋๋ก ๋
๋๋ค โ ๊ทธ ์์คํ
์ด ๋ฌด์์\n * ์ธ์ ๋ณด๋๋์ง๊ฐ ๋๋ฌ๋ฉ๋๋ค. `twinConnectionBundle` ๊ณผ ๊ฐ์ ๋ฌด๊ฒ์ด๊ณ , ์ด ์ ์ฅ์๋ ๊ทธ ๋ฌด๊ฒ๋ฅผ\n * ใ์ฐ๊ธฐ๋ GATE ํ๋ใ๋ก ํต์ผํด ๋์์ต๋๋ค(ADR-0027).\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => ScalarObject, {\n description:\n 'Ask the source what it knows about a range of sequence numbers. Each number comes back as present ยท lost ยท unissued ยท unknown โ the source reports, the human decides.'\n })\n async twinSeqReport(\n @Arg('instanceId') instanceId: string,\n @Arg('scope') scope: string,\n @Arg('from', type => Int) from: number,\n @Arg('to', type => Int) to: number,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n return seqReportOf({ domainId: context.state.domain.id, instanceId, scope, from, to })\n }\n\n /**\n * **๋น ์ง ๊ตฌ๊ฐ์ ๋ค์ ๋ฐ๋๋ค** โ ํ
์ ๋ฐ๋์ ๋์นฉ๋๋ค: ์ฐ๋ฆฌ๊ฐ ๋ด๋ ค๊ฐ ์์ ๋, ๊ทธ์ชฝ์ด ๋ชป ๋ณด๋์ ๋.\n *\n * โโ ์ ๋ฌธ์ด ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ฒํธ๊ฐ ๋น๋ฉด `takeInSequence` ๊ฐ ์์์ฑ๋๋ค. ๊ทธ๋ฐ๋ฐ **์์์ฑ ๋ค ๊ทธ ์ฌ์ด๋ฅผ ์ฑ์ฐ๋ ๊ธธ์ด ์์์ต๋๋ค.**\n * `fillSince` ๋ 2026-08-31 ๋ถํฐ ์์๊ณ ๋ถ๋ฅด๋ ๊ณณ์ด 0๊ณณ์ด์์ต๋๋ค.\n *\n * ์ค์ ๋ก plant ์์๋ฐ์ค์ 1~20 ์ ์๊ณ ๋์ฐพ์ ๋ฐฉ๋ฒ์ด ์๋ ์ํ๋ฅผ ๋ง๋ฌ์ต๋๋ค.\n *\n * โโ `from` ์ ์์ ๊ตฌ๊ฐ์ ๋์ฐพ์ ๋๋ง โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฃผ์ง ์์ผ๋ฉด ์ปค์๋ถํฐ ์ด์ด ๋ฐ์ต๋๋ค. ์ฃผ๋ฉด **๊ทธ ๋ฒํธ๋ถํฐ ๋ค์ ๋ฌป์ต๋๋ค** โ ์ด๋ฏธ ๋ค์ด๊ฐ ๊ฒ์ ์ ์
\n * ๊ฒฝ๊ณ๊ฐ ๋ํ์ด๋ก ๊ฑฐ๋ฅด๋ฏ๋ก ๋ ๋ฒ ์์ง ์์ต๋๋ค.\n *\n * ์ ์ฅ๋ ์ปค์๋ฅผ ๋๋๋ฆฌ์ง ์์ต๋๋ค. `fillSince` ๋ ๋ฒํธ ๊ฒ์ฌ๋ฅผ ์ง๋ ๋งํผ๋ง ์ ์ผ๋ฏ๋ก, ๋์ฐพ์ ๋ค\n * ์ปค์๊ฐ ์๋ ์๋ฆฌ๋ณด๋ค ์์์ง ์์ต๋๋ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Fetch the stretch this twin missed for one scope and ingest it through the same checks as the push path. Without `from` it continues from the cursor; with `from` it asks again from that number โ already-ingested facts are filtered as duplicates.'\n })\n async fillTwinScope(\n @Arg('instanceId') instanceId: string,\n @Arg('scope', { description: 'The unit the source numbers by โ the same name its envelopes carry (e.g. EVENTS).' }) scope: string,\n @Ctx() context: ResolverContext,\n @Arg('from', type => Int, { nullable: true, description: 'Ask again from this sequence number. Omit to continue from the cursor.' })\n from?: number,\n @Arg('maxPages', type => Int, { nullable: true, description: 'Page limit for one run. Default 50.' }) maxPages?: number\n ): Promise<any> {\n return runFill({ domainId: context.state.domain.id, instanceId, scope, from: from ?? undefined, maxPages: maxPages ?? undefined })\n }\n\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Re-read a twin's structure from the source it remembers (TwinInstance.origin). Works for both reference- and template-born twins. A running mirror adopts the new structure without stopping; a running simulation is refused.\"\n })\n async resyncTwin(@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\n const origin = inst.origin as any\n if (!origin?.kind)\n return {\n ok: false,\n error: `twin \"${instanceId}\" does not remember where it came from โ it cannot be re-read. Re-create it from its template or reference so the origin is recorded.`\n }\n\n /*\n * ์งํ์ ์๋ฆฌ๋ ํต๋ก โ ๋ง๋ค ๋์ **๊ฐ์ ๊ฒ**์ด๋ค. ๋ ํผ๋ฐ์ค์์ ์จ ํธ์๋ง ์๋ฆฐ๋ค(ํ
ํ๋ฆฟ์์ ์จ\n * ํธ์์ ์๋ณธ์ ์ฝ์ง ์์ผ๋ฏ๋ก ์๋ฆด ๋จ๊ณ๊ฐ ์๋ค).\n *\n * ๋ถ๋ชจ๋ ๊ทธ ์ด๋ํฐ๊ฐ ์ ์ธํ ๋จ๊ณ ์๋ค(`masterSteps`) + ํธ์คํธ ๋จ๊ณ. ์ ์ธํ์ง ์์ ์ด๋ํฐ๋\n * `total` ์ด ์๊ณ , ๊ทธ๋ ํ๋ฉด์ ํผ์ผํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค โ ๋ชจ๋ฅด๋ ์งํ๋ฅ ์ ์ง์ด๋ด์ง ์๋๋ค.\n */\n const progressSource: string | undefined = origin.kind === 'reference' ? origin.source : undefined\n const refRow = progressSource\n ? await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source: progressSource } })\n : null\n const adapterForSteps = refRow ? getAdapter(refRow.adapterType) : undefined\n const declaredSteps = adapterForSteps?.masterSteps?.length\n const stepTotal = declaredSteps === undefined ? undefined : declaredSteps + HOST_STEPS.length\n const siteId = origin.siteId ?? instanceId\n let lastDone = 0\n let lastStep: ReferenceProgress['step'] = (adapterForSteps?.masterSteps?.[0] ?? 'provision') as ReferenceProgress['step']\n const emit = (p: Omit<ReferenceProgress, 'siteCount' | 'siteId' | 'siteIndex'>) => {\n if (!progressSource) return\n lastDone = p.done\n lastStep = p.step\n pubsub.publish(\n REFERENCE_PROGRESS_TOPIC,\n referenceProgressPayload(domainId, { ...p, siteId, siteIndex: 0, siteCount: 1, total: p.total ?? stepTotal, source: progressSource })\n )\n }\n\n try {\n const master = await this.masterFromOrigin(domainId, origin, instanceId, st =>\n emit({ step: st.key, done: st.done, total: stepTotal, detail: st.detail })\n )\n emit({ step: 'provision', done: declaredSteps ?? 0, total: stepTotal })\n /*\n * **์ด๋ ํ์ฅ์ ํธ์์ด์๋๋ฅผ ์งํจ๋ค** โ ๋ค์ ์ฝ๊ธฐ๋ ๊ตฌ์กฐ๋ง ์๋ก ๊ทธ๋ฆฌ๋ ์ผ์ด๊ณ , ํ์ฅ ์์์ ๊ทธ๋\n * ์ฌ๋์ด ๊ณ ๋ฅธ ๊ฒ์ด๋ค. ๊ธฐ์ต์ด ์๋ ์ ํธ์์ **์ง๊ธ ์๋ ํ์ฅ**์ ๊ทธ๋๋ก ์ด๋ค(๋น์์ผ๋ก ๋๋ฉด ํ
ํ๋ฆฟ\n * ๊ธฐ๋ณธ ๊ณต๊ฐ์ผ๋ก ์ฎ๊ฒจ ๊ฐ๋ค โ ์๋ฆฌ์ง ์๊ณ ํ์ฅ์ ๋ ๋๊ณ ๊ทธ ํ์ฅ์ ๊ฐ๋ ์๋๋ค).\n */\n const keepSpace = origin.spaceId || inst.spaceId\n /* ๋ค์ ์ฝ๊ธฐ๋ **๊ตฌ์กฐ๋ง** ์๋ก ๊ทธ๋ฆฐ๋ค โ ์ฌ๊ธฐ๋ ์ ์ฑ
์ ๊ทธ ํธ์์ ์ ์ธ์ด๋ฏ๋ก ๊ทธ๋๋ก ์งํจ๋ค. */\n const res = await TwinEngine.ingestMaster(\n domainId,\n master,\n readRestartPolicy(inst.restartPolicy, `resync of twin \"${instanceId}\"`),\n keepSpace ? { spaceId: keepSpace } : undefined,\n context.state.user\n )\n emit({ step: 'start', done: (declaredSteps ?? 0) + 1, total: stepTotal })\n /*\n * **์ดํ๋ ์๋ก ๋จ๊ธด๋ค.** ๋ค์ ์ฝ์๋๋ฐ ์ดํ์ด ์๊ฒ์ด๋ฉด ํ๋ฉด์ด ์ง๋ ์ฝ๊ธฐ๋ฅผ ํ์ฌ๋ก ๋ณด์ฌ ์ค๋ค โ\n * ๊ทธ ํ๋ฅผ ๋ณด๊ณ ์ฌ๋์ด ์๋ณธ์ ๊ณ ์น๋ฌ ๊ฐ๋ค.\n */\n if (refRow && progressSource) {\n const prevSpec = (refRow.scopeSpec as any) ?? {}\n await getRepository(TwinReference).update(\n { id: refRow.id },\n {\n scopeSpec: { ...prevSpec, assessments: { ...(prevSpec.assessments ?? {}), [siteId]: assessMaster(master, siteId) } },\n /*\n * โโ ์ฝ์ ์๊ฐ๊ณผ ๊ฒฝ๊ณ ์๋ ์๋ก ๋จ๊ธด๋ค (2026-09-06) โโโโโโโโโโโโโโโโโโ\n * ์ฒ์ ์ฐ๊ฒฐํ๋ ๊ฒฝ๋ก๋ ์ด ๋์ ์ฐ๋๋ฐ(ยง`connectReference`) ๋ค์ ์ฝ๋ ๊ฒฝ๋ก๋ ์ดํ๋ง\n * ์ผ๋ค. ๊ทธ๋์ `lastSyncedAt` ์ด ใ์ฒ์ ํธ์์ ๋ง๋ ์๊ฐใ์ ๋จธ๋ฌผ๋ ๋ค.\n *\n * ์ด๊ฒ์ด ์ค์ ๋ก ์๋ชป๋ ํ๋จ์ ๋ง๋ค์๋ค. ์ธํฐ๊ทธ๋ ์ด์
๋ ์ธ์ด ์ปค๋ฅํฐ๋ฅผ ๊ณ ์น๊ณ ์ฌ๋๊ธฐํ๋ฅผ\n * ์ฒญํ ๋ค ์ด ์นธ์ผ๋ก ํ์ธํ๋๋ฐ, ๊ฐ์ด ๊ทธ๋๋ก์ฌ์ ใ์ ๋์๋คใ๊ณ ๊ฒฐ๋ก ๋ด๋ ธ๋ค. ์ค์ ๋ก๋\n * ๋์๊ณ ํ๋ชฉ 106๊ฑด์ด ๋ค์ด์ ์์๋ค.\n *\n * ๊ฒฝ๊ณ ์๋ ๊ฐ๋ค. ๋ค์ ์ฝ์ผ๋ฉด์ ๊ฒฝ๊ณ ๊ฐ ์ค๊ฑฐ๋ ๋์๋๋ฐ ํ๋ฉด์ ์ง๋ ์๋ฅผ ๋ณด์ธ๋ค.\n */\n lastSyncedAt: new Date().toISOString(),\n lastWarningCount: Array.isArray(res.warnings) ? res.warnings.length : null\n } as any\n )\n }\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings: res.warnings }\n } catch (e: any) {\n /* ๋งํ ์๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์๋ฆฐ๋ค โ ใ๋๋ธ ์ใ์ ๋ค์ ๋จ๊ณ๋ค(๋ง๋ค ๋์ ๊ฐ์ ๊ท์น). */\n emit({\n step: (adapterForSteps?.masterSteps?.[lastDone] ?? lastStep) as ReferenceProgress['step'],\n done: lastDone,\n total: stepTotal,\n failed: true,\n error: e?.message ?? String(e)\n })\n return refusal(context, e, 'resync failed')\n }\n }\n\n /** ๊ธฐ์ตํด ๋ ์์ฒ์์ ๋ง์คํฐ๋ฅผ ๋ค์ ์ป๋๋ค โ ์ด๋ํฐ๋ ํ
ํ๋ฆฟ์ด๋ ์ด ํ ๊ณณ์์ ๊ฐ๋ฆฐ๋ค. */\n private async masterFromOrigin(\n domainId: string,\n origin: any,\n instanceId: string,\n /*\n * **๋ค์ ์ฝ๊ธฐ๋ ์งํ์ ๋ณด์ฌ์ผ ํ๋ค** (2026-08-22).\n *\n * ๋ง๋ค ๋๋ 8๋จ๊ณ๊ฐ ํ๋ฉด์ ํ๋ฅด๋๋ฐ ๋ค์ ์ฝ์ ๋๋ ์๋ฌด๊ฒ๋ ์์๋ค โ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ฅด๊ณ \n * ใ์งํ๋๊ณ ์๋์ง ํ์ธํ ์๊ฐ ์๋คใ๊ณ ํ๋ค. ์ค์ ๋ก chef ๋ ์๋ณธ ์ฝ๊ธฐ๊ฐ 14~21์ด์ด๊ณ ๊ทธ ์ฌ์ด\n * ํ๋ฉด์ ์๋ฌด ๋ณํ๊ฐ ์๋ค.\n *\n * ํต๋ก๋ ๋ง๋ค ๋์ **๊ฐ์ ๊ฒ**์ด๋ค(`twin-reference-progress`). ํ๋ฉด๋ ๊ฐ์ ํ์๋ฅผ ์ด๋ค โ\n * ๋ ๋ฒ์ ๋ง๋ค๋ฉด ํ์ชฝ๋ง ๊ณ ์ณ์ง๊ณ ์ฌ๋์ ๊ฐ์ ์ผ์ด ๋ค๋ฅด๊ฒ ๋ณด์ด๋ ๊ฒ์ ๊ฒฐํจ์ผ๋ก ์ฝ๋๋ค.\n */\n onStep?: (s: { key: any; done: number; total?: number; detail?: string }) => void\n ): Promise<any> {\n if (origin.kind === 'template') {\n const tpl = getTemplate(origin.templateId)\n if (!tpl) throw new Error(`unknown template: ${origin.templateId} โ this twin cannot be rebuilt`)\n /* ์ ์ฅํด ๋ ๋
ธ๋ธ ๊ทธ๋๋ก ๋ค์ ์ง๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋ค์ ์
ํ์ง ์๋๋ค โ ๊ทธ ์ฌ์ด ํ
ํ๋ฆฟ์ ๊ธฐ๋ณธ๊ฐ์ด\n ๋ฐ๋์๋ค๋ฉด, ์ฌ์ฉ์๊ฐ ๊ณ ๋ฅด์ง ์์ ๊ฐ์ด ์๋ฆฌ์ง ์๊ณ ํ์ฅ์ ๋ฐ๊พธ๊ฒ ๋๋ค. */\n const { master } = tpl.build(origin.params ?? {})\n master.origin = origin\n return master\n }\n\n /* ๋ ํผ๋ฐ์ค โ ๋ฉ๋ชจ๋ฆฌ ๋ฑ๋ก๋ณธ์ด ์์ผ๋ฉด ๊ทธ๊ฒ, ์์ผ๋ฉด ์ ์ฅ๋ ์ด๋ํฐ ์ฐ๊ฒฐ๋ก ๋ค์ ๊ฐ์ ธ์จ๋ค.\n (๋ถํ
๋ค์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฑ๋ก๋ณธ์ด ๋น์ด ์์ผ๋ฏ๋ก ์ด๋ํฐ ๊ฒฝ๋ก๊ฐ ์ค์ ๋ก ์ฐ์ด๋ ๊ธธ์ด๋ค.) */\n const inMemory = getReference(origin.source)\n if (inMemory) return { ...inMemory, origin }\n\n const ref = await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source: origin.source } })\n if (!ref) throw new Error(`reference \"${origin.source}\" is no longer registered โ nothing to re-read from`)\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) throw new Error(`no adapter for type: ${ref.adapterType}`)\n const cfg = ref.connectionConfig ?? {}\n const sites = await adapter.discoverSites(cfg)\n\n /*\n * โโ ๋ฌด์์ ๋ฌด์๊ณผ ๊ฒฌ์ฃผ๋ (2026-08-18 ์ค์ธก์ผ๋ก ๊ณ ์นจ) โโโโโโโโโโโโโโโโโโโโโโโโ\n *\n * ์์ ์๋ `master.source === origin.source` ๋ก ์ฌ์ดํธ๋ฅผ ์ฐพ์๋ค. ๊ทธ๋ฐ๋ฐ `origin.source` ๋ **๋ ํผ๋ฐ์ค\n * ๋ฑ๋ก ์ด๋ฆ**์ด๊ณ (๊ทธ ์ฐธ์กฐ์ ์ฌ์ดํธ ์ ๋ถ์ ๊ฐ๋ค) `master.source` ๋ **์ฌ์ดํธ๋ณ ์ธ์คํด์ค id** ๋ค โ\n * ์๋ก ๋ค๋ฅธ ๊ฒ์ ๊ฒฌ์คฌ์ผ๋ ์ฌ์ดํธ๊ฐ ๋ฉ์ฉกํ ์์ด๋ ใ๋ ์ด์ ๋ณด๊ณ ํ์ง ์๋๋คใ๋ก ๊ฑฐ์ ํ๋ค. ์ฌ์ดํธ๊ฐ\n * ์ฌ๋ฟ์ธ ์ฐธ์กฐ์์ ์จ ํธ์์ ๊ทธ๋์ **์ ๋ถ** ์ฌ๋๊ธฐ๊ฐ ๋ถ๊ฐํ๊ณ , ์ค๋ฅ ๋ฌธ์ฅ์ ์์ธ์ ์ฐธ์กฐ ์ชฝ์ผ๋ก\n * ์๋ชป ๊ฐ๋ฆฌ์ผฐ๋ค.\n *\n * ์ด์ โ ๊ธฐ์ตํด ๋ ์ฌ์ดํธ๋ก ๊ณง์ฅ ๊ฐ๋ค(`origin.siteId`) โก ๊ธฐ์ต์ด ์๋ ์ ํธ์์ ์ฌ์ดํธ๋ฅผ ์ดํด\n * **๋ง์คํฐ์ ์ ์ฒด(=์ด ์ธ์คํด์ค id)** ์ ๊ฒฌ์ค๋ค. ์ด๋ ์ชฝ๋ ๋ชป ์ฐพ์ผ๋ฉด **์ฒซ ์ฌ์ดํธ๋ก ๋์ฐ์ง ์๋๋ค** โ\n * ๋ค๋ฅธ ํ์ฅ์ ๊ตฌ์กฐ๋ฅผ ์ด ํธ์์ ๋ฎ๋ ๊ฒ์ ์ค๋ฅ๊ฐ ์๋๋ผ ์ค๋ฅ ์์ด ํ๋ฆฐ ๊ณต์ฅ์ผ๋ก ๋ํ๋๋ค.\n */\n const picked = pickOriginSite(sites, origin)\n if (picked.site) return { ...(await adapter.fetchMaster(cfg, picked.site, onStep)), origin }\n if (picked.reason === 'site-gone')\n throw new Error(\n `reference \"${origin.source}\" no longer reports site \"${origin.siteId}\" โ refusing to overwrite this twin with a different site`\n )\n\n for (const site of sites) {\n const master = await adapter.fetchMaster(cfg, site)\n if (master.source === instanceId) return { ...master, origin: { ...origin, siteId: site.siteId } }\n }\n throw new Error(\n `reference \"${origin.source}\" does not report a site that rebuilds twin \"${instanceId}\" ` +\n `(this twin was imported before the site identity was recorded, and no site's master carries its id) โ refusing to overwrite it with a different site`\n )\n }\n\n /** ๋ฑ๋ก๋ ํธ์ ํ
ํ๋ฆฟ(ํ๋ผ๋ฏธํฐํ ์ํคํ์
) ๋ชฉ๋ก โ ๋
ธ๋ธ ์คํค๋ง ํฌํจ(ํด๋ผ์ด์ธํธ ํผ์ฉ). */\n @Query(returns => [ScalarObject], { description: 'List registered twin templates (parameterized archetypes) with their knob schema.' })\n async twinTemplates(@Ctx() _context: ResolverContext): Promise<any[]> {\n return listTemplates().map(t => ({ id: t.id, label: t.label, system: t.system, description: t.description, detail: t.detail, knobs: t.knobs }))\n }\n\n /** ํ
ํ๋ฆฟ + ๋
ธ๋ธ โ ํฉ์ฑ ๋ง์คํฐ โ ์ธ์ ์คํธ(+๊ธฐ๋+์๋๋ฆฌ์ค). ๋ ํผ๋ฐ์ค import ์ ๊ฐ์ ๊ฒฝ๋ก, ์์ฒ๋ง ํฉ์ฑ. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Instantiate a twin template with params โ synthetic master โ ingest (+start+scenario). restartPolicy declares how the new twin treats its own past on reboot ('resync' | 'resume' | 'reset') โ there is no default. Returns {ok, instanceId, spaceId}.\"\n })\n async createFromTemplate(\n @Arg('templateId') templateId: string,\n @Arg('params', type => ScalarObject) params: any,\n @Arg('restartPolicy') restartPolicy: string,\n @Ctx() context: ResolverContext,\n @Arg('start', { nullable: true }) start?: boolean,\n @Arg('spaceId', { nullable: true, description: 'Existing space to co-locate this twin into (add a lens to a site). Omit to create its own space.' }) spaceId?: string\n ): Promise<any> {\n const tpl = getTemplate(templateId)\n if (!tpl) return { ok: false, error: `unknown template: ${templateId}` }\n const domainId = context.state.domain.id\n try {\n /*\n * **๋น ์ง ๋
ธ๋ธ๋ฅผ ์๋ฒ๊ฐ ์ฑ์ด๋ค.** ๊ธฐ๋ณธ๊ฐ์ ์๋ ๊ณณ์ ๋
ธ๋ธ ์คํค๋ง(๊ณ์ฝ)์ธ๋ฐ ๊ทธ๊ฒ์ ์ ์ฉํ๋ ๊ณณ์ด\n * ์์๋๋ฟ์ด์๋ค โ ๊ทธ๋์ ํ๋ฉด์ ๊ฑฐ์น์ง ์๋ ํธ์ถ์(AIยท์คํฌ๋ฆฝํธยทAPI)๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ์ผ๋ถ๋ง ์ฃผ๋ฉด\n * ํ
ํ๋ฆฟ ์์์ ๋ฐ์๋ฅ ์ด 0 ์ด ๋๊ณ **์๋ฌด๊ฒ๋ ํ์ง ์๋ ํธ์**์ด ์๋ฆฌ์ง ์๊ณ ๋ง๋ค์ด์ก๋ค.\n * ์ฑ์ด ๋
ธ๋ธ ์ด๋ฆ์ ๊ฒฝ๊ณ ๋ก ํจ๊ป ๋๋ ค์ค๋ค โ ์๋ฆฌ์ง ์๊ณ ์ฑ์ฐ๋ ๊ฒ๋ ์๋ฆฌ์ง ์๊ณ ๋น์ฐ๋ ๊ฒ๋งํผ ์ํํ๋ค.\n */\n const filled = filledKnobKeys(tpl.knobs, params)\n const effective = applyKnobDefaults(tpl.knobs, params)\n /*\n * **์ด ํ์ฅ์ ์ด๋ฏธ ์๋ ์ค๋น๋ฅผ ๋
ธ๋ธ ๊ฐ์ผ๋ก ํ์ ํ๋ค** (`siteEquipmentIds`).\n *\n * ์๋์ง ํธ์์ด ใ๊ณต์ฅ์ด ๋๋ฉด ์ ๊ธฐ๊ฐ ์ค๋ฅธ๋คใ๋ฅผ ๋งํ๋ ค๋ฉด ๋ถํ๋ฅผ **์ด์ ํธ์์ ์ค๋น id ๋ก**\n * ์ ์ธํด์ผ ํ๋ค(์ค๋น ํ๋์ ์ฌ์ค ๋). ๊ทธ ๋ชฉ๋ก์ ๋น๋ํ ๋๋ง๋ค ํ์ฅ์์ ๋ค์ ์ฝ์ผ๋ฉด, ์ฌ์ด์\n * ์ค๋น๊ฐ ๋๊ฑฐ๋ ์ค ๋งํผ **๋ค์ ์ง์ ๋ ๋ค๋ฅธ ํธ์**์ด ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์ ํ ๋ฒ ํด์ํ๊ณ \n * ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋
ธ๋ธ ๊ฐ์ผ๋ก ๋จ๊ธด๋ค(์๋ `origin.params` ์ ๊ทธ๋๋ก ์ ์ฅ๋๋ค).\n */\n const adopted = await resolveSiteEquipmentKnobs(tpl.knobs, effective, domainId, spaceId)\n const { master, scenario } = tpl.build(effective)\n /* **๋ฌด์์ผ๋ก ์ง์๋์ง ๋จ๊ธด๋ค.** ํฉ์ฑ์ ๊ฒฐ์ ์ ์ด๋ฏ๋ก ๊ฐ์ ๋
ธ๋ธ๋ฉด ๊ฐ์ ๋ง์คํฐ๊ฐ ๋ค์ ๋์จ๋ค โ\n ๊ทธ๋์ ํ
ํ๋ฆฟ ํธ์๋ ์ด๋ํฐ ํธ์๊ณผ ๋๊ฐ์ด ๋ค์ ์ฝ์ ์ ์๋ค. ๋จ๊ธฐ์ง ์์ผ๋ฉด ๊ทธ ํธ์์\n ์ฒซ๋ ์ ๋ชจ์ต์ ์์ํ ๋จธ๋ฌธ๋ค(์๋ณธ์ ์์ ํธ์). */\n /* ๊ณ ๋ฅธ ํ์ฅ๋ ๋จ๊ธด๋ค โ ์์ผ๋ฉด ๋ค์ ์ฝ๊ธฐ๊ฐ ํธ์์ ํ
ํ๋ฆฟ ๊ธฐ๋ณธ ๊ณต๊ฐ์ผ๋ก ์ฎ๊ฒจ ๋ฒ๋ฆฐ๋ค(ํ์ฅ ๊ฐ๋ ์๋๋ค). */\n master.origin = { kind: 'template', templateId, params: effective, ...(spaceId ? { spaceId } : {}) }\n /* ๊ณต๊ฐ ์ ํ์ ํ
ํ๋ฆฟ์ ๊ฑฐ์น์ง ์๋๋ค โ ํ
ํ๋ฆฟ๋ง๋ค ์ด ๋
ธ๋ธ๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค๋ฉด ์ ํ
ํ๋ฆฟ์ด\n ์๋ฆฌ์ง ์๊ณ ๋ฌด์ํ๊ฒ ๋๋ค. ํฉ์ฑ๋ ๋ง์คํฐ์ ํ ๊ณณ์์ ์น๋๋ค(๋ ํผ๋ฐ์ค ์ธ์ ์คํธ์ ๊ฐ์ ๊ฒฝ๋ก). */\n const res = await TwinEngine.ingestMaster(\n domainId,\n master,\n readRestartPolicy(restartPolicy, `createFromTemplate(\"${templateId}\")`),\n { spaceId },\n context.state.user\n )\n if (start !== false) {\n await TwinEngine.startFromRegistry(domainId, res.instanceId)\n if (scenario) {\n const runtime = TwinEngine.runtime(domainId, res.instanceId)\n if (runtime) {\n runtime.scenario.load(scenario)\n runtime.scenario.start()\n }\n }\n }\n const warnings = [\n ...(filled.length ? [knobDefaultsFilled(filled)] : []),\n ...adopted.filter(a => a.count > 0).map(a => siteEquipmentAdopted(a.key, a.count)),\n ...res.warnings\n ]\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings }\n } catch (e: any) {\n return refusal(context, e, 'template instantiation failed')\n }\n }\n\n /* โโ ๋ ํผ๋ฐ์ค ๊ด๋ฆฌ(์ํฐํฐ ๊ธฐ๋ฐยทํ
๋ํธ ์ค์ฝํ) โ reference-management P1 โโโโโโโโ\n * ์ ์ญ ์ธ๋ฉ๋ชจ๋ฆฌ(referenceSources/importFromReference)์ ๊ณต์กด. ์ด์ชฝ์ TwinReference ํ + ์ด๋ํฐ ๋ ์ง์คํธ๋ฆฌ.\n */\n\n @Query(returns => [ScalarObject], { description: 'List tenant-scoped persisted twin references (adapter-backed).' })\n async twinReferences(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const rows = await getRepository(TwinReference).find({ where: { domain: { id: domainId } } })\n /*\n * provenance ๋ผ์ด๋ธ ๋์กฐ โ ์ง์์ง ํธ์์ producedCount ์์ ์๋ ์ ์ธ(์ํ ๋๊ธฐ์ lazy ๋ฐฉ์).\n *\n * **id ๋ง ์ฝ๋๋ค** (2026-08-21). ์์ ์๋ ์ธ์คํด์ค ํ ์ ์ฒด๋ฅผ ์ฝ์๊ณ , ๊ทธ ํ์๋ **๋ชจ๋ธ JSON** ์ด\n * ๋ค์ด ์๋ค(์๋ฆฌ ์๋ฐฑ ๊ฐ + ๋ฐ์๊ตญ ์ขํ). ๊ทธ๋์ ์ด ๋ชฉ๋ก์ ์ฌ๋ ๋ฐ ์ ๋ฉ๊ฐ๋ฐ์ดํธ๋ฅผ ์ฝ๊ณ ํ์ฑํ๊ณ ,\n * ํ๋ฉด์ ๊ทธ๋์ ใ์์ง ์ฐ๊ฒฐ๋ ์์คํ
์ด ์์ต๋๋คใ๋ฅผ ๋ณด์ด๊ณ ์์๋ค โ ์ฌ์ฉ์์๊ฒ๋ ใ์๋คใ๋ ๋ต์ผ๋ก\n * ์ฝํ๋ค. ์ฌ๊ธฐ์ ํ์ํ ๊ฒ์ ์ด์ ์๋ id ์งํฉ ํ๋๋ค.\n */\n const liveIds = new Set(\n (await getRepository(TwinInstance).find({ where: { domain: { id: domainId } }, select: ['instanceId'] })).map(\n i => i.instanceId\n )\n )\n return rows.map(r => {\n const produced = (((r.scopeSpec as any)?.produced ?? []) as any[]).filter(p => liveIds.has(p.instanceId))\n return {\n source: r.source, system: r.system, siteName: r.siteName, description: r.description,\n adapterType: r.adapterType, status: r.status, lastSyncedAt: r.lastSyncedAt, lastError: r.lastError,\n producedCount: produced.length, produced,\n /*\n * **์กฐ์น๊ฐ ์ ์ชฝ์ ๋ฟ์ ๋ดค๋** (ADR-0046 โก). ์นธ ์
์ 2026-09 ๋ถํฐ ์ ์์๋๋ฐ ๋ชฉ๋ก๋ ์์ธ๋\n * ์ด ๊ฐ์ ์ฃ์ง ์์ **ํ๋ฉด์ด ๋ณผ ๊ธธ์ด ์์๋ค** โ ์ ์ฅ๋ ์ฌ์ค์ด ์๋ฌด์๊ฒ๋ ๋ฟ์ง ์์๋ค.\n *\n * ๋ณด๋ผ ์ฃผ์๊ฐ ์ ํ ์ฐ๊ฒฐ์๋ง ์ฃ๋๋ค. ์ฝ๊ธฐ๋ง ํ๋ ์ฐ๊ฒฐ์ ใ์์ง ํ์ธ ์ ๋จใ์ด ์๋ฉด ํ ์ผ์ด ์๋\n * ์ฌ๋์๊ฒ ํ ์ผ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.\n */\n ...(actuationAddressed(r.connectionConfig as any)\n ? {\n actuationState: r.actuationState ?? 'unverified',\n actuationVerifiedAt: r.actuationVerifiedAt ?? null,\n actuationFailure: r.actuationFailure ?? null\n }\n : {})\n }\n })\n }\n\n @Query(returns => [String], { description: 'List registered reference adapter type keys.' })\n referenceAdapterTypes(): string[] {\n return listAdapterTypes()\n }\n\n /**\n * ์ธํฐ๊ทธ๋ ์ด์
๊ทธ๋ฃนํ (reference-management ยง2.3ยทD11) โ ์ฐ์ถ๋ฌผ์ ์ปค๋ฅํฐ ํ์
โธ Connection โธ ์ธ์คํด์ค 2๋จ์ผ๋ก.\n * ํธ์-๋ค์ดํฐ๋ธ ์จํจ๋ก์ง(integration ๋ฌด์์กด): TwinReference ๊ฐ ๊ทธ๋ฃนํ ๋
ธ๋(source=connectionName),\n * scopeSpec.connectorType ๋ก ์์ ๋ถ๋ฅ. producedCount ๋ ๋ผ์ด๋ธ ์ธ์คํด์ค๋ก ๋์กฐ(์ง์์ง ํธ์ ์ ์ธ).\n */\n @Query(returns => [ScalarObject], { description: 'Group integration items 2-tier: connector type โธ connection โธ produced twins. (reference-management ยง2.3)' })\n async twinConnections(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const rows = await getRepository(TwinReference).find({ where: { domain: { id: domainId } } })\n const liveIds = new Set((await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })).map(i => i.instanceId))\n const groups = new Map<string, any[]>()\n for (const r of rows) {\n const connectorType = (r.scopeSpec as any)?.connectorType ?? r.adapterType\n const producedCount = (((r.scopeSpec as any)?.produced ?? []) as any[]).filter(p => liveIds.has(p.instanceId)).length\n const conn = { source: r.source, name: r.siteName, status: r.status, adapterType: r.adapterType, producedCount, lastSyncedAt: r.lastSyncedAt }\n if (!groups.has(connectorType)) groups.set(connectorType, [])\n groups.get(connectorType)!.push(conn)\n }\n return [...groups.entries()].map(([connectorType, connections]) => ({\n connectorType,\n connectionCount: connections.length,\n instanceCount: connections.reduce((s, c) => s + c.producedCount, 0),\n connections\n }))\n }\n\n /** ํ Connection ๊ทธ๋ฃน ๋
ธ๋ ์์ธ โ ๊ทธ ์๋ ์์ฑ๋ ํธ์ ์ธ์คํด์ค(๋ผ์ด๋ธ ๋์กฐยท์ํยท๊ธฐ๋์ฌ๋ถ). */\n @Query(returns => ScalarObject, { nullable: true, description: 'One connection grouping location with its produced twin instances (live-checked). (reference-management ยง2.3)' })\n async twinConnection(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any | null> {\n const domainId = context.state.domain.id\n const r = await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source } })\n if (!r) return null\n const produced = ((r.scopeSpec as any)?.produced ?? []) as any[]\n const instMap = new Map((await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })).map(i => [i.instanceId, i]))\n const instances = produced\n .filter(p => instMap.has(p.instanceId))\n .map(p => {\n const inst = instMap.get(p.instanceId) as any\n return { instanceId: p.instanceId, spaceId: p.spaceId, siteId: p.siteId, kind: inst.kind, status: inst.status, running: TwinEngine.owns(domainId, p.instanceId) }\n })\n return {\n source: r.source,\n connectorType: (r.scopeSpec as any)?.connectorType ?? r.adapterType,\n name: r.siteName,\n status: r.status,\n system: r.system,\n lastSyncedAt: r.lastSyncedAt,\n instanceCount: instances.length,\n instances\n }\n }\n\n /** ๋จ๊ฑด ์์ธ(๋ทฐ/ํธ์ง) โ connectionConfig ํฌํจ, ์ด๋ํฐ ์คํค๋ง์ secret ํ๋๋ ๋ง์คํน(์์ผ๋ฉด 'โขโขโขโขโขโข'). */\n @Query(returns => ScalarObject, { nullable: true, description: 'Get one tenant-scoped reference with its connection config (secret fields masked) for view/edit.' })\n async twinReference(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any | null> {\n const r = await getRepository(TwinReference).findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!r) return null\n const secretKeys = new Set((getAdapter(r.adapterType)?.meta?.configSchema ?? []).filter(f => f.secret).map(f => f.key))\n const cfg: any = {}\n for (const [k, v] of Object.entries((r.connectionConfig as any) ?? {})) cfg[k] = secretKeys.has(k) ? (v ? 'โขโขโขโขโขโข' : '') : v\n /*\n * **์ด ์ฐ๊ฒฐ์ด ๋ง๋ ํธ์ id ๋ฅผ ํจ๊ป ๋ธ๋ค.** ์์ธ ํ๋ฉด์ด ใ์ด ์ฐ๊ฒฐ์ด ์ ๋๊ธฐํ๋๊ณ ์๋ใ๋ฅผ ๋ฌผ์ผ๋ ค๋ฉด\n * ์ด๋ ํธ์์ ๋ฌผ์ด์ผ ํ๋์ง ์์์ผ ํ๋ค. ์์ ์๋ ๊ฐ์(`producedCount`)๋ง ์์ด์ ํ๋ฉด์ด id ๋ฅผ\n * ์ ๋ฐฉ๋ฒ์ด ์์๋ค.\n */\n const producedInstanceIds = [\n ...new Set(\n ((r.scopeSpec as any)?.produced ?? [])\n .map((p: any) => p?.instanceId)\n .filter((x: any): x is string => typeof x === 'string' && !!x)\n )\n ]\n return {\n source: r.source, system: r.system, siteName: r.siteName, description: r.description,\n adapterType: r.adapterType, connectionConfig: cfg, status: r.status, lastSyncedAt: r.lastSyncedAt, lastError: r.lastError,\n producedInstanceIds,\n /* ๋ชฉ๋ก๊ณผ ๊ฐ์ ๊ท์น โ ๋ณด๋ผ ์ฃผ์๊ฐ ์ ํ ์ฐ๊ฒฐ๋ง ๊ฒ์ฆ ์ํ๋ฅผ ์ฃ๋๋ค(ADR-0046 โก). */\n ...(actuationAddressed(r.connectionConfig as any)\n ? {\n actuationState: r.actuationState ?? 'unverified',\n actuationVerifiedAt: r.actuationVerifiedAt ?? null,\n actuationFailure: r.actuationFailure ?? null\n }\n : {})\n }\n }\n\n @Query(returns => [ScalarObject], { description: 'List reference connector metadata (label, domain, config schema, availability, capabilities) for the connect UI.' })\n referenceAdapters(): any[] {\n /*\n * **๋ฅ๋ ฅ์ ํจ๊ป ๋ธ๋ค** (2026-08-21).\n *\n * `capabilities` ๋ ์ด๋ํฐ ๋ฟ๋ฆฌ์ ์๊ณ `meta` ์๋ ์์๋ค. ๊ทธ๋์ ์ฐ๊ฒฐ ํ๋ฉด์ด ใ์ด ์๋ณธ์ด ๋ผ์ด๋ธ๋ฅผ\n * ๋ผ ์ ์๋ใ๋ฅผ ์ ์ ์์๊ณ , ํธ์์ ๋ง๋ค ๋ `live` ๋ฅผ ๋งํ์ง ๋ชปํด **์ฌ๊ธฐ๋ ์ ์ฑ
์ด ์๋ค๊ณ ๊ฑฐ์ **๋๋ค\n * (์ค ์ฐ๋์์ ๊ทธ๊ฒ์ ๋งํ๋ค โ ๋ฏธ๋ฌ๋ ์ ์์ `resync` ์ด๋ฏ๋ก `live` ํ๋๋ก ์ ํด์ง๋ค).\n *\n * ํ๋ฉด์ด ๊ทธ ์ฌ์ค์ ์์์ผ ์ ์ฑ
์ ์ฌ๋์๊ฒ ๋ฌผ์์ง ์ค์ค๋ก ์ ํ ์ง ๊ฐ๋ฅผ ์ ์๋ค.\n */\n return listAdapters().map(a => ({ type: a.type, ...(a.meta ?? {}), capabilities: a.capabilities ?? [] }))\n }\n\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, { description: 'Create or update a tenant-scoped twin reference (persisted).' })\n async saveTwinReference(\n @Arg('source') source: string,\n @Arg('patch', type => ScalarObject) patch: any,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, source } })\n // ํ๋ ๋จ์ ๋ณํฉ โ ํธ์ง ์ ์๋ต๋ ํค(์: ๋ง์คํน๋ secret)๋ ๊ธฐ์กด ๊ฐ ์ ์ง.\n const connectionConfig = patch.connectionConfig\n ? { ...((existing?.connectionConfig as any) ?? {}), ...patch.connectionConfig }\n : existing?.connectionConfig\n\n /*\n * ๊ฐ์ ๋ฐ๋ ์ฌ์ดํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐ๊ฒฐ ๋์ **์ ์ฅํ๋ ์๊ฐ ๊ฑฐ๋ถํ๋ค** (ADR-0046 โก-1).\n * ๋ค์ฌ์ค๊ธฐ(planImport)์๋ ์๋ ๊ฒ์ฌ๊ฐ ํ๋ฉด ์ ์ฅ์๋ ์์ด์, ์ฐ๊ฒฐ์ ๋ฒ ๊ปด ์ด๋ฆ๋ง ๋ฐ๊พธ๋ฉด ๋ ํธ์์\n * ์กฐ์น๊ฐ ํ ๊ณต์ฅ์ผ๋ก ๊ฐ๋ค โ ์ ์ชฝ์ 200 ์ผ๋ก ๋ฐ๊ณ ์ค์ ๋ก ๋ง๋ ๋ค. ์ง(intakeEndpointยทintakeSiteId)์\n * ์ํธํ๋ ์นธ ์์ ์์ด DB ์ ๋ํฌ๋ก ๋ชป ์ก์ผ๋ ์ฌ๊ธฐ์ ์ก๋๋ค(ํ์ : connection-portability.ts).\n */\n const others = await repo.find({ where: { domain: { id: domainId } } })\n const taken = refuseIntakeCollision(source, connectionConfig as any, others as any)\n if (taken) return { ok: false, source, error: taken.message, errorCode: taken.code, errorParams: taken.params }\n\n /*\n * **์ฃผ์๋ฅผ ๋ฐ๊พธ๋ ์ ์ฅ์ ๊ฒ์ฆ์ ๋๋๋ฆฐ๋ค** (ADR-0046 โก). ์ง๋ ์๋ณต์ ์ง๋ ์ฃผ์์ ์ด์ผ๊ธฐ๋ผ ์\n * ์ฃผ์์ ๋ํด์๋ ์๋ฌด ๋ง๋ ํ์ง ์๋๋ค. ํ๋ฉด์ด ๊ทธ ์ด๋ก์ ๊ทธ๋๋ก ๋๋ฉด ๋ค๋ฅธ ๊ณต์ฅ์ ๊ฐ๋ฆฌํค๋ ์ฐ๊ฒฐ์ด\n * ใํ์ธ๋จใ์ผ๋ก ๋ณด์ธ๋ค. ๋๋๋ฆฐ ์ํ๋ ์คํจ๊ฐ ์๋๋ค โ ์์ง ์ ํด ๋ณธ ๊ฒ์ด๋ค.\n */\n const reset = actuationResetPatch(existing?.connectionConfig as any, connectionConfig as any)\n\n const saved = await repo.save(\n repo.create({\n ...(existing ?? {}),\n ...(reset ?? {}),\n domain: { id: domainId } as any,\n source,\n system: patch.system ?? existing?.system,\n siteName: patch.siteName ?? existing?.siteName,\n description: patch.description ?? existing?.description,\n adapterType: patch.adapterType ?? existing?.adapterType,\n connectionConfig,\n mappingSpec: patch.mappingSpec ?? existing?.mappingSpec,\n scopeSpec: patch.scopeSpec ?? existing?.scopeSpec,\n status: patch.status ?? existing?.status ?? 'draft'\n })\n )\n return { ok: true, source: saved.source }\n }\n\n /** ์ฐ๊ฒฐ ํด์ โ removeTwins=true ๋ฉด ์ด ๋ ํผ๋ฐ์ค๊ฐ ๋ง๋ ํธ์(provenance)๋ ํจ๊ป ์ ๊ฑฐ(๋ผ์ดํ์ฌ์ดํด ์ฐ์). ๊ธฐ๋ณธ์ ํธ์ ๋ณด์กด(๋ถ๋ฆฌ). */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Delete a tenant-scoped reference. If removeTwins, also remove the twin instances it produced (provenance cascade); otherwise twins are kept (detached).' })\n async deleteTwinReference(\n @Arg('source') source: string,\n @Ctx() context: ResolverContext,\n @Arg('removeTwins', { nullable: true }) removeTwins?: boolean\n ): Promise<boolean> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: domainId }, source } })\n if (removeTwins && ref) {\n for (const p of (((ref.scopeSpec as any)?.produced ?? []) as any[])) {\n try {\n await TwinEngine.remove(domainId, p.instanceId)\n } catch {\n /* ์ด๋ฏธ ์๊ฑฐ๋ ์คํจ โ ์ฐ์๋ best-effort. */\n }\n }\n }\n await repo.delete({ domain: { id: domainId } as any, source })\n return true\n }\n\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, { description: 'Test a reference connection via its adapter; updates status.' })\n async testReferenceConnection(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any> {\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!ref) return { ok: false, error: `unknown reference: ${source}` }\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return { ok: false, error: `no adapter for type: ${ref.adapterType}` }\n try {\n const res = await adapter.testConnection(ref.connectionConfig ?? {})\n await repo.update({ id: ref.id }, { status: res.ok ? 'connected' : 'error', lastError: res.error ?? null } as any)\n return res\n } catch (e: any) {\n return { ok: false, error: e?.message ?? 'test failed' }\n }\n }\n\n /**\n * ์ด๋ํฐ ๊ธฐ๋ฐ ์ธ์ ์คํธ โ discoverSites โ ์ฌ์ดํธ๋ณ fetchMaster โ ingestMaster (fan-out, ยง2.2ยทยง4.2).\n * P1 ์ ๋๊ฐ N=1(virtual/๋จ์ผ). start ๋ฉด ๊ฐ ์ธ์คํด์ค ๊ธฐ๋. ๋ผ์ด๋ธ ํผ๋ยทmode ๋ face2-inbound-live ์์ .\n */\n /** ๋ ํผ๋ฐ์ค๊ฐ ๋
ธ์ถํ๋ ์ฌ์ดํธ/๊ณต์ฅ ๋ฐ๊ฒฌ โ ํธ์ ์์ฑ ์ \"์ด๋ ๊ณต์ฅ\" ์ ํ์ฉ(ยง2.2). */\n @Query(returns => ScalarObject, { description: 'Discover sites/factories exposed by a reference. Returns { sites, error? } โ an empty list with no error means the system genuinely has none, which is different from a failure.' })\n async discoverReferenceSites(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any> {\n /*\n * **\"๋ชป ์ฐพ์๋ค\" ์ \"์๋ค\" ๋ฅผ ๊ตฌ๋ถํ๋ค.** ์์ ์๋ ๋ท์ ๋น ๋ฐฐ์ด ํ๋๋ก ํฉ์ณค๊ณ (๋ ํผ๋ฐ์ค ์์ยท์ด๋ํฐ\n * ๋ฏธ์ยท์กฐํ ์คํจยท์ ๋ง 0๊ฑด), ํ๋ฉด์ ๊ทธ ๋ชจ๋๋ฅผ \"์ฌ์ดํธ๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค\" ๋ผ๊ณ ๋ง ๋งํ๋ค. ์ค ์์คํ
\n * ์ฐ๊ฒฐ์์ ๊ฐ์ฅ ์์ฃผ ๋งํ๋ ์๋ฆฌ์ธ๋ฐ ์๊ฒฉ์ด ํ๋ ธ๋์ง ์ฃผ์๊ฐ ํ๋ ธ๋์ง ์ ์ ์์๋ค.\n * ํ์ ๊ณผ ๋ฌธ์ฅ ํํ๋ `discovery-result`(์์)๊ฐ ๊ฐ๋๋ค.\n */\n const ref = await getRepository(TwinReference).findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!ref) return failed(referenceNotFound(source))\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return failed(adapterUnknown(ref.adapterType, source))\n try {\n /*\n * **๊ธฐ๋ค๋ ค๋ ๋ต์ด ์์ผ๋ฉด ์ฌ์ ๋ฅผ ์ค๋ค.** ์ด๋ํฐ ๊ณ์ฝ์ ์๊ฐ ์ ํ์ด ์์ด์, ์ฃผ์๊ฐ ํ๋ฆฐ ์๋ํฌ์ธํธ๋\n * ํ๋ฉด์ ๋ฌดํํ ๋๊ฒ ๋ง๋ค์๋ค โ ๋ฌดํํ ๋๋ ํ๋ฉด์ ๋ค์ด์จ ๊ฒ์ด ์๋ ์คํจ์ ๋ค๋ฅธ ์ผ๊ตด์ด๋ค.\n * ์ํ์ ์ฌ๊ธฐ์ ์ ํ๋ค(์ด๋ํฐ๋ง๋ค ๋ค๋ฅด๊ฒ ๋๋ฉด ์ฌ์ฉ์๊ฐ ์ด๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๋์ง ์ ์ ์๋ค).\n */\n const sites = await withTimeout(adapter.discoverSites(ref.connectionConfig ?? {}), DISCOVER_TIMEOUT_MS)\n return discovered(sites)\n } catch (e: any) {\n if (e?.code === TIMEOUT) return failed(discoveryTimedOut(source, DISCOVER_TIMEOUT_MS / 1000))\n return failed(discoveryFailed(source, detailOf(e)))\n }\n }\n\n /**\n * ํธ์ ์์ฑ โ ๋ ํผ๋ฐ์ค์์ ์ฌ์ดํธ ๋ฐ๊ฒฌ โ (siteIds ์์ผ๋ฉด ๊ทธ ๊ณต์ฅ๋ง) โ fetchMaster โ provision. ์ฌ์ดํธ๋ณ resilient.\n * ์ฌ๋ฌ ๊ณต์ฅ์ ๊ดํ ํ๋ ์์ค๋ siteIds ๋ก \"์ด๋ ๊ณต์ฅ\"์ ๊ณจ๋ผ ์์ฑ(1:N, ยง2.1ยทยง2.2).\n *\n * โโ ํ์ฅ ์ ํ์ด ์ด ๊ฒฝ๋ก์๋ ์๋ค (2026-08-13) โโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ ํ์ค์ ์ฌ๋ฌ ๋ ์ฆ๊ฐ ๋น์ถ๋ค(WMSยทMESยทYMS). ๊ทธ๋ฐ๋ฐ **๊ทธ ์ ํ์ด ํ
ํ๋ฆฟ ๊ฒฝ๋ก์๋ง** ์์ด์\n * (`createFromTemplate(spaceId)`), ์ค ์์คํ
์์ ๊ฐ์ ธ์จ ํธ์์ ์ด๋ํฐ๊ฐ ํ์ํ ๊ณต๊ฐ id ๊ฐ ์ฐ์ฐํ\n * ์ผ์นํ ๋๋ง ํ ํ์ฅ์ ๋ชจ์๋ค โ ์ฌ๋์ด \"์ด MES ์ ๊ฐ์ ํ์ฅ์ ๋ฃ์ด๋ผ\" ๋ฅผ ๋งํ ๋ฐฉ๋ฒ์ด ์์๋ค.\n * ๋ฐ์ดํฐ๋ก๋ ๊ฐ๋ฅํ ์ผ์ด ์ ์์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ, `ingest-space` ๊ฐ ์ด๋ฏธ ์ง์ ํ ๊ทธ ๋น๋์นญ์ด๋ค.\n *\n * ํ์ ์ ๊ทธ ์์ ๋ชจ๋์ด ๊ฐ๋๋ค: ์๋ ๊ณต๊ฐ์ ๊ฑฐ์ (`resolveIngestSpace`), ์ฌ์ดํธ ์ฌ๋ฟ์ ํ ๊ณต๊ฐ์\n * ๋ฃ๋ ๊ฒ๋ ๊ฑฐ์ (`refuseImportSpace`) โ ์๋ก ๋ค๋ฅธ ํ์ฅ์ด ์๋ฆฌ์ง ์๊ณ ํฉ์ณ์ง๋ ๊ฒ์ ๋ง๋๋ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Create twins from a reference: discover sites โ filter by siteIds (if given) โ fetch master(s) โ provision. spaceId co-locates the twin into an existing space (one site only). start=false to only provision; live=true to run as a mirror (adapter openLiveFeed โ live projector) instead of sim. restartPolicy declares how each new twin treats its own past on reboot ('resync' | 'resume' | 'reset'); omit it and live=true implies 'resync' โ a mirror reads the source again โ while a simulation must declare 'resume' or 'reset' for itself.\"\n })\n async importTwinReference(\n @Arg('source') source: string,\n @Ctx() context: ResolverContext,\n @Arg('siteIds', type => [String], { nullable: true }) siteIds?: string[],\n @Arg('start', { nullable: true }) start?: boolean,\n @Arg('live', { nullable: true }) live?: boolean,\n @Arg('spaceId', { nullable: true, description: 'Existing space to co-locate this twin into (add a lens to a site). Only when importing a single site. Omit to give each site its own space.' }) spaceId?: string,\n @Arg('restartPolicy', { nullable: true, description: \"How each new twin treats its own past on reboot: 'resync' | 'resume' | 'reset'. Required unless live=true (a mirror is 'resync' by definition).\" }) restartPolicy?: string\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: domainId }, source } })\n if (!ref) return { ok: false, error: `unknown reference: ${source}` }\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return { ok: false, error: `no adapter for type: ${ref.adapterType}` }\n const cfg = ref.connectionConfig ?? {}\n try {\n let sites = await adapter.discoverSites(cfg)\n if (siteIds?.length) sites = sites.filter(s => siteIds.includes(s.siteId))\n /* ์๋ฌด๊ฒ๋ ์ฐ๊ธฐ ์ ์ ๊ฑฐ์ ํ๋ค โ ํ ์ฌ์ดํธ๋ฅผ ๋์ผ๋ฉด \"์ด ํ์ฅ์ ๋ํ๋ค\" ๊ฐ ์ฑ๋ฆฝํ์ง ์๋๋ค. */\n const refusal = refuseImportSpace(sites.length, spaceId)\n if (refusal) return { ok: false, error: refusal.message, errorCode: refusal.code, errorParams: refusal.params }\n const instances: any[] = []\n const failed: any[] = []\n /*\n * **์งํ์ ๊ตฌ๋
์ผ๋ก ํ๋ฆฐ๋ค** (2026-08-21).\n *\n * ๋ง์คํฐ ์ฝ๊ธฐ๋ ์๋ณธ์ ์ฌ๋ฌ ์ง์๋ฅผ ๋ณด๋ด๋ ๊ธด ์์
์ด๊ณ , ํ๋ฉด์ ๊ทธ ์ฌ์ด ์๋ฌด๊ฒ๋ ์ ์ ์์๋ค.\n * ๋จ๊ณ๋ฅผ ์๋ ๊ฒ์ ์ด๋ํฐ๋ฟ์ด๋ฏ๋ก ์ด๋ํฐ๊ฐ ๋งํ๊ณ (ํ์ค ๋ฑ๋ง), ํธ์คํธ๊ฐ ์๊ธฐ ๋ ๋จ๊ณ(์์ฑยท๊ธฐ๋)๋ฅผ\n * ๋ํด ํ๋ฆฐ๋ค.\n *\n * **๋ถ๋ชจ๋ ์ด๋ํฐ๊ฐ ์ ์ธํ ๊ฒ**์ด๋ค(`masterSteps`). ์ ์ธํ์ง ์์ ์ด๋ํฐ๋ `total` ์ด ์๊ณ , ๊ทธ๋\n * ํ๋ฉด์ ํผ์ผํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค โ ๋ชจ๋ฅด๋ ์งํ๋ฅ ์ ์ง์ด๋ด์ง ์๋๋ค.\n */\n const declared = adapter.masterSteps?.length\n const stepTotal = declared === undefined ? undefined : declared + HOST_STEPS.length\n const emit = (p: Omit<ReferenceProgress, 'siteCount'>) =>\n pubsub.publish(REFERENCE_PROGRESS_TOPIC, referenceProgressPayload(domainId, { ...p, siteCount: sites.length, total: p.total ?? stepTotal, source }))\n\n /*\n * **์ฝ์ ๋ค์ ์ดํ์ ์ฌ์ดํธ๋ง๋ค ๋จ๊ธด๋ค** (2026-08-22).\n *\n * ์ดํ์ ์ฝ๋ ์๊ฐ์๋ง ์์๋ค โ ๋ํ์์๋ฅผ ๋ซ์ผ๋ฉด ์ฌ๋ผ์ง๊ณ , ๋ค์ ๋ณด๋ ค๋ฉด ๊ฐ์ ์ฝ๊ธฐ๋ฅผ ๋ ํด์ผ ํ๋ค.\n * ๊ทธ๋ฐ๋ฐ ์ฌ๋์ด ๊ทธ๊ฒ์ ๋ฌป๋ ์๋ฆฌ๋ ใ๋ชจ๋ธ ์ดํด๋ณด๊ธฐใ๋ค(ํธ์์ ๋ณด๋ค๊ฐ ใ์ด๊ฑด ์ ๋น์๋ใ๋ฅผ ๋ฌป๋๋ค).\n * ๊ทธ๋์ ๋ ํผ๋ฐ์ค ํ์ ๋จ๊ฒจ ๊ทธ ํ๋ฉด์ด ์ธ์ ๋ ์ฝ๊ฒ ํ๋ค.\n *\n * ์ฌ์ค๋ง ๋ด๋๋ค(`assessMaster`) โ ๋ฌธ์ฅ์ ํ๋ฉด์ด ๋ง๋ค๊ณ , ๋ ์๊ณ ์ถ์ ๋ AI ๊ฐ ์ด ์ฌ์ค๋ง ๊ทผ๊ฑฐ๋ก\n * ์์ ํ๋ค. ๋ค์ ์ฝ์ผ๋ฉด ๊ทธ ์ฌ์ดํธ์ ์ดํ์ด ์๊ฒ์ผ๋ก ๋ฐ๋๋ค(์ง๋ ์ฝ๊ธฐ์ ์ดํ์ ํ์ฌ๋ก ๋ณด์ด๊ฒ\n * ๋์ง ์๋๋ค).\n */\n const assessments: Record<string, unknown> = {}\n\n for (const [siteIndex, site] of sites.entries()) {\n /*\n * **์คํจ๋ฅผ ์ค์ ๋ก ๋งํ ๋จ๊ณ์ ์ ๋๋ค** (2026-08-22).\n *\n * ์์ ์๋ ์คํจ๋ฅผ ๋ฌด์กฐ๊ฑด `provision` ์ผ๋ก ์ ์๋ค. ๊ทธ๋์ ์๋ณธ์ ์ฝ๋ค ๋๊ธด ๊ฒ๋ ํ๋ฉด์๋\n * ใํธ์ ์์ฑ์์ ์คํจใ๋ก ๋ด๋ค โ ์ฌ๋์ด ์์ธ์ ์๋ฑํ ์๋ฆฌ์์ ์ฐพ๋๋ค(์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋๋ค).\n *\n * ๊ท์ฝ์ด ๋ต์ ์ค๋ค: `done` ์ **๋๋ธ ๋จ๊ณ ์**๋ค(`ReferenceProgress.done`). ๊ทธ๋ฌ๋ฉด ์ง๊ธ ๋งํ ๊ฒ์\n * ๊ทธ ๋ค์ ๋จ๊ณ, ์ฆ `masterSteps[done]` ์ด๋ค. ๊ทธ ํ๋ฅผ ๋์ด์๋ฉด(ํธ์คํธ ๋จ๊ณ) ๋ง์ง๋ง์ผ๋ก ์๋ฆฐ ๊ฒ์ ์ด๋ค.\n *\n * ์ด ๊ท์น์ ๋ ๊ฐ์ง ๋ณด๊ณ ๋ฐฉ์์ ํจ๊ป ๋ง๋๋ค โ ๋จ๊ณ **์์**์ ์๋ฆฌ๋ ์ด๋ํฐ(`done` ์ด ์์ง 0)์\n * ๋จ๊ณ **์๋ฃ**์ ์๋ฆฌ๋ ์ด๋ํฐ(`done` ์ด 1 ๋์ด๋๋ค) ๋ชจ๋ ใ๋๋ธ ์ใ๋ง ์งํค๋ฉด ๋๋ค.\n */\n let lastDone = 0\n let lastStep: ReferenceProgress['step'] = (adapter.masterSteps?.[0] ?? 'provision') as ReferenceProgress['step']\n const track = (p: Omit<ReferenceProgress, 'siteCount'>) => {\n lastDone = p.done\n lastStep = p.step\n emit(p)\n }\n try {\n const master = await adapter.fetchMaster(cfg, site, st =>\n track({ siteId: site.siteId, siteIndex, step: st.key, done: st.done, total: stepTotal, detail: st.detail })\n )\n /* ์ด๋ ๋ ํผ๋ฐ์ค์ **์ด๋ ์ฌ์ดํธ**์์ ์๋์ง ๋จ๊ธด๋ค โ ๋ค์ ์ฝ๊ธฐ๊ฐ ๊ฐ์ ์ด๋ํฐยท๊ฐ์ ์ฌ์ดํธ๋ก ๋์์ค๋ ค๋ฉด\n ์ฌ์ดํธ ์ ์ฒด๊ฐ ์์ด์ผ ํ๋ค(`source` ๋ ์ฐธ์กฐ ์ด๋ฆ์ด๋ผ ์ฌ์ดํธ ์ ๋ถ์ ๊ฐ๋ค). */\n /*\n * ์ ์ฑ
์ **์ ์ธ์ด๊ฑฐ๋ ์๋์์ ๊ณง๋ฐ๋ก ๋ฐ๋ผ์ค๋ ๊ฒ**์ด๋ค: `live=true` ๋ ๋ฏธ๋ฌ๋ฅผ ๋์ฐ๊ฒ ๋ค๋ ๋ป์ด๊ณ \n * ๋ฏธ๋ฌ๋ ์ ์์ `resync` ๋ค(์ธ๋ถ๊ฐ ์ง์ค์ด๋ฏ๋ก ์ฐ๋ฆฌ ๊ณผ๊ฑฐ๋ฅผ ์ด์ด ๋ถ์ด์ง ์๋๋ค). ์๋ฎฌ๋ก ๋์ฐ๋ ค๋ฉด\n * ์ค์ค๋ก ์ ์ธํด์ผ ํ๋ค โ ๊ทธ ์๋ฆฌ์์ ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ฅด๋ฉด ์ฌ๊ธฐ๋๋ง๋ค ์ด๋ ฅ์ ์ง์ฐ๋ ํธ์์ด ์๋ฆฌ์ง ์๊ณ ์๊ธด๋ค.\n */\n assessments[site.siteId] = assessMaster(master, site.siteId)\n const policy = readRestartPolicy(restartPolicy ?? (live ? 'resync' : undefined), `importTwinReference(\"${source}\")`)\n track({ siteId: site.siteId, siteIndex, step: 'provision', done: declared ?? 0, total: stepTotal })\n const res = await TwinEngine.ingestMaster(\n domainId,\n { ...master, origin: { kind: 'reference', source, siteId: site.siteId, ...(spaceId ? { spaceId } : {}) } },\n policy,\n { spaceId },\n context.state.user\n )\n track({ siteId: site.siteId, siteIndex, step: 'start', done: (declared ?? 0) + 1, total: stepTotal })\n if (start !== false) {\n // live=true + ์ด๋ํฐ๊ฐ openLiveFeed ์ง์ โ mirror(์ค ์ด๋ฒคํธ ๋ฏธ๋ฌ). ์๋๋ฉด sim ๊ธฐ๋(fallback).\n /* ์ฝ๊ธฐ ์ปค์๋ฅผ ์ ์ฅํ ์๋ฆฌ๋ฅผ ํจ๊ป ๋๊ธด๋ค โ ๋ ํผ๋ฐ์ค์ ์ด๋ฆ์ ํธ์คํธ๊ฐ ๋ถ์ด๋ ๊ฒ์ด๊ณ \n ์ปค๋ฅํฐ๋ ๊ทธ๊ฒ์ ์ ์ ์๋ค(ยง`startReferenceLiveFeed`). */\n const wentLive = live\n ? await startReferenceLiveFeed(domainId, ref.adapterType, cfg, site, res.instanceId, ref.source)\n : false\n if (!wentLive) await TwinEngine.startFromRegistry(domainId, res.instanceId)\n instances.push({ siteId: site.siteId, instanceId: res.instanceId, spaceId: res.spaceId, mode: wentLive ? 'live' : 'sim', warnings: res.warnings })\n } else {\n instances.push({ siteId: site.siteId, instanceId: res.instanceId, spaceId: res.spaceId, mode: 'provisioned', warnings: res.warnings })\n }\n } catch (e: any) {\n /*\n * **์คํจํ ๋จ๊ณ๋ฅผ ๊ทธ๋๋ก ์๋ฆฐ๋ค.** ํ๋ฉด์ด ์งํ ํ์๋ฅผ ์ง์ฐ์ง ์๊ณ ๊ทธ ์๋ฆฌ๋ฅผ ๋ถ๊ฒ ๋์ด์ผ\n * ์ฌ๋์ด ใ์ด๋๊น์ง ๊ฐ๋์งใ๋ฅผ ์๋ค. ๋งํ ์๋ฆฌ๋ ใ๋๋ธ ์ใ์ ๋ค์ ๋จ๊ณ๋ค(์ ์ฃผ์).\n */\n const at = (adapter.masterSteps?.[lastDone] ?? lastStep) as ReferenceProgress['step']\n emit({ siteId: site.siteId, siteIndex, step: at, done: lastDone, total: stepTotal, failed: true, error: e?.message ?? String(e) })\n\n failed.push({ siteId: site.siteId, error: e?.message ?? 'failed', ...(e?.code ? { errorCode: e.code, errorParams: e.params } : {}) })\n }\n }\n // provenance โ ์ด ๋ ํผ๋ฐ์ค๊ฐ ๋ง๋ ์ธ์คํด์ค ์ถ์ (scopeSpec.produced). ์ญ์ ์ฐ์ยท์ํ ๋๊ธฐยท๋ค๋น๊ฒ์ด์
๊ทผ๊ฑฐ.\n const producedNew = instances.map(i => ({ siteId: i.siteId, instanceId: i.instanceId, spaceId: i.spaceId }))\n const prev: any[] = ((ref.scopeSpec as any)?.produced ?? []).filter((p: any) => !producedNew.some(n => n.instanceId === p.instanceId))\n await repo.update(\n { id: ref.id },\n {\n status: 'connected',\n lastSyncedAt: new Date().toISOString(),\n /* ๋ชป ์ฎ๊ธด ๊ฐ์ **์ธ์ด ๋จ๊ธด๋ค**. ์๋ฌด ์ธ์คํด์ค๋ ๋ณด๊ณ ํ์ง ์์์ผ๋ฉด `null` โ ใ์์๋คใ๋ก ์์ฅํ์ง ์๋๋ค. */\n lastWarningCount: instances.some((i: any) => Array.isArray(i.warnings))\n ? instances.reduce((n: number, i: any) => n + (Array.isArray(i.warnings) ? i.warnings.length : 0), 0)\n : null,\n /*\n * **์์ด canonical ๋ก ๋จ๊ธด๋ค.** ์ด ๊ฐ์ DB ์ ์ ์ฅ๋๊ณ ์ฐ๊ฒฐ ํ๋ฉด์ด ๊ทธ๋๋ก ๋ฟ๋ฆฐ๋ค โ ์์ ์๋\n * ํ๊ธ ์ฐ๋ฌธ(`N๊ฐ ์ฌ์ดํธ ์คํจ`)์ด๋ผ ๋ค์ฏ ์ธ์ด ํ๋ฉด์ ํ๊ธ์ด ์์ด ๋๊ฐ๋ค. ์ด๋ํฐ๊ฐ ์ฃผ๋ ์ฌ์ ๋\n * ๊ฐ์ ํ๋์ ๋ค์ด์ค๋ฏ๋ก(๊ทธ๊ฒ์ ์ ์์คํ
์ ๋ง์ด๋ค) ํค๊ฐ ์๋๋ผ ์์ด ๋ฌธ์ฅ์ผ๋ก ํต์ผํ๋ค.\n * ์ด๋ ์ฌ์ดํธ๊ฐ ์ ์คํจํ๋์ง๋ `failed[]` ๊ฐ ๋ตํ๋ค โ ํ๋ฉด์ด ๊ทธ๊ฒ์ ๋ณด์ฌ ์ค๋ค.\n */\n lastError: failed.length ? `${failed.length} of ${sites.length} site(s) failed: ${failed.map((f: any) => f.siteId).join(', ')}` : null,\n /*\n * โโ ์คํจ ์ฌ์ ๋ฅผ **๋จ๊ธด๋ค** (2026-08-21) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n *\n * ์ฌ์ ๋ ๋ํ์์์๋ง ์์๋ค. ๋ซ์ผ๋ฉด ์ฌ๋ผ์ง๊ณ , ๋ค์ ๋ณด๋ ค๋ฉด ๊ฐ์ ์คํจ๋ฅผ ๋ค์ ๋ง๋ค์ด์ผ ํ๋ค โ\n * ์ค์ ๋ก ใ์นํํธ๋ใ ์ฐ๊ฒฐ์ด ๊ทธ ์ํ์๋ค(์์ฝ ํ ์ค๋ง ๋จ๊ณ ์์ธ์ ์ด๋์๋ ์์๋ค).\n *\n * `scopeSpec` ์ ์ด๋ฏธ ์ด ๋ ํผ๋ฐ์ค์ ๋ถ์ ์ฌ์ค์ ๋ด๋ ์๋ฆฌ์ด๋ฏ๋ก(`produced`) ์คํค๋ง๋ฅผ ๋๋ฆฌ์ง ์๊ณ \n * ์ฌ๊ธฐ ์ ๋๋ค. ์ฑ๊ณตํ ํ์ฐจ์๋ **๋น์ด๋ค** โ ์ง๋๊ฐ ์คํจ๋ฅผ ํ์ฌ ์ํ์ฒ๋ผ ๋ณด์ด๊ฒ ๋์ง ์๋๋ค.\n */\n scopeSpec: {\n ...((ref.scopeSpec as any) ?? {}),\n produced: [...prev, ...producedNew],\n /* ์ด๋ฒ์ ์ฝ์ ์ฌ์ดํธ์ ์ดํ๋ง ๊ฐ์ ๋ผ์ด๋ค โ ์ฝ์ง ์์ ์ฌ์ดํธ์ ๊ฒ์ ๊ทธ๋๋ก ๋๋ค. */\n assessments: { ...(((ref.scopeSpec as any) ?? {}).assessments ?? {}), ...assessments },\n ...(failed.length\n ? { lastFailures: failed.map((f: any) => ({ siteId: f.siteId, error: f.error, at: new Date().toISOString() })) }\n : { lastFailures: [] })\n }\n } as any\n )\n return { ok: instances.length > 0, instances, failed }\n } catch (e: any) {\n /* ๋ ํผ๋ฐ์ค ํ์๋ **์์ด canonical** ์ ๋จ๊ธด๋ค โ ์ ์ฅ๋๋ ๊ฐ์ ์ธ์ด์ค๋ฆฝ์ด์ด์ผ ๋ค์ ์ฝ์ ์ ์๋ค. */\n await repo.update({ id: ref.id }, { status: 'error', lastError: e?.message ?? 'ingest failed' } as any)\n return refusal(context, e, 'ingest failed')\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-registry.js","sourceRoot":"","sources":["../../../server/service/reference/template-registry.ts"],"names":[],"mappings":";;AA4EA,4CAEC;AACD,sCAEC;AACD,kCAEC;AATD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAA;AACjD,SAAgB,gBAAgB,CAAC,GAAiB;IAChD,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;AAC5B,CAAC;AACD,SAAgB,aAAa;IAC3B,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;AAChC,CAAC;AACD,SAAgB,WAAW,CAAC,EAAU;IACpC,OAAO,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAC1B,CAAC","sourcesContent":["/*\n * ํธ์ ํ
ํ๋ฆฟ(์ํคํ์
) ๋ ์ง์คํธ๋ฆฌ โ ํ๋ผ๋ฏธํฐํ๋ ํฉ์ฑ ๋ ํผ๋ฐ์ค ๋ง์คํฐ ๋น๋.\n * ๋ ํผ๋ฐ์ค(reference-registry)๊ฐ \"๊ณ ์ ๋ง์คํฐ\"๋ผ๋ฉด, ํ
ํ๋ฆฟ์ \"๋
ธ๋ธ๋ก ํ๋ผ๋ฏธํฐํ๋ ๋ง์คํฐ ๋น๋\".\n * ๋ ๋ค ๊ฐ์ ์ธ์ ์คํธ ๊ฒฝ๋ก(ingestMaster)๋ก ํ๋ฅธ๋ค โ ์์ฒ์ด ๊ณ ์ ์ด๋ ํฉ์ฑ์ด๋๋ง ๋ค๋ฅด๋ค(board-authoring ยง10).\n * ์ฑ(operato-twin)์ด bootstrap ์์ ์๊ธฐ ์ํคํ์
์ registerTemplate ํ๋ค. ํํ(map/image/model) ๋ฌด๊ด.\n */\nimport type { DomainSystem } from '@operato/ops-contract'\n\nimport type { ReferenceMaster } from './reference-master.js'\n\n/** ์ฌ์ฉ์ ๋
ธ์ถ ํ๋ผ๋ฏธํฐ(๋
ธ๋ธ) ์ ์ โ ํด๋ผ์ด์ธํธ๊ฐ ์ด ์คํค๋ง๋ก ํผ์ ๋ ๋ํ๋ค. */\nexport interface KnobDef {\n key: string\n /** 'geo' = ์๊ฒฝ๋ ์ง์ (์ง๋์์ ํด๋ฆญ ์ ํ). ๊ฐ์ { lat, lon }. ์ฌ์ฉ์๊ฐ ์ขํ๋ฅผ ๋ชฐ๋ผ๋ ์ง๋๋ก ์ง์ . */\n label: string\n /**\n * 'siteEquipment' = **์ด ํ์ฅ์ ์ด๋ฏธ ์๋ ์ค๋น๋ค**(`{id, kind}`). ๊ฐ์ด ๋น์ด ์์ผ๋ฉด ๋ง๋ค ๋ ํ ๋ฒ\n * ํด์ํด์ ์ฑ์ฐ๊ณ , ์ฑ์ด ๊ฒฐ๊ณผ๋ฅผ ๋
ธ๋ธ ๊ฐ์ผ๋ก **๋จ๊ธด๋ค**(`origin.params`). ๊ทธ๋์ผ ๋์ค์ ๋ค์ ์ง์ด๋\n * ๊ฐ์ ํธ์์ด ๋์จ๋ค โ ๊ทธ๋๊ทธ๋ ํ์ฅ์ ๋ค์ ์ฝ์ผ๋ฉด ์ฌ์ด์ ์ค๋น๊ฐ ๋๊ณ ์ค ๋งํผ ๋ค๋ฅธ ํธ์์ด ๋๋ค.\n *\n * ์ข
๋ฅ๋ฅผ ํจ๊ป ์ฃ๋ ์ด์ : ๋ฌด์์ ๋ฐ์๋ค์ผ์ง๋ **ํ
ํ๋ฆฟ์ด ์ข
๋ฅ๋ก ํ๋จ**ํ๋ค(์ด๋ฆ์ผ๋ก ์ง์ํ์ง ์๋๋ค).\n */\n type: 'number' | 'text' | 'select' | 'geo' | 'siteEquipment'\n default: any\n min?: number\n max?: number\n options?: { value: string; label: string }[]\n help?: string\n}\n\n/**\n * ํ
ํ๋ฆฟ ์์ธ(์ค๋ช
ํ์ด์ง์ฉ, ์ ํ) โ \"์ด ํ
ํ๋ฆฟ์ด ๋ฌด์์ ๋ชจ๋ธ๋งํ๋\"๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๋ณด์ฌ์ค ํ์ ์ ์ค๋ค.\n * ์์ ํ์์ฉ ๋ฐ์ดํฐ(๋น๋ ๋ก์ง๊ณผ ๋ฌด๊ด). ํด๋ผ์ด์ธํธ๊ฐ ์ด ์คํค๋ง๋ก ์์ธ ๋ทฐ๋ฅผ ๋ ๋ํ๋ค.\n */\nexport interface TemplateDetail {\n /** ํ ์ค ์์ฝ(๋๊ตฌ๋ฅผ ์ํ/๋ฌด์). */\n summary?: string\n standards?: string[]\n /** ๋ฐธ๋ฅ์ฒด์ธ ๊ตญ๋ฉด(๋ฐ์
ยท๋ณด๊ดยท๋ณํยท๋ฐ์ถ ๋ฑ). */\n phases?: { key: string; label: string; system?: string; note?: string }[]\n /** ๊ณต์ ๋ผ์ฐํธ(์คํผ๋ ์ด์
์ํ์ค). */\n route?: { op: string; label?: string; resource?: string; intent?: string; bizStep?: string }[]\n locationTypes?: { key: string; label?: string; standardClass?: string; capabilities?: string[] }[]\n resourceTypes?: { key: string; label?: string; standardClass?: string; capabilities?: string[] }[]\n /** BOM/๋ ์ํผ ์์ฝ. */\n recipe?: {\n inputs: { material: string; qty: number; key?: string }[]\n outputs: { material: string; qty: number; key?: string }[]\n /** ์์ฑ ๋ผ์ฐํธ ์ด๋ฆ(๊ณต์ ๋ผ์ฐํธ ์ฐธ์กฐ). */\n route?: string\n }\n /**\n * ํ์ค ์ ํฉ ๋งคํ โ ๊ฐ๋
์ด **์ด๋ ํ์ค์ ๋ฌด์์ ๋์ํ๋.**\n *\n * ํ์ค ์นธ์ด EPCISยทISA-95 ๋๋ก ๊ตณ์ด ์์๋ค. ์๋์ง ํ
ํ๋ฆฟ์ ๊ทธ ๋์ด ์ต์ปค๊ฐ ์๋๋ผ ์ ์ ์๋ฆฌ๊ฐ ์์๋ค โ\n * ์ปค๋์ `StandardClass` ๋ ๊ฐ์ ์ด์ ๋ก ์ด์๋ค(`iso50001`ยท`iec61850`). ๋์ํ ์ด๋ฆ์ด ์์ผ๋ฉด **๋น์ด๋ค**.\n */\n standardsMap?: { concept: string; epcis?: string; isa95?: string; iso50001?: string; iec61850?: string }[]\n /** \"์ด ํ
ํ๋ฆฟ์ด ๋ง๋?\" ํ๋จ ๋์ ํญ๋ชฉ. */\n fits?: string[]\n}\n\nexport interface TwinTemplate {\n id: string\n label: string\n /** ์ปค๋ ์นดํ๋ก๊ทธ๊ฐ ์ ๋ณธ โ ์ข
๋ฅ๊ฐ ๋๋ฉด ์ฌ๊ธฐ ์๋ ๊ฒ์ด ์๋ค(`DomainSystem`). */\n system: DomainSystem\n description?: string\n /** ์์ธ ์ค๋ช
(์ ํ) โ ์ค๋ช
ํ์ด์ง/ํจ๋์ด ๋ ๋. */\n detail?: TemplateDetail\n knobs: KnobDef[]\n /** ๋
ธ๋ธ ๊ฐ โ ํฉ์ฑ ๋ง์คํฐ(+์ต์
์๋๋ฆฌ์ค). scenario ๋ runtime.scenario.load ๋ก ์ ๋ฌ๋๋ ๋ถํฌ๋ช
๊ฐ. */\n build(params: Record<string, any>): { master: ReferenceMaster; scenario?: any }\n}\n\nconst templates = new Map<string, TwinTemplate>()\nexport function registerTemplate(tpl: TwinTemplate): void {\n templates.set(tpl.id, tpl)\n}\nexport function listTemplates(): TwinTemplate[] {\n return [...templates.values()]\n}\nexport function getTemplate(id: string): TwinTemplate | undefined {\n return templates.get(id)\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-reference-reconciliation.js","sourceRoot":"","sources":["../../../server/service/reference/twin-reference-reconciliation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, UpdateDateColumn } from 'typeorm'\nimport { Field, ID, Int, ObjectType } from 'type-graphql'\nimport { Domain } from '@things-factory/shell'\n\n/* ํ ์ฐ๊ฒฐยทTwinยท๋จ์์ ์ต์ ๋ฒํธ ๋์ฌ ์ํ. ๊ณผ๊ฑฐ ์ถ์ด๋ ingest window๊ฐ, ํ์ฌ ์กฐ์น ํ๋จ์ ์ด ํ๊ฐ ๋ตํ๋ค. */\n@Entity()\n@Index('uq_twin_reference_reconciliation_0', (e: TwinReferenceReconciliation) => [e.domain, e.instanceId, e.scope], { unique: true })\n@Index('ix_twin_reference_reconciliation_0', (e: TwinReferenceReconciliation) => [e.domain, e.instanceId, e.checkedAt], { unique: false })\n@ObjectType({ description: 'Latest durable sequence reconciliation for one connected source scope. It reports only what numbered source ranges can prove; it never substitutes replay-prone ingest-window counts for source facts.' })\nexport class TwinReferenceReconciliation {\n @PrimaryGeneratedColumn('uuid') @Field(type => ID) readonly id: string\n @ManyToOne(type => Domain) @Field(type => Domain, { nullable: true }) domain?: Domain\n @RelationId((e: TwinReferenceReconciliation) => e.domain) domainId?: string\n @Column() @Field() instanceId: string\n @Column() @Field() scope: string\n @Column() @Field() status: 'aligned' | 'gap' | 'unknown'\n @Column({ type: 'int', nullable: true }) @Field(type => Int, { nullable: true }) sourceFirst?: number\n @Column({ type: 'int', nullable: true }) @Field(type => Int, { nullable: true }) sourceLast?: number\n @Column({ type: 'int', nullable: true }) @Field(type => Int, { nullable: true }) cursorSeq?: number\n @Column({ type: 'int', nullable: true }) @Field(type => Int, { nullable: true }) firstSeqSeen?: number\n @Column({ type: 'int', nullable: true }) @Field(type => Int, { nullable: true }) headMissing?: number\n @Column({ type: 'int', nullable: true }) @Field(type => Int, { nullable: true }) behind?: number\n @Column({ nullable: true }) @Field({ nullable: true }) reason?: string\n @Column() @Field() checkedAt: Date\n @CreateDateColumn() createdAt?: Date\n @UpdateDateColumn() updatedAt?: Date\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-reference.js","sourceRoot":"","sources":["../../../server/service/reference/twin-reference.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 type { RefusalCode, RefusalParams } from '@operato/ops-contract'\n\nimport { Domain, ScalarObject, encryptedJsonColumn } from '@things-factory/shell'\n\n/** ์กฐ์น ๊ฒ์ฆ ์ํ โ ใ์์ง ์ ํด ๋ดค๋คใ๋ ์คํจ๊ฐ ์๋๋ผ ๊ทธ ์์ฒด๋ก ํ๋์ ์ฌ์ค์ด๋ค. */\nexport type ActuationState = 'unverified' | 'verified' | 'failed'\n\n/** ๋ง์ง๋ง ๊ฑฐ์ โ ์ธ์ด ์ค๋ฆฝ ์ฝ๋์ ๊ทธ ๊ฐ๋ค. ์ฌ๋ ๋ฌธ์ฅ์ ๋ด์ง ์๋๋ค. */\nexport interface ActuationFailure {\n code: RefusalCode\n /** ๊ฑฐ์ ๋ ์๊ฐ (ISO 8601). */\n at: string\n params?: RefusalParams\n}\n\n/*\n * TwinReference โ ํ
๋ํธ ์ค์ฝํ์ ์ธ๋ถ ์์ค ์์คํ
์ฐ๊ฒฐ(์ค ๋๋ ๊ฐ์). ํธ์ ์ธ์คํด์ค๊ฐ ์ธ์ ์คํธ๋๋ ์์ฒ(Face2, ADR-0018).\n * ์ ์ญ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ ํผ๋ฐ์ค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๋์ฒดํ๋ ์์ยท๋๋ฉ์ธ๋ณยท์ด๋ํฐ ๊ธฐ๋ฐ ์ํฐํฐ.\n * inbound ์ ์ฉ(๊ตฌ์กฐยท์ํ). ์์๋ฐ์ด๋ ์ก์ถ์์ด์
์ command-routing(ActuationAdapter) ์์ .\n * mappingSpec/scopeSpec ๋ simple-json(๋ฉํฐDB ์ด์ โ postgres/mysql/sqlite/mssql/oracle ๊ณตํต).\n * connectionConfig ๋ ์๊ฒฉ ์ฆ๋ช
์ ๋ด์ผ๋ฏ๋ก ์ํธํ๋๋ ํ
์คํธ ์นธ์ด๋ค(์นธ ์ฃผ์ ์ฐธ์กฐ).\n * ์ค๊ณ SoT: operato-twin/design/plans/reference-management.md.\n * (CLAUDE.md: ๋ชจ๋ @ObjectType/@Field ๋ ์๋ฌธ description ํ์.)\n */\n@Entity()\n@Index('ix_twin_reference_0', (e: TwinReference) => [e.domain, e.source], { unique: true })\n@ObjectType({ description: 'A tenant-scoped connection to an external source system โ the origin for ingesting twin instances (Face2).' })\nexport class TwinReference {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier of the reference record.' })\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: TwinReference) => e.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Reference source id (unique within a domain).' })\n source: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Domain kernel system: wms | yms | mes.' })\n system?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Human-readable site/system name.' })\n siteName?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Optional description.' })\n description?: string\n\n @Column()\n @Field({ description: \"Adapter type registry key (e.g. 'virtual' | 'rest' | 'db' | 'epcis').\" })\n adapterType: string\n\n /**\n * ์ด ์ฐ๊ฒฐ์ ํ์ํ ๊ฐ โ **์๊ฒฉ ์ฆ๋ช
์ด ์ฌ๊ธฐ ๋ค์ด์จ๋ค. ๊ทธ๋์ ์ ์ฅ๋ ๋ ์ํธํ๋๋ค.**\n *\n * โโ ์ ํ์ ๋๋ (2026-09-09) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋น๋ฐ๊ฐ์ ํ๊ฒฝ์ ๋๊ณ ์ด๋ฆ์ผ๋ก ๊ณ ๋ฅด๋ ๊ฒ์ด ์์น์ด๋ค(ยง`webhookSecretCandidates`). ๊ทธ ์์น์\n * **์ค์น๋ณธ๋ง๋ค ํ๋์ธ ํค**์ ๋ง๋๋ค โ ๋ฐฐํฌํ ๋ ๋ฃ์ผ๋ฉด ๋๋ค.\n *\n * ํธ์์ ์ฐ๊ฒฐ์ ๊ทธ ๋ชจ์์ด ์๋๋ค. **์ฌ๋์ด ํ๋ฉด์์ ์ฐ๊ฒฐ์ ๋ง๋ ๋ค.** ์ ๊ณต์ฅ์ ๋ถ์ด๋ ค๊ณ ์ฌ๋ฐฐํฌํ \n * ์๋ ์์ผ๋ฏ๋ก, ์ฐ๊ฒฐ๋ง๋ค ๋ค๋ฅธ ์ด ๊ฐ์ ํ์ ์์ด์ผ ํ๋ค. ๊ทธ ์๋ฆฌ์์ ์์น์ด ๊ฐ๋ฆฐ๋ค:\n *\n * ์ค์น๋ณธ๋ง๋ค ํ๋์ธ ํค ํ๊ฒฝ๋ณ์. ์ด๋ฆ์ด ์ด๋ ์๋ ๊ฒ์ธ์ง ๋งํ๋ค\n * ์ฐ๊ฒฐ๋ง๋ค ๋ค๋ฅธ ๊ฐ ํ. ๋์ ์ ์ฅ๋ ๋ ์ํธํํ๋ค\n *\n * โโ ๋ฌด์์ ์งํค๊ณ ๋ฌด์์ ๋ชป ์งํค๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ์ฅ๋ ๊ฒ์ ์งํจ๋ค โ DB ํ์ผ ยท ๋ฐฑ์
ยท ๋ณต์ ๋ณธ. 2026-09-09 ์ ์ด ์นธ์์ `hookSecret` ๊ณผ ์ ์\n * ํ ํฐ์ ๋ช
๋ น ๋ ๊ฐ๋ก ์ฝ์๋ค.\n *\n * **ํ๋ก์ธ์ค๋ฅผ ๋๋ฆด ์ ์๋ ์ฌ๋์๊ฒ์๋ ๋ชป ์งํจ๋ค** โ ๊ทธ ์ฌ๋์ ํค๋ฅผ ๊ฐ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ด\n * ํ๋ฉด์ผ๋ก ๋๊ฐ๋ ๊ฒ๋ ์ด ์นธ์ด ๋ง์ง ์๋๋ค: ๋ด๋ณด๋ด๋ ์ชฝ์ด ์ด๋ํฐ ์คํค๋ง์ `secret: true` ๋ฅผ ๋ณด๊ณ \n * ๊ฐ๋ฆฐ๋ค(ยง`reference-resolver` ์ ์์ธ ์กฐํ). **๋ ๊ฐ์ง๊ฐ ๊ฐ๋ ค ์์ผ๋ฏ๋ก ํ์ชฝ๋ง ํ๋ฉด ๋ฐ์ชฝ์ด๋ค.**\n *\n * ๊ธฐ์กด ํ๋ฌธ ํ์ ์ ๊นจ์ง๋ค โ ๋ณํ๊ธฐ๊ฐ ์ํธ๋ฌธ ๋ชจ์์ด ์๋ ๊ฐ์ ์์๋ณด๊ณ ํ์ฑํ๋ฉฐ ๊ฒฝ๊ณ ๋ฅผ ๋จ๊ธฐ๊ณ ,\n * ๋ค์ ์ ์ฅ๋ ๋ ์ํธํ๋๋ค.\n */\n @Column({ nullable: true, ...encryptedJsonColumn() })\n @Field(type => ScalarObject, { nullable: true, description: 'Adapter-specific connection config (endpoint, credentials, params). Encrypted at rest; secret-declared fields are masked on the way out.' })\n connectionConfig?: any\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Declarative legacyโcanonical mapping rules (kernel face2-adapter AdapterRule[]).' })\n mappingSpec?: any\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: '1:N fan-out scope (discovered sites). Multiple sites โ N instances.' })\n scopeSpec?: any\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Lifecycle status: draft | connected | error.' })\n status?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Last successful master sync time (ISO 8601 string; portable across DB drivers).' })\n lastSyncedAt?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Last connection/sync error message, if any.' })\n lastError?: string\n\n /**\n * **์กฐ์น๋ฅผ ์ด ์ฃผ์๋ก ์ค์ ๋ก ๋๊ฒจ ๋ดค๋** (ADR-0046 โก).\n *\n * โโ ์ ์ธ ๊ฐ์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ค์ ์ด ๋ง๋ ๊ฒ๊ณผ ์ ์ชฝ์ด ๋ฐ๋ ๊ฒ์ ๋ค๋ฅด๋ค. ์ฃผ์๋ ๋น๋ฐ๊ฐ๋ ๋ค ์ ํ ์๋๋ฐ ์ ์ชฝ ํ๋ก์ธ์ค๊ฐ ๊ทธ ๊ฐ์\n * ์์ ์ผ์ด ์ค์ ๋ก ์์๋ค(ยง`actuationReadiness`). ๊ทธ๊ฒ์ **ํ ๋ฒ ๋๊ฒจ ๋ด์ผ** ์ ์ ์๊ณ , ๊ทธ๋์\n * ใ์์ง ์ ํด ๋ดค๋คใ์ ใํด ๋ดค๊ณ ๋๋คใ์ ใํด ๋ดค๊ณ ์ ๋๋คใ๊ฐ ๋ค๋ฅธ ์ฌ์ค์ด๋ค.\n *\n * unverified ์์ง ์๋ณต์ด ์๋ค โ ์คํจ๊ฐ ์๋๋ค. ์ ์ฐ๊ฒฐ๊ณผ ์ค์ ์ด ๋ฐ๋ ์ฐ๊ฒฐ์ด ์ฌ๊ธฐ ์ ๋ค\n * verified `actuate` ๊ฐ ๋ฐ์๋ค์ฌ์ก๋ค. ๊ทธ ์๊ฐ์ด `actuationVerifiedAt`\n * failed ๊ฑฐ์ ๋๋ค. ์ฌ์ ๋ `actuationFailure` ์ **์ฝ๋๋ก**\n *\n * `unverified` ๋ฅผ `failed` ๋ก ์ ์ง ์๋๋ค โ ์ ํด ๋ณธ ๊ฒ์ ์คํจ๋ก ๊ทธ๋ฆฌ๋ฉด ์ฌ๋์ด ๊ณ ์น ๊ฒ์ ์ฐพ์ผ๋ฌ\n * ๊ฐ๊ณ , ๊ณ ์น ๊ฒ์ด ์๋ค.\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: \"Whether an actuation has actually reached this peer: 'unverified' | 'verified' | 'failed'. Null means the same as unverified; a connection that has never been tried is not a failed one.\" })\n actuationState?: ActuationState\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When an actuation was last accepted by the peer (ISO 8601 string; portable across DB drivers). Null while unverified.' })\n actuationVerifiedAt?: string\n\n /**\n * ๋ง์ง๋ง ๊ฑฐ์ โ **์ฝ๋์ ๊ฐ๋ง ์ ์ฅํ๋ค. ๋ฌธ์ฅ์ ์ ์ฅํ์ง ์๋๋ค.**\n *\n * `lastError` ๊ฐ ์ฌ๋ ๋ฌธ์ฅ์ ์ ์ฅํด ๋๊ณ ํ๋ฉด์ด ๊ทธ๊ฒ์ ๊ทธ๋๋ก ๋ฟ๋ ธ๋ค. ๊ทธ๋ฌ๋ฉด ๋ฒ์ญ์ด ์ ๋๊ณ , ๋ฌด์์ด\n * ๋ช ๋ฒ ๋ฌ๋์ง ์ธ์ง๋ ๋ชปํ๊ณ , ์ปค๋ฅํฐ๊ฐ ๋ฌธ์ฅ์ ๊ณ ์น๋ ๋ ์ ํ๊ณผ ์ ํ์ด ์๋ก ๋ค๋ฅธ ๋ง์ ํ๋ค.\n * ์ฝ๋๋ `CommandAck.errorCode` ์ ๊ฐ์ ๋ฑ๋ง์ด๋ค(ADR-0042 โข) โ ํํ์ธต์ด ๋ฌธ์ฅ์ ๋ง๋ ๋ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Why the last actuation was refused: { code, at, params? }. Language-neutral codes only โ the presentation layer builds the sentence. Null when the last attempt was accepted or none was made.' })\n actuationFailure?: ActuationFailure\n\n /**\n * ๋ง์ง๋ง ๋๊ธฐ์์ **๋ชป ์ฎ๊ธด ๊ฐ์ ์**. `null` = ์ธ์ง ์์๋ค(0 ๊ณผ ๋ค๋ฅด๋ค).\n *\n * ์ธ์ง ์์ ๊ตฌ์กฐ ์ธ์ ์คํธ๋ ๋ํฌ๋ฅผ ๋์ผ๋ก ๋ฐ๊ฟ ๋๊ณ ๋ ์ฑ๊ณต์ด๋ผ ๋ตํ๋ฉด์ ์๋ฌด ์ผ๋ ํ์ง ์๋๋ค. ๊ทธ ์ฌ์ค์ ์ฌํ์ ๋ฌผ์ ์\n * ์์ด์ผ ๋จ๊ณ ํ์ ์ด ใ๊ตฌ์กฐ๋ ๋๋คใ๋ฅผ ๋งํ ์ ์๋ค โ ์๋ ๋์ ํ์ ์ ๋ `unmeasured` ์๋ค.\n * ๊ธฐ๋ณธ๊ฐ์ ๋์ง ์๋๋ค: 0 ์ ๊ธฐ๋ณธ์ผ๋ก ๊น๋ฉด ใ๊ฒฝ๊ณ ์์๋คใ์ ใ์ธ์ง ์์๋คใ๊ฐ ๊ฐ์์ง๋ค.\n */\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'Number of values the last sync could not carry over (mapping fallbacks). Null means they were not counted at all, which is different from zero.' })\n lastWarningCount?: number\n\n /**\n * **์ด๋๊น์ง ์ฝ์๋** โ ๋ผ์ด๋ธ ํผ๋์ ์ฝ๊ธฐ ์ปค์(ยง`LiveFeedContinuity`).\n *\n * โโ ์ ์ ์ฅํ๋ (2026-08-23 ์ค์ธก) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ด๋ํฐ๊ฐ ๋ถ์ ๋๋ง๋ค `Date.now() โ ๋๋์๋ณผ ๋ ์` ๋ก ์ฐฝ์ ์๋ก ๋ง๋ค๊ณ ์์๋ค. ๊ทธ๋์ **์ฌ๊ธฐ๋๋ง๋ค\n * ๋ฏธ๋ฌ์ ๊ณผ๊ฑฐ๊ฐ ์๋ ธ๋ค** โ ์์
2,855 โ 2,820(8์๊ฐ ํ๋ฅธ ๋งํผ). ๋ฏธ๋ฌ๊ฐ ์๋ ๊ฒ์ด ใ์๋ณธ์ ์ฌ์คใ์ด\n * ์๋๋ผ ใ์ฐฝ์ ํจ์ใ์๊ณ , ๊ทธ ์ฌ์ค์ ์๋ฌด๋ ๋งํ์ง ์์๋ค.\n *\n * ์ปค๋์ด ๊ทธ ๊ฐ๋ฆผ์ ์ด๋ฏธ ์ ์ด ๋์๋ค(ยง`hydrateContinuity`): ใ์์ฒ์ด ์ ์ด์ ๋ค์ ๋งํด ์ฃผ์ง ์๋ ์ถใ์\n * ์ฌ๊ธฐ๋ ์ฐ์์ฑ์ผ๋ก ์ด์ด๋ฐ๋๋ค. ใ์ฐ๋ฆฌ๊ฐ ์ด๋๊น์ง ์ฝ์๋ใ๊ฐ ์ ํํ ๊ทธ ์ฑ์ง์ด๋ฏ๋ก **์ด๋ํฐ์ ์ฌ๋ฌผํจ์ด\n * ์๋๋ผ ์ด ์ธต**์ ์๋ค โ ์๋ณธ์ด ๋ ๋๋ง๋ค ์ ์ฅ ๊ธฐ์ ๊ฐ ๋๊ณ ๊ทธ์ค ํ๋๊ฐ ์๋ฆฌ์ง ์๊ณ ๋ค๋ฅด๊ฒ ๋์ํ์ง ์๊ฒ.\n *\n * โโ ์ ์บ์๊ฐ ์๋๋ผ ํ์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ง๋ฃ๋๋ฉด ์ฐฝ์ด ๋ค์ ๋ฏธ๋๋ฌ์ง๊ณ , ๊ทธ ์์ค์ ์ค๋ฅ ์์ด ๋ค์ด์จ ๊ฒ์ด ์๋ค. ์ค๋
์ท ์ฒดํฌํฌ์ธํธ์ ์ฑ์ง์ด ๋ค๋ฅด๋ค\n * (๊ทธ์ชฝ์ ์์ด๋ ์์ฒ์ด ์ ์ ํด ์ค๋ค โ ์ด ๊ฐ์ **์์ผ๋ฉด ์์ฒ์ ๋ฌป์ง ์๊ฒ ๋๋ค**).\n *\n * ๋ชจ์์ `{ streams: { [ํ๋ฆ]: { since?, seen[] } }, firstAttachedAt? }` ๋ค. **ํ๋ฆ ์ด๋ฆ์ ์ด๋ํฐ๊ฐ\n * ์ ํ๋ค** โ ์๋ณธ๋ง๋ค ํ๋ฆ ์์ ๋ป์ด ๋ค๋ฅด๋ฏ๋ก ์ด ์ธต์ ์ด์ ๋ก๋ง ๋ค๋ฃฌ๋ค. `simple-json` ์ด๋ผ ๋๋ผ์ด๋ฒ\n * ๋ค์ฏ์ ๊ทธ๋๋ก ์ง๋๋ค.\n *\n * `firstAttachedAt` ์ ใ์ธ์ ๋ถํฐ ์๋๊ฐใ๋ค. ์ปค๋์ ์ํ๋ง ์๋ค(`nowTime` = ๋ง์ง๋ง์ผ๋ก ๋ค์ ์๊ฐ).\n * ๋์ด ํจ๊ป ใ์ด ํธ์์ด ์๋ ๊ตฌ๊ฐใ์ด๊ณ , ํ๋ฉด์ด ์๋ฅผ ๋ณด์ผ ๋ ๊ทธ ๊ตฌ๊ฐ์ ๋งํด์ผ ํ๋ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Live feed read cursor carried across restarts, keyed by adapter-defined stream. Null means the feed has never attached, and the next attach decides its first window.' })\n liveCursor?: any\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when the reference was first created.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when the reference row was last updated.' })\n updatedAt?: Date\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/twin-attention/index.ts"],"names":[],"mappings":";;;AAAA,uEAA8D;AAEjD,QAAA,SAAS,GAAG,CAAC,4CAAkB,CAAC,CAAA","sourcesContent":["import { TwinAttentionQuery } from './twin-attention-query.js'\n\nexport const resolvers = [TwinAttentionQuery]\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-attention-query.js","sourceRoot":"","sources":["../../../server/service/twin-attention/twin-attention-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Int, Query, Resolver } from 'type-graphql'\n\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { digestAttentions } from '../../engine/attention-digest.js'\n\n/*\n * ์ฃผ๋ชฉ ์ ํธ(Attention) ์ง์ โ ํ์ฌ ์ค๋
์ท์ ์์ฝ๋ \"๋ด์ผ ํ ๊ฒ\".\n * ์ปค๋ computeAttentions() ํ์: severity(ISA-18.2/IEC 62682) ยท state(OPC UA A&C) ยท\n * anchor(locationId/moverId/orderId = ๊ณต๊ฐ ์์น) ยท suggestedAction(์กฐ์น ์ ์). kind ๋ ๋๋ฉ์ธ ์์ (๋ฌด๋ฐฉ์ธ).\n * full StateSnapshot ๋์ ์ด ๊ฒฝ๋ ๋ชฉ๋ก์ AI read ๋๊ตฌยทinsight UI ๊ฐ ์์ฑ(๋์ฉ๋ ๋คํ ํํผ).\n * (์ค์๊ฐ ์คํธ๋ฆผ์ twinState subscription ์ด attentions ๋ฅผ ํฌํจ. ์ด๊ฑด one-shot '์ง์' ํ๋ฉด.)\n */\n@Resolver()\nexport class TwinAttentionQuery {\n @Query(returns => [ScalarObject], {\n description: 'Active attention signals (things to look at) derived from the current twin snapshot โ severity (ISA-18.2), lifecycle state (OPC UA A&C), space anchor, and suggested action.'\n })\n async twinAttentions(\n @Ctx() context: ResolverContext,\n @Arg('instanceId', { nullable: true }) instanceId?: string,\n /*\n * **๊ณต๊ฐ์ผ๋ก ๋ฌผ์ผ๋ฉด ๊ทธ ํ์ฅ์ ๋ชจ๋ ๋ ์ฆ์์ ๋ชจ์ ๋ตํ๋ค** โ ํ ํ์ค์ WMSยทMESยทYMS ๊ฐ ํจ๊ป ๋น์ถ๋ฏ๋ก\n * \"์ด ํ์ฅ์์ ๋ด์ผ ํ ๊ฒ\" ์ ๋ ์ฆ ํ๋๋ก ๋ตํ ์ ์๋ค. ์์ ์๋ ํ๋ฉด์ด ์ธ์คํด์ค๋ง๋ค ๋ฌผ์ด ์์ผ๋ก\n * ํฉ์ณค๊ณ , ๊ทธ๋ฌ๋ฉด ์ ๋ ฌ ๊ท์น์ด ํ๋ฉด๋ง๋ค ๊ฐ๋ฆฐ๋ค.\n *\n * ๊ฒฝ๊ณ ๋ **ํฉ์งํฉ์ด ๊ทธ๋๋ก ๋ป์ด ์๋ ์ ์ผํ ๋ ์ฆ**๋ค. ์์ธก์ ํฉ์น ์ ์๋ค(P50 ๋ ๊ฐ๋ฅผ ๋ํ ์ ์๋ค) โ\n * ๊ทธ๋์ ์์ธก์ ์ฌ์ ํ ์ธ์คํด์ค๋ณ๋ก ๋ตํ๊ณ ํ๋ฉด์ด ๋๋ํ ๋๋๋ค.\n */\n @Arg('spaceId', { nullable: true }) spaceId?: string\n /*\n * โโ ์๋ฅด๋ ์ธ์๋ ์ฌ๊ธฐ ์๋ค (2026-09-19, ์์ ์ํคํ
ํธ ํ์ ) โโโโโโโโโโโโโโ\n *\n * `limit` ์ด ์์๋ค. ์๋ฅด๋ฉด์ **๋ช ๊ฑด์ ์๋๋์ง๋ ๋ต์ ์ฃ์ง ๋ชปํ๋ค** โ ๋ต์ด ๋งจ ๋ชฉ๋ก์ด๋ผ ์ค์\n * ์๋ฆฌ๊ฐ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ์ ์๋ ๋ฌธ์ด ์๋ฆฐ ์๋ฅผ ๋ชป ๋งํ๋ฉด, ์ค๋ฌด ๊ฑด๋ง ๋ฐ์ ํ๋ฉด์ ๊ทธ๊ฒ์ด\n * ์ ๋ถ์ธ์ง ์ด๋ฐฑ ์ค ์ค๋ฌด ๊ฑด์ธ์ง ๊ตฌ๋ณํ ์ ์๋ค.\n *\n * ์๋ฅด๋ ค๋ ์๋น์๋ `twinAttentionDigest` ๋ฅผ ์ด๋ค โ ๊ทธ ๋ฌธ์ `attentionTotal` ์ ํจ๊ป ๋ตํ๊ณ ,\n * ์๋ฆฌ๋ณ ์์ **์ ๋์ ๊ทผ๊ฑฐ๋ก** ๊ณ์ฐํ๋ค. ์ด ๋ฌธ์ ์๋ฅด์ง ์๋๋ค.\n */\n ): Promise<any[]> {\n if (spaceId) return (await TwinEngine.attentionsOfSpace(context.state.domain.id, spaceId)).attentions\n if (!instanceId || !TwinEngine.owns(context.state.domain.id, instanceId)) return [] // ํ
๋ํธ ๊ฒฉ๋ฆฌ\n // ๋ผ์ด๋ธ ์ปค๋ ์ค๋
์ท(fresh) ์ฐ์ โ snapshot()=resync() ๋ ์บ์๋ผ ์ปค๋งจ๋ ๋ธํ ์ง์ฐ(recover ์ ๋์ผ ์์ฒ ์ฌ์ฉ).\n const kernel = TwinEngine.kernel(context.state.domain.id, instanceId)\n const snap = kernel?.getSnapshot?.() ?? TwinEngine.snapshot(context.state.domain.id, instanceId)\n return snap?.attentions ?? []\n }\n\n /**\n * ์๋๋ค๋ฉด **๋ช ๊ฑด์ ์๋๋์ง**์ ์๋ฆฌ ์ ์์ฝ๊น์ง โ ๋ชฉ๋ก๋ง ์ฃผ๋ฉด ํ๋ฉด์ด \"N๊ฑด ๋\" ๋ฅผ ๋งํ ์ ์๋ค.\n * ์๋ฆฌ๋ณ ์ต๊ณ ์ฌ๊ฐ๋๋ **์ ๋์ ๊ทผ๊ฑฐ๋ก** ๊ณ์ฐํ๋ค(์์ N ์ผ๋ก ์ค์ด๋ฉด 20์ ๋ฐ ์ ํธ๋ฅผ ๊ฐ์ง ์๋ฆฌ๊ฐ ์์ ์๋๋ค).\n */\n @Query(returns => ScalarObject, {\n description: 'Attention signals for a space (all its lenses) or one twin, with the total count and the per-location highest severity folded from all of them.'\n })\n async twinAttentionDigest(\n @Ctx() context: ResolverContext,\n @Arg('spaceId', { nullable: true }) spaceId?: string,\n @Arg('instanceId', { nullable: true }) instanceId?: string,\n @Arg('limit', type => Int, { nullable: true }) limit?: number\n ): Promise<any> {\n if (spaceId) return TwinEngine.attentionsOfSpace(context.state.domain.id, spaceId, limit ?? undefined)\n if (!instanceId || !TwinEngine.owns(context.state.domain.id, instanceId)) return { attentions: [], attentionTotal: 0, severityByLocation: {} }\n const kernel = TwinEngine.kernel(context.state.domain.id, instanceId)\n const snap = kernel?.getSnapshot?.() ?? TwinEngine.snapshot(context.state.domain.id, instanceId)\n return digestAttentions((snap?.attentions ?? []).map((a: any) => ({ ...a, instanceId })), limit ?? undefined)\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-audit.js","sourceRoot":"","sources":["../../../server/service/twin-audit/command-audit.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAoDH,0CAEC;AAKD,8CAuBC;AAkBD,0CAGC;AApDD,4DAA4D;AAC5D,SAAgB,eAAe,CAAC,CAAU;IACxC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACzE,CAAC;AAED,0CAA0C;AAC1C,MAAM,QAAQ,GAAG,IAAI,CAAA;AAErB,SAAgB,iBAAiB,CAAC,KAAwB;IACxD,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAA;IACjE,OAAO;QACL,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;QAClC,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;QAC/B,MAAM,EAAE,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC;QACxC,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;QAC5B,2CAA2C;QAC3C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,4CAA4C;QAC5C,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;QACvB,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAC7B,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;QAC3B,uDAAuD;QACvD,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ;QACzB,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;QAC9B,4CAA4C;QAC5C,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS;QAC3E,aAAa,EAAE,SAAS;KACzB,CAAA;AACH,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,CAAU,EAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AAE5F,SAAS,QAAQ,CAAC,CAAU;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA,CAAC,wCAAwC;IACtD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,MAA2C;IACzE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;AAC1C,CAAC","sourcesContent":["/*\n * ์ปค๋งจ๋ ๊ฐ์ฌ ๊ธฐ๋ก ๋ง๋ค๊ธฐ (์์) โ **๋๊ฐ ๋ฌด์์ ํ๋ฝํ๊ณ , ๊ทธ๋์ ์ด๋ป๊ฒ ๋๋.**\n *\n * ์น์ธ ๊ฒ์ดํธ๊ฐ ์์ ๋ง๊ณ , ์ด ๊ธฐ๋ก์ด ๋ค๋ฅผ ์ค๋ช
ํ๋ค. ๋ ๋ค ์์ด์ผ \"์ฌ๋ ์์ ๊ฑฐ์ณค๋ค\" ๋ฅผ ์ฆ๋ช
ํ ์ ์๋ค.\n *\n * ๋ฌด์์ ๋ฏฟ๋๊ฐ๊ฐ ์ด ๊ธฐ๋ก์ ์ ๋ถ๋ค:\n * ยท **์ ์ยท์๊ฐ์ ์๋ฒ๊ฐ ์ค๋ค.** ํด๋ผ์ด์ธํธ๊ฐ ๋งํ ์ ์์ ๊ทธ๋๋ก ์ ์ผ๋ฉด ์์กฐ๊ฐ ์์ ๋ก์ ์๋ฌด๊ฒ๋\n * ์ฆ๋ช
ํ์ง ๋ชปํ๋ค. ์ธ์
์ด ์๋ ์ฌ์ฉ์์ ์๋ฒ ์๊ฐ๋ง ์ด๋ค.\n * ยท **์๋๋ ํด๋ผ์ด์ธํธ๊ฐ ์ค๋ค** โ ์ถ์ฒ(origin)ยท๊ทผ๊ฑฐ(reason). ์๋ฒ๊ฐ ์ ์ ์๋ ์ ๋ณด์ด๊ณ ,\n * ์์กฐ๋๋๋ผ๋ ์ ์ ์ฆ๋ช
์ ํผ์ํ์ง ์๋๋ค.\n */\n\nexport type CommandOrigin = 'user' | 'ai' | 'automation' | 'unknown'\n\nexport type CommandAuditInput = {\n /** ํด๋ผ์ด์ธํธ๊ฐ ์ค์ด ๋ณด๋ธ ์ปค๋งจ๋(์ ๋ขฐํ์ง ์๋ ๋ถ๋ถ์ ํฌํจํ ์๋ณธ). */\n command: any\n /** ์ปค๋ ํ์ . */\n ack: { accepted?: boolean; errorCode?: string; error?: string }\n /**\n * **์๋ณธ(์ด๋ํฐ)์ด ์ค ๋ต** โ ํ๋ฝ๊ณผ ์ผ์ด๋จ ์ฌ์ด์ ๋ผ์ด ์๋ ๊ฒ์ ๊ฐ์ ๊ธฐ๋ก์ ๋ซ๋๋ค (ADR-0029 ยง1 ๊ฒฐ์ C).\n *\n * โโ ์ ์ด ์นธ์ด ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ช
๋ น์ด ์๋ณธ์ผ๋ก ๊ฐ๋ฉด ๊ฐ์ฌ๋ ใํ๋ฝํ๋คใ๊น์ง๋ง ์ฆ๋ช
ํ๋ค โ ์ด๋ํฐ๊ฐ ์ค๋ฅ ์์ด ์คํจํ๋ฉด ์์ฅ์๋ ์น์ธ๋ง\n * ๋จ๋๋ค. ๊ทธ๋์ ์ด๋ํฐ์ ๋ต์ **๊ฐ์ ํ**์ ๋์ ๋๋ค.\n *\n * ์
์ ๊ตฌ๋ณํ๋ค:\n * ยท ์์(`undefined`) โ **์๋ณธ์ ๋ฌป์ง ์์๋ค**(์ปค๋์ด ๋ฐ์ ๋ช
๋ น์ด๋ค). ใ๋ชจ๋ฅธ๋คใ์ ๋ค๋ฅด๋ค.\n * ยท `{ answered: false }` โ ๋ฌผ์๋๋ฐ **๋ต์ ๋ชป ๋ฐ์๋ค** โ `unknown` ์ผ๋ก ๋จ๊ธด๋ค. ์ฑ๊ณต์ผ๋ก ์ ์ง ์๋๋ค.\n * ยท `{ answered: true, ok, code? }` โ ์๋ณธ์ด ๋ตํ๋ค(์ ์ฉยท๊ฑฐ์ ๋ชจ๋ ์ฌ์ค์ด๋ค).\n */\n source?: { answered: boolean; ok?: boolean; code?: string }\n /** ์ธ์
์ด ์๋ ์ฌ์ฉ์ โ **์๋ฒ๋ง ์ฑ์ด๋ค.** */\n actor?: { id?: string; email?: string; name?: string }\n /** ์๋ฒ ์๊ฐ. ํธ์ถ๋ถ๊ฐ ์ฃผ์
ํด ํ
์คํธ๊ฐ ์๊ฐ์ ๊ณ ์ ํ ์ ์๊ฒ ํ๋ค. */\n at: Date\n}\n\n/** `TwinAuditEvent` ์ ๊ทธ๋๋ก ๋ฃ์ ์ ์๋ ๋ชจ์(์ํฐํฐ๋ฅผ ๋ชฐ๋ผ๋ ๋๊ฒ ์์ํ๊ฒ ๋๋ค). */\nexport type CommandAuditRow = {\n eventTime: Date\n commandId?: string\n commandType?: string\n origin: CommandOrigin\n reason?: string\n actorId?: string\n actorEmail?: string\n actorName?: string\n accepted: boolean\n errorCode?: string\n /**\n * ์๋ณธ์ด ๊ทธ๋์ ์ด๋ป๊ฒ ํ๋ โ `applied` ยท `refused` ยท `unknown`(๋ฌผ์์ง๋ง ๋ต์ด ์๋ค).\n * **์์ผ๋ฉด ๋ฌป์ง ์์ ๊ฒ์ด๋ค**(์ปค๋์ด ๋ฐ์ ๋ช
๋ น). 0 ์ด๋ ์ฑ๊ณต์ผ๋ก ์ฑ์ฐ์ง ์๋๋ค.\n */\n sourceOutcome?: 'applied' | 'refused' | 'unknown'\n /** ์๋ณธ์ด ์ค ์ฌ์ ์ฝ๋ โ ์์ผ๋ฉด ๊ทธ๋๋ก. ์ฐ๋ฆฌ๊ฐ ์ง์ด๋ด์ง ์๋๋ค. */\n sourceCode?: string\n args?: any\n argsTruncated: boolean\n}\n\n/** ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ ํ๊ธฐ๋ก ์ ๊ทํ โ ๋ชจ๋ฅด๋ ๊ฐ์ ์ง์ด๋ด์ง ์๊ณ 'unknown' ์ผ๋ก ๋๋ค. */\nexport function normalizeOrigin(v: unknown): CommandOrigin {\n return v === 'user' || v === 'ai' || v === 'automation' ? v : 'unknown'\n}\n\n/** args ์ง๋ ฌํ ์ํ(๋ฌธ์). ๋์ผ๋ฉด ์๋ฅด๋ ์๋๋ค๊ณ ํ์ํ๋ค. */\nconst ARGS_MAX = 4000\n\nexport function buildCommandAudit(input: CommandAuditInput): CommandAuditRow {\n const { command, ack, actor, at, source } = input\n const argsText = safeJson(command?.args)\n const truncated = argsText !== null && argsText.length > ARGS_MAX\n return {\n eventTime: at,\n commandId: str(command?.commandId),\n commandType: str(command?.type),\n origin: normalizeOrigin(command?.origin),\n reason: str(command?.reason),\n /* ์๋ณธ์ ๋ต โ ๋ฌป์ง ์์์ผ๋ฉด ์นธ์ ๋ง๋ค์ง ์๋๋ค(๋ชจ๋ฆ๊ณผ ๊ตฌ๋ณํ๋ค). */\n ...(source ? { sourceOutcome: sourceOutcomeOf(source), ...(source.code ? { sourceCode: source.code } : {}) } : {}),\n /* ์ ์ โ ์ธ์
๊ฐ๋ง. ์ปค๋งจ๋์ ์ค๋ ค ์จ ์ ์ ์ฃผ์ฅ์ ์ณ๋ค๋ณด์ง ์๋๋ค. */\n actorId: str(actor?.id),\n actorEmail: str(actor?.email),\n actorName: str(actor?.name),\n /* ๊ฒฐ๊ณผ โ ์น์ธํ๋๋ฐ ์ปค๋์ด ๊ฑฐ์ ํ ๊ฒ๋ ๊ฐ์ฌ ๋์์ด๋ค(๋ฌด์์ ์๋ํ๋์ง๊ฐ ๋จ์์ผ ํ๋ค). */\n accepted: !!ack?.accepted,\n errorCode: str(ack?.errorCode),\n /* ์ธ์๋ ์ํ ๊ทธ๋๋ก. ๋๋ฌด ํฌ๋ฉด ์๋ฆฐ ๋ฌธ์์ด๋ก ๋๋ ์๋๋ค๊ณ ๋งํ๋ค. */\n args: truncated ? argsText!.slice(0, ARGS_MAX) : command?.args ?? undefined,\n argsTruncated: truncated\n }\n}\n\nconst str = (v: unknown): string | undefined => (typeof v === 'string' && v ? v : undefined)\n\nfunction safeJson(v: unknown): string | null {\n try {\n return v === undefined ? null : JSON.stringify(v)\n } catch {\n return null /* ์ํ ์ฐธ์กฐ ๋ฑ โ ๋ชป ์ฌ๋ฉด ์๋ฅด์ง ์๋๋ค(์๋ณธ์ ๊ทธ๋๋ก ๋๋ค) */\n }\n}\n\n/**\n * ์๋ณธ์ ๋ต์ ์ธ ๊ฐ์ผ๋ก โ **๋ต์ด ์์ผ๋ฉด `unknown`**(์ฑ๊ณต์ผ๋ก ์ ์ง ์๋๋ค).\n *\n * ์ด ํจ์๊ฐ ์๋ ์ด์ : ใ๋ฌผ์์ง๋ง ๋ต์ด ์๋คใ๋ฅผ ์คํจ๋ก๋ ์ฑ๊ณต์ผ๋ก๋ ์ ์ ์ ์๋ค. ์คํจ๋ก ์ ์ผ๋ฉด ์ผ์ด๋ ์ผ์\n * ์๋ ์ผ๋ก ๋ง๋ค๊ณ , ์ฑ๊ณต์ผ๋ก ์ ์ผ๋ฉด ์๋ ์ผ์ ์ผ์ด๋ ์ผ๋ก ๋ง๋ ๋ค. ์
์งธ ๊ฐ์ด ์ฌ์ค์ด๋ค.\n */\nexport function sourceOutcomeOf(source: { answered: boolean; ok?: boolean }): 'applied' | 'refused' | 'unknown' {\n if (!source.answered || typeof source.ok !== 'boolean') return 'unknown'\n return source.ok ? 'applied' : 'refused'\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/twin-audit/index.ts"],"names":[],"mappings":";;;AAAA,+DAAsD;AACtD,+DAAsD;AAEzC,QAAA,QAAQ,GAAG,CAAC,oCAAc,CAAC,CAAA;AAC3B,QAAA,SAAS,GAAG,CAAC,oCAAc,CAAC,CAAA","sourcesContent":["import { TwinAuditEvent } from './twin-audit-event.js'\nimport { TwinAuditQuery } from './twin-audit-query.js'\n\nexport const entities = [TwinAuditEvent]\nexport const resolvers = [TwinAuditQuery]\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-audit-event.js","sourceRoot":"","sources":["../../../server/service/twin-audit/twin-audit-event.ts"],"names":[],"mappings":"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","sourcesContent":["import { CreateDateColumn, Entity, Index, Column, RelationId, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'\nimport { ObjectType, Field, ID } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\n\n/*\n * ๊ธด ๊ธ์ ์ปฌ๋ผ ํ์
์ **๋๋ผ์ด๋ฒ๋ง๋ค ์ด๋ฆ์ด ๋ค๋ฅด๋ค** โ ์ด ๋ ํฌ์ ์ ๋ณธ ๊ดํ๋๋ก ์ฌ๊ธฐ์ ๊ณ ๋ฅธ๋ค\n * (board-service ์ `Board.model` ๊ณผ ๊ฐ์ ๋ฐฉ์). `text` ๋ฅผ ๊ทธ๋๋ก ์ ์๋๋ Oracle ์ด ๋ชจ๋ฅด๋ ์ด๋ฆ์ด์๋ค.\n */\nconst DATABASE_TYPE = config.get('ormconfig', {}).type\n\n/*\n * TwinAuditEvent โ **์ฌ๋์ด ๋ฌด์์ ํ๋ฝํ๋๊ฐ.**\n *\n * โโ ์ ์ ๋(TwinEvent)์ด ์๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฒ์์๋ ์ ๋์ ํจ๊ป ๋ฃ์๋ค. \"๊ฐ์ฌ๋ ์์ฅ์์ ํ๋๊น\" ๋ผ๋ ์ด์ ์๋๋ฐ, ๊ทธ๊ฑด **ํ๋ฉด์ ํธ์**์๊ณ \n * ์ ์ฅ ๊ตฌ์กฐ๋ฅผ ์ ํ ๊ทผ๊ฑฐ๊ฐ ๋ชป ๋๋ค. ๋ฃ์๋ง์ ์์ธ๊ฐ ๋ท ์๊ฒผ๋ค โ ๋ฆฌํ๋ ์ด์์ ๋นผ๊ณ , ๋ฐฑํ์์ ๋นผ๊ณ ,\n * ์์ฅ ๊ฑฐ๋ ๋ถ๋ฅ์์ ๋นผ๊ณ , ์์ฅ ๋ ๋์์ ๊ฐ๋๋ค. **์์ธ๊ฐ ๋ท์ด๋ฉด ์ค๊ณ๊ฐ \"์ฌ๊ธฐ ์๋๋ค\" ๋ผ๊ณ ๋งํ๋ ๊ฒ์ด๋ค.**\n *\n * ๊ฐ๋ผ ๋๋ฉด ์์ธ๊ฐ 0 ์ด๊ณ , ์คํ๋ ค ์ป๋๋ค:\n * ยท ํ์์๊ฐ **์ปฌ๋ผ**์ด ๋๋ค โ \"๋๊ฐ ์น์ธํ ๊ฒ ์ ๋ถ\" ๋ ๊ฐ์ฌ์ ๊ธฐ๋ณธ ์ง๋ฌธ์ธ๋ฐ payload ์์์๋ ๋ชป ์ฐพ์๋ค\n * ยท revision ์ด ์๋ค. ์ ๋์์๋ ๊ทธ ์นธ์ ๋น์ \"์ํ๊ฐ ์๋\" ์ ๋ปํ๊ฒ ์ผ๋๋ฐ, ์์์ ์ข
๋ฅ ํ์๋ก\n * ์ฐ๋ ๊ฒ์ด ์ฌ๋ฌ ๋ฒ ๋ฌธ์ ๋ฅผ ๋๋ค(๋ฐฑํ์ `bizStep IS NULL = ์ ํ` ์ ์ ๊ฐ ์ด๊ฒ ๋๋ฌธ์ ๊นจ์ก๋ค)\n * ยท bizStep ์ค์ผ์ด ์๋ค โ ์ ๋์ ํค ์ถ์ถ๊ธฐ๋ ๊ฐ์ด ์์ผ๋ฉด ์ด๋ฒคํธ ํ์
์ผ๋ก ๋์ฒดํ๋ฏ๋ก,\n * ๊ฐ์ฌ ํ์ ํ์ฐ๋ฉด CBV ํ์ค ์ดํ ์ปฌ๋ผ์ `governance.command` ๊ฐ ๋ฐํ๋ค\n *\n * โโ ๋ฌด์์ ๋ฏฟ๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * **์ ์ยท์๊ฐ์ ์๋ฒ๊ฐ ๊ฐ์ธํ๋ค.** ํด๋ผ์ด์ธํธ๊ฐ ๋งํ ์ ์์ ๊ทธ๋๋ก ์ ์ผ๋ฉด ์์กฐ๊ฐ ์์ ๋ก์ ๊ทธ ๊ธฐ๋ก์\n * ์๋ฌด๊ฒ๋ ์ฆ๋ช
ํ์ง ๋ชปํ๋ค. ์ธ์
์ด ์๋ ์ฌ์ฉ์์ ์๋ฒ ์๊ฐ๋ง ์ ๋ขฐํ๋ค.\n * ํด๋ผ์ด์ธํธ์์ ๋ฐ๋ ๊ฒ์ **์๋**๋ฟ์ด๋ค โ ์ด๋์ ์์๋๋(origin), ์ ํ๋(reason).\n */\n@Entity()\n/* ๋ชฉ๋ก ๊ธฐ๋ณธ ์ ๋ ฌ โ ์ต๊ทผ ๊ฒ๋ถํฐ. ๊ฐ์ฌ๋ \"์์ฆ ๋ฌด์จ ์ผ์ด ์์๋\" ๋ก ์์ํ๋ค. */\n@Index('ix_twin_audit_0', (e: TwinAuditEvent) => [e.domain, e.instanceId, e.eventTime], { unique: false })\n/* ํ์์๋ก ์ฐพ๊ธฐ โ ์ ๋์ ์์ ๋๋ ๋ถ๊ฐ๋ฅํ๋ ์ง๋ฌธ(\"๊นํ์ฅ์ด ์น์ธํ ๊ฒ ์ ๋ถ\"). */\n@Index('ix_twin_audit_1', (e: TwinAuditEvent) => [e.domain, e.actorEmail, e.eventTime], { unique: false })\n@ObjectType({ description: 'Audit record of a twin command: who approved what, and what the kernel answered.' })\nexport class TwinAuditEvent {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier of the audit record.' })\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: TwinAuditEvent) => e.domain)\n domainId?: string\n\n @Column()\n @Field({ description: 'Twin runtime instance the command was aimed at.' })\n instanceId: string\n\n /*\n * ์๋ฒ ์๊ฐ. ํด๋ผ์ด์ธํธ ์๊ณ๋ฅผ ๋ฏฟ์ง ์๋๋ค โ ๊ธฐ๋ก์ ์๊ฐ์ถ์ด ๋จ๋ง ์ค์ ์ ์ข์ฐ๋๋ฉด ์ ๋๋ค.\n *\n * **ํ์
์ด๋ฆ์ ์ ์ง ์๋๋ค** (2026-08-19 Postgres ๋ถํ
์คํจ๋ก ๊ณ ์นจ).\n * `datetime` ์ sqliteยทMySQL ์ ์ด๋ฆ์ด๊ณ Postgres ๋ `timestamp` ๋ง ์๋ค โ ๊ฑฐ๊พธ๋ก `timestamp` ๋\n * sqlite ๊ฐ ๋ชจ๋ฅธ๋ค. **๋ค์ฏ ๋๋ผ์ด๋ฒ์ ๋ค ํตํ๋ ์ด๋ฆ์ด ์๋ค.** ๊ทธ๋์ ์ด๋ฆ ๊ณ ๋ฅด๋ ์ผ์ TypeORM ์\n * ๋งก๊ธด๋ค(`emitDecoratorMetadata` ๊ฐ ์ผ์ ธ ์์ด `Date` ์์ ๋๋ผ์ด๋ฒ๋ณ ํ์
์ ๊ณ ๋ฅธ๋ค).\n */\n @Column()\n @Field({ description: 'Server time when the command was dispatched.' })\n eventTime: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Client-supplied command id, for correlating with kernel logs.' })\n commandId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Command type (e.g. order.hold, equipment.repair).' })\n commandType?: string\n\n /* 'user' | 'ai' | 'automation' | 'unknown'. ๋ชจ๋ฅด๋ฉด unknown ์ด์ง ์ฌ๋์ด ํ ๊ฒ์ผ๋ก ์น์ง ์๋๋ค. */\n @Column({ nullable: true })\n @Field({ nullable: true, description: \"Where the command originated: 'user' | 'ai' | 'automation' | 'unknown'.\" })\n origin?: string\n\n /*\n * ์น์ธ ์ฌ์ โ ์ฌ๋์ด ์ฐ๋ ๊ธ์ด๋ผ ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์๋ฅด์ง ์๋๋ค.\n *\n * ์ด๋ฆ์ ๋๋ผ์ด๋ฒ๋ณ๋ก ๊ณ ๋ฅธ๋ค(2026-08-19): `text` ๋ Oracle ์ด ๋ชจ๋ฅด๊ณ (๊ทธ์ชฝ์ `clob`), MySQL ๊ณ์ด์\n * ๊ธด ๊ธ์ `longtext` ๋ฅผ, MSSQL ์ `nvarchar(MAX)` ๋ฅผ ์ด๋ค. ๋ค์ค DB ๋ฅผ ์งํค๋ ์ด ๋ ํฌ์ ๊ดํ์ด ๊ทธ๋ ๋ค.\n */\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'text',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({ nullable: true, description: 'Why this action โ the rationale shown on the approval card.' })\n reason?: string\n\n /* โโ ์ ์: ์ธ์
์์๋ง ์จ๋ค โโ */\n /*\n * **์๋ณธ์ด ๊ทธ๋์ ์ด๋ป๊ฒ ํ๋** โ ํ๋ฝ๊ณผ ์ผ์ด๋จ ์ฌ์ด์ ๋ผ์ด ์๋ ๊ฒ์ ๊ฐ์ ํ์ ๋ซ๋๋ค\n * (ADR-0029 ยง1 ๊ฒฐ์ C, 2026-08-19).\n *\n * ๋ช
๋ น์ด ์๋ณธ์ผ๋ก ๊ฐ๋ฉด ๊ฐ์ฌ๋ ใํ๋ฝํ๋คใ๊น์ง๋ง ์ฆ๋ช
ํ๋ค โ ์ด๋ํฐ๊ฐ ์ค๋ฅ ์์ด ์คํจํ๋ฉด ์์ฅ์๋ ์น์ธ๋ง\n * ๋จ๋๋ค. ๊ทธ๋์ ์ด๋ํฐ์ ๋ต์ ๋์ ๋๋ค.\n *\n * ยท ๋น์ด ์์ โ **์๋ณธ์ ๋ฌป์ง ์์๋ค**(์ปค๋์ด ๋ฐ์ ๋ช
๋ น์ด๋ค). ใ๋ชจ๋ฅธ๋คใ์ ๋ค๋ฅด๋ค.\n * ยท `unknown` โ ๋ฌผ์๋๋ฐ **๋ต์ ๋ชป ๋ฐ์๋ค**. ์ฑ๊ณต์ผ๋ก ์ ์ง ์๋๋ค.\n * ยท `applied` ยท `refused` โ ์๋ณธ์ด ๋ตํ๋ค(๋ ๋ค ์ฌ์ค์ด๋ค).\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: \"What the source did with it: 'applied' | 'refused' | 'unknown' (asked but no answer). Empty means the source was not asked โ the kernel took the command.\" })\n sourceOutcome?: string\n\n /** ์๋ณธ์ด ์ค ์ฌ์ ์ฝ๋ โ ์์ผ๋ฉด ๊ทธ๋๋ก ์ ๋๋ค(์ฐ๋ฆฌ๊ฐ ์ง์ด๋ด์ง ์๋๋ค). */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Reason code the source returned, as it gave it.' })\n sourceCode?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Approving user id, stamped by the server from the session.' })\n actorId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Approving user email, stamped by the server from the session.' })\n actorEmail?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Approving user name, stamped by the server from the session.' })\n actorName?: string\n\n /* โโ ๊ฒฐ๊ณผ: ๊ฑฐ์ ๋ ๋จ๊ธด๋ค โโ */\n @Column({ default: false })\n @Field({ description: 'Whether the kernel accepted the command.' })\n accepted: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Language-neutral rejection code when the kernel refused.' })\n errorCode?: string\n\n /**\n * ๋ช
๋ น ์ธ์ โ **์ํ ๊ทธ๋๋ก.** ๋ฌด์์ ๋ํ ๋ช
๋ น์ด์๋์ง๊ฐ ๊ฐ์ฌ์ ํต์ฌ์ด๋ผ ์์ฝํ์ง ์๋๋ค.\n * ์ง๋์น๊ฒ ํฌ๋ฉด ์๋ฅด๋ `argsTruncated` ๋ก ์๋๋ค๋ ์ฌ์ค์ ๋จ๊ธด๋ค(์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ์ง ์๋๋ค).\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Command arguments as given.' })\n args?: any\n\n @Column({ default: false })\n @Field({ description: 'True when args were too large and stored truncated.' })\n argsTruncated: boolean\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when the audit row was written.' })\n createdAt?: Date\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-audit-query.js","sourceRoot":"","sources":["../../../server/service/twin-audit/twin-audit-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Args, Ctx, Query, Resolver } from 'type-graphql'\n\nimport { ListParam, getQueryBuilderFromListParams, getRepository, ScalarObject } from '@things-factory/shell'\n\nimport { TwinAuditEvent } from './twin-audit-event.js'\n\n/*\n * ์น์ธ ๊ธฐ๋ก ์กฐํ โ **๊ฐ์ฌ์ ๊ธฐ๋ณธ ์ง๋ฌธ์ ๋ตํ๋ค.**\n *\n * \"์์ฆ ๋ฌด์จ ์กฐ์น๊ฐ ๋๊ฐ๋\" โ ์ต๊ทผ์ ๋ชฉ๋ก\n * \"๊นํ์ฅ์ด ์น์ธํ ๊ฒ ์ ๋ถ\" โ ํ์์ ๊ฒ์(์ธ๋ฑ์ค ์์)\n * \"AI ๊ฐ ์ ์ํ ๊ฒ๋ง\" โ origin ํํฐ\n * \"๊ฑฐ์ ๋ ์๋\" โ accepted ํํฐ\n *\n * ์ ๋์ ์์ฌ ์์ ๋๋ ์ด ์ค ์ด๋ ๊ฒ๋ ๋ชป ํ๋ค โ ํ์์๊ฐ payload JSON ์์ด๋ผ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ ์ ์์๋ค.\n */\n/** ์๊ฐ ํํฐ ๊ฐ์ ๋ ์ง๋ก โ ๋ชป ์ฝ๋ ๊ฐ์ ๊ทธ๋๋ก ๋๋ค(์ง์ด๋ด์ง ์๋๋ค). */\nfunction toDateValue(v: any): any {\n const one = (x: any) => {\n if (x instanceof Date) return x\n const t = typeof x === 'string' ? Date.parse(x) : NaN\n return Number.isNaN(t) ? x : new Date(t)\n }\n return Array.isArray(v) ? v.map(one) : one(v)\n}\n\n@Resolver()\nexport class TwinAuditQuery {\n /* ์กฐํ ๊ฒ์ดํธ๋ ๋ฌ์ง ์๋๋ค โ ์ด ์ ์ฅ์์ ๊ท์ฝ์ด๊ณ (mutation-gate ๊ฒ์ฌ๊ฐ ์ ๋ณธ์ ์งํจ๋ค),\n ๋๋ฉ์ธ ํํฐ๊ฐ ํ
๋ํธ ๊ฒฝ๊ณ๋ฅผ ์ด๋ฏธ ์งํจ๋ค. ํ
๋ํธ๋ฅผ ๋์ด ์ฝ๋ ๊ณ๊ธฐํ๋ง OPS_GATE ๋ฅผ ์ด๋ค. */\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'List twin command audit records (who approved what, and what the kernel answered) with the standard list contract, plus the total match count.'\n })\n async twinAuditList(\n /* ํ์ค ๋ชฉ๋ก ๊ณ์ฝ์ `@Args` ๋ก ํผ์ณ ๋ฐ๋๋ค โ `@Arg` ๋ก ๋ฐ์ผ๋ฉด type-graphql ์ด ์
๋ ฅ ํ์
์\n ๊ฒฐ์ ํ์ง ๋ชปํด **์คํค๋ง ์กฐ๋ฆฝ ์์ฒด๊ฐ ์คํจ**ํ๋ค(์๋ฒ๊ฐ ์์ ์ ๋ฌ๋ค). */\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain?.id\n if (!domainId) return { items: [], total: 0 }\n\n const effective: ListParam = {\n ...(params ?? ({} as ListParam)),\n /* ๊ธฐ๋ณธ ์ ๋ ฌ โ ์ต๊ทผ ๊ฒ๋ถํฐ. ๊ฐ์ฌ๋ \"์์ฆ\" ์์ ์์ํ๋ค. */\n sortings: params?.sortings?.length ? params.sortings : [{ name: 'eventTime', desc: true }],\n /* ์๊ฐ ํํฐ๋ ๋ ์ง๋ก ์ฎ๊ฒจ์ ๋๊ธด๋ค โ ๋ฌธ์์ด ๊ทธ๋๋ก๋ฉด ์๋ฆฌ์ง ์๊ณ 0๊ฑด์ด ๋๋ค(์ ๋๊ณผ ๊ฐ์ ์ด์ ). */\n filters: (params?.filters ?? []).map(f => (f.name === 'eventTime' ? { ...f, value: toDateValue(f.value) } : f))\n }\n\n const qb = getQueryBuilderFromListParams({\n repository: getRepository(TwinAuditEvent),\n params: effective,\n domain: context.state.domain,\n alias: 'a',\n /*\n * `searchables` ๋ ์ ๋ถ **์ค์ปฌ๋ผ**์ด๋ค โ ํ๋ ์์ํฌ ์ง์ ๋น๋๋ ์ฌ๊ธฐ ์๋ ์ปฌ๋ผ์ LIKE ๋ฅผ\n * ๊ฒฝ๊ณ ํ ๋ฌด์ํ๋ค(์ธ๋ฑ์ค ์๋ ์ ์ฒด ์ค์บ ๋ฐฉ์ง). ํ์์๋ก ์ฐพ๋ ๊ฒ์ด ์ด ํ
์ด๋ธ์ ๊ตฌ๋ถํ ์ด์ ๋ค.\n */\n searchables: ['actorEmail', 'actorName', 'commandType', 'origin', 'errorCode', 'reason'],\n sortables: ['eventTime', 'commandType', 'actorEmail', 'origin', 'accepted'],\n /* ๊ฐ์ฌ ๋ชฉ๋ก์ ์ฌ๋์ด ์ฝ๋ ์๋๋ก ๋ณธ๋ค โ ํฌ๊ฒ ํผ ์ค๋ ๊ฒ์ด ์ด๋์ด ์๋๋ค. */\n defaultLimit: 50,\n maxLimit: 200\n })\n\n const [items, total] = await qb.getManyAndCount()\n return { items, total }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backfill-period-facts.js","sourceRoot":"","sources":["../../../server/service/twin-backfill/backfill-period-facts.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\n\nimport { TwinEvent } from '../twin-event/twin-event.js'\nimport { TwinEngine } from '../../engine/twin-engine.js'\nimport { ingestCanonicalRecords } from '../../engine/canonical-ingest.js'\nimport { absoluteTime } from '../../engine/read-time.js'\nimport { judgeBackfill, splitAlreadyThere } from './backfill-shape.js'\n\n/*\n * ์ง๋ ๊ธฐ๋ก ์ฑ์ฐ๊ธฐ โ **์ ๋์๋ง ์ด๋ค. ํธ์์ ใ์ง๊ธใ์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.**\n *\n * โโ ์ ๋ผ์ด๋ธ ๋ฌธ์ผ๋ก ๋ฃ์ ์ ์๋ (2026-08-30) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋์ ์ํ๋ ใ์ง๊ธใ์ด๋ค. ๋ฆ๊ฒ ์จ ์ ํ๋ณธ์ ๊ฐ๋๊ฐ ๋ง๋๋ค(๊ทธ๋ ๊ฒ ๋ง๋ค์๋ค). ์ง๋ ๊ธฐ๋ก์ ๋ผ์ด๋ธ\n * ๋ฌธ์ผ๋ก ๋ฃ์ผ๋ฉด ๋ ์ค ํ๋๋ค โ ๊ฐ๋์ ๋งํ๊ฑฐ๋, ํธ์์ ์๊ณ๊ฐ ๊ณผ๊ฑฐ๋ก ๋๋ฆฐ๋ค. ๋ ๋ค ๋์๋ค.\n *\n * ๊ทธ๋์ ์ด ๊ธธ์ ์ ๋์๋ง ์ด๋ค. ์ํ๋ ๊ทธ๋๋ก ๋๊ณ , ์ ๋์ ์ฝ๋ ์ชฝ(์ฑ๊ณผ ๊ณ์ฐยท์ด๋ ฅ ํ๋ฉด)๋ง ๊ทธ ์ฌ์ค์\n * ๋ณด๊ฒ ๋๋ค.\n *\n * โโ ๋ฌด์์ ๋ฐ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * **๋ง๊ฐ๋ ๊ตฌ๊ฐ ์ฌ์ค๋ง** ๋ฐ๋๋ค. ์์ ์ ๊ด์ธก(๊ณ๋ ํ๋ณธยท์ค๋น ์ํยท๋ฐ์ ์ ์ฐ)์ ๋ฐ์ง ์๋๋ค โ ๊ทธ๊ฒ๋ค์\n * ์ปค๋์ ์ํ๋ฅผ ๋ฐ๊พธ๋ ์ฌ์ค์ด๋ผ, ์ํ๋ฅผ ๊ฑด๋๋ฐ๊ณ ์ ๋์๋ง ๋ฃ์ผ๋ฉด ์ํ์ ์ ๋์ด ๊ฐ๋ผ์ง๋ค.\n *\n * โโ ๊ฐ์ ๊ธฐ๊ฐ์ ๋ ๋ฒ ๋ฃ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ง๊ฐ๋ ๊ตฌ๊ฐ ์ฌ์ค์ ์ ์ฒด์ฑ์ด ๋ด์ฉ์ ์๋ค(์ปค๋ 0.7.81: ์ข
๋ฅยท๋์ยท์์ยท๋). ๊ทธ id ๋ก ์ด๋ฏธ ์๋ ๊ฒ์\n * ๊ฐ๋ ค๋ธ๋ค. ์ ์ฅ์์ ์ ์ฝ์ผ๋ก ๋ง์ง ์๋ ์ด์ ๋ ๋๋ผ์ด๋ฒ๊ฐ ๋ค์ฏ์ด๊ณ ์ถฉ๋ ์ฒ๋ฆฌ๊ฐ ์ ๊ฐ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค โ\n * ๊ตฌ๊ฐ ๋จ์๋ก ํ ๋ฒ ์ฝ์ด ๊ฐ๋ ค๋ด๋ ํธ์ด ์ด์์ฑ์ด ์๊ณ ๊ฐ๋ ์ธ๋ค(ํ ์๊ฐ์ ํ ์ค์ด๋ฉด ํ๋ฃจ 24์ค์ด๋ค).\n *\n * โโ ๋ณด์กด๋ณด๋ค ์ค๋๋ ๊ฒ์ ๋ฐ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ๋์ ๋ณด์กด ๊ธฐ๊ฐ์ด ์ง๋๋ฉด ์ง์ด๋ค. ๊ทธ๋ณด๋ค ์ค๋๋ ๊ฒ์ ์ฑ์ฐ๋ฉด ๋ค์ ์ ๋ฆฌ์์ ์ง์์ง๋ค. ์กฐ์ฉํ ๋ฃ๊ณ \n * ์ง์์ง๋ฉด ์๋ฌด๋ ๋ชจ๋ฅด๋ฏ๋ก, **๊ฑฐ์ ํ๊ณ ์ด์ ๋ฅผ ๋งํ๋ค.**\n */\n\nexport interface BackfillResult {\n /** ์ ๋์ ์๋ก ์ ์ ์. */\n written: number\n /** ์ด๋ฏธ ์์ด์ ๊ฑด๋๋ด ์ โ ๋ค์ ์ฝ์ด๋ ์ค๋ณต์ด ์์ด์ง ์๋๋ค๋ ๋ป์ด๋ค. */\n skipped: number\n /** ๋ฐ์ง ์์ ๊ฒ๊ณผ ๊ทธ ์ด์ . ์กฐ์ฉํ ๋ฒ๋ฆฌ์ง ์๋๋ค. */\n refused: { record: unknown; reason: string }[]\n}\n\n/** ์ด ๋๋ฉ์ธ์ ๋ณด์กด ๊ธฐ๊ฐ(์ผ). ์ ์ฑ
์ด ์์ผ๋ฉด `undefined` โ ๊ทธ๋๋ ์ค๋๋จ์ ํ์ ํ์ง ์๋๋ค. */\nasync function retentionDaysOf(domainId: string): Promise<number | undefined> {\n const perDomain = TwinEngine.retentionDaysOf ? await TwinEngine.retentionDaysOf(domainId).catch(() => undefined) : undefined\n const days = perDomain ?? TwinEngine.JOURNAL_RETENTION_DAYS\n return days && days > 0 ? days : undefined\n}\n\n/**\n * ์ง๋ ๊ธฐ๋ก์ ์ ๋์ ์ฑ์ด๋ค.\n *\n * `records` ๋ ๋ผ์ด๋ธ์ **๊ฐ์ ๋ชจ์**์ด๋ค โ ์ปค๋ฅํฐ๊ฐ ๋ค๋ฅธ ์ดํ๋ฅผ ๋ฐฐ์ธ ํ์๊ฐ ์๋ค. ๊ฒ์ฆยท๊ฐ๋ฆผยทid ๋ง๋ค๊ธฐ๋\n * ์ปค๋์ ์ ์
์ด ๊ทธ๋๋ก ํ๋ค(ยง`ingestCanonicalRecords`).\n */\nexport async function backfillPeriodFacts(input: {\n domainId: string\n instanceId: string\n records: unknown[]\n /** ์ด ์๊ฐ์ ใ์ง๊ธใ์ผ๋ก ๋ณธ๋ค โ ๋ณด์กด ํ์ ์ ๊ธฐ์ค. ์ํ์ด ์๊ฐ์ ์ ํ ์ ์๊ฒ ๋ฐ๋๋ค. */\n nowMs?: number\n}): Promise<BackfillResult> {\n const { domainId, instanceId, records } = input\n const nowMs = input.nowMs ?? Date.now()\n const refused: { record: unknown; reason: string }[] = []\n\n if (!Array.isArray(records) || !records.length) return { written: 0, skipped: 0, refused }\n\n /* ๊ฒ์ฆ๊ณผ ๊ฐ๋ฆผ์ ๋ผ์ด๋ธ์ ๊ฐ์ ๊ฒ์ ์ด๋ค โ ๋ ๋ฒ์ด ๋๋ฉด ์ฑ์ด ์ฌ์ค๊ณผ ๊ด์ธกํ ์ฌ์ค์ด ๋ค๋ฅธ ๊ท์น์ ์ง๋๋ค. */\n const { accepted, rejected } = ingestCanonicalRecords(\n records as any,\n domainId,\n new Date(nowMs).toISOString(),\n /* ์ด๋ ํธ์์ ์ฌ์ค์ธ๊ฐ โ ๋ง๊ฐ๋ ๊ตฌ๊ฐ์ ์ด๋ฆ์ด ์ด๊ฒ์ผ๋ก ๊ฐ๋ฆฐ๋ค(์ปค๋ ยง`SubjectBasis`). */\n TwinEngine.factScope(domainId, instanceId)\n )\n for (const r of rejected) refused.push({ record: r.record, reason: (r.errors ?? []).join(' ยท ') })\n\n const days = await retentionDaysOf(domainId)\n\n const judged = judgeBackfill(accepted as any[], { nowMs, retentionDays: days })\n refused.push(...judged.refused)\n const keep = judged.keep\n\n if (!keep.length) {\n TwinEngine.recordIngestResult(\n domainId,\n instanceId,\n records.length,\n refused.map(r => ({ record: r.record, errors: [r.reason] })),\n nowMs,\n 0\n )\n return { written: 0, skipped: 0, refused }\n }\n\n /*\n * ์ด๋ฏธ ์๋ ๊ฒ์ ๊ฐ๋ ค๋ธ๋ค โ ๊ทธ ๊ตฌ๊ฐ์ ๊ทธ ์ข
๋ฅ๋ง ์ฝ๋๋ค(์์ธ์ด ๋ฐ์ณ ์ค๋ค). ํ์ด๋ก๋์ id ๋ก ๊ฒฌ์ฃผ๊ณ ,\n * ์ ์ฅ์ ์ ์ฝ์ ๊ธฐ๋์ง ์๋๋ค(๋๋ผ์ด๋ฒ ๋ค์ฏ).\n */\n const times = keep.map(e => absoluteTime(e.eventTime)!.getTime())\n const fromAt = new Date(Math.min(...times))\n const toAt = new Date(Math.max(...times))\n const types = [...new Set(keep.map(e => String(e.eventType)))]\n\n const existing = await getRepository(TwinEvent)\n .createQueryBuilder('e')\n .select(['e.payload AS \"payload\"'])\n .where('e.domain = :domainId', { domainId })\n .andWhere('e.instanceId = :instanceId', { instanceId })\n .andWhere('e.eventType IN (:...types)', { types })\n .andWhere('e.eventTime BETWEEN :fromAt AND :toAt', { fromAt, toAt })\n .getRawMany<{ payload: unknown }>()\n\n const seen = new Set<string>()\n for (const row of existing) {\n const p: any = typeof row.payload === 'string' ? safeParse(row.payload) : row.payload\n const id = p?.eventId\n if (typeof id === 'string' && id) seen.add(id)\n }\n\n const { fresh, skipped } = splitAlreadyThere(keep, seen)\n if (!fresh.length) {\n TwinEngine.recordIngestResult(\n domainId,\n instanceId,\n records.length,\n refused.map(r => ({ record: r.record, errors: [r.reason] })),\n nowMs,\n skipped\n )\n return { written: 0, skipped, refused }\n }\n\n /*\n * ๋ฆฌ๋น์ ์ **์ด ์์**๋ค(์ผ์ด๋ ์์๊ฐ ์๋๋ค). ์ง๋ ์ฌ์ค์ด ์ง๊ธ ๋ฒํธ๋ฅผ ๋ฐ๋ ๊ฒ์ด ๋ง๋ค โ ์ ๋์\n * ์๊ฐ์ผ๋ก ์ฝ๋ ์ชฝ์ `eventTime` ์ ๋ณด๊ณ , ๋ฆฌ๋น์ ์ ๊ฐ์ ์๊ฐ์ ๊ฐ๋ฆด ๋๋ง ์ด๋ค.\n */\n const start = TwinEngine.journalHead(domainId, instanceId)\n const items = fresh.map((event, i) => ({ event, revision: start + i + 1 }))\n\n await TwinEngine.persistCarried(domainId, instanceId, items)\n TwinEngine.advanceJournalHead(domainId, instanceId, items.length)\n\n /*\n * ์ฅ๋ถ์ ์ ๋๋ค โ **์ ์
์ ๋ถ๋ฅด๋ ๊ณณ์ ๋ชจ๋ ์ ๋๋ค.** ํ ๊ฒฝ๋ก๋ง ๋น ์ง๋ฉด ๊ทธ ํธ์์ ์ ์
๊ฑด๊ฐ์ด\n * ใ๋ชจ๋ฆใ์ผ๋ก ๋ณด์ธ๋ค(ยง`ingest-health-wiring`).\n *\n * ๊ฑด๋ค๋ฐ์ง ๋ชปํ ์(`undelivered`)๋ **๊ฑฐ์ ํ ๊ฒ๊ณผ ์ด๋ฏธ ์์ด์ ๊ฑด๋๋ด ๊ฒ์ ํฉ**์ด๋ค. ๊ฑด๋๋ด ๊ฒ์\n * ๋ฒ๋ ค์ง ๊ฒ์ด ์๋์ง๋ง ์ด๋ฒ์ ์๋ก ์ ํ์ง๋ ์์๋ค โ ใํต๊ณผใ๋ก ์ธ๋ฉด ์ฑ์ด ์์ด ์ค์ ๋ณด๋ค ์ปค ๋ณด์ธ๋ค.\n */\n TwinEngine.recordIngestResult(\n domainId,\n instanceId,\n records.length,\n refused.map(r => ({ record: r.record, errors: [r.reason] })),\n nowMs,\n skipped\n )\n return { written: items.length, skipped, refused }\n}\n\nfunction safeParse(text: string): unknown {\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backfill-shape.js","sourceRoot":"","sources":["../../../server/service/twin-backfill/backfill-shape.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AA2BH,sCAyCC;AAQD,8CAGC;AA7ED,mCAAmC;AACtB,QAAA,YAAY,GAAsB;IAC7C,qBAAqB;IACrB,0BAA0B;IAC1B,yBAAyB;IACzB,qBAAqB;IACrB,aAAa;CACd,CAAA;AASD;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAC3B,SAAyB,EACzB,IAA+C;IAE/C,MAAM,IAAI,GAAU,EAAE,CAAA;IACtB,MAAM,OAAO,GAA0C,EAAE,CAAA;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,GAAG,UAAU,CAAA;IAE7G,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,oBAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,GAAG;gBACX,MAAM,EACJ,GAAG,IAAI,yDAAyD;oBAChE,2BAA2B;aAC9B,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAA;QACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;YACvD,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,GAAG,EAAE,SAAS,gBAAgB,EAAE,CAAC,CAAA;YACtF,SAAQ;QACV,CAAC;QACD,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,GAAG;gBACX,MAAM,EACJ,SAAS,IAAI,CAAC,aAAa,aAAa,GAAG,EAAE,SAAS,wBAAwB;oBAC9E,yBAAyB;aAC5B,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAC1B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,IAAoB,EAAE,WAAgC;IACtF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1G,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;AACvD,CAAC","sourcesContent":["/*\n * ์ง๋ ๊ธฐ๋ก ์ฑ์ฐ๊ธฐ์ **ํ๋จ** โ ์ ์ฅ์๋ฅผ ๋ชจ๋ฅด๋ ์์ ํจ์.\n *\n * ๋ฌด์์ ๋ฐ๊ณ ๋ฌด์์ ๊ฑฐ์ ํ๋์ง๊ฐ ์ด ํ์ผ์ ๋ค ์๋ค. ์ ์ฅ์๋ฅผ ์๋ ์ฝ๋(`backfill-period-facts`)๋\n * ์ด ํ๋จ์ ๋ถ๋ฅด๊ณ ์ฐ๊ธฐ๋ง ํ๋ค. ๊ฐ๋ผ ๋๋ ์ด์ ๋ ์ด ์ ์ฅ์๊ฐ ์ด๋ฏธ ์ฐ๋ ๋ฐฉ์์ด๋ค โ\n * ํ๋จ์ ์ํ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ด ์งํฌ ์ ์์ด์ผ ํ๋ค(ยง`event-type-split-shape`).\n */\n\n/** ์ด ๊ธธ์ด ๋ฐ๋ ์ฌ์ค โ ๋ง๊ฐ๋ ๊ตฌ๊ฐ์ ๋งํ๋ ๊ฒ๋ค. */\nexport const PERIOD_FACTS: readonly string[] = [\n 'energy.usage.period',\n 'energy.generation.period',\n 'energy.generation.price',\n 'energy.tariff.basis',\n 'energy.bill'\n]\n\nexport interface BackfillJudgement {\n /** ์ ๋์ ๋ฃ์ด๋ ๋๋ ๊ฒ. */\n keep: any[]\n /** ๋ฐ์ง ์์ ๊ฒ๊ณผ ๊ทธ ์ด์ โ ์กฐ์ฉํ ๋ฒ๋ฆฌ์ง ์๋๋ค. */\n refused: { record: unknown; reason: string }[]\n}\n\n/**\n * ๋ฌด์์ ์ฑ์ธ ์ ์๋.\n *\n * ์ธ ๊ฐ์ง๋ก ๊ฑฐ์ ํ๋ค.\n *\n * ๋ง๊ฐ๋ ๊ตฌ๊ฐ์ด ์๋๋ค ์ํ๋ฅผ ๋ฐ๊พธ๋ ์ฌ์ค์ ์ ๋์๋ง ๋ฃ์ผ๋ฉด ์ํ์ ์ ๋์ด ๊ฐ๋ผ์ง๋ค\n * ์์ง ์ค์ง ์์ ์๊ฐ ์ง๋ ๊ธฐ๋ก์ด ์๋๋ค\n * ๋ณด์กด๋ณด๋ค ์ค๋๋๋ค ๋ฃ์ด๋ ๋ค์ ์ ๋ฆฌ์์ ์ง์์ง๋ค โ ์กฐ์ฉํ ์ฌ๋ผ์ง๋๋ ๊ฑฐ์ ํ๋ค\n */\nexport function judgeBackfill(\n envelopes: readonly any[],\n opts: { nowMs: number; retentionDays?: number }\n): BackfillJudgement {\n const keep: any[] = []\n const refused: { record: unknown; reason: string }[] = []\n const horizonMs = opts.retentionDays === undefined ? undefined : opts.nowMs - opts.retentionDays * 86_400_000\n\n for (const env of envelopes) {\n const type = String(env?.eventType ?? '')\n if (!PERIOD_FACTS.includes(type)) {\n refused.push({\n record: env,\n reason:\n `${type} ๋ ๋ง๊ฐ๋ ๊ตฌ๊ฐ ์ฌ์ค์ด ์๋๋ค โ ์ด ๊ธธ์ ์ ๋์๋ง ์ฐ๋ฏ๋ก, ์ํ๋ฅผ ๋ฐ๊พธ๋ ์ฌ์ค์ ์ฌ๊ธฐ๋ก ๋ฃ์ผ๋ฉด ` +\n '์ํ์ ์ ๋์ด ๊ฐ๋ผ์ง๋ค. ๋ผ์ด๋ธ ๋ฌธ์ผ๋ก ๋ณด๋ด๋ผ'\n })\n continue\n }\n const atMs = Date.parse(String(env?.eventTime ?? ''))\n if (!Number.isFinite(atMs)) {\n refused.push({ record: env, reason: '์ฌ๊ฑด ์๊ฐ์ ์ฝ์ ์ ์๋ค' })\n continue\n }\n if (atMs > opts.nowMs) {\n refused.push({ record: env, reason: `์์ง ์ค์ง ์์ ์๊ฐ์ด๋ค(${env?.eventTime}) โ ์ง๋ ๊ธฐ๋ก์ด ์๋๋ค` })\n continue\n }\n if (horizonMs !== undefined && atMs < horizonMs) {\n refused.push({\n record: env,\n reason:\n `๋ณด์กด ๊ธฐ๊ฐ(${opts.retentionDays}์ผ)๋ณด๋ค ์ค๋๋๋ค(${env?.eventTime}) โ ๋ฃ์ด๋ ๋ค์ ์ ๋ฆฌ์์ ์ง์์ง๋ค. ` +\n '๋ ๋ค๊น์ง ๋ณด๋ ค๋ฉด ๋ณด์กด ๊ธฐ๊ฐ์ ๋๋ ค์ผ ํ๋ค'\n })\n continue\n }\n keep.push(env)\n }\n\n return { keep, refused }\n}\n\n/**\n * ์ด๋ฏธ ์๋ ๊ฒ์ ๊ฐ๋ ค๋ธ๋ค โ **์ ์ฒด์ฑ์ ๋ด์ฉ์ ์๋ค**(์ปค๋ 0.7.81).\n *\n * ์ ์ฅ์์ ์ ์ฝ์ผ๋ก ๋ง์ง ์๋ ์ด์ ๋ ๋๋ผ์ด๋ฒ๊ฐ ๋ค์ฏ์ด๊ณ ์ถฉ๋ ์ฒ๋ฆฌ๊ฐ ์ ๊ฐ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.\n * ๊ตฌ๊ฐ ๋จ์๋ก ํ ๋ฒ ์ฝ์ด ๊ฐ๋ ค๋ด๋ ํธ์ด ์ด์์ฑ์ด ์๊ณ ๊ฐ๋ ์ธ๋ค.\n */\nexport function splitAlreadyThere(keep: readonly any[], existingIds: ReadonlySet<string>): { fresh: any[]; skipped: number } {\n const fresh = keep.filter(e => typeof e?.eventId === 'string' && e.eventId && !existingIds.has(e.eventId))\n return { fresh, skipped: keep.length - fresh.length }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/twin-backfill/index.ts"],"names":[],"mappings":";;;AAAA,2EAAkE;AAErD,QAAA,SAAS,GAAG,CAAC,gDAAoB,CAAC,CAAA","sourcesContent":["import { TwinBackfillResolver } from './twin-backfill-resolver.js'\n\nexport const resolvers = [TwinBackfillResolver]\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-backfill-resolver.js","sourceRoot":"","sources":["../../../server/service/twin-backfill/twin-backfill-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,iDAAoD;AAEpD,yEAAgE;AAEhE;;;;;;;;;;;;;GAaG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,0DAA0D;IAMpD,AAAN,KAAK,CAAC,uBAAuB,CACR,UAAkB,EACG,OAAkB,EACnD,OAAwB;QAE/B,OAAO,MAAM,IAAA,8CAAmB,EAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;IAC9F,CAAC;CACF,CAAA;AAdY,oDAAoB;AAOzB;IALL,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE;QACjC,WAAW,EACT,ydAAyd;KAC5d,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,YAAY,CAAC,CAAA;IACjB,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IACtC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mEAGP;+BAbU,oBAAoB;IADhC,IAAA,uBAAQ,GAAE;GACE,oBAAoB,CAchC","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { backfillPeriodFacts } from './backfill-period-facts.js'\n\n/*\n * ์ง๋ ๊ธฐ๋ก ์ฑ์ฐ๊ธฐ์ **๋ฌธ** โ ์ปค๋ฅํฐ๊ฐ ํธ์์ด ์๋ ๋์์ ๋ ๋ค์ ๋ค๋ฆ๊ฒ ๋ฃ๋๋ค.\n *\n * โโ ์ ๋ฌธ์ ๋ฐ๋ก ๋๋ (2026-08-30) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ผ์ด๋ธ ์ ์
๊ณผ ํ๋จ์ด ๋ค๋ฅด๋ค. ๋ผ์ด๋ธ๋ ํธ์์ ใ์ง๊ธใ์ ๋ฐ๊พธ๊ณ , ์ด์ชฝ์ ์ ๋์๋ง ์ด๋ค. ๊ฐ์ ๋ฌธ์ผ๋ก\n * ๋ฐ์ผ๋ฉด ์ ํ๋ณธ์ด ๊ฐ๋์ ๋งํ๊ฑฐ๋ ํธ์์ ์๊ณ๊ฐ ๊ณผ๊ฑฐ๋ก ๋๋ฆฐ๋ค(ยง`backfill-period-facts`).\n *\n * ๋ ์ฝ๋์ **๋ชจ์์ ๋ผ์ด๋ธ์ ๊ฐ๋ค** โ ์ปค๋ฅํฐ๊ฐ ๋ค๋ฅธ ์ดํ๋ฅผ ๋ฐฐ์ธ ํ์๊ฐ ์๋ค. ๋ค๋ฅธ ๊ฒ์ ๋ฐ๋ ์ข
๋ฅ๋ฟ์ด๊ณ ,\n * ๊ทธ ํ๋จ์ ์ปค๋์ ์ ์
๊ณผ `judgeBackfill` ์ด ํ๋ค.\n *\n * โโ ์ ์ด ํ์ผ์ด ๋ฆ๊ฒ ์๊ฒผ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฑ์ฐ๊ธฐ ์์ฒด๋ ๋ง๋ค์ด ๋๊ณ **๋ถ๋ฅด๋ ๊ณณ์ ๋ง๋ค์ง ์์** ์ธ ์ ์๋ ์ฑ๋ก ์์๋ค. 8์ 29์ผ ๋ฐ์ ๋์\n * ๋์ด๋ฆฌ๋ ค๋ค ๋๋ฌ๋ฌ๋ค. ๊ฐ์ ๋ถ๋ฅ๋ฅผ ๊ทธ๋ ๋ ๋ฒ ๊ฒช์๋ค(์ปค๋์ ๋ฐ์ ๊ธฐ๊ฐ ๋ฌธ๋ ์์๋ค).\n */\n@Resolver()\nexport class TwinBackfillResolver {\n /* ํธ์์ ๋ชจ๋ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ๊ฒ์ดํธ๋ค(ADR-0027) โ ์ ๋์ ์ฌ์ค์ ์ ๋ ์ผ์ด๋ฏ๋ก ๋ณ๊ฒฝ์ด๋ค. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Backfill closed-period facts into a twin journal without touching its live state. Records use the same shape as live ingest; only closed-period facts are accepted (usage/generation periods, generation price, tariff basis, bill). Point-in-time observations are refused with a reason, as are times beyond journal retention. Re-running is safe: a period already present is skipped, because a closed period is identified by its content. Returns { written, skipped, refused }.'\n })\n async backfillTwinPeriodFacts(\n @Arg('instanceId') instanceId: string,\n @Arg('records', type => [ScalarObject]) records: unknown[],\n @Ctx() context: ResolverContext\n ): Promise<{ written: number; skipped: number; refused: { record: unknown; reason: string }[] }> {\n return await backfillPeriodFacts({ domainId: context.state.domain.id, instanceId, records })\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/twin-control/index.ts"],"names":[],"mappings":";;;AAAA,yEAAgE;AAEnD,QAAA,SAAS,GAAG,CAAC,8CAAmB,CAAC,CAAA","sourcesContent":["import { TwinControlMutation } from './twin-control-mutation.js'\n\nexport const resolvers = [TwinControlMutation]\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-control-mutation.js","sourceRoot":"","sources":["../../../server/service/twin-control/twin-control-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { twinError } from '../../engine/log.js'\nimport { Arg, Ctx, Mutation, Query, Resolver, Directive } from 'type-graphql'\n\nimport { validateScenario } from '@operato/ops-contract'\n\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { TwinAuditEvent } from '../twin-audit/twin-audit-event.js'\nimport { buildCommandAudit } from '../twin-audit/command-audit.js'\n/* ๊ตฌ๋์ ์๋ณธ์ ์ง๋๋ค(ADR-0029 ยง8) โ ํธ์ ๋ฐํ์์ ์ง์ ์ก์ง ์๋๋ค. */\nimport { routeControl, controlCapabilityOf } from '../reference/control-routing.js'\n\n/*\n * ํธ์ CommandยทScenario ์ฑ๋ โ ์ํฅ mutation.\n * Command: runtime.dispatch(ํ์). Scenario: runtime.scenario.load/start/pause/setSpeed(์์ธก ์๊ทน).\n * (State ํํฅ์ twin-state subscription. tick ์ ์์ปค.)\n *\n * ์ธ๊ฐ: data ๊ตฌ๋
๋ฆฌ์กธ๋ฒ์ ๋์นญ์ผ๋ก, ๋์ ์ธ์คํด์ค๊ฐ **ํธ์ถ์ ๋๋ฉ์ธ ์์**์ธ์ง ๊ฒ์ฆํ๋ค(cross-tenant ์ปค๋งจ๋ ์ฃผ์
์ฐจ๋จ).\n * command ์ฑ๋์ sim ์ํ๋ฅผ ๋ณ์ดํ๋ฏ๋ก ๋๋ฉ์ธ ์ค์ฝํ๊ฐ ํ์.\n */\n@Resolver()\nexport class TwinControlMutation {\n /** Command ์ฑ๋ โ ์ค๋ hold/resume/release ๋ฑ. ์ปค๋ dispatch ๋ก ์์, ack{accepted,error} ๋ฐํ. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, { description: 'dispatch a twin command (order.hold/resume/release โฆ). Returns {accepted, error?}.' })\n async dispatchTwinCommand(\n @Arg('instanceId') instanceId: string,\n @Arg('command', type => ScalarObject) command: any,\n @Ctx() context: ResolverContext\n ): Promise<{ accepted: boolean; error?: string; errorCode?: string; errorParams?: Record<string, string | number> }> {\n const domainId = context.state.domain?.id\n if (!domainId) return { accepted: false, error: 'no-domain', errorCode: 'no-domain' }\n /*\n * ๋ผ์ฐํ
์ ์์ง์ด ํ๋ค โ ์์ ์๋ ์ฌ๊ธฐ์ `inst.runtime.dispatch` ๋ฅผ ๊ณง๋ฐ๋ก ๋ถ๋ ๊ณ , `runtime` ์ด\n * ์๋ฎฌ์๋ง ์์ด์ ๋ฏธ๋ฌ ํธ์์์๋ ์ด ํ ์ค์ด TypeError ๋ก ํฐ์ก๋ค(๊น๋ํ ๊ฑฐ์ ์ด ์๋๋ผ ์คํจ).\n * ๊ถ์(๋ชจ๋) ร ์ฑ๊ฒฉ(์ฃผ์/์ก์ถ์์ด์
) ํ์ ์ ํ ๊ณณ์๋ง ๋๋ค.\n */\n /* ์๋ณธ์ ๊ทธ๋๋ก ๊ฐ์ฌ์ ๋๊ธด๋ค โ ๋ฌด์์ด ๋ค์ด์๋์ง๊ฐ ๊ธฐ๋ก์ ๋์์ด๋ค(์ ๊ทํ๋ ๊ฐ์ฌ ๋ชจ๋์ด ํ๋ค). */\n const cmdWithOrigin = command\n const ack = await TwinEngine.dispatchCommand(domainId, instanceId, command)\n /* ๋ผ์ด๋ธ ๊ตฌ์กฐ ๋ณ์ด(resource.add)๋ ์ ์ฅ model ์๋ ๋ฐ์ โ ํ๋ก๋น์ ๋ ํธ์ง๊ธฐยท์ฌ๊ธฐ๋์ด ์ถ๊ฐ๋ถ์ ์์ง ์๊ฒ. */\n if (ack?.accepted && command?.type === 'resource.add') {\n await TwinEngine.syncBoardEquipment(domainId, instanceId).catch(err => twinError('twin syncBoardEquipment fail', err))\n }\n /*\n * ๊ฐ์ฌ ๊ธฐ๋ก โ ์น์ธ ๊ฒ์ดํธ๊ฐ ์์ ๋ง๊ณ , ์ด ์ค์ด ๋ค๋ฅผ ์ค๋ช
ํ๋ค. ๋ ๋ค ์์ด์ผ \"์ฌ๋ ์์ ๊ฑฐ์ณค๋ค\" ๋ฅผ\n * ์ฆ๋ช
ํ ์ ์๋ค. ์ปค๋์ด ๊ฑฐ์ ํ ๊ฒ๋ ๋จ๊ธด๋ค โ ๋ฌด์์ ์๋ํ๋์ง๊ฐ ๊ฐ์ฌ์ ์ ๋ฐ์ด๋ค.\n *\n * ๊ธฐ๋ก์ด ์คํจํด๋ ์ปค๋งจ๋ ๊ฒฐ๊ณผ๋ ๊ทธ๋๋ก ๋๋ ค์ค๋ค. ๊ฐ์ฌ๊ฐ ๋ณธ์
์ ๋ง์ผ๋ฉด ์ ๋์ง๋ง, ์คํจ๋ฅผ ์ผํค์ง๋\n * ์๋๋ค(๋ก๊ทธ์ ๋จ๊ธด๋ค) โ ์๋ฆฌ์ง ์๊ณ ์ ๋จ์ผ๋ฉด ๋์ค์ \"๊ธฐ๋ก์ด ์๋ค\" ์ \"์ผ์ด ์์๋ค\" ๋ฅผ ๊ตฌ๋ถ ๋ชป ํ๋ค.\n */\n try {\n const audit = buildCommandAudit({ command: cmdWithOrigin, ack, actor: context.state.user, at: new Date() })\n const repo = getRepository(TwinAuditEvent)\n await repo.save(repo.create({ domain: context.state.domain, instanceId, ...audit }))\n } catch (err) {\n twinError(`[twin-control] command audit not recorded for \"${instanceId}\"`, err)\n }\n\n /* ๊ฑฐ์ ์ฌ์ ๋ **์ธ์ด ์ค๋ฆฝ ์ฝ๋**๋ก ํจ๊ป ๋๋ ค์ค๋ค โ ํ๋ฉด์ด `twin.cmderr.<code>` ๋ก ์ฌ๋ ๋ง์ ๋ง๋ ๋ค. */\n return { accepted: !!ack?.accepted, error: ack?.error, errorCode: ack?.errorCode, errorParams: ack?.errorParams }\n }\n\n /**\n * ๊ตฌ๋ ์ฑ๋ โ **์๋ณธ์ ์ง๋๋ค**(ADR-0029 ยง8).\n *\n * โโ ๋ฌด์์ด ๋ฐ๋์๋ (2026-08-19) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์์ ์๋ ์ด ๋ฌธ์ด `TwinEngine.runtime(...).scenario` ๋ฅผ **์ง์ ** ์ก์๋ค. ์๋ฎฌ๋ง ํ ์ ์๋ ์ผ(์๊ทนยท๋ฐฐ์ยท\n * ์ ์ง)์ด ๊ณ์ฝ ๋ฐ์ ์ง๋ฆ๊ธธ๋ก ๋ค์ด์จ ์
์ด๊ณ , ์ค ์์คํ
์๋ ๊ทธ ์๋ฆฌ๊ฐ ์์ ์์๋ค. ์ด์ ๊ธธ์ ํ๋๋ค:\n * ํธ์ โ ๊ทธ ํธ์์ ์๋ณธ โ ์ด๋ํฐ๊ฐ **์ ์ธํ** `control` ๋ฅ๋ ฅ. ์ ์ธํ์ง ์์ ์๋ณธ์๋ ๋ฌธ์ด ์ด๋ฆฌ์ง ์๊ณ ,\n * ๊ทธ ์ฌ์ค์ ์ฌ์ ์ฝ๋๋ก ๋งํ๋ค(`not-declared`) โ ์ค WMS ๊ฐ ์ ์ง๋์ง ์๋ ๊ฒ์ ๊ฒฐ์์ด ์๋๋ค.\n *\n * ๋ฐํ์ Boolean ์์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟจ๋ค: ์์ ์๋ ๊ฑฐ์ ์ฌ์ ๋ฅผ ์ค์ ์๋ฆฌ๊ฐ ์์ด **๋ก๊ทธ๋ก๋ง** ๋จ๊ฒผ๋ค.\n * ํ๋ฉด์ ์ ์ ๋๋์ง ์ ์ ์์๋ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Drive the source behind a twin: stimulus | start | pause | speed | reset. The command goes through the source adapter's declared control capability โ a source that does not declare it refuses with code 'not-declared' (a real system is not paused or seeded, and that is a fact rather than a gap). Returns { ok, code?, detail? }.\"\n })\n async controlTwinSource(\n @Arg('instanceId') instanceId: string,\n @Arg('action') action: string,\n @Ctx() context: ResolverContext,\n @Arg('scenario', type => ScalarObject, { nullable: true }) scenario?: any,\n @Arg('speed', { nullable: true }) speed?: number\n ): Promise<any> {\n const domainId = context.state.domain?.id\n if (!domainId) return { ok: false, code: 'no-domain' }\n const allowed = ['stimulus', 'start', 'pause', 'speed', 'reset']\n if (!allowed.includes(action)) return { ok: false, code: 'unsupported-action', detail: `one of ${allowed.join(' | ')}` }\n /*\n * **์๋ชป๋ ์ ์ธ์ ๋ฌธ ์์์ ๋ง๋๋ค.** ์์ ์๋ ๊ฒ์ฆ ์์ด ์ค์๊ณ , ๋ค์ tick ์์ `rate.meanPerHour` ๋ฅผ\n * ์ฝ๋ค ํฐ์ ธ **์๋ฒ ํ๋ก์ธ์ค๊ฐ ๋ด๋ ค๊ฐ๋ค**(ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๊ฐ ํ๋๋ก ์ฑ ์ ์ฒด๊ฐ ์ฃฝ์๋ค). ๊ท์น์ ์ปค๋์ด\n * ๋ค๊ณ ์๋ค(๊ณ์ฝ์ ์ฃผ์ธ) โ ํธ์คํธ๊ฐ ๋ฐ๋ก ๋ง๋ค๋ฉด ๋ฐฉ์ธ์ด ์๊ธด๋ค.\n */\n if (action === 'stimulus') {\n const v = validateScenario(scenario)\n if (v.ok === false) return { ok: false, code: 'invalid', detail: v.errorCode, params: v.errorParams }\n }\n if (action === 'speed' && !(Number(speed) > 0)) return { ok: false, code: 'invalid', detail: 'speed must be greater than 0' }\n\n /*\n * **๊ตฌ๋๋ ์ฌ๋์ด ํ ์ผ์ด๋ค โ ๋จ๊ธด๋ค** (ADR-0029 ยง1 ๊ฒฐ์ C, 2026-08-19).\n *\n * ์ด ๋ฌธ์ ๊ฐ์ฌ๋ฅผ ์์ ๋จ๊ธฐ์ง ์์๋ค. ๊ทธ๋ฐ๋ฐ ์๊ทน์ ๋ฐ๊พธ๊ณ ๋ฐฐ์์ ์ฌ๋ฆฌ๊ณ ์๋ณธ์ ๋ฉ์ถ๋ ๊ฒ์ ๊ทธ ํธ์์\n * ์ฌ์ค์ ๋ฐ๊พธ๋ ํ์๋ค โ ์ปค๋งจ๋ ์ฑ๋์ ๋จ๊ธฐ๋๋ฐ ์ด์ชฝ์ด ๋น์ด ์์ผ๋ฉด, ๋์ค์ ใ๋ฌด์์ด ์ด ๊ณต์ฅ์\n * ํ๋ค์๋ใ์ ๋ตํ ์ ์๋ค.\n *\n * ๊ฒฐ์ C ๊ทธ๋๋ก: ๊ฒ์ดํธ๋ ์ฌ๊ธฐ ๋จ๊ณ (์ `@privilege`), **์๋ณธ์ ๋ต์ ๊ฐ์ ํ์ ๋ซ๋๋ค.** ๋ต์ ๋ชป ๋ฐ์ผ๋ฉด\n * `unknown` ์ด๋ค โ ์ฑ๊ณต์ผ๋ก ์ ์ง ์๋๋ค.\n */\n let result: { ok: boolean; code?: string; detail?: string }\n try {\n result = await routeControl(domainId, instanceId, { action: action as any, scenario, speed: speed != null ? Number(speed) : undefined })\n } catch (e: any) {\n result = { ok: false, code: 'failed', detail: e?.message ?? 'control failed' }\n }\n try {\n const audit = buildCommandAudit({\n /* ์ปค๋งจ๋ ์ฑ๋๊ณผ ๊ฐ์ ๋ชจ์์ผ๋ก ์ ๋๋ค โ ๊ฐ์ฌ๋ฅผ ์ฝ๋ ์ชฝ์ด ๋ ์ดํ๋ฅผ ๋ฐฐ์ฐ์ง ์๊ฒ. */\n command: { type: `source.${action}`, origin: 'user', args: { ...(scenario ? { scenario } : {}), ...(speed != null ? { speed } : {}) } },\n /* ๊ฒ์ดํธ๋ ํต๊ณผํ๋ค(์ฌ๊ธฐ๊น์ง ์๋ค) โ ๊ทธ ์ฌ์ค๊ณผ ์๋ณธ์ ๋ต์ ๋ค๋ฅธ ์นธ์ด๋ค. */\n ack: { accepted: true },\n source: { answered: typeof result?.ok === 'boolean', ok: result?.ok, code: result?.code },\n actor: context.state.user,\n at: new Date()\n })\n const repo = getRepository(TwinAuditEvent)\n await repo.save(repo.create({ domain: context.state.domain, instanceId, ...audit }))\n } catch (err) {\n /* ๊ธฐ๋ก์ด ์คํจํด๋ ๊ฒฐ๊ณผ๋ ๋๋ ค์ค๋ค โ ๋ค๋ง ์ผํค์ง ์๋๋ค(ใ๊ธฐ๋ก ์์ใ๊ณผ ใ์ผ ์์ใ์ ๊ตฌ๋ณํด์ผ ํ๋ค). */\n twinError(`[twin-control] source control audit not recorded for \"${instanceId}\"`, err)\n }\n return result\n }\n\n /** ์ด ํธ์์ ์๋ณธ์ด **๋ฌด์์ ๋ฐ์ ์ ์๋** โ ํ๋ฉด์ด ๋ฒํผ์ ์ด๊ธฐ ์ ์ ๋ฌป๋ ์๋ฆฌ. */\n @Query(returns => ScalarObject, {\n description: \"What the source behind this twin can do: its declared capabilities ('live', 'control'). Empty when the twin has no source or its adapter declares nothing.\"\n })\n async twinSourceCapability(@Arg('instanceId') instanceId: string, @Ctx() context: ResolverContext): Promise<any> {\n const domainId = context.state.domain?.id\n if (!domainId) return { capabilities: [] }\n return controlCapabilityOf(domainId, instanceId)\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/twin-event/index.ts"],"names":[],"mappings":";;;AAAA,mDAA2C;AAE9B,QAAA,QAAQ,GAAG,CAAC,yBAAS,CAAC,CAAA","sourcesContent":["import { TwinEvent } from './twin-event.js'\n\nexport const entities = [TwinEvent]\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"journal-count.js","sourceRoot":"","sources":["../../../server/service/twin-event/journal-count.ts"],"names":[],"mappings":";;;AAmCA,8BAOC;AAOD,sCAGC;AAhCD,iDAAiD;AACpC,QAAA,iBAAiB,GAAG,MAAM,CAAA;AASvC;;;;GAIG;AACI,KAAK,UAAU,SAAS,CAC7B,IAAmB,EACnB,KAAU,EACV,GAAG,GAAG,yBAAiB;IAEvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,CAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAA;IAC7E,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AACjG,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,aAAa,CAA0B,IAAmB,EAAE,KAAU;IAC1F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,CAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;IACvE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;AACxB,CAAC","sourcesContent":["/*\n * ์ ๋์ **์ํ๊น์ง๋ง ์ผ๋ค** โ ์ธ๋ ๊ฒ๋ ์ฝ๋ ๊ฒ์ด๋ค (2026-08-22).\n *\n * โโ ์ (์ค์ธก) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์กฐ๊ฑด์ ๋ง๋ ํ์ ์ ๋ถ ์ธ๋ ์ง์๋ ํ์ ์ค์ด ์ค์ง ์์๋ ๋น์ธ๋ค. ๊ฐ๋ฐ ์ ๋์์ ํธ์ ํ๋๊ฐ 358๋ง\n * ํ์ด์๊ณ ๊ทธ ํ ๋ฒ์ด **5.32์ด**์๋ค. ์์ธ๋ง ์ํ๊น์ง ์ฝ์ผ๋ฉด ๊ฐ์ ์กฐ๊ฑด์์ **0.04์ด**๋ค(130๋ฐฐ).\n *\n * ๊ทธ 5์ด ๋์ ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค๋ฅธ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค โ ์ด๋ ฅ ํ๋ฉด ํ ๋ฒ, ์ค๋น๋ ํ๋ฉด ํ ๋ฒ์ด\n * ์ฌ์ฉ์์๊ฒ๋ ใ๋๋ ๋๋ฐ ์๋ฌด ๋ฐ์์ด ์๋คใ๋ก ๋ํ๋๋ค. ์ค๋น๋ ํ๋ฉด์ ๊ทธ๋ฐ ์ธ๊ธฐ๋ฅผ **๋ท** ํ๋ค.\n *\n * โโ ๊ท์จ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ธ๋ ๋ชฉ์ ์ด ๋ ์ค ํ๋๋ค.\n * โ **ํ์ ** โ ใํ ๊ฑด์ด๋ผ๋ ์๋ใ. ๊ทธ๋๋ ํ๋๋ง ์ฐพ์ผ๋ฉด ๋์ด๋ค(`anyJournalRow`).\n * โก **ํ์** โ ์ฌ๋์๊ฒ ์๋ฅผ ๋ณด์ธ๋ค. ๊ทธ๋๋ ์ํ๊น์ง ์ธ๊ณ , ๋์ผ๋ฉด **๋ชจ๋ฅธ๋ค๊ณ ๋งํ๋ค**(`countUpTo`).\n *\n * ์ํ์ ๋์์ ๋ ์ํ๊ฐ์ ์ ์ฒด๋ก ์ ์ผ๋ฉด ํ๋ฉด์ด ๊ฑฐ์ง์ ๋งํ๋ค. ๊ทธ๋์ `capped` ๋ฅผ ํจ๊ป ๋ธ๋ค โ\n * ์๋ ๊ฒ๊ณผ ๋ชจ๋ฅด๋ ๊ฒ์ ๊ฐ๋ฅด๋ ์ด ํ๋ก์ ํธ์ ๊ท์จ์ด ์ธ๊ธฐ์๋ ๊ฐ์ด ์ ์ฉ๋๋ค.\n */\nimport type { ObjectLiteral, Repository } from 'typeorm'\n\n/** ํ์์ฉ ์ธ๊ธฐ์ ๊ธฐ๋ณธ ์ํ โ ํ๋ฉด์ด ํ ๋ฒ์ ๋ณด์ฌ ์ค ๋ฒ์๋ฅผ ํจ์ฌ ๋๋ ๊ฐ. */\nexport const JOURNAL_COUNT_CAP = 10_000\n\nexport interface CappedCount {\n /** ์ผ ์. `capped` ๋ฉด ์ํ๊น์ง๋ง ์ผ ๊ฐ์ด๋ฏ๋ก **์ ์ฒด๊ฐ ์๋๋ค**. */\n count: number\n /** ์ํ์ ๋์๋ โ ๊ทธ๋ ์ ์ฒด ์๋ ๋ชจ๋ฅด๋ ๊ฒ์ด ์ฌ์ค์ด๋ค. */\n capped: boolean\n}\n\n/**\n * ์ํ๊น์ง๋ง ์ธ๊ธฐ โ ํค ์ปฌ๋ผ๋ง ์ฝ์ผ๋ฏ๋ก ํ ๋ณธ๋ฌธ์ ๋ง๋ค์ง ์๋๋ค.\n *\n * `count()` ๋ฅผ ์ฐ์ง ์๋ ์ด์ : ๊ทธ๊ฒ์ ์ํ์ ๋ฐ์ง ์๋๋ค(์กฐ๊ฑด์ ๋ง๋ ์ ๋ถ๋ฅผ ์ผ๋ค).\n */\nexport async function countUpTo<T extends ObjectLiteral>(\n repo: Repository<T>,\n where: any,\n cap = JOURNAL_COUNT_CAP\n): Promise<CappedCount> {\n const rows = await repo.find({ where, select: ['id'] as any, take: cap + 1 })\n return rows.length > cap ? { count: cap, capped: true } : { count: rows.length, capped: false }\n}\n\n/**\n * ํ ๊ฑด์ด๋ผ๋ ์๋ โ **ํ์ ์๋ ์๊ฐ ํ์ ์๋ค.**\n *\n * ์์ ์๋ ์ ๋ถ ์ผ ๋ค `> 0` ์ ๋ดค๋ค. ๊ทธ ๋ต์ ์ป๋ ๋ฐ 358๋ง ํ์ ์ธ๊ณ ์์๋ค.\n */\nexport async function anyJournalRow<T extends ObjectLiteral>(repo: Repository<T>, where: any): Promise<boolean> {\n const rows = await repo.find({ where, select: ['id'] as any, take: 1 })\n return rows.length > 0\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-event-keys.js","sourceRoot":"","sources":["../../../server/service/twin-event/twin-event-keys.ts"],"names":[],"mappings":"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","sourcesContent":["import { bizStepName } from '@operato/ops-contract'\n\nimport { twinWarn } from '../../engine/log.js'\n/*\n * ์ ๋ ๊ฒ์ ํค ์ถ์ถ โ **์์**. ์ธ์ ์คํธ๊ฐ ๊ธฐ๋กํ ๋ ํ ๋ฒ ๋ฝ์ ์ธ๋ฑ์ค ๊ฐ๋ฅํ ์ค์ปฌ๋ผ์ผ๋ก ์น๊ฒฉํ๋ค.\n *\n * โโ ์ ์น๊ฒฉํ๋๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ์ฉ์๊ฐ ์ ๋์์ ์ค์ ๋ก ์ฐพ๋ ๊ฒ์ \"์ด ํ๋ ํธ์ ์ด๋ ฅ\", \"์ด ์ค๋๊ฐ ์ด๋๊น์ง ๊ฐ๋\", \"์ด ๋ํฌ์์\n * ๋ฌด์จ ์ผ์ด ์์๋\" ๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ๊ฐ๋ค์ ์ ๋ถ `payload`(simple-json = TEXT) **์**์ ์์๋ค.\n * things-factory ๋ 5๊ฐ DB ๋๋ผ์ด๋ฒ๋ฅผ ์ง์ํด์ผ ํด์ DB๋ณ JSON ์ฐ์ฐ์๋ฅผ ์ธ ์ ์๋ค โ\n * ์ฆ ์น๊ฒฉ ์์ด๋ **์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก๋ ์๋ฒ์์ ๊ทธ ์กฐ๊ฑด์ผ๋ก ๊ฑฐ๋ฅผ ์ ์์๋ค**. ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์์จ\n * ๋ช ์ฒ ๊ฑด ์์์๋ง ์ฐพ๋ ์๋์ด ์ต์ ์ด์๊ณ , ์ ๋์ด ์ปค์ง์๋ก ๊ทธ ์๋์ ๊ฑฐ์ง๋ง์ ๊ฐ๊น์์ง๋ค.\n *\n * ๊ทธ๋์ ๊ฒ์ ์ถ์ด ๋๋ ๊ฐ๋ง ๊ณจ๋ผ ์ปฌ๋ผ์ผ๋ก ๊บผ๋ธ๋ค. payload ๋ ๊ทธ๋๋ก ๋๋ค(์ ๋ณธ์ ์ฌ์ ํ payload โ\n * ์ด๊ฑด ํ์ ์์ธ์ด์ง ์๋ก์ด ์ง์ค์ด ์๋๋ค).\n *\n * โโ ์ ์ฌ๊ธฐ(์์ ๋ชจ๋)์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ธฐ๋ก ๊ฒฝ๋ก๊ฐ ๋์ด๋ค(`persistBatch` ๋ผ์ด๋ธ ๋ฒํฌ ยท `persist` ์ฌ ๋จ๊ฑด). ๋ ๊ณณ์ ๊ฐ์ ์ ์ผ๋ฉด\n * ๋ฐ๋์ ์ด๊ธ๋๊ณ , ์ด๊ธ๋ ์์ธ์ \"์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ด๋ฒคํธ\" ๋ฅผ ๋ง๋ ๋ค โ ์ ๋์์ ๊ฐ์ฅ ๋์ ๊ฒฐํจ์ด๋ค.\n */\n\n/** ์น๊ฒฉ๋ ๊ฒ์ ํค โ ์ ๋ถ ์ ํ์ . ๋ฝํ์ง ์์ผ๋ฉด **๋น ๋ฌธ์์ด์ด ์๋๋ผ undefined**(๊ฒฐ์ธกโ ๋น๊ฐ). */\nexport interface TwinEventKeys {\n action?: string\n bizStep?: string\n epc?: string\n orderId?: string\n bizTransaction?: string\n locationId?: string\n moverId?: string\n /** `'actual'`, `'simulated'`, or absent โ absent means not declared, which is not `actual`. */\n provenance?: string\n}\n\n/*\n * ์ปฌ๋ผ ๊ธธ์ด ์ํ. GS1 ์๋ณ์(EPC URNยทGDTIยทSGLN)๋ ๊ท๊ฒฉ์ ์ด๋ณด๋ค ํจ์ฌ ์งง๋ค.\n * ๋์น๋ ๊ฐ์ด ์ค๋ฉด **์๋ฆฌ์ง ์๊ณ ์๋ฅด์ง ์๊ณ ** ๊ฒฝ๊ณ ๋ฅผ ๋จ๊ธด๋ค โ ์์ธ์ด ์๋ณธ๊ณผ ๋ค๋ฅด๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๊ฑฐ์ง์ด ๋๋๋ฐ,\n * ๊ทธ ์ฌ์ค์ด ์ด๋์๋ ์ ๋จ์ผ๋ฉด ์๋ฌด๋ ๋ชจ๋ฅธ๋ค.\n */\nconst MAX_KEY = 255\n\nfunction clip(v: unknown, field: string): string | undefined {\n if (v === undefined || v === null) return undefined\n const s = String(v)\n if (!s) return undefined\n if (s.length <= MAX_KEY) return s\n twinWarn(\n `[twin-event-keys] ${field} exceeds ${MAX_KEY} chars and was clipped for indexing โ ` +\n `search on this value may be incomplete. payload keeps the full value. (${s.slice(0, 60)}โฆ)`\n )\n return s.slice(0, MAX_KEY)\n}\n\n/**\n * bizStep ์ ์งง์ ์ด๋ฆ โ ์๋ฅด๋ ๊ท์น์ ๊ณ์ฝ์ `bizStepName` ํ๋๋ค(CBV URN ๊ณผ ์ฌ์ค ์ด๋ฆ๊ณต๊ฐ URL ๋ ๋ค).\n * ์์ผ๋ฉด ์ด๋ฒคํธ ํ์
์์ ์ ์ถ(`epcis.` ์ ๋ ์ ๊ฑฐ).\n */\nexport function bizStepOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return bizStepName(d.bizStep) || String(envelope?.eventType ?? '').replace('epcis.', '') || undefined\n}\n\n/**\n * ํ๋ชฉ ์๋ณ์ โ **์ ์ฒด ๊ฐ**์ ์ ์ฅํ๋ค(๋๋ง๋๋ง ์ ์ฅํ์ง ์๋๋ค).\n *\n * ํ์์ฉ ์ถ์ฝ์ ํ๋ฉด์ด ํ๊ณ , ์์ธ์ ์๋ณธ์ ๊ฐ๋๋ค. `search` ๋ ๋ถ๋ถ์ผ์น(contains)๋ผ\n * ์ ์ฒด๋ฅผ ์ ์ฅํด ๋๋ฉด ๋๋ง๋(\"402.2\")๋ก๋ URN ์ ์ฒด๋ก๋ ์ฐพํ๋ค. ๋ฐ๋๋ก ๋๋ง๋๋ง ์ ์ฅํ๋ฉด\n * URN ์ผ๋ก ์ฐพ๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ผ์ง๋ค.\n */\nexport function epcOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.epcList?.[0] ?? d.parentID ?? d.quantityList?.[0]?.epcClass ?? undefined\n}\n\n/**\n * ์ค๋ ์๋ณ์ โ ์ด์ ๋ธํ์ `orderId` ์ฐ์ , EPCIS ๋ `bizTransactionList`.\n *\n * โโ ์ค์ธก (2026-08-24) โ ์ด ์ปฌ๋ผ์ด **์ ๋ถ ๋น์ด ์์๋ค** โโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ๊ธฐ๊ฐ ์ฐพ๋ ์ด๋ฆ์ด `d.order` ์๋ค. ๊ทธ๋ฐ๋ฐ ์ปค๋์ด ๋ด๋ ์ด๋ฆ์ **`orderId`** ๋ค\n * (`OrderStatusDelta.orderId` ยท `TaskStatusDelta.orderId`). `d.order` ๋ฅผ ๋ด๋ ์ฝ๋๋ ์ปค๋์ **ํ ๊ณณ๋\n * ์๋ค** โ ์ฃฝ์ ๊ฐ์ง์๋ค. ๊ทธ๋์ ์ด์ ๋ธํ๋ ์ด ์ปฌ๋ผ์ ํ ๋ฒ๋ ์ฑ์ฐ์ง ๋ชปํ๋ค.\n *\n * order.status 29,403,565 ํ โ order_id ๋น์ด ์์ 29,403,565 (100%)\n * task.status 191,175 ํ โ ๋น์ด ์์ 191,175 (100%)\n *\n * ๊ทธ ๊ฒฐ๊ณผ ์์ธ `ix_twin_event_4` ๊ฐ **์๊ธฐ ์ฃผ์์ด ์ ์ด ๋ ์ฉ๋**(ใ์ด ์ค๋๊ฐ ์ด๋๊น์ง ๊ฐ๋ใ)๋ก ์ธ ์\n * ์์๋ค. ํ๋ฉด์ ์ค๋๋ฅผ ๋๋ฌ๋ ใ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ๊ฐ ์์ต๋๋คใ๋ฅผ ๋๊ณ , ๊ทธ ๋ต์ ์ง์ ๊ฒฐ๊ณผ๋ก๋ ์ ์งํ๋ค โ\n * ์์ ์ ์ด๋๋ก ์ฎ๊ฒจ๋ 0 ์ด์๋ค.\n *\n * **๊ณผ๊ฑฐ ํ์ ์ฑ์์ง์ง ์๋๋ค**(์ฌ์ฉ์ ๊ฒฐ์ 2026-08-24, `moverId` ๋์ ๊ฐ์ ๋ฐฉ์). ์์ผ๋ก ๋ค์ด์ค๋\n * ์ฌ๊ฑด๋ถํฐ ์กฐํ๋๋ค.\n *\n * โโ ํ ์นธ์ ๋ ๋ฑ๋ง์ด ๋ค์ด ์์๋ค (2026-09-05 ์ค์ธก) โโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ์ฃผ์์ด ์ด๋ฏธ ์๊ณ ์์๋ค โ ใEPCIS ์ `bizTransactionList` ๋ **๊ฑฐ๋**(PO/SO)์ด๊ณ ์ค๋์ ๊ฐ์\n * ๊ฒ์ด ์๋ ์ ์๋คใ. ๊ทธ๋ฐ๋ฐ ๊ทธ ๋์ **๊ฐ์ ์นธ์** ๋ฃ๊ณ ์์๋ค. ๊ทธ๋์ ์ด๋ ๊ฒ ๋๋ค.\n *\n * order.status order-1 ๋ด๋ถ ์ค๋ id\n * epcis.TransformationEvent urn:epc:id:gdti:9521321.403.1 GS1 ๊ฑฐ๋ ์๋ณ์\n * epcis.TransactionEvent urn:epc:id:gdti:9521321.403.1\n *\n * ํ ์ค๋์ ์ด๋ ฅ์ด **์์ธ ์์์ ๋ ์ชฝ์ผ๋ก ๊ฐ๋ผ์ง๋ค.** ์ด๋ ์ด๋ฆ์ผ๋ก ๋ฌผ์ด๋ ์ ๋ฐ๋ง ๋์ค๊ณ ,\n * ์ค๋ฅ๋ ๋์ง ์๋๋ค. ์ค์ธก: ์ดํ๊ฐ ์์ธ ํ 10,004๊ฐ.\n *\n * ์ด๊ฒ์ด ์ค์ ๋ก ๋ง์ ๊ฒ โ ใ์ด ๊ฐ์ฒด๋ฅผ ์ด๋ ๋ ์ํผ๋ก ๋ง๋ค์๋ใ๋ค. ๋ต์ ๊ธฐ๋ก๋์ด ์๋ค(์ค๋ ์ฌ๊ฑด์ด\n * `recipeKey` ๋ฅผ ๋ ๋ค, ์ค์ธก 328,021/328,021 = 100%). ๋ณํ ์ฌ๊ฑด์ ๊ทธ ์ค๋๋ฅผ GDTI ๋ก ๊ฐ๋ฆฌํค๋๋ฐ\n * ์ค๋ ์ฌ๊ฑด์ `order-1` ๋ก ์ ํ ์์ด **์์ธ์ผ๋ก ์ด์ ์๊ฐ ์์๋ค.**\n *\n * ๊ทธ๋์ ์นธ์ ๊ฐ๋๋ค(์ฌ์ฉ์ ๊ฒฐ์ 2026-09-05).\n *\n * orderId ๋ด๋ถ ์ค๋ id โ ์ฝ๊ธฐ ๋ชจ๋ธ์ ์ด์์ \n * bizTransaction GS1 ๊ฑฐ๋ ์๋ณ์ โ ํ์ค์ด ๋งํ๋ ๊ทธ ๊ฑฐ๋\n *\n * ์ค๋ ์ฌ๊ฑด์ **๋ ๋ค** ๋ ๋ค(`order.status` ์ payload ์ `orderId` ์ `bizTransaction` ์ด ํจ๊ป\n * ์๋ค). ๊ทธ๋์ EPCIS ์ฌ๊ฑด์ ๊ฑฐ๋ ์๋ณ์๋ก ์ค๋๋ฅผ ์ฐพ์ ์ ์๋ค โ ์ด ๋ ์นธ์ด ๊ทธ ๋ค๋ฆฌ๋ค.\n */\nexport function orderOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.orderId ?? undefined\n}\n\n/**\n * **๊ทธ ์ฌ๊ฑด์ด ๊ฐ๋ฆฌํค๋ ๊ฑฐ๋** โ EPCIS `bizTransactionList` ์ ์ฒซ ํญ๋ชฉ, ๋๋ ์ด์ ๋ธํ๊ฐ ์ง์ ๋ ๊ฐ.\n *\n * ์ค๋๊ฐ ์๋๋ค. ํ์ค์ด ๋งํ๋ ๊ฑฐ๋(PO/SO/์์ฐ์ค๋)์ด๊ณ , ํ ์ค๋๊ฐ ์ฌ๋ฌ ๊ฑฐ๋์ ๊ฑธ๋ฆด ์๋ ์๋ค.\n * ๊ทธ ๊ตฌ๋ณ์ ์งํค๋ ค๊ณ `orderId` ์ ๊ฐ๋ผ ๋์๋ค โ ํฉ์น๋ฉด ์ ์ฃผ์์ ๊ทธ ์ผ์ด ๋ค์ ๋๋ค.\n */\nexport function bizTransactionOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.bizTransactionList?.[0]?.bizTransaction ?? d.bizTransaction ?? undefined\n}\n\n/**\n * ์์น โ EPCIS ๋ ์ฝ์ ์ง์ (readPoint) ์ฐ์ , ์์ผ๋ฉด ์
๋ฌด ์์น(bizLocation).\n * ์ด์ ๋ธํ(๋ฌด๋ฒ ์ด๋ ๋ฑ)๋ ๊ทธ ๋์ด ์๊ณ ํ๋ฒํ `location` ์ ์ด๋ค โ ๋น ๋จ๋ฆฌ๋ฉด ์ค๋น๊ฐ ์ด๋์\n * ๋ฌด์์ ํ๋์ง๊ฐ ์์น ์ถ์์ ํต์งธ๋ก ์ฌ๋ผ์ง๋ค.\n */\nexport function locationOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n return d.readPoint?.id ?? d.bizLocation?.id ?? d.location ?? undefined\n}\n\n/**\n * ์ค๋นยท๋ฌด๋ฒ โ ์ด์ ๋ธํ(equipment.statusยทtask.status)๊ฐ ๋์์ ๊ฐ๋ฆฌํค๋ ์ถ.\n *\n * EPCIS ์ดํ๊ฐ ์๋๋ผ์ ๋ค๋ฅธ ์ถ ์ด๋์๋ ์ ์กํ๋ค. ์ด๊ฒ ์์ผ๋ฉด \"์ด ์ง๊ฒ์ฐจ๊ฐ ์ค๋ ๋ฌด์์ ํ๋\" ๋ฅผ\n * ์๋ฒ์์ ๋ฌผ์ ๋ฐฉ๋ฒ์ด ์์ด, ํ๋ฉด์ด ์ ๋์ ํต์งธ๋ก ๋ฐ์ ์ ์ ์กฐํํ๋ ์๋ฐ์ ์๋ค.\n */\nexport function equipmentIdOf(envelope: any): string | undefined {\n const d = envelope?.data ?? envelope ?? {}\n /*\n * โโ ์ค์ธก (2026-08-24) โ ๋ ๊ฐ๋๋ฅผ ๋์น๊ณ ์์๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ์ฃผ์์ด `task.status` ๋ฅผ ์ถ์ฒ๋ก **์ ์ด ๋์๋๋ฐ** ์ด ํจ์๋ `d.moverId` ๋ง ๋ดค๋ค. ์์
์ด ์์์\n * ๊ฐ๋ฆฌํค๋ ์ด๋ฆ์ `resourceRef` ๋ค(`TaskStatusDelta.resourceRef`) โ ๊ทธ๋์ ์์
191,175 ํ ์ ๋ถ\n * ์ด ์ปฌ๋ผ์ด ๋น์๊ณ , ใ์ด ์ง๊ฒ์ฐจ๊ฐ ์ค๋ ๋ฌด์์ ํ๋ใ์์ **์์
์ด ํต์งธ๋ก ๋น ์ก๋ค.**\n *\n * ๊ทธ๋ฆฌ๊ณ ์๋์ง ์ฌ๊ฑด์ `equipmentId` ๋ฅผ ์ด๋ค(์ดํ๊ฐ `movers`โ`equipment` ๋ก ๊ฐ๋ช
๋ ๋ค์ ์๊ธด\n * ์ฑ๋์ด๋ค). ์ค์ธก `energy.equipment` 31,079 ํ ์ ๋ถ ๋น์ด ์์๋ค โ ใ์ด ์ค๋น๊ฐ ์ผ๋ง๋ฅผ ๋จน์๋ใ๋ฅผ\n * ์ค๋น ์ถ์ผ๋ก ๋ฌผ์ ์ ์์๋ค.\n *\n * ์
์ ํจ๊ป ๋ณธ๋ค. ๊ฐ๋ช
์ธ๋๊ฐ ์์ฌ ์๋ ๊ฒ์ ์ ๋์ ์ฑ์ง์ด๊ณ , ์ฝ๋ ์ชฝ์ด ๊ทธ๊ฒ์ ํก์ํ๋ค.\n */\n return d.moverId ?? d.resourceRef ?? d.equipmentId ?? undefined\n}\n\n/**\n * EPCIS ํ์ โ `ADD`ยท`OBSERVE`ยท`DELETE`. ์ธ ๊ฐ์ด ์๋๋ฉด `undefined`(์์ฒ์ ์ก๊ฐ์ ์์ธ์ ๋ฃ์ง ์๋๋ค).\n *\n * ์ด ํค๋ ๊ฒ์ ์ถ์ด ์๋๋ผ **ํ๋ณ์**์ด๋ค: ๋ํ์ด ์ฝ๋ ์ค๋
์ท์ ์๋ฆฌ์ ์ผ๋ก `DELETE` ๋ฅผ ๋ชป ๋ธ๋ค.\n * ๊ทธ๋์ ใ์ด ํธ์์ด ๋ฐ์ถ์ ํ ๋ฒ์ด๋ผ๋ ๊ณ์ฐํ๋๊ฐใ๊ฐ ์ง์ง delta ํผ๋์ ์ฆ๊ฑฐ์ธ๋ฐ, payload ์์ ์๋\n * ๋์์๋ 5๊ฐ ๋๋ผ์ด๋ฒ ์ด๋์์๋ ๊ทธ ์ง๋ฌธ์ ํ ์ ์์๋ค. ์ด์ ๋ธํ์๋ ํ์๊ฐ ์๋ค โ ๋น์ด๋ค.\n */\nexport function actionOf(envelope: any): string | undefined {\n const a = (envelope?.data ?? envelope ?? {}).action\n return a === 'ADD' || a === 'OBSERVE' || a === 'DELETE' ? a : undefined\n}\n\n/**\n * **Whether the sender declared this fact as having actually happened** โ the envelope's\n * `provenance`, promoted to a column.\n *\n * โโ Why it is an indexed column (2026-09-09) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * The journal held 1,134 rows, all of them generator output, and there was nowhere to ask about\n * it. While the declaration sits inside `payload`, none of the five drivers can answer \"count\n * these without the invented ones\" โ the same reason `action` was promoted.\n *\n * โโ Only the two declared values are taken โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * Anything that is not `actual` or `simulated` becomes `undefined`. A source's stray value does\n * not reach the index (the discipline in `actionOf`).\n *\n * **`undefined` means \"not declared\", not \"it happened\".** A reader has to distinguish three\n * states โ declared simulated, declared actual, not declared. Folding the last two together\n * means a generator that omits the field has its output counted as production.\n */\nexport function provenanceOf(envelope: any): string | undefined {\n /*\n * Read from the envelope only. `data` is where the source system writes, and a source that\n * could declare its own facts actual would make this no longer the connecting side's statement.\n */\n const p = envelope?.provenance\n return p === 'actual' || p === 'simulated' ? p : undefined\n}\n\n/** Every promoted key for one event โ the write path calls this function and nothing else. */\nexport function twinEventKeys(envelope: any): TwinEventKeys {\n return {\n action: actionOf(envelope),\n bizStep: clip(bizStepOf(envelope), 'bizStep'),\n epc: clip(epcOf(envelope), 'epc'),\n orderId: clip(orderOf(envelope), 'orderId'),\n bizTransaction: clip(bizTransactionOf(envelope), 'bizTransaction'),\n locationId: clip(locationOf(envelope), 'locationId'),\n moverId: clip(equipmentIdOf(envelope), 'moverId'),\n provenance: provenanceOf(envelope)\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"twin-event-type.js","sourceRoot":"","sources":["../../../server/service/twin-event/twin-event-type.ts"],"names":[],"mappings":";;;;AAAA,+CAAqD;AAErD,mDAA2C;AAE3C;;;;;;GAMG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;CAuDzB,CAAA;AAvDY,sCAAa;AAExB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,yBAAS,CAAC,EAAE,EAAE,WAAW,EAAE,6FAA6F,EAAE,CAAC;;4CACzH;AAclB;IALC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE;QAClB,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,iTAAiT;KACpT,CAAC;;4CACY;AAOd;IALC,IAAA,oBAAK,EAAC;QACL,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,mMAAmM;KACtM,CAAC;;6CACc;AAMhB;IAJC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE;QAClB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,6HAA6H;KAC3I,CAAC;;+CACe;AAQjB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kQAAkQ,EAAE,CAAC;;iDACxR;AAiBnB;IALC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE;QAClB,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,yUAAyU;KAC5U,CAAC;;qDACqB;wBAtDZ,aAAa;IADzB,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,mFAAmF,EAAE,CAAC;GACpG,aAAa,CAuDzB","sourcesContent":["import { Field, Int, ObjectType } from 'type-graphql'\n\nimport { TwinEvent } from './twin-event.js'\n\n/*\n * ์ ๋ ๋ชฉ๋ก ๋ฐํํ โ things-factory ํ์ค `{ items, total }`(AttributeSetListยทDomainList ๋ฑ๊ณผ ๋ํ).\n *\n * `total` ์ด ์ด ํ์
์ ์กด์ฌ ์ด์ ๋ค. ๊ธฐ์กด `twinEvents` ๋ ๋ฐฐ์ด๋ง ๋๋ ค์ค์ **ํ๋ฉด์ด ์๊ธฐ๊ฐ ์ ์ฒด๋ฅผ ๋ฐ์\n * ๊ฑด์ง ์๋ฆฐ ๊ฑด์ง ์ ๋ฐฉ๋ฒ์ด ์์๋ค** โ ๊ทธ๋์ ๋ฆฌ์คํธ๊ฐ ์๋ฆฌ์ง ์๊ณ ์๋ฆฐ ์ฑ๋ก \"์ด๊ฒ ์ ๋ถ\" ์ฒ๋ผ ๋ณด์๋ค.\n * ์ด๊ฑด์๋ฅผ ํจ๊ป ์ฃผ๋ฉด ํ๋ฉด์ \"48 / 12,904\" ๋ผ๊ณ ์ ์งํ๊ฒ ๋งํ ์ ์๊ณ , ์ฌ์ฉ์๋ ์ขํ์ผ ํ๋ค๋ ๊ฑธ ์๋ค.\n */\n@ObjectType({ description: 'A page of twin journal events together with the total number of matching records.' })\nexport class TwinEventList {\n @Field(type => [TwinEvent], { description: 'The events on this page, ordered by the requested sorting (revision descending by default).' })\n items: TwinEvent[]\n\n /*\n * ์ ์ฒด ์ โ **์ํ์ ๋์ผ๋ฉด ๋น์ด๋ค.**\n *\n * ์ธ๋ ๋ฐ๋ ๊ฐ์ด ๋ ๋ค(2026-08-22 ์ค์ธก: ์ ๋ 358๋ง ํ์ธ ํธ์์์ ์ ๋ ์ธ๊ธฐ 5.32์ด ยท ์ํ 1๋ง๊น์ง\n * 0.04์ด). ๊ทธ๋์ ์ํ๊น์ง๋ง ์ธ๊ณ , ๋์ผ๋ฉด ใ๋ชจ๋ฅธ๋คใ๋ก ๋๋ค. ๊ทธ๋ ์ํ๊ฐ์ ์ ์ฒด๋ก ์ ์ผ๋ฉด ํ๋ฉด์ด\n * ๊ฑฐ์ง์ ๋งํ๋ค โ ์๋ ๊ฒ๊ณผ ๋ชจ๋ฅด๋ ๊ฒ์ ๊ฐ๋ฅด๋ ๊ฒ์ด ์ด ํ๋์ ๊ท์จ์ด๋ค.\n */\n @Field(type => Int, {\n nullable: true,\n description:\n 'Total number of events matching the filters, ignoring pagination. Lets the caller show an honest \"shown of total\" count instead of silently truncating. NULL when the server stopped counting at countCap: the exact total is then unknown, and capped says so โ do not render the cap as if it were the total.'\n })\n total?: number\n\n @Field({\n nullable: true,\n description:\n 'True when there are more matching events than countCap, so total could not be established. The caller should say \"first N shown\" and offer narrowing rather than implying it received everything.'\n })\n capped?: boolean\n\n @Field(type => Int, {\n nullable: true,\n description: 'The counting limit the server applied. Reported so the screen can say how far the count is trustworthy instead of guessing.'\n })\n countCap?: number\n\n /*\n * ๋ค์ ํ์ด์ง ์ปค์. ์ ๋์ **๋จธ๋ฆฌ์ ๊ณ์ ์์ด๋ ๋ชฉ๋ก**์ด๋ผ offset ์ผ๋ก ๋ค๋ฅผ ์ฝ์ผ๋ฉด\n * ์ฝ๋ ์ฌ์ด ๋ค์ด์จ ์ด๋ฒคํธ๋งํผ ๋ฐ๋ ค ๋ณธ ํ์ด ๋ ๋์ค๊ฑฐ๋ ๋ชป ๋ณธ ํ์ด ์ฌ๋ผ์ง๋ค.\n * ์ด ๊ฐ์ ๊ทธ๋๋ก ๋ค์ ์์ฒญ์ `pagination.after` ๋ก ๋๋ ค์ฃผ๋ฉด ๊ทธ ๋ฌธ์ ๊ฐ ์๋ค.\n */\n @Field({ nullable: true, description: 'Opaque cursor for the next page. Pass it back as pagination.after to continue exactly where this page ended, without the duplicate or skipped rows that offset paging produces on a journal that keeps growing at the head. Null when this page is the last one.' })\n nextCursor?: string\n\n /*\n * **์๋ถ๋ถ์ด ์ง์์ก๋ค** โ ๋ณด๊ด ๊ธฐ๊ฐ ์ ๋ฆฌ๊ฐ ์ด ํธ์์ ์ค๋๋ ์ฌ๊ฑด์ ์ง์ด ๊ฒฝ์ฐ (2026-08-27).\n *\n * ์ ๋ฆฌ๋ ์ ์ธ๋ ๋ณด๊ด ๊ธฐ๊ฐ(๊ธฐ๋ณธ 7์ผ)๋ณด๋ค ์ค๋๋ ์ฌ๊ฑด์ ์ง์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ด ๋ชฉ๋ก์ ์ฒซ ํ์ด์ง ๋ค๋ก ๋\n * ๋ด๋ ค๊ฐ๋ ์ด๋ ์ง์ ์์ ๊ธฐ๋ก์ด ๋๋๋ค. ํ๋ฉด์ด ๊ทธ๊ฒ์ ๋งํ์ง ์์ผ๋ฉด ์ฌ๋์ ใ์ด ํธ์์ ๊ทธ๋๋ถํฐ\n * ์์ํ๋คใ๋ก ์ฝ๋๋ค. ์์๋ ๊ฒ๊ณผ ์ง์์ง ๊ฒ์ ๋ค๋ฅธ ์ฌ์ค์ด๋ค.\n *\n * ๊ฐ์ ์ ์ฅํ์ง ์๊ณ ์กฐํํ ๋ ๊ตฌํ๋ค(๋จ์ ์๋ ๊ฐ์ฅ ์์ ๋ฆฌ๋น์ ). ์ ์ฅํ๋ฉด ์ค์ ๋ฐ์ดํฐ์ ์ด๊ธ๋ ์\n * ์๊ณ , ์ด๊ธ๋๋ฉด ์ด๋ ์ชฝ์ด ์ฌ์ค์ธ์ง ์ ์ ์๋ค.\n */\n @Field(type => Int, {\n nullable: true,\n description:\n 'The oldest revision still stored for this twin. When it is greater than 1, older events were deleted by the journal retention policy: the screen must say the record starts here rather than implying the twin began at this point. NULL when the caller asked for more than one twin (the axis is per twin) or when nothing is stored.'\n })\n oldestRevision?: number\n}\n"]}
|