@things-factory/headless-twin 10.1.278 โ†’ 10.1.279

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. package/package.json +21 -7
  2. package/dist-server/engine/attention-digest.js.map +0 -1
  3. package/dist-server/engine/canonical-ingest.js.map +0 -1
  4. package/dist-server/engine/checkpoint-fold.js.map +0 -1
  5. package/dist-server/engine/command-routing.js.map +0 -1
  6. package/dist-server/engine/declared-stimulus.js.map +0 -1
  7. package/dist-server/engine/energy-topology.js.map +0 -1
  8. package/dist-server/engine/event-time.js.map +0 -1
  9. package/dist-server/engine/index.js.map +0 -1
  10. package/dist-server/engine/ingest-dedupe.js.map +0 -1
  11. package/dist-server/engine/ingest-health.js.map +0 -1
  12. package/dist-server/engine/integration-coverage.js.map +0 -1
  13. package/dist-server/engine/integration-probes.js.map +0 -1
  14. package/dist-server/engine/integration-runner.js.map +0 -1
  15. package/dist-server/engine/integration-target-profile.js.map +0 -1
  16. package/dist-server/engine/kpi-baseline.js.map +0 -1
  17. package/dist-server/engine/kpi-fold.js.map +0 -1
  18. package/dist-server/engine/kpi-query.js.map +0 -1
  19. package/dist-server/engine/kpi-target.js.map +0 -1
  20. package/dist-server/engine/live-attentions.js.map +0 -1
  21. package/dist-server/engine/live-feed-registry.js.map +0 -1
  22. package/dist-server/engine/load-meter.js.map +0 -1
  23. package/dist-server/engine/local-declarations.js.map +0 -1
  24. package/dist-server/engine/log.js.map +0 -1
  25. package/dist-server/engine/loop-lag.js.map +0 -1
  26. package/dist-server/engine/measured-estimator.js.map +0 -1
  27. package/dist-server/engine/measured-yield.js.map +0 -1
  28. package/dist-server/engine/model-basis.js.map +0 -1
  29. package/dist-server/engine/model-gap.js.map +0 -1
  30. package/dist-server/engine/model-refusal.js.map +0 -1
  31. package/dist-server/engine/model-vocabulary.js.map +0 -1
  32. package/dist-server/engine/oee-accumulator.js.map +0 -1
  33. package/dist-server/engine/operation-basis.js.map +0 -1
  34. package/dist-server/engine/producer-guard.js.map +0 -1
  35. package/dist-server/engine/property-effects.js.map +0 -1
  36. package/dist-server/engine/read-time.js.map +0 -1
  37. package/dist-server/engine/restart-policy.js.map +0 -1
  38. package/dist-server/engine/runtime-key.js.map +0 -1
  39. package/dist-server/engine/spec-coverage.js.map +0 -1
  40. package/dist-server/engine/stage-path.js.map +0 -1
  41. package/dist-server/engine/state-axes.js.map +0 -1
  42. package/dist-server/engine/structure-diff.js.map +0 -1
  43. package/dist-server/engine/travel-estimator.js.map +0 -1
  44. package/dist-server/engine/twin-engine.js.map +0 -1
  45. package/dist-server/engine/twin-state-channel.js.map +0 -1
  46. package/dist-server/engine/warm-start.js.map +0 -1
  47. package/dist-server/index.js.map +0 -1
  48. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +0 -1
  49. package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +0 -1
  50. package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +0 -1
  51. package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js.map +0 -1
  52. package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js.map +0 -1
  53. package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js.map +0 -1
  54. package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js.map +0 -1
  55. package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js.map +0 -1
  56. package/dist-server/migrations/1786800000000-CreateTwinReferenceReconciliations.js.map +0 -1
  57. package/dist-server/migrations/index.js.map +0 -1
  58. package/dist-server/routes.js.map +0 -1
  59. package/dist-server/service/actuation/actuation-advisor.js.map +0 -1
  60. package/dist-server/service/actuation/actuation-outcome.js.map +0 -1
  61. package/dist-server/service/actuation/actuation-rule-resolver.js.map +0 -1
  62. package/dist-server/service/actuation/actuation-rule.js.map +0 -1
  63. package/dist-server/service/actuation/approval-gateway.js.map +0 -1
  64. package/dist-server/service/actuation/catch-up-effects.js.map +0 -1
  65. package/dist-server/service/actuation/command-dispatcher.js.map +0 -1
  66. package/dist-server/service/actuation/command-store.js.map +0 -1
  67. package/dist-server/service/actuation/dispatch-after-approval.js.map +0 -1
  68. package/dist-server/service/actuation/effect-match.js.map +0 -1
  69. package/dist-server/service/actuation/index.js.map +0 -1
  70. package/dist-server/service/actuation/retry-plan.js.map +0 -1
  71. package/dist-server/service/actuation/rule-evaluate.js.map +0 -1
  72. package/dist-server/service/actuation/rule-loop.js.map +0 -1
  73. package/dist-server/service/actuation/rule-runner.js.map +0 -1
  74. package/dist-server/service/actuation/rule-wiring.js.map +0 -1
  75. package/dist-server/service/actuation/settle-effects.js.map +0 -1
  76. package/dist-server/service/actuation/sweep-dispatch.js.map +0 -1
  77. package/dist-server/service/actuation/twin-command-resolver.js.map +0 -1
  78. package/dist-server/service/actuation/twin-command.js.map +0 -1
  79. package/dist-server/service/actuation/twin-now.js.map +0 -1
  80. package/dist-server/service/index.js.map +0 -1
  81. package/dist-server/service/reference/actuation-routing.js.map +0 -1
  82. package/dist-server/service/reference/actuation-target.js.map +0 -1
  83. package/dist-server/service/reference/actuation-verification.js.map +0 -1
  84. package/dist-server/service/reference/attention-lane.js.map +0 -1
  85. package/dist-server/service/reference/connection-portability-resolver.js.map +0 -1
  86. package/dist-server/service/reference/connection-portability.js.map +0 -1
  87. package/dist-server/service/reference/control-routing.js.map +0 -1
  88. package/dist-server/service/reference/discovery-result.js.map +0 -1
  89. package/dist-server/service/reference/fill-cadence.js.map +0 -1
  90. package/dist-server/service/reference/fill-dedupe.js.map +0 -1
  91. package/dist-server/service/reference/fill-loop.js.map +0 -1
  92. package/dist-server/service/reference/fill-span.js.map +0 -1
  93. package/dist-server/service/reference/hook-contract.js.map +0 -1
  94. package/dist-server/service/reference/hook-rejected.js.map +0 -1
  95. package/dist-server/service/reference/hook-store.js.map +0 -1
  96. package/dist-server/service/reference/index.js.map +0 -1
  97. package/dist-server/service/reference/ingest-space.js.map +0 -1
  98. package/dist-server/service/reference/knob-defaults.js.map +0 -1
  99. package/dist-server/service/reference/live-cadence.js.map +0 -1
  100. package/dist-server/service/reference/live-feed-lease.js.map +0 -1
  101. package/dist-server/service/reference/live-ingest.js.map +0 -1
  102. package/dist-server/service/reference/reference-adapter.js.map +0 -1
  103. package/dist-server/service/reference/reference-assessment.js.map +0 -1
  104. package/dist-server/service/reference/reference-fill-run.js.map +0 -1
  105. package/dist-server/service/reference/reference-fill.js.map +0 -1
  106. package/dist-server/service/reference/reference-hook.js.map +0 -1
  107. package/dist-server/service/reference/reference-link-groups.js.map +0 -1
  108. package/dist-server/service/reference/reference-links.js.map +0 -1
  109. package/dist-server/service/reference/reference-live.js.map +0 -1
  110. package/dist-server/service/reference/reference-master.js.map +0 -1
  111. package/dist-server/service/reference/reference-probe.js.map +0 -1
  112. package/dist-server/service/reference/reference-progress-channel.js.map +0 -1
  113. package/dist-server/service/reference/reference-progress-subscription.js.map +0 -1
  114. package/dist-server/service/reference/reference-progress.js.map +0 -1
  115. package/dist-server/service/reference/reference-reconciliation-query.js.map +0 -1
  116. package/dist-server/service/reference/reference-reconciliation-writer.js.map +0 -1
  117. package/dist-server/service/reference/reference-reconciliation.js.map +0 -1
  118. package/dist-server/service/reference/reference-registry.js.map +0 -1
  119. package/dist-server/service/reference/reference-resolver.js.map +0 -1
  120. package/dist-server/service/reference/template-registry.js.map +0 -1
  121. package/dist-server/service/reference/twin-reference-reconciliation.js.map +0 -1
  122. package/dist-server/service/reference/twin-reference.js.map +0 -1
  123. package/dist-server/service/twin-attention/index.js.map +0 -1
  124. package/dist-server/service/twin-attention/twin-attention-query.js.map +0 -1
  125. package/dist-server/service/twin-audit/command-audit.js.map +0 -1
  126. package/dist-server/service/twin-audit/index.js.map +0 -1
  127. package/dist-server/service/twin-audit/twin-audit-event.js.map +0 -1
  128. package/dist-server/service/twin-audit/twin-audit-query.js.map +0 -1
  129. package/dist-server/service/twin-backfill/backfill-period-facts.js.map +0 -1
  130. package/dist-server/service/twin-backfill/backfill-shape.js.map +0 -1
  131. package/dist-server/service/twin-backfill/index.js.map +0 -1
  132. package/dist-server/service/twin-backfill/twin-backfill-resolver.js.map +0 -1
  133. package/dist-server/service/twin-control/index.js.map +0 -1
  134. package/dist-server/service/twin-control/twin-control-mutation.js.map +0 -1
  135. package/dist-server/service/twin-event/index.js.map +0 -1
  136. package/dist-server/service/twin-event/journal-count.js.map +0 -1
  137. package/dist-server/service/twin-event/twin-event-keys.js.map +0 -1
  138. package/dist-server/service/twin-event/twin-event-type.js.map +0 -1
  139. package/dist-server/service/twin-event/twin-event.js.map +0 -1
  140. package/dist-server/service/twin-forecast/forecast-metrics.js.map +0 -1
  141. package/dist-server/service/twin-forecast/forecast-tuning.js.map +0 -1
  142. package/dist-server/service/twin-forecast/gap-analytics.js.map +0 -1
  143. package/dist-server/service/twin-forecast/index.js.map +0 -1
  144. package/dist-server/service/twin-forecast/twin-forecast-query.js.map +0 -1
  145. package/dist-server/service/twin-ingest-window/index.js.map +0 -1
  146. package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +0 -1
  147. package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +0 -1
  148. package/dist-server/service/twin-ingest-window/twin-ingest-window.js.map +0 -1
  149. package/dist-server/service/twin-instance/index.js.map +0 -1
  150. package/dist-server/service/twin-instance/twin-instance.js.map +0 -1
  151. package/dist-server/service/twin-journal/event-type-split-shape.js.map +0 -1
  152. package/dist-server/service/twin-journal/event-type-split.js.map +0 -1
  153. package/dist-server/service/twin-journal/index.js.map +0 -1
  154. package/dist-server/service/twin-journal/journal-order.js.map +0 -1
  155. package/dist-server/service/twin-journal/twin-journal-query.js.map +0 -1
  156. package/dist-server/service/twin-lifecycle/domain-catalog.js.map +0 -1
  157. package/dist-server/service/twin-lifecycle/index.js.map +0 -1
  158. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +0 -1
  159. package/dist-server/service/twin-metrics/index.js.map +0 -1
  160. package/dist-server/service/twin-metrics/twin-metrics-query.js.map +0 -1
  161. package/dist-server/service/twin-model/axis-journal-evidence.js.map +0 -1
  162. package/dist-server/service/twin-model/choose-recipe.js.map +0 -1
  163. package/dist-server/service/twin-model/epcis-coverage.js.map +0 -1
  164. package/dist-server/service/twin-model/external-resolver.js.map +0 -1
  165. package/dist-server/service/twin-model/iec61850-coverage.js.map +0 -1
  166. package/dist-server/service/twin-model/index.js.map +0 -1
  167. package/dist-server/service/twin-model/isa95-coverage.js.map +0 -1
  168. package/dist-server/service/twin-model/item-ref.js.map +0 -1
  169. package/dist-server/service/twin-model/name-index.js.map +0 -1
  170. package/dist-server/service/twin-model/project-structure.js.map +0 -1
  171. package/dist-server/service/twin-model/standard-coverage.js.map +0 -1
  172. package/dist-server/service/twin-model/status-tally.js.map +0 -1
  173. package/dist-server/service/twin-model/twin-equipment.js.map +0 -1
  174. package/dist-server/service/twin-model/twin-lineage-query.js.map +0 -1
  175. package/dist-server/service/twin-model/twin-location.js.map +0 -1
  176. package/dist-server/service/twin-model/twin-model-item-query.js.map +0 -1
  177. package/dist-server/service/twin-model/twin-model-mutation.js.map +0 -1
  178. package/dist-server/service/twin-model/twin-model-query.js.map +0 -1
  179. package/dist-server/service/twin-model/twin-model-tree-query.js.map +0 -1
  180. package/dist-server/service/twin-model/twin-operation.js.map +0 -1
  181. package/dist-server/service/twin-readiness/index.js.map +0 -1
  182. package/dist-server/service/twin-readiness/twin-readiness-query.js.map +0 -1
  183. package/dist-server/service/twin-space/area-resolver.js.map +0 -1
  184. package/dist-server/service/twin-space/index.js.map +0 -1
  185. package/dist-server/service/twin-space/move-space.js.map +0 -1
  186. package/dist-server/service/twin-space/representation-role.js.map +0 -1
  187. package/dist-server/service/twin-space/space-integrity.js.map +0 -1
  188. package/dist-server/service/twin-space/twin-area.js.map +0 -1
  189. package/dist-server/service/twin-space/twin-space-area.js.map +0 -1
  190. package/dist-server/service/twin-space/twin-space-representation.js.map +0 -1
  191. package/dist-server/service/twin-space/twin-space-resolver.js.map +0 -1
  192. package/dist-server/service/twin-space/twin-space.js.map +0 -1
  193. package/dist-server/service/twin-state/index.js.map +0 -1
  194. package/dist-server/service/twin-state/twin-state-subscription.js.map +0 -1
  195. package/dist-server/service/twin-structure/index.js.map +0 -1
  196. package/dist-server/service/twin-structure/twin-structure.js.map +0 -1
  197. package/dist-server/service/twin-subject/event-subjects.js.map +0 -1
  198. package/dist-server/service/twin-subject/index.js.map +0 -1
  199. package/dist-server/service/twin-subject/item-resolver.js.map +0 -1
  200. package/dist-server/service/twin-subject/subject-query-shape.js.map +0 -1
  201. package/dist-server/service/twin-subject/twin-subject-backfill.js.map +0 -1
  202. package/dist-server/service/twin-subject/twin-subject-event.js.map +0 -1
  203. package/dist-server/service/twin-subject/twin-subject-fast-path.js.map +0 -1
  204. package/dist-server/service/twin-subject/twin-subject-query.js.map +0 -1
  205. package/dist-server/service/twin-subject/twin-subject-writer.js.map +0 -1
  206. package/dist-server/service/twin-target/index.js.map +0 -1
  207. package/dist-server/service/twin-target/twin-target-resolver.js.map +0 -1
  208. package/dist-server/service/twin-target/twin-target.js.map +0 -1
  209. package/dist-shared/axis-read.js.map +0 -1
  210. package/dist-shared/entity-delta.js.map +0 -1
  211. package/dist-shared/kpi-broadcast.js.map +0 -1
  212. package/dist-shared/touched-items.js.map +0 -1
  213. package/dist-shared/twin-level.js.map +0 -1
  214. package/server/engine/attention-digest.ts +0 -102
  215. package/server/engine/canonical-ingest.ts +0 -511
  216. package/server/engine/checkpoint-fold.ts +0 -12
  217. package/server/engine/command-routing.ts +0 -67
  218. package/server/engine/declared-stimulus.ts +0 -66
  219. package/server/engine/energy-topology.ts +0 -189
  220. package/server/engine/event-time.ts +0 -96
  221. package/server/engine/index.ts +0 -51
  222. package/server/engine/ingest-dedupe.ts +0 -24
  223. package/server/engine/ingest-health.ts +0 -24
  224. package/server/engine/integration-coverage.ts +0 -147
  225. package/server/engine/integration-probes.ts +0 -144
  226. package/server/engine/integration-runner.ts +0 -95
  227. package/server/engine/integration-target-profile.ts +0 -103
  228. package/server/engine/kpi-baseline.ts +0 -202
  229. package/server/engine/kpi-fold.ts +0 -1516
  230. package/server/engine/kpi-query.ts +0 -1210
  231. package/server/engine/kpi-target.ts +0 -248
  232. package/server/engine/live-attentions.ts +0 -30
  233. package/server/engine/live-feed-registry.ts +0 -59
  234. package/server/engine/load-meter.ts +0 -393
  235. package/server/engine/local-declarations.ts +0 -779
  236. package/server/engine/log.ts +0 -72
  237. package/server/engine/loop-lag.ts +0 -120
  238. package/server/engine/measured-estimator.ts +0 -91
  239. package/server/engine/measured-yield.ts +0 -89
  240. package/server/engine/model-basis.ts +0 -162
  241. package/server/engine/model-gap.ts +0 -168
  242. package/server/engine/model-refusal.ts +0 -31
  243. package/server/engine/model-vocabulary.ts +0 -82
  244. package/server/engine/oee-accumulator.ts +0 -195
  245. package/server/engine/operation-basis.ts +0 -131
  246. package/server/engine/producer-guard.ts +0 -64
  247. package/server/engine/property-effects.ts +0 -216
  248. package/server/engine/read-time.ts +0 -77
  249. package/server/engine/restart-policy.ts +0 -55
  250. package/server/engine/runtime-key.ts +0 -58
  251. package/server/engine/spec-coverage.ts +0 -105
  252. package/server/engine/stage-path.ts +0 -172
  253. package/server/engine/state-axes.ts +0 -60
  254. package/server/engine/structure-diff.ts +0 -88
  255. package/server/engine/travel-estimator.ts +0 -138
  256. package/server/engine/twin-engine.ts +0 -4979
  257. package/server/engine/twin-state-channel.ts +0 -39
  258. package/server/engine/warm-start.ts +0 -265
  259. package/server/index.ts +0 -90
  260. package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +0 -43
  261. package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +0 -54
  262. package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +0 -53
  263. package/server/migrations/1786300000000-IndexEventTypeByTime.ts +0 -48
  264. package/server/migrations/1786400000000-IndexEventCreatedAt.ts +0 -38
  265. package/server/migrations/1786500000000-CreateTwinSubjectEvents.ts +0 -93
  266. package/server/migrations/1786600000000-RenameOperatoMesAdapterType.ts +0 -66
  267. package/server/migrations/1786700000000-AddDispatchRetryColumns.ts +0 -82
  268. package/server/migrations/1786800000000-CreateTwinReferenceReconciliations.ts +0 -39
  269. package/server/migrations/index.ts +0 -25
  270. package/server/routes.ts +0 -75
  271. package/server/service/actuation/actuation-advisor.ts +0 -131
  272. package/server/service/actuation/actuation-outcome.ts +0 -97
  273. package/server/service/actuation/actuation-rule-resolver.ts +0 -147
  274. package/server/service/actuation/actuation-rule.ts +0 -139
  275. package/server/service/actuation/approval-gateway.ts +0 -44
  276. package/server/service/actuation/catch-up-effects.ts +0 -152
  277. package/server/service/actuation/command-dispatcher.ts +0 -474
  278. package/server/service/actuation/command-store.ts +0 -236
  279. package/server/service/actuation/dispatch-after-approval.ts +0 -71
  280. package/server/service/actuation/effect-match.ts +0 -124
  281. package/server/service/actuation/index.ts +0 -27
  282. package/server/service/actuation/retry-plan.ts +0 -145
  283. package/server/service/actuation/rule-evaluate.ts +0 -352
  284. package/server/service/actuation/rule-loop.ts +0 -160
  285. package/server/service/actuation/rule-runner.ts +0 -216
  286. package/server/service/actuation/rule-wiring.ts +0 -84
  287. package/server/service/actuation/settle-effects.ts +0 -115
  288. package/server/service/actuation/sweep-dispatch.ts +0 -179
  289. package/server/service/actuation/twin-command-resolver.ts +0 -387
  290. package/server/service/actuation/twin-command.ts +0 -232
  291. package/server/service/actuation/twin-now.ts +0 -97
  292. package/server/service/index.ts +0 -100
  293. package/server/service/reference/actuation-routing.ts +0 -192
  294. package/server/service/reference/actuation-target.ts +0 -163
  295. package/server/service/reference/actuation-verification.ts +0 -85
  296. package/server/service/reference/attention-lane.ts +0 -21
  297. package/server/service/reference/connection-portability-resolver.ts +0 -171
  298. package/server/service/reference/connection-portability.ts +0 -329
  299. package/server/service/reference/control-routing.ts +0 -62
  300. package/server/service/reference/discovery-result.ts +0 -95
  301. package/server/service/reference/fill-cadence.ts +0 -29
  302. package/server/service/reference/fill-dedupe.ts +0 -66
  303. package/server/service/reference/fill-loop.ts +0 -153
  304. package/server/service/reference/fill-span.ts +0 -31
  305. package/server/service/reference/hook-contract.ts +0 -364
  306. package/server/service/reference/hook-rejected.ts +0 -53
  307. package/server/service/reference/hook-store.ts +0 -28
  308. package/server/service/reference/index.ts +0 -18
  309. package/server/service/reference/ingest-space.ts +0 -104
  310. package/server/service/reference/knob-defaults.ts +0 -59
  311. package/server/service/reference/live-cadence.ts +0 -129
  312. package/server/service/reference/live-feed-lease.ts +0 -56
  313. package/server/service/reference/live-ingest.ts +0 -94
  314. package/server/service/reference/reference-adapter.ts +0 -985
  315. package/server/service/reference/reference-assessment.ts +0 -250
  316. package/server/service/reference/reference-fill-run.ts +0 -179
  317. package/server/service/reference/reference-fill.ts +0 -223
  318. package/server/service/reference/reference-hook.ts +0 -479
  319. package/server/service/reference/reference-link-groups.ts +0 -21
  320. package/server/service/reference/reference-links.ts +0 -77
  321. package/server/service/reference/reference-live.ts +0 -420
  322. package/server/service/reference/reference-master.ts +0 -999
  323. package/server/service/reference/reference-probe.ts +0 -264
  324. package/server/service/reference/reference-progress-channel.ts +0 -26
  325. package/server/service/reference/reference-progress-subscription.ts +0 -78
  326. package/server/service/reference/reference-progress.ts +0 -95
  327. package/server/service/reference/reference-reconciliation-query.ts +0 -28
  328. package/server/service/reference/reference-reconciliation-writer.ts +0 -38
  329. package/server/service/reference/reference-reconciliation.ts +0 -55
  330. package/server/service/reference/reference-registry.ts +0 -17
  331. package/server/service/reference/reference-resolver.ts +0 -969
  332. package/server/service/reference/template-registry.ts +0 -85
  333. package/server/service/reference/twin-reference-reconciliation.ts +0 -27
  334. package/server/service/reference/twin-reference.ts +0 -190
  335. package/server/service/twin-attention/index.ts +0 -3
  336. package/server/service/twin-attention/twin-attention-query.ts +0 -70
  337. package/server/service/twin-audit/command-audit.ts +0 -114
  338. package/server/service/twin-audit/index.ts +0 -5
  339. package/server/service/twin-audit/twin-audit-event.ts +0 -158
  340. package/server/service/twin-audit/twin-audit-query.ts +0 -72
  341. package/server/service/twin-backfill/backfill-period-facts.ts +0 -168
  342. package/server/service/twin-backfill/backfill-shape.ts +0 -86
  343. package/server/service/twin-backfill/index.ts +0 -3
  344. package/server/service/twin-backfill/twin-backfill-resolver.ts +0 -35
  345. package/server/service/twin-control/index.ts +0 -3
  346. package/server/service/twin-control/twin-control-mutation.ts +0 -150
  347. package/server/service/twin-event/index.ts +0 -3
  348. package/server/service/twin-event/journal-count.ts +0 -53
  349. package/server/service/twin-event/twin-event-keys.ts +0 -215
  350. package/server/service/twin-event/twin-event-type.ts +0 -68
  351. package/server/service/twin-event/twin-event.ts +0 -250
  352. package/server/service/twin-forecast/forecast-metrics.ts +0 -106
  353. package/server/service/twin-forecast/forecast-tuning.ts +0 -40
  354. package/server/service/twin-forecast/gap-analytics.ts +0 -139
  355. package/server/service/twin-forecast/index.ts +0 -3
  356. package/server/service/twin-forecast/twin-forecast-query.ts +0 -486
  357. package/server/service/twin-ingest-window/index.ts +0 -7
  358. package/server/service/twin-ingest-window/twin-ingest-window-query.ts +0 -125
  359. package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +0 -57
  360. package/server/service/twin-ingest-window/twin-ingest-window.ts +0 -113
  361. package/server/service/twin-instance/index.ts +0 -3
  362. package/server/service/twin-instance/twin-instance.ts +0 -199
  363. package/server/service/twin-journal/event-type-split-shape.ts +0 -112
  364. package/server/service/twin-journal/event-type-split.ts +0 -144
  365. package/server/service/twin-journal/index.ts +0 -3
  366. package/server/service/twin-journal/journal-order.ts +0 -20
  367. package/server/service/twin-journal/twin-journal-query.ts +0 -615
  368. package/server/service/twin-lifecycle/domain-catalog.ts +0 -51
  369. package/server/service/twin-lifecycle/index.ts +0 -3
  370. package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +0 -285
  371. package/server/service/twin-metrics/index.ts +0 -3
  372. package/server/service/twin-metrics/twin-metrics-query.ts +0 -172
  373. package/server/service/twin-model/axis-journal-evidence.ts +0 -57
  374. package/server/service/twin-model/choose-recipe.ts +0 -31
  375. package/server/service/twin-model/epcis-coverage.ts +0 -251
  376. package/server/service/twin-model/external-resolver.ts +0 -173
  377. package/server/service/twin-model/iec61850-coverage.ts +0 -111
  378. package/server/service/twin-model/index.ts +0 -25
  379. package/server/service/twin-model/isa95-coverage.ts +0 -320
  380. package/server/service/twin-model/item-ref.ts +0 -80
  381. package/server/service/twin-model/name-index.ts +0 -94
  382. package/server/service/twin-model/project-structure.ts +0 -213
  383. package/server/service/twin-model/standard-coverage.ts +0 -35
  384. package/server/service/twin-model/status-tally.ts +0 -37
  385. package/server/service/twin-model/twin-equipment.ts +0 -191
  386. package/server/service/twin-model/twin-lineage-query.ts +0 -327
  387. package/server/service/twin-model/twin-location.ts +0 -147
  388. package/server/service/twin-model/twin-model-item-query.ts +0 -1029
  389. package/server/service/twin-model/twin-model-mutation.ts +0 -503
  390. package/server/service/twin-model/twin-model-query.ts +0 -792
  391. package/server/service/twin-model/twin-model-tree-query.ts +0 -211
  392. package/server/service/twin-model/twin-operation.ts +0 -157
  393. package/server/service/twin-readiness/index.ts +0 -3
  394. package/server/service/twin-readiness/twin-readiness-query.ts +0 -96
  395. package/server/service/twin-space/area-resolver.ts +0 -75
  396. package/server/service/twin-space/index.ts +0 -8
  397. package/server/service/twin-space/move-space.ts +0 -262
  398. package/server/service/twin-space/representation-role.ts +0 -15
  399. package/server/service/twin-space/space-integrity.ts +0 -293
  400. package/server/service/twin-space/twin-area.ts +0 -63
  401. package/server/service/twin-space/twin-space-area.ts +0 -66
  402. package/server/service/twin-space/twin-space-representation.ts +0 -99
  403. package/server/service/twin-space/twin-space-resolver.ts +0 -582
  404. package/server/service/twin-space/twin-space.ts +0 -148
  405. package/server/service/twin-state/index.ts +0 -3
  406. package/server/service/twin-state/twin-state-subscription.ts +0 -62
  407. package/server/service/twin-structure/index.ts +0 -3
  408. package/server/service/twin-structure/twin-structure.ts +0 -96
  409. package/server/service/twin-subject/event-subjects.ts +0 -162
  410. package/server/service/twin-subject/index.ts +0 -10
  411. package/server/service/twin-subject/item-resolver.ts +0 -92
  412. package/server/service/twin-subject/subject-query-shape.ts +0 -84
  413. package/server/service/twin-subject/twin-subject-backfill.ts +0 -196
  414. package/server/service/twin-subject/twin-subject-event.ts +0 -101
  415. package/server/service/twin-subject/twin-subject-fast-path.ts +0 -346
  416. package/server/service/twin-subject/twin-subject-query.ts +0 -210
  417. package/server/service/twin-subject/twin-subject-writer.ts +0 -189
  418. package/server/service/twin-target/index.ts +0 -5
  419. package/server/service/twin-target/twin-target-resolver.ts +0 -142
  420. package/server/service/twin-target/twin-target.ts +0 -97
  421. package/server/types/global.d.ts +0 -22
  422. package/shared/axis-read.ts +0 -28
  423. package/shared/entity-delta.ts +0 -335
  424. package/shared/kpi-broadcast.ts +0 -13
  425. package/shared/touched-items.ts +0 -73
  426. package/shared/twin-level.ts +0 -48
  427. package/test/ack-shape-alignment.test.ts +0 -97
  428. package/test/actuation-advisor.test.ts +0 -55
  429. package/test/actuation-approval-door.test.ts +0 -411
  430. package/test/actuation-dispatch.test.ts +0 -209
  431. package/test/actuation-effect.test.ts +0 -162
  432. package/test/actuation-outcome.test.ts +0 -152
  433. package/test/actuation-rule-runner.test.ts +0 -281
  434. package/test/actuation-rule.test.ts +0 -266
  435. package/test/actuation-seam.test.ts +0 -255
  436. package/test/actuation-settle.test.ts +0 -164
  437. package/test/actuation-target.test.ts +0 -145
  438. package/test/actuation-verification-state.test.ts +0 -139
  439. package/test/adopt-structure-live.test.ts +0 -133
  440. package/test/aggregate-not-findone.test.ts +0 -112
  441. package/test/area-resolver-db.test.ts +0 -110
  442. package/test/attention-digest.test.ts +0 -161
  443. package/test/axis-declaration-passthrough-db.test.ts +0 -152
  444. package/test/axis-journal-evidence.test.ts +0 -71
  445. package/test/axis-read.test.ts +0 -188
  446. package/test/backfill-shape.test.ts +0 -89
  447. package/test/boot-resume.test.ts +0 -287
  448. package/test/broadcast-cost-baseline.test.ts +0 -201
  449. package/test/broadcast-period.test.ts +0 -58
  450. package/test/broadcast-queue-overflow.test.ts +0 -244
  451. package/test/canonical-ingest-vocabularies.test.ts +0 -451
  452. package/test/canonical-quantity-door.test.ts +0 -61
  453. package/test/capability-mapping.test.ts +0 -89
  454. package/test/checkpoint-refuses-empty.test.ts +0 -103
  455. package/test/choose-recipe.test.ts +0 -117
  456. package/test/column-type-portability.test.ts +0 -122
  457. package/test/command-routing.test.ts +0 -61
  458. package/test/command-store-writes-columns.test.ts +0 -126
  459. package/test/connection-portability-doors.test.ts +0 -87
  460. package/test/connector-capability-declaration.test.ts +0 -195
  461. package/test/contract-layer-guard.test.ts +0 -48
  462. package/test/control-capability.test.ts +0 -98
  463. package/test/cursor-stall-not-read-failure.test.ts +0 -126
  464. package/test/declaration-reaches-model.test.ts +0 -226
  465. package/test/declared-location-types.test.ts +0 -89
  466. package/test/declared-stimulus.test.ts +0 -88
  467. package/test/dedupe-transformation.test.ts +0 -112
  468. package/test/discovery-result.test.ts +0 -75
  469. package/test/dispatch-after-approval-source.test.ts +0 -81
  470. package/test/duration-estimators.test.ts +0 -144
  471. package/test/energy-topology.test.ts +0 -113
  472. package/test/entity-delta.test.ts +0 -352
  473. package/test/equipment-identity-reaches.test.ts +0 -57
  474. package/test/event-subjects.test.ts +0 -148
  475. package/test/event-time-column.test.ts +0 -67
  476. package/test/event-type-split.test.ts +0 -178
  477. package/test/external-resolver.test.ts +0 -177
  478. package/test/fact-scope-wiring.test.ts +0 -96
  479. package/test/fill-dedupe.test.ts +0 -59
  480. package/test/fill-loop.test.ts +0 -35
  481. package/test/first-envelope.test.ts +0 -153
  482. package/test/fold-gap-speaks.test.ts +0 -53
  483. package/test/fold-shift-dst.test.ts +0 -110
  484. package/test/forecast-metrics.test.ts +0 -157
  485. package/test/forecast-tuning.test.ts +0 -42
  486. package/test/gap-analytics.test.ts +0 -113
  487. package/test/generated-not-counted.test.ts +0 -99
  488. package/test/guard-roots.ts +0 -76
  489. package/test/home-in-area.test.ts +0 -90
  490. package/test/hook-address.test.ts +0 -28
  491. package/test/hook-rejected-shape.test.ts +0 -86
  492. package/test/hook-response-sum.test.ts +0 -193
  493. package/test/hook-sequence.test.ts +0 -333
  494. package/test/ingest-bench.test.ts +0 -70
  495. package/test/ingest-dedupe.test.ts +0 -56
  496. package/test/ingest-expected-quiet.test.ts +0 -111
  497. package/test/ingest-health-engine.test.ts +0 -248
  498. package/test/ingest-health-wiring.test.ts +0 -120
  499. package/test/ingest-health.test.ts +0 -306
  500. package/test/ingest-history.test.ts +0 -247
  501. package/test/ingest-idempotent.test.ts +0 -211
  502. package/test/ingest-reconcile-four-ways.test.ts +0 -97
  503. package/test/ingest-rules-header.test.ts +0 -100
  504. package/test/ingest-running-guard.test.ts +0 -136
  505. package/test/ingest-space.test.ts +0 -78
  506. package/test/ingest-window-rolls-unobserved.test.ts +0 -72
  507. package/test/ingest-wiring-guard.test.ts +0 -197
  508. package/test/instance-cache-lifecycle.test.ts +0 -110
  509. package/test/intake-mapping-parity.test.ts +0 -175
  510. package/test/integration-probes.test.ts +0 -103
  511. package/test/integration-runner.test.ts +0 -95
  512. package/test/item-ref.test.ts +0 -78
  513. package/test/journal-order-axis.test.ts +0 -80
  514. package/test/journal-read-discipline.test.ts +0 -186
  515. package/test/journal-retention.test.ts +0 -275
  516. package/test/journal-sort-axis.test.ts +0 -142
  517. package/test/journal-write-door.test.ts +0 -110
  518. package/test/journal-write-trend.test.ts +0 -115
  519. package/test/kernel-kind-guard.test.ts +0 -98
  520. package/test/knob-defaults.test.ts +0 -72
  521. package/test/kpi-baseline-db.test.ts +0 -216
  522. package/test/kpi-baseline.test.ts +0 -196
  523. package/test/kpi-fold.test.ts +0 -1456
  524. package/test/kpi-query-bench.test.ts +0 -130
  525. package/test/lens-own-places.test.ts +0 -50
  526. package/test/lineage-survives-restart.test.ts +0 -234
  527. package/test/live-cadence.test.ts +0 -170
  528. package/test/live-cursor-wiring.test.ts +0 -87
  529. package/test/live-feed-lease.test.ts +0 -63
  530. package/test/live-feed-registry.test.ts +0 -75
  531. package/test/live-kernel-facts.test.ts +0 -161
  532. package/test/live-mirror-parity.test.ts +0 -286
  533. package/test/load-meter.test.ts +0 -328
  534. package/test/local-declarations.test.ts +0 -662
  535. package/test/log-stamp.test.ts +0 -59
  536. package/test/loop-lag.test.ts +0 -82
  537. package/test/master-to-twin.test.ts +0 -279
  538. package/test/measured-yield.test.ts +0 -90
  539. package/test/merge-streams.test.ts +0 -70
  540. package/test/mirror-resumes-from-checkpoint.test.ts +0 -192
  541. package/test/model-basis.test.ts +0 -141
  542. package/test/model-gap.test.ts +0 -153
  543. package/test/model-refusal.test.ts +0 -75
  544. package/test/model-vocabulary.test.ts +0 -114
  545. package/test/move-space.test.ts +0 -149
  546. package/test/mutation-gate.test.ts +0 -122
  547. package/test/oee-accumulator.test.ts +0 -204
  548. package/test/oee-site-calendar.test.ts +0 -146
  549. package/test/open-doors.test.ts +0 -197
  550. package/test/operation-basis.test.ts +0 -127
  551. package/test/operational-vocabulary.test.ts +0 -108
  552. package/test/operations-capability-db.test.ts +0 -165
  553. package/test/order-and-transaction-split.test.ts +0 -107
  554. package/test/order-fold-host.test.ts +0 -112
  555. package/test/producer-guard.test.ts +0 -66
  556. package/test/project-structure-db.test.ts +0 -226
  557. package/test/projection-reaches-screen.test.ts +0 -277
  558. package/test/projection-reads-declared.test.ts +0 -109
  559. package/test/property-effects.test.ts +0 -128
  560. package/test/provenance-promotion.test.ts +0 -99
  561. package/test/read-failure-ledger.test.ts +0 -106
  562. package/test/read-failure-visible.test.ts +0 -145
  563. package/test/read-time.test.ts +0 -118
  564. package/test/reference-fill.test.ts +0 -235
  565. package/test/reference-grounding.test.ts +0 -70
  566. package/test/reference-hook.test.ts +0 -177
  567. package/test/reference-links.test.ts +0 -56
  568. package/test/reference-reconciliation.test.ts +0 -39
  569. package/test/registry-key-guard.test.ts +0 -80
  570. package/test/rejection-carries-event-id.test.ts +0 -101
  571. package/test/rename-twin.test.ts +0 -89
  572. package/test/resolve-ts-siblings.mjs +0 -52
  573. package/test/restart-policy.test.ts +0 -111
  574. package/test/resync-origin-site.test.ts +0 -83
  575. package/test/retry-plan.test.ts +0 -139
  576. package/test/revision-axis.test.ts +0 -110
  577. package/test/runtime-key.test.ts +0 -66
  578. package/test/save-intake-collision.test.ts +0 -91
  579. package/test/scale-twin-bench.test.ts +0 -103
  580. package/test/secrets-at-rest.test.ts +0 -135
  581. package/test/snapshot-freshness.test.ts +0 -60
  582. package/test/source-outcome-audit.test.ts +0 -104
  583. package/test/space-integrity.test.ts +0 -223
  584. package/test/space-representation.test.ts +0 -66
  585. package/test/space-scope-includes-stopped.test.ts +0 -55
  586. package/test/spec-coverage.test.ts +0 -113
  587. package/test/stage-path.test.ts +0 -95
  588. package/test/standard-coverage.test.ts +0 -148
  589. package/test/state-axes.test.ts +0 -74
  590. package/test/status-tally.test.ts +0 -55
  591. package/test/streamline-e2e.test.ts +0 -76
  592. package/test/structure-revision-db.test.ts +0 -315
  593. package/test/subject-fast-path.test.ts +0 -148
  594. package/test/subject-read-model.test.ts +0 -175
  595. package/test/sweep-dispatch.test.ts +0 -191
  596. package/test/tenant-registry-db.test.ts +0 -149
  597. package/test/time-range.test.ts +0 -152
  598. package/test/touched-items.test.ts +0 -61
  599. package/test/twin-audit.test.ts +0 -83
  600. package/test/twin-event-keys.test.ts +0 -193
  601. package/test/twin-model-item-db.test.ts +0 -319
  602. package/test/twin-model-parent-relation-db.test.ts +0 -125
  603. package/test/twin-model-tree-db.test.ts +0 -209
  604. package/test/twin-origin-resync.test.ts +0 -133
  605. package/test/twin-state-channel.test.ts +0 -111
  606. package/test/vocabulary-guard.test.ts +0 -43
  607. package/test/warm-start-seam.test.ts +0 -162
  608. package/test/warm-start.test.ts +0 -297
  609. package/test/withheld-door.test.ts +0 -95
  610. package/test/yield-loop.test.ts +0 -199
  611. package/tsconfig.json +0 -15
  612. package/tsconfig.shared.json +0 -23
  613. package/tsconfig.shared.tsbuildinfo +0 -1
  614. package/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"standard-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/standard-coverage.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAWH,4CASC;AAfD;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,IAAa;IAC5C;;;;OAIG;IACH,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAChD,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACjF,OAAO,CAAC,OAAO,CAAC,CAAA;AAClB,CAAC","sourcesContent":["/*\n * ์ด ํŠธ์œˆ์ด ๊ธฐ๋Œ€๋Š” **ํ‘œ์ค€๋“ค** โ€” ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.\n *\n * ์ ํ•ฉ์„ฑ ํŒจ๋„์ด ํŠธ์œˆ ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ISA-95 ํ•˜๋‚˜๋งŒ ๋งํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์—๋„ˆ์ง€ ํŠธ์œˆ์—์„œ ๊ทธ๊ฒƒ์€ ๊ฑฐ์ง“์€\n * ์•„๋‹ˆ์ง€๋งŒ ๋ถ€์กฑํ•˜๋‹ค: ๊ณ„๋Ÿ‰๊ธฐยท์ฐจ๋‹จ๊ธฐยทํƒœ์–‘๊ด‘ยท์ถ•์ „์ง€์˜ ์–ดํœ˜๋ฅผ ์ฃผ๋Š” ๊ฒƒ์€ IEC 61850 ์ด๊ณ , ๋ฌด์—‡์ด ๋น„์—ˆ๋Š”์ง€๋„\n * ๊ทธ ๋ชฉ๋ก์œผ๋กœ๋งŒ ์…€ ์ˆ˜ ์žˆ๋‹ค.\n *\n * โ”€โ”€ ์—ฌ๊ธฐ ๋„ฃ์ง€ ์•Š๋Š” ๊ฒƒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ISO 50001ยทISO 55000 ์€ **๊ฒฝ์˜ ์‹œ์Šคํ…œ**์ด๋‹ค. ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๊ฐ€ ์•„๋‹ˆ๋ผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋‹ตํ•ด์•ผ ํ•˜๋Š” ๋Œ€์ƒ์ด๋ผ\n * ใ€Œํ•„๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ใ€๋กœ ๋งํ•  ์ˆ˜ ์—†๋‹ค โ€” ๋ฐฐ์šฐ๊ธฐ ๋ฌธ์„œ๊ฐ€ ๊ฐ™์€ ๊ตฌ๋ถ„์„ ์ง€ํ‚ค๊ณ  ์žˆ๊ณ , ํ™”๋ฉด๋„ ๊ทธ๋ž˜์•ผ ํ•œ๋‹ค.\n *\n * โ”€โ”€ ์™œ ํ‘œ๋ฅผ ์—ฌ๊ธฐ์„œ ๋ถ€๋ฅด์ง€ ์•Š๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ด ํŒŒ์ผ์€ **์ •์ฑ…**๋งŒ ๋‹ด๋Š”๋‹ค(์–ด๋А ์ข…๋ฅ˜๊ฐ€ ์–ด๋А ํ‘œ์ค€์„ ๊ธฐ๋Œ€ํ•˜๋‚˜). ํ‘œ๋ฅผ ์ง์ ‘ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๊ทธ ์ˆœ๊ฐ„ ์ด ๊ทœ์น™์„\n * ๋‹จ์œ„ ์‹œํ—˜์ด ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค(๋ชจ๋“ˆ ์‚ฌ์Šฌ์ด ๋Ÿฐํƒ€์ž„ ํ•ด์„์„ ํƒ„๋‹ค). ์กฐ๋ฆฝ์€ ์งˆ์˜๊ฐ€ ํ•œ ์ค„๋กœ ํ•œ๋‹ค.\n */\n\n/** ์šฐ๋ฆฌ๊ฐ€ ์ ํ•ฉ์„ฑ ํ‘œ๋ฅผ ๊ฐ€์ง„ ํ‘œ์ค€๋“ค. */\nexport type StandardId = 'isa95' | 'epcis' | 'iec61850'\n\n/**\n * ์ด ์ข…๋ฅ˜์˜ ํŠธ์œˆ์ด ๊ธฐ๋Œ€๋Š” ํ‘œ์ค€ โ€” **์ˆœ์„œ = ํ™”๋ฉด์— ๋†“์ด๋Š” ์ˆœ์„œ.**\n *\n * ISA-95 ๋Š” ์ข…๋ฅ˜์™€ ์ƒ๊ด€์—†์ด ๋‚ธ๋‹ค: ์ž์›๊ณผ ๊ณ„์ธต์€ ์–ด๋А ๋„๋ฉ”์ธ์—์„œ๋‚˜ ๊ทธ ํ‘œ์ค€์˜ ๊ฒƒ์ด๋‹ค.\n * ์ข…๋ฅ˜๊ฐ€ ๋”ํ•˜๋Š” ํ‘œ์ค€๋งŒ ๋’ค์— ๋ถ™์ธ๋‹ค.\n */\nexport function standardsForKind(kind?: string): StandardId[] {\n /*\n * ๋ฌผ๋ฅ˜ยท์ œ์กฐ๋Š” **EPCIS** ๋กœ ใ€Œ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋‚˜ใ€์™€ ใ€Œ์ด ๋ฒˆํ˜ธ๊ฐ€ ๋ฌด์—‡์„ ๊ฐ€๋ฆฌํ‚ค๋‚˜ใ€๋ฅผ ์ •ํ•œ๋‹ค.\n * ์—๋„ˆ์ง€์—๋Š” ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค โ€” ๊ทธ ํŠธ์œˆ์—๋Š” ์˜ค๊ฐ€๋Š” ๋ฌผ๊ฑด์ด ์—†๊ณ , ๊ณ„์ธก์€ EPCIS ์‚ฌ๊ฑด์ด ์•„๋‹ˆ๋ผ ํ‘œ๋ณธ์œผ๋กœ\n * ๋“ค์–ด์˜จ๋‹ค(์‚ฌ๊ฑด๊ณผ ์‹œ๊ณ„์—ด์€ ๋‹ค๋ฅธ ์ธต์ด๋‹ค).\n */\n if (kind === 'ems') return ['isa95', 'iec61850']\n if (kind === 'wms' || kind === 'yms' || kind === 'mes') return ['isa95', 'epcis']\n return ['isa95']\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-tally.js","sourceRoot":"","sources":["../../../server/service/twin-model/status-tally.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AASH,kCAUC;AAXD,mDAAmD;AACnD,SAAgB,WAAW,CAAC,MAAe;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAI,CAAS,EAAE,MAAM,CAAA;QAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;YAAE,SAAQ;QACzC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAA;AACrH,CAAC","sourcesContent":["/*\n * **์ˆ˜ ํ•˜๋‚˜๊ฐ€ ๋œป์„ ๋ฐ”๊พธ๋Š” ์ž๋ฆฌ** โ€” ์ƒํƒœ๋ณ„๋กœ ๊ฐˆ๋ผ ์„ผ๋‹ค (2026-08-23).\n *\n * โ”€โ”€ ๋ฌด์—‡์ด ์žˆ์—ˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๋ฏธ๋Ÿฌ๊ฐ€ ์™„๋ฃŒ๋œ ์ž‘์—…๊นŒ์ง€ ์ƒํƒœ์— ๋“ค๊ณ  ์žˆ๊ฒŒ ๋˜๋ฉด์„œ(๊ด€์ธก ํก์ˆ˜์—์„œ `completed` ๋ฅผ ๋–จ์–ด๋œจ๋ฆฌ์ง€ ์•Š๊ฒŒ ์ปค๋„์„\n * ๊ณ ์นœ ๋’ค) ๊ฐœ๋… ์ง€๋„์˜ ์ž‘์—… ์นด๋“œ๊ฐ€ ใ€Œ0ใ€์—์„œ ใ€Œ2,820ใ€์ด ๋˜์—ˆ๋‹ค. ์ด ์นด๋“œ๋Š” **์ƒํƒœ์˜ ์ธ๊ตฌ์กฐ์‚ฌ**์ด๋ฏ€๋กœ\n * ๊ทธ ์ˆ˜๊ฐ€ ๋งž๋‹ค โ€” ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ๋žŒ์€ ๊ทธ๊ฒƒ์„ ใ€Œ์ง€๊ธˆ ํ•  ์ผ 2,820๊ฑดใ€์œผ๋กœ ์ฝ๋Š”๋‹ค.\n *\n * ์ˆ˜๋ฅผ ์ค„์—ฌ ๋งž๋Š” ์ฒ™ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค(๊ทธ๋Ÿฌ๋ฉด ์ธ๊ตฌ์กฐ์‚ฌ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค). ๋Œ€์‹  **๋ฌด์—‡์œผ๋กœ ์ด๋ฃจ์–ด์ง„\n * ์ˆ˜์ธ์ง€** ํ•จ๊ป˜ ๋‚ธ๋‹ค: ใ€Œ์ง„ํ–‰ ์ค‘ 28 ยท ์™„๋ฃŒ 2,792ใ€.\n *\n * โ”€โ”€ ์ง€ํ‚ค๋Š” ๊ฒƒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ยท ๋‚ฑ๋ง์€ **์ปค๋„์ด ์‹ค์–ด ๋ณด๋‚ธ ๊ทธ๋Œ€๋กœ**๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌถ๊ฑฐ๋‚˜ ๊ณ ์ณ ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค(ํ™”๋ฉด์ด ๋ผ๋ฒจ์„ ์ž…ํžˆ๊ณ ,\n * ๋ผ๋ฒจ์ด ์—†์œผ๋ฉด ๋‚ฑ๋ง์ด ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ ๋ˆ„๋ฝ์ด ๋“œ๋Ÿฌ๋‚œ๋‹ค).\n * ยท ์ƒํƒœ๋ฅผ ๋งํ•˜์ง€ ์•Š๋Š” ์ถ•์€ **์•„๋ฌด๊ฒƒ๋„ ๋‚ด์ง€ ์•Š๋Š”๋‹ค.** ๋นˆ ํ‘œ๋ฅผ ๋‚ด๋ฉด ํ™”๋ฉด์ด ใ€Œ์ƒํƒœ๊ฐ€ ์—†๋Š” ์ถ•ใ€๊ณผ\n * ใ€Œ์ƒํƒœ๋ฅผ ๋ชป ์ฝ์€ ์ถ•ใ€์„ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†๋‹ค.\n * ยท ํ•œ ๋ฒˆ๋งŒ ํ›‘๋Š”๋‹ค. ์นด๋“œ๊ฐ€ ์ด๋ฏธ ๊ฐ™์€ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ์„ธ๋ฏ€๋กœ ์…ˆ์ด ํ•œ ๋ฒŒ ๋Š˜์ง€ ์•Š๋Š”๋‹ค.\n */\n\n/** ์ƒํƒœ ํ•œ ๊ฐˆ๋ž˜์™€ ๊ทธ ๊ฑด์ˆ˜. */\nexport interface StatusCount {\n status: string\n count: number\n}\n\n/** ์ด ์ถ•์˜ ๊ฐœ์ฒด๋ฅผ ์ƒํƒœ๋ณ„๋กœ ์„ผ๋‹ค. ์ƒํƒœ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๊ฐ์ฒด(ํ•„๋“œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค). */\nexport function statusTally(bucket: unknown): { statusCounts?: StatusCount[] } {\n if (!Array.isArray(bucket) || !bucket.length) return {}\n const tally = new Map<string, number>()\n for (const e of bucket) {\n const s = (e as any)?.status\n if (typeof s !== 'string' || !s) continue\n tally.set(s, (tally.get(s) ?? 0) + 1)\n }\n if (!tally.size) return {}\n return { statusCounts: [...tally].map(([status, count]) => ({ status, count })).sort((x, y) => y.count - x.count) }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"twin-equipment.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-equipment.ts"],"names":[],"mappings":"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","sourcesContent":["import { CreateDateColumn, Entity, Index, Column, RelationId, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'\nimport { ObjectType, Field, ID, Int } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\n\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinLocation } from './twin-location.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\n\n/*\n * TwinEquipment โ€” ์ด ํŠธ์œˆ์ด ๋ฐ˜์˜ํ•˜๋Š” **์„ค๋น„**. ISA-95 `Equipment` / ISO 55000 `Asset` / EPCIS `GIAI`.\n *\n * ์ž๋ฆฌ์™€ ๊ฐ™์€ ๊ทœ์œจ์„ ๋”ฐ๋ฅธ๋‹ค(`twin-location.ts` ๋จธ๋ฆฌ๋ง) โ€” ์ด๊ฒƒ๋„ **์›๋ณธ์—์„œ ์˜จ ์บ์‹œ**์ด๊ณ ,\n * `sourceRef`ยท`ingestedAt` ์ด ํ•„์ˆ˜์ด๋ฉฐ, ์“ฐ๊ธฐ ๊ฒฝ๋กœ๋Š” ์ธ์ œ์ŠคํŠธ ํ•˜๋‚˜๋‹ค.\n *\n * โ”€โ”€ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋ช…์‹œํ•œ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * `equipment` ๋Š” ์˜์–ด์—์„œ **๋ถˆ๊ฐ€์‚ฐ**์ด๋ผ ์ž๋™ ๋ณต์ˆ˜ํ™”๊ฐ€ ๋‹ค๋ฅธ ํ‘œ๋“ค๊ณผ ๊ทœ์น™์ด ์–ด๊ธ‹๋‚œ๋‹ค\n * (`twin_locations` ์ธ๋ฐ `twin_equipment`). ๋“ค์–ด์˜จ ๊ฒƒ์ด ์—†๋Š” ๋น„์ผ๊ด€์€ ๋‚˜์ค‘์— \"์™œ ์ด๊ฒƒ๋งŒ ๋‹ค๋ฅด์ง€\" ๋ฅผ\n * ๋งŒ๋“ค๋ฏ€๋กœ ์ด๋ฆ„์„ ๊ณ ์ •ํ•œ๋‹ค(ADR-0032-I).\n */\n@Entity({ name: 'twin_equipment' })\n@Index('ix_twin_equipment_0', (e: TwinEquipment) => [e.domain, e.instance, e.equipmentId], { unique: true })\n/* ์ข…๋ฅ˜๋กœ ์ขํ˜€ ๋ณด๊ธฐ โ€” ๊ณต์ •์ด `resourceType` ์œผ๋กœ ์ข…๋ฅ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ ์žฆ์€ ์งˆ์˜๋‹ค. */\n@Index('ix_twin_equipment_1', (e: TwinEquipment) => [e.domain, e.instance, e.kind])\n@ObjectType({ description: 'Equipment reflected into the twin (ISA-95 Equipment / ISO 55000 Asset). Projected from the source; never authored here.' })\nexport class TwinEquipment {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'Owning tenant domain.' })\n domain?: Domain\n\n @RelationId((e: TwinEquipment) => e.domain)\n domainId?: string\n\n @ManyToOne(type => TwinInstance, { onDelete: 'CASCADE' })\n @Field(type => TwinInstance, { nullable: true, description: 'Owning twin instance.' })\n instance?: TwinInstance\n\n @RelationId((e: TwinEquipment) => e.instance)\n instanceRowId?: string\n\n /** ์ปค๋„ ๊ณ„์•ฝ์˜ `TwinModelDef.equipment[].id` ๊ทธ๋Œ€๋กœ. */\n @Column()\n @Field({ description: 'Equipment id as declared by the source (kernel TwinModelDef.equipment[].id).' })\n equipmentId: string\n\n /**\n * **์‚ฌ๋žŒ์ด ๋ถ€๋ฅด๋Š” ์ด๋ฆ„** โ€” ํ”„๋ ˆ์ž„์›Œํฌ ์—”ํ‹ฐํ‹ฐ ๊ทœ์•ฝ์˜ `name`/`description`.\n *\n * โ”€โ”€ ์™œ ์ด๊ฒƒ์ด ๋น ์ ธ ์žˆ์—ˆ๊ณ , ๋ฌด์—‡์ด ๋ง๊ฐ€์กŒ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํˆฌ์˜์ด ๋งˆ์Šคํ„ฐ์˜ `name` ์„ ๋ฒ„๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ–‰์—๋Š” id ๋งŒ ๋‚จ๊ณ , ํ™”๋ฉด์€ ์ด๋ฆ„์„ ๋งŒ๋“ค ์žฌ๋ฃŒ๊ฐ€\n * ์—†์–ด `cut-station` ์„ ๊ทธ๋Œ€๋กœ ์ฐ์—ˆ๋‹ค โ€” ๊ทธ ๊ฒฐํ•จ์ด ๋ชฉ๋กยทํ‘œยท๊ด€๊ณ„ ๊ทธ๋ฆผ๋งˆ๋‹ค ๋”ฐ๋กœ ๋‚˜ํƒ€๋‚˜์„œ ํ‘œ๋ฉด์„\n * ํ•˜๋‚˜์”ฉ ๊ณ ์น˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ํ‘œ๋ฉด์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ **ํ–‰์— ์ด๋ฆ„์ด ์—†๋˜ ๋ฌธ์ œ**๋‹ค.\n *\n * ์›๋ณธ์ด ์ด๋ฆ„์„ ๋งํ•˜์ง€ ์•Š์œผ๋ฉด ๋น„์šด๋‹ค(id ๋ฅผ ์ด๋ฆ„์œผ๋กœ ๋ฒ ๋ผ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ทธ๋Ÿฌ๋ฉด \"์ด๋ฆ„์ด ์žˆ๋‹ค\" ๋Š”\n * ๊ฑฐ์ง“์ด ๋˜๊ณ , ํ™”๋ฉด์ด ์ด๋ฆ„ ์—†์Œ์„ ์•Œ์•„๋ณผ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค).\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Human name as declared by the source. Empty when the source does not name it (never copied from the id).' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Longer description when the source provides one.' })\n description?: string\n\n /** ์ปค๋„ ์นดํƒˆ๋กœ๊ทธ์˜ ์„ค๋น„ ์ข…๋ฅ˜ ํ‚ค(`forklift`ยท`welder`โ€ฆ). FK ์•„๋‹˜ โ€” ์นดํƒˆ๋กœ๊ทธ๋Š” ์ปค๋„ SSOT. */\n @Column()\n @Field({ description: 'Equipment kind key from the kernel catalog (not an FK โ€” the catalog is the kernel SSOT).' })\n kind: string\n\n /**\n * ์ž์› ์†์„ฑ โ€” **ISA-95 `Property`**(๊ฐ’ยท๋ฐ์ดํ„ฐํ˜•ยท๋‹จ์œ„ยทํ•˜์œ„ ์†์„ฑ).\n *\n * ๋ชจ๋ธ์—๋Š” ์žˆ๋Š”๋ฐ ํ–‰์— ์ž๋ฆฌ๊ฐ€ ์—†์–ด ํˆฌ์˜์ด ํ˜๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์กฐํšŒ ํ™”๋ฉด์€ \"์›๋ณธ์ด ๋งํ•œ ๊ฐ’\" ์ด๋ผ\n * ์ ๊ณ ๋„ ์†์„ฑ์„ ๋ณด์ด์ง€ ๋ชปํ•œ๋‹ค โ€” ์ด๋ฆ„์ด ๊ฐ™์€ ์‹์œผ๋กœ ์‚ฌ๋ผ์กŒ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ถ€๋ฅ˜๋‹ค(2026-08-11).\n *\n * ์†Œ๋น„์ฒ˜๊ฐ€ ์‹ค์ œ๋กœ ์ฝ๋Š” ์‚ฌ์‹ค์ด๋‹ค: ์ฃผํ–‰ ์ถ”์ •๊ธฐ๊ฐ€ `speed` ๋กœ ์ด๋™ ์‹œ๊ฐ„์„ ๋งŒ๋“ ๋‹ค. ๋‹จ์œ„๊ฐ€ ๊ฐ’ ์˜†์— ๋ถ™์–ด\n * ์žˆ์–ด์•ผ ๋œป์ด ์„œ๋ฏ€๋กœ **๋ชจ์–‘ ๊ทธ๋Œ€๋กœ** ๋‹ด๋Š”๋‹ค(๋ฌธ์ž์—ด ๊ฐ’ + `uom` + `dataType`).\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Resource properties as declared by the source (ISA-95 Property: value + dataType + unit of measure, optional children).' })\n properties?: any\n\n /**\n * ์ด ์„ค๋น„์˜ ์ ๊ฒฉ์„ ๊ฒ€์ฆํ•œ **์‹œํ—˜ ๋ช…์„ธ๋“ค** โ€” ํ‘œ์ค€ `TestSpecificationID`(`maxOccurs=\"unbounded\"`).\n *\n * ์ฐธ์กฐ๋งŒ ๋‹ด๋Š”๋‹ค(๋Œ€์ƒ์€ `testSpecifications` ์ถ•). ์†์„ฑ๊ณผ **๊ฐ™์€ ๋ถ€๋ฅ˜์˜ ๊ฒฐ์†**์ด์—ˆ๋‹ค: ๋ชจ๋ธ์—๋Š” ์žˆ๋Š”๋ฐ\n * ํ–‰์— ์ž๋ฆฌ๊ฐ€ ์—†์–ด ํˆฌ์˜์ด ํ˜๋ ธ๊ณ , ๊ทธ๋ž˜์„œ ๋ช…์„ธ ์ชฝ์—์„œ \"๋ˆ„๊ฐ€ ๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋‚˜\" ๋ฅผ ๋ฌผ์œผ๋ฉด ์„ค๋น„๊ฐ€ ๋น ์กŒ๋‹ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true, description: 'Test specifications that verified this equipment (ISA-95 TestSpecificationID, unbounded). References only โ€” the specifications themselves live on the testSpecifications axis.' })\n testSpecificationIds?: string[]\n\n /**\n * ๊ทธ ์‹œํ—˜๋“ค์˜ **๊ฒฐ๊ณผ** โ€” ์ž๊ฒฉ์ด ์„ฑ๋ฆฝํ•˜๋Š”์ง€๋Š” ์ด๊ฒƒ์ด ๋งํ•œ๋‹ค.\n *\n * ์ฐธ์กฐ๋งŒ ์žˆ์œผ๋ฉด \"๋ฌด์—‡์œผ๋กœ ๊ฒ€์ฆํ•œ๋‹ค\" ๊นŒ์ง€๋‹ค. ์˜ค๋Š˜ ์ด ์ €์žฅ์†Œ์—์„œ ๋„ค ๋ฒˆ ๋‚˜์˜จ ๊ฒฐ์†๊ณผ ๊ฐ™์€ ๋ถ€๋ฅ˜์ด๋ฏ€๋กœ\n * ํ–‰์— ์ž๋ฆฌ๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ ๋‹ค โ€” ๋ชจ๋ธ์—๋Š” ์žˆ๋Š”๋ฐ ํ–‰์— ์—†์œผ๋ฉด ํ™”๋ฉด์ด ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ์žƒ๋Š”๋‹ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Results of those tests (pass/fail with dates). Declared by the source โ€” the twin does not produce them.' })\n testResults?: any\n\n /**\n * ๊ธฐ์ค€ ์ž๋ฆฌ โ€” **์‹ค์ œ FK**. ์˜ˆ์ „์—๋Š” `homeLocation` ๋ฌธ์ž์—ด์ด๋ผ ๋Š์–ด์ง„ ์ฐธ์กฐ๋ฅผ ํ™”๋ฉด์ด ๊ฒฝ๊ณ ํ–ˆ๊ณ \n * (`brokenHomeRefs`), ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ์•„๋ฌด๋„ ์•ˆ ๋ดค๋‹ค. ์ด์ œ DB ๊ฐ€ ๋ง‰๋Š”๋‹ค.\n */\n @ManyToOne(type => TwinLocation, { nullable: true, onDelete: 'SET NULL' })\n @Field(type => TwinLocation, { nullable: true, description: 'Home location this equipment belongs to.' })\n homeLocation?: TwinLocation\n\n @RelationId((e: TwinEquipment) => e.homeLocation)\n homeLocationRowId?: string\n\n /**\n * ๊ธฐ์ค€ **๊ตฌ์—ญ** โ€” ์„ค๋น„๊ฐ€ ์ž๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌ์—ญ์— ์„œ ์žˆ์„ ๋•Œ.\n *\n * โ”€โ”€ ์™œ ์นธ์ด ๋‘˜์ธ๊ฐ€ (2026-09-06) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๊ณ„์•ฝ์ด `homeLocationKind = 'location' | 'area'` ๋กœ ๊ทธ ๊ฐˆ๋ฆผ์„ ๋งํ•œ๋‹ค. ์‹ค๋ฌผ์ด ์žˆ๋‹ค โ€”\n * `EQ-CAM-SHOWER-01`(์—์–ด์ƒค์›Œ)์ด `LINE-CAM` ์ด๋ผ๋Š” **๊ตฌ์—ญ**์— ๋”ธ๋ ค ์žˆ๊ณ , ๊ทธ๊ฒƒ์ด ์ •์ƒ์ด๋‹ค.\n * ๋ผ์ธ ์ „์ฒด์— ๋ถ™๋Š” ์„ค๋น„๋Š” ์ž๋ฆฌ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์—†๋‹ค.\n *\n * ๊ทธ๋™์•ˆ ์ด ์นธ์ด ์—†์–ด์„œ ์ธ์ œ์ŠคํŠธ๊ฐ€ ๊ทธ ์ฐธ์กฐ๋ฅผ **ใ€Œ๋Š์–ด์กŒ๋‹คใ€๊ณ  ๊ฒฝ๊ณ **ํ–ˆ๋‹ค. ์ž๋ฆฌ ๋ชฉ๋ก์—์„œ ๋ชป ์ฐพ์œผ๋ฉด\n * ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ดค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.\n *\n * ํ•œ ์นธ์— ๋‘ ๋Œ€์ƒ์„ ๋‹ด์ง€ ์•Š๋Š”๋‹ค โ€” FK ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํ‘œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , ํ•ฉ์น˜๋ฉด DB ๊ฐ€ ๋ชป ๋ง‰๋Š”๋‹ค.\n * **๋‘˜ ๋‹ค ์ฐจ๋Š” ์ผ์€ ์—†๋‹ค**(๋งˆ์Šคํ„ฐ์˜ `role` ์ด ํ•˜๋‚˜๋ฅผ ์ •ํ•œ๋‹ค).\n */\n @ManyToOne(type => TwinArea, { nullable: true, onDelete: 'SET NULL' })\n @Field(type => TwinArea, { nullable: true, description: 'Home area this equipment belongs to, when it stands in an area rather than a location.' })\n homeArea?: TwinArea\n\n @RelationId((e: TwinEquipment) => e.homeArea)\n homeAreaRowId?: string\n\n /*\n * ๊ณ ์žฅ ๋ชจ๋ธ โ€” ์›๋ณธ์ด ์„ ์–ธํ•  ๋•Œ๋งŒ ์žˆ๋‹ค. ์—†์œผ๋ฉด ๊ณ ์žฅ ์—†๋Š” ์„ค๋น„๋กœ ๋™์ž‘ํ•œ๋‹ค(์ปค๋„ ๊ณ„์•ฝ).\n * **๊ด€์ธก(๊ฐ€๋™๋ฅ )์€ ์—ฌ๊ธฐ ๋‘์ง€ ์•Š๋Š”๋‹ค** โ€” ๊ทธ๊ฑด ํŠธ์œˆ์ด ์ €๋„์—์„œ ๋งŒ๋“  ๊ฒƒ์ด๋ผ ์„ฑ์งˆ์ด ๋‹ค๋ฅด๊ณ ,\n * ์ด ํ‘œ๋Š” ์›๋ณธ์—์„œ ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค(ADR-0032-D).\n */\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'Declared mean time between failures in ms. Absent = no failure model.' })\n mtbfMs?: number\n\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'Declared mean time to repair in ms.' })\n mttrMs?: number\n\n /*\n * โ”€โ”€ **์„ ์–ธ๋œ ์„ค๋น„ ์ •์ฒด์„ฑ** (2026-08-30) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ์˜ˆ์ „ ์ด๋ฆ„์€ `gs1Id` ์˜€๊ณ , ํˆฌ์˜์ด ์„ ์–ธ์˜ `m.gs1Id` ๋ฅผ ์ฝ์—ˆ๋‹ค. **๊ทธ๋Ÿฐ ํ•„๋“œ๊ฐ€ ์„ ์–ธ์— ์—†๋‹ค** โ€” ๊ทธ๋ž˜์„œ\n * ์ด ์นธ์€ ์ผ๊ณฑ ๋Œ€ ๋ชจ๋‘ ์˜์›ํžˆ ๋น„์–ด ์žˆ์—ˆ๋‹ค. ์ž๋ฆฌ๋Š” ์žˆ๊ณ  ๊ธธ์ด ์—†์—ˆ๋‹ค.\n *\n * ๊ทธ ์‚ฌ์ด ์ปค๋„์— `TwinModelDef.equipment[].identity` ๋ฅผ ์—ด์—ˆ์œผ๋ฏ€๋กœ ์–ดํœ˜๊ฐ€ ๋‘ ๋ฒŒ์ด ๋๋‹ค. ํ•˜๋‚˜๋กœ\n * ํ•ฉ์นœ๋‹ค. ์ด๋ฆ„์„ `identity` ๋กœ ๋‘๋Š” ์ด์œ ๋Š” **GS1 ํ‚ค๊ฐ€ ์•„๋‹Œ ์ •์ฒด์„ฑ์ด ์ •์ƒ**์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค โ€”\n * ์‹ค์ธกํ•œ ๊ฐ’์€ ์ธ๋ฒ„ํ„ฐ์˜ ํ•˜๋“œ์›จ์–ด ์‹๋ณ„์ž(`ES100000007d8d061d-1`)์ด๊ณ  GS1 ํ‚ค๊ฐ€ ์•„๋‹ˆ๋‹ค.\n *\n * ์ž๋ฆฌ(`twin_location`)์˜ `gs1Id` ๋Š” ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค. ๊ทธ์ชฝ์€ ์‹ค์ œ๋กœ SGLN ์ด ์˜จ๋‹ค.\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Declared global identity of this equipment (TwinModelDef.equipment[].identity). Not necessarily a GS1 key.' })\n identity?: string\n\n /* โ”€โ”€ ์บ์‹œ๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ตฌ์กฐ๋กœ (ADR-0032-D) โ”€โ”€ */\n @Column()\n @Field({ description: 'Which reference (source system) this row came from. Required.' })\n sourceRef: string\n\n /*\n * **ํƒ€์ž… ์ด๋ฆ„์„ ์ ์ง€ ์•Š๋Š”๋‹ค** (2026-08-19 Postgres ๋ถ€ํŒ… ์‹คํŒจ๋กœ ๊ณ ์นจ).\n *\n * `datetime` ์€ sqliteยทMySQL ์˜ ์ด๋ฆ„์ด๊ณ  Postgres ๋Š” `timestamp` ๋งŒ ์•ˆ๋‹ค โ€” ๊ฑฐ๊พธ๋กœ `timestamp` ๋Š”\n * sqlite ๊ฐ€ ๋ชจ๋ฅธ๋‹ค. **๋‹ค์„ฏ ๋“œ๋ผ์ด๋ฒ„์— ๋‹ค ํ†ตํ•˜๋Š” ์ด๋ฆ„์ด ์—†๋‹ค.** ๊ทธ๋ž˜์„œ ์ด๋ฆ„ ๊ณ ๋ฅด๋Š” ์ผ์„ TypeORM ์—\n * ๋งก๊ธด๋‹ค(`emitDecoratorMetadata` ๊ฐ€ ์ผœ์ ธ ์žˆ์–ด `Date` ์—์„œ ๋“œ๋ผ์ด๋ฒ„๋ณ„ ํƒ€์ž…์„ ๊ณ ๋ฅธ๋‹ค).\n */\n @Column()\n @Field({ description: 'When this row was projected from the source.' })\n ingestedAt: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"twin-lineage-query.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-lineage-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Int, Query, Resolver } from 'type-graphql'\n\nimport { ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { itemRefOf, resolveByDeclaration } from './item-ref.js'\nimport { chooseRecipe } from './choose-recipe.js'\n\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinEvent } from '../twin-event/twin-event.js'\n\n/*\n * ๊ณ„๋ณด โ€” **์ด ๊ฐœ์ฒด๋Š” ๋ฌด์—‡์—์„œ ๋‚˜์™”๋‚˜**, ๊ทธ๋ฆฌ๊ณ  **์„ค๊ณ„๋Œ€๋กœ ๋งŒ๋“ค์–ด์กŒ๋‚˜.**\n *\n * โ”€โ”€ ๊ตฌ์„ฑ๊ณผ ๊ณ„๋ณด๋Š” ์ฃผ์–ด๊ฐ€ ๋‹ค๋ฅด๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๊ตฌ์„ฑ(BOM)์˜ ์ฃผ์–ด๋Š” ํ’ˆ๋ชฉ **์ •์˜**๋‹ค โ€” \"ํŠธ๋ ˆ์ผ๋Ÿฌ๋Š” ํ”„๋ ˆ์ž„ 1๊ฐœ๋กœ ๋งŒ๋“ ๋‹ค\"(์„ ์–ธ).\n * ๊ณ„๋ณด์˜ ์ฃผ์–ด๋Š” ํ’ˆ๋ชฉ **๊ฐœ์ฒด**๋‹ค โ€” \"์ด ํŠธ๋ ˆ์ผ๋Ÿฌ๋Š” ์ € ํ”„๋ ˆ์ž„ ๋กœํŠธ์—์„œ ๋‚˜์™”๋‹ค\"(๊ด€์ธก).\n * ๋‘˜์€ ๊ฐ™์€ ๋ชจ์–‘์ด๋ผ ๊ฒน์ณ ๋ณผ ์ˆ˜ ์žˆ๊ณ , **๊ทธ ์ฐจ์ด๊ฐ€ ๊ณง ์ง„๋‹จ**์ด๋‹ค: \"์„ค๊ณ„๋Š” 1๊ฐœ์ธ๋ฐ ์ด๊ฑด 2๊ฐœ๋ฅผ ๋จน์—ˆ๋‹ค\".\n * ํŠธ์œˆ์ด ์•„๋‹ˆ๋ฉด ๋ชป ํ•˜๋Š” ๋‹ต์ด๊ณ , ์ด ์งˆ์˜๊ฐ€ ๊ทธ ๋‹ต์˜ ์žฌ๋ฃŒ๋‹ค.\n *\n * โ”€โ”€ ์–ด๋””์„œ ์ฝ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๊ณ„๋ณด๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ **์ €๋„**์— ์žˆ๋‹ค(EPCIS `TransformationEvent` ์˜ ์ž…๋ ฅยท์‚ฐ์ถœ ๋ชฉ๋ก). ์ƒํƒœ๋Š”\n * ์ง€๊ธˆ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€๋งŒ ์•Œ๊ณ , ์—†์–ด์ง„ ์›์ž์žฌ๊ฐ€ ๋ฌด์—‡์ด์—ˆ๋Š”์ง€๋Š” ์ด๋ฒคํŠธ๋งŒ ์•ˆ๋‹ค.\n *\n * โ”€โ”€ ๊ทœ๋ชจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ž…๋ ฅ ๋ชฉ๋ก์€ **์ปฌ๋Ÿผ์ด ์•„๋‹ˆ๋ผ ๋ด‰ํˆฌ ์•ˆ**์— ์žˆ์–ด์„œ ์ธ๋ฑ์Šค๋กœ ์ขํž ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๋ณ€ํ™˜ ์ด๋ฒคํŠธ๋งŒ\n * ์ฐฝ์œผ๋กœ ๋Š์–ด ์ฝ๊ณ , **๋Š์—ˆ์œผ๋ฉด ๋Š์—ˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค.** ๊ทธ ์‚ฌ์‹ค์„ ๊ฐ์ถ”๋ฉด \"์ด ๊ฐœ์ฒด๋Š” ์›์ž์žฌ๊ฐ€ ์—†๋‹ค\" ๋กœ\n * ์ฝํžˆ๊ณ , ๊ณ„๋ณด์—์„œ ๊ทธ ์˜คํ•ด๋Š” ๋ฆฌ์ฝœ ๋ฒ”์œ„๋ฅผ ์ข๊ฒŒ ์žก๋Š” ๊ฒฐ๊ณผ๋กœ ์ด์–ด์ง„๋‹ค.\n */\n\n\n@Resolver()\nexport class TwinLineageQuery {\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'Where one item came from (observed) laid next to what its type declares (BOM). Walks TransformationEvent input/output lists in the journal; reports the window it read and whether it was truncated. The declared|observed difference is the diagnosis: \"the recipe says one frame, this one consumed two\".'\n })\n async twinItemLineage(\n @Arg('instanceId') instanceId: string,\n @Arg('epc') epc: string,\n @Ctx() context: ResolverContext,\n @Arg('maxDepth', type => Int, { nullable: true }) maxDepth?: number,\n @Arg('window', type => Int, { nullable: true }) window?: number\n ): Promise<any | null> {\n const domainId = context.state.domain.id\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return null\n\n const depthCap = Math.min(Math.max(maxDepth ?? 6, 1), 12)\n const windowCap = Math.min(Math.max(window ?? 5000, 1), 50000)\n\n /*\n * ๋ณ€ํ™˜ ์ด๋ฒคํŠธ๋งŒ ์ฝ๋Š”๋‹ค. **์ตœ์‹ ๋ถ€ํ„ฐ** ์ฝ๋Š”๋‹ค โ€” ๊ณ„๋ณด๋ฅผ ๋ฌป๋Š” ๊ฐœ์ฒด๋Š” ๋Œ€๊ฐœ ์ตœ๊ทผ์— ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๊ณ ,\n * ์ฐฝ์„ ๋„˜๊ฒจ ์ž˜๋ฆด ๋•Œ ์žƒ๋Š” ์ชฝ์ด ์˜ค๋ž˜๋œ ๊ฒƒ์ด์–ด์•ผ ๋œ ์•„ํ”„๋‹ค.\n */\n /*\n * ๊ด€๊ณ„๋ฅผ **์ปฌ๋Ÿผ์œผ๋กœ** ๋ฌป๋Š”๋‹ค (2026-08-28). `find({ where: { domain: { id } } })` ์€ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„\n * ์—”ํ‹ฐํ‹ฐ์—์„œ ๋‘ ๋‹จ๊ณ„ ์งˆ์˜๊ฐ€ ๋˜๊ณ  **์•ˆ์ชฝ์— ์ƒํ•œ์ด ์—†๋‹ค** โ€” `take` ๊ฐ€ ์žˆ์–ด๋„ ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰์„ ์ „๋ถ€\n * ๋งŒ๋“  ๋’ค ๋ฐ–์—์„œ ์ž๋ฅธ๋‹ค. ๋ณ€ํ™˜ ์‚ฌ๊ฑด์ด ์ ์€ ํŠธ์œˆ์—์„œ๋Š” ํ‘œ๊ฐ€ ์•ˆ ๋‚˜์ง€๋งŒ, ๋ณ€ํ™˜์„ ๋งŽ์ด ๋‚ด๋Š” ํŠธ์œˆ์—์„œ๋Š”\n * ์ด ํ•œ ๋ฒˆ์ด ๊ทธ ์ข…๋ฅ˜ ์ „์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ์งˆ์˜ ๋นŒ๋”๋กœ ๋ฌผ์œผ๋ฉด ์ƒํ•œ์ด ์•ˆ์ชฝ์— ๊ฑธ๋ฆฐ๋‹ค.\n *\n * ์ข…๋ฅ˜๊ฐ€ ์ •ํ™•์ผ์น˜์ด๋ฏ€๋กœ `(domain, instance, event_type, event_time)` ์ƒ‰์ธ์ด ์‹œ๊ฐ ์ˆœ์„œ๊นŒ์ง€ ์ค€๋‹ค.\n */\n const rows: any[] = await getRepository(TwinEvent)\n .createQueryBuilder('e')\n .where('e.domain = :domainId', { domainId })\n .andWhere('e.instanceId = :instanceId', { instanceId })\n .andWhere('e.eventType = :eventType', { eventType: 'epcis.TransformationEvent' })\n .orderBy('e.eventTime', 'DESC')\n .limit(windowCap)\n .getMany()\n const truncated = rows.length >= windowCap\n\n /* ์‚ฐ์ถœ โ†’ ๊ทธ ๋ณ€ํ™˜. ํ•œ ๊ฐœ์ฒด๋Š” ํ•œ ๋ฒˆ๋งŒ ๋งŒ๋“ค์–ด์ง€์ง€๋งŒ, ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชฉ๋ก์œผ๋กœ ๋“ ๋‹ค. */\n const madeBy = new Map<string, { inputs: string[]; at?: string; tx?: string }[]>()\n for (const r of rows) {\n const d = r.payload?.data ?? {}\n const outs: string[] = d.outputEPCList ?? []\n const ins: string[] = d.inputEPCList ?? []\n const step = { inputs: ins, at: r.eventTime, tx: d.bizTransactionList?.[0]?.bizTransaction }\n for (const o of outs) {\n const list = madeBy.get(o) ?? []\n list.push(step)\n madeBy.set(o, list)\n }\n }\n\n /* ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ„๋‹ค โ€” ๋„ˆ๋น„ ์šฐ์„ , ์ง€๋‚˜์˜จ ๊ฒƒ์€ ๋‹ค์‹œ ํŒŒ์ง€ ์•Š๋Š”๋‹ค(์‚ฌ์ดํดยท๊ณต์œ  ๋ถ€ํ’ˆ). */\n const items: any[] = [{ epc, itemRef: itemRefOf(epc), depth: 0 }]\n const edges: any[] = []\n const seen = new Set<string>([epc])\n let depthTruncated = false\n let frontier = [{ epc, depth: 0 }]\n while (frontier.length) {\n const next: typeof frontier = []\n for (const cur of frontier) {\n if (cur.depth >= depthCap) { depthTruncated = true; continue }\n for (const step of madeBy.get(cur.epc) ?? []) {\n for (const input of step.inputs) {\n edges.push({ from: cur.epc, to: input, at: step.at, tx: step.tx, depth: cur.depth + 1 })\n if (seen.has(input)) continue\n seen.add(input)\n items.push({ epc: input, itemRef: itemRefOf(input), depth: cur.depth + 1 })\n next.push({ epc: input, depth: cur.depth + 1 })\n }\n }\n }\n frontier = next\n }\n\n /*\n * **๊ฒน์ณ ๋ณธ๋‹ค.** ์ด ๊ฐœ์ฒด์˜ ํ’ˆ๋ชฉ์ด ์–ด๋А ๋ ˆ์‹œํ”ผ์˜ ์‚ฐ์ถœ์ด๋ฉด, ๊ทธ ๋ ˆ์‹œํ”ผ๊ฐ€ ์„ ์–ธํ•œ ํˆฌ์ž…๊ณผ ์‹ค์ œ๋กœ\n * ์†Œ๋น„๋œ ๊ฒƒ์„ ์ž์žฌ๋ณ„๋กœ ๋‚˜๋ž€ํžˆ ์„ผ๋‹ค.\n *\n * ๊ฐœ์ฒด(EPC)์™€ ์ž์žฌ ํ‚ค๋ฅผ ์ž‡๋Š” ๊ฒƒ์€ `productionSpec.binding`(์ž์žฌ ํ‚ค โ†’ GS1 ํ’ˆ๋ชฉ ์ฐธ์กฐ)์ด๋‹ค.\n * ๋ฐ”์ธ๋”ฉ์ด ์—†์œผ๋ฉด **๋น„๊ตํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€” ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด \"์„ค๊ณ„์™€ ๋‹ค๋ฅด๋‹ค\" ๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋‚˜์˜ค๊ณ ,\n * ๊ทธ๊ฑด ์•„๋ฌด ๋ง๋„ ์•ˆ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜๋‹ค.\n */\n const spec: any = (inst.model as any)?.productionSpec\n const binding: Record<string, string> = spec?.binding ?? {}\n const refToMaterial = new Map(Object.entries(binding).map(([mat, ref]) => [String(ref), mat]))\n /*\n * โ”€โ”€ **ํ™”๋ฉด์€ ๋๋งˆ๋””๋กœ ๋ฌป๋Š”๋‹ค** (2026-08-23) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ์„œ๋ž์˜ ํฌ์ปค์Šค ์‹๋ณ„์ž๋Š” ํด๋ž˜์Šค์˜ ๋๋งˆ๋””๋‹ค(`net/class/product-M0000438`). ๋Œ€์‘ ํ‘œ์˜ ๊ฐ’์€ ์ „์ฒด\n * ์‹๋ณ„์ž(`https://โ€ฆ/class/product-M0000438`)์ด๋ฏ€๋กœ ๊ณง๋ฐ”๋กœ๋Š” ๋งž์ง€ ์•Š๊ณ , ๊ทธ๋ž˜์„œ ใ€Œ์„ ์–ธ๋œ ์ž์žฌ๊ฐ€\n * ์•„๋‹™๋‹ˆ๋‹คใ€๊ฐ€ ๋–ด๋‹ค โ€” ๊ทธ ํ’ˆ๋ชฉ์€ ๋Œ€์‘ ํ‘œ์— ์žˆ์—ˆ๋‹ค.\n *\n * ๋๋งˆ๋””๋กœ๋„ ์ฐพ๋˜ **ํ•˜๋‚˜๋ฟ์ผ ๋•Œ๋งŒ** ์ธ์ •ํ•œ๋‹ค. ๋‘˜ ์ด์ƒ์ด ๊ฐ™์€ ๋๋งˆ๋””๋ฅผ ๊ฐ€์ง€๋ฉด ์–ด๋А ๊ฒƒ์ธ์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ\n * ์•„๋ฌด ๋ง๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ๋‚จ์˜ ๋ ˆ์‹œํ”ผ์™€ ๊ฒฌ์ฃผ๊ฒŒ ๋˜๊ณ , ๊ทธ๊ฒƒ์ด ใ€Œ์„ค๊ณ„์™€ ๋‹ค๋ฅด๋‹คใ€๋Š”\n * ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค.\n */\n const materialOf = (e: string) => resolveByDeclaration(itemRefOf(e), refToMaterial) ?? null\n\n const myMaterial = materialOf(epc)\n const recipes: any[] = spec?.definition?.recipes ?? []\n\n /*\n * โ”€โ”€ ใ€Œ๋ฌด์—‡์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‚˜ใ€๋Š” **์ ํ˜€ ์žˆ๋‹ค** (2026-09-05) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ์˜ˆ์ „์—๋Š” ์ด ์ž๋ฆฌ๊ฐ€ ์ž์žฌ๋กœ ๋˜์งš์–ด `recipes.find(...)` ๋กœ **๋จผ์ € ๊ฑธ๋ฆฌ๋Š” ํ•˜๋‚˜**๋ฅผ ๊ณจ๋ž๋‹ค. ๋ฐฐ์—ด\n * ์ˆœ์„œ๊ฐ€ ๋‹ต์„ ์ •ํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , ํ•œ ์ž์žฌ์— ๋ ˆ์‹œํ”ผ๊ฐ€ ๋‘˜์ด๋ฉด ํ‹€๋ฆฐ ๋‹ต์ด ํ™•์‹ ์— ์ฐฌ ์–ผ๊ตด๋กœ ๋‚˜์˜จ๋‹ค.\n * ์‹ค์ œ๋กœ ๊ทธ๋Ÿฐ ์ž์žฌ๊ฐ€ ์žˆ๋‹ค โ€” `BOLT-M8` ์— `RCP-BOLT-STD` ยท `RCP-BOLT-FAST` ๋‘˜์ด๋‹ค.\n *\n * ๊ทธ๋Ÿฐ๋ฐ ๋‹ต์€ ์ด๋ฏธ ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค. ๋งŒ๋“ค ๋•Œ ์ •ํ•ด์ง€๋Š” ์‚ฌ์‹ค์ด๊ณ  ์ปค๋„์ด ์˜ค๋”์— ์‹ฃ๋Š”๋‹ค\n * (`FlowOrder.recipeKey`). ๋ณ€ํ™˜ ์‚ฌ๊ฑด์€ ๊ทธ ์˜ค๋”๋ฅผ ๊ฑฐ๋ž˜ ์‹๋ณ„์ž๋กœ ๊ฐ€๋ฆฌํ‚ค๊ณ (`bizTransactionList`),\n * ์ด ํ•จ์ˆ˜๋Š” ๊ทธ ๊ฐ’์„ ์ด๋ฏธ `tx` ๋กœ ๊บผ๋‚ด ๋†“๊ณ ๋„ ์“ฐ์ง€ ์•Š์•˜๋‹ค.\n *\n * ์„ธ ์ž๋ฆฌ๊ฐ€ ๋‹ค ์žˆ์—ˆ๊ณ  ๋งˆ์ง€๋ง‰ ์—ฐ๊ฒฐ๋งŒ ์—†์—ˆ๋‹ค. ใ€Œ๊ฐ€๋ฆด ์ˆ˜ ์—†๋‹คใ€๊ฐ€ ์•„๋‹ˆ๋ผ **์•ˆ ์ฝ๊ณ  ์žˆ์—ˆ๋‹ค.**\n *\n * โ”€โ”€ ๊ทœ์น™ ์…‹ โ€” ์ง์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์˜ค๋”๊ฐ€ ๋งํ•œ๋‹ค ๊ทธ๊ฒƒ์„ ์“ด๋‹ค. ๋ฒ„์ „์ด ๋‘˜์ด๋“  ์—ด์ด๋“  ์ƒ๊ด€์—†๋‹ค\n * ์˜ค๋”๊ฐ€ ๋ง ์•ˆ ํ•˜๊ณ \n * ํ›„๋ณด๊ฐ€ ํ•˜๋‚˜ ๊ทธ๊ฒƒ์„ ์“ด๋‹ค โ€” ๊ณ ๋ฅผ ๊ฒƒ์ด ์—†์œผ๋ฉด ์ง์ž‘์ด ์•„๋‹ˆ๋‹ค\n * ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ **๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์–ด๋А ๊ฒƒ์ธ์ง€ ๋ชจ๋ฅด๋Š” ์ฑ„๋กœ ๊ฒฌ์ฃผ๋ฉด ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค\n *\n * ๋งˆ์ง€๋ง‰ ์ค„์ด ์ด ํ•จ์ˆ˜๊ฐ€ ์‹๋ณ„์ž ๋˜์ฐพ๊ธฐ์— ์ด๋ฏธ ์ ์šฉํ•˜๋˜ ๊ทœ์œจ์ด๋‹ค(ใ€Œํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€\n * ์•Š๋Š”๋‹คใ€). ๋‘ ์ค„ ์œ„์—์„œ๋งŒ ์•ˆ ์ง€ํ‚ค๊ณ  ์žˆ์—ˆ๋‹ค.\n */\n const candidates = myMaterial\n ? recipes.filter((r: any) => (r.outputs ?? []).some((o: any) => o.material === myMaterial))\n : []\n\n /* ์ด ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“  ๋ณ€ํ™˜์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฑฐ๋ž˜ โ€” ๊ทธ ์˜ค๋”๊ฐ€ ๋ ˆ์‹œํ”ผ๋ฅผ ๋งํ•œ๋‹ค. */\n const madeTx = (madeBy.get(epc) ?? []).map(s => s.tx).find(Boolean)\n const saidRecipeKey = madeTx ? await recipeKeyOfTransaction(domainId, instanceId, String(madeTx)) : undefined\n\n const chosen = chooseRecipe(recipes, candidates, saidRecipeKey)\n const recipe = chosen.recipe\n\n /*\n * โ”€โ”€ ใ€Œ๋ชจ๋ฅด๋Š” ๊ฐœ์ฒดใ€์™€ ใ€Œ๋Œ€์‘์ด ์—†๋Š” ๊ฐœ์ฒดใ€๋Š” ๋‹ค๋ฅธ ์‚ฌ์‹ค์ด๋‹ค (2026-08-23) โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ํ™”๋ฉด์ด ใ€Œ์ด ๊ฐœ์ฒด๋Š” ์„ ์–ธ๋œ ์ž์žฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(๋ผ์ธ ๋‚ด๋ถ€์˜ ์ค‘๊ฐ„ ์‚ฐ๋ฌผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)ใ€๋ผ๊ณ  ๋งํ–ˆ๋Š”๋ฐ,\n * ๊ทธ ํ’ˆ๋ชฉ์€ ์›๋ณธ์˜ ํ’ˆ๋ชฉ ์„ ์–ธ์— **์ด๋ฆ„๊นŒ์ง€ ์žˆ์—ˆ๋‹ค**(ใ€Œ๋ƒ‰๋™๊ทธ๋ฆฐ๋นˆ์Šคใ€). ๋ฐ”์ธ๋”ฉ ํ‘œ๊ฐ€ ๊ทธ ํ’ˆ๋ชฉ์„ ๋‹ด์ง€\n * ๋ชปํ•œ ๊ฒƒ์ด๊ณ , ๊ทธ๊ฒƒ์€ ใ€Œ์ค‘๊ฐ„ ์‚ฐ๋ฌผใ€๊ณผ ์ „ํ˜€ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ๋‹ค โ€” ์‚ฌ์šฉ์ž๊ฐ€ ํ•  ์ผ๋„ ๋‹ค๋ฅด๋‹ค(์›๋ณธ์„ ๋ณผ ์ผ์ด\n * ์•„๋‹ˆ๋ผ ๋Œ€์‘์„ ๊ณ ์น  ์ผ์ด๋‹ค).\n *\n * ๊ทธ๋ž˜์„œ ๊ฐœ์ฒด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ’ˆ๋ชฉ์ด **๋ชจ๋ธ์˜ ํ’ˆ๋ชฉ ์„ ์–ธ์— ์žˆ๋Š”์ง€** ํ•จ๊ป˜ ๋ณธ๋‹ค. ์ด๋ฆ„์€ ๊ทธ ์ž๋ฆฌ์— ์žˆ์œผ๋‹ˆ\n * ํ•จ๊ป˜ ๋‚ธ๋‹ค(ํ™”๋ฉด์ด ์‚ฌ๋žŒ์—๊ฒŒ ๋ฌด์—‡์„ ๋งํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ).\n */\n const definitions: any[] = (inst.model as any)?.materialDefinitions ?? []\n const defByRef = new Map(definitions.filter(d => d?.id).map(d => [String(d.id), d]))\n /* ์ •์˜๋„ ๊ฐ™์€ ๋ฌธ์œผ๋กœ ๋˜์ฐพ๋Š”๋‹ค โ€” ๊ทœ์น™ ํ•˜๋‚˜, ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค. */\n const myRef = itemRefOf(epc)\n const myDef = resolveByDeclaration(myRef, defByRef)\n\n let conformance: any = null\n if (!Object.keys(binding).length) {\n conformance = { comparable: false, reason: 'no-binding' }\n } else if (!myMaterial && myDef) {\n /* ์›๋ณธ์€ ์ด ํ’ˆ๋ชฉ์„ ์•ˆ๋‹ค โ€” ๊ฐœ์ฒด๋ฅผ ์ž์žฌ์— ์ž‡๋Š” ๋Œ€์‘์ด ์—†์–ด์„œ ๋น„๊ตํ•˜์ง€ ๋ชปํ•œ๋‹ค. */\n conformance = {\n comparable: false,\n reason: 'item-known-not-bound',\n ...(typeof myDef.name === 'string' && myDef.name ? { itemName: myDef.name } : {})\n }\n } else if (!myMaterial) {\n conformance = { comparable: false, reason: 'item-not-bound' }\n } else if (chosen.basis === 'said-but-undeclared') {\n /* ์˜ค๋”๋Š” ๋งํ–ˆ๋Š”๋ฐ ๊ทธ ๋ ˆ์‹œํ”ผ๊ฐ€ ๋ชจ๋ธ์˜ ์„ ์–ธ์— ์—†๋‹ค โ€” ์›๋ณธ๊ณผ ์„ ์–ธ์ด ์–ด๊ธ‹๋‚œ ๊ฒƒ์ด์ง€ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. */\n conformance = { comparable: false, reason: 'recipe-not-declared', recipe: saidRecipeKey }\n } else if (chosen.basis === 'ambiguous') {\n /* ์ง์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ์–ด๋А ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋งํ•ด ์ฃผ๋Š” ์‚ฌ์‹ค์ด ์—†๋‹ค. ํ›„๋ณด๋ฅผ ๋ฐํ˜€ ์‚ฌ๋žŒ์ด ํŒ๋‹จํ•˜๊ฒŒ ํ•œ๋‹ค. */\n conformance = {\n comparable: false,\n reason: 'many-recipes-for-material',\n recipes: candidates.map((r: any) => r.key).sort()\n }\n } else if (!recipe) {\n conformance = { comparable: false, reason: 'no-recipe-for-material' }\n } else if (!(madeBy.get(epc) ?? []).length) {\n /*\n * โ”€โ”€ **์•ˆ ๋ณธ ๊ฒƒ์„ ใ€Œ๋‹ค๋ฅด๋‹คใ€๊ณ  ํ•˜์ง€ ์•Š๋Š”๋‹ค** (2026-09-18 ยท :3000 ํ™”๋ฉด์—์„œ ํ™•์ธ) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ์ด ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“  ๋ณ€ํ™˜์ด ์ €๋„์— ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ํˆฌ์ž…์„ ํ•˜๋‚˜๋„ ๊ด€์ธกํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ\n * ์•„๋ž˜ ์…ˆ์€ ๊ทธ๋Œ€๋กœ ๋Œ์•„ ๊ด€์ธก์„ ์ „๋ถ€ 0 ์œผ๋กœ ์ ์—ˆ๊ณ , ๋ ˆ์‹œํ”ผ๊ฐ€ ์š”๊ตฌํ•œ ์ž์žฌ 23 ์ค„์ด ์ „๋ถ€\n * ใ€Œ์•ˆ ๋งž๋Š”๋‹คใ€๊ฐ€ ๋๋‹ค โ€” ํ™”๋ฉด์€ ใ€Œ๋ ˆ์‹œํ”ผ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹คใ€๋ฅผ ํ™•์‹ ์— ์ฐฌ ์–ผ๊ตด๋กœ ๊ทธ๋ ธ๋‹ค. ์‹ค์ œ๋กœ๋Š”\n * ์›๋ณธ์ด ๋ณ€ํ™˜์„ ์•„์ง ์•ˆ ๋ณด๋ƒˆ์„ ๋ฟ์ด๋‹ค(`mes-miratek` ์˜ ์นด๋ฉ”๋ผ ๋กœํŠธ๊ฐ€ ๊ทธ ๊ฒฝ์šฐ๋‹ค).\n *\n * ์ด ํŒŒ์ผ์˜ ๊ทœ์œจ์ด ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ๋งํ•œ๋‹ค โ€” ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ใ€Œ์„ค๊ณ„์™€ ๋‹ค๋ฅด๋‹คใ€๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด\n * ๋˜๊ณ , ๊ทธ๊ฑด ์•„๋ฌด ๋ง๋„ ์•ˆ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜๋‹ค. ๊ด€์ธก์ด **์—†๋Š”** ๊ฒƒ๋„ ๊ฐ™์€ ๋ถ€๋ฅ˜๋‹ค.\n */\n conformance = { comparable: false, reason: 'made-not-observed', recipe: recipe.key }\n } else {\n /*\n * ๊ด€์ธก: **๋ฐ”์ธ๋”ฉ๋œ ์ž์žฌ๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€ ์„ผ๋‹ค** โ€” ์ค‘๊ฐ„ ์‚ฐ๋ฌผ(WIP)์€ ํ†ต๊ณผํ•œ๋‹ค.\n *\n * ๋‹ค๋‹จ ๋ผ์ธ์—์„œ ์™„์ œํ’ˆ์˜ ์ง์ ‘ ํˆฌ์ž…์€ ์›์ž์žฌ๊ฐ€ ์•„๋‹ˆ๋ผ **WIP** ๋‹ค: ์›์ž์žฌ๋Š” ์ฒซ ๊ณต์ •์—์„œ\n * ์†Œ๋น„๋˜๊ณ  ์™„์ œํ’ˆ์€ ๋งˆ์ง€๋ง‰ ๊ณต์ •์—์„œ ๋‚˜์˜จ๋‹ค. ๊ทธ๋ž˜์„œ ์ง์ ‘ ํˆฌ์ž…๋งŒ ์„ธ๋ฉด ๋ ˆ์‹œํ”ผ๊ฐ€ ์„ ์–ธํ•œ ์ž์žฌ์™€\n * **์˜์›ํžˆ ์•ˆ ๋งž๋Š”๋‹ค**(๊ฒ€์‚ฌ๊ฐ€ ์ด๊ฒƒ์„ ์žก์•˜๋‹ค).\n *\n * WIP ์€ ๋ผ์šฐํŠธ์˜ ๋‚ด๋ถ€ ์‚ฐ๋ฌผ์ด๊ณ  ์„ ์–ธ๋œ ์ž์žฌ๊ฐ€ ์•„๋‹ˆ๋‹ค โ€” ๋ ˆ์‹œํ”ผ๋Š” ์ž์žฌ๋กœ ๋งํ•˜๋ฏ€๋กœ ๋น„๊ต๋„\n * ์ž์žฌ๋กœ ํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ”์ธ๋”ฉ์— ์žˆ์œผ๋ฉด ๊ฑฐ๊ธฐ์„œ ๋ฉˆ์ถ”๊ณ , ์—†์œผ๋ฉด ๊ทธ ์œ„๋กœ ๊ณ„์† ๋”ฐ๋ผ๊ฐ„๋‹ค.\n *\n * ๋‹ค๋งŒ **๋‹ค๋ฅธ ์™„์ œํ’ˆ๊นŒ์ง€ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค**: ๋ฐ”์ธ๋”ฉ๋œ ๊ฒƒ์„ ๋งŒ๋‚˜๋ฉด ๋ฉˆ์ถ”๋ฏ€๋กœ, ํ•˜์œ„์กฐ๋ฆฝ๋„\n * ์ž์žฌ๋กœ ์„ ์–ธ๋ผ ์žˆ์œผ๋ฉด ๊ทธ ์ž๋ฆฌ์—์„œ ์„ธ์–ด์ง„๋‹ค(๊ทธ ์•„๋ž˜๋Š” ๊ทธ ์ž์žฌ ์ž์‹ ์˜ ๋ ˆ์‹œํ”ผ๊ฐ€ ๋ณผ ์ผ์ด๋‹ค).\n */\n const observed = new Map<string, number>()\n let unbound = 0\n const parentsOf = (e: string) => edges.filter(x => x.from === e).map(x => x.to)\n const walked = new Set<string>([epc])\n let layer = parentsOf(epc)\n while (layer.length) {\n const deeper: string[] = []\n for (const e of layer) {\n if (walked.has(e)) continue\n walked.add(e)\n const mat = materialOf(e)\n if (mat) { observed.set(mat, (observed.get(mat) ?? 0) + 1); continue }\n const up = parentsOf(e)\n /* ๋ฐ”์ธ๋”ฉ์—๋„ ์—†๊ณ  ๋” ์˜ฌ๋ผ๊ฐˆ ๊ณณ๋„ ์—†๋‹ค โ€” ์ •๋ง ๋ชจ๋ฅด๋Š” ํˆฌ์ž…์ด๋‹ค(์ˆ˜๋งŒ ๋‚ธ๋‹ค). */\n if (!up.length) { unbound++; continue }\n deeper.push(...up)\n }\n layer = deeper\n }\n const declared = new Map<string, number>((recipe.inputs ?? []).map((i: any) => [i.material, i.qty ?? null]))\n const keys = [...new Set([...declared.keys(), ...observed.keys()])]\n conformance = {\n comparable: true,\n material: myMaterial,\n recipe: recipe.key,\n /* ๊ทธ ๋ ˆ์‹œํ”ผ๋ฅผ **์–ด๋–ป๊ฒŒ ์•Œ์•˜๋‚˜** โ€” ํ™”๋ฉด์ด ใ€Œ๊ธฐ๋ก์œผ๋กœ ์•ˆ๋‹คใ€์™€ ใ€Œํ•˜๋‚˜๋ฟ์ด๋ผ ์•ˆ๋‹คใ€๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ. */\n recipeBasis: chosen.basis,\n /* ์ž์žฌ๋งˆ๋‹ค ์„ ์–ธยท๊ด€์ธก์„ ๋‚˜๋ž€ํžˆ. ์–ด๋А ํ•œ์ชฝ์—๋งŒ ์žˆ๋Š” ๊ฒƒ๋„ ์‚ฌ์‹ค์ด๋‹ค(๋น ๋œจ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค). */\n lines: keys.map(m => ({\n material: m,\n declared: declared.has(m) ? declared.get(m) : null,\n observed: observed.get(m) ?? 0,\n matches: declared.get(m) === (observed.get(m) ?? 0)\n })),\n /* ๋ฐ”์ธ๋”ฉ์— ์—†๋Š” ํˆฌ์ž… โ€” ์„ค๊ณ„์— ์—†๋Š” ๊ฒƒ์ด ๋“ค์–ด๊ฐ”์„ ์ˆ˜๋„, ๋ฐ”์ธ๋”ฉ์ด ๋œ ์„ ์–ธ๋์„ ์ˆ˜๋„ ์žˆ๋‹ค.\n ์–ด๋А ์ชฝ์ธ์ง€ ์šฐ๋ฆฌ๋Š” ๋ชจ๋ฅด๋ฏ€๋กœ **์ˆ˜๋งŒ ๋‚ธ๋‹ค.** */\n unboundInputs: unbound\n }\n }\n\n return {\n instanceId,\n epc,\n itemRef: itemRefOf(epc),\n material: myMaterial,\n items,\n edges,\n conformance,\n /* ๋ฌด์—‡์„ ๊ทผ๊ฑฐ๋กœ ๋‹ตํ–ˆ๋‚˜ โ€” ์ฐฝ์„ ๋„˜๊ฒจ ๋Š๊ฒผ์œผ๋ฉด ๊ณ„๋ณด๊ฐ€ ์‹ค์ œ๋ณด๋‹ค ์–•๊ฒŒ ๋ณด์ธ๋‹ค. */\n basis: { source: 'journal', transformationsRead: rows.length, truncated, depthTruncated, depthCap, windowCap }\n }\n }\n}\n\n/**\n * ๊ทธ ๊ฑฐ๋ž˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์˜ค๋”๊ฐ€ **์–ด๋А ๋ ˆ์‹œํ”ผ๋กœ** ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๋งํ•˜๋Š”๊ฐ€.\n *\n * โ”€โ”€ ์™œ ๊ฑฐ๋ž˜ ์‹๋ณ„์ž๋กœ ๋ฌป๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * EPCIS ๋ณ€ํ™˜ ์‚ฌ๊ฑด์—๋Š” ๋ ˆ์‹œํ”ผ๊ฐ€ ์—†๋‹ค โ€” ํ‘œ์ค€์— ๊ทธ ์ž๋ฆฌ๊ฐ€ ์—†๊ณ , ๋Œ€์‹  ์ƒ์‚ฐ ์˜ค๋”๋ฅผ ๊ฑฐ๋ž˜๋กœ ๊ฐ€๋ฆฌํ‚จ๋‹ค\n * (`bizTransactionList`). ์˜ค๋” ์‚ฌ๊ฑด์€ `recipeKey` ์™€ ๊ทธ ๊ฑฐ๋ž˜ ์‹๋ณ„์ž๋ฅผ **๋‘˜ ๋‹ค** ๋“ ๋‹ค. ๊ทธ๋ž˜์„œ ์ด\n * ๋‘ ์นธ์ด EPCIS ์—์„œ ์˜ค๋”๋กœ ๊ฑด๋„ˆ๊ฐ€๋Š” ๋‹ค๋ฆฌ๋‹ค(ยง`twin-event-keys.ts`).\n *\n * โ”€โ”€ ์ƒ‰์ธ์„ ํƒ„๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * `ix_twin_event_9 (domain, instanceId, bizTransaction)` ๋กœ ์ขํžŒ๋‹ค. ์ด ์นธ์ด ์—†๋˜ ๋•Œ๋Š” payload ๋ฅผ\n * ๋ฌธ์ž์—ด๋กœ ํ›‘์–ด์•ผ ํ–ˆ๊ณ  32๋งŒ ํ–‰์— 3๋ถ„์ด ๊ฑธ๋ ธ๋‹ค โ€” ํ™”๋ฉด์ด ๊ธฐ๋‹ค๋ฆด ๋น„์šฉ์ด ์•„๋‹ˆ๋‹ค.\n *\n * โ”€โ”€ ๋ชป ์ฐพ์œผ๋ฉด **๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค** โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์˜› ํ–‰์—๋Š” ์ด ์นธ์ด ๋น„์–ด ์žˆ๋‹ค(๊ณผ๊ฑฐ ํ–‰์€ ์ฑ„์šฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ทœ์œจ). ๊ทธ๋•Œ๋Š” `undefined` ๋ฅผ ๋‚ด๊ณ , ๋ถ€๋ฅด๋Š”\n * ์ชฝ์ด ํ›„๋ณด ์ˆ˜๋กœ ํŒ๋‹จํ•œ๋‹ค โ€” ์—ฌ๊ธฐ์„œ ์•„๋ฌด๊ฑฐ๋‚˜ ๊ณ ๋ฅด๋ฉด ์˜ˆ์ „๊ณผ ๊ฐ™์€ ๊ฒฐํ•จ์ด ๋œ๋‹ค.\n */\nasync function recipeKeyOfTransaction(\n domainId: string,\n instanceId: string,\n bizTransaction: string\n): Promise<string | undefined> {\n const row = await getRepository(TwinEvent)\n .createQueryBuilder('e')\n .where('e.domain = :domainId', { domainId })\n .andWhere('e.instanceId = :instanceId', { instanceId })\n .andWhere('e.bizTransaction = :tx', { tx: bizTransaction })\n .andWhere('e.eventType = :eventType', { eventType: 'order.status' })\n /* ์–ด๋А ์ค„์ด๋“  ๊ฐ™์€ ์˜ค๋”๋ฅผ ๋งํ•˜๋ฏ€๋กœ ํ•˜๋‚˜๋ฉด ๋œ๋‹ค โ€” ๊ฐ€์žฅ ์ด๋ฅธ ๊ฒƒ์ด ๊ทธ ์˜ค๋”๊ฐ€ ์„  ์ˆœ๊ฐ„์ด๋‹ค. */\n .orderBy('e.eventTime', 'ASC')\n .limit(1)\n .getOne()\n\n const said = (row?.payload as any)?.data?.recipeKey\n return typeof said === 'string' && said ? said : undefined\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"twin-location.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-location.ts"],"names":[],"mappings":"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","sourcesContent":["import { CreateDateColumn, Entity, Index, Column, RelationId, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'\nimport { ObjectType, Field, ID, Int } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\n\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\n\n/*\n * TwinLocation โ€” ์ด ํŠธ์œˆ์ด ๋ฐ˜์˜ํ•˜๋Š” **์ž๋ฆฌ**. ISA-95 `OperationalLocation` / EPCIS `SGLN`.\n *\n * โ”€โ”€ ์™œ ํ…Œ์ด๋ธ”์ธ๊ฐ€ (ADR-0032, 2026-08-08) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ง€๊ธˆ๊นŒ์ง€ ์ž๋ฆฌ๋Š” `TwinInstance.model` JSON ์•ˆ์— ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ โ‘ด ๋ถ€๋ถ„ ๊ฐฑ์‹ ์ด ์—†์–ด ์“ฐ๋Š” ์ชฝ์ด\n * ๋น ๋œจ๋ฆฌ๋ฉด ์‚ญ์ œ์˜€๊ณ  โ‘ต ๋ผ์šฐํŠธโ†’๊ณต์ •ยท์„ค๋น„โ†’์ž๋ฆฌ ์ฐธ์กฐ์— FK ๋ฅผ ๋ชป ๊ฑธ์–ด **๋Š์–ด์ง„ ์ฐธ์กฐ๋ฅผ ํ™”๋ฉด์ด ๋ณด๊ณ ๋งŒ**\n * ํ–ˆ๊ณ  โ‘ถ 5๊ฐœ ๋“œ๋ผ์ด๋ฒ„์—์„œ JSON ์งˆ์˜๊ฐ€ ์ด์‹๋˜์ง€ ์•Š์•„ \"์„ค๋น„ ๋ช‡ ๋Œ€?\" ์กฐ์ฐจ ์„œ๋ฒ„๊ฐ€ ๋ชป ๋‹ตํ–ˆ๋‹ค.\n *\n * โ”€โ”€ ์ด๊ฒƒ์€ **์›๋ณธ์—์„œ ์˜จ ์บ์‹œ**๋‹ค (ADR-0032-D) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ž˜ ๋งŒ๋“  ์—”ํ‹ฐํ‹ฐ๋Š” ์ •๋ณธ์ฒ˜๋Ÿผ **์ƒ๊ฒผ๋‹ค.** ๊ทธ๋ž˜์„œ ์†Œ์œ  ์นจ๋ฒ”์„ ๋ถ€๋ฅธ๋‹ค โ€” ๋ˆ„๊ตฐ๊ฐ€ \"์—ฌ๊ธฐ์—๋งŒ ์žˆ๋Š” ์ปฌ๋Ÿผ\" ์„\n * ๋”ํ•˜๊ณ , ์“ฐ๊ธฐ ๊ฒฝ๋กœ๋ฅผ ์—ด๊ณ , ๊ทธ๋Ÿฌ๋ฉด `ADR-0028`(ํŠธ์œˆ์€ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค)์ด ๋ฌด๋„ˆ์ง„๋‹ค.\n *\n * ๊ทœ์œจ ์…‹์„ ๊ตฌ์กฐ๋กœ ๋ฐ•๋Š”๋‹ค:\n * ยท `sourceRef`ยท`ingestedAt` ํ•„์ˆ˜ โ€” ์–ด๋””์„œ ์–ธ์ œ ์™”๋Š”์ง€ ์—†๋Š” ํ–‰์€ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค\n * ยท ์“ฐ๊ธฐ ๊ฒฝ๋กœ๋Š” **์ธ์ œ์ŠคํŠธ ํ•˜๋‚˜**\n * ยท **์ „๋ถ€ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค** โ€” ์›๋ณธ์ด ๋‚ผ ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ์—ฌ๊ธฐ ๋‘์ง€ ์•Š๋Š”๋‹ค\n */\n@Entity({ name: 'twin_locations' })\n@Index('ix_twin_location_0', (e: TwinLocation) => [e.domain, e.instance, e.locationId], { unique: true })\n/* ํƒ€์ž…์œผ๋กœ ์ขํ˜€ ๋ณด๊ธฐ(์ธ์ŠคํŽ™์…˜์˜ \"์ด ํƒ€์ž…์˜ ์ž๋ฆฌ๋“ค\") โ€” ๊ณต์ •์ด ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ ์žฆ์€ ์งˆ์˜๋‹ค. */\n@Index('ix_twin_location_1', (e: TwinLocation) => [e.domain, e.instance, e.type])\n@ObjectType({ description: 'A location reflected into the twin (ISA-95 OperationalLocation / EPCIS SGLN). Projected from the source; never authored here.' })\nexport class TwinLocation {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'Owning tenant domain.' })\n domain?: Domain\n\n @RelationId((e: TwinLocation) => e.domain)\n domainId?: string\n\n /* ์ด ์ž๋ฆฌ๊ฐ€ ์†ํ•œ ํŠธ์œˆ. ํŠธ์œˆ์ด ์‚ฌ๋ผ์ง€๋ฉด ๊ทธ ๊ตฌ์กฐ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค(ํˆฌ์˜์ด๋ฏ€๋กœ ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅ). */\n @ManyToOne(type => TwinInstance, { onDelete: 'CASCADE' })\n @Field(type => TwinInstance, { nullable: true, description: 'Owning twin instance.' })\n instance?: TwinInstance\n\n @RelationId((e: TwinLocation) => e.instance)\n instanceRowId?: string\n\n /** ์ปค๋„ ๊ณ„์•ฝ์˜ `TwinModelDef.locations[].id` **๊ทธ๋Œ€๋กœ**. ๋ฐ”์ธ๋”ฉ์€ id===id ๋‹ค(ADR-0014). */\n @Column()\n @Field({ description: 'Location id as declared by the source (kernel TwinModelDef.locations[].id).' })\n locationId: string\n\n /**\n * **์‚ฌ๋žŒ์ด ๋ถ€๋ฅด๋Š” ์ด๋ฆ„** โ€” ํ”„๋ ˆ์ž„์›Œํฌ ์—”ํ‹ฐํ‹ฐ ๊ทœ์•ฝ์˜ `name`/`description`.\n *\n * โ”€โ”€ ์™œ ์ด๊ฒƒ์ด ๋น ์ ธ ์žˆ์—ˆ๊ณ , ๋ฌด์—‡์ด ๋ง๊ฐ€์กŒ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํˆฌ์˜์ด ๋งˆ์Šคํ„ฐ์˜ `name` ์„ ๋ฒ„๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ–‰์—๋Š” id ๋งŒ ๋‚จ๊ณ , ํ™”๋ฉด์€ ์ด๋ฆ„์„ ๋งŒ๋“ค ์žฌ๋ฃŒ๊ฐ€\n * ์—†์–ด `cut-station` ์„ ๊ทธ๋Œ€๋กœ ์ฐ์—ˆ๋‹ค โ€” ๊ทธ ๊ฒฐํ•จ์ด ๋ชฉ๋กยทํ‘œยท๊ด€๊ณ„ ๊ทธ๋ฆผ๋งˆ๋‹ค ๋”ฐ๋กœ ๋‚˜ํƒ€๋‚˜์„œ ํ‘œ๋ฉด์„\n * ํ•˜๋‚˜์”ฉ ๊ณ ์น˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ํ‘œ๋ฉด์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ **ํ–‰์— ์ด๋ฆ„์ด ์—†๋˜ ๋ฌธ์ œ**๋‹ค.\n *\n * ์›๋ณธ์ด ์ด๋ฆ„์„ ๋งํ•˜์ง€ ์•Š์œผ๋ฉด ๋น„์šด๋‹ค(id ๋ฅผ ์ด๋ฆ„์œผ๋กœ ๋ฒ ๋ผ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ทธ๋Ÿฌ๋ฉด \"์ด๋ฆ„์ด ์žˆ๋‹ค\" ๋Š”\n * ๊ฑฐ์ง“์ด ๋˜๊ณ , ํ™”๋ฉด์ด ์ด๋ฆ„ ์—†์Œ์„ ์•Œ์•„๋ณผ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค).\n */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Human name as declared by the source. Empty when the source does not name it (never copied from the id).' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Longer description when the source provides one.' })\n description?: string\n\n /**\n * ์ปค๋„ ์นดํƒˆ๋กœ๊ทธ์˜ ์ž๋ฆฌ ํƒ€์ž… ํ‚ค(`storage`ยท`dock`ยท`yard-slot`โ€ฆ).\n *\n * **FK ๋ฅผ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค** โ€” ํƒ€์ž… ์นดํƒˆ๋กœ๊ทธ๋Š” ์ปค๋„์ด SSOT ์ด๊ณ (ADR-0018) DB ๋กœ ๋‚ด๋ฆฌ๋ฉด\n * **์ปค๋„ ์–ดํœ˜์˜ ์‚ฌ๋ณธ**์ด ์ƒ๊ธด๋‹ค. ๋ฌธ์ž์—ด + ๋ถ€ํŒ… ์‹œ ๊ฒ€์ฆ์ด ๋งž๋‹ค(ADR-0032-F).\n */\n @Column()\n @Field({ description: 'Location type key from the kernel catalog (not an FK โ€” the catalog is the kernel SSOT).' })\n type: string\n\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'Declared capacity. Absent when the source does not say.' })\n capacity?: number\n\n @Column({ type: 'int', nullable: true })\n @Field(type => Int, { nullable: true, description: 'How many things can be worked on here at once, when the source declares it.' })\n parallelism?: number\n\n /**\n * ์†ํ•œ ๊ตฌ์—ญ โ€” **์‹ค์ œ FK**.\n *\n * ์ปค๋„ ๊ณ„์•ฝ์—์„œ๋Š” `locations[].parentId` ๊ฐ€ model ์•ˆ์— ๋Œ€์ƒ์ด ์—†๋Š” ์ฐธ์กฐ์˜€๋‹ค(๋งˆ์Šคํ„ฐ์—์„œ ๊ตฌ์—ญ๋„\n * ์ž๋ฆฌ์™€ ํ•œ ๋ชฉ๋ก์ด์—ˆ๋‹ค๊ฐ€ ์ธ์ œ์ŠคํŠธ๊ฐ€ ๊ฐˆ๋ผ `TwinArea` ๋กœ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ). ์ปค๋„์€ ๊ทธ๊ฒƒ์„\n * `external: 'space.area'` ๋กœ ์„ ์–ธํ–ˆ๊ณ , **ํ˜ธ์ŠคํŠธ์—์„œ๋Š” ํ‰๋ฒ”ํ•œ FK ๊ฐ€ ๋œ๋‹ค.**\n */\n @ManyToOne(type => TwinArea, { nullable: true, onDelete: 'SET NULL' })\n @Field(type => TwinArea, { nullable: true, description: 'Logical area this location belongs to.' })\n area?: TwinArea\n\n @RelationId((e: TwinLocation) => e.area)\n areaRowId?: string\n\n /** GS1 ์‹๋ณ„์ž(SGLN ๋“ฑ) โ€” ์›๋ณธ์ด ์ฃผ๋ฉด ์‹ฃ๋Š”๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'GS1 identifier supplied by the source (e.g. SGLN).' })\n gs1Id?: string\n\n /**\n * ์ด ์ž๋ฆฌ์˜ **์„ ์–ธ ์†์„ฑ** โ€” ๊ณ„์•ฝ์ „๋ ฅยท์š”๊ธˆ ๋‹จ๊ฐ€์ฒ˜๋Ÿผ ์ž๋ฆฌ์— ์–นํžˆ๋Š” ์ˆ˜(ISA-95 Property).\n *\n * โ”€โ”€ ์™œ ๋Šฆ๊ฒŒ ์ƒ๊ฒผ๋‚˜ (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์„ค๋น„ ํ–‰์—๋Š” ์ด ์นธ์ด ์žˆ์—ˆ๋Š”๋ฐ ์ž๋ฆฌ ํ–‰์—๋Š” ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆ˜์ „ ์ง€์ ์— ๊ณ„์•ฝ์ „๋ ฅยท์š”๊ธˆ์„ ๋„ฃ์–ด๋„ **ํ•ญ๋ชฉ\n * ํŒจ๋„์˜ ใ€Œ์›๋ณธ์ด ๋งํ•œ ๊ฐ’ใ€์— ๊ทธ ์ค„์ด ์•„์˜ˆ ์—†์—ˆ๋‹ค** โ€” ์‚ฌ์šฉ์ž๋Š” ๊ฐ’์„ ๋„ฃ๊ณ ๋„ ํ™”๋ฉด์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ณ ,\n * ใ€Œ์ด ๊ฐ’์ด ๋ฌด์—‡์„ ๋ฐ”๊พธ๋‚˜ใ€๋Š” ๋ฌธ์žฅ๋„ ๋ถ™์„ ์ž๋ฆฌ๊ฐ€ ์—†์—ˆ๋‹ค(๋“ค์–ด์˜จ ๊ฒƒ์ด ์—†๋Š” ๋ˆ„๋ฝ).\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Properties declared on this location (ISA-95 Property: value + dataType + unit of measure). Carries locally-declared numbers too, with source: local.' })\n properties?: any\n\n /* โ”€โ”€ ์บ์‹œ๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ตฌ์กฐ๋กœ (ADR-0032-D) โ”€โ”€ */\n @Column()\n @Field({ description: 'Which reference (source system) this row came from. Required โ€” a row with no origin cannot exist.' })\n sourceRef: string\n\n /*\n * **ํƒ€์ž… ์ด๋ฆ„์„ ์ ์ง€ ์•Š๋Š”๋‹ค** (2026-08-19 Postgres ๋ถ€ํŒ… ์‹คํŒจ๋กœ ๊ณ ์นจ).\n *\n * `datetime` ์€ sqliteยทMySQL ์˜ ์ด๋ฆ„์ด๊ณ  Postgres ๋Š” `timestamp` ๋งŒ ์•ˆ๋‹ค โ€” ๊ฑฐ๊พธ๋กœ `timestamp` ๋Š”\n * sqlite ๊ฐ€ ๋ชจ๋ฅธ๋‹ค. **๋‹ค์„ฏ ๋“œ๋ผ์ด๋ฒ„์— ๋‹ค ํ†ตํ•˜๋Š” ์ด๋ฆ„์ด ์—†๋‹ค.** ๊ทธ๋ž˜์„œ ์ด๋ฆ„ ๊ณ ๋ฅด๋Š” ์ผ์„ TypeORM ์—\n * ๋งก๊ธด๋‹ค(`emitDecoratorMetadata` ๊ฐ€ ์ผœ์ ธ ์žˆ์–ด `Date` ์—์„œ ๋“œ๋ผ์ด๋ฒ„๋ณ„ ํƒ€์ž…์„ ๊ณ ๋ฅธ๋‹ค).\n */\n @Column()\n @Field({ description: 'When this row was projected from the source.' })\n ingestedAt: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"twin-model-item-query.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-model-item-query.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReadBasis } from '@operato/ops-contract'\n\nimport { twinWarn } from '../../engine/log.js'\nimport { Arg, Ctx, Int, Query, Resolver, UseMiddleware } from 'type-graphql'\n\nimport { ScalarObject, SpeakRefusals, getRepository } from '@things-factory/shell'\n\nimport { itemRefOf } from './item-ref.js'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { unwrapState } from '../../engine/warm-start.js'\nimport { propertyEffectsOf } from '../../engine/property-effects.js'\n/* ์ถ•์ด ์‚ฌ๋Š” ์ž๋ฆฌ๋ฅผ ์ฝ๋Š” **ํ•œ ๊ณณ** โ€” ์นด๋“œ(`twin-model-query`)์™€ ๊ฐ™์€ ๊ทœ์น™์„ ์“ด๋‹ค. */\nimport { axisValueOf } from '@things-factory/headless-twin/dist-shared/axis-read.js'\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinLocation } from './twin-location.js'\nimport { TwinEquipment } from './twin-equipment.js'\nimport { TwinOperation } from './twin-operation.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\nimport { at, idOf, nameIndex, namesFor } from './name-index.js'\n\n/* ์ปค๋„ ๋Ÿฐํƒ€์ž„ ๋กœ๋“œ โ€” ์ถ•ยท๊ด€๊ณ„ยท์†์„ฑ ์„ ์–ธ์˜ SSOT. ์ด ํŒŒ์ผ์€ ๋„๋ฉ”์ธ ๋ชจ์–‘์„ ์•Œ์ง€ ์•Š๋Š”๋‹ค. */\nconst { TWIN_AXES, TWIN_RELATIONS, axisInfo, axisSource, documentPath, isCacheableTense, relationsFrom, relationsTo, propertiesOf, splitRelationIds, tenseOf } =\n require('@operato/ops-contract')\n\n/**\n * ๋ชฉ๋ก์˜ ๋‹ต โ€” **๊ทผ๊ฑฐ๋Š” ๊ณ„์•ฝ์ด ๋‹ซ์•„ ๋‘” ๋‹ค์„ฏ ์ค‘ ํ•˜๋‚˜๋‹ค**(`READ_BASIS`).\n *\n * 2026-09-18 ํŒ์ •(ADR-0075 ๊ฒฐ์ • 3 ์„ ์ฝ”๋“œ์— ๋Œ€์–ด ๋ณธ ๊ฒฐ๊ณผ): ์ด ๋ฌธ์ด `'rows-scanned'` ๋ฅผ ๋‚ด๊ณ  ์žˆ์—ˆ๋‹ค.\n * ๊ทธ๊ฒƒ์€ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹ˆ๋ผ **์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์…Œ๋‚˜**์ด๊ณ , ๋ชฉ๋ก ์†Œ๋น„์ž๊ฐ€ ๊ทผ๊ฑฐ๋กœ ๊ฐˆ๋ž˜๋ฅผ ๋‚˜๋ˆŒ ๋•Œ ๊ณ„์•ฝ์— ์—†๋Š”\n * ๊ฐ’์„ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค. ์ถœ์ฒ˜๋Š” `rows` ์ด๊ณ , ํ›‘์–ด ๊ฑธ๋ €๋‹ค๋Š” ์‚ฌ์‹ค์€ `scanned` ยท `truncated` ๊ฐ€ ๋งํ•œ๋‹ค.\n * ์—ฌ๊ธฐ์— ์นธ์„ ๋ฌถ์–ด ๋‘๋ฉด ๊ณ„์•ฝ ๋ฐ–์˜ ๊ฐ’์ด ๋‹ค์‹œ ์ƒ๊ธธ ๋•Œ ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ์žก๋Š”๋‹ค.\n */\ntype AxisListAnswer = {\n axis: string\n label: string\n basis: ReadBasis\n total: number | null\n offset: number\n /** ํ›‘์–ด ์„ผ ๊ฒฝ์šฐ์—๋งŒ โ€” ๋ช‡ ์ค„์„ ์ฝ์—ˆ๋‚˜, ์ƒํ•œ์—์„œ ์ž˜๋ ธ๋‚˜. */\n scanned?: number\n truncated?: boolean\n [key: string]: unknown\n}\nimport { externalIncoming, resolveExternal } from './external-resolver.js'\n\n/**\n * ์ถ• โ†’ ๊ทธ ์ถ•์ด ์ด๋ฏธ **ํ–‰์œผ๋กœ ์˜ฎ๊ฒจ์กŒ๋‚˜**, ๊ทธ๋ฆฌ๊ณ  ํ–‰์˜ ์–ด๋А ์ปฌ๋Ÿผ์ด id ์ธ๊ฐ€.\n *\n * ์˜ฎ๊ฒจ์ง„ ์ถ•์€ **DB ๊ฐ€ ํŽ˜์ด์ง•ํ•˜๊ณ  ์„ผ๋‹ค.** ์•„์ง์ธ ์ถ•์€ ๋ฌธ์„œ ๋ฐฐ์—ด์„ ์ฝ์–ด์•ผ ํ•˜๊ณ , ๊ทธ ์ฐจ์ด๋ฅผ ์‘๋‹ต์ด\n * `basis` ๋กœ ๋ฐํžŒ๋‹ค โ€” ๋ฐํžˆ์ง€ ์•Š์œผ๋ฉด \"์ด ์ถ•์€ ๊ฒ€์ƒ‰์ด ๋˜๋Š”๋ฐ ์ € ์ถ•์€ ์™œ ๋А๋ฆฐ๊ฐ€\" ๋ฅผ ์•„๋ฌด๋„ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋‹ค.\n */\nconst ROW_BACKED: Record<string, { entity: any; idColumn: string; order: any }> = {\n locations: { entity: TwinLocation, idColumn: 'locationId', order: { locationId: 'ASC' } },\n equipment: { entity: TwinEquipment, idColumn: 'equipmentId', order: { equipmentId: 'ASC' } },\n operations: { entity: TwinOperation, idColumn: 'operationKey', order: { seq: 'ASC' } }\n}\n\n/*\n * `productionSpec.binding` ์˜ ํ‚ค๊ฐ€ ์‚ฌ๋Š” ์ถ• โ€” ์ž์žฌ๊ฐ€ ๋‘˜๋กœ ๊ฐˆ๋ ค ์žˆ๋‹ค.\n *\n * materials productionSpec.definition.materials ๋ ˆ์‹œํ”ผ์˜ ํˆฌ์ž… ์ž์žฌ\n * materialDefinitions materialDefinitions ๋งˆ์Šคํ„ฐ ํ’ˆ๋ชฉ ๋ชฉ๋ก\n *\n * ์˜ˆ์ „์—๋Š” `materials` ํ•˜๋‚˜๋งŒ ๋ดค๋‹ค. ์ปค๋„ฅํ„ฐ์— ๋”ฐ๋ผ `binding` ํ‚ค๊ฐ€ ์–ด๋А ์ถ•์˜ id ์ธ์ง€ ๋‹ฌ๋ผ์„œ, MES ์—ฐ๊ฒฐ\n * ๋‘˜์€ ํ’ˆ๋ชฉ์ด ์ž๊ธฐ GS1 ์ฐธ์กฐ๋ฅผ ํ•œ ๊ฑด๋„ ๋‹ตํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์˜ค๋ฅ˜๋Š” ์•ˆ ๋‚˜๊ณ  ์นธ์ด ๋น„์–ด์„œ ๋‚˜์˜จ๋‹ค.\n *\n * ์‹ค์ธก(2026-09-06, ์ธํ‹ฐ๊ทธ๋ ˆ์ด์…˜ ๋ ˆ์ธ์ด ์ฐพ์Œ):\n *\n * ํŠธ์œˆ binding def.materials ๋งž์Œ materialDefinitions ๋งž์Œ\n * mes-miratek 106 0 106\n * mes-line-a 21 0 21\n * operato-chef-v1-pocheon 2789 1789 0\n * rosarito-mes 20 20 0\n *\n * **๋‘ ์ถ•์ด ๋™์‹œ์— ๋งž๋Š” ํŠธ์œˆ์€ ์—†๋‹ค**(์–‘์ชฝ id ์— ๋‹ค ์žˆ์œผ๋ฉด์„œ binding ํ‚ค์ธ ๊ฒƒ 0๊ฐœ). ๊ทธ๋ž˜์„œ ๋‘ ์ถ•์—\n * ๋‹ค ๊ฑธ์–ด๋„ ์–ด๋А ์ชฝ์„ ๋ถ™์ผ์ง€ ๋ชจํ˜ธํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค. ์กฐํšŒ๊ฐ€ ํŒ์ •ํ•œ๋‹ค โ€” `binding[id]` ๋Š” ํ‚ค๊ฐ€ ์•„๋‹Œ ์ถ•์—์„œ\n * ๊ทธ๋ƒฅ ์—†๋‹ค.\n *\n * ๋‘ ์ถ•์„ ํ•œ ์ด๋ฆ„์œผ๋กœ ํ•ฉ์น˜์ง€ ์•Š๋Š”๋‹ค. ๋ ˆ์‹œํ”ผ ํˆฌ์ž… ์ž์žฌ์™€ ๋งˆ์Šคํ„ฐ ํ’ˆ๋ชฉ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์ด๊ณ , ํ•ฉ์น˜๋ฉด\n * ๋‘˜ ๋‹ค ์žˆ๋Š” ํŠธ์œˆ(chef)์—์„œ ์–ด๋А ์ชฝ ๋ชฉ๋ก์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.\n */\nconst BINDING_AXES = new Set(['materials', 'materialDefinitions'])\n\n\n/** ๊ฒ€์ƒ‰ โ€” ํ•ญ๋ชฉ์˜ ๊ฐ’ ์–ด๋””๋“  ๊ฑธ๋ฆฌ๋ฉด ๋งž๋Š” ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค. ์ถ•๋งˆ๋‹ค ๊ฒ€์ƒ‰ ์ปฌ๋Ÿผ์„ ์ •ํ•ด ๋‘๋ฉด ์ถ•์ด ๋Š˜ ๋•Œ๋งˆ๋‹ค ์—ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค. */\nfunction matches(o: any, q: string): boolean {\n if (!q) return true\n const needle = q.toLowerCase()\n const walk = (v: any, depth: number): boolean => {\n if (v == null || depth > 3) return false\n if (typeof v === 'string' || typeof v === 'number') return String(v).toLowerCase().includes(needle)\n if (Array.isArray(v)) return v.some(x => walk(x, depth + 1))\n if (typeof v === 'object') return Object.values(v).some(x => walk(x, depth + 1))\n return false\n }\n return walk(o, 0)\n}\n\n/**\n * ํ•ญ๋ชฉ ์กฐํšŒ โ€” **๊ฐœ๋… ์•ˆ์˜ ๋ชฉ๋ก**(โ‘ข)๊ณผ **ํ•ญ๋ชฉ ํ•˜๋‚˜์˜ ์ƒ์„ธ**(โ‘ฃ).\n *\n * โ”€โ”€ ์ด ํŒŒ์ผ์ด ๋„๋ฉ”์ธ์„ ์•Œ์ง€ ์•Š๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์–ด๋А ์ถ•์ด ์žˆ๊ณ  ๋ฌด์—‡์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€๋Š” **์ปค๋„ ์นดํƒˆ๋กœ๊ทธ๊ฐ€ ์„ ์–ธ**ํ•œ๋‹ค(`TWIN_AXES`ยท`TWIN_RELATIONS`).\n * ๊ทธ๋ž˜์„œ ์•ผ๋“œ์˜ ๋„ํฌ๋„์–ด๋‚˜ ์—๋„ˆ์ง€์˜ ๊ณ„๋Ÿ‰๊ธฐ๊ฐ€ ๋Š˜์–ด๋„ ์—ฌ๊ธฐ ์†๋Œˆ ๊ฒƒ์ด ์—†๋‹ค(ADR-0031). ์ด ํŒŒ์ผ์—\n * ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ํ•œ ๋ฒˆ๋„ ๋‚˜์˜ค์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ทธ ์ฆ๊ฑฐ๋‹ค.\n *\n * โ”€โ”€ ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ์ž๋ฅด์ง€ ์•Š๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๋ชฉ๋ก์€ ํ•ญ์ƒ **์ด ๊ฑด์ˆ˜**์™€ ํ•จ๊ป˜ ์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์…Œ๋Š”์ง€(`basis`)๋ฅผ ๋ฐํžŒ๋‹ค โ€” ํ–‰์ด๋ฉด DB ๊ฐ€\n * ํŽ˜์ด์ง•ํ–ˆ๊ณ , ๋ฌธ์„œ๋ฉด ์„œ๋ฒ„๊ฐ€ ๋ฌธ์„œ๋ฅผ ํ†ต์งธ๋กœ ์ฝ์–ด ์ž˜๋ผ ๋ƒˆ๋‹ค. ํ›„์ž๋Š” ๊ทœ๋ชจ์—์„œ ํ•œ๊ณ„๊ฐ€ ๋˜๋ฏ€๋กœ ๊ทธ ์‚ฌ์‹ค์ด\n * ํ™”๋ฉด์— ๋“œ๋Ÿฌ๋‚˜์•ผ ์ด์ฃผ ์••๋ ฅ์ด ์‚ด์•„ ์žˆ๋‹ค.\n */\n@Resolver()\n@UseMiddleware(SpeakRefusals)\nexport class TwinModelItemQuery {\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'Page through the items of one standard concept in a twin. Always returns the total and how it was counted (rows = the database paged it, document = the server read the whole document and sliced).'\n })\n async twinModelEntities(\n @Arg('instanceId') instanceId: string,\n @Arg('axis') axis: string,\n @Ctx() context: ResolverContext,\n @Arg('search', { nullable: true }) search?: string,\n @Arg('offset', type => Int, { nullable: true }) offset?: number,\n @Arg('limit', type => Int, { nullable: true }) limit?: number,\n /**\n * ์–ด๋А ์‹œ๊ฐ์˜ ์‚ฌ์‹ค์ธ๊ฐ€ โ€” **๊ด€์ธก ์ถ•์—๋งŒ ๋œป์ด ์žˆ๋‹ค.**\n *\n * ์„ ์–ธ ์ถ•์€ ์‹œ๊ฐ„์ถ•์ด ์—†๋‹ค(๊ทธ ์‹œ์ ์˜ ์„ ์–ธ์€ ๊ตฌ์กฐ ๋ฆฌ๋น„์ „์ด ๋‹ตํ•œ๋‹ค). ๊ทธ๋ž˜์„œ ๋ฌธ์„œ ์ถ•์— ์ด ๊ฐ’์„ ์ฃผ๋ฉด\n * ์“ฐ์ง€ ์•Š๋Š”๋‹ค โ€” ๋ฌด์‹œํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์‘๋‹ต์˜ `basis` ๊ฐ€ ๋งํ•œ๋‹ค(`document`).\n */\n @Arg('untilTime', { nullable: true }) untilTime?: string\n ): Promise<any | null> {\n const domainId = context.state.domain.id\n const info = axisInfo(axis)\n /* ๋ชจ๋ฅด๋Š” ์ถ•์€ **๊ฑฐ์ ˆํ•œ๋‹ค.** ๋นˆ ๋ชฉ๋ก์œผ๋กœ ๋‹ตํ•˜๋ฉด \"์ด ๊ฐœ๋…์€ ๋น„์–ด ์žˆ๋‹ค\" ๋กœ ์ฝํžˆ๊ณ , ์˜คํƒ€ ํ•˜๋‚˜๊ฐ€\n \"์šฐ๋ฆฌ ํŠธ์œˆ์—๋Š” ๊ทธ๊ฒŒ ์—†๋‹ค\" ๋Š” ๊ฒฐ๋ก ์œผ๋กœ ๊ตณ๋Š”๋‹ค. */\n if (!info) throw new Error(`unknown concept axis: \"${axis}\" โ€” the kernel catalog does not declare it`)\n\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return null\n\n const take = Math.min(Math.max(limit ?? 50, 1), 200)\n const skip = Math.max(offset ?? 0, 0)\n const q = (search ?? '').trim()\n /* ์‹œ๊ฐ ์ปค์„œ๋Š” ์‹œ๊ฐ„์ถ•์„ ๊ฐ€์ง„ ์ถ•๋งŒ ์“ด๋‹ค(`historical`) โ€” ์„ ์–ธ ์ถ•์—์„œ๋Š” ๋œป์ด ์—†๋‹ค. */\n const at_ = axisInfo(axis)?.historical ? untilTime || null : null\n const row = ROW_BACKED[axis]\n\n if (row && !q) {\n /* ๊ฒ€์ƒ‰์–ด๊ฐ€ ์—†์œผ๋ฉด **DB ๊ฐ€ ํŽ˜์ด์ง•ํ•œ๋‹ค** โ€” ์ด๊ฒƒ์ด ๊ทœ๋ชจ์—์„œ ์œ ์ผํ•˜๊ฒŒ ์„ฑ๋ฆฝํ•˜๋Š” ๊ธธ์ด๋‹ค. */\n const repo = getRepository(row.entity)\n const where = { domain: { id: domainId } as any, instance: { id: inst.id } as any }\n const [rows, total] = await repo.findAndCount({ where, order: row.order, skip, take })\n const answer: AxisListAnswer = {\n axis,\n label: info.label,\n basis: 'rows',\n total,\n offset: skip,\n /* ๋ชฉ๋ก๋„ ๋“ฑ๊ธ‰ ์ด๋ฆ„์„ ์“ด๋‹ค โ€” ๋ชฉ๋ก ์นธ์— `assembler-op` ์ด ๊ทธ๋Œ€๋กœ ์„œ๋ฉด ๋ชฉ๋ก์ด ์ œ ์ผ์„ ๋ชป ํ•œ๋‹ค. */\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n items: rows.map((r: any) => this.rowItem(axis, r))\n }\n return answer\n }\n\n if (row && q) {\n /*\n * ๊ฒ€์ƒ‰์€ ์•„์ง DB ๋กœ ๋‚ด๋ฆฌ์ง€ ์•Š์•˜๋‹ค. **๊ทธ ์‚ฌ์‹ค์„ ๋ฐํžŒ๋‹ค** โ€” ํ‰๋‚ด๋กœ ๋ฎ์œผ๋ฉด ๊ทœ๋ชจ๊ฐ€ ์˜ค๋Š” ๋‚ ๊นŒ์ง€\n * ์•„๋ฌด๋„ ์ด ํ•œ๊ณ„๋ฅผ ๋ชจ๋ฅธ๋‹ค. ํ›‘๋Š” ๊ฑด์ˆ˜๋ฅผ ์ƒํ•œ์œผ๋กœ ๋ง‰๊ณ , ์ƒํ•œ์— ๋‹ฟ์•˜์œผ๋ฉด ์ž˜๋ ธ๋‹ค๊ณ  ๋งํ•œ๋‹ค\n * (์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ์ž๋ฅด์ง€ ์•Š๋Š”๋‹ค).\n *\n * ๋งํ•˜๋Š” ์ž๋ฆฌ๋Š” `scanned` ยท `truncated` ๋‹ค. ๊ทผ๊ฑฐ(`basis`)๋Š” ๊ทธ๋Œ€๋กœ `rows` ์ด๊ณ  โ€” ๊ฐ’์ด ์–ด๋””์„œ\n * ์™”๋Š”์ง€๋Š” ํ›‘์—ˆ๋“  DB ๊ฐ€ ๊ณจ๋ž๋“  ๊ฐ™์€ ํ–‰์ด๋‹ค โ€” ๊ณ„์•ฝ์ด ๋‹ซ์•„ ๋‘” ๋‹ค์„ฏ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€์ง€ ์•Š๋Š”๋‹ค.\n */\n const SCAN_MAX = 5000\n const repo = getRepository(row.entity)\n const where = { domain: { id: domainId } as any, instance: { id: inst.id } as any }\n const rows = await repo.find({ where, order: row.order, take: SCAN_MAX })\n const hit = rows.filter((r: any) => matches(this.rowItem(axis, r), q))\n const answer: AxisListAnswer = {\n axis,\n label: info.label,\n basis: 'rows',\n total: hit.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n scanned: rows.length,\n truncated: rows.length >= SCAN_MAX,\n ...(() => {\n const items = hit.slice(skip, skip + take).map((r: any) => this.rowItem(axis, r))\n return { items, names: namesFor(items, nameIndex(inst.model ?? {})) }\n })()\n }\n return answer\n }\n\n /*\n * **์„ ์–ธ์ด ์•„๋‹Œ ์ถ•** โ€” ์ผ์ •ยท์‹ค์ (ISA-95 Part 4). ์ด ์ถ•์˜ ์ง‘์€ ํŠธ์œˆ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ **์ปค๋„ ์ƒํƒœ**๋‹ค\n * (์ปค๋„์ด `source: 'state'` ๋กœ ์„ ์–ธํ•œ๋‹ค).\n *\n * โ”€โ”€ ๋ฉˆ์ถ˜ ํŠธ์œˆ์€ 0 ์ด ์•„๋‹ˆ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ปค๋„์ด ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ด€์ธก์ด **์—†๋‹ค**. ๊ทธ๋•Œ ๋นˆ ๋ชฉ๋ก์„ ๋‚ด๋ฉด \"์ž‘์—…์ด 0 ๊ฑด\" ์œผ๋กœ ์ฝํžˆ๊ณ , ๊ทธ๊ฑด\n * ๊ฑฐ์ง“์ด๋‹ค โ€” ์ด ํ™”๋ฉด์ด ๊ด€์ธก ์—ด์—์„œ ๋‚ด๋‚ด ์ง€์ผœ ์˜จ ๊ตฌ๋ถ„(๊ด€์ธก ์—†์Œ โ‰  0)์„ ๋ชฉ๋ก์—์„œ๋„ ์ง€ํ‚จ๋‹ค.\n *\n * โ”€โ”€ ๊ทœ๋ชจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ƒํƒœ ๋ฐฐ์—ด์€ ์ง€๊ธˆ์˜ ์‚ฌ์‹ค๋งŒ ๋‹ด์•„ ์œ ํ•œํ•˜๋‹ค(์ง„ํ–‰ ์ค‘ ์˜ค๋”ยท์ž‘์—…). ๊ณผ๊ฑฐ๊นŒ์ง€ ์„ธ๋Š” ๊ฒƒ์€ ์ €๋„์˜ ์ผ์ด๊ณ \n * ์ปค์„œ ํŽ˜์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค โ€” ๊ทธ๊ฑด `historical` ์ถ•์˜ ํ›„์†์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ ํ‰๋‚ด๋‚ด์ง€ ์•Š๋Š”๋‹ค.\n */\n if (axisSource(axis) === 'state') {\n /* ๋ด‰ํˆฌ๋ฅผ ๋ฒ—๊ธด๋‹ค โ€” `{revision, state}` ์•ˆ์— ์ถ•์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  **์‹คํ–‰ ์ค‘์ผ ๋•Œ๋งŒ** ๊ด€์ธก์ด๋‹ค. */\n /*\n * **๋ผ์ด๋ธŒ๋Š” ๊ถŒ์œ„, ํžˆ์Šคํ† ๋ฆฌ๋Š” ํŒŒ์ƒ.**\n *\n * ์ง€๊ธˆ ๋„๋Š” ์ปค๋„์˜ ์ƒํƒœ๊ฐ€ ์ด ์ถ•์˜ ์ง„์‹ค์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ปค๋„์ด ๋ฉˆ์ถฐ ์žˆ๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ **๊ณผ๊ฑฐ ์‹œ๊ฐ**์„\n * ๋ฌผ์œผ๋ฉด ๋‹ตํ•  ๊ฒƒ์ด ์—†์–ด์ง„๋‹ค โ€” ๊ทธ๋•Œ ์ €๋„์„ ๊ทธ ์‹œ์ ๊นŒ์ง€ ๊ณ„์‚ฐํ•ด ๋‹ตํ•œ๋‹ค(`recover`). ๋‘˜์€ ๊ฐ™์€ ๋ชจ์–‘์ด์ง€๋งŒ\n * **์„ฑ์งˆ์ด ๋‹ค๋ฅด๋ฏ€๋กœ `basis` ๋กœ ๊ตฌ๋ณ„ํ•ด ๋‚ธ๋‹ค**: ํŒŒ์ƒ์„ ๊ถŒ์œ„์ฒ˜๋Ÿผ ๋‚ด๋ฉด ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ณด๊ณ  \"์ง€๊ธˆ ์ด๋ ‡๋‹ค\"\n * ๋กœ ์ฝ๊ฒŒ ๋œ๋‹ค.\n *\n * ๊ทœ๋ชจ: ๊ณ„์‚ฐ ๋น„์šฉ์€ ์ด๋ฒคํŠธ ์ˆ˜์— ๋น„๋ก€ํ•œ๋‹ค. ๊ฐ์ถ”์ง€ ์•Š๊ณ  **์–ด๋А ๋ฆฌ๋น„์ „๊นŒ์ง€ ๊ณ„์‚ฐํ–ˆ๋Š”์ง€ ํ•จ๊ป˜ ๋‚ธ๋‹ค** โ€”\n * ์ด ํ™”๋ฉด์ด ๋ชฉ๋ก๋งˆ๋‹ค `basis` ๋ฅผ ๋ฐํ˜€ ์˜จ ๊ทœ์œจ ๊ทธ๋Œ€๋กœ๋‹ค.\n */\n const live = TwinEngine.isRunning(domainId, instanceId) && !at_\n let snap = live ? unwrapState(TwinEngine.snapshot(domainId, instanceId)) : null\n let folded: number | undefined\n if (!snap) {\n try {\n const rec = await TwinEngine.recover(domainId, instanceId, undefined, at_ ?? undefined)\n snap = unwrapState(rec)\n folded = Number((rec as any)?.revision) || undefined\n } catch {\n /* ๋‹ค์‹œ ๊ณ„์‚ฐํ•  ๊ฒƒ์ด ์—†๋‹ค(๋ชจ๋ธ๋„ ์ €๋„๋„ ์—†๋‹ค) โ€” ์—†๋Š” ๊ฒƒ์„ 0 ์œผ๋กœ ๋ฉ”์šฐ์ง€ ์•Š๋Š”๋‹ค. */\n snap = null\n }\n }\n if (!snap) {\n return { axis, label: info.label, basis: 'state', total: null, observed: false, offset: skip, items: [] }\n }\n /* ์ถ•์ด ์‚ฌ๋Š” ์ž๋ฆฌ๋Š” **์ปค๋„ ์„ ์–ธ์ด ๋งํ•œ๋‹ค**(`path`) โ€” ์ถ• ์ด๋ฆ„์œผ๋กœ๋งŒ ์ฝ์œผ๋ฉด ์ค‘์ฒฉ๋œ ์ถ•์ด ์–ธ์ œ๋‚˜\n ๋น„์–ด ๋ณด์ธ๋‹ค. ์นด๋“œ๋Š” `axisValueOf` ๋กœ ์ฝ๋Š”๋ฐ ์—ฌ๊ธฐ๊ฐ€ ๊ทธ ๊ทœ์น™์„ ์ง€๋‚˜์ง€ ์•Š์•„, ใ€Œ42ใ€๋ฅผ ์„ผ ๊ฐœ๋…์˜\n ๋ชฉ๋ก์ด ใ€Œ0๊ฑดใ€์œผ๋กœ ๋‚˜์™”๋‹ค(์—๋„ˆ์ง€์˜ ์ˆ˜์š” ๊ตฌ๊ฐ„). ๊ทœ์น™์˜ ์ง‘์€ `axisValueOf` ํ•˜๋‚˜๋‹ค. */\n const bucket = axisValueOf(snap, info)\n const list: any[] = Array.isArray(bucket) ? bucket : []\n const hitState = q ? list.filter(o => matches(o, q)) : list\n const items = hitState\n .slice(skip, skip + take)\n .map(o => ({ id: idOf(o, info), fields: this.withOrderMaterial(axis, inst.model ?? {}, o) }))\n return {\n axis,\n label: info.label,\n /* ๊ถŒ์œ„(๋ผ์ด๋ธŒ)์™€ ํŒŒ์ƒ(์ €๋„)์„ ๊ตฌ๋ณ„ํ•ด ๋‚ธ๋‹ค โ€” ํ™”๋ฉด์ด ์ด ๋‚ฑ๋ง์„ ๊ทธ๋Œ€๋กœ ๋ณด์ธ๋‹ค. */\n basis: live ? 'state' : 'journal',\n ...(folded != null ? { foldedRevision: folded } : {}),\n ...(at_ ? { at: at_ } : {}),\n observed: true,\n total: hitState.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n items,\n names: namesFor(items, nameIndex(inst.model ?? {}))\n }\n }\n\n /* ์•„์ง ๋ฌธ์„œ ์•ˆ์— ์‚ฌ๋Š” ์ถ• โ€” ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ์ž๋ฅธ๋‹ค. ๊ทœ๋ชจ ํ•œ๊ณ„๋ฅผ `basis` ๋กœ ๋“œ๋Ÿฌ๋‚ธ๋‹ค. */\n const raw = at(inst.model ?? {}, documentPath(axis))\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n const hit = q ? all.filter(o => matches(o, q)) : all\n return {\n axis,\n label: info.label,\n basis: 'document',\n total: hit.length,\n offset: skip,\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n ...(() => {\n /*\n * **ํ•œ ๋ฒŒ๋ฟ์ธ ์„ ์–ธ์€ ์ถ• ์ด๋ฆ„์ด ๊ณง ์‹๋ณ„์ž๋‹ค.**\n *\n * `productionSpec` ์ฒ˜๋Ÿผ ๋ฌธ์„œ์— ๊ฐ์ฒด ํ•˜๋‚˜๋กœ ์žˆ๋Š” ์ถ•์€ `id`/`key` ๊ฐ€ ์—†๋‹ค. ๊ทธ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ\n * ๋ชฉ๋ก์— ์‹ค์œผ๋ฉด \"์‹๋ณ„์ž ์—†์Œ โ€” ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค\" ๋ผ๋Š” ์ค„ ํ•˜๋‚˜๊ฐ€ ๋œจ๊ณ , ์ •์ž‘ ๊ทธ ์„ ์–ธ์„\n * ์—ด์–ด ๋ณผ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ํ•˜๋‚˜๋ฟ์ธ ๊ฒƒ์€ ์ถ• ์ž์‹ ์œผ๋กœ ๊ฐ€๋ฆฌํ‚จ๋‹ค(์ƒ์„ธ๋„ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ์ฐพ๋Š”๋‹ค).\n */\n const singular = !Array.isArray(raw) && !!raw\n const items = hit\n .slice(skip, skip + take)\n .map(o => ({ id: idOf(o) ?? (singular ? axis : null), fields: this.withBinding(axis, inst.model ?? {}, o) }))\n return { items, names: namesFor(items, nameIndex(inst.model ?? {})), singular }\n })()\n }\n }\n\n /**\n * ํ–‰์—์„œ **๋‚ด๋ถ€ ๋ฐฐ๊ด€์„ ๊ฑท์–ด๋‚ธ๋‹ค** โ€” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ๊ฒƒ์€ ํ˜„์žฅ์˜ ์‚ฌ์‹ค์ด์ง€ ์šฐ๋ฆฌ ์Šคํ‚ค๋งˆ๊ฐ€ ์•„๋‹ˆ๋‹ค.\n *\n * ์†์œผ๋กœ ๋ชฉ๋ก์„ ๋‘์ง€ ์•Š๋Š”๋‹ค. ๊ด€๊ณ„์™€ ๊ทธ ์กฐ์ธ ์ปฌ๋Ÿผ์ด ๋ฌด์—‡์ธ์ง€๋Š” **์—”ํ‹ฐํ‹ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ**๊ฐ€ ์•Œ๊ณ ,\n * ํ‘œ๋กœ ๋‘๋ฉด ์ปฌ๋Ÿผ์ด ๋Š˜ ๋•Œ๋งˆ๋‹ค ์—ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•˜๋ฉฐ ์žŠ์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์ƒˆ์–ด ๋‚˜๊ฐ„๋‹ค โ€” ์‹ค์ œ๋กœ\n * `domainId`ยท`instanceRowId` ๊ฐ™์€ ๋‚ด๋ถ€ UUID ๊ฐ€ ํ™”๋ฉด๊นŒ์ง€ ๊ฐ”๋‹ค.\n *\n * ์‹๋ณ„์ž๋„ ๋บ€๋‹ค: ํ•ญ๋ชฉ ์ž์‹ ์˜ id ๋Š” ์ด๋ฏธ `id`/`itemId` ๋กœ ๋‚˜๊ฐ€๋ฏ€๋กœ ๋‘ ๋ฒˆ ๋ณด์ผ ์ด์œ ๊ฐ€ ์—†๋‹ค.\n */\n private strip(entityClass: any, idColumn: string, r: any): any {\n const meta = getRepository(entityClass).metadata\n const hidden = new Set<string>(['id', 'createdAt', 'updatedAt', 'creator', 'updater', 'creatorId', 'updaterId', idColumn])\n for (const rel of meta.relations) {\n hidden.add(rel.propertyName)\n for (const jc of rel.joinColumns) hidden.add(jc.propertyName)\n }\n /* `@RelationId` ๋กœ ์Šน๊ฒฉํ•œ ๋‚ด๋ถ€ UUID(`domainId`ยท`instanceRowId`ยท`areaRowId`) โ€” ๊ด€๊ณ„ ๋ชฉ๋ก์—๋Š” ์—†๊ณ \n ์—ฌ๊ธฐ์—๋งŒ ์žˆ๋‹ค. ์ด ํ•œ ์ค„์ด ์—†์–ด์„œ ์‹ค์ œ๋กœ ํ™”๋ฉด๊นŒ์ง€ ์ƒœ๋‹ค. */\n for (const rid of meta.relationIds) hidden.add(rid.propertyName)\n const out: any = {}\n for (const [k, v] of Object.entries(r)) if (!hidden.has(k)) out[k] = v\n return out\n }\n\n\n /**\n * **์ž์žฌ๋Š” ์ž๊ธฐ GS1 ํ’ˆ๋ชฉ ์ฐธ์กฐ๋ฅผ ์•ˆ๋‹ค** โ€” ์ฝ๊ธฐ ๊ฒฝ๊ณ„์—์„œ ์ด์–ด ๋ถ™์ธ๋‹ค.\n *\n * ์ •๋ณธ์€ `productionSpec.binding` ํ•˜๋‚˜๋‹ค(์ปค๋„์ด EPCโ†”์ž์žฌ๋ฅผ ๊ทธ ํ‘œ๋กœ ์ž‡๋Š”๋‹ค). ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ์‚ฌ์‹ค์€\n * **์ž์žฌ๋งˆ๋‹ค์˜ ์†์„ฑ**์ด๋‹ค: ์ด ์ž์žฌ๊ฐ€ GS1 ํ’ˆ๋ชฉ ๋ช‡ ๋ฒˆ์ธ๊ฐ€, ๊ทธ๋ž˜์„œ ๊ฐœ์ฒด๋กœ ์ถ”์ ๋˜๋Š”๊ฐ€(= ๊ณ„๋ณด๋ฅผ ๋น„๊ตํ• \n * ์ˆ˜ ์žˆ๋Š”๊ฐ€). ์ž์žฌ ๋ชฉ๋ก์— ๊ทธ๊ฒƒ์ด ์—†์œผ๋ฉด ์ž์žฌ๋Š” ์ž๊ธฐ ์ •์ฒด๋ฅผ ๋ชจ๋ฅด๊ณ , ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์‚ฌ์‹ค์„ ๋”ด ์ถ•์—์„œ\n * ์ฐพ์•„์•ผ ํ•œ๋‹ค.\n *\n * ๊ทธ๋ž˜์„œ **์ €์žฅ์€ ํ•œ ๊ณณ(binding), ํ‘œ์‹œ๋Š” ์ฝ๋Š” ์ž๋ฆฌ์—์„œ ์ด์–ด ๋ถ™์ž„** โ€” ์ด๋ฆ„ํ‘œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์ด๋‹ค.\n * ๊ฐ’์„ ๋ณต์ œํ•ด ๋‘๋ฉด ๋‘ ๊ณณ์ด ์–ด๊ธ‹๋‚˜๊ณ , ์–ด๊ธ‹๋‚œ ์ชฝ์„ ์•„๋ฌด๋„ ๋ชจ๋ฅธ๋‹ค.\n */\n private withBinding(axis: string, model: any, fields: any): any {\n if (!BINDING_AXES.has(axis) || !fields || typeof fields !== 'object') return fields\n const binding: Record<string, string> = model?.productionSpec?.binding ?? {}\n const ref = binding[fields.key ?? fields.id]\n /* ์—†์œผ๋ฉด ํ‚ค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค โ€” ๋นˆ ๊ฐ’์ด ์žˆ๋Š” ๊ฒƒ๊ณผ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋‹ค๋ฅด๋‹ค. */\n return ref ? { ...fields, gs1Ref: ref } : fields\n }\n\n /**\n * **์˜ค๋”๊ฐ€ ๋ฌด์—‡์„ ๋งŒ๋“œ๋‚˜** โ€” GS1 ํ’ˆ๋ชฉ ์ฐธ์กฐ๋ฅผ ์ž์žฌ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด ๋ถ™์ธ๋‹ค.\n *\n * ์ปค๋„์˜ ์˜ค๋”๋Š” ํ’ˆ๋ชฉ์„ GS1 ์œผ๋กœ ๋งํ•œ๋‹ค(`urn:epc:idpat:sgtin:0614141.078101.*`). ์‚ฌ๋žŒ์—๊ฒŒ ๊ทธ ๋ฌธ์ž์—ด์€\n * ์•„๋ฌด ๋œป์ด ์—†๊ณ , ๊ทธ ํ’ˆ๋ชฉ์˜ ์ด๋ฆ„์€ **์ž์žฌ ์„ ์–ธ**์ด ๊ฐ–๊ณ  ์žˆ๋‹ค. ๋‘˜์„ ์ž‡๋Š” ๊ฒƒ์€ `productionSpec.binding`\n * (์ž์žฌ ํ‚ค โ†’ ํ’ˆ๋ชฉ ์ฐธ์กฐ)์ด๋ฏ€๋กœ **์—ญ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ๋‹ค.**\n *\n * ์ •๋ณธ์€ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค: `gtin` ์€ ์ปค๋„์ด ๋งํ•œ ๊ฐ’์ด๊ณ , ์—ฌ๊ธฐ์„œ ๋”ํ•˜๋Š” ๊ฒƒ์€ **์ž์žฌ ํ‚ค ํ•˜๋‚˜**๋‹ค(๊ทธ ์ด๋ฆ„์€\n * ์ด๋ฆ„ํ‘œ๊ฐ€ ๋ถ™์ธ๋‹ค โ€” ๊ฐ’์„ ๋ณต์ œํ•˜์ง€ ์•Š๋Š”๋‹ค). ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ๋ชปํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋”ํ•˜์ง€ ์•Š๋Š”๋‹ค: ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด\n * \"์ด ์˜ค๋”๋Š” ์ €๊ฒƒ์„ ๋งŒ๋“ ๋‹ค\" ๋Š” ๊ฑฐ์ง“์ด ๋˜๊ณ , ๊ทธ๊ฑด ๋ชจ๋ฅด๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜๋‹ค.\n */\n private withOrderMaterial(axis: string, model: any, fields: any): any {\n if (axis !== 'orders' || !fields || typeof fields !== 'object') return fields\n const binding: Record<string, string> = model?.productionSpec?.binding ?? {}\n const refToMaterial = new Map(Object.entries(binding).map(([mat, r]) => [String(r), mat]))\n /* ๋‹จ์ผ ํ’ˆ๋ชฉ ์ž‘์—…์ง€์‹œ๋Š” `gtin`, ์—ฌ๋Ÿฌ ํ’ˆ๋ชฉ์ด๋ฉด ๋ผ์ธ๋งˆ๋‹ค ๋งํ•œ๋‹ค โ€” ์ฒซ ๋ผ์ธ์œผ๋กœ ๋Œ€ํ‘œํ•˜์ง€ ์•Š๋Š”๋‹ค. */\n /* ์ •์ฒด์„ฑ ๋ชจ์–‘์€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋‹ค โ€” ๊ทœ์น™์˜ ์ง‘์€ `item-ref` ํ•˜๋‚˜๋‹ค(์›น URI ์›๋ณธ์—์„œ ์ด ์ž๋ฆฌ๊ฐ€ ์–ธ์ œ๋‚˜\n ๋นˆ์นธ์ด์—ˆ๋‹ค). */\n const refOf = itemRefOf\n const mat = refToMaterial.get(String(refOf(fields.gtin) ?? ''))\n if (mat) return { ...fields, material: mat }\n const lineMats = (fields.lines ?? [])\n .map((l: any) => refToMaterial.get(String(refOf(l?.gtin) ?? '')))\n .filter(Boolean)\n return lineMats.length ? { ...fields, materials: [...new Set(lineMats)] } : fields\n }\n\n /** ํ–‰ ํ•˜๋‚˜ โ†’ ๋ชฉ๋ก ํ•ญ๋ชฉ. ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ํ™”๋ฉด์ด ์•Œ์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ `id` + ๋‚˜๋จธ์ง€๋กœ ๋‚ธ๋‹ค. */\n private rowItem(axis: string, r: any): any {\n const { entity, idColumn } = ROW_BACKED[axis]\n return { id: r[idColumn], fields: this.strip(entity, idColumn, r) }\n }\n\n @Query(returns => ScalarObject, {\n nullable: true,\n description:\n 'One item of a standard concept: what the source declared, what the twin observed, what it links to and is linked from (declared relations, both directions), and where it came from. Never invents a value for a field the source did not provide.'\n })\n async twinModelItem(\n @Arg('instanceId') instanceId: string,\n @Arg('axis') axis: string,\n @Arg('itemId') itemId: string,\n @Ctx() context: ResolverContext\n ): Promise<any | null> {\n const domainId = context.state.domain.id\n const info = axisInfo(axis)\n if (!info) throw new Error(`unknown concept axis: \"${axis}\" โ€” the kernel catalog does not declare it`)\n\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return null\n\n const model = inst.model ?? {}\n const row = ROW_BACKED[axis]\n let declared: any = null\n let provenance: any = null\n\n /*\n * **๊ด€์ธก ์ถ•์˜ ์ƒ์„ธ** โ€” ์ผ์ •ยท์‹ค์ ์€ ์ƒํƒœ์—์„œ ์ฐพ๋Š”๋‹ค. ์ปค๋„์ด ๋ฉˆ์ถฐ ์žˆ์œผ๋ฉด ํ•ญ๋ชฉ์ด ์•„๋‹ˆ๋ผ **๋ชจ๋ฅธ๋‹ค**๋ฅผ\n * ๋‚ธ๋‹ค(๊ทธ ํŠธ์œˆ์— ๊ทธ ์˜ค๋”๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋‹ค โ€” ์ง€๊ธˆ ๊ด€์ธก์ด ์—†๋‹ค๋Š” ๋œป์ด๋‹ค).\n */\n if (axisSource(axis) === 'state') {\n /*\n * ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด **๋ชฉ๋ก๊ณผ ๊ฐ™์€ ๊ธธ๋กœ ์ €๋„์„ ๊ณ„์‚ฐํ•œ๋‹ค.**\n *\n * ๋ชฉ๋ก๋งŒ ๊ณ„์‚ฐํ•˜๊ณ  ์ƒ์„ธ๋Š” ์•ˆ ๊ณ„์‚ฐํ–ˆ๋”๋‹ˆ, ๋ชฉ๋ก์—๋Š” 472๊ฑด์ด ๋ณด์ด๋Š”๋ฐ ๊ทธ ์ค„์„ ์—ด๋ฉด \"์ž๊ธฐ ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค\"\n * ๊ฐ€ ๋‚˜์™”๋‹ค โ€” ํ•œ ํ™”๋ฉด์—์„œ ๋‘ ๋‹ต์ด ๊ฐˆ๋ฆฌ๋ฉด ์–ด๋А ์ชฝ์ด ๋งž๋Š”์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ ์ˆ˜ ์—†๋‹ค.\n */\n const liveItem = TwinEngine.isRunning(domainId, instanceId)\n let snap = liveItem ? unwrapState(TwinEngine.snapshot(domainId, instanceId)) : null\n if (!snap) {\n try {\n snap = unwrapState(await TwinEngine.recover(domainId, instanceId))\n } catch {\n /* ๋‹ค์‹œ ๊ณ„์‚ฐํ•  ๊ฒƒ์ด ์—†๋‹ค โ€” ์•„๋ž˜์—์„œ \"๋ชจ๋ฅธ๋‹ค\" ๋ฅผ ๋‚ธ๋‹ค(0 ์œผ๋กœ ๋ฉ”์šฐ์ง€ ์•Š๋Š”๋‹ค). */\n }\n }\n /* ๊ฐ™์€ ๊ทœ์น™ โ€” ์ถ• ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ๋œ ์ž๋ฆฌ์—์„œ ์ฝ๋Š”๋‹ค(ยงaxisValueOf). */\n const bucket = snap ? axisValueOf(snap, info) : null\n const found = Array.isArray(bucket) ? bucket.find((o: any) => idOf(o, info) === itemId) : undefined\n /*\n * **์ƒํƒœ๋ฅผ ์ฝ์—ˆ๋Š”๋ฐ ๊ทธ ๊ฐœ์ฒด๊ฐ€ ์—†์œผ๋ฉด, ๊ทธ๋Ÿฐ ๊ฐœ์ฒด๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค** (2026-09-18).\n *\n * ์ด ๊ฐˆ๋ž˜๊ฐ€ `!snap || !found` ํ•˜๋‚˜์˜€๋‹ค. ๊ทธ๋ž˜์„œ ์—†๋Š” ์‹๋ณ„์ž๋กœ ๋ฌผ์–ด๋„ ใ€ŒํŠธ์œˆ์ด ์‹ค์ œ๋กœ ๋ณธ ๊ฒƒ์ž…๋‹ˆ๋‹คใ€\n * ๋ผ๊ณ  ์ ํžŒ ํŒจ๋„์ด ๋Œ์•„์™”๋‹ค โ€” ํ™”๋ฉด์€ ๊ทธ๊ฒƒ์„ ๊ทธ๋ ค์„œ, ์žˆ์ง€๋„ ์•Š์€ ๊ฐœ์ฒด๊ฐ€ ๊ฐ’์ด ๋น„์–ด ์žˆ๋Š” ๊ฐœ์ฒด์ฒ˜๋Ÿผ\n * ๋ณด์˜€๋‹ค. ๋ฌธ์„œ ์ถ•์€ ๊ฐ™์€ ๋ฌผ์Œ์— `null` ์„ ๋‹ตํ•œ๋‹ค(์—†๋Š” ๊ฒƒ์€ ์—†๋‹ค๊ณ  ๋‹ตํ•œ๋‹ค). ์ƒํƒœ ์ถ•๋„ ๊ฐ™๋‹ค.\n *\n * ๋ชป ์ฝ์€ ๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ์‹ค์ด๋ผ ์•„๋ž˜์—์„œ ๋”ฐ๋กœ ๋‹ตํ•œ๋‹ค โ€” ใ€Œ์—†๋‹คใ€๋กœ ์ ‘์ง€ ์•Š๋Š”๋‹ค.\n */\n if (snap && !found) return null\n if (!snap) {\n return {\n instanceId, axis, label: info.label, itemId,\n identity: { standardClass: info.standardClass ?? null, typeRole: info.typeRole ?? null, kind: info.kind, gs1Scheme: info.gs1Scheme ?? null, journalAxis: info.journalAxis ?? null, describedBy: info.describedBy ?? null },\n declared: null,\n observed: null,\n observedOnly: true,\n /*\n * **์™œ ๊ด€์ธก ์—ด์ด ๋น„์—ˆ๋‚˜** โ€” ์ปค๋„์ด ๋ฉˆ์ถฐ ์žˆ๊ณ  ์ €๋„๋กœ๋„ ๋˜์„ธ์šฐ์ง€ ๋ชปํ–ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋ชฉ๋กยท๋น„๊ต ์—ด์ด\n * ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์“ด๋‹ค(`not-running`) โ€” ๊ฐ™์€ ์‚ฌ์‹ค์— ๋‘ ๋‚ฑ๋ง์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.\n */\n observedAbsence: 'not-running' as const,\n basis: liveItem ? 'state' : 'journal', observedBasis: liveItem ? 'state' : 'journal', observing: liveItem,\n links: { out: [], incoming: [] }, properties: propertiesOf(axis).map((pr: any) => ({ key: pr.key, label: pr.label, kind: pr.kind, uom: pr.uom ?? null, observedBy: pr.observedBy ?? null })),\n /* ์–ด๋–ค ์†์„ฑ์ด **ํšจ๊ณผ๊ฐ€ ์žˆ๋‚˜** โ€” ๋“ฑ๋ก๋ถ€๊ฐ€ ๋งํ•œ๋‹ค(ยงproperty-effects). ์—†๋Š” ๊ฒƒ์€ ํ‘œ์‹œ๋งŒ ๋œ๋‹ค. */\n propertyEffects: propertyEffectsOf(axis),\n /*\n * ์ถœ์ฒ˜๋Š” ์ด ๋‹ต์˜ `basis` ์™€ ๊ฐ™์€ ๊ทœ์น™์ด๋‹ค(์•„๋ž˜ ์ฝ์€ ๊ฐˆ๋ž˜๋„ ๊ฐ™๋‹ค). ์—ฌ๊ธฐ๋ฅผ `state` ๋กœ ๋ฐ•์•„ ๋‘์–ด์„œ, ์ปค๋„์ด ๋ฉˆ์ถฐ\n * ์ €๋„๋กœ ๋˜์„ธ์šฐ๋ ค๋˜ ๋‹ต์ด ใ€Œ์ง€๊ธˆ ์ƒํƒœ์—์„œ ์ฝ์—ˆ๋‹คใ€๊ณ  ๋งํ–ˆ๋‹ค(ADR-0075 ๊ฒฐ์ • 3 ยท ๊ฒฐํ•จ ๋„˜๊น€ 2026-09-24).\n * ์•„๋ฌด๊ฒƒ๋„ ๋ชป ์ฝ์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ `observedAbsence` ๊ฐ€ ๋งํ•œ๋‹ค โ€” ์ถœ์ฒ˜๋ฅผ ๋น„์šฐ์ง€ ์•Š๋Š”๋‹ค(`READ_BASIS` ์ฃผ์„).\n */\n names: {}, provenance: { basis: liveItem ? 'state' : 'journal' }\n }\n }\n const names = namesFor([{ id: itemId, fields: found }], nameIndex(inst.model ?? {}))\n return {\n instanceId, axis, label: info.label, itemId,\n identity: { standardClass: info.standardClass ?? null, typeRole: info.typeRole ?? null, kind: info.kind, gs1Scheme: info.gs1Scheme ?? null, journalAxis: info.journalAxis ?? null, describedBy: info.describedBy ?? null },\n /*\n * **์„ ์–ธ์ด ์—†๋Š” ์ถ•์ด๋‹ค.** ๋‘ ์—ด ์ค‘ ์™ผ์ชฝ์ด ๋น„๋Š” ๊ฒƒ์ด ์ •์ƒ์ด๊ณ , ๊ทธ ์‚ฌ์‹ค์„ ๊ฐ’์œผ๋กœ ๋งํ•œ๋‹ค\n * (`observedOnly`) โ€” ๋นˆ ์—ด์„ \"์›๋ณธ์ด ์นจ๋ฌตํ–ˆ๋‹ค\" ๋กœ ์ฝ์œผ๋ฉด ์•ˆ ๋œ๋‹ค. ์›๋ณธ์€ ์• ์ดˆ์— ์ด ์ถ•์„\n * ์„ ์–ธํ•˜์ง€ ์•Š๋Š”๋‹ค.\n */\n declared: null,\n observed: this.withOrderMaterial(axis, inst.model ?? {}, found),\n observedOnly: true,\n basis: liveItem ? 'state' : 'journal',\n /* ๊ด€์ธก ์—ด์˜ ๊ทผ๊ฑฐ๋Š” **ํ•œ ์ด๋ฆ„์œผ๋กœ** ๋‚ธ๋‹ค โ€” ๋‘ ์ด๋ฆ„์„ ๋‘๋ฉด ํ™”๋ฉด์ด ํ•œ์ชฝ์„ ์žŠ๋Š”๋‹ค. */\n observedBasis: liveItem ? 'state' : 'journal',\n observing: liveItem,\n properties: propertiesOf(axis).map((pr: any) => ({ key: pr.key, label: pr.label, kind: pr.kind, uom: pr.uom ?? null, observedBy: pr.observedBy ?? null })),\n /* ์–ด๋–ค ์†์„ฑ์ด **ํšจ๊ณผ๊ฐ€ ์žˆ๋‚˜** โ€” ๋“ฑ๋ก๋ถ€๊ฐ€ ๋งํ•œ๋‹ค(ยงproperty-effects). ์—†๋Š” ๊ฒƒ์€ ํ‘œ์‹œ๋งŒ ๋œ๋‹ค. */\n propertyEffects: propertyEffectsOf(axis),\n links: await this.linksOf(domainId, inst, axis, itemId, found),\n resourceClassLabels: this.classLabels(inst.model ?? {}),\n names,\n provenance: { basis: liveItem ? 'state' : 'journal' }\n }\n }\n\n if (row) {\n const found: any = await getRepository(row.entity).findOne({\n where: { domain: { id: domainId } as any, instance: { id: inst.id } as any, [row.idColumn]: itemId } as any\n })\n if (found) {\n const { sourceRef, ingestedAt, ...rest } = this.strip(row.entity, row.idColumn, found)\n declared = rest\n /* ์ถœ์ฒ˜๋Š” ์†์„ฑ์ด ์•„๋‹ˆ๋ผ **๊ทผ๊ฑฐ**๋‹ค โ€” ๋‘ ์—ด์ด ์•„๋‹ˆ๋ผ ์•„๋ž˜ ๊ทผ๊ฑฐ ๋ฌถ์Œ์œผ๋กœ ๊ฐ„๋‹ค. */\n provenance = { sourceRef, ingestedAt, basis: 'rows' }\n }\n }\n\n /*\n * ํ–‰์— ์—†์œผ๋ฉด ๋ฌธ์„œ๋ฅผ ๋ณธ๋‹ค โ€” **ํˆฌ์˜์ด ๋‚ก์€ ํŠธ์œˆ์—์„œ๋„ ํ•ญ๋ชฉ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.** ํ–‰๋งŒ ๋ณด๊ณ \n * \"์—†๋‹ค\" ๊ณ  ๋‹ตํ•˜๋ฉด, ๋ฌธ์„œ์—๋Š” ์žˆ๋Š” ์ž๋ฆฌ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค(์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‚ด๋‚ด ์žก์•„ ์˜จ ๋ถ€๋ฅ˜).\n */\n if (!declared) {\n const raw = at(model, info.path)\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n /* ํ•œ ๋ฒŒ๋ฟ์ธ ์„ ์–ธ์€ ์ถ• ์ด๋ฆ„์œผ๋กœ ์ฐพ๋Š”๋‹ค โ€” ๋ชฉ๋ก์ด ๊ทธ ์ด๋ฆ„์œผ๋กœ ๊ฐ€๋ฆฌ์ผฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. */\n const found = all.find(o => idOf(o) === itemId) ?? (!Array.isArray(raw) && raw && itemId === axis ? raw : undefined)\n if (found) {\n declared = typeof found === 'string' ? { id: found } : this.withBinding(axis, model, found)\n provenance = { basis: 'document' }\n }\n }\n\n /* ์„ ์–ธ์—๋„ ๋ฌธ์„œ์—๋„ ์—†๋‹ค โ€” ๊ทธ๋Ÿฐ๋ฐ **๊ด€์ธก์—๋Š” ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค**(์›๋ณธ์ด ๋ชจ๋ฅด๋Š” ์ž์›). ๊ทธ ๊ฒฝ์šฐ๋„\n ํ•ญ๋ชฉ์œผ๋กœ ์—ด๋ ค์•ผ ํ•œ๋‹ค. ๋‘˜ ๋‹ค ์—†์œผ๋ฉด ์ง„์งœ๋กœ ์—†๋Š” ๊ฒƒ์ด๋ฏ€๋กœ `null`. */\n const seen = await this.observedOf(domainId, instanceId, axis, itemId)\n const observed = 'value' in seen ? seen.value : null\n if (!declared && !observed) return null\n\n /* ์ด์›ƒ์„ ๋จผ์ € ๊ตฌํ•œ๋‹ค โ€” ์ด๋ฆ„ํ‘œ๊ฐ€ ์ด์›ƒ์˜ id ๊นŒ์ง€ ๋ฎ์œผ๋ ค๋ฉด ๋ฐ˜ํ™˜ ์ „์— ์†์— ์žˆ์–ด์•ผ ํ•œ๋‹ค. */\n const links = await this.linksOf(domainId, inst, axis, itemId)\n\n /*\n * **๊ตฌ์—ญ ์ด๋ฆ„์€ ๋ชจ๋ธ์— ์—†๋‹ค** โ€” ๊ตฌ์—ญ์€ ํ˜ธ์ŠคํŠธ ๊ฐœ๋…์ด๊ณ (`TwinArea`), ์ธ์ œ์ŠคํŠธ๊ฐ€ ๋ชจ๋ธ์—์„œ ๊ฐˆ๋ผ\n * ๊ณต๊ฐ„ ์ชฝ์œผ๋กœ ๋ณด๋‚ธ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋ธ๋งŒ ์กฐํšŒํ•˜๋Š” ์ด๋ฆ„ํ‘œ์—๋Š” `a-floor` ์˜ ์ด๋ฆ„์ด ์—†๊ณ , ๊ด€๊ณ„ ๊ทธ๋ฆผ์— ๊ทธ id ๊ฐ€\n * ๊ทธ๋Œ€๋กœ ์„ฐ๋‹ค. ๊ทธ ํ–‰์—์„œ ๊ฐ€์ ธ์™€ ์ด๋ฆ„ํ‘œ์— ํ•ฉ์นœ๋‹ค(์ด ํŠธ์œˆ์˜ ๊ณต๊ฐ„ ๊ฒƒ๋งŒ).\n */\n const areaNames: Record<string, string> = {}\n if (inst.spaceId) {\n const areas = await getRepository(TwinArea)\n .find({ where: { domain: { id: domainId } as any, space: { spaceId: inst.spaceId } as any } as any })\n .catch(() => [] as any[])\n for (const a of areas as any[]) if (a?.areaId && a?.name) areaNames[a.areaId] = a.name\n }\n\n return {\n instanceId,\n axis,\n label: info.label,\n itemId,\n /* ์ •์ฒด โ€” ํ‘œ์ค€ ํด๋ž˜์Šคยท์‹๋ณ„ ์Šคํ‚ด์€ ์ „๋ถ€ ์นดํƒˆ๋กœ๊ทธ ์„ ์–ธ์—์„œ ์˜จ๋‹ค. */\n identity: {\n standardClass: info.standardClass ?? null,\n typeRole: info.typeRole ?? null,\n kind: info.kind,\n gs1Scheme: info.gs1Scheme ?? null,\n /*\n * ์„ ์–ธ ๋‘˜์„ ๊ทธ๋Œ€๋กœ ๋‚˜๋ฅธ๋‹ค (ADR-0074) โ€” ์ด ๊ฐœ์ฒด์˜ ์ด๋ ฅ์„ ์ €๋„์˜ ์–ด๋А ์ถ•์œผ๋กœ ๋ฌป๋‚˜,\n * ๊ทธ๋ฆฌ๊ณ  ์‹๋ณ„์ž ๋ง๊ณ  ๋ฌด์—‡์ด ์ด ๊ฐœ์ฒด๋ฅผ ๋งํ•˜๋‚˜. ํ™”๋ฉด์ด ๊ทธ ๋ชฉ๋ก์„ ๊ฐ–์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.\n */\n journalAxis: info.journalAxis ?? null,\n describedBy: info.describedBy ?? null\n },\n /*\n * **๊ทธ๋ฆ‡์ธ๊ฐ€** โ€” ๋ฌธ์„œ์— ๊ฐ์ฒด ํ•˜๋‚˜๋กœ ์žˆ๋Š” ์ถ•(`productionSpec`)์ธ์ง€.\n *\n * `kind` ๋กœ๋Š” ๊ฐˆ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค: ์ปค๋„์€ ๋ผ์šฐํŠธยท๋ ˆ์‹œํ”ผยท๊ณต์ •๋„ `spec` ์ด๋ผ ๋ถ€๋ฅธ๋‹ค(๊ฐ™์€ ์„ ์–ธ ๋ถ€๋ฅ˜๋ผ๋Š”\n * ๋œป). ํ™”๋ฉด์ด `kind` ๋กœ ๊ฐˆ๋ž๋”๋‹ˆ **๋ผ์šฐํŠธ ์ƒ์„ธ๊ฐ€ ๊ทธ๋ฆ‡ ํ‹€๋กœ ๊ทธ๋ ค์ ธ** ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ •๋ณด(๊ณต์ • ์ˆœ์„œ)๊ฐ€\n * ๊ฐœ์ˆ˜ ์นฉ ํ•˜๋‚˜๋กœ ์ค„์–ด๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆ‡์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ๋ชจ์–‘์ด ๋งํ•œ๋‹ค.\n */\n container:\n axisSource(axis) === 'document' && !Array.isArray(at(model, info.path)) && at(model, info.path) != null,\n /* ๋‘ ์—ด โ€” ์›๋ณธ์ด ๋งํ•œ ๊ฐ’, ํŠธ์œˆ์ด ๊ด€์ธกํ•œ ๊ฐ’. ํ•œ์ชฝ์ด ์—†์œผ๋ฉด **์—†๋‹ค๊ณ  ๋‚ธ๋‹ค**(0 ์œผ๋กœ ๋ฉ”์šฐ์ง€ ์•Š๋Š”๋‹ค). */\n declared,\n observed,\n /*\n * ๊ด€์ธก ์—ด์ด **์ž๊ธฐ ๊ทผ๊ฑฐ๋ฅผ ๋งํ•œ๋‹ค** โ€” ๋ชฉ๋ก์˜ ๊ทธ ๋‚ฑ๋ง ๊ทธ๋Œ€๋กœ(`state`=๋ผ์ด๋ธŒ ๊ถŒ์œ„, `journal`=๋‹ค์‹œ ๊ณ„์‚ฐํ•œ\n * ํŒŒ์ƒ). ์—†์œผ๋ฉด ๋น„๊ตํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค. ํŒŒ์ƒ์ด๋ฉด ๋ช‡ ๋ฒˆ์งธ ๋ฆฌ๋น„์ „๊นŒ์ง€ ๊ณ„์‚ฐํ–ˆ๋Š”์ง€ ํ•จ๊ป˜ ๋‚ธ๋‹ค.\n */\n ...('value' in seen\n ? { observedBasis: seen.basis, ...(seen.foldedRevision != null ? { observedRevision: seen.foldedRevision } : {}) }\n : { observedAbsence: seen.absence }),\n /* ์„ ์–ธ๋œ ์†์„ฑ โ€” ์–ด๋А ๊ด€์ธก ์ถ•์—์„œ ์˜ค๋Š”์ง€๋„ ํ•จ๊ป˜(์นดํƒˆ๋กœ๊ทธ๊ฐ€ ๋งํ•œ ๋Œ€๋กœ). */\n properties: propertiesOf(axis).map((p: any) => ({ key: p.key, label: p.label, kind: p.kind, uom: p.uom ?? null, observedBy: p.observedBy ?? null })),\n /*\n * **ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ์†์„ฑ๊ณผ ํ‘œ์‹œ๋งŒ ๋˜๋Š” ์†์„ฑ์€ ๋‹ค๋ฅด๋‹ค.** ์†์„ฑ์€ ์—ด๋ ค ์žˆ์–ด ์•„๋ฌด ์‚ฌ์‹ค์ด๋‚˜ ์‹ค์–ด ๋ณด๋‚ผ ์ˆ˜\n * ์žˆ์ง€๋งŒ, ๊ฐ’์ด ๊ณ„์‚ฐ์„ ๋ฐ”๊พธ๋ ค๋ฉด ๊ทธ ๊ทœ์น™์„ ์ฝ”๋“œ๊ฐ€ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์ง€๊ธˆ ๋ฌด์—‡์ด ๊ทธ๋Ÿฐ์ง€ ํ™”๋ฉด์ด ๋งํ•  ์ˆ˜\n * ์žˆ๊ฒŒ ๋“ฑ๋ก๋ถ€๋ฅผ ํ•จ๊ป˜ ๋‚ธ๋‹ค โ€” ์‚ฌ์šฉ์ž๊ฐ€ ๋„ฃ๊ณ  ๋‚˜์„œ ์•„๋ฌด ์ผ๋„ ์•ˆ ์ผ์–ด๋‚˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ.\n */\n propertyEffects: propertyEffectsOf(axis),\n links,\n /*\n * **๋“ฑ๊ธ‰ ์ด๋ฆ„์€ ๋“ฑ๊ธ‰์ด ๊ฐ–๊ณ  ์žˆ๋‹ค.** ๊ณต์ •์€ ์ž๊ฒฉ์„ ๋“ฑ๊ธ‰ id ๋กœ๋งŒ ์š”๊ตฌํ•˜๋ฏ€๋กœ(ํ‘œ์ค€์ด ๊ทธ๋ ‡๋‹ค),\n * ๊ทธ id ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™”๋ฉด์— ๋‚ด๋ฉด `assembler-op` ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ„๋‹ค. ๋“ฑ๊ธ‰์˜ ํ‘œ์‹œ๋ช…์€ ๋“ฑ๊ธ‰ ์„ ์–ธ์˜\n * `description`(i18n ํ‚ค)์— ์žˆ๊ณ  ๊ทธ๊ฒƒ์€ **๋‹ค๋ฅธ ์ถ•**์ด๋‹ค โ€” ํ™”๋ฉด์ด ์ถ•์„ ํ•˜๋‚˜ ๋” ์ฝ์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ\n * ์—ฌ๊ธฐ์„œ ์ด์–ด ๋ถ™์ธ๋‹ค(์„œ๋ฒ„๋Š” ์ด๋ฏธ ๋ชจ๋ธ์„ ์†์— ๋“ค๊ณ  ์žˆ๋‹ค).\n */\n resourceClassLabels: this.classLabels(model),\n /*\n * **๊ณต์ •์ด๋ฉด ๊ทธ ๊ณต์ •์˜ ๋Šฅ๋ ฅ๋„ ํ•จ๊ป˜ ๋‚ธ๋‹ค** โ€” ISA-95 Part 4 `OperationsCapability`.\n *\n * ๊ณต์ • ์ƒ์„ธ์—์„œ ์‚ฌ๋žŒ์ด ๋ฌป๋Š” ๊ฒƒ์€ \"์ด ๊ณต์ •์ด ์ง€๊ธˆ ์–ผ๋งˆ๋‚˜ ๋” ํ•  ์ˆ˜ ์žˆ๋‚˜\" ์ด๊ณ , ๊ทธ ๋‹ต์€ ๋ช…์„ธ๋งŒ\n * ๋ด์„œ๋Š” ์•ˆ ๋‚˜์˜จ๋‹ค(์•ฝ์ •๊ณผ ์ง€๊ธˆ ๋ชป ์“ฐ๋Š” ์ž์›์„ ๋นผ์•ผ ํ•œ๋‹ค). ํ™”๋ฉด์ด ์ถ•์„ ํ•˜๋‚˜ ๋” ์ฝ์ง€ ์•Š๊ฒŒ\n * ์—ฌ๊ธฐ์„œ ์ด์–ด ๋ถ™์ธ๋‹ค โ€” ์ด๋ฆ„ํ‘œยท๋“ฑ๊ธ‰ ๋ผ๋ฒจ์„ ๋ถ™์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋‹ค.\n */\n ...(await this.capabilityOfOperation(domainId, instanceId, axis, itemId)),\n /*\n * ์ƒ์„ธ๋„ ๊ฐ™์€ ํ‘œ๋ฅผ ์“ด๋‹ค โ€” ๋ชฉ๋ก๊ณผ ์ƒ์„ธ๊ฐ€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋งํ•ด์•ผ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ฝ๋Š”๋‹ค.\n *\n * **์ด์›ƒ์˜ ์ด๋ฆ„๋„ ํ•จ๊ป˜ ์‹ฃ๋Š”๋‹ค.** ๊ด€๊ณ„ ๊ทธ๋ฆผ์˜ ์ด์›ƒ์€ ๋Œ€๊ฐœ *๋“ค์–ด์˜ค๋Š”* ๋งํฌ(์ด ์ž๋ฆฌ๋ฅผ ๊ธฐ์ค€ ์ž๋ฆฌ๋กœ\n * ์‚ผ๋Š” ์„ค๋น„ยท์‚ฌ๋žŒ)๋ผ, ์ด ํ•ญ๋ชฉ ์ž์‹ ์˜ ํ•„๋“œ์—๋Š” ๊ทธ id ๊ฐ€ ์—†๋‹ค โ€” ํ•„๋“œ๋งŒ ํ›‘์œผ๋ฉด ๊ทธ๋ฆผ์ด id ๋กœ ์ฑ„์›Œ์ง„๋‹ค.\n */\n names: namesFor(\n [{ id: itemId, fields: declared }, { fields: observed }, { fields: links }],\n { ...nameIndex(model), ...areaNames }\n ),\n provenance\n }\n }\n\n /**\n * **id โ†’ ์ด๋ฆ„**, ๋ชจ๋“  ์ถ•์„ ํ•œ ํ‘œ๋กœ.\n *\n * โ”€โ”€ ์™œ ์ด ํ‘œ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํ–‰์€ ๋‹ค๋ฅธ ๊ฒƒ์„ **id ๋กœ** ๊ฐ€๋ฆฌํ‚จ๋‹ค(์‚ฌ๋žŒ์˜ `personnelClassIds`, ์„ค๋น„์˜ `homeLocationId`, ๊ณต์ •์˜\n * `locationType`). ๊ทธ id ์˜ ์ด๋ฆ„์€ **๊ฐ€๋ฆฌ์ผœ์ง„ ์ถ•์˜ ํ–‰**์— ์žˆ์œผ๋ฏ€๋กœ, ํ™”๋ฉด์ด ๊ทธ๊ฒƒ์„ ์•Œ๋ ค๋ฉด ์ถ•์„\n * ํ•˜๋‚˜์”ฉ ๋” ์ฝ์–ด์•ผ ํ•œ๋‹ค โ€” ๊ทธ๋ž˜์„œ ์ง€๊ธˆ๊นŒ์ง€ ํ‘œ๋ฉด๋งˆ๋‹ค ๊ทธ๋ƒฅ id ๋ฅผ ์ฐ์—ˆ๋‹ค(`cutter-op`, `cut-station`).\n * ํ‘œ๋ฉด์„ ํ•˜๋‚˜์”ฉ ๊ณ ์น˜๋Š” ๊ฒƒ์€ ๋์ด ์—†๋‹ค: ์ƒˆ ํ™”๋ฉด์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ id ๋ฅผ ์ฐ๋Š”๋‹ค.\n *\n * ๊ทธ๋ž˜์„œ **์„œ๋ฒ„๊ฐ€ ๋ถ™์ธ๋‹ค.** ์„œ๋ฒ„๋Š” ์ด๋ฏธ ๋ชจ๋ธ์„ ์†์— ๋“ค๊ณ  ์žˆ๊ณ , ์–ด๋А ์ถ•์ด ์žˆ๋Š”์ง€๋Š” ์ปค๋„ ์นดํƒˆ๋กœ๊ทธ๊ฐ€\n * ์„ ์–ธํ•œ๋‹ค(`TWIN_AXES`) โ€” ๋„๋ฉ”์ธ์ด ๋Š˜์–ด๋„ ์ด ํ•จ์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ๋‹ค.\n *\n * ๊ฐ’์€ ๊ทธ ํ•ญ๋ชฉ์ด **์ž๊ธฐ ์ด๋ฆ„์ด๋ผ๊ณ  ๋งํ•œ ๊ฒƒ**์ด๋‹ค(`name`ยท`label`ยท`description`). ๊ทธ์ค‘ ์–ด๋–ค ๊ฒƒ์€\n * i18n ํ‚ค์ด๋ฏ€๋กœ(๋“ฑ๊ธ‰์˜ `description`) ๋ฒˆ์—ญ์€ ํ™”๋ฉด์˜ ์ผ๋กœ ๋‚จ๊ธด๋‹ค. ์ด๋ฆ„์ด ์—†์œผ๋ฉด ํ‘œ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค โ€”\n * ์—†๋Š” ๊ฒƒ์„ ์ง€์–ด๋‚ด์ง€ ์•Š๊ณ , ๊ทธ ๊ฒฝ์šฐ ํ™”๋ฉด์€ id ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด์ธ๋‹ค.\n */\n private nameIndex(model: any): Record<string, string> {\n const out: Record<string, string> = {}\n for (const info of TWIN_AXES as any[]) {\n /* ๊ด€์ธก ์ถ•(์ƒํƒœยท์ €๋„)์€ ๋ฌธ์„œ์— ์—†๋‹ค โ€” ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ์ถ•์„ ์ฝ์œผ๋ฉด ๋ชจ๋ธ ๋ฃจํŠธ๋ฅผ ํ›‘๋Š”๋‹ค. */\n if (axisSource(info.axis) !== 'document') continue\n const raw = at(model ?? {}, info.path)\n const list = Array.isArray(raw) ? raw : raw ? [raw] : []\n for (const o of list) {\n const id = idOf(o)\n if (!id || typeof o !== 'object') continue\n const label = o.name ?? o.label ?? o.description\n /* ์ด๋ฆ„์ด id ์™€ ๊ฐ™์œผ๋ฉด ํ‘œ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ฐ™์€ ๊ฐ’์„ ๋‘ ๋ฒˆ ๋ณด์ด๋Š” ์…ˆ์ด๋‹ค. */\n if (typeof label === 'string' && label && label !== id && !out[id]) out[id] = label\n }\n }\n return out\n }\n\n /**\n * ์ด ์‘๋‹ต์ด **์‹ค์ œ๋กœ ๊ฐ€๋ฆฌํ‚จ ๊ฒƒ๋งŒ** ๊ณจ๋ผ ๋‚ธ๋‹ค.\n *\n * ๋ชจ๋ธ ์ „์ฒด ํ‘œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‹ค์œผ๋ฉด ์ž๋ฆฌ๊ฐ€ 10๋งŒ์ธ ํ˜„์žฅ์—์„œ ๋ชฉ๋ก ํ•œ ํŽ˜์ด์ง€์— 10๋งŒ ์ค„์งœ๋ฆฌ ์ด๋ฆ„ํ‘œ๊ฐ€\n * ๋”ฐ๋ผ์˜จ๋‹ค. ๋‚˜์˜จ ๊ฐ’์— ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ๋งŒ ์‹ฃ๋Š”๋‹ค โ€” ๊ทœ๋ชจ์—์„œ ์„ฑ๋ฆฝํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ์‹์ด๋‹ค.\n */\n private namesFor(rows: any[], index: Record<string, string>): Record<string, string> {\n const out: Record<string, string> = {}\n const take = (v: any, depth: number): void => {\n if (v == null || depth > 4) return\n if (typeof v === 'string') { if (index[v]) out[v] = index[v]; return }\n if (Array.isArray(v)) { for (const x of v) take(x, depth + 1); return }\n if (typeof v === 'object') for (const x of Object.values(v)) take(x, depth + 1)\n }\n for (const r of rows) { take(r?.fields ?? r, 0); if (typeof r?.id === 'string' && index[r.id]) out[r.id] = index[r.id] }\n return out\n }\n\n /** ๋“ฑ๊ธ‰ id โ†’ ํ‘œ์‹œ๋ช… ํ‚ค. ์ธ์›ยท์„ค๋น„ยท์ž์‚ฐยทํ’ˆ๋ชฉ ๋“ฑ๊ธ‰์„ ํ•œ ํ‘œ๋กœ โ€” ์–ด๋А ์ž์›์ด๋“  ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์š”๊ตฌ๋œ๋‹ค. */\n private classLabels(model: any): Record<string, string> {\n const out: Record<string, string> = {}\n for (const key of ['personnelClasses', 'equipmentClasses', 'assetClasses', 'materialClasses'])\n /* ํ‘œ์‹œ๋ช…์€ `name` ์ด ์ •๋ณธ์ด๋‹ค โ€” ์˜› ๋ชจ๋ธ๋Š” `description` ์— ๋‹ด๊ณ  ์žˆ์–ด ๋‘˜ ๋‹ค ๋ณธ๋‹ค(์ฝ๊ธฐ ๊ฒฝ๊ณ„ ํ•˜๋‚˜). */\n for (const c of (model?.[key] ?? []) as any[]) if (c?.id && (c.name || c.description)) out[c.id] = c.name || c.description\n return out\n }\n\n /**\n * ๊ด€์ธก์ด ๋ณธ ์ด ํ•ญ๋ชฉ โ€” ์ปค๋„์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ๋งŒ. **์‹คํ–‰ ์ค‘์ด ์•„๋‹ˆ๋ฉด `null` ์ด์ง€ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค**\n * (๊ด€์ธก์ด ์—†๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์€ ๋‹ค๋ฅด๋‹ค).\n */\n /**\n * ์ด ๊ณต์ •์˜ **์ƒ์‚ฐ ๋Šฅ๋ ฅ** โ€” ๊ณต์ • ์ถ• ํ•ญ๋ชฉ์—๋งŒ ๋ถ™๋Š”๋‹ค.\n *\n * ๊ตฌ๊ฐ„์€ **์•ž์œผ๋กœ 24์‹œ๊ฐ„**์ด๋‹ค. ํ‘œ์ค€์˜ ์•ฝ์ •ยท๊ฐ€์šฉ์€ *์•ž์œผ๋กœ ์“ธ* ์šฉ๋Ÿ‰์ด๋ฏ€๋กœ ์ง€๋‚œ ๊ตฌ๊ฐ„์„ ๋‘๊ณ  ๋งํ•˜๋ฉด\n * ๋œป์ด ์—†๊ณ , ์ด ํ™”๋ฉด์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ฐฝ์ด ์—†๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋ฃจ๋ฅผ ์“ฐ๊ณ  **๊ทธ ์‚ฌ์‹ค์„ ๊ฐ’๊ณผ ํ•จ๊ป˜ ๋‚ธ๋‹ค**\n * (ํ™”๋ฉด์ด ๋ผ๋ฒจ๋กœ ๋งํ•œ๋‹ค) โ€” ์–ด๋А ๊ตฌ๊ฐ„์˜ ๊ฐ’์ธ์ง€ ๋ชจ๋ฅด๋ฉด ๋Šฅ๋ ฅ์€ ์ฝ์„ ์ˆ˜ ์—†๋‹ค.\n *\n * **์ˆ˜์š”๋ฅผ ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค.** ์—ฌ๊ธฐ์„œ ๋‚ด๋Š” ๊ฐ’(์ƒํ•œยท์•ฝ์ •ยท๋‹ฌ์„ฑ๋ถˆ๊ฐ€ยท๊ฐ€์šฉยท์ œ์•ฝํ•˜๋Š” ์ถ•)์€ ์ „๋ถ€ ๊ณต๊ธ‰ ์ชฝ์ด๋‹ค โ€”\n * ์ž์› ์ˆ˜ยท์‚ฌ์ดํดยท๊ฐ€๋™๋ฅ ์—์„œ ๋‚˜์˜จ๋‹ค. ์ˆ˜์š”๋Š” `ok`ยท๋ณ‘๋ชฉยทํ•˜๋ฃจ ์ƒํ•œ์—๋งŒ ์“ฐ์ด๊ณ  ๊ทธ๊ฒƒ๋“ค์€ ๋‚ด์ง€ ์•Š์œผ๋ฏ€๋กœ,\n * ๊ณ„์‚ฐ์— ๋„˜๊ธฐ๋Š” ์ˆ˜์š” `1` ์€ ๊ฒฐ๊ณผ์— ์ƒˆ์ง€ ์•Š๋Š”๋‹ค(์„ฑ๊ณผ ํ™”๋ฉด์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฑธ์–ด ๋‘” ๋ชฉํ‘œ๋ฅผ ์“ด๋‹ค โ€” ๊ทธ ํ™”๋ฉด์€\n * \"๋ชฉํ‘œ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‚˜\" ์— ๋‹ตํ•˜๊ณ  ์—ฌ๊ธฐ์„œ๋Š” \"์–ผ๋งˆ๋‚˜ ๋” ํ•  ์ˆ˜ ์žˆ๋‚˜\" ์— ๋‹ตํ•œ๋‹ค).\n *\n * ์•ˆ ์‹คํ–‰ ์ค‘์ด๋ฉด ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค โ€” ๋Šฅ๋ ฅ์€ ์ง€๊ธˆ ์ž์›์˜ ์‚ฌ์‹ค์—์„œ ๋‚˜์˜ค๊ณ , ์—†๋Š” ๊ฒƒ์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค.\n */\n private async capabilityOfOperation(\n domainId: string,\n instanceId: string,\n axis: string,\n itemId: string\n ): Promise<{ capability?: any } > {\n if (axis !== 'operations') return {}\n if (!TwinEngine.isRunning(domainId, instanceId)) return {}\n const from = new Date()\n const to = new Date(from.getTime() + 24 * 3_600_000)\n const monday = Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate() - ((from.getUTCDay() + 6) % 7))\n try {\n const rows = await TwinEngine.operationsCapability(\n domainId,\n { instanceId },\n 1,\n monday,\n { fromTime: from.toISOString(), toTime: to.toISOString() }\n )\n const report = rows.find((r: any) => r.instanceId === instanceId)?.report\n const entry = report?.perOperation?.find((o: any) => o.operation === itemId)\n if (!entry) return {}\n /* ๋ณ‘๋ชฉยท์ƒํ•œ์€ **๋„ฃ์ง€ ์•Š๋Š”๋‹ค** โ€” ๊ทธ ๋‘˜๋งŒ ์ˆ˜์š”์— ๋‹ฌ๋ ค ์žˆ๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ์ˆ˜์š”๋ฅผ ๋ชจ๋ฅธ๋‹ค. */\n return { capability: { window: report.window, operationsType: report.operationsType, ...entry } }\n } catch {\n /* ๋Šฅ๋ ฅ์„ ๋ชป ๋ƒˆ๋‹ค๊ณ  ์ƒ์„ธ๊ฐ€ ์•ˆ ์—ด๋ฆด ์ด์œ ๋Š” ์—†๋‹ค โ€” ์—†์œผ๋ฉด ์—†๋Š” ๋Œ€๋กœ ๋‚ธ๋‹ค(ํ™”๋ฉด์ด ๊ทธ ์ค„์„ ์•ˆ ๊ทธ๋ฆฐ๋‹ค). */\n return {}\n }\n }\n\n /**\n * ์ด ํ•ญ๋ชฉ์„ ํŠธ์œˆ์ด **๊ด€์ธกํ•œ ๊ฐ’** โ€” ๊ทธ๋ฆฌ๊ณ  **๋ฌด์—‡์„ ๊ทผ๊ฑฐ๋กœ** ์•„๋Š”์ง€.\n *\n * ๋ด‰ํˆฌ๋ฅผ ํ‘ธ๋Š” ๊ฒƒ์„ ๋น ๋œจ๋ ค์„œ(`unwrapState`) ๋ฌธ์„œ ์ถ•์˜ ๊ด€์ธก ์—ด์ด ํ†ต์งธ๋กœ ๋น„์–ด ์žˆ๋˜ ์ž๋ฆฌ๋‹ค(์‚ฌ๋žŒ์„ ์—ด๋ฉด\n * ํŠธ์œˆ์ด ์•„๋Š” ๊ฒƒ์ด ์ „๋ถ€ `โ€”` ์˜€๋‹ค).\n *\n * ๊ทผ๊ฑฐ๋ฅผ ๊ฐ’๊ณผ ํ•จ๊ป˜ ๋‚ธ๋‹ค โ€” ๋ชฉ๋ก์ด ์˜ค๋ž˜ ํ•ด ์˜จ ๊ทธ๋Œ€๋กœ๋‹ค(ยงtwinModelItemList). ๋ผ์ด๋ธŒ(๊ถŒ์œ„)์™€ ์ €๋„\n * ํด๋“œ(ํŒŒ์ƒ)๋Š” **๊ฐ™์€ ๋ชจ์–‘์˜ ๊ฐ์ฒด**๋ผ์„œ, ๊ทผ๊ฑฐ๊ฐ€ ์—†์œผ๋ฉด ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ ๊ฐ’์„ \"์ง€๊ธˆ ์ด๋ ‡๋‹ค\" ๋กœ ์ฝ๋Š”๋‹ค. ๊ทผ๊ฑฐ๋ฅผ\n * ์‹ค์„ ์ž๋ฆฌ๊ฐ€ ์—†๋˜ ๋™์•ˆ์—๋Š” ๋ฉˆ์ถ˜ ํŠธ์œˆ์˜ ์ €๋„์„ ์•„์˜ˆ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  `โ€”` ๋กœ ๋‘๋Š” ํŽธ์ด ์ •์งํ–ˆ๋‹ค. ์ด์ œ\n * ์ž๋ฆฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ณ„์‚ฐํ•œ๋‹ค โ€” ๋ฉˆ์ถ˜ ํŠธ์œˆ์—๋„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์•Œ๋˜ ์‚ฌ์‹ค์ด ์žˆ๊ณ , ๊ทธ๊ฒƒ์„ ๊ฐ์ถœ ์ด์œ ๋Š” ์—†๋‹ค.\n *\n * ๋‹ค์‹œ ๊ณ„์‚ฐํ•  ๊ฒƒ์ด ์—†์œผ๋ฉด(๋ชจ๋ธ๋„ ์ €๋„๋„ ์—†๋‹ค) `null` ์ด๋‹ค โ€” **์—†๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์€ ๋‹ค๋ฅด๋‹ค.**\n */\n private async observedOf(\n domainId: string,\n instanceId: string,\n axis: string,\n itemId: string\n ): Promise<{ value: any; basis: 'state' | 'journal'; foldedRevision?: number } | { absence: 'not-running' | 'not-observed' }> {\n const live = TwinEngine.isRunning(domainId, instanceId)\n let state: any = null\n let folded: number | undefined\n if (live) {\n state = unwrapState(TwinEngine.snapshot(domainId, instanceId))\n } else {\n try {\n const rec = await TwinEngine.recover(domainId, instanceId)\n folded = Number((rec as any)?.revision) || undefined\n /*\n * **์ด๋ฒคํŠธ๋ฅผ ํ•˜๋‚˜๋„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ํด๋“œ๋Š” ๊ด€์ธก์ด ์•„๋‹ˆ๋‹ค.** ์ €๋„์ด ๋น„์–ด๋„ ๋ณต์›์€ ์„ ์–ธ์„ ๋‹ค์‹œ ํˆฌ์˜ํ•œ\n * ๊ธฐ์ค€์„ ์„ ๋Œ๋ ค์ค€๋‹ค โ€” ๊ทธ๊ฒƒ์„ \"ํŠธ์œˆ์ด ๊ด€์ธกํ•œ ๊ฐ’\" ์—ด์— ์‹ค์œผ๋ฉด **์„ ์–ธ์ด ๊ด€์ธก์œผ๋กœ ์œ„์žฅํ•œ๋‹ค**\n * (์›๋ณธ์ด ๋งํ•œ ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ์—๋„ ๋˜‘๊ฐ™์ด ์•‰์•„, ๊ฒฌ์ค€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค). ๊ณ„์‚ฐํ•œ ๊ฒƒ์ด ์—†์œผ๋ฉด ์—†๋‹ค๊ณ  ํ•œ๋‹ค.\n */\n if (folded == null) return { absence: 'not-running' as const }\n state = unwrapState(rec)\n } catch {\n return { absence: 'not-running' as const }\n }\n }\n /* ๊ฐ™์€ ๊ทœ์น™ โ€” ์„ ์–ธ๋œ ์ž๋ฆฌ์—์„œ ์ฝ๋Š”๋‹ค. ์ถ• ์ด๋ฆ„์œผ๋กœ ์ฝ์œผ๋ฉด ์ค‘์ฒฉ๋œ ์ถ•์ด ์–ธ์ œ๋‚˜ ใ€Œ๊ด€์ธก ์—†์Œใ€์ด ๋œ๋‹ค. */\n const bucket = state ? axisValueOf(state, axisInfo(axis) ?? { axis }) : null\n /*\n * **์™œ ๊ด€์ธก์ด ์—†๋Š”์ง€ ๋งํ•œ๋‹ค.** ์˜ˆ์ „์—๋Š” ๊ทธ๋ƒฅ `null` ์ด์—ˆ๊ณ  ํ™”๋ฉด์€ ๊ทธ๊ฒƒ์„ \"ํŠธ์œˆ์ด ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์•„\"\n * ๋กœ ์ฝ์—ˆ๋‹ค โ€” ์‹คํ–‰ ์ค‘์ธ๋ฐ๋„ ๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ๋‹ค(๊ณต์ • ์ƒ์„ธ์—์„œ ๊ด€์ธก๋จ). ๊ณต์ •ยท๋ ˆ์‹œํ”ผ์ฒ˜๋Ÿผ **๊ด€์ธก ์ถ•์ด\n * ์•„๋‹Œ ๊ฒƒ**์€ ํŠธ์œˆ์ด ๋Œ๋“  ๋ง๋“  ๊ด€์ธก์ด ์—†๋‹ค. ์ด์œ ๊ฐ€ ๋‹ค๋ฅด๋ฉด ํ™”๋ฉด์ด ๋‹ค๋ฅด๊ฒŒ ๋งํ•ด์•ผ ํ•œ๋‹ค.\n */\n if (!Array.isArray(bucket)) return { absence: 'not-observed' as const }\n /* ๊ฐ™์€ ๊ทœ์น™ โ€” ์„ ์–ธ์ด ๋งํ•˜๋Š” ์ž๋ฆฌ๋กœ ์ฐพ๋Š”๋‹ค. `id` ๋กœ๋งŒ ์ฐพ์œผ๋ฉด ์ˆ˜์š” ๊ตฌ๊ฐ„์„ ์—ด ์ˆ˜ ์—†๋‹ค. */\n const value = bucket.find((x: any) => idOf(x, axisInfo(axis)) === itemId)\n if (!value) return { absence: 'not-observed' as const }\n return { value, basis: live ? 'state' : 'journal', ...(folded != null ? { foldedRevision: folded } : {}) }\n }\n\n /**\n * ์ด์–ด์ง„ ๊ฒƒ โ€” **์–‘๋ฐฉํ–ฅ.** ์„ ์–ธ๋œ ๊ด€๊ณ„(`TWIN_RELATIONS`)๋งŒ ๋”ฐ๋ผ๊ฐ„๋‹ค.\n *\n * ๊ด€๊ณ„๋ฅผ ์ฝ”๋“œ๊ฐ€ ์•Œ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋„๋ฉ”์ธ์ด ๋Š˜์–ด๋„ ์—ฌ๊ธฐ ์†๋Œˆ ๊ฒƒ์ด ์—†๋‹ค. ๋Œ€์‹  **์„ ์–ธ์— ์—†๋Š” ๊ด€๊ณ„๋Š”\n * ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค** โ€” ์ง€๋„์— ์—†๋Š” ๊ธธ์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ์—†๋‹ค๊ณ  ๋‘๋Š” ๊ฒƒ์ด ์ •์งํ•˜๋‹ค.\n *\n * ๋“ค์–ด์˜ค๋Š” ์ชฝ(๋ˆ„๊ฐ€ ๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋‚˜)์€ ๊ทธ ์ถ•์˜ ํ•ญ๋ชฉ์„ ์‚ดํŽด์•ผ ์•ˆ๋‹ค. ๊ทœ๋ชจ ๊ทœ์œจ์ƒ **๊นŠ์ด 1 ยท ๋ฐฉํ–ฅ๋ณ„\n * ์ƒํ•œ**์ด๊ณ , ๋„˜์น˜๋ฉด ๋ช‡์ด ๋” ์žˆ๋Š”์ง€ ๋งํ•œ๋‹ค(๋ชฉ๋ก์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ).\n */\n private async linksOf(\n domainId: string,\n inst: any,\n axis: string,\n itemId: string,\n /*\n * ์ด ํ•ญ๋ชฉ ์ž์‹  โ€” **์ƒํƒœ ์ถ•์€ ๋ฌธ์„œ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.** ๋ถ€๋ฅด๋Š” ์ชฝ์ด ์ด๋ฏธ ์†์— ๋“ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋„˜๊ฒจ\n * ๋ฐ›๋Š”๋‹ค. ์—†์œผ๋ฉด ์˜ˆ์ „์ฒ˜๋Ÿผ ๋ฌธ์„œ์—์„œ ์ฐพ๋Š”๋‹ค(๋ฌธ์„œ ์ถ•์˜ ๊ฑฐ๋™์€ ๊ทธ๋Œ€๋กœ).\n */\n self0?: any\n ): Promise<any> {\n const NEIGHBOR_MAX = 20\n const model = inst.model ?? {}\n\n /*\n * ๊ด€์ธก ์ถ•์˜ ํ•ญ๋ชฉ๋“ค โ€” **ํ•œ ๋ฒˆ๋งŒ** ์ฝ๋Š”๋‹ค(๊ด€๊ณ„๋งˆ๋‹ค ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋ฉด ์ €๋„์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณ„์‚ฐํ•œ๋‹ค).\n * ๋ผ์ด๋ธŒ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ, ์—†์œผ๋ฉด ์ €๋„ ํด๋“œ. ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด(์—†๋Š” ๊ฒƒ์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค).\n */\n let observedState: any\n let observedLoaded = false\n const observedBucket = async (a: string): Promise<any[]> => {\n if (!observedLoaded) {\n observedLoaded = true\n try {\n observedState = TwinEngine.isRunning(domainId, inst.instanceId)\n ? unwrapState(TwinEngine.snapshot(domainId, inst.instanceId))\n : unwrapState(await TwinEngine.recover(domainId, inst.instanceId))\n } catch {\n observedState = null\n }\n }\n const b = observedState ? (observedState as any)[a] : null\n return Array.isArray(b) ? b : []\n }\n\n /*\n * **๊ด€๊ณ„๋Š” ์„ ์–ธ ์–ดํœ˜๋กœ ํ‘ผ๋‹ค** โ€” ๋ฌธ์„œ์—์„œ ์ด ํ•ญ๋ชฉ์„ ์ฐพ์•„ ๊ทธ๊ฒƒ์„ ๋ณธ๋‹ค.\n *\n * ๊ด€๊ณ„ ์„ ์–ธ์˜ ํ•„๋“œ ์ด๋ฆ„(`locations.parentId`)์€ **์›๋ณธ ๋ฌธ์„œ์˜ ์–ดํœ˜**๋‹ค. ํ–‰์€ ๊ฐ™์€ ์‚ฌ์‹ค์„ ์ž๊ธฐ\n * ์ปฌ๋Ÿผ ์ด๋ฆ„์œผ๋กœ ๋‹ด๋Š”๋‹ค(์ž๋ฆฌ์˜ ๊ตฌ์—ญ์€ `area` FK). ํ–‰์„ ๋ณด๊ณ  `parentId` ๋ฅผ ์ฐพ์œผ๋ฉด ๋Š˜ ๋น„์–ด์„œ\n * \"์ด์–ด์ง„ ๊ฒƒ์ด ์—†๋‹ค\" ๋กœ ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ตํ•œ๋‹ค โ€” ์‹ค์ œ๋กœ ๊ทธ๋žฌ๋‹ค.\n *\n * ์–ด๋А ์ชฝ์ด ์ •๋ณธ์ธ๊ฐ€๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉด ๋‹ต์ด ๋ถ„๋ช…ํ•˜๋‹ค: ๊ด€๊ณ„๋ฅผ ์„ ์–ธํ•œ ์–ดํœ˜๊ฐ€ ๋ฌธ์„œ ์–ดํœ˜์ด๋ฏ€๋กœ **๋ฌธ์„œ์—์„œ\n * ํ‘ผ๋‹ค.** ํ–‰์—๋งŒ ์žˆ๊ณ  ๋ฌธ์„œ์— ์—†๋Š” ํ•ญ๋ชฉ(์žˆ์„ ์ˆ˜ ์žˆ๋‹ค)์€ ์ด์–ด์ง„ ๊ฒƒ์ด ๋น„์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด๋‹ค.\n */\n const axisPath = axisSource(axis) === 'document' ? axisInfo(axis)?.path : undefined\n const rawSelf = axisPath ? at(model, axisPath) : undefined\n const selfAll = Array.isArray(rawSelf) ? rawSelf : rawSelf ? [rawSelf] : []\n const self = self0 ?? selfAll.find((o: any) => idOf(o) === itemId)\n\n /*\n * โ”€โ”€ ํ•œ ํ•„๋“œ๊ฐ€ ๋‘ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ (๊ณ„์•ฝ 0.9.24, 2026-09-17) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * `locations.parentId` ๋Š” ๋‹ค๋ฅธ ์ž๋ฆฌ(๋ผ์ธ ยท ์…€ ยท ์กด)์ด๊ฑฐ๋‚˜, ๊ทธ id ์˜ ์ž๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ๊ณต๊ฐ„์˜ ๊ตฌ์—ญ์ด๋‹ค\n * (`axis-or-external`). ์–ด๋А ์ชฝ์ธ์ง€๋Š” **์กฐํšŒ๋กœ** ๊ฐˆ๋ฆฐ๋‹ค โ€” ๊ทœ์น™์€ ๊ณ„์•ฝ์˜ `splitRelationIds` ํ•˜๋‚˜๋‹ค.\n *\n * ํ™”๋ฉด์—๋Š” ๋‘ ์ค„๋กœ ๋‚ธ๋‹ค: ์ž๋ฆฌ ์ชฝ์€ ๊ทธ ์ž๋ฆฌ๋กœ ๊ฑท๋Š” ๋งํฌ(`target.kind: 'axis'`), ๋‚˜๋จธ์ง€๋Š” ๊ตฌ์—ญ์œผ๋กœ\n * ํ’€๋ฆฐ ๊ฒƒ(`external`). ํ•œ ์ค„์— ์„ž์œผ๋ฉด ํ™”๋ฉด์ด ๊ทธ ์ค„ ์ „์ฒด๋ฅผ ์™ธ๋ถ€๋กœ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜ ์ „์ฒด๋ฅผ ๋งํฌ๋กœ ๊ทธ๋ ค ๋‘˜ ์ค‘\n * ํ•˜๋‚˜๊ฐ€ ํ‹€๋ฆฐ๋‹ค. ์„ ์–ธ์€ `declaredTarget` ์œผ๋กœ ํ•จ๊ป˜ ๋‚จ๊ธด๋‹ค.\n */\n const axisIdSets = new Map<string, Set<string>>()\n for (const r of relationsFrom(axis)) {\n if (r.target?.kind !== 'axis-or-external' || axisIdSets.has(r.target.axis)) continue\n const tInfo = axisInfo(r.target.axis)\n const raw = tInfo && axisSource(r.target.axis) === 'document' ? at(model, tInfo.path) : await observedBucket(r.target.axis)\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n axisIdSets.set(r.target.axis, new Set(all.map((o: any) => idOf(o)).filter(Boolean).map(String)))\n }\n const inAxis = (a: string, id: string) => axisIdSets.get(a)?.has(id) ?? false\n\n /* ๋‚˜๊ฐ€๋Š” ์ชฝ โ€” ๋‚ด ํ•„๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ. ์„ ์–ธ์ด ํ•„๋“œ ์ด๋ฆ„์„ ์•Œ๋ ค ์ค€๋‹ค. */\n const out = relationsFrom(axis).map((r: any) => {\n const raw = self ? this.fieldValue(self, r.field) : []\n const ids = raw.filter((v: any) => v != null).map(String)\n return {\n via: r.via,\n field: r.field,\n optional: !!r.optional,\n /* ๋Œ€์ƒ์ด ์ถ•์ด๋ฉด ๊ทธ ์ถ•์˜ ํ•ญ๋ชฉ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ํƒ€์ž…ยท์™ธ๋ถ€(๊ตฌ์—ญ)๋ฉด **๊ฐˆ ๊ณณ์ด ๋‹ค๋ฅด๋‹ค** โ€”\n ํ™”๋ฉด์ด ๋งํฌ๋ฅผ ๋งŒ๋“ค์ง€ ๋ง์ง€ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ๋Œ€์ƒ ์ข…๋ฅ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋‚ธ๋‹ค(๋ง‰๋‹ค๋ฅธ ๋งํฌ ๊ธˆ์ง€). */\n target: r.target,\n /*\n * โ”€โ”€ ์–ธ์ œ์˜ ์ผ์ธ๊ฐ€, ๊ทธ๋ฆฌ๊ณ  ๋‹ด์•„ ๋‘ฌ๋„ ๋˜๋‚˜ (2026-09-06) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํŒ์ •์„ ๊ณ„์•ฝ์ด ๋‚ธ๋‹ค. ํ™”๋ฉด์ด `standing` ์„ ๋ณด๊ณ  ์Šค์Šค๋กœ ์ •ํ•˜๋ฉด ๊ฐ’์ด ํ•˜๋‚˜ ๋Š˜ ๋•Œ ํ•œ ํ™”๋ฉด๋งŒ\n * ๋”ฐ๋ผ๊ฐ„๋‹ค. UX ๋ ˆ์ธ์ด ์ด ์นธ์„ ์š”์ฒญํ–ˆ๊ณ , ๊ทธ์ชฝ์— ์žˆ๋˜ ๊ทœ์น™์€ ๊ฑท์—ˆ๋‹ค.\n *\n * `tense` ๊ฐ€ ์—†๋Š” ๊ด€๊ณ„๋„ `cacheable: false` ๋‹ค. ๋ชจ๋ฅผ ๋•Œ๋Š” ๋‹ค์‹œ ์กฐํšŒํ•˜๋Š” ์ชฝ์ด ๋‚ซ๋‹ค โ€”\n * ๋‚ก์€ ๊ฐ’์„ ์ž์‹  ์žˆ๊ฒŒ ๋ณด์—ฌ ์ฃผ๋Š” ๊ฒƒ์ด ๋น„์–ด ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜๋‹ค. ๊ทธ๋ž˜์„œ `tense` ๋Š” ์—†์„ ์ˆ˜\n * ์žˆ๊ณ  `cacheable` ์€ ์–ธ์ œ๋‚˜ ์žˆ๋‹ค.\n */\n tense: tenseOf(r),\n cacheable: isCacheableTense(tenseOf(r)),\n ids: ids.slice(0, NEIGHBOR_MAX),\n total: ids.length\n }\n }).flatMap((l: any) => {\n if (l.target?.kind !== 'axis-or-external') return [l]\n const all = self ? this.fieldValue(self, l.field).filter((v: any) => v != null).map(String) : []\n const split = splitRelationIds(l.target, all, inAxis)\n const part = (target: any, ids: string[]) => ({ ...l, target, declaredTarget: l.target, ids: ids.slice(0, NEIGHBOR_MAX), total: ids.length })\n const parts = [\n ...(split.axis?.ids.length ? [part({ kind: 'axis', axis: split.axis.axis }, split.axis.ids)] : []),\n ...(split.external?.ids.length ? [part({ kind: 'external', entity: split.external.entity }, split.external.ids)] : [])\n ]\n /* ๋น„์–ด ์žˆ๋Š” ๊ด€๊ณ„๋„ ๋‚ธ๋‹ค(์•„๋ž˜ ์ฃผ์„) โ€” ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ์—†์œผ๋ฉด ์„ ์–ธ ๊ทธ๋Œ€๋กœ ํ•œ ์ค„. */\n return parts.length ? parts : [l]\n })\n\n /*\n * โ”€โ”€ ๋ฐ–์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ด€๊ณ„๋ฅผ ํ‘ผ๋‹ค (2026-09-05) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๊ณ„์•ฝ์ด `kind: 'external'` ์„ ์„ ์–ธํ•˜๋ฉฐ ใ€Œํ•ด์†Œ๋Š” ํ˜ธ์ŠคํŠธ๊ฐ€ ํ•œ๋‹คใ€๊ณ  ์ ์–ด ๋‘์—ˆ๋Š”๋ฐ **๋ถ€๋ฅด๋Š” ๊ณณ์ด\n * 0์ด์—ˆ๋‹ค.** ๊ทธ๋ž˜์„œ ํ™”๋ฉด์€ id ๋งŒ ๋ฐ›๊ณ  ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€, ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชฐ๋ž๋‹ค.\n *\n * ๋ชป ํ’€๋ฉด **๋ชป ํ‘ผ๋‹ค๊ณ  ๋งํ•œ๋‹ค** โ€” ๋งํฌ๋ฅผ ์ง€์šฐ๋ฉด ํ™”๋ฉด์ด ใ€Œ๊ทธ๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†๋‹คใ€๋กœ ์ฝ๊ณ , ์‹ค์ œ๋กœ๋Š”\n * ใ€Œ์•„๋ฌด๋„ ๋‹ตํ•  ์ˆ˜ ์—†๋‹คใ€๋‹ค. ์‚ฌ๋žŒ์ด ํ•  ์ผ์ด ๋‹ค๋ฅด๋‹ค.\n */\n for (const l of out) {\n if (l.target?.kind !== 'external' || !l.ids.length) continue\n const got = await resolveExternal(l.target.entity, domainId, l.ids, { instanceId: inst.instanceId }, m => twinWarn(m))\n if (got.refs) (l as any).refs = got.refs\n else (l as any).unresolved = got.unresolved\n }\n\n /*\n * **๋น„์–ด ์žˆ๋Š” ๊ด€๊ณ„๋„ ๋‚ธ๋‹ค.** ์˜ˆ์ „์—๋Š” `total > 0` ๋งŒ ๋ƒˆ๋‹ค โ€” ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ๋žŒ์€ ์—†๋‹ค๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅธ๋‹ค.\n *\n * ์‹ค์ธก์œผ๋กœ ๊ทธ ๊ฐ’์ด ๋“œ๋Ÿฌ๋‚ฌ๋‹ค(2026-09-05): ์„ค๋น„ 64๋Œ€์— ์‹œํ—˜ ๊ทœ๊ฒฉ์ด ์ „๋ถ€ ๋น„์–ด ์žˆ๋Š” ๊ฒƒ์„ ใ€Œ๋นˆ ๋ฌถ์Œใ€\n * ์œผ๋กœ ์„ธ์›Œ ๋‘๋‹ˆ **ใ€Œ์ด ์„ค๋น„์— ๊ฒ€์‚ฌ ๊ธฐ์ค€์ด ์—†๋‹คใ€์™€ ใ€Œํ™”๋ฉด์ด ๊ทธ๊ฒƒ์„ ์•ˆ ๋ณธ๋‹คใ€๊ฐ€ ๊ตฌ๋ณ„๋๋‹ค.** ์ง€์šฐ๋ฉด\n * ๊ทธ ๊ตฌ๋ณ„์ด ์‚ฌ๋ผ์ง„๋‹ค.\n *\n * ์„ ํƒ์ด ์•„๋‹Œ ๊ด€๊ณ„(`optional: false`)๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์€ **๋Š์–ด์ง„ ์ฐธ์กฐ**์ด๊ณ , ๊ทธ ์‚ฌ์‹ค์ด ํ™”๋ฉด์—\n * ๋‹ฟ์•„์•ผ ํ•œ๋‹ค.\n */\n\n /* ๋“ค์–ด์˜ค๋Š” ์ชฝ โ€” ๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ญ๋ชฉ๋“ค. ๊ทธ ์ถ•์ด ํ–‰์ด๋ฉด DB ๊ฐ€ ์„ธ๊ณ , ๋ฌธ์„œ๋ฉด ๋ฌธ์„œ๋ฅผ ์ „์ˆ˜ ์กฐํšŒํ•œ๋‹ค. */\n const incoming: any[] = []\n /*\n * ๋ฐ–์—์„œ ์˜ค๋Š” ๊ฒƒ์„ ํ•จ๊ป˜ ์‹ฃ๋Š”๋‹ค โ€” ์ œํ’ˆ์ด ์ž๊ธฐ ์ €์žฅ์†Œ์—์„œ ๋ชจ์€๋‹ค(์ปค๋„์€ ๊ทธ ํ‘œ๋ฅผ ๋ชจ๋ฅธ๋‹ค).\n * ๊ฝ‚ํžŒ ํ•ด์†Œ๊ธฐ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ด๊ณ  ๊ทธ๊ฒƒ์€ ์ •์ƒ์ด๋‹ค.\n */\n incoming.push(...(await externalIncoming(domainId, inst.instanceId, axis, itemId, m => twinWarn(m))))\n for (const r of relationsTo(axis)) {\n const fromInfo = axisInfo(r.from)\n if (!fromInfo) continue\n const hits: string[] = []\n /*\n * ํ–‰์€ `axis` ๊ด€๊ณ„๋งŒ ๋‹ด๋Š”๋‹ค. `axis-or-external`(์ž๋ฆฌ โ†’ ๋ถ€๋ชจ ์ž๋ฆฌ ๋˜๋Š” ๊ตฌ์—ญ)์€ ํ–‰์— ๊ตฌ์—ญ FK(`area`)๋งŒ\n * ์žˆ๊ณ  ๋ถ€๋ชจ **์ž๋ฆฌ**๋ฅผ ๋‹ด๋Š” ์นธ์ด ์—†์–ด์„œ, ํ–‰์—์„œ ์„ธ๋ฉด ใ€Œ์ด ์กด ์•„๋ž˜ ์ž๋ฆฌ๋“คใ€์ด ์กฐ์šฉํžˆ 0์ด ๋œ๋‹ค.\n * ๊ทธ ๊ด€๊ณ„๋Š” ์„ ์–ธ ์–ดํœ˜๊ฐ€ ์‚ฌ๋Š” ๋ฌธ์„œ์—์„œ ์„ผ๋‹ค.\n */\n const row = r.target?.kind === 'axis' ? ROW_BACKED[r.from] : undefined\n if (row) {\n const repo = getRepository(row.entity)\n /*\n * **FK ๋Š” ๋ถ€๋ฅด์ง€ ์•Š์œผ๋ฉด ์˜ค์ง€ ์•Š๋Š”๋‹ค.** ๊ด€๊ณ„ ํ•„๋“œ๋ฅผ ๋กœ๋”ฉํ•˜์ง€ ์•Š๊ณ  ์กฐํšŒํ•˜๋ฉด ๊ฐ’์ด ๋Š˜ `undefined`\n * ๋ผ์„œ \"๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ํ•˜๋‚˜๋„ ์—†๋‹ค\" ๋กœ ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ตํ•œ๋‹ค โ€” ์‹ค์ œ๋กœ ๊ทธ๋žฌ๋‹ค(์„ค๋น„ ๋‘˜์ด ์ด ์ž๋ฆฌ๋ฅผ\n * ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋Š”๋ฐ ์ด์›ƒ์ด ๋น„์–ด ์žˆ์—ˆ๋‹ค).\n *\n * ์–ด๋А ํ•„๋“œ๊ฐ€ ๊ด€๊ณ„์ธ์ง€๋Š” **์—”ํ‹ฐํ‹ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ**๊ฐ€ ์•ˆ๋‹ค. ์ถ•๋งˆ๋‹ค ํ‘œ๋ฅผ ๋‘๋ฉด ์ถ•์ด ๋Š˜ ๋•Œ๋งˆ๋‹ค\n * ์—ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•˜๊ณ , ๊ณ ์น˜๋Š” ๊ฒƒ์„ ์žŠ์œผ๋ฉด ๊ฐ™์€ ์นจ๋ฌต์ด ๋‹ค์‹œ ์ƒ๊ธด๋‹ค.\n */\n const relationNames = new Set(repo.metadata.relations.map(rel => rel.propertyName))\n const field = r.field.replace(/\\[\\]$/, '').split('.')[0]\n const rows: any[] = await repo.find({\n where: { domain: { id: domainId } as any, instance: { id: inst.id } as any },\n ...(relationNames.has(field) ? { relations: [field] } : {}),\n take: 5000\n })\n for (const x of rows) {\n /* ํ–‰์—์„œ๋Š” ๊ด€๊ณ„๊ฐ€ FK ๊ฐ์ฒด์ด๊ฑฐ๋‚˜ ์ปฌ๋Ÿผ์ด๋‹ค โ€” ์ด๋ฆ„ ํ›„๋ณด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณธ๋‹ค. */\n const v = this.relationValueOfRow(x, r.field, axis)\n if (v.includes(itemId)) hits.push(x[row.idColumn])\n }\n } else {\n /*\n * ๋“ค์–ด์˜ค๋Š” ์ชฝ์„ ํ›‘๋Š”๋‹ค โ€” **์–ด๋””๋ฅผ ํ›‘์„์ง€๋Š” ๊ทธ ์ถ•์˜ `source` ๊ฐ€ ์ •ํ•œ๋‹ค.**\n *\n * ๋ฌธ์„œ ์ถ•์€ ๋ชจ๋ธ์—์„œ, ๊ด€์ธก ์ถ•์€ **์ƒํƒœ์—์„œ** ํ›‘๋Š”๋‹ค(์ž‘์—… โ†’ ์ด ์˜ค๋”, ์ž‘์—… โ†’ ์ด ์ž๋ฆฌ). ํ•œ๋™์•ˆ\n * ๊ด€์ธก ์ถ•์„ ๊ฑด๋„ˆ๋›ฐ์—ˆ๋”๋‹ˆ ์˜ค๋” ์ƒ์„ธ๊ฐ€ \"๋‹ฟ๋Š” ๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค\" ๋ผ๊ณ  ๋‹ตํ–ˆ๋‹ค โ€” `tasks.orderId` ๋ฅผ\n * ์„ ์–ธํ•ด ๋‘๊ณ ๋„ ๊ทธ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ฆฌ์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค. ์„ ์–ธํ•œ ๊ฒƒ์„ ๊ทธ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ์„ ์–ธ์ด ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n *\n * ๊ทœ๋ชจ: ์ƒํƒœ๋Š” ์ง€๊ธˆ์˜ ์‚ฌ์‹ค๋งŒ ๋‹ด์•„ ์œ ํ•œํ•˜๊ณ , ์ƒํ•œ๊ณผ ์ด๊ณ„๋Š” ๋ฌธ์„œ ์ถ•๊ณผ ๊ฐ™์€ ๊ทœ์œจ์„ ์“ด๋‹ค\n * (๋„˜์น˜๋ฉด ๋ช‡์ด ๋” ์žˆ๋Š”์ง€ ๋งํ•œ๋‹ค). ์ €๋„ ์ „์ฒด๋ฅผ ์ „์ˆ˜ ์กฐํšŒํ•˜๋Š” ์ผ์€ ์—ฌ๊ธฐ์„œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.\n */\n const raw =\n axisSource(r.from) === 'document' ? at(model, fromInfo.path) : (await observedBucket(r.from))\n const all = Array.isArray(raw) ? raw : raw ? [raw] : []\n for (const x of all) if (this.fieldValue(x, r.field).map(String).includes(itemId)) {\n const id = idOf(x)\n if (id) hits.push(id)\n }\n }\n /*\n * **๋“ค์–ด์˜ค๋Š” ์ชฝ๋„ ๋นˆ ๊ฒƒ์„ ๋‚ธ๋‹ค** โ€” ๋‚˜๊ฐ€๋Š” ์ชฝ๊ณผ ๊ฐ™์€ ์ด์œ ๋‹ค(์œ„ ์ฃผ์„).\n *\n * ใ€Œ์ด ์„ค๋น„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž‘์—…์ด ์—†๋‹คใ€๋Š” ์‚ฌ์‹ค์ด๊ณ , ๊ทธ๊ฒƒ์„ ์ง€์šฐ๋ฉด ํ™”๋ฉด์€ ๊ทธ ๋ฌผ์Œ์„ ๋ฌผ์–ด๋ณด์ง€๋„\n * ๋ชปํ•œ๋‹ค. ์ถ•๋‹น ๋“ค์–ด์˜ค๋Š” ๊ด€๊ณ„๋Š” 0~8๊ฐœ๋‹ค(์‹ค์ธก 2026-09-05: ์‹œํ—˜๊ทœ๊ฒฉ 8 ยท ์ž๋ฆฌ 6 ยท ๋‚˜๋จธ์ง€ 2 ์ดํ•˜)\n * โ€” ๋‹ค ๋‚ด๋„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ถ„๋Ÿ‰์ด๋‹ค.\n *\n * ๊ฐ’๋„ ์•ˆ ๋“ ๋‹ค. ํ–‰ ์ถ•์€ 0์„ ์•Œ์•„๋‚ด๋ ค๋ฉด ์ด๋ฏธ `find` ๋ฅผ ๋Œ๋ ธ๊ณ , ๊ทธ 0์„ ๋งํ•˜๋Š” ๋น„์šฉ์€ ์—†๋‹ค.\n *\n * `externalIncoming` ์€ ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ๋‹ค โ€” ๊ทธ์ชฝ์˜ ๋นˆ ๋ฌถ์Œ์€ ใ€Œ๊ทธ ์ œํ’ˆ์ด ์ด ์ถ•์„ ์•ˆ ๋ณธ๋‹คใ€๋Š”\n * ๋œป์ด๊ณ  ์šฐ๋ฆฌ ์„ ์–ธ์— ์—†๋Š” ๊ด€๊ณ„์ด๋ฏ€๋กœ ํ•  ๋ง์ด ์—†๋‹ค.\n */\n incoming.push({\n via: r.via,\n from: r.from,\n field: r.field,\n tense: tenseOf(r),\n cacheable: isCacheableTense(tenseOf(r)),\n ids: hits.slice(0, NEIGHBOR_MAX),\n total: hits.length\n })\n }\n\n return { out, incoming }\n }\n\n /**\n * ์„ ์–ธ ํ•„๋“œ ๊ฒฝ๋กœ โ†’ ๊ฐ’๋“ค. `inputs[].material` ์ฒ˜๋Ÿผ **๋ฐฐ์—ด์„ ์ง€๋‚˜๋Š” ๊ฒฝ๋กœ**๋ฅผ ๋‹ค๋ฃฌ๋‹ค.\n * ๋ฐฐ์—ด ํ‘œ๊ธฐ(`[]`)๊ฐ€ ๊ด€๊ณ„ ์„ ์–ธ์˜ ๋ฌธ๋ฒ•์ด๋ฏ€๋กœ ๊ทธ๊ฒƒ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๊ณง ์„ ์–ธ์„ ์กด์ค‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.\n */\n private fieldValue(obj: any, field: string): any[] {\n let cur: any[] = [obj]\n for (const seg of field.split('.')) {\n const isArray = seg.endsWith('[]')\n const key = isArray ? seg.slice(0, -2) : seg\n const next: any[] = []\n for (const c of cur) {\n if (c == null) continue\n const v = c[key]\n if (v == null) continue\n if (Array.isArray(v)) next.push(...v)\n else next.push(v)\n }\n cur = next\n }\n return cur.map(v => (typeof v === 'object' && v !== null ? idOf(v) ?? v : v)).filter(v => v != null)\n }\n\n /**\n * ํ–‰์—์„œ ๊ด€๊ณ„ ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค โ€” FK ๋Š” ๊ฐ์ฒด(๊ด€๊ณ„ ๋ฏธ๋กœ๋”ฉ์ด๋ฉด ์—†์Œ)์ด๊ณ  ๋ฌธ์„œ ํ•„๋“œ๋ช…๊ณผ ์ปฌ๋Ÿผ๋ช…์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.\n *\n * ์—ฌ๊ธฐ์„œ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ **์ถ•๋งˆ๋‹ค ํ‘œ๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค.** ํ›„๋ณด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๋Š” ํŽธ์ด ์ถ•์ด ๋Š˜ ๋•Œ ๊ณ ์น  ๊ฒƒ์ด\n * ์—†๋‹ค: ๊ด€๊ณ„ ํ•„๋“œ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ยท ๊ทธ ์ด๋ฆ„์˜ FK ๊ฐ์ฒด์˜ id ์ปฌ๋Ÿผ.\n */\n private relationValueOfRow(rowObj: any, field: string, targetAxis: string): string[] {\n const key = field.replace(/\\[\\]$/, '').split('.')[0]\n const v = rowObj[key]\n if (v == null) return []\n if (typeof v === 'string') return [v]\n if (Array.isArray(v)) return v.map(x => (typeof x === 'string' ? x : idOf(x) ?? '')).filter(Boolean)\n /* FK ๊ฐ์ฒด โ€” ๋Œ€์ƒ ์ถ•์˜ id ์ปฌ๋Ÿผ์œผ๋กœ ์ฝ๋Š”๋‹ค(๊ด€๊ณ„๋ฅผ ๋กœ๋”ฉํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ๊ฐ’์ด ์—†๊ณ , ๊ทธ๊ฒƒ๋„ ์‚ฌ์‹ค์ด๋‹ค). */\n const idCol = ROW_BACKED[targetAxis]?.idColumn\n const got = idCol ? v[idCol] : idOf(v)\n return got ? [String(got)] : []\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"twin-model-mutation.js","sourceRoot":"","sources":["../../../server/service/twin-model/twin-model-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'\n\nimport { ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinSpace } from '../twin-space/twin-space.js'\nimport { TwinEngine } from '../../engine/twin-engine.js'\nimport {\n applyDeclarationLayers,\n applyLocalDeclarations,\n mergeLocalDeclarations,\n restoreRevoked,\n revokeLocalDeclarations,\n validateLocalDeclarations,\n type DeclarationRevocation,\n type LocalDeclaration\n} from '../../engine/local-declarations.js'\nimport { knownOperationKinds } from '../../engine/operation-basis.js'\nimport { projectStructure } from './project-structure.js'\n\n/*\n * ๊ตฌ์กฐ ํ…Œ์ด๋ธ” **์žฌ์ƒ์„ฑ** โ€” ์ €์žฅ๋œ ๋ชจ๋ธ ๋ฌธ์„œ๋กœ ์บ์‹œ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.\n *\n * โ”€โ”€ ์ด๊ฒƒ์€ ์›๋ณธ์—์„œ ๋‹ค์‹œ ์ฝ๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅด๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * `resyncTwin` ์€ **์›๋ณธ**์— ๊ฐ€์„œ ํ˜„์žฅ์ด ์ง€๊ธˆ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋‹ค์‹œ ์ฝ๋Š”๋‹ค(๋ชจ๋ธ์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค).\n * ์—ฌ๊ธฐ๋Š” **์•„๋ฌด๊ฒƒ๋„ ๋‹ค์‹œ ์ฝ์ง€ ์•Š๋Š”๋‹ค** โ€” ์ด๋ฏธ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ชจ๋ธ ๋ฌธ์„œ๋ฅผ ํ…Œ์ด๋ธ”๋กœ ๋‹ค์‹œ ํ‘ผ๋‹ค.\n * ๊ทธ๋ž˜์„œ ๋ชจ๋ธ์€ ํ•œ ๊ธ€์ž๋„ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ , ํ…Œ์ด๋ธ”๋งŒ ๋ฌธ์„œ์™€ ๊ฐ™์•„์ง„๋‹ค.\n *\n * โ”€โ”€ ์™œ ํ•„์š”ํ•œ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ด ์•ฑ์—๋Š” **ํˆฌ์˜์ด ์ƒ๊ธฐ๊ธฐ ์ „์— ๋งŒ๋“ค์–ด์ง„ ํŠธ์œˆ**์ด ์žˆ๋‹ค. ๋ฌธ์„œ์—๋Š” ์ž๋ฆฌ 6๊ฐœยท์„ค๋น„ 32๋Œ€๊ฐ€ ์žˆ๋Š”๋ฐ\n * ํ…Œ์ด๋ธ”์€ 0ํ–‰์ด๊ณ , ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ์›์ฒœ๋„ ๊ธฐ์–ตํ•˜์ง€ ์•Š์•„ ๋‹ค์‹œ ์ฝ์„ ์ˆ˜์กฐ์ฐจ ์—†๋‹ค โ€” ์กฐํšŒ ํ™”๋ฉด์ด\n * ์˜๊ตฌํžˆ \"ํ…Œ์ด๋ธ”์ด ๋’ค์— ์žˆ์Šต๋‹ˆ๋‹ค\" ๋งŒ ๋งํ•˜๋Š” ๋ง‰๋‹ค๋ฅธ ์ƒํƒœ๋‹ค.\n *\n * โ”€โ”€ ์“ฐ๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ๋‘˜์ด ๋˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์•„๋‹ˆ๋‹ค. ๊ทธ ๊ทœ์œจ(ADR-0032-D)์ด ๋ง‰๋Š” ๊ฒƒ์€ **๋‹ค๋ฅธ ์ง„์‹ค์ด ํ–‰์„ ์“ฐ๋Š” ๊ฒƒ**์ด๋‹ค(์˜ˆ: ํ‹ฑ ๋ฃจํ”„๊ฐ€ ๊ด€์ธก์„\n * ๋ฐ€์–ด ๋„ฃ๊ธฐ). ์—ฌ๊ธฐ์„œ ์“ฐ๋Š” ๊ฒƒ์€ ์ธ์ œ์ŠคํŠธ๊ฐ€ ์“ฐ๋Š” ๊ฒƒ๊ณผ **๊ฐ™์€ ๋ฌธ์„œยท๊ฐ™์€ ํˆฌ์˜**์ด๊ณ , ๊ทธ ๊ทœ์œจ์ด ํ•จ๊ป˜\n * ์š”๊ตฌํ•œ \"์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅ์„ฑ์„ ๊ตฌ์กฐ๋กœ\" ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค. ์บ์‹œ๋Š” ์–ธ์ œ๋“  ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.\n */\n/**\n * ํ˜„์žฅ ๊ฒน์„ **๊ทธ ํ˜„์žฅ์˜ ํŠธ์œˆ ์ „๋ถ€**์— ์–น๋Š”๋‹ค โ€” ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด ใ€Œํ˜„์žฅ ์ „์ฒด๊ฐ€ ์ฝ๋Š”๋‹คใ€๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n *\n * โ”€โ”€ ์™œ ํ•„์š”ํ•œ๊ฐ€ (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ฒ˜์Œ์—๋Š” ํ˜ธ์ถœํ•œ ํŠธ์œˆ์—๋งŒ ์–น์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ™์€ ํ˜„์žฅ์˜ ๋‹ค๋ฅธ EMS ํŠธ์œˆ์€ **๋‹ค์Œ์— ์ž๊ธฐ๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์งˆ ๋•Œ\n * ๊นŒ์ง€** ์˜› ๊ฐ’์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค โ€” ํ™”๋ฉด์€ ใ€Œํ˜„์žฅ ์ „์ฒดใ€๋ผ๊ณ  ๋งํ•˜๋Š”๋ฐ ์‹ค์ œ๋กœ๋Š” ํ•œ ํŠธ์œˆ๋งŒ ๋ฐ”๋€ ์ƒํƒœ๋‹ค.\n *\n * ํŠธ์œˆ๋งˆ๋‹ค ์ž๊ธฐ ๊ฒน์„ ๊ทธ๋Œ€๋กœ ์–น๋Š”๋‹ค(์ข์€ ๊ฒƒ์ด ์ด๊ธด๋‹ค). ๋Œ๊ณ  ์žˆ๋Š” ๋ฏธ๋Ÿฌ๋Š” ์ง€๊ธˆ ๋ฐ›๊ณ , ์‹œ๋ฎฌ๋ ˆ์ด์…˜ยท์ •์ง€\n * ํŠธ์œˆ์€ ๋ฌธ์„œ์— ๋ฐ˜์˜ํ•œ๋‹ค(์žฌ๊ธฐ๋™ ๋•Œ ๋ฐ›๋Š”๋‹ค) โ€” ๊ทธ ์ฐจ์ด๋ฅผ ๊ฒฐ๊ณผ์— ์ ์–ด ๋Œ๋ ค์ค€๋‹ค.\n *\n * ์–น์„ ์ž๋ฆฌ๊ฐ€ ์—†๋Š” ํŠธ์œˆ์€ **์ •์ƒ**์ด๋‹ค(์ฐฝ๊ณ  ํŠธ์œˆ์— ์š”๊ธˆ ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค). ๊ทธ ์‚ฌ์‹ค๋„ ์„ธ์–ด ๋Œ๋ ค์ค€๋‹ค โ€”\n * ใ€Œํ˜„์žฅ์— ๋„ฃ์—ˆ๋Š”๋ฐ ์•„๋ฌด ํŠธ์œˆ๋„ ์•ˆ ๋ฐ›์•˜๋‹คใ€๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ์•„์•ผ ํ•  ์‚ฌ์‹ค์ด๋‹ค.\n */\nasync function spreadSpaceLayer(\n domainId: string,\n spaceId: string,\n spaceLayer: LocalDeclaration[],\n comment: string\n): Promise<{\n spaceLayerApplied: LocalDeclaration[]\n twins: { instanceId: string; applied: string; landed: boolean; error?: string }[]\n}> {\n const repo = getRepository(TwinInstance)\n const twins = await repo.find({ where: { domain: { id: domainId }, spaceId } })\n const report: { instanceId: string; applied: string; landed: boolean; error?: string }[] = []\n let latest = spaceLayer\n for (const t of twins) {\n if (!t.model) continue\n const out = applyDeclarationLayers(t.model, latest, (t.localDeclarations ?? []) as LocalDeclaration[])\n /* ๊ธฐ์–ต(`replaced`)์€ **์–นํžŒ ํŠธ์œˆ์—์„œ๋งŒ** ์ฑ„์›Œ์ง„๋‹ค โ€” ์ž๋ฆฌ๊ฐ€ ์—†๋Š” ํŠธ์œˆ์„ ์ง€๋‚˜๋ฉฐ ์ง€์›Œ์ง€์ง€ ์•Š๊ฒŒ ์ด์–ด ๋“ ๋‹ค. */\n latest = out.spaceLayerApplied\n const landed = !out.missingTargets.some(m => m.scope === 'space' && spaceLayer.some(d => d.id === m.id && d.target === m.target))\n t.localDeclarations = out.instanceLayerApplied as any\n const running = TwinEngine.modeOf(domainId, t.instanceId)\n /*\n * **ํŠธ์œˆ ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•ด๋„ ๋‚˜๋จธ์ง€๋Š” ๋ฐ›๋Š”๋‹ค** โ€” ๋‹ค๋งŒ ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค(2026-08-18 ์‹ค์ธก).\n *\n * ํ˜„์žฅ ์„ ์–ธ์„ ์ฒ˜์Œ ํผ๋œจ๋ ธ์„ ๋•Œ ๊ทธ ํ˜„์žฅ์˜ ์–ด๋–ค ํŠธ์œˆ์—์„œ ๊ตฌ์กฐ ํˆฌ์˜์ด ํ„ฐ์กŒ๊ณ (๊ทธ ํŠธ์œˆ ๋ชจ๋ธ์— ์„ค๋น„ id๊ฐ€\n * ๊ฒน์ณ ์žˆ์—ˆ๋‹ค โ€” ์„ ์žฌ ๊ฒฐํ•จ), ๊ทธ ์˜ˆ์™ธ๊ฐ€ ์˜ฌ๋ผ์™€ **ํ•œ ํŠธ์œˆ ๋•Œ๋ฌธ์— ํ˜„์žฅ ์ „์ฒด ์„ ์–ธ์ด ์‹คํŒจ**ํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š”\n * ๊ฐ’์„ ๋„ฃ์—ˆ๋Š”๋ฐ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค.\n *\n * ๊ทธ๋ ‡๋‹ค๊ณ  ์‚ผํ‚ค๋ฉด ๋” ๋‚˜์˜๋‹ค: ใ€Œํ˜„์žฅ ์ „์ฒด๊ฐ€ ์ฝ๋Š”๋‹คใ€๊ณ  ๋งํ•œ ๋’ค ๋ช‡ ํŠธ์œˆ์ด ๋ชป ์ฝ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ\n * ํŠธ์œˆ๋ณ„๋กœ ์ด์œ ๋ฅผ ์ ์–ด ๋Œ๋ ค์ค€๋‹ค.\n */\n try {\n if (running === 'live') {\n await repo.save(t)\n await TwinEngine.adoptStructure(domainId, t.instanceId, out.model, comment)\n report.push({ instanceId: t.instanceId, applied: 'running', landed })\n continue\n }\n t.model = out.model\n await repo.save(t)\n await projectStructure(domainId, t.instanceId, out.model, t.instanceId)\n report.push({ instanceId: t.instanceId, applied: running ? 'on-restart' : 'stored', landed })\n } catch (e: any) {\n report.push({ instanceId: t.instanceId, applied: 'failed', landed, error: e?.message ?? 'failed' })\n }\n }\n return { spaceLayerApplied: latest, twins: report }\n}\n\n@Resolver()\nexport class TwinModelMutation {\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Rebuild this twin's structure tables from the model document it already holds. Reads nothing from the source: the model is unchanged and only the cache is redrawn. Use resyncTwin instead when the source itself may have changed.\"\n })\n async reprojectTwinModel(@Arg('instanceId') instanceId: string, @Ctx() context: ResolverContext): Promise<any> {\n const domainId = context.state.domain.id\n const inst = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return { ok: false, error: `unknown twin: ${instanceId}` }\n if (!inst.model) return { ok: false, error: `twin \"${instanceId}\" has no model document โ€” there is nothing to draw from` }\n\n try {\n /*\n * ์ถœ์ฒ˜ ํ‘œ์‹์€ **์ด ํŠธ์œˆ ์ž์‹ **์ด๋‹ค. ์ธ์ œ์ŠคํŠธ๋„ ๊ฐ™์€ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค(`master.source` = instanceId) โ€”\n * ์—ฌ๊ธฐ์„œ ๋‹ค๋ฅธ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ๊ฐ™์€ ํ–‰์ด ์–ด๋””์„œ ์™”๋Š”์ง€๊ฐ€ ๊ฒฝ๋กœ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง„๋‹ค.\n */\n const report = await projectStructure(domainId, instanceId, inst.model, instanceId)\n return { ok: true, ...report }\n } catch (e: any) {\n return { ok: false, error: e?.message || 'reprojection failed' }\n }\n }\n\n /**\n * ํ˜„์žฅ์ด ์ •ํ•˜๋Š” ์ˆ˜๋ฅผ ํŠธ์œˆ์— ์–น๋Š”๋‹ค โ€” **๊ตฌ์กฐ๋Š” ์›์ฒœ์ด, ์ˆ˜๋Š” ํ˜„์žฅ์ด.**\n *\n * โ”€โ”€ ์™œ ์ด ๋ฌธ์ด ํ•„์š”ํ–ˆ๋‚˜ (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ปค๋„ฅํ„ฐ๋กœ ๋งŒ๋“  ํŠธ์œˆ์€ ๊ณ„ํ†ต๋„ยท๊ณ„๋Ÿ‰ ์ง€์ ์„ ์› ์‹œ์Šคํ…œ์—์„œ ์ฝ์–ด ์˜จ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์š”๊ธˆ ๋‹จ๊ฐ€ยท๊ณ„์•ฝ ์ •๋ณดยท\n * ์ถ•์ „์ง€ ์ถฉ์ „์œจ์€ ์› ์‹œ์Šคํ…œ์ด ๋ชจ๋ฅธ๋‹ค(SCADA ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ์šฐ๋ฆฌ ์ „๊ธฐ ๊ณ„์•ฝ์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค). ๊ทธ๋ž˜์„œ\n * ๊ณ„๋Ÿ‰์ด ํ๋ฅด๋Š” ํŠธ์œˆ์—์„œ๋„ **๊ธˆ์•ก์ด ์˜์›ํžˆ ๋‚˜์˜ค์ง€ ์•Š์•˜๋‹ค** โ€” ๋„ฃ์„ ๋ฌธ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.\n *\n * ๊ฐ’์€ `model` ์— ์ง์ ‘ ์“ฐ์ง€ ์•Š๊ณ  **๊ฒน**์œผ๋กœ ๋ณด๊ด€ํ•œ๋‹ค: ๋ชจ๋ธ์€ ์›์ฒœ์˜ ์‚ฌ๋ณธ์ด๋ฏ€๋กœ ๋‹ค์‹œ ์ฝ๊ธฐ๊ฐ€ ๊ทธ๊ฒƒ์„\n * ์ƒˆ๋กœ ๊ทธ๋ฆฌ๋ฉด ์ง์ ‘ ์“ด ๊ฐ’์€ ์˜ค๋ฅ˜ ์—†์ด ์‚ฌ๋ผ์ง„๋‹ค. ๊ฒน์€ ๋ชจ๋ธ์„ ๊ทธ๋ฆด ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์–นํžŒ๋‹ค.\n *\n * โ”€โ”€ ๋Œ๊ณ  ์žˆ๋Š” ํŠธ์œˆ์— ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜ํ•˜๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๋ฏธ๋Ÿฌ๋Š” **๋™์ž‘ ์ค‘์—** ์ƒˆ ๊ตฌ์กฐ๋ฅผ ๋ฐ›๋Š”๋‹ค(ํ˜„์‹ค์€ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค). ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค โ€” ์กฐ๊ฑด์ด\n * ๋ฐ”๋€ ์‹คํ—˜์€ ๋‹ค๋ฅธ ์‹คํ—˜์ด๊ณ , ์ปค๋„์ด ๊ทธ๋ ‡๊ฒŒ ๊ฑฐ์ ˆํ•œ๋‹ค. ๊ทธ๋•Œ๋Š” ์ €์žฅ๋งŒ ํ•˜๊ณ  **๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค**:\n * ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ์„ฑ๊ณต์œผ๋กœ ๋‹ตํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ง€๊ธˆ ํ™”๋ฉด์˜ ์ˆ˜๊ฐ€ ์ƒˆ ์„ ์–ธ์œผ๋กœ ๊ณ„์‚ฐ๋œ ์ค„๋กœ ์ฝ๋Š”๋‹ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n \"Declare locally-owned numbers on a twin (tariff, contract, state of charge) as a layer on top of the reference-derived model, so a resync cannot drop them. Values carry source: local, telling every consumer that the authority for them sits here rather than in the source system. Values are validated against the kernel's property specification (unit and range). Mirrors adopt them while running; simulations keep their current declarations until restart, and the result says so.\"\n })\n async declareTwinProperties(\n @Arg('instanceId') instanceId: string,\n @Arg('declarations', type => [ScalarObject]) declarations: any[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinInstance)\n const inst = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return { ok: false, error: `unknown twin: ${instanceId}` }\n if (!inst.model) return { ok: false, error: `twin \"${instanceId}\" has no model document โ€” provision it before declaring values on it` }\n\n /*\n * **์„ ์–ธ์ด ํ•˜๋‚˜๋„ ๋„์ฐฉํ•˜์ง€ ์•Š์€ ๊ฒƒ**๊ณผ **๋ฐ›์•˜์ง€๋งŒ ๋‹ค ๊ฑฐ์ ˆ๋œ ๊ฒƒ**์€ ๋‹ค๋ฅธ ์ผ์ด๋‹ค.\n *\n * ๋‘˜์„ ๊ฐ™์€ ๋ฌธ์žฅ์œผ๋กœ ๋‹ตํ–ˆ๋”๋‹ˆ, ์ž…๋ ฅ์ด ํ†ต์งธ๋กœ ์‚ฌ๋ผ์ง„ ํ˜ธ์ถœ์ด ใ€Œ๋ฐ›์•„์ค€ ์„ ์–ธ์ด ์—†๋‹ค ยท ๊ฑฐ์ ˆ ๋ชฉ๋ก ๋น„์–ด ์žˆ์Œใ€\n * ์ด๋ผ๋Š” ๋‹ต์„ ๋ฐ›์•˜๋‹ค โ€” ์‚ฌ์šฉ์ž๋Š” ์ž๊ธฐ ๊ฐ’์ด ์„œ๋ฒ„๊นŒ์ง€ ์˜ค์ง€ ๋ชปํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์—†๋‹ค(์‹ค์ œ๋กœ ๊ฒช์—ˆ๋‹ค: GraphQL\n * `Object` ์Šค์นผ๋ผ์— ์ธ๋ผ์ธ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ฃผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ด ๋˜๊ณ , ๋ณ€์ˆ˜๋กœ ์ฃผ๋ฉด ์˜จ๋‹ค).\n */\n if (!declarations?.length) return { ok: false, error: 'no declaration arrived โ€” the declarations argument was empty' }\n\n /*\n * ๊ฒ€์‚ฌ๋ถ€ํ„ฐ โ€” ๋ฐ›์ง€ ์•Š์€ ๊ฒƒ์„ ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฒ„๋ฆฌ์ง€ ์•Š๋Š”๋‹ค(์‚ฌ์šฉ์ž๋Š” ๊ฐ’์„ ๋„ฃ์—ˆ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค).\n *\n * ๊ณต์ • ์ด๋ฆ„์€ **๋Œ€์กฐ๋กœ๋งŒ** ๊ฑธ๋Ÿฌ์ง„๋‹ค(๋ชจ๋ธ์— ํ–‰์ด ์—†์–ด๋„ ์„ฑ๋ฆฝํ•˜๋Š” ์„ ์–ธ์ด๋ผ ๋‹ค๋ฅธ ์•ˆ์ „๋ง์ด ์—†๋‹ค). ์•„์ง\n * ๋Œ์ง€๋„ ์•Š๊ณ  ๋ช…์„ธ ํ–‰๋„ ์—†๋Š” ํŠธ์œˆ์ด๋ฉด ๋ชฉ๋ก์ด `undefined` ์ด๊ณ , ๊ทธ๋•Œ๋Š” ๋ฐ›์•„ ์ฃผ๋˜ ๋‹ต์— ๊ทธ ์‚ฌ์‹ค์„ ์‹ฃ๋Š”๋‹ค.\n */\n const knownOperations = knownOperationKinds(\n inst.model,\n TwinEngine.kernel(domainId, instanceId),\n await TwinEngine.measuredOperationKinds(domainId, instanceId)\n )\n const { accepted, rejected } = validateLocalDeclarations(inst.kind, declarations as LocalDeclaration[], { knownOperations })\n if (!accepted.length) return { ok: false, error: 'no declaration was accepted', rejected }\n const unverifiedOperations = knownOperations\n ? []\n : accepted.filter(d => d.target === 'operation').map(d => d.id)\n\n /*\n * ํ˜„์žฅ ๋ฒ”์œ„๋ฉด **๊ณต๊ฐ„์— ์ ๋Š”๋‹ค** โ€” ๊ทธ ํ˜„์žฅ์˜ ํŠธ์œˆ ์ „๋ถ€๊ฐ€ ์ฝ๋Š” ์ž๋ฆฌ๋‹ค. ๊ณต๊ฐ„์„ ๋ชจ๋ฅด๋ฉด ๊ฑฐ์ ˆํ•œ๋‹ค(ํŠธ์œˆ์—\n * ๋ชฐ๋ž˜ ์ ์œผ๋ฉด ์‚ฌ์šฉ์ž๋Š” ํ˜„์žฅ์— ๋„ฃ์—ˆ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค).\n */\n /* ํ˜„์žฅ ๊ฒน์€ **์ฝ๊ธฐ๋งŒ** ํ•œ๋‹ค โ€” ์ด ๋ฌธ์€ ํŠธ์œˆ์˜ ๊ฐ’๋งŒ ๋„ฃ๋Š”๋‹ค(ํ˜„์žฅ ๊ฐ’์€ ์ „์šฉ ๋ฌธ์ด ์žˆ๋‹ค). ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๋ ค๋ฉด\n ํ˜„์žฅ ๊ฒน์„ ํ•จ๊ป˜ ์–น์–ด์•ผ ํ•œ๋‹ค: ํ˜„์žฅ ๋จผ์ €, ํŠธ์œˆ์ด ๋‚˜์ค‘. */\n const spaceRepo = getRepository(TwinSpace)\n const space =\n inst.spaceId ? await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId: inst.spaceId } }) : null\n const nextSpace = (space?.localDeclarations ?? []) as LocalDeclaration[]\n const nextInst = mergeLocalDeclarations((inst.localDeclarations ?? []) as LocalDeclaration[], accepted)\n\n /* ์–น์œผ๋ฉด์„œ **๋ฌด์—‡์„ ๋ฎ์—ˆ๋Š”์ง€** ์ ์–ด ์˜จ ๊ฒน์„ ์ €์žฅํ•œ๋‹ค โ€” ์ฒ ํšŒ๋Š” ๊ทธ ๊ธฐ์–ต์ด ์žˆ์–ด์•ผ ์„ฑ๋ฆฝํ•œ๋‹ค.\n ์ˆœ์„œ๊ฐ€ ๊ทœ์œจ์ด๋‹ค: ํ˜„์žฅ ๋จผ์ €, ํŠธ์œˆ์ด ๋‚˜์ค‘(์ข์€ ๊ฒƒ์ด ์ด๊ธด๋‹ค). */\n const applied = applyDeclarationLayers(inst.model, nextSpace, nextInst)\n const model = applied.model\n /* ํ˜„์žฅ ๊ฒน์ด ์ด ํŠธ์œˆ์— ์–น์„ ์ž๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒƒ์€ ์ •์ƒ์ด๋‹ค(์ฐฝ๊ณ  ํŠธ์œˆ์— ์š”๊ธˆ ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค) โ€” ๊ฒฝ๊ณ ๋กœ ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. */\n const missingTargets = applied.missingTargets.filter(t => t.scope === 'instance').map(({ target, id }) => ({ target, id }))\n /* ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์ง€ ๋ชปํ•œ ์„ ์–ธ โ€” ๊ฒน์—๋Š” ๋‚จ์ง€๋งŒ ๊ณ„์‚ฐ์—๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค(๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค). */\n const unreadable = applied.unreadable.map(({ target, id, propertyId }) => ({ target, id, propertyId }))\n\n /* ๊ฒน์€ ์–ธ์ œ๋‚˜ ๋‚จ๊ธด๋‹ค โ€” ๋Œ€์ƒ์ด ์ง€๊ธˆ ์—†์–ด๋„(๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค) ์‚ฌ์šฉ์ž์˜ ์„ ์–ธ์„ ๋ฒ„๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. */\n inst.localDeclarations = applied.instanceLayerApplied\n await repo.save(inst)\n if (space) {\n space.localDeclarations = applied.spaceLayerApplied\n await spaceRepo.save(space)\n }\n\n const running = TwinEngine.modeOf(domainId, instanceId)\n if (running === 'live') {\n /* ๋ฏธ๋Ÿฌ๋Š” ์ง€๊ธˆ ๋ฐ›๋Š”๋‹ค โ€” ์ €์žฅยท๊ตฌ์กฐ ํ–‰ยท์ปค๋„์ด ํ•จ๊ป˜ ์›€์ง์ธ๋‹ค(adoptStructure ๊ฐ€ ์…‹์„ ๋ฌถ๋Š”๋‹ค). */\n const shift = await TwinEngine.adoptStructure(domainId, instanceId, model, 'local declarations (twin)')\n return {\n ok: true,\n applied: 'running',\n scope: 'instance',\n accepted,\n ...(rejected.length ? { rejected } : {}),\n ...(missingTargets.length ? { missingTargets } : {}),\n ...(unreadable.length ? { unreadable } : {}),\n ...(unverifiedOperations.length\n ? {\n unverifiedOperations,\n note: 'this twin has run no operations and declares no operation specification, so the operation name could not be checked โ€” if it is misspelled the value will simply never be read'\n }\n : {}),\n revision: shift.rev\n }\n }\n\n /* ์‹œ๋ฎฌ๋ ˆ์ด์…˜ยท์ •์ง€ ํŠธ์œˆ โ€” ๋ฌธ์„œ์™€ ๊ตฌ์กฐ ํ–‰์—๋Š” ๋ฐ˜์˜ํ•˜๊ณ , ๋Œ๊ณ  ์žˆ๋Š” ์ปค๋„์—๋Š” ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. */\n inst.model = model\n await repo.save(inst)\n const report = await projectStructure(domainId, instanceId, model, instanceId)\n return {\n ok: true,\n applied: running ? 'on-restart' : 'stored',\n scope: 'instance',\n ...(running ? { note: 'a running simulation keeps its current declarations โ€” restart it to run on the new numbers' } : {}),\n accepted,\n ...(rejected.length ? { rejected } : {}),\n ...(missingTargets.length ? { missingTargets } : {}),\n ...(unreadable.length ? { unreadable } : {}),\n ...(unverifiedOperations.length\n ? {\n unverifiedOperations,\n note: 'this twin has run no operations and declares no operation specification, so the operation name could not be checked โ€” if it is misspelled the value will simply never be read'\n }\n : {}),\n ...report\n }\n }\n\n /**\n * ์„ ์–ธ์„ **์ฒ ํšŒํ•œ๋‹ค** โ€” ์ž˜๋ชป ๋„ฃ์€ ๊ฐ’์„ ์›์ฒœ์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋ฌธ.\n *\n * โ”€โ”€ ์™œ ๋”ฐ๋กœ ๋ฌธ์ด ํ•„์š”ํ•œ๊ฐ€ (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์„ ์–ธ์€ ๊ฒน์— ๋ณด๊ด€๋˜์ง€๋งŒ **์ €์žฅ๋œ ๋ชจ๋ธ์— ๊ตฌ์›Œ์ง„๋‹ค.** ๊ทธ๋ž˜์„œ ๊ฒน์—์„œ ์ค„๋งŒ ์ง€์›Œ๋„ ์›๋ž˜ ๊ฐ’์ด ๋Œ์•„์˜ค์ง€\n * ์•Š๋Š”๋‹ค โ€” ๋˜๋Œ๋ฆด ๋ฐฉ๋ฒ•์ด ์•„์˜ˆ ์—†์–ด์„œ, ์˜คํƒ€๋ฅผ ใ€Œ์›๋ž˜ ๊ฐ’์„ ๋‹ค์‹œ ์„ ์–ธํ•˜๋Š”ใ€ ์šฐํšŒ๋กœ๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ์—ˆ๋‹ค\n * (์‚ฌ์šฉ์ž๊ฐ€ ์›๋ž˜ ๊ฐ’์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , ๋ชจ๋ฅด๋ฉด ๊ทธ ๊ฐ’์€ ์˜๊ตฌํžˆ ์ด๊ธด๋‹ค).\n *\n * ๊ทธ๋ž˜์„œ ๊ฒน์ด **๋ฌด์—‡์„ ๋ฎ์—ˆ๋Š”์ง€** ํ•จ๊ป˜ ๊ธฐ์–ตํ•˜๊ฒŒ ํ–ˆ๊ณ (`replaced`), ์ฒ ํšŒ๋Š” ๊ทธ ๊ธฐ์–ต์œผ๋กœ ๋˜๋Œ๋ฆฐ๋‹ค.\n * ๊ธฐ์–ต์ด ์—†๋Š” ์˜› ์„ ์–ธ์€ **์†๋Œ€์ง€ ์•Š๊ณ  ๊ทธ๋ ‡๊ฒŒ ๋งํ•œ๋‹ค**(`unknownSource`) โ€” ์›๋ž˜ ๊ฐ’์„ ์ง€์–ด๋‚ด๋Š” ๊ฒƒ์€\n * ์ž˜๋ชป ๋„ฃ์€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜๋‹ค. ๊ทธ ์ž๋ฆฌ๋Š” ๋‹ค์Œ ์›์ฒœ ์žฌ์ฝ๊ธฐ๊ฐ€ ๋ฐ”๋กœ์žก๋Š”๋‹ค.\n *\n * ๋ฐ˜์˜ ๋ฐฉ์‹์€ ์„ ์–ธ๊ณผ ๊ฐ™๋‹ค: ๋ฏธ๋Ÿฌ๋Š” ์ง€๊ธˆ ๋ฐ›๊ณ (`adoptStructure`), ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ์žฌ๊ธฐ๋™ ๋•Œ ๋ฐ›๋Š”๋‹ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Revoke locally-declared values on a twin, restoring the value the reference system had when the declaration was applied (or removing the property if the source never had it). Declarations made before the overridden value was remembered are left untouched and reported, rather than guessed.'\n })\n async revokeTwinDeclarations(\n @Arg('instanceId') instanceId: string,\n @Arg('revocations', type => [ScalarObject]) revocations: any[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const repo = getRepository(TwinInstance)\n const inst = await repo.findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!inst) return { ok: false, error: `unknown twin: ${instanceId}` }\n if (!inst.model) return { ok: false, error: `twin \"${instanceId}\" has no model document` }\n /* ๋„์ฐฉ 0๊ฑด๊ณผ ใ€Œ๊ฒน์— ์—†๋‹คใ€๋Š” ๋‹ค๋ฅธ ์ผ์ด๋‹ค โ€” ์„ ์–ธ ์ชฝ์—์„œ ๊ฒช์€ ์นจ๋ฌต์„ ์—ฌ๊ธฐ์„œ ๋˜ํ’€์ง€ ์•Š๋Š”๋‹ค. */\n if (!revocations?.length) return { ok: false, error: 'no revocation arrived โ€” the revocations argument was empty' }\n\n const spaceRepo = getRepository(TwinSpace)\n const space =\n inst.spaceId ? await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId: inst.spaceId } }) : null\n const { layer, revoked, notFound } = revokeLocalDeclarations(\n inst.localDeclarations as LocalDeclaration[] | undefined,\n revocations as DeclarationRevocation[]\n )\n /* ์ด ๋ฌธ์€ ํŠธ์œˆ ๊ฒน๋งŒ ๋ณธ๋‹ค โ€” ํ˜„์žฅ ๊ฐ’์„ ์—ฌ๊ธฐ์„œ ๋นผ๋ ค ํ•˜๋ฉด ใ€Œ๊ฒน์— ์—†๋‹คใ€๋‹ค(์ „์šฉ ๋ฌธ์œผ๋กœ ๊ฐ€์•ผ ํ•œ๋‹ค). */\n if (!revoked.length) return { ok: false, error: 'no declaration matched at this twin โ€” a facility value is revoked at its facility', scope: 'instance', notFound }\n\n /*\n * ๋ชจ๋ธ์„ ๋˜๋Œ๋ฆฌ๋Š” ์ˆœ์„œ โ€” **๋บ€ ๋’ค ๋‚จ์€ ๋‘ ๊ฒน์„ ๋‹ค์‹œ ์–น๋Š”๋‹ค.**\n *\n * ๊ฐ’์„ ใ€Œ๊ธฐ์–ตํ•œ ์›์ฒœ ๊ฐ’ใ€์œผ๋กœ ๊ณง์žฅ ๋˜๋Œ๋ฆฌ๋ฉด, ํŠธ์œˆ ๊ฒน์„ ๋บ์„ ๋•Œ ๊ทธ ์•„๋ž˜ ์žˆ๋˜ **ํ˜„์žฅ ๊ฐ’์ด ๋˜์‚ด์•„๋‚˜์ง€\n * ์•Š๋Š”๋‹ค**(์›์ฒœ ๊ฐ’์ด ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค). ๊ฒน์ด ๋‘˜์ด ๋œ ๋’ค์—๋Š” ใ€Œ๋นผ๊ณ  ๋‹ค์‹œ ์–น๊ธฐใ€๊ฐ€ ์œ ์ผํ•˜๊ฒŒ ์˜ณ์€\n * ๋˜๋Œ๋ฆผ์ด๋‹ค โ€” ๊ทธ๋Ÿฌ๋ฉด ํŠธ์œˆ ๊ฐ’์„ ๋นผ๋ฉด ํ˜„์žฅ ๊ฐ’์ด, ํ˜„์žฅ ๊ฐ’์„ ๋นผ๋ฉด ์›์ฒœ ๊ฐ’์ด ๋“œ๋Ÿฌ๋‚œ๋‹ค.\n */\n const restore = restoreRevoked(inst.model, revoked)\n const nextSpace = (space?.localDeclarations ?? []) as LocalDeclaration[]\n const nextInst = layer\n\n const relaid = applyDeclarationLayers(restore.model, nextSpace, nextInst)\n\n inst.localDeclarations = relaid.instanceLayerApplied\n await repo.save(inst)\n if (space) {\n space.localDeclarations = relaid.spaceLayerApplied\n await spaceRepo.save(space)\n }\n\n /*\n * **๊ฒน์—์„œ ๋บ€ ๊ฒƒ**๊ณผ **๊ฐ’์„ ๋˜๋Œ๋ฆฐ ๊ฒƒ**์€ ๋‹ค๋ฅธ ์ผ์ด๋‹ค โ€” ๊ฐˆ๋ผ์„œ ๋งํ•œ๋‹ค.\n *\n * ์ฒ˜์Œ์—๋Š” ๋˜๋Œ๋ฆฐ ๊ฒƒ๋งŒ `revoked` ๋กœ ๋ƒˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ์–ต ์—†๋Š” ์˜› ์„ ์–ธ์„ ์ฒ ํšŒํ•˜๋ฉด ใ€Œrevoked: [] ใ€์ด\n * ๋Œ์•„์™”๋‹ค โ€” ๊ฒน์—์„œ๋Š” ๋ถ„๋ช…ํžˆ ๋บ๋Š”๋ฐ(๋‹ค์‹œ ์–นํžˆ์ง€ ์•Š๋Š”๋‹ค) ์•„๋ฌด ์ผ๋„ ์—†์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ฝํžŒ๋‹ค.\n */\n const report = {\n scope: 'instance',\n withdrawn: revoked.map(r => ({ target: r.target, id: r.id, propertyId: r.propertyId })),\n restored: restore.restored,\n ...(notFound.length ? { notFound } : {}),\n ...(restore.unknownSource.length\n ? {\n unknownSource: restore.unknownSource,\n note: 'these declarations were made before the overridden value was remembered โ€” the property keeps its current value until the next resync from the source'\n }\n : {}),\n ...(restore.missingTargets.length ? { missingTargets: restore.missingTargets } : {})\n }\n\n const running = TwinEngine.modeOf(domainId, instanceId)\n if (running === 'live') {\n const shift = await TwinEngine.adoptStructure(domainId, instanceId, relaid.model, 'revoked local declarations (twin)')\n return { ok: true, applied: 'running', ...report, revision: shift.rev }\n }\n\n inst.model = relaid.model\n await repo.save(inst)\n await projectStructure(domainId, instanceId, relaid.model, instanceId)\n return {\n ok: true,\n applied: running ? 'on-restart' : 'stored',\n ...(running ? { note: 'a running simulation keeps its current declarations โ€” restart it to run without them' } : {}),\n ...report\n }\n }\n /**\n * **ํ˜„์žฅ์˜ ๊ฐ’์„ ์„ ์–ธํ•œ๋‹ค** โ€” ํŠธ์œˆ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฅ์ด ์ฃผ์–ด๋‹ค.\n *\n * โ”€โ”€ ์™œ ํŠธ์œˆ ๋ฌธ๊ณผ ๊ฐˆ๋ž๋‚˜ (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ฒ˜์Œ์—๋Š” ํŠธ์œˆ ๋ฌธ์— ๋ฒ”์œ„ ์ธ์ž๋ฅผ ๋‘์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด **ํ˜„์žฅ ๊ฐ’์„ ๋„ฃ์œผ๋ ค๊ณ  ํŠธ์œˆ์„ ๊ณจ๋ผ์•ผ ํ•œ๋‹ค** โ€” ํŠธ์œˆ์€ ๊ทธ\n * ๊ฐ’์„ ์ฝ๋Š” ์ชฝ์ด๋ฏ€๋กœ ๊ฐœ๋…์ด ๊ฑฐ๊พธ๋กœ๋‹ค(์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์–ด๊ธ‹๋‚จ์„ ์ง€์ ํ–ˆ๋‹ค). ์ฃผ์–ด๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋ฌธ๋„ ๋‹ค๋ฅด๋‹ค.\n *\n * ์–ดํœ˜๋Š” **๊ทธ ํ˜„์žฅ ํŠธ์œˆ๋“ค์˜ ํ•ฉ์ง‘ํ•ฉ**์œผ๋กœ ๊ฒ€์‚ฌํ•œ๋‹ค: ํ•œ ํ˜„์žฅ์— ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์‚ด๊ณ , ์š”๊ธˆ์€ ์—๋„ˆ์ง€ ํŠธ์œˆ๋งŒ\n * ์ฝ๋Š”๋‹ค. ์–ด๋А ์ข…๋ฅ˜๋„ ์ฝ์ง€ ์•Š๋Š” ์†์„ฑ์€ ๊ฑฐ์ ˆํ•œ๋‹ค(๋ชจ๋ฅด๋Š” ๊ฐ’์„ ๋ฐ›์•„ ๋‘๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋„ฃ์—ˆ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค).\n *\n * ๋„ฃ์€ ๊ฐ’์€ ๊ทธ ํ˜„์žฅ์˜ **ํŠธ์œˆ ์ „๋ถ€**์— ์–นํžŒ๋‹ค โ€” ํ•œ ํŠธ์œˆ๋งŒ ๋ฐ”๊ฟ” ๋‘๋ฉด ใ€Œํ˜„์žฅ ์ „์ฒด๊ฐ€ ์ฝ๋Š”๋‹คใ€๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n * ์–น์„ ์ž๋ฆฌ๊ฐ€ ์—†๋Š” ํŠธ์œˆ์€ ์ •์ƒ์ด๊ณ (์ฐฝ๊ณ  ํŠธ์œˆ์— ์š”๊ธˆ ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค), ์•„๋ฌด ํŠธ์œˆ๋„ ๋ฐ›์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ทธ ์‚ฌ์‹ค์„\n * ๋งํ•œ๋‹ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Declare values that belong to a whole facility (space) rather than to one twin โ€” tariff, currency, contracted power. They are applied to every twin in the facility (a twin-scope declaration of the same property still wins), and survive a resync from the source.'\n })\n async declareSpaceProperties(\n @Arg('spaceId') spaceId: string,\n @Arg('declarations', type => [ScalarObject]) declarations: any[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const spaceRepo = getRepository(TwinSpace)\n const space = await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId } })\n if (!space) return { ok: false, error: `unknown facility: ${spaceId}` }\n if (!declarations?.length) return { ok: false, error: 'no declaration arrived โ€” the declarations argument was empty' }\n\n const twins = await getRepository(TwinInstance).find({ where: { domain: { id: domainId }, spaceId } })\n if (!twins.length) return { ok: false, error: `facility \"${spaceId}\" has no twin โ€” nothing would read the value` }\n\n /*\n * ๊ฒ€์‚ฌ๋Š” **์–ด๋А ์ข…๋ฅ˜๋“  ์ฝ์œผ๋ฉด ํ†ต๊ณผ**๋‹ค โ€” ํ˜„์žฅ์— ์—๋„ˆ์ง€ยท์ฐฝ๊ณ ๊ฐ€ ํ•จ๊ป˜ ์žˆ์œผ๋ฉด ์š”๊ธˆ์€ ์—๋„ˆ์ง€ ์ชฝ ์–ดํœ˜๋กœ\n * ๋ฐ›๋Š”๋‹ค. ๊ฑฐ์ ˆ ์ด์œ ๋Š” ์ข…๋ฅ˜๋ณ„๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ํ†ต๊ณผํ•œ ์ข…๋ฅ˜๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ์˜ ์ด์œ ๋ฅผ ๋Œ๋ ค์ค€๋‹ค.\n */\n /*\n * ๊ณต์ • ์ด๋ฆ„๋„ **ํ˜„์žฅ ํ•ฉ์ง‘ํ•ฉ**์œผ๋กœ ๋Œ€์กฐํ•œ๋‹ค โ€” ์ฐฝ๊ณ ๊ฐ€ ๋Œ๋ฆฌ๋Š” `putaway` ์™€ ์•ผ๋“œ๊ฐ€ ๋Œ๋ฆฌ๋Š” `spot` ์ด ํ•œ\n * ํ˜„์žฅ์— ํ•จ๊ป˜ ์žˆ๊ณ , ํ˜„์žฅ ๊ฐ’์€ ๊ทธ ์ „๋ถ€์— ์–นํžŒ๋‹ค. ํ•˜๋‚˜๋„ ํ™•์ธํ•  ์ˆ˜ ์—†์œผ๋ฉด ๋ชฉ๋ก์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค(๋ชจ๋ฅธ๋‹ค).\n */\n const knownSet = new Set<string>()\n for (const t of twins)\n for (const k of knownOperationKinds(\n t.model,\n TwinEngine.kernel(domainId, t.instanceId),\n await TwinEngine.measuredOperationKinds(domainId, t.instanceId)\n ) ?? [])\n knownSet.add(k)\n const knownOperations = knownSet.size ? [...knownSet] : undefined\n\n let accepted: LocalDeclaration[] = []\n let rejected: any[] = []\n for (const kind of [...new Set(twins.map(t => t.kind))]) {\n const r = validateLocalDeclarations(kind, declarations as LocalDeclaration[], { knownOperations })\n if (r.accepted.length > accepted.length) accepted = r.accepted\n if (!rejected.length) rejected = r.rejected\n }\n if (!accepted.length) return { ok: false, error: 'no declaration was accepted by any twin kind at this facility', rejected }\n\n const next = mergeLocalDeclarations(space.localDeclarations as LocalDeclaration[] | undefined, accepted)\n const spread = await spreadSpaceLayer(domainId, spaceId, next, 'local declarations (facility)')\n space.localDeclarations = spread.spaceLayerApplied as any\n await spaceRepo.save(space)\n\n const landed = spread.twins.filter(t => t.landed && t.applied !== 'failed')\n return {\n ok: true,\n scope: 'space',\n applied: landed.some(t => t.applied === 'running') ? 'running' : landed.length ? 'stored' : 'nowhere',\n accepted,\n ...(rejected.length ? { rejected } : {}),\n twins: spread.twins,\n ...(landed.length\n ? {}\n : { note: 'no twin at this facility has that target โ€” the value is kept, but nothing reads it yet' })\n }\n }\n\n /**\n * ํ˜„์žฅ์˜ ์„ ์–ธ์„ ์ฒ ํšŒํ•œ๋‹ค โ€” ๊ทธ ํ˜„์žฅ์˜ **๋ชจ๋“  ํŠธ์œˆ์—์„œ** ์‚ฌ๋ผ์ง„๋‹ค.\n *\n * ํŠธ์œˆ์ด ๊ฐ™์€ ์†์„ฑ์„ ์ž๊ธฐ ๊ฒน์— ๊ฐ–๊ณ  ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’์€ ๋‚จ๋Š”๋‹ค(์ข์€ ๊ฒƒ์ด ์ด๊ธด๋‹ค) โ€” ํ˜„์žฅ ๊ฐ’์„ ๋บ๋Š”๋ฐ ๊ทธ\n * ํŠธ์œˆ๋งŒ ๊ทธ๋Œ€๋กœ์ธ ๊ฒƒ์ด ์˜ณ๋‹ค. ํŠธ์œˆ๋งˆ๋‹ค ใ€Œ์›์ฒœ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ณ  ๋‚จ์€ ๋‘ ๊ฒน์„ ๋‹ค์‹œ ์–น๊ธฐใ€๋ฅผ ํ•œ๋‹ค.\n */\n @Directive('@privilege(category: \"twin\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ScalarObject, {\n description:\n 'Revoke facility-scope declarations, restoring on every twin in the facility the value that sat underneath (a twin-scope declaration of the same property stays, and the source value reappears where nothing else covers it).'\n })\n async revokeSpaceDeclarations(\n @Arg('spaceId') spaceId: string,\n @Arg('revocations', type => [ScalarObject]) revocations: any[],\n @Ctx() context: ResolverContext\n ): Promise<any> {\n const domainId = context.state.domain.id\n const spaceRepo = getRepository(TwinSpace)\n const space = await spaceRepo.findOne({ where: { domain: { id: domainId }, spaceId } })\n if (!space) return { ok: false, error: `unknown facility: ${spaceId}` }\n if (!revocations?.length) return { ok: false, error: 'no revocation arrived โ€” the revocations argument was empty' }\n\n const { layer, revoked, notFound } = revokeLocalDeclarations(\n space.localDeclarations as LocalDeclaration[] | undefined,\n revocations as DeclarationRevocation[]\n )\n if (!revoked.length) return { ok: false, error: 'no facility declaration matched', scope: 'space', notFound }\n\n const repoAll = getRepository(TwinInstance)\n const twins = await repoAll.find({ where: { domain: { id: domainId }, spaceId } })\n const per: { instanceId: string; applied: string; error?: string }[] = []\n let spaceApplied = layer\n for (const t of twins) {\n if (!t.model) continue\n const back = restoreRevoked(t.model, revoked)\n const out = applyDeclarationLayers(back.model, spaceApplied, (t.localDeclarations ?? []) as LocalDeclaration[])\n spaceApplied = out.spaceLayerApplied\n t.localDeclarations = out.instanceLayerApplied as any\n const running = TwinEngine.modeOf(domainId, t.instanceId)\n /* ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•ด๋„ ๋‚˜๋จธ์ง€๋Š” ๋˜๋Œ๋ฆฐ๋‹ค โ€” ์ด์œ ๋Š” ํŠธ์œˆ๋ณ„๋กœ ์ ์–ด ๋Œ๋ ค์ค€๋‹ค. */\n try {\n if (running === 'live') {\n await repoAll.save(t)\n await TwinEngine.adoptStructure(domainId, t.instanceId, out.model, 'revoked local declarations (facility)')\n per.push({ instanceId: t.instanceId, applied: 'running' })\n continue\n }\n t.model = out.model\n await repoAll.save(t)\n await projectStructure(domainId, t.instanceId, out.model, t.instanceId)\n per.push({ instanceId: t.instanceId, applied: running ? 'on-restart' : 'stored' })\n } catch (e: any) {\n per.push({ instanceId: t.instanceId, applied: 'failed', error: e?.message ?? 'failed' })\n }\n }\n space.localDeclarations = spaceApplied as any\n await spaceRepo.save(space)\n\n return {\n ok: true,\n scope: 'space',\n applied: per.some(x => x.applied === 'running') ? 'running' : 'stored',\n withdrawn: revoked.map(r => ({ target: r.target, id: r.id, propertyId: r.propertyId })),\n restored: revoked.filter(r => 'replaced' in r),\n ...(notFound.length ? { notFound } : {}),\n twins: per\n }\n }\n}\n"]}