@things-factory/headless-twin 10.0.8 โ†’ 10.0.10

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 (381) hide show
  1. package/dist-server/engine/attention-digest.d.ts +52 -0
  2. package/dist-server/engine/attention-digest.js +76 -0
  3. package/dist-server/engine/attention-digest.js.map +1 -0
  4. package/dist-server/engine/canonical-ingest.d.ts +2 -2
  5. package/dist-server/engine/canonical-ingest.js +24 -2
  6. package/dist-server/engine/canonical-ingest.js.map +1 -1
  7. package/dist-server/engine/command-routing.d.ts +33 -0
  8. package/dist-server/engine/command-routing.js +53 -0
  9. package/dist-server/engine/command-routing.js.map +1 -0
  10. package/dist-server/engine/energy-topology.d.ts +86 -0
  11. package/dist-server/engine/energy-topology.js +144 -0
  12. package/dist-server/engine/energy-topology.js.map +1 -0
  13. package/dist-server/engine/index.d.ts +11 -0
  14. package/dist-server/engine/index.js +17 -0
  15. package/dist-server/engine/index.js.map +1 -1
  16. package/dist-server/engine/kpi-baseline.d.ts +78 -0
  17. package/dist-server/engine/kpi-baseline.js +123 -0
  18. package/dist-server/engine/kpi-baseline.js.map +1 -0
  19. package/dist-server/engine/kpi-fold.d.ts +137 -1
  20. package/dist-server/engine/kpi-fold.js +225 -0
  21. package/dist-server/engine/kpi-fold.js.map +1 -1
  22. package/dist-server/engine/kpi-query.d.ts +32 -1
  23. package/dist-server/engine/kpi-query.js +262 -20
  24. package/dist-server/engine/kpi-query.js.map +1 -1
  25. package/dist-server/engine/kpi-target.d.ts +17 -0
  26. package/dist-server/engine/kpi-target.js +24 -2
  27. package/dist-server/engine/kpi-target.js.map +1 -1
  28. package/dist-server/engine/live-attentions.d.ts +1 -0
  29. package/dist-server/engine/live-attentions.js +7 -1
  30. package/dist-server/engine/live-attentions.js.map +1 -1
  31. package/dist-server/engine/live-feed-registry.d.ts +25 -0
  32. package/dist-server/engine/live-feed-registry.js +51 -0
  33. package/dist-server/engine/live-feed-registry.js.map +1 -0
  34. package/dist-server/engine/load-meter.d.ts +181 -0
  35. package/dist-server/engine/load-meter.js +267 -0
  36. package/dist-server/engine/load-meter.js.map +1 -0
  37. package/dist-server/engine/local-declarations.d.ts +262 -0
  38. package/dist-server/engine/local-declarations.js +528 -0
  39. package/dist-server/engine/local-declarations.js.map +1 -0
  40. package/dist-server/engine/model-basis.d.ts +39 -6
  41. package/dist-server/engine/model-basis.js +69 -9
  42. package/dist-server/engine/model-basis.js.map +1 -1
  43. package/dist-server/engine/model-vocabulary.d.ts +17 -0
  44. package/dist-server/engine/model-vocabulary.js +81 -0
  45. package/dist-server/engine/model-vocabulary.js.map +1 -0
  46. package/dist-server/engine/oee-accumulator.d.ts +28 -0
  47. package/dist-server/engine/oee-accumulator.js +26 -1
  48. package/dist-server/engine/oee-accumulator.js.map +1 -1
  49. package/dist-server/engine/operation-basis.d.ts +32 -0
  50. package/dist-server/engine/operation-basis.js +87 -0
  51. package/dist-server/engine/operation-basis.js.map +1 -0
  52. package/dist-server/engine/property-effects.d.ts +30 -0
  53. package/dist-server/engine/property-effects.js +192 -0
  54. package/dist-server/engine/property-effects.js.map +1 -0
  55. package/dist-server/engine/runtime-key.d.ts +15 -0
  56. package/dist-server/engine/runtime-key.js +64 -0
  57. package/dist-server/engine/runtime-key.js.map +1 -0
  58. package/dist-server/engine/spec-coverage.js +3 -3
  59. package/dist-server/engine/spec-coverage.js.map +1 -1
  60. package/dist-server/engine/state-axes.d.ts +21 -0
  61. package/dist-server/engine/state-axes.js +59 -0
  62. package/dist-server/engine/state-axes.js.map +1 -0
  63. package/dist-server/engine/structure-diff.js +1 -1
  64. package/dist-server/engine/structure-diff.js.map +1 -1
  65. package/dist-server/engine/travel-estimator.d.ts +9 -2
  66. package/dist-server/engine/travel-estimator.js +11 -6
  67. package/dist-server/engine/travel-estimator.js.map +1 -1
  68. package/dist-server/engine/twin-engine.d.ts +418 -57
  69. package/dist-server/engine/twin-engine.js +1599 -306
  70. package/dist-server/engine/twin-engine.js.map +1 -1
  71. package/dist-server/engine/warm-start.d.ts +93 -13
  72. package/dist-server/engine/warm-start.js +114 -14
  73. package/dist-server/engine/warm-start.js.map +1 -1
  74. package/dist-server/index.d.ts +1 -0
  75. package/dist-server/index.js +17 -11
  76. package/dist-server/index.js.map +1 -1
  77. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.d.ts +5 -0
  78. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +48 -0
  79. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -0
  80. package/dist-server/migrations/index.d.ts +2 -0
  81. package/dist-server/migrations/index.js +10 -0
  82. package/dist-server/migrations/index.js.map +1 -0
  83. package/dist-server/service/index.d.ts +3 -2
  84. package/dist-server/service/index.js +25 -17
  85. package/dist-server/service/index.js.map +1 -1
  86. package/dist-server/service/reference/discovery-result.d.ts +34 -0
  87. package/dist-server/service/reference/discovery-result.js +84 -0
  88. package/dist-server/service/reference/discovery-result.js.map +1 -0
  89. package/dist-server/service/reference/ingest-space.d.ts +53 -0
  90. package/dist-server/service/reference/ingest-space.js +79 -0
  91. package/dist-server/service/reference/ingest-space.js.map +1 -0
  92. package/dist-server/service/reference/knob-defaults.d.ts +20 -0
  93. package/dist-server/service/reference/knob-defaults.js +59 -0
  94. package/dist-server/service/reference/knob-defaults.js.map +1 -0
  95. package/dist-server/service/reference/reference-live.d.ts +23 -0
  96. package/dist-server/service/reference/reference-live.js +123 -6
  97. package/dist-server/service/reference/reference-live.js.map +1 -1
  98. package/dist-server/service/reference/reference-master.d.ts +227 -11
  99. package/dist-server/service/reference/reference-master.js +206 -25
  100. package/dist-server/service/reference/reference-master.js.map +1 -1
  101. package/dist-server/service/reference/reference-resolver.d.ts +33 -3
  102. package/dist-server/service/reference/reference-resolver.js +290 -23
  103. package/dist-server/service/reference/reference-resolver.js.map +1 -1
  104. package/dist-server/service/reference/template-registry.d.ts +19 -3
  105. package/dist-server/service/reference/template-registry.js.map +1 -1
  106. package/dist-server/service/twin-attention/twin-attention-query.d.ts +8 -1
  107. package/dist-server/service/twin-attention/twin-attention-query.js +39 -8
  108. package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
  109. package/dist-server/service/twin-audit/command-audit.d.ts +37 -0
  110. package/dist-server/service/twin-audit/command-audit.js +53 -0
  111. package/dist-server/service/twin-audit/command-audit.js.map +1 -0
  112. package/dist-server/service/twin-audit/index.d.ts +4 -0
  113. package/dist-server/service/twin-audit/index.js +8 -0
  114. package/dist-server/service/twin-audit/index.js.map +1 -0
  115. package/dist-server/service/twin-audit/twin-audit-event.d.ts +24 -0
  116. package/dist-server/service/twin-audit/twin-audit-event.js +125 -0
  117. package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -0
  118. package/dist-server/service/twin-audit/twin-audit-query.d.ts +4 -0
  119. package/dist-server/service/twin-audit/twin-audit-query.js +76 -0
  120. package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -0
  121. package/dist-server/service/twin-control/twin-control-mutation.d.ts +2 -0
  122. package/dist-server/service/twin-control/twin-control-mutation.js +50 -11
  123. package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
  124. package/dist-server/service/twin-event/twin-event-keys.d.ts +1 -1
  125. package/dist-server/service/twin-event/twin-event-keys.js +1 -1
  126. package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
  127. package/dist-server/service/twin-event/twin-event.d.ts +14 -5
  128. package/dist-server/service/twin-event/twin-event.js +46 -14
  129. package/dist-server/service/twin-event/twin-event.js.map +1 -1
  130. package/dist-server/service/twin-forecast/forecast-metrics.d.ts +13 -0
  131. package/dist-server/service/twin-forecast/forecast-metrics.js +57 -0
  132. package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -0
  133. package/dist-server/service/twin-forecast/forecast-tuning.d.ts +12 -0
  134. package/dist-server/service/twin-forecast/forecast-tuning.js +44 -0
  135. package/dist-server/service/twin-forecast/forecast-tuning.js.map +1 -0
  136. package/dist-server/service/twin-forecast/gap-analytics.d.ts +28 -2
  137. package/dist-server/service/twin-forecast/gap-analytics.js +43 -17
  138. package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
  139. package/dist-server/service/twin-forecast/twin-forecast-query.js +219 -39
  140. package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
  141. package/dist-server/service/twin-instance/twin-instance.d.ts +38 -5
  142. package/dist-server/service/twin-instance/twin-instance.js +66 -18
  143. package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
  144. package/dist-server/service/twin-journal/twin-journal-query.d.ts +11 -4
  145. package/dist-server/service/twin-journal/twin-journal-query.js +95 -15
  146. package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
  147. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +11 -5
  148. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +46 -27
  149. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
  150. package/dist-server/service/twin-metrics/twin-metrics-query.d.ts +1 -0
  151. package/dist-server/service/twin-metrics/twin-metrics-query.js +63 -1
  152. package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
  153. package/dist-server/service/twin-model/epcis-coverage.d.ts +14 -0
  154. package/dist-server/service/twin-model/epcis-coverage.js +174 -0
  155. package/dist-server/service/twin-model/epcis-coverage.js.map +1 -0
  156. package/dist-server/service/twin-model/iec61850-coverage.d.ts +14 -0
  157. package/dist-server/service/twin-model/iec61850-coverage.js +98 -0
  158. package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -0
  159. package/dist-server/service/twin-model/index.d.ts +13 -0
  160. package/dist-server/service/twin-model/index.js +29 -0
  161. package/dist-server/service/twin-model/index.js.map +1 -0
  162. package/dist-server/service/twin-model/isa95-coverage.d.ts +48 -0
  163. package/dist-server/service/twin-model/isa95-coverage.js +155 -0
  164. package/dist-server/service/twin-model/isa95-coverage.js.map +1 -0
  165. package/dist-server/service/twin-model/project-structure.d.ts +16 -0
  166. package/dist-server/service/twin-model/project-structure.js +173 -0
  167. package/dist-server/service/twin-model/project-structure.js.map +1 -0
  168. package/dist-server/service/twin-model/standard-coverage.d.ts +9 -0
  169. package/dist-server/service/twin-model/standard-coverage.js +37 -0
  170. package/dist-server/service/twin-model/standard-coverage.js.map +1 -0
  171. package/dist-server/service/twin-model/twin-equipment.d.ts +64 -0
  172. package/dist-server/service/twin-model/twin-equipment.js +134 -0
  173. package/dist-server/service/twin-model/twin-equipment.js.map +1 -0
  174. package/dist-server/service/twin-model/twin-lineage-query.d.ts +3 -0
  175. package/dist-server/service/twin-model/twin-lineage-query.js +206 -0
  176. package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -0
  177. package/dist-server/service/twin-model/twin-location.d.ts +58 -0
  178. package/dist-server/service/twin-model/twin-location.js +130 -0
  179. package/dist-server/service/twin-model/twin-location.js.map +1 -0
  180. package/dist-server/service/twin-model/twin-model-item-query.d.ts +141 -0
  181. package/dist-server/service/twin-model/twin-model-item-query.js +852 -0
  182. package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -0
  183. package/dist-server/service/twin-model/twin-model-mutation.d.ts +57 -0
  184. package/dist-server/service/twin-model/twin-model-mutation.js +490 -0
  185. package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -0
  186. package/dist-server/service/twin-model/twin-model-query.d.ts +43 -0
  187. package/dist-server/service/twin-model/twin-model-query.js +551 -0
  188. package/dist-server/service/twin-model/twin-model-query.js.map +1 -0
  189. package/dist-server/service/twin-model/twin-model-tree-query.d.ts +3 -0
  190. package/dist-server/service/twin-model/twin-model-tree-query.js +158 -0
  191. package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -0
  192. package/dist-server/service/twin-model/twin-operation.d.ts +61 -0
  193. package/dist-server/service/twin-model/twin-operation.js +137 -0
  194. package/dist-server/service/twin-model/twin-operation.js.map +1 -0
  195. package/dist-server/service/twin-space/move-space.d.ts +65 -0
  196. package/dist-server/service/twin-space/move-space.js +166 -0
  197. package/dist-server/service/twin-space/move-space.js.map +1 -0
  198. package/dist-server/service/twin-space/space-integrity.d.ts +97 -0
  199. package/dist-server/service/twin-space/space-integrity.js +182 -0
  200. package/dist-server/service/twin-space/space-integrity.js.map +1 -0
  201. package/dist-server/service/twin-space/twin-space-area.js +4 -4
  202. package/dist-server/service/twin-space/twin-space-area.js.map +1 -1
  203. package/dist-server/service/twin-space/twin-space-representation.js +6 -6
  204. package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
  205. package/dist-server/service/twin-space/twin-space-resolver.d.ts +63 -1
  206. package/dist-server/service/twin-space/twin-space-resolver.js +365 -18
  207. package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
  208. package/dist-server/service/twin-space/twin-space.d.ts +17 -1
  209. package/dist-server/service/twin-space/twin-space.js +15 -5
  210. package/dist-server/service/twin-space/twin-space.js.map +1 -1
  211. package/dist-server/service/twin-state/twin-state-subscription.js +1 -1
  212. package/dist-server/service/twin-state/twin-state-subscription.js.map +1 -1
  213. package/dist-server/service/twin-structure/twin-structure.d.ts +1 -1
  214. package/dist-server/service/twin-structure/twin-structure.js +8 -7
  215. package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
  216. package/dist-server/service/twin-target/twin-target-resolver.js +21 -4
  217. package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
  218. package/dist-shared/axis-read.d.ts +12 -0
  219. package/dist-shared/axis-read.js +32 -0
  220. package/dist-shared/axis-read.js.map +1 -0
  221. package/dist-shared/entity-delta.d.ts +29 -0
  222. package/dist-shared/entity-delta.js +287 -0
  223. package/dist-shared/entity-delta.js.map +1 -0
  224. package/dist-shared/kpi-broadcast.d.ts +4 -0
  225. package/dist-shared/kpi-broadcast.js +16 -0
  226. package/dist-shared/kpi-broadcast.js.map +1 -0
  227. package/dist-shared/twin-level.d.ts +23 -0
  228. package/dist-shared/twin-level.js +52 -0
  229. package/dist-shared/twin-level.js.map +1 -0
  230. package/package.json +14 -12
  231. package/server/engine/attention-digest.ts +102 -0
  232. package/server/engine/canonical-ingest.ts +36 -4
  233. package/server/engine/command-routing.ts +67 -0
  234. package/server/engine/energy-topology.ts +189 -0
  235. package/server/engine/index.ts +17 -0
  236. package/server/engine/kpi-baseline.ts +202 -0
  237. package/server/engine/kpi-fold.ts +389 -1
  238. package/server/engine/kpi-query.ts +295 -22
  239. package/server/engine/kpi-target.ts +24 -2
  240. package/server/engine/live-attentions.ts +7 -2
  241. package/server/engine/live-feed-registry.ts +58 -0
  242. package/server/engine/load-meter.ts +384 -0
  243. package/server/engine/local-declarations.ts +700 -0
  244. package/server/engine/model-basis.ts +78 -10
  245. package/server/engine/model-vocabulary.ts +82 -0
  246. package/server/engine/oee-accumulator.ts +34 -1
  247. package/server/engine/operation-basis.ts +100 -0
  248. package/server/engine/property-effects.ts +199 -0
  249. package/server/engine/runtime-key.ts +58 -0
  250. package/server/engine/spec-coverage.ts +3 -3
  251. package/server/engine/state-axes.ts +60 -0
  252. package/server/engine/structure-diff.ts +1 -1
  253. package/server/engine/travel-estimator.ts +11 -6
  254. package/server/engine/twin-engine.ts +1710 -297
  255. package/server/engine/warm-start.ts +207 -22
  256. package/server/index.ts +13 -10
  257. package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +43 -0
  258. package/server/migrations/index.ts +7 -0
  259. package/server/service/index.ts +9 -1
  260. package/server/service/reference/discovery-result.ts +95 -0
  261. package/server/service/reference/ingest-space.ts +104 -0
  262. package/server/service/reference/knob-defaults.ts +59 -0
  263. package/server/service/reference/reference-live.ts +121 -6
  264. package/server/service/reference/reference-master.ts +362 -35
  265. package/server/service/reference/reference-resolver.ts +307 -23
  266. package/server/service/reference/template-registry.ts +20 -5
  267. package/server/service/twin-attention/twin-attention-query.ts +43 -6
  268. package/server/service/twin-audit/command-audit.ts +81 -0
  269. package/server/service/twin-audit/index.ts +5 -0
  270. package/server/service/twin-audit/twin-audit-event.ts +112 -0
  271. package/server/service/twin-audit/twin-audit-query.ts +72 -0
  272. package/server/service/twin-control/twin-control-mutation.ts +53 -13
  273. package/server/service/twin-event/twin-event-keys.ts +1 -1
  274. package/server/service/twin-event/twin-event.ts +52 -15
  275. package/server/service/twin-forecast/forecast-metrics.ts +60 -0
  276. package/server/service/twin-forecast/forecast-tuning.ts +40 -0
  277. package/server/service/twin-forecast/gap-analytics.ts +48 -9
  278. package/server/service/twin-forecast/twin-forecast-query.ts +211 -38
  279. package/server/service/twin-instance/twin-instance.ts +127 -22
  280. package/server/service/twin-journal/twin-journal-query.ts +108 -14
  281. package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +40 -23
  282. package/server/service/twin-metrics/twin-metrics-query.ts +60 -3
  283. package/server/service/twin-model/epcis-coverage.ts +195 -0
  284. package/server/service/twin-model/iec61850-coverage.ts +117 -0
  285. package/server/service/twin-model/index.ts +25 -0
  286. package/server/service/twin-model/isa95-coverage.ts +190 -0
  287. package/server/service/twin-model/project-structure.ts +199 -0
  288. package/server/service/twin-model/standard-coverage.ts +35 -0
  289. package/server/service/twin-model/twin-equipment.ts +150 -0
  290. package/server/service/twin-model/twin-lineage-query.ts +193 -0
  291. package/server/service/twin-model/twin-location.ts +140 -0
  292. package/server/service/twin-model/twin-model-item-query.ts +848 -0
  293. package/server/service/twin-model/twin-model-mutation.ts +503 -0
  294. package/server/service/twin-model/twin-model-query.ts +537 -0
  295. package/server/service/twin-model/twin-model-tree-query.ts +180 -0
  296. package/server/service/twin-model/twin-operation.ts +150 -0
  297. package/server/service/twin-space/move-space.ts +262 -0
  298. package/server/service/twin-space/space-integrity.ts +293 -0
  299. package/server/service/twin-space/twin-space-area.ts +4 -4
  300. package/server/service/twin-space/twin-space-representation.ts +6 -6
  301. package/server/service/twin-space/twin-space-resolver.ts +365 -22
  302. package/server/service/twin-space/twin-space.ts +40 -6
  303. package/server/service/twin-state/twin-state-subscription.ts +1 -1
  304. package/server/service/twin-structure/twin-structure.ts +10 -7
  305. package/server/service/twin-target/twin-target-resolver.ts +22 -4
  306. package/shared/axis-read.ts +28 -0
  307. package/shared/entity-delta.ts +286 -0
  308. package/shared/kpi-broadcast.ts +13 -0
  309. package/shared/twin-level.ts +48 -0
  310. package/test/adopt-structure-live.test.ts +133 -0
  311. package/test/attention-digest.test.ts +135 -0
  312. package/test/axis-read.test.ts +87 -0
  313. package/test/boot-resume.test.ts +205 -0
  314. package/test/canonical-ingest-vocabularies.test.ts +118 -0
  315. package/test/capability-mapping.test.ts +5 -5
  316. package/test/command-routing.test.ts +61 -0
  317. package/test/declaration-reaches-model.test.ts +178 -0
  318. package/test/discovery-result.test.ts +75 -0
  319. package/test/energy-topology.test.ts +113 -0
  320. package/test/entity-delta.test.ts +195 -25
  321. package/test/event-time-column.test.ts +67 -0
  322. package/test/forecast-metrics.test.ts +71 -0
  323. package/test/forecast-tuning.test.ts +42 -0
  324. package/test/gap-analytics.test.ts +34 -7
  325. package/test/ingest-bench.test.ts +9 -9
  326. package/test/ingest-running-guard.test.ts +136 -0
  327. package/test/ingest-space.test.ts +78 -0
  328. package/test/instance-cache-lifecycle.test.ts +110 -0
  329. package/test/kernel-kind-guard.test.ts +96 -0
  330. package/test/knob-defaults.test.ts +72 -0
  331. package/test/kpi-baseline-db.test.ts +216 -0
  332. package/test/kpi-baseline.test.ts +196 -0
  333. package/test/kpi-fold.test.ts +393 -2
  334. package/test/kpi-query-bench.test.ts +130 -0
  335. package/test/lineage-survives-restart.test.ts +203 -0
  336. package/test/live-feed-registry.test.ts +67 -0
  337. package/test/live-kernel-facts.test.ts +161 -0
  338. package/test/live-mirror-parity.test.ts +54 -14
  339. package/test/load-meter.test.ts +314 -0
  340. package/test/local-declarations.test.ts +554 -0
  341. package/test/master-to-twin.test.ts +128 -36
  342. package/test/model-basis.test.ts +56 -1
  343. package/test/model-vocabulary.test.ts +114 -0
  344. package/test/move-space.test.ts +149 -0
  345. package/test/mutation-gate.test.ts +122 -0
  346. package/test/oee-accumulator.test.ts +90 -7
  347. package/test/operation-basis.test.ts +100 -0
  348. package/test/operations-capability-db.test.ts +165 -0
  349. package/test/project-structure-db.test.ts +226 -0
  350. package/test/projection-reaches-screen.test.ts +272 -0
  351. package/test/property-effects.test.ts +96 -0
  352. package/test/registry-key-guard.test.ts +80 -0
  353. package/test/resync-origin-site.test.ts +77 -0
  354. package/test/runtime-key.test.ts +66 -0
  355. package/test/scale-twin-bench.test.ts +7 -7
  356. package/test/snapshot-freshness.test.ts +60 -0
  357. package/test/space-integrity.test.ts +223 -0
  358. package/test/standard-coverage.test.ts +94 -0
  359. package/test/state-axes.test.ts +74 -0
  360. package/test/streamline-e2e.test.ts +16 -16
  361. package/test/structure-revision-db.test.ts +16 -15
  362. package/test/tenant-registry-db.test.ts +149 -0
  363. package/test/twin-audit.test.ts +83 -0
  364. package/test/twin-model-item-db.test.ts +275 -0
  365. package/test/twin-model-tree-db.test.ts +176 -0
  366. package/test/twin-origin-resync.test.ts +114 -0
  367. package/test/warm-start-seam.test.ts +140 -0
  368. package/test/warm-start.test.ts +223 -4
  369. package/tsconfig.json +6 -1
  370. package/tsconfig.shared.json +23 -0
  371. package/tsconfig.shared.tsbuildinfo +1 -0
  372. package/tsconfig.tsbuildinfo +1 -0
  373. package/dist-server/engine/entity-delta.d.ts +0 -19
  374. package/dist-server/engine/entity-delta.js +0 -161
  375. package/dist-server/engine/entity-delta.js.map +0 -1
  376. package/dist-server/service/twin-event/backfill-keys.d.ts +0 -11
  377. package/dist-server/service/twin-event/backfill-keys.js +0 -63
  378. package/dist-server/service/twin-event/backfill-keys.js.map +0 -1
  379. package/dist-server/tsconfig.tsbuildinfo +0 -1
  380. package/server/engine/entity-delta.ts +0 -169
  381. package/server/service/twin-event/backfill-keys.ts +0 -72
@@ -0,0 +1 @@
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 { Arg, Ctx, Int, Query, Resolver } from 'type-graphql'\n\nimport { ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { TwinEngine } from '../../engine/index.js'\nimport { unwrapState } from '../../engine/warm-start.js'\nimport { propertyEffectsOf } from '../../engine/property-effects.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'\n\n/* ์ปค๋„ ๋Ÿฐํƒ€์ž„ ๋กœ๋“œ โ€” ์ถ•ยท๊ด€๊ณ„ยท์†์„ฑ ์„ ์–ธ์˜ SSOT. ์ด ํŒŒ์ผ์€ ๋„๋ฉ”์ธ ๋ชจ์–‘์„ ์•Œ์ง€ ์•Š๋Š”๋‹ค. */\nconst { TWIN_AXES, TWIN_RELATIONS, axisInfo, axisSource, documentPath, relationsFrom, relationsTo, propertiesOf } = require('@operato/twin-kernel')\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/** `productionSpec.definition.recipes` ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์„œ์—์„œ ๋”ฐ๋ผ๊ฐ„๋‹ค. */\nconst at = (o: any, path: string) => path.split('.').reduce((a: any, k: string) => (a == null ? undefined : a[k]), o)\n\n/**\n * ๋ฌธ์„œ ํ•ญ๋ชฉ์˜ **์‹๋ณ„์ž** โ€” ์ถ•๋งˆ๋‹ค ์ด๋ฆ„์ด ๋‹ค๋ฅด๋‹ค(์ž๋ฆฌ๋Š” `id`, ๊ณต์ •์€ `key`, ๋ ˆ์‹œํ”ผ๋„ `key`).\n *\n * ๋„๋ฉ”์ธ ๋ชจ์–‘์„ ์ฝ”๋“œ๊ฐ€ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ **์‹๋ณ„์ž ๊ด€๋ก€**๋ฅผ ์•„๋Š” ๊ฒƒ์ด๋‹ค. ํ›„๋ณด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ณ  ์ฒซ\n * ๊ฐ’์„ ์“ด๋‹ค. ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ๊ทธ ํ•ญ๋ชฉ์€ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ `null` โ€” ๋ชฉ๋ก์—์„œ ๋นผ์ง€ ์•Š๊ณ  **id ์—†์Œ**์œผ๋กœ\n * ๋‚ธ๋‹ค(์กฐ์šฉํžˆ ๋น ์ง€๋ฉด ๊ฑด์ˆ˜๊ฐ€ ์•ˆ ๋งž๋Š”๋‹ค).\n */\nconst idOf = (o: any): string | null => (typeof o === 'string' ? o : o?.id ?? o?.key ?? o?.gtin ?? null)\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()\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 return {\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 }\n\n if (row && q) {\n /*\n * ๊ฒ€์ƒ‰์€ ์•„์ง DB ๋กœ ๋‚ด๋ฆฌ์ง€ ์•Š์•˜๋‹ค. **๊ทธ ์‚ฌ์‹ค์„ ๋ฐํžŒ๋‹ค**(`basis: 'rows-scanned'`) โ€”\n * ํ‰๋‚ด๋กœ ๋ฎ์œผ๋ฉด ๊ทœ๋ชจ๊ฐ€ ์˜ค๋Š” ๋‚ ๊นŒ์ง€ ์•„๋ฌด๋„ ์ด ํ•œ๊ณ„๋ฅผ ๋ชจ๋ฅธ๋‹ค. ํ›‘๋Š” ๊ฑด์ˆ˜๋ฅผ ์ƒํ•œ์œผ๋กœ ๋ง‰๊ณ ,\n * ์ƒํ•œ์— ๋‹ฟ์•˜์œผ๋ฉด ์ž˜๋ ธ๋‹ค๊ณ  ๋งํ•œ๋‹ค(์กฐ์šฉํžˆ ์ž๋ฅด์ง€ ์•Š๋Š”๋‹ค).\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 return {\n axis,\n label: info.label,\n basis: 'rows-scanned',\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: this.namesFor(items, this.nameIndex(inst.model ?? {})) }\n })()\n }\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 const bucket = (snap as any)[axis]\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), 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: this.namesFor(items, this.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: this.namesFor(items, this.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 (axis !== 'materials' || !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 const refOf = (v: unknown): string | null => {\n const m = typeof v === 'string' ? /sgtin:[^.]+\\.([^.]+)\\./.exec(v) : null\n return m ? m[1] : null\n }\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 const bucket = snap ? (snap as any)[axis] : null\n const found = Array.isArray(bucket) ? bucket.find((o: any) => idOf(o) === itemId) : undefined\n if (!snap || !found) {\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 },\n declared: null, observed: found ?? null, observedOnly: true,\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 names: {}, provenance: { basis: 'state' }\n }\n }\n const names = this.namesFor([{ id: itemId, fields: found }], this.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 },\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 /*\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: this.namesFor(\n [{ id: itemId, fields: declared }, { fields: observed }, { fields: links }],\n { ...this.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 const bucket = state ? (state as any)[axis] : null\n /*\n * **์™œ ๊ด€์ธก์ด ์—†๋Š”์ง€ ๋งํ•œ๋‹ค.** ์˜ˆ์ „์—๋Š” ๊ทธ๋ƒฅ `null` ์ด์—ˆ๊ณ  ํ™”๋ฉด์€ ๊ทธ๊ฒƒ์„ \"ํŠธ์œˆ์ด ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์•„\"\n * ๋กœ ์ฝ์—ˆ๋‹ค โ€” ์‹คํ–‰ ์ค‘์ธ๋ฐ๋„ ๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ๋‹ค(๊ณต์ • ์ƒ์„ธ์—์„œ ๊ด€์ธก๋จ). ๊ณต์ •ยท๋ ˆ์‹œํ”ผ์ฒ˜๋Ÿผ **๊ด€์ธก ์ถ•์ด\n * ์•„๋‹Œ ๊ฒƒ**์€ ํŠธ์œˆ์ด ๋Œ๋“  ๋ง๋“  ๊ด€์ธก์ด ์—†๋‹ค. ์ด์œ ๊ฐ€ ๋‹ค๋ฅด๋ฉด ํ™”๋ฉด์ด ๋‹ค๋ฅด๊ฒŒ ๋งํ•ด์•ผ ํ•œ๋‹ค.\n */\n if (!Array.isArray(bucket)) return { absence: 'not-observed' as const }\n const value = bucket.find((x: any) => x?.id === 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 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 ids: ids.slice(0, NEIGHBOR_MAX),\n total: ids.length\n }\n }).filter((l: any) => l.total > 0)\n\n /* ๋“ค์–ด์˜ค๋Š” ์ชฝ โ€” ๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ญ๋ชฉ๋“ค. ๊ทธ ์ถ•์ด ํ–‰์ด๋ฉด DB ๊ฐ€ ์„ธ๊ณ , ๋ฌธ์„œ๋ฉด ๋ฌธ์„œ๋ฅผ ์ „์ˆ˜ ์กฐํšŒํ•œ๋‹ค. */\n const incoming: any[] = []\n for (const r of relationsTo(axis)) {\n const fromInfo = axisInfo(r.from)\n if (!fromInfo) continue\n const hits: string[] = []\n const row = ROW_BACKED[r.from]\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 if (hits.length) incoming.push({ via: r.via, from: r.from, field: r.field, ids: hits.slice(0, NEIGHBOR_MAX), total: hits.length })\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"]}
@@ -0,0 +1,57 @@
1
+ export declare class TwinModelMutation {
2
+ reprojectTwinModel(instanceId: string, context: ResolverContext): Promise<any>;
3
+ /**
4
+ * ํ˜„์žฅ์ด ์ •ํ•˜๋Š” ์ˆ˜๋ฅผ ํŠธ์œˆ์— ์–น๋Š”๋‹ค โ€” **๊ตฌ์กฐ๋Š” ์›์ฒœ์ด, ์ˆ˜๋Š” ํ˜„์žฅ์ด.**
5
+ *
6
+ * โ”€โ”€ ์™œ ์ด ๋ฌธ์ด ํ•„์š”ํ–ˆ๋‚˜ (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
7
+ * ์ปค๋„ฅํ„ฐ๋กœ ๋งŒ๋“  ํŠธ์œˆ์€ ๊ณ„ํ†ต๋„ยท๊ณ„๋Ÿ‰ ์ง€์ ์„ ์› ์‹œ์Šคํ…œ์—์„œ ์ฝ์–ด ์˜จ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์š”๊ธˆ ๋‹จ๊ฐ€ยท๊ณ„์•ฝ ์ •๋ณดยท
8
+ * ์ถ•์ „์ง€ ์ถฉ์ „์œจ์€ ์› ์‹œ์Šคํ…œ์ด ๋ชจ๋ฅธ๋‹ค(SCADA ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ์šฐ๋ฆฌ ์ „๊ธฐ ๊ณ„์•ฝ์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค). ๊ทธ๋ž˜์„œ
9
+ * ๊ณ„๋Ÿ‰์ด ํ๋ฅด๋Š” ํŠธ์œˆ์—์„œ๋„ **๊ธˆ์•ก์ด ์˜์›ํžˆ ๋‚˜์˜ค์ง€ ์•Š์•˜๋‹ค** โ€” ๋„ฃ์„ ๋ฌธ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
10
+ *
11
+ * ๊ฐ’์€ `model` ์— ์ง์ ‘ ์“ฐ์ง€ ์•Š๊ณ  **๊ฒน**์œผ๋กœ ๋ณด๊ด€ํ•œ๋‹ค: ๋ชจ๋ธ์€ ์›์ฒœ์˜ ์‚ฌ๋ณธ์ด๋ฏ€๋กœ ๋‹ค์‹œ ์ฝ๊ธฐ๊ฐ€ ๊ทธ๊ฒƒ์„
12
+ * ์ƒˆ๋กœ ๊ทธ๋ฆฌ๋ฉด ์ง์ ‘ ์“ด ๊ฐ’์€ ์กฐ์šฉํžˆ ์‚ฌ๋ผ์ง„๋‹ค. ๊ฒน์€ ๋ชจ๋ธ์„ ๊ทธ๋ฆด ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์–นํžŒ๋‹ค.
13
+ *
14
+ * โ”€โ”€ ๋Œ๊ณ  ์žˆ๋Š” ํŠธ์œˆ์— ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜ํ•˜๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
15
+ * ๋ฏธ๋Ÿฌ๋Š” **๋™์ž‘ ์ค‘์—** ์ƒˆ ๊ตฌ์กฐ๋ฅผ ๋ฐ›๋Š”๋‹ค(ํ˜„์‹ค์€ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค). ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค โ€” ์กฐ๊ฑด์ด
16
+ * ๋ฐ”๋€ ์‹คํ—˜์€ ๋‹ค๋ฅธ ์‹คํ—˜์ด๊ณ , ์ปค๋„์ด ๊ทธ๋ ‡๊ฒŒ ๊ฑฐ์ ˆํ•œ๋‹ค. ๊ทธ๋•Œ๋Š” ์ €์žฅ๋งŒ ํ•˜๊ณ  **๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค**:
17
+ * ์กฐ์šฉํžˆ ์„ฑ๊ณต์œผ๋กœ ๋‹ตํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ง€๊ธˆ ํ™”๋ฉด์˜ ์ˆ˜๊ฐ€ ์ƒˆ ์„ ์–ธ์œผ๋กœ ๊ณ„์‚ฐ๋œ ์ค„๋กœ ์ฝ๋Š”๋‹ค.
18
+ */
19
+ declareTwinProperties(instanceId: string, declarations: any[], context: ResolverContext): Promise<any>;
20
+ /**
21
+ * ์„ ์–ธ์„ **์ฒ ํšŒํ•œ๋‹ค** โ€” ์ž˜๋ชป ๋„ฃ์€ ๊ฐ’์„ ์›์ฒœ์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋ฌธ.
22
+ *
23
+ * โ”€โ”€ ์™œ ๋”ฐ๋กœ ๋ฌธ์ด ํ•„์š”ํ•œ๊ฐ€ (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
24
+ * ์„ ์–ธ์€ ๊ฒน์— ๋ณด๊ด€๋˜์ง€๋งŒ **์ €์žฅ๋œ ๋ชจ๋ธ์— ๊ตฌ์›Œ์ง„๋‹ค.** ๊ทธ๋ž˜์„œ ๊ฒน์—์„œ ์ค„๋งŒ ์ง€์›Œ๋„ ์›๋ž˜ ๊ฐ’์ด ๋Œ์•„์˜ค์ง€
25
+ * ์•Š๋Š”๋‹ค โ€” ๋˜๋Œ๋ฆด ๋ฐฉ๋ฒ•์ด ์•„์˜ˆ ์—†์–ด์„œ, ์˜คํƒ€๋ฅผ ใ€Œ์›๋ž˜ ๊ฐ’์„ ๋‹ค์‹œ ์„ ์–ธํ•˜๋Š”ใ€ ์šฐํšŒ๋กœ๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ์—ˆ๋‹ค
26
+ * (์‚ฌ์šฉ์ž๊ฐ€ ์›๋ž˜ ๊ฐ’์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๊ณ , ๋ชจ๋ฅด๋ฉด ๊ทธ ๊ฐ’์€ ์˜๊ตฌํžˆ ์ด๊ธด๋‹ค).
27
+ *
28
+ * ๊ทธ๋ž˜์„œ ๊ฒน์ด **๋ฌด์—‡์„ ๋ฎ์—ˆ๋Š”์ง€** ํ•จ๊ป˜ ๊ธฐ์–ตํ•˜๊ฒŒ ํ–ˆ๊ณ (`replaced`), ์ฒ ํšŒ๋Š” ๊ทธ ๊ธฐ์–ต์œผ๋กœ ๋˜๋Œ๋ฆฐ๋‹ค.
29
+ * ๊ธฐ์–ต์ด ์—†๋Š” ์˜› ์„ ์–ธ์€ **์†๋Œ€์ง€ ์•Š๊ณ  ๊ทธ๋ ‡๊ฒŒ ๋งํ•œ๋‹ค**(`unknownSource`) โ€” ์›๋ž˜ ๊ฐ’์„ ์ง€์–ด๋‚ด๋Š” ๊ฒƒ์€
30
+ * ์ž˜๋ชป ๋„ฃ์€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜๋‹ค. ๊ทธ ์ž๋ฆฌ๋Š” ๋‹ค์Œ ์›์ฒœ ์žฌ์ฝ๊ธฐ๊ฐ€ ๋ฐ”๋กœ์žก๋Š”๋‹ค.
31
+ *
32
+ * ๋ฐ˜์˜ ๋ฐฉ์‹์€ ์„ ์–ธ๊ณผ ๊ฐ™๋‹ค: ๋ฏธ๋Ÿฌ๋Š” ์ง€๊ธˆ ๋ฐ›๊ณ (`adoptStructure`), ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ์žฌ๊ธฐ๋™ ๋•Œ ๋ฐ›๋Š”๋‹ค.
33
+ */
34
+ revokeTwinDeclarations(instanceId: string, revocations: any[], context: ResolverContext): Promise<any>;
35
+ /**
36
+ * **ํ˜„์žฅ์˜ ๊ฐ’์„ ์„ ์–ธํ•œ๋‹ค** โ€” ํŠธ์œˆ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฅ์ด ์ฃผ์–ด๋‹ค.
37
+ *
38
+ * โ”€โ”€ ์™œ ํŠธ์œˆ ๋ฌธ๊ณผ ๊ฐˆ๋ž๋‚˜ (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
39
+ * ์ฒ˜์Œ์—๋Š” ํŠธ์œˆ ๋ฌธ์— ๋ฒ”์œ„ ์ธ์ž๋ฅผ ๋‘์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด **ํ˜„์žฅ ๊ฐ’์„ ๋„ฃ์œผ๋ ค๊ณ  ํŠธ์œˆ์„ ๊ณจ๋ผ์•ผ ํ•œ๋‹ค** โ€” ํŠธ์œˆ์€ ๊ทธ
40
+ * ๊ฐ’์„ ์ฝ๋Š” ์ชฝ์ด๋ฏ€๋กœ ๊ฐœ๋…์ด ๊ฑฐ๊พธ๋กœ๋‹ค(์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์–ด๊ธ‹๋‚จ์„ ์ง€์ ํ–ˆ๋‹ค). ์ฃผ์–ด๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋ฌธ๋„ ๋‹ค๋ฅด๋‹ค.
41
+ *
42
+ * ์–ดํœ˜๋Š” **๊ทธ ํ˜„์žฅ ํŠธ์œˆ๋“ค์˜ ํ•ฉ์ง‘ํ•ฉ**์œผ๋กœ ๊ฒ€์‚ฌํ•œ๋‹ค: ํ•œ ํ˜„์žฅ์— ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์‚ด๊ณ , ์š”๊ธˆ์€ ์—๋„ˆ์ง€ ํŠธ์œˆ๋งŒ
43
+ * ์ฝ๋Š”๋‹ค. ์–ด๋А ์ข…๋ฅ˜๋„ ์ฝ์ง€ ์•Š๋Š” ์†์„ฑ์€ ๊ฑฐ์ ˆํ•œ๋‹ค(๋ชจ๋ฅด๋Š” ๊ฐ’์„ ๋ฐ›์•„ ๋‘๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋„ฃ์—ˆ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค).
44
+ *
45
+ * ๋„ฃ์€ ๊ฐ’์€ ๊ทธ ํ˜„์žฅ์˜ **ํŠธ์œˆ ์ „๋ถ€**์— ์–นํžŒ๋‹ค โ€” ํ•œ ํŠธ์œˆ๋งŒ ๋ฐ”๊ฟ” ๋‘๋ฉด ใ€Œํ˜„์žฅ ์ „์ฒด๊ฐ€ ์ฝ๋Š”๋‹คใ€๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค.
46
+ * ์–น์„ ์ž๋ฆฌ๊ฐ€ ์—†๋Š” ํŠธ์œˆ์€ ์ •์ƒ์ด๊ณ (์ฐฝ๊ณ  ํŠธ์œˆ์— ์š”๊ธˆ ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค), ์•„๋ฌด ํŠธ์œˆ๋„ ๋ฐ›์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ทธ ์‚ฌ์‹ค์„
47
+ * ๋งํ•œ๋‹ค.
48
+ */
49
+ declareSpaceProperties(spaceId: string, declarations: any[], context: ResolverContext): Promise<any>;
50
+ /**
51
+ * ํ˜„์žฅ์˜ ์„ ์–ธ์„ ์ฒ ํšŒํ•œ๋‹ค โ€” ๊ทธ ํ˜„์žฅ์˜ **๋ชจ๋“  ํŠธ์œˆ์—์„œ** ์‚ฌ๋ผ์ง„๋‹ค.
52
+ *
53
+ * ํŠธ์œˆ์ด ๊ฐ™์€ ์†์„ฑ์„ ์ž๊ธฐ ๊ฒน์— ๊ฐ–๊ณ  ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’์€ ๋‚จ๋Š”๋‹ค(์ข์€ ๊ฒƒ์ด ์ด๊ธด๋‹ค) โ€” ํ˜„์žฅ ๊ฐ’์„ ๋บ๋Š”๋ฐ ๊ทธ
54
+ * ํŠธ์œˆ๋งŒ ๊ทธ๋Œ€๋กœ์ธ ๊ฒƒ์ด ์˜ณ๋‹ค. ํŠธ์œˆ๋งˆ๋‹ค ใ€Œ์›์ฒœ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ณ  ๋‚จ์€ ๋‘ ๊ฒน์„ ๋‹ค์‹œ ์–น๊ธฐใ€๋ฅผ ํ•œ๋‹ค.
55
+ */
56
+ revokeSpaceDeclarations(spaceId: string, revocations: any[], context: ResolverContext): Promise<any>;
57
+ }