@things-factory/headless-twin 10.1.277 → 10.1.279
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +21 -7
- package/dist-server/engine/attention-digest.js.map +0 -1
- package/dist-server/engine/canonical-ingest.js.map +0 -1
- package/dist-server/engine/checkpoint-fold.js.map +0 -1
- package/dist-server/engine/command-routing.js.map +0 -1
- package/dist-server/engine/declared-stimulus.js.map +0 -1
- package/dist-server/engine/energy-topology.js.map +0 -1
- package/dist-server/engine/event-time.js.map +0 -1
- package/dist-server/engine/index.js.map +0 -1
- package/dist-server/engine/ingest-dedupe.js.map +0 -1
- package/dist-server/engine/ingest-health.js.map +0 -1
- package/dist-server/engine/integration-coverage.js.map +0 -1
- package/dist-server/engine/integration-probes.js.map +0 -1
- package/dist-server/engine/integration-runner.js.map +0 -1
- package/dist-server/engine/integration-target-profile.js.map +0 -1
- package/dist-server/engine/kpi-baseline.js.map +0 -1
- package/dist-server/engine/kpi-fold.js.map +0 -1
- package/dist-server/engine/kpi-query.js.map +0 -1
- package/dist-server/engine/kpi-target.js.map +0 -1
- package/dist-server/engine/live-attentions.js.map +0 -1
- package/dist-server/engine/live-feed-registry.js.map +0 -1
- package/dist-server/engine/load-meter.js.map +0 -1
- package/dist-server/engine/local-declarations.js.map +0 -1
- package/dist-server/engine/log.js.map +0 -1
- package/dist-server/engine/loop-lag.js.map +0 -1
- package/dist-server/engine/measured-estimator.js.map +0 -1
- package/dist-server/engine/measured-yield.js.map +0 -1
- package/dist-server/engine/model-basis.js.map +0 -1
- package/dist-server/engine/model-gap.js.map +0 -1
- package/dist-server/engine/model-refusal.js.map +0 -1
- package/dist-server/engine/model-vocabulary.js.map +0 -1
- package/dist-server/engine/oee-accumulator.js.map +0 -1
- package/dist-server/engine/operation-basis.js.map +0 -1
- package/dist-server/engine/producer-guard.js.map +0 -1
- package/dist-server/engine/property-effects.js.map +0 -1
- package/dist-server/engine/read-time.js.map +0 -1
- package/dist-server/engine/restart-policy.js.map +0 -1
- package/dist-server/engine/runtime-key.js.map +0 -1
- package/dist-server/engine/spec-coverage.js.map +0 -1
- package/dist-server/engine/stage-path.js.map +0 -1
- package/dist-server/engine/state-axes.js.map +0 -1
- package/dist-server/engine/structure-diff.js.map +0 -1
- package/dist-server/engine/travel-estimator.js.map +0 -1
- package/dist-server/engine/twin-engine.js.map +0 -1
- package/dist-server/engine/twin-state-channel.js.map +0 -1
- package/dist-server/engine/warm-start.js.map +0 -1
- package/dist-server/index.js.map +0 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +0 -1
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +0 -1
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +0 -1
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js.map +0 -1
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js.map +0 -1
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js.map +0 -1
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js.map +0 -1
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js.map +0 -1
- package/dist-server/migrations/1786800000000-CreateTwinReferenceReconciliations.js.map +0 -1
- package/dist-server/migrations/index.js.map +0 -1
- package/dist-server/routes.js.map +0 -1
- package/dist-server/service/actuation/actuation-advisor.js.map +0 -1
- package/dist-server/service/actuation/actuation-outcome.js.map +0 -1
- package/dist-server/service/actuation/actuation-rule-resolver.js.map +0 -1
- package/dist-server/service/actuation/actuation-rule.js.map +0 -1
- package/dist-server/service/actuation/approval-gateway.js.map +0 -1
- package/dist-server/service/actuation/catch-up-effects.js.map +0 -1
- package/dist-server/service/actuation/command-dispatcher.js.map +0 -1
- package/dist-server/service/actuation/command-store.js.map +0 -1
- package/dist-server/service/actuation/dispatch-after-approval.js.map +0 -1
- package/dist-server/service/actuation/effect-match.js.map +0 -1
- package/dist-server/service/actuation/index.js.map +0 -1
- package/dist-server/service/actuation/retry-plan.js.map +0 -1
- package/dist-server/service/actuation/rule-evaluate.js.map +0 -1
- package/dist-server/service/actuation/rule-loop.js.map +0 -1
- package/dist-server/service/actuation/rule-runner.js.map +0 -1
- package/dist-server/service/actuation/rule-wiring.js.map +0 -1
- package/dist-server/service/actuation/settle-effects.js.map +0 -1
- package/dist-server/service/actuation/sweep-dispatch.js.map +0 -1
- package/dist-server/service/actuation/twin-command-resolver.js.map +0 -1
- package/dist-server/service/actuation/twin-command.js.map +0 -1
- package/dist-server/service/actuation/twin-now.js.map +0 -1
- package/dist-server/service/index.js.map +0 -1
- package/dist-server/service/reference/actuation-routing.js.map +0 -1
- package/dist-server/service/reference/actuation-target.js.map +0 -1
- package/dist-server/service/reference/actuation-verification.js.map +0 -1
- package/dist-server/service/reference/attention-lane.js.map +0 -1
- package/dist-server/service/reference/connection-portability-resolver.js.map +0 -1
- package/dist-server/service/reference/connection-portability.js.map +0 -1
- package/dist-server/service/reference/control-routing.js.map +0 -1
- package/dist-server/service/reference/discovery-result.js.map +0 -1
- package/dist-server/service/reference/fill-cadence.js.map +0 -1
- package/dist-server/service/reference/fill-dedupe.js.map +0 -1
- package/dist-server/service/reference/fill-loop.js.map +0 -1
- package/dist-server/service/reference/fill-span.js.map +0 -1
- package/dist-server/service/reference/hook-contract.js.map +0 -1
- package/dist-server/service/reference/hook-rejected.js.map +0 -1
- package/dist-server/service/reference/hook-store.js.map +0 -1
- package/dist-server/service/reference/index.js.map +0 -1
- package/dist-server/service/reference/ingest-space.js.map +0 -1
- package/dist-server/service/reference/knob-defaults.js.map +0 -1
- package/dist-server/service/reference/live-cadence.js.map +0 -1
- package/dist-server/service/reference/live-feed-lease.js.map +0 -1
- package/dist-server/service/reference/live-ingest.js.map +0 -1
- package/dist-server/service/reference/reference-adapter.js.map +0 -1
- package/dist-server/service/reference/reference-assessment.js.map +0 -1
- package/dist-server/service/reference/reference-fill-run.js.map +0 -1
- package/dist-server/service/reference/reference-fill.js.map +0 -1
- package/dist-server/service/reference/reference-hook.js.map +0 -1
- package/dist-server/service/reference/reference-link-groups.js.map +0 -1
- package/dist-server/service/reference/reference-links.js.map +0 -1
- package/dist-server/service/reference/reference-live.js.map +0 -1
- package/dist-server/service/reference/reference-master.js.map +0 -1
- package/dist-server/service/reference/reference-probe.js.map +0 -1
- package/dist-server/service/reference/reference-progress-channel.js.map +0 -1
- package/dist-server/service/reference/reference-progress-subscription.js.map +0 -1
- package/dist-server/service/reference/reference-progress.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation-query.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation-writer.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation.js.map +0 -1
- package/dist-server/service/reference/reference-registry.js.map +0 -1
- package/dist-server/service/reference/reference-resolver.js.map +0 -1
- package/dist-server/service/reference/template-registry.js.map +0 -1
- package/dist-server/service/reference/twin-reference-reconciliation.js.map +0 -1
- package/dist-server/service/reference/twin-reference.js.map +0 -1
- package/dist-server/service/twin-attention/index.js.map +0 -1
- package/dist-server/service/twin-attention/twin-attention-query.js.map +0 -1
- package/dist-server/service/twin-audit/command-audit.js.map +0 -1
- package/dist-server/service/twin-audit/index.js.map +0 -1
- package/dist-server/service/twin-audit/twin-audit-event.js.map +0 -1
- package/dist-server/service/twin-audit/twin-audit-query.js.map +0 -1
- package/dist-server/service/twin-backfill/backfill-period-facts.js.map +0 -1
- package/dist-server/service/twin-backfill/backfill-shape.js.map +0 -1
- package/dist-server/service/twin-backfill/index.js.map +0 -1
- package/dist-server/service/twin-backfill/twin-backfill-resolver.js.map +0 -1
- package/dist-server/service/twin-control/index.js.map +0 -1
- package/dist-server/service/twin-control/twin-control-mutation.js.map +0 -1
- package/dist-server/service/twin-event/index.js.map +0 -1
- package/dist-server/service/twin-event/journal-count.js.map +0 -1
- package/dist-server/service/twin-event/twin-event-keys.js.map +0 -1
- package/dist-server/service/twin-event/twin-event-type.js.map +0 -1
- package/dist-server/service/twin-event/twin-event.js.map +0 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +0 -1
- package/dist-server/service/twin-forecast/forecast-tuning.js.map +0 -1
- package/dist-server/service/twin-forecast/gap-analytics.js.map +0 -1
- package/dist-server/service/twin-forecast/index.js.map +0 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +0 -1
- package/dist-server/service/twin-ingest-window/index.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window.js.map +0 -1
- package/dist-server/service/twin-instance/index.js.map +0 -1
- package/dist-server/service/twin-instance/twin-instance.js.map +0 -1
- package/dist-server/service/twin-journal/event-type-split-shape.js.map +0 -1
- package/dist-server/service/twin-journal/event-type-split.js.map +0 -1
- package/dist-server/service/twin-journal/index.js.map +0 -1
- package/dist-server/service/twin-journal/journal-order.js.map +0 -1
- package/dist-server/service/twin-journal/twin-journal-query.js.map +0 -1
- package/dist-server/service/twin-lifecycle/domain-catalog.js.map +0 -1
- package/dist-server/service/twin-lifecycle/index.js.map +0 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +0 -1
- package/dist-server/service/twin-metrics/index.js.map +0 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +0 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js.map +0 -1
- package/dist-server/service/twin-model/choose-recipe.js.map +0 -1
- package/dist-server/service/twin-model/epcis-coverage.js.map +0 -1
- package/dist-server/service/twin-model/external-resolver.js.map +0 -1
- package/dist-server/service/twin-model/iec61850-coverage.js.map +0 -1
- package/dist-server/service/twin-model/index.js.map +0 -1
- package/dist-server/service/twin-model/isa95-coverage.js.map +0 -1
- package/dist-server/service/twin-model/item-ref.js.map +0 -1
- package/dist-server/service/twin-model/name-index.js.map +0 -1
- package/dist-server/service/twin-model/project-structure.js.map +0 -1
- package/dist-server/service/twin-model/standard-coverage.js.map +0 -1
- package/dist-server/service/twin-model/status-tally.js.map +0 -1
- package/dist-server/service/twin-model/twin-equipment.js.map +0 -1
- package/dist-server/service/twin-model/twin-lineage-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-location.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-item-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-mutation.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-operation.js.map +0 -1
- package/dist-server/service/twin-readiness/index.js.map +0 -1
- package/dist-server/service/twin-readiness/twin-readiness-query.js.map +0 -1
- package/dist-server/service/twin-space/area-resolver.js.map +0 -1
- package/dist-server/service/twin-space/index.js.map +0 -1
- package/dist-server/service/twin-space/move-space.js.map +0 -1
- package/dist-server/service/twin-space/representation-role.js.map +0 -1
- package/dist-server/service/twin-space/space-integrity.js.map +0 -1
- package/dist-server/service/twin-space/twin-area.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-area.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-representation.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-resolver.js.map +0 -1
- package/dist-server/service/twin-space/twin-space.js.map +0 -1
- package/dist-server/service/twin-state/index.js.map +0 -1
- package/dist-server/service/twin-state/twin-state-subscription.js.map +0 -1
- package/dist-server/service/twin-structure/index.js.map +0 -1
- package/dist-server/service/twin-structure/twin-structure.js.map +0 -1
- package/dist-server/service/twin-subject/event-subjects.js.map +0 -1
- package/dist-server/service/twin-subject/index.js.map +0 -1
- package/dist-server/service/twin-subject/item-resolver.js.map +0 -1
- package/dist-server/service/twin-subject/subject-query-shape.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-backfill.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-event.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-fast-path.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-query.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-writer.js.map +0 -1
- package/dist-server/service/twin-target/index.js.map +0 -1
- package/dist-server/service/twin-target/twin-target-resolver.js.map +0 -1
- package/dist-server/service/twin-target/twin-target.js.map +0 -1
- package/dist-shared/axis-read.js.map +0 -1
- package/dist-shared/entity-delta.js.map +0 -1
- package/dist-shared/kpi-broadcast.js.map +0 -1
- package/dist-shared/touched-items.js.map +0 -1
- package/dist-shared/twin-level.js.map +0 -1
- package/server/engine/attention-digest.ts +0 -102
- package/server/engine/canonical-ingest.ts +0 -511
- package/server/engine/checkpoint-fold.ts +0 -12
- package/server/engine/command-routing.ts +0 -67
- package/server/engine/declared-stimulus.ts +0 -66
- package/server/engine/energy-topology.ts +0 -189
- package/server/engine/event-time.ts +0 -96
- package/server/engine/index.ts +0 -51
- package/server/engine/ingest-dedupe.ts +0 -24
- package/server/engine/ingest-health.ts +0 -24
- package/server/engine/integration-coverage.ts +0 -147
- package/server/engine/integration-probes.ts +0 -144
- package/server/engine/integration-runner.ts +0 -95
- package/server/engine/integration-target-profile.ts +0 -103
- package/server/engine/kpi-baseline.ts +0 -202
- package/server/engine/kpi-fold.ts +0 -1516
- package/server/engine/kpi-query.ts +0 -1210
- package/server/engine/kpi-target.ts +0 -248
- package/server/engine/live-attentions.ts +0 -30
- package/server/engine/live-feed-registry.ts +0 -59
- package/server/engine/load-meter.ts +0 -393
- package/server/engine/local-declarations.ts +0 -779
- package/server/engine/log.ts +0 -72
- package/server/engine/loop-lag.ts +0 -120
- package/server/engine/measured-estimator.ts +0 -91
- package/server/engine/measured-yield.ts +0 -89
- package/server/engine/model-basis.ts +0 -162
- package/server/engine/model-gap.ts +0 -168
- package/server/engine/model-refusal.ts +0 -31
- package/server/engine/model-vocabulary.ts +0 -82
- package/server/engine/oee-accumulator.ts +0 -195
- package/server/engine/operation-basis.ts +0 -131
- package/server/engine/producer-guard.ts +0 -64
- package/server/engine/property-effects.ts +0 -216
- package/server/engine/read-time.ts +0 -77
- package/server/engine/restart-policy.ts +0 -55
- package/server/engine/runtime-key.ts +0 -58
- package/server/engine/spec-coverage.ts +0 -105
- package/server/engine/stage-path.ts +0 -172
- package/server/engine/state-axes.ts +0 -60
- package/server/engine/structure-diff.ts +0 -88
- package/server/engine/travel-estimator.ts +0 -138
- package/server/engine/twin-engine.ts +0 -4979
- package/server/engine/twin-state-channel.ts +0 -39
- package/server/engine/warm-start.ts +0 -265
- package/server/index.ts +0 -90
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +0 -43
- package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +0 -54
- package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +0 -53
- package/server/migrations/1786300000000-IndexEventTypeByTime.ts +0 -48
- package/server/migrations/1786400000000-IndexEventCreatedAt.ts +0 -38
- package/server/migrations/1786500000000-CreateTwinSubjectEvents.ts +0 -93
- package/server/migrations/1786600000000-RenameOperatoMesAdapterType.ts +0 -66
- package/server/migrations/1786700000000-AddDispatchRetryColumns.ts +0 -82
- package/server/migrations/1786800000000-CreateTwinReferenceReconciliations.ts +0 -39
- package/server/migrations/index.ts +0 -25
- package/server/routes.ts +0 -75
- package/server/service/actuation/actuation-advisor.ts +0 -131
- package/server/service/actuation/actuation-outcome.ts +0 -97
- package/server/service/actuation/actuation-rule-resolver.ts +0 -147
- package/server/service/actuation/actuation-rule.ts +0 -139
- package/server/service/actuation/approval-gateway.ts +0 -44
- package/server/service/actuation/catch-up-effects.ts +0 -152
- package/server/service/actuation/command-dispatcher.ts +0 -474
- package/server/service/actuation/command-store.ts +0 -236
- package/server/service/actuation/dispatch-after-approval.ts +0 -71
- package/server/service/actuation/effect-match.ts +0 -124
- package/server/service/actuation/index.ts +0 -27
- package/server/service/actuation/retry-plan.ts +0 -145
- package/server/service/actuation/rule-evaluate.ts +0 -352
- package/server/service/actuation/rule-loop.ts +0 -160
- package/server/service/actuation/rule-runner.ts +0 -216
- package/server/service/actuation/rule-wiring.ts +0 -84
- package/server/service/actuation/settle-effects.ts +0 -115
- package/server/service/actuation/sweep-dispatch.ts +0 -179
- package/server/service/actuation/twin-command-resolver.ts +0 -387
- package/server/service/actuation/twin-command.ts +0 -232
- package/server/service/actuation/twin-now.ts +0 -97
- package/server/service/index.ts +0 -100
- package/server/service/reference/actuation-routing.ts +0 -192
- package/server/service/reference/actuation-target.ts +0 -163
- package/server/service/reference/actuation-verification.ts +0 -85
- package/server/service/reference/attention-lane.ts +0 -21
- package/server/service/reference/connection-portability-resolver.ts +0 -171
- package/server/service/reference/connection-portability.ts +0 -329
- package/server/service/reference/control-routing.ts +0 -62
- package/server/service/reference/discovery-result.ts +0 -95
- package/server/service/reference/fill-cadence.ts +0 -29
- package/server/service/reference/fill-dedupe.ts +0 -66
- package/server/service/reference/fill-loop.ts +0 -153
- package/server/service/reference/fill-span.ts +0 -31
- package/server/service/reference/hook-contract.ts +0 -364
- package/server/service/reference/hook-rejected.ts +0 -53
- package/server/service/reference/hook-store.ts +0 -28
- package/server/service/reference/index.ts +0 -18
- package/server/service/reference/ingest-space.ts +0 -104
- package/server/service/reference/knob-defaults.ts +0 -59
- package/server/service/reference/live-cadence.ts +0 -129
- package/server/service/reference/live-feed-lease.ts +0 -56
- package/server/service/reference/live-ingest.ts +0 -94
- package/server/service/reference/reference-adapter.ts +0 -985
- package/server/service/reference/reference-assessment.ts +0 -250
- package/server/service/reference/reference-fill-run.ts +0 -179
- package/server/service/reference/reference-fill.ts +0 -223
- package/server/service/reference/reference-hook.ts +0 -479
- package/server/service/reference/reference-link-groups.ts +0 -21
- package/server/service/reference/reference-links.ts +0 -77
- package/server/service/reference/reference-live.ts +0 -420
- package/server/service/reference/reference-master.ts +0 -999
- package/server/service/reference/reference-probe.ts +0 -264
- package/server/service/reference/reference-progress-channel.ts +0 -26
- package/server/service/reference/reference-progress-subscription.ts +0 -78
- package/server/service/reference/reference-progress.ts +0 -95
- package/server/service/reference/reference-reconciliation-query.ts +0 -28
- package/server/service/reference/reference-reconciliation-writer.ts +0 -38
- package/server/service/reference/reference-reconciliation.ts +0 -55
- package/server/service/reference/reference-registry.ts +0 -17
- package/server/service/reference/reference-resolver.ts +0 -969
- package/server/service/reference/template-registry.ts +0 -85
- package/server/service/reference/twin-reference-reconciliation.ts +0 -27
- package/server/service/reference/twin-reference.ts +0 -190
- package/server/service/twin-attention/index.ts +0 -3
- package/server/service/twin-attention/twin-attention-query.ts +0 -70
- package/server/service/twin-audit/command-audit.ts +0 -114
- package/server/service/twin-audit/index.ts +0 -5
- package/server/service/twin-audit/twin-audit-event.ts +0 -158
- package/server/service/twin-audit/twin-audit-query.ts +0 -72
- package/server/service/twin-backfill/backfill-period-facts.ts +0 -168
- package/server/service/twin-backfill/backfill-shape.ts +0 -86
- package/server/service/twin-backfill/index.ts +0 -3
- package/server/service/twin-backfill/twin-backfill-resolver.ts +0 -35
- package/server/service/twin-control/index.ts +0 -3
- package/server/service/twin-control/twin-control-mutation.ts +0 -150
- package/server/service/twin-event/index.ts +0 -3
- package/server/service/twin-event/journal-count.ts +0 -53
- package/server/service/twin-event/twin-event-keys.ts +0 -215
- package/server/service/twin-event/twin-event-type.ts +0 -68
- package/server/service/twin-event/twin-event.ts +0 -250
- package/server/service/twin-forecast/forecast-metrics.ts +0 -106
- package/server/service/twin-forecast/forecast-tuning.ts +0 -40
- package/server/service/twin-forecast/gap-analytics.ts +0 -139
- package/server/service/twin-forecast/index.ts +0 -3
- package/server/service/twin-forecast/twin-forecast-query.ts +0 -486
- package/server/service/twin-ingest-window/index.ts +0 -7
- package/server/service/twin-ingest-window/twin-ingest-window-query.ts +0 -125
- package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +0 -57
- package/server/service/twin-ingest-window/twin-ingest-window.ts +0 -113
- package/server/service/twin-instance/index.ts +0 -3
- package/server/service/twin-instance/twin-instance.ts +0 -199
- package/server/service/twin-journal/event-type-split-shape.ts +0 -112
- package/server/service/twin-journal/event-type-split.ts +0 -144
- package/server/service/twin-journal/index.ts +0 -3
- package/server/service/twin-journal/journal-order.ts +0 -20
- package/server/service/twin-journal/twin-journal-query.ts +0 -615
- package/server/service/twin-lifecycle/domain-catalog.ts +0 -51
- package/server/service/twin-lifecycle/index.ts +0 -3
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +0 -285
- package/server/service/twin-metrics/index.ts +0 -3
- package/server/service/twin-metrics/twin-metrics-query.ts +0 -172
- package/server/service/twin-model/axis-journal-evidence.ts +0 -57
- package/server/service/twin-model/choose-recipe.ts +0 -31
- package/server/service/twin-model/epcis-coverage.ts +0 -251
- package/server/service/twin-model/external-resolver.ts +0 -173
- package/server/service/twin-model/iec61850-coverage.ts +0 -111
- package/server/service/twin-model/index.ts +0 -25
- package/server/service/twin-model/isa95-coverage.ts +0 -320
- package/server/service/twin-model/item-ref.ts +0 -80
- package/server/service/twin-model/name-index.ts +0 -94
- package/server/service/twin-model/project-structure.ts +0 -213
- package/server/service/twin-model/standard-coverage.ts +0 -35
- package/server/service/twin-model/status-tally.ts +0 -37
- package/server/service/twin-model/twin-equipment.ts +0 -191
- package/server/service/twin-model/twin-lineage-query.ts +0 -327
- package/server/service/twin-model/twin-location.ts +0 -147
- package/server/service/twin-model/twin-model-item-query.ts +0 -1029
- package/server/service/twin-model/twin-model-mutation.ts +0 -503
- package/server/service/twin-model/twin-model-query.ts +0 -792
- package/server/service/twin-model/twin-model-tree-query.ts +0 -211
- package/server/service/twin-model/twin-operation.ts +0 -157
- package/server/service/twin-readiness/index.ts +0 -3
- package/server/service/twin-readiness/twin-readiness-query.ts +0 -96
- package/server/service/twin-space/area-resolver.ts +0 -75
- package/server/service/twin-space/index.ts +0 -8
- package/server/service/twin-space/move-space.ts +0 -262
- package/server/service/twin-space/representation-role.ts +0 -15
- package/server/service/twin-space/space-integrity.ts +0 -293
- package/server/service/twin-space/twin-area.ts +0 -63
- package/server/service/twin-space/twin-space-area.ts +0 -66
- package/server/service/twin-space/twin-space-representation.ts +0 -99
- package/server/service/twin-space/twin-space-resolver.ts +0 -582
- package/server/service/twin-space/twin-space.ts +0 -148
- package/server/service/twin-state/index.ts +0 -3
- package/server/service/twin-state/twin-state-subscription.ts +0 -62
- package/server/service/twin-structure/index.ts +0 -3
- package/server/service/twin-structure/twin-structure.ts +0 -96
- package/server/service/twin-subject/event-subjects.ts +0 -162
- package/server/service/twin-subject/index.ts +0 -10
- package/server/service/twin-subject/item-resolver.ts +0 -92
- package/server/service/twin-subject/subject-query-shape.ts +0 -84
- package/server/service/twin-subject/twin-subject-backfill.ts +0 -196
- package/server/service/twin-subject/twin-subject-event.ts +0 -101
- package/server/service/twin-subject/twin-subject-fast-path.ts +0 -346
- package/server/service/twin-subject/twin-subject-query.ts +0 -210
- package/server/service/twin-subject/twin-subject-writer.ts +0 -189
- package/server/service/twin-target/index.ts +0 -5
- package/server/service/twin-target/twin-target-resolver.ts +0 -142
- package/server/service/twin-target/twin-target.ts +0 -97
- package/server/types/global.d.ts +0 -22
- package/shared/axis-read.ts +0 -28
- package/shared/entity-delta.ts +0 -335
- package/shared/kpi-broadcast.ts +0 -13
- package/shared/touched-items.ts +0 -73
- package/shared/twin-level.ts +0 -48
- package/test/ack-shape-alignment.test.ts +0 -97
- package/test/actuation-advisor.test.ts +0 -55
- package/test/actuation-approval-door.test.ts +0 -411
- package/test/actuation-dispatch.test.ts +0 -209
- package/test/actuation-effect.test.ts +0 -162
- package/test/actuation-outcome.test.ts +0 -152
- package/test/actuation-rule-runner.test.ts +0 -281
- package/test/actuation-rule.test.ts +0 -266
- package/test/actuation-seam.test.ts +0 -255
- package/test/actuation-settle.test.ts +0 -164
- package/test/actuation-target.test.ts +0 -145
- package/test/actuation-verification-state.test.ts +0 -139
- package/test/adopt-structure-live.test.ts +0 -133
- package/test/aggregate-not-findone.test.ts +0 -112
- package/test/area-resolver-db.test.ts +0 -110
- package/test/attention-digest.test.ts +0 -161
- package/test/axis-declaration-passthrough-db.test.ts +0 -152
- package/test/axis-journal-evidence.test.ts +0 -71
- package/test/axis-read.test.ts +0 -188
- package/test/backfill-shape.test.ts +0 -89
- package/test/boot-resume.test.ts +0 -287
- package/test/broadcast-cost-baseline.test.ts +0 -201
- package/test/broadcast-period.test.ts +0 -58
- package/test/broadcast-queue-overflow.test.ts +0 -244
- package/test/canonical-ingest-vocabularies.test.ts +0 -451
- package/test/canonical-quantity-door.test.ts +0 -61
- package/test/capability-mapping.test.ts +0 -89
- package/test/checkpoint-refuses-empty.test.ts +0 -103
- package/test/choose-recipe.test.ts +0 -117
- package/test/column-type-portability.test.ts +0 -122
- package/test/command-routing.test.ts +0 -61
- package/test/command-store-writes-columns.test.ts +0 -126
- package/test/connection-portability-doors.test.ts +0 -87
- package/test/connector-capability-declaration.test.ts +0 -195
- package/test/contract-layer-guard.test.ts +0 -48
- package/test/control-capability.test.ts +0 -98
- package/test/cursor-stall-not-read-failure.test.ts +0 -126
- package/test/declaration-reaches-model.test.ts +0 -226
- package/test/declared-location-types.test.ts +0 -89
- package/test/declared-stimulus.test.ts +0 -88
- package/test/dedupe-transformation.test.ts +0 -112
- package/test/discovery-result.test.ts +0 -75
- package/test/dispatch-after-approval-source.test.ts +0 -81
- package/test/duration-estimators.test.ts +0 -144
- package/test/energy-topology.test.ts +0 -113
- package/test/entity-delta.test.ts +0 -352
- package/test/equipment-identity-reaches.test.ts +0 -57
- package/test/event-subjects.test.ts +0 -148
- package/test/event-time-column.test.ts +0 -67
- package/test/event-type-split.test.ts +0 -178
- package/test/external-resolver.test.ts +0 -177
- package/test/fact-scope-wiring.test.ts +0 -96
- package/test/fill-dedupe.test.ts +0 -59
- package/test/fill-loop.test.ts +0 -35
- package/test/first-envelope.test.ts +0 -153
- package/test/fold-gap-speaks.test.ts +0 -53
- package/test/fold-shift-dst.test.ts +0 -110
- package/test/forecast-metrics.test.ts +0 -157
- package/test/forecast-tuning.test.ts +0 -42
- package/test/gap-analytics.test.ts +0 -113
- package/test/generated-not-counted.test.ts +0 -99
- package/test/guard-roots.ts +0 -76
- package/test/home-in-area.test.ts +0 -90
- package/test/hook-address.test.ts +0 -28
- package/test/hook-rejected-shape.test.ts +0 -86
- package/test/hook-response-sum.test.ts +0 -193
- package/test/hook-sequence.test.ts +0 -333
- package/test/ingest-bench.test.ts +0 -70
- package/test/ingest-dedupe.test.ts +0 -56
- package/test/ingest-expected-quiet.test.ts +0 -111
- package/test/ingest-health-engine.test.ts +0 -248
- package/test/ingest-health-wiring.test.ts +0 -120
- package/test/ingest-health.test.ts +0 -306
- package/test/ingest-history.test.ts +0 -247
- package/test/ingest-idempotent.test.ts +0 -211
- package/test/ingest-reconcile-four-ways.test.ts +0 -97
- package/test/ingest-rules-header.test.ts +0 -100
- package/test/ingest-running-guard.test.ts +0 -136
- package/test/ingest-space.test.ts +0 -78
- package/test/ingest-window-rolls-unobserved.test.ts +0 -72
- package/test/ingest-wiring-guard.test.ts +0 -197
- package/test/instance-cache-lifecycle.test.ts +0 -110
- package/test/intake-mapping-parity.test.ts +0 -175
- package/test/integration-probes.test.ts +0 -103
- package/test/integration-runner.test.ts +0 -95
- package/test/item-ref.test.ts +0 -78
- package/test/journal-order-axis.test.ts +0 -80
- package/test/journal-read-discipline.test.ts +0 -186
- package/test/journal-retention.test.ts +0 -275
- package/test/journal-sort-axis.test.ts +0 -142
- package/test/journal-write-door.test.ts +0 -110
- package/test/journal-write-trend.test.ts +0 -115
- package/test/kernel-kind-guard.test.ts +0 -98
- package/test/knob-defaults.test.ts +0 -72
- package/test/kpi-baseline-db.test.ts +0 -216
- package/test/kpi-baseline.test.ts +0 -196
- package/test/kpi-fold.test.ts +0 -1456
- package/test/kpi-query-bench.test.ts +0 -130
- package/test/lens-own-places.test.ts +0 -50
- package/test/lineage-survives-restart.test.ts +0 -234
- package/test/live-cadence.test.ts +0 -170
- package/test/live-cursor-wiring.test.ts +0 -87
- package/test/live-feed-lease.test.ts +0 -63
- package/test/live-feed-registry.test.ts +0 -75
- package/test/live-kernel-facts.test.ts +0 -161
- package/test/live-mirror-parity.test.ts +0 -286
- package/test/load-meter.test.ts +0 -328
- package/test/local-declarations.test.ts +0 -662
- package/test/log-stamp.test.ts +0 -59
- package/test/loop-lag.test.ts +0 -82
- package/test/master-to-twin.test.ts +0 -279
- package/test/measured-yield.test.ts +0 -90
- package/test/merge-streams.test.ts +0 -70
- package/test/mirror-resumes-from-checkpoint.test.ts +0 -192
- package/test/model-basis.test.ts +0 -141
- package/test/model-gap.test.ts +0 -153
- package/test/model-refusal.test.ts +0 -75
- package/test/model-vocabulary.test.ts +0 -114
- package/test/move-space.test.ts +0 -149
- package/test/mutation-gate.test.ts +0 -122
- package/test/oee-accumulator.test.ts +0 -204
- package/test/oee-site-calendar.test.ts +0 -146
- package/test/open-doors.test.ts +0 -197
- package/test/operation-basis.test.ts +0 -127
- package/test/operational-vocabulary.test.ts +0 -108
- package/test/operations-capability-db.test.ts +0 -165
- package/test/order-and-transaction-split.test.ts +0 -107
- package/test/order-fold-host.test.ts +0 -112
- package/test/producer-guard.test.ts +0 -66
- package/test/project-structure-db.test.ts +0 -226
- package/test/projection-reaches-screen.test.ts +0 -277
- package/test/projection-reads-declared.test.ts +0 -109
- package/test/property-effects.test.ts +0 -128
- package/test/provenance-promotion.test.ts +0 -99
- package/test/read-failure-ledger.test.ts +0 -106
- package/test/read-failure-visible.test.ts +0 -145
- package/test/read-time.test.ts +0 -118
- package/test/reference-fill.test.ts +0 -235
- package/test/reference-grounding.test.ts +0 -70
- package/test/reference-hook.test.ts +0 -177
- package/test/reference-links.test.ts +0 -56
- package/test/reference-reconciliation.test.ts +0 -39
- package/test/registry-key-guard.test.ts +0 -80
- package/test/rejection-carries-event-id.test.ts +0 -101
- package/test/rename-twin.test.ts +0 -89
- package/test/resolve-ts-siblings.mjs +0 -52
- package/test/restart-policy.test.ts +0 -111
- package/test/resync-origin-site.test.ts +0 -83
- package/test/retry-plan.test.ts +0 -139
- package/test/revision-axis.test.ts +0 -110
- package/test/runtime-key.test.ts +0 -66
- package/test/save-intake-collision.test.ts +0 -91
- package/test/scale-twin-bench.test.ts +0 -103
- package/test/secrets-at-rest.test.ts +0 -135
- package/test/snapshot-freshness.test.ts +0 -60
- package/test/source-outcome-audit.test.ts +0 -104
- package/test/space-integrity.test.ts +0 -223
- package/test/space-representation.test.ts +0 -66
- package/test/space-scope-includes-stopped.test.ts +0 -55
- package/test/spec-coverage.test.ts +0 -113
- package/test/stage-path.test.ts +0 -95
- package/test/standard-coverage.test.ts +0 -148
- package/test/state-axes.test.ts +0 -74
- package/test/status-tally.test.ts +0 -55
- package/test/streamline-e2e.test.ts +0 -76
- package/test/structure-revision-db.test.ts +0 -315
- package/test/subject-fast-path.test.ts +0 -148
- package/test/subject-read-model.test.ts +0 -175
- package/test/sweep-dispatch.test.ts +0 -191
- package/test/tenant-registry-db.test.ts +0 -149
- package/test/time-range.test.ts +0 -152
- package/test/touched-items.test.ts +0 -61
- package/test/twin-audit.test.ts +0 -83
- package/test/twin-event-keys.test.ts +0 -193
- package/test/twin-model-item-db.test.ts +0 -319
- package/test/twin-model-parent-relation-db.test.ts +0 -125
- package/test/twin-model-tree-db.test.ts +0 -209
- package/test/twin-origin-resync.test.ts +0 -133
- package/test/twin-state-channel.test.ts +0 -111
- package/test/vocabulary-guard.test.ts +0 -43
- package/test/warm-start-seam.test.ts +0 -162
- package/test/warm-start.test.ts +0 -297
- package/test/withheld-door.test.ts +0 -95
- package/test/yield-loop.test.ts +0 -199
- package/tsconfig.json +0 -15
- package/tsconfig.shared.json +0 -23
- package/tsconfig.shared.tsbuildinfo +0 -1
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* 떨어진 것을 **보내는 쪽이 알아들을 모양으로** 바꾼다 — 순수 판정, 한 곳.
|
|
3
|
-
*
|
|
4
|
-
* ── 무엇이 있었나 (2026-09-07 측정) ─────────────────────────────────────────
|
|
5
|
-
* 훅 응답의 떨어진 목록이 `{ record, errors }` 였고, plant 은 그것을 **봉투 id 문자열 목록**으로
|
|
6
|
-
* 읽고 있었다.
|
|
7
|
-
*
|
|
8
|
-
* ```
|
|
9
|
-
* headless-twin rejected: { record, errors }[] 객체 배열
|
|
10
|
-
* plant "rejected is a list of envelope ids" 문자열 배열
|
|
11
|
-
* ```
|
|
12
|
-
*
|
|
13
|
-
* `Array.isArray` 는 통과하므로 그쪽의 새 guard 도 안 걸렸다. id 를 맞추는데 객체라 하나도 안 맞고
|
|
14
|
-
* **묶음 전체가 「보냈음」으로 찍혔다.** 422 와 `ok: false` 를 보냈는데 그쪽 행은 재시도 0 ·
|
|
15
|
-
* 오류 없음 · 보냈음이었다. 인티그레이션 레인이 두 파일을 나란히 읽어서 찾았다.
|
|
16
|
-
*
|
|
17
|
-
* 우리가 말했는데 상대가 못 알아듣는 모양이면, 말한 것이 아니다.
|
|
18
|
-
*
|
|
19
|
-
* ── 왜 배선에서 갈라 놓나 ───────────────────────────────────────────────────
|
|
20
|
-
* `reference-hook.ts` 는 엔티티를 물어서 시험 러너가 못 읽는다. 이 판정은 평범한 값으로 확인할 수
|
|
21
|
-
* 있어야 하고, 오늘 이 저장소에서 「고쳐도 통과하고 안 고쳐도 통과하는 시험」이 여럿 나왔다.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
/** 훅 응답에 실리는 떨어진 것 하나 — 봉투 id 를 알면 그것을, 모르면 레코드를. */
|
|
25
|
-
export type RejectedForCaller = { eventId: string; errors: string[] } | { record: unknown; errors: string[] }
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* 떨어진 것에 봉투 id 를 붙인다.
|
|
29
|
-
*
|
|
30
|
-
* **짝은 객체 동일성으로 짓는다.** 유입에 넘긴 레코드가 배치의 원소 그대로이므로(§`takeInSequence`)
|
|
31
|
-
* 커넥터를 고치지 않고도 봉투로 되짚을 수 있다. 값으로 비교하면 같은 모양의 레코드 둘이 서로의 id 를
|
|
32
|
-
* 가져간다 — 그러면 보내는 쪽이 **엉뚱한 행**을 떨어진 것으로 표시한다.
|
|
33
|
-
*
|
|
34
|
-
* **id 를 못 찾으면 레코드를 그대로 싣는다.** 빈 id 를 실으면 보내는 쪽이 아무 행도 못 찾으면서
|
|
35
|
-
* 「알았다」고 여긴다 — 지금 났던 일이 정확히 그것이다.
|
|
36
|
-
*/
|
|
37
|
-
export function rejectedForCaller(
|
|
38
|
-
rejected: readonly { record: unknown; errors: string[] }[],
|
|
39
|
-
items: readonly { record?: unknown; eventId?: unknown }[]
|
|
40
|
-
): RejectedForCaller[] {
|
|
41
|
-
const idOf = new Map<unknown, string>()
|
|
42
|
-
|
|
43
|
-
for (const it of items) {
|
|
44
|
-
const id = typeof it?.eventId === 'string' && it.eventId.trim() ? it.eventId : undefined
|
|
45
|
-
if (id && it?.record !== undefined) idOf.set(it.record, id)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return rejected.map(r => {
|
|
49
|
-
const eventId = idOf.get(r.record)
|
|
50
|
-
|
|
51
|
-
return eventId ? { eventId, errors: r.errors } : { record: r.record, errors: r.errors }
|
|
52
|
-
})
|
|
53
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* 훅이 저장소에 닿는 두 자리 — 연결을 찾는 것과 커서를 적는 것.
|
|
3
|
-
*
|
|
4
|
-
* ── 왜 갈라져 있나 (2026-08-31) ──────────────────────────────────────────
|
|
5
|
-
* `reference-hook.ts` 가 엔티티를 직접 가져오면 그 파일을 부르는 시험이 TypeORM 데코레이터를 지나게
|
|
6
|
-
* 되고, 시험이 서지 않는다. 실제로 훅 시험이 규약 파일(`hook-contract.ts`)만 부르고 있었던 이유가
|
|
7
|
-
* 그것이다 — 그래서 **배선은 아무 시험도 걷지 않았다.**
|
|
8
|
-
*
|
|
9
|
-
* 저장소에 닿는 두 함수만 여기로 내면, 처리 순서 전체를 시험이 같은 함수로 걸을 수 있다. 시험은
|
|
10
|
-
* 저장본을 손에 들고 있는 구현을 넣어 재기동까지 넣는다.
|
|
11
|
-
*/
|
|
12
|
-
import { getRepository } from '@things-factory/shell'
|
|
13
|
-
|
|
14
|
-
import { TwinReference } from './twin-reference.js'
|
|
15
|
-
import type { HookStore } from './reference-hook.js'
|
|
16
|
-
|
|
17
|
-
/** 실제 저장소를 쓰는 구현 — 라우터가 이것을 넣는다. */
|
|
18
|
-
export function databaseStore(): HookStore {
|
|
19
|
-
return {
|
|
20
|
-
load: (domainId: string, source: string) =>
|
|
21
|
-
getRepository(TwinReference)
|
|
22
|
-
.findOne({ where: { domain: { id: domainId }, source } })
|
|
23
|
-
.catch(() => null),
|
|
24
|
-
saveCursor: async (refId: string, cursor: unknown) => {
|
|
25
|
-
await getRepository(TwinReference).update({ id: refId }, { liveCursor: cursor } as any)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { ConnectionPortabilityResolver } from './connection-portability-resolver.js'
|
|
2
|
-
import { TwinReferenceResolver } from './reference-resolver.js'
|
|
3
|
-
import { TwinReferenceProgressSubscription } from './reference-progress-subscription.js'
|
|
4
|
-
import { TwinReference } from './twin-reference.js'
|
|
5
|
-
import { TwinReferenceReconciliation } from './twin-reference-reconciliation.js'
|
|
6
|
-
import { TwinReferenceReconciliationQuery } from './reference-reconciliation-query.js'
|
|
7
|
-
|
|
8
|
-
export const entities = [TwinReference, TwinReferenceReconciliation]
|
|
9
|
-
export const resolvers = [TwinReferenceResolver, TwinReferenceProgressSubscription, ConnectionPortabilityResolver, TwinReferenceReconciliationQuery]
|
|
10
|
-
export * from './control-routing.js'
|
|
11
|
-
/* 진행 단계 어휘 — **모든 커넥터가 같은 낱말로 말한다.** 화면은 단계마다 번역 하나만 두면 된다. */
|
|
12
|
-
export * from './reference-progress.js'
|
|
13
|
-
/* 커넥터 점검 하네스 — 실 원본에 붙여 무엇이 채워지고 무엇이 비는지 센다(앱을 띄우지 않는다). */
|
|
14
|
-
export * from './reference-probe.js'
|
|
15
|
-
/* 놓친 구간을 backfill 해 채우는 길 — 밀어 받는 길과 같은 번호 검사를 지난다. */
|
|
16
|
-
export * from './reference-fill.js'
|
|
17
|
-
export * from './reference-reconciliation.js'
|
|
18
|
-
export * from './connection-portability.js'
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* 인제스트가 어느 공간으로 들어갈지 정한다 — **순수**.
|
|
3
|
-
*
|
|
4
|
-
* ── 왜 있나 (2026-08-05) ────────────────────────────────────────────────────
|
|
5
|
-
* 한 현실(공장·물류센터)을 여러 렌즈가 비춘다: 창고(WMS)·공정(MES)·야드(YMS) 가 같은 부지에 있다.
|
|
6
|
-
* 엔진은 이미 그것을 지원한다 — 같은 `spaceId` 로 들어오면 공간 content 를 병합하고 기존 값을 이긴다.
|
|
7
|
-
*
|
|
8
|
-
* 그런데 **만드는 흐름에 그 선택이 없었다.** 템플릿은 `space.spaceId` 를 정하지 않으므로 항상
|
|
9
|
-
* `<source>-site` 로 파생돼, 새 트윈은 늘 새 현장처럼 생겼다. 데이터로는 가능한 일이 저작으로는
|
|
10
|
-
* 불가능했다.
|
|
11
|
-
*
|
|
12
|
-
* ── 없는 공간에 알리지 않고 새 공간을 만들지 않는다 ────────────────────────────────
|
|
13
|
-
* "이 현장에 더한다" 는 요청이 오타·낡은 목록으로 빗나갔을 때 새 공간을 만들어 주면, 사용자는
|
|
14
|
-
* 합쳤다고 믿고 화면에서는 따로 놀게 된다 — 나중에 두 현장을 손으로 합쳐야 하고, 그때는 이미
|
|
15
|
-
* 이벤트가 양쪽에 쌓여 있다. 그래서 **모르는 공간이면 거절한다.**
|
|
16
|
-
*
|
|
17
|
-
* ── 같은 id 를 쓰는 구역은 알리지 않고 합쳐지므로 알린다 ──────────────────────────
|
|
18
|
-
* 공간 content 의 구역·랜드마크는 id 로 합집합을 만든다(`unionById`). 두 렌즈가 우연히 같은 구역
|
|
19
|
-
* id(`a-yard` 따위)를 쓰면 서로 다른 구역이 하나로 합쳐진다. 막을 일은 아니다(같은 현장의 같은 구역을
|
|
20
|
-
* 가리키는 정당한 경우가 많다) — 다만 **모르고 지나가지 않게** 경고로 돌려준다.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/** 공간 판정 결과. */
|
|
24
|
-
export interface IngestSpaceChoice {
|
|
25
|
-
/** 실제로 쓸 공간 id. */
|
|
26
|
-
spaceId: string
|
|
27
|
-
/** 사용자가 기존 현장에 합치기를 골랐나(마스터가 파생한 공간과 다른 곳으로 들어가나). */
|
|
28
|
-
joined: boolean
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** 거절 사유 — 호출측이 문장을 만들 때 쓴다(언어 중립 코드). */
|
|
32
|
-
export const INGEST_SPACE_NOT_FOUND = 'space-not-found'
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* 요청받은 공간과 마스터가 파생한 공간 중 무엇으로 들어갈지 정한다.
|
|
36
|
-
*
|
|
37
|
-
* @param masterSpaceId 마스터에서 파생된 공간 id(요청이 없을 때의 기본).
|
|
38
|
-
* @param requested 사용자가 고른 기존 공간 id. 없으면 빈 값/undefined.
|
|
39
|
-
* @param requestedExists 그 공간이 이 테넌트에 실제로 있나(호출측이 조회해 넘긴다).
|
|
40
|
-
* @throws 요청한 공간이 없으면 — 알리지 않고 새로 만들지 않는다.
|
|
41
|
-
*/
|
|
42
|
-
export function resolveIngestSpace(masterSpaceId: string, requested: string | undefined | null, requestedExists: boolean): IngestSpaceChoice {
|
|
43
|
-
const want = (requested ?? '').trim()
|
|
44
|
-
if (!want) return { spaceId: masterSpaceId, joined: false }
|
|
45
|
-
if (!requestedExists) {
|
|
46
|
-
const e = new Error(`space "${want}" not found — cannot co-locate into a space that does not exist`)
|
|
47
|
-
;(e as any).code = INGEST_SPACE_NOT_FOUND
|
|
48
|
-
throw e
|
|
49
|
-
}
|
|
50
|
-
/* 마스터가 이미 그 공간을 가리키면 합치기가 아니다 — 같은 공간의 재인제스트다. */
|
|
51
|
-
return { spaceId: want, joined: want !== masterSpaceId }
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* 실 시스템 import 가 현장을 고를 때의 거절 판정 — **순수**.
|
|
56
|
-
*
|
|
57
|
-
* 레퍼런스 하나는 사이트를 여럿 발견할 수 있고(`discoverSites`), 그 사이트마다 트윈이 하나씩 생긴다.
|
|
58
|
-
* 그런데 "이 현장에 더한다" 는 **한 곳**을 가리키는 말이다. 사이트 여럿을 한 공간에 넣으면 서로 다른
|
|
59
|
-
* 현장의 구역·랜드마크가 id 로 합쳐지고(`unionById`), 그 사실을 알아차릴 때는 이미 이벤트가 양쪽에
|
|
60
|
-
* 쌓여 있다 — 손으로 되돌릴 수 없는 종류다. 그래서 **묻지 않고 합치지 않고, 거절한다.**
|
|
61
|
-
*
|
|
62
|
-
* 공간을 고르지 않으면 지금까지의 거동 그대로다: 사이트마다 마스터가 파생한 공간으로 들어간다.
|
|
63
|
-
*/
|
|
64
|
-
export type ImportSpaceRefusalCode = 'space-with-multiple-sites'
|
|
65
|
-
|
|
66
|
-
export interface ImportSpaceRefusal {
|
|
67
|
-
code: ImportSpaceRefusalCode
|
|
68
|
-
params?: Record<string, string | number>
|
|
69
|
-
/** 영어 canonical — 로그에 남고, 번역이 없으면 그대로 보인다(발견 오류와 같은 규약). */
|
|
70
|
-
message: string
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* @param siteCount 실제로 만들 사이트 수(필터 적용 후).
|
|
75
|
-
* @param requested 사용자가 고른 기존 공간 id. 없으면 판정할 것이 없다.
|
|
76
|
-
* @returns 거절 사유. 없으면 진행해도 된다.
|
|
77
|
-
*/
|
|
78
|
-
export function refuseImportSpace(siteCount: number, requested?: string | null): ImportSpaceRefusal | undefined {
|
|
79
|
-
const want = (requested ?? '').trim()
|
|
80
|
-
if (!want || siteCount <= 1) return undefined
|
|
81
|
-
return {
|
|
82
|
-
code: 'space-with-multiple-sites',
|
|
83
|
-
params: { spaceId: want, count: siteCount },
|
|
84
|
-
message: `cannot co-locate ${siteCount} sites into space "${want}" — pick one site, or omit the space so each site gets its own`
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** 구역·랜드마크처럼 id 로 합쳐지는 것들. */
|
|
89
|
-
interface Identified {
|
|
90
|
-
id?: string
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* 합치는 쪽과 기존 쪽이 같은 id 를 쓰는 것들을 찾아 경고 문장을 만든다.
|
|
95
|
-
*
|
|
96
|
-
* 정당한 경우(같은 현장의 같은 구역)와 사고(서로 다른 구역이 우연히 같은 이름)를 기계가 가릴 수는
|
|
97
|
-
* 없다. 구분할 수 없는 것을 고르지 않고, **무엇이 합쳐졌는지 말한다.**
|
|
98
|
-
*/
|
|
99
|
-
export function collidingIds(existing: readonly Identified[] | undefined | null, incoming: readonly Identified[] | undefined | null): string[] {
|
|
100
|
-
const have = new Set((existing ?? []).map(x => x?.id).filter(Boolean) as string[])
|
|
101
|
-
const hits = new Set<string>()
|
|
102
|
-
for (const x of incoming ?? []) if (x?.id && have.has(x.id)) hits.add(x.id)
|
|
103
|
-
return [...hits].sort()
|
|
104
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* 노브 기본값 적용 — **순수**. "안 준 값은 템플릿이 선언한 기본값으로."
|
|
3
|
-
*
|
|
4
|
-
* ── 왜 있나 (2026-08-05) ────────────────────────────────────────────────────
|
|
5
|
-
* 템플릿은 노브마다 기본값을 선언한다(`knobs[].default`). 그런데 그 기본값을 채우는 일을 **위자드만**
|
|
6
|
-
* 하고 있었다 — 서버는 받은 파라미터를 그대로 `build(p)` 에 넘긴다. 그래서 파라미터를 일부만 주고
|
|
7
|
-
* 부르면(AI·스크립트·API 호출자) 템플릿 안에서 `Number(p.inboundRate) || 0` 이 **0** 이 되고,
|
|
8
|
-
* 발생률 0 = 도착 없음 = **아무것도 하지 않는 트윈**이 알리지 않고 만들어진다.
|
|
9
|
-
*
|
|
10
|
-
* 실제로 그 함정을 밟았다: 유통가공 창고를 파라미터 일부만 주고 만들었더니 이벤트가 0건이었고,
|
|
11
|
-
* 처음에는 템플릿이 깨진 것으로 오진했다. 기본값을 아는 곳이 계약(노브 스키마)인데 그것을 적용하는
|
|
12
|
-
* 곳이 화면뿐이면, 화면을 거치지 않는 모든 경로가 함정이 된다.
|
|
13
|
-
*
|
|
14
|
-
* ── 0 을 기본값으로 덮지 않는다 ─────────────────────────────────────────────
|
|
15
|
-
* 발생률 `0` 은 "도착 없음" 이라는 **뜻 있는 값**이다. 없는 것과 0 은 다르다 — falsy 로 판정해 덮으면
|
|
16
|
-
* "자극 없이 구조만 보겠다" 는 선언이 알리지 않고 뒤집힌다. 그래서 **키가 없을 때만** 채운다.
|
|
17
|
-
* `null` 은 없는 것으로 본다(JSON·GraphQL 경로에서 "주지 않음" 이 null 로 오는 일이 흔하다).
|
|
18
|
-
*
|
|
19
|
-
* ── 선언 밖 파라미터는 손대지 않는다 ────────────────────────────────────────
|
|
20
|
-
* 템플릿은 노브에 없는 값도 읽는다(예: `geo` 대신 `lat`/`lon` 폴백). 모르는 키를 걷어내면 그 경로가
|
|
21
|
-
* 알리지 않고 끊긴다. 그대로 통과시킨다.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
/** 템플릿 노브 — 기본값 적용에 필요한 만큼만 본다. */
|
|
25
|
-
export interface KnobLike {
|
|
26
|
-
key?: string
|
|
27
|
-
default?: unknown
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* 빠진 노브를 기본값으로 채운다.
|
|
32
|
-
*
|
|
33
|
-
* @param knobs 템플릿이 선언한 노브들(없으면 파라미터를 그대로 돌려준다).
|
|
34
|
-
* @param params 호출자가 준 파라미터.
|
|
35
|
-
* @returns 새 객체 — 입력을 바꾸지 않는다(호출자의 객체가 몰래 변하면 추적이 어렵다).
|
|
36
|
-
*/
|
|
37
|
-
export function applyKnobDefaults(knobs: readonly KnobLike[] | undefined | null, params: Record<string, unknown> | undefined | null): Record<string, unknown> {
|
|
38
|
-
const out: Record<string, unknown> = { ...(params ?? {}) }
|
|
39
|
-
for (const k of knobs ?? []) {
|
|
40
|
-
if (!k?.key) continue
|
|
41
|
-
if (k.default === undefined) continue // 기본값을 선언하지 않은 노브는 채울 것이 없다
|
|
42
|
-
const given = out[k.key]
|
|
43
|
-
if (given === undefined || given === null) out[k.key] = k.default
|
|
44
|
-
}
|
|
45
|
-
return out
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* 기본값으로 채운 노브 이름들 — 호출자에게 "무엇을 내가 정해 줬는지" 알릴 때 쓴다.
|
|
50
|
-
*
|
|
51
|
-
* 알리지 않고 채우는 것도 알리지 않고 비우는 것만큼 위험하다: 사용자가 준 적 없는 값으로 트윈이 만들어졌는데
|
|
52
|
-
* 아무 말이 없으면, 나중에 "왜 이 수치인가" 를 아무도 답할 수 없다.
|
|
53
|
-
*/
|
|
54
|
-
export function filledKnobKeys(knobs: readonly KnobLike[] | undefined | null, params: Record<string, unknown> | undefined | null): string[] {
|
|
55
|
-
const given = params ?? {}
|
|
56
|
-
return (knobs ?? [])
|
|
57
|
-
.filter(k => k?.key && k.default !== undefined && (given[k.key!] === undefined || given[k.key!] === null))
|
|
58
|
-
.map(k => k.key!)
|
|
59
|
-
}
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* **원천이 축마다 언제·얼마나 자주 내놓나** — 유입 건강이 이 선언으로 견준다.
|
|
3
|
-
*
|
|
4
|
-
* ── 왜 필요한가 (2026-09-04 실측) ──────────────────────────────────────────
|
|
5
|
-
* 유입 건강이 **한 자로 전부를 쟀다.** 10분 안에 아무것도 오지 않으면 「유입 없음」이다. 그런데
|
|
6
|
-
* 원천마다 시간의 결이 다르다.
|
|
7
|
-
*
|
|
8
|
-
* 태양광 발전 일몰에 멈춘다 — 두 사이트가 같은 분 19:25 에 함께
|
|
9
|
-
* 부하 계측 밤에도 온다 · 15분마다
|
|
10
|
-
* 인증서 가격 화·목만 거래된다 · 그 날 하루 한 번
|
|
11
|
-
* MES · 주방 현장 근무시간 밖에는 사실이 안 난다 · 훅이라 「보내면 온다」
|
|
12
|
-
*
|
|
13
|
-
* 그래서 **정상인데 매일 밤 절반이 빨갛게 났다.** 거짓 빨강이 쌓이면 진짜 빨강도 같이 안 읽힌다.
|
|
14
|
-
*
|
|
15
|
-
* ── 두 축이고 서로 다르다 ───────────────────────────────────────────────────
|
|
16
|
-
* window 지금이 그 축의 활동 시각인가 → 아니면 조용한 것이 정상
|
|
17
|
-
* expectedSilenceMs 활동 시각 안에서 이만큼 조용해도 정상 → 넘기면 유입 없음
|
|
18
|
-
*
|
|
19
|
-
* 주기를 넘겼어도 활동 시각 밖이면 정상이다. 한 값으로 접을 수 없다 — 인증서 가격이 그 증거다.
|
|
20
|
-
* 「매일 와야 한다」로 재면 주 5일 중 3일이 빨갛고, 「주 2회」로 재면 이어 쓴 날을 못 본다.
|
|
21
|
-
*
|
|
22
|
-
* ── 커널이 일출·일몰을 계산하지 않는다 ─────────────────────────────────────
|
|
23
|
-
* 굴절·고위도·박명 정의가 다 선택이고, 우리가 정하면 그 순간 방언이다. 그리고 계약이 같은 문제에
|
|
24
|
-
* 이미 답해 뒀다(§`TwinModelDef.utcOffsetMinutes`): 「긴 지평선의 정확한 답은 호스트가 표준대로
|
|
25
|
-
* **절대 구간**을 계산해 넣는 것이다」.
|
|
26
|
-
*
|
|
27
|
-
* 그래서 원천은 `windowKind: 'daylight'` 로 **종류만** 선언하고, 좌표를 아는 호스트가 날마다
|
|
28
|
-
* 구체적인 구간을 채운다. **고정 시각을 선언에 박지 않는다** — 일몰 19:25 는 오늘 잰 값이고 두 달
|
|
29
|
-
* 뒤에는 틀리다. 그것을 박으면 겨울마다 거짓 빨강이 다시 난다.
|
|
30
|
-
*
|
|
31
|
-
* ── 「주기 없음」과 「모른다」는 다르다 ──────────────────────────────────────
|
|
32
|
-
* MES 는 훅으로 밀어 준다 — 몇 분마다가 아니라 「보내면 온다」다. 보낼 것이 없으면 안 보내는 것이
|
|
33
|
-
* 정상이고, 그것을 침묵으로 판정하면 안 된다.
|
|
34
|
-
*
|
|
35
|
-
* 선언하지 않은 축은 **지금까지처럼** 창 하나로 견준다(옛 거동). 「모른다」를 「안 와도 된다」로
|
|
36
|
-
* 접지 않는다 — 그러면 정말 끊긴 원천이 통째로 조용해진다.
|
|
37
|
-
*/
|
|
38
|
-
import type { WorkCalendarEntry } from '@operato/ops-contract'
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* 창의 종류 — **호스트가 채워야 하는 것**만 이름이 있다.
|
|
42
|
-
*
|
|
43
|
-
* 지금은 하나다. 늘리기 전에 「호스트가 그것을 계산할 근거를 갖고 있나」를 먼저 물어야 한다 —
|
|
44
|
-
* 좌표 없이 `daylight` 를 선언하면 호스트가 채울 것이 없고, 그러면 그 축은 창이 없는 것과 같다.
|
|
45
|
-
*/
|
|
46
|
-
export type LiveWindowKind = 'daylight'
|
|
47
|
-
|
|
48
|
-
/** 한 축의 시간성 — 어느 사실이 언제·얼마나 자주 오나. */
|
|
49
|
-
export interface LiveCadence {
|
|
50
|
-
/**
|
|
51
|
-
* 어느 축인가 — **`OP_EVENT` 의 값 그대로**(`equipment.status` · `quality.output` …).
|
|
52
|
-
*
|
|
53
|
-
* 새 낱말을 만들지 않는다. 만들면 커넥터가 부르는 이름과 장부가 세는 이름이 갈리고, 그때
|
|
54
|
-
* 선언이 조용히 아무 축에도 안 붙는다.
|
|
55
|
-
*/
|
|
56
|
-
axis: string
|
|
57
|
-
/**
|
|
58
|
-
* 활동 시각 안에서 **이만큼 조용해도 정상**(ms). 없으면 창 하나로 견준다.
|
|
59
|
-
*
|
|
60
|
-
* 15분마다 긷는 원천은 이 값을 선언해야 한다 — 안 하면 긷는 사이마다 「유입 없음」으로 보인다.
|
|
61
|
-
*/
|
|
62
|
-
expectedSilenceMs?: number
|
|
63
|
-
/**
|
|
64
|
-
* 이 축이 **활동하는 창** — 근무 달력 어휘 그대로(요일·시간대·휴일).
|
|
65
|
-
*
|
|
66
|
-
* 계약이 이미 그 셋을 표현한다. 새 모양을 만들지 않는 이유는 판정하는 함수가 이미 하나
|
|
67
|
-
* 있기 때문이다(`inWorkCalendar`) — 두 벌이면 화면과 커널이 다른 답을 낸다.
|
|
68
|
-
*/
|
|
69
|
-
window?: readonly WorkCalendarEntry[]
|
|
70
|
-
/**
|
|
71
|
-
* 창을 **호스트가 채우는 종류** — 좌표·표준으로 계산해야 하는 것.
|
|
72
|
-
*
|
|
73
|
-
* `window` 와 함께 선언하면 호스트가 채운 것이 이긴다(계산이 선언보다 그 날에 맞다).
|
|
74
|
-
*/
|
|
75
|
-
windowKind?: LiveWindowKind
|
|
76
|
-
/**
|
|
77
|
-
* **보내면 온다** — 이 축은 침묵으로 판정하지 않는다(훅·구독).
|
|
78
|
-
*
|
|
79
|
-
* 「주기가 없다」와 「모른다」를 가르는 값이다. 훅은 보낼 것이 없으면 안 보내고, 그것이 정상이다.
|
|
80
|
-
*/
|
|
81
|
-
pushed?: boolean
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** 그 축의 선언을 찾는다 — 없으면 `undefined`(옛 거동으로 견준다). */
|
|
85
|
-
export function cadenceOf(cadences: readonly LiveCadence[] | undefined, axis: string): LiveCadence | undefined {
|
|
86
|
-
return cadences?.find(c => c.axis === axis)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* 유입 건강이 이 축을 어떻게 견줄 것인가 — **판정에 넘길 두 값으로 옮긴다.**
|
|
91
|
-
*
|
|
92
|
-
* `syncVerdictOf` 가 받는 모양(§`ingest-health.ts`)에 맞춘다. 그 함수는 순수하고 달력을 보지
|
|
93
|
-
* 않으므로, 창 판정은 여기서 끝내고 참·거짓만 넘긴다 — `capabilityOf` 가 `requiredTests` 를 받는
|
|
94
|
-
* 것과 같은 규율이다.
|
|
95
|
-
*
|
|
96
|
-
* ── 「보내면 온다」는 침묵으로 판정하지 않는다 ──────────────────────────────
|
|
97
|
-
* `pushed` 면 `quietNow` 를 늘 참으로 낸다. 그러면 침묵이 「유입 없음」이 되지 않는다. **다른
|
|
98
|
-
* 갈래는 그대로 산다** — 버려지는 중·결선 없음은 몇 시든 문제이고 그것들이 이 값보다 앞선다.
|
|
99
|
-
*
|
|
100
|
-
* ── 모르면 아무것도 답하지 않는다 ──────────────────────────────────────────
|
|
101
|
-
* 선언이 없으면 둘 다 비운다. 그때 판정은 지금까지처럼 창 하나로 견준다 — 「모른다」를 「안 와도
|
|
102
|
-
* 된다」로 접으면 정말 끊긴 원천이 통째로 조용해진다.
|
|
103
|
-
*/
|
|
104
|
-
export function ingestExpectation(
|
|
105
|
-
cadence: LiveCadence | undefined,
|
|
106
|
-
ctx: { nowMs: number; utcOffsetMinutes?: number; inWindow?: (window: readonly WorkCalendarEntry[]) => boolean }
|
|
107
|
-
): { expectedSilenceMs?: number; quietNow?: boolean } {
|
|
108
|
-
if (!cadence) return {}
|
|
109
|
-
|
|
110
|
-
const out: { expectedSilenceMs?: number; quietNow?: boolean } = {}
|
|
111
|
-
|
|
112
|
-
if (typeof cadence.expectedSilenceMs === 'number' && cadence.expectedSilenceMs > 0) {
|
|
113
|
-
out.expectedSilenceMs = cadence.expectedSilenceMs
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (cadence.pushed) {
|
|
117
|
-
/* 보낼 것이 없으면 안 보내는 것이 정상이다 — 침묵을 근거로 삼지 않는다. */
|
|
118
|
-
out.quietNow = true
|
|
119
|
-
return out
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/*
|
|
123
|
-
* 창이 있으면 그것으로 판정한다. **판정할 수단을 안 받았으면 답하지 않는다** — 부르는 쪽이
|
|
124
|
-
* 달력 판정 함수를 주지 않았는데 우리가 「활동 시각이다」로 단언하면 그것이 지어낸 값이다.
|
|
125
|
-
*/
|
|
126
|
-
if (cadence.window?.length && ctx.inWindow) out.quietNow = !ctx.inWindow(cadence.window)
|
|
127
|
-
|
|
128
|
-
return out
|
|
129
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* What a live feed takes its task lease under — pure naming, one place.
|
|
3
|
-
*
|
|
4
|
-
* ── Why the name is built here and not by the adapter ──────────────────────
|
|
5
|
-
* `TaskLease` deliberately has no domain column: the thing made exclusive is a
|
|
6
|
-
* loop, not a tenant's slice of one, and a task that does need to be per-tenant
|
|
7
|
-
* puts the tenant in its name so the unique index keeps meaning what it says.
|
|
8
|
-
*
|
|
9
|
-
* An adapter cannot honour that. It receives `cfg` and `site`, and neither
|
|
10
|
-
* carries a domain — so a name built from `siteId` would let two domains that
|
|
11
|
-
* happen to share a plant code block each other's channel. It would look
|
|
12
|
-
* exactly like "someone else holds it", which is the ordinary case on every
|
|
13
|
-
* instance but one, so nothing would be logged and nothing would look wrong.
|
|
14
|
-
*
|
|
15
|
-
* ── Why the source and not the site ───────────────────────────────────────
|
|
16
|
-
* One reference is one connection to one system, and that connection is what a
|
|
17
|
-
* second instance must not open twice. A source that discovers several sites
|
|
18
|
-
* still reads them over that one connection.
|
|
19
|
-
*
|
|
20
|
-
* ── Why the parts are joined with `::` ────────────────────────────────────
|
|
21
|
-
* The same separator the push cursor key already uses (`instanceId::scope`), so
|
|
22
|
-
* a person reading `task_leases` during an incident sees the same shape they
|
|
23
|
-
* see in `liveCursor`.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
/** Marks the name as a live feed, so a lease table read tells you what kind of task it is. */
|
|
27
|
-
const PREFIX = 'twin-live'
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* The lease name for one twin's feed.
|
|
31
|
-
*
|
|
32
|
-
* ── Domain and instance are required; the source is not ───────────────────
|
|
33
|
-
* A feed is registered per instance, so domain plus instance already names it
|
|
34
|
-
* uniquely. The source is appended when known because it is what a person
|
|
35
|
-
* reading `task_leases` wants to see — which system this channel talks to.
|
|
36
|
-
*
|
|
37
|
-
* Missing a domain or an instance is refused rather than filled in. A blank
|
|
38
|
-
* there would collapse two different feeds onto one name, and the failure
|
|
39
|
-
* would be that one of them silently stops: it would look exactly like
|
|
40
|
-
* "someone else holds it", which is the ordinary case on every instance but
|
|
41
|
-
* one, so nothing would be logged.
|
|
42
|
-
*/
|
|
43
|
-
export function liveFeedLeaseName(domainId: string, instanceId: string, source?: string): string {
|
|
44
|
-
for (const [what, value] of [
|
|
45
|
-
['domainId', domainId],
|
|
46
|
-
['instanceId', instanceId]
|
|
47
|
-
] as const) {
|
|
48
|
-
if (!value || !String(value).trim()) {
|
|
49
|
-
throw new Error(`cannot name a live feed lease without ${what} — two feeds would share one name`)
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const named = source && String(source).trim()
|
|
54
|
-
|
|
55
|
-
return named ? `${PREFIX}::${domainId}::${instanceId}::${named}` : `${PREFIX}::${domainId}::${instanceId}`
|
|
56
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* **원본이 준 레코드를 트윈에 넣는다** — 밀어 받는 길과 backfill 이 같이 쓴다.
|
|
3
|
-
*
|
|
4
|
-
* ── 왜 한 곳에 두나 ─────────────────────────────────────────────────────────
|
|
5
|
-
* 이 몸통이 `routes.ts` 의 훅 안에 박혀 있었습니다. backfill 문을 만들면서 복사하면 두 길이 서로
|
|
6
|
-
* 다른 규칙으로 받게 되고, 한쪽만 수정되는 날이 옵니다.
|
|
7
|
-
*
|
|
8
|
-
* 실제로 그 위험이 이 자리에 있습니다. 유입 장부의 네 갈래(앉음 · 되풀이 · 어휘 · 거절)를
|
|
9
|
-
* 2026-09-05 에 고쳤는데, 그때 이 몸통이 두 벌이었다면 한쪽 셈만 닫혔을 것입니다.
|
|
10
|
-
*
|
|
11
|
-
* ── 커널을 직접 부르지 않는 쪽이 넘겨받는다 ────────────────────────────────
|
|
12
|
-
* 훅 판정(`reference-hook.ts`)은 이 함수를 인자로 받습니다. 그 파일이 엔진을 직접 부르면 테스트할
|
|
13
|
-
* 때 엔진이 필요해집니다. 그 규율은 그대로 두고, 이 파일이 엔진을 아는 유일한 자리가 됩니다.
|
|
14
|
-
*/
|
|
15
|
-
import type { IngestResult } from './reference-hook.js'
|
|
16
|
-
|
|
17
|
-
import { TwinEngine } from '../../engine/index.js'
|
|
18
|
-
import { ingestCanonicalRecords } from '../../engine/canonical-ingest.js'
|
|
19
|
-
import { databaseCommandStore, settleEffects } from '../actuation/index.js'
|
|
20
|
-
import { shouldHaveTime } from '../../engine/event-time.js'
|
|
21
|
-
import { twinWarn } from '../../engine/log.js'
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* 레코드를 넣고 **네 갈래로 답한다.**
|
|
25
|
-
*
|
|
26
|
-
* 두 갈래로는 셈이 안 닫힙니다(인티그레이션 레인 실측 2026-09-05).
|
|
27
|
-
*
|
|
28
|
-
* ```
|
|
29
|
-
* 두 갈래 157 − 46 − 2 = 109 「설명 못 함」 진실은 되풀이 108 + 어휘 1
|
|
30
|
-
* 네 갈래 157 − 46 − 2 − 108 − 1 = 0
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* 109 를 「사라졌다」로 내면 그날부터 아무도 그 수를 안 봅니다. 늘 참인 경고는 벽지가 됩니다.
|
|
34
|
-
*
|
|
35
|
-
* `vocabulary` 는 저널에 안 가는 어휘 요소의 수입니다. 사라진 것이 아닙니다.
|
|
36
|
-
*
|
|
37
|
-
* @param via 유입 장부에 남길 길 이름 — `hook`(밀어 받음) · `fill`(빠진 구간을 다시 받음)
|
|
38
|
-
*/
|
|
39
|
-
export function liveIngest(
|
|
40
|
-
domainId: string,
|
|
41
|
-
instanceId: string,
|
|
42
|
-
records: unknown[],
|
|
43
|
-
via: string
|
|
44
|
-
): IngestResult & { vocabulary: number; undated?: Record<string, number> } {
|
|
45
|
-
const { accepted, rejected, masterData, undated } = ingestCanonicalRecords(
|
|
46
|
-
records as any,
|
|
47
|
-
domainId,
|
|
48
|
-
new Date().toISOString(),
|
|
49
|
-
TwinEngine.factScope(domainId, instanceId)
|
|
50
|
-
)
|
|
51
|
-
/* 사건이 아닌 것은 상태만 세운다 — 두 길이 같은 규율이다(§`applyMasterData`). */
|
|
52
|
-
if (masterData.length) TwinEngine.applyMasterData(domainId, instanceId, masterData)
|
|
53
|
-
const { applied, duplicates } = TwinEngine.ingestLiveResult(domainId, instanceId, accepted, via)
|
|
54
|
-
|
|
55
|
-
/*
|
|
56
|
-
* **나간 지시와 잇는다** — 폐루프. 기다리지 않습니다: 훅의 응답이 이것 때문에 늦으면 보내는 쪽이
|
|
57
|
-
* 되풀이하고, 그러면 같은 관측이 두 번 옵니다. 실패해도 관측 유입은 멈추지 않습니다.
|
|
58
|
-
*/
|
|
59
|
-
void settleEffects({ domainId, envelopes: accepted, store: databaseCommandStore() })
|
|
60
|
-
|
|
61
|
-
/*
|
|
62
|
-
* 커널이 받지 못한 수를 이름으로 남깁니다 — 트윈이 멈춘 사이 버려진 레코드를 「통과」로 세면
|
|
63
|
-
* 화면이 100% 라고 말합니다. 중복으로 걸러진 것은 버려진 것이 아니므로 빼고 셉니다.
|
|
64
|
-
*/
|
|
65
|
-
const undelivered = Math.max(0, accepted.length - applied - duplicates)
|
|
66
|
-
TwinEngine.recordIngestResult(domainId, instanceId, records.length, rejected, Date.now(), undelivered, masterData.length)
|
|
67
|
-
|
|
68
|
-
/*
|
|
69
|
-
* 떨어진 것을 **수가 아니라 목록으로** 넘깁니다 — 응답에 실어야 보내는 쪽이 그것만 따로 둘 수
|
|
70
|
-
* 있습니다. 수만 주면 배치 전체를 다시 보내거나 전부 버리는 두 갈래밖에 없습니다.
|
|
71
|
-
*/
|
|
72
|
-
/*
|
|
73
|
-
* **표에 있는 type 인데 시각을 못 읽었으면 그것은 결함이다.** 그 fact 는 자기 시각을 싣기로 되어
|
|
74
|
-
* 있는데 안 실려 온 것이고, 그대로 두면 ingest 시각이 그 사실의 시각으로 저장된다.
|
|
75
|
-
*
|
|
76
|
-
* 표에 없는 type 은 세기만 한다 — 절대값 snapshot 은 polling 순간이 맞는 시각이다.
|
|
77
|
-
*/
|
|
78
|
-
const wrong = Object.entries(undated ?? {}).filter(([type]) => shouldHaveTime(type))
|
|
79
|
-
if (wrong.length) {
|
|
80
|
-
twinWarn(
|
|
81
|
-
`[twin-ingest] "${instanceId}" — 시각을 실어야 하는 fact 가 시각 없이 왔습니다: ` +
|
|
82
|
-
wrong.map(([t, n]) => `${t} ${n}건`).join(' · ') +
|
|
83
|
-
`. 그 사실들은 지금 시각으로 저널에 앉습니다`
|
|
84
|
-
)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return {
|
|
88
|
-
applied,
|
|
89
|
-
duplicates,
|
|
90
|
-
vocabulary: masterData.length,
|
|
91
|
-
rejected,
|
|
92
|
-
...(undated && Object.keys(undated).length ? { undated } : {})
|
|
93
|
-
}
|
|
94
|
-
}
|