@things-factory/headless-twin 10.0.14 â 10.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/attention-digest.d.ts +4 -4
- package/dist-server/engine/attention-digest.js +7 -7
- package/dist-server/engine/attention-digest.js.map +1 -1
- package/dist-server/engine/canonical-ingest.d.ts +11 -2
- package/dist-server/engine/canonical-ingest.js +137 -8
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/command-routing.js +1 -1
- package/dist-server/engine/command-routing.js.map +1 -1
- package/dist-server/engine/declared-stimulus.js +1 -1
- package/dist-server/engine/declared-stimulus.js.map +1 -1
- package/dist-server/engine/energy-topology.js +1 -1
- package/dist-server/engine/energy-topology.js.map +1 -1
- package/dist-server/engine/ingest-dedupe.d.ts +38 -0
- package/dist-server/engine/ingest-dedupe.js +145 -0
- package/dist-server/engine/ingest-dedupe.js.map +1 -0
- package/dist-server/engine/ingest-health.d.ts +124 -9
- package/dist-server/engine/ingest-health.js +169 -15
- package/dist-server/engine/ingest-health.js.map +1 -1
- package/dist-server/engine/integration-probes.d.ts +3 -3
- package/dist-server/engine/integration-probes.js +6 -6
- package/dist-server/engine/integration-probes.js.map +1 -1
- package/dist-server/engine/kpi-baseline.js +4 -4
- package/dist-server/engine/kpi-baseline.js.map +1 -1
- package/dist-server/engine/kpi-fold.d.ts +122 -12
- package/dist-server/engine/kpi-fold.js +247 -18
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.d.ts +11 -11
- package/dist-server/engine/kpi-query.js +185 -28
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/live-feed-registry.d.ts +1 -1
- package/dist-server/engine/live-feed-registry.js +1 -1
- package/dist-server/engine/live-feed-registry.js.map +1 -1
- package/dist-server/engine/load-meter.d.ts +1 -1
- package/dist-server/engine/load-meter.js.map +1 -1
- package/dist-server/engine/local-declarations.d.ts +7 -7
- package/dist-server/engine/local-declarations.js +9 -9
- package/dist-server/engine/local-declarations.js.map +1 -1
- package/dist-server/engine/log.d.ts +1 -1
- package/dist-server/engine/log.js +1 -1
- package/dist-server/engine/log.js.map +1 -1
- package/dist-server/engine/measured-estimator.js +1 -1
- package/dist-server/engine/measured-estimator.js.map +1 -1
- package/dist-server/engine/measured-yield.js +1 -1
- package/dist-server/engine/measured-yield.js.map +1 -1
- package/dist-server/engine/model-basis.d.ts +1 -1
- package/dist-server/engine/model-basis.js +1 -1
- package/dist-server/engine/model-basis.js.map +1 -1
- package/dist-server/engine/model-gap.d.ts +3 -3
- package/dist-server/engine/model-gap.js +1 -1
- package/dist-server/engine/model-gap.js.map +1 -1
- package/dist-server/engine/model-vocabulary.js +1 -1
- package/dist-server/engine/model-vocabulary.js.map +1 -1
- package/dist-server/engine/oee-accumulator.d.ts +4 -4
- package/dist-server/engine/oee-accumulator.js +3 -3
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/property-effects.js +2 -2
- package/dist-server/engine/property-effects.js.map +1 -1
- package/dist-server/engine/read-time.d.ts +22 -0
- package/dist-server/engine/read-time.js +81 -0
- package/dist-server/engine/read-time.js.map +1 -0
- package/dist-server/engine/restart-policy.js +1 -1
- package/dist-server/engine/restart-policy.js.map +1 -1
- package/dist-server/engine/runtime-key.js +1 -1
- package/dist-server/engine/runtime-key.js.map +1 -1
- package/dist-server/engine/spec-coverage.d.ts +2 -2
- package/dist-server/engine/spec-coverage.js +1 -1
- package/dist-server/engine/spec-coverage.js.map +1 -1
- package/dist-server/engine/stage-path.d.ts +4 -4
- package/dist-server/engine/stage-path.js +1 -1
- package/dist-server/engine/stage-path.js.map +1 -1
- package/dist-server/engine/state-axes.d.ts +1 -1
- package/dist-server/engine/state-axes.js +2 -2
- package/dist-server/engine/state-axes.js.map +1 -1
- package/dist-server/engine/travel-estimator.d.ts +2 -2
- package/dist-server/engine/travel-estimator.js +1 -1
- package/dist-server/engine/travel-estimator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +243 -53
- package/dist-server/engine/twin-engine.js +690 -191
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/engine/warm-start.d.ts +2 -2
- package/dist-server/engine/warm-start.js +5 -5
- package/dist-server/engine/warm-start.js.map +1 -1
- package/dist-server/index.js +1 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -1
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js +3 -3
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +1 -1
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js +2 -2
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +1 -1
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.d.ts +5 -0
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js +54 -0
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js.map +1 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.d.ts +5 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js +44 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js.map +1 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.d.ts +6 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js +84 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js.map +1 -0
- package/dist-server/migrations/index.js +7 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/routes.d.ts +1 -0
- package/dist-server/routes.js +69 -5
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/index.d.ts +2 -2
- package/dist-server/service/index.js +27 -24
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/control-routing.d.ts +1 -1
- package/dist-server/service/reference/control-routing.js +1 -1
- package/dist-server/service/reference/control-routing.js.map +1 -1
- package/dist-server/service/reference/discovery-result.d.ts +2 -2
- package/dist-server/service/reference/discovery-result.js +3 -3
- package/dist-server/service/reference/discovery-result.js.map +1 -1
- package/dist-server/service/reference/hook-contract.d.ts +43 -0
- package/dist-server/service/reference/hook-contract.js +59 -0
- package/dist-server/service/reference/hook-contract.js.map +1 -0
- package/dist-server/service/reference/ingest-space.d.ts +1 -1
- package/dist-server/service/reference/ingest-space.js +4 -4
- package/dist-server/service/reference/ingest-space.js.map +1 -1
- package/dist-server/service/reference/knob-defaults.d.ts +1 -1
- package/dist-server/service/reference/knob-defaults.js +4 -4
- package/dist-server/service/reference/knob-defaults.js.map +1 -1
- package/dist-server/service/reference/reference-adapter.d.ts +140 -8
- package/dist-server/service/reference/reference-adapter.js +27 -0
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-hook.d.ts +20 -0
- package/dist-server/service/reference/reference-hook.js +133 -0
- package/dist-server/service/reference/reference-hook.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +2 -2
- package/dist-server/service/reference/reference-live.js +88 -13
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +14 -14
- package/dist-server/service/reference/reference-master.js +34 -12
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +1 -1
- package/dist-server/service/reference/reference-resolver.js +10 -10
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/twin-reference.d.ts +3 -3
- package/dist-server/service/reference/twin-reference.js.map +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.d.ts +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.js +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
- package/dist-server/service/twin-audit/command-audit.d.ts +1 -1
- package/dist-server/service/twin-audit/command-audit.js.map +1 -1
- package/dist-server/service/twin-audit/twin-audit-event.d.ts +1 -1
- package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -1
- package/dist-server/service/twin-audit/twin-audit-query.js +1 -1
- package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +22 -2
- package/dist-server/service/twin-event/twin-event-keys.js +37 -5
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-type.d.ts +1 -0
- package/dist-server/service/twin-event/twin-event-type.js +8 -1
- package/dist-server/service/twin-event/twin-event-type.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +2 -2
- package/dist-server/service/twin-event/twin-event.js +32 -4
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -1
- package/dist-server/service/twin-forecast/gap-analytics.d.ts +1 -1
- package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +29 -11
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.d.ts +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +1 -1
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/event-type-split-shape.d.ts +50 -0
- package/dist-server/service/twin-journal/event-type-split-shape.js +111 -0
- package/dist-server/service/twin-journal/event-type-split-shape.js.map +1 -0
- package/dist-server/service/twin-journal/event-type-split.d.ts +15 -0
- package/dist-server/service/twin-journal/event-type-split.js +102 -0
- package/dist-server/service/twin-journal/event-type-split.js.map +1 -0
- package/dist-server/service/twin-journal/journal-order.d.ts +15 -0
- package/dist-server/service/twin-journal/journal-order.js +17 -0
- package/dist-server/service/twin-journal/journal-order.js.map +1 -0
- package/dist-server/service/twin-journal/twin-journal-query.d.ts +5 -5
- package/dist-server/service/twin-journal/twin-journal-query.js +232 -21
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +27 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +59 -3
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js +14 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js +1 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js.map +1 -1
- package/dist-server/service/twin-model/epcis-coverage.js +36 -1
- package/dist-server/service/twin-model/epcis-coverage.js.map +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.js +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -1
- package/dist-server/service/twin-model/isa95-coverage.d.ts +15 -2
- package/dist-server/service/twin-model/isa95-coverage.js +32 -8
- package/dist-server/service/twin-model/isa95-coverage.js.map +1 -1
- package/dist-server/service/twin-model/item-ref.js +2 -2
- package/dist-server/service/twin-model/item-ref.js.map +1 -1
- package/dist-server/service/twin-model/name-index.d.ts +1 -1
- package/dist-server/service/twin-model/name-index.js +1 -1
- package/dist-server/service/twin-model/name-index.js.map +1 -1
- package/dist-server/service/twin-model/project-structure.d.ts +1 -1
- package/dist-server/service/twin-model/project-structure.js +3 -3
- package/dist-server/service/twin-model/project-structure.js.map +1 -1
- package/dist-server/service/twin-model/twin-equipment.d.ts +1 -1
- package/dist-server/service/twin-model/twin-equipment.js +1 -1
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -1
- package/dist-server/service/twin-model/twin-lineage-query.js +16 -5
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-location.d.ts +1 -1
- package/dist-server/service/twin-model/twin-location.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.d.ts +3 -3
- package/dist-server/service/twin-model/twin-model-item-query.js +14 -14
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-mutation.d.ts +2 -2
- package/dist-server/service/twin-model/twin-model-mutation.js +4 -4
- package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-query.js +117 -28
- package/dist-server/service/twin-model/twin-model-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js +22 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-operation.d.ts +1 -1
- package/dist-server/service/twin-model/twin-operation.js +1 -1
- package/dist-server/service/twin-model/twin-operation.js.map +1 -1
- package/dist-server/service/twin-space/move-space.js +2 -2
- package/dist-server/service/twin-space/move-space.js.map +1 -1
- package/dist-server/service/twin-space/representation-role.d.ts +2 -0
- package/dist-server/service/twin-space/representation-role.js +18 -0
- package/dist-server/service/twin-space/representation-role.js.map +1 -0
- package/dist-server/service/twin-space/space-integrity.d.ts +1 -1
- package/dist-server/service/twin-space/space-integrity.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-representation.d.ts +2 -0
- package/dist-server/service/twin-space/twin-space-representation.js +16 -0
- package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.d.ts +2 -2
- package/dist-server/service/twin-space/twin-space-resolver.js +36 -7
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-server/service/twin-structure/twin-structure.js +3 -3
- package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
- package/dist-server/service/twin-subject/event-subjects.d.ts +43 -0
- package/dist-server/service/twin-subject/event-subjects.js +137 -0
- package/dist-server/service/twin-subject/event-subjects.js.map +1 -0
- package/dist-server/service/twin-subject/index.d.ts +9 -0
- package/dist-server/service/twin-subject/index.js +16 -0
- package/dist-server/service/twin-subject/index.js.map +1 -0
- package/dist-server/service/twin-subject/item-resolver.d.ts +10 -0
- package/dist-server/service/twin-subject/item-resolver.js +93 -0
- package/dist-server/service/twin-subject/item-resolver.js.map +1 -0
- package/dist-server/service/twin-subject/subject-query-shape.d.ts +22 -0
- package/dist-server/service/twin-subject/subject-query-shape.js +88 -0
- package/dist-server/service/twin-subject/subject-query-shape.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.d.ts +23 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.js +159 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-event.d.ts +14 -0
- package/dist-server/service/twin-subject/twin-subject-event.js +111 -0
- package/dist-server/service/twin-subject/twin-subject-event.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.d.ts +39 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.js +295 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-query.d.ts +27 -0
- package/dist-server/service/twin-subject/twin-subject-query.js +232 -0
- package/dist-server/service/twin-subject/twin-subject-query.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-writer.d.ts +27 -0
- package/dist-server/service/twin-subject/twin-subject-writer.js +166 -0
- package/dist-server/service/twin-subject/twin-subject-writer.js.map +1 -0
- package/dist-server/service/twin-target/twin-target-resolver.js +1 -1
- package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
- package/dist-shared/entity-delta.d.ts +1 -1
- package/dist-shared/entity-delta.js +3 -3
- package/dist-shared/entity-delta.js.map +1 -1
- package/dist-shared/touched-items.js +2 -2
- package/dist-shared/touched-items.js.map +1 -1
- package/dist-shared/twin-level.js +1 -1
- package/dist-shared/twin-level.js.map +1 -1
- package/package.json +3 -3
- package/server/engine/attention-digest.ts +9 -9
- package/server/engine/canonical-ingest.ts +170 -13
- package/server/engine/command-routing.ts +1 -1
- package/server/engine/declared-stimulus.ts +1 -1
- package/server/engine/energy-topology.ts +1 -1
- package/server/engine/ingest-dedupe.ts +149 -0
- package/server/engine/ingest-health.ts +234 -20
- package/server/engine/integration-probes.ts +7 -7
- package/server/engine/kpi-baseline.ts +4 -4
- package/server/engine/kpi-fold.ts +395 -27
- package/server/engine/kpi-query.ts +212 -46
- package/server/engine/live-feed-registry.ts +1 -1
- package/server/engine/load-meter.ts +1 -1
- package/server/engine/local-declarations.ts +13 -13
- package/server/engine/log.ts +1 -1
- package/server/engine/measured-estimator.ts +1 -1
- package/server/engine/measured-yield.ts +1 -1
- package/server/engine/model-basis.ts +2 -2
- package/server/engine/model-gap.ts +3 -3
- package/server/engine/model-vocabulary.ts +1 -1
- package/server/engine/oee-accumulator.ts +4 -4
- package/server/engine/property-effects.ts +2 -2
- package/server/engine/read-time.ts +77 -0
- package/server/engine/restart-policy.ts +1 -1
- package/server/engine/runtime-key.ts +1 -1
- package/server/engine/spec-coverage.ts +3 -3
- package/server/engine/stage-path.ts +5 -5
- package/server/engine/state-axes.ts +2 -2
- package/server/engine/travel-estimator.ts +2 -2
- package/server/engine/twin-engine.ts +764 -201
- package/server/engine/warm-start.ts +6 -6
- package/server/index.ts +1 -1
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +1 -1
- package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +3 -3
- package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +2 -2
- package/server/migrations/1786300000000-IndexEventTypeByTime.ts +48 -0
- package/server/migrations/1786400000000-IndexEventCreatedAt.ts +38 -0
- package/server/migrations/1786500000000-CreateTwinSubjectEvents.ts +93 -0
- package/server/migrations/index.ts +7 -1
- package/server/routes.ts +68 -5
- package/server/service/index.ts +4 -1
- package/server/service/reference/control-routing.ts +1 -1
- package/server/service/reference/discovery-result.ts +3 -3
- package/server/service/reference/hook-contract.ts +103 -0
- package/server/service/reference/ingest-space.ts +4 -4
- package/server/service/reference/knob-defaults.ts +4 -4
- package/server/service/reference/reference-adapter.ts +166 -9
- package/server/service/reference/reference-hook.ts +145 -0
- package/server/service/reference/reference-live.ts +92 -14
- package/server/service/reference/reference-master.ts +39 -17
- package/server/service/reference/reference-resolver.ts +10 -10
- package/server/service/reference/twin-reference.ts +3 -3
- package/server/service/twin-attention/twin-attention-query.ts +1 -1
- package/server/service/twin-audit/command-audit.ts +1 -1
- package/server/service/twin-audit/twin-audit-event.ts +2 -2
- package/server/service/twin-audit/twin-audit-query.ts +1 -1
- package/server/service/twin-control/twin-control-mutation.ts +1 -1
- package/server/service/twin-event/twin-event-keys.ts +37 -5
- package/server/service/twin-event/twin-event-type.ts +18 -1
- package/server/service/twin-event/twin-event.ts +32 -6
- package/server/service/twin-forecast/forecast-metrics.ts +1 -1
- package/server/service/twin-forecast/gap-analytics.ts +1 -1
- package/server/service/twin-forecast/twin-forecast-query.ts +30 -11
- package/server/service/twin-ingest-window/twin-ingest-window-query.ts +1 -1
- package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +1 -1
- package/server/service/twin-instance/twin-instance.ts +4 -4
- package/server/service/twin-journal/event-type-split-shape.ts +112 -0
- package/server/service/twin-journal/event-type-split.ts +144 -0
- package/server/service/twin-journal/journal-order.ts +20 -0
- package/server/service/twin-journal/twin-journal-query.ts +224 -20
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +57 -3
- package/server/service/twin-metrics/twin-metrics-query.ts +14 -1
- package/server/service/twin-model/axis-journal-evidence.ts +1 -1
- package/server/service/twin-model/epcis-coverage.ts +36 -1
- package/server/service/twin-model/iec61850-coverage.ts +1 -1
- package/server/service/twin-model/isa95-coverage.ts +45 -8
- package/server/service/twin-model/item-ref.ts +2 -2
- package/server/service/twin-model/name-index.ts +1 -1
- package/server/service/twin-model/project-structure.ts +4 -4
- package/server/service/twin-model/twin-equipment.ts +2 -2
- package/server/service/twin-model/twin-lineage-query.ts +16 -5
- package/server/service/twin-model/twin-location.ts +1 -1
- package/server/service/twin-model/twin-model-item-query.ts +14 -14
- package/server/service/twin-model/twin-model-mutation.ts +4 -4
- package/server/service/twin-model/twin-model-query.ts +117 -28
- package/server/service/twin-model/twin-model-tree-query.ts +25 -1
- package/server/service/twin-model/twin-operation.ts +2 -2
- package/server/service/twin-space/move-space.ts +3 -3
- package/server/service/twin-space/representation-role.ts +15 -0
- package/server/service/twin-space/space-integrity.ts +1 -1
- package/server/service/twin-space/twin-space-representation.ts +37 -0
- package/server/service/twin-space/twin-space-resolver.ts +39 -7
- package/server/service/twin-structure/twin-structure.ts +3 -3
- package/server/service/twin-subject/event-subjects.ts +155 -0
- package/server/service/twin-subject/index.ts +10 -0
- package/server/service/twin-subject/item-resolver.ts +92 -0
- package/server/service/twin-subject/subject-query-shape.ts +84 -0
- package/server/service/twin-subject/twin-subject-backfill.ts +196 -0
- package/server/service/twin-subject/twin-subject-event.ts +101 -0
- package/server/service/twin-subject/twin-subject-fast-path.ts +346 -0
- package/server/service/twin-subject/twin-subject-query.ts +210 -0
- package/server/service/twin-subject/twin-subject-writer.ts +189 -0
- package/server/service/twin-target/twin-target-resolver.ts +1 -1
- package/shared/entity-delta.ts +3 -3
- package/shared/touched-items.ts +2 -2
- package/shared/twin-level.ts +1 -1
- package/test/adopt-structure-live.test.ts +3 -3
- package/test/aggregate-not-findone.test.ts +112 -0
- package/test/attention-digest.test.ts +6 -6
- package/test/axis-read.test.ts +2 -2
- package/test/boot-resume.test.ts +20 -7
- package/test/broadcast-period.test.ts +2 -2
- package/test/broadcast-queue-overflow.test.ts +244 -0
- package/test/canonical-ingest-vocabularies.test.ts +179 -7
- package/test/canonical-quantity-door.test.ts +2 -2
- package/test/checkpoint-refuses-empty.test.ts +2 -2
- package/test/connector-capability-declaration.test.ts +88 -0
- package/test/control-capability.test.ts +1 -1
- package/test/cursor-stall-not-read-failure.test.ts +2 -2
- package/test/declaration-reaches-model.test.ts +5 -5
- package/test/declared-stimulus.test.ts +4 -4
- package/test/discovery-result.test.ts +2 -2
- package/test/entity-delta.test.ts +4 -4
- package/test/event-subjects.test.ts +147 -0
- package/test/event-time-column.test.ts +3 -3
- package/test/event-type-split.test.ts +155 -0
- package/test/fold-gap-speaks.test.ts +53 -0
- package/test/forecast-metrics.test.ts +1 -1
- package/test/forecast-tuning.test.ts +1 -1
- package/test/ingest-health-engine.test.ts +2 -2
- package/test/ingest-health-wiring.test.ts +7 -5
- package/test/ingest-health.test.ts +6 -6
- package/test/ingest-history.test.ts +2 -2
- package/test/ingest-idempotent.test.ts +132 -0
- package/test/ingest-space.test.ts +3 -3
- package/test/integration-probes.test.ts +3 -3
- package/test/integration-runner.test.ts +1 -1
- package/test/item-ref.test.ts +1 -1
- package/test/journal-order-axis.test.ts +80 -0
- package/test/journal-read-discipline.test.ts +16 -6
- package/test/journal-retention.test.ts +171 -29
- package/test/journal-sort-axis.test.ts +1 -1
- package/test/journal-write-door.test.ts +3 -3
- package/test/journal-write-trend.test.ts +1 -1
- package/test/kernel-kind-guard.test.ts +3 -3
- package/test/knob-defaults.test.ts +1 -1
- package/test/kpi-baseline-db.test.ts +2 -2
- package/test/kpi-fold.test.ts +185 -14
- package/test/kpi-query-bench.test.ts +3 -3
- package/test/live-cursor-wiring.test.ts +6 -6
- package/test/live-kernel-facts.test.ts +11 -11
- package/test/live-mirror-parity.test.ts +3 -3
- package/test/load-meter.test.ts +1 -1
- package/test/local-declarations.test.ts +10 -10
- package/test/log-stamp.test.ts +1 -1
- package/test/measured-yield.test.ts +2 -2
- package/test/merge-streams.test.ts +70 -0
- package/test/mirror-resumes-from-checkpoint.test.ts +13 -13
- package/test/model-basis.test.ts +2 -2
- package/test/model-gap.test.ts +4 -4
- package/test/model-vocabulary.test.ts +2 -2
- package/test/move-space.test.ts +1 -1
- package/test/oee-accumulator.test.ts +2 -2
- package/test/operational-vocabulary.test.ts +2 -2
- package/test/project-structure-db.test.ts +2 -2
- package/test/projection-reaches-screen.test.ts +2 -2
- package/test/property-effects.test.ts +3 -3
- package/test/read-failure-ledger.test.ts +106 -0
- package/test/read-failure-visible.test.ts +7 -7
- package/test/read-time.test.ts +118 -0
- package/test/reference-grounding.test.ts +1 -1
- package/test/reference-hook.test.ts +86 -0
- package/test/registry-key-guard.test.ts +1 -1
- package/test/rename-twin.test.ts +81 -0
- package/test/restart-policy.test.ts +3 -3
- package/test/resync-origin-site.test.ts +3 -3
- package/test/revision-axis.test.ts +14 -8
- package/test/runtime-key.test.ts +3 -3
- package/test/snapshot-freshness.test.ts +4 -4
- package/test/source-outcome-audit.test.ts +1 -1
- package/test/space-integrity.test.ts +1 -1
- package/test/space-representation.test.ts +66 -0
- package/test/space-scope-includes-stopped.test.ts +55 -0
- package/test/spec-coverage.test.ts +1 -1
- package/test/standard-coverage.test.ts +43 -1
- package/test/status-tally.test.ts +1 -1
- package/test/structure-revision-db.test.ts +7 -7
- package/test/subject-fast-path.test.ts +148 -0
- package/test/subject-read-model.test.ts +175 -0
- package/test/touched-items.test.ts +2 -2
- package/test/twin-audit.test.ts +1 -1
- package/test/twin-event-keys.test.ts +49 -3
- package/test/twin-model-item-db.test.ts +5 -5
- package/test/twin-model-tree-db.test.ts +35 -2
- package/test/twin-origin-resync.test.ts +1 -1
- package/test/warm-start-seam.test.ts +1 -1
- package/test/warm-start.test.ts +6 -6
- package/test/withheld-door.test.ts +95 -0
- package/test/yield-loop.test.ts +4 -4
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -14,9 +14,9 @@ export interface AttentionDigestResult {
|
|
|
14
14
|
/** ì 첎 ê°ì â ë ìŒì "N걎 ë" ê° ìŽ ê°ìì ëìšë€(ì륞 ì¬ì€ì ë°íë€). */
|
|
15
15
|
attentionTotal: number;
|
|
16
16
|
/**
|
|
17
|
-
* ìëŠ¬ë³ ìµê³ ì¬ê°ë â **ì ëì 귌거ë¡**
|
|
17
|
+
* ìëŠ¬ë³ ìµê³ ì¬ê°ë â **ì ëì 귌거ë¡** ê³ì°íë€.
|
|
18
18
|
*
|
|
19
|
-
* ìì N ë§ìŒë¡
|
|
19
|
+
* ìì N ë§ìŒë¡ ê³ì°í멎 20ì ë°ì ì ížë¥Œ ê°ì§ ìëŠ¬ê° ìì ìëë€. ê·žê²ìŽ ìŽ ììœì íµì¬ ìŽì ë€:
|
|
20
20
|
* ë ìŒì ìëŒë ëì§ë§ **ì§ë ìì ìëŒì ì ëë€.**
|
|
21
21
|
*/
|
|
22
22
|
severityByLocation: Record<string, string>;
|
|
@@ -27,7 +27,7 @@ export declare const compareAttentions: (a: AttentionLike, b: AttentionLike) =>
|
|
|
27
27
|
* ì ížë¥Œ ììœíë€.
|
|
28
28
|
*
|
|
29
29
|
* `limit` ìŽ ìê±°ë 0 ìŽí멎 **ìë¥Žì§ ìëë€** â ì륎ë ìªœìŽ êž°ë³žìŽë©Ž ìŽ ê°ì 몚륎ë ìë¹ì²ê°
|
|
30
|
-
*
|
|
30
|
+
* ìëŠ¬ì§ ìê³ ìŒë¶ë§ ë°ëë€(ììœì ëì
íë€ ë§ëë ì íì ìž ì¬ê³ ë€).
|
|
31
31
|
*/
|
|
32
32
|
export declare function digestAttentions(attentions: readonly AttentionLike[] | undefined | null, limit?: number): AttentionDigestResult;
|
|
33
33
|
/** ë ìŠ íëê° ëž ì íž â ìŽë ížììì ìëì§ì íšê». */
|
|
@@ -45,7 +45,7 @@ export interface LensAttentions {
|
|
|
45
45
|
* ê°ì ì늬 id ê° ë ìŠë§ë€ ë€ë¥ž ê²ì ê°ëŠ¬í¬ ì ìë€.
|
|
46
46
|
* â¡ **ììë ë ìŠ ììê° ìëëŒ êží ììë€** â ì ë ìŠì ë®ì ì ížê° ë€ ë ìŠì ì¬ê°í ì ížë¥Œ
|
|
47
47
|
* ë°ìŽëŽë©Ž, ìì N ë§ ë³Žë í멎ìì ì ì êží ê²ìŽ ì 볎ìžë€.
|
|
48
|
-
* ⢠**ì늬 ìì ë ìŠë¥Œ ê°ë¡ì§ë¬ ê°ì¥ êží ê²ìŒë¡**
|
|
48
|
+
* ⢠**ì늬 ìì ë ìŠë¥Œ ê°ë¡ì§ë¬ ê°ì¥ êží ê²ìŒë¡** ê³ì°íë€ â ë ë ìŠê° ê°ì ì늬륌 ê°ëЬí€ë©Ž ê·ž ì늬ë
|
|
49
49
|
* íëì íì€ìŽë¯ë¡ ë êží ìªœìŽ ìŽêžŽë€(ë ì€ íë륌 ììë¡ ê³ ë¥Žë©Ž ììŽ ë ìŠ ììì ë°ëŒ ë¬ëŒì§ë€).
|
|
50
50
|
*/
|
|
51
51
|
export declare function mergeLensAttentions(lenses: readonly LensAttentions[], limit?: number): AttentionDigestResult;
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
* ë ì íž 397ê±ŽìŽ 108KB ëŒ 5ë°° ê°ìì ê·žì³€ë€. ê·žë°ë° íë©ŽìŽ ê·ž 397걎ìŒë¡ íë ìŒì ëë¿ìŽë€.
|
|
8
8
|
*
|
|
9
9
|
* â ë ìŒì **20걎**ë§ ë³Žì¬ì£Œê³ ëëšžì§ë "N걎 ë" ëŒê³ ë§ ë§íë€.
|
|
10
|
-
* â¡ ì늬(íŽëŠ¬ê³€)륌 ì¹ í **ìëŠ¬ë³ ìµê³ ì¬ê°ë**륌 ëœëë€ â 397ê±ŽìŽ ì늬 7ê³³ì ì 7ê°ë¡
|
|
10
|
+
* â¡ ì늬(íŽëŠ¬ê³€)륌 ì¹ í **ìëŠ¬ë³ ìµê³ ì¬ê°ë**륌 ëœëë€ â 397ê±ŽìŽ ì늬 7ê³³ì ì 7ê°ë¡ ì€ìŽë ë€.
|
|
11
11
|
*
|
|
12
|
-
* ìŠ ì ëì ëŽë €ë³ŽëŽ íŽëŒìŽìžížê°
|
|
12
|
+
* ìŠ ì ëì ëŽë €ë³ŽëŽ íŽëŒìŽìžížê° ê³ì°íë 구조ìë€. ê³ì°íë ê²ì ê°ìžë¯ë¡ **ìë²ê° ê³ì°íŽì 볎ëžë€.**
|
|
13
13
|
*
|
|
14
|
-
* ââ
|
|
15
|
-
* ìëë€ë ì¬ì€ê³Œ **ì 첎 ê°ì**륌 íšê» 볎ëžë€. ê²œê³ ëª©ë¡ìì
|
|
14
|
+
* ââ ìëŠ¬ì§ ìê³ ìë¥Žì§ ìëë€ ââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
15
|
+
* ìëë€ë ì¬ì€ê³Œ **ì 첎 ê°ì**륌 íšê» 볎ëžë€. ê²œê³ ëª©ë¡ìì ë€ìŽìš ê²ìŽ ìë ëëœì "êŽì°®ì ì€ ììë€" ë¡
|
|
16
16
|
* ìŽìŽì§ë€ â ë ìŒìŽ ìŽë¯ž "N걎 ë" 륌 ë§íê³ ììê³ , ê·ž N ì ì 첎 ê°ììì ëììŒ ë§ë€.
|
|
17
17
|
*
|
|
18
18
|
* ââ ì ë ¬ì í ê³³ì ëë€ âââââââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
@@ -34,11 +34,11 @@ exports.compareAttentions = compareAttentions;
|
|
|
34
34
|
* ì ížë¥Œ ììœíë€.
|
|
35
35
|
*
|
|
36
36
|
* `limit` ìŽ ìê±°ë 0 ìŽí멎 **ìë¥Žì§ ìëë€** â ì륎ë ìªœìŽ êž°ë³žìŽë©Ž ìŽ ê°ì 몚륎ë ìë¹ì²ê°
|
|
37
|
-
*
|
|
37
|
+
* ìëŠ¬ì§ ìê³ ìŒë¶ë§ ë°ëë€(ììœì ëì
íë€ ë§ëë ì íì ìž ì¬ê³ ë€).
|
|
38
38
|
*/
|
|
39
39
|
function digestAttentions(attentions, limit) {
|
|
40
40
|
const all = Array.isArray(attentions) ? attentions : [];
|
|
41
|
-
/* ì늬 ìì ì ëìŒë¡
|
|
41
|
+
/* ì늬 ìì ì ëìŒë¡ ì²ëЬíë€ â ì늰 ë€ì ê³ì°í멎 ìì ìë ìëŠ¬ê° ìꞎë€. */
|
|
42
42
|
const severityByLocation = {};
|
|
43
43
|
for (const a of all) {
|
|
44
44
|
const nid = a?.anchor?.locationId;
|
|
@@ -62,7 +62,7 @@ function digestAttentions(attentions, limit) {
|
|
|
62
62
|
* ê°ì ì늬 id ê° ë ìŠë§ë€ ë€ë¥ž ê²ì ê°ëŠ¬í¬ ì ìë€.
|
|
63
63
|
* â¡ **ììë ë ìŠ ììê° ìëëŒ êží ììë€** â ì ë ìŠì ë®ì ì ížê° ë€ ë ìŠì ì¬ê°í ì ížë¥Œ
|
|
64
64
|
* ë°ìŽëŽë©Ž, ìì N ë§ ë³Žë í멎ìì ì ì êží ê²ìŽ ì 볎ìžë€.
|
|
65
|
-
* ⢠**ì늬 ìì ë ìŠë¥Œ ê°ë¡ì§ë¬ ê°ì¥ êží ê²ìŒë¡**
|
|
65
|
+
* ⢠**ì늬 ìì ë ìŠë¥Œ ê°ë¡ì§ë¬ ê°ì¥ êží ê²ìŒë¡** ê³ì°íë€ â ë ë ìŠê° ê°ì ì늬륌 ê°ëЬí€ë©Ž ê·ž ì늬ë
|
|
66
66
|
* íëì íì€ìŽë¯ë¡ ë êží ìªœìŽ ìŽêžŽë€(ë ì€ íë륌 ììë¡ ê³ ë¥Žë©Ž ììŽ ë ìŠ ììì ë°ëŒ ë¬ëŒì§ë€).
|
|
67
67
|
*/
|
|
68
68
|
function mergeLensAttentions(lenses, limit) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attention-digest.js","sourceRoot":"","sources":["../../server/engine/attention-digest.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAuCH,4CAeC;AAqBD,kDAMC;AA/ED,uCAAuC;AACvC,MAAM,IAAI,GAA2B,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;AAyBhF,+CAA+C;AACxC,MAAM,iBAAiB,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAU,EAAE,CAC9E,CAAC,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;AAFlD,QAAA,iBAAiB,qBAEiC;AAE/D;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,UAAuD,EAAE,KAAc;IACtG,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;IAEvD
|
|
1
|
+
{"version":3,"file":"attention-digest.js","sourceRoot":"","sources":["../../server/engine/attention-digest.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAuCH,4CAeC;AAqBD,kDAMC;AA/ED,uCAAuC;AACvC,MAAM,IAAI,GAA2B,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;AAyBhF,+CAA+C;AACxC,MAAM,iBAAiB,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAU,EAAE,CAC9E,CAAC,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;AAFlD,QAAA,iBAAiB,qBAEiC;AAE/D;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,UAAuD,EAAE,KAAc;IACtG,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;IAEvD,iDAAiD;IACjD,MAAM,kBAAkB,GAA2B,EAAE,CAAA;IACrD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,CAAA;QACjC,IAAI,CAAC,GAAG;YAAE,SAAQ;QAClB,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAA;IAC1G,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,yBAAiB,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACnE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAC/E,CAAC;AAQD;;;;;;;;;;;;GAYG;AACH,SAAgB,mBAAmB,CAAC,MAAiC,EAAE,KAAc;IACnF,MAAM,GAAG,GAAoB,EAAE,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAmB,CAAC,CAAA;IACzG,CAAC;IACD,OAAO,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACrC,CAAC","sourcesContent":["/*\n * 죌ì ì íž ììœ â **ìì**. \"íë©ŽìŽ ì€ì ë¡ ì°ë ë ê°ì§ë§ ê°ìžê² ë§ë ë€.\"\n *\n * ââ ì ìë (2026-08-05) ââââââââââââââââââââââââââââââââââââââââââââââââââââ\n * ì¶ ì íìŒë¡ 늬íë ì륌 80KB â 2KB ë¡ ì€ìëë°, **ì ížê° ë§ì ížìì ê±°êž°ì ë§íë€**: `hatio-yard`\n * ë ì íž 397ê±ŽìŽ 108KB ëŒ 5ë°° ê°ìì ê·žì³€ë€. ê·žë°ë° íë©ŽìŽ ê·ž 397걎ìŒë¡ íë ìŒì ëë¿ìŽë€.\n *\n * â ë ìŒì **20걎**ë§ ë³Žì¬ì£Œê³ ëëšžì§ë \"N걎 ë\" ëŒê³ ë§ ë§íë€.\n * â¡ ì늬(íŽëŠ¬ê³€)륌 ì¹ í **ìëŠ¬ë³ ìµê³ ì¬ê°ë**륌 ëœëë€ â 397ê±ŽìŽ ì늬 7ê³³ì ì 7ê°ë¡ ì€ìŽë ë€.\n *\n * ìŠ ì ëì ëŽë €ë³ŽëŽ íŽëŒìŽìžížê° ê³ì°íë 구조ìë€. ê³ì°íë ê²ì ê°ìžë¯ë¡ **ìë²ê° ê³ì°íŽì 볎ëžë€.**\n *\n * ââ ìëŠ¬ì§ ìê³ ìë¥Žì§ ìëë€ ââââââââââââââââââââââââââââââââââââââââââââââââââââ\n * ìëë€ë ì¬ì€ê³Œ **ì 첎 ê°ì**륌 íšê» 볎ëžë€. ê²œê³ ëª©ë¡ìì ë€ìŽìš ê²ìŽ ìë ëëœì \"êŽì°®ì ì€ ììë€\" ë¡\n * ìŽìŽì§ë€ â ë ìŒìŽ ìŽë¯ž \"N걎 ë\" 륌 ë§íê³ ììê³ , ê·ž N ì ì 첎 ê°ììì ëììŒ ë§ë€.\n *\n * ââ ì ë ¬ì í ê³³ì ëë€ âââââââââââââââââââââââââââââââââââââââââââââââââââââ\n * ìì N ì ìë²ê° ê³ ë¥Žë¯ë¡ **íŽëŒìŽìžížì ê°ì ìì**ì¬ìŒ íë€. ììê° ë€ë¥Žë©Ž ìë²ê° ê³ ë¥ž 20걎ìŽ\n * íë©ŽìŽ ê³ ë¥Œ 20걎곌 ë¬ëŒì§ê³ , ê·ž ìŽêžëšì ì묎 ë°ìë ì€ë¥ë¡ ëë¬ëì§ ìëë€.\n * ìì = íìžë ê²ì ìëë¡, ê·žë€ì ì¬ê°ë ëì ê²ë¶í°(íŽëŒìŽìžíž ì ë ¬ê³Œ ëìŒ).\n */\n\n/** ìë íì€(ISA-18.2) ì°ì ìì â í° ê°ìŽ êžíë€. */\nconst RANK: Record<string, number> = { low: 1, medium: 2, high: 3, critical: 4 }\n\ninterface AttentionLike {\n id?: string\n /** ìŽë ížì(ë ìŠ)ìì ìš ì ížìžê° â ê³µê°ìì 몚ì ë ë¶ëë€. */\n instanceId?: string\n severity?: string\n state?: string\n anchor?: { locationId?: string }\n}\n\nexport interface AttentionDigestResult {\n /** ìì N â ë ìŒìŽ ê·žëŠ¬ë ê². */\n attentions: AttentionLike[]\n /** ì 첎 ê°ì â ë ìŒì \"N걎 ë\" ê° ìŽ ê°ìì ëìšë€(ì륞 ì¬ì€ì ë°íë€). */\n attentionTotal: number\n /**\n * ìëŠ¬ë³ ìµê³ ì¬ê°ë â **ì ëì 귌거ë¡** ê³ì°íë€.\n *\n * ìì N ë§ìŒë¡ ê³ì°í멎 20ì ë°ì ì ížë¥Œ ê°ì§ ìëŠ¬ê° ìì ìëë€. ê·žê²ìŽ ìŽ ììœì íµì¬ ìŽì ë€:\n * ë ìŒì ìëŒë ëì§ë§ **ì§ë ìì ìëŒì ì ëë€.**\n */\n severityByLocation: Record<string, string>\n}\n\n/** í멎 ì ë ¬ê³Œ ê°ì ìì â íìžë ê²ì ìëë¡, ê·žë€ì ì¬ê°ë ëŽëŠŒì°šì. */\nexport const compareAttentions = (a: AttentionLike, b: AttentionLike): number =>\n (a.state === 'acknowledged' ? 1 : 0) - (b.state === 'acknowledged' ? 1 : 0) ||\n (RANK[b.severity ?? ''] ?? 0) - (RANK[a.severity ?? ''] ?? 0)\n\n/**\n * ì ížë¥Œ ììœíë€.\n *\n * `limit` ìŽ ìê±°ë 0 ìŽí멎 **ìë¥Žì§ ìëë€** â ì륎ë ìªœìŽ êž°ë³žìŽë©Ž ìŽ ê°ì 몚륎ë ìë¹ì²ê°\n * ìëŠ¬ì§ ìê³ ìŒë¶ë§ ë°ëë€(ììœì ëì
íë€ ë§ëë ì íì ìž ì¬ê³ ë€).\n */\nexport function digestAttentions(attentions: readonly AttentionLike[] | undefined | null, limit?: number): AttentionDigestResult {\n const all = Array.isArray(attentions) ? attentions : []\n\n /* ì늬 ìì ì ëìŒë¡ ì²ëЬíë€ â ì늰 ë€ì ê³ì°í멎 ìì ìë ìëŠ¬ê° ìꞎë€. */\n const severityByLocation: Record<string, string> = {}\n for (const a of all) {\n const nid = a?.anchor?.locationId\n if (!nid) continue\n const cur = severityByLocation[nid]\n if (!cur || (RANK[a.severity ?? ''] ?? 0) > (RANK[cur] ?? 0)) severityByLocation[nid] = a.severity ?? ''\n }\n\n const sorted = [...all].sort(compareAttentions)\n const capped = limit && limit > 0 ? sorted.slice(0, limit) : sorted\n return { attentions: capped, attentionTotal: all.length, severityByLocation }\n}\n\n/** ë ìŠ íëê° ëž ì íž â ìŽë ížììì ìëì§ì íšê». */\nexport interface LensAttentions {\n instanceId: string\n attentions: readonly AttentionLike[] | undefined | null\n}\n\n/**\n * ì¬ë¬ ë ìŠì ì ížë¥Œ **í íì¥ì 목ë¡ìŒë¡** 몚ìë€.\n *\n * í ê³µì¥ì WMS·MES·YMS ê° íšê» ììŒë¯ë¡ \"ìŽ íì¥ìì ëŽìŒ í ê²\" ì ë ìŠ íëë¡ ëµí ì ìë€.\n * 몚ìŒë©Žì ì§í€ë ê² ì
:\n *\n * â **ìŽë ížììì ìëì§ ë¶ìžë€**(`instanceId`) â ì¡°ì¹ë ê²°êµ ê·ž ížìì 볎ëŽìŒ íê³ , ê³µê°ìì 볎멎\n * ê°ì ì늬 id ê° ë ìŠë§ë€ ë€ë¥ž ê²ì ê°ëŠ¬í¬ ì ìë€.\n * â¡ **ììë ë ìŠ ììê° ìëëŒ êží ììë€** â ì ë ìŠì ë®ì ì ížê° ë€ ë ìŠì ì¬ê°í ì ížë¥Œ\n * ë°ìŽëŽë©Ž, ìì N ë§ ë³Žë í멎ìì ì ì êží ê²ìŽ ì 볎ìžë€.\n * ⢠**ì늬 ìì ë ìŠë¥Œ ê°ë¡ì§ë¬ ê°ì¥ êží ê²ìŒë¡** ê³ì°íë€ â ë ë ìŠê° ê°ì ì늬륌 ê°ëЬí€ë©Ž ê·ž ì늬ë\n * íëì íì€ìŽë¯ë¡ ë êží ìªœìŽ ìŽêžŽë€(ë ì€ íë륌 ììë¡ ê³ ë¥Žë©Ž ììŽ ë ìŠ ììì ë°ëŒ ë¬ëŒì§ë€).\n */\nexport function mergeLensAttentions(lenses: readonly LensAttentions[], limit?: number): AttentionDigestResult {\n const all: AttentionLike[] = []\n for (const lens of lenses) {\n for (const a of lens.attentions ?? []) all.push({ ...a, instanceId: lens.instanceId } as AttentionLike)\n }\n return digestAttentions(all, limit)\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type EnergyRecord, type EnergyEquipmentRecord, type OperationalRecord, type IngestResult } from '@operato/twin-kernel';
|
|
1
|
+
import { type EnergyRecord, type EnergyEquipmentRecord, type OperationalRecord, type IngestResult, type MasterDataRecord } from '@operato/twin-kernel';
|
|
2
2
|
/** ê°ì²Ž êŽìž¡ â 묌걎 íëê° ìŽëì 묎ììŽ ëë. */
|
|
3
3
|
export interface CanonicalRecord {
|
|
4
4
|
/**
|
|
@@ -86,4 +86,13 @@ export interface CanonicalAggregationRecord {
|
|
|
86
86
|
bizLocation?: string;
|
|
87
87
|
}
|
|
88
88
|
/** ì ê· ë ìœë[] â ê²ìŠë CanonicalEnvelope[] (+ ê±°ë¶ë¶). ìì íšì. ëšìŒâê°ì²Žë ë°°ìŽë¡ ì ê·í. */
|
|
89
|
-
export declare function ingestCanonicalRecords(records: CanonicalRecord | CanonicalAggregationRecord | CanonicalTransformationRecord | EnergyRecord | EnergyEquipmentRecord | OperationalRecord | (CanonicalRecord | CanonicalAggregationRecord | CanonicalTransformationRecord | EnergyRecord | EnergyEquipmentRecord | OperationalRecord)[] | undefined | null, tenantId: string, defaultEventTime: string):
|
|
89
|
+
export declare function ingestCanonicalRecords(records: CanonicalRecord | CanonicalAggregationRecord | CanonicalTransformationRecord | EnergyRecord | EnergyEquipmentRecord | OperationalRecord | MasterDataRecord | (CanonicalRecord | CanonicalAggregationRecord | CanonicalTransformationRecord | EnergyRecord | EnergyEquipmentRecord | OperationalRecord | MasterDataRecord)[] | undefined | null, tenantId: string, defaultEventTime: string): CanonicalIngestResult;
|
|
90
|
+
/**
|
|
91
|
+
* ì ì
결곌 â ì¬ê±Ž(ëŽí¬)곌 **ì¬ê±ŽìŽ ìë ê²**ì ê°ëŒ ëžë€.
|
|
92
|
+
*
|
|
93
|
+
* ë§ì€í°ë°ìŽí°ë¥Œ `accepted` ì ìì§ ìë ìŽì : ë¶ë¥Žë ìªœìŽ ê·žê²ì ì ëì ì ê² ëê³ , ìê°ì¶ìŽ ìë ê°ìŽ
|
|
94
|
+
* ãê·žë ìŒìŽë ìŒãë¡ ëšëë€. ê°ë륌 íì
ìŒë¡ ê°ëŒ ë멎 ê·ž ì€ì륌 í ì ìë€.
|
|
95
|
+
*/
|
|
96
|
+
export interface CanonicalIngestResult extends IngestResult {
|
|
97
|
+
masterData: MasterDataRecord[];
|
|
98
|
+
}
|
|
@@ -9,6 +9,8 @@ const twin_kernel_1 = require("@operato/twin-kernel");
|
|
|
9
9
|
* ì¬êž° ëì°©íë ë ìœëë ìŽë¯ž ì ê· íëë€ â ìŽíë§ë€ ìêž° íë ìŽëŠìŽ ê³ìœìŽë€:
|
|
10
10
|
* EPCIS í목 { epc, action, bizStep, disposition?, readPoint?, bizLocation? }
|
|
11
11
|
* ìëì§ ê³ë { meterId, kW?, kWh?, ⊠} · ì€ë¹ ìëì§ { equipmentId, generatedKW?, soc?, ⊠}
|
|
12
|
+
* ë°ì ì ì° { equipmentId, kWh, kWhSince?, ⊠}
|
|
13
|
+
* ì¬ì© êµ¬ê° { meterId, from, to, kWh, unitPrice?, basis?, ⊠} · ì²êµ¬ì { from, to, total?, ⊠}
|
|
12
14
|
* ëŽê¹(ì ì¬) { parentID, childEPCs[] | childQuantityList[], action, bizStep, ⊠}
|
|
13
15
|
* ìŽì ì¬ì€ { taskId | moverId | personId | assetId | orderId, status, ⊠} // vocabulary-guard: allow ì ë ììŽìŽ íë
|
|
14
16
|
* 컀ëì objectEvent êµ¬ì± + EPCIS ê²ìŠ(ìë°=ì€ìŒ ì°šëš) + ëŽí¬ ëíë§(ë°©ìž ìì).
|
|
@@ -30,6 +32,32 @@ const TWIN_INGEST_RULES = [
|
|
|
30
32
|
epc: '$.epc',
|
|
31
33
|
/* ë¹ì§ë ¬ ìë â ê°ì²Ž ììŽ ãìŽ ì늬ì ìŽ íëª©ìŽ ìŒë§ ëšìë€ãë§ ì€ë êŽìž¡ìŽ ìë€. */
|
|
32
34
|
quantityList: '$.quantityList',
|
|
35
|
+
/*
|
|
36
|
+
* **ê°ì²ŽÂ·ë¡ížì ë§ì€í°ë°ìŽí°**(ë¡íž ë²ížÂ·ìë¹êž°í ë±) â 컀ë 0.7.58 ìì ìŽ ìëŠ¬ê° ìŽë žë€.
|
|
37
|
+
*
|
|
38
|
+
* ì€ìž¡(í¬ì²): ì볞 ì¬ê³ 1,704í **ì ë¶**ì ìë¹êž°íìŽ ìëë° í¬ìë ìíìë **0걎**ìŽìë€. ì§ë
|
|
39
|
+
* ì¬ê³ 950걎·59,785kg ìŽ ìŽëìë ëíëì§ ììê³ , ë¹ íë©ŽìŽ ãìŽì ììãìŒë¡ ìœíë€.
|
|
40
|
+
*
|
|
41
|
+
* â
**íì€ìŽ `action: 'ADD'` ìŒ ëë§ íì©íë€**(ëë ë³í). ë§ì€í°ë°ìŽí°ë ë¡ížê° **ìêžž ë**
|
|
42
|
+
* ë§íë ì¬ì€ìŽê³ , 죌Ʞ êŽìž¡ë§ë€ ì€ìŒë©Ž 컀ëìŽ ê±°ë¶íë€ â ìëŠ¬ì§ ìê³ íµê³Œìí€ì§ ìë ê²ìŽ ì³ë€
|
|
43
|
+
* (컀ë¥í°ê° 첫 목격ì `ADD`, ê·ž ë€ë¡ `OBSERVE` 륌 ëŽìŒ íë€).
|
|
44
|
+
*/
|
|
45
|
+
ilmd: '$.ilmd',
|
|
46
|
+
/*
|
|
47
|
+
* **ì ì ì ìž** â ãìŽ ì¬ê±Žì ìë ìŒìŽ ëìë€ã(컀ë 0.7.65 ìì ìŽ ìëŠ¬ê° ìŽë žë€).
|
|
48
|
+
*
|
|
49
|
+
* ìž ê°ìŽ íšê»ì¬ìŒ ë»ìŽ ììŽ ë¬¶ììŒë¡ ìšë€. 컀ëìŽ ì ìž ìê°ì ì구íê³ , ììŒë©Ž ì¬ê±Ž ìê°ìŒë¡
|
|
50
|
+
* ë©ì°ì§ ìê³ ìŽì ì íšê» ëë €ì€ë€ â ãìžì ì ì íëãì ãìžì ìŒìŽë¬ëãê° ê°ìì§ë©Ž ëì ë€ì
|
|
51
|
+
* ê°ëŒëŒ ì ìë€.
|
|
52
|
+
*
|
|
53
|
+
* ìíë ìŽê²ìŒë¡ íë€ëŠ¬ì§ ìëë€. 컀ëì ì ì ì 목ë¡ì ì ê³ ì¬ê³ 륌 ê·žëë¡ ëë€ â 묎ìì ìŽë»ê²
|
|
54
|
+
* ëë늎ì§ë ëë©ìž íëšìŽê³ , ì°ž ì¬ê³ ë ê·ž ë€ì ìë êŽìž¡ìŽ ë€ì ë§íŽ ì€ë€.
|
|
55
|
+
*/
|
|
56
|
+
errorDeclaration: {
|
|
57
|
+
declarationTime: '$.errorDeclaration.declarationTime',
|
|
58
|
+
reason: '$.errorDeclaration.reason',
|
|
59
|
+
correctiveEventIDs: '$.errorDeclaration.correctiveEventIDs'
|
|
60
|
+
},
|
|
33
61
|
readPoint: '$.readPoint',
|
|
34
62
|
bizLocation: '$.bizLocation'
|
|
35
63
|
}
|
|
@@ -46,6 +74,11 @@ const TWIN_INGEST_RULES = [
|
|
|
46
74
|
outputEPCList: '$.outputEPCList',
|
|
47
75
|
outputQuantityList: '$.outputQuantityList',
|
|
48
76
|
transformationID: '$.transformationID',
|
|
77
|
+
errorDeclaration: {
|
|
78
|
+
declarationTime: '$.errorDeclaration.declarationTime',
|
|
79
|
+
reason: '$.errorDeclaration.reason',
|
|
80
|
+
correctiveEventIDs: '$.errorDeclaration.correctiveEventIDs'
|
|
81
|
+
},
|
|
49
82
|
readPoint: '$.readPoint',
|
|
50
83
|
bizLocation: '$.bizLocation'
|
|
51
84
|
}
|
|
@@ -66,6 +99,11 @@ const TWIN_INGEST_RULES = [
|
|
|
66
99
|
childEPCs: '$.childEPCs',
|
|
67
100
|
/* ë±ê° ìë³ì ììŽ **ìëìŒë¡** ëŽêžŽ ìì(ãìŽ íë² 40ê°ã) â ì
ê³ Â·í¬ì¥ìŽ ìŽ ëªšììŒë¡ ìšë€. */
|
|
68
101
|
childQuantityList: '$.childQuantityList',
|
|
102
|
+
errorDeclaration: {
|
|
103
|
+
declarationTime: '$.errorDeclaration.declarationTime',
|
|
104
|
+
reason: '$.errorDeclaration.reason',
|
|
105
|
+
correctiveEventIDs: '$.errorDeclaration.correctiveEventIDs'
|
|
106
|
+
},
|
|
69
107
|
readPoint: '$.readPoint',
|
|
70
108
|
bizLocation: '$.bizLocation'
|
|
71
109
|
}
|
|
@@ -74,6 +112,23 @@ const TWIN_INGEST_RULES = [
|
|
|
74
112
|
/** ì ê· ë ìœë[] â ê²ìŠë CanonicalEnvelope[] (+ ê±°ë¶ë¶). ìì íšì. ëšìŒâê°ì²Žë ë°°ìŽë¡ ì ê·í. */
|
|
75
113
|
function ingestCanonicalRecords(records, tenantId, defaultEventTime) {
|
|
76
114
|
const arr = Array.isArray(records) ? records : records ? [records] : [];
|
|
115
|
+
/*
|
|
116
|
+
* ââ **ë€ì¯ì§ž ìŽíë ì¬ê±ŽìŽ ìëë€** (2026-08-28) ââââââââââââââââââââââââââââ
|
|
117
|
+
*
|
|
118
|
+
* ë§ì€í°ë°ìŽí° â ë³íì§ ìë ìì±(ì íµêž°í·ë¡ížë²ížÂ·ì늬ì ì±ì§). íì€ì ìŽê²ì ì¬ê±ŽìŽ ìëëŒ
|
|
119
|
+
* **ìŽí ììì ìì±**ìŒë¡ ëŽê³ , 컀ëì ê·ž ìëŠ¬ê° ììŽì ì§êžê¹ì§ ì¬ê±Žì ì€ë € ìë€.
|
|
120
|
+
*
|
|
121
|
+
* ê·ž ê²°ê³Œê° ì ì
ìì ìŽë ê² ë¬ë€. ì ëì ìœë ìë³žìŽ ì íµêž°íì ì€ìŒë €ê³ **ë€ìŽì€ì§ ìì ê²ì
|
|
122
|
+
* `ADD`** ëŒê³ ë§íê³ , `ilmd` ê° ì¬ê±Ž ëšìëŒ ì늬ë³ë¡ 묶ì ìë ììŽ ë±ê°ë¡ ëê°ë€ â ì¬êž°ë í ë²ì
|
|
123
|
+
* 2,665걎ìŽë€.
|
|
124
|
+
*
|
|
125
|
+
* ê·žëì ì¬êž°ì ê°ëŒ ëžë€. ìŽê²ì ëŽí¬ê° ëì§ ìê³ ì ëìë ì íì§ ìëë€(ìê°ì¶ìŽ ìë ê°ìŽë€).
|
|
126
|
+
* ê°ë íì ì 컀ëì ê²ì ë¶ë¥žë€ â ë€ë¥ž ë·ê³Œ ê°ì ê·ìšìŽë€.
|
|
127
|
+
*
|
|
128
|
+
* ì€ê³: `operato-twin/design/plans/master-data.md`
|
|
129
|
+
*/
|
|
130
|
+
const masterCandidates = arr.filter(twin_kernel_1.isMasterDataRecord);
|
|
131
|
+
const master = masterCandidates.length ? (0, twin_kernel_1.ingestMasterData)(masterCandidates) : { accepted: [], rejected: [] };
|
|
77
132
|
/*
|
|
78
133
|
* **ìŽíê° ë·ìŽë€** â 묌ë¥(EPCIS)·ìëì§ ê³ë·ì€ë¹ ìëì§Â·ìŽì ì¬ì€. ìì ìë ìŽ íšìê° ë¬Žì¡°ê±Ž
|
|
79
134
|
* `ObjectEvent` 륌 ë§ë€ìê³ , ê·žëì ê³ìž¡ì ìŽ êžžë¡ ë£ìŒë©Ž `epc` ê° ììŽ ê±°ë¶ëê±°ë(ê·žëë§ ëì 쪜)
|
|
@@ -85,21 +140,69 @@ function ingestCanonicalRecords(records, tenantId, defaultEventTime) {
|
|
|
85
140
|
* ìë¹ì²ë§ë€ ëµìŽ ë¬ëŒì§ë€. ëŽí¬ë ê°ì ê²ì ì°ë¯ë¡ ìë ìë¹ì²(믞ë¬Â·ì ë·ëžë¡ëìºì€í
)ë ìŽ ê°ëŠŒì ì
|
|
86
141
|
* íìê° ìë€.
|
|
87
142
|
*/
|
|
88
|
-
|
|
143
|
+
/*
|
|
144
|
+
* ì¬ì¯ì§žÂ·ìŒê³±ì§ž ìŽí â **ë§ê°ë ì¬ì© 구ê°**곌 **ì²êµ¬ì**. 컀ë 0.7.72 ê° ìŽ ë¬žë€ì ìŽìë€.
|
|
145
|
+
*
|
|
146
|
+
* ââ â
ì¬ì© 구ê°ì ê³ëë³Žë€ **뚌ì ** ê°ë¥žë€ âââââââââââââââââââââââââââââââââ
|
|
147
|
+
* `isEnergyRecord` ë `meterId` ê° ììŒë©Ž ì°žìŽë¯ë¡ ì¬ì© 구ê°ìë ì°žìŽë€. ìì륌 ì íì§ ììŒë©Ž
|
|
148
|
+
* ìê°ë³ ì¬ì©ëìŽ ê³ë í볞ìŒë¡ ë€ìŽê°ê³ , ê·ž 묞ì `kWh` 륌 **ì ì° ë ì§ì€í°**ë¡ ìœëë€. ê·žë¬ë©Ž
|
|
149
|
+
* 컀ëìŽ êµ¬ê° ì ë ¥ëì ì°šë¶ìŒë¡ 구íëë° ì°ëŠ¬ê° ë£ì ê°ìŽ ìŽë¯ž 구ê°ì ììŽë€ â ì°šë¶ì ì°šë¶ìŽ ëìŽ
|
|
150
|
+
* ê°ìŽ ì¡°ì©í í늰ë€. ê±°ë¶ëì§ë ìëë€.
|
|
151
|
+
*/
|
|
152
|
+
const usagePeriods = arr.filter(twin_kernel_1.isEnergyUsagePeriodRecord);
|
|
153
|
+
const bills = arr.filter(twin_kernel_1.isEnergyBillRecord);
|
|
154
|
+
const energy = arr.filter(r => (0, twin_kernel_1.isEnergyRecord)(r) && !(0, twin_kernel_1.isEnergyUsagePeriodRecord)(r));
|
|
89
155
|
/* ìž ë²ì§ž ìŽí â ì€ë¹ê° ëž ìêž° ìëì§ ìí(ë°ì ·ì ì¥Â·ê°ì¶ ì¬ì§Â·ê°í ìì¹). ê³ë곌 ê°ëŒ ëë
|
|
90
156
|
ìŽì ë 컀ëì ì í ìë€: ê³ëì 구ê°ì ëì ëê³ , ìŽê²ë€ì ê·ž ì€ë¹ì ì§êžìŽë€. */
|
|
91
|
-
|
|
157
|
+
/*
|
|
158
|
+
* ë€ì¯ ë²ì§ž ìŽí â **ë°ì ì ì°**(ì€ë¹ê° ì§êžê¹ì§ ë§ë ì). 컀ë 0.7.69 ê° ìŽ ë¬žì ìŽìë€.
|
|
159
|
+
*
|
|
160
|
+
* ââ â
ì€ë¹ ìíë³Žë€ **뚌ì ** ê°ë¥žë€ ââââââââââââââââââââââââââââââââââââââââââ
|
|
161
|
+
* ë íì ìŽ ê²¹ì¹ë€. `isEnergyEquipmentRecord` ë `equipmentId` ê° ìê³ ë¬Œë¥Â·ê³ë ìŽíê° ìë멎
|
|
162
|
+
* ì°žìŽë¯ë¡ ë°ì ì ì°ë íšê» ì°žìŽë€. ê·žëì ììê° ê°ëŠŒì ì íë€.
|
|
163
|
+
*
|
|
164
|
+
* ìì륌 ì못 ë멎 ì¡°ì©í ì¬ëŒì§ë ê²ìŽ ìëëŒ **ìë±í ìŽì ë¡ ê±°ë¶ëë€**: ì€ë¹ ìí 묞ì ì ì°ì
|
|
165
|
+
* ê°ìŒë¡ ìžì§ ìì ãë°ê¿ ìíê° íëë ìë€ãë¡ ëë €ë³Žëžë€. 컀ë¥í°ë 볎ëë€ê³ ë¯¿ê³ , í멎ìë
|
|
166
|
+
* ë°ì ëìŽ ìë€.
|
|
167
|
+
*/
|
|
168
|
+
const energyGeneration = arr.filter(twin_kernel_1.isEnergyGenerationRecord);
|
|
169
|
+
const energyEquipment = arr.filter(r => (0, twin_kernel_1.isEnergyEquipmentRecord)(r) && !(0, twin_kernel_1.isEnergyGenerationRecord)(r));
|
|
92
170
|
/*
|
|
93
171
|
* ë€ ë²ì§ž ìŽí â **ìŽì ì¬ì€**(ìì
·ì€ë¹Â·ì¬ë·ìì°Â·ì€ë·íì§). êŽìž¡ 늬ëìë ìŽê²ì ì€ëì ë¶í°
|
|
94
|
-
*
|
|
172
|
+
* ê³ì°íëë° **ë€ìŽì¬ ë¬žìŽ ììë€**: ìë³žìŽ ãìŽ ìì
ìŽ ëë¬ë€ã륌 ë§í êžžìŽ ììŽ ì뮬 컀ëë§ ê·žê²ì
|
|
95
173
|
* ìë ìíê° ëšìë€(ê°ì íë©ŽìŽ ë 구ëìì ë€ë¥ž ê²ì ë§íë€).
|
|
96
174
|
*/
|
|
97
175
|
const operational = arr.filter(twin_kernel_1.isOperationalRecord);
|
|
98
|
-
const epcis = arr.filter(r => !(0, twin_kernel_1.isEnergyRecord)(r) &&
|
|
176
|
+
const epcis = arr.filter(r => !(0, twin_kernel_1.isEnergyRecord)(r) &&
|
|
177
|
+
!(0, twin_kernel_1.isEnergyEquipmentRecord)(r) &&
|
|
178
|
+
!(0, twin_kernel_1.isEnergyGenerationRecord)(r) &&
|
|
179
|
+
!(0, twin_kernel_1.isEnergyUsagePeriodRecord)(r) &&
|
|
180
|
+
!(0, twin_kernel_1.isEnergyBillRecord)(r) &&
|
|
181
|
+
!(0, twin_kernel_1.isOperationalRecord)(r) &&
|
|
182
|
+
!(0, twin_kernel_1.isMasterDataRecord)(r));
|
|
99
183
|
/* í목 ìŽí ìììë ê°ëŠŒìŽ ìë€(ê°ì²Ž êŽìž¡ / ëŽê¹) â ê·ž íì ë 컀ëì ê²ì ë¶ë¥žë€. */
|
|
100
184
|
const epcisResult = epcis.length
|
|
101
185
|
? (0, twin_kernel_1.ingest)(epcis.map(r => ({
|
|
102
186
|
...r,
|
|
187
|
+
/*
|
|
188
|
+
* ââ **ìê°ì ìŽëŠì ë í¡ìíë€** (2026-08-24 ì€ìž¡) ââââââââââââââââââââ
|
|
189
|
+
* `eventTimePath` ë **í ìŽëŠ**ë§ ë°ëë€. ížì€ížê° `'eventTime'` ìŒë¡ 못ë°ì ëìëë°, ë€ì
|
|
190
|
+
* ìꞎ 컀ë¥í°ë `at` ì ì£ëë€(ìëì§ ì±ëìŽ ìŽë¯ž `at` ì ì°ê³ ììŽ ê·ž ìŽí륌 ë°ëë€).
|
|
191
|
+
* ê·žëì ê·ž 컀ë¥í°ì ì¬ê±Žì **ì ë¶ íŽë§ ìê°**ìŒë¡ ì°íë€ â ì ë 18,150ê±ŽìŽ ê·žë¬ë€.
|
|
192
|
+
*
|
|
193
|
+
* ê·ž 결곌 ëìŽ íšê» ë§ê°ì¡ë€: ì¬ê³ êŽìž¡ìŽ ížìì ìê³ë¥Œ ë°ì§ ëª»íŽ ìê³ê° `task.status` ì
|
|
194
|
+
* ìµëê°(2026-04-15)ì **ë©ì¶° ììê³ **, ìŽë ì¬ê±Žìì ãìžì ãê° ì¬ëŒì ž ììë§ ëšìë€.
|
|
195
|
+
*
|
|
196
|
+
* ìŽëŠì íëë¡ ê°ìíì§ ìê³ í¡ìíë€ â `orderId`·`resourceRef`·`equipmentId` 륌 íšê» 볎ë
|
|
197
|
+
* ê²ê³Œ ê°ì ê·ìšìŽë€(§`twin-event-keys`). ìžëê° ììŽë ê²ì ìŽ ìŽììì ì±ì§ìŽë€.
|
|
198
|
+
*
|
|
199
|
+
* **ììŒë©Ž ë§ë€ì§ ìëë€**: ì ëê° ì€ë
ì· êŽìž¡ì ì볞ì ê°±ì ìê°ìŽ ìëëŒ **íŽë§ ìê°**ìŽ
|
|
200
|
+
* ë§ë êŽìž¡ ìê°ìŽë€(ãìŽì ê°ì ì€ë 뎀ë€ãë ãìŽì ìŒìŽë¬ë€ãê° ìëë€). ê°ì ë§íë
|
|
201
|
+
* ë ìœëë§ ìêž° ìê°ì ê°ëë€.
|
|
202
|
+
*/
|
|
203
|
+
...((r.eventTime ?? r.at) !== undefined
|
|
204
|
+
? { eventTime: r.eventTime ?? r.at }
|
|
205
|
+
: {}),
|
|
103
206
|
/* íì ì 컀ëìŽ í ê³³ìì íë€ â ì¬êž°ì ë€ì ì§ìí멎 ìë¹ì²ë§ë€ ëµìŽ ë¬ëŒì§ë€. */
|
|
104
207
|
sourceType: (0, twin_kernel_1.isTransformationRecord)(r)
|
|
105
208
|
? 'twin-transformation'
|
|
@@ -111,14 +214,14 @@ function ingestCanonicalRecords(records, tenantId, defaultEventTime) {
|
|
|
111
214
|
* **ë ìœëê° ìê°ì ë§í멎 ê·žê²ì ìŽë€** (2026-08-23).
|
|
112
215
|
*
|
|
113
216
|
* `eventTimePath` 륌 ì£Œì§ ìë ëì ìŽ ê²œë¡ë **ìžì ë íŽë§ ìê°**ì ìŒë€(`defaultEventTime`).
|
|
114
|
-
* ê·žëì 컀ë¥í°ê° ìŽë¯ž ì£ê³ ìë `eventTime`(ë³í ë ìœëì `finishedAt` ë±)ìŽ
|
|
217
|
+
* ê·žëì 컀ë¥í°ê° ìŽë¯ž ì£ê³ ìë `eventTime`(ë³í ë ìœëì `finishedAt` ë±)ìŽ **ìëŠ¬ì§ ìê³
|
|
115
218
|
* 묎ìëë€** â 컀ë¥í°ë¥Œ ë¶ìž 쪜ì ê·žê²ìŽ ëš¹ëë€ê³ ë¯¿ê³ ììê³ , ìŽëìë ì€ë¥ê° ëì§ ììë€.
|
|
116
219
|
*
|
|
117
220
|
* 묎ììŽ ê±žë žë: ê³ë³Ž(ë³í)ì ìê°ìŽë€. 4ìì ë§ë ë¡ížê° 8ìì ë§ë€ìŽì§ ê²ìŒë¡ ì ëì ëšìë€.
|
|
118
221
|
* ê·žëŠ¬ê³ ì€ìž¡ ìì륌 ì¬ë íŽëê° ëŽí¬ ìê°ì ì°ë¯ë¡(§`kpi-fold`: `workMs = ìë£ â 첫 ì°©ì`),
|
|
119
222
|
* íŽë§ ê°ê²©ì ìì
ìê°ìŒë¡ ë°°ìž ì ììë€ â 못 ë°°ì°ë ê²ë³Žë€ ëìë€.
|
|
120
223
|
*
|
|
121
|
-
* ë ìœëì `eventTime` ìŽ ììŒë©Ž 컀ëìŽ
|
|
224
|
+
* ë ìœëì `eventTime` ìŽ ììŒë©Ž 컀ëìŽ ìëŠ¬ì§ ìê³ êž°ë³žê°ìŒë¡ ëšìŽì§ë€(§`resolve` â ìë ê°ì
|
|
122
225
|
* ì€ë¥ê° ìëë€). ê·žëì ìŽ í ì€ìŽ êž°ì¡Ž 겜ë¡ë¥Œ ë§ì§ ìëë€: ìê°ì ë§íë ë ìœëë§ ì¬ì€ìŽ ëë€.
|
|
123
226
|
*/
|
|
124
227
|
{ tenantId, defaultEventTime, eventTimePath: 'eventTime' })
|
|
@@ -127,13 +230,39 @@ function ingestCanonicalRecords(records, tenantId, defaultEventTime) {
|
|
|
127
230
|
const equipmentResult = energyEquipment.length
|
|
128
231
|
? (0, twin_kernel_1.ingestEnergyEquipmentRecords)(energyEquipment, { tenantId, defaultEventTime })
|
|
129
232
|
: { accepted: [], rejected: [] };
|
|
233
|
+
const usageResult = usagePeriods.length
|
|
234
|
+
? (0, twin_kernel_1.ingestEnergyUsagePeriodRecords)(usagePeriods, { tenantId, defaultEventTime })
|
|
235
|
+
: { accepted: [], rejected: [] };
|
|
236
|
+
const billResult = bills.length ? (0, twin_kernel_1.ingestEnergyBillRecords)(bills, { tenantId, defaultEventTime }) : { accepted: [], rejected: [] };
|
|
237
|
+
const generationResult = energyGeneration.length
|
|
238
|
+
? (0, twin_kernel_1.ingestEnergyGenerationRecords)(energyGeneration, { tenantId, defaultEventTime })
|
|
239
|
+
: { accepted: [], rejected: [] };
|
|
130
240
|
const operationalResult = operational.length
|
|
131
241
|
? (0, twin_kernel_1.ingestOperationalRecords)(operational, { tenantId, defaultEventTime })
|
|
132
242
|
: { accepted: [], rejected: [] };
|
|
133
243
|
/* ê±°ë¶ë¶ì í©ì³ ëë €ì€ë€ â ìŽë ìŽíìì ê±°ë¶ëëì§ë ìŽì ë¬žêµ¬ê° ë§íë€. */
|
|
134
244
|
return {
|
|
135
|
-
accepted: [
|
|
136
|
-
|
|
245
|
+
accepted: [
|
|
246
|
+
...epcisResult.accepted,
|
|
247
|
+
...energyResult.accepted,
|
|
248
|
+
...equipmentResult.accepted,
|
|
249
|
+
...generationResult.accepted,
|
|
250
|
+
...usageResult.accepted,
|
|
251
|
+
...billResult.accepted,
|
|
252
|
+
...operationalResult.accepted
|
|
253
|
+
],
|
|
254
|
+
rejected: [
|
|
255
|
+
...epcisResult.rejected,
|
|
256
|
+
...energyResult.rejected,
|
|
257
|
+
...equipmentResult.rejected,
|
|
258
|
+
...generationResult.rejected,
|
|
259
|
+
...usageResult.rejected,
|
|
260
|
+
...billResult.rejected,
|
|
261
|
+
...operationalResult.rejected,
|
|
262
|
+
...master.rejected
|
|
263
|
+
],
|
|
264
|
+
/* ì¬ê±ŽìŽ ìë ê²ì ë°ë¡ ëžë€ â ë¶ë¥Žë ìªœìŽ ìí ìžì°ë 묞ìŒë¡ 볎ëžë€(ì ëë¡ ê°ì§ ìê²). */
|
|
265
|
+
masterData: master.accepted
|
|
137
266
|
};
|
|
138
267
|
}
|
|
139
268
|
//# sourceMappingURL=canonical-ingest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-ingest.js","sourceRoot":"","sources":["../../server/engine/canonical-ingest.ts"],"names":[],"mappings":"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","sourcesContent":["import { ingest, ingestEnergyRecords, ingestEnergyEquipmentRecords, ingestOperationalRecords, isAggregationRecord, isTransformationRecord,\n isEnergyRecord, isEnergyEquipmentRecord, isOperationalRecord, type AdapterRule, type EnergyRecord,\n type EnergyEquipmentRecord, type OperationalRecord, type IngestResult } from '@operato/twin-kernel'\n\n/*\n * ì ê· ë ìœë â 컀ë ê²ìŠ ACL â CanonicalEnvelope (P1 seam ìœìŽ).\n * ìì(컀ëë§ ì졎; shell·integration-base 묎ì졎 â node:test ê²ìŠ ê°ë¥).\n * ë§€í(ë ê±°ì ì€í€ë§ â ì ê·)ì ìŽ ì ëšê³(jsonata step ëë 컀ë¥í° openLiveFeed)ê° ëëžë€.\n * ì¬êž° ëì°©íë ë ìœëë ìŽë¯ž ì ê· íëë€ â ìŽíë§ë€ ìêž° íë ìŽëŠìŽ ê³ìœìŽë€:\n * EPCIS í목 { epc, action, bizStep, disposition?, readPoint?, bizLocation? }\n * ìëì§ ê³ë { meterId, kW?, kWh?, ⊠} · ì€ë¹ ìëì§ { equipmentId, generatedKW?, soc?, ⊠}\n * ëŽê¹(ì ì¬) { parentID, childEPCs[] | childQuantityList[], action, bizStep, ⊠}\n * ìŽì ì¬ì€ { taskId | moverId | personId | assetId | orderId, status, ⊠} // vocabulary-guard: allow ì ë ììŽìŽ íë\n * 컀ëì objectEvent êµ¬ì± + EPCIS ê²ìŠ(ìë°=ì€ìŒ ì°šëš) + ëŽí¬ ëíë§(ë°©ìž ìì).\n *\n * ë ìë¹ì²ê° ìŽ ëšìŒ ìœìŽë¥Œ ê³µì (ì€ë³µ êžì§):\n * - sim/scenario 겜ë¡: operato-twin twin-ingest íì€í¬(http-getâjsonataâì¬êž°).\n * - live 컀ë¥í° 겜ë¡: reference-live(ìŽëí° openLiveFeedâì¬êž°).\n * SoT: design/integration/face2-adapters.md §5(seam)·§7(ë§€í=ë°, ê²ìŠ=컀ë).\n */\n\n/** ê³ ì ì ê· ë§€í(ë°©ìž ìë â íëëª
ìì²Žê° ì ê· ê³ìœ). `sourceType` ìŒë¡ ìŽë í목 ì¬ì€ìžì§ ê³ ë¥žë€. */\nconst TWIN_INGEST_RULES: AdapterRule[] = [\n {\n sourceType: 'twin',\n mapping: {\n type: 'ObjectEvent',\n action: '$.action',\n bizStep: '$.bizStep',\n disposition: '$.disposition',\n epc: '$.epc',\n /* ë¹ì§ë ¬ ìë â ê°ì²Ž ììŽ ãìŽ ì늬ì ìŽ íëª©ìŽ ìŒë§ ëšìë€ãë§ ì€ë êŽìž¡ìŽ ìë€. */\n quantityList: '$.quantityList',\n readPoint: '$.readPoint',\n bizLocation: '$.bizLocation'\n }\n },\n {\n /* **ë³íì ì¬ì€** â 묎ììŒë¡ 묎ììŽ ëìë. ìŽëŠì íì€ì ê²ì ê·žëë¡ ìŽë€(ê°ë íì ìŽ ê·ž ìŽëŠì 볞ë€). */\n sourceType: 'twin-transformation',\n mapping: {\n type: 'TransformationEvent',\n bizStep: '$.bizStep',\n disposition: '$.disposition',\n inputEPCList: '$.inputEPCList',\n inputQuantityList: '$.inputQuantityList',\n outputEPCList: '$.outputEPCList',\n outputQuantityList: '$.outputQuantityList',\n transformationID: '$.transformationID',\n readPoint: '$.readPoint',\n bizLocation: '$.bizLocation'\n }\n },\n {\n /*\n * **ëŽê¹ì ì¬ì€** â 묎ììŽ ë¬Žìì ì€ë žë(íë ížÂ·ìì). ì€ë ë¹ìŽ ìë ì늬ë€: êŽìž¡ 늬ëìë ìŽ ì¬ì€ì\n * ë°ìŒë©Ž ìì 묌íì `parent` 륌 ë¶ìŽëë°, ë¬žìŽ `ObjectEvent` íëë§ ììì ì볞ì ì ì¬ë¥Œ ë§í êžžìŽ\n * ììë€(ì뮬 ì볞ì ë¶ì¬ ëë € ë³Žê³ ììŒ ë¡ê·žë¡ ëë¬ë¬ë€).\n */\n sourceType: 'twin-aggregation',\n mapping: {\n type: 'AggregationEvent',\n action: '$.action',\n bizStep: '$.bizStep',\n disposition: '$.disposition',\n parentID: '$.parentID',\n childEPCs: '$.childEPCs',\n /* ë±ê° ìë³ì ììŽ **ìëìŒë¡** ëŽêžŽ ìì(ãìŽ íë² 40ê°ã) â ì
ê³ Â·í¬ì¥ìŽ ìŽ ëªšììŒë¡ ìšë€. */\n childQuantityList: '$.childQuantityList',\n readPoint: '$.readPoint',\n bizLocation: '$.bizLocation'\n }\n }\n]\n\n/** ê°ì²Ž êŽìž¡ â 묌걎 íëê° ìŽëì 묎ììŽ ëë. */\nexport interface CanonicalRecord {\n /**\n * ê°ì²Ž íëì ìë³ì. **`quantityList` 륌 ì°ë©Ž ììŽë ëë€** â ë±ê° ë²ížê° ìë ìì¬(ë°ê°ë£š 3.5kg)ë\n * ê°ì²Žê° ìë€. ë ë€ ììŒë©Ž 묎ìì êŽìž¡íëì§ ë§íì§ ìì ê²ìŽë¯ë¡ 컀ë ë§€íìŽ ê±°ë¶íë€.\n */\n epc?: string\n /**\n * íŽëì€ì ìë â `{ epcClass, quantity, uom? }`. **ìë ì ëê°ì ì£ëë€**(ãìŒë§ ëºë€ãê° ìëëŒ\n * ãìŒë§ ëšìë€ã). ê·žëìŒ ì¬ê±Ž íë륌 ëì³ë ë€ì ì¬ê±ŽìŽ ì ëµì ë€ì ë§íŽ ì£Œê³ ì€ì°šê° ììŽì§ ìëë€.\n *\n * ëŽê¹(`childQuantityList`)ìŽ í룚 뚌ì ìŽ ì늬륌 ë°ìë€ â ê·žëì ê°ì ìŽì ë€. ìë³žìŽ ë¹ì§ë ¬ ìëì\n * ë§í êžžìŽ ììŽì, ê·žê²ìŽ ì£Œë 겜ë¡ìž ìì€í
(ìí ì ì¡° MES)ì ëŒìŽëžë¥Œ ëŒ ì ììë€. 컀ëì\n * êŽìž¡ 늬ëìë ì²ìë¶í° ìŽ ê°ì ìœìê³ ë¬žë§ ììë€.\n */\n quantityList?: { epcClass: string; quantity?: number; uom?: string }[]\n action: string // ADD | OBSERVE | DELETE\n bizStep: string\n disposition?: string\n readPoint?: string\n bizLocation?: string\n}\n\n/**\n * ëŽê¹ êŽìž¡ â **ë¶ëªšì ìì**ìŒë¡ ë§íë€. ì늬 íëë ê°ì²Ž êŽìž¡ê³Œ ê°ì ìŽëŠìŽë€(묞ììŽ).\n *\n * ìŽëŠì íì€ì ê²ì ê·žëë¡ ìŽë€(`parentID`·`childEPCs`) â ì¬êž°ì ë€ì ì§ìŒë©Ž ë§€íìŽ ë²ììŽ ëê³ ,\n * ê°ì ì¬ì€ì ë ìŽíê° ìꞎë€.\n */\n/**\n * ë³í êŽìž¡ â **묎ììŒë¡ 묎ììŽ ëìë.** ì
ë ¥ê³Œ ì¶ë ¥ìŽ **í ì¬ì€ì íšê»** ììŽìŒ ê³ë³Žê° ëšëë€.\n *\n * ë°ë¡ 볎ëŽë©Ž(ãìŽ ë¡ížê° ììŽì¡ë€ãì ãìŽ ì íìŽ ì게ë€ã) ê·ž ëì ìŽì ê·Œê±°ê° ìë€. ê·žëì íì€ìŽ\n * í ì¬ê±Žì ëì ëŽê³ , ì°ëЬ ë ìœëë ê°ì 몚ììŽë€.\n *\n * ìŽëŠì **íì€ì ê²ì ê·žëë¡** ìŽë€(`inputQuantityList` ë±). ê°ë íì ìŽ ìŽ ìŽëŠìŒë¡ ìŽë£šìŽì§ë¯ë¡\n * 컀ë¥í° ë±ë§(`consumed`·`produced`)ë¡ ëŽìŒë©Ž íì ëì§ ìëë€ â 컀ë¥í°ê° ì ê· ìŽëŠìŒë¡ ëŽì 볎ëŽê³ \n * ë§€íì ê·ž ììì ê°ì ê³ ë¥žë€.\n *\n * **ìë 쪜ì íë륌 ë§ë€ì§ ìëë€.** ë¹ ë°°ìŽì ì€ìŒë©Ž ãìë€ãê³ ë§íë ê²ìŽ ëë€. ìì€(Nâ0)곌\n * ìì±(0âN)ë íì€ìŽ ìžì íë ë³íìŽë€.\n *\n * `transformationID` ê° í ì€ëì ì¬ë¬ ëšê³ë¥Œ ìëë€ â ìë¹ë¥Œ 뚌ì ìê³ ì°ì¶ì ëì€ì ìê² ëë ì볞ìì\n * ê·ž ëì 묶ë ì ìŒí ì늬ë€.\n */\nexport interface CanonicalTransformationRecord {\n /** ê°ì²Žë¡ ìë¹ë ê². */\n inputEPCList?: string[]\n /** íŽëì€ì ìëìŒë¡ ìë¹ë ê² â ë¡íž ëšì ìë¹ê° ìŽ ì늬ë€. */\n inputQuantityList?: { epcClass: string; quantity?: number; uom?: string }[]\n outputEPCList?: string[]\n outputQuantityList?: { epcClass: string; quantity?: number; uom?: string }[]\n /** í ì€ëì ì¬ë¬ ëšê³ë¥Œ ìë ìë³ì. */\n transformationID?: string\n bizStep: string\n disposition?: string\n readPoint?: string\n bizLocation?: string\n}\n\nexport interface CanonicalAggregationRecord {\n parentID: string\n /** ê°ì²Žë¡ ëŽêžŽ ìì. ìëìŒë¡ë§ ëŽê²ŒìŒë©Ž ìë€(ë ì€ íëë ììŽìŒ íë€). */\n childEPCs?: string[]\n /** ìëìŒë¡ ëŽêžŽ ìì â `{ epcClass, quantity, uom? }`. ê°ì ì³ê³ ê·žëŠì 컀ë ê²ìŠìŽ ë³žë€. */\n childQuantityList?: { epcClass: string; quantity?: number; uom?: string }[]\n action: string // ADD(ëŽë€) | DELETE(íë€) | OBSERVE\n bizStep: string\n disposition?: string\n readPoint?: string\n bizLocation?: string\n}\n\n/** ì ê· ë ìœë[] â ê²ìŠë CanonicalEnvelope[] (+ ê±°ë¶ë¶). ìì íšì. ëšìŒâê°ì²Žë ë°°ìŽë¡ ì ê·í. */\nexport function ingestCanonicalRecords(\n records:\n | CanonicalRecord\n | CanonicalAggregationRecord\n | CanonicalTransformationRecord\n | EnergyRecord\n | EnergyEquipmentRecord\n | OperationalRecord\n | (CanonicalRecord | CanonicalAggregationRecord | CanonicalTransformationRecord | EnergyRecord | EnergyEquipmentRecord | OperationalRecord)[]\n | undefined\n | null,\n tenantId: string,\n defaultEventTime: string\n): IngestResult {\n const arr = Array.isArray(records) ? records : records ? [records] : []\n /*\n * **ìŽíê° ë·ìŽë€** â 묌ë¥(EPCIS)·ìëì§ ê³ë·ì€ë¹ ìëì§Â·ìŽì ì¬ì€. ìì ìë ìŽ íšìê° ë¬Žì¡°ê±Ž\n * `ObjectEvent` 륌 ë§ë€ìê³ , ê·žëì ê³ìž¡ì ìŽ êžžë¡ ë£ìŒë©Ž `epc` ê° ììŽ ê±°ë¶ëê±°ë(ê·žëë§ ëì 쪜)\n * ìë±í 묌í êŽìž¡ìŽ ëë€.\n *\n * ë¬Œë¥ ìŽí ììë 몚ììŽ ëìŽë€(ê°ì²Ž êŽìž¡ `epc` / ëŽê¹ `parentID`+`childEPCs`).\n *\n * íì ì 컀ëìŽ í ê³³ìì íë€(`isEnergyRecord`·`isOperationalRecord`·`isAggregationRecord`) â ì¬êž°ì ë€ì ì§ìí멎\n * ìë¹ì²ë§ë€ ëµìŽ ë¬ëŒì§ë€. ëŽí¬ë ê°ì ê²ì ì°ë¯ë¡ ìë ìë¹ì²(믞ë¬Â·ì ë·ëžë¡ëìºì€í
)ë ìŽ ê°ëŠŒì ì\n * íìê° ìë€.\n */\n const energy = arr.filter(isEnergyRecord) as EnergyRecord[]\n /* ìž ë²ì§ž ìŽí â ì€ë¹ê° ëž ìêž° ìëì§ ìí(ë°ì ·ì ì¥Â·ê°ì¶ ì¬ì§Â·ê°í ìì¹). ê³ë곌 ê°ëŒ ëë\n ìŽì ë 컀ëì ì í ìë€: ê³ëì 구ê°ì ëì ëê³ , ìŽê²ë€ì ê·ž ì€ë¹ì ì§êžìŽë€. */\n const energyEquipment = arr.filter(isEnergyEquipmentRecord) as unknown as EnergyEquipmentRecord[]\n /*\n * ë€ ë²ì§ž ìŽí â **ìŽì ì¬ì€**(ìì
·ì€ë¹Â·ì¬ë·ìì°Â·ì€ë·íì§). êŽìž¡ 늬ëìë ìŽê²ì ì€ëì ë¶í°\n * ì ìëë° **ë€ìŽì¬ ë¬žìŽ ììë€**: ìë³žìŽ ãìŽ ìì
ìŽ ëë¬ë€ã륌 ë§í êžžìŽ ììŽ ì뮬 컀ëë§ ê·žê²ì\n * ìë ìíê° ëšìë€(ê°ì íë©ŽìŽ ë 구ëìì ë€ë¥ž ê²ì ë§íë€).\n */\n const operational = arr.filter(isOperationalRecord) as OperationalRecord[]\n const epcis = arr.filter(r => !isEnergyRecord(r) && !isEnergyEquipmentRecord(r) && !isOperationalRecord(r)) as (CanonicalRecord | CanonicalAggregationRecord | CanonicalTransformationRecord)[]\n\n /* í목 ìŽí ìììë ê°ëŠŒìŽ ìë€(ê°ì²Ž êŽìž¡ / ëŽê¹) â ê·ž íì ë 컀ëì ê²ì ë¶ë¥žë€. */\n const epcisResult = epcis.length\n ? ingest(\n epcis.map(r => ({\n ...r,\n /* íì ì 컀ëìŽ í ê³³ìì íë€ â ì¬êž°ì ë€ì ì§ìí멎 ìë¹ì²ë§ë€ ëµìŽ ë¬ëŒì§ë€. */\n sourceType: isTransformationRecord(r)\n ? 'twin-transformation'\n : isAggregationRecord(r)\n ? 'twin-aggregation'\n : 'twin'\n })),\n TWIN_INGEST_RULES,\n /*\n * **ë ìœëê° ìê°ì ë§í멎 ê·žê²ì ìŽë€** (2026-08-23).\n *\n * `eventTimePath` 륌 ì£Œì§ ìë ëì ìŽ ê²œë¡ë **ìžì ë íŽë§ ìê°**ì ìŒë€(`defaultEventTime`).\n * ê·žëì 컀ë¥í°ê° ìŽë¯ž ì£ê³ ìë `eventTime`(ë³í ë ìœëì `finishedAt` ë±)ìŽ **ì¡°ì©í\n * 묎ìëë€** â 컀ë¥í°ë¥Œ ë¶ìž 쪜ì ê·žê²ìŽ ëš¹ëë€ê³ ë¯¿ê³ ììê³ , ìŽëìë ì€ë¥ê° ëì§ ììë€.\n *\n * 묎ììŽ ê±žë žë: ê³ë³Ž(ë³í)ì ìê°ìŽë€. 4ìì ë§ë ë¡ížê° 8ìì ë§ë€ìŽì§ ê²ìŒë¡ ì ëì ëšìë€.\n * ê·žëŠ¬ê³ ì€ìž¡ ìì륌 ì¬ë íŽëê° ëŽí¬ ìê°ì ì°ë¯ë¡(§`kpi-fold`: `workMs = ìë£ â 첫 ì°©ì`),\n * íŽë§ ê°ê²©ì ìì
ìê°ìŒë¡ ë°°ìž ì ììë€ â 못 ë°°ì°ë ê²ë³Žë€ ëìë€.\n *\n * ë ìœëì `eventTime` ìŽ ììŒë©Ž 컀ëìŽ ì¡°ì©í Ʞ볞ê°ìŒë¡ ëšìŽì§ë€(§`resolve` â ìë ê°ì\n * ì€ë¥ê° ìëë€). ê·žëì ìŽ í ì€ìŽ êž°ì¡Ž 겜ë¡ë¥Œ ë§ì§ ìëë€: ìê°ì ë§íë ë ìœëë§ ì¬ì€ìŽ ëë€.\n */\n { tenantId, defaultEventTime, eventTimePath: 'eventTime' }\n )\n : { accepted: [], rejected: [] }\n const energyResult = energy.length ? ingestEnergyRecords(energy, { tenantId, defaultEventTime }) : { accepted: [], rejected: [] }\n const equipmentResult = energyEquipment.length\n ? ingestEnergyEquipmentRecords(energyEquipment, { tenantId, defaultEventTime })\n : { accepted: [], rejected: [] }\n const operationalResult = operational.length\n ? ingestOperationalRecords(operational, { tenantId, defaultEventTime })\n : { accepted: [], rejected: [] }\n\n /* ê±°ë¶ë¶ì í©ì³ ëë €ì€ë€ â ìŽë ìŽíìì ê±°ë¶ëëì§ë ìŽì ë¬žêµ¬ê° ë§íë€. */\n return {\n accepted: [...epcisResult.accepted, ...energyResult.accepted, ...equipmentResult.accepted, ...operationalResult.accepted],\n rejected: [...epcisResult.rejected, ...energyResult.rejected, ...equipmentResult.rejected, ...operationalResult.rejected]\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"canonical-ingest.js","sourceRoot":"","sources":["../../server/engine/canonical-ingest.ts"],"names":[],"mappings":"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","sourcesContent":["import { ingest, ingestEnergyRecords, ingestEnergyEquipmentRecords, ingestEnergyGenerationRecords,\n ingestEnergyUsagePeriodRecords, ingestEnergyBillRecords, ingestOperationalRecords,\n isAggregationRecord, isTransformationRecord,\n isEnergyRecord, isEnergyEquipmentRecord, isEnergyGenerationRecord, isEnergyUsagePeriodRecord, isEnergyBillRecord,\n isOperationalRecord, type AdapterRule, type EnergyRecord,\n isMasterDataRecord, ingestMasterData,\n type EnergyEquipmentRecord, type EnergyGenerationRecord, type EnergyUsagePeriodRecord, type EnergyBillRecord,\n type OperationalRecord, type IngestResult, type MasterDataRecord } from '@operato/twin-kernel'\n\n/*\n * ì ê· ë ìœë â 컀ë ê²ìŠ ACL â CanonicalEnvelope (P1 seam ìœìŽ).\n * ìì(컀ëë§ ì졎; shell·integration-base 묎ì졎 â node:test ê²ìŠ ê°ë¥).\n * ë§€í(ë ê±°ì ì€í€ë§ â ì ê·)ì ìŽ ì ëšê³(jsonata step ëë 컀ë¥í° openLiveFeed)ê° ëëžë€.\n * ì¬êž° ëì°©íë ë ìœëë ìŽë¯ž ì ê· íëë€ â ìŽíë§ë€ ìêž° íë ìŽëŠìŽ ê³ìœìŽë€:\n * EPCIS í목 { epc, action, bizStep, disposition?, readPoint?, bizLocation? }\n * ìëì§ ê³ë { meterId, kW?, kWh?, ⊠} · ì€ë¹ ìëì§ { equipmentId, generatedKW?, soc?, ⊠}\n * ë°ì ì ì° { equipmentId, kWh, kWhSince?, ⊠}\n * ì¬ì© êµ¬ê° { meterId, from, to, kWh, unitPrice?, basis?, ⊠} · ì²êµ¬ì { from, to, total?, ⊠}\n * ëŽê¹(ì ì¬) { parentID, childEPCs[] | childQuantityList[], action, bizStep, ⊠}\n * ìŽì ì¬ì€ { taskId | moverId | personId | assetId | orderId, status, ⊠} // vocabulary-guard: allow ì ë ììŽìŽ íë\n * 컀ëì objectEvent êµ¬ì± + EPCIS ê²ìŠ(ìë°=ì€ìŒ ì°šëš) + ëŽí¬ ëíë§(ë°©ìž ìì).\n *\n * ë ìë¹ì²ê° ìŽ ëšìŒ ìœìŽë¥Œ ê³µì (ì€ë³µ êžì§):\n * - sim/scenario 겜ë¡: operato-twin twin-ingest íì€í¬(http-getâjsonataâì¬êž°).\n * - live 컀ë¥í° 겜ë¡: reference-live(ìŽëí° openLiveFeedâì¬êž°).\n * SoT: design/integration/face2-adapters.md §5(seam)·§7(ë§€í=ë°, ê²ìŠ=컀ë).\n */\n\n/** ê³ ì ì ê· ë§€í(ë°©ìž ìë â íëëª
ìì²Žê° ì ê· ê³ìœ). `sourceType` ìŒë¡ ìŽë í목 ì¬ì€ìžì§ ê³ ë¥žë€. */\nconst TWIN_INGEST_RULES: AdapterRule[] = [\n {\n sourceType: 'twin',\n mapping: {\n type: 'ObjectEvent',\n action: '$.action',\n bizStep: '$.bizStep',\n disposition: '$.disposition',\n epc: '$.epc',\n /* ë¹ì§ë ¬ ìë â ê°ì²Ž ììŽ ãìŽ ì늬ì ìŽ íëª©ìŽ ìŒë§ ëšìë€ãë§ ì€ë êŽìž¡ìŽ ìë€. */\n quantityList: '$.quantityList',\n /*\n * **ê°ì²ŽÂ·ë¡ížì ë§ì€í°ë°ìŽí°**(ë¡íž ë²ížÂ·ìë¹êž°í ë±) â 컀ë 0.7.58 ìì ìŽ ìëŠ¬ê° ìŽë žë€.\n *\n * ì€ìž¡(í¬ì²): ì볞 ì¬ê³ 1,704í **ì ë¶**ì ìë¹êž°íìŽ ìëë° í¬ìë ìíìë **0걎**ìŽìë€. ì§ë\n * ì¬ê³ 950걎·59,785kg ìŽ ìŽëìë ëíëì§ ììê³ , ë¹ íë©ŽìŽ ãìŽì ììãìŒë¡ ìœíë€.\n *\n * â
**íì€ìŽ `action: 'ADD'` ìŒ ëë§ íì©íë€**(ëë ë³í). ë§ì€í°ë°ìŽí°ë ë¡ížê° **ìêžž ë**\n * ë§íë ì¬ì€ìŽê³ , 죌Ʞ êŽìž¡ë§ë€ ì€ìŒë©Ž 컀ëìŽ ê±°ë¶íë€ â ìëŠ¬ì§ ìê³ íµê³Œìí€ì§ ìë ê²ìŽ ì³ë€\n * (컀ë¥í°ê° 첫 목격ì `ADD`, ê·ž ë€ë¡ `OBSERVE` 륌 ëŽìŒ íë€).\n */\n ilmd: '$.ilmd',\n /*\n * **ì ì ì ìž** â ãìŽ ì¬ê±Žì ìë ìŒìŽ ëìë€ã(컀ë 0.7.65 ìì ìŽ ìëŠ¬ê° ìŽë žë€).\n *\n * ìž ê°ìŽ íšê»ì¬ìŒ ë»ìŽ ììŽ ë¬¶ììŒë¡ ìšë€. 컀ëìŽ ì ìž ìê°ì ì구íê³ , ììŒë©Ž ì¬ê±Ž ìê°ìŒë¡\n * ë©ì°ì§ ìê³ ìŽì ì íšê» ëë €ì€ë€ â ãìžì ì ì íëãì ãìžì ìŒìŽë¬ëãê° ê°ìì§ë©Ž ëì ë€ì\n * ê°ëŒëŒ ì ìë€.\n *\n * ìíë ìŽê²ìŒë¡ íë€ëŠ¬ì§ ìëë€. 컀ëì ì ì ì 목ë¡ì ì ê³ ì¬ê³ 륌 ê·žëë¡ ëë€ â 묎ìì ìŽë»ê²\n * ëë늎ì§ë ëë©ìž íëšìŽê³ , ì°ž ì¬ê³ ë ê·ž ë€ì ìë êŽìž¡ìŽ ë€ì ë§íŽ ì€ë€.\n */\n errorDeclaration: {\n declarationTime: '$.errorDeclaration.declarationTime',\n reason: '$.errorDeclaration.reason',\n correctiveEventIDs: '$.errorDeclaration.correctiveEventIDs'\n },\n readPoint: '$.readPoint',\n bizLocation: '$.bizLocation'\n }\n },\n {\n /* **ë³íì ì¬ì€** â 묎ììŒë¡ 묎ììŽ ëìë. ìŽëŠì íì€ì ê²ì ê·žëë¡ ìŽë€(ê°ë íì ìŽ ê·ž ìŽëŠì 볞ë€). */\n sourceType: 'twin-transformation',\n mapping: {\n type: 'TransformationEvent',\n bizStep: '$.bizStep',\n disposition: '$.disposition',\n inputEPCList: '$.inputEPCList',\n inputQuantityList: '$.inputQuantityList',\n outputEPCList: '$.outputEPCList',\n outputQuantityList: '$.outputQuantityList',\n transformationID: '$.transformationID',\n errorDeclaration: {\n declarationTime: '$.errorDeclaration.declarationTime',\n reason: '$.errorDeclaration.reason',\n correctiveEventIDs: '$.errorDeclaration.correctiveEventIDs'\n },\n readPoint: '$.readPoint',\n bizLocation: '$.bizLocation'\n }\n },\n {\n /*\n * **ëŽê¹ì ì¬ì€** â 묎ììŽ ë¬Žìì ì€ë žë(íë ížÂ·ìì). ì€ë ë¹ìŽ ìë ì늬ë€: êŽìž¡ 늬ëìë ìŽ ì¬ì€ì\n * ë°ìŒë©Ž ìì 묌íì `parent` 륌 ë¶ìŽëë°, ë¬žìŽ `ObjectEvent` íëë§ ììì ì볞ì ì ì¬ë¥Œ ë§í êžžìŽ\n * ììë€(ì뮬 ì볞ì ë¶ì¬ ëë € ë³Žê³ ììŒ ë¡ê·žë¡ ëë¬ë¬ë€).\n */\n sourceType: 'twin-aggregation',\n mapping: {\n type: 'AggregationEvent',\n action: '$.action',\n bizStep: '$.bizStep',\n disposition: '$.disposition',\n parentID: '$.parentID',\n childEPCs: '$.childEPCs',\n /* ë±ê° ìë³ì ììŽ **ìëìŒë¡** ëŽêžŽ ìì(ãìŽ íë² 40ê°ã) â ì
ê³ Â·í¬ì¥ìŽ ìŽ ëªšììŒë¡ ìšë€. */\n childQuantityList: '$.childQuantityList',\n errorDeclaration: {\n declarationTime: '$.errorDeclaration.declarationTime',\n reason: '$.errorDeclaration.reason',\n correctiveEventIDs: '$.errorDeclaration.correctiveEventIDs'\n },\n readPoint: '$.readPoint',\n bizLocation: '$.bizLocation'\n }\n }\n]\n\n/** ê°ì²Ž êŽìž¡ â 묌걎 íëê° ìŽëì 묎ììŽ ëë. */\nexport interface CanonicalRecord {\n /**\n * ê°ì²Ž íëì ìë³ì. **`quantityList` 륌 ì°ë©Ž ììŽë ëë€** â ë±ê° ë²ížê° ìë ìì¬(ë°ê°ë£š 3.5kg)ë\n * ê°ì²Žê° ìë€. ë ë€ ììŒë©Ž 묎ìì êŽìž¡íëì§ ë§íì§ ìì ê²ìŽë¯ë¡ 컀ë ë§€íìŽ ê±°ë¶íë€.\n */\n epc?: string\n /**\n * íŽëì€ì ìë â `{ epcClass, quantity, uom? }`. **ìë ì ëê°ì ì£ëë€**(ãìŒë§ ëºë€ãê° ìëëŒ\n * ãìŒë§ ëšìë€ã). ê·žëìŒ ì¬ê±Ž íë륌 ëì³ë ë€ì ì¬ê±ŽìŽ ì ëµì ë€ì ë§íŽ ì£Œê³ ì€ì°šê° ììŽì§ ìëë€.\n *\n * ëŽê¹(`childQuantityList`)ìŽ í룚 뚌ì ìŽ ì늬륌 ë°ìë€ â ê·žëì ê°ì ìŽì ë€. ìë³žìŽ ë¹ì§ë ¬ ìëì\n * ë§í êžžìŽ ììŽì, ê·žê²ìŽ ì£Œë 겜ë¡ìž ìì€í
(ìí ì ì¡° MES)ì ëŒìŽëžë¥Œ ëŒ ì ììë€. 컀ëì\n * êŽìž¡ 늬ëìë ì²ìë¶í° ìŽ ê°ì ìœìê³ ë¬žë§ ììë€.\n */\n quantityList?: { epcClass: string; quantity?: number; uom?: string }[]\n action: string // ADD | OBSERVE | DELETE\n bizStep: string\n disposition?: string\n readPoint?: string\n bizLocation?: string\n}\n\n/**\n * ëŽê¹ êŽìž¡ â **ë¶ëªšì ìì**ìŒë¡ ë§íë€. ì늬 íëë ê°ì²Ž êŽìž¡ê³Œ ê°ì ìŽëŠìŽë€(묞ììŽ).\n *\n * ìŽëŠì íì€ì ê²ì ê·žëë¡ ìŽë€(`parentID`·`childEPCs`) â ì¬êž°ì ë€ì ì§ìŒë©Ž ë§€íìŽ ë²ììŽ ëê³ ,\n * ê°ì ì¬ì€ì ë ìŽíê° ìꞎë€.\n */\n/**\n * ë³í êŽìž¡ â **묎ììŒë¡ 묎ììŽ ëìë.** ì
ë ¥ê³Œ ì¶ë ¥ìŽ **í ì¬ì€ì íšê»** ììŽìŒ ê³ë³Žê° ëšëë€.\n *\n * ë°ë¡ 볎ëŽë©Ž(ãìŽ ë¡ížê° ììŽì¡ë€ãì ãìŽ ì íìŽ ì게ë€ã) ê·ž ëì ìŽì ê·Œê±°ê° ìë€. ê·žëì íì€ìŽ\n * í ì¬ê±Žì ëì ëŽê³ , ì°ëЬ ë ìœëë ê°ì 몚ììŽë€.\n *\n * ìŽëŠì **íì€ì ê²ì ê·žëë¡** ìŽë€(`inputQuantityList` ë±). ê°ë íì ìŽ ìŽ ìŽëŠìŒë¡ ìŽë£šìŽì§ë¯ë¡\n * 컀ë¥í° ë±ë§(`consumed`·`produced`)ë¡ ëŽìŒë©Ž íì ëì§ ìëë€ â 컀ë¥í°ê° ì ê· ìŽëŠìŒë¡ ëŽì 볎ëŽê³ \n * ë§€íì ê·ž ììì ê°ì ê³ ë¥žë€.\n *\n * **ìë 쪜ì íë륌 ë§ë€ì§ ìëë€.** ë¹ ë°°ìŽì ì€ìŒë©Ž ãìë€ãê³ ë§íë ê²ìŽ ëë€. ìì€(Nâ0)곌\n * ìì±(0âN)ë íì€ìŽ ìžì íë ë³íìŽë€.\n *\n * `transformationID` ê° í ì€ëì ì¬ë¬ ëšê³ë¥Œ ìëë€ â ìë¹ë¥Œ 뚌ì ìê³ ì°ì¶ì ëì€ì ìê² ëë ì볞ìì\n * ê·ž ëì 묶ë ì ìŒí ì늬ë€.\n */\nexport interface CanonicalTransformationRecord {\n /** ê°ì²Žë¡ ìë¹ë ê². */\n inputEPCList?: string[]\n /** íŽëì€ì ìëìŒë¡ ìë¹ë ê² â ë¡íž ëšì ìë¹ê° ìŽ ì늬ë€. */\n inputQuantityList?: { epcClass: string; quantity?: number; uom?: string }[]\n outputEPCList?: string[]\n outputQuantityList?: { epcClass: string; quantity?: number; uom?: string }[]\n /** í ì€ëì ì¬ë¬ ëšê³ë¥Œ ìë ìë³ì. */\n transformationID?: string\n bizStep: string\n disposition?: string\n readPoint?: string\n bizLocation?: string\n}\n\nexport interface CanonicalAggregationRecord {\n parentID: string\n /** ê°ì²Žë¡ ëŽêžŽ ìì. ìëìŒë¡ë§ ëŽê²ŒìŒë©Ž ìë€(ë ì€ íëë ììŽìŒ íë€). */\n childEPCs?: string[]\n /** ìëìŒë¡ ëŽêžŽ ìì â `{ epcClass, quantity, uom? }`. ê°ì ì³ê³ ê·žëŠì 컀ë ê²ìŠìŽ ë³žë€. */\n childQuantityList?: { epcClass: string; quantity?: number; uom?: string }[]\n action: string // ADD(ëŽë€) | DELETE(íë€) | OBSERVE\n bizStep: string\n disposition?: string\n readPoint?: string\n bizLocation?: string\n}\n\n/** ì ê· ë ìœë[] â ê²ìŠë CanonicalEnvelope[] (+ ê±°ë¶ë¶). ìì íšì. ëšìŒâê°ì²Žë ë°°ìŽë¡ ì ê·í. */\nexport function ingestCanonicalRecords(\n records:\n | CanonicalRecord\n | CanonicalAggregationRecord\n | CanonicalTransformationRecord\n | EnergyRecord\n | EnergyEquipmentRecord\n | OperationalRecord\n /* ë€ì¯ì§ž ìŽí â ì¬ê±ŽìŽ ìë ê²(ë³íì§ ìë ìì±). ì ëë¡ ê°ì§ ìëë€(§`CanonicalIngestResult`). */\n | MasterDataRecord\n | (\n | CanonicalRecord\n | CanonicalAggregationRecord\n | CanonicalTransformationRecord\n | EnergyRecord\n | EnergyEquipmentRecord\n | OperationalRecord\n | MasterDataRecord\n )[]\n | undefined\n | null,\n tenantId: string,\n defaultEventTime: string\n): CanonicalIngestResult {\n const arr = Array.isArray(records) ? records : records ? [records] : []\n /*\n * ââ **ë€ì¯ì§ž ìŽíë ì¬ê±ŽìŽ ìëë€** (2026-08-28) ââââââââââââââââââââââââââââ\n *\n * ë§ì€í°ë°ìŽí° â ë³íì§ ìë ìì±(ì íµêž°í·ë¡ížë²ížÂ·ì늬ì ì±ì§). íì€ì ìŽê²ì ì¬ê±ŽìŽ ìëëŒ\n * **ìŽí ììì ìì±**ìŒë¡ ëŽê³ , 컀ëì ê·ž ìëŠ¬ê° ììŽì ì§êžê¹ì§ ì¬ê±Žì ì€ë € ìë€.\n *\n * ê·ž ê²°ê³Œê° ì ì
ìì ìŽë ê² ë¬ë€. ì ëì ìœë ìë³žìŽ ì íµêž°íì ì€ìŒë €ê³ **ë€ìŽì€ì§ ìì ê²ì\n * `ADD`** ëŒê³ ë§íê³ , `ilmd` ê° ì¬ê±Ž ëšìëŒ ì늬ë³ë¡ 묶ì ìë ììŽ ë±ê°ë¡ ëê°ë€ â ì¬êž°ë í ë²ì\n * 2,665걎ìŽë€.\n *\n * ê·žëì ì¬êž°ì ê°ëŒ ëžë€. ìŽê²ì ëŽí¬ê° ëì§ ìê³ ì ëìë ì íì§ ìëë€(ìê°ì¶ìŽ ìë ê°ìŽë€).\n * ê°ë íì ì 컀ëì ê²ì ë¶ë¥žë€ â ë€ë¥ž ë·ê³Œ ê°ì ê·ìšìŽë€.\n *\n * ì€ê³: `operato-twin/design/plans/master-data.md`\n */\n const masterCandidates = arr.filter(isMasterDataRecord)\n const master = masterCandidates.length ? ingestMasterData(masterCandidates) : { accepted: [], rejected: [] }\n /*\n * **ìŽíê° ë·ìŽë€** â 묌ë¥(EPCIS)·ìëì§ ê³ë·ì€ë¹ ìëì§Â·ìŽì ì¬ì€. ìì ìë ìŽ íšìê° ë¬Žì¡°ê±Ž\n * `ObjectEvent` 륌 ë§ë€ìê³ , ê·žëì ê³ìž¡ì ìŽ êžžë¡ ë£ìŒë©Ž `epc` ê° ììŽ ê±°ë¶ëê±°ë(ê·žëë§ ëì 쪜)\n * ìë±í 묌í êŽìž¡ìŽ ëë€.\n *\n * ë¬Œë¥ ìŽí ììë 몚ììŽ ëìŽë€(ê°ì²Ž êŽìž¡ `epc` / ëŽê¹ `parentID`+`childEPCs`).\n *\n * íì ì 컀ëìŽ í ê³³ìì íë€(`isEnergyRecord`·`isOperationalRecord`·`isAggregationRecord`) â ì¬êž°ì ë€ì ì§ìí멎\n * ìë¹ì²ë§ë€ ëµìŽ ë¬ëŒì§ë€. ëŽí¬ë ê°ì ê²ì ì°ë¯ë¡ ìë ìë¹ì²(믞ë¬Â·ì ë·ëžë¡ëìºì€í
)ë ìŽ ê°ëŠŒì ì\n * íìê° ìë€.\n */\n /*\n * ì¬ì¯ì§žÂ·ìŒê³±ì§ž ìŽí â **ë§ê°ë ì¬ì© 구ê°**곌 **ì²êµ¬ì**. 컀ë 0.7.72 ê° ìŽ ë¬žë€ì ìŽìë€.\n *\n * ââ â
ì¬ì© 구ê°ì ê³ëë³Žë€ **뚌ì ** ê°ë¥žë€ âââââââââââââââââââââââââââââââââ\n * `isEnergyRecord` ë `meterId` ê° ììŒë©Ž ì°žìŽë¯ë¡ ì¬ì© 구ê°ìë ì°žìŽë€. ìì륌 ì íì§ ììŒë©Ž\n * ìê°ë³ ì¬ì©ëìŽ ê³ë í볞ìŒë¡ ë€ìŽê°ê³ , ê·ž 묞ì `kWh` 륌 **ì ì° ë ì§ì€í°**ë¡ ìœëë€. ê·žë¬ë©Ž\n * 컀ëìŽ êµ¬ê° ì ë ¥ëì ì°šë¶ìŒë¡ 구íëë° ì°ëŠ¬ê° ë£ì ê°ìŽ ìŽë¯ž 구ê°ì ììŽë€ â ì°šë¶ì ì°šë¶ìŽ ëìŽ\n * ê°ìŽ ì¡°ì©í í늰ë€. ê±°ë¶ëì§ë ìëë€.\n */\n const usagePeriods = arr.filter(isEnergyUsagePeriodRecord) as unknown as EnergyUsagePeriodRecord[]\n const bills = arr.filter(isEnergyBillRecord) as unknown as EnergyBillRecord[]\n const energy = arr.filter(r => isEnergyRecord(r) && !isEnergyUsagePeriodRecord(r)) as EnergyRecord[]\n /* ìž ë²ì§ž ìŽí â ì€ë¹ê° ëž ìêž° ìëì§ ìí(ë°ì ·ì ì¥Â·ê°ì¶ ì¬ì§Â·ê°í ìì¹). ê³ë곌 ê°ëŒ ëë\n ìŽì ë 컀ëì ì í ìë€: ê³ëì 구ê°ì ëì ëê³ , ìŽê²ë€ì ê·ž ì€ë¹ì ì§êžìŽë€. */\n /*\n * ë€ì¯ ë²ì§ž ìŽí â **ë°ì ì ì°**(ì€ë¹ê° ì§êžê¹ì§ ë§ë ì). 컀ë 0.7.69 ê° ìŽ ë¬žì ìŽìë€.\n *\n * ââ â
ì€ë¹ ìíë³Žë€ **뚌ì ** ê°ë¥žë€ ââââââââââââââââââââââââââââââââââââââââââ\n * ë íì ìŽ ê²¹ì¹ë€. `isEnergyEquipmentRecord` ë `equipmentId` ê° ìê³ ë¬Œë¥Â·ê³ë ìŽíê° ìë멎\n * ì°žìŽë¯ë¡ ë°ì ì ì°ë íšê» ì°žìŽë€. ê·žëì ììê° ê°ëŠŒì ì íë€.\n *\n * ìì륌 ì못 ë멎 ì¡°ì©í ì¬ëŒì§ë ê²ìŽ ìëëŒ **ìë±í ìŽì ë¡ ê±°ë¶ëë€**: ì€ë¹ ìí 묞ì ì ì°ì\n * ê°ìŒë¡ ìžì§ ìì ãë°ê¿ ìíê° íëë ìë€ãë¡ ëë €ë³Žëžë€. 컀ë¥í°ë 볎ëë€ê³ ë¯¿ê³ , í멎ìë\n * ë°ì ëìŽ ìë€.\n */\n const energyGeneration = arr.filter(isEnergyGenerationRecord) as unknown as EnergyGenerationRecord[]\n const energyEquipment = arr.filter(r => isEnergyEquipmentRecord(r) && !isEnergyGenerationRecord(r)) as unknown as EnergyEquipmentRecord[]\n /*\n * ë€ ë²ì§ž ìŽí â **ìŽì ì¬ì€**(ìì
·ì€ë¹Â·ì¬ë·ìì°Â·ì€ë·íì§). êŽìž¡ 늬ëìë ìŽê²ì ì€ëì ë¶í°\n * ê³ì°íëë° **ë€ìŽì¬ ë¬žìŽ ììë€**: ìë³žìŽ ãìŽ ìì
ìŽ ëë¬ë€ã륌 ë§í êžžìŽ ììŽ ì뮬 컀ëë§ ê·žê²ì\n * ìë ìíê° ëšìë€(ê°ì íë©ŽìŽ ë 구ëìì ë€ë¥ž ê²ì ë§íë€).\n */\n const operational = arr.filter(isOperationalRecord) as OperationalRecord[]\n const epcis = arr.filter(\n r =>\n !isEnergyRecord(r) &&\n !isEnergyEquipmentRecord(r) &&\n !isEnergyGenerationRecord(r) &&\n !isEnergyUsagePeriodRecord(r) &&\n !isEnergyBillRecord(r) &&\n !isOperationalRecord(r) &&\n !isMasterDataRecord(r)\n ) as (CanonicalRecord | CanonicalAggregationRecord | CanonicalTransformationRecord)[]\n\n /* í목 ìŽí ìììë ê°ëŠŒìŽ ìë€(ê°ì²Ž êŽìž¡ / ëŽê¹) â ê·ž íì ë 컀ëì ê²ì ë¶ë¥žë€. */\n const epcisResult = epcis.length\n ? ingest(\n epcis.map(r => ({\n ...r,\n /*\n * ââ **ìê°ì ìŽëŠì ë í¡ìíë€** (2026-08-24 ì€ìž¡) ââââââââââââââââââââ\n * `eventTimePath` ë **í ìŽëŠ**ë§ ë°ëë€. ížì€ížê° `'eventTime'` ìŒë¡ 못ë°ì ëìëë°, ë€ì\n * ìꞎ 컀ë¥í°ë `at` ì ì£ëë€(ìëì§ ì±ëìŽ ìŽë¯ž `at` ì ì°ê³ ììŽ ê·ž ìŽí륌 ë°ëë€).\n * ê·žëì ê·ž 컀ë¥í°ì ì¬ê±Žì **ì ë¶ íŽë§ ìê°**ìŒë¡ ì°íë€ â ì ë 18,150ê±ŽìŽ ê·žë¬ë€.\n *\n * ê·ž 결곌 ëìŽ íšê» ë§ê°ì¡ë€: ì¬ê³ êŽìž¡ìŽ ížìì ìê³ë¥Œ ë°ì§ ëª»íŽ ìê³ê° `task.status` ì\n * ìµëê°(2026-04-15)ì **ë©ì¶° ììê³ **, ìŽë ì¬ê±Žìì ãìžì ãê° ì¬ëŒì ž ììë§ ëšìë€.\n *\n * ìŽëŠì íëë¡ ê°ìíì§ ìê³ í¡ìíë€ â `orderId`·`resourceRef`·`equipmentId` 륌 íšê» 볎ë\n * ê²ê³Œ ê°ì ê·ìšìŽë€(§`twin-event-keys`). ìžëê° ììŽë ê²ì ìŽ ìŽììì ì±ì§ìŽë€.\n *\n * **ììŒë©Ž ë§ë€ì§ ìëë€**: ì ëê° ì€ë
ì· êŽìž¡ì ì볞ì ê°±ì ìê°ìŽ ìëëŒ **íŽë§ ìê°**ìŽ\n * ë§ë êŽìž¡ ìê°ìŽë€(ãìŽì ê°ì ì€ë 뎀ë€ãë ãìŽì ìŒìŽë¬ë€ãê° ìëë€). ê°ì ë§íë\n * ë ìœëë§ ìêž° ìê°ì ê°ëë€.\n */\n ...(((r as any).eventTime ?? (r as any).at) !== undefined\n ? { eventTime: (r as any).eventTime ?? (r as any).at }\n : {}),\n /* íì ì 컀ëìŽ í ê³³ìì íë€ â ì¬êž°ì ë€ì ì§ìí멎 ìë¹ì²ë§ë€ ëµìŽ ë¬ëŒì§ë€. */\n sourceType: isTransformationRecord(r)\n ? 'twin-transformation'\n : isAggregationRecord(r)\n ? 'twin-aggregation'\n : 'twin'\n })),\n TWIN_INGEST_RULES,\n /*\n * **ë ìœëê° ìê°ì ë§í멎 ê·žê²ì ìŽë€** (2026-08-23).\n *\n * `eventTimePath` 륌 ì£Œì§ ìë ëì ìŽ ê²œë¡ë **ìžì ë íŽë§ ìê°**ì ìŒë€(`defaultEventTime`).\n * ê·žëì 컀ë¥í°ê° ìŽë¯ž ì£ê³ ìë `eventTime`(ë³í ë ìœëì `finishedAt` ë±)ìŽ **ìëŠ¬ì§ ìê³ \n * 묎ìëë€** â 컀ë¥í°ë¥Œ ë¶ìž 쪜ì ê·žê²ìŽ ëš¹ëë€ê³ ë¯¿ê³ ììê³ , ìŽëìë ì€ë¥ê° ëì§ ììë€.\n *\n * 묎ììŽ ê±žë žë: ê³ë³Ž(ë³í)ì ìê°ìŽë€. 4ìì ë§ë ë¡ížê° 8ìì ë§ë€ìŽì§ ê²ìŒë¡ ì ëì ëšìë€.\n * ê·žëŠ¬ê³ ì€ìž¡ ìì륌 ì¬ë íŽëê° ëŽí¬ ìê°ì ì°ë¯ë¡(§`kpi-fold`: `workMs = ìë£ â 첫 ì°©ì`),\n * íŽë§ ê°ê²©ì ìì
ìê°ìŒë¡ ë°°ìž ì ììë€ â 못 ë°°ì°ë ê²ë³Žë€ ëìë€.\n *\n * ë ìœëì `eventTime` ìŽ ììŒë©Ž 컀ëìŽ ìëŠ¬ì§ ìê³ êž°ë³žê°ìŒë¡ ëšìŽì§ë€(§`resolve` â ìë ê°ì\n * ì€ë¥ê° ìëë€). ê·žëì ìŽ í ì€ìŽ êž°ì¡Ž 겜ë¡ë¥Œ ë§ì§ ìëë€: ìê°ì ë§íë ë ìœëë§ ì¬ì€ìŽ ëë€.\n */\n { tenantId, defaultEventTime, eventTimePath: 'eventTime' }\n )\n : { accepted: [], rejected: [] }\n const energyResult = energy.length ? ingestEnergyRecords(energy, { tenantId, defaultEventTime }) : { accepted: [], rejected: [] }\n const equipmentResult = energyEquipment.length\n ? ingestEnergyEquipmentRecords(energyEquipment, { tenantId, defaultEventTime })\n : { accepted: [], rejected: [] }\n const usageResult = usagePeriods.length\n ? ingestEnergyUsagePeriodRecords(usagePeriods, { tenantId, defaultEventTime })\n : { accepted: [], rejected: [] }\n const billResult = bills.length ? ingestEnergyBillRecords(bills, { tenantId, defaultEventTime }) : { accepted: [], rejected: [] }\n const generationResult = energyGeneration.length\n ? ingestEnergyGenerationRecords(energyGeneration, { tenantId, defaultEventTime })\n : { accepted: [], rejected: [] }\n const operationalResult = operational.length\n ? ingestOperationalRecords(operational, { tenantId, defaultEventTime })\n : { accepted: [], rejected: [] }\n\n /* ê±°ë¶ë¶ì í©ì³ ëë €ì€ë€ â ìŽë ìŽíìì ê±°ë¶ëëì§ë ìŽì ë¬žêµ¬ê° ë§íë€. */\n return {\n accepted: [\n ...epcisResult.accepted,\n ...energyResult.accepted,\n ...equipmentResult.accepted,\n ...generationResult.accepted,\n ...usageResult.accepted,\n ...billResult.accepted,\n ...operationalResult.accepted\n ],\n rejected: [\n ...epcisResult.rejected,\n ...energyResult.rejected,\n ...equipmentResult.rejected,\n ...generationResult.rejected,\n ...usageResult.rejected,\n ...billResult.rejected,\n ...operationalResult.rejected,\n ...master.rejected\n ],\n /* ì¬ê±ŽìŽ ìë ê²ì ë°ë¡ ëžë€ â ë¶ë¥Žë ìªœìŽ ìí ìžì°ë 묞ìŒë¡ 볎ëžë€(ì ëë¡ ê°ì§ ìê²). */\n masterData: master.accepted\n }\n}\n\n/**\n * ì ì
결곌 â ì¬ê±Ž(ëŽí¬)곌 **ì¬ê±ŽìŽ ìë ê²**ì ê°ëŒ ëžë€.\n *\n * ë§ì€í°ë°ìŽí°ë¥Œ `accepted` ì ìì§ ìë ìŽì : ë¶ë¥Žë ìªœìŽ ê·žê²ì ì ëì ì ê² ëê³ , ìê°ì¶ìŽ ìë ê°ìŽ\n * ãê·žë ìŒìŽë ìŒãë¡ ëšëë€. ê°ë륌 íì
ìŒë¡ ê°ëŒ ë멎 ê·ž ì€ì륌 í ì ìë€.\n */\nexport interface CanonicalIngestResult extends IngestResult {\n masterData: MasterDataRecord[]\n}\n"]}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* | 죌ì(íìž ack) | 컀ë ë°íì | êŽìž¡ 컀ë |
|
|
18
18
|
*
|
|
19
19
|
* 믞ë¬ìì ì¡ì¶ììŽì
ì ê·žë¥ íì©í멎 **ì ê±°ì§ë§ìŽ ìꞎë€**: ížìì "볎ë¥ëš" ìŽëŒ ë§íê³ ì€ ìì€í
ì
|
|
20
|
-
* 몚륞ë€.
|
|
20
|
+
* 몚륞ë€. ìëŠ¬ì§ ìê³ ì»€ëë§ ë°êŸžì§ ìê³ , ìŽì 륌 ë°í ê±°ì íë€.
|
|
21
21
|
*
|
|
22
22
|
* ë°ë©Ž íìž(ack)ì ì¡ì¶ììŽì
ìŽ ìëë€ â ì ížë¥Œ 뎀ë€ë ížì 쪜 죌ììŽëŒ íì€ì 걎ëëŠ¬ì§ ìëë€.
|
|
23
23
|
* 믞ë¬ììë ì±ëŠœíŽìŒ íë¯ë¡ êŽìž¡ 컀ëë¡ ë³Žëžë€.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-routing.js","sourceRoot":"","sources":["../../server/engine/command-routing.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAgCH,oCAYC;AA1CD,6CAA6C;AAC7C,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAS,CAAC,eAAe,CAAC,CAAC,CAAA;AAoB9D,uCAAuC;AAChC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAAvE,QAAA,WAAW,eAA4D;AAEpF;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,IAAkC,EAAE,aAAsB,EAAE,IAAY;IACnG,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;IAClF,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAEpE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,+CAA+C;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;IAChG,CAAC;IAED,iDAAiD;IACjD,IAAI,IAAA,mBAAW,EAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,CAAA;IAC3G,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;AACtG,CAAC","sourcesContent":["/*\n * 컀맚ë ëŒì°í
íì â **ìì**. \"ìŽ ì»€ë§šë륌 ë구ìê² ë³ŽëŒ ê²ìžê°\" ë§ ì íë€.\n * ì€ì dispatch·ì ë êž°ë¡ì ìì§ìŽ íë€(`design/plans/command-routing.md` §1·§4 P0).\n *\n * ââ ì ëŒìŽëë âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ\n * ìì ìë 늬졞ë²ê° `inst.runtime.dispatch(...)` 륌 ê³§ë°ë¡ ë¶ë ë€. `runtime` ì **ì뮬 겜ë¡ììë§**\n * ë§ë€ìŽì§ë¯ë¡ ì€ë¬Œì ë¹ì¶ë ížì(mirror)ììë ê·ž í ì€ìŽ `TypeError` ë¡ í°ì¡ë€ â ì¡°ì¹ ì±ëìŽ\n * íµì§žë¡ ë¿ì§ ììê³ , ì¬ì©ììê²ë ìŽì ìë ê±°ì ìŽ ìëëŒ ê·žë¥ ì€íšìë€.\n *\n * íì ìŽ ìœë íê°ìŽë° ììŒë©Ž ìŽë° ë¶ë¥ë¥Œ í
ì€ížë¡ 못 ì¡ëë€(ìì§ì DB·TypeORM ì ë¬Œê³ ììŽ ëšì\n * í
ì€ížê° ë¶ë¬ì¬ ì ìë€). ê·žëì íì ë§ ììíê² ëŒìŽ ëë€ â `planWarmStart` ì ê°ì ìŽì ë€.\n *\n * ââ íì ê·ì¹ = ê¶ì à ì±ê²© âââââââââââââââââââââââââââââââââââââââââââââââââ\n * | ì±ê²© \\ 몚ë | ì뮬 | 믞ë¬(íì€ì ë¹ì¶€) |\n * | ì¡ì¶ììŽì
| 컀ë ë°íì | **ê±°ì **(ììë°ìŽë ìŽëí° ë¯žê²°ì ) |\n * | 죌ì(íìž ack) | 컀ë ë°íì | êŽìž¡ 컀ë |\n *\n * 믞ë¬ìì ì¡ì¶ììŽì
ì ê·žë¥ íì©í멎 **ì ê±°ì§ë§ìŽ ìꞎë€**: ížìì \"볎ë¥ëš\" ìŽëŒ ë§íê³ ì€ ìì€í
ì\n * 몚륞ë€.
|
|
1
|
+
{"version":3,"file":"command-routing.js","sourceRoot":"","sources":["../../server/engine/command-routing.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAgCH,oCAYC;AA1CD,6CAA6C;AAC7C,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAS,CAAC,eAAe,CAAC,CAAC,CAAA;AAoB9D,uCAAuC;AAChC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAAvE,QAAA,WAAW,eAA4D;AAEpF;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,IAAkC,EAAE,aAAsB,EAAE,IAAY;IACnG,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;IAClF,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAEpE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,+CAA+C;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;IAChG,CAAC;IAED,iDAAiD;IACjD,IAAI,IAAA,mBAAW,EAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,CAAA;IAC3G,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;AACtG,CAAC","sourcesContent":["/*\n * 컀맚ë ëŒì°í
íì â **ìì**. \"ìŽ ì»€ë§šë륌 ë구ìê² ë³ŽëŒ ê²ìžê°\" ë§ ì íë€.\n * ì€ì dispatch·ì ë êž°ë¡ì ìì§ìŽ íë€(`design/plans/command-routing.md` §1·§4 P0).\n *\n * ââ ì ëŒìŽëë âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ\n * ìì ìë 늬졞ë²ê° `inst.runtime.dispatch(...)` 륌 ê³§ë°ë¡ ë¶ë ë€. `runtime` ì **ì뮬 겜ë¡ììë§**\n * ë§ë€ìŽì§ë¯ë¡ ì€ë¬Œì ë¹ì¶ë ížì(mirror)ììë ê·ž í ì€ìŽ `TypeError` ë¡ í°ì¡ë€ â ì¡°ì¹ ì±ëìŽ\n * íµì§žë¡ ë¿ì§ ììê³ , ì¬ì©ììê²ë ìŽì ìë ê±°ì ìŽ ìëëŒ ê·žë¥ ì€íšìë€.\n *\n * íì ìŽ ìœë íê°ìŽë° ììŒë©Ž ìŽë° ë¶ë¥ë¥Œ í
ì€ížë¡ 못 ì¡ëë€(ìì§ì DB·TypeORM ì ë¬Œê³ ììŽ ëšì\n * í
ì€ížê° ë¶ë¬ì¬ ì ìë€). ê·žëì íì ë§ ììíê² ëŒìŽ ëë€ â `planWarmStart` ì ê°ì ìŽì ë€.\n *\n * ââ íì ê·ì¹ = ê¶ì à ì±ê²© âââââââââââââââââââââââââââââââââââââââââââââââââ\n * | ì±ê²© \\ 몚ë | ì뮬 | 믞ë¬(íì€ì ë¹ì¶€) |\n * | ì¡ì¶ììŽì
| 컀ë ë°íì | **ê±°ì **(ììë°ìŽë ìŽëí° ë¯žê²°ì ) |\n * | 죌ì(íìž ack) | 컀ë ë°íì | êŽìž¡ 컀ë |\n *\n * 믞ë¬ìì ì¡ì¶ììŽì
ì ê·žë¥ íì©í멎 **ì ê±°ì§ë§ìŽ ìꞎë€**: ížìì \"볎ë¥ëš\" ìŽëŒ ë§íê³ ì€ ìì€í
ì\n * 몚륞ë€. ìëŠ¬ì§ ìê³ ì»€ëë§ ë°êŸžì§ ìê³ , ìŽì 륌 ë°í ê±°ì íë€.\n *\n * ë°ë©Ž íìž(ack)ì ì¡ì¶ììŽì
ìŽ ìëë€ â ì ížë¥Œ 뎀ë€ë ížì 쪜 죌ììŽëŒ íì€ì 걎ëëŠ¬ì§ ìëë€.\n * 믞ë¬ììë ì±ëŠœíŽìŒ íë¯ë¡ êŽìž¡ 컀ëë¡ ë³Žëžë€.\n */\n\n/** êŽìž¡ 쪜 죌ì 컀맚ë â íì€ì ë°êŸžì§ ììŒë¯ë¡ 믞ë¬ììë íµê³Œíë€. */\nconst ANNOTATION_COMMANDS = new Set<string>(['attention.ack'])\n\n/** ëŒì°í
ì íìí ìžì€íŽì€ ì¬ì€ë§ â ìì§ ê°ì²Žë¥Œ ê·žëë¡ ë°ì§ ìëë€(ììíê² ì ì§). */\nexport interface RoutableInstance {\n /** 'live' 멎 íì€ì ë¹ì¶ë ížì(믞ë¬). ê·ž ìžë ì뮬. */\n mode?: string\n /** 컀ë ë°íì(tick/dispatch)ìŽ ë¶ìŽ ìë â ì뮬 겜ë¡ììë§ ë§ë€ìŽì§ë€. */\n hasRuntime: boolean\n /** êŽìž¡ 컀ëìŽ dispatch 륌 ë°ì ì ìë. */\n hasKernelDispatch: boolean\n}\n\nexport type CommandRoute =\n /** 컀ë ë°íììŒë¡(ì뮬 â 컀ëìŽ ìžê³ë€). */\n | { target: 'runtime' }\n /** êŽìž¡ 컀ëë¡(ë¯žë¬ â 죌ìë§). ë°©ì¶ë ì¬ì€ì ì ë íì ì€ìŽìŒ íë€. */\n | { target: 'kernel' }\n /** 볎ëŽì§ ìëë€. ì¬ì ë ìžìŽ ì€ëŠœ ìœë â íë©ŽìŽ `twin.cmderr.<code>` ë¡ ì¬ë ë§ì ë§ë ë€. */\n | { target: 'reject'; errorCode: string; errorParams?: Record<string, string | number> }\n\n/** ìŽ ì»€ë§šëê° ì€ íë¡ìžì€ë¥Œ ë°êŸžë ê²ìžê°(= ì¡ì¶ììŽì
). */\nexport const isActuation = (type: string): boolean => !ANNOTATION_COMMANDS.has(type)\n\n/**\n * ìŽëë¡ ë³ŽëŒì§ ì íë€.\n *\n * `inst` ê° ìê±°ë ížì¶ì ëë©ìž ìì ê° ìë멎 **ê°ì ì¬ì ë¡** ê±°ì íë€ â ì¡Žì¬ ì¬ë¶ë¥Œ ìë € 죌멎\n * ë€ë¥ž í
ëížì ìžì€íŽì€ id 륌 ì¶ìž¡í ì ìë€(ìì/ìììŽ êµ¬ë³ë멎 ê·žê²ìŽ ì 볎ë€).\n */\nexport function routeCommand(inst: RoutableInstance | undefined, ownedByCaller: boolean, type: string): CommandRoute {\n if (!inst || !ownedByCaller) return { target: 'reject', errorCode: 'no-instance' }\n if (!type) return { target: 'reject', errorCode: 'unknown-command' }\n\n if (inst.mode !== 'live') {\n /* ì뮬 â 컀ëìŽ ìžê³ë€. ë°íììŽ ììŒë©Ž ì€ë¥ë¥Œ ëŽì§ ìê³ ìŽì 륌 ë§íë€. */\n return inst.hasRuntime ? { target: 'runtime' } : { target: 'reject', errorCode: 'no-runtime' }\n }\n\n /* ë¯žë¬ â ì€ íë¡ìžì€ ë³ê²œì ììë°ìŽë ìŽëí°ì 몫ìŽê³ ìì§ ê²°ì ëì§ ììë€. */\n if (isActuation(type)) return { target: 'reject', errorCode: 'actuation-not-wired', errorParams: { type } }\n return inst.hasKernelDispatch ? { target: 'kernel' } : { target: 'reject', errorCode: 'no-runtime' }\n}\n"]}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* ââ íì ì ìì íšìë¡ (ìŽ íìŒ) ââââââââââââââââââââââââââââââââââââââââââââ
|
|
19
19
|
* ãìŽ ížìì ì ì¥ë ìê·¹ì ì€ì ê²ìžê°ãìë ì¬ëìŽ í늬Ʞ ì¬ìŽ ê°ëŠŒìŽ ì
ìë€: 믞ë¬ì ì€ìŒë©Ž **íì€ì
|
|
20
20
|
* ì€ìŒ**ìí€ê³ , ì못ë ì ìžì ì€ìŒë©Ž **ë€ì í±ìì ìë²ê° ëŽë €ê°ê³ **(ì€ì ë¡ ê·ž ìŽë ¥ìŽ ìë€), ìë늬ì€
|
|
21
|
-
* ìì§ìŽ ìë ë°íìì ì€ìŒë©Ž
|
|
21
|
+
* ìì§ìŽ ìë ë°íìì ì€ìŒë©Ž ìëŠ¬ì§ ìê³ ì묎 ìŒë ìë€. ê·žëì íì ì ê°ìŒë¡ ë§ë€ê³ ìííë€.
|
|
22
22
|
*/
|
|
23
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
24
|
exports.planStimulus = planStimulus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-stimulus.js","sourceRoot":"","sources":["../../server/engine/declared-stimulus.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;AAsBH,oCAcC;AAOD,oCAEC;AA9BD;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,MAAW,EACX,OAA8D,EAC9D,QAAuH;IAEvH,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAA;IACjC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IACxF,+DAA+D;IAC/D,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IAC1E,IAAI,CAAC,OAAO,CAAC,iBAAiB;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;IAC9E,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAA;IAC7F,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,CAAC,CAAC,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAG,CAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAAA;IACrG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAW,EAAE,QAAa;IACrD,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAA;AACxC,CAAC","sourcesContent":["/*\n * **ìê·¹ì ìë³žìŽ ì ìžíë€** â ížììŽ ìëëŒ.\n *\n * ââ 묎ììŽ ë¬ë (2026-08-19) ââââââââââââââââââââââââââââââââââââââââââââââââ\n * ë°ëªšì ìê·¹(ìë늬ì€)ì ìë ìœëê° **ë©ëªšëЬìë§** ì€ìë€: `runtime.scenario.load(...)`. ê·žëì ížìì\n * ì¬êž°ëí멎 ìê·¹ìŽ ì¬ëŒì§ê³ , êµ¬ì¡°ë§ ì ìë ížììŽ ëšëë€ â ìì
0·ì€ë 0. ãìŽì ìë ë°ëªšãê°\n * **첫 ì¬êž°ëê¹ì§ë§** ì¬ë ê²ìŽë€(ì€ë ìë²ë¥Œ ì¬ë¬ ë² ëì°ë ëì ì€ì ë¡ ê·ž ìíìë€).\n *\n * ââ ì ížìì ì ì¥íì§ ìë (ADR-0029 · plans/simulator-as-source.md §4) ââââ\n * ìê·¹ì **ì볞ì ê±°ë**ìŽë€: 묎ììŽ ë€ìŽì€ê³ ë¬Žìš ì£Œë¬žìŽ ëëì§ë ì뮬ë ìŽí°(ì볞)ê° ì íë ì¬ì€ìŽê³ ,\n * ížìì ê·žê²ì ë°ìíë€. ížìì ì ì¶ì ë§ë€ë©Ž ADR-0029 ê° ëì€ì ê±·ìŽëŽìŒ íë íë©ŽìŽ íë ëê³ \n * (ê·ž ê³íìì §2·§5 ê° ìŽë¯ž ê·ž ë¶ëŽì ì ìŽ ëìë€), ì볞ì ë멎 ê·ž ê³íì **첫 ì¡°ê° ìì늬**ê° ëë€:\n * ì§êžì ížì€ížê° ìœìŽ ì»€ëì ì£ê³ , ëì€ì `openLiveFeed` ë€ë¡ ì®êž°ë©Ž ê°ì ì ìžìŽ ê·žëë¡ ì°ìžë€.\n *\n * ê·žëì ì§ì `TwinReference.connectionConfig.scenario` â ìŽëí°ë³ ì€ì ì늬(ìŽë¯ž `simple-json`)ë€.\n *\n * ââ íì ì ìì íšìë¡ (ìŽ íìŒ) ââââââââââââââââââââââââââââââââââââââââââââ\n * ãìŽ ížìì ì ì¥ë ìê·¹ì ì€ì ê²ìžê°ãìë ì¬ëìŽ í늬Ʞ ì¬ìŽ ê°ëŠŒìŽ ì
ìë€: 믞ë¬ì ì€ìŒë©Ž **íì€ì\n * ì€ìŒ**ìí€ê³ , ì못ë ì ìžì ì€ìŒë©Ž **ë€ì í±ìì ìë²ê° ëŽë €ê°ê³ **(ì€ì ë¡ ê·ž ìŽë ¥ìŽ ìë€), ìë늬ì€\n * ìì§ìŽ ìë ë°íìì ì€ìŒë©Ž
|
|
1
|
+
{"version":3,"file":"declared-stimulus.js","sourceRoot":"","sources":["../../server/engine/declared-stimulus.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;AAsBH,oCAcC;AAOD,oCAEC;AA9BD;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,MAAW,EACX,OAA8D,EAC9D,QAAuH;IAEvH,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAA;IACjC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IACxF,+DAA+D;IAC/D,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IAC1E,IAAI,CAAC,OAAO,CAAC,iBAAiB;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;IAC9E,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAA;IAC7F,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,CAAC,CAAC,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAG,CAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAAA;IACrG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAW,EAAE,QAAa;IACrD,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAA;AACxC,CAAC","sourcesContent":["/*\n * **ìê·¹ì ìë³žìŽ ì ìžíë€** â ížììŽ ìëëŒ.\n *\n * ââ 묎ììŽ ë¬ë (2026-08-19) ââââââââââââââââââââââââââââââââââââââââââââââââ\n * ë°ëªšì ìê·¹(ìë늬ì€)ì ìë ìœëê° **ë©ëªšëЬìë§** ì€ìë€: `runtime.scenario.load(...)`. ê·žëì ížìì\n * ì¬êž°ëí멎 ìê·¹ìŽ ì¬ëŒì§ê³ , êµ¬ì¡°ë§ ì ìë ížììŽ ëšëë€ â ìì
0·ì€ë 0. ãìŽì ìë ë°ëªšãê°\n * **첫 ì¬êž°ëê¹ì§ë§** ì¬ë ê²ìŽë€(ì€ë ìë²ë¥Œ ì¬ë¬ ë² ëì°ë ëì ì€ì ë¡ ê·ž ìíìë€).\n *\n * ââ ì ížìì ì ì¥íì§ ìë (ADR-0029 · plans/simulator-as-source.md §4) ââââ\n * ìê·¹ì **ì볞ì ê±°ë**ìŽë€: 묎ììŽ ë€ìŽì€ê³ ë¬Žìš ì£Œë¬žìŽ ëëì§ë ì뮬ë ìŽí°(ì볞)ê° ì íë ì¬ì€ìŽê³ ,\n * ížìì ê·žê²ì ë°ìíë€. ížìì ì ì¶ì ë§ë€ë©Ž ADR-0029 ê° ëì€ì ê±·ìŽëŽìŒ íë íë©ŽìŽ íë ëê³ \n * (ê·ž ê³íìì §2·§5 ê° ìŽë¯ž ê·ž ë¶ëŽì ì ìŽ ëìë€), ì볞ì ë멎 ê·ž ê³íì **첫 ì¡°ê° ìì늬**ê° ëë€:\n * ì§êžì ížì€ížê° ìœìŽ ì»€ëì ì£ê³ , ëì€ì `openLiveFeed` ë€ë¡ ì®êž°ë©Ž ê°ì ì ìžìŽ ê·žëë¡ ì°ìžë€.\n *\n * ê·žëì ì§ì `TwinReference.connectionConfig.scenario` â ìŽëí°ë³ ì€ì ì늬(ìŽë¯ž `simple-json`)ë€.\n *\n * ââ íì ì ìì íšìë¡ (ìŽ íìŒ) ââââââââââââââââââââââââââââââââââââââââââââ\n * ãìŽ ížìì ì ì¥ë ìê·¹ì ì€ì ê²ìžê°ãìë ì¬ëìŽ í늬Ʞ ì¬ìŽ ê°ëŠŒìŽ ì
ìë€: 믞ë¬ì ì€ìŒë©Ž **íì€ì\n * ì€ìŒ**ìí€ê³ , ì못ë ì ìžì ì€ìŒë©Ž **ë€ì í±ìì ìë²ê° ëŽë €ê°ê³ **(ì€ì ë¡ ê·ž ìŽë ¥ìŽ ìë€), ìë늬ì€\n * ìì§ìŽ ìë ë°íìì ì€ìŒë©Ž ìëŠ¬ì§ ìê³ ì묎 ìŒë ìë€. ê·žëì íì ì ê°ìŒë¡ ë§ë€ê³ ìííë€.\n */\n\n/** ìê·¹ì ì€ìì§ ë§ì§ â ê·žëŠ¬ê³ ì. ë¶ë¥Žë 쪜ì ìŽ ëµë§ ë³Žê³ ìì§ìžë€. */\nexport type StimulusPlan =\n /** ì€ìŽëŒ â ê²ì¬ë¥Œ íµê³Œí ì ìž. */\n | { action: 'load'; scenario: any }\n /**\n * ì£ì§ ìëë€ â ê·ž ìŽì .\n * · `none` â ìë³žìŽ ìê·¹ì ì ìžíì§ ììë€(ì ì: ì ì êµ¬ì¡°ë§ ë°ìíë ížì)\n * · `mirror` â 믞ë¬ë€. ìžë¶ ì€ë¬ŒìŽ ì§ì€ìž ížìì ì°ëŠ¬ê° ìê·¹ì ë§ë€ë©Ž ê·žê²ì íì€ìŽ ìëë€\n * · `no-engine` â ìŽ ë°íìì ìëëŠ¬ì€ ìì§ìŽ ìë€(êŽìž¡ 구ë 컀ë)\n * · `invalid` â ì ìžìŽ ì»€ë ê·ìœì ìŽêžŽë€. **ì£ì§ ìê³ ë§íë€**(ë€ì í±ìì í°ì§ê² ëì§ ìëë€)\n */\n | { action: 'skip'; reason: 'none' | 'observed' | 'no-engine' | 'invalid'; detail?: string }\n\n/**\n * ì ì¥ë ìê·¹ ì ìžì ìœìŽ **ì€ìì§ íì íë€** â 컀ë ê²ì¬êž°ë¥Œ ê·žëë¡ ìŽë€(ê·ì¹ì ë ë²ë¡ ë§ë€ì§ ìëë€).\n *\n * `validate` ë 컀ëì `validateScenario` 륌 ëꞎë€(ížì€ížê° 컀ë íì
ì 묶ìŽì§ ìê² íšìë¡ ë°ëë€).\n * ê²ì¬êž°ê° ììŒë©Ž **ì£ì§ ìëë€**: ê²ì¬í ì ìë ì ìžì íì°ë ê²ìŽ ê°ì¥ ë¹ìŒ ì íìŽë€(ìë²ê° ëŽë €ê°\n * ìŽë ¥ìŽ ìë€).\n */\nexport function planStimulus(\n config: any,\n runtime: { hasScenarioEngine: boolean; mode?: 'sim' | 'live' },\n validate?: (scenario: any) => { ok: boolean; errorCode?: string; errorParams?: any } | { ok: false; errorCode: string }\n): StimulusPlan {\n const scenario = config?.scenario\n if (!scenario || typeof scenario !== 'object') return { action: 'skip', reason: 'none' }\n /* êŽìž¡ ížìì 뚌ì ë§ëë€ â ãìì§ìŽ ìë€ãë¡ ëµí멎 ìŽì ê° íë €ì§ë€(ì ìŽì ì€ì ì ìë ížììŽë€). */\n if (runtime.mode === 'live') return { action: 'skip', reason: 'observed' }\n if (!runtime.hasScenarioEngine) return { action: 'skip', reason: 'no-engine' }\n if (!validate) return { action: 'skip', reason: 'invalid', detail: 'no validator available' }\n const v = validate(scenario)\n if (!v?.ok) return { action: 'skip', reason: 'invalid', detail: (v as any)?.errorCode ?? 'rejected' }\n return { action: 'load', scenario }\n}\n\n/**\n * ì ìžì ì볞 ì€ì ì ì¹ëë€(ìì) â **Ʞ졎 ì€ì ì ì§ì°ì§ ìëë€.**\n *\n * ìŽëí° ì€ì ìë ì ì ì ë³Žê° íšê» ì°ë€. ìê·¹ì ë£ìŒë©Žì ê·ž ìì ë®ìŒë©Ž ë€ì ì¬ëêž°ê° ì볞ì 못 ì°Ÿëë€.\n */\nexport function withStimulus(config: any, scenario: any): any {\n return { ...(config ?? {}), scenario }\n}\n"]}
|
|
@@ -16,7 +16,7 @@ exports.buildEnergyTopology = buildEnergyTopology;
|
|
|
16
16
|
* ëšì ë륌 귞늬멎 ê°ì§ ìì ê³µíì ì¶©ì€ë륌 죌ì¥íê² ëë€. ì¬êž°ì 귞늬ë ê²ì **ížììŽ ì ìží êŽê³**
|
|
17
17
|
* (ì늬ì ê³ìžµ + ì€ë¹ì ìì)ì **ê³ëìŽ ì€ì ë¡ ë®ë ë²ì**ë¿ìŽë€. íê³ë ìë¹ì²ê° í멎ì ì ëë€.
|
|
18
18
|
*
|
|
19
|
-
* ââ
|
|
19
|
+
* ââ ìëŠ¬ì§ ìê³ ë¹ ëšëŠ¬ì§ ìëë€ âââââââââââââââââââââââââââââââââââââââââââââââââ
|
|
20
20
|
* ì늬륌 몚륎ë ì€ë¹, ê³ëêž°ê° ìë ì늬, ê³ëìŽ ë®ì§ ìë 몫ì **ê°ì ìêž° 칞ìŒë¡** ëìšë€. 귞늌ìì
|
|
21
21
|
* ì¬ëŒì§ë©Ž ì¬ì©ìë ìêž° íì¥ìŽ ë€ ê·žë €ì¡ë€ê³ 믿ëë€.
|
|
22
22
|
*/
|