@things-factory/headless-twin 10.0.15 โ†’ 10.0.18

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 (513) hide show
  1. package/dist-server/engine/attention-digest.d.ts +4 -4
  2. package/dist-server/engine/attention-digest.js +7 -7
  3. package/dist-server/engine/attention-digest.js.map +1 -1
  4. package/dist-server/engine/canonical-ingest.d.ts +18 -82
  5. package/dist-server/engine/canonical-ingest.js +183 -18
  6. package/dist-server/engine/canonical-ingest.js.map +1 -1
  7. package/dist-server/engine/command-routing.js +1 -1
  8. package/dist-server/engine/command-routing.js.map +1 -1
  9. package/dist-server/engine/declared-stimulus.js +1 -1
  10. package/dist-server/engine/declared-stimulus.js.map +1 -1
  11. package/dist-server/engine/energy-topology.js +4 -4
  12. package/dist-server/engine/energy-topology.js.map +1 -1
  13. package/dist-server/engine/ingest-dedupe.d.ts +38 -0
  14. package/dist-server/engine/ingest-dedupe.js +145 -0
  15. package/dist-server/engine/ingest-dedupe.js.map +1 -0
  16. package/dist-server/engine/ingest-health.d.ts +90 -10
  17. package/dist-server/engine/ingest-health.js +125 -16
  18. package/dist-server/engine/ingest-health.js.map +1 -1
  19. package/dist-server/engine/integration-probes.d.ts +3 -3
  20. package/dist-server/engine/integration-probes.js +6 -6
  21. package/dist-server/engine/integration-probes.js.map +1 -1
  22. package/dist-server/engine/kpi-baseline.js +4 -4
  23. package/dist-server/engine/kpi-baseline.js.map +1 -1
  24. package/dist-server/engine/kpi-fold.d.ts +212 -14
  25. package/dist-server/engine/kpi-fold.js +374 -21
  26. package/dist-server/engine/kpi-fold.js.map +1 -1
  27. package/dist-server/engine/kpi-query.d.ts +11 -11
  28. package/dist-server/engine/kpi-query.js +281 -36
  29. package/dist-server/engine/kpi-query.js.map +1 -1
  30. package/dist-server/engine/live-feed-registry.d.ts +1 -1
  31. package/dist-server/engine/live-feed-registry.js +1 -1
  32. package/dist-server/engine/live-feed-registry.js.map +1 -1
  33. package/dist-server/engine/load-meter.d.ts +1 -1
  34. package/dist-server/engine/load-meter.js.map +1 -1
  35. package/dist-server/engine/local-declarations.d.ts +7 -7
  36. package/dist-server/engine/local-declarations.js +15 -14
  37. package/dist-server/engine/local-declarations.js.map +1 -1
  38. package/dist-server/engine/log.d.ts +1 -1
  39. package/dist-server/engine/log.js +1 -1
  40. package/dist-server/engine/log.js.map +1 -1
  41. package/dist-server/engine/measured-estimator.js +1 -1
  42. package/dist-server/engine/measured-estimator.js.map +1 -1
  43. package/dist-server/engine/measured-yield.js +1 -1
  44. package/dist-server/engine/measured-yield.js.map +1 -1
  45. package/dist-server/engine/model-basis.d.ts +1 -1
  46. package/dist-server/engine/model-basis.js +1 -1
  47. package/dist-server/engine/model-basis.js.map +1 -1
  48. package/dist-server/engine/model-gap.d.ts +3 -3
  49. package/dist-server/engine/model-gap.js +1 -1
  50. package/dist-server/engine/model-gap.js.map +1 -1
  51. package/dist-server/engine/model-vocabulary.js +3 -3
  52. package/dist-server/engine/model-vocabulary.js.map +1 -1
  53. package/dist-server/engine/oee-accumulator.d.ts +6 -5
  54. package/dist-server/engine/oee-accumulator.js +6 -5
  55. package/dist-server/engine/oee-accumulator.js.map +1 -1
  56. package/dist-server/engine/property-effects.js +2 -2
  57. package/dist-server/engine/property-effects.js.map +1 -1
  58. package/dist-server/engine/read-time.d.ts +22 -0
  59. package/dist-server/engine/read-time.js +81 -0
  60. package/dist-server/engine/read-time.js.map +1 -0
  61. package/dist-server/engine/restart-policy.js +1 -1
  62. package/dist-server/engine/restart-policy.js.map +1 -1
  63. package/dist-server/engine/runtime-key.js +1 -1
  64. package/dist-server/engine/runtime-key.js.map +1 -1
  65. package/dist-server/engine/spec-coverage.d.ts +2 -2
  66. package/dist-server/engine/spec-coverage.js +1 -1
  67. package/dist-server/engine/spec-coverage.js.map +1 -1
  68. package/dist-server/engine/stage-path.d.ts +4 -4
  69. package/dist-server/engine/stage-path.js +1 -1
  70. package/dist-server/engine/stage-path.js.map +1 -1
  71. package/dist-server/engine/state-axes.d.ts +1 -1
  72. package/dist-server/engine/state-axes.js +2 -2
  73. package/dist-server/engine/state-axes.js.map +1 -1
  74. package/dist-server/engine/travel-estimator.d.ts +2 -2
  75. package/dist-server/engine/travel-estimator.js +1 -1
  76. package/dist-server/engine/travel-estimator.js.map +1 -1
  77. package/dist-server/engine/twin-engine.d.ts +307 -54
  78. package/dist-server/engine/twin-engine.js +822 -196
  79. package/dist-server/engine/twin-engine.js.map +1 -1
  80. package/dist-server/engine/warm-start.d.ts +2 -2
  81. package/dist-server/engine/warm-start.js +5 -5
  82. package/dist-server/engine/warm-start.js.map +1 -1
  83. package/dist-server/index.js +1 -1
  84. package/dist-server/index.js.map +1 -1
  85. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +1 -1
  86. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -1
  87. package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js +3 -3
  88. package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +1 -1
  89. package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js +2 -2
  90. package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +1 -1
  91. package/dist-server/migrations/1786300000000-IndexEventTypeByTime.d.ts +5 -0
  92. package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js +54 -0
  93. package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js.map +1 -0
  94. package/dist-server/migrations/1786400000000-IndexEventCreatedAt.d.ts +5 -0
  95. package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js +44 -0
  96. package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js.map +1 -0
  97. package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.d.ts +6 -0
  98. package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js +84 -0
  99. package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js.map +1 -0
  100. package/dist-server/migrations/index.js +7 -1
  101. package/dist-server/migrations/index.js.map +1 -1
  102. package/dist-server/routes.d.ts +1 -0
  103. package/dist-server/routes.js +69 -5
  104. package/dist-server/routes.js.map +1 -1
  105. package/dist-server/service/index.d.ts +2 -2
  106. package/dist-server/service/index.js +30 -24
  107. package/dist-server/service/index.js.map +1 -1
  108. package/dist-server/service/reference/control-routing.d.ts +1 -1
  109. package/dist-server/service/reference/control-routing.js +1 -1
  110. package/dist-server/service/reference/control-routing.js.map +1 -1
  111. package/dist-server/service/reference/discovery-result.d.ts +2 -2
  112. package/dist-server/service/reference/discovery-result.js +3 -3
  113. package/dist-server/service/reference/discovery-result.js.map +1 -1
  114. package/dist-server/service/reference/hook-contract.d.ts +43 -0
  115. package/dist-server/service/reference/hook-contract.js +59 -0
  116. package/dist-server/service/reference/hook-contract.js.map +1 -0
  117. package/dist-server/service/reference/ingest-space.d.ts +1 -1
  118. package/dist-server/service/reference/ingest-space.js +4 -4
  119. package/dist-server/service/reference/ingest-space.js.map +1 -1
  120. package/dist-server/service/reference/knob-defaults.d.ts +1 -1
  121. package/dist-server/service/reference/knob-defaults.js +4 -4
  122. package/dist-server/service/reference/knob-defaults.js.map +1 -1
  123. package/dist-server/service/reference/reference-adapter.d.ts +116 -9
  124. package/dist-server/service/reference/reference-adapter.js +27 -0
  125. package/dist-server/service/reference/reference-adapter.js.map +1 -1
  126. package/dist-server/service/reference/reference-hook.d.ts +20 -0
  127. package/dist-server/service/reference/reference-hook.js +133 -0
  128. package/dist-server/service/reference/reference-hook.js.map +1 -0
  129. package/dist-server/service/reference/reference-live.d.ts +2 -2
  130. package/dist-server/service/reference/reference-live.js +76 -13
  131. package/dist-server/service/reference/reference-live.js.map +1 -1
  132. package/dist-server/service/reference/reference-master.d.ts +25 -16
  133. package/dist-server/service/reference/reference-master.js +35 -13
  134. package/dist-server/service/reference/reference-master.js.map +1 -1
  135. package/dist-server/service/reference/reference-resolver.d.ts +1 -1
  136. package/dist-server/service/reference/reference-resolver.js +12 -12
  137. package/dist-server/service/reference/reference-resolver.js.map +1 -1
  138. package/dist-server/service/reference/template-registry.d.ts +1 -1
  139. package/dist-server/service/reference/template-registry.js.map +1 -1
  140. package/dist-server/service/reference/twin-reference.d.ts +3 -3
  141. package/dist-server/service/reference/twin-reference.js.map +1 -1
  142. package/dist-server/service/twin-attention/twin-attention-query.d.ts +1 -1
  143. package/dist-server/service/twin-attention/twin-attention-query.js +1 -1
  144. package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
  145. package/dist-server/service/twin-audit/command-audit.d.ts +1 -1
  146. package/dist-server/service/twin-audit/command-audit.js.map +1 -1
  147. package/dist-server/service/twin-audit/twin-audit-event.d.ts +1 -1
  148. package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -1
  149. package/dist-server/service/twin-audit/twin-audit-query.js +1 -1
  150. package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -1
  151. package/dist-server/service/twin-backfill/backfill-period-facts.d.ts +24 -0
  152. package/dist-server/service/twin-backfill/backfill-period-facts.js +96 -0
  153. package/dist-server/service/twin-backfill/backfill-period-facts.js.map +1 -0
  154. package/dist-server/service/twin-backfill/backfill-shape.d.ts +34 -0
  155. package/dist-server/service/twin-backfill/backfill-shape.js +75 -0
  156. package/dist-server/service/twin-backfill/backfill-shape.js.map +1 -0
  157. package/dist-server/service/twin-backfill/index.d.ts +2 -0
  158. package/dist-server/service/twin-backfill/index.js +6 -0
  159. package/dist-server/service/twin-backfill/index.js.map +1 -0
  160. package/dist-server/service/twin-backfill/twin-backfill-resolver.d.ts +10 -0
  161. package/dist-server/service/twin-backfill/twin-backfill-resolver.js +44 -0
  162. package/dist-server/service/twin-backfill/twin-backfill-resolver.js.map +1 -0
  163. package/dist-server/service/twin-control/twin-control-mutation.js +3 -3
  164. package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
  165. package/dist-server/service/twin-event/twin-event-keys.d.ts +1 -1
  166. package/dist-server/service/twin-event/twin-event-keys.js +2 -2
  167. package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
  168. package/dist-server/service/twin-event/twin-event-type.d.ts +1 -0
  169. package/dist-server/service/twin-event/twin-event-type.js +8 -1
  170. package/dist-server/service/twin-event/twin-event-type.js.map +1 -1
  171. package/dist-server/service/twin-event/twin-event.d.ts +2 -2
  172. package/dist-server/service/twin-event/twin-event.js +32 -4
  173. package/dist-server/service/twin-event/twin-event.js.map +1 -1
  174. package/dist-server/service/twin-forecast/forecast-metrics.js +1 -1
  175. package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -1
  176. package/dist-server/service/twin-forecast/gap-analytics.d.ts +1 -1
  177. package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
  178. package/dist-server/service/twin-forecast/twin-forecast-query.js +29 -11
  179. package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
  180. package/dist-server/service/twin-ingest-window/twin-ingest-window-query.d.ts +1 -1
  181. package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js +1 -1
  182. package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +1 -1
  183. package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js +1 -1
  184. package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +1 -1
  185. package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
  186. package/dist-server/service/twin-journal/event-type-split-shape.d.ts +50 -0
  187. package/dist-server/service/twin-journal/event-type-split-shape.js +111 -0
  188. package/dist-server/service/twin-journal/event-type-split-shape.js.map +1 -0
  189. package/dist-server/service/twin-journal/event-type-split.d.ts +15 -0
  190. package/dist-server/service/twin-journal/event-type-split.js +102 -0
  191. package/dist-server/service/twin-journal/event-type-split.js.map +1 -0
  192. package/dist-server/service/twin-journal/journal-order.d.ts +15 -0
  193. package/dist-server/service/twin-journal/journal-order.js +17 -0
  194. package/dist-server/service/twin-journal/journal-order.js.map +1 -0
  195. package/dist-server/service/twin-journal/twin-journal-query.d.ts +5 -5
  196. package/dist-server/service/twin-journal/twin-journal-query.js +232 -21
  197. package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
  198. package/dist-server/service/twin-lifecycle/domain-catalog.js +2 -1
  199. package/dist-server/service/twin-lifecycle/domain-catalog.js.map +1 -1
  200. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +27 -1
  201. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +59 -3
  202. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
  203. package/dist-server/service/twin-metrics/twin-metrics-query.js +14 -1
  204. package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
  205. package/dist-server/service/twin-model/axis-journal-evidence.js +1 -1
  206. package/dist-server/service/twin-model/axis-journal-evidence.js.map +1 -1
  207. package/dist-server/service/twin-model/epcis-coverage.js +34 -3
  208. package/dist-server/service/twin-model/epcis-coverage.js.map +1 -1
  209. package/dist-server/service/twin-model/iec61850-coverage.js +1 -1
  210. package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -1
  211. package/dist-server/service/twin-model/isa95-coverage.d.ts +12 -9
  212. package/dist-server/service/twin-model/isa95-coverage.js +33 -9
  213. package/dist-server/service/twin-model/isa95-coverage.js.map +1 -1
  214. package/dist-server/service/twin-model/item-ref.js +2 -2
  215. package/dist-server/service/twin-model/item-ref.js.map +1 -1
  216. package/dist-server/service/twin-model/name-index.d.ts +1 -1
  217. package/dist-server/service/twin-model/name-index.js +2 -2
  218. package/dist-server/service/twin-model/name-index.js.map +1 -1
  219. package/dist-server/service/twin-model/project-structure.d.ts +1 -1
  220. package/dist-server/service/twin-model/project-structure.js +7 -6
  221. package/dist-server/service/twin-model/project-structure.js.map +1 -1
  222. package/dist-server/service/twin-model/twin-equipment.d.ts +2 -2
  223. package/dist-server/service/twin-model/twin-equipment.js +3 -3
  224. package/dist-server/service/twin-model/twin-equipment.js.map +1 -1
  225. package/dist-server/service/twin-model/twin-lineage-query.js +16 -5
  226. package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
  227. package/dist-server/service/twin-model/twin-location.d.ts +1 -1
  228. package/dist-server/service/twin-model/twin-location.js.map +1 -1
  229. package/dist-server/service/twin-model/twin-model-item-query.d.ts +3 -3
  230. package/dist-server/service/twin-model/twin-model-item-query.js +15 -15
  231. package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
  232. package/dist-server/service/twin-model/twin-model-mutation.d.ts +2 -2
  233. package/dist-server/service/twin-model/twin-model-mutation.js +4 -4
  234. package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -1
  235. package/dist-server/service/twin-model/twin-model-query.js +51 -30
  236. package/dist-server/service/twin-model/twin-model-query.js.map +1 -1
  237. package/dist-server/service/twin-model/twin-model-tree-query.js +23 -1
  238. package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
  239. package/dist-server/service/twin-model/twin-operation.d.ts +1 -1
  240. package/dist-server/service/twin-model/twin-operation.js +1 -1
  241. package/dist-server/service/twin-model/twin-operation.js.map +1 -1
  242. package/dist-server/service/twin-space/move-space.js +2 -2
  243. package/dist-server/service/twin-space/move-space.js.map +1 -1
  244. package/dist-server/service/twin-space/representation-role.d.ts +2 -0
  245. package/dist-server/service/twin-space/representation-role.js +18 -0
  246. package/dist-server/service/twin-space/representation-role.js.map +1 -0
  247. package/dist-server/service/twin-space/space-integrity.d.ts +1 -1
  248. package/dist-server/service/twin-space/space-integrity.js.map +1 -1
  249. package/dist-server/service/twin-space/twin-space-representation.d.ts +2 -0
  250. package/dist-server/service/twin-space/twin-space-representation.js +16 -0
  251. package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
  252. package/dist-server/service/twin-space/twin-space-resolver.d.ts +2 -2
  253. package/dist-server/service/twin-space/twin-space-resolver.js +37 -8
  254. package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
  255. package/dist-server/service/twin-structure/twin-structure.js +3 -3
  256. package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
  257. package/dist-server/service/twin-subject/event-subjects.d.ts +43 -0
  258. package/dist-server/service/twin-subject/event-subjects.js +137 -0
  259. package/dist-server/service/twin-subject/event-subjects.js.map +1 -0
  260. package/dist-server/service/twin-subject/index.d.ts +9 -0
  261. package/dist-server/service/twin-subject/index.js +16 -0
  262. package/dist-server/service/twin-subject/index.js.map +1 -0
  263. package/dist-server/service/twin-subject/item-resolver.d.ts +10 -0
  264. package/dist-server/service/twin-subject/item-resolver.js +93 -0
  265. package/dist-server/service/twin-subject/item-resolver.js.map +1 -0
  266. package/dist-server/service/twin-subject/subject-query-shape.d.ts +22 -0
  267. package/dist-server/service/twin-subject/subject-query-shape.js +88 -0
  268. package/dist-server/service/twin-subject/subject-query-shape.js.map +1 -0
  269. package/dist-server/service/twin-subject/twin-subject-backfill.d.ts +23 -0
  270. package/dist-server/service/twin-subject/twin-subject-backfill.js +159 -0
  271. package/dist-server/service/twin-subject/twin-subject-backfill.js.map +1 -0
  272. package/dist-server/service/twin-subject/twin-subject-event.d.ts +14 -0
  273. package/dist-server/service/twin-subject/twin-subject-event.js +111 -0
  274. package/dist-server/service/twin-subject/twin-subject-event.js.map +1 -0
  275. package/dist-server/service/twin-subject/twin-subject-fast-path.d.ts +39 -0
  276. package/dist-server/service/twin-subject/twin-subject-fast-path.js +295 -0
  277. package/dist-server/service/twin-subject/twin-subject-fast-path.js.map +1 -0
  278. package/dist-server/service/twin-subject/twin-subject-query.d.ts +27 -0
  279. package/dist-server/service/twin-subject/twin-subject-query.js +232 -0
  280. package/dist-server/service/twin-subject/twin-subject-query.js.map +1 -0
  281. package/dist-server/service/twin-subject/twin-subject-writer.d.ts +27 -0
  282. package/dist-server/service/twin-subject/twin-subject-writer.js +166 -0
  283. package/dist-server/service/twin-subject/twin-subject-writer.js.map +1 -0
  284. package/dist-server/service/twin-target/twin-target-resolver.js +1 -1
  285. package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
  286. package/dist-shared/entity-delta.d.ts +1 -1
  287. package/dist-shared/entity-delta.js +4 -4
  288. package/dist-shared/entity-delta.js.map +1 -1
  289. package/dist-shared/touched-items.js +2 -2
  290. package/dist-shared/touched-items.js.map +1 -1
  291. package/dist-shared/twin-level.js +1 -1
  292. package/dist-shared/twin-level.js.map +1 -1
  293. package/package.json +7 -6
  294. package/server/engine/attention-digest.ts +9 -9
  295. package/server/engine/canonical-ingest.ts +202 -87
  296. package/server/engine/command-routing.ts +1 -1
  297. package/server/engine/declared-stimulus.ts +1 -1
  298. package/server/engine/energy-topology.ts +2 -2
  299. package/server/engine/ingest-dedupe.ts +149 -0
  300. package/server/engine/ingest-health.ts +171 -22
  301. package/server/engine/integration-probes.ts +7 -7
  302. package/server/engine/kpi-baseline.ts +4 -4
  303. package/server/engine/kpi-fold.ts +592 -41
  304. package/server/engine/kpi-query.ts +307 -48
  305. package/server/engine/live-feed-registry.ts +1 -1
  306. package/server/engine/load-meter.ts +1 -1
  307. package/server/engine/local-declarations.ts +15 -14
  308. package/server/engine/log.ts +1 -1
  309. package/server/engine/measured-estimator.ts +1 -1
  310. package/server/engine/measured-yield.ts +1 -1
  311. package/server/engine/model-basis.ts +2 -2
  312. package/server/engine/model-gap.ts +3 -3
  313. package/server/engine/model-vocabulary.ts +2 -2
  314. package/server/engine/oee-accumulator.ts +8 -6
  315. package/server/engine/property-effects.ts +2 -2
  316. package/server/engine/read-time.ts +77 -0
  317. package/server/engine/restart-policy.ts +1 -1
  318. package/server/engine/runtime-key.ts +1 -1
  319. package/server/engine/spec-coverage.ts +3 -3
  320. package/server/engine/stage-path.ts +5 -5
  321. package/server/engine/state-axes.ts +2 -2
  322. package/server/engine/travel-estimator.ts +2 -2
  323. package/server/engine/twin-engine.ts +906 -205
  324. package/server/engine/warm-start.ts +6 -6
  325. package/server/index.ts +1 -1
  326. package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +1 -1
  327. package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +3 -3
  328. package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +2 -2
  329. package/server/migrations/1786300000000-IndexEventTypeByTime.ts +48 -0
  330. package/server/migrations/1786400000000-IndexEventCreatedAt.ts +38 -0
  331. package/server/migrations/1786500000000-CreateTwinSubjectEvents.ts +93 -0
  332. package/server/migrations/index.ts +7 -1
  333. package/server/routes.ts +73 -5
  334. package/server/service/index.ts +7 -1
  335. package/server/service/reference/control-routing.ts +1 -1
  336. package/server/service/reference/discovery-result.ts +3 -3
  337. package/server/service/reference/hook-contract.ts +103 -0
  338. package/server/service/reference/ingest-space.ts +4 -4
  339. package/server/service/reference/knob-defaults.ts +4 -4
  340. package/server/service/reference/reference-adapter.ts +145 -10
  341. package/server/service/reference/reference-hook.ts +145 -0
  342. package/server/service/reference/reference-live.ts +87 -15
  343. package/server/service/reference/reference-master.ts +51 -20
  344. package/server/service/reference/reference-resolver.ts +11 -11
  345. package/server/service/reference/template-registry.ts +1 -1
  346. package/server/service/reference/twin-reference.ts +3 -3
  347. package/server/service/twin-attention/twin-attention-query.ts +1 -1
  348. package/server/service/twin-audit/command-audit.ts +1 -1
  349. package/server/service/twin-audit/twin-audit-event.ts +2 -2
  350. package/server/service/twin-audit/twin-audit-query.ts +1 -1
  351. package/server/service/twin-backfill/backfill-period-facts.ts +168 -0
  352. package/server/service/twin-backfill/backfill-shape.ts +86 -0
  353. package/server/service/twin-backfill/index.ts +3 -0
  354. package/server/service/twin-backfill/twin-backfill-resolver.ts +35 -0
  355. package/server/service/twin-control/twin-control-mutation.ts +2 -2
  356. package/server/service/twin-event/twin-event-keys.ts +2 -2
  357. package/server/service/twin-event/twin-event-type.ts +18 -1
  358. package/server/service/twin-event/twin-event.ts +32 -6
  359. package/server/service/twin-forecast/forecast-metrics.ts +1 -1
  360. package/server/service/twin-forecast/gap-analytics.ts +1 -1
  361. package/server/service/twin-forecast/twin-forecast-query.ts +30 -11
  362. package/server/service/twin-ingest-window/twin-ingest-window-query.ts +1 -1
  363. package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +1 -1
  364. package/server/service/twin-instance/twin-instance.ts +4 -4
  365. package/server/service/twin-journal/event-type-split-shape.ts +112 -0
  366. package/server/service/twin-journal/event-type-split.ts +144 -0
  367. package/server/service/twin-journal/journal-order.ts +20 -0
  368. package/server/service/twin-journal/twin-journal-query.ts +224 -20
  369. package/server/service/twin-lifecycle/domain-catalog.ts +2 -1
  370. package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +58 -4
  371. package/server/service/twin-metrics/twin-metrics-query.ts +14 -1
  372. package/server/service/twin-model/axis-journal-evidence.ts +1 -1
  373. package/server/service/twin-model/epcis-coverage.ts +34 -3
  374. package/server/service/twin-model/iec61850-coverage.ts +1 -1
  375. package/server/service/twin-model/isa95-coverage.ts +43 -16
  376. package/server/service/twin-model/item-ref.ts +2 -2
  377. package/server/service/twin-model/name-index.ts +2 -2
  378. package/server/service/twin-model/project-structure.ts +7 -6
  379. package/server/service/twin-model/twin-equipment.ts +16 -4
  380. package/server/service/twin-model/twin-lineage-query.ts +16 -5
  381. package/server/service/twin-model/twin-location.ts +1 -1
  382. package/server/service/twin-model/twin-model-item-query.ts +15 -15
  383. package/server/service/twin-model/twin-model-mutation.ts +4 -4
  384. package/server/service/twin-model/twin-model-query.ts +49 -28
  385. package/server/service/twin-model/twin-model-tree-query.ts +26 -2
  386. package/server/service/twin-model/twin-operation.ts +2 -2
  387. package/server/service/twin-space/move-space.ts +3 -3
  388. package/server/service/twin-space/representation-role.ts +15 -0
  389. package/server/service/twin-space/space-integrity.ts +1 -1
  390. package/server/service/twin-space/twin-space-representation.ts +37 -0
  391. package/server/service/twin-space/twin-space-resolver.ts +40 -8
  392. package/server/service/twin-structure/twin-structure.ts +3 -3
  393. package/server/service/twin-subject/event-subjects.ts +155 -0
  394. package/server/service/twin-subject/index.ts +10 -0
  395. package/server/service/twin-subject/item-resolver.ts +92 -0
  396. package/server/service/twin-subject/subject-query-shape.ts +84 -0
  397. package/server/service/twin-subject/twin-subject-backfill.ts +196 -0
  398. package/server/service/twin-subject/twin-subject-event.ts +101 -0
  399. package/server/service/twin-subject/twin-subject-fast-path.ts +346 -0
  400. package/server/service/twin-subject/twin-subject-query.ts +210 -0
  401. package/server/service/twin-subject/twin-subject-writer.ts +189 -0
  402. package/server/service/twin-target/twin-target-resolver.ts +1 -1
  403. package/shared/entity-delta.ts +4 -4
  404. package/shared/touched-items.ts +2 -2
  405. package/shared/twin-level.ts +1 -1
  406. package/test/adopt-structure-live.test.ts +3 -3
  407. package/test/aggregate-not-findone.test.ts +112 -0
  408. package/test/attention-digest.test.ts +6 -6
  409. package/test/axis-read.test.ts +6 -5
  410. package/test/backfill-shape.test.ts +89 -0
  411. package/test/boot-resume.test.ts +20 -7
  412. package/test/broadcast-cost-baseline.test.ts +2 -1
  413. package/test/broadcast-period.test.ts +2 -2
  414. package/test/broadcast-queue-overflow.test.ts +244 -0
  415. package/test/canonical-ingest-vocabularies.test.ts +259 -8
  416. package/test/canonical-quantity-door.test.ts +2 -2
  417. package/test/capability-mapping.test.ts +1 -1
  418. package/test/checkpoint-refuses-empty.test.ts +2 -2
  419. package/test/connector-capability-declaration.test.ts +88 -0
  420. package/test/contract-layer-guard.test.ts +48 -0
  421. package/test/control-capability.test.ts +1 -1
  422. package/test/cursor-stall-not-read-failure.test.ts +2 -2
  423. package/test/declaration-reaches-model.test.ts +7 -5
  424. package/test/declared-stimulus.test.ts +4 -4
  425. package/test/discovery-result.test.ts +2 -2
  426. package/test/entity-delta.test.ts +4 -4
  427. package/test/equipment-identity-reaches.test.ts +57 -0
  428. package/test/event-subjects.test.ts +147 -0
  429. package/test/event-time-column.test.ts +3 -3
  430. package/test/event-type-split.test.ts +155 -0
  431. package/test/fact-scope-wiring.test.ts +96 -0
  432. package/test/fold-gap-speaks.test.ts +53 -0
  433. package/test/forecast-metrics.test.ts +1 -1
  434. package/test/forecast-tuning.test.ts +1 -1
  435. package/test/generated-not-counted.test.ts +99 -0
  436. package/test/ingest-bench.test.ts +2 -1
  437. package/test/ingest-health-engine.test.ts +2 -2
  438. package/test/ingest-health-wiring.test.ts +7 -5
  439. package/test/ingest-health.test.ts +6 -6
  440. package/test/ingest-history.test.ts +2 -2
  441. package/test/ingest-idempotent.test.ts +132 -0
  442. package/test/ingest-space.test.ts +3 -3
  443. package/test/ingest-wiring-guard.test.ts +197 -0
  444. package/test/integration-probes.test.ts +3 -3
  445. package/test/integration-runner.test.ts +1 -1
  446. package/test/item-ref.test.ts +1 -1
  447. package/test/journal-order-axis.test.ts +80 -0
  448. package/test/journal-read-discipline.test.ts +16 -6
  449. package/test/journal-retention.test.ts +171 -29
  450. package/test/journal-sort-axis.test.ts +1 -1
  451. package/test/journal-write-door.test.ts +3 -3
  452. package/test/journal-write-trend.test.ts +1 -1
  453. package/test/kernel-kind-guard.test.ts +3 -3
  454. package/test/knob-defaults.test.ts +1 -1
  455. package/test/kpi-baseline-db.test.ts +2 -2
  456. package/test/kpi-fold.test.ts +266 -14
  457. package/test/kpi-query-bench.test.ts +3 -3
  458. package/test/live-cursor-wiring.test.ts +6 -6
  459. package/test/live-kernel-facts.test.ts +11 -11
  460. package/test/live-mirror-parity.test.ts +9 -6
  461. package/test/load-meter.test.ts +1 -1
  462. package/test/local-declarations.test.ts +13 -12
  463. package/test/log-stamp.test.ts +1 -1
  464. package/test/master-to-twin.test.ts +2 -2
  465. package/test/measured-yield.test.ts +2 -2
  466. package/test/merge-streams.test.ts +70 -0
  467. package/test/mirror-resumes-from-checkpoint.test.ts +13 -13
  468. package/test/model-basis.test.ts +2 -2
  469. package/test/model-gap.test.ts +4 -4
  470. package/test/model-vocabulary.test.ts +2 -2
  471. package/test/move-space.test.ts +1 -1
  472. package/test/oee-accumulator.test.ts +20 -5
  473. package/test/operational-vocabulary.test.ts +2 -2
  474. package/test/project-structure-db.test.ts +2 -2
  475. package/test/projection-reaches-screen.test.ts +7 -2
  476. package/test/projection-reads-declared.test.ts +109 -0
  477. package/test/property-effects.test.ts +10 -6
  478. package/test/read-failure-ledger.test.ts +106 -0
  479. package/test/read-failure-visible.test.ts +7 -7
  480. package/test/read-time.test.ts +118 -0
  481. package/test/reference-grounding.test.ts +1 -1
  482. package/test/reference-hook.test.ts +86 -0
  483. package/test/registry-key-guard.test.ts +1 -1
  484. package/test/rename-twin.test.ts +81 -0
  485. package/test/restart-policy.test.ts +3 -3
  486. package/test/resync-origin-site.test.ts +3 -3
  487. package/test/revision-axis.test.ts +14 -8
  488. package/test/runtime-key.test.ts +3 -3
  489. package/test/scale-twin-bench.test.ts +2 -1
  490. package/test/snapshot-freshness.test.ts +4 -4
  491. package/test/source-outcome-audit.test.ts +1 -1
  492. package/test/space-integrity.test.ts +1 -1
  493. package/test/space-representation.test.ts +66 -0
  494. package/test/space-scope-includes-stopped.test.ts +55 -0
  495. package/test/spec-coverage.test.ts +1 -1
  496. package/test/standard-coverage.test.ts +19 -21
  497. package/test/status-tally.test.ts +1 -1
  498. package/test/structure-revision-db.test.ts +7 -7
  499. package/test/subject-fast-path.test.ts +148 -0
  500. package/test/subject-read-model.test.ts +175 -0
  501. package/test/touched-items.test.ts +2 -2
  502. package/test/twin-audit.test.ts +1 -1
  503. package/test/twin-event-keys.test.ts +1 -1
  504. package/test/twin-model-item-db.test.ts +5 -5
  505. package/test/twin-model-tree-db.test.ts +35 -2
  506. package/test/twin-origin-resync.test.ts +1 -1
  507. package/test/vocabulary-guard.test.ts +1 -1
  508. package/test/warm-start-seam.test.ts +1 -1
  509. package/test/warm-start.test.ts +6 -6
  510. package/test/withheld-door.test.ts +2 -2
  511. package/test/yield-loop.test.ts +4 -4
  512. package/tsconfig.shared.tsbuildinfo +1 -1
  513. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"isa95-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/isa95-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ISA-95 ์ ํ•ฉ์„ฑ ๊ธฐ์ค€ โ€” **ํ‘œ์ค€์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์˜ ๋ชฉ๋ก.**\n *\n * โ”€โ”€ ์™œ ์ด ํŒŒ์ผ์ด ํ•„์š”ํ•œ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ง€๊ธˆ๊นŒ์ง€ ํ™”๋ฉด์€ \"์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์ถ•\" ๋งŒ ๋ณด์˜€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฑ„์šด ๊ฒƒ์€ ์„ธ์–ด์ง€์ง€๋งŒ **๋น ์ง„ ๊ฒƒ์€ ์…€ ์ˆ˜ ์—†๋‹ค** โ€”\n * ์—†๋Š” ๊ฒƒ์€ ํ™”๋ฉด์— ์—†์œผ๋ฏ€๋กœ ์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ๋ฌป์ง€ ์•Š๋Š”๋‹ค. ํ‘œ์ค€ ์ค€์ˆ˜๋Š” \"์šฐ๋ฆฌ ์ถ•์— ํ‘œ์ค€ ์ด๋ฆ„์„ ๋ถ™์˜€๋‹ค\"\n * ๊ฐ€ ์•„๋‹ˆ๋ผ **ํ‘œ์ค€์˜ ๋ชฉ๋ก์„ ๊ธฐ์ค€์œผ๋กœ ๋น ์ง„ ๊ฒƒ์ด ์—†๋‹ค**๋Š” ๋ง์ด์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ์ค€์ด ์ฝ”๋“œ๋กœ ์žˆ์–ด์•ผ ๊ทธ\n * ๋ฌธ์žฅ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.\n *\n * โ”€โ”€ ์„ธ ์ธต์—์„œ ๋ณธ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํ‘œ์ค€ ์ค€์ˆ˜๋Š” ํ•œ ์ธต์˜ ์ผ์ด ์•„๋‹ˆ๋‹ค. ๊ฐœ๋…๋งˆ๋‹ค ์…‹์„ ๋”ฐ๋กœ ๋ณธ๋‹ค:\n *\n * ยท `structure` โ€” **๋ฐ์ดํ„ฐ๊ตฌ์กฐ**๊ฐ€ ์žˆ๋‚˜(์ปค๋„ ์ถ•ยทํ˜ธ์ŠคํŠธ ํ‘œ์— ์ด ๊ฐœ๋…์˜ ์ž๋ฆฌ๊ฐ€ ์žˆ๋‚˜)\n * ยท `behavior` โ€” **๊ธฐ๋Šฅ**์ด ๊ทธ๊ฒƒ์„ ์“ฐ๋‚˜(์ปค๋„์ด ๊ณ„ํšยท์ง‘ํ–‰ยท์ง‘๊ณ„์—์„œ ์‹ค์ œ๋กœ ๋‹ค๋ฃจ๋‚˜)\n * ยท `surface` โ€” **UI ๋…ธ์ถœ**์ด ์žˆ๋‚˜(์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‚˜)\n *\n * ์…‹์„ ํ•ฉ์น˜๋ฉด \"๊ตฌ์กฐ๋Š” ์žˆ๋Š”๋ฐ ์•„๋ฌด๋„ ์•ˆ ์“ฐ๋Š” ์ปฌ๋Ÿผ\" ๊ณผ \"์ปค๋„์€ ์“ฐ๋Š”๋ฐ ํ™”๋ฉด์— ์—†๋Š” ์‚ฌ์‹ค\" ์ด ๊ฐ™์€\n * ๊ฐ’์œผ๋กœ ๋ณด์ธ๋‹ค. ์‹ค์ œ๋กœ ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๋‘˜ ๋‹ค ๋‚˜์™”๋‹ค(์ธ๋ ฅ ๋ช…์„ธ๋Š” ๊ตฌ์กฐยท๊ธฐ๋Šฅ์ด ์žˆ์—ˆ์ง€๋งŒ ํ™”๋ฉด์—\n * ์—†์—ˆ๊ณ , `properties` ๋Š” ๊ตฌ์กฐ๋งŒ ์žˆ๋‹ค).\n *\n * โ”€โ”€ ๊ฐ’์€ ๊ด€์ธก์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ์ด๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์—ฌ๊ธฐ ์ ํžŒ ๊ฒƒ์€ **์‚ฌ๋žŒ์ด ํŒ๋‹จํ•ด ์ ์€ ์‚ฌ์‹ค**์ด๋‹ค(์ž๋™ ํŒ์ •์ด ์•„๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ํ‹€๋ฆด ์ˆ˜ ์žˆ๊ณ , ํ‹€๋ฆฌ๋ฉด\n * ์—ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค โ€” ํ™”๋ฉด์€ ์ด ์„ ์–ธ์„ ๊ทธ๋Œ€๋กœ ๋ณด์ด๊ณ  ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค. ์ž๋™์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ\n * ํ•˜๋‚˜๋Š” ์ž๋™์œผ๋กœ ํ•œ๋‹ค: `axis` ๊ฐ€ ์ปค๋„ ์ถ• ๋ชฉ๋ก์— ์—†์œผ๋ฉด ๊ทธ๊ฒƒ์€ **๊ตฌ์กฐ๊ฐ€ ์—†๋Š” ๊ฒƒ**์ด๋‹ค(์˜คํƒ€ ๋ฐฉ์ง€).\n *\n * โ”€โ”€ ์ด ํ‘œ๊ฐ€ ์ปค๋„์— ์—†๋Š” ์ด์œ  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ปค๋„์€ **๋Ÿฐํƒ€์ž„ ๋ชจ๋ธ์˜ SSOT** ๋‹ค(๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€). ์ด ํ‘œ๋Š” **์ฐธ์กฐ ๋ชจ๋ธ์˜ ๋ชฉ๋ก**์ด๋‹ค(๋ฌด์—‡์ด ์žˆ์–ด์•ผ\n * ํ•˜๋Š”๊ฐ€). ๋‘˜์€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์‚ฌ์‹ค์ด๊ณ , ํ›„์ž๋Š” ์ปค๋„์„ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ ๋„ ๋Š˜์–ด์•ผ ํ•œ๋‹ค.\n */\n\n/** ํ•œ ์ธต์˜ ์ƒํƒœ โ€” ์žˆ์Œ ยท ๋ถ€๋ถ„ ยท ์—†์Œ. \"๋ถ€๋ถ„\" ์„ ๋‘๋Š” ์ด์œ : ์ ˆ๋ฐ˜ ์žˆ๋Š” ๊ฒƒ์„ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ๊ธฐ์ค€์ด ์ฃฝ๋Š”๋‹ค. */\nexport type CoverageLevel = 'full' | 'partial' | 'none'\n\nexport interface Isa95Concept {\n /** ํ‘œ์ค€์ด ๋ถ€๋ฅด๋Š” ์ด๋ฆ„ โ€” ์ด ํ‘œ์˜ ํ‚ค๋‹ค(์šฐ๋ฆฌ ์–ดํœ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ‘œ์ค€ ์–ดํœ˜). */\n std: string\n /** ํ‘œ์ค€์˜ ์–ด๋А ๋ถ€๋ถ„์ธ๊ฐ€ โ€” Part 2(์ž์› ๋ชจ๋ธ) ยท Part 4(์ผ์ •ยท์‹ค์ ) ๋“ฑ. */\n part: string\n /** ์‚ฌ๋žŒ์ด ์ฝ๋Š” ์ด๋ฆ„(i18n ํ‚ค). ํ™”๋ฉด์ด ๋ฒˆ์—ญํ•œ๋‹ค. */\n label: string\n /** ์šฐ๋ฆฌ ์ปค๋„ ์ถ• โ€” ์žˆ์œผ๋ฉด ๋ฐ์ดํ„ฐ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์—†์œผ๋ฉด `null`. */\n axis: string | null\n /** ์„ธ ์ธต์˜ ์ƒํƒœ. `structure` ๋Š” `axis` ๋กœ๋„ ๊ฒ€์ฆ๋œ๋‹ค. */\n structure: CoverageLevel\n behavior: CoverageLevel\n surface: CoverageLevel\n /** ์™œ ๊ทธ ์ˆ˜์ค€์ธ์ง€ โ€” **๋ชจ๋ฅด๋Š” ๊ฒƒ์„ ๊ฐ์ถ”์ง€ ์•Š๊ธฐ ์œ„ํ•ด** ํ•œ ์ค„๋กœ ์ ๋Š”๋‹ค(i18n ํ‚ค). */\n note?: string\n /**\n * ์ž๊ธฐ ์ถ•์ด ์—†์„ ๋•Œ **์–ด๋””์„œ ๋ณด์ด๋‚˜** โ€” ๊ทธ ์‚ฌ์‹ค์„ ๋“ค๊ณ  ์žˆ๋Š” ์ถ•๋“ค.\n *\n * ใ€Œ์–ด๋””์—ใ€์นธ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ํ•ฉ์ณ๊ณ  ์žˆ์—ˆ๋‹ค: *์•„์ง ์ถ•์ด ์—†๋‹ค(๋ถ€์ฑ„)* ์™€ *์ถ•์ผ ์ˆ˜ ์—†๋‹ค(์„ค๊ณ„)*. ๊ฐ€์šฉ ๋Šฅ๋ ฅ์€\n * ๊ฐœ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ž์›์˜ ์ง€๊ธˆ ์ƒํƒœ์ด๋ฏ€๋กœ ์ถ•์ด ๋  ์ˆ˜ ์—†๋Š”๋ฐ, ์„ธ ์ธต์ด ๋‹ค ์™„์ „ํ•œ ์ค„์ด \"๊ฐœ๋… ์ถ•์ด ์—†์Šต๋‹ˆ๋‹ค\"\n * ๋ผ๊ณ ๋งŒ ๋งํ•˜๋ฉด **ํ‘œ๊ฐ€ ์Šค์Šค๋กœ ๋ชจ์ˆœ๋œ ๋ง์„ ํ•œ๋‹ค**(๋‹ค ๋๋‹ค๋ฉด์„œ ์—†๋‹ค๊ณ  ํ•œ๋‹ค).\n *\n * ๊ทธ๋ž˜์„œ ์ถ•์ผ ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ๊ฐˆ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์—ฌ๊ธฐ๊ฐ€ ๋น„์–ด ์žˆ๊ณ  ์ถ•๋„ ์—†์œผ๋ฉด ๊ทธ๊ฒƒ์€ **์ง„์งœ ๋นˆ์นธ**์ด๋‹ค.\n *\n * โ”€โ”€ โ˜… `surface` ์™€ ์ง์„ ๋งž์ถ˜๋‹ค (2026-08-24 ์‹ค์ธก์œผ๋กœ ๋ถ™์ž„) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ด ์นธ์€ ใ€Œ๊ทธ ์‚ฌ์‹ค์ด ์–ด๋А ์ถ•์— **๋‹ด๊ฒจ ์žˆ๋‚˜**ใ€๊ฐ€ ์•„๋‹ˆ๋ผ ใ€Œ**์–ด๋””์„œ ๋ณด์ด๋‚˜**ใ€๋‹ค. ํ™”๋ฉด์ด ๊ทธ๊ฒƒ์„\n * ใ€Œํ•ด๋‹น ์ถ• ํ•ญ๋ชฉ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹คใ€๋กœ ์ฝ์–ด ๋‚ด๋ฏ€๋กœ, ๋‘˜์ด ์–ด๊ธ‹๋‚˜๋ฉด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์„ ๋งํ•œ๋‹ค.\n *\n * `surface: 'none'` ์ธ๋ฐ ์—ฌ๊ธฐ๊ฐ€ ์ฐจ ์žˆ๋‹ค โ†’ **๊ฑฐ์ง“**. ์—†๋Š” ํ™”๋ฉด์œผ๋กœ ์‚ฌ๋žŒ์„ ๋ณด๋‚ธ๋‹ค\n * `surface` ๊ฐ€ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ๊ฐ€ ๋น„์–ด ์žˆ๋‹ค โ†’ **๊ณผ์†Œ**. ใ€Œ์ง„์งœ ๋นˆ์นธใ€์œผ๋กœ ์ฝํžŒ๋‹ค(์œ„ ๊ทœ์น™)\n *\n * ๊ฐ™์€ ๋‚  ์…‹์„ ๊ทธ๋ ‡๊ฒŒ ํ‹€๋ฆฌ๊ฒŒ ๋„ฃ์—ˆ๋‹ค: ์ƒˆ ๊ฐœ๋… ๋‘˜(`TestResult`ยท`OperationsEvent`)์— ํ™”๋ฉด์ด ์—†๋Š”๋ฐ\n * ๊ฐˆ ๊ณณ์„ ์ ์—ˆ๊ณ , `MaterialSublot` ์€ ๋ฌผํ’ˆ ์ด๋ฆ„์œผ๋กœ ๋ณด์ด๋Š”๋ฐ ๊ฐˆ ๊ณณ์„ ๋น„์›Œ ๋‘์—ˆ๋‹ค.\n */\n shownOn?: string[]\n}\n\n/*\n * ๊ฐ€์šฉ ๋Šฅ๋ ฅ(2026-08-12, ์ปค๋„ 0.6.8) โ€” **ํŒ์ •๊ณผ ์ด์œ ๊ฐ€ ์ƒํƒœ์— ์‹ค๋ ค ์˜จ๋‹ค**(`capability {available, reason}`).\n *\n * ์…‹ ๋‹ค ์™„์ „์ธ ๊ทผ๊ฑฐ: ์ƒํƒœ๊ฐ€ ํŒ์ •์„ ๋“ค๊ณ  ์˜ค๊ณ (์‹œ๋ฎฌยท๋ฏธ๋Ÿฌ๊ฐ€ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ํŒŒ์ƒํ•œ๋‹ค), ๋ฐฐ์ •์ด ๊ฐ™์€ ํŒ์ •์„\n * ์“ฐ๊ณ , ๋‘ ํ™”๋ฉด์ด ๊ฐ™์€ ๋‚ฑ๋ง๋กœ ๊ทธ ์ด์œ ๋ฅผ ๋ณด์ธ๋‹ค(์ž์› ํƒญ ๋ฐฐ์ง€ ยท ์ธ์ŠคํŽ™์…˜ ๊ด€์ธก ์—ด).\n *\n * ์™œ ์ถ•์ด ์—†๋Š”๊ฐ€ โ€” ๊ฐ€์šฉ ๋Šฅ๋ ฅ์€ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ **์ž์›์˜ ์ง€๊ธˆ ์ƒํƒœ**๋‹ค. ๊ฐœ๋… ์นด๋“œ๋กœ ์„ธ์šฐ๋ฉด ์‚ฌ๋žŒยท์„ค๋น„์™€\n * ๋‚˜๋ž€ํžˆ ๋†“์—ฌ \"๋Šฅ๋ ฅ์ด ๋ช‡ ๊ฐœ์ธ๊ฐ€\" ๋ฅผ ์„ธ๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๊ฑด ๋ฌผ์„ ์ผ์ด ์•„๋‹ˆ๋‹ค.\n */\n\n/*\n * ์ƒ์‚ฐ ๋Šฅ๋ ฅ(2026-08-13, ์ปค๋„ 0.6.12) โ€” **๊ตฌ๊ฐ„์˜ ์–‘์„ ํ‘œ์ค€ ์ข…๋ฅ˜๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.**\n *\n * `structure` ์™„์ „: ๊ณ„์•ฝ์ด ๋ณด๊ณ ์„œ๋ฅผ ๋‚ธ๋‹ค(`operationsCapabilityOf`) โ€” ๊ตฌ๊ฐ„(StartTimeยทEndTime) ยท ํ‘œ์ค€\n * ์—ด๊ฑฐ๊ฐ’(CommittedยทAvailableยทUnattainable) ยท ๊ณต์ •๋ณ„ ๋ถ„ํ•ด ยท ์ œ์•ฝํ•˜๋Š” ์ถ•. ๋‚ฑ๋ง์€ B2MML ๋Œ€์กฐ ํ›„ ํ‘œ์ค€ ๊ฒƒ์„\n * ๊ทธ๋Œ€๋กœ ์“ด๋‹ค(์šฐ๋ฆฌ ๋‚ฑ๋ง์„ ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค).\n * `behavior` ์™„์ „: ์•ฝ์ •์€ ์˜ค๋”์—์„œ, ๋‹ฌ์„ฑ๋ถˆ๊ฐ€๋Š” ์ž์› ํŒ์ •(`capabilityOf`)์—์„œ ์˜จ๋‹ค โ€” ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํŒ์ •์€\n * ๋ฐฐ์ •์ด ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ•œ ๋ฒŒ์ด๋‹ค. ํ‘œ์ค€์˜ `Unattainable` ์ •์˜๊ฐ€ ๊ทธ ํŒ์ •๊ณผ ๊ฒน์นœ๋‹ค.\n * `surface` ์™„์ „: ๋‘ ์ž๋ฆฌ์—์„œ ๋ณด์ธ๋‹ค โ€” ์„ฑ๊ณผ ํ™”๋ฉด์ด ํ˜„์žฅ ์ „์ฒด์˜ \"์•ž์œผ๋กœ ๋” ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ชซ\" ์„, ๊ณต์ •\n * ์ƒ์„ธ๊ฐ€ ๊ทธ ๊ณต์ • ํ•˜๋‚˜์˜ ๋ถ„ํ•ด(์ƒํ•œยท์•ฝ์ •ยท๋‹ฌ์„ฑ๋ถˆ๊ฐ€ยท๊ฐ€์šฉ)์™€ ์ œ์•ฝํ•˜๋Š” ์ถ•์„ ๋ณด์ธ๋‹ค. ๋‘ ํ™”๋ฉด์€ **๊ฐ™์€ ๋‚ฑ๋ง**์„\n * ์“ด๋‹ค(๊ฐ™์€ i18n ํ‚ค) โ€” ๊ฐ™์€ ์‚ฌ์‹ค์„ ๋‹ค๋ฅด๊ฒŒ ๋ถ€๋ฅด๋ฉด ์–ด๋А ์ชฝ์ด ๋งž๋Š”์ง€ ์•„๋ฌด๋„ ๋ชจ๋ฅธ๋‹ค.\n *\n * ๋‚จ์€ ๊ฒƒ โ€” ํ‘œ์ค€์€ **๊ฒŒ์‹œ๋œ(์•ฝ์†๋œ) ๋Šฅ๋ ฅ**๋„ ๋‹ด๋Š”๋‹ค(๊ณ„์‚ฐ์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ). ๊ฐ’์„ ์‹ค์„ ์†Œ์Šค๊ฐ€ ์•„์ง\n * ์นจ๋ฌตํ•˜๋ฏ€๋กœ ๋นˆ ์ถ•์„ ๋จผ์ € ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค(์ƒํƒœ ์ชฝ `workCalendar` ๋ฅผ ์ง€์šด ์ด์œ ์™€ ๊ฐ™๋‹ค).\n *\n * ๊ณผ๊ฑฐ ๋ถ„ํ•ด(UsedยทUnused)๋Š” ์ด ๋ณด๊ณ ์„œ์— ์—†๋‹ค โ€” ๊ทธ๊ฒƒ์€ ์‹ค์ ์ด๊ณ  ์ด๋ฏธ ๋‘ ๊ณณ์— ์žˆ๋‹ค(์„ค๋น„ OEE ์˜ ๊ฐ€๋™/์œ ํœด,\n * ์„ฑ๊ณผ ํ™”๋ฉด์˜ ๊ตฌ๊ฐ„ ๊ฐ€๋™๋ฅ ). ํ‘œ์ค€์ด ๊ทธ ๋‘˜์„ ๋‹ค๋ฅธ ์ข…๋ฅ˜๋กœ ๋ถ€๋ฅด๋ฏ€๋กœ **ํ•ฉ์น˜์ง€ ์•Š๋Š”๋‹ค.**\n */\n\n/*\n * Part 2 โ€” ์ž์› ๋ชจ๋ธ. ๋„ค ์ž์› ๊ฐ๊ฐ์ด **๋“ฑ๊ธ‰/์ •์˜ โ†” ๊ฐœ์ฒด** ์ด์ค‘๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ด ๋ถ€๋ถ„์˜ ํ•ต์‹ฌ์ด๊ณ ,\n * ๊ทธ ์ด์ค‘์„ฑ์ด ์ด ํŠธ์œˆ์˜ ๋ผˆ๋Œ€์ด๊ธฐ๋„ ํ•˜๋‹ค.\n */\nconst PART2: Isa95Concept[] = [\n { std: 'PersonnelClass', part: '2', label: 'twin.isa95.PersonnelClass', axis: 'personnelClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'Person', part: '2', label: 'twin.isa95.Person', axis: 'persons', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'PersonnelCapability', part: '2', label: 'twin.isa95.PersonnelCapability', axis: null, shownOn: ['persons'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },\n { std: 'EquipmentClass', part: '2', label: 'twin.isa95.EquipmentClass', axis: 'equipmentClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'Equipment', part: '2', label: 'twin.isa95.Equipment', axis: 'equipment', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'EquipmentCapability', part: '2', label: 'twin.isa95.EquipmentCapability', axis: null, shownOn: ['equipment'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },\n { std: 'PhysicalAssetClass', part: '2', label: 'twin.isa95.PhysicalAssetClass', axis: 'assetClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'PhysicalAsset', part: '2', label: 'twin.isa95.PhysicalAsset', axis: 'assets', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'MaterialClass', part: '2', label: 'twin.isa95.MaterialClass', axis: 'materialClasses', structure: 'full', behavior: 'partial', surface: 'full' },\n { std: 'MaterialDefinition', part: '2', label: 'twin.isa95.MaterialDefinition', axis: 'materialDefinitions', structure: 'full', behavior: 'full', surface: 'full' },\n /*\n * ๋กœํŠธยท์„œ๋ธŒ๋กœํŠธ๋Š” ๊ฐœ์ฒด ์ถ•์ด ์•„๋‹ˆ๋ผ **๊ด€์ธก**์œผ๋กœ ์กด์žฌํ•œ๋‹ค(EPCIS ๊ฐœ์ฒด) โ€” ๊ตฌ์กฐ๋Š” ์ €๋„์ด ๊ฐ–๋Š”๋‹ค.\n *\n * โ”€โ”€ 2026-08-24 ๋กœํŠธ๊ฐ€ ์‹œํ—˜ ๊ฒฐ๊ณผ๋ฅผ ๋“ค๊ฒŒ ๋๋‹ค (์ปค๋„ 0.7.57) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * `ItemState.testResults` ๋กœ ใ€Œ์ด ๋กœํŠธ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‚˜ใ€์˜ **๊ทผ๊ฑฐ**๊ฐ€ ๋กœํŠธ์— ์‹ค๋ฆฐ๋‹ค. ๊ทธ์ „์—๋Š” ํŒ์ •\n * (`disposition`)๋งŒ ์žˆ์—ˆ๊ณ  ใ€Œ์™œ ๊ทธ๋ ‡๊ฒŒ ํŒ์ •ํ–ˆ๋‚˜ใ€๋ฅผ ๋˜์งš์„ ์ˆ˜ ์—†์—ˆ๋‹ค.\n *\n * **๊ตฌ์กฐ๋ฅผ `full` ๋กœ ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.** `MaterialLotType` ์›๋ฌธ(B2MML-Material.xsd)์ด ๋“œ๋Š” ๊ฒƒ ์ค‘\n * ์•„์ง ์—†๋Š” ๊ฒƒ์ด ์žˆ๋‹ค: `MaterialLotProperty`(์‹œํ—˜์ด ์•„๋‹Œ ๋กœํŠธ ์†์„ฑ โ€” ์›์‚ฐ์ง€ยทํฌ์žฅ ํ˜•ํƒœ) ยท\n * `TestSpecificationID`(๋กœํŠธ๋ณ„ ๊ธฐ์ค€ ์ฐธ์กฐ โ€” ํ’ˆ๋ชฉ ์ •์˜๊ฐ€ ๋Œ€์‹  ๋‹ตํ•˜๋ฏ€๋กœ ๋‘์ง€ ์•Š์•˜๋‹ค) ยท `Status` ยท\n * `HierarchyScope` ยท `Version`. ์ฑ„์šด ๊ฒƒ๋งŒ ์„ธ๋Š” ๊ฒƒ์ด ์ด ํ‘œ์˜ ๊ทœ์œจ์ด๋‹ค.\n */\n { std: 'MaterialLot', part: '2', label: 'twin.isa95.MaterialLot', axis: null, structure: 'partial', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.lot' },\n /*\n * โ”€โ”€ 2026-08-24 ํŒ์ • ์ •์ •: `none` ์ด ์•„๋‹ˆ์—ˆ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ด ์ค„์€ ์…‹ ๋‹ค `none` ์ด์—ˆ๋Š”๋ฐ **ํ‘œ๊ฐ€ ์ฝ”๋“œ๋ณด๋‹ค ๋’ค์ฒ˜์ ธ ์žˆ์—ˆ๋‹ค.** ์ปค๋„์€ ์„œ๋ธŒ๋กœํŠธ๋ฅผ ๋“ ๋‹ค:\n *\n * `ItemState.subLotId` ํ‘œ์ค€ `MaterialSubLot.ID` (๊ณ„์•ฝ์ด ๊ทธ๋ ‡๊ฒŒ ์ ๊ณ  ์žˆ๋‹ค)\n * `subLotIdOf(class, location)` ๋น„์ง๋ ฌ ๋กœํŠธ๊ฐ€ ์ž๋ฆฌ๋งˆ๋‹ค ๋‚˜๋‰  ๋•Œ ๊ทธ ๋ถ€๋ถ„์˜ ์ด๋ฆ„์„ ๋งŒ๋“ ๋‹ค\n * `itemKeyOf(item)` **๊ฐœ์ฒด์˜ ์ •์ฒด์„ฑ์ด ์ด ๊ฐ’์ด๋‹ค** โ€” `subLotId ?? epc`\n *\n * ๊ธฐ๋Šฅ์ด `full` ์ธ ๊ทผ๊ฑฐ: ์ด ์ถ•์ด ์—†์œผ๋ฉด ๊ฐ™์€ ๋กœํŠธ๋ฅผ rack-1 ์— 100๊ฐœยทrack-2 ์— 60๊ฐœ ๊ด€์ธกํ–ˆ์„ ๋•Œ\n * **๋’ค์— ์˜จ ๊ด€์ธก์ด ์•ž์„ ๋ฎ์–ด 100๊ฐœ๊ฐ€ ์กฐ์šฉํžˆ ์‚ฌ๋ผ์ง„๋‹ค**(ํ•ฉ๊ณ„ 160 โ†’ 60). ์‹ค์ œ๋กœ ๊ทธ ๊ฒฐํ•จ์„ ์ด ์ถ•์œผ๋กœ\n * ๊ณ ์ณค๋‹ค. ์ฆ‰ ์žฅ์‹์ด ์•„๋‹ˆ๋ผ ์ •์ฒด์„ฑ์„ ์ง€ํƒฑํ•œ๋‹ค.\n *\n * ๊ตฌ์กฐ๊ฐ€ `partial` ์ธ ์ด์œ : ์„œ๋ธŒ๋กœํŠธ๋Š” ๋กœํŠธ์™€ ๊ฐ™์€ ๋ชจ์–‘์ด๊ณ (์œ„ ์ฐธ์กฐ) ๊ทธ ๋กœํŠธ๊ฐ€ `partial` ์ด๋‹ค.\n * ํ™”๋ฉด์ด `partial` ์ธ ์ด์œ : ๊ฐ’์ด ๋ฌผํ’ˆ์˜ **์ด๋ฆ„์œผ๋กœ** ๋‚˜์˜จ๋‹ค(`twin-item` ์˜ line) โ€” ใ€Œ์ด ๋กœํŠธ๊ฐ€ ์ž๋ฆฌ๋งˆ๋‹ค\n * ๋‚˜๋‰˜์–ด ์žˆ๋‹คใ€๋ฅผ ๋งํ•˜๋Š” ์ž๋ฆฌ๋Š” ์•„์ง ์—†๋‹ค.\n *\n * ์ด ๋ถ€๋ฅ˜(์ฝ”๋“œ์— ์žˆ๋Š”๋ฐ ํ‘œ๊ฐ€ `none`)๋Š” ์ž๋™์œผ๋กœ ์žกํžˆ์ง€ ์•Š๋Š”๋‹ค โ€” ํ‘œ์˜ ๊ฐ€๋“œ๋Š” ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ๋งŒ ๋ณธ๋‹ค\n * (์ถ•์ด ์‚ฌ๋ผ์ง€๋ฉด ๊ตฌ์กฐ๋ฅผ ๋‚ด๋ฆฐ๋‹ค). ๊ทธ๋ž˜์„œ ์ถ•์„ ๋Š˜๋ฆด ๋•Œ ์ด ํ‘œ๋ฅผ ํ•จ๊ป˜ ๋ณด๋Š” ๊ฒƒ์ด ๊ทœ์œจ์ด๋‹ค.\n */\n { std: 'MaterialSublot', part: '2', label: 'twin.isa95.MaterialSublot', axis: null, shownOn: ['items'], structure: 'partial', behavior: 'full', surface: 'partial' },\n { std: 'ProcessSegment', part: '2', label: 'twin.isa95.ProcessSegment', axis: 'operations', structure: 'full', behavior: 'full', surface: 'full' },\n /*\n * ์†์„ฑ์€ ์ž์›๋งˆ๋‹ค ๋ถ™๋Š” ํ™•์žฅ์ด๋ผ **์ž๊ธฐ ์ถ•์ด ์•„๋‹ˆ๋‹ค** โ€” ๊ทธ๋ž˜์„œ `axis` ๋Š” ์—†์ง€๋งŒ ๊ตฌ์กฐ๋Š” ์™„์ „ํ•˜๋‹ค:\n * ๊ณ„์•ฝ(`ResourceProperty`: ๊ฐ’ยท๋ฐ์ดํ„ฐํ˜•ยท๋‹จ์œ„ยทํ•˜์œ„ยท๋“ฑ๊ธ‰์†์„ฑ)์ด ํ‘œ์ค€์„ ๊ทธ๋Œ€๋กœ ๋‹ด๊ณ , ์ธ์ œ์ŠคํŠธยท์ƒํƒœยท\n * ํ™”๋ฉด์ด ๊ทธ๊ฒƒ์„ ํ†ต๊ณผ์‹œํ‚จ๋‹ค.\n *\n * ๊ธฐ๋Šฅ์€ **๋ถ€๋ถ„**์ด๋‹ค: ํ˜ธ์ŠคํŠธ์˜ ์ฃผํ–‰ ์ถ”์ •๊ธฐ๊ฐ€ `speed` ๋ฅผ ์ฝ์–ด ์ด๋™ ์‹œ๊ฐ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ์†Œ๋น„์ฒ˜๋‹ค\n * (๋‹ค๋ฅธ ์†์„ฑ์€ ์•„์ง ์•„๋ฌด๋„ ์ฝ์ง€ ์•Š๋Š”๋‹ค). ๊ทธ ์‚ฌ์‹ค์„ `full` ๋กœ ์˜ฌ๋ฆฌ๋ฉด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n */\n { std: 'Property', part: '2', label: 'twin.isa95.Property', axis: null, structure: 'full', behavior: 'partial', surface: 'full', note: 'twin.isa95.note.property' },\n /*\n * **์ž๋ฆฌ์˜ ์ƒ์‹œ ๊ด€์ธก** โ€” 2026-08-24 ์‹ ์„ค(์ปค๋„ 0.7.56). ํ‘œ์— ์ด ๊ฐœ๋…์ด ์•„์˜ˆ ์—†์—ˆ๋‹ค.\n *\n * ์™œ ์ด ์ถ•์ด ํ•„์š”ํ•œ๊ฐ€: ํŠธ์œˆ์˜ ํŒ์ • ๋Œ€์ƒ์€ ๋ฌผ๊ฑด์˜ ์ƒํƒœ์ด๊ณ , ๋ฌผ๊ฑด์˜ ์ƒํƒœ๋Š” **์กฐ๊ฑด ์—†์ด ์ •ํ•ด์ง€์ง€\n * ์•Š๋Š”๋‹ค.** ใ€Œ์ด ๋กœํŠธ๊ฐ€ ๋ƒ‰์žฅ์‹ค์— ์žˆ์—ˆ๋‹คใ€๊นŒ์ง€๋งŒ ์•„๋Š” ํŠธ์œˆ์€ ๊ทธ ๋กœํŠธ๊ฐ€ ๊ดœ์ฐฎ์•˜๋Š”์ง€ ๋งํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ \n * **์ด ์กฐ์ธ์€ ํŠธ์œˆ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค** โ€” ๊ณ„์ธก ์‹œ์Šคํ…œ์€ ๋ฌผ๊ฑด์˜ ์ž๋ฆฌ ์ด๋ ฅ์„ ๋ชจ๋ฅด๊ณ , ๋ฌผ๋ฅ˜ ์‹œ์Šคํ…œ์€ ์กฐ๊ฑด\n * ์ด๋ ฅ์„ ๋ชจ๋ฅธ๋‹ค.\n *\n * ํ‘œ์ค€ ์•ต์ปค: `OperationsEventType`(B2MML-OperationsEvent.xsd, ISA-95.00.02-2018) +\n * `OperationsRecordTemplateType`. ์šฐ๋ฆฌ๊ฐ€ ๋“  ๊ฒƒ โ€” `EffectiveTimestamp` ยท `EffectiveEndDate` ยท\n * `RecordTimestamp` ยท `HierarchyScope`(์ž๋ฆฌ) ยท `Source` ยท ๊ฐ’์€ `ValueType` ์œผ๋กœ **์ขํ˜”๋‹ค**\n * (๋‹จ์œ„ ์—†๋Š” ๋ฌผ๋ฆฌ๋Ÿ‰์€ ํŒ์ •์˜ ์žฌ๋ฃŒ๊ฐ€ ๋ชป ๋œ๋‹ค).\n *\n * ๋ถ™๋Š” ์ž๋ฆฌ๊ฐ€ `HierarchyScope.EquipmentID` ์ธ ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค โ€” ISA-95 ์—์„œ ์žฅ์†Œ ๊ณ„์ธต์ด ๊ณง ์„ค๋น„\n * ๊ณ„์ธต์ด๊ณ  ๋ƒ‰์žฅ์‹ค์€ `StorageZone` ์ˆ˜์ค€์˜ ์„ค๋น„๋‹ค. `OperationalLocationType` ์—๋Š” ์ด ์ถ•์ด ์—†๋‹ค.\n *\n * ๊ตฌ์กฐ๊ฐ€ `partial`: ๋ด‰ํˆฌ ์ „์ฒด(`ID`ยท`Description`ยท์‚ฌ๊ฑด ๋ถ„๋ฅ˜ยท`OperationsRecord` ๊ตฌ์กฐ)๊ฐ€ ์•„๋‹ˆ๋ผ ๊ด€์ธก\n * ํ•˜๋‚˜๋ฅผ ๋‹ด๋Š” ๋ฐ ํ•„์š”ํ•œ ์นธ๋งŒ ๋“ ๋‹ค.\n * ๊ธฐ๋Šฅ์ด `full`: ์‚ฌ๊ฑด ์ฑ„๋„(`location.measured`)์ด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค๊ณ , ์„ ์–ธ๋œ ๊ธฐ์ค€์œผ๋กœ ํŒ์ •ํ•ด\n * `observation-out-of-limit` ์‹ ํ˜ธ๋ฅผ ์„ธ์šด๋‹ค.\n * ํ™”๋ฉด์ด `none`: ํด๋ผ์ด์–ธํŠธ์— ์ด ์ถ•์„ ๊ทธ๋ฆฌ๋Š” ๊ณณ์ด ์—†๋‹ค(์‹ค์ธก 0๊ณณ).\n */\n { std: 'OperationsEvent', part: '2', label: 'twin.isa95.OperationsEvent', axis: null, structure: 'partial', behavior: 'full', surface: 'none' }\n]\n\n/*\n * Part 4 โ€” ์ผ์ •๊ณผ ์‹ค์ .\n *\n * **2026-08-11 ์ด์ „์—๋Š” ์ด ๋ถ€๋ถ„์ด ๊ฑฐ์˜ ๋น„์–ด ์žˆ์—ˆ๋‹ค.** ์˜ค๋”ยท์ž‘์—…์€ ๋Ÿฐํƒ€์ž„๊ณผ ์ €๋„์— ์‹ค์žฌํ•˜๋Š”๋ฐ ์กฐํšŒ\n * ๋ชจ๋ธ์˜ ์ถ•์ด ์•„๋‹ˆ์—ˆ๊ณ , ๊ทธ๋ž˜์„œ \"์ด ํŠธ์œˆ์ด ํ‘œ์ค€์˜ ์–ด๋””๋ฅผ ์ฑ„์šฐ๋‚˜\" ๋ผ๋Š” ์งˆ๋ฌธ์— ์ ˆ๋ฐ˜๋งŒ ๋‹ตํ–ˆ๋‹ค.\n *\n * ์ปค๋„์ด ๊ณ„์•ฝ์„ ๋„“ํ˜€(`source: 'state'`) ๋‘ ์ถ•์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค โ€” ์ด์ œ ์š”๊ตฌ(`orders`)์™€ ์‘๋‹ต(`tasks`)์„ ๊ฐœ๋…์œผ๋กœ\n * ๊ฐ€๋ฆฌ์ผœ ๊ฑธ์–ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋‚จ์€ ๊ฒƒ์€ **๊ณผ๊ฑฐ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ธธ**(์ €๋„ ์ปค์„œ ํŽ˜์ด์ง•)๊ณผ ๋Šฅ๋ ฅยท๊ฒ€์‚ฌ ๋ช…์„ธ๋‹ค.\n */\nconst PART4: Isa95Concept[] = [\n { std: 'OperationsDefinition', part: '4', label: 'twin.isa95.OperationsDefinition', axis: 'productionSpec', structure: 'full', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.opsdef' },\n /*\n * 2026-08-11 โ€” **์ถ•์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค**(์ปค๋„ 0.6.3 ยท `source: 'state'`). ์š”๊ตฌ๋Š” `orders`, ์‘๋‹ต์€ `tasks` ๋‹ค.\n *\n * `structure` ๋ฅผ `full` ๋กœ ์˜ฌ๋ฆฐ๋‹ค: ๋‹ด์„ ์ž๋ฆฌ๊ฐ€ ๊ณ„์•ฝ์— ์žˆ๋‹ค(์ƒํƒœ ๊ณ„์•ฝ + ์ถ• ์„ ์–ธ). **ํ…Œ์ด๋ธ” ํˆฌ์˜์ด\n * ์—†๋Š” ๊ฒƒ์€ ๊ฒฐ์†์ด ์•„๋‹ˆ๋‹ค** โ€” ์ด ์ถ•์˜ ์ •๋ณธ์€ ์ €๋„์ด๊ณ , ํˆฌ์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฒฐ์ •์ด๋‹ค(ADR-0032-D).\n *\n * `surface` ๋„ `full` ์ด๋‹ค(๊ฐ™์€ ๋‚  ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„): ๋ชฉ๋กยท์ƒ์„ธยท๊ด€๊ณ„์— ๋”ํ•ด **๊ณผ๊ฑฐ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ธธ**์ด ํ™”๋ฉด์—\n * ์žˆ๋‹ค โ€” ์‹œ๊ฐ ์ปค์„œ๋ฅผ ์˜ฎ๊ธฐ๋ฉด ๊ทธ ์‹œ์ ์˜ ์‚ฌ์‹ค์ด ๋‚˜์˜ค๊ณ , ๋ฌด์—‡์„ ๊ทผ๊ฑฐ๋กœ ๋‹ตํ–ˆ๋Š”์ง€๋„ ํ™”๋ฉด์ด ๋งํ•œ๋‹ค\n * (๋ผ์ด๋ธŒ=๊ถŒ์œ„ ยท ์ €๋„=ํŒŒ์ƒ ยท ์ ‘์€ ๋ฆฌ๋น„์ „). ์‹ค์ธก: ์ด๋ฅธ ์‹œ๊ฐ 0๊ฑด ยท ํ•˜๋ฃจ ๋’ค 504๊ฑด.\n */\n { std: 'OperationsSchedule', part: '4', label: 'twin.isa95.OperationsSchedule', axis: 'orders', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.schedule' },\n { std: 'OperationsPerformance', part: '4', label: 'twin.isa95.OperationsPerformance', axis: 'tasks', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.performance' },\n { std: 'OperationsCapability', part: '4', label: 'twin.isa95.OperationsCapability', axis: null, shownOn: ['operations'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.opscapability' },\n /*\n * 2026-08-12 โ€” **์ถ•์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค**(์ปค๋„ 0.6.5). ์ž์› ์•„ํ™‰์ด ๊ฐ€๋ฆฌํ‚ค๋˜ ์ฐธ์กฐ์— ๋Œ€์ƒ์ด ์ƒ๊ฒผ๊ณ , ์—†๋Š” ๋ช…์„ธ๋ฅผ\n * ๊ฐ€๋ฆฌํ‚ค๋ฉด ์„  ์ฑ„์›€์ด ๋Š์–ด์ง„ ์ฐธ์กฐ๋กœ ์„ผ๋‹ค.\n *\n * ๊ธฐ๋Šฅ์ด **`partial` ๋กœ ์‚ด์•„๋‚ฌ๋‹ค**(์ปค๋„ 0.6.6): ๊ฒฐ๊ณผ(`TestResult`)๊ฐ€ ๊ณ„์•ฝ์— ๋“ค์–ด์˜ค๋ฉด์„œ ์ปค๋„์ด ๋ฐฐ์ •์—์„œ\n * ๊ทธ๊ฒƒ์„ ๋ณธ๋‹ค โ€” ๋งŒ๋ฃŒยท๋ถˆํ•ฉ๊ฒฉ์ด๋ฉด ๊ทธ ์ž๊ฒฉ์€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค(์‹ค์ธก: ๋งŒ๋ฃŒ๋œ ์šฉ์ ‘์‚ฌ๋Š” ์šฉ์ ‘ ์ž‘์—… 5๊ฑด ์ค‘ ํ•œ\n * ๋ฒˆ๋„ ๋ฐฐ์ •๋˜์ง€ ์•Š์•˜๋‹ค).\n *\n * โ”€โ”€ 2026-08-24 ์œ„ ๋ฌธ์žฅ ํ•˜๋‚˜๊ฐ€ ๋‚ก์•˜๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ใ€Œ**์‚ฌ๋žŒ๋งŒ ํŒ์ •ํ•œ๋‹ค**ใ€๊ณ  ์ ํ˜€ ์žˆ์—ˆ๋‹ค. ์ง€๊ธˆ์€ ์•„๋‹ˆ๋‹ค โ€” `capabilityOfResource` ๊ฐ€ ์„ค๋น„ยท์‚ฌ๋žŒยท์ž์‚ฐ\n * **์…‹ ๋ชจ๋‘**์— `requiredTests` ๋ฅผ ๊ฑธ๊ณ , ๊ทธ ๋‹ต์ด ๋ฐฐ์ •์˜ ๊ฐ€์šฉ์„ฑ ํ•„ํ„ฐ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒ์ • ๋Œ€์ƒ์ด\n * ์ž์› ๋ฐ–์œผ๋กœ ๋„“์–ด์กŒ๋‹ค: **์ž๋ฆฌ์˜ ์ƒ์‹œ ๊ด€์ธก**(`OperationsEvent` ์ค„)๊ณผ **๋กœํŠธ์˜ ์‹œํ—˜ ๊ฒฐ๊ณผ**\n * (`TestResult` ์ค„)๋„ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ํŒ์ •ํ•œ๋‹ค.\n *\n * ๋‚จ์€ ๊ทœ์œจ์€ ํ•˜๋‚˜๋‹ค: **๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ํŒ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค**(์„ ์–ธํ•œ ๊ฒƒ๋งŒ ์ œ์•ฝ์ด ๋œ๋‹ค โ€” ๊ฒฐ์†์ด ์•„๋‹ˆ๋ผ ๊ทœ์œจ).\n *\n * ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ค€์˜ **์ˆซ์ž ํ•œ๊ณ„๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋”ํ•œ ๊ฒƒ**์ด๋‹ค. ํ‘œ์ค€ `TestSpecificationCriteria.Expression` ์€\n * ์ž์œ  ๋ฌธ์žฅ(`TextType`)์ด๊ณ , B2MML ์ผ๊ณฑ ํŒŒ์ผ์— `Minimum`ยท`Maximum`ยท`Tolerance` ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค\n * (์›๋ฌธ ๋Œ€์กฐ). ๊ทธ๊ฒƒ ์—†์ด๋Š” ํŒ์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ `limit: {minimum, maximum, uom}` ์„ ๋”ํ–ˆ๊ณ , ๋ฐœ๋ช…ํ•œ\n * ์ž๋ฆฌ์ž„์„ ๊ณ„์•ฝ์— ์ ์—ˆ๋‹ค. ์ปค๋„์€ `Expression` ์„ **์ฝ์ง€ ์•Š๋Š”๋‹ค** โ€” ๋ฌธ๋ฒ•์ด ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ\n * ํŒŒ์‹ฑํ•˜๋ฉด ๊ทธ ์ˆœ๊ฐ„ ๋ฐฉ์–ธ์ด๋‹ค.\n */\n { std: 'TestSpecification', part: '4', label: 'twin.isa95.TestSpecification', axis: 'testSpecifications', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.test' },\n /*\n * **์‹œํ—˜ ๊ฒฐ๊ณผ** โ€” 2026-08-24 ์‹ ์„ค(์ปค๋„ 0.7.57). ๊ธฐ์ค€๋งŒ ์žˆ๊ณ  ๊ฒฐ๊ณผ์˜ ์ž๋ฆฌ๊ฐ€ ํ‘œ์— ์—†์—ˆ๋‹ค.\n *\n * ํ‘œ์ค€ `TestResultType`(B2MML-OperationsTest.xsd)์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋“  ๊ฒƒ:\n * `EvaluationDate`(at) ยท `Expiration`(expiresAt) ยท `TestableObjectID` ยท `PropertyMeasurement`\n * ยท `EvaluatedCriterionResult` โ†’ **`result: 'pass'|'fail'` ๋กœ ์ขํ˜”๋‹ค**(ํ‘œ์ค€์€ ์—ด๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค)\n * ์•„์ง ์—†๋Š” ๊ฒƒ: `ID` ยท `Description` ยท `HierarchyScope` ยท `OperationsTestRequirementID` ยท\n * `TestResultChild`. ๊ทธ๋ž˜์„œ ๊ตฌ์กฐ๋Š” `partial` ์ด๋‹ค.\n *\n * ๊ธฐ๋Šฅ์ด `partial` ์ธ ์ด์œ ๋ฅผ ์ •ํ™•ํžˆ ์ ๋Š”๋‹ค โ€” **์ž์›์—์„œ๋Š” ๊ฒฐ์ •์„ ๋ฐ”๊พธ๊ณ  ๋กœํŠธ์—์„œ๋Š” ์•„์ง ๋ฐ”๊พธ์ง€\n * ์•Š๋Š”๋‹ค.** ๋งŒ๋ฃŒยท๋ถˆํ•ฉ๊ฒฉ ์ž์›์—๋Š” ์ž‘์—…์ด ๋ฐฐ์ •๋˜์ง€ ์•Š์ง€๋งŒ, ๋ถˆํ•ฉ๊ฒฉ ๋กœํŠธ๊ฐ€ ํ• ๋‹น์—์„œ ๋น ์ง€๊ฑฐ๋‚˜ ์ฃผ์˜ ์‹ ํ˜ธ๋ฅผ\n * ์„ธ์šฐ์ง€๋Š” ์•Š๋Š”๋‹ค(๋“ค๊ณ ยทํŒ์ •ํ•˜๊ณ ยท๋˜์งš์„ ์ˆ˜๋Š” ์žˆ๋‹ค). ๊ทธ ์ž๋ฆฌ๋ฅผ `full` ๋กœ ์ ์œผ๋ฉด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n *\n * ํ™”๋ฉด์€ `none` ์ด๋‹ค โ€” ํด๋ผ์ด์–ธํŠธ์— ์ด ์ถ•์„ ๊ทธ๋ฆฌ๋Š” ๊ณณ์ด ์—†๋‹ค(์‹ค์ธก: `operato-twin/client` ์— 0๊ณณ).\n */\n { std: 'TestResult', part: '4', label: 'twin.isa95.TestResult', axis: null, structure: 'partial', behavior: 'partial', surface: 'none' },\n { std: 'WorkMaster', part: '4', label: 'twin.isa95.WorkMaster', axis: 'recipes', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'WorkDirective', part: '4', label: 'twin.isa95.WorkDirective', axis: null, structure: 'none', behavior: 'none', surface: 'none' }\n]\n\n/** ํ‘œ์ค€์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ ์ „๋ถ€ โ€” ์ด ๋ฐฐ์—ด์ด ๊ณง ๊ธฐ์ค€์ด๋‹ค. */\nexport const ISA95_CONCEPTS: Isa95Concept[] = [...PART2, ...PART4]\n\n/**\n * ์ ํ•ฉ์„ฑ ๋ณด๊ณ  โ€” **์ฑ„์šด ๊ฒƒ๊ณผ ๋น ์ง„ ๊ฒƒ์„ ํ•จ๊ป˜.**\n *\n * `axis` ๋ฅผ ์ปค๋„ ์ถ• ๋ชฉ๋ก๊ณผ ๋งž์ถฐ ๋ณธ๋‹ค: ์ถ•์ด ์žˆ๋‹ค๊ณ  ์ ํ˜€ ์žˆ๋Š”๋ฐ ์ปค๋„์— ์—†์œผ๋ฉด ๊ทธ ์„ ์–ธ์ด ๋‚ก์€ ๊ฒƒ์ด๋ฏ€๋กœ\n * **๊ตฌ์กฐ ์—†์Œ์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค**(์กฐ์šฉํžˆ ํ†ต๊ณผ์‹œํ‚ค๋ฉด ์ด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค).\n */\n/**\n * ์„ ์–ธํ•œ ์ถ•์„ ์ปค๋„์˜ ์ถ• ๋ชฉ๋ก๊ณผ ๋งž์ถ˜๋‹ค โ€” **์–ด๊ธ‹๋‚œ ๊ฒƒ์„ ์กฐ์šฉํžˆ ์ง€์šฐ์ง€ ์•Š๋Š”๋‹ค.**\n *\n * ๋‘ ์ž๋ฆฌ๊ฐ€ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋‹ค.\n * ยท `axis` โ€” ๊ทธ ๊ฐœ๋… ์ž์‹ ์˜ ๋ฌธ. ์ปค๋„์— ์—†์œผ๋ฉด ๊ตฌ์กฐ๋ฅผ ใ€Œ์—†์Œใ€์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค.\n * ยท `shownOn` โ€” ๊ทธ ์‚ฌ์‹ค์„ ๋“ค๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ถ•. ์˜ˆ์ „์—๋Š” ์—†๋Š” ์ถ•์„ **๋ง์—†์ด ๊ฑธ๋Ÿฌ ๋ƒˆ๋‹ค.** ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์ค„์€\n * ใ€Œ๊ฐœ๋… ์ถ•์ด ์—†์Šต๋‹ˆ๋‹คใ€๋กœ ๋ณด์ด๊ณ , ์‚ฌ๋žŒ์€ ๊ทธ๊ฒƒ์„ **์›๋ž˜ ๊ทธ๋Ÿฐ ๊ฒƒ**์œผ๋กœ ์ฝ๋Š”๋‹ค. ์‹ค์ œ๋กœ ๊ทธ ์ผ์ด ์žˆ์—ˆ๋‹ค:\n * EPCIS ํ‘œ์˜ ์ผ๊ณฑ ์ค„์ด ์ปค๋„์— ์—†๋Š” ์ถ•(`items`)์— ๊ธฐ๋Œ€๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ฒฝ๊ณ ๊ฐ€ ๋œฌ ๊ฒƒ์€ ๋‘ ์ค„๋ฟ์ด์—ˆ๋‹ค.\n *\n * ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์–ด๊ธ‹๋‚˜๋ฉด `axisMissing` ์ด๋‹ค โ€” ํ‘œ๊ฐ€ ์Šค์Šค๋กœ ใ€Œ์ตœ์‹ ์ด ์•„๋‹ˆ๋‹คใ€๋ผ๊ณ  ๋งํ•˜๊ฒŒ ํ•œ๋‹ค.\n */\nexport function reconcileAxes(c: Isa95Concept, known: Set<string>): Isa95Concept & { axisMissing?: boolean } {\n const ownMissing = !!c.axis && !known.has(c.axis)\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const lostShown = !!c.shownOn && (shownOn?.length ?? 0) !== c.shownOn.length\n const fixed = lostShown ? { ...c, shownOn } : c\n if (!ownMissing && !lostShown) return fixed\n /* ๊ตฌ์กฐ๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์€ **์ž๊ธฐ ๋ฌธ์ด ์—†์–ด์ง„ ๊ฒฝ์šฐ**๋‹ค โ€” ๋‚จ์˜ ์ถ•์—์„œ ๋ณด์ด๋˜ ๊ฒƒ์€ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํ‘œ์‹œ์˜ ๋ฌธ์ œ๋‹ค. */\n return ownMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing: true } : { ...fixed, axisMissing: true }\n}\n\nexport function isa95Coverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const concepts = ISA95_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)))\n /* ์ฑ„์šด ์ˆ˜๋Š” `full` ๋งŒ ์„ผ๋‹ค โ€” ๋ถ€๋ถ„์„ ์ฑ„์šด ๊ฒƒ์œผ๋กœ ์„ธ๋ฉด ๊ธฐ์ค€์ด ์Šค์Šค๋กœ๋ฅผ ์†์ธ๋‹ค. */\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n model: 'ISA-95',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
1
+ {"version":3,"file":"isa95-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/isa95-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ISA-95 ์ ํ•ฉ์„ฑ ๊ธฐ์ค€ โ€” **ํ‘œ์ค€์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์˜ ๋ชฉ๋ก.**\n *\n * โ”€โ”€ ์™œ ์ด ํŒŒ์ผ์ด ํ•„์š”ํ•œ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ง€๊ธˆ๊นŒ์ง€ ํ™”๋ฉด์€ \"์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์ถ•\" ๋งŒ ๋ณด์˜€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฑ„์šด ๊ฒƒ์€ ์„ธ์–ด์ง€์ง€๋งŒ **๋น ์ง„ ๊ฒƒ์€ ์…€ ์ˆ˜ ์—†๋‹ค** โ€”\n * ์—†๋Š” ๊ฒƒ์€ ํ™”๋ฉด์— ์—†์œผ๋ฏ€๋กœ ์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ๋ฌป์ง€ ์•Š๋Š”๋‹ค. ํ‘œ์ค€ ์ค€์ˆ˜๋Š” \"์šฐ๋ฆฌ ์ถ•์— ํ‘œ์ค€ ์ด๋ฆ„์„ ๋ถ™์˜€๋‹ค\"\n * ๊ฐ€ ์•„๋‹ˆ๋ผ **ํ‘œ์ค€์˜ ๋ชฉ๋ก์„ ๊ธฐ์ค€์œผ๋กœ ๋น ์ง„ ๊ฒƒ์ด ์—†๋‹ค**๋Š” ๋ง์ด์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ์ค€์ด ์ฝ”๋“œ๋กœ ์žˆ์–ด์•ผ ๊ทธ\n * ๋ฌธ์žฅ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.\n *\n * โ”€โ”€ ์„ธ ์ธต์—์„œ ๋ณธ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํ‘œ์ค€ ์ค€์ˆ˜๋Š” ํ•œ ์ธต์˜ ์ผ์ด ์•„๋‹ˆ๋‹ค. ๊ฐœ๋…๋งˆ๋‹ค ์…‹์„ ๋”ฐ๋กœ ๋ณธ๋‹ค:\n *\n * ยท `structure` โ€” **๋ฐ์ดํ„ฐ๊ตฌ์กฐ**๊ฐ€ ์žˆ๋‚˜(์ปค๋„ ์ถ•ยทํ˜ธ์ŠคํŠธ ํ‘œ์— ์ด ๊ฐœ๋…์˜ ์ž๋ฆฌ๊ฐ€ ์žˆ๋‚˜)\n * ยท `behavior` โ€” **๊ธฐ๋Šฅ**์ด ๊ทธ๊ฒƒ์„ ์“ฐ๋‚˜(์ปค๋„์ด ๊ณ„ํšยท์ง‘ํ–‰ยท์ง‘๊ณ„์—์„œ ์‹ค์ œ๋กœ ๋‹ค๋ฃจ๋‚˜)\n * ยท `surface` โ€” **UI ๋…ธ์ถœ**์ด ์žˆ๋‚˜(์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‚˜)\n *\n * ์…‹์„ ํ•ฉ์น˜๋ฉด \"๊ตฌ์กฐ๋Š” ์žˆ๋Š”๋ฐ ์•„๋ฌด๋„ ์•ˆ ์“ฐ๋Š” ์ปฌ๋Ÿผ\" ๊ณผ \"์ปค๋„์€ ์“ฐ๋Š”๋ฐ ํ™”๋ฉด์— ์—†๋Š” ์‚ฌ์‹ค\" ์ด ๊ฐ™์€\n * ๊ฐ’์œผ๋กœ ๋ณด์ธ๋‹ค. ์‹ค์ œ๋กœ ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๋‘˜ ๋‹ค ๋‚˜์™”๋‹ค(์ธ๋ ฅ ๋ช…์„ธ๋Š” ๊ตฌ์กฐยท๊ธฐ๋Šฅ์ด ์žˆ์—ˆ์ง€๋งŒ ํ™”๋ฉด์—\n * ์—†์—ˆ๊ณ , `properties` ๋Š” ๊ตฌ์กฐ๋งŒ ์žˆ๋‹ค).\n *\n * โ”€โ”€ ๊ฐ’์€ ๊ด€์ธก์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ์ด๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์—ฌ๊ธฐ ์ ํžŒ ๊ฒƒ์€ **์‚ฌ๋žŒ์ด ํŒ๋‹จํ•ด ์ ์€ ์‚ฌ์‹ค**์ด๋‹ค(์ž๋™ ํŒ์ •์ด ์•„๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ํ‹€๋ฆด ์ˆ˜ ์žˆ๊ณ , ํ‹€๋ฆฌ๋ฉด\n * ์—ฌ๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค โ€” ํ™”๋ฉด์€ ์ด ์„ ์–ธ์„ ๊ทธ๋Œ€๋กœ ๋ณด์ด๊ณ  ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค. ์ž๋™์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ\n * ํ•˜๋‚˜๋Š” ์ž๋™์œผ๋กœ ํ•œ๋‹ค: `axis` ๊ฐ€ ์ปค๋„ ์ถ• ๋ชฉ๋ก์— ์—†์œผ๋ฉด ๊ทธ๊ฒƒ์€ **๊ตฌ์กฐ๊ฐ€ ์—†๋Š” ๊ฒƒ**์ด๋‹ค(์˜คํƒ€ ๋ฐฉ์ง€).\n *\n * โ”€โ”€ ์ด ํ‘œ๊ฐ€ ์ปค๋„์— ์—†๋Š” ์ด์œ  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ปค๋„์€ **๋Ÿฐํƒ€์ž„ ๋ชจ๋ธ์˜ SSOT** ๋‹ค(๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€). ์ด ํ‘œ๋Š” **์ฐธ์กฐ ๋ชจ๋ธ์˜ ๋ชฉ๋ก**์ด๋‹ค(๋ฌด์—‡์ด ์žˆ์–ด์•ผ\n * ํ•˜๋Š”๊ฐ€). ๋‘˜์€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์‚ฌ์‹ค์ด๊ณ , ํ›„์ž๋Š” ์ปค๋„์„ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ ๋„ ๋Š˜์–ด์•ผ ํ•œ๋‹ค.\n */\n\n/** ํ•œ ์ธต์˜ ์ƒํƒœ โ€” ์žˆ์Œ ยท ๋ถ€๋ถ„ ยท ์—†์Œ. \"๋ถ€๋ถ„\" ์„ ๋‘๋Š” ์ด์œ : ์ ˆ๋ฐ˜ ์žˆ๋Š” ๊ฒƒ์„ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ๊ธฐ์ค€์ด ์ฃฝ๋Š”๋‹ค. */\nexport type CoverageLevel = 'full' | 'partial' | 'none'\n\nexport interface Isa95Concept {\n /** ํ‘œ์ค€์ด ๋ถ€๋ฅด๋Š” ์ด๋ฆ„ โ€” ์ด ํ‘œ์˜ ํ‚ค๋‹ค(์šฐ๋ฆฌ ์–ดํœ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ‘œ์ค€ ์–ดํœ˜). */\n std: string\n /** ํ‘œ์ค€์˜ ์–ด๋А ๋ถ€๋ถ„์ธ๊ฐ€ โ€” Part 2(์ž์› ๋ชจ๋ธ) ยท Part 4(์ผ์ •ยท์‹ค์ ) ๋“ฑ. */\n part: string\n /** ์‚ฌ๋žŒ์ด ์ฝ๋Š” ์ด๋ฆ„(i18n ํ‚ค). ํ™”๋ฉด์ด ๋ฒˆ์—ญํ•œ๋‹ค. */\n label: string\n /** ์šฐ๋ฆฌ ์ปค๋„ ์ถ• โ€” ์žˆ์œผ๋ฉด ๋ฐ์ดํ„ฐ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์—†์œผ๋ฉด `null`. */\n axis: string | null\n /** ์„ธ ์ธต์˜ ์ƒํƒœ. `structure` ๋Š” `axis` ๋กœ๋„ ๊ฒ€์ฆ๋œ๋‹ค. */\n structure: CoverageLevel\n behavior: CoverageLevel\n surface: CoverageLevel\n /** ์™œ ๊ทธ ์ˆ˜์ค€์ธ์ง€ โ€” **๋ชจ๋ฅด๋Š” ๊ฒƒ์„ ๊ฐ์ถ”์ง€ ์•Š๊ธฐ ์œ„ํ•ด** ํ•œ ์ค„๋กœ ์ ๋Š”๋‹ค(i18n ํ‚ค). */\n note?: string\n /**\n * ์ž๊ธฐ ์ถ•์ด ์—†์„ ๋•Œ **์–ด๋””์„œ ๋ณด์ด๋‚˜** โ€” ๊ทธ ์‚ฌ์‹ค์„ ๋“ค๊ณ  ์žˆ๋Š” ์ถ•๋“ค.\n *\n * ใ€Œ์–ด๋””์—ใ€์นธ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ํ•ฉ์ณ๊ณ  ์žˆ์—ˆ๋‹ค: *์•„์ง ์ถ•์ด ์—†๋‹ค(๋ถ€์ฑ„)* ์™€ *์ถ•์ผ ์ˆ˜ ์—†๋‹ค(์„ค๊ณ„)*. ๊ฐ€์šฉ ๋Šฅ๋ ฅ์€\n * ๊ฐœ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ž์›์˜ ์ง€๊ธˆ ์ƒํƒœ์ด๋ฏ€๋กœ ์ถ•์ด ๋  ์ˆ˜ ์—†๋Š”๋ฐ, ์„ธ ์ธต์ด ๋‹ค ์™„์ „ํ•œ ์ค„์ด \"๊ฐœ๋… ์ถ•์ด ์—†์Šต๋‹ˆ๋‹ค\"\n * ๋ผ๊ณ ๋งŒ ๋งํ•˜๋ฉด **ํ‘œ๊ฐ€ ์Šค์Šค๋กœ ๋ชจ์ˆœ๋œ ๋ง์„ ํ•œ๋‹ค**(๋‹ค ๋๋‹ค๋ฉด์„œ ์—†๋‹ค๊ณ  ํ•œ๋‹ค).\n *\n * ๊ทธ๋ž˜์„œ ์ถ•์ผ ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ๊ฐˆ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์—ฌ๊ธฐ๊ฐ€ ๋น„์–ด ์žˆ๊ณ  ์ถ•๋„ ์—†์œผ๋ฉด ๊ทธ๊ฒƒ์€ **์ง„์งœ ๋นˆ์นธ**์ด๋‹ค.\n *\n * โ”€โ”€ โ˜… ๋œป์„ ๊ณ ์ณ ์ ๋Š”๋‹ค (2026-08-24, ์‚ฌ์šฉ์ž ์ง€์ ) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํ•œ๋•Œ ์ด ์นธ์„ ใ€Œ**์–ด๋””์„œ ๋ณด์ด๋‚˜**ใ€๋กœ ์ฝ๊ณ , ํ™”๋ฉด์ด ๊ทธ๊ฒƒ์„ ใ€Œํ•ด๋‹น ์ถ• ํ•ญ๋ชฉ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹คใ€๋ผ๋Š” ๋ฌธ์žฅ์œผ๋กœ\n * ๋ƒˆ๋‹ค. ๋‘ ๊ฐ€์ง€๊ฐ€ ์ž˜๋ชป์ด์—ˆ๋‹ค.\n *\n * โ‘  ๊ทธ ๋ฌธ์žฅ์€ **ํ•œ๊ตญ์–ด๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค**(์‚ฌ์šฉ์ž ์ง€์ ). ๊ทธ๋ฆฌ๊ณ  ์นฉ์ด ์ด๋ฏธ ๊ฐˆ ๊ณณ์„ ๋ณด์ด๋ฏ€๋กœ **๊ตฐ๋”๋”๊ธฐ**๋‹ค.\n * โ‘ก ๋œป์ด ํ‹€๋ ธ๋‹ค. ์ด ์นธ์€ ใ€Œ**์–ด๋””์— ์†ํ•˜๋‚˜**ใ€๋‹ค โ€” ๊ทธ ๊ฐœ๋…์ด ์ž๊ธฐ ๋ชฉ๋ก์„ ๊ฐ–์ง€ ์•Š๊ณ  **์–ด๋А ์ถ•์˜ ์•ˆ์—\n * ๋“ค์–ด ์žˆ๋‚˜**. ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š”์ง€๋Š” `surface` ๊ฐ€ ๋”ฐ๋กœ ๋‹ตํ•œ๋‹ค. ๋‘˜์€ ๋‹ค๋ฅธ ๋ฌผ์Œ์ด๋‹ค.\n *\n * ๊ทธ๋ž˜์„œ **`surface` ์™€ ์ง์„ ๋งž์ถ”์ง€ ์•Š๋Š”๋‹ค.** ์ž๊ธฐ ์ถ•์ด ์—†์œผ๋ฉด ์–ธ์ œ๋‚˜ ๊ฐˆ ๊ณณ์„ ์ ๋Š”๋‹ค โ€” ์•„์ง ๊ทธ๋ ค์ง€์ง€\n * ์•Š๋Š” ๊ฐœ๋…๋„ **์–ด๋””์— ์†ํ•˜๋Š”์ง€๋Š” ์‚ฌ์‹ค**์ด๊ณ , ๊ทธ๊ฒƒ์„ ๋น„์šฐ๋ฉด ใ€Œ์–ด๋””์—๋„ ์—†๋Š” ๊ฒƒใ€์œผ๋กœ ์ฝํžŒ๋‹ค.\n *\n * ์—ฌ๊ธฐ๊ฐ€ ๋น„์–ด ์žˆ๊ณ  ์ถ•๋„ ์—†์œผ๋ฉด ๊ทธ๊ฒƒ์€ **์ง„์งœ ๋นˆ์นธ**์ด๋‹ค(์œ„ ๊ทœ์น™).\n */\n shownOn?: string[]\n}\n\n/*\n * ๊ฐ€์šฉ ๋Šฅ๋ ฅ(2026-08-12, ์ปค๋„ 0.6.8) โ€” **ํŒ์ •๊ณผ ์ด์œ ๊ฐ€ ์ƒํƒœ์— ์‹ค๋ ค ์˜จ๋‹ค**(`capability {available, reason}`).\n *\n * ์…‹ ๋‹ค ์™„์ „์ธ ๊ทผ๊ฑฐ: ์ƒํƒœ๊ฐ€ ํŒ์ •์„ ๋“ค๊ณ  ์˜ค๊ณ (์‹œ๋ฎฌยท๋ฏธ๋Ÿฌ๊ฐ€ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ํŒŒ์ƒํ•œ๋‹ค), ๋ฐฐ์ •์ด ๊ฐ™์€ ํŒ์ •์„\n * ์“ฐ๊ณ , ๋‘ ํ™”๋ฉด์ด ๊ฐ™์€ ๋‚ฑ๋ง๋กœ ๊ทธ ์ด์œ ๋ฅผ ๋ณด์ธ๋‹ค(์ž์› ํƒญ ๋ฐฐ์ง€ ยท ์ธ์ŠคํŽ™์…˜ ๊ด€์ธก ์—ด).\n *\n * ์™œ ์ถ•์ด ์—†๋Š”๊ฐ€ โ€” ๊ฐ€์šฉ ๋Šฅ๋ ฅ์€ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ **์ž์›์˜ ์ง€๊ธˆ ์ƒํƒœ**๋‹ค. ๊ฐœ๋… ์นด๋“œ๋กœ ์„ธ์šฐ๋ฉด ์‚ฌ๋žŒยท์„ค๋น„์™€\n * ๋‚˜๋ž€ํžˆ ๋†“์—ฌ \"๋Šฅ๋ ฅ์ด ๋ช‡ ๊ฐœ์ธ๊ฐ€\" ๋ฅผ ์„ธ๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๊ฑด ๋ฌผ์„ ์ผ์ด ์•„๋‹ˆ๋‹ค.\n */\n\n/*\n * ์ƒ์‚ฐ ๋Šฅ๋ ฅ(2026-08-13, ์ปค๋„ 0.6.12) โ€” **๊ตฌ๊ฐ„์˜ ์–‘์„ ํ‘œ์ค€ ์ข…๋ฅ˜๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.**\n *\n * `structure` ์™„์ „: ๊ณ„์•ฝ์ด ๋ณด๊ณ ์„œ๋ฅผ ๋‚ธ๋‹ค(`operationsCapabilityOf`) โ€” ๊ตฌ๊ฐ„(StartTimeยทEndTime) ยท ํ‘œ์ค€\n * ์—ด๊ฑฐ๊ฐ’(CommittedยทAvailableยทUnattainable) ยท ๊ณต์ •๋ณ„ ๋ถ„ํ•ด ยท ์ œ์•ฝํ•˜๋Š” ์ถ•. ๋‚ฑ๋ง์€ B2MML ๋Œ€์กฐ ํ›„ ํ‘œ์ค€ ๊ฒƒ์„\n * ๊ทธ๋Œ€๋กœ ์“ด๋‹ค(์šฐ๋ฆฌ ๋‚ฑ๋ง์„ ๋งŒ๋“ค์ง€ ์•Š์•˜๋‹ค).\n * `behavior` ์™„์ „: ์•ฝ์ •์€ ์˜ค๋”์—์„œ, ๋‹ฌ์„ฑ๋ถˆ๊ฐ€๋Š” ์ž์› ํŒ์ •(`capabilityOf`)์—์„œ ์˜จ๋‹ค โ€” ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํŒ์ •์€\n * ๋ฐฐ์ •์ด ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ•œ ๋ฒŒ์ด๋‹ค. ํ‘œ์ค€์˜ `Unattainable` ์ •์˜๊ฐ€ ๊ทธ ํŒ์ •๊ณผ ๊ฒน์นœ๋‹ค.\n * `surface` ์™„์ „: ๋‘ ์ž๋ฆฌ์—์„œ ๋ณด์ธ๋‹ค โ€” ์„ฑ๊ณผ ํ™”๋ฉด์ด ํ˜„์žฅ ์ „์ฒด์˜ \"์•ž์œผ๋กœ ๋” ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ชซ\" ์„, ๊ณต์ •\n * ์ƒ์„ธ๊ฐ€ ๊ทธ ๊ณต์ • ํ•˜๋‚˜์˜ ๋ถ„ํ•ด(์ƒํ•œยท์•ฝ์ •ยท๋‹ฌ์„ฑ๋ถˆ๊ฐ€ยท๊ฐ€์šฉ)์™€ ์ œ์•ฝํ•˜๋Š” ์ถ•์„ ๋ณด์ธ๋‹ค. ๋‘ ํ™”๋ฉด์€ **๊ฐ™์€ ๋‚ฑ๋ง**์„\n * ์“ด๋‹ค(๊ฐ™์€ i18n ํ‚ค) โ€” ๊ฐ™์€ ์‚ฌ์‹ค์„ ๋‹ค๋ฅด๊ฒŒ ๋ถ€๋ฅด๋ฉด ์–ด๋А ์ชฝ์ด ๋งž๋Š”์ง€ ์•„๋ฌด๋„ ๋ชจ๋ฅธ๋‹ค.\n *\n * ๋‚จ์€ ๊ฒƒ โ€” ํ‘œ์ค€์€ **๊ฒŒ์‹œ๋œ(์•ฝ์†๋œ) ๋Šฅ๋ ฅ**๋„ ๋‹ด๋Š”๋‹ค(๊ณ„์‚ฐ์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ). ๊ฐ’์„ ์‹ค์„ ์†Œ์Šค๊ฐ€ ์•„์ง\n * ์นจ๋ฌตํ•˜๋ฏ€๋กœ ๋นˆ ์ถ•์„ ๋จผ์ € ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค(์ƒํƒœ ์ชฝ `workCalendar` ๋ฅผ ์ง€์šด ์ด์œ ์™€ ๊ฐ™๋‹ค).\n *\n * ๊ณผ๊ฑฐ ๋ถ„ํ•ด(UsedยทUnused)๋Š” ์ด ๋ณด๊ณ ์„œ์— ์—†๋‹ค โ€” ๊ทธ๊ฒƒ์€ ์‹ค์ ์ด๊ณ  ์ด๋ฏธ ๋‘ ๊ณณ์— ์žˆ๋‹ค(์„ค๋น„ OEE ์˜ ๊ฐ€๋™/์œ ํœด,\n * ์„ฑ๊ณผ ํ™”๋ฉด์˜ ๊ตฌ๊ฐ„ ๊ฐ€๋™๋ฅ ). ํ‘œ์ค€์ด ๊ทธ ๋‘˜์„ ๋‹ค๋ฅธ ์ข…๋ฅ˜๋กœ ๋ถ€๋ฅด๋ฏ€๋กœ **ํ•ฉ์น˜์ง€ ์•Š๋Š”๋‹ค.**\n */\n\n/*\n * Part 2 โ€” ์ž์› ๋ชจ๋ธ. ๋„ค ์ž์› ๊ฐ๊ฐ์ด **๋“ฑ๊ธ‰/์ •์˜ โ†” ๊ฐœ์ฒด** ์ด์ค‘๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ด ๋ถ€๋ถ„์˜ ํ•ต์‹ฌ์ด๊ณ ,\n * ๊ทธ ์ด์ค‘์„ฑ์ด ์ด ํŠธ์œˆ์˜ ๋ผˆ๋Œ€์ด๊ธฐ๋„ ํ•˜๋‹ค.\n */\nconst PART2: Isa95Concept[] = [\n { std: 'PersonnelClass', part: '2', label: 'twin.isa95.PersonnelClass', axis: 'personnelClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'Person', part: '2', label: 'twin.isa95.Person', axis: 'persons', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'PersonnelCapability', part: '2', label: 'twin.isa95.PersonnelCapability', axis: null, shownOn: ['persons'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },\n { std: 'EquipmentClass', part: '2', label: 'twin.isa95.EquipmentClass', axis: 'equipmentClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'Equipment', part: '2', label: 'twin.isa95.Equipment', axis: 'equipment', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'EquipmentCapability', part: '2', label: 'twin.isa95.EquipmentCapability', axis: null, shownOn: ['equipment'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.capability' },\n { std: 'PhysicalAssetClass', part: '2', label: 'twin.isa95.PhysicalAssetClass', axis: 'assetClasses', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'PhysicalAsset', part: '2', label: 'twin.isa95.PhysicalAsset', axis: 'assets', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'MaterialClass', part: '2', label: 'twin.isa95.MaterialClass', axis: 'materialClasses', structure: 'full', behavior: 'partial', surface: 'full' },\n { std: 'MaterialDefinition', part: '2', label: 'twin.isa95.MaterialDefinition', axis: 'materialDefinitions', structure: 'full', behavior: 'full', surface: 'full' },\n /*\n * ๋กœํŠธยท์„œ๋ธŒ๋กœํŠธ๋Š” ๊ฐœ์ฒด ์ถ•์ด ์•„๋‹ˆ๋ผ **๊ด€์ธก**์œผ๋กœ ์กด์žฌํ•œ๋‹ค(EPCIS ๊ฐœ์ฒด) โ€” ๊ตฌ์กฐ๋Š” ์ €๋„์ด ๊ฐ–๋Š”๋‹ค.\n *\n * โ”€โ”€ 2026-08-24 ๋กœํŠธ๊ฐ€ ์‹œํ—˜ ๊ฒฐ๊ณผ๋ฅผ ๋“ค๊ฒŒ ๋๋‹ค (์ปค๋„ 0.7.57) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * `ItemState.testResults` ๋กœ ใ€Œ์ด ๋กœํŠธ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‚˜ใ€์˜ **๊ทผ๊ฑฐ**๊ฐ€ ๋กœํŠธ์— ์‹ค๋ฆฐ๋‹ค. ๊ทธ์ „์—๋Š” ํŒ์ •\n * (`disposition`)๋งŒ ์žˆ์—ˆ๊ณ  ใ€Œ์™œ ๊ทธ๋ ‡๊ฒŒ ํŒ์ •ํ–ˆ๋‚˜ใ€๋ฅผ ๋˜์งš์„ ์ˆ˜ ์—†์—ˆ๋‹ค.\n *\n * **๊ตฌ์กฐ๋ฅผ `full` ๋กœ ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.** `MaterialLotType` ์›๋ฌธ(B2MML-Material.xsd)์ด ๋“œ๋Š” ๊ฒƒ ์ค‘\n * ์•„์ง ์—†๋Š” ๊ฒƒ์ด ์žˆ๋‹ค: `MaterialLotProperty`(์‹œํ—˜์ด ์•„๋‹Œ ๋กœํŠธ ์†์„ฑ โ€” ์›์‚ฐ์ง€ยทํฌ์žฅ ํ˜•ํƒœ) ยท\n * `TestSpecificationID`(๋กœํŠธ๋ณ„ ๊ธฐ์ค€ ์ฐธ์กฐ โ€” ํ’ˆ๋ชฉ ์ •์˜๊ฐ€ ๋Œ€์‹  ๋‹ตํ•˜๋ฏ€๋กœ ๋‘์ง€ ์•Š์•˜๋‹ค) ยท `Status` ยท\n * `HierarchyScope` ยท `Version`. ์ฑ„์šด ๊ฒƒ๋งŒ ์„ธ๋Š” ๊ฒƒ์ด ์ด ํ‘œ์˜ ๊ทœ์œจ์ด๋‹ค.\n */\n /*\n * โ”€โ”€ 2026-08-25 โ€” ๋ชฉ๋ก์ด ์Œ“์ด๊ธฐ๋งŒ ํ•˜๋˜ ๊ฒƒ์„ ๊ณ ์ณค๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์—ฐ๊ฒฐ๋œ ์‹œ์Šคํ…œ์€ ๋งค ์ฃผ๊ธฐ ํ˜„์žฌ ์žฌ๊ณ ๋ฅผ ์ „๋ถ€ ๋ณด๋‚ด๋Š”๋ฐ, ํŠธ์œˆ์€ ๊ทธ๊ฒƒ์„ ๋‚ฑ๋‚ฑ์˜ ๊ด€์ธก์œผ๋กœ ๋ฐ›์•„ **๋”ํ•˜๊ธฐ๋งŒ\n * ํ–ˆ๋‹ค.** ใ€Œ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ ๋ง๊ณ ๋Š” ์—†๋‹คใ€๋ฅผ ๋ฐ›๋Š” ๊ณณ์ด ์—†์–ด์„œ ๋ชฉ๋ก์—์„œ ๋น ์ง„ ์ค„์ด ์˜์›ํžˆ ๋‚จ์•˜๋‹ค.\n * ์‹ค์ธก: ์‹ค์ œ 1,704๊ฑด์ธ๋ฐ ํŠธ์œˆ์ด 10,038๊ฑด.\n *\n * ๊ทธ๋™์•ˆ ์ด ์ค„์€ ใ€Œ๊ธฐ๋Šฅ ์žˆ์Œใ€์ด์—ˆ๋‹ค. **ํ˜„์žฌ ์žฌ๊ณ ๋ฅผ ๋งž๊ฒŒ ์œ ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ๋กœ ๊ทธ๋ ‡๊ฒŒ ์ ์„ ์ˆ˜\n * ์—†๋‹ค.** ์˜ค๋Š˜ ใ€Œ์ด ๋ชฉ๋ก์ด ์ „๋ถ€๋‹คใ€๋ฅผ ๋ฐ›๋Š” ๊ธธ์„ ๋ƒˆ๊ณ (์ปค๋„ 0.7.63), ์ˆ˜๋Ÿ‰์œผ๋กœ ์˜จ ์žฌ๊ณ ๋„ ์—†์–ด์งˆ ์ˆ˜\n * ์žˆ๊ฒŒ ํ–ˆ๋‹ค. ์ด์ œ ์‚ฌ์‹ค์ด๋‹ค.\n */\n { std: 'MaterialLot', part: '2', label: 'twin.isa95.MaterialLot', axis: 'items', structure: 'partial', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.lot' },\n /*\n * โ”€โ”€ 2026-08-24 ํŒ์ • ์ •์ •: `none` ์ด ์•„๋‹ˆ์—ˆ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ด ์ค„์€ ์…‹ ๋‹ค `none` ์ด์—ˆ๋Š”๋ฐ **ํ‘œ๊ฐ€ ์ฝ”๋“œ๋ณด๋‹ค ๋’ค์ฒ˜์ ธ ์žˆ์—ˆ๋‹ค.** ์ปค๋„์€ ์„œ๋ธŒ๋กœํŠธ๋ฅผ ๋“ ๋‹ค:\n *\n * `ItemState.subLotId` ํ‘œ์ค€ `MaterialSubLot.ID` (๊ณ„์•ฝ์ด ๊ทธ๋ ‡๊ฒŒ ์ ๊ณ  ์žˆ๋‹ค)\n * `subLotIdOf(class, location)` ๋น„์ง๋ ฌ ๋กœํŠธ๊ฐ€ ์ž๋ฆฌ๋งˆ๋‹ค ๋‚˜๋‰  ๋•Œ ๊ทธ ๋ถ€๋ถ„์˜ ์ด๋ฆ„์„ ๋งŒ๋“ ๋‹ค\n * `itemKeyOf(item)` **๊ฐœ์ฒด์˜ ์ •์ฒด์„ฑ์ด ์ด ๊ฐ’์ด๋‹ค** โ€” `subLotId ?? epc`\n *\n * ๊ธฐ๋Šฅ์ด `full` ์ธ ๊ทผ๊ฑฐ: ์ด ์ถ•์ด ์—†์œผ๋ฉด ๊ฐ™์€ ๋กœํŠธ๋ฅผ rack-1 ์— 100๊ฐœยทrack-2 ์— 60๊ฐœ ๊ด€์ธกํ–ˆ์„ ๋•Œ\n * **๋’ค์— ์˜จ ๊ด€์ธก์ด ์•ž์„ ๋ฎ์–ด 100๊ฐœ๊ฐ€ ์˜ค๋ฅ˜ ์—†์ด ์‚ฌ๋ผ์ง„๋‹ค**(ํ•ฉ๊ณ„ 160 โ†’ 60). ์‹ค์ œ๋กœ ๊ทธ ๊ฒฐํ•จ์„ ์ด ์ถ•์œผ๋กœ\n * ๊ณ ์ณค๋‹ค. ์ฆ‰ ์žฅ์‹์ด ์•„๋‹ˆ๋ผ ์ •์ฒด์„ฑ์„ ์ง€ํƒฑํ•œ๋‹ค.\n *\n * ๊ตฌ์กฐ๊ฐ€ `partial` ์ธ ์ด์œ : ์„œ๋ธŒ๋กœํŠธ๋Š” ๋กœํŠธ์™€ ๊ฐ™์€ ๋ชจ์–‘์ด๊ณ (์œ„ ์ฐธ์กฐ) ๊ทธ ๋กœํŠธ๊ฐ€ `partial` ์ด๋‹ค.\n * ํ™”๋ฉด์ด `partial` ์ธ ์ด์œ : ๊ฐ’์ด ๋ฌผํ’ˆ์˜ **์ด๋ฆ„์œผ๋กœ** ๋‚˜์˜จ๋‹ค(`twin-item` ์˜ line) โ€” ใ€Œ์ด ๋กœํŠธ๊ฐ€ ์ž๋ฆฌ๋งˆ๋‹ค\n * ๋‚˜๋‰˜์–ด ์žˆ๋‹คใ€๋ฅผ ๋งํ•˜๋Š” ์ž๋ฆฌ๋Š” ์•„์ง ์—†๋‹ค.\n *\n * ์ด ๋ถ€๋ฅ˜(์ฝ”๋“œ์— ์žˆ๋Š”๋ฐ ํ‘œ๊ฐ€ `none`)๋Š” ์ž๋™์œผ๋กœ ์žกํžˆ์ง€ ์•Š๋Š”๋‹ค โ€” ํ‘œ์˜ ๊ฐ€๋“œ๋Š” ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ๋งŒ ๋ณธ๋‹ค\n * (์ถ•์ด ์‚ฌ๋ผ์ง€๋ฉด ๊ตฌ์กฐ๋ฅผ ๋‚ด๋ฆฐ๋‹ค). ๊ทธ๋ž˜์„œ ์ถ•์„ ๋Š˜๋ฆด ๋•Œ ์ด ํ‘œ๋ฅผ ํ•จ๊ป˜ ๋ณด๋Š” ๊ฒƒ์ด ๊ทœ์œจ์ด๋‹ค.\n */\n { std: 'MaterialSublot', part: '2', label: 'twin.isa95.MaterialSublot', axis: null, shownOn: ['items'], structure: 'partial', behavior: 'full', surface: 'partial' },\n { std: 'ProcessSegment', part: '2', label: 'twin.isa95.ProcessSegment', axis: 'operations', structure: 'full', behavior: 'full', surface: 'full' },\n /*\n * ์†์„ฑ์€ ์ž์›๋งˆ๋‹ค ๋ถ™๋Š” ํ™•์žฅ์ด๋ผ **์ž๊ธฐ ์ถ•์ด ์•„๋‹ˆ๋‹ค** โ€” ๊ทธ๋ž˜์„œ `axis` ๋Š” ์—†์ง€๋งŒ ๊ตฌ์กฐ๋Š” ์™„์ „ํ•˜๋‹ค:\n * ๊ณ„์•ฝ(`ResourceProperty`: ๊ฐ’ยท๋ฐ์ดํ„ฐํ˜•ยท๋‹จ์œ„ยทํ•˜์œ„ยท๋“ฑ๊ธ‰์†์„ฑ)์ด ํ‘œ์ค€์„ ๊ทธ๋Œ€๋กœ ๋‹ด๊ณ , ์ธ์ œ์ŠคํŠธยท์ƒํƒœยท\n * ํ™”๋ฉด์ด ๊ทธ๊ฒƒ์„ ํ†ต๊ณผ์‹œํ‚จ๋‹ค.\n *\n * ๊ธฐ๋Šฅ์€ **๋ถ€๋ถ„**์ด๋‹ค: ํ˜ธ์ŠคํŠธ์˜ ์ฃผํ–‰ ์ถ”์ •๊ธฐ๊ฐ€ `speed` ๋ฅผ ์ฝ์–ด ์ด๋™ ์‹œ๊ฐ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ์†Œ๋น„์ฒ˜๋‹ค\n * (๋‹ค๋ฅธ ์†์„ฑ์€ ์•„์ง ์•„๋ฌด๋„ ์ฝ์ง€ ์•Š๋Š”๋‹ค). ๊ทธ ์‚ฌ์‹ค์„ `full` ๋กœ ์˜ฌ๋ฆฌ๋ฉด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n */\n { std: 'Property', part: '2', label: 'twin.isa95.Property', axis: null, shownOn: ['equipment', 'persons', 'assets'], structure: 'full', behavior: 'partial', surface: 'full', note: 'twin.isa95.note.property' },\n /*\n * **์ž๋ฆฌ์˜ ์ƒ์‹œ ๊ด€์ธก** โ€” 2026-08-24 ์‹ ์„ค(์ปค๋„ 0.7.56). ํ‘œ์— ์ด ๊ฐœ๋…์ด ์•„์˜ˆ ์—†์—ˆ๋‹ค.\n *\n * ์™œ ์ด ์ถ•์ด ํ•„์š”ํ•œ๊ฐ€: ํŠธ์œˆ์˜ ํŒ์ • ๋Œ€์ƒ์€ ๋ฌผ๊ฑด์˜ ์ƒํƒœ์ด๊ณ , ๋ฌผ๊ฑด์˜ ์ƒํƒœ๋Š” **์กฐ๊ฑด ์—†์ด ์ •ํ•ด์ง€์ง€\n * ์•Š๋Š”๋‹ค.** ใ€Œ์ด ๋กœํŠธ๊ฐ€ ๋ƒ‰์žฅ์‹ค์— ์žˆ์—ˆ๋‹คใ€๊นŒ์ง€๋งŒ ์•„๋Š” ํŠธ์œˆ์€ ๊ทธ ๋กœํŠธ๊ฐ€ ๊ดœ์ฐฎ์•˜๋Š”์ง€ ๋งํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ \n * **์ด ์กฐ์ธ์€ ํŠธ์œˆ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค** โ€” ๊ณ„์ธก ์‹œ์Šคํ…œ์€ ๋ฌผ๊ฑด์˜ ์ž๋ฆฌ ์ด๋ ฅ์„ ๋ชจ๋ฅด๊ณ , ๋ฌผ๋ฅ˜ ์‹œ์Šคํ…œ์€ ์กฐ๊ฑด\n * ์ด๋ ฅ์„ ๋ชจ๋ฅธ๋‹ค.\n *\n * ํ‘œ์ค€ ์•ต์ปค: `OperationsEventType`(B2MML-OperationsEvent.xsd, ISA-95.00.02-2018) +\n * `OperationsRecordTemplateType`. ์šฐ๋ฆฌ๊ฐ€ ๋“  ๊ฒƒ โ€” `EffectiveTimestamp` ยท `EffectiveEndDate` ยท\n * `RecordTimestamp` ยท `HierarchyScope`(์ž๋ฆฌ) ยท `Source` ยท ๊ฐ’์€ `ValueType` ์œผ๋กœ **์ขํ˜”๋‹ค**\n * (๋‹จ์œ„ ์—†๋Š” ๋ฌผ๋ฆฌ๋Ÿ‰์€ ํŒ์ •์˜ ์žฌ๋ฃŒ๊ฐ€ ๋ชป ๋œ๋‹ค).\n *\n * ๋ถ™๋Š” ์ž๋ฆฌ๊ฐ€ `HierarchyScope.EquipmentID` ์ธ ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค โ€” ISA-95 ์—์„œ ์žฅ์†Œ ๊ณ„์ธต์ด ๊ณง ์„ค๋น„\n * ๊ณ„์ธต์ด๊ณ  ๋ƒ‰์žฅ์‹ค์€ `StorageZone` ์ˆ˜์ค€์˜ ์„ค๋น„๋‹ค. `OperationalLocationType` ์—๋Š” ์ด ์ถ•์ด ์—†๋‹ค.\n *\n * ๊ตฌ์กฐ๊ฐ€ `partial`: ๋ด‰ํˆฌ ์ „์ฒด(`ID`ยท`Description`ยท์‚ฌ๊ฑด ๋ถ„๋ฅ˜ยท`OperationsRecord` ๊ตฌ์กฐ)๊ฐ€ ์•„๋‹ˆ๋ผ ๊ด€์ธก\n * ํ•˜๋‚˜๋ฅผ ๋‹ด๋Š” ๋ฐ ํ•„์š”ํ•œ ์นธ๋งŒ ๋“ ๋‹ค. 2026-08-25 ์— ์ง€๋‚œ ๊ธฐ๋ก์˜ ๋ด‰ํˆฌ๊ฐ€ ์‚ฌ๋žŒ์ด ์ ์€ ๋ฌธ์žฅ์„ ํ•จ๊ป˜\n * ๋‚˜๋ฅด๊ฒŒ ๋์ง€๋งŒ(`CanonicalEnvelope.description`), ๊ทธ๊ฒƒ์€ **๊ธฐ๋ก์— ๋‚จ๋Š” ๋ง**์ด๊ณ  ์ด ํƒ€์ž…์˜\n * `Description` ์นธ์ด ์•„๋‹ˆ๋‹ค โ€” ์ƒํƒœ์— ๋‹ด๊ธฐ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ์ค„์˜ ๋“ฑ๊ธ‰์„ ์˜ฌ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.\n * ๊ธฐ๋Šฅ์ด `full`: ์‚ฌ๊ฑด ์ฑ„๋„(`location.measured`)์ด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค๊ณ , ์„ ์–ธ๋œ ๊ธฐ์ค€์œผ๋กœ ํŒ์ •ํ•ด\n * `observation-out-of-limit` ์‹ ํ˜ธ๋ฅผ ์„ธ์šด๋‹ค.\n * ํ™”๋ฉด์ด `none`: ํด๋ผ์ด์–ธํŠธ์— ์ด ์ถ•์„ ๊ทธ๋ฆฌ๋Š” ๊ณณ์ด ์—†๋‹ค(์‹ค์ธก 0๊ณณ).\n */\n /*\n * โ”€โ”€ 2026-08-25 โ€” ์ด ์ค„์ด ์‹ค์ œ๋ณด๋‹ค ๋†’๊ฒŒ ์ ํ˜€ ์žˆ์—ˆ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ใ€Œ๊ธฐ๋Šฅ ์žˆ์Œใ€์œผ๋กœ ์ ์–ด ๋‘์—ˆ๋‹ค. ์ปค๋„์ด ๊ด€์ธก์„ ๋ฐ˜์˜ํ•˜๊ณ  ๊ธฐ์ค€์œผ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด์—ˆ์œผ๋ฏ€๋กœ\n * ๊ทธ๋ ‡๊ฒŒ ์ ์—ˆ๋Š”๋ฐ, **์—ฐ๊ฒฐ๋œ ์‹œ์Šคํ…œ์ด ๊ทธ ๊ฐ’์„ ๋ณด๋‚ผ ๊ธธ์ด ์—†์—ˆ๋‹ค** โ€” ์œ ์ž… ๊ฒฝ๋กœ๊ฐ€ `locationId` ๋ฅผ\n * ๋ณด์ง€ ์•Š์•„ ใ€Œ์–ด๋А ์‚ฌ์‹ค์ธ์ง€ ๋ชจ๋ฅธ๋‹คใ€๋กœ ๊ฑฐ๋ถ€ํ–ˆ๋‹ค.\n *\n * **์•„๋ฌด๋„ ๋จน์ผ ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ์€ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋‹ค.** ์˜ค๋Š˜ ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋ƒˆ๊ณ (์ปค๋„ 0.7.62),\n * ์ด์ œ ใ€Œ๊ธฐ๋Šฅ ์žˆ์Œใ€์ด ์‚ฌ์‹ค์ด๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€๋Š” ใ€Œ์ผ๋ถ€ใ€์˜€์–ด์•ผ ํ–ˆ๋‹ค.\n *\n * ๊ฐ™์€ ๋ถ€๋ฅ˜๋ฅผ ์˜ค๋Š˜ ์„ธ ๋ฒˆ ๋งŒ๋‚ฌ๋‹ค โ€” ํ‘œ๊ฐ€ **ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ๋ชป ํ•œ๋‹ค๊ณ ** ์ ์€ ๊ฒƒ์ด ์—ฌ์„ฏ ์ค„์ด์—ˆ๊ณ ,\n * ์ด๊ฒƒ์€ ๋ฐ˜๋Œ€๋กœ **๋ชป ํ•˜๋Š” ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ ** ์ ์€ ๊ฒƒ์ด๋‹ค. ๋’ค์ชฝ์ด ๋” ์œ„ํ—˜ํ•˜๋‹ค.\n */\n { std: 'OperationsEvent', part: '2', label: 'twin.isa95.OperationsEvent', axis: null, shownOn: ['locations'], structure: 'partial', behavior: 'full', surface: 'none' }\n]\n\n/*\n * Part 4 โ€” ์ผ์ •๊ณผ ์‹ค์ .\n *\n * **2026-08-11 ์ด์ „์—๋Š” ์ด ๋ถ€๋ถ„์ด ๊ฑฐ์˜ ๋น„์–ด ์žˆ์—ˆ๋‹ค.** ์˜ค๋”ยท์ž‘์—…์€ ๋Ÿฐํƒ€์ž„๊ณผ ์ €๋„์— ์‹ค์žฌํ•˜๋Š”๋ฐ ์กฐํšŒ\n * ๋ชจ๋ธ์˜ ์ถ•์ด ์•„๋‹ˆ์—ˆ๊ณ , ๊ทธ๋ž˜์„œ \"์ด ํŠธ์œˆ์ด ํ‘œ์ค€์˜ ์–ด๋””๋ฅผ ์ฑ„์šฐ๋‚˜\" ๋ผ๋Š” ์งˆ๋ฌธ์— ์ ˆ๋ฐ˜๋งŒ ๋‹ตํ–ˆ๋‹ค.\n *\n * ์ปค๋„์ด ๊ณ„์•ฝ์„ ๋„“ํ˜€(`source: 'state'`) ๋‘ ์ถ•์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค โ€” ์ด์ œ ์š”๊ตฌ(`orders`)์™€ ์‘๋‹ต(`tasks`)์„ ๊ฐœ๋…์œผ๋กœ\n * ๊ฐ€๋ฆฌ์ผœ ๊ฑธ์–ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋‚จ์€ ๊ฒƒ์€ **๊ณผ๊ฑฐ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ธธ**(์ €๋„ ์ปค์„œ ํŽ˜์ด์ง•)๊ณผ ๋Šฅ๋ ฅยท๊ฒ€์‚ฌ ๋ช…์„ธ๋‹ค.\n */\nconst PART4: Isa95Concept[] = [\n { std: 'OperationsDefinition', part: '4', label: 'twin.isa95.OperationsDefinition', axis: 'productionSpec', structure: 'full', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.opsdef' },\n /*\n * 2026-08-11 โ€” **์ถ•์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค**(์ปค๋„ 0.6.3 ยท `source: 'state'`). ์š”๊ตฌ๋Š” `orders`, ์‘๋‹ต์€ `tasks` ๋‹ค.\n *\n * `structure` ๋ฅผ `full` ๋กœ ์˜ฌ๋ฆฐ๋‹ค: ๋‹ด์„ ์ž๋ฆฌ๊ฐ€ ๊ณ„์•ฝ์— ์žˆ๋‹ค(์ƒํƒœ ๊ณ„์•ฝ + ์ถ• ์„ ์–ธ). **ํ…Œ์ด๋ธ” ํˆฌ์˜์ด\n * ์—†๋Š” ๊ฒƒ์€ ๊ฒฐ์†์ด ์•„๋‹ˆ๋‹ค** โ€” ์ด ์ถ•์˜ ์ •๋ณธ์€ ์ €๋„์ด๊ณ , ํˆฌ์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฒฐ์ •์ด๋‹ค(ADR-0032-D).\n *\n * `surface` ๋„ `full` ์ด๋‹ค(๊ฐ™์€ ๋‚  ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„): ๋ชฉ๋กยท์ƒ์„ธยท๊ด€๊ณ„์— ๋”ํ•ด **๊ณผ๊ฑฐ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๊ธธ**์ด ํ™”๋ฉด์—\n * ์žˆ๋‹ค โ€” ์‹œ๊ฐ ์ปค์„œ๋ฅผ ์˜ฎ๊ธฐ๋ฉด ๊ทธ ์‹œ์ ์˜ ์‚ฌ์‹ค์ด ๋‚˜์˜ค๊ณ , ๋ฌด์—‡์„ ๊ทผ๊ฑฐ๋กœ ๋‹ตํ–ˆ๋Š”์ง€๋„ ํ™”๋ฉด์ด ๋งํ•œ๋‹ค\n * (๋ผ์ด๋ธŒ=๊ถŒ์œ„ ยท ์ €๋„=ํŒŒ์ƒ ยท ๊ณ„์‚ฐํ•œ ๋ฆฌ๋น„์ „). ์‹ค์ธก: ์ด๋ฅธ ์‹œ๊ฐ 0๊ฑด ยท ํ•˜๋ฃจ ๋’ค 504๊ฑด.\n */\n { std: 'OperationsSchedule', part: '4', label: 'twin.isa95.OperationsSchedule', axis: 'orders', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.schedule' },\n { std: 'OperationsPerformance', part: '4', label: 'twin.isa95.OperationsPerformance', axis: 'tasks', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.performance' },\n { std: 'OperationsCapability', part: '4', label: 'twin.isa95.OperationsCapability', axis: null, shownOn: ['operations'], structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.opscapability' },\n /*\n * 2026-08-12 โ€” **์ถ•์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค**(์ปค๋„ 0.6.5). ์ž์› ์•„ํ™‰์ด ๊ฐ€๋ฆฌํ‚ค๋˜ ์ฐธ์กฐ์— ๋Œ€์ƒ์ด ์ƒ๊ฒผ๊ณ , ์—†๋Š” ๋ช…์„ธ๋ฅผ\n * ๊ฐ€๋ฆฌํ‚ค๋ฉด ์„  ์ฑ„์›€์ด ๋Š์–ด์ง„ ์ฐธ์กฐ๋กœ ์„ผ๋‹ค.\n *\n * ๊ธฐ๋Šฅ์ด **`partial` ๋กœ ์‚ด์•„๋‚ฌ๋‹ค**(์ปค๋„ 0.6.6): ๊ฒฐ๊ณผ(`TestResult`)๊ฐ€ ๊ณ„์•ฝ์— ๋“ค์–ด์˜ค๋ฉด์„œ ์ปค๋„์ด ๋ฐฐ์ •์—์„œ\n * ๊ทธ๊ฒƒ์„ ๋ณธ๋‹ค โ€” ๋งŒ๋ฃŒยท๋ถˆํ•ฉ๊ฒฉ์ด๋ฉด ๊ทธ ์ž๊ฒฉ์€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค(์‹ค์ธก: ๋งŒ๋ฃŒ๋œ ์šฉ์ ‘์‚ฌ๋Š” ์šฉ์ ‘ ์ž‘์—… 5๊ฑด ์ค‘ ํ•œ\n * ๋ฒˆ๋„ ๋ฐฐ์ •๋˜์ง€ ์•Š์•˜๋‹ค).\n *\n * โ”€โ”€ 2026-08-24 ์œ„ ๋ฌธ์žฅ ํ•˜๋‚˜๊ฐ€ ๋‚ก์•˜๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ใ€Œ**์‚ฌ๋žŒ๋งŒ ํŒ์ •ํ•œ๋‹ค**ใ€๊ณ  ์ ํ˜€ ์žˆ์—ˆ๋‹ค. ์ง€๊ธˆ์€ ์•„๋‹ˆ๋‹ค โ€” `capabilityOfResource` ๊ฐ€ ์„ค๋น„ยท์‚ฌ๋žŒยท์ž์‚ฐ\n * **์…‹ ๋ชจ๋‘**์— `requiredTests` ๋ฅผ ๊ฑธ๊ณ , ๊ทธ ๋‹ต์ด ๋ฐฐ์ •์˜ ๊ฐ€์šฉ์„ฑ ํ•„ํ„ฐ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒ์ • ๋Œ€์ƒ์ด\n * ์ž์› ๋ฐ–์œผ๋กœ ๋„“์–ด์กŒ๋‹ค: **์ž๋ฆฌ์˜ ์ƒ์‹œ ๊ด€์ธก**(`OperationsEvent` ์ค„)๊ณผ **๋กœํŠธ์˜ ์‹œํ—˜ ๊ฒฐ๊ณผ**\n * (`TestResult` ์ค„)๋„ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ํŒ์ •ํ•œ๋‹ค.\n *\n * ๋‚จ์€ ๊ทœ์œจ์€ ํ•˜๋‚˜๋‹ค: **๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ํŒ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค**(์„ ์–ธํ•œ ๊ฒƒ๋งŒ ์ œ์•ฝ์ด ๋œ๋‹ค โ€” ๊ฒฐ์†์ด ์•„๋‹ˆ๋ผ ๊ทœ์œจ).\n *\n * ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ค€์˜ **์ˆซ์ž ํ•œ๊ณ„๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋”ํ•œ ๊ฒƒ**์ด๋‹ค. ํ‘œ์ค€ `TestSpecificationCriteria.Expression` ์€\n * ์ž์œ  ๋ฌธ์žฅ(`TextType`)์ด๊ณ , B2MML ์ผ๊ณฑ ํŒŒ์ผ์— `Minimum`ยท`Maximum`ยท`Tolerance` ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค\n * (์›๋ฌธ ๋Œ€์กฐ). ๊ทธ๊ฒƒ ์—†์ด๋Š” ํŒ์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ `limit: {minimum, maximum, uom}` ์„ ๋”ํ–ˆ๊ณ , ๋ฐœ๋ช…ํ•œ\n * ์ž๋ฆฌ์ž„์„ ๊ณ„์•ฝ์— ์ ์—ˆ๋‹ค. ์ปค๋„์€ `Expression` ์„ **์ฝ์ง€ ์•Š๋Š”๋‹ค** โ€” ๋ฌธ๋ฒ•์ด ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ\n * ํŒŒ์‹ฑํ•˜๋ฉด ๊ทธ ์ˆœ๊ฐ„ ๋ฐฉ์–ธ์ด๋‹ค.\n */\n { std: 'TestSpecification', part: '4', label: 'twin.isa95.TestSpecification', axis: 'testSpecifications', structure: 'full', behavior: 'full', surface: 'full', note: 'twin.isa95.note.test' },\n /*\n * **์‹œํ—˜ ๊ฒฐ๊ณผ** โ€” 2026-08-24 ์‹ ์„ค(์ปค๋„ 0.7.57). ๊ธฐ์ค€๋งŒ ์žˆ๊ณ  ๊ฒฐ๊ณผ์˜ ์ž๋ฆฌ๊ฐ€ ํ‘œ์— ์—†์—ˆ๋‹ค.\n *\n * ํ‘œ์ค€ `TestResultType`(B2MML-OperationsTest.xsd)์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋“  ๊ฒƒ:\n * `EvaluationDate`(at) ยท `Expiration`(expiresAt) ยท `TestableObjectID` ยท `PropertyMeasurement`\n * ยท `EvaluatedCriterionResult` โ†’ **`result: 'pass'|'fail'` ๋กœ ์ขํ˜”๋‹ค**(ํ‘œ์ค€์€ ์—ด๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค)\n * ์•„์ง ์—†๋Š” ๊ฒƒ: `ID` ยท `Description` ยท `HierarchyScope` ยท `OperationsTestRequirementID` ยท\n * `TestResultChild`. ๊ทธ๋ž˜์„œ ๊ตฌ์กฐ๋Š” `partial` ์ด๋‹ค.\n *\n * ๊ธฐ๋Šฅ์ด `partial` ์ธ ์ด์œ ๋ฅผ ์ •ํ™•ํžˆ ์ ๋Š”๋‹ค โ€” **์ž์›์—์„œ๋Š” ๊ฒฐ์ •์„ ๋ฐ”๊พธ๊ณ  ๋กœํŠธ์—์„œ๋Š” ์•„์ง ๋ฐ”๊พธ์ง€\n * ์•Š๋Š”๋‹ค.** ๋งŒ๋ฃŒยท๋ถˆํ•ฉ๊ฒฉ ์ž์›์—๋Š” ์ž‘์—…์ด ๋ฐฐ์ •๋˜์ง€ ์•Š์ง€๋งŒ, ๋ถˆํ•ฉ๊ฒฉ ๋กœํŠธ๊ฐ€ ํ• ๋‹น์—์„œ ๋น ์ง€๊ฑฐ๋‚˜ ์ฃผ์˜ ์‹ ํ˜ธ๋ฅผ\n * ์„ธ์šฐ์ง€๋Š” ์•Š๋Š”๋‹ค(๋“ค๊ณ ยทํŒ์ •ํ•˜๊ณ ยท๋˜์งš์„ ์ˆ˜๋Š” ์žˆ๋‹ค). ๊ทธ ์ž๋ฆฌ๋ฅผ `full` ๋กœ ์ ์œผ๋ฉด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n *\n * ํ™”๋ฉด์€ `none` ์ด๋‹ค โ€” ํด๋ผ์ด์–ธํŠธ์— ์ด ์ถ•์„ ๊ทธ๋ฆฌ๋Š” ๊ณณ์ด ์—†๋‹ค(์‹ค์ธก: `operato-twin/client` ์— 0๊ณณ).\n */\n { std: 'TestResult', part: '4', label: 'twin.isa95.TestResult', axis: null, shownOn: ['items'], structure: 'partial', behavior: 'partial', surface: 'none' },\n { std: 'WorkMaster', part: '4', label: 'twin.isa95.WorkMaster', axis: 'recipes', structure: 'full', behavior: 'full', surface: 'full' },\n { std: 'WorkDirective', part: '4', label: 'twin.isa95.WorkDirective', axis: null, structure: 'none', behavior: 'none', surface: 'none' }\n]\n\n/** ํ‘œ์ค€์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ ์ „๋ถ€ โ€” ์ด ๋ฐฐ์—ด์ด ๊ณง ๊ธฐ์ค€์ด๋‹ค. */\nexport const ISA95_CONCEPTS: Isa95Concept[] = [...PART2, ...PART4]\n\n/**\n * ์ ํ•ฉ์„ฑ ๋ณด๊ณ  โ€” **์ฑ„์šด ๊ฒƒ๊ณผ ๋น ์ง„ ๊ฒƒ์„ ํ•จ๊ป˜.**\n *\n * `axis` ๋ฅผ ์ปค๋„ ์ถ• ๋ชฉ๋ก๊ณผ ๋งž์ถฐ ๋ณธ๋‹ค: ์ถ•์ด ์žˆ๋‹ค๊ณ  ์ ํ˜€ ์žˆ๋Š”๋ฐ ์ปค๋„์— ์—†์œผ๋ฉด ๊ทธ ์„ ์–ธ์ด ๋‚ก์€ ๊ฒƒ์ด๋ฏ€๋กœ\n * **๊ตฌ์กฐ ์—†์Œ์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค**(์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ํ†ต๊ณผ์‹œํ‚ค๋ฉด ์ด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค).\n */\n/**\n * ์„ ์–ธํ•œ ์ถ•์„ ์ปค๋„์˜ ์ถ• ๋ชฉ๋ก๊ณผ ๋งž์ถ˜๋‹ค โ€” **์–ด๊ธ‹๋‚œ ๊ฒƒ์„ ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ์ง€์šฐ์ง€ ์•Š๋Š”๋‹ค.**\n *\n * ๋‘ ์ž๋ฆฌ๊ฐ€ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋‹ค.\n * ยท `axis` โ€” ๊ทธ ๊ฐœ๋… ์ž์‹ ์˜ ๋ฌธ. ์ปค๋„์— ์—†์œผ๋ฉด ๊ตฌ์กฐ๋ฅผ ใ€Œ์—†์Œใ€์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค.\n * ยท `shownOn` โ€” ๊ทธ ์‚ฌ์‹ค์„ ๋“ค๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ถ•. ์˜ˆ์ „์—๋Š” ์—†๋Š” ์ถ•์„ **๋ง์—†์ด ๊ฑธ๋Ÿฌ ๋ƒˆ๋‹ค.** ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์ค„์€\n * ใ€Œ๊ฐœ๋… ์ถ•์ด ์—†์Šต๋‹ˆ๋‹คใ€๋กœ ๋ณด์ด๊ณ , ์‚ฌ๋žŒ์€ ๊ทธ๊ฒƒ์„ **์›๋ž˜ ๊ทธ๋Ÿฐ ๊ฒƒ**์œผ๋กœ ์ฝ๋Š”๋‹ค. ์‹ค์ œ๋กœ ๊ทธ ์ผ์ด ์žˆ์—ˆ๋‹ค:\n * EPCIS ํ‘œ์˜ ์ผ๊ณฑ ์ค„์ด ์ปค๋„์— ์—†๋Š” ์ถ•(`items`)์— ๊ธฐ๋Œ€๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ฒฝ๊ณ ๊ฐ€ ๋œฌ ๊ฒƒ์€ ๋‘ ์ค„๋ฟ์ด์—ˆ๋‹ค.\n *\n * ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์–ด๊ธ‹๋‚˜๋ฉด `axisMissing` ์ด๋‹ค โ€” ํ‘œ๊ฐ€ ์Šค์Šค๋กœ ใ€Œ์ตœ์‹ ์ด ์•„๋‹ˆ๋‹คใ€๋ผ๊ณ  ๋งํ•˜๊ฒŒ ํ•œ๋‹ค.\n */\nexport function reconcileAxes(c: Isa95Concept, known: Set<string>): Isa95Concept & { axisMissing?: boolean } {\n const ownMissing = !!c.axis && !known.has(c.axis)\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const lostShown = !!c.shownOn && (shownOn?.length ?? 0) !== c.shownOn.length\n const fixed = lostShown ? { ...c, shownOn } : c\n if (!ownMissing && !lostShown) return fixed\n /* ๊ตฌ์กฐ๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์€ **์ž๊ธฐ ๋ฌธ์ด ์—†์–ด์ง„ ๊ฒฝ์šฐ**๋‹ค โ€” ๋‚จ์˜ ์ถ•์—์„œ ๋ณด์ด๋˜ ๊ฒƒ์€ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํ‘œ์‹œ์˜ ๋ฌธ์ œ๋‹ค. */\n return ownMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing: true } : { ...fixed, axisMissing: true }\n}\n\nexport function isa95Coverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const concepts = ISA95_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)))\n /* ์ฑ„์šด ์ˆ˜๋Š” `full` ๋งŒ ์„ผ๋‹ค โ€” ๋ถ€๋ถ„์„ ์ฑ„์šด ๊ฒƒ์œผ๋กœ ์„ธ๋ฉด ๊ธฐ์ค€์ด ์Šค์Šค๋กœ๋ฅผ ์†์ธ๋‹ค. */\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n model: 'ISA-95',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  /*
3
3
  * **๊ฐœ์ฒด์—์„œ ํ’ˆ๋ชฉ์œผ๋กœ** โ€” ์ •์ฒด์„ฑ ๋ชจ์–‘์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋‹ค (2026-08-23).
4
4
  *
5
- * โ”€โ”€ ๋ฌด์—‡์ด ์กฐ์šฉํžˆ ๋น„์–ด ์žˆ์—ˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
5
+ * โ”€โ”€ ๋ฌด์—‡์ด ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋น„์–ด ์žˆ์—ˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
6
6
  * ํ™”๋ฉด์ด ใ€Œ์ด ๊ฐœ์ฒด๋Š” ์„ ์–ธ๋œ ์ž์žฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(๋ผ์ธ ๋‚ด๋ถ€์˜ ์ค‘๊ฐ„ ์‚ฐ๋ฌผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)ใ€๋ผ๊ณ  ๋งํ–ˆ๋Š”๋ฐ, ๊ทธ
7
7
  * ํ’ˆ๋ชฉ์€ ์›๋ณธ์˜ ์„ ์–ธ์— ์ด๋ฆ„๊นŒ์ง€ ์žˆ์—ˆ๋‹ค(ใ€Œ๋ƒ‰๋™๊ทธ๋ฆฐ๋นˆ์Šคใ€). ๋Œ€์‘ ํ‘œ(`productionSpec.binding`)๋„ ๋ฉ€์ฉกํ–ˆ๋‹ค.
8
8
  *
@@ -12,7 +12,7 @@
12
12
  * https://โ€ฆ/class/product-M0000438@M2R0001 โ†’ null (๋ชจ๋ฅด๋˜ ๋ชจ์–‘)
13
13
  *
14
14
  * ์›น URI ๋กœ ์ •์ฒด์„ฑ์„ ๋งํ•˜๋Š” ์›๋ณธ์—์„œ๋Š” ์–ธ์ œ๋‚˜ `null` ์ด ๋‚˜์™”๊ณ , ๊ทธ๋ž˜์„œ **๊ฐœ์ฒด๋ฅผ ์ž์žฌ์— ์ด์„ ์ˆ˜ ์—†์—ˆ๋‹ค.**
15
- * ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด ๋‘ ๊ณณ์—์„œ ์กฐ์šฉํ•œ ๋นˆ์นธ์ด์—ˆ๋‹ค(๊ณ„๋ณด ์ ํ•ฉ์„ฑ ยท ์˜ค๋”๊ฐ€ ๋ฌด์—‡์„ ๋งŒ๋“œ๋‚˜). ใ€Œ์—†์œผ๋ฉด ๋ถ™์ด์ง€
15
+ * ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด ๋‘ ๊ณณ์—์„œ ๋“ค์–ด์˜จ ๊ฒƒ์ด ์—†๋Š” ๋นˆ์นธ์ด์—ˆ๋‹ค(๊ณ„๋ณด ์ ํ•ฉ์„ฑ ยท ์˜ค๋”๊ฐ€ ๋ฌด์—‡์„ ๋งŒ๋“œ๋‚˜). ใ€Œ์—†์œผ๋ฉด ๋ถ™์ด์ง€
16
16
  * ์•Š๋Š”๋‹คใ€๋Š” ๊ทœ์œจ์„ ์ง€ํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด ์˜ค๋ฅ˜๋„ ๋‚˜์ง€ ์•Š์•˜๋‹ค.
17
17
  *
18
18
  * โ”€โ”€ ๋ฌด์—‡์„ ๋Œ๋ ค์ฃผ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
@@ -1 +1 @@
1
- {"version":3,"file":"item-ref.js","sourceRoot":"","sources":["../../../server/service/twin-model/item-ref.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;AAaH,8BAWC;AAaD,oDAaC;AAhDD;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnB,sEAAsE;IACtE,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1B,iDAAiD;IACjD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,oBAAoB,CAAI,GAAkB,EAAE,QAAwB;IAClF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,GAAkB,CAAA;IACtB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,SAAQ;QACvD,KAAK,EAAE,CAAA;QACP,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAC/B,GAAG,GAAG,KAAK,CAAA;IACb,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["/*\n * **๊ฐœ์ฒด์—์„œ ํ’ˆ๋ชฉ์œผ๋กœ** โ€” ์ •์ฒด์„ฑ ๋ชจ์–‘์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋‹ค (2026-08-23).\n *\n * โ”€โ”€ ๋ฌด์—‡์ด ์กฐ์šฉํžˆ ๋น„์–ด ์žˆ์—ˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํ™”๋ฉด์ด ใ€Œ์ด ๊ฐœ์ฒด๋Š” ์„ ์–ธ๋œ ์ž์žฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(๋ผ์ธ ๋‚ด๋ถ€์˜ ์ค‘๊ฐ„ ์‚ฐ๋ฌผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)ใ€๋ผ๊ณ  ๋งํ–ˆ๋Š”๋ฐ, ๊ทธ\n * ํ’ˆ๋ชฉ์€ ์›๋ณธ์˜ ์„ ์–ธ์— ์ด๋ฆ„๊นŒ์ง€ ์žˆ์—ˆ๋‹ค(ใ€Œ๋ƒ‰๋™๊ทธ๋ฆฐ๋นˆ์Šคใ€). ๋Œ€์‘ ํ‘œ(`productionSpec.binding`)๋„ ๋ฉ€์ฉกํ–ˆ๋‹ค.\n *\n * ์›์ธ์€ **๊ฐœ์ฒด์—์„œ ํ’ˆ๋ชฉ์„ ๊บผ๋‚ด๋Š” ๊ทœ์น™**์ด์—ˆ๋‹ค. ๊ทธ ๊ทœ์น™์ด GS1 SGTIN URN ํ•˜๋‚˜๋งŒ ์•Œ์•˜๋‹ค.\n *\n * urn:epc:id:sgtin:0614141.077101.42 โ†’ 077101 (์•Œ๋˜ ๋ชจ์–‘)\n * https://โ€ฆ/class/product-M0000438@M2R0001 โ†’ null (๋ชจ๋ฅด๋˜ ๋ชจ์–‘)\n *\n * ์›น URI ๋กœ ์ •์ฒด์„ฑ์„ ๋งํ•˜๋Š” ์›๋ณธ์—์„œ๋Š” ์–ธ์ œ๋‚˜ `null` ์ด ๋‚˜์™”๊ณ , ๊ทธ๋ž˜์„œ **๊ฐœ์ฒด๋ฅผ ์ž์žฌ์— ์ด์„ ์ˆ˜ ์—†์—ˆ๋‹ค.**\n * ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด ๋‘ ๊ณณ์—์„œ ์กฐ์šฉํ•œ ๋นˆ์นธ์ด์—ˆ๋‹ค(๊ณ„๋ณด ์ ํ•ฉ์„ฑ ยท ์˜ค๋”๊ฐ€ ๋ฌด์—‡์„ ๋งŒ๋“œ๋‚˜). ใ€Œ์—†์œผ๋ฉด ๋ถ™์ด์ง€\n * ์•Š๋Š”๋‹คใ€๋Š” ๊ทœ์œจ์„ ์ง€ํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด ์˜ค๋ฅ˜๋„ ๋‚˜์ง€ ์•Š์•˜๋‹ค.\n *\n * โ”€โ”€ ๋ฌด์—‡์„ ๋Œ๋ ค์ฃผ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * **๊ทธ ํŠธ์œˆ์˜ ๋Œ€์‘ ํ‘œ๊ฐ€ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ชจ์–‘**์ด๋‹ค. ๋‘ ์„ธ๊ณ„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ฐ’์œผ๋กœ ์“ด๋‹ค.\n *\n * SGTIN ์„ธ๊ณ„ binding ๊ฐ’ = ํ’ˆ๋ชฉ ์ฐธ์กฐ ์ˆซ์ž(`077101`) โ†’ ์ˆซ์ž๋ฅผ ๋Œ๋ ค์ค€๋‹ค\n * URI ์„ธ๊ณ„ binding ๊ฐ’ = ํด๋ž˜์Šค URI(`โ€ฆ/product-Mโ€ฆ`) โ†’ ํด๋ž˜์Šค URI ๋ฅผ ๋Œ๋ ค์ค€๋‹ค\n *\n * ๊ทธ๋ž˜์„œ ๋‘ ์„ธ๊ณ„๋ฅผ ํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹ตํ•œ๋‹ค โ€” ๋ถ€๋ฅด๋Š” ์ž๋ฆฌ๊ฐ€ ์›๋ณธ์˜ ์ •์ฒด์„ฑ ๋ฐฉ์‹์„ ์•Œ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.\n *\n * โ”€โ”€ ๋ฌด์—‡์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * **์–ด๋А ๋ถ€ํ˜ธ๊ฐ€ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค.** ๊ทธ๊ฒƒ์€ ์›๋ณธ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ  ์ปค๋„ ๊ณ„์•ฝ์ด ์ •ํ•œ ์ ์ด ์—†๋‹ค โ€” ํ•œ\n * ์›๋ณธ(chef)์ด ์“ฐ๋Š” `@` ๋ฅผ ๊ทœ์น™์œผ๋กœ ๊ตณํžˆ๋ฉด ์ด ํ™”๋ฉด์ด ๊ทธ ๋ ˆ๊ฑฐ์‹œ ์œ„์— ์„œ๊ฒŒ ๋œ๋‹ค. ์ž๋ฅด๋Š” ํŒ๋‹จ์€ ๊ทธ ํŠธ์œˆ์˜\n * **์„ ์–ธ**์ด ํ•˜๊ณ (ยง`resolveByDeclaration`), ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ๋‚จ์˜\n * ๋ ˆ์‹œํ”ผ์™€ ๋น„๊ตํ•˜๊ฒŒ ๋˜๊ณ , ๊ทธ๊ฒƒ์ด ใ€Œ์„ค๊ณ„์™€ ๋‹ค๋ฅด๋‹คใ€๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค.\n */\n\n/**\n * ๊ฐœ์ฒด ์‹๋ณ„์ž โ†’ **ํ’ˆ๋ชฉ ์ฐธ์กฐ**. ๋Œ€์‘ ํ‘œ์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ์–‘์œผ๋กœ ๋Œ๋ ค์ค€๋‹ค.\n *\n * SGTIN ์€ ํ‘œ์ค€์ด ์ž๋ฆฌ๋ฅผ ์ •ํ•ด ๋‘์—ˆ์œผ๋ฏ€๋กœ ๊ทธ ์ž๋ฆฌ์—์„œ ํ’ˆ๋ชฉ ์ฐธ์กฐ๋ฅผ ๊บผ๋‚ธ๋‹ค. ๊ทธ ๋ฐ–์˜ ๋ชจ์–‘์€ **์†๋Œ€์ง€\n * ์•Š๋Š”๋‹ค** โ€” ์–ด๋А ๋ถ€ํ˜ธ๊ฐ€ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€๋Š” ์›๋ณธ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ , ์ปค๋„ ๊ณ„์•ฝ์ด ๊ทธ ๊ตฌ๋ถ„์ž๋ฅผ ์ •ํ•œ ์ ์ด ์—†๋‹ค.\n * ์•ž์„œ ์ด ์ž๋ฆฌ์— ใ€Œ`@` ๋’ค๋Š” ๊ฐœ์ฒด๋‹คใ€๋ฅผ ๋„ฃ์—ˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ํ•œ ์›๋ณธ(chef)์˜ ๋ชจ์–‘์„ ๊ทœ์น™์œผ๋กœ ๊ตณํžŒ ๊ฒƒ์ด์—ˆ๋‹ค.\n *\n * ๊ทธ๋ž˜์„œ ์ž๋ฅด๋Š” ์ผ์€ ์—ฌ๊ธฐ์„œ ํ•˜์ง€ ์•Š๊ณ , **๊ทธ ํŠธ์œˆ์˜ ์„ ์–ธ๊ณผ ๋น„๊ตํ•ด** ํŒ์ •ํ•œ๋‹ค(ยง`resolveByDeclaration`).\n * ์„ ์–ธ์ด ๋‹ต์„ ์ฃผ์ง€ ๋ชปํ•˜๋ฉด `null` ์ด๋‹ค โ€” ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ๋‚จ์˜ ๋ ˆ์‹œํ”ผ์™€ ๋น„๊ตํ•˜๊ฒŒ ๋˜๊ณ , ๊ทธ๊ฒƒ์ด ใ€Œ์„ค๊ณ„์™€\n * ๋‹ค๋ฅด๋‹คใ€๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค.\n */\nexport function itemRefOf(epc: unknown): string | null {\n if (typeof epc !== 'string') return null\n const s = epc.trim()\n if (!s) return null\n\n /* GS1 SGTIN โ€” ํšŒ์‚ฌ ์ ‘๋‘์‚ฌ์™€ ์ผ๋ จ๋ฒˆํ˜ธ ์‚ฌ์ด์˜ ํ’ˆ๋ชฉ ์ฐธ์กฐ. `idpat` ์˜ `*` ๋„ ๊ฐ™์€ ์ž๋ฆฌ์—์„œ ๊ฑธ๋ฆฐ๋‹ค. */\n const sgtin = /sgtin:[^.]+\\.([^.]+)\\./.exec(s)\n if (sgtin) return sgtin[1]\n\n /* ๊ทธ ๋ฐ–์˜ ์ •์ฒด์„ฑ(์›น URI ๋“ฑ)์€ ๊ทธ๋Œ€๋กœ ๋‚ธ๋‹ค โ€” ์ž๋ฅด๋Š” ํŒ๋‹จ์€ ์„ ์–ธ์ด ํ•œ๋‹ค. */\n return s\n}\n\n/**\n * ์ด ์‹๋ณ„์ž๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” **์„ ์–ธ ํ•ญ๋ชฉ**์„ ์ฐพ๋Š”๋‹ค โ€” ์›๋ณธ์˜ ์ •์ฒด์„ฑ ๊ด€ํ–‰์„ ์•Œ์ง€ ์•Š๊ณ , ๊ตฌ๋ถ„์ž๋„ ๋ชจ๋ฅธ๋‹ค.\n *\n * ์„ธ ๊ฐ€์ง€๋ฅผ ์ฐจ๋ก€๋กœ ๋ณธ๋‹ค. ์–ด๋А ๋‹จ๊ณ„๋“  **ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค**(๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ํ‹€๋ฆฐ ๋‹ต๋ณด๋‹ค ๋‚ซ๋‹ค).\n *\n * โ‘  ๊ทธ๋Œ€๋กœ ๊ฐ™๋‹ค\n * โ‘ก ๊ด€์ธก๋œ ์‹๋ณ„์ž๊ฐ€ ์„ ์–ธ์„ **ํ™•์žฅ**ํ•œ๋‹ค โ€” ๊ฐœ์ฒด๋Š” ์ž๊ธฐ ํด๋ž˜์Šค๋กœ ์‹œ์ž‘ํ•œ๋‹ค(`โ€ฆ/product-M1` + ๊ฐœ์ฒด ํ‘œ์‹œ)\n * โ‘ข ํ™”๋ฉด์ด **์งง๊ฒŒ ์ค„์ธ** ์‹๋ณ„์ž๋ฅผ ๊ฑด๋„ธ๋‹ค โ€” ์„ ์–ธ์ด ๊ทธ๊ฒƒ์œผ๋กœ ๋๋‚œ๋‹ค(`net/class/product-M1`)\n *\n * โ‘กโ‘ข์€ ๋ถ€ํ˜ธ๋ฅผ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋ž˜์„œ ์›๋ณธ์ด `@`ยท`#`ยท`/` ๋ฌด์—‡์„ ์“ฐ๋“ , ๋˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์“ฐ์ง€ ์•Š๋“  ๊ฐ™์€ ๊ทœ์น™์ด ์„ ๋‹ค.\n */\nexport function resolveByDeclaration<T>(ref: string | null, declared: Map<string, T>): T | undefined {\n if (!ref) return undefined\n const exact = declared.get(ref)\n if (exact !== undefined) return exact\n let hit: T | undefined\n let found = 0\n for (const [id, value] of declared) {\n if (!(ref.startsWith(id) || id.endsWith(ref))) continue\n found++\n if (found > 1) return undefined\n hit = value\n }\n return hit\n}\n"]}
1
+ {"version":3,"file":"item-ref.js","sourceRoot":"","sources":["../../../server/service/twin-model/item-ref.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;AAaH,8BAWC;AAaD,oDAaC;AAhDD;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnB,sEAAsE;IACtE,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC9C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1B,iDAAiD;IACjD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,oBAAoB,CAAI,GAAkB,EAAE,QAAwB;IAClF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,GAAkB,CAAA;IACtB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,SAAQ;QACvD,KAAK,EAAE,CAAA;QACP,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAC/B,GAAG,GAAG,KAAK,CAAA;IACb,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["/*\n * **๊ฐœ์ฒด์—์„œ ํ’ˆ๋ชฉ์œผ๋กœ** โ€” ์ •์ฒด์„ฑ ๋ชจ์–‘์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋‹ค (2026-08-23).\n *\n * โ”€โ”€ ๋ฌด์—‡์ด ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋น„์–ด ์žˆ์—ˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํ™”๋ฉด์ด ใ€Œ์ด ๊ฐœ์ฒด๋Š” ์„ ์–ธ๋œ ์ž์žฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(๋ผ์ธ ๋‚ด๋ถ€์˜ ์ค‘๊ฐ„ ์‚ฐ๋ฌผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)ใ€๋ผ๊ณ  ๋งํ–ˆ๋Š”๋ฐ, ๊ทธ\n * ํ’ˆ๋ชฉ์€ ์›๋ณธ์˜ ์„ ์–ธ์— ์ด๋ฆ„๊นŒ์ง€ ์žˆ์—ˆ๋‹ค(ใ€Œ๋ƒ‰๋™๊ทธ๋ฆฐ๋นˆ์Šคใ€). ๋Œ€์‘ ํ‘œ(`productionSpec.binding`)๋„ ๋ฉ€์ฉกํ–ˆ๋‹ค.\n *\n * ์›์ธ์€ **๊ฐœ์ฒด์—์„œ ํ’ˆ๋ชฉ์„ ๊บผ๋‚ด๋Š” ๊ทœ์น™**์ด์—ˆ๋‹ค. ๊ทธ ๊ทœ์น™์ด GS1 SGTIN URN ํ•˜๋‚˜๋งŒ ์•Œ์•˜๋‹ค.\n *\n * urn:epc:id:sgtin:0614141.077101.42 โ†’ 077101 (์•Œ๋˜ ๋ชจ์–‘)\n * https://โ€ฆ/class/product-M0000438@M2R0001 โ†’ null (๋ชจ๋ฅด๋˜ ๋ชจ์–‘)\n *\n * ์›น URI ๋กœ ์ •์ฒด์„ฑ์„ ๋งํ•˜๋Š” ์›๋ณธ์—์„œ๋Š” ์–ธ์ œ๋‚˜ `null` ์ด ๋‚˜์™”๊ณ , ๊ทธ๋ž˜์„œ **๊ฐœ์ฒด๋ฅผ ์ž์žฌ์— ์ด์„ ์ˆ˜ ์—†์—ˆ๋‹ค.**\n * ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด ๋‘ ๊ณณ์—์„œ ๋“ค์–ด์˜จ ๊ฒƒ์ด ์—†๋Š” ๋นˆ์นธ์ด์—ˆ๋‹ค(๊ณ„๋ณด ์ ํ•ฉ์„ฑ ยท ์˜ค๋”๊ฐ€ ๋ฌด์—‡์„ ๋งŒ๋“œ๋‚˜). ใ€Œ์—†์œผ๋ฉด ๋ถ™์ด์ง€\n * ์•Š๋Š”๋‹คใ€๋Š” ๊ทœ์œจ์„ ์ง€ํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด ์˜ค๋ฅ˜๋„ ๋‚˜์ง€ ์•Š์•˜๋‹ค.\n *\n * โ”€โ”€ ๋ฌด์—‡์„ ๋Œ๋ ค์ฃผ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * **๊ทธ ํŠธ์œˆ์˜ ๋Œ€์‘ ํ‘œ๊ฐ€ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ชจ์–‘**์ด๋‹ค. ๋‘ ์„ธ๊ณ„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ฐ’์œผ๋กœ ์“ด๋‹ค.\n *\n * SGTIN ์„ธ๊ณ„ binding ๊ฐ’ = ํ’ˆ๋ชฉ ์ฐธ์กฐ ์ˆซ์ž(`077101`) โ†’ ์ˆซ์ž๋ฅผ ๋Œ๋ ค์ค€๋‹ค\n * URI ์„ธ๊ณ„ binding ๊ฐ’ = ํด๋ž˜์Šค URI(`โ€ฆ/product-Mโ€ฆ`) โ†’ ํด๋ž˜์Šค URI ๋ฅผ ๋Œ๋ ค์ค€๋‹ค\n *\n * ๊ทธ๋ž˜์„œ ๋‘ ์„ธ๊ณ„๋ฅผ ํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹ตํ•œ๋‹ค โ€” ๋ถ€๋ฅด๋Š” ์ž๋ฆฌ๊ฐ€ ์›๋ณธ์˜ ์ •์ฒด์„ฑ ๋ฐฉ์‹์„ ์•Œ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.\n *\n * โ”€โ”€ ๋ฌด์—‡์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * **์–ด๋А ๋ถ€ํ˜ธ๊ฐ€ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค.** ๊ทธ๊ฒƒ์€ ์›๋ณธ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ  ์ปค๋„ ๊ณ„์•ฝ์ด ์ •ํ•œ ์ ์ด ์—†๋‹ค โ€” ํ•œ\n * ์›๋ณธ(chef)์ด ์“ฐ๋Š” `@` ๋ฅผ ๊ทœ์น™์œผ๋กœ ๊ตณํžˆ๋ฉด ์ด ํ™”๋ฉด์ด ๊ทธ ๋ ˆ๊ฑฐ์‹œ ์œ„์— ์„œ๊ฒŒ ๋œ๋‹ค. ์ž๋ฅด๋Š” ํŒ๋‹จ์€ ๊ทธ ํŠธ์œˆ์˜\n * **์„ ์–ธ**์ด ํ•˜๊ณ (ยง`resolveByDeclaration`), ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ๋‚จ์˜\n * ๋ ˆ์‹œํ”ผ์™€ ๋น„๊ตํ•˜๊ฒŒ ๋˜๊ณ , ๊ทธ๊ฒƒ์ด ใ€Œ์„ค๊ณ„์™€ ๋‹ค๋ฅด๋‹คใ€๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค.\n */\n\n/**\n * ๊ฐœ์ฒด ์‹๋ณ„์ž โ†’ **ํ’ˆ๋ชฉ ์ฐธ์กฐ**. ๋Œ€์‘ ํ‘œ์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ์–‘์œผ๋กœ ๋Œ๋ ค์ค€๋‹ค.\n *\n * SGTIN ์€ ํ‘œ์ค€์ด ์ž๋ฆฌ๋ฅผ ์ •ํ•ด ๋‘์—ˆ์œผ๋ฏ€๋กœ ๊ทธ ์ž๋ฆฌ์—์„œ ํ’ˆ๋ชฉ ์ฐธ์กฐ๋ฅผ ๊บผ๋‚ธ๋‹ค. ๊ทธ ๋ฐ–์˜ ๋ชจ์–‘์€ **์†๋Œ€์ง€\n * ์•Š๋Š”๋‹ค** โ€” ์–ด๋А ๋ถ€ํ˜ธ๊ฐ€ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€๋Š” ์›๋ณธ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ , ์ปค๋„ ๊ณ„์•ฝ์ด ๊ทธ ๊ตฌ๋ถ„์ž๋ฅผ ์ •ํ•œ ์ ์ด ์—†๋‹ค.\n * ์•ž์„œ ์ด ์ž๋ฆฌ์— ใ€Œ`@` ๋’ค๋Š” ๊ฐœ์ฒด๋‹คใ€๋ฅผ ๋„ฃ์—ˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ํ•œ ์›๋ณธ(chef)์˜ ๋ชจ์–‘์„ ๊ทœ์น™์œผ๋กœ ๊ตณํžŒ ๊ฒƒ์ด์—ˆ๋‹ค.\n *\n * ๊ทธ๋ž˜์„œ ์ž๋ฅด๋Š” ์ผ์€ ์—ฌ๊ธฐ์„œ ํ•˜์ง€ ์•Š๊ณ , **๊ทธ ํŠธ์œˆ์˜ ์„ ์–ธ๊ณผ ๋น„๊ตํ•ด** ํŒ์ •ํ•œ๋‹ค(ยง`resolveByDeclaration`).\n * ์„ ์–ธ์ด ๋‹ต์„ ์ฃผ์ง€ ๋ชปํ•˜๋ฉด `null` ์ด๋‹ค โ€” ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ๋‚จ์˜ ๋ ˆ์‹œํ”ผ์™€ ๋น„๊ตํ•˜๊ฒŒ ๋˜๊ณ , ๊ทธ๊ฒƒ์ด ใ€Œ์„ค๊ณ„์™€\n * ๋‹ค๋ฅด๋‹คใ€๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค.\n */\nexport function itemRefOf(epc: unknown): string | null {\n if (typeof epc !== 'string') return null\n const s = epc.trim()\n if (!s) return null\n\n /* GS1 SGTIN โ€” ํšŒ์‚ฌ ์ ‘๋‘์‚ฌ์™€ ์ผ๋ จ๋ฒˆํ˜ธ ์‚ฌ์ด์˜ ํ’ˆ๋ชฉ ์ฐธ์กฐ. `idpat` ์˜ `*` ๋„ ๊ฐ™์€ ์ž๋ฆฌ์—์„œ ๊ฑธ๋ฆฐ๋‹ค. */\n const sgtin = /sgtin:[^.]+\\.([^.]+)\\./.exec(s)\n if (sgtin) return sgtin[1]\n\n /* ๊ทธ ๋ฐ–์˜ ์ •์ฒด์„ฑ(์›น URI ๋“ฑ)์€ ๊ทธ๋Œ€๋กœ ๋‚ธ๋‹ค โ€” ์ž๋ฅด๋Š” ํŒ๋‹จ์€ ์„ ์–ธ์ด ํ•œ๋‹ค. */\n return s\n}\n\n/**\n * ์ด ์‹๋ณ„์ž๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” **์„ ์–ธ ํ•ญ๋ชฉ**์„ ์ฐพ๋Š”๋‹ค โ€” ์›๋ณธ์˜ ์ •์ฒด์„ฑ ๊ด€ํ–‰์„ ์•Œ์ง€ ์•Š๊ณ , ๊ตฌ๋ถ„์ž๋„ ๋ชจ๋ฅธ๋‹ค.\n *\n * ์„ธ ๊ฐ€์ง€๋ฅผ ์ฐจ๋ก€๋กœ ๋ณธ๋‹ค. ์–ด๋А ๋‹จ๊ณ„๋“  **ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค**(๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ํ‹€๋ฆฐ ๋‹ต๋ณด๋‹ค ๋‚ซ๋‹ค).\n *\n * โ‘  ๊ทธ๋Œ€๋กœ ๊ฐ™๋‹ค\n * โ‘ก ๊ด€์ธก๋œ ์‹๋ณ„์ž๊ฐ€ ์„ ์–ธ์„ **ํ™•์žฅ**ํ•œ๋‹ค โ€” ๊ฐœ์ฒด๋Š” ์ž๊ธฐ ํด๋ž˜์Šค๋กœ ์‹œ์ž‘ํ•œ๋‹ค(`โ€ฆ/product-M1` + ๊ฐœ์ฒด ํ‘œ์‹œ)\n * โ‘ข ํ™”๋ฉด์ด **์งง๊ฒŒ ์ค„์ธ** ์‹๋ณ„์ž๋ฅผ ๊ฑด๋„ธ๋‹ค โ€” ์„ ์–ธ์ด ๊ทธ๊ฒƒ์œผ๋กœ ๋๋‚œ๋‹ค(`net/class/product-M1`)\n *\n * โ‘กโ‘ข์€ ๋ถ€ํ˜ธ๋ฅผ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋ž˜์„œ ์›๋ณธ์ด `@`ยท`#`ยท`/` ๋ฌด์—‡์„ ์“ฐ๋“ , ๋˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์“ฐ์ง€ ์•Š๋“  ๊ฐ™์€ ๊ทœ์น™์ด ์„ ๋‹ค.\n */\nexport function resolveByDeclaration<T>(ref: string | null, declared: Map<string, T>): T | undefined {\n if (!ref) return undefined\n const exact = declared.get(ref)\n if (exact !== undefined) return exact\n let hit: T | undefined\n let found = 0\n for (const [id, value] of declared) {\n if (!(ref.startsWith(id) || id.endsWith(ref))) continue\n found++\n if (found > 1) return undefined\n hit = value\n }\n return hit\n}\n"]}
@@ -5,7 +5,7 @@ export declare const at: (o: any, path: string) => any;
5
5
  *
6
6
  * ๋„๋ฉ”์ธ ๋ชจ์–‘์„ ์ฝ”๋“œ๊ฐ€ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ **์‹๋ณ„์ž ๊ด€๋ก€**๋ฅผ ์•„๋Š” ๊ฒƒ์ด๋‹ค. ํ›„๋ณด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ณ  ์ฒซ
7
7
  * ๊ฐ’์„ ์“ด๋‹ค. ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ๊ทธ ํ•ญ๋ชฉ์€ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ `null` โ€” ๋ชฉ๋ก์—์„œ ๋นผ์ง€ ์•Š๊ณ  **id ์—†์Œ**์œผ๋กœ
8
- * ๋‚ธ๋‹ค(์กฐ์šฉํžˆ ๋น ์ง€๋ฉด ๊ฑด์ˆ˜๊ฐ€ ์•ˆ ๋งž๋Š”๋‹ค).
8
+ * ๋‚ธ๋‹ค(์˜ค๋ฅ˜ ์—†์ด ๋น ์ง€๋ฉด ๊ฑด์ˆ˜๊ฐ€ ์•ˆ ๋งž๋Š”๋‹ค).
9
9
  */
10
10
  export declare const idOf: (o: any, info?: {
11
11
  idField?: string | string[];
@@ -11,7 +11,7 @@ exports.namesFor = namesFor;
11
11
  * ๋‘ ๋ฒŒ์„ ๋งŒ๋“ค๋ฉด ํ•œ์ชฝ๋งŒ ๊ณ ์ณ์ง€๋ฏ€๋กœ ํ•œ ๊ณณ์— ๋‘”๋‹ค(์žฌ๋ฐœ๋ช… ๊ธˆ์ง€).
12
12
  */
13
13
  /* ์ปค๋„ ๋Ÿฐํƒ€์ž„ ๋กœ๋“œ โ€” ์–ด๋А ์ถ•์ด ์žˆ๋Š”์ง€๋Š” ์นดํƒˆ๋กœ๊ทธ๊ฐ€ ์„ ์–ธํ•œ๋‹ค(์ด ํŒŒ์ผ์€ ๋„๋ฉ”์ธ ๋ชจ์–‘์„ ์•Œ์ง€ ์•Š๋Š”๋‹ค). */
14
- const { TWIN_AXES, axisSource } = require('@operato/twin-kernel');
14
+ const { TWIN_AXES, axisSource } = require('@operato/ops-contract');
15
15
  /** `productionSpec.definition.recipes` ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์„œ์—์„œ ๋”ฐ๋ผ๊ฐ„๋‹ค. */
16
16
  const at = (o, path) => path.split('.').reduce((a, k) => (a == null ? undefined : a[k]), o);
17
17
  exports.at = at;
@@ -20,7 +20,7 @@ exports.at = at;
20
20
  *
21
21
  * ๋„๋ฉ”์ธ ๋ชจ์–‘์„ ์ฝ”๋“œ๊ฐ€ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ **์‹๋ณ„์ž ๊ด€๋ก€**๋ฅผ ์•„๋Š” ๊ฒƒ์ด๋‹ค. ํ›„๋ณด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ณด๊ณ  ์ฒซ
22
22
  * ๊ฐ’์„ ์“ด๋‹ค. ํ•˜๋‚˜๋„ ์—†์œผ๋ฉด ๊ทธ ํ•ญ๋ชฉ์€ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ `null` โ€” ๋ชฉ๋ก์—์„œ ๋นผ์ง€ ์•Š๊ณ  **id ์—†์Œ**์œผ๋กœ
23
- * ๋‚ธ๋‹ค(์กฐ์šฉํžˆ ๋น ์ง€๋ฉด ๊ฑด์ˆ˜๊ฐ€ ์•ˆ ๋งž๋Š”๋‹ค).
23
+ * ๋‚ธ๋‹ค(์˜ค๋ฅ˜ ์—†์ด ๋น ์ง€๋ฉด ๊ฑด์ˆ˜๊ฐ€ ์•ˆ ๋งž๋Š”๋‹ค).
24
24
  */
25
25
  const idOf = (o, info) => {
26
26
  if (typeof o === 'string')
@@ -1 +1 @@
1
- {"version":3,"file":"name-index.js","sourceRoot":"","sources":["../../../server/service/twin-model/name-index.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ํ•ญ๋ชฉ์˜ **์ด๋ฆ„**์„ ๋ถ™์ด๋Š” ์ž๋ฆฌ โ€” ํ™”๋ฉด์ด id ๋งŒ ๋ณด์ด์ง€ ์•Š๊ฒŒ. (2026-08-22 ๊ณต์šฉ์œผ๋กœ ์˜ฎ๊น€)\n *\n * ์ด ๋‘˜์€ ํ•ญ๋ชฉ ์งˆ์˜ ์•ˆ์— ์‚ฌ์ ์œผ๋กœ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ **์ „๊ฐœ(BOM ๋‚˜๋ฌด) ํ™”๋ฉด๋„ ๊ฐ™์€ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค** โ€”\n * ์‚ฌ์šฉ์ž๊ฐ€ ใ€Œ๊ฐ ๋…ธ๋“œ์˜ ์‹๋ณ„์ž๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด์„œ ์ดํ•ด๊ฐ€ ์–ด๋ ต๋‹ค. ์‹๋ณ„์ž์™€ ์ด๋ฆ„์ด ๋ณด์ด๋ฉดใ€์ด๋ผ๊ณ  ํ–ˆ๋‹ค.\n * ๋‘ ๋ฒŒ์„ ๋งŒ๋“ค๋ฉด ํ•œ์ชฝ๋งŒ ๊ณ ์ณ์ง€๋ฏ€๋กœ ํ•œ ๊ณณ์— ๋‘”๋‹ค(์žฌ๋ฐœ๋ช… ๊ธˆ์ง€).\n */\n/* ์ปค๋„ ๋Ÿฐํƒ€์ž„ ๋กœ๋“œ โ€” ์–ด๋А ์ถ•์ด ์žˆ๋Š”์ง€๋Š” ์นดํƒˆ๋กœ๊ทธ๊ฐ€ ์„ ์–ธํ•œ๋‹ค(์ด ํŒŒ์ผ์€ ๋„๋ฉ”์ธ ๋ชจ์–‘์„ ์•Œ์ง€ ์•Š๋Š”๋‹ค). */\nconst { TWIN_AXES, axisSource } = require('@operato/twin-kernel')\n\n/** `productionSpec.definition.recipes` ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์„œ์—์„œ ๋”ฐ๋ผ๊ฐ„๋‹ค. */\nexport const 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 */\nexport const idOf = (o: any, info?: { idField?: string | string[] }): string | null => {\n if (typeof o === 'string') return o\n /*\n * **๋ฌด์—‡์ด ์ด ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€๋Š” ์„ ์–ธ์ด ๋งํ•œ๋‹ค**(ยง`TwinAxisInfo.idField`).\n *\n * ์˜ˆ์ „์—๋Š” `id`ยท`key`ยท`gtin` ์„ ์ง์ž‘ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ `id` ๊ฐ€ ์—†๋Š” ์ถ•(์ˆ˜์š” ๊ตฌ๊ฐ„ โ€” ์ •์ฒด์„ฑ์ด ๊ตฌ๊ฐ„ ์‹œ์ž‘\n * ์‹œ๊ฐ์ด๋‹ค)์˜ ํ•ญ๋ชฉ์ด ์ „๋ถ€ ใ€Œ์‹๋ณ„์ž ์—†์Œ โ€” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ํ•ญ๋ชฉใ€์œผ๋กœ ๋ณด์˜€๋‹ค. ๊ฐ’์€ ์‹ค์žฌํ•˜๋Š”๋ฐ\n * ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์ด๋‹ค.\n */\n /*\n * ์„ ์–ธ์ด **์ฐจ๋ก€**๋ฅผ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค(2026-08-22) โ€” ์ •์ฒด์„ฑ์ด ํ•œ ์นธ์œผ๋กœ ์ •ํ•ด์ง€์ง€ ์•Š๋Š” ์ถ•์ด ์žˆ๋‹ค. ๋ฌผํ’ˆ์ด\n * ๊ทธ๋ ‡๋‹ค: ์ง๋ ฌ ๋ฌผํ’ˆ์€ `epc` ๊ฐ€ ์œ ์ผํ•˜์ง€๋งŒ ๋น„์ง๋ ฌ ๋กœํŠธ๊ฐ€ ์ž๋ฆฌ๋งˆ๋‹ค ๋‚˜๋‰˜๋ฉด `subLotId` ๊ฐ€ ๊ฐœ์ฒด๋ฅผ\n * ๊ตฌ๋ณ„ํ•œ๋‹ค(๊ฐ™์€ ๋กœํŠธ์˜ ๋‘ ๋ถ€๋ถ„์€ ๊ฐ™์€ `epc` ๋ฅผ ๊ฐ–๋Š”๋‹ค). ์•ž์—์„œ ๊ฐ’์ด ์žˆ๋Š” ์ฒซ ์นธ์ด ์ด๊ธด๋‹ค.\n */\n for (const f of info?.idField ? (Array.isArray(info.idField) ? info.idField : [info.idField]) : []) {\n const v = o?.[f]\n if (v !== undefined && v !== null) return String(v)\n }\n return o?.id ?? o?.key ?? o?.gtin ?? null\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 */\nexport function 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 *\n * ๋ชจ๋ธ ์ „์ฒด ํ‘œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‹ค์œผ๋ฉด ์ž๋ฆฌ๊ฐ€ 10๋งŒ์ธ ํ˜„์žฅ์—์„œ ๋ชฉ๋ก ํ•œ ํŽ˜์ด์ง€์— 10๋งŒ ์ค„์งœ๋ฆฌ ์ด๋ฆ„ํ‘œ๊ฐ€\n * ๋”ฐ๋ผ์˜จ๋‹ค. ๋‚˜์˜จ ๊ฐ’์— ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ๋งŒ ์‹ฃ๋Š”๋‹ค โ€” ๊ทœ๋ชจ์—์„œ ์„ฑ๋ฆฝํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ์‹์ด๋‹ค.\n */\nexport function 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"]}
1
+ {"version":3,"file":"name-index.js","sourceRoot":"","sources":["../../../server/service/twin-model/name-index.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ํ•ญ๋ชฉ์˜ **์ด๋ฆ„**์„ ๋ถ™์ด๋Š” ์ž๋ฆฌ โ€” ํ™”๋ฉด์ด id ๋งŒ ๋ณด์ด์ง€ ์•Š๊ฒŒ. (2026-08-22 ๊ณต์šฉ์œผ๋กœ ์˜ฎ๊น€)\n *\n * ์ด ๋‘˜์€ ํ•ญ๋ชฉ ์งˆ์˜ ์•ˆ์— ์‚ฌ์ ์œผ๋กœ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ **์ „๊ฐœ(BOM ๋‚˜๋ฌด) ํ™”๋ฉด๋„ ๊ฐ™์€ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค** โ€”\n * ์‚ฌ์šฉ์ž๊ฐ€ ใ€Œ๊ฐ ๋…ธ๋“œ์˜ ์‹๋ณ„์ž๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด์„œ ์ดํ•ด๊ฐ€ ์–ด๋ ต๋‹ค. ์‹๋ณ„์ž์™€ ์ด๋ฆ„์ด ๋ณด์ด๋ฉดใ€์ด๋ผ๊ณ  ํ–ˆ๋‹ค.\n * ๋‘ ๋ฒŒ์„ ๋งŒ๋“ค๋ฉด ํ•œ์ชฝ๋งŒ ๊ณ ์ณ์ง€๋ฏ€๋กœ ํ•œ ๊ณณ์— ๋‘”๋‹ค(์žฌ๋ฐœ๋ช… ๊ธˆ์ง€).\n */\n/* ์ปค๋„ ๋Ÿฐํƒ€์ž„ ๋กœ๋“œ โ€” ์–ด๋А ์ถ•์ด ์žˆ๋Š”์ง€๋Š” ์นดํƒˆ๋กœ๊ทธ๊ฐ€ ์„ ์–ธํ•œ๋‹ค(์ด ํŒŒ์ผ์€ ๋„๋ฉ”์ธ ๋ชจ์–‘์„ ์•Œ์ง€ ์•Š๋Š”๋‹ค). */\nconst { TWIN_AXES, axisSource } = require('@operato/ops-contract')\n\n/** `productionSpec.definition.recipes` ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์„œ์—์„œ ๋”ฐ๋ผ๊ฐ„๋‹ค. */\nexport const 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 */\nexport const idOf = (o: any, info?: { idField?: string | string[] }): string | null => {\n if (typeof o === 'string') return o\n /*\n * **๋ฌด์—‡์ด ์ด ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€๋Š” ์„ ์–ธ์ด ๋งํ•œ๋‹ค**(ยง`TwinAxisInfo.idField`).\n *\n * ์˜ˆ์ „์—๋Š” `id`ยท`key`ยท`gtin` ์„ ์ง์ž‘ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ `id` ๊ฐ€ ์—†๋Š” ์ถ•(์ˆ˜์š” ๊ตฌ๊ฐ„ โ€” ์ •์ฒด์„ฑ์ด ๊ตฌ๊ฐ„ ์‹œ์ž‘\n * ์‹œ๊ฐ์ด๋‹ค)์˜ ํ•ญ๋ชฉ์ด ์ „๋ถ€ ใ€Œ์‹๋ณ„์ž ์—†์Œ โ€” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ํ•ญ๋ชฉใ€์œผ๋กœ ๋ณด์˜€๋‹ค. ๊ฐ’์€ ์‹ค์žฌํ•˜๋Š”๋ฐ\n * ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์ด๋‹ค.\n */\n /*\n * ์„ ์–ธ์ด **์ฐจ๋ก€**๋ฅผ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค(2026-08-22) โ€” ์ •์ฒด์„ฑ์ด ํ•œ ์นธ์œผ๋กœ ์ •ํ•ด์ง€์ง€ ์•Š๋Š” ์ถ•์ด ์žˆ๋‹ค. ๋ฌผํ’ˆ์ด\n * ๊ทธ๋ ‡๋‹ค: ์ง๋ ฌ ๋ฌผํ’ˆ์€ `epc` ๊ฐ€ ์œ ์ผํ•˜์ง€๋งŒ ๋น„์ง๋ ฌ ๋กœํŠธ๊ฐ€ ์ž๋ฆฌ๋งˆ๋‹ค ๋‚˜๋‰˜๋ฉด `subLotId` ๊ฐ€ ๊ฐœ์ฒด๋ฅผ\n * ๊ตฌ๋ณ„ํ•œ๋‹ค(๊ฐ™์€ ๋กœํŠธ์˜ ๋‘ ๋ถ€๋ถ„์€ ๊ฐ™์€ `epc` ๋ฅผ ๊ฐ–๋Š”๋‹ค). ์•ž์—์„œ ๊ฐ’์ด ์žˆ๋Š” ์ฒซ ์นธ์ด ์ด๊ธด๋‹ค.\n */\n for (const f of info?.idField ? (Array.isArray(info.idField) ? info.idField : [info.idField]) : []) {\n const v = o?.[f]\n if (v !== undefined && v !== null) return String(v)\n }\n return o?.id ?? o?.key ?? o?.gtin ?? null\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 */\nexport function 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 *\n * ๋ชจ๋ธ ์ „์ฒด ํ‘œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‹ค์œผ๋ฉด ์ž๋ฆฌ๊ฐ€ 10๋งŒ์ธ ํ˜„์žฅ์—์„œ ๋ชฉ๋ก ํ•œ ํŽ˜์ด์ง€์— 10๋งŒ ์ค„์งœ๋ฆฌ ์ด๋ฆ„ํ‘œ๊ฐ€\n * ๋”ฐ๋ผ์˜จ๋‹ค. ๋‚˜์˜จ ๊ฐ’์— ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ๋งŒ ์‹ฃ๋Š”๋‹ค โ€” ๊ทœ๋ชจ์—์„œ ์„ฑ๋ฆฝํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ์‹์ด๋‹ค.\n */\nexport function 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"]}
@@ -2,7 +2,7 @@ export interface ProjectionReport {
2
2
  locations: number;
3
3
  equipment: number;
4
4
  operations: number;
5
- /** ์ž๋ฆฌ๋ฅผ ๋ชป ์ฐพ์•„ ๊ธฐ์ค€ ์ž๋ฆฌ๋ฅผ ๋น„์šด ์„ค๋น„ โ€” **์กฐ์šฉํžˆ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.** */
5
+ /** ์ž๋ฆฌ๋ฅผ ๋ชป ์ฐพ์•„ ๊ธฐ์ค€ ์ž๋ฆฌ๋ฅผ ๋น„์šด ์„ค๋น„ โ€” **์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.** */
6
6
  unresolvedHome: string[];
7
7
  /** ๊ตฌ์—ญ์„ ๋ชป ์ฐพ์•„ ๋น„์šด ์ž๋ฆฌ. ๊ตฌ์—ญ์€ model ๋ฐ–(ํ˜ธ์ŠคํŠธ ๊ฐœ๋…)์ด๋ผ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋‹ค. */
8
8
  unresolvedArea: string[];
@@ -7,7 +7,7 @@ const twin_area_js_1 = require("../twin-space/twin-area.js");
7
7
  const twin_location_js_1 = require("./twin-location.js");
8
8
  const twin_equipment_js_1 = require("./twin-equipment.js");
9
9
  const twin_operation_js_1 = require("./twin-operation.js");
10
- const twin_kernel_1 = require("@operato/twin-kernel");
10
+ const ops_contract_1 = require("@operato/ops-contract");
11
11
  /**
12
12
  * ์ด ํŠธ์œˆ์˜ ๊ตฌ์กฐ ํ–‰์„ **์›๋ณธ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.**
13
13
  *
@@ -24,7 +24,7 @@ async function projectStructure(domainId, instanceId, model, sourceRef) {
24
24
  * ์‹ค์ธก(2026-08-18): ํ˜„์žฅ ๊ฐ’์„ ๊ทธ ํ˜„์žฅ์˜ ํŠธ์œˆ ์ „๋ถ€์— ์–น๋‹ค๊ฐ€ ํ•œ ํŠธ์œˆ์—์„œ ํˆฌ์˜์ด ํ„ฐ์กŒ๋‹ค. ์˜ฌ๋ผ์˜จ ๊ฒƒ์€
25
25
  * `SQLITE_CONSTRAINT: UNIQUE constraint failed: twin_equipment...` ๋ฟ์ด๋ผ **๋ฌด์—‡์ด ์ž˜๋ชป๋๋Š”์ง€ ์•„๋ฌด๋„
26
26
  * ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค.** ์›์ธ์€ ๊ทธ ๋ชจ๋ธ์— ์„ค๋น„ `load-1` ์ด ๋‘ ๋ฒˆ ๋“ค์–ด ์žˆ๋˜ ๊ฒƒ์ด๋‹ค(id ๋Š” ํŠธ์œˆ ์•ˆ์—์„œ ์œ ์ผํ•ด์•ผ
27
- * ํ•œ๋‹ค). ์กฐ์šฉํžˆ ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ทธ๊ฒƒ์€ ๋ชจ๋ธ๋ง ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ถ”๋Š” ์ผ์ด๊ณ , ์–ด๋А ์ชฝ์ด ๋งž๋Š”์ง€ ์šฐ๋ฆฌ๋Š”
27
+ * ํ•œ๋‹ค). ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ทธ๊ฒƒ์€ ๋ชจ๋ธ๋ง ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ถ”๋Š” ์ผ์ด๊ณ , ์–ด๋А ์ชฝ์ด ๋งž๋Š”์ง€ ์šฐ๋ฆฌ๋Š”
28
28
  * ๋ชจ๋ฅธ๋‹ค.
29
29
  */
30
30
  const dupOf = (list, what) => {
@@ -39,7 +39,7 @@ async function projectStructure(domainId, instanceId, model, sourceRef) {
39
39
  }
40
40
  return undefined;
41
41
  };
42
- const dupMsg = dupOf(model?.locations, 'locations') ?? dupOf((0, twin_kernel_1.readBoardEquipment)(model), 'equipment');
42
+ const dupMsg = dupOf(model?.locations, 'locations') ?? dupOf((0, ops_contract_1.readBoardEquipment)(model), 'equipment');
43
43
  if (dupMsg)
44
44
  throw new Error(dupMsg);
45
45
  const locRepo = (0, shell_1.getRepository)(twin_location_js_1.TwinLocation);
@@ -92,7 +92,7 @@ async function projectStructure(domainId, instanceId, model, sourceRef) {
92
92
  parallelism: l.parallelism ?? null,
93
93
  area: area ? { id: area.id } : null,
94
94
  gs1Id: l.gs1Id ?? null,
95
- /* ์ž๋ฆฌ์˜ ์†์„ฑ๋„ ์˜ฎ๊ธด๋‹ค โ€” ์˜ฎ๊ธฐ์ง€ ์•Š์œผ๋ฉด ๊ณ„์•ฝ์ „๋ ฅยท์š”๊ธˆ์ด ํ•ญ๋ชฉ ํŒจ๋„์—์„œ ์‚ฌ๋ผ์ง„๋‹ค(์กฐ์šฉํ•œ ๋ˆ„๋ฝ). */
95
+ /* ์ž๋ฆฌ์˜ ์†์„ฑ๋„ ์˜ฎ๊ธด๋‹ค โ€” ์˜ฎ๊ธฐ์ง€ ์•Š์œผ๋ฉด ๊ณ„์•ฝ์ „๋ ฅยท์š”๊ธˆ์ด ํ•ญ๋ชฉ ํŒจ๋„์—์„œ ์‚ฌ๋ผ์ง„๋‹ค(๋“ค์–ด์˜จ ๊ฒƒ์ด ์—†๋Š” ๋ˆ„๋ฝ). */
96
96
  properties: l.properties ?? null,
97
97
  sourceRef,
98
98
  ingestedAt
@@ -124,7 +124,8 @@ async function projectStructure(domainId, instanceId, model, sourceRef) {
124
124
  homeLocation: home ? { id: home.id } : null,
125
125
  mtbfMs: m.mtbfMs ?? null,
126
126
  mttrMs: m.mttrMs ?? null,
127
- gs1Id: m.gs1Id ?? null,
127
+ /* ์„ ์–ธ๋œ ์ •์ฒด์„ฑ โ€” ์˜ˆ์ „์—๋Š” ์„ ์–ธ์— ์—†๋Š” `gs1Id` ๋ฅผ ์ฝ์–ด ์ด ์นธ์ด ๋Š˜ ๋น„์–ด ์žˆ์—ˆ๋‹ค. */
128
+ identity: m.identity ?? null,
128
129
  sourceRef,
129
130
  ingestedAt
130
131
  });
@@ -147,7 +148,7 @@ async function projectStructure(domainId, instanceId, model, sourceRef) {
147
148
  intent: o.intent ?? null,
148
149
  locationType: o.locationType ?? null,
149
150
  resourceType: o.resourceType ?? null,
150
- /* ์†Œ์š”์‹œ๊ฐ„์€ ISO 8601 ๋ฌธ์ž์—ด์ด ์ •๋ณธ โ€” ๋ถ„์œผ๋กœ ์ ‘์œผ๋ฉด ์ดˆ๊ฐ€ ์กฐ์šฉํžˆ ์‚ฌ๋ผ์ง„๋‹ค. */
151
+ /* ์†Œ์š”์‹œ๊ฐ„์€ ISO 8601 ๋ฌธ์ž์—ด์ด ์ •๋ณธ โ€” ๋ถ„์œผ๋กœ ์ค„์ด๋ฉด ์ดˆ๊ฐ€ ์˜ค๋ฅ˜ ์—†์ด ์‚ฌ๋ผ์ง„๋‹ค. */
151
152
  duration: o.duration ?? null,
152
153
  variability: o.variability ?? null,
153
154
  parameters: o.parameters ?? null,
@@ -1 +1 @@
1
- {"version":3,"file":"project-structure.js","sourceRoot":"","sources":["../../../server/service/twin-model/project-structure.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\n\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\nimport { TwinLocation } from './twin-location.js'\nimport { TwinEquipment } from './twin-equipment.js'\nimport { TwinOperation } from './twin-operation.js'\nimport { readBoardEquipment } from '@operato/twin-kernel'\n\n/*\n * ๊ตฌ์กฐ ํˆฌ์˜ โ€” `model`(์ปค๋„ ์ž…๋ ฅ ๋ฌธ์„œ) โ†’ **ํ‘œ์ค€ ์—”ํ‹ฐํ‹ฐ ํ–‰**(ADR-0032).\n *\n * โ”€โ”€ ์™œ ์ „๋Ÿ‰ ๊ต์ฒด์ธ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ด ํ–‰๋“ค์€ **์›๋ณธ์—์„œ ์˜จ ์บ์‹œ**๋‹ค(ADR-0032-D). ์›๋ณธ์ด ์ง„์‹ค์ด๋ฏ€๋กœ diff ๋กœ ์•„๋ผ๋Š” ๊ฒƒ๋ณด๋‹ค\n * **๋งค๋ฒˆ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ**์ด ๋งž๋‹ค โ€” diff ๋Š” \"์šฐ๋ฆฌ ์ชฝ์— ๋‚จ๊ฒจ์•ผ ํ•  ๊ฒƒ์ด ์žˆ๋‹ค\" ๋Š” ์ „์ œ๋ฅผ\n * ๊น”๊ณ , ๊ทธ ์ „์ œ๊ฐ€ ์†Œ์œ  ์นจ๋ฒ”์˜ ์‹œ์ž‘์ด๋‹ค.\n *\n * ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์„œ๋ช…(`TwinStructure.signature`)์ด ๊ฐ™์„ ๋•Œ ๊ฑด๋„ˆ๋›ฐ๋Š” ์žฅ์น˜๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฏ€๋กœ\n * ๊ทธ๊ฒƒ์„ ์•ž์— ๋‘”๋‹ค. ์—ฌ๊ธฐ์„œ diff ๋ฅผ ๋ฐœ๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค.\n *\n * โ”€โ”€ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์„ค๋น„๊ฐ€ ์ž๋ฆฌ๋ฅผ FK ๋กœ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ **์ž๋ฆฌ๋ฅผ ๋จผ์ €** ๋„ฃ๋Š”๋‹ค. ์ง€์šฐ๋Š” ๊ฒƒ์€ ๋ฐ˜๋Œ€ ์ˆœ์„œ๋‹ค.\n * (์ž๋ฆฌ ์‚ญ์ œ ์‹œ ์„ค๋น„์˜ `homeLocation` ์€ `SET NULL` ์ด์ง€๋งŒ, ์ „๋Ÿ‰ ๊ต์ฒด์—์„œ๋Š” ๋‘˜ ๋‹ค ์ง€์šด๋‹ค.)\n */\nexport interface ProjectionReport {\n locations: number\n equipment: number\n operations: number\n /** ์ž๋ฆฌ๋ฅผ ๋ชป ์ฐพ์•„ ๊ธฐ์ค€ ์ž๋ฆฌ๋ฅผ ๋น„์šด ์„ค๋น„ โ€” **์กฐ์šฉํžˆ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.** */\n unresolvedHome: string[]\n /** ๊ตฌ์—ญ์„ ๋ชป ์ฐพ์•„ ๋น„์šด ์ž๋ฆฌ. ๊ตฌ์—ญ์€ model ๋ฐ–(ํ˜ธ์ŠคํŠธ ๊ฐœ๋…)์ด๋ผ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋‹ค. */\n unresolvedArea: string[]\n}\n\n/**\n * ์ด ํŠธ์œˆ์˜ ๊ตฌ์กฐ ํ–‰์„ **์›๋ณธ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.**\n *\n * `sourceRef` ๋Š” ์–ด๋А ์›๋ณธ์—์„œ ์™”๋Š”์ง€๋‹ค(`ReferenceMaster.source` = instanceId). ์—†๋Š” ํ–‰์€\n * ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค โ€” ์บ์‹œ๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ตฌ์กฐ๋กœ ์ง€ํ‚จ๋‹ค.\n */\nexport async function projectStructure(domainId: string, instanceId: string, model: any, sourceRef: string): Promise<ProjectionReport> {\n const instance = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!instance) throw new Error(`cannot project structure: twin instance \"${instanceId}\" is not registered`)\n\n /*\n * **๊ฐ™์€ id ๊ฐ€ ๋‘˜์ด๋ฉด ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค** โ€” ์ œ์•ฝ ์œ„๋ฐ˜ ๋ฌธ๊ตฌ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.\n *\n * ์‹ค์ธก(2026-08-18): ํ˜„์žฅ ๊ฐ’์„ ๊ทธ ํ˜„์žฅ์˜ ํŠธ์œˆ ์ „๋ถ€์— ์–น๋‹ค๊ฐ€ ํ•œ ํŠธ์œˆ์—์„œ ํˆฌ์˜์ด ํ„ฐ์กŒ๋‹ค. ์˜ฌ๋ผ์˜จ ๊ฒƒ์€\n * `SQLITE_CONSTRAINT: UNIQUE constraint failed: twin_equipment...` ๋ฟ์ด๋ผ **๋ฌด์—‡์ด ์ž˜๋ชป๋๋Š”์ง€ ์•„๋ฌด๋„\n * ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค.** ์›์ธ์€ ๊ทธ ๋ชจ๋ธ์— ์„ค๋น„ `load-1` ์ด ๋‘ ๋ฒˆ ๋“ค์–ด ์žˆ๋˜ ๊ฒƒ์ด๋‹ค(id ๋Š” ํŠธ์œˆ ์•ˆ์—์„œ ์œ ์ผํ•ด์•ผ\n * ํ•œ๋‹ค). ์กฐ์šฉํžˆ ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ทธ๊ฒƒ์€ ๋ชจ๋ธ๋ง ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ถ”๋Š” ์ผ์ด๊ณ , ์–ด๋А ์ชฝ์ด ๋งž๋Š”์ง€ ์šฐ๋ฆฌ๋Š”\n * ๋ชจ๋ฅธ๋‹ค.\n */\n const dupOf = (list: any[] | undefined, what: string): string | undefined => {\n const seen = new Set<string>()\n for (const e of list ?? []) {\n const id = String(e?.id ?? '')\n if (!id) continue\n if (seen.has(id)) return `twin \"${instanceId}\" has two ${what} with id \"${id}\" โ€” ids must be unique within a twin, so the model cannot be projected`\n seen.add(id)\n }\n return undefined\n }\n const dupMsg = dupOf(model?.locations, 'locations') ?? dupOf(readBoardEquipment(model), 'equipment')\n if (dupMsg) throw new Error(dupMsg)\n\n const locRepo = getRepository(TwinLocation)\n const eqRepo = getRepository(TwinEquipment)\n const opRepo = getRepository(TwinOperation)\n const scope = { domain: { id: domainId } as any, instance: { id: instance.id } as any }\n const ingestedAt = new Date()\n\n /*\n * ์ „๋Ÿ‰ ๊ต์ฒด โ€” ์ด ํ–‰๋“ค์€ **์›๋ณธ์—์„œ ์˜จ ์บ์‹œ**์ด๋ฏ€๋กœ ๋งค๋ฒˆ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.\n * diff ๋กœ ์•„๋ผ๋Š” ๊ฒƒ์€ \"์šฐ๋ฆฌ ์ชฝ์— ๋‚จ๊ฒจ์•ผ ํ•  ๊ฒƒ์ด ์žˆ๋‹ค\" ๋Š” ์ „์ œ๋ฅผ ๊น”๊ณ , ๊ทธ ์ „์ œ๊ฐ€ ์†Œ์œ  ์นจ๋ฒ”์˜ ์‹œ์ž‘์ด๋‹ค.\n *\n * **๊ด€์ธก์œผ๋กœ ์ž๋ž€ ์ž์›์€ ์—ฌ๊ธฐ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.** ์ปค๋„์€ ๋งˆ์Šคํ„ฐ์— ์—†๋˜ ์„ค๋น„๋„ ์ด๋ฒคํŠธ๋กœ ์•Œ๊ฒŒ ๋˜์ง€๋งŒ\n * (`observed-reducer` ์˜ `origin: 'observed'`), ๊ทธ๊ฒƒ์„ ์ด ํ‘œ์— ๋ฐ€์–ด ๋„ฃ์œผ๋ฉด **์“ฐ๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ๋‘˜**์ด ๋˜๊ณ \n * ํ‹ฑ ๋ฃจํ”„์—์„œ DB ๋กœ ์“ฐ๋Š” ๊ธธ์ด ์ƒ๊ธด๋‹ค(ADR-0032-D ์œ„๋ฐ˜). ๊ทธ ์ฐจ์ด๋Š” **์กฐํšŒ ์‹œ์ ์— ๋น„๊ตํ•ด ๋ณด๊ณ **ํ•œ๋‹ค โ€”\n * ์ˆจ๊ฒจ์•ผ ํ•  ๋ถˆ์ผ์น˜๊ฐ€ ์•„๋‹ˆ๋ผ \"์›๋ณธ์ด ๋ชจ๋ฅด๋Š” ์„ค๋น„๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋‹ค\" ๋Š” ์‚ฌ์‹ค์ด๋‹ค.\n */\n await eqRepo.delete(scope)\n await opRepo.delete(scope)\n await locRepo.delete(scope)\n\n /* ๊ตฌ์—ญ์€ model ๋ฐ–์— ์‚ฐ๋‹ค(ํ˜ธ์ŠคํŠธ์˜ TwinArea). ์ด๋ฆ„์œผ๋กœ ์ฐพ์•„ FK ๋ฅผ ์ž‡๋Š”๋‹ค. */\n const areas = await getRepository(TwinArea).find({ where: { domain: { id: domainId } as any } })\n const areaOf = new Map(areas.map(a => [a.areaId, a]))\n const unresolvedArea: string[] = []\n\n /*\n * โ”€โ”€ ์ „๊ธฐ ์ƒ๋ฅ˜๋ฅผ ใ€Œ๊ตฌ์—ญใ€์œผ๋กœ ์ฝ์ง€ ์•Š๋Š”๋‹ค (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ์ž๋ฆฌ์˜ ๋ถ€๋ชจ๊ฐ€ **๋‹ค๋ฅธ ์ž๋ฆฌ**์ผ ์ˆ˜ ์žˆ๋‹ค(๋ถ„๊ธฐ์˜ ์ƒ๋ฅ˜๋Š” ์ˆ˜์ „์ด๋‹ค). ๊ทธ ๋ถ€๋ชจ๋ฅผ ๊ตฌ์—ญ ํ‘œ์—์„œ ์ฐพ์œผ๋ฉด ๋‹น์—ฐํžˆ\n * ์—†๊ณ , ์˜ˆ์ „์—๋Š” ๊ทธ๊ฒƒ์„ ๋งค๋ฒˆ ใ€Œ๊ตฌ์—ญ์ด ์ด ํŠธ์œˆ์— ์—†๋‹คใ€๋กœ ๊ฒฝ๊ณ ํ–ˆ๋‹ค โ€” ์—๋„ˆ์ง€ ํŠธ์œˆ์„ ์ธ์ œ์ŠคํŠธํ•  ๋•Œ๋งˆ๋‹ค\n * ๋ถ„๊ธฐ ์ˆ˜๋งŒํผ ๊ฑฐ์ง“ ๊ฒฝ๋ณด๊ฐ€ ๋‚ฌ๋‹ค. ๊ฒฝ๋ณด๊ฐ€ ์†Œ์Œ์ด ๋˜๋ฉด **์‚ฌ๋žŒ์ด ๊ฒฝ๋ณด ์ž์ฒด๋ฅผ ์ฝ์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.**\n *\n * ์ž๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ถ€๋ชจ๋Š” ๊ณ„์ธต(์ž๋ฆฌ โŠƒ ์ž๋ฆฌ)์ด๊ณ , ๊ตฌ์—ญ์€ model ๋ฐ–์˜ ๋‹ค๋ฅธ ํ‘œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ถ€๋ชจ๊ฐ€ ์ด ๋ชจ๋ธ์˜\n * ์ž๋ฆฌ์ด๋ฉด ๊ตฌ์—ญ ํ•ด์„์„ **์‹œ๋„ํ•˜์ง€ ์•Š๋Š”๋‹ค**(์—†๋Š” ๊ฒƒ์„ ๋ชป ์ฐพ์•˜๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š๋Š”๋‹ค).\n */\n const locationIds = new Set((model?.locations ?? []).filter((l: any) => l?.id).map((l: any) => String(l.id)))\n\n const locations: TwinLocation[] = (model?.locations ?? [])\n .filter((l: any) => l?.id)\n .map((l: any) => {\n const parentIsLocation = l.parentId ? locationIds.has(String(l.parentId)) : false\n const area = l.parentId && !parentIsLocation ? areaOf.get(l.parentId) : undefined\n if (l.parentId && !parentIsLocation && !area) unresolvedArea.push(`${l.id}โ†’${l.parentId}`)\n return locRepo.create({\n ...scope,\n locationId: l.id,\n /* **์ด๋ฆ„์„ ์˜ฎ๊ธด๋‹ค.** ๋ฒ„๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค โ€” ๊ทธ๋ž˜์„œ ํ™”๋ฉด์— ์ž๋ฆฌ id ๋งŒ ๋‚จ์•˜๋‹ค(ยงname ์ฃผ์„ ์ฐธ์กฐ). */\n name: l.name ?? null,\n description: l.description ?? null,\n type: l.type,\n capacity: l.capacity ?? null,\n parallelism: l.parallelism ?? null,\n area: area ? ({ id: area.id } as any) : null,\n gs1Id: l.gs1Id ?? null,\n /* ์ž๋ฆฌ์˜ ์†์„ฑ๋„ ์˜ฎ๊ธด๋‹ค โ€” ์˜ฎ๊ธฐ์ง€ ์•Š์œผ๋ฉด ๊ณ„์•ฝ์ „๋ ฅยท์š”๊ธˆ์ด ํ•ญ๋ชฉ ํŒจ๋„์—์„œ ์‚ฌ๋ผ์ง„๋‹ค(์กฐ์šฉํ•œ ๋ˆ„๋ฝ). */\n properties: l.properties ?? null,\n sourceRef,\n ingestedAt\n } as any)\n })\n const savedLocations = locations.length ? await locRepo.save(locations, { chunk: 500 }) : []\n const locOf = new Map(savedLocations.map(l => [l.locationId, l]))\n\n const unresolvedHome: string[] = []\n const equipment: TwinEquipment[] = (model?.equipment ?? [])\n .filter((m: any) => m?.id)\n .map((m: any) => {\n const home = m.homeLocation ? locOf.get(m.homeLocation) : undefined\n /* ๋Š์–ด์ง„ ๊ธฐ์ค€ ์ž๋ฆฌ๋Š” **์ด๋ฆ„์„ ๋Œ€๊ณ ** ๋ณด๊ณ ํ•œ๋‹ค. ์˜ˆ์ „์—๋Š” ํ™”๋ฉด์ด ๊ฒฝ๊ณ ํ•  ๋ฟ์ด์—ˆ๊ณ \n ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋Š” ์•„๋ฌด๋„ ์•ˆ ๋ดค๋‹ค. */\n if (m.homeLocation && !home) unresolvedHome.push(`${m.id}โ†’${m.homeLocation}`)\n return eqRepo.create({\n ...scope,\n equipmentId: m.id,\n name: m.name ?? null,\n description: m.description ?? null,\n kind: m.kind,\n /* ์†์„ฑ๋„ ์˜ฎ๊ธด๋‹ค โ€” ํ–‰์— ์ž๋ฆฌ๊ฐ€ ์—†์–ด ํ˜๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค(์†Œ๋น„์ฒ˜๊ฐ€ ์‹ค์ œ๋กœ ์ฝ๋Š” ์‚ฌ์‹ค์ด๋‹ค: ์ฃผํ–‰ ์†๋„). */\n properties: m.properties ?? null,\n /* ์‹œํ—˜ ์ฐธ์กฐ๋„ ํ•จ๊ป˜ โ€” ํ˜๋ฆฌ๋ฉด ๋ช…์„ธ ์ชฝ์—์„œ \"๋ˆ„๊ฐ€ ๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋‚˜\" ์— ์ด ์„ค๋น„๊ฐ€ ๋น ์ง„๋‹ค. */\n testSpecificationIds: m.testSpecificationIds ?? null,\n /* ๊ฒฐ๊ณผ๊นŒ์ง€ โ€” ์ฐธ์กฐ๋งŒ ์žˆ์œผ๋ฉด \"๋ฌด์—‡์œผ๋กœ ๊ฒ€์ฆํ•œ๋‹ค\" ๊นŒ์ง€๊ณ , ์ž๊ฒฉ ์„ฑ๋ฆฝ์€ ๊ฒฐ๊ณผ๊ฐ€ ๋งํ•œ๋‹ค. */\n testResults: m.testResults ?? null,\n homeLocation: home ? ({ id: home.id } as any) : null,\n mtbfMs: m.mtbfMs ?? null,\n mttrMs: m.mttrMs ?? null,\n gs1Id: m.gs1Id ?? null,\n sourceRef,\n ingestedAt\n } as any)\n })\n if (equipment.length) await eqRepo.save(equipment, { chunk: 500 })\n\n const operations: TwinOperation[] = (model?.operations ?? [])\n .filter((o: any) => o?.key)\n .map((o: any, i: number) =>\n opRepo.create({\n ...scope,\n operationKey: o.key,\n /*\n * ๊ณต์ •์€ ๋งˆ์Šคํ„ฐ๊ฐ€ `label` ๋กœ ๋งํ•œ๋‹ค โ€” ํ–‰์—์„œ๋Š” **๊ทœ์•ฝ์˜ ์ด๋ฆ„ ํ•˜๋‚˜๋งŒ** ๋‘”๋‹ค.\n *\n * ํ•œ๋™์•ˆ `label` ์ปฌ๋Ÿผ๋„ ํ•จ๊ป˜ ๋‚จ๊ฒจ ๋’€๋”๋‹ˆ ์กฐํšŒ ํ™”๋ฉด์— \"์ด๋ฆ„\" ์—ด์ด **๋‘ ๊ฐœ** ๋–ด๋‹ค(๊ฐ™์€ ๊ฐ’์ด\n * ๋‘ ๋ฒˆ). ์–ดํœ˜๋ฅผ ํ•˜๋‚˜๋กœ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด์„œ ๋‘˜์„ ๋‚จ๊ธฐ๋ฉด ๋ฐ˜๋“œ์‹œ ์ด๋ ‡๊ฒŒ ์ƒˆ์–ด ๋‚˜์˜จ๋‹ค.\n */\n name: o.name ?? o.label ?? null,\n description: o.description ?? null,\n intent: o.intent ?? null,\n locationType: o.locationType ?? null,\n resourceType: o.resourceType ?? null,\n /* ์†Œ์š”์‹œ๊ฐ„์€ ISO 8601 ๋ฌธ์ž์—ด์ด ์ •๋ณธ โ€” ๋ถ„์œผ๋กœ ์ ‘์œผ๋ฉด ์ดˆ๊ฐ€ ์กฐ์šฉํžˆ ์‚ฌ๋ผ์ง„๋‹ค. */\n duration: o.duration ?? null,\n variability: o.variability ?? null,\n parameters: o.parameters ?? null,\n /* **๋„ค ์ž์› ๋ช…์„ธ๋ฅผ ํ•จ๊ป˜ ์˜ฎ๊ธด๋‹ค.** ์…‹์ด ๋น ์ ธ ์žˆ์–ด์„œ ์กฐํšŒ ํ™”๋ฉด์ด \"์›๋ณธ์ด ๋งํ•œ ๊ฐ’\" ์ด๋ผ ์ ๊ณ ๋„\n ๋„ท ์ค‘ ํ•˜๋‚˜๋งŒ ๋ณด์˜€๋‹ค โ€” ์‚ฌ๋žŒ์ด ํ•„์š”ํ•œ ๊ณต์ •์„ ๋ณด๊ณ  ์‚ฌ๋žŒ์ด ํ•„์š” ์—†๋‹ค๊ณ  ๊ฒฐ๋ก  ๋‚ด๊ฒŒ ๋œ๋‹ค. */\n personnelSpecification: o.personnelSpecification ?? null,\n physicalAssetSpecification: o.physicalAssetSpecification ?? null,\n materialSpecification: o.materialSpecification ?? null,\n seq: i,\n sourceRef,\n ingestedAt\n } as any)\n )\n if (operations.length) await opRepo.save(operations, { chunk: 500 })\n\n return {\n locations: savedLocations.length,\n equipment: equipment.length,\n operations: operations.length,\n unresolvedHome,\n unresolvedArea\n }\n}\n"]}
1
+ {"version":3,"file":"project-structure.js","sourceRoot":"","sources":["../../../server/service/twin-model/project-structure.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\n\nimport { TwinInstance } from '../twin-instance/twin-instance.js'\nimport { TwinArea } from '../twin-space/twin-area.js'\nimport { TwinLocation } from './twin-location.js'\nimport { TwinEquipment } from './twin-equipment.js'\nimport { TwinOperation } from './twin-operation.js'\nimport { readBoardEquipment } from '@operato/ops-contract'\n\n/*\n * ๊ตฌ์กฐ ํˆฌ์˜ โ€” `model`(์ปค๋„ ์ž…๋ ฅ ๋ฌธ์„œ) โ†’ **ํ‘œ์ค€ ์—”ํ‹ฐํ‹ฐ ํ–‰**(ADR-0032).\n *\n * โ”€โ”€ ์™œ ์ „๋Ÿ‰ ๊ต์ฒด์ธ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ด ํ–‰๋“ค์€ **์›๋ณธ์—์„œ ์˜จ ์บ์‹œ**๋‹ค(ADR-0032-D). ์›๋ณธ์ด ์ง„์‹ค์ด๋ฏ€๋กœ diff ๋กœ ์•„๋ผ๋Š” ๊ฒƒ๋ณด๋‹ค\n * **๋งค๋ฒˆ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ**์ด ๋งž๋‹ค โ€” diff ๋Š” \"์šฐ๋ฆฌ ์ชฝ์— ๋‚จ๊ฒจ์•ผ ํ•  ๊ฒƒ์ด ์žˆ๋‹ค\" ๋Š” ์ „์ œ๋ฅผ\n * ๊น”๊ณ , ๊ทธ ์ „์ œ๊ฐ€ ์†Œ์œ  ์นจ๋ฒ”์˜ ์‹œ์ž‘์ด๋‹ค.\n *\n * ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์„œ๋ช…(`TwinStructure.signature`)์ด ๊ฐ™์„ ๋•Œ ๊ฑด๋„ˆ๋›ฐ๋Š” ์žฅ์น˜๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฏ€๋กœ\n * ๊ทธ๊ฒƒ์„ ์•ž์— ๋‘”๋‹ค. ์—ฌ๊ธฐ์„œ diff ๋ฅผ ๋ฐœ๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค.\n *\n * โ”€โ”€ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์„ค๋น„๊ฐ€ ์ž๋ฆฌ๋ฅผ FK ๋กœ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ **์ž๋ฆฌ๋ฅผ ๋จผ์ €** ๋„ฃ๋Š”๋‹ค. ์ง€์šฐ๋Š” ๊ฒƒ์€ ๋ฐ˜๋Œ€ ์ˆœ์„œ๋‹ค.\n * (์ž๋ฆฌ ์‚ญ์ œ ์‹œ ์„ค๋น„์˜ `homeLocation` ์€ `SET NULL` ์ด์ง€๋งŒ, ์ „๋Ÿ‰ ๊ต์ฒด์—์„œ๋Š” ๋‘˜ ๋‹ค ์ง€์šด๋‹ค.)\n */\nexport interface ProjectionReport {\n locations: number\n equipment: number\n operations: number\n /** ์ž๋ฆฌ๋ฅผ ๋ชป ์ฐพ์•„ ๊ธฐ์ค€ ์ž๋ฆฌ๋ฅผ ๋น„์šด ์„ค๋น„ โ€” **์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.** */\n unresolvedHome: string[]\n /** ๊ตฌ์—ญ์„ ๋ชป ์ฐพ์•„ ๋น„์šด ์ž๋ฆฌ. ๊ตฌ์—ญ์€ model ๋ฐ–(ํ˜ธ์ŠคํŠธ ๊ฐœ๋…)์ด๋ผ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋‹ค. */\n unresolvedArea: string[]\n}\n\n/**\n * ์ด ํŠธ์œˆ์˜ ๊ตฌ์กฐ ํ–‰์„ **์›๋ณธ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.**\n *\n * `sourceRef` ๋Š” ์–ด๋А ์›๋ณธ์—์„œ ์™”๋Š”์ง€๋‹ค(`ReferenceMaster.source` = instanceId). ์—†๋Š” ํ–‰์€\n * ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค โ€” ์บ์‹œ๋ผ๋Š” ์‚ฌ์‹ค์„ ๊ตฌ์กฐ๋กœ ์ง€ํ‚จ๋‹ค.\n */\nexport async function projectStructure(domainId: string, instanceId: string, model: any, sourceRef: string): Promise<ProjectionReport> {\n const instance = await getRepository(TwinInstance).findOne({ where: { domain: { id: domainId }, instanceId } })\n if (!instance) throw new Error(`cannot project structure: twin instance \"${instanceId}\" is not registered`)\n\n /*\n * **๊ฐ™์€ id ๊ฐ€ ๋‘˜์ด๋ฉด ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค** โ€” ์ œ์•ฝ ์œ„๋ฐ˜ ๋ฌธ๊ตฌ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.\n *\n * ์‹ค์ธก(2026-08-18): ํ˜„์žฅ ๊ฐ’์„ ๊ทธ ํ˜„์žฅ์˜ ํŠธ์œˆ ์ „๋ถ€์— ์–น๋‹ค๊ฐ€ ํ•œ ํŠธ์œˆ์—์„œ ํˆฌ์˜์ด ํ„ฐ์กŒ๋‹ค. ์˜ฌ๋ผ์˜จ ๊ฒƒ์€\n * `SQLITE_CONSTRAINT: UNIQUE constraint failed: twin_equipment...` ๋ฟ์ด๋ผ **๋ฌด์—‡์ด ์ž˜๋ชป๋๋Š”์ง€ ์•„๋ฌด๋„\n * ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค.** ์›์ธ์€ ๊ทธ ๋ชจ๋ธ์— ์„ค๋น„ `load-1` ์ด ๋‘ ๋ฒˆ ๋“ค์–ด ์žˆ๋˜ ๊ฒƒ์ด๋‹ค(id ๋Š” ํŠธ์œˆ ์•ˆ์—์„œ ์œ ์ผํ•ด์•ผ\n * ํ•œ๋‹ค). ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ํ•˜๋‚˜๋งŒ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ทธ๊ฒƒ์€ ๋ชจ๋ธ๋ง ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ถ”๋Š” ์ผ์ด๊ณ , ์–ด๋А ์ชฝ์ด ๋งž๋Š”์ง€ ์šฐ๋ฆฌ๋Š”\n * ๋ชจ๋ฅธ๋‹ค.\n */\n const dupOf = (list: any[] | undefined, what: string): string | undefined => {\n const seen = new Set<string>()\n for (const e of list ?? []) {\n const id = String(e?.id ?? '')\n if (!id) continue\n if (seen.has(id)) return `twin \"${instanceId}\" has two ${what} with id \"${id}\" โ€” ids must be unique within a twin, so the model cannot be projected`\n seen.add(id)\n }\n return undefined\n }\n const dupMsg = dupOf(model?.locations, 'locations') ?? dupOf(readBoardEquipment(model), 'equipment')\n if (dupMsg) throw new Error(dupMsg)\n\n const locRepo = getRepository(TwinLocation)\n const eqRepo = getRepository(TwinEquipment)\n const opRepo = getRepository(TwinOperation)\n const scope = { domain: { id: domainId } as any, instance: { id: instance.id } as any }\n const ingestedAt = new Date()\n\n /*\n * ์ „๋Ÿ‰ ๊ต์ฒด โ€” ์ด ํ–‰๋“ค์€ **์›๋ณธ์—์„œ ์˜จ ์บ์‹œ**์ด๋ฏ€๋กœ ๋งค๋ฒˆ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.\n * diff ๋กœ ์•„๋ผ๋Š” ๊ฒƒ์€ \"์šฐ๋ฆฌ ์ชฝ์— ๋‚จ๊ฒจ์•ผ ํ•  ๊ฒƒ์ด ์žˆ๋‹ค\" ๋Š” ์ „์ œ๋ฅผ ๊น”๊ณ , ๊ทธ ์ „์ œ๊ฐ€ ์†Œ์œ  ์นจ๋ฒ”์˜ ์‹œ์ž‘์ด๋‹ค.\n *\n * **๊ด€์ธก์œผ๋กœ ์ž๋ž€ ์ž์›์€ ์—ฌ๊ธฐ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.** ์ปค๋„์€ ๋งˆ์Šคํ„ฐ์— ์—†๋˜ ์„ค๋น„๋„ ์ด๋ฒคํŠธ๋กœ ์•Œ๊ฒŒ ๋˜์ง€๋งŒ\n * (`observed-reducer` ์˜ `origin: 'observed'`), ๊ทธ๊ฒƒ์„ ์ด ํ‘œ์— ๋ฐ€์–ด ๋„ฃ์œผ๋ฉด **์“ฐ๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ๋‘˜**์ด ๋˜๊ณ \n * ํ‹ฑ ๋ฃจํ”„์—์„œ DB ๋กœ ์“ฐ๋Š” ๊ธธ์ด ์ƒ๊ธด๋‹ค(ADR-0032-D ์œ„๋ฐ˜). ๊ทธ ์ฐจ์ด๋Š” **์กฐํšŒ ์‹œ์ ์— ๋น„๊ตํ•ด ๋ณด๊ณ **ํ•œ๋‹ค โ€”\n * ์ˆจ๊ฒจ์•ผ ํ•  ๋ถˆ์ผ์น˜๊ฐ€ ์•„๋‹ˆ๋ผ \"์›๋ณธ์ด ๋ชจ๋ฅด๋Š” ์„ค๋น„๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋‹ค\" ๋Š” ์‚ฌ์‹ค์ด๋‹ค.\n */\n await eqRepo.delete(scope)\n await opRepo.delete(scope)\n await locRepo.delete(scope)\n\n /* ๊ตฌ์—ญ์€ model ๋ฐ–์— ์‚ฐ๋‹ค(ํ˜ธ์ŠคํŠธ์˜ TwinArea). ์ด๋ฆ„์œผ๋กœ ์ฐพ์•„ FK ๋ฅผ ์ž‡๋Š”๋‹ค. */\n const areas = await getRepository(TwinArea).find({ where: { domain: { id: domainId } as any } })\n const areaOf = new Map(areas.map(a => [a.areaId, a]))\n const unresolvedArea: string[] = []\n\n /*\n * โ”€โ”€ ์ „๊ธฐ ์ƒ๋ฅ˜๋ฅผ ใ€Œ๊ตฌ์—ญใ€์œผ๋กœ ์ฝ์ง€ ์•Š๋Š”๋‹ค (2026-08-18) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n *\n * ์ž๋ฆฌ์˜ ๋ถ€๋ชจ๊ฐ€ **๋‹ค๋ฅธ ์ž๋ฆฌ**์ผ ์ˆ˜ ์žˆ๋‹ค(๋ถ„๊ธฐ์˜ ์ƒ๋ฅ˜๋Š” ์ˆ˜์ „์ด๋‹ค). ๊ทธ ๋ถ€๋ชจ๋ฅผ ๊ตฌ์—ญ ํ‘œ์—์„œ ์ฐพ์œผ๋ฉด ๋‹น์—ฐํžˆ\n * ์—†๊ณ , ์˜ˆ์ „์—๋Š” ๊ทธ๊ฒƒ์„ ๋งค๋ฒˆ ใ€Œ๊ตฌ์—ญ์ด ์ด ํŠธ์œˆ์— ์—†๋‹คใ€๋กœ ๊ฒฝ๊ณ ํ–ˆ๋‹ค โ€” ์—๋„ˆ์ง€ ํŠธ์œˆ์„ ์ธ์ œ์ŠคํŠธํ•  ๋•Œ๋งˆ๋‹ค\n * ๋ถ„๊ธฐ ์ˆ˜๋งŒํผ ๊ฑฐ์ง“ ๊ฒฝ๋ณด๊ฐ€ ๋‚ฌ๋‹ค. ๊ฒฝ๋ณด๊ฐ€ ์†Œ์Œ์ด ๋˜๋ฉด **์‚ฌ๋žŒ์ด ๊ฒฝ๋ณด ์ž์ฒด๋ฅผ ์ฝ์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.**\n *\n * ์ž๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ถ€๋ชจ๋Š” ๊ณ„์ธต(์ž๋ฆฌ โŠƒ ์ž๋ฆฌ)์ด๊ณ , ๊ตฌ์—ญ์€ model ๋ฐ–์˜ ๋‹ค๋ฅธ ํ‘œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ถ€๋ชจ๊ฐ€ ์ด ๋ชจ๋ธ์˜\n * ์ž๋ฆฌ์ด๋ฉด ๊ตฌ์—ญ ํ•ด์„์„ **์‹œ๋„ํ•˜์ง€ ์•Š๋Š”๋‹ค**(์—†๋Š” ๊ฒƒ์„ ๋ชป ์ฐพ์•˜๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š๋Š”๋‹ค).\n */\n const locationIds = new Set((model?.locations ?? []).filter((l: any) => l?.id).map((l: any) => String(l.id)))\n\n const locations: TwinLocation[] = (model?.locations ?? [])\n .filter((l: any) => l?.id)\n .map((l: any) => {\n const parentIsLocation = l.parentId ? locationIds.has(String(l.parentId)) : false\n const area = l.parentId && !parentIsLocation ? areaOf.get(l.parentId) : undefined\n if (l.parentId && !parentIsLocation && !area) unresolvedArea.push(`${l.id}โ†’${l.parentId}`)\n return locRepo.create({\n ...scope,\n locationId: l.id,\n /* **์ด๋ฆ„์„ ์˜ฎ๊ธด๋‹ค.** ๋ฒ„๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค โ€” ๊ทธ๋ž˜์„œ ํ™”๋ฉด์— ์ž๋ฆฌ id ๋งŒ ๋‚จ์•˜๋‹ค(ยงname ์ฃผ์„ ์ฐธ์กฐ). */\n name: l.name ?? null,\n description: l.description ?? null,\n type: l.type,\n capacity: l.capacity ?? null,\n parallelism: l.parallelism ?? null,\n area: area ? ({ id: area.id } as any) : null,\n gs1Id: l.gs1Id ?? null,\n /* ์ž๋ฆฌ์˜ ์†์„ฑ๋„ ์˜ฎ๊ธด๋‹ค โ€” ์˜ฎ๊ธฐ์ง€ ์•Š์œผ๋ฉด ๊ณ„์•ฝ์ „๋ ฅยท์š”๊ธˆ์ด ํ•ญ๋ชฉ ํŒจ๋„์—์„œ ์‚ฌ๋ผ์ง„๋‹ค(๋“ค์–ด์˜จ ๊ฒƒ์ด ์—†๋Š” ๋ˆ„๋ฝ). */\n properties: l.properties ?? null,\n sourceRef,\n ingestedAt\n } as any)\n })\n const savedLocations = locations.length ? await locRepo.save(locations, { chunk: 500 }) : []\n const locOf = new Map(savedLocations.map(l => [l.locationId, l]))\n\n const unresolvedHome: string[] = []\n const equipment: TwinEquipment[] = (model?.equipment ?? [])\n .filter((m: any) => m?.id)\n .map((m: any) => {\n const home = m.homeLocation ? locOf.get(m.homeLocation) : undefined\n /* ๋Š์–ด์ง„ ๊ธฐ์ค€ ์ž๋ฆฌ๋Š” **์ด๋ฆ„์„ ๋Œ€๊ณ ** ๋ณด๊ณ ํ•œ๋‹ค. ์˜ˆ์ „์—๋Š” ํ™”๋ฉด์ด ๊ฒฝ๊ณ ํ•  ๋ฟ์ด์—ˆ๊ณ \n ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋Š” ์•„๋ฌด๋„ ์•ˆ ๋ดค๋‹ค. */\n if (m.homeLocation && !home) unresolvedHome.push(`${m.id}โ†’${m.homeLocation}`)\n return eqRepo.create({\n ...scope,\n equipmentId: m.id,\n name: m.name ?? null,\n description: m.description ?? null,\n kind: m.kind,\n /* ์†์„ฑ๋„ ์˜ฎ๊ธด๋‹ค โ€” ํ–‰์— ์ž๋ฆฌ๊ฐ€ ์—†์–ด ํ˜๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค(์†Œ๋น„์ฒ˜๊ฐ€ ์‹ค์ œ๋กœ ์ฝ๋Š” ์‚ฌ์‹ค์ด๋‹ค: ์ฃผํ–‰ ์†๋„). */\n properties: m.properties ?? null,\n /* ์‹œํ—˜ ์ฐธ์กฐ๋„ ํ•จ๊ป˜ โ€” ํ˜๋ฆฌ๋ฉด ๋ช…์„ธ ์ชฝ์—์„œ \"๋ˆ„๊ฐ€ ๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋‚˜\" ์— ์ด ์„ค๋น„๊ฐ€ ๋น ์ง„๋‹ค. */\n testSpecificationIds: m.testSpecificationIds ?? null,\n /* ๊ฒฐ๊ณผ๊นŒ์ง€ โ€” ์ฐธ์กฐ๋งŒ ์žˆ์œผ๋ฉด \"๋ฌด์—‡์œผ๋กœ ๊ฒ€์ฆํ•œ๋‹ค\" ๊นŒ์ง€๊ณ , ์ž๊ฒฉ ์„ฑ๋ฆฝ์€ ๊ฒฐ๊ณผ๊ฐ€ ๋งํ•œ๋‹ค. */\n testResults: m.testResults ?? null,\n homeLocation: home ? ({ id: home.id } as any) : null,\n mtbfMs: m.mtbfMs ?? null,\n mttrMs: m.mttrMs ?? null,\n /* ์„ ์–ธ๋œ ์ •์ฒด์„ฑ โ€” ์˜ˆ์ „์—๋Š” ์„ ์–ธ์— ์—†๋Š” `gs1Id` ๋ฅผ ์ฝ์–ด ์ด ์นธ์ด ๋Š˜ ๋น„์–ด ์žˆ์—ˆ๋‹ค. */\n identity: (m as any).identity ?? null,\n sourceRef,\n ingestedAt\n } as any)\n })\n if (equipment.length) await eqRepo.save(equipment, { chunk: 500 })\n\n const operations: TwinOperation[] = (model?.operations ?? [])\n .filter((o: any) => o?.key)\n .map((o: any, i: number) =>\n opRepo.create({\n ...scope,\n operationKey: o.key,\n /*\n * ๊ณต์ •์€ ๋งˆ์Šคํ„ฐ๊ฐ€ `label` ๋กœ ๋งํ•œ๋‹ค โ€” ํ–‰์—์„œ๋Š” **๊ทœ์•ฝ์˜ ์ด๋ฆ„ ํ•˜๋‚˜๋งŒ** ๋‘”๋‹ค.\n *\n * ํ•œ๋™์•ˆ `label` ์ปฌ๋Ÿผ๋„ ํ•จ๊ป˜ ๋‚จ๊ฒจ ๋’€๋”๋‹ˆ ์กฐํšŒ ํ™”๋ฉด์— \"์ด๋ฆ„\" ์—ด์ด **๋‘ ๊ฐœ** ๋–ด๋‹ค(๊ฐ™์€ ๊ฐ’์ด\n * ๋‘ ๋ฒˆ). ์–ดํœ˜๋ฅผ ํ•˜๋‚˜๋กœ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด์„œ ๋‘˜์„ ๋‚จ๊ธฐ๋ฉด ๋ฐ˜๋“œ์‹œ ์ด๋ ‡๊ฒŒ ์ƒˆ์–ด ๋‚˜์˜จ๋‹ค.\n */\n name: o.name ?? o.label ?? null,\n description: o.description ?? null,\n intent: o.intent ?? null,\n locationType: o.locationType ?? null,\n resourceType: o.resourceType ?? null,\n /* ์†Œ์š”์‹œ๊ฐ„์€ ISO 8601 ๋ฌธ์ž์—ด์ด ์ •๋ณธ โ€” ๋ถ„์œผ๋กœ ์ค„์ด๋ฉด ์ดˆ๊ฐ€ ์˜ค๋ฅ˜ ์—†์ด ์‚ฌ๋ผ์ง„๋‹ค. */\n duration: o.duration ?? null,\n variability: o.variability ?? null,\n parameters: o.parameters ?? null,\n /* **๋„ค ์ž์› ๋ช…์„ธ๋ฅผ ํ•จ๊ป˜ ์˜ฎ๊ธด๋‹ค.** ์…‹์ด ๋น ์ ธ ์žˆ์–ด์„œ ์กฐํšŒ ํ™”๋ฉด์ด \"์›๋ณธ์ด ๋งํ•œ ๊ฐ’\" ์ด๋ผ ์ ๊ณ ๋„\n ๋„ท ์ค‘ ํ•˜๋‚˜๋งŒ ๋ณด์˜€๋‹ค โ€” ์‚ฌ๋žŒ์ด ํ•„์š”ํ•œ ๊ณต์ •์„ ๋ณด๊ณ  ์‚ฌ๋žŒ์ด ํ•„์š” ์—†๋‹ค๊ณ  ๊ฒฐ๋ก  ๋‚ด๊ฒŒ ๋œ๋‹ค. */\n personnelSpecification: o.personnelSpecification ?? null,\n physicalAssetSpecification: o.physicalAssetSpecification ?? null,\n materialSpecification: o.materialSpecification ?? null,\n seq: i,\n sourceRef,\n ingestedAt\n } as any)\n )\n if (operations.length) await opRepo.save(operations, { chunk: 500 })\n\n return {\n locations: savedLocations.length,\n equipment: equipment.length,\n operations: operations.length,\n unresolvedHome,\n unresolvedArea\n }\n}\n"]}
@@ -45,7 +45,7 @@ export declare class TwinEquipment {
45
45
  * ๊ทธ ์‹œํ—˜๋“ค์˜ **๊ฒฐ๊ณผ** โ€” ์ž๊ฒฉ์ด ์„ฑ๋ฆฝํ•˜๋Š”์ง€๋Š” ์ด๊ฒƒ์ด ๋งํ•œ๋‹ค.
46
46
  *
47
47
  * ์ฐธ์กฐ๋งŒ ์žˆ์œผ๋ฉด "๋ฌด์—‡์œผ๋กœ ๊ฒ€์ฆํ•œ๋‹ค" ๊นŒ์ง€๋‹ค. ์˜ค๋Š˜ ์ด ์ €์žฅ์†Œ์—์„œ ๋„ค ๋ฒˆ ๋‚˜์˜จ ๊ฒฐ์†๊ณผ ๊ฐ™์€ ๋ถ€๋ฅ˜์ด๋ฏ€๋กœ
48
- * ํ–‰์— ์ž๋ฆฌ๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ ๋‹ค โ€” ๋ชจ๋ธ์—๋Š” ์žˆ๋Š”๋ฐ ํ–‰์— ์—†์œผ๋ฉด ํ™”๋ฉด์ด ์กฐ์šฉํžˆ ์žƒ๋Š”๋‹ค.
48
+ * ํ–‰์— ์ž๋ฆฌ๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ ๋‹ค โ€” ๋ชจ๋ธ์—๋Š” ์žˆ๋Š”๋ฐ ํ–‰์— ์—†์œผ๋ฉด ํ™”๋ฉด์ด ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ์žƒ๋Š”๋‹ค.
49
49
  */
50
50
  testResults?: any;
51
51
  /**
@@ -56,7 +56,7 @@ export declare class TwinEquipment {
56
56
  homeLocationRowId?: string;
57
57
  mtbfMs?: number;
58
58
  mttrMs?: number;
59
- gs1Id?: string;
59
+ identity?: string;
60
60
  sourceRef: string;
61
61
  ingestedAt: Date;
62
62
  createdAt?: Date;
@@ -15,7 +15,7 @@ const twin_location_js_1 = require("./twin-location.js");
15
15
  *
16
16
  * โ”€โ”€ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋ช…์‹œํ•œ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
17
17
  * `equipment` ๋Š” ์˜์–ด์—์„œ **๋ถˆ๊ฐ€์‚ฐ**์ด๋ผ ์ž๋™ ๋ณต์ˆ˜ํ™”๊ฐ€ ๋‹ค๋ฅธ ํ‘œ๋“ค๊ณผ ๊ทœ์น™์ด ์–ด๊ธ‹๋‚œ๋‹ค
18
- * (`twin_locations` ์ธ๋ฐ `twin_equipment`). ์กฐ์šฉํ•œ ๋น„์ผ๊ด€์€ ๋‚˜์ค‘์— "์™œ ์ด๊ฒƒ๋งŒ ๋‹ค๋ฅด์ง€" ๋ฅผ
18
+ * (`twin_locations` ์ธ๋ฐ `twin_equipment`). ๋“ค์–ด์˜จ ๊ฒƒ์ด ์—†๋Š” ๋น„์ผ๊ด€์€ ๋‚˜์ค‘์— "์™œ ์ด๊ฒƒ๋งŒ ๋‹ค๋ฅด์ง€" ๋ฅผ
19
19
  * ๋งŒ๋“ค๋ฏ€๋กœ ์ด๋ฆ„์„ ๊ณ ์ •ํ•œ๋‹ค(ADR-0032-I).
20
20
  */
21
21
  let TwinEquipment = class TwinEquipment {
@@ -100,9 +100,9 @@ tslib_1.__decorate([
100
100
  ], TwinEquipment.prototype, "mttrMs", void 0);
101
101
  tslib_1.__decorate([
102
102
  (0, typeorm_1.Column)({ nullable: true }),
103
- (0, type_graphql_1.Field)({ nullable: true, description: 'GS1 identifier supplied by the source (e.g. GIAI).' }),
103
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Declared global identity of this equipment (TwinModelDef.equipment[].identity). Not necessarily a GS1 key.' }),
104
104
  tslib_1.__metadata("design:type", String)
105
- ], TwinEquipment.prototype, "gs1Id", void 0);
105
+ ], TwinEquipment.prototype, "identity", void 0);
106
106
  tslib_1.__decorate([
107
107
  (0, typeorm_1.Column)(),
108
108
  (0, type_graphql_1.Field)({ description: 'Which reference (source system) this row came from. Required.' }),
@@ -1 +1 @@
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'\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 * ์ด ํ‘œ๋Š” ์›๋ณธ์—์„œ ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค(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 @Column({ nullable: true })\n @Field({ nullable: true, description: 'GS1 identifier supplied by the source (e.g. GIAI).' })\n gs1Id?: 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
+ {"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'\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 * ์ด ํ‘œ๋Š” ์›๋ณธ์—์„œ ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค(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"]}
@@ -37,11 +37,22 @@ let TwinLineageQuery = class TwinLineageQuery {
37
37
  * ๋ณ€ํ™˜ ์ด๋ฒคํŠธ๋งŒ ์ฝ๋Š”๋‹ค. **์ตœ์‹ ๋ถ€ํ„ฐ** ์ฝ๋Š”๋‹ค โ€” ๊ณ„๋ณด๋ฅผ ๋ฌป๋Š” ๊ฐœ์ฒด๋Š” ๋Œ€๊ฐœ ์ตœ๊ทผ์— ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๊ณ ,
38
38
  * ์ฐฝ์„ ๋„˜๊ฒจ ์ž˜๋ฆด ๋•Œ ์žƒ๋Š” ์ชฝ์ด ์˜ค๋ž˜๋œ ๊ฒƒ์ด์–ด์•ผ ๋œ ์•„ํ”„๋‹ค.
39
39
  */
40
- const rows = await (0, shell_1.getRepository)(twin_event_js_1.TwinEvent).find({
41
- where: { domain: { id: domainId }, instanceId, eventType: 'epcis.TransformationEvent' },
42
- order: { eventTime: 'DESC' },
43
- take: windowCap
44
- });
40
+ /*
41
+ * ๊ด€๊ณ„๋ฅผ **์ปฌ๋Ÿผ์œผ๋กœ** ๋ฌป๋Š”๋‹ค (2026-08-28). `find({ where: { domain: { id } } })` ์€ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„
42
+ * ์—”ํ‹ฐํ‹ฐ์—์„œ ๋‘ ๋‹จ๊ณ„ ์งˆ์˜๊ฐ€ ๋˜๊ณ  **์•ˆ์ชฝ์— ์ƒํ•œ์ด ์—†๋‹ค** โ€” `take` ๊ฐ€ ์žˆ์–ด๋„ ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰์„ ์ „๋ถ€
43
+ * ๋งŒ๋“  ๋’ค ๋ฐ–์—์„œ ์ž๋ฅธ๋‹ค. ๋ณ€ํ™˜ ์‚ฌ๊ฑด์ด ์ ์€ ํŠธ์œˆ์—์„œ๋Š” ํ‘œ๊ฐ€ ์•ˆ ๋‚˜์ง€๋งŒ, ๋ณ€ํ™˜์„ ๋งŽ์ด ๋‚ด๋Š” ํŠธ์œˆ์—์„œ๋Š”
44
+ * ์ด ํ•œ ๋ฒˆ์ด ๊ทธ ์ข…๋ฅ˜ ์ „์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ์งˆ์˜ ๋นŒ๋”๋กœ ๋ฌผ์œผ๋ฉด ์ƒํ•œ์ด ์•ˆ์ชฝ์— ๊ฑธ๋ฆฐ๋‹ค.
45
+ *
46
+ * ์ข…๋ฅ˜๊ฐ€ ์ •ํ™•์ผ์น˜์ด๋ฏ€๋กœ `(domain, instance, event_type, event_time)` ์ƒ‰์ธ์ด ์‹œ๊ฐ ์ˆœ์„œ๊นŒ์ง€ ์ค€๋‹ค.
47
+ */
48
+ const rows = await (0, shell_1.getRepository)(twin_event_js_1.TwinEvent)
49
+ .createQueryBuilder('e')
50
+ .where('e.domain = :domainId', { domainId })
51
+ .andWhere('e.instanceId = :instanceId', { instanceId })
52
+ .andWhere('e.eventType = :eventType', { eventType: 'epcis.TransformationEvent' })
53
+ .orderBy('e.eventTime', 'DESC')
54
+ .limit(windowCap)
55
+ .getMany();
45
56
  const truncated = rows.length >= windowCap;
46
57
  /* ์‚ฐ์ถœ โ†’ ๊ทธ ๋ณ€ํ™˜. ํ•œ ๊ฐœ์ฒด๋Š” ํ•œ ๋ฒˆ๋งŒ ๋งŒ๋“ค์–ด์ง€์ง€๋งŒ, ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชฉ๋ก์œผ๋กœ ๋“ ๋‹ค. */
47
58
  const madeBy = new Map();