@things-factory/headless-twin 10.0.18 → 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/canonical-ingest.d.ts +10 -1
- package/dist-server/engine/canonical-ingest.js +110 -33
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/event-time.d.ts +25 -0
- package/dist-server/engine/event-time.js +98 -0
- package/dist-server/engine/event-time.js.map +1 -0
- package/dist-server/engine/index.d.ts +2 -0
- package/dist-server/engine/index.js +23 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/ingest-dedupe.d.ts +18 -6
- package/dist-server/engine/ingest-dedupe.js +201 -15
- package/dist-server/engine/ingest-dedupe.js.map +1 -1
- package/dist-server/engine/ingest-health.d.ts +60 -1
- package/dist-server/engine/ingest-health.js +43 -8
- package/dist-server/engine/ingest-health.js.map +1 -1
- package/dist-server/engine/kpi-fold.d.ts +19 -0
- package/dist-server/engine/kpi-fold.js +4 -1
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.js +23 -3
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/oee-accumulator.d.ts +35 -2
- package/dist-server/engine/oee-accumulator.js +56 -4
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +72 -3
- package/dist-server/engine/twin-engine.js +118 -5
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/index.js +21 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.d.ts +5 -0
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js +66 -0
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js.map +1 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.d.ts +5 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js +79 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js.map +1 -0
- package/dist-server/migrations/index.js +5 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/routes.js +19 -16
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/actuation/actuation-advisor.d.ts +60 -0
- package/dist-server/service/actuation/actuation-advisor.js +53 -0
- package/dist-server/service/actuation/actuation-advisor.js.map +1 -0
- package/dist-server/service/actuation/actuation-outcome.d.ts +52 -0
- package/dist-server/service/actuation/actuation-outcome.js +34 -0
- package/dist-server/service/actuation/actuation-outcome.js.map +1 -0
- package/dist-server/service/actuation/actuation-rule-resolver.d.ts +19 -0
- package/dist-server/service/actuation/actuation-rule-resolver.js +161 -0
- package/dist-server/service/actuation/actuation-rule-resolver.js.map +1 -0
- package/dist-server/service/actuation/actuation-rule.d.ts +55 -0
- package/dist-server/service/actuation/actuation-rule.js +130 -0
- package/dist-server/service/actuation/actuation-rule.js.map +1 -0
- package/dist-server/service/actuation/approval-gateway.d.ts +20 -0
- package/dist-server/service/actuation/approval-gateway.js +14 -0
- package/dist-server/service/actuation/approval-gateway.js.map +1 -0
- package/dist-server/service/actuation/catch-up-effects.d.ts +16 -0
- package/dist-server/service/actuation/catch-up-effects.js +120 -0
- package/dist-server/service/actuation/catch-up-effects.js.map +1 -0
- package/dist-server/service/actuation/command-dispatcher.d.ts +230 -0
- package/dist-server/service/actuation/command-dispatcher.js +269 -0
- package/dist-server/service/actuation/command-dispatcher.js.map +1 -0
- package/dist-server/service/actuation/command-store.d.ts +11 -0
- package/dist-server/service/actuation/command-store.js +219 -0
- package/dist-server/service/actuation/command-store.js.map +1 -0
- package/dist-server/service/actuation/dispatch-after-approval.d.ts +11 -0
- package/dist-server/service/actuation/dispatch-after-approval.js +73 -0
- package/dist-server/service/actuation/dispatch-after-approval.js.map +1 -0
- package/dist-server/service/actuation/effect-match.d.ts +53 -0
- package/dist-server/service/actuation/effect-match.js +65 -0
- package/dist-server/service/actuation/effect-match.js.map +1 -0
- package/dist-server/service/actuation/index.d.ts +25 -0
- package/dist-server/service/actuation/index.js +30 -0
- package/dist-server/service/actuation/index.js.map +1 -0
- package/dist-server/service/actuation/retry-plan.d.ts +63 -0
- package/dist-server/service/actuation/retry-plan.js +99 -0
- package/dist-server/service/actuation/retry-plan.js.map +1 -0
- package/dist-server/service/actuation/rule-evaluate.d.ts +127 -0
- package/dist-server/service/actuation/rule-evaluate.js +205 -0
- package/dist-server/service/actuation/rule-evaluate.js.map +1 -0
- package/dist-server/service/actuation/rule-loop.d.ts +5 -0
- package/dist-server/service/actuation/rule-loop.js +156 -0
- package/dist-server/service/actuation/rule-loop.js.map +1 -0
- package/dist-server/service/actuation/rule-runner.d.ts +52 -0
- package/dist-server/service/actuation/rule-runner.js +135 -0
- package/dist-server/service/actuation/rule-runner.js.map +1 -0
- package/dist-server/service/actuation/rule-wiring.d.ts +24 -0
- package/dist-server/service/actuation/rule-wiring.js +80 -0
- package/dist-server/service/actuation/rule-wiring.js.map +1 -0
- package/dist-server/service/actuation/settle-effects.d.ts +21 -0
- package/dist-server/service/actuation/settle-effects.js +101 -0
- package/dist-server/service/actuation/settle-effects.js.map +1 -0
- package/dist-server/service/actuation/sweep-dispatch.d.ts +37 -0
- package/dist-server/service/actuation/sweep-dispatch.js +125 -0
- package/dist-server/service/actuation/sweep-dispatch.js.map +1 -0
- package/dist-server/service/actuation/twin-command-resolver.d.ts +120 -0
- package/dist-server/service/actuation/twin-command-resolver.js +406 -0
- package/dist-server/service/actuation/twin-command-resolver.js.map +1 -0
- package/dist-server/service/actuation/twin-command.d.ts +111 -0
- package/dist-server/service/actuation/twin-command.js +170 -0
- package/dist-server/service/actuation/twin-command.js.map +1 -0
- package/dist-server/service/actuation/twin-now.d.ts +41 -0
- package/dist-server/service/actuation/twin-now.js +65 -0
- package/dist-server/service/actuation/twin-now.js.map +1 -0
- package/dist-server/service/index.d.ts +5 -2
- package/dist-server/service/index.js +28 -17
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/actuation-routing.d.ts +60 -0
- package/dist-server/service/reference/actuation-routing.js +126 -0
- package/dist-server/service/reference/actuation-routing.js.map +1 -0
- package/dist-server/service/reference/actuation-target.d.ts +65 -0
- package/dist-server/service/reference/actuation-target.js +94 -0
- package/dist-server/service/reference/actuation-target.js.map +1 -0
- package/dist-server/service/reference/connection-portability-resolver.d.ts +29 -0
- package/dist-server/service/reference/connection-portability-resolver.js +181 -0
- package/dist-server/service/reference/connection-portability-resolver.js.map +1 -0
- package/dist-server/service/reference/connection-portability.d.ts +138 -0
- package/dist-server/service/reference/connection-portability.js +230 -0
- package/dist-server/service/reference/connection-portability.js.map +1 -0
- package/dist-server/service/reference/fill-cadence.d.ts +17 -0
- package/dist-server/service/reference/fill-cadence.js +31 -0
- package/dist-server/service/reference/fill-cadence.js.map +1 -0
- package/dist-server/service/reference/fill-dedupe.d.ts +16 -0
- package/dist-server/service/reference/fill-dedupe.js +63 -0
- package/dist-server/service/reference/fill-dedupe.js.map +1 -0
- package/dist-server/service/reference/fill-loop.d.ts +35 -0
- package/dist-server/service/reference/fill-loop.js +187 -0
- package/dist-server/service/reference/fill-loop.js.map +1 -0
- package/dist-server/service/reference/fill-span.d.ts +10 -0
- package/dist-server/service/reference/fill-span.js +37 -0
- package/dist-server/service/reference/fill-span.js.map +1 -0
- package/dist-server/service/reference/hook-contract.d.ts +149 -22
- package/dist-server/service/reference/hook-contract.js +236 -23
- package/dist-server/service/reference/hook-contract.js.map +1 -1
- package/dist-server/service/reference/hook-rejected.d.ts +25 -0
- package/dist-server/service/reference/hook-rejected.js +48 -0
- package/dist-server/service/reference/hook-rejected.js.map +1 -0
- package/dist-server/service/reference/hook-store.d.ts +3 -0
- package/dist-server/service/reference/hook-store.js +28 -0
- package/dist-server/service/reference/hook-store.js.map +1 -0
- package/dist-server/service/reference/index.d.ts +4 -1
- package/dist-server/service/reference/index.js +5 -1
- package/dist-server/service/reference/index.js.map +1 -1
- package/dist-server/service/reference/live-cadence.d.ts +68 -0
- package/dist-server/service/reference/live-cadence.js +44 -0
- package/dist-server/service/reference/live-cadence.js.map +1 -0
- package/dist-server/service/reference/live-feed-lease.d.ts +15 -0
- package/dist-server/service/reference/live-feed-lease.js +56 -0
- package/dist-server/service/reference/live-feed-lease.js.map +1 -0
- package/dist-server/service/reference/live-ingest.d.ts +21 -0
- package/dist-server/service/reference/live-ingest.js +66 -0
- package/dist-server/service/reference/live-ingest.js.map +1 -0
- package/dist-server/service/reference/reference-adapter.d.ts +355 -2
- package/dist-server/service/reference/reference-adapter.js +19 -1
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-fill-run.d.ts +50 -0
- package/dist-server/service/reference/reference-fill-run.js +142 -0
- package/dist-server/service/reference/reference-fill-run.js.map +1 -0
- package/dist-server/service/reference/reference-fill.d.ts +90 -0
- package/dist-server/service/reference/reference-fill.js +141 -0
- package/dist-server/service/reference/reference-fill.js.map +1 -0
- package/dist-server/service/reference/reference-hook.d.ts +64 -6
- package/dist-server/service/reference/reference-hook.js +265 -27
- package/dist-server/service/reference/reference-hook.js.map +1 -1
- package/dist-server/service/reference/reference-link-groups.d.ts +10 -0
- package/dist-server/service/reference/reference-link-groups.js +15 -0
- package/dist-server/service/reference/reference-link-groups.js.map +1 -0
- package/dist-server/service/reference/reference-links.d.ts +14 -0
- package/dist-server/service/reference/reference-links.js +73 -0
- package/dist-server/service/reference/reference-links.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +1 -0
- package/dist-server/service/reference/reference-live.js +32 -6
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +56 -2
- package/dist-server/service/reference/reference-master.js +33 -3
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +27 -0
- package/dist-server/service/reference/reference-resolver.js +79 -1
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +31 -3
- package/dist-server/service/twin-event/twin-event-keys.js +36 -4
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +1 -0
- package/dist-server/service/twin-event/twin-event.js +11 -2
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-model/choose-recipe.d.ts +15 -0
- package/dist-server/service/twin-model/choose-recipe.js +33 -0
- package/dist-server/service/twin-model/choose-recipe.js.map +1 -0
- package/dist-server/service/twin-model/external-resolver.d.ts +76 -0
- package/dist-server/service/twin-model/external-resolver.js +109 -0
- package/dist-server/service/twin-model/external-resolver.js.map +1 -0
- package/dist-server/service/twin-model/project-structure.js +16 -3
- package/dist-server/service/twin-model/project-structure.js.map +1 -1
- package/dist-server/service/twin-model/twin-equipment.d.ts +17 -0
- package/dist-server/service/twin-model/twin-equipment.js +10 -0
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -1
- package/dist-server/service/twin-model/twin-lineage-query.js +75 -1
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.js +94 -5
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-space/twin-space.d.ts +29 -0
- package/dist-server/service/twin-space/twin-space.js +13 -0
- package/dist-server/service/twin-space/twin-space.js.map +1 -1
- package/dist-server/service/twin-subject/event-subjects.d.ts +3 -1
- package/dist-server/service/twin-subject/event-subjects.js +8 -1
- package/dist-server/service/twin-subject/event-subjects.js.map +1 -1
- package/dist-shared/entity-delta.js +1 -1
- package/dist-shared/entity-delta.js.map +1 -1
- package/package.json +7 -7
- package/server/engine/canonical-ingest.ts +119 -33
- package/server/engine/event-time.ts +96 -0
- package/server/engine/index.ts +20 -0
- package/server/engine/ingest-dedupe.ts +203 -27
- package/server/engine/ingest-health.ts +91 -6
- package/server/engine/kpi-fold.ts +24 -1
- package/server/engine/kpi-query.ts +23 -4
- package/server/engine/oee-accumulator.ts +80 -8
- package/server/engine/twin-engine.ts +119 -5
- package/server/index.ts +23 -0
- package/server/migrations/1786600000000-RenameOperatoMesAdapterType.ts +66 -0
- package/server/migrations/1786700000000-AddDispatchRetryColumns.ts +82 -0
- package/server/migrations/index.ts +5 -1
- package/server/routes.ts +19 -20
- package/server/service/actuation/actuation-advisor.ts +124 -0
- package/server/service/actuation/actuation-outcome.ts +97 -0
- package/server/service/actuation/actuation-rule-resolver.ts +147 -0
- package/server/service/actuation/actuation-rule.ts +139 -0
- package/server/service/actuation/approval-gateway.ts +44 -0
- package/server/service/actuation/catch-up-effects.ts +152 -0
- package/server/service/actuation/command-dispatcher.ts +511 -0
- package/server/service/actuation/command-store.ts +236 -0
- package/server/service/actuation/dispatch-after-approval.ts +71 -0
- package/server/service/actuation/effect-match.ts +124 -0
- package/server/service/actuation/index.ts +27 -0
- package/server/service/actuation/retry-plan.ts +145 -0
- package/server/service/actuation/rule-evaluate.ts +352 -0
- package/server/service/actuation/rule-loop.ts +160 -0
- package/server/service/actuation/rule-runner.ts +216 -0
- package/server/service/actuation/rule-wiring.ts +84 -0
- package/server/service/actuation/settle-effects.ts +115 -0
- package/server/service/actuation/sweep-dispatch.ts +179 -0
- package/server/service/actuation/twin-command-resolver.ts +387 -0
- package/server/service/actuation/twin-command.ts +232 -0
- package/server/service/actuation/twin-now.ts +97 -0
- package/server/service/index.ts +11 -0
- package/server/service/reference/actuation-routing.ts +165 -0
- package/server/service/reference/actuation-target.ts +163 -0
- package/server/service/reference/connection-portability-resolver.ts +171 -0
- package/server/service/reference/connection-portability.ts +285 -0
- package/server/service/reference/fill-cadence.ts +29 -0
- package/server/service/reference/fill-dedupe.ts +66 -0
- package/server/service/reference/fill-loop.ts +153 -0
- package/server/service/reference/fill-span.ts +31 -0
- package/server/service/reference/hook-contract.ts +280 -22
- package/server/service/reference/hook-rejected.ts +53 -0
- package/server/service/reference/hook-store.ts +28 -0
- package/server/service/reference/index.ts +5 -1
- package/server/service/reference/live-cadence.ts +129 -0
- package/server/service/reference/live-feed-lease.ts +56 -0
- package/server/service/reference/live-ingest.ts +94 -0
- package/server/service/reference/reference-adapter.ts +392 -5
- package/server/service/reference/reference-fill-run.ts +165 -0
- package/server/service/reference/reference-fill.ts +223 -0
- package/server/service/reference/reference-hook.ts +355 -32
- package/server/service/reference/reference-link-groups.ts +21 -0
- package/server/service/reference/reference-links.ts +77 -0
- package/server/service/reference/reference-live.ts +30 -5
- package/server/service/reference/reference-master.ts +90 -5
- package/server/service/reference/reference-resolver.ts +77 -2
- package/server/service/twin-event/twin-event-keys.ts +37 -4
- package/server/service/twin-event/twin-event.ts +18 -1
- package/server/service/twin-model/choose-recipe.ts +31 -0
- package/server/service/twin-model/external-resolver.ts +161 -0
- package/server/service/twin-model/project-structure.ts +16 -3
- package/server/service/twin-model/twin-equipment.ts +22 -0
- package/server/service/twin-model/twin-lineage-query.ts +82 -1
- package/server/service/twin-model/twin-model-item-query.ts +95 -4
- package/server/service/twin-model/twin-model-tree-query.ts +1 -1
- package/server/service/twin-space/twin-space.ts +39 -0
- package/server/service/twin-subject/event-subjects.ts +8 -1
- package/shared/entity-delta.ts +1 -1
- package/test/ack-shape-alignment.test.ts +97 -0
- package/test/actuation-approval-door.test.ts +421 -0
- package/test/actuation-dispatch.test.ts +209 -0
- package/test/actuation-effect.test.ts +162 -0
- package/test/actuation-outcome.test.ts +152 -0
- package/test/actuation-rule-runner.test.ts +281 -0
- package/test/actuation-rule.test.ts +266 -0
- package/test/actuation-seam.test.ts +249 -0
- package/test/actuation-settle.test.ts +164 -0
- package/test/actuation-target.test.ts +145 -0
- package/test/canonical-ingest-vocabularies.test.ts +49 -2
- package/test/capability-mapping.test.ts +1 -1
- package/test/choose-recipe.test.ts +117 -0
- package/test/command-store-writes-columns.test.ts +126 -0
- package/test/connection-portability-doors.test.ts +87 -0
- package/test/connector-capability-declaration.test.ts +54 -4
- package/test/declaration-reaches-model.test.ts +43 -0
- package/test/dedupe-transformation.test.ts +112 -0
- package/test/entity-delta.test.ts +1 -1
- package/test/event-subjects.test.ts +2 -1
- package/test/external-resolver.test.ts +171 -0
- package/test/fill-dedupe.test.ts +59 -0
- package/test/fill-loop.test.ts +35 -0
- package/test/first-envelope.test.ts +153 -0
- package/test/fold-shift-dst.test.ts +110 -0
- package/test/home-in-area.test.ts +90 -0
- package/test/hook-rejected-shape.test.ts +86 -0
- package/test/hook-response-sum.test.ts +193 -0
- package/test/hook-sequence.test.ts +333 -0
- package/test/ingest-dedupe.test.ts +56 -0
- package/test/ingest-expected-quiet.test.ts +111 -0
- package/test/ingest-idempotent.test.ts +79 -0
- package/test/ingest-reconcile-four-ways.test.ts +97 -0
- package/test/ingest-rules-header.test.ts +100 -0
- package/test/ingest-window-rolls-unobserved.test.ts +72 -0
- package/test/intake-mapping-parity.test.ts +175 -0
- package/test/live-cadence.test.ts +170 -0
- package/test/live-feed-lease.test.ts +63 -0
- package/test/live-mirror-parity.test.ts +1 -1
- package/test/oee-accumulator.test.ts +3 -3
- package/test/oee-site-calendar.test.ts +146 -0
- package/test/order-and-transaction-split.test.ts +107 -0
- package/test/reference-fill.test.ts +235 -0
- package/test/reference-hook.test.ts +114 -23
- package/test/reference-links.test.ts +56 -0
- package/test/retry-plan.test.ts +139 -0
- package/test/sweep-dispatch.test.ts +191 -0
- package/test/twin-event-keys.test.ts +20 -6
- package/test/twin-model-item-db.test.ts +6 -6
- package/test/twin-model-tree-db.test.ts +6 -6
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference-resolver.js","sourceRoot":"","sources":["../../../server/service/reference/reference-resolver.ts"],"names":[],"mappings":";;;;AAAA,iDAA8C;AAC9C,mEAA4E;AAC5E,uEAAwD;AACxD,+CAA4E;AAE5E,iDAAmE;AAEnE,oDAAkD;AAClD,sEAAkE;AAClE,wDAA0D;AAE1D,yDAAsE;AAEtE,+DAAgG;AAChG,wEAAgE;AAChE,2DAAmD;AACnD,mEAAsE;AACtE,iEAAmF;AACnF,+DAG8B;AAC9B,uDAAqD;AACrD,2DAA4D;AAC5D,iEAAmE;AAEnE;;;GAGG;AAEH;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAClC,MAAM,OAAO,GAAG,kBAAkB,CAAA;AAElC,SAAS,WAAW,CAAI,IAAgB,EAAE,EAAU;IAClD,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAClG,IAAI,CAAC,IAAI,CACP,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,EACxC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CACxC,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,OAAO,CAAC,OAAwB,EAAE,CAAM,EAAE,QAAgB;IACjE,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7D,MAAM,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/E,8DAA8D;IAC9D,MAAM,SAAS,GAAG,CAAC,EAAE,OAAO,IAAI,QAAQ,CAAA;IACxC,MAAM,OAAO,GACX,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC,KAAK,UAAU;QACrC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QACjG,CAAC,CAAC,SAAS,CAAA;IACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AACxH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,yBAAyB,CACtC,KAAqC,EACrC,SAA8B,EAC9B,QAAgB,EAChB,OAAgB;IAEhB,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,eAAe,CAAC,CAAA;IACtE,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAC9B,MAAM,GAAG,GAAqC,EAAE,CAAA;IAChD,IAAI,GAA+C,CAAA;IACnD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM;YAAE,SAAQ,CAAC,kBAAkB;QACrE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;YACrB,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,+BAAY,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YACrG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAwC,CAAA;YAC5D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,MAAM,CAAC,IAAI,IAAA,iCAAkB,EAAE,CAAC,CAAC,KAAa,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC3D,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBAAE,SAAQ;oBAC9C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAE,CAAS,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;gBACnF,CAAC;YACH,CAAC;YACD,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1B,CAAC;QACD,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;QACtB,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAGM,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAChC,uCAAuC;IAEjC,AAAN,KAAK,CAAC,gBAAgB,CAAQ,OAAwB;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,MAAM,GAAG,GAAU,EAAE,CAAA;QACrB,KAAK,MAAM,CAAC,IAAI,IAAA,sCAAc,GAAE,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAa,EAAC,+BAAY,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YACpH,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM;gBACzF,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM;gBACjF,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM;gBAC1C,QAAQ,EAAE,CAAC,CAAC,GAAG;gBACf,OAAO,EAAE,qBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;aAC7C,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,wDAAwD;IAMlD,AAAN,KAAK,CAAC,mBAAmB,CACR,MAAc,EACP,aAAqB,EACpC,OAAwB,EACG,KAAe;QAEjD,MAAM,MAAM,GAAG,IAAA,oCAAY,EAAC,MAAM,CAAC,CAAA;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,MAAM,EAAE,EAAE,CAAA;QAC/E,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,IAAI,CAAC;YACH;;gEAEoD;YACpD,MAAM,GAAG,GAAG,MAAM,qBAAU,CAAC,YAAY,CACvC,QAAQ,EACR,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EACpD,IAAA,qCAAiB,EAAC,aAAa,EAAE,qBAAqB,CAAC,EACvD,SAAS,EACT,OAAO,CAAC,KAAK,CAAC,IAAI,CACnB,CAAA;YACD,IAAI,KAAK;gBAAE,MAAM,qBAAU,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;YACvE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/F,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,eAAe,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IAMG,AAAN,KAAK,CAAC,UAAU,CAAoB,UAAkB,EAAS,OAAwB;QACrF,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,+BAAY,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;QAC3G,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,UAAU,EAAE,EAAE,CAAA;QAErE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAa,CAAA;QACjC,IAAI,CAAC,MAAM,EAAE,IAAI;YACf,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,SAAS,UAAU,uIAAuI;aAClK,CAAA;QAEH;;;;;;WAMG;QACH,MAAM,cAAc,GAAuB,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;QAClG,MAAM,MAAM,GAAG,cAAc;YAC3B,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC;YAC7G,CAAC,CAAC,IAAI,CAAA;QACR,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,IAAA,iCAAU,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3E,MAAM,aAAa,GAAG,eAAe,EAAE,WAAW,EAAE,MAAM,CAAA;QAC1D,MAAM,SAAS,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,GAAG,kCAAU,CAAC,MAAM,CAAA;QAC7F,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,UAAU,CAAA;QAC1C,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,QAAQ,GAA8B,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAA8B,CAAA;QACzH,MAAM,IAAI,GAAG,CAAC,CAAgE,EAAE,EAAE;YAChF,IAAI,CAAC,cAAc;gBAAE,OAAM;YAC3B,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAA;YACjB,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAA;YACjB,cAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE;gBACxC,qBAAqB,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE;aACzH,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAC5E,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAC3E,CAAA;YACD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACvE;;;;eAIG;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAA;YAChD,0DAA0D;YAC1D,MAAM,GAAG,GAAG,MAAM,qBAAU,CAAC,YAAY,CACvC,QAAQ,EACR,MAAM,EACN,IAAA,qCAAiB,EAAC,IAAI,CAAC,aAAa,EAAE,mBAAmB,UAAU,GAAG,CAAC,EACvE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,EAC9C,OAAO,CAAC,KAAK,CAAC,IAAI,CACnB,CAAA;YACD,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACzE;;;eAGG;YACH,IAAI,MAAM,IAAI,cAAc,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAI,MAAM,CAAC,SAAiB,IAAI,EAAE,CAAA;gBAChD,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,MAAM,CACvC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EACjB;oBACE,SAAS,EAAE,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,IAAA,sCAAY,EAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE;iBAC9G,CACT,CAAA;YACH,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/F,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,mDAAmD;YACnD,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAA8B;gBACzF,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC;aAC/B,CAAC,CAAA;YACF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,eAAe,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAED,uDAAuD;IAC/C,KAAK,CAAC,gBAAgB,CAC5B,QAAgB,EAChB,MAAW,EACX,UAAkB;IAClB;;;;;;;;;OASG;IACH,MAAiF;QAEjF,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAA,kCAAW,EAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAC1C,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,UAAU,gCAAgC,CAAC,CAAA;YACjG;0DAC8C;YAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;YACjD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;YACtB,OAAO,MAAM,CAAA;QACf,CAAC;QAED;4DACoD;QACpD,MAAM,QAAQ,GAAG,IAAA,oCAAY,EAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC5C,IAAI,QAAQ;YAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,CAAA;QAE5C,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACtH,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,MAAM,CAAC,MAAM,qDAAqD,CAAC,CAAA;QAC3G,MAAM,OAAO,GAAG,IAAA,iCAAU,EAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;QACxE,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QAE9C;;;;;;;;;;;;WAYG;QACH,MAAM,MAAM,GAAG,IAAA,oCAAc,EAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAA;QAC5F,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;YAC/B,MAAM,IAAI,KAAK,CACb,cAAc,MAAM,CAAC,MAAM,6BAA6B,MAAM,CAAC,MAAM,2DAA2D,CACjI,CAAA;QAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACnD,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;gBAAE,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAA;QACpG,CAAC;QACD,MAAM,IAAI,KAAK,CACb,cAAc,MAAM,CAAC,MAAM,gDAAgD,UAAU,IAAI;YACvF,sJAAsJ,CACzJ,CAAA;IACH,CAAC;IAED,uDAAuD;IAEjD,AAAN,KAAK,CAAC,aAAa,CAAQ,QAAyB;QAClD,OAAO,IAAA,oCAAa,GAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACjJ,CAAC;IAED,uEAAuE;IAMjE,AAAN,KAAK,CAAC,kBAAkB,CACH,UAAkB,EACA,MAAW,EAC1B,aAAqB,EACpC,OAAwB,EACG,KAAe,EACoG,OAAgB;QAErK,MAAM,GAAG,GAAG,IAAA,kCAAW,EAAC,UAAU,CAAC,CAAA;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,UAAU,EAAE,EAAE,CAAA;QACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,IAAI,CAAC;YACH;;;;;eAKG;YACH,MAAM,MAAM,GAAG,IAAA,iCAAc,EAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAChD,MAAM,SAAS,GAAG,IAAA,oCAAiB,EAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YACtD;;;;;;;eAOG;YACH,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;YACxF,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACjD;;6CAEiC;YACjC,gEAAgE;YAChE,MAAM,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;YACpG;uEAC2D;YAC3D,MAAM,GAAG,GAAG,MAAM,qBAAU,CAAC,YAAY,CACvC,QAAQ,EACR,MAAM,EACN,IAAA,qCAAiB,EAAC,aAAa,EAAE,uBAAuB,UAAU,IAAI,CAAC,EACvE,EAAE,OAAO,EAAE,EACX,OAAO,CAAC,KAAK,CAAC,IAAI,CACnB,CAAA;YACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,qBAAU,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;gBAC5D,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,qBAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACZ,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;wBAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG;gBACf,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAA,wCAAkB,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,0CAAoB,EAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBAClF,GAAG,GAAG,CAAC,QAAQ;aAChB,CAAA;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAA;QACjF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IAGG,AAAN,KAAK,CAAC,cAAc,CAAQ,OAAwB;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7F;;;;;;;WAOG;QACH,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,CAAC,MAAM,IAAA,qBAAa,EAAC,+BAAY,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAC3G,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAClB,CACF,CAAA;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAClB,MAAM,QAAQ,GAAI,CAAE,CAAC,CAAC,SAAiB,EAAE,QAAQ,IAAI,EAAE,CAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;YACzG,OAAO;gBACL,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW;gBACpF,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS;gBAClG,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ;aACzC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAGD,qBAAqB;QACnB,OAAO,IAAA,uCAAgB,GAAE,CAAA;IAC3B,CAAC;IAED;;;;OAIG;IAEG,AAAN,KAAK,CAAC,eAAe,CAAQ,OAAwB;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7F,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,+BAAY,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;QACjI,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAA;QACvC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,aAAa,GAAI,CAAC,CAAC,SAAiB,EAAE,aAAa,IAAI,CAAC,CAAC,WAAW,CAAA;YAC1E,MAAM,aAAa,GAAI,CAAE,CAAC,CAAC,SAAiB,EAAE,QAAQ,IAAI,EAAE,CAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAA;YACrH,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAA;YAC9I,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;YAC7D,MAAM,CAAC,GAAG,CAAC,aAAa,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,CAAC;QACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,aAAa;YACb,eAAe,EAAE,WAAW,CAAC,MAAM;YACnC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;YACnE,WAAW;SACZ,CAAC,CAAC,CAAA;IACL,CAAC;IAED,gEAAgE;IAE1D,AAAN,KAAK,CAAC,cAAc,CAAgB,MAAc,EAAS,OAAwB;QACjF,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,MAAM,CAAC,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QACrG,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QACnB,MAAM,QAAQ,GAAG,CAAE,CAAC,CAAC,SAAiB,EAAE,QAAQ,IAAI,EAAE,CAAU,CAAA;QAChE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,+BAAY,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACtI,MAAM,SAAS,GAAG,QAAQ;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE;YACP,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAQ,CAAA;YAC7C,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAA;QACnK,CAAC,CAAC,CAAA;QACJ,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,aAAa,EAAG,CAAC,CAAC,SAAiB,EAAE,aAAa,IAAI,CAAC,CAAC,WAAW;YACnE,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,SAAS;SACV,CAAA;IACH,CAAC;IAED,gFAAgF;IAE1E,AAAN,KAAK,CAAC,aAAa,CAAgB,MAAc,EAAS,OAAwB;QAChF,MAAM,CAAC,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QACpH,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QACnB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,IAAA,iCAAU,EAAC,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACvH,MAAM,GAAG,GAAQ,EAAE,CAAA;QACnB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAE,CAAC,CAAC,gBAAwB,IAAI,EAAE,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5H;;;;WAIG;QACH,MAAM,mBAAmB,GAAG;YAC1B,GAAG,IAAI,GAAG,CACR,CAAE,CAAC,CAAC,SAAiB,EAAE,QAAQ,IAAI,EAAE,CAAC;iBACnC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC;iBAC9B,MAAM,CAAC,CAAC,CAAM,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CACjE;SACF,CAAA;QACD,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW;YACpF,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS;YACzH,mBAAmB;SACpB,CAAA;IACH,CAAC;IAGD,iBAAiB;QACf;;;;;;;;WAQG;QACH,OAAO,IAAA,mCAAY,GAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAC3G,CAAC;IAIK,AAAN,KAAK,CAAC,iBAAiB,CACN,MAAc,EACO,KAAU,EACvC,OAAwB;QAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAA;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QACpF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAC3B,IAAI,CAAC,MAAM,CAAC;YACV,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnB,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAS;YAC/B,MAAM;YACN,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,MAAM;YACxC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,QAAQ;YAC9C,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,EAAE,WAAW;YACvD,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,EAAE,WAAW;YACvD,kDAAkD;YAClD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACtC,CAAC,CAAC,EAAE,GAAG,CAAE,QAAQ,EAAE,gBAAwB,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,gBAAgB,EAAE;gBAC/E,CAAC,CAAC,QAAQ,EAAE,gBAAgB;YAC9B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,EAAE,WAAW;YACvD,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS;YACjD,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,MAAM,IAAI,OAAO;SACpD,CAAC,CACH,CAAA;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;IAC3C,CAAC;IAED,6FAA6F;IAGvF,AAAN,KAAK,CAAC,mBAAmB,CACR,MAAc,EACtB,OAAwB,EACS,WAAqB;QAE7D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QAC/E,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,IAAK,CAAE,GAAG,CAAC,SAAiB,EAAE,QAAQ,IAAI,EAAE,CAAW,EAAE,CAAC;gBACpE,IAAI,CAAC;oBACH,MAAM,qBAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;gBACjD,CAAC;gBAAC,MAAM,CAAC;oBACP,kCAAkC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAS,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;IAIK,AAAN,KAAK,CAAC,uBAAuB,CAAgB,MAAc,EAAS,OAAwB;QAC1F,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QAC9F,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,MAAM,EAAE,EAAE,CAAA;QACrE,MAAM,OAAO,GAAG,IAAA,iCAAU,EAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,GAAG,CAAC,WAAW,EAAE,EAAE,CAAA;QACpF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAA;YACpE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,EAAS,CAAC,CAAA;YAClH,OAAO,GAAG,CAAA;QACZ,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,aAAa,EAAE,CAAA;QAC1D,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,wDAAwD;IAElD,AAAN,KAAK,CAAC,sBAAsB,CAAgB,MAAc,EAAS,OAAwB;QACzF;;;;;WAKG;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QACtH,IAAI,CAAC,GAAG;YAAE,OAAO,IAAA,4BAAM,EAAC,IAAA,uCAAiB,EAAC,MAAM,CAAC,CAAC,CAAA;QAClD,MAAM,OAAO,GAAG,IAAA,iCAAU,EAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAA,4BAAM,EAAC,IAAA,oCAAc,EAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAA;QACpE,IAAI,CAAC;YACH;;;;eAIG;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAA;YACvG,OAAO,IAAA,gCAAU,EAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAA,4BAAM,EAAC,IAAA,uCAAiB,EAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC,CAAC,CAAA;YAC7F,OAAO,IAAA,4BAAM,EAAC,IAAA,qCAAe,EAAC,MAAM,EAAE,IAAA,8BAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IAMG,AAAN,KAAK,CAAC,mBAAmB,CACR,MAAc,EACtB,OAAwB,EACuB,OAAkB,EACtC,KAAe,EAChB,IAAc,EACiJ,OAAgB,EACN,aAAsB;QAEhO,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,iCAAa,CAAC,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;QAC/E,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,MAAM,EAAE,EAAE,CAAA;QACrE,MAAM,OAAO,GAAG,IAAA,iCAAU,EAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,GAAG,CAAC,WAAW,EAAE,EAAE,CAAA;QACpF,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAA;QACtC,IAAI,CAAC;YACH,IAAI,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;YAC5C,IAAI,OAAO,EAAE,MAAM;gBAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;YAC1E,0DAA0D;YAC1D,MAAM,OAAO,GAAG,IAAA,mCAAiB,EAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACxD,IAAI,OAAO;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;YAC/G,MAAM,SAAS,GAAU,EAAE,CAAA;YAC3B,MAAM,MAAM,GAAU,EAAE,CAAA;YACxB;;;;;;;;;eASG;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAA;YAC5C,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,kCAAU,CAAC,MAAM,CAAA;YACnF,MAAM,IAAI,GAAG,CAAC,CAAuC,EAAE,EAAE,CACvD,cAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE;gBACxC,qBAAqB,EAAE,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,MAAM,EAAE;aAC9F,CAAC,CAAA;YAEJ;;;;;;;;;;eAUG;YACH,MAAM,WAAW,GAA4B,EAAE,CAAA;YAE/C,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBAChD;;;;;;;;;;;mBAWG;gBACH,IAAI,QAAQ,GAAG,CAAC,CAAA;gBAChB,IAAI,QAAQ,GAA8B,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAA8B,CAAA;gBAChH,MAAM,KAAK,GAAG,CAAC,CAAuC,EAAE,EAAE;oBACxD,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAA;oBACjB,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAA;oBACjB,IAAI,CAAC,CAAC,CAAC,CAAA;gBACT,CAAC,CAAA;gBACD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CACvD,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAC5G,CAAA;oBACD;wEACoD;oBACpD;;;;uBAIG;oBACH,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAA,sCAAY,EAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;oBAC5D,MAAM,MAAM,GAAG,IAAA,qCAAiB,EAAC,aAAa,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,wBAAwB,MAAM,IAAI,CAAC,CAAA;oBACpH,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;oBACnG,MAAM,GAAG,GAAG,MAAM,qBAAU,CAAC,YAAY,CACvC,QAAQ,EACR,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAC1G,MAAM,EACN,EAAE,OAAO,EAAE,EACX,OAAO,CAAC,KAAK,CAAC,IAAI,CACnB,CAAA;oBACD,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;oBACrG,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;wBACpB,6EAA6E;wBAC7E;yEACiD;wBACjD,MAAM,QAAQ,GAAG,IAAI;4BACnB,CAAC,CAAC,MAAM,IAAA,0CAAsB,EAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC;4BAChG,CAAC,CAAC,KAAK,CAAA;wBACT,IAAI,CAAC,QAAQ;4BAAE,MAAM,qBAAU,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;wBAC3E,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;oBACpJ,CAAC;yBAAM,CAAC;wBACN,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;oBACxI,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB;;;uBAGG;oBACH,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAA8B,CAAA;oBACrF,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;oBAElI,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAA;gBACrE,CAAC;YACH,CAAC;YACD,6EAA6E;YAC7E,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAC5G,MAAM,IAAI,GAAU,CAAE,GAAG,CAAC,SAAiB,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;YACtI,MAAM,IAAI,CAAC,MAAM,CACf,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EACd;gBACE,MAAM,EAAE,WAAW;gBACnB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACtC,sEAAsE;gBACtE,gBAAgB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBACrE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACrG,CAAC,CAAC,IAAI;gBACR;;;;;mBAKG;gBACH,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,oBAAoB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;gBACtI;;;;;;;;mBAQG;gBACH,SAAS,EAAE;oBACT,GAAG,CAAE,GAAG,CAAC,SAAiB,IAAI,EAAE,CAAC;oBACjC,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC;oBACnC,oDAAoD;oBACpD,WAAW,EAAE,EAAE,GAAG,CAAC,CAAE,GAAG,CAAC,SAAiB,IAAI,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE;oBACtF,GAAG,CAAC,MAAM,CAAC,MAAM;wBACf,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE;wBAChH,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;iBAC1B;aACK,CACT,CAAA;YACD,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;QACxD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,mEAAmE;YACnE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,IAAI,eAAe,EAAS,CAAC,CAAA;YACvG,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,eAAe,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;CACF,CAAA;AAptBY,sDAAqB;AAG1B;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,EAAE,EAAE,WAAW,EAAE,mFAAmF,EAAE,CAAC;IAC/G,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6DAiB5B;AAQK;IALL,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE;QACjC,WAAW,EACT,iVAAiV;KACpV,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IACb,mBAAA,IAAA,kBAAG,EAAC,eAAe,CAAC,CAAA;IACpB,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;;;;gEAqBlC;AAyBK;IALL,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE;QACjC,WAAW,EACT,gOAAgO;KACnO,CAAC;IACgB,mBAAA,IAAA,kBAAG,EAAC,YAAY,CAAC,CAAA;IAAsB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;uDAmF7D;AAyEK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,EAAE,EAAE,WAAW,EAAE,mFAAmF,EAAE,CAAC;IAClH,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0DAEzB;AAQK;IALL,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE;QACjC,WAAW,EACT,wPAAwP;KAC3P,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,YAAY,CAAC,CAAA;IACjB,mBAAA,IAAA,kBAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,oBAAY,CAAC,CAAA;IACnC,mBAAA,IAAA,kBAAG,EAAC,eAAe,CAAC,CAAA;IACpB,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAChC,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kGAAkG,EAAE,CAAC,CAAA;;;;+DAyDrJ;AAOK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,EAAE,EAAE,WAAW,EAAE,gEAAgE,EAAE,CAAC;IAC9F,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;2DAwB1B;AAGD;IADC,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;;;;kEAG3F;AAQK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,EAAE,EAAE,WAAW,EAAE,2GAA2G,EAAE,CAAC;IACxI,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;4DAkB3B;AAIK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,+GAA+G,EAAE,CAAC;IAC3J,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IAAkB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;2DAsBzD;AAIK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kGAAkG,EAAE,CAAC;IAC/I,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IAAkB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;0DAuBxD;AAGD;IADC,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,EAAE,EAAE,WAAW,EAAE,kHAAkH,EAAE,CAAC;;;;8DAYrK;AAIK;IAFL,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;IAEhH,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IACb,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,oBAAY,CAAC,CAAA;IAClC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;8DAwBP;AAKK;IAFL,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,yJAAyJ,EAAE,CAAC;IAEtM,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IACb,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;;;;gEAgBxC;AAIK;IAFL,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;IACpF,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IAAkB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oEAalE;AAQK;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,WAAW,EAAE,kLAAkL,EAAE,CAAC;IACtM,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IAAkB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mEAuBjE;AAoBK;IALL,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,oBAAY,EAAE;QACjC,WAAW,EACT,whBAAwhB;KAC3hB,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IACb,mBAAA,IAAA,kBAAG,GAAE,CAAA;IACL,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAChC,mBAAA,IAAA,kBAAG,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/B,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6IAA6I,EAAE,CAAC,CAAA;IAC9L,mBAAA,IAAA,kBAAG,EAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iJAAiJ,EAAE,CAAC,CAAA;;;;gEA6J1M;gCAntBU,qBAAqB;IADjC,IAAA,uBAAQ,GAAE;GACE,qBAAqB,CAotBjC","sourcesContent":["import { pubsub } from '@things-factory/shell'\nimport { HOST_STEPS, type ReferenceProgress } from './reference-progress.js'\nimport { assessMaster } from './reference-assessment.js'\nimport { Arg, Ctx, Mutation, Query, Resolver, Directive} from 'type-graphql'\n\nimport { ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { readRestartPolicy } from '../../engine/restart-policy.js'\nimport { readBoardEquipment } from '@operato/ops-contract'\n\nimport { applyKnobDefaults, filledKnobKeys } from './knob-defaults.js'\nimport type { KnobDef } from './template-registry.js'\nimport { knobDefaultsFilled, pickOriginSite, siteEquipmentAdopted } from './reference-master.js'\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinReference } from './twin-reference.js'\nimport { listReferences, getReference } from './reference-registry.js'\nimport { getAdapter, listAdapterTypes, listAdapters } from './reference-adapter.js'\nimport {\n discovered, failed, detailOf,\n referenceNotFound, adapterUnknown, discoveryFailed, discoveryTimedOut\n} from './discovery-result.js'\nimport { refuseImportSpace } from './ingest-space.js'\nimport { startReferenceLiveFeed } from './reference-live.js'\nimport { listTemplates, getTemplate } from './template-registry.js'\n\n/*\n * Face2 레퍼런스 인제스트 채널(ADR-0018) — 등록된 레퍼런스 소스를 열거하고, 골라서 트윈으로 인제스트.\n * \"연결하고 내 것을 불러온다\" — 엔티티는 레퍼런스에서 오지 손배선/발명이 아니다.\n */\n\n/**\n * 발견 조회의 시간 상한 — 15초.\n *\n * 어댑터 계약에 시간 제한이 없다. 주소가 틀린 엔드포인트는 답하지 않고, 그러면 화면이 무한히 로딩된다 —\n * 사용자에게는 \"실패\" 보다 못한 상태다(무엇을 기다리는지 모른 채 기다린다). 실 시스템 조회가 몇 초\n * 걸리는 것은 정상이므로 넉넉히 두되, 끝은 있어야 한다.\n */\nconst DISCOVER_TIMEOUT_MS = 15_000\nconst TIMEOUT = 'discover-timeout'\n\nfunction withTimeout<T>(work: Promise<T>, ms: number): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(Object.assign(new Error('timeout'), { code: TIMEOUT })), ms)\n work.then(\n v => { clearTimeout(timer); resolve(v) },\n e => { clearTimeout(timer); reject(e) }\n )\n })\n}\n\n/**\n * 거절을 **사용자 언어로 옮겨 보낸다** — 번역은 한 곳에서 한다.\n *\n * ── 왜 서버인가 (2026-08-14) ────────────────────────────────────────────────\n * 실측: 실행 중인 트윈을 다시 프로비저닝하면 「instance \"order-check\" is running — stop before\n * re-provisioning」 이라는 **영어 한 줄이 토스트로** 떴다(다섯 언어 제품에서).\n *\n * 서버와 앱은 **같은 사전**을 쓰고, 사용자의 현재 언어가 백엔드에 반영된다. 그래서 이 문구는 서버가\n * 옮기는 것이 맞다 — 프레임워크가 이미 같은 규약이다(`authenticate-401-middleware` 가\n * `context.t('error.' + errorCode, detail)` 로 옮긴다).\n *\n * ── 그러면 코드는 왜 함께 보내나 ────────────────────────────────────────────\n * 화면이 **구조로** 다뤄야 하는 거절이 따로 있다(정합성 표의 행·심각도·수리 버튼 — 그것들은\n * `twin.compose.chk.*` 처럼 화면이 옮긴다). 그리고 브라우저가 아닌 소비자(AI·스크립트·API)에게는\n * 코드가 계약이다. 문장과 코드는 서로를 대신하지 않는다.\n *\n * **두 곳에서 같은 코드를 옮기지 않는다** — 문장이 두 벌이 되면 반드시 어긋난다.\n */\nfunction refusal(context: ResolverContext, e: any, fallback: string): Record<string, unknown> {\n const code = typeof e?.code === 'string' ? e.code : undefined\n const params = e?.params && typeof e.params === 'object' ? e.params : undefined\n /* 영어 canonical 은 항상 남긴다 — 번역 키가 없으면 그것이 보이고, 로그에는 그것이 남는다. */\n const canonical = e?.message || fallback\n const message =\n code && typeof context.t === 'function'\n ? String(context.t(`twin.provision.err.${code}`, { ...(params ?? {}), defaultValue: canonical }))\n : canonical\n return { ok: false, error: message, ...(code ? { errorCode: code } : {}), ...(params ? { errorParams: params } : {}) }\n}\n\n/**\n * `siteEquipmentIds` 노브를 이 현장의 설비로 채운다 — **비어 있을 때만.**\n *\n * 사용자가 목록을 직접 준 경우에는 손대지 않는다(고른 것이 정본이다). 현장이 없으면 채울 것도 없다.\n * 등록부의 모델에서 읽는다(런타임이 아니다) — 트윈이 도는 중이 아니어도 그 현장의 설비는 사실이다.\n */\nasync function resolveSiteEquipmentKnobs(\n knobs: readonly KnobDef[] | undefined,\n effective: Record<string, any>,\n domainId: string,\n spaceId?: string\n): Promise<{ key: string; count: number }[]> {\n const targets = (knobs ?? []).filter(k => k?.type === 'siteEquipment')\n if (!targets.length) return []\n const out: { key: string; count: number }[] = []\n let ids: { id: string; kind: string }[] | undefined\n for (const k of targets) {\n const given = effective[k.key]\n if (Array.isArray(given) && given.length) continue // 사용자가 고른 것이 정본이다\n if (!spaceId) {\n effective[k.key] = []\n continue\n }\n if (ids === undefined) {\n const rows = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n const seen = new Map<string, { id: string; kind: string }>()\n for (const r of rows) {\n for (const e of readBoardEquipment((r.model as any) ?? {})) {\n if (!e?.id || seen.has(String(e.id))) continue\n seen.set(String(e.id), { id: String(e.id), kind: String((e as any).kind ?? '') })\n }\n }\n ids = [...seen.values()]\n }\n effective[k.key] = ids\n out.push({ key: k.key, count: ids.length })\n }\n return out\n}\n\n@Resolver()\nexport class TwinReferenceResolver {\n /** 등록된 레퍼런스 소스 목록(요약 + 이미 인제스트됐는지). */\n @Query(returns => [ScalarObject], { description: 'List registered reference sources (virtual or real adapters) available to ingest.' })\n async referenceSources(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const out: any[] = []\n for (const m of listReferences()) {\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId: m.source } })\n out.push({\n source: m.source,\n system: m.system,\n siteName: m.siteName,\n locationCount: m.locations.filter(l => l.role === 'location' || l.role === 'both').length,\n areaCount: m.locations.filter(l => l.role === 'area' || l.role === 'both').length,\n equipmentCount: (m.equipment ?? []).length,\n imported: !!reg,\n running: TwinEngine.owns(domainId, m.source)\n })\n }\n return out\n }\n\n /** 소스를 인제스트 → 공간 + 인스턴스 생성(provision). start 면 기동까지. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Ingest a registered reference source into a twin (space + instance). Optionally start it. restartPolicy declares how the new twin treats its own past on reboot: 'resync' (read the source again) | 'resume' (continue its journal) | 'reset' (wipe and replay from the seed). It has no default — a twin cannot exist without the declaration.\"\n })\n async importFromReference(\n @Arg('source') source: string,\n @Arg('restartPolicy') restartPolicy: string,\n @Ctx() context: ResolverContext,\n @Arg('start', { nullable: true }) start?: boolean\n ): Promise<any> {\n const master = getReference(source)\n if (!master) return { ok: false, error: `unknown reference source: ${source}` }\n const domainId = context.state.domain.id\n try {\n /* 어디서 왔는지 남긴다 — 이것이 없으면 이 트윈은 두 번 다시 읽을 수 없다.\n 이 경로는 **메모리에 등록된 마스터 하나**를 그대로 쓰므로 사이트 서술자가 없다(사이트 정체를\n 적을 것이 없다). 다시 읽기도 같은 등록본을 집으므로 사이트를 찾을 필요가 없다. */\n const res = await TwinEngine.ingestMaster(\n domainId,\n { ...master, origin: { kind: 'reference', source } },\n readRestartPolicy(restartPolicy, 'importFromReference'),\n undefined,\n context.state.user\n )\n if (start) await TwinEngine.startFromRegistry(domainId, res.instanceId)\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings: res.warnings }\n } catch (e: any) {\n return refusal(context, e, 'ingest failed')\n }\n }\n\n /**\n * **원본에서 다시 읽는다** — 이 트윈의 구조를 지금의 원본 모습으로 갱신한다.\n *\n * ── 왜 진입점이 하나여야 하나 ──────────────────────────────────────────────\n * 지금까지 다시 읽기는 **만드는 경로에 얹혀 있었다**(`importFromReference`·`createFromTemplate`).\n * 그래서 이미 있는 트윈을 갱신하려면 만들 때 무엇을 골랐는지 사람이 기억해 같은 화면을 다시\n * 거쳐야 했고, 템플릿으로 세운 트윈은 노브를 어디에도 안 남겨서 **아예 갱신할 방법이 없었다.**\n * 원천이 무엇이든 트윈 자신이 기억하게 하고(`TwinInstance.origin`), 여기 한 곳에서 그것을 따른다.\n *\n * ── 무엇이 일어나나 ────────────────────────────────────────────────────────\n * 원본에서 마스터를 다시 얻어 인제스트에 그대로 태운다. 그다음은 인제스트가 아는 일이다 —\n * 구조가 달라졌으면 새 리비전이 남고, 구조 행이 다시 그려지고, **실행 중인 미러는 멈추지 않고\n * 전환한다.** 실행 중인 시뮬레이션은 거절된다(조건이 바뀐 실험은 다른 실험이다).\n *\n * ── 못 할 때는 못 한다고 한다 ──────────────────────────────────────────────\n * `origin` 이 없는 트윈(이 자리가 생기기 전에 만들어진 것)은 다시 읽을 수 없다. 짐작으로\n * 템플릿을 고르거나 첫 레퍼런스를 집지 않는다 — 엉뚱한 원본으로 현장을 덮는 것이 훨씬 나쁘다.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Re-read a twin's structure from the source it remembers (TwinInstance.origin). Works for both reference- and template-born twins. A running mirror adopts the new structure without stopping; a running simulation is refused.\"\n })\n async resyncTwin(@Arg('instanceId') instanceId: string, @Ctx() context: ResolverContext): Promise<any> {\n const domainId = context.state.domain.id\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return { ok: false, error: `unknown twin: ${instanceId}` }\n\n const origin = inst.origin as any\n if (!origin?.kind)\n return {\n ok: false,\n error: `twin \"${instanceId}\" does not remember where it came from — it cannot be re-read. Re-create it from its template or reference so the origin is recorded.`\n }\n\n /*\n * 진행을 알리는 통로 — 만들 때와 **같은 것**이다. 레퍼런스에서 온 트윈만 알린다(템플릿에서 온\n * 트윈은 원본을 읽지 않으므로 알릴 단계가 없다).\n *\n * 분모는 그 어댑터가 선언한 단계 수다(`masterSteps`) + 호스트 단계. 선언하지 않은 어댑터는\n * `total` 이 없고, 그때 화면은 퍼센트를 만들지 않는다 — 모르는 진행률을 지어내지 않는다.\n */\n const progressSource: string | undefined = origin.kind === 'reference' ? origin.source : undefined\n const refRow = progressSource\n ? await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source: progressSource } })\n : null\n const adapterForSteps = refRow ? getAdapter(refRow.adapterType) : undefined\n const declaredSteps = adapterForSteps?.masterSteps?.length\n const stepTotal = declaredSteps === undefined ? undefined : declaredSteps + HOST_STEPS.length\n const siteId = origin.siteId ?? instanceId\n let lastDone = 0\n let lastStep: ReferenceProgress['step'] = (adapterForSteps?.masterSteps?.[0] ?? 'provision') as ReferenceProgress['step']\n const emit = (p: Omit<ReferenceProgress, 'siteCount' | 'siteId' | 'siteIndex'>) => {\n if (!progressSource) return\n lastDone = p.done\n lastStep = p.step\n pubsub.publish('twin-reference-progress', {\n twinReferenceProgress: { ...p, siteId, siteIndex: 0, siteCount: 1, total: p.total ?? stepTotal, source: progressSource }\n })\n }\n\n try {\n const master = await this.masterFromOrigin(domainId, origin, instanceId, st =>\n emit({ step: st.key, done: st.done, total: stepTotal, detail: st.detail })\n )\n emit({ step: 'provision', done: declaredSteps ?? 0, total: stepTotal })\n /*\n * **어느 현장의 트윈이었나를 지킨다** — 다시 읽기는 구조만 새로 그리는 일이고, 현장 소속은 그때\n * 사람이 고른 것이다. 기억이 없는 옛 트윈은 **지금 있는 현장**을 그대로 쓴다(빈손으로 두면 템플릿\n * 기본 공간으로 옮겨 간다 — 알리지 않고 현장을 떠나고 그 현장의 값도 잃는다).\n */\n const keepSpace = origin.spaceId || inst.spaceId\n /* 다시 읽기는 **구조만** 새로 그린다 — 재기동 정책은 그 트윈의 선언이므로 그대로 지킨다. */\n const res = await TwinEngine.ingestMaster(\n domainId,\n master,\n readRestartPolicy(inst.restartPolicy, `resync of twin \"${instanceId}\"`),\n keepSpace ? { spaceId: keepSpace } : undefined,\n context.state.user\n )\n emit({ step: 'start', done: (declaredSteps ?? 0) + 1, total: stepTotal })\n /*\n * **총평도 새로 남긴다.** 다시 읽었는데 총평이 옛것이면 화면이 지난 읽기를 현재로 보여 준다 —\n * 그 표를 보고 사람이 원본을 고치러 간다.\n */\n if (refRow && progressSource) {\n const prevSpec = (refRow.scopeSpec as any) ?? {}\n await getRepository(TwinReference).update(\n { id: refRow.id },\n {\n scopeSpec: { ...prevSpec, assessments: { ...(prevSpec.assessments ?? {}), [siteId]: assessMaster(master, siteId) } }\n } as any\n )\n }\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings: res.warnings }\n } catch (e: any) {\n /* 막힌 자리를 그대로 알린다 — 「끝낸 수」의 다음 단계다(만들 때와 같은 규칙). */\n emit({\n step: (adapterForSteps?.masterSteps?.[lastDone] ?? lastStep) as ReferenceProgress['step'],\n done: lastDone,\n total: stepTotal,\n failed: true,\n error: e?.message ?? String(e)\n })\n return refusal(context, e, 'resync failed')\n }\n }\n\n /** 기억해 둔 원천에서 마스터를 다시 얻는다 — 어댑터든 템플릿이든 이 한 곳에서 갈린다. */\n private async masterFromOrigin(\n domainId: string,\n origin: any,\n instanceId: string,\n /*\n * **다시 읽기도 진행을 보여야 한다** (2026-08-22).\n *\n * 만들 때는 8단계가 화면에 흐르는데 다시 읽을 때는 아무것도 없었다 — 사용자가 버튼을 누르고\n * 「진행되고 있는지 확인할 수가 없다」고 했다. 실제로 chef 는 원본 읽기가 14~21초이고 그 사이\n * 화면에 아무 변화가 없다.\n *\n * 통로는 만들 때와 **같은 것**이다(`twin-reference-progress`). 화면도 같은 표시를 쓴다 —\n * 두 벌을 만들면 한쪽만 고쳐지고 사람은 같은 일이 다르게 보이는 것을 결함으로 읽는다.\n */\n onStep?: (s: { key: any; done: number; total?: number; detail?: string }) => void\n ): Promise<any> {\n if (origin.kind === 'template') {\n const tpl = getTemplate(origin.templateId)\n if (!tpl) throw new Error(`unknown template: ${origin.templateId} — this twin cannot be rebuilt`)\n /* 저장해 둔 노브 그대로 다시 짓는다. 기본값을 다시 입히지 않는다 — 그 사이 템플릿의 기본값이\n 바뀌었다면, 사용자가 고르지 않은 값이 알리지 않고 현장을 바꾸게 된다. */\n const { master } = tpl.build(origin.params ?? {})\n master.origin = origin\n return master\n }\n\n /* 레퍼런스 — 메모리 등록본이 있으면 그것, 없으면 저장된 어댑터 연결로 다시 가져온다.\n (부팅 뒤에는 메모리 등록본이 비어 있으므로 어댑터 경로가 실제로 쓰이는 길이다.) */\n const inMemory = getReference(origin.source)\n if (inMemory) return { ...inMemory, origin }\n\n const ref = await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source: origin.source } })\n if (!ref) throw new Error(`reference \"${origin.source}\" is no longer registered — nothing to re-read from`)\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) throw new Error(`no adapter for type: ${ref.adapterType}`)\n const cfg = ref.connectionConfig ?? {}\n const sites = await adapter.discoverSites(cfg)\n\n /*\n * ── 무엇을 무엇과 견주나 (2026-08-18 실측으로 고침) ────────────────────────\n *\n * 예전에는 `master.source === origin.source` 로 사이트를 찾았다. 그런데 `origin.source` 는 **레퍼런스\n * 등록 이름**이고(그 참조의 사이트 전부에 같다) `master.source` 는 **사이트별 인스턴스 id** 다 —\n * 서로 다른 것을 견줬으니 사이트가 멀쩡히 있어도 「더 이상 보고하지 않는다」로 거절했다. 사이트가\n * 여럿인 참조에서 온 트윈은 그래서 **전부** 재동기가 불가했고, 오류 문장은 원인을 참조 쪽으로\n * 잘못 가리켰다.\n *\n * 이제 ① 기억해 둔 사이트로 곧장 간다(`origin.siteId`) ② 기억이 없는 옛 트윈은 사이트를 살펴\n * **마스터의 정체(=이 인스턴스 id)** 와 견준다. 어느 쪽도 못 찾으면 **첫 사이트로 때우지 않는다** —\n * 다른 현장의 구조를 이 트윈에 덮는 것은 오류가 아니라 오류 없이 틀린 공장으로 나타난다.\n */\n const picked = pickOriginSite(sites, origin)\n if (picked.site) return { ...(await adapter.fetchMaster(cfg, picked.site, onStep)), origin }\n if (picked.reason === 'site-gone')\n throw new Error(\n `reference \"${origin.source}\" no longer reports site \"${origin.siteId}\" — refusing to overwrite this twin with a different site`\n )\n\n for (const site of sites) {\n const master = await adapter.fetchMaster(cfg, site)\n if (master.source === instanceId) return { ...master, origin: { ...origin, siteId: site.siteId } }\n }\n throw new Error(\n `reference \"${origin.source}\" does not report a site that rebuilds twin \"${instanceId}\" ` +\n `(this twin was imported before the site identity was recorded, and no site's master carries its id) — refusing to overwrite it with a different site`\n )\n }\n\n /** 등록된 트윈 템플릿(파라미터화 아키타입) 목록 — 노브 스키마 포함(클라이언트 폼용). */\n @Query(returns => [ScalarObject], { description: 'List registered twin templates (parameterized archetypes) with their knob schema.' })\n async twinTemplates(@Ctx() _context: ResolverContext): Promise<any[]> {\n return listTemplates().map(t => ({ id: t.id, label: t.label, system: t.system, description: t.description, detail: t.detail, knobs: t.knobs }))\n }\n\n /** 템플릿 + 노브 → 합성 마스터 → 인제스트(+기동+시나리오). 레퍼런스 import 와 같은 경로, 원천만 합성. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Instantiate a twin template with params → synthetic master → ingest (+start+scenario). restartPolicy declares how the new twin treats its own past on reboot ('resync' | 'resume' | 'reset') — there is no default. Returns {ok, instanceId, spaceId}.\"\n })\n async createFromTemplate(\n @Arg('templateId') templateId: string,\n @Arg('params', type => ScalarObject) params: any,\n @Arg('restartPolicy') restartPolicy: string,\n @Ctx() context: ResolverContext,\n @Arg('start', { nullable: true }) start?: boolean,\n @Arg('spaceId', { nullable: true, description: 'Existing space to co-locate this twin into (add a lens to a site). Omit to create its own space.' }) spaceId?: string\n ): Promise<any> {\n const tpl = getTemplate(templateId)\n if (!tpl) return { ok: false, error: `unknown template: ${templateId}` }\n const domainId = context.state.domain.id\n try {\n /*\n * **빠진 노브를 서버가 채운다.** 기본값을 아는 곳은 노브 스키마(계약)인데 그것을 적용하는 곳이\n * 위자드뿐이었다 — 그래서 화면을 거치지 않는 호출자(AI·스크립트·API)가 파라미터를 일부만 주면\n * 템플릿 안에서 발생률이 0 이 되고 **아무것도 하지 않는 트윈**이 알리지 않고 만들어졌다.\n * 채운 노브 이름은 경고로 함께 돌려준다 — 알리지 않고 채우는 것도 알리지 않고 비우는 것만큼 위험하다.\n */\n const filled = filledKnobKeys(tpl.knobs, params)\n const effective = applyKnobDefaults(tpl.knobs, params)\n /*\n * **이 현장에 이미 있는 설비를 노브 값으로 확정한다** (`siteEquipmentIds`).\n *\n * 에너지 트윈이 「공장이 돌면 전기가 오른다」를 말하려면 부하를 **이웃 트윈의 설비 id 로**\n * 선언해야 한다(설비 하나에 사실 둘). 그 목록을 빌드할 때마다 현장에서 다시 읽으면, 사이에\n * 설비가 늘거나 준 만큼 **다시 지을 때 다른 트윈**이 된다. 그래서 여기서 한 번 해석하고\n * 그 결과를 노브 값으로 남긴다(아래 `origin.params` 에 그대로 저장된다).\n */\n const adopted = await resolveSiteEquipmentKnobs(tpl.knobs, effective, domainId, spaceId)\n const { master, scenario } = tpl.build(effective)\n /* **무엇으로 지었는지 남긴다.** 합성은 결정적이므로 같은 노브면 같은 마스터가 다시 나온다 —\n 그래서 템플릿 트윈도 어댑터 트윈과 똑같이 다시 읽을 수 있다. 남기지 않으면 그 트윈은\n 첫날의 모습에 영원히 머문다(원본을 잃은 트윈). */\n /* 고른 현장도 남긴다 — 없으면 다시 읽기가 트윈을 템플릿 기본 공간으로 옮겨 버린다(현장 값도 잃는다). */\n master.origin = { kind: 'template', templateId, params: effective, ...(spaceId ? { spaceId } : {}) }\n /* 공간 선택은 템플릿을 거치지 않는다 — 템플릿마다 이 노브를 알고 있어야 한다면 새 템플릿이\n 알리지 않고 무시하게 된다. 합성된 마스터에 한 곳에서 얹는다(레퍼런스 인제스트와 같은 경로). */\n const res = await TwinEngine.ingestMaster(\n domainId,\n master,\n readRestartPolicy(restartPolicy, `createFromTemplate(\"${templateId}\")`),\n { spaceId },\n context.state.user\n )\n if (start !== false) {\n await TwinEngine.startFromRegistry(domainId, res.instanceId)\n if (scenario) {\n const runtime = TwinEngine.runtime(domainId, res.instanceId)\n if (runtime) {\n runtime.scenario.load(scenario)\n runtime.scenario.start()\n }\n }\n }\n const warnings = [\n ...(filled.length ? [knobDefaultsFilled(filled)] : []),\n ...adopted.filter(a => a.count > 0).map(a => siteEquipmentAdopted(a.key, a.count)),\n ...res.warnings\n ]\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings }\n } catch (e: any) {\n return refusal(context, e, 'template instantiation failed')\n }\n }\n\n /* ── 레퍼런스 관리(엔티티 기반·테넌트 스코프) — reference-management P1 ────────\n * 전역 인메모리(referenceSources/importFromReference)와 공존. 이쪽은 TwinReference 행 + 어댑터 레지스트리.\n */\n\n @Query(returns => [ScalarObject], { description: 'List tenant-scoped persisted twin references (adapter-backed).' })\n async twinReferences(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const rows = await getRepository(TwinReference).find({ where: { domain: { id: domainId } } })\n /*\n * provenance 라이브 대조 — 지워진 트윈은 producedCount 에서 자동 제외(상태 동기의 lazy 방식).\n *\n * **id 만 읽는다** (2026-08-21). 예전에는 인스턴스 행 전체를 읽었고, 그 행에는 **모델 JSON** 이\n * 들어 있다(자리 수백 개 + 발자국 좌표). 그래서 이 목록을 여는 데 수 메가바이트를 읽고 파싱했고,\n * 화면은 그동안 「아직 연결된 시스템이 없습니다」를 보이고 있었다 — 사용자에게는 「없다」는 답으로\n * 읽힌다. 여기서 필요한 것은 살아 있는 id 집합 하나다.\n */\n const liveIds = new Set(\n (await getRepository(TwinInstance).find({ where: { domain: { id: domainId } }, select: ['instanceId'] })).map(\n i => i.instanceId\n )\n )\n return rows.map(r => {\n const produced = (((r.scopeSpec as any)?.produced ?? []) as any[]).filter(p => liveIds.has(p.instanceId))\n return {\n source: r.source, system: r.system, siteName: r.siteName, description: r.description,\n adapterType: r.adapterType, status: r.status, lastSyncedAt: r.lastSyncedAt, lastError: r.lastError,\n producedCount: produced.length, produced\n }\n })\n }\n\n @Query(returns => [String], { description: 'List registered reference adapter type keys.' })\n referenceAdapterTypes(): string[] {\n return listAdapterTypes()\n }\n\n /**\n * 인티그레이션 그룹핑 (reference-management §2.3·D11) — 산출물을 커넥터 타입 ▸ Connection ▸ 인스턴스 2단으로.\n * 트윈-네이티브 온톨로지(integration 무의존): TwinReference 가 그룹핑 노드(source=connectionName),\n * scopeSpec.connectorType 로 상위 분류. producedCount 는 라이브 인스턴스로 대조(지워진 트윈 제외).\n */\n @Query(returns => [ScalarObject], { description: 'Group integration items 2-tier: connector type ▸ connection ▸ produced twins. (reference-management §2.3)' })\n async twinConnections(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const rows = await getRepository(TwinReference).find({ where: { domain: { id: domainId } } })\n const liveIds = new Set((await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })).map(i => i.instanceId))\n const groups = new Map<string, any[]>()\n for (const r of rows) {\n const connectorType = (r.scopeSpec as any)?.connectorType ?? r.adapterType\n const producedCount = (((r.scopeSpec as any)?.produced ?? []) as any[]).filter(p => liveIds.has(p.instanceId)).length\n const conn = { source: r.source, name: r.siteName, status: r.status, adapterType: r.adapterType, producedCount, lastSyncedAt: r.lastSyncedAt }\n if (!groups.has(connectorType)) groups.set(connectorType, [])\n groups.get(connectorType)!.push(conn)\n }\n return [...groups.entries()].map(([connectorType, connections]) => ({\n connectorType,\n connectionCount: connections.length,\n instanceCount: connections.reduce((s, c) => s + c.producedCount, 0),\n connections\n }))\n }\n\n /** 한 Connection 그룹 노드 상세 — 그 아래 생성된 트윈 인스턴스(라이브 대조·상태·기동여부). */\n @Query(returns => ScalarObject, { nullable: true, description: 'One connection grouping location with its produced twin instances (live-checked). (reference-management §2.3)' })\n async twinConnection(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any | null> {\n const domainId = context.state.domain.id\n const r = await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source } })\n if (!r) return null\n const produced = ((r.scopeSpec as any)?.produced ?? []) as any[]\n const instMap = new Map((await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })).map(i => [i.instanceId, i]))\n const instances = produced\n .filter(p => instMap.has(p.instanceId))\n .map(p => {\n const inst = instMap.get(p.instanceId) as any\n return { instanceId: p.instanceId, spaceId: p.spaceId, siteId: p.siteId, kind: inst.kind, status: inst.status, running: TwinEngine.owns(domainId, p.instanceId) }\n })\n return {\n source: r.source,\n connectorType: (r.scopeSpec as any)?.connectorType ?? r.adapterType,\n name: r.siteName,\n status: r.status,\n system: r.system,\n lastSyncedAt: r.lastSyncedAt,\n instanceCount: instances.length,\n instances\n }\n }\n\n /** 단건 상세(뷰/편집) — connectionConfig 포함, 어댑터 스키마의 secret 필드는 마스킹(있으면 '••••••'). */\n @Query(returns => ScalarObject, { nullable: true, description: 'Get one tenant-scoped reference with its connection config (secret fields masked) for view/edit.' })\n async twinReference(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any | null> {\n const r = await getRepository(TwinReference).findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!r) return null\n const secretKeys = new Set((getAdapter(r.adapterType)?.meta?.configSchema ?? []).filter(f => f.secret).map(f => f.key))\n const cfg: any = {}\n for (const [k, v] of Object.entries((r.connectionConfig as any) ?? {})) cfg[k] = secretKeys.has(k) ? (v ? '••••••' : '') : v\n /*\n * **이 연결이 만든 트윈 id 를 함께 낸다.** 상세 화면이 「이 연결이 잘 동기화되고 있나」를 물으려면\n * 어느 트윈을 물어야 하는지 알아야 한다. 예전에는 개수(`producedCount`)만 있어서 화면이 id 를\n * 알 방법이 없었다.\n */\n const producedInstanceIds = [\n ...new Set(\n ((r.scopeSpec as any)?.produced ?? [])\n .map((p: any) => p?.instanceId)\n .filter((x: any): x is string => typeof x === 'string' && !!x)\n )\n ]\n return {\n source: r.source, system: r.system, siteName: r.siteName, description: r.description,\n adapterType: r.adapterType, connectionConfig: cfg, status: r.status, lastSyncedAt: r.lastSyncedAt, lastError: r.lastError,\n producedInstanceIds\n }\n }\n\n @Query(returns => [ScalarObject], { description: 'List reference connector metadata (label, domain, config schema, availability, capabilities) for the connect UI.' })\n referenceAdapters(): any[] {\n /*\n * **능력을 함께 낸다** (2026-08-21).\n *\n * `capabilities` 는 어댑터 뿌리에 있고 `meta` 에는 없었다. 그래서 연결 화면이 「이 원본이 라이브를\n * 낼 수 있나」를 알 수 없었고, 트윈을 만들 때 `live` 를 말하지 못해 **재기동 정책이 없다고 거절**됐다\n * (실 연동에서 그것에 막혔다 — 미러는 정의상 `resync` 이므로 `live` 하나로 정해진다).\n *\n * 화면이 그 사실을 알아야 정책을 사람에게 물을지 스스로 정할지 가를 수 있다.\n */\n return listAdapters().map(a => ({ type: a.type, ...(a.meta ?? {}), capabilities: a.capabilities ?? [] }))\n }\n\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, { description: 'Create or update a tenant-scoped twin reference (persisted).' })\n async saveTwinReference(\n @Arg('source') source: string,\n @Arg('patch', type => ScalarObject) patch: any,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, source } })\n const saved = await repo.save(\n repo.create({\n ...(existing ?? {}),\n domain: { id: domainId } as any,\n source,\n system: patch.system ?? existing?.system,\n siteName: patch.siteName ?? existing?.siteName,\n description: patch.description ?? existing?.description,\n adapterType: patch.adapterType ?? existing?.adapterType,\n // 필드 단위 병합 — 편집 시 생략된 키(예: 마스킹된 secret)는 기존 값 유지.\n connectionConfig: patch.connectionConfig\n ? { ...((existing?.connectionConfig as any) ?? {}), ...patch.connectionConfig }\n : existing?.connectionConfig,\n mappingSpec: patch.mappingSpec ?? existing?.mappingSpec,\n scopeSpec: patch.scopeSpec ?? existing?.scopeSpec,\n status: patch.status ?? existing?.status ?? 'draft'\n })\n )\n return { ok: true, source: saved.source }\n }\n\n /** 연결 해제 — removeTwins=true 면 이 레퍼런스가 만든 트윈(provenance)도 함께 제거(라이프사이클 연쇄). 기본은 트윈 보존(분리). */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Delete a tenant-scoped reference. If removeTwins, also remove the twin instances it produced (provenance cascade); otherwise twins are kept (detached).' })\n async deleteTwinReference(\n @Arg('source') source: string,\n @Ctx() context: ResolverContext,\n @Arg('removeTwins', { nullable: true }) removeTwins?: boolean\n ): Promise<boolean> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: domainId }, source } })\n if (removeTwins && ref) {\n for (const p of (((ref.scopeSpec as any)?.produced ?? []) as any[])) {\n try {\n await TwinEngine.remove(domainId, p.instanceId)\n } catch {\n /* 이미 없거나 실패 — 연쇄는 best-effort. */\n }\n }\n }\n await repo.delete({ domain: { id: domainId } as any, source })\n return true\n }\n\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, { description: 'Test a reference connection via its adapter; updates status.' })\n async testReferenceConnection(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any> {\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!ref) return { ok: false, error: `unknown reference: ${source}` }\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return { ok: false, error: `no adapter for type: ${ref.adapterType}` }\n try {\n const res = await adapter.testConnection(ref.connectionConfig ?? {})\n await repo.update({ id: ref.id }, { status: res.ok ? 'connected' : 'error', lastError: res.error ?? null } as any)\n return res\n } catch (e: any) {\n return { ok: false, error: e?.message ?? 'test failed' }\n }\n }\n\n /**\n * 어댑터 기반 인제스트 — discoverSites → 사이트별 fetchMaster → ingestMaster (fan-out, §2.2·§4.2).\n * P1 은 대개 N=1(virtual/단일). start 면 각 인스턴스 기동. 라이브 피드·mode 는 face2-inbound-live 소유.\n */\n /** 레퍼런스가 노출하는 사이트/공장 발견 — 트윈 생성 시 \"어느 공장\" 선택용(§2.2). */\n @Query(returns => ScalarObject, { description: 'Discover sites/factories exposed by a reference. Returns { sites, error? } — an empty list with no error means the system genuinely has none, which is different from a failure.' })\n async discoverReferenceSites(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any> {\n /*\n * **\"못 찾았다\" 와 \"없다\" 를 구분한다.** 예전에는 넷을 빈 배열 하나로 합쳤고(레퍼런스 없음·어댑터\n * 미상·조회 실패·정말 0건), 화면은 그 모두를 \"사이트를 찾지 못했습니다\" 라고만 말했다. 실 시스템\n * 연결에서 가장 자주 막히는 자리인데 자격이 틀렸는지 주소가 틀렸는지 알 수 없었다.\n * 판정과 문장 형태는 `discovery-result`(순수)가 갖는다.\n */\n const ref = await getRepository(TwinReference).findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!ref) return failed(referenceNotFound(source))\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return failed(adapterUnknown(ref.adapterType, source))\n try {\n /*\n * **기다려도 답이 없으면 사유를 준다.** 어댑터 계약에 시간 제한이 없어서, 주소가 틀린 엔드포인트는\n * 화면을 무한히 돌게 만들었다 — 무한히 도는 화면은 들어온 것이 없는 실패의 다른 얼굴이다.\n * 상한은 여기서 정한다(어댑터마다 다르게 두면 사용자가 어느 것을 기다리는지 알 수 없다).\n */\n const sites = await withTimeout(adapter.discoverSites(ref.connectionConfig ?? {}), DISCOVER_TIMEOUT_MS)\n return discovered(sites)\n } catch (e: any) {\n if (e?.code === TIMEOUT) return failed(discoveryTimedOut(source, DISCOVER_TIMEOUT_MS / 1000))\n return failed(discoveryFailed(source, detailOf(e)))\n }\n }\n\n /**\n * 트윈 생성 — 레퍼런스에서 사이트 발견 → (siteIds 있으면 그 공장만) → fetchMaster → provision. 사이트별 resilient.\n * 여러 공장을 관할하는 소스는 siteIds 로 \"어느 공장\"을 골라 생성(1:N, §2.1·§2.2).\n *\n * ── 현장 선택이 이 경로에도 있다 (2026-08-13) ────────────────────────────\n * 한 현실을 여러 렌즈가 비춘다(WMS·MES·YMS). 그런데 **그 선택이 템플릿 경로에만** 있어서\n * (`createFromTemplate(spaceId)`), 실 시스템에서 가져온 트윈은 어댑터가 파생한 공간 id 가 우연히\n * 일치할 때만 한 현장에 모였다 — 사람이 \"이 MES 와 같은 현장에 넣어라\" 를 말할 방법이 없었다.\n * 데이터로는 가능한 일이 저작으로는 불가능한, `ingest-space` 가 이미 지적한 그 비대칭이다.\n *\n * 판정은 그 순수 모듈이 갖는다: 없는 공간은 거절(`resolveIngestSpace`), 사이트 여럿을 한 공간에\n * 넣는 것도 거절(`refuseImportSpace`) — 서로 다른 현장이 알리지 않고 합쳐지는 것을 막는다.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Create twins from a reference: discover sites → filter by siteIds (if given) → fetch master(s) → provision. spaceId co-locates the twin into an existing space (one site only). start=false to only provision; live=true to run as a mirror (adapter openLiveFeed → live projector) instead of sim. restartPolicy declares how each new twin treats its own past on reboot ('resync' | 'resume' | 'reset'); omit it and live=true implies 'resync' — a mirror reads the source again — while a simulation must declare 'resume' or 'reset' for itself.\"\n })\n async importTwinReference(\n @Arg('source') source: string,\n @Ctx() context: ResolverContext,\n @Arg('siteIds', type => [String], { nullable: true }) siteIds?: string[],\n @Arg('start', { nullable: true }) start?: boolean,\n @Arg('live', { nullable: true }) live?: boolean,\n @Arg('spaceId', { nullable: true, description: 'Existing space to co-locate this twin into (add a lens to a site). Only when importing a single site. Omit to give each site its own space.' }) spaceId?: string,\n @Arg('restartPolicy', { nullable: true, description: \"How each new twin treats its own past on reboot: 'resync' | 'resume' | 'reset'. Required unless live=true (a mirror is 'resync' by definition).\" }) restartPolicy?: string\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: domainId }, source } })\n if (!ref) return { ok: false, error: `unknown reference: ${source}` }\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return { ok: false, error: `no adapter for type: ${ref.adapterType}` }\n const cfg = ref.connectionConfig ?? {}\n try {\n let sites = await adapter.discoverSites(cfg)\n if (siteIds?.length) sites = sites.filter(s => siteIds.includes(s.siteId))\n /* 아무것도 쓰기 전에 거절한다 — 한 사이트를 넘으면 \"이 현장에 더한다\" 가 성립하지 않는다. */\n const refusal = refuseImportSpace(sites.length, spaceId)\n if (refusal) return { ok: false, error: refusal.message, errorCode: refusal.code, errorParams: refusal.params }\n const instances: any[] = []\n const failed: any[] = []\n /*\n * **진행을 구독으로 흘린다** (2026-08-21).\n *\n * 마스터 읽기는 원본에 여러 질의를 보내는 긴 작업이고, 화면은 그 사이 아무것도 알 수 없었다.\n * 단계를 아는 것은 어댑터뿐이므로 어댑터가 말하고(표준 낱말), 호스트가 자기 두 단계(생성·기동)를\n * 더해 흘린다.\n *\n * **분모는 어댑터가 선언한 것**이다(`masterSteps`). 선언하지 않은 어댑터는 `total` 이 없고, 그때\n * 화면은 퍼센트를 만들지 않는다 — 모르는 진행률을 지어내지 않는다.\n */\n const declared = adapter.masterSteps?.length\n const stepTotal = declared === undefined ? undefined : declared + HOST_STEPS.length\n const emit = (p: Omit<ReferenceProgress, 'siteCount'>) =>\n pubsub.publish('twin-reference-progress', {\n twinReferenceProgress: { ...p, siteCount: sites.length, total: p.total ?? stepTotal, source }\n })\n\n /*\n * **읽은 뒤의 총평을 사이트마다 남긴다** (2026-08-22).\n *\n * 총평은 읽는 순간에만 있었다 — 대화상자를 닫으면 사라지고, 다시 보려면 같은 읽기를 또 해야 했다.\n * 그런데 사람이 그것을 묻는 자리는 「모델 살펴보기」다(트윈을 보다가 「이건 왜 비었나」를 묻는다).\n * 그래서 레퍼런스 행에 남겨 그 화면이 언제든 읽게 한다.\n *\n * 사실만 담는다(`assessMaster`) — 문장은 화면이 만들고, 더 알고 싶을 때 AI 가 이 사실만 근거로\n * 서술한다. 다시 읽으면 그 사이트의 총평이 새것으로 바뀐다(지난 읽기의 총평을 현재로 보이게\n * 두지 않는다).\n */\n const assessments: Record<string, unknown> = {}\n\n for (const [siteIndex, site] of sites.entries()) {\n /*\n * **실패를 실제로 막힌 단계에 적는다** (2026-08-22).\n *\n * 예전에는 실패를 무조건 `provision` 으로 적었다. 그래서 원본을 읽다 끊긴 것도 화면에는\n * 「트윈 생성에서 실패」로 떴다 — 사람이 원인을 엉뚱한 자리에서 찾는다(실제로 그렇게 됐다).\n *\n * 규약이 답을 준다: `done` 은 **끝낸 단계 수**다(`ReferenceProgress.done`). 그러면 지금 막힌 것은\n * 그 다음 단계, 즉 `masterSteps[done]` 이다. 그 표를 넘어서면(호스트 단계) 마지막으로 알린 것을 쓴다.\n *\n * 이 규칙은 두 가지 보고 방식에 함께 맞는다 — 단계 **시작**에 알리는 어댑터(`done` 이 아직 0)와\n * 단계 **완료**에 알리는 어댑터(`done` 이 1 늘어난다) 모두 「끝낸 수」만 지키면 된다.\n */\n let lastDone = 0\n let lastStep: ReferenceProgress['step'] = (adapter.masterSteps?.[0] ?? 'provision') as ReferenceProgress['step']\n const track = (p: Omit<ReferenceProgress, 'siteCount'>) => {\n lastDone = p.done\n lastStep = p.step\n emit(p)\n }\n try {\n const master = await adapter.fetchMaster(cfg, site, st =>\n track({ siteId: site.siteId, siteIndex, step: st.key, done: st.done, total: stepTotal, detail: st.detail })\n )\n /* 어느 레퍼런스의 **어느 사이트**에서 왔는지 남긴다 — 다시 읽기가 같은 어댑터·같은 사이트로 돌아오려면\n 사이트 정체가 있어야 한다(`source` 는 참조 이름이라 사이트 전부에 같다). */\n /*\n * 정책은 **선언이거나 의도에서 곧바로 따라오는 것**이다: `live=true` 는 미러를 띄우겠다는 뜻이고\n * 미러는 정의상 `resync` 다(외부가 진실이므로 우리 과거를 이어 붙이지 않는다). 시뮬로 띄우려면\n * 스스로 선언해야 한다 — 그 자리에서 우리가 고르면 재기동마다 이력을 지우는 트윈이 알리지 않고 생긴다.\n */\n assessments[site.siteId] = assessMaster(master, site.siteId)\n const policy = readRestartPolicy(restartPolicy ?? (live ? 'resync' : undefined), `importTwinReference(\"${source}\")`)\n track({ siteId: site.siteId, siteIndex, step: 'provision', done: declared ?? 0, total: stepTotal })\n const res = await TwinEngine.ingestMaster(\n domainId,\n { ...master, origin: { kind: 'reference', source, siteId: site.siteId, ...(spaceId ? { spaceId } : {}) } },\n policy,\n { spaceId },\n context.state.user\n )\n track({ siteId: site.siteId, siteIndex, step: 'start', done: (declared ?? 0) + 1, total: stepTotal })\n if (start !== false) {\n // live=true + 어댑터가 openLiveFeed 지원 → mirror(실 이벤트 미러). 아니면 sim 기동(fallback).\n /* 읽기 커서를 저장할 자리를 함께 넘긴다 — 레퍼런스의 이름은 호스트가 붙이는 것이고\n 커넥터는 그것을 알 수 없다(§`startReferenceLiveFeed`). */\n const wentLive = live\n ? await startReferenceLiveFeed(domainId, ref.adapterType, cfg, site, res.instanceId, ref.source)\n : false\n if (!wentLive) await TwinEngine.startFromRegistry(domainId, res.instanceId)\n instances.push({ siteId: site.siteId, instanceId: res.instanceId, spaceId: res.spaceId, mode: wentLive ? 'live' : 'sim', warnings: res.warnings })\n } else {\n instances.push({ siteId: site.siteId, instanceId: res.instanceId, spaceId: res.spaceId, mode: 'provisioned', warnings: res.warnings })\n }\n } catch (e: any) {\n /*\n * **실패한 단계를 그대로 알린다.** 화면이 진행 표시를 지우지 않고 그 자리를 붉게 두어야\n * 사람이 「어디까지 갔는지」를 안다. 막힌 자리는 「끝낸 수」의 다음 단계다(위 주석).\n */\n const at = (adapter.masterSteps?.[lastDone] ?? lastStep) as ReferenceProgress['step']\n emit({ siteId: site.siteId, siteIndex, step: at, done: lastDone, total: stepTotal, failed: true, error: e?.message ?? String(e) })\n\n failed.push({ siteId: site.siteId, error: e?.message ?? 'failed' })\n }\n }\n // provenance — 이 레퍼런스가 만든 인스턴스 추적(scopeSpec.produced). 삭제 연쇄·상태 동기·네비게이션 근거.\n const producedNew = instances.map(i => ({ siteId: i.siteId, instanceId: i.instanceId, spaceId: i.spaceId }))\n const prev: any[] = ((ref.scopeSpec as any)?.produced ?? []).filter((p: any) => !producedNew.some(n => n.instanceId === p.instanceId))\n await repo.update(\n { id: ref.id },\n {\n status: 'connected',\n lastSyncedAt: new Date().toISOString(),\n /* 못 옮긴 값을 **세어 남긴다**. 아무 인스턴스도 보고하지 않았으면 `null` — 「없었다」로 위장하지 않는다. */\n lastWarningCount: instances.some((i: any) => Array.isArray(i.warnings))\n ? instances.reduce((n: number, i: any) => n + (Array.isArray(i.warnings) ? i.warnings.length : 0), 0)\n : null,\n /*\n * **영어 canonical 로 남긴다.** 이 값은 DB 에 저장되고 연결 화면이 그대로 뿌린다 — 예전에는\n * 한글 산문(`N개 사이트 실패`)이라 다섯 언어 화면에 한글이 새어 나갔다. 어댑터가 주는 사유도\n * 같은 필드에 들어오므로(그것은 원 시스템의 말이다) 키가 아니라 영어 문장으로 통일한다.\n * 어느 사이트가 왜 실패했는지는 `failed[]` 가 답한다 — 화면이 그것을 보여 준다.\n */\n lastError: failed.length ? `${failed.length} of ${sites.length} site(s) failed: ${failed.map((f: any) => f.siteId).join(', ')}` : null,\n /*\n * ── 실패 사유를 **남긴다** (2026-08-21) ────────────────────────────────\n *\n * 사유는 대화상자에만 있었다. 닫으면 사라지고, 다시 보려면 같은 실패를 다시 만들어야 했다 —\n * 실제로 「승화푸드」 연결이 그 상태였다(요약 한 줄만 남고 원인은 어디에도 없었다).\n *\n * `scopeSpec` 은 이미 이 레퍼런스의 부속 사실을 담는 자리이므로(`produced`) 스키마를 늘리지 않고\n * 여기 적는다. 성공한 회차에는 **비운다** — 지나간 실패를 현재 상태처럼 보이게 두지 않는다.\n */\n scopeSpec: {\n ...((ref.scopeSpec as any) ?? {}),\n produced: [...prev, ...producedNew],\n /* 이번에 읽은 사이트의 총평만 갈아 끼운다 — 읽지 않은 사이트의 것은 그대로 둔다. */\n assessments: { ...(((ref.scopeSpec as any) ?? {}).assessments ?? {}), ...assessments },\n ...(failed.length\n ? { lastFailures: failed.map((f: any) => ({ siteId: f.siteId, error: f.error, at: new Date().toISOString() })) }\n : { lastFailures: [] })\n }\n } as any\n )\n return { ok: instances.length > 0, instances, failed }\n } catch (e: any) {\n /* 레퍼런스 행에는 **영어 canonical** 을 남긴다 — 저장되는 값은 언어중립이어야 다시 읽을 수 있다. */\n await repo.update({ id: ref.id }, { status: 'error', lastError: e?.message ?? 'ingest failed' } as any)\n return refusal(context, e, 'ingest failed')\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"reference-resolver.js","sourceRoot":"","sources":["../../../server/service/reference/reference-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { pubsub } from '@things-factory/shell'\nimport { HOST_STEPS, type ReferenceProgress } from './reference-progress.js'\nimport { assessMaster } from './reference-assessment.js'\nimport { Arg, Ctx, Int, Mutation, Query, Resolver, Directive } from 'type-graphql'\n\nimport { ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { readRestartPolicy } from '../../engine/restart-policy.js'\nimport { readBoardEquipment } from '@operato/ops-contract'\n\nimport { applyKnobDefaults, filledKnobKeys } from './knob-defaults.js'\nimport type { KnobDef } from './template-registry.js'\nimport { knobDefaultsFilled, pickOriginSite, siteEquipmentAdopted } from './reference-master.js'\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinReference } from './twin-reference.js'\nimport { runFill, seqReportOf } from './reference-fill-run.js'\nimport { listReferences, getReference } from './reference-registry.js'\nimport { getAdapter, listAdapterTypes, listAdapters } from './reference-adapter.js'\nimport {\n discovered, failed, detailOf,\n referenceNotFound, adapterUnknown, discoveryFailed, discoveryTimedOut\n} from './discovery-result.js'\nimport { refuseImportSpace } from './ingest-space.js'\nimport { startReferenceLiveFeed } from './reference-live.js'\nimport { listTemplates, getTemplate } from './template-registry.js'\n\n/*\n * Face2 레퍼런스 인제스트 채널(ADR-0018) — 등록된 레퍼런스 소스를 열거하고, 골라서 트윈으로 인제스트.\n * \"연결하고 내 것을 불러온다\" — 엔티티는 레퍼런스에서 오지 손배선/발명이 아니다.\n */\n\n/**\n * 발견 조회의 시간 상한 — 15초.\n *\n * 어댑터 계약에 시간 제한이 없다. 주소가 틀린 엔드포인트는 답하지 않고, 그러면 화면이 무한히 로딩된다 —\n * 사용자에게는 \"실패\" 보다 못한 상태다(무엇을 기다리는지 모른 채 기다린다). 실 시스템 조회가 몇 초\n * 걸리는 것은 정상이므로 넉넉히 두되, 끝은 있어야 한다.\n */\nconst DISCOVER_TIMEOUT_MS = 15_000\nconst TIMEOUT = 'discover-timeout'\n\nfunction withTimeout<T>(work: Promise<T>, ms: number): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(Object.assign(new Error('timeout'), { code: TIMEOUT })), ms)\n work.then(\n v => { clearTimeout(timer); resolve(v) },\n e => { clearTimeout(timer); reject(e) }\n )\n })\n}\n\n/**\n * 거절을 **사용자 언어로 옮겨 보낸다** — 번역은 한 곳에서 한다.\n *\n * ── 왜 서버인가 (2026-08-14) ────────────────────────────────────────────────\n * 실측: 실행 중인 트윈을 다시 프로비저닝하면 「instance \"order-check\" is running — stop before\n * re-provisioning」 이라는 **영어 한 줄이 토스트로** 떴다(다섯 언어 제품에서).\n *\n * 서버와 앱은 **같은 사전**을 쓰고, 사용자의 현재 언어가 백엔드에 반영된다. 그래서 이 문구는 서버가\n * 옮기는 것이 맞다 — 프레임워크가 이미 같은 규약이다(`authenticate-401-middleware` 가\n * `context.t('error.' + errorCode, detail)` 로 옮긴다).\n *\n * ── 그러면 코드는 왜 함께 보내나 ────────────────────────────────────────────\n * 화면이 **구조로** 다뤄야 하는 거절이 따로 있다(정합성 표의 행·심각도·수리 버튼 — 그것들은\n * `twin.compose.chk.*` 처럼 화면이 옮긴다). 그리고 브라우저가 아닌 소비자(AI·스크립트·API)에게는\n * 코드가 계약이다. 문장과 코드는 서로를 대신하지 않는다.\n *\n * **두 곳에서 같은 코드를 옮기지 않는다** — 문장이 두 벌이 되면 반드시 어긋난다.\n */\nfunction refusal(context: ResolverContext, e: any, fallback: string): Record<string, unknown> {\n const code = typeof e?.code === 'string' ? e.code : undefined\n const params = e?.params && typeof e.params === 'object' ? e.params : undefined\n /* 영어 canonical 은 항상 남긴다 — 번역 키가 없으면 그것이 보이고, 로그에는 그것이 남는다. */\n const canonical = e?.message || fallback\n const message =\n code && typeof context.t === 'function'\n ? String(context.t(`twin.provision.err.${code}`, { ...(params ?? {}), defaultValue: canonical }))\n : canonical\n return { ok: false, error: message, ...(code ? { errorCode: code } : {}), ...(params ? { errorParams: params } : {}) }\n}\n\n/**\n * `siteEquipmentIds` 노브를 이 현장의 설비로 채운다 — **비어 있을 때만.**\n *\n * 사용자가 목록을 직접 준 경우에는 손대지 않는다(고른 것이 정본이다). 현장이 없으면 채울 것도 없다.\n * 등록부의 모델에서 읽는다(런타임이 아니다) — 트윈이 도는 중이 아니어도 그 현장의 설비는 사실이다.\n */\nasync function resolveSiteEquipmentKnobs(\n knobs: readonly KnobDef[] | undefined,\n effective: Record<string, any>,\n domainId: string,\n spaceId?: string\n): Promise<{ key: string; count: number }[]> {\n const targets = (knobs ?? []).filter(k => k?.type === 'siteEquipment')\n if (!targets.length) return []\n const out: { key: string; count: number }[] = []\n let ids: { id: string; kind: string }[] | undefined\n for (const k of targets) {\n const given = effective[k.key]\n if (Array.isArray(given) && given.length) continue // 사용자가 고른 것이 정본이다\n if (!spaceId) {\n effective[k.key] = []\n continue\n }\n if (ids === undefined) {\n const rows = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n const seen = new Map<string, { id: string; kind: string }>()\n for (const r of rows) {\n for (const e of readBoardEquipment((r.model as any) ?? {})) {\n if (!e?.id || seen.has(String(e.id))) continue\n seen.set(String(e.id), { id: String(e.id), kind: String((e as any).kind ?? '') })\n }\n }\n ids = [...seen.values()]\n }\n effective[k.key] = ids\n out.push({ key: k.key, count: ids.length })\n }\n return out\n}\n\n@Resolver()\nexport class TwinReferenceResolver {\n /** 등록된 레퍼런스 소스 목록(요약 + 이미 인제스트됐는지). */\n @Query(returns => [ScalarObject], { description: 'List registered reference sources (virtual or real adapters) available to ingest.' })\n async referenceSources(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const out: any[] = []\n for (const m of listReferences()) {\n const reg = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId: m.source } })\n out.push({\n source: m.source,\n system: m.system,\n siteName: m.siteName,\n locationCount: m.locations.filter(l => l.role === 'location' || l.role === 'both').length,\n areaCount: m.locations.filter(l => l.role === 'area' || l.role === 'both').length,\n equipmentCount: (m.equipment ?? []).length,\n imported: !!reg,\n running: TwinEngine.owns(domainId, m.source)\n })\n }\n return out\n }\n\n /** 소스를 인제스트 → 공간 + 인스턴스 생성(provision). start 면 기동까지. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Ingest a registered reference source into a twin (space + instance). Optionally start it. restartPolicy declares how the new twin treats its own past on reboot: 'resync' (read the source again) | 'resume' (continue its journal) | 'reset' (wipe and replay from the seed). It has no default — a twin cannot exist without the declaration.\"\n })\n async importFromReference(\n @Arg('source') source: string,\n @Arg('restartPolicy') restartPolicy: string,\n @Ctx() context: ResolverContext,\n @Arg('start', { nullable: true }) start?: boolean\n ): Promise<any> {\n const master = getReference(source)\n if (!master) return { ok: false, error: `unknown reference source: ${source}` }\n const domainId = context.state.domain.id\n try {\n /* 어디서 왔는지 남긴다 — 이것이 없으면 이 트윈은 두 번 다시 읽을 수 없다.\n 이 경로는 **메모리에 등록된 마스터 하나**를 그대로 쓰므로 사이트 서술자가 없다(사이트 정체를\n 적을 것이 없다). 다시 읽기도 같은 등록본을 집으므로 사이트를 찾을 필요가 없다. */\n const res = await TwinEngine.ingestMaster(\n domainId,\n { ...master, origin: { kind: 'reference', source } },\n readRestartPolicy(restartPolicy, 'importFromReference'),\n undefined,\n context.state.user\n )\n if (start) await TwinEngine.startFromRegistry(domainId, res.instanceId)\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings: res.warnings }\n } catch (e: any) {\n return refusal(context, e, 'ingest failed')\n }\n }\n\n /**\n * **원본에서 다시 읽는다** — 이 트윈의 구조를 지금의 원본 모습으로 갱신한다.\n *\n * ── 왜 진입점이 하나여야 하나 ──────────────────────────────────────────────\n * 지금까지 다시 읽기는 **만드는 경로에 얹혀 있었다**(`importFromReference`·`createFromTemplate`).\n * 그래서 이미 있는 트윈을 갱신하려면 만들 때 무엇을 골랐는지 사람이 기억해 같은 화면을 다시\n * 거쳐야 했고, 템플릿으로 세운 트윈은 노브를 어디에도 안 남겨서 **아예 갱신할 방법이 없었다.**\n * 원천이 무엇이든 트윈 자신이 기억하게 하고(`TwinInstance.origin`), 여기 한 곳에서 그것을 따른다.\n *\n * ── 무엇이 일어나나 ────────────────────────────────────────────────────────\n * 원본에서 마스터를 다시 얻어 인제스트에 그대로 태운다. 그다음은 인제스트가 아는 일이다 —\n * 구조가 달라졌으면 새 리비전이 남고, 구조 행이 다시 그려지고, **실행 중인 미러는 멈추지 않고\n * 전환한다.** 실행 중인 시뮬레이션은 거절된다(조건이 바뀐 실험은 다른 실험이다).\n *\n * ── 못 할 때는 못 한다고 한다 ──────────────────────────────────────────────\n * `origin` 이 없는 트윈(이 자리가 생기기 전에 만들어진 것)은 다시 읽을 수 없다. 짐작으로\n * 템플릿을 고르거나 첫 레퍼런스를 집지 않는다 — 엉뚱한 원본으로 현장을 덮는 것이 훨씬 나쁘다.\n */\n /**\n * **그 번호들이 무엇이었나** — 구멍을 만났을 때 원본에 묻는다.\n *\n * `fillTwinScope` 가 「418 다음이 420」이라고 멈추면, 그 419 가 무엇이었는지 알아야 다음을\n * 정할 수 있다. 그 길이 없어서 사람이 원본 DB 를 손으로 뒤졌다.\n *\n * **판정하지 않는다.** 원본이 아는 것을 그대로 낸다 — `lost` 는 「번호는 나갔는데 행이 없다」이지\n * 「포기해도 된다」가 아니다. 그 판단은 되돌릴 수 없어서(커서가 지나가면 끝이다) 사람의 몫이다.\n */\n /*\n * **읽기인데 쓰기와 같은 문을 쓴다.** 이 문은 원본의 봉투를 그대로 냅니다 — 그 시스템이 무엇을\n * 언제 보냈는지가 드러납니다. `twinConnectionBundle` 과 같은 무게이고, 이 저장소는 그 무게를\n * 「쓰기는 GATE 하나」로 통일해 두었습니다(ADR-0027).\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => ScalarObject, {\n description:\n 'Ask the source what it knows about a range of sequence numbers. Each number comes back as present · lost · unissued · unknown — the source reports, the human decides.'\n })\n async twinSeqReport(\n @Arg('instanceId') instanceId: string,\n @Arg('scope') scope: string,\n @Arg('from', type => Int) from: number,\n @Arg('to', type => Int) to: number,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n return seqReportOf({ domainId: context.state.domain.id, instanceId, scope, from, to })\n }\n\n /**\n * **빠진 구간을 다시 받는다** — 훅은 반드시 놓칩니다: 우리가 내려가 있을 때, 그쪽이 못 보냈을 때.\n *\n * ── 왜 문이 필요한가 ──────────────────────────────────────────────────────\n * 번호가 비면 `takeInSequence` 가 알아챕니다. 그런데 **알아챈 뒤 그 사이를 채우는 길이 없었습니다.**\n * `fillSince` 는 2026-08-31 부터 있었고 부르는 곳이 0곳이었습니다.\n *\n * 실제로 plant 아웃박스의 1~20 을 잃고 되찾을 방법이 없는 상태를 만났습니다.\n *\n * ── `from` 은 잃은 구간을 되찾을 때만 ──────────────────────────────────────\n * 주지 않으면 커서부터 이어 받습니다. 주면 **그 번호부터 다시 묻습니다** — 이미 들어간 것은 유입\n * 경계가 되풀이로 거르므로 두 번 앉지 않습니다.\n *\n * 저장된 커서를 되돌리지 않습니다. `fillSince` 는 번호 검사를 지난 만큼만 적으므로, 되찾은 뒤\n * 커서가 원래 자리보다 앞서지 않습니다.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Fetch the stretch this twin missed for one scope and ingest it through the same checks as the push path. Without `from` it continues from the cursor; with `from` it asks again from that number — already-ingested facts are filtered as duplicates.'\n })\n async fillTwinScope(\n @Arg('instanceId') instanceId: string,\n @Arg('scope', { description: 'The unit the source numbers by — the same name its envelopes carry (e.g. EVENTS).' }) scope: string,\n @Ctx() context: ResolverContext,\n @Arg('from', type => Int, { nullable: true, description: 'Ask again from this sequence number. Omit to continue from the cursor.' })\n from?: number,\n @Arg('maxPages', type => Int, { nullable: true, description: 'Page limit for one run. Default 50.' }) maxPages?: number\n ): Promise<any> {\n return runFill({ domainId: context.state.domain.id, instanceId, scope, from: from ?? undefined, maxPages: maxPages ?? undefined })\n }\n\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Re-read a twin's structure from the source it remembers (TwinInstance.origin). Works for both reference- and template-born twins. A running mirror adopts the new structure without stopping; a running simulation is refused.\"\n })\n async resyncTwin(@Arg('instanceId') instanceId: string, @Ctx() context: ResolverContext): Promise<any> {\n const domainId = context.state.domain.id\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return { ok: false, error: `unknown twin: ${instanceId}` }\n\n const origin = inst.origin as any\n if (!origin?.kind)\n return {\n ok: false,\n error: `twin \"${instanceId}\" does not remember where it came from — it cannot be re-read. Re-create it from its template or reference so the origin is recorded.`\n }\n\n /*\n * 진행을 알리는 통로 — 만들 때와 **같은 것**이다. 레퍼런스에서 온 트윈만 알린다(템플릿에서 온\n * 트윈은 원본을 읽지 않으므로 알릴 단계가 없다).\n *\n * 분모는 그 어댑터가 선언한 단계 수다(`masterSteps`) + 호스트 단계. 선언하지 않은 어댑터는\n * `total` 이 없고, 그때 화면은 퍼센트를 만들지 않는다 — 모르는 진행률을 지어내지 않는다.\n */\n const progressSource: string | undefined = origin.kind === 'reference' ? origin.source : undefined\n const refRow = progressSource\n ? await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source: progressSource } })\n : null\n const adapterForSteps = refRow ? getAdapter(refRow.adapterType) : undefined\n const declaredSteps = adapterForSteps?.masterSteps?.length\n const stepTotal = declaredSteps === undefined ? undefined : declaredSteps + HOST_STEPS.length\n const siteId = origin.siteId ?? instanceId\n let lastDone = 0\n let lastStep: ReferenceProgress['step'] = (adapterForSteps?.masterSteps?.[0] ?? 'provision') as ReferenceProgress['step']\n const emit = (p: Omit<ReferenceProgress, 'siteCount' | 'siteId' | 'siteIndex'>) => {\n if (!progressSource) return\n lastDone = p.done\n lastStep = p.step\n pubsub.publish('twin-reference-progress', {\n twinReferenceProgress: { ...p, siteId, siteIndex: 0, siteCount: 1, total: p.total ?? stepTotal, source: progressSource }\n })\n }\n\n try {\n const master = await this.masterFromOrigin(domainId, origin, instanceId, st =>\n emit({ step: st.key, done: st.done, total: stepTotal, detail: st.detail })\n )\n emit({ step: 'provision', done: declaredSteps ?? 0, total: stepTotal })\n /*\n * **어느 현장의 트윈이었나를 지킨다** — 다시 읽기는 구조만 새로 그리는 일이고, 현장 소속은 그때\n * 사람이 고른 것이다. 기억이 없는 옛 트윈은 **지금 있는 현장**을 그대로 쓴다(빈손으로 두면 템플릿\n * 기본 공간으로 옮겨 간다 — 알리지 않고 현장을 떠나고 그 현장의 값도 잃는다).\n */\n const keepSpace = origin.spaceId || inst.spaceId\n /* 다시 읽기는 **구조만** 새로 그린다 — 재기동 정책은 그 트윈의 선언이므로 그대로 지킨다. */\n const res = await TwinEngine.ingestMaster(\n domainId,\n master,\n readRestartPolicy(inst.restartPolicy, `resync of twin \"${instanceId}\"`),\n keepSpace ? { spaceId: keepSpace } : undefined,\n context.state.user\n )\n emit({ step: 'start', done: (declaredSteps ?? 0) + 1, total: stepTotal })\n /*\n * **총평도 새로 남긴다.** 다시 읽었는데 총평이 옛것이면 화면이 지난 읽기를 현재로 보여 준다 —\n * 그 표를 보고 사람이 원본을 고치러 간다.\n */\n if (refRow && progressSource) {\n const prevSpec = (refRow.scopeSpec as any) ?? {}\n await getRepository(TwinReference).update(\n { id: refRow.id },\n {\n scopeSpec: { ...prevSpec, assessments: { ...(prevSpec.assessments ?? {}), [siteId]: assessMaster(master, siteId) } },\n /*\n * ── 읽은 시각과 경고 수도 새로 남긴다 (2026-09-06) ──────────────────\n * 처음 연결하는 경로는 이 둘을 쓰는데(§`connectReference`) 다시 읽는 경로는 총평만\n * 썼다. 그래서 `lastSyncedAt` 이 「처음 트윈을 만든 시각」에 머물렀다.\n *\n * 이것이 실제로 잘못된 판단을 만들었다. 인티그레이션 레인이 커넥터를 고치고 재동기화를\n * 청한 뒤 이 칸으로 확인했는데, 값이 그대로여서 「안 돌았다」고 결론 내렸다. 실제로는\n * 돌았고 품목 106건이 들어와 있었다.\n *\n * 경고 수도 같다. 다시 읽으면서 경고가 줄거나 늘었는데 화면은 지난 수를 보인다.\n */\n lastSyncedAt: new Date().toISOString(),\n lastWarningCount: Array.isArray(res.warnings) ? res.warnings.length : null\n } as any\n )\n }\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings: res.warnings }\n } catch (e: any) {\n /* 막힌 자리를 그대로 알린다 — 「끝낸 수」의 다음 단계다(만들 때와 같은 규칙). */\n emit({\n step: (adapterForSteps?.masterSteps?.[lastDone] ?? lastStep) as ReferenceProgress['step'],\n done: lastDone,\n total: stepTotal,\n failed: true,\n error: e?.message ?? String(e)\n })\n return refusal(context, e, 'resync failed')\n }\n }\n\n /** 기억해 둔 원천에서 마스터를 다시 얻는다 — 어댑터든 템플릿이든 이 한 곳에서 갈린다. */\n private async masterFromOrigin(\n domainId: string,\n origin: any,\n instanceId: string,\n /*\n * **다시 읽기도 진행을 보여야 한다** (2026-08-22).\n *\n * 만들 때는 8단계가 화면에 흐르는데 다시 읽을 때는 아무것도 없었다 — 사용자가 버튼을 누르고\n * 「진행되고 있는지 확인할 수가 없다」고 했다. 실제로 chef 는 원본 읽기가 14~21초이고 그 사이\n * 화면에 아무 변화가 없다.\n *\n * 통로는 만들 때와 **같은 것**이다(`twin-reference-progress`). 화면도 같은 표시를 쓴다 —\n * 두 벌을 만들면 한쪽만 고쳐지고 사람은 같은 일이 다르게 보이는 것을 결함으로 읽는다.\n */\n onStep?: (s: { key: any; done: number; total?: number; detail?: string }) => void\n ): Promise<any> {\n if (origin.kind === 'template') {\n const tpl = getTemplate(origin.templateId)\n if (!tpl) throw new Error(`unknown template: ${origin.templateId} — this twin cannot be rebuilt`)\n /* 저장해 둔 노브 그대로 다시 짓는다. 기본값을 다시 입히지 않는다 — 그 사이 템플릿의 기본값이\n 바뀌었다면, 사용자가 고르지 않은 값이 알리지 않고 현장을 바꾸게 된다. */\n const { master } = tpl.build(origin.params ?? {})\n master.origin = origin\n return master\n }\n\n /* 레퍼런스 — 메모리 등록본이 있으면 그것, 없으면 저장된 어댑터 연결로 다시 가져온다.\n (부팅 뒤에는 메모리 등록본이 비어 있으므로 어댑터 경로가 실제로 쓰이는 길이다.) */\n const inMemory = getReference(origin.source)\n if (inMemory) return { ...inMemory, origin }\n\n const ref = await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source: origin.source } })\n if (!ref) throw new Error(`reference \"${origin.source}\" is no longer registered — nothing to re-read from`)\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) throw new Error(`no adapter for type: ${ref.adapterType}`)\n const cfg = ref.connectionConfig ?? {}\n const sites = await adapter.discoverSites(cfg)\n\n /*\n * ── 무엇을 무엇과 견주나 (2026-08-18 실측으로 고침) ────────────────────────\n *\n * 예전에는 `master.source === origin.source` 로 사이트를 찾았다. 그런데 `origin.source` 는 **레퍼런스\n * 등록 이름**이고(그 참조의 사이트 전부에 같다) `master.source` 는 **사이트별 인스턴스 id** 다 —\n * 서로 다른 것을 견줬으니 사이트가 멀쩡히 있어도 「더 이상 보고하지 않는다」로 거절했다. 사이트가\n * 여럿인 참조에서 온 트윈은 그래서 **전부** 재동기가 불가했고, 오류 문장은 원인을 참조 쪽으로\n * 잘못 가리켰다.\n *\n * 이제 ① 기억해 둔 사이트로 곧장 간다(`origin.siteId`) ② 기억이 없는 옛 트윈은 사이트를 살펴\n * **마스터의 정체(=이 인스턴스 id)** 와 견준다. 어느 쪽도 못 찾으면 **첫 사이트로 때우지 않는다** —\n * 다른 현장의 구조를 이 트윈에 덮는 것은 오류가 아니라 오류 없이 틀린 공장으로 나타난다.\n */\n const picked = pickOriginSite(sites, origin)\n if (picked.site) return { ...(await adapter.fetchMaster(cfg, picked.site, onStep)), origin }\n if (picked.reason === 'site-gone')\n throw new Error(\n `reference \"${origin.source}\" no longer reports site \"${origin.siteId}\" — refusing to overwrite this twin with a different site`\n )\n\n for (const site of sites) {\n const master = await adapter.fetchMaster(cfg, site)\n if (master.source === instanceId) return { ...master, origin: { ...origin, siteId: site.siteId } }\n }\n throw new Error(\n `reference \"${origin.source}\" does not report a site that rebuilds twin \"${instanceId}\" ` +\n `(this twin was imported before the site identity was recorded, and no site's master carries its id) — refusing to overwrite it with a different site`\n )\n }\n\n /** 등록된 트윈 템플릿(파라미터화 아키타입) 목록 — 노브 스키마 포함(클라이언트 폼용). */\n @Query(returns => [ScalarObject], { description: 'List registered twin templates (parameterized archetypes) with their knob schema.' })\n async twinTemplates(@Ctx() _context: ResolverContext): Promise<any[]> {\n return listTemplates().map(t => ({ id: t.id, label: t.label, system: t.system, description: t.description, detail: t.detail, knobs: t.knobs }))\n }\n\n /** 템플릿 + 노브 → 합성 마스터 → 인제스트(+기동+시나리오). 레퍼런스 import 와 같은 경로, 원천만 합성. */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Instantiate a twin template with params → synthetic master → ingest (+start+scenario). restartPolicy declares how the new twin treats its own past on reboot ('resync' | 'resume' | 'reset') — there is no default. Returns {ok, instanceId, spaceId}.\"\n })\n async createFromTemplate(\n @Arg('templateId') templateId: string,\n @Arg('params', type => ScalarObject) params: any,\n @Arg('restartPolicy') restartPolicy: string,\n @Ctx() context: ResolverContext,\n @Arg('start', { nullable: true }) start?: boolean,\n @Arg('spaceId', { nullable: true, description: 'Existing space to co-locate this twin into (add a lens to a site). Omit to create its own space.' }) spaceId?: string\n ): Promise<any> {\n const tpl = getTemplate(templateId)\n if (!tpl) return { ok: false, error: `unknown template: ${templateId}` }\n const domainId = context.state.domain.id\n try {\n /*\n * **빠진 노브를 서버가 채운다.** 기본값을 아는 곳은 노브 스키마(계약)인데 그것을 적용하는 곳이\n * 위자드뿐이었다 — 그래서 화면을 거치지 않는 호출자(AI·스크립트·API)가 파라미터를 일부만 주면\n * 템플릿 안에서 발생률이 0 이 되고 **아무것도 하지 않는 트윈**이 알리지 않고 만들어졌다.\n * 채운 노브 이름은 경고로 함께 돌려준다 — 알리지 않고 채우는 것도 알리지 않고 비우는 것만큼 위험하다.\n */\n const filled = filledKnobKeys(tpl.knobs, params)\n const effective = applyKnobDefaults(tpl.knobs, params)\n /*\n * **이 현장에 이미 있는 설비를 노브 값으로 확정한다** (`siteEquipmentIds`).\n *\n * 에너지 트윈이 「공장이 돌면 전기가 오른다」를 말하려면 부하를 **이웃 트윈의 설비 id 로**\n * 선언해야 한다(설비 하나에 사실 둘). 그 목록을 빌드할 때마다 현장에서 다시 읽으면, 사이에\n * 설비가 늘거나 준 만큼 **다시 지을 때 다른 트윈**이 된다. 그래서 여기서 한 번 해석하고\n * 그 결과를 노브 값으로 남긴다(아래 `origin.params` 에 그대로 저장된다).\n */\n const adopted = await resolveSiteEquipmentKnobs(tpl.knobs, effective, domainId, spaceId)\n const { master, scenario } = tpl.build(effective)\n /* **무엇으로 지었는지 남긴다.** 합성은 결정적이므로 같은 노브면 같은 마스터가 다시 나온다 —\n 그래서 템플릿 트윈도 어댑터 트윈과 똑같이 다시 읽을 수 있다. 남기지 않으면 그 트윈은\n 첫날의 모습에 영원히 머문다(원본을 잃은 트윈). */\n /* 고른 현장도 남긴다 — 없으면 다시 읽기가 트윈을 템플릿 기본 공간으로 옮겨 버린다(현장 값도 잃는다). */\n master.origin = { kind: 'template', templateId, params: effective, ...(spaceId ? { spaceId } : {}) }\n /* 공간 선택은 템플릿을 거치지 않는다 — 템플릿마다 이 노브를 알고 있어야 한다면 새 템플릿이\n 알리지 않고 무시하게 된다. 합성된 마스터에 한 곳에서 얹는다(레퍼런스 인제스트와 같은 경로). */\n const res = await TwinEngine.ingestMaster(\n domainId,\n master,\n readRestartPolicy(restartPolicy, `createFromTemplate(\"${templateId}\")`),\n { spaceId },\n context.state.user\n )\n if (start !== false) {\n await TwinEngine.startFromRegistry(domainId, res.instanceId)\n if (scenario) {\n const runtime = TwinEngine.runtime(domainId, res.instanceId)\n if (runtime) {\n runtime.scenario.load(scenario)\n runtime.scenario.start()\n }\n }\n }\n const warnings = [\n ...(filled.length ? [knobDefaultsFilled(filled)] : []),\n ...adopted.filter(a => a.count > 0).map(a => siteEquipmentAdopted(a.key, a.count)),\n ...res.warnings\n ]\n return { ok: true, instanceId: res.instanceId, spaceId: res.spaceId, warnings }\n } catch (e: any) {\n return refusal(context, e, 'template instantiation failed')\n }\n }\n\n /* ── 레퍼런스 관리(엔티티 기반·테넌트 스코프) — reference-management P1 ────────\n * 전역 인메모리(referenceSources/importFromReference)와 공존. 이쪽은 TwinReference 행 + 어댑터 레지스트리.\n */\n\n @Query(returns => [ScalarObject], { description: 'List tenant-scoped persisted twin references (adapter-backed).' })\n async twinReferences(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const rows = await getRepository(TwinReference).find({ where: { domain: { id: domainId } } })\n /*\n * provenance 라이브 대조 — 지워진 트윈은 producedCount 에서 자동 제외(상태 동기의 lazy 방식).\n *\n * **id 만 읽는다** (2026-08-21). 예전에는 인스턴스 행 전체를 읽었고, 그 행에는 **모델 JSON** 이\n * 들어 있다(자리 수백 개 + 발자국 좌표). 그래서 이 목록을 여는 데 수 메가바이트를 읽고 파싱했고,\n * 화면은 그동안 「아직 연결된 시스템이 없습니다」를 보이고 있었다 — 사용자에게는 「없다」는 답으로\n * 읽힌다. 여기서 필요한 것은 살아 있는 id 집합 하나다.\n */\n const liveIds = new Set(\n (await getRepository(TwinInstance).find({ where: { domain: { id: domainId } }, select: ['instanceId'] })).map(\n i => i.instanceId\n )\n )\n return rows.map(r => {\n const produced = (((r.scopeSpec as any)?.produced ?? []) as any[]).filter(p => liveIds.has(p.instanceId))\n return {\n source: r.source, system: r.system, siteName: r.siteName, description: r.description,\n adapterType: r.adapterType, status: r.status, lastSyncedAt: r.lastSyncedAt, lastError: r.lastError,\n producedCount: produced.length, produced\n }\n })\n }\n\n @Query(returns => [String], { description: 'List registered reference adapter type keys.' })\n referenceAdapterTypes(): string[] {\n return listAdapterTypes()\n }\n\n /**\n * 인티그레이션 그룹핑 (reference-management §2.3·D11) — 산출물을 커넥터 타입 ▸ Connection ▸ 인스턴스 2단으로.\n * 트윈-네이티브 온톨로지(integration 무의존): TwinReference 가 그룹핑 노드(source=connectionName),\n * scopeSpec.connectorType 로 상위 분류. producedCount 는 라이브 인스턴스로 대조(지워진 트윈 제외).\n */\n @Query(returns => [ScalarObject], { description: 'Group integration items 2-tier: connector type ▸ connection ▸ produced twins. (reference-management §2.3)' })\n async twinConnections(@Ctx() context: ResolverContext): Promise<any[]> {\n const domainId = context.state.domain.id\n const rows = await getRepository(TwinReference).find({ where: { domain: { id: domainId } } })\n const liveIds = new Set((await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })).map(i => i.instanceId))\n const groups = new Map<string, any[]>()\n for (const r of rows) {\n const connectorType = (r.scopeSpec as any)?.connectorType ?? r.adapterType\n const producedCount = (((r.scopeSpec as any)?.produced ?? []) as any[]).filter(p => liveIds.has(p.instanceId)).length\n const conn = { source: r.source, name: r.siteName, status: r.status, adapterType: r.adapterType, producedCount, lastSyncedAt: r.lastSyncedAt }\n if (!groups.has(connectorType)) groups.set(connectorType, [])\n groups.get(connectorType)!.push(conn)\n }\n return [...groups.entries()].map(([connectorType, connections]) => ({\n connectorType,\n connectionCount: connections.length,\n instanceCount: connections.reduce((s, c) => s + c.producedCount, 0),\n connections\n }))\n }\n\n /** 한 Connection 그룹 노드 상세 — 그 아래 생성된 트윈 인스턴스(라이브 대조·상태·기동여부). */\n @Query(returns => ScalarObject, { nullable: true, description: 'One connection grouping location with its produced twin instances (live-checked). (reference-management §2.3)' })\n async twinConnection(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any | null> {\n const domainId = context.state.domain.id\n const r = await getRepository(TwinReference).findOne({ where: { domain: { id: domainId }, source } })\n if (!r) return null\n const produced = ((r.scopeSpec as any)?.produced ?? []) as any[]\n const instMap = new Map((await getRepository(TwinInstance).find({ where: { domain: { id: domainId } } })).map(i => [i.instanceId, i]))\n const instances = produced\n .filter(p => instMap.has(p.instanceId))\n .map(p => {\n const inst = instMap.get(p.instanceId) as any\n return { instanceId: p.instanceId, spaceId: p.spaceId, siteId: p.siteId, kind: inst.kind, status: inst.status, running: TwinEngine.owns(domainId, p.instanceId) }\n })\n return {\n source: r.source,\n connectorType: (r.scopeSpec as any)?.connectorType ?? r.adapterType,\n name: r.siteName,\n status: r.status,\n system: r.system,\n lastSyncedAt: r.lastSyncedAt,\n instanceCount: instances.length,\n instances\n }\n }\n\n /** 단건 상세(뷰/편집) — connectionConfig 포함, 어댑터 스키마의 secret 필드는 마스킹(있으면 '••••••'). */\n @Query(returns => ScalarObject, { nullable: true, description: 'Get one tenant-scoped reference with its connection config (secret fields masked) for view/edit.' })\n async twinReference(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any | null> {\n const r = await getRepository(TwinReference).findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!r) return null\n const secretKeys = new Set((getAdapter(r.adapterType)?.meta?.configSchema ?? []).filter(f => f.secret).map(f => f.key))\n const cfg: any = {}\n for (const [k, v] of Object.entries((r.connectionConfig as any) ?? {})) cfg[k] = secretKeys.has(k) ? (v ? '••••••' : '') : v\n /*\n * **이 연결이 만든 트윈 id 를 함께 낸다.** 상세 화면이 「이 연결이 잘 동기화되고 있나」를 물으려면\n * 어느 트윈을 물어야 하는지 알아야 한다. 예전에는 개수(`producedCount`)만 있어서 화면이 id 를\n * 알 방법이 없었다.\n */\n const producedInstanceIds = [\n ...new Set(\n ((r.scopeSpec as any)?.produced ?? [])\n .map((p: any) => p?.instanceId)\n .filter((x: any): x is string => typeof x === 'string' && !!x)\n )\n ]\n return {\n source: r.source, system: r.system, siteName: r.siteName, description: r.description,\n adapterType: r.adapterType, connectionConfig: cfg, status: r.status, lastSyncedAt: r.lastSyncedAt, lastError: r.lastError,\n producedInstanceIds\n }\n }\n\n @Query(returns => [ScalarObject], { description: 'List reference connector metadata (label, domain, config schema, availability, capabilities) for the connect UI.' })\n referenceAdapters(): any[] {\n /*\n * **능력을 함께 낸다** (2026-08-21).\n *\n * `capabilities` 는 어댑터 뿌리에 있고 `meta` 에는 없었다. 그래서 연결 화면이 「이 원본이 라이브를\n * 낼 수 있나」를 알 수 없었고, 트윈을 만들 때 `live` 를 말하지 못해 **재기동 정책이 없다고 거절**됐다\n * (실 연동에서 그것에 막혔다 — 미러는 정의상 `resync` 이므로 `live` 하나로 정해진다).\n *\n * 화면이 그 사실을 알아야 정책을 사람에게 물을지 스스로 정할지 가를 수 있다.\n */\n return listAdapters().map(a => ({ type: a.type, ...(a.meta ?? {}), capabilities: a.capabilities ?? [] }))\n }\n\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, { description: 'Create or update a tenant-scoped twin reference (persisted).' })\n async saveTwinReference(\n @Arg('source') source: string,\n @Arg('patch', type => ScalarObject) patch: any,\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const existing = await repo.findOne({ where: { domain: { id: domainId }, source } })\n const saved = await repo.save(\n repo.create({\n ...(existing ?? {}),\n domain: { id: domainId } as any,\n source,\n system: patch.system ?? existing?.system,\n siteName: patch.siteName ?? existing?.siteName,\n description: patch.description ?? existing?.description,\n adapterType: patch.adapterType ?? existing?.adapterType,\n // 필드 단위 병합 — 편집 시 생략된 키(예: 마스킹된 secret)는 기존 값 유지.\n connectionConfig: patch.connectionConfig\n ? { ...((existing?.connectionConfig as any) ?? {}), ...patch.connectionConfig }\n : existing?.connectionConfig,\n mappingSpec: patch.mappingSpec ?? existing?.mappingSpec,\n scopeSpec: patch.scopeSpec ?? existing?.scopeSpec,\n status: patch.status ?? existing?.status ?? 'draft'\n })\n )\n return { ok: true, source: saved.source }\n }\n\n /** 연결 해제 — removeTwins=true 면 이 레퍼런스가 만든 트윈(provenance)도 함께 제거(라이프사이클 연쇄). 기본은 트윈 보존(분리). */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Delete a tenant-scoped reference. If removeTwins, also remove the twin instances it produced (provenance cascade); otherwise twins are kept (detached).' })\n async deleteTwinReference(\n @Arg('source') source: string,\n @Ctx() context: ResolverContext,\n @Arg('removeTwins', { nullable: true }) removeTwins?: boolean\n ): Promise<boolean> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: domainId }, source } })\n if (removeTwins && ref) {\n for (const p of (((ref.scopeSpec as any)?.produced ?? []) as any[])) {\n try {\n await TwinEngine.remove(domainId, p.instanceId)\n } catch {\n /* 이미 없거나 실패 — 연쇄는 best-effort. */\n }\n }\n }\n await repo.delete({ domain: { id: domainId } as any, source })\n return true\n }\n\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, { description: 'Test a reference connection via its adapter; updates status.' })\n async testReferenceConnection(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any> {\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!ref) return { ok: false, error: `unknown reference: ${source}` }\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return { ok: false, error: `no adapter for type: ${ref.adapterType}` }\n try {\n const res = await adapter.testConnection(ref.connectionConfig ?? {})\n await repo.update({ id: ref.id }, { status: res.ok ? 'connected' : 'error', lastError: res.error ?? null } as any)\n return res\n } catch (e: any) {\n return { ok: false, error: e?.message ?? 'test failed' }\n }\n }\n\n /**\n * 어댑터 기반 인제스트 — discoverSites → 사이트별 fetchMaster → ingestMaster (fan-out, §2.2·§4.2).\n * P1 은 대개 N=1(virtual/단일). start 면 각 인스턴스 기동. 라이브 피드·mode 는 face2-inbound-live 소유.\n */\n /** 레퍼런스가 노출하는 사이트/공장 발견 — 트윈 생성 시 \"어느 공장\" 선택용(§2.2). */\n @Query(returns => ScalarObject, { description: 'Discover sites/factories exposed by a reference. Returns { sites, error? } — an empty list with no error means the system genuinely has none, which is different from a failure.' })\n async discoverReferenceSites(@Arg('source') source: string, @Ctx() context: ResolverContext): Promise<any> {\n /*\n * **\"못 찾았다\" 와 \"없다\" 를 구분한다.** 예전에는 넷을 빈 배열 하나로 합쳤고(레퍼런스 없음·어댑터\n * 미상·조회 실패·정말 0건), 화면은 그 모두를 \"사이트를 찾지 못했습니다\" 라고만 말했다. 실 시스템\n * 연결에서 가장 자주 막히는 자리인데 자격이 틀렸는지 주소가 틀렸는지 알 수 없었다.\n * 판정과 문장 형태는 `discovery-result`(순수)가 갖는다.\n */\n const ref = await getRepository(TwinReference).findOne({ where: { domain: { id: context.state.domain.id }, source } })\n if (!ref) return failed(referenceNotFound(source))\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return failed(adapterUnknown(ref.adapterType, source))\n try {\n /*\n * **기다려도 답이 없으면 사유를 준다.** 어댑터 계약에 시간 제한이 없어서, 주소가 틀린 엔드포인트는\n * 화면을 무한히 돌게 만들었다 — 무한히 도는 화면은 들어온 것이 없는 실패의 다른 얼굴이다.\n * 상한은 여기서 정한다(어댑터마다 다르게 두면 사용자가 어느 것을 기다리는지 알 수 없다).\n */\n const sites = await withTimeout(adapter.discoverSites(ref.connectionConfig ?? {}), DISCOVER_TIMEOUT_MS)\n return discovered(sites)\n } catch (e: any) {\n if (e?.code === TIMEOUT) return failed(discoveryTimedOut(source, DISCOVER_TIMEOUT_MS / 1000))\n return failed(discoveryFailed(source, detailOf(e)))\n }\n }\n\n /**\n * 트윈 생성 — 레퍼런스에서 사이트 발견 → (siteIds 있으면 그 공장만) → fetchMaster → provision. 사이트별 resilient.\n * 여러 공장을 관할하는 소스는 siteIds 로 \"어느 공장\"을 골라 생성(1:N, §2.1·§2.2).\n *\n * ── 현장 선택이 이 경로에도 있다 (2026-08-13) ────────────────────────────\n * 한 현실을 여러 렌즈가 비춘다(WMS·MES·YMS). 그런데 **그 선택이 템플릿 경로에만** 있어서\n * (`createFromTemplate(spaceId)`), 실 시스템에서 가져온 트윈은 어댑터가 파생한 공간 id 가 우연히\n * 일치할 때만 한 현장에 모였다 — 사람이 \"이 MES 와 같은 현장에 넣어라\" 를 말할 방법이 없었다.\n * 데이터로는 가능한 일이 저작으로는 불가능한, `ingest-space` 가 이미 지적한 그 비대칭이다.\n *\n * 판정은 그 순수 모듈이 갖는다: 없는 공간은 거절(`resolveIngestSpace`), 사이트 여럿을 한 공간에\n * 넣는 것도 거절(`refuseImportSpace`) — 서로 다른 현장이 알리지 않고 합쳐지는 것을 막는다.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Create twins from a reference: discover sites → filter by siteIds (if given) → fetch master(s) → provision. spaceId co-locates the twin into an existing space (one site only). start=false to only provision; live=true to run as a mirror (adapter openLiveFeed → live projector) instead of sim. restartPolicy declares how each new twin treats its own past on reboot ('resync' | 'resume' | 'reset'); omit it and live=true implies 'resync' — a mirror reads the source again — while a simulation must declare 'resume' or 'reset' for itself.\"\n })\n async importTwinReference(\n @Arg('source') source: string,\n @Ctx() context: ResolverContext,\n @Arg('siteIds', type => [String], { nullable: true }) siteIds?: string[],\n @Arg('start', { nullable: true }) start?: boolean,\n @Arg('live', { nullable: true }) live?: boolean,\n @Arg('spaceId', { nullable: true, description: 'Existing space to co-locate this twin into (add a lens to a site). Only when importing a single site. Omit to give each site its own space.' }) spaceId?: string,\n @Arg('restartPolicy', { nullable: true, description: \"How each new twin treats its own past on reboot: 'resync' | 'resume' | 'reset'. Required unless live=true (a mirror is 'resync' by definition).\" }) restartPolicy?: string\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinReference)\n const ref = await repo.findOne({ where: { domain: { id: domainId }, source } })\n if (!ref) return { ok: false, error: `unknown reference: ${source}` }\n const adapter = getAdapter(ref.adapterType)\n if (!adapter) return { ok: false, error: `no adapter for type: ${ref.adapterType}` }\n const cfg = ref.connectionConfig ?? {}\n try {\n let sites = await adapter.discoverSites(cfg)\n if (siteIds?.length) sites = sites.filter(s => siteIds.includes(s.siteId))\n /* 아무것도 쓰기 전에 거절한다 — 한 사이트를 넘으면 \"이 현장에 더한다\" 가 성립하지 않는다. */\n const refusal = refuseImportSpace(sites.length, spaceId)\n if (refusal) return { ok: false, error: refusal.message, errorCode: refusal.code, errorParams: refusal.params }\n const instances: any[] = []\n const failed: any[] = []\n /*\n * **진행을 구독으로 흘린다** (2026-08-21).\n *\n * 마스터 읽기는 원본에 여러 질의를 보내는 긴 작업이고, 화면은 그 사이 아무것도 알 수 없었다.\n * 단계를 아는 것은 어댑터뿐이므로 어댑터가 말하고(표준 낱말), 호스트가 자기 두 단계(생성·기동)를\n * 더해 흘린다.\n *\n * **분모는 어댑터가 선언한 것**이다(`masterSteps`). 선언하지 않은 어댑터는 `total` 이 없고, 그때\n * 화면은 퍼센트를 만들지 않는다 — 모르는 진행률을 지어내지 않는다.\n */\n const declared = adapter.masterSteps?.length\n const stepTotal = declared === undefined ? undefined : declared + HOST_STEPS.length\n const emit = (p: Omit<ReferenceProgress, 'siteCount'>) =>\n pubsub.publish('twin-reference-progress', {\n twinReferenceProgress: { ...p, siteCount: sites.length, total: p.total ?? stepTotal, source }\n })\n\n /*\n * **읽은 뒤의 총평을 사이트마다 남긴다** (2026-08-22).\n *\n * 총평은 읽는 순간에만 있었다 — 대화상자를 닫으면 사라지고, 다시 보려면 같은 읽기를 또 해야 했다.\n * 그런데 사람이 그것을 묻는 자리는 「모델 살펴보기」다(트윈을 보다가 「이건 왜 비었나」를 묻는다).\n * 그래서 레퍼런스 행에 남겨 그 화면이 언제든 읽게 한다.\n *\n * 사실만 담는다(`assessMaster`) — 문장은 화면이 만들고, 더 알고 싶을 때 AI 가 이 사실만 근거로\n * 서술한다. 다시 읽으면 그 사이트의 총평이 새것으로 바뀐다(지난 읽기의 총평을 현재로 보이게\n * 두지 않는다).\n */\n const assessments: Record<string, unknown> = {}\n\n for (const [siteIndex, site] of sites.entries()) {\n /*\n * **실패를 실제로 막힌 단계에 적는다** (2026-08-22).\n *\n * 예전에는 실패를 무조건 `provision` 으로 적었다. 그래서 원본을 읽다 끊긴 것도 화면에는\n * 「트윈 생성에서 실패」로 떴다 — 사람이 원인을 엉뚱한 자리에서 찾는다(실제로 그렇게 됐다).\n *\n * 규약이 답을 준다: `done` 은 **끝낸 단계 수**다(`ReferenceProgress.done`). 그러면 지금 막힌 것은\n * 그 다음 단계, 즉 `masterSteps[done]` 이다. 그 표를 넘어서면(호스트 단계) 마지막으로 알린 것을 쓴다.\n *\n * 이 규칙은 두 가지 보고 방식에 함께 맞는다 — 단계 **시작**에 알리는 어댑터(`done` 이 아직 0)와\n * 단계 **완료**에 알리는 어댑터(`done` 이 1 늘어난다) 모두 「끝낸 수」만 지키면 된다.\n */\n let lastDone = 0\n let lastStep: ReferenceProgress['step'] = (adapter.masterSteps?.[0] ?? 'provision') as ReferenceProgress['step']\n const track = (p: Omit<ReferenceProgress, 'siteCount'>) => {\n lastDone = p.done\n lastStep = p.step\n emit(p)\n }\n try {\n const master = await adapter.fetchMaster(cfg, site, st =>\n track({ siteId: site.siteId, siteIndex, step: st.key, done: st.done, total: stepTotal, detail: st.detail })\n )\n /* 어느 레퍼런스의 **어느 사이트**에서 왔는지 남긴다 — 다시 읽기가 같은 어댑터·같은 사이트로 돌아오려면\n 사이트 정체가 있어야 한다(`source` 는 참조 이름이라 사이트 전부에 같다). */\n /*\n * 정책은 **선언이거나 의도에서 곧바로 따라오는 것**이다: `live=true` 는 미러를 띄우겠다는 뜻이고\n * 미러는 정의상 `resync` 다(외부가 진실이므로 우리 과거를 이어 붙이지 않는다). 시뮬로 띄우려면\n * 스스로 선언해야 한다 — 그 자리에서 우리가 고르면 재기동마다 이력을 지우는 트윈이 알리지 않고 생긴다.\n */\n assessments[site.siteId] = assessMaster(master, site.siteId)\n const policy = readRestartPolicy(restartPolicy ?? (live ? 'resync' : undefined), `importTwinReference(\"${source}\")`)\n track({ siteId: site.siteId, siteIndex, step: 'provision', done: declared ?? 0, total: stepTotal })\n const res = await TwinEngine.ingestMaster(\n domainId,\n { ...master, origin: { kind: 'reference', source, siteId: site.siteId, ...(spaceId ? { spaceId } : {}) } },\n policy,\n { spaceId },\n context.state.user\n )\n track({ siteId: site.siteId, siteIndex, step: 'start', done: (declared ?? 0) + 1, total: stepTotal })\n if (start !== false) {\n // live=true + 어댑터가 openLiveFeed 지원 → mirror(실 이벤트 미러). 아니면 sim 기동(fallback).\n /* 읽기 커서를 저장할 자리를 함께 넘긴다 — 레퍼런스의 이름은 호스트가 붙이는 것이고\n 커넥터는 그것을 알 수 없다(§`startReferenceLiveFeed`). */\n const wentLive = live\n ? await startReferenceLiveFeed(domainId, ref.adapterType, cfg, site, res.instanceId, ref.source)\n : false\n if (!wentLive) await TwinEngine.startFromRegistry(domainId, res.instanceId)\n instances.push({ siteId: site.siteId, instanceId: res.instanceId, spaceId: res.spaceId, mode: wentLive ? 'live' : 'sim', warnings: res.warnings })\n } else {\n instances.push({ siteId: site.siteId, instanceId: res.instanceId, spaceId: res.spaceId, mode: 'provisioned', warnings: res.warnings })\n }\n } catch (e: any) {\n /*\n * **실패한 단계를 그대로 알린다.** 화면이 진행 표시를 지우지 않고 그 자리를 붉게 두어야\n * 사람이 「어디까지 갔는지」를 안다. 막힌 자리는 「끝낸 수」의 다음 단계다(위 주석).\n */\n const at = (adapter.masterSteps?.[lastDone] ?? lastStep) as ReferenceProgress['step']\n emit({ siteId: site.siteId, siteIndex, step: at, done: lastDone, total: stepTotal, failed: true, error: e?.message ?? String(e) })\n\n failed.push({ siteId: site.siteId, error: e?.message ?? 'failed' })\n }\n }\n // provenance — 이 레퍼런스가 만든 인스턴스 추적(scopeSpec.produced). 삭제 연쇄·상태 동기·네비게이션 근거.\n const producedNew = instances.map(i => ({ siteId: i.siteId, instanceId: i.instanceId, spaceId: i.spaceId }))\n const prev: any[] = ((ref.scopeSpec as any)?.produced ?? []).filter((p: any) => !producedNew.some(n => n.instanceId === p.instanceId))\n await repo.update(\n { id: ref.id },\n {\n status: 'connected',\n lastSyncedAt: new Date().toISOString(),\n /* 못 옮긴 값을 **세어 남긴다**. 아무 인스턴스도 보고하지 않았으면 `null` — 「없었다」로 위장하지 않는다. */\n lastWarningCount: instances.some((i: any) => Array.isArray(i.warnings))\n ? instances.reduce((n: number, i: any) => n + (Array.isArray(i.warnings) ? i.warnings.length : 0), 0)\n : null,\n /*\n * **영어 canonical 로 남긴다.** 이 값은 DB 에 저장되고 연결 화면이 그대로 뿌린다 — 예전에는\n * 한글 산문(`N개 사이트 실패`)이라 다섯 언어 화면에 한글이 새어 나갔다. 어댑터가 주는 사유도\n * 같은 필드에 들어오므로(그것은 원 시스템의 말이다) 키가 아니라 영어 문장으로 통일한다.\n * 어느 사이트가 왜 실패했는지는 `failed[]` 가 답한다 — 화면이 그것을 보여 준다.\n */\n lastError: failed.length ? `${failed.length} of ${sites.length} site(s) failed: ${failed.map((f: any) => f.siteId).join(', ')}` : null,\n /*\n * ── 실패 사유를 **남긴다** (2026-08-21) ────────────────────────────────\n *\n * 사유는 대화상자에만 있었다. 닫으면 사라지고, 다시 보려면 같은 실패를 다시 만들어야 했다 —\n * 실제로 「승화푸드」 연결이 그 상태였다(요약 한 줄만 남고 원인은 어디에도 없었다).\n *\n * `scopeSpec` 은 이미 이 레퍼런스의 부속 사실을 담는 자리이므로(`produced`) 스키마를 늘리지 않고\n * 여기 적는다. 성공한 회차에는 **비운다** — 지나간 실패를 현재 상태처럼 보이게 두지 않는다.\n */\n scopeSpec: {\n ...((ref.scopeSpec as any) ?? {}),\n produced: [...prev, ...producedNew],\n /* 이번에 읽은 사이트의 총평만 갈아 끼운다 — 읽지 않은 사이트의 것은 그대로 둔다. */\n assessments: { ...(((ref.scopeSpec as any) ?? {}).assessments ?? {}), ...assessments },\n ...(failed.length\n ? { lastFailures: failed.map((f: any) => ({ siteId: f.siteId, error: f.error, at: new Date().toISOString() })) }\n : { lastFailures: [] })\n }\n } as any\n )\n return { ok: instances.length > 0, instances, failed }\n } catch (e: any) {\n /* 레퍼런스 행에는 **영어 canonical** 을 남긴다 — 저장되는 값은 언어중립이어야 다시 읽을 수 있다. */\n await repo.update({ id: ref.id }, { status: 'error', lastError: e?.message ?? 'ingest failed' } as any)\n return refusal(context, e, 'ingest failed')\n }\n }\n}\n"]}
|
|
@@ -4,6 +4,7 @@ export interface TwinEventKeys {
|
|
|
4
4
|
bizStep?: string;
|
|
5
5
|
epc?: string;
|
|
6
6
|
orderId?: string;
|
|
7
|
+
bizTransaction?: string;
|
|
7
8
|
locationId?: string;
|
|
8
9
|
moverId?: string;
|
|
9
10
|
}
|
|
@@ -32,13 +33,40 @@ export declare function epcOf(envelope: any): string | undefined;
|
|
|
32
33
|
* 없었다. 화면은 오더를 눌러도 「연결된 이벤트가 없습니다」를 냈고, 그 답은 질의 결과로는 정직했다 —
|
|
33
34
|
* 시점을 어디로 옮겨도 0 이었다.
|
|
34
35
|
*
|
|
35
|
-
* 순서가 중요하다: 운영 델타가 먼저다. EPCIS 의 `bizTransactionList` 는 **거래**(PO/SO)이고 오더와
|
|
36
|
-
* 같은 것이 아닐 수 있으므로, 오더를 스스로 말하는 사건은 그 말을 그대로 쓴다.
|
|
37
|
-
*
|
|
38
36
|
* **과거 행은 채워지지 않는다**(사용자 결정 2026-08-24, `moverId` 때와 같은 방식). 앞으로 들어오는
|
|
39
37
|
* 사건부터 조회된다.
|
|
38
|
+
*
|
|
39
|
+
* ── 한 칸에 두 낱말이 들어 있었다 (2026-09-05 실측) ────────────────────────
|
|
40
|
+
* 위 주석이 이미 알고 있었다 — 「EPCIS 의 `bizTransactionList` 는 **거래**(PO/SO)이고 오더와 같은
|
|
41
|
+
* 것이 아닐 수 있다」. 그런데 그 둘을 **같은 칸에** 넣고 있었다. 그래서 이렇게 됐다.
|
|
42
|
+
*
|
|
43
|
+
* order.status order-1 내부 오더 id
|
|
44
|
+
* epcis.TransformationEvent urn:epc:id:gdti:9521321.403.1 GS1 거래 식별자
|
|
45
|
+
* epcis.TransactionEvent urn:epc:id:gdti:9521321.403.1
|
|
46
|
+
*
|
|
47
|
+
* 한 오더의 이력이 **색인 안에서 두 쪽으로 갈라진다.** 어느 이름으로 물어도 절반만 나오고,
|
|
48
|
+
* 오류는 나지 않는다. 실측: 어휘가 섞인 행 10,004개.
|
|
49
|
+
*
|
|
50
|
+
* 이것이 실제로 막은 것 — 「이 개체를 어느 레시피로 만들었나」다. 답은 기록되어 있다(오더 사건이
|
|
51
|
+
* `recipeKey` 를 든다, 실측 328,021/328,021 = 100%). 변환 사건은 그 오더를 GDTI 로 가리키는데
|
|
52
|
+
* 오더 사건은 `order-1` 로 적혀 있어 **색인으로 이을 수가 없었다.**
|
|
53
|
+
*
|
|
54
|
+
* 그래서 칸을 갈랐다(사용자 결정 2026-09-05).
|
|
55
|
+
*
|
|
56
|
+
* orderId 내부 오더 id — 읽기 모델의 이음쇠
|
|
57
|
+
* bizTransaction GS1 거래 식별자 — 표준이 말하는 그 거래
|
|
58
|
+
*
|
|
59
|
+
* 오더 사건은 **둘 다** 든다(`order.status` 의 payload 에 `orderId` 와 `bizTransaction` 이 함께
|
|
60
|
+
* 있다). 그래서 EPCIS 사건의 거래 식별자로 오더를 찾을 수 있다 — 이 두 칸이 그 다리다.
|
|
40
61
|
*/
|
|
41
62
|
export declare function orderOf(envelope: any): string | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* **그 사건이 가리키는 거래** — EPCIS `bizTransactionList` 의 첫 항목, 또는 운영 델타가 직접 든 값.
|
|
65
|
+
*
|
|
66
|
+
* 오더가 아니다. 표준이 말하는 거래(PO/SO/생산오더)이고, 한 오더가 여러 거래에 걸릴 수도 있다.
|
|
67
|
+
* 그 구별을 지키려고 `orderId` 와 갈라 두었다 — 합치면 위 주석의 그 일이 다시 난다.
|
|
68
|
+
*/
|
|
69
|
+
export declare function bizTransactionOf(envelope: any): string | undefined;
|
|
42
70
|
/**
|
|
43
71
|
* 위치 — EPCIS 는 읽은 지점(readPoint) 우선, 없으면 업무 위치(bizLocation).
|
|
44
72
|
* 운영 델타(무버 이동 등)는 그 둘이 없고 평범한 `location` 을 쓴다 — 빠뜨리면 설비가 어디서
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.bizStepOf = bizStepOf;
|
|
4
4
|
exports.epcOf = epcOf;
|
|
5
5
|
exports.orderOf = orderOf;
|
|
6
|
+
exports.bizTransactionOf = bizTransactionOf;
|
|
6
7
|
exports.locationOf = locationOf;
|
|
7
8
|
exports.equipmentIdOf = equipmentIdOf;
|
|
8
9
|
exports.actionOf = actionOf;
|
|
@@ -58,15 +59,45 @@ function epcOf(envelope) {
|
|
|
58
59
|
* 없었다. 화면은 오더를 눌러도 「연결된 이벤트가 없습니다」를 냈고, 그 답은 질의 결과로는 정직했다 —
|
|
59
60
|
* 시점을 어디로 옮겨도 0 이었다.
|
|
60
61
|
*
|
|
61
|
-
* 순서가 중요하다: 운영 델타가 먼저다. EPCIS 의 `bizTransactionList` 는 **거래**(PO/SO)이고 오더와
|
|
62
|
-
* 같은 것이 아닐 수 있으므로, 오더를 스스로 말하는 사건은 그 말을 그대로 쓴다.
|
|
63
|
-
*
|
|
64
62
|
* **과거 행은 채워지지 않는다**(사용자 결정 2026-08-24, `moverId` 때와 같은 방식). 앞으로 들어오는
|
|
65
63
|
* 사건부터 조회된다.
|
|
64
|
+
*
|
|
65
|
+
* ── 한 칸에 두 낱말이 들어 있었다 (2026-09-05 실측) ────────────────────────
|
|
66
|
+
* 위 주석이 이미 알고 있었다 — 「EPCIS 의 `bizTransactionList` 는 **거래**(PO/SO)이고 오더와 같은
|
|
67
|
+
* 것이 아닐 수 있다」. 그런데 그 둘을 **같은 칸에** 넣고 있었다. 그래서 이렇게 됐다.
|
|
68
|
+
*
|
|
69
|
+
* order.status order-1 내부 오더 id
|
|
70
|
+
* epcis.TransformationEvent urn:epc:id:gdti:9521321.403.1 GS1 거래 식별자
|
|
71
|
+
* epcis.TransactionEvent urn:epc:id:gdti:9521321.403.1
|
|
72
|
+
*
|
|
73
|
+
* 한 오더의 이력이 **색인 안에서 두 쪽으로 갈라진다.** 어느 이름으로 물어도 절반만 나오고,
|
|
74
|
+
* 오류는 나지 않는다. 실측: 어휘가 섞인 행 10,004개.
|
|
75
|
+
*
|
|
76
|
+
* 이것이 실제로 막은 것 — 「이 개체를 어느 레시피로 만들었나」다. 답은 기록되어 있다(오더 사건이
|
|
77
|
+
* `recipeKey` 를 든다, 실측 328,021/328,021 = 100%). 변환 사건은 그 오더를 GDTI 로 가리키는데
|
|
78
|
+
* 오더 사건은 `order-1` 로 적혀 있어 **색인으로 이을 수가 없었다.**
|
|
79
|
+
*
|
|
80
|
+
* 그래서 칸을 갈랐다(사용자 결정 2026-09-05).
|
|
81
|
+
*
|
|
82
|
+
* orderId 내부 오더 id — 읽기 모델의 이음쇠
|
|
83
|
+
* bizTransaction GS1 거래 식별자 — 표준이 말하는 그 거래
|
|
84
|
+
*
|
|
85
|
+
* 오더 사건은 **둘 다** 든다(`order.status` 의 payload 에 `orderId` 와 `bizTransaction` 이 함께
|
|
86
|
+
* 있다). 그래서 EPCIS 사건의 거래 식별자로 오더를 찾을 수 있다 — 이 두 칸이 그 다리다.
|
|
66
87
|
*/
|
|
67
88
|
function orderOf(envelope) {
|
|
68
89
|
const d = envelope?.data ?? envelope ?? {};
|
|
69
|
-
return d.orderId ??
|
|
90
|
+
return d.orderId ?? undefined;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* **그 사건이 가리키는 거래** — EPCIS `bizTransactionList` 의 첫 항목, 또는 운영 델타가 직접 든 값.
|
|
94
|
+
*
|
|
95
|
+
* 오더가 아니다. 표준이 말하는 거래(PO/SO/생산오더)이고, 한 오더가 여러 거래에 걸릴 수도 있다.
|
|
96
|
+
* 그 구별을 지키려고 `orderId` 와 갈라 두었다 — 합치면 위 주석의 그 일이 다시 난다.
|
|
97
|
+
*/
|
|
98
|
+
function bizTransactionOf(envelope) {
|
|
99
|
+
const d = envelope?.data ?? envelope ?? {};
|
|
100
|
+
return d.bizTransactionList?.[0]?.bizTransaction ?? d.bizTransaction ?? undefined;
|
|
70
101
|
}
|
|
71
102
|
/**
|
|
72
103
|
* 위치 — EPCIS 는 읽은 지점(readPoint) 우선, 없으면 업무 위치(bizLocation).
|
|
@@ -117,6 +148,7 @@ function twinEventKeys(envelope) {
|
|
|
117
148
|
bizStep: clip(bizStepOf(envelope), 'bizStep'),
|
|
118
149
|
epc: clip(epcOf(envelope), 'epc'),
|
|
119
150
|
orderId: clip(orderOf(envelope), 'orderId'),
|
|
151
|
+
bizTransaction: clip(bizTransactionOf(envelope), 'bizTransaction'),
|
|
120
152
|
locationId: clip(locationOf(envelope), 'locationId'),
|
|
121
153
|
moverId: clip(equipmentIdOf(envelope), 'moverId')
|
|
122
154
|
};
|