@things-factory/headless-twin 10.0.12 โ†’ 10.0.13

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 (312) hide show
  1. package/dist-server/engine/canonical-ingest.d.ts +57 -2
  2. package/dist-server/engine/canonical-ingest.js +43 -2
  3. package/dist-server/engine/canonical-ingest.js.map +1 -1
  4. package/dist-server/engine/command-routing.js +1 -1
  5. package/dist-server/engine/command-routing.js.map +1 -1
  6. package/dist-server/engine/index.d.ts +3 -0
  7. package/dist-server/engine/index.js +4 -0
  8. package/dist-server/engine/index.js.map +1 -1
  9. package/dist-server/engine/ingest-health.d.ts +335 -0
  10. package/dist-server/engine/ingest-health.js +434 -0
  11. package/dist-server/engine/ingest-health.js.map +1 -0
  12. package/dist-server/engine/integration-coverage.d.ts +76 -0
  13. package/dist-server/engine/integration-coverage.js +73 -0
  14. package/dist-server/engine/integration-coverage.js.map +1 -0
  15. package/dist-server/engine/integration-probes.d.ts +65 -0
  16. package/dist-server/engine/integration-probes.js +100 -0
  17. package/dist-server/engine/integration-probes.js.map +1 -0
  18. package/dist-server/engine/integration-runner.d.ts +45 -0
  19. package/dist-server/engine/integration-runner.js +59 -0
  20. package/dist-server/engine/integration-runner.js.map +1 -0
  21. package/dist-server/engine/integration-target-profile.d.ts +57 -0
  22. package/dist-server/engine/integration-target-profile.js +79 -0
  23. package/dist-server/engine/integration-target-profile.js.map +1 -0
  24. package/dist-server/engine/kpi-fold.d.ts +27 -0
  25. package/dist-server/engine/kpi-fold.js +47 -4
  26. package/dist-server/engine/kpi-fold.js.map +1 -1
  27. package/dist-server/engine/kpi-query.js +128 -14
  28. package/dist-server/engine/kpi-query.js.map +1 -1
  29. package/dist-server/engine/live-feed-registry.js +2 -16
  30. package/dist-server/engine/live-feed-registry.js.map +1 -1
  31. package/dist-server/engine/load-meter.d.ts +1 -1
  32. package/dist-server/engine/load-meter.js +12 -3
  33. package/dist-server/engine/load-meter.js.map +1 -1
  34. package/dist-server/engine/log.d.ts +18 -0
  35. package/dist-server/engine/log.js +80 -0
  36. package/dist-server/engine/log.js.map +1 -0
  37. package/dist-server/engine/loop-lag.d.ts +54 -0
  38. package/dist-server/engine/loop-lag.js +87 -0
  39. package/dist-server/engine/loop-lag.js.map +1 -0
  40. package/dist-server/engine/model-gap.d.ts +108 -0
  41. package/dist-server/engine/model-gap.js +95 -0
  42. package/dist-server/engine/model-gap.js.map +1 -0
  43. package/dist-server/engine/restart-policy.d.ts +3 -3
  44. package/dist-server/engine/restart-policy.js +4 -4
  45. package/dist-server/engine/restart-policy.js.map +1 -1
  46. package/dist-server/engine/runtime-key.js +1 -1
  47. package/dist-server/engine/runtime-key.js.map +1 -1
  48. package/dist-server/engine/stage-path.d.ts +83 -0
  49. package/dist-server/engine/stage-path.js +118 -0
  50. package/dist-server/engine/stage-path.js.map +1 -0
  51. package/dist-server/engine/twin-engine.d.ts +352 -16
  52. package/dist-server/engine/twin-engine.js +1037 -166
  53. package/dist-server/engine/twin-engine.js.map +1 -1
  54. package/dist-server/index.js +34 -2
  55. package/dist-server/index.js.map +1 -1
  56. package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.d.ts +5 -0
  57. package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js +58 -0
  58. package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +1 -0
  59. package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.d.ts +5 -0
  60. package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js +55 -0
  61. package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +1 -0
  62. package/dist-server/migrations/index.js +7 -1
  63. package/dist-server/migrations/index.js.map +1 -1
  64. package/dist-server/service/index.d.ts +5 -2
  65. package/dist-server/service/index.js +18 -7
  66. package/dist-server/service/index.js.map +1 -1
  67. package/dist-server/service/reference/discovery-result.d.ts +1 -1
  68. package/dist-server/service/reference/discovery-result.js +1 -1
  69. package/dist-server/service/reference/discovery-result.js.map +1 -1
  70. package/dist-server/service/reference/index.d.ts +4 -1
  71. package/dist-server/service/reference/index.js +6 -1
  72. package/dist-server/service/reference/index.js.map +1 -1
  73. package/dist-server/service/reference/reference-adapter.d.ts +184 -3
  74. package/dist-server/service/reference/reference-adapter.js +28 -4
  75. package/dist-server/service/reference/reference-adapter.js.map +1 -1
  76. package/dist-server/service/reference/reference-assessment.d.ts +68 -0
  77. package/dist-server/service/reference/reference-assessment.js +136 -0
  78. package/dist-server/service/reference/reference-assessment.js.map +1 -0
  79. package/dist-server/service/reference/reference-live.d.ts +12 -1
  80. package/dist-server/service/reference/reference-live.js +116 -11
  81. package/dist-server/service/reference/reference-live.js.map +1 -1
  82. package/dist-server/service/reference/reference-master.d.ts +47 -1
  83. package/dist-server/service/reference/reference-master.js +34 -4
  84. package/dist-server/service/reference/reference-master.js.map +1 -1
  85. package/dist-server/service/reference/reference-probe.d.ts +92 -0
  86. package/dist-server/service/reference/reference-probe.js +186 -0
  87. package/dist-server/service/reference/reference-probe.js.map +1 -0
  88. package/dist-server/service/reference/reference-progress-subscription.d.ts +17 -0
  89. package/dist-server/service/reference/reference-progress-subscription.js +94 -0
  90. package/dist-server/service/reference/reference-progress-subscription.js.map +1 -0
  91. package/dist-server/service/reference/reference-progress.d.ts +38 -0
  92. package/dist-server/service/reference/reference-progress.js +71 -0
  93. package/dist-server/service/reference/reference-progress.js.map +1 -0
  94. package/dist-server/service/reference/reference-resolver.js +210 -43
  95. package/dist-server/service/reference/reference-resolver.js.map +1 -1
  96. package/dist-server/service/reference/twin-reference.d.ts +32 -0
  97. package/dist-server/service/reference/twin-reference.js +10 -0
  98. package/dist-server/service/reference/twin-reference.js.map +1 -1
  99. package/dist-server/service/twin-control/twin-control-mutation.js +4 -3
  100. package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
  101. package/dist-server/service/twin-event/journal-count.d.ts +21 -0
  102. package/dist-server/service/twin-event/journal-count.js +26 -0
  103. package/dist-server/service/twin-event/journal-count.js.map +1 -0
  104. package/dist-server/service/twin-event/twin-event-keys.d.ts +9 -0
  105. package/dist-server/service/twin-event/twin-event-keys.js +15 -18
  106. package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
  107. package/dist-server/service/twin-event/twin-event-type.d.ts +3 -1
  108. package/dist-server/service/twin-event/twin-event-type.js +18 -1
  109. package/dist-server/service/twin-event/twin-event-type.js.map +1 -1
  110. package/dist-server/service/twin-event/twin-event.d.ts +1 -0
  111. package/dist-server/service/twin-event/twin-event.js +9 -1
  112. package/dist-server/service/twin-event/twin-event.js.map +1 -1
  113. package/dist-server/service/twin-forecast/twin-forecast-query.js +2 -1
  114. package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
  115. package/dist-server/service/twin-ingest-window/index.d.ts +5 -0
  116. package/dist-server/service/twin-ingest-window/index.js +10 -0
  117. package/dist-server/service/twin-ingest-window/index.js.map +1 -0
  118. package/dist-server/service/twin-ingest-window/twin-ingest-window-query.d.ts +12 -0
  119. package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js +123 -0
  120. package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +1 -0
  121. package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.d.ts +1 -0
  122. package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js +51 -0
  123. package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +1 -0
  124. package/dist-server/service/twin-ingest-window/twin-ingest-window.d.ts +16 -0
  125. package/dist-server/service/twin-ingest-window/twin-ingest-window.js +108 -0
  126. package/dist-server/service/twin-ingest-window/twin-ingest-window.js.map +1 -0
  127. package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
  128. package/dist-server/service/twin-journal/twin-journal-query.js +58 -5
  129. package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
  130. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +14 -0
  131. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +72 -2
  132. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
  133. package/dist-server/service/twin-metrics/twin-metrics-query.d.ts +1 -0
  134. package/dist-server/service/twin-metrics/twin-metrics-query.js +78 -3
  135. package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
  136. package/dist-server/service/twin-model/axis-journal-evidence.d.ts +2 -0
  137. package/dist-server/service/twin-model/axis-journal-evidence.js +89 -0
  138. package/dist-server/service/twin-model/axis-journal-evidence.js.map +1 -0
  139. package/dist-server/service/twin-model/epcis-coverage.d.ts +1 -1
  140. package/dist-server/service/twin-model/epcis-coverage.js +19 -7
  141. package/dist-server/service/twin-model/epcis-coverage.js.map +1 -1
  142. package/dist-server/service/twin-model/iec61850-coverage.d.ts +1 -1
  143. package/dist-server/service/twin-model/iec61850-coverage.js +18 -7
  144. package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -1
  145. package/dist-server/service/twin-model/isa95-coverage.d.ts +14 -0
  146. package/dist-server/service/twin-model/isa95-coverage.js +23 -9
  147. package/dist-server/service/twin-model/isa95-coverage.js.map +1 -1
  148. package/dist-server/service/twin-model/item-ref.d.ts +24 -0
  149. package/dist-server/service/twin-model/item-ref.js +88 -0
  150. package/dist-server/service/twin-model/item-ref.js.map +1 -0
  151. package/dist-server/service/twin-model/name-index.d.ts +36 -0
  152. package/dist-server/service/twin-model/name-index.js +116 -0
  153. package/dist-server/service/twin-model/name-index.js.map +1 -0
  154. package/dist-server/service/twin-model/project-structure.js +1 -1
  155. package/dist-server/service/twin-model/project-structure.js.map +1 -1
  156. package/dist-server/service/twin-model/status-tally.d.ts +9 -0
  157. package/dist-server/service/twin-model/status-tally.js +37 -0
  158. package/dist-server/service/twin-model/status-tally.js.map +1 -0
  159. package/dist-server/service/twin-model/twin-lineage-query.js +40 -12
  160. package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
  161. package/dist-server/service/twin-model/twin-model-item-query.js +38 -39
  162. package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
  163. package/dist-server/service/twin-model/twin-model-query.js +156 -4
  164. package/dist-server/service/twin-model/twin-model-query.js.map +1 -1
  165. package/dist-server/service/twin-model/twin-model-tree-query.js +7 -0
  166. package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
  167. package/dist-server/service/twin-readiness/index.d.ts +2 -0
  168. package/dist-server/service/twin-readiness/index.js +6 -0
  169. package/dist-server/service/twin-readiness/index.js.map +1 -0
  170. package/dist-server/service/twin-readiness/twin-readiness-query.d.ts +3 -0
  171. package/dist-server/service/twin-readiness/twin-readiness-query.js +103 -0
  172. package/dist-server/service/twin-readiness/twin-readiness-query.js.map +1 -0
  173. package/dist-server/service/twin-space/twin-space-resolver.d.ts +2 -2
  174. package/dist-server/service/twin-space/twin-space-resolver.js +5 -4
  175. package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
  176. package/dist-shared/entity-delta.d.ts +23 -3
  177. package/dist-shared/entity-delta.js +12 -8
  178. package/dist-shared/entity-delta.js.map +1 -1
  179. package/dist-shared/kpi-broadcast.js +1 -1
  180. package/dist-shared/kpi-broadcast.js.map +1 -1
  181. package/dist-shared/touched-items.d.ts +7 -0
  182. package/dist-shared/touched-items.js +80 -0
  183. package/dist-shared/touched-items.js.map +1 -0
  184. package/package.json +7 -7
  185. package/server/engine/canonical-ingest.ts +92 -7
  186. package/server/engine/command-routing.ts +1 -1
  187. package/server/engine/index.ts +4 -0
  188. package/server/engine/ingest-health.ts +704 -0
  189. package/server/engine/integration-coverage.ts +147 -0
  190. package/server/engine/integration-probes.ts +144 -0
  191. package/server/engine/integration-runner.ts +95 -0
  192. package/server/engine/integration-target-profile.ts +103 -0
  193. package/server/engine/kpi-fold.ts +72 -4
  194. package/server/engine/kpi-query.ts +129 -15
  195. package/server/engine/live-feed-registry.ts +2 -1
  196. package/server/engine/load-meter.ts +12 -3
  197. package/server/engine/log.ts +72 -0
  198. package/server/engine/loop-lag.ts +120 -0
  199. package/server/engine/model-gap.ts +168 -0
  200. package/server/engine/restart-policy.ts +4 -4
  201. package/server/engine/runtime-key.ts +1 -1
  202. package/server/engine/stage-path.ts +172 -0
  203. package/server/engine/twin-engine.ts +1135 -162
  204. package/server/index.ts +35 -2
  205. package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +54 -0
  206. package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +53 -0
  207. package/server/migrations/index.ts +7 -1
  208. package/server/service/index.ts +11 -0
  209. package/server/service/reference/discovery-result.ts +1 -1
  210. package/server/service/reference/index.ts +6 -1
  211. package/server/service/reference/reference-adapter.ts +197 -5
  212. package/server/service/reference/reference-assessment.ts +215 -0
  213. package/server/service/reference/reference-live.ts +123 -11
  214. package/server/service/reference/reference-master.ts +64 -4
  215. package/server/service/reference/reference-probe.ts +264 -0
  216. package/server/service/reference/reference-progress-subscription.ts +73 -0
  217. package/server/service/reference/reference-progress.ts +95 -0
  218. package/server/service/reference/reference-resolver.ts +200 -12
  219. package/server/service/reference/twin-reference.ts +39 -1
  220. package/server/service/twin-control/twin-control-mutation.ts +4 -3
  221. package/server/service/twin-event/journal-count.ts +53 -0
  222. package/server/service/twin-event/twin-event-keys.ts +16 -1
  223. package/server/service/twin-event/twin-event-type.ts +26 -2
  224. package/server/service/twin-event/twin-event.ts +7 -0
  225. package/server/service/twin-forecast/twin-forecast-query.ts +2 -1
  226. package/server/service/twin-ingest-window/index.ts +7 -0
  227. package/server/service/twin-ingest-window/twin-ingest-window-query.ts +125 -0
  228. package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +57 -0
  229. package/server/service/twin-ingest-window/twin-ingest-window.ts +113 -0
  230. package/server/service/twin-instance/twin-instance.ts +1 -1
  231. package/server/service/twin-journal/twin-journal-query.ts +59 -5
  232. package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +77 -3
  233. package/server/service/twin-metrics/twin-metrics-query.ts +81 -3
  234. package/server/service/twin-model/axis-journal-evidence.ts +57 -0
  235. package/server/service/twin-model/epcis-coverage.ts +2 -8
  236. package/server/service/twin-model/iec61850-coverage.ts +2 -8
  237. package/server/service/twin-model/isa95-coverage.ts +22 -9
  238. package/server/service/twin-model/item-ref.ts +80 -0
  239. package/server/service/twin-model/name-index.ts +94 -0
  240. package/server/service/twin-model/project-structure.ts +1 -1
  241. package/server/service/twin-model/status-tally.ts +37 -0
  242. package/server/service/twin-model/twin-lineage-query.ts +38 -9
  243. package/server/service/twin-model/twin-model-item-query.ts +26 -27
  244. package/server/service/twin-model/twin-model-query.ts +155 -4
  245. package/server/service/twin-model/twin-model-tree-query.ts +7 -0
  246. package/server/service/twin-readiness/index.ts +3 -0
  247. package/server/service/twin-readiness/twin-readiness-query.ts +96 -0
  248. package/server/service/twin-space/twin-space-resolver.ts +5 -4
  249. package/shared/entity-delta.ts +31 -7
  250. package/shared/kpi-broadcast.ts +1 -1
  251. package/shared/touched-items.ts +73 -0
  252. package/test/axis-journal-evidence.test.ts +71 -0
  253. package/test/axis-read.test.ts +101 -1
  254. package/test/boot-resume.test.ts +92 -26
  255. package/test/broadcast-cost-baseline.test.ts +200 -0
  256. package/test/broadcast-period.test.ts +58 -0
  257. package/test/canonical-ingest-vocabularies.test.ts +36 -1
  258. package/test/canonical-quantity-door.test.ts +61 -0
  259. package/test/command-routing.test.ts +1 -1
  260. package/test/declared-location-types.test.ts +89 -0
  261. package/test/discovery-result.test.ts +1 -1
  262. package/test/duration-estimators.test.ts +1 -1
  263. package/test/entity-delta.test.ts +2 -2
  264. package/test/ingest-bench.test.ts +3 -3
  265. package/test/ingest-health-engine.test.ts +248 -0
  266. package/test/ingest-health-wiring.test.ts +119 -0
  267. package/test/ingest-health.test.ts +306 -0
  268. package/test/ingest-history.test.ts +247 -0
  269. package/test/integration-probes.test.ts +103 -0
  270. package/test/integration-runner.test.ts +95 -0
  271. package/test/item-ref.test.ts +78 -0
  272. package/test/journal-read-discipline.test.ts +177 -0
  273. package/test/journal-retention.test.ts +133 -0
  274. package/test/journal-sort-axis.test.ts +142 -0
  275. package/test/journal-write-door.test.ts +110 -0
  276. package/test/journal-write-trend.test.ts +115 -0
  277. package/test/kernel-kind-guard.test.ts +4 -4
  278. package/test/kpi-fold.test.ts +90 -3
  279. package/test/kpi-query-bench.test.ts +2 -2
  280. package/test/lineage-survives-restart.test.ts +17 -1
  281. package/test/live-cursor-wiring.test.ts +87 -0
  282. package/test/live-feed-registry.test.ts +9 -1
  283. package/test/live-kernel-facts.test.ts +7 -7
  284. package/test/live-mirror-parity.test.ts +6 -0
  285. package/test/load-meter.test.ts +29 -15
  286. package/test/local-declarations.test.ts +1 -1
  287. package/test/log-stamp.test.ts +59 -0
  288. package/test/loop-lag.test.ts +82 -0
  289. package/test/model-gap.test.ts +153 -0
  290. package/test/oee-accumulator.test.ts +4 -0
  291. package/test/operational-vocabulary.test.ts +4 -4
  292. package/test/read-failure-visible.test.ts +145 -0
  293. package/test/reference-grounding.test.ts +70 -0
  294. package/test/resolve-ts-siblings.mjs +52 -0
  295. package/test/restart-policy.test.ts +7 -7
  296. package/test/revision-axis.test.ts +93 -0
  297. package/test/runtime-key.test.ts +2 -2
  298. package/test/scale-twin-bench.test.ts +2 -2
  299. package/test/spec-coverage.test.ts +1 -1
  300. package/test/stage-path.test.ts +95 -0
  301. package/test/standard-coverage.test.ts +15 -3
  302. package/test/status-tally.test.ts +55 -0
  303. package/test/structure-revision-db.test.ts +4 -0
  304. package/test/tenant-registry-db.test.ts +1 -1
  305. package/test/time-range.test.ts +152 -0
  306. package/test/touched-items.test.ts +61 -0
  307. package/test/twin-event-keys.test.ts +10 -2
  308. package/test/twin-model-item-db.test.ts +2 -0
  309. package/test/warm-start-seam.test.ts +4 -0
  310. package/test/yield-loop.test.ts +57 -2
  311. package/tsconfig.shared.tsbuildinfo +1 -1
  312. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,2 @@
1
+ /** ์ด ์ถ•์˜ ์‚ฌ์‹ค์ด ์ €๋„์— ํ•œ ๊ฑด์ด๋ผ๋„ ์žˆ๋‚˜. ํŒ๋‹จํ•  ์ˆ˜ ์—†์œผ๋ฉด `null`(๋ชจ๋ฅธ๋‹ค). */
2
+ export declare function axisSeenInJournal(repo: any, where: Record<string, unknown>, axis: string): Promise<boolean | null>;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.axisSeenInJournal = axisSeenInJournal;
37
+ /*
38
+ * **์ €๋„์— ๊ทธ ์ถ•์˜ ์‚ฌ์‹ค์ด ์žˆ๋‚˜** โ€” ใ€Œ์•„์ง ์—†๋‹คใ€์™€ ใ€Œ์™”๋Š”๋ฐ ์ƒํƒœ์— ์—†๋‹คใ€๋ฅผ ๊ฐ€๋ฅธ๋‹ค (2026-08-22).
39
+ *
40
+ * โ”€โ”€ ์™œ ํ•„์š”ํ–ˆ๋‚˜ (์‹ค์ธก) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
41
+ * ํ™”๋ฉด์ด ใ€Œ์ž‘์—… โ€” ์•„์ง ํ•˜๋‚˜๋„ ์—†์Šต๋‹ˆ๋‹คใ€๋ผ๊ณ  ๋งํ•˜๋Š”๋ฐ, ๊ทธ ํŠธ์œˆ์˜ ์ €๋„์—๋Š” `task.status` 5,786๊ฑด์ด
42
+ * ์žˆ์—ˆ๊ณ  **๋งˆ์ง€๋ง‰ ์ƒํƒœ๊ฐ€ `in-progress`** ์˜€๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ใ€Œ์ž‘์—… ์ง€์‹œ 835๊ฑด์ธ๋ฐ ์ž‘์—…์ด 0์ธ ์ด์œ ใ€๋ฅผ
43
+ * ๋ฌผ์–ด ๋ฐ˜๋‚˜์ ˆ์„ ์กฐ์‚ฌํ•ด ์›์ธ์„ ์ฐพ์•˜๋‹ค: ๊ด€์ธก ๋ชจ๋“œ ์ปค๋„์ด ๊ด€์ธก๊ธฐ์˜ ์ž‘์—…์„ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค
44
+ * (์ปค๋„ ์ž๋ฆฌ์ด๊ณ  ๊ทธ ๋ ˆ์ธ์— ๋„˜๊ฒผ๋‹ค).
45
+ *
46
+ * ํ™”๋ฉด ๋ชซ์€ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค. **์นด๋“œ๊ฐ€ ๋‹จ์ •ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.** ใ€Œ์•„์ง ํ•˜๋‚˜๋„ ์—†์Šต๋‹ˆ๋‹คใ€๋Š” ใ€Œ์„ ์–ธ์€ ์žˆ๊ณ  ์‚ฌ์‹ค์ด
47
+ * ์•„์ง ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹คใ€๋Š” ๋œป์ธ๋ฐ, ์‹ค์ œ๋กœ๋Š” ใ€Œ์‚ฌ์‹ค์ด ์ผ์–ด๋‚ฌ๋Š”๋ฐ ์ƒํƒœ์— ์˜ค์ง€ ๋ชปํ–ˆ๋‹คใ€์˜€๋‹ค โ€” ๊ทธ ์ฐจ์ด๊ฐ€
48
+ * ์‚ฌ์šฉ์ž๋ฅผ ๋ฐ˜๋‚˜์ ˆ ์กฐ์‚ฌ๋กœ ๋ณด๋‚ธ๋‹ค.
49
+ *
50
+ * ๊ทธ๋ž˜์„œ ์ƒํƒœ๊ฐ€ ๋นˆ ์ถ•์— ๋Œ€ํ•ด **์ €๋„์„ ํ•œ ๊ฑด๋งŒ ๋ฌผ์–ด๋ณธ๋‹ค.** ์žˆ์œผ๋ฉด ํ™”๋ฉด์ด ๊ทธ๋ ‡๊ฒŒ ๋งํ•œ๋‹ค.
51
+ *
52
+ * โ”€โ”€ ์–ดํœ˜์˜ ์ง‘ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
53
+ * ์–ด๋А ์‚ฌ๊ฑด์ด ์–ด๋А ์ถ•์„ ์ฑ„์šฐ๋Š”์ง€๋Š” **์ปค๋„์ด ์„ ์–ธํ•œ ๋‚ฑ๋ง**์—์„œ ์˜จ๋‹ค(`OP_EVENT`ยท`ENERGY_EVENT`, ๊ทธ๋ฆฌ๊ณ 
54
+ * EPCIS ์ ‘๋‘์‚ฌ). ์—ฌ๊ธฐ์„œ ์ด๋ฆ„์„ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค โ€” ์ปค๋„์ด ๋‚ฑ๋ง์„ ๋Š˜๋ฆฌ๋ฉด ์ด ํ‘œ์— ํ•œ ์ค„์ด ๋Š˜๊ณ ,
55
+ * ํ‘œ์— ์—†๋Š” ์ถ•์€ **์•„๋ฌด ๋ง๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค**(๋ชจ๋ฅด๋Š” ๊ฒƒ์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค).
56
+ */
57
+ const journal_count_js_1 = require("../twin-event/journal-count.js");
58
+ /**
59
+ * ์ƒํƒœ ์ถ• โ†’ ๊ทธ ์ถ•์„ ์ฑ„์šฐ๋Š” ์‚ฌ๊ฑด ๋‚ฑ๋ง. ํ‘œ์— ์—†์œผ๋ฉด ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.
60
+ *
61
+ * ๋ฌผํ’ˆ์€ EPCIS ๋กœ ์˜จ๋‹ค(์‚ฌ๊ฑด ์ด๋ฆ„์ด ์—ฌ๋Ÿฌ ๊ฐœ๋‹ค) โ€” ๊ทธ๋ž˜์„œ ์ ‘๋‘์‚ฌ๋กœ ๋ณธ๋‹ค.
62
+ */
63
+ const AXIS_EVENTS = {
64
+ tasks: { types: ['task.status'] },
65
+ orders: { types: ['order.status'] },
66
+ items: { prefix: 'epcis.' },
67
+ demandWindows: { types: ['energy.demand.window'] }
68
+ };
69
+ /** ์ด ์ถ•์˜ ์‚ฌ์‹ค์ด ์ €๋„์— ํ•œ ๊ฑด์ด๋ผ๋„ ์žˆ๋‚˜. ํŒ๋‹จํ•  ์ˆ˜ ์—†์œผ๋ฉด `null`(๋ชจ๋ฅธ๋‹ค). */
70
+ async function axisSeenInJournal(repo, where, axis) {
71
+ const spec = AXIS_EVENTS[axis];
72
+ if (!spec)
73
+ return null;
74
+ if (spec.types) {
75
+ for (const t of spec.types) {
76
+ if (await (0, journal_count_js_1.anyJournalRow)(repo, { ...where, eventType: t }))
77
+ return true;
78
+ }
79
+ return false;
80
+ }
81
+ /*
82
+ * ์ ‘๋‘์‚ฌ๋กœ ์ฐพ๋Š” ์ถ•(๋ฌผํ’ˆ) โ€” ํ•œ ๊ฑด๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค. `Like` ๋ฅผ ์“ฐ๋Š” ๋Œ€์‹  **๋‚ฑ๋ง ๋ชฉ๋ก**์„ ์“ฐ์ง€ ์•Š๋Š” ์ด์œ ๋Š”
83
+ * EPCIS ์‚ฌ๊ฑด ์ด๋ฆ„์ด ์ปค๋„์—์„œ ์ž๋ผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(๊ฐ์ฒดยท์ง‘์•ฝยท๋ณ€ํ™˜ยท๊ฑฐ๋ž˜โ€ฆ). ์ด๋ฆ„์„ ์—ฌ๊ธฐ ๋ฒ ๋ผ๋ฉด ์ปค๋„์ด
84
+ * ํ•˜๋‚˜ ๋Š˜๋ฆด ๋•Œ ์ด ์ž๋ฆฌ๊ฐ€ ์กฐ์šฉํžˆ ๋‚ก๋Š”๋‹ค.
85
+ */
86
+ const { Like } = await Promise.resolve().then(() => __importStar(require('typeorm')));
87
+ return (0, journal_count_js_1.anyJournalRow)(repo, { ...where, eventType: Like(`${spec.prefix}%`) });
88
+ }
89
+ //# sourceMappingURL=axis-journal-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis-journal-evidence.js","sourceRoot":"","sources":["../../../server/service/twin-model/axis-journal-evidence.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,8CAqBC;AAxDD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qEAA8D;AAE9D;;;;GAIG;AACH,MAAM,WAAW,GAA0D;IACzE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE;IACjC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE;IACnC,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC3B,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,sBAAsB,CAAC,EAAE;CACnD,CAAA;AAED,qDAAqD;AAC9C,KAAK,UAAU,iBAAiB,CACrC,IAAS,EACT,KAA8B,EAC9B,IAAY;IAEZ,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAEtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,MAAM,IAAA,gCAAa,EAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAA;QACxE,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IACD;;;;OAIG;IACH,MAAM,EAAE,IAAI,EAAE,GAAG,wDAAa,SAAS,GAAC,CAAA;IACxC,OAAO,IAAA,gCAAa,EAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,CAAC","sourcesContent":["/*\n * **์ €๋„์— ๊ทธ ์ถ•์˜ ์‚ฌ์‹ค์ด ์žˆ๋‚˜** โ€” ใ€Œ์•„์ง ์—†๋‹คใ€์™€ ใ€Œ์™”๋Š”๋ฐ ์ƒํƒœ์— ์—†๋‹คใ€๋ฅผ ๊ฐ€๋ฅธ๋‹ค (2026-08-22).\n *\n * โ”€โ”€ ์™œ ํ•„์š”ํ–ˆ๋‚˜ (์‹ค์ธก) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ํ™”๋ฉด์ด ใ€Œ์ž‘์—… โ€” ์•„์ง ํ•˜๋‚˜๋„ ์—†์Šต๋‹ˆ๋‹คใ€๋ผ๊ณ  ๋งํ•˜๋Š”๋ฐ, ๊ทธ ํŠธ์œˆ์˜ ์ €๋„์—๋Š” `task.status` 5,786๊ฑด์ด\n * ์žˆ์—ˆ๊ณ  **๋งˆ์ง€๋ง‰ ์ƒํƒœ๊ฐ€ `in-progress`** ์˜€๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ใ€Œ์ž‘์—… ์ง€์‹œ 835๊ฑด์ธ๋ฐ ์ž‘์—…์ด 0์ธ ์ด์œ ใ€๋ฅผ\n * ๋ฌผ์–ด ๋ฐ˜๋‚˜์ ˆ์„ ์กฐ์‚ฌํ•ด ์›์ธ์„ ์ฐพ์•˜๋‹ค: ๊ด€์ธก ๋ชจ๋“œ ์ปค๋„์ด ๊ด€์ธก๊ธฐ์˜ ์ž‘์—…์„ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค\n * (์ปค๋„ ์ž๋ฆฌ์ด๊ณ  ๊ทธ ๋ ˆ์ธ์— ๋„˜๊ฒผ๋‹ค).\n *\n * ํ™”๋ฉด ๋ชซ์€ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค. **์นด๋“œ๊ฐ€ ๋‹จ์ •ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.** ใ€Œ์•„์ง ํ•˜๋‚˜๋„ ์—†์Šต๋‹ˆ๋‹คใ€๋Š” ใ€Œ์„ ์–ธ์€ ์žˆ๊ณ  ์‚ฌ์‹ค์ด\n * ์•„์ง ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹คใ€๋Š” ๋œป์ธ๋ฐ, ์‹ค์ œ๋กœ๋Š” ใ€Œ์‚ฌ์‹ค์ด ์ผ์–ด๋‚ฌ๋Š”๋ฐ ์ƒํƒœ์— ์˜ค์ง€ ๋ชปํ–ˆ๋‹คใ€์˜€๋‹ค โ€” ๊ทธ ์ฐจ์ด๊ฐ€\n * ์‚ฌ์šฉ์ž๋ฅผ ๋ฐ˜๋‚˜์ ˆ ์กฐ์‚ฌ๋กœ ๋ณด๋‚ธ๋‹ค.\n *\n * ๊ทธ๋ž˜์„œ ์ƒํƒœ๊ฐ€ ๋นˆ ์ถ•์— ๋Œ€ํ•ด **์ €๋„์„ ํ•œ ๊ฑด๋งŒ ๋ฌผ์–ด๋ณธ๋‹ค.** ์žˆ์œผ๋ฉด ํ™”๋ฉด์ด ๊ทธ๋ ‡๊ฒŒ ๋งํ•œ๋‹ค.\n *\n * โ”€โ”€ ์–ดํœ˜์˜ ์ง‘ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์–ด๋А ์‚ฌ๊ฑด์ด ์–ด๋А ์ถ•์„ ์ฑ„์šฐ๋Š”์ง€๋Š” **์ปค๋„์ด ์„ ์–ธํ•œ ๋‚ฑ๋ง**์—์„œ ์˜จ๋‹ค(`OP_EVENT`ยท`ENERGY_EVENT`, ๊ทธ๋ฆฌ๊ณ \n * EPCIS ์ ‘๋‘์‚ฌ). ์—ฌ๊ธฐ์„œ ์ด๋ฆ„์„ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค โ€” ์ปค๋„์ด ๋‚ฑ๋ง์„ ๋Š˜๋ฆฌ๋ฉด ์ด ํ‘œ์— ํ•œ ์ค„์ด ๋Š˜๊ณ ,\n * ํ‘œ์— ์—†๋Š” ์ถ•์€ **์•„๋ฌด ๋ง๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค**(๋ชจ๋ฅด๋Š” ๊ฒƒ์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค).\n */\nimport { anyJournalRow } from '../twin-event/journal-count.js'\n\n/**\n * ์ƒํƒœ ์ถ• โ†’ ๊ทธ ์ถ•์„ ์ฑ„์šฐ๋Š” ์‚ฌ๊ฑด ๋‚ฑ๋ง. ํ‘œ์— ์—†์œผ๋ฉด ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.\n *\n * ๋ฌผํ’ˆ์€ EPCIS ๋กœ ์˜จ๋‹ค(์‚ฌ๊ฑด ์ด๋ฆ„์ด ์—ฌ๋Ÿฌ ๊ฐœ๋‹ค) โ€” ๊ทธ๋ž˜์„œ ์ ‘๋‘์‚ฌ๋กœ ๋ณธ๋‹ค.\n */\nconst AXIS_EVENTS: Record<string, { types?: string[]; prefix?: string }> = {\n tasks: { types: ['task.status'] },\n orders: { types: ['order.status'] },\n items: { prefix: 'epcis.' },\n demandWindows: { types: ['energy.demand.window'] }\n}\n\n/** ์ด ์ถ•์˜ ์‚ฌ์‹ค์ด ์ €๋„์— ํ•œ ๊ฑด์ด๋ผ๋„ ์žˆ๋‚˜. ํŒ๋‹จํ•  ์ˆ˜ ์—†์œผ๋ฉด `null`(๋ชจ๋ฅธ๋‹ค). */\nexport async function axisSeenInJournal(\n repo: any,\n where: Record<string, unknown>,\n axis: string\n): Promise<boolean | null> {\n const spec = AXIS_EVENTS[axis]\n if (!spec) return null\n\n if (spec.types) {\n for (const t of spec.types) {\n if (await anyJournalRow(repo, { ...where, eventType: t })) return true\n }\n return false\n }\n /*\n * ์ ‘๋‘์‚ฌ๋กœ ์ฐพ๋Š” ์ถ•(๋ฌผํ’ˆ) โ€” ํ•œ ๊ฑด๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค. `Like` ๋ฅผ ์“ฐ๋Š” ๋Œ€์‹  **๋‚ฑ๋ง ๋ชฉ๋ก**์„ ์“ฐ์ง€ ์•Š๋Š” ์ด์œ ๋Š”\n * EPCIS ์‚ฌ๊ฑด ์ด๋ฆ„์ด ์ปค๋„์—์„œ ์ž๋ผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(๊ฐ์ฒดยท์ง‘์•ฝยท๋ณ€ํ™˜ยท๊ฑฐ๋ž˜โ€ฆ). ์ด๋ฆ„์„ ์—ฌ๊ธฐ ๋ฒ ๋ผ๋ฉด ์ปค๋„์ด\n * ํ•˜๋‚˜ ๋Š˜๋ฆด ๋•Œ ์ด ์ž๋ฆฌ๊ฐ€ ์กฐ์šฉํžˆ ๋‚ก๋Š”๋‹ค.\n */\n const { Like } = await import('typeorm')\n return anyJournalRow(repo, { ...where, eventType: Like(`${spec.prefix}%`) })\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Isa95Concept } from './isa95-coverage.js';
1
+ import { type Isa95Concept } from './isa95-coverage.js';
2
2
  export declare const EPCIS_CONCEPTS: Isa95Concept[];
3
3
  export declare function epcisCoverage(axes: string[]): {
4
4
  model: string;
@@ -2,6 +2,24 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EPCIS_CONCEPTS = void 0;
4
4
  exports.epcisCoverage = epcisCoverage;
5
+ /*
6
+ * GS1 EPCIS 2.0 ์ ํ•ฉ์„ฑ ๊ธฐ์ค€ โ€” **๋ฌผ๋ฅ˜ยท์ œ์กฐ ํŠธ์œˆ์ด ํ‘œ์ค€์˜ ์–ด๋””๋ฅผ ์ฑ„์šฐ๊ณ  ์žˆ๋‚˜.**
7
+ *
8
+ * โ”€โ”€ ์™œ ๋”ฐ๋กœ ์žˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
9
+ * ์ ํ•ฉ์„ฑ ํŒจ๋„์ด ISA-95 ํ•˜๋‚˜๋งŒ ๋งํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฐฝ๊ณ ยท์•ผ๋“œยท๊ณต์žฅ ํŠธ์œˆ์—์„œ ใ€Œ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋‚˜ใ€์™€
10
+ * ใ€Œ์ด ๋ฒˆํ˜ธ๊ฐ€ ๋ฌด์—‡์„ ๊ฐ€๋ฆฌํ‚ค๋‚˜ใ€๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์€ EPCIS ๋‹ค. ISA-95 ํ‘œ๋งŒ ๋ณด์ด๋ฉด ๊ทธ ํŠธ์œˆ์ด ๊ธฐ๋Œ€๋Š” ๊ธฐ์ค€์˜
11
+ * ์ ˆ๋ฐ˜์ด ํ™”๋ฉด์— ์—†๋‹ค.
12
+ *
13
+ * โ”€โ”€ ์ˆ˜์ค€์€ ๊ทผ๊ฑฐ๋ฅผ ๋ณด๊ณ  ์ ์—ˆ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
14
+ * ใ€Œ์žˆ๋‹ค/์—†๋‹คใ€๋ฅผ ๊ธฐ์–ต์œผ๋กœ ์ ์ง€ ์•Š๋Š”๋‹ค. ๊ฐ ์ค„์˜ ํŒ๋‹จ ๊ทผ๊ฑฐ:
15
+ * ยท ํƒ€์ž… ์„ ์–ธ โ€” ์ปค๋„ `epcis.ts`(์ด๋ฒคํŠธยทํ•„๋“œ์˜ ๋ชจ์–‘)
16
+ * ยท ์‹ค์ œ ์‚ฌ์šฉ โ€” ์ปค๋„ ๋„๋ฉ”์ธ(`mes-kernel`ยท`face2-adapter`ยท`observed-reducer`)๊ณผ ํ˜ธ์ŠคํŠธ ์ธ์ œ์ŠคํŠธ
17
+ * ยท ํ™”๋ฉด ๋…ธ์ถœ โ€” ์ €๋„ยท๊ณ„๋ณดยท์—”ํ‹ฐํ‹ฐ 360
18
+ * ๋ชจ์–‘๋งŒ ์žˆ๊ณ  ์•„๋ฌด๋„ ์ฑ„์šฐ์ง€ ์•Š๋Š” ํ•„๋“œ๋Š” **๊ตฌ์กฐ๋งŒ ์žˆ์Œ**์œผ๋กœ ์ ๋Š”๋‹ค(๊ทธ๊ฒŒ ์‚ฌ์‹ค์ด๋‹ค).
19
+ *
20
+ * ISA-95 ํ‘œ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๋‹ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์‚ฌ๋žŒ์ด ํŒ๋‹จํ•ด ์ ๊ณ , ํ‹€๋ฆฌ๋ฉด ์—ฌ๊ธฐ๋ฅผ ๊ณ ์นœ๋‹ค.
21
+ */
22
+ const isa95_coverage_js_1 = require("./isa95-coverage.js");
5
23
  /* Part: EPCIS 2.0 ์˜ ์‚ฌ๊ฑด ์ข…๋ฅ˜ โ€” ๋ฌด์—‡์ด ์ผ์–ด๋‚ฌ๋Š”๊ฐ€. */
6
24
  const EVENTS = [
7
25
  {
@@ -157,13 +175,7 @@ const FIELDS = [
157
175
  ];
158
176
  exports.EPCIS_CONCEPTS = [...EVENTS, ...FIELDS];
159
177
  function epcisCoverage(axes) {
160
- const known = new Set(axes);
161
- const concepts = exports.EPCIS_CONCEPTS.map(c => {
162
- const axisMissing = !!c.axis && !known.has(c.axis);
163
- const shownOn = c.shownOn?.filter(a => known.has(a));
164
- const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
165
- return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
166
- });
178
+ const concepts = exports.EPCIS_CONCEPTS.map(c => (0, isa95_coverage_js_1.reconcileAxes)(c, new Set(axes)));
167
179
  const count = (k) => concepts.filter(c => c[k] === 'full').length;
168
180
  return {
169
181
  model: 'GS1 EPCIS 2.0',
@@ -1 +1 @@
1
- {"version":3,"file":"epcis-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/epcis-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * GS1 EPCIS 2.0 ์ ํ•ฉ์„ฑ ๊ธฐ์ค€ โ€” **๋ฌผ๋ฅ˜ยท์ œ์กฐ ํŠธ์œˆ์ด ํ‘œ์ค€์˜ ์–ด๋””๋ฅผ ์ฑ„์šฐ๊ณ  ์žˆ๋‚˜.**\n *\n * โ”€โ”€ ์™œ ๋”ฐ๋กœ ์žˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ ํ•ฉ์„ฑ ํŒจ๋„์ด ISA-95 ํ•˜๋‚˜๋งŒ ๋งํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฐฝ๊ณ ยท์•ผ๋“œยท๊ณต์žฅ ํŠธ์œˆ์—์„œ ใ€Œ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋‚˜ใ€์™€\n * ใ€Œ์ด ๋ฒˆํ˜ธ๊ฐ€ ๋ฌด์—‡์„ ๊ฐ€๋ฆฌํ‚ค๋‚˜ใ€๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์€ EPCIS ๋‹ค. ISA-95 ํ‘œ๋งŒ ๋ณด์ด๋ฉด ๊ทธ ํŠธ์œˆ์ด ๊ธฐ๋Œ€๋Š” ๊ธฐ์ค€์˜\n * ์ ˆ๋ฐ˜์ด ํ™”๋ฉด์— ์—†๋‹ค.\n *\n * โ”€โ”€ ์ˆ˜์ค€์€ ๊ทผ๊ฑฐ๋ฅผ ๋ณด๊ณ  ์ ์—ˆ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ใ€Œ์žˆ๋‹ค/์—†๋‹คใ€๋ฅผ ๊ธฐ์–ต์œผ๋กœ ์ ์ง€ ์•Š๋Š”๋‹ค. ๊ฐ ์ค„์˜ ํŒ๋‹จ ๊ทผ๊ฑฐ:\n * ยท ํƒ€์ž… ์„ ์–ธ โ€” ์ปค๋„ `epcis.ts`(์ด๋ฒคํŠธยทํ•„๋“œ์˜ ๋ชจ์–‘)\n * ยท ์‹ค์ œ ์‚ฌ์šฉ โ€” ์ปค๋„ ๋„๋ฉ”์ธ(`mes-kernel`ยท`face2-adapter`ยท`observed-reducer`)๊ณผ ํ˜ธ์ŠคํŠธ ์ธ์ œ์ŠคํŠธ\n * ยท ํ™”๋ฉด ๋…ธ์ถœ โ€” ์ €๋„ยท๊ณ„๋ณดยท์—”ํ‹ฐํ‹ฐ 360\n * ๋ชจ์–‘๋งŒ ์žˆ๊ณ  ์•„๋ฌด๋„ ์ฑ„์šฐ์ง€ ์•Š๋Š” ํ•„๋“œ๋Š” **๊ตฌ์กฐ๋งŒ ์žˆ์Œ**์œผ๋กœ ์ ๋Š”๋‹ค(๊ทธ๊ฒŒ ์‚ฌ์‹ค์ด๋‹ค).\n *\n * ISA-95 ํ‘œ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๋‹ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์‚ฌ๋žŒ์ด ํŒ๋‹จํ•ด ์ ๊ณ , ํ‹€๋ฆฌ๋ฉด ์—ฌ๊ธฐ๋ฅผ ๊ณ ์นœ๋‹ค.\n */\nimport type { Isa95Concept, CoverageLevel } from './isa95-coverage.js'\n\n/* Part: EPCIS 2.0 ์˜ ์‚ฌ๊ฑด ์ข…๋ฅ˜ โ€” ๋ฌด์—‡์ด ์ผ์–ด๋‚ฌ๋Š”๊ฐ€. */\nconst EVENTS: Isa95Concept[] = [\n {\n std: 'ObjectEvent',\n part: 'events',\n label: 'twin.epcis.ObjectEvent',\n axis: 'items',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.ObjectEvent'\n },\n {\n std: 'AggregationEvent',\n part: 'events',\n label: 'twin.epcis.AggregationEvent',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.AggregationEvent'\n },\n {\n std: 'TransactionEvent',\n part: 'events',\n label: 'twin.epcis.TransactionEvent',\n axis: 'orders',\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.TransactionEvent'\n },\n {\n std: 'TransformationEvent',\n part: 'events',\n label: 'twin.epcis.TransformationEvent',\n axis: null,\n shownOn: ['items', 'operations'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.TransformationEvent'\n },\n /* EPCIS 2.0 ์ด ๋”ํ•œ ์‚ฌ๊ฑด โ€” ์šฐ๋ฆฌ๋Š” ํƒ€์ž…์กฐ์ฐจ ๋‘์ง€ ์•Š์•˜๋‹ค. ์—†๋Š” ๊ฒƒ์€ ์—†๋‹ค๊ณ  ์ ๋Š”๋‹ค. */\n {\n std: 'AssociationEvent',\n part: 'events',\n label: 'twin.epcis.AssociationEvent',\n axis: null,\n structure: 'none',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.AssociationEvent'\n }\n]\n\n/* Part: ์‚ฌ๊ฑด์ด ๋‹ตํ•˜๋Š” ๋‹ค์„ฏ ๊ฐ€์ง€ โ€” ๋ฌด์—‡์„ยท์–ด๋””์„œยท์–ธ์ œยท์™œ, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ฑฐ๋ž˜๋กœ. */\nconst FIELDS: Isa95Concept[] = [\n {\n std: 'epcList / quantityList',\n part: 'fields',\n label: 'twin.epcis.identity',\n axis: 'items',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.identity'\n },\n {\n std: 'bizStep / disposition (CBV)',\n part: 'fields',\n label: 'twin.epcis.cbv',\n axis: null,\n shownOn: ['items', 'tasks'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.cbv'\n },\n {\n std: 'readPoint / bizLocation',\n part: 'fields',\n label: 'twin.epcis.where',\n axis: 'locations',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.where'\n },\n {\n std: 'bizTransactionList',\n part: 'fields',\n label: 'twin.epcis.bizTransaction',\n axis: 'orders',\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.bizTransaction'\n },\n {\n std: 'ilmd',\n part: 'fields',\n label: 'twin.epcis.ilmd',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.ilmd'\n },\n {\n std: 'errorDeclaration',\n part: 'fields',\n label: 'twin.epcis.errorDeclaration',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'partial',\n surface: 'none',\n note: 'twin.epcis.note.errorDeclaration'\n },\n /* ๋ชจ์–‘๋งŒ ์žˆ๊ณ  ์•„๋ฌด๋„ ์ฑ„์šฐ์ง€ ์•Š๋Š” ๊ฒƒ๋“ค โ€” ๊ตฌ์กฐ๋งŒ ์žˆ์Œ. */\n {\n std: 'sourceList / destinationList',\n part: 'fields',\n label: 'twin.epcis.sourceDestination',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.sourceDestination'\n },\n {\n std: 'persistentDisposition',\n part: 'fields',\n label: 'twin.epcis.persistentDisposition',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.persistentDisposition'\n },\n {\n std: 'sensorElementList',\n part: 'fields',\n label: 'twin.epcis.sensorElement',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.sensorElement'\n }\n]\n\nexport const EPCIS_CONCEPTS: Isa95Concept[] = [...EVENTS, ...FIELDS]\n\nexport function epcisCoverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const known = new Set(axes)\n const concepts = EPCIS_CONCEPTS.map(c => {\n const axisMissing = !!c.axis && !known.has(c.axis)\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c\n return axisMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing } : fixed\n })\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n model: 'GS1 EPCIS 2.0',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
1
+ {"version":3,"file":"epcis-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/epcis-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * GS1 EPCIS 2.0 ์ ํ•ฉ์„ฑ ๊ธฐ์ค€ โ€” **๋ฌผ๋ฅ˜ยท์ œ์กฐ ํŠธ์œˆ์ด ํ‘œ์ค€์˜ ์–ด๋””๋ฅผ ์ฑ„์šฐ๊ณ  ์žˆ๋‚˜.**\n *\n * โ”€โ”€ ์™œ ๋”ฐ๋กœ ์žˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ ํ•ฉ์„ฑ ํŒจ๋„์ด ISA-95 ํ•˜๋‚˜๋งŒ ๋งํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฐฝ๊ณ ยท์•ผ๋“œยท๊ณต์žฅ ํŠธ์œˆ์—์„œ ใ€Œ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋‚˜ใ€์™€\n * ใ€Œ์ด ๋ฒˆํ˜ธ๊ฐ€ ๋ฌด์—‡์„ ๊ฐ€๋ฆฌํ‚ค๋‚˜ใ€๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์€ EPCIS ๋‹ค. ISA-95 ํ‘œ๋งŒ ๋ณด์ด๋ฉด ๊ทธ ํŠธ์œˆ์ด ๊ธฐ๋Œ€๋Š” ๊ธฐ์ค€์˜\n * ์ ˆ๋ฐ˜์ด ํ™”๋ฉด์— ์—†๋‹ค.\n *\n * โ”€โ”€ ์ˆ˜์ค€์€ ๊ทผ๊ฑฐ๋ฅผ ๋ณด๊ณ  ์ ์—ˆ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ใ€Œ์žˆ๋‹ค/์—†๋‹คใ€๋ฅผ ๊ธฐ์–ต์œผ๋กœ ์ ์ง€ ์•Š๋Š”๋‹ค. ๊ฐ ์ค„์˜ ํŒ๋‹จ ๊ทผ๊ฑฐ:\n * ยท ํƒ€์ž… ์„ ์–ธ โ€” ์ปค๋„ `epcis.ts`(์ด๋ฒคํŠธยทํ•„๋“œ์˜ ๋ชจ์–‘)\n * ยท ์‹ค์ œ ์‚ฌ์šฉ โ€” ์ปค๋„ ๋„๋ฉ”์ธ(`mes-kernel`ยท`face2-adapter`ยท`observed-reducer`)๊ณผ ํ˜ธ์ŠคํŠธ ์ธ์ œ์ŠคํŠธ\n * ยท ํ™”๋ฉด ๋…ธ์ถœ โ€” ์ €๋„ยท๊ณ„๋ณดยท์—”ํ‹ฐํ‹ฐ 360\n * ๋ชจ์–‘๋งŒ ์žˆ๊ณ  ์•„๋ฌด๋„ ์ฑ„์šฐ์ง€ ์•Š๋Š” ํ•„๋“œ๋Š” **๊ตฌ์กฐ๋งŒ ์žˆ์Œ**์œผ๋กœ ์ ๋Š”๋‹ค(๊ทธ๊ฒŒ ์‚ฌ์‹ค์ด๋‹ค).\n *\n * ISA-95 ํ‘œ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๋‹ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์‚ฌ๋žŒ์ด ํŒ๋‹จํ•ด ์ ๊ณ , ํ‹€๋ฆฌ๋ฉด ์—ฌ๊ธฐ๋ฅผ ๊ณ ์นœ๋‹ค.\n */\nimport { reconcileAxes, type Isa95Concept, type CoverageLevel } from './isa95-coverage.js'\n\n/* Part: EPCIS 2.0 ์˜ ์‚ฌ๊ฑด ์ข…๋ฅ˜ โ€” ๋ฌด์—‡์ด ์ผ์–ด๋‚ฌ๋Š”๊ฐ€. */\nconst EVENTS: Isa95Concept[] = [\n {\n std: 'ObjectEvent',\n part: 'events',\n label: 'twin.epcis.ObjectEvent',\n axis: 'items',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.ObjectEvent'\n },\n {\n std: 'AggregationEvent',\n part: 'events',\n label: 'twin.epcis.AggregationEvent',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.AggregationEvent'\n },\n {\n std: 'TransactionEvent',\n part: 'events',\n label: 'twin.epcis.TransactionEvent',\n axis: 'orders',\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.TransactionEvent'\n },\n {\n std: 'TransformationEvent',\n part: 'events',\n label: 'twin.epcis.TransformationEvent',\n axis: null,\n shownOn: ['items', 'operations'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.TransformationEvent'\n },\n /* EPCIS 2.0 ์ด ๋”ํ•œ ์‚ฌ๊ฑด โ€” ์šฐ๋ฆฌ๋Š” ํƒ€์ž…์กฐ์ฐจ ๋‘์ง€ ์•Š์•˜๋‹ค. ์—†๋Š” ๊ฒƒ์€ ์—†๋‹ค๊ณ  ์ ๋Š”๋‹ค. */\n {\n std: 'AssociationEvent',\n part: 'events',\n label: 'twin.epcis.AssociationEvent',\n axis: null,\n structure: 'none',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.AssociationEvent'\n }\n]\n\n/* Part: ์‚ฌ๊ฑด์ด ๋‹ตํ•˜๋Š” ๋‹ค์„ฏ ๊ฐ€์ง€ โ€” ๋ฌด์—‡์„ยท์–ด๋””์„œยท์–ธ์ œยท์™œ, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ฑฐ๋ž˜๋กœ. */\nconst FIELDS: Isa95Concept[] = [\n {\n std: 'epcList / quantityList',\n part: 'fields',\n label: 'twin.epcis.identity',\n axis: 'items',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.identity'\n },\n {\n std: 'bizStep / disposition (CBV)',\n part: 'fields',\n label: 'twin.epcis.cbv',\n axis: null,\n shownOn: ['items', 'tasks'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.cbv'\n },\n {\n std: 'readPoint / bizLocation',\n part: 'fields',\n label: 'twin.epcis.where',\n axis: 'locations',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.epcis.note.where'\n },\n {\n std: 'bizTransactionList',\n part: 'fields',\n label: 'twin.epcis.bizTransaction',\n axis: 'orders',\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.bizTransaction'\n },\n {\n std: 'ilmd',\n part: 'fields',\n label: 'twin.epcis.ilmd',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'full',\n surface: 'partial',\n note: 'twin.epcis.note.ilmd'\n },\n {\n std: 'errorDeclaration',\n part: 'fields',\n label: 'twin.epcis.errorDeclaration',\n axis: null,\n shownOn: ['items'],\n structure: 'full',\n behavior: 'partial',\n surface: 'none',\n note: 'twin.epcis.note.errorDeclaration'\n },\n /* ๋ชจ์–‘๋งŒ ์žˆ๊ณ  ์•„๋ฌด๋„ ์ฑ„์šฐ์ง€ ์•Š๋Š” ๊ฒƒ๋“ค โ€” ๊ตฌ์กฐ๋งŒ ์žˆ์Œ. */\n {\n std: 'sourceList / destinationList',\n part: 'fields',\n label: 'twin.epcis.sourceDestination',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.sourceDestination'\n },\n {\n std: 'persistentDisposition',\n part: 'fields',\n label: 'twin.epcis.persistentDisposition',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.persistentDisposition'\n },\n {\n std: 'sensorElementList',\n part: 'fields',\n label: 'twin.epcis.sensorElement',\n axis: null,\n structure: 'partial',\n behavior: 'none',\n surface: 'none',\n note: 'twin.epcis.note.sensorElement'\n }\n]\n\nexport const EPCIS_CONCEPTS: Isa95Concept[] = [...EVENTS, ...FIELDS]\n\nexport function epcisCoverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const concepts = EPCIS_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)))\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n model: 'GS1 EPCIS 2.0',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Isa95Concept } from './isa95-coverage.js';
1
+ import { type Isa95Concept } from './isa95-coverage.js';
2
2
  export declare const IEC61850_CONCEPTS: Isa95Concept[];
3
3
  export declare function iec61850Coverage(axes: string[]): {
4
4
  model: string;
@@ -2,6 +2,23 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IEC61850_CONCEPTS = void 0;
4
4
  exports.iec61850Coverage = iec61850Coverage;
5
+ /*
6
+ * IEC 61850 ์ ํ•ฉ์„ฑ ๊ธฐ์ค€ โ€” **์—๋„ˆ์ง€ ํŠธ์œˆ์ด ํ‘œ์ค€์˜ ์–ด๋””๋ฅผ ์ฑ„์šฐ๊ณ  ์žˆ๋‚˜.**
7
+ *
8
+ * โ”€โ”€ ์™œ ๋”ฐ๋กœ ์žˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
9
+ * ์ธ์ŠคํŽ™์…˜์˜ ์ ํ•ฉ์„ฑ ํŒจ๋„์€ ํŠธ์œˆ ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ISA-95 ํ•˜๋‚˜๋งŒ ๋งํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์—๋„ˆ์ง€ ํŠธ์œˆ์—์„œ ๊ทธ๊ฒƒ์€
10
+ * ๊ฑฐ์ง“์€ ์•„๋‹ˆ์ง€๋งŒ(์„ค๋น„ยท๊ณ„์ธตยท์†์„ฑ์€ ์—๋„ˆ์ง€์—์„œ๋„ ISA-95 ์ž์›์ด๋‹ค) **๋ถ€์กฑํ•˜๋‹ค** โ€” ๊ณ„๋Ÿ‰๊ธฐยท์ฐจ๋‹จ๊ธฐยทํƒœ์–‘๊ด‘ยท
11
+ * ์ถ•์ „์ง€์˜ ์–ดํœ˜๋ฅผ ์ฃผ๋Š” ๊ฒƒ์€ IEC 61850 ์ด๊ณ , ๋ฌด์—‡์ด ๋น„์—ˆ๋Š”์ง€๋„ ๊ทธ ๋ชฉ๋ก์œผ๋กœ๋งŒ ์…€ ์ˆ˜ ์žˆ๋‹ค.
12
+ *
13
+ * โ”€โ”€ ์ฃผ์žฅ ์ˆ˜์ค€์„ ๋ชป ๋ฐ•๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
14
+ * ์—ฌ๊ธฐ์„œ ์žฌ๋Š” ๊ฒƒ์€ **์–ดํœ˜์™€ ๋ชจ๋ธ**์ด๋‹ค. ํ”„๋กœํ† ์ฝœ(MMSยทGOOSEยท์ƒ˜ํ”Œ๋“œ๊ฐ’)์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋ฉฐ,
15
+ * ๊ทธ ์ฃผ์žฅ์€ ์ ํ•ฉ์„ฑ ์‹œํ—˜์ด ๋’ท๋ฐ›์นจํ•ด์•ผ ํ•œ๋‹ค. ํ‘œ ์ด๋ฆ„์„ ใ€ŒIEC 61850 (vocabulary)ใ€๋กœ ์“ฐ๋Š” ์ด์œ ๋‹ค.
16
+ *
17
+ * โ”€โ”€ ๊ฐ’์€ ๊ด€์ธก์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ์ด๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
18
+ * ISA-95 ํ‘œ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๋‹ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์‚ฌ๋žŒ์ด ํŒ๋‹จํ•ด ์ ๊ณ , ํ‹€๋ฆฌ๋ฉด ์—ฌ๊ธฐ๋ฅผ ๊ณ ์นœ๋‹ค.
19
+ * ์ž๋™์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ํ•˜๋‚˜๋งŒ ์ž๋™์œผ๋กœ ํ•œ๋‹ค โ€” ์ถ• ์ด๋ฆ„์ด ์ปค๋„ ์ถ• ๋ชฉ๋ก์— ์—†์œผ๋ฉด ๊ตฌ์กฐ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค.
20
+ */
21
+ const isa95_coverage_js_1 = require("./isa95-coverage.js");
5
22
  /*
6
23
  * Part 7-4 โ€” ๋…ผ๋ฆฌ ๋…ธ๋“œ ํด๋ž˜์Šค. ์ด ํ”„๋กœํŒŒ์ผ์ด ์“ฐ๋Š” ๊ฒƒ๋งŒ ์ ๋Š”๋‹ค(ํ‘œ์ค€ ์ „์ฒด๋ฅผ ์˜ฎ๊ธฐ์ง€ ์•Š๋Š”๋‹ค):
7
24
  * ๊ณ„๋Ÿ‰ยท๊ณ„์ธกยท๊ฐœํยท๋ฐœ์ „ยท์ €์žฅ.
@@ -80,13 +97,7 @@ const LOGICAL_NODES = [
80
97
  ];
81
98
  exports.IEC61850_CONCEPTS = [...LOGICAL_NODES]; // vocabulary-guard: allow โ€” ํ‘œ์ค€ ์šฉ์–ด(์œ„ ์ฃผ์„)
82
99
  function iec61850Coverage(axes) {
83
- const known = new Set(axes);
84
- const concepts = exports.IEC61850_CONCEPTS.map(c => {
85
- const axisMissing = !!c.axis && !known.has(c.axis);
86
- const shownOn = c.shownOn?.filter(a => known.has(a));
87
- const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
88
- return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
89
- });
100
+ const concepts = exports.IEC61850_CONCEPTS.map(c => (0, isa95_coverage_js_1.reconcileAxes)(c, new Set(axes)));
90
101
  const count = (k) => concepts.filter(c => c[k] === 'full').length;
91
102
  return {
92
103
  /* ์ด๋ฆ„์— (vocabulary) ๋ฅผ ๋‹ฌ์•„ ๋‘”๋‹ค โ€” ํ”„๋กœํ† ์ฝœ ์ ํ•ฉ์„ฑ์œผ๋กœ ์ฝํžˆ์ง€ ์•Š๊ฒŒ. */
@@ -1 +1 @@
1
- {"version":3,"file":"iec61850-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/iec61850-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * IEC 61850 ์ ํ•ฉ์„ฑ ๊ธฐ์ค€ โ€” **์—๋„ˆ์ง€ ํŠธ์œˆ์ด ํ‘œ์ค€์˜ ์–ด๋””๋ฅผ ์ฑ„์šฐ๊ณ  ์žˆ๋‚˜.**\n *\n * โ”€โ”€ ์™œ ๋”ฐ๋กœ ์žˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ธ์ŠคํŽ™์…˜์˜ ์ ํ•ฉ์„ฑ ํŒจ๋„์€ ํŠธ์œˆ ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ISA-95 ํ•˜๋‚˜๋งŒ ๋งํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์—๋„ˆ์ง€ ํŠธ์œˆ์—์„œ ๊ทธ๊ฒƒ์€\n * ๊ฑฐ์ง“์€ ์•„๋‹ˆ์ง€๋งŒ(์„ค๋น„ยท๊ณ„์ธตยท์†์„ฑ์€ ์—๋„ˆ์ง€์—์„œ๋„ ISA-95 ์ž์›์ด๋‹ค) **๋ถ€์กฑํ•˜๋‹ค** โ€” ๊ณ„๋Ÿ‰๊ธฐยท์ฐจ๋‹จ๊ธฐยทํƒœ์–‘๊ด‘ยท\n * ์ถ•์ „์ง€์˜ ์–ดํœ˜๋ฅผ ์ฃผ๋Š” ๊ฒƒ์€ IEC 61850 ์ด๊ณ , ๋ฌด์—‡์ด ๋น„์—ˆ๋Š”์ง€๋„ ๊ทธ ๋ชฉ๋ก์œผ๋กœ๋งŒ ์…€ ์ˆ˜ ์žˆ๋‹ค.\n *\n * โ”€โ”€ ์ฃผ์žฅ ์ˆ˜์ค€์„ ๋ชป ๋ฐ•๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์—ฌ๊ธฐ์„œ ์žฌ๋Š” ๊ฒƒ์€ **์–ดํœ˜์™€ ๋ชจ๋ธ**์ด๋‹ค. ํ”„๋กœํ† ์ฝœ(MMSยทGOOSEยท์ƒ˜ํ”Œ๋“œ๊ฐ’)์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋ฉฐ,\n * ๊ทธ ์ฃผ์žฅ์€ ์ ํ•ฉ์„ฑ ์‹œํ—˜์ด ๋’ท๋ฐ›์นจํ•ด์•ผ ํ•œ๋‹ค. ํ‘œ ์ด๋ฆ„์„ ใ€ŒIEC 61850 (vocabulary)ใ€๋กœ ์“ฐ๋Š” ์ด์œ ๋‹ค.\n *\n * โ”€โ”€ ๊ฐ’์€ ๊ด€์ธก์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ์ด๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ISA-95 ํ‘œ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๋‹ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์‚ฌ๋žŒ์ด ํŒ๋‹จํ•ด ์ ๊ณ , ํ‹€๋ฆฌ๋ฉด ์—ฌ๊ธฐ๋ฅผ ๊ณ ์นœ๋‹ค.\n * ์ž๋™์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ํ•˜๋‚˜๋งŒ ์ž๋™์œผ๋กœ ํ•œ๋‹ค โ€” ์ถ• ์ด๋ฆ„์ด ์ปค๋„ ์ถ• ๋ชฉ๋ก์— ์—†์œผ๋ฉด ๊ตฌ์กฐ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค.\n */\nimport type { Isa95Concept, CoverageLevel } from './isa95-coverage.js'\n\n/*\n * Part 7-4 โ€” ๋…ผ๋ฆฌ ๋…ธ๋“œ ํด๋ž˜์Šค. ์ด ํ”„๋กœํŒŒ์ผ์ด ์“ฐ๋Š” ๊ฒƒ๋งŒ ์ ๋Š”๋‹ค(ํ‘œ์ค€ ์ „์ฒด๋ฅผ ์˜ฎ๊ธฐ์ง€ ์•Š๋Š”๋‹ค):\n * ๊ณ„๋Ÿ‰ยท๊ณ„์ธกยท๊ฐœํยท๋ฐœ์ „ยท์ €์žฅ.\n */\nconst LOGICAL_NODES: Isa95Concept[] = [ // vocabulary-guard: allow โ€” IEC 61850 ์˜ ใ€Œ๋…ผ๋ฆฌ ๋…ธ๋“œ(logical node)ใ€๋Š” ํ‘œ์ค€ ์šฉ์–ด๋‹ค(์šฐ๋ฆฌ๊ฐ€ ์€ํ‡ด์‹œํ‚จ node ์–ดํœ˜๊ฐ€ ์•„๋‹ˆ๋‹ค)\n /*\n * ๊ณ„๋Ÿ‰(์ ์‚ฐ) โ€” ์ปค๋„ฅํ„ฐ๊ฐ€ ๋ˆ„์  ์ „๋ ฅ๋Ÿ‰์„ ์‹ค์–ด ์˜ค๊ณ  ์ƒํƒœ๊ฐ€ ์ง€์ ๋ณ„๋กœ ๋“ค๊ณ  ์žˆ๋‹ค. ํ™”๋ฉด์€ ๊ณ„๋Ÿ‰ ์ปดํฌ๋„ŒํŠธ๊ฐ€\n * ์ง€์ ์˜ ๊ฐ’์„ ๋ณด์ธ๋‹ค.\n */\n {\n std: 'MMTR',\n part: '7-4',\n label: 'twin.iec61850.MMTR',\n axis: 'equipment',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.MMTR'\n },\n /*\n * ๊ณ„์ธก(์œ ํšจ์ „๋ ฅยท์—ญ๋ฅ ) โ€” ํ‘œ๋ณธ์ด ์ˆ˜์š” ๊ตฌ๊ฐ„์œผ๋กœ ์ ‘ํžˆ๊ณ , ๊ตฌ๊ฐ„ยทํ”ผํฌยท๊ณ„์•ฝ ๋Œ€๋น„๊ฐ€ ๊ทธ ์œ„์— ์„ ๋‹ค.\n * ์ด ํ”„๋กœํŒŒ์ผ์—์„œ ๊ฐ€์žฅ ๋‘๊ป๊ฒŒ ์ฑ„์šด ์ž๋ฆฌ๋‹ค.\n */\n {\n std: 'MMXU',\n part: '7-4',\n label: 'twin.iec61850.MMXU',\n axis: 'demandWindows',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.MMXU'\n },\n /*\n * โ”€โ”€ ์…‹์ด ํ•จ๊ป˜ ์˜ฌ๋ผ๊ฐ”๋‹ค (2026-08-15) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๊ฐœํยท๋ฐœ์ „ยท์ €์žฅ์€ ์˜ค๋ž˜ ใ€Œ๊ตฌ์กฐ๋งŒ ์žˆ์Œใ€์ด์—ˆ๋‹ค. ๋Šฅ๋ ฅ์ด ์ƒํƒœ ํ•„๋“œ๋ฅผ ์„ ์–ธํ•ด ๋‘์—ˆ๋Š”๋ฐ **๊ฐ’์„ ๋ฐ›๋Š” ๋ฌธ์ด\n * ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ**์ด๋‹ค. ์ด์ œ ์…‹ ๋‹ค ์‹ค์ œ๋กœ ๋ˆ๋‹ค: ์„ค๋น„ ์ƒํƒœ๊ฐ€ ๊ณ„์•ฝ์— ์„œ๊ณ (`EquipmentState`), ์ปค๋„์ด\n * `energy.equipment` ๋กœ ๋ฐ›์•„ ๊ทธ ์„ค๋น„์— ์ ๊ณ , ์”ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ทธ๋ฆฐ๋‹ค.\n *\n * ์„ธ ์ธต์„ ํ•จ๊ป˜ ์˜ฌ๋ฆฌ๋Š” ์ด์œ : ๊ฐ’์ด ์—†๋Š”๋ฐ ํ™”๋ฉด๋งŒ ๋งŒ๋“ค๋ฉด ์˜์›ํžˆ ใ€Œโ€”ใ€์ธ ์นด๋“œ๊ฐ€ ๋˜๊ณ , ํ™”๋ฉด์ด ์—†๋Š”๋ฐ\n * ๊ธฐ๋Šฅ๋งŒ ์˜ฌ๋ฆฌ๋ฉด ์•„๋ฌด๋„ ๊ทธ ๊ฐ’์„ ๋ณด์ง€ ๋ชปํ•œ๋‹ค. ใ€Œ๊ฐ’์ด ๋จผ์ €, ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ ๋‹ค์Œใ€์˜ ๊ฒฐ๊ณผ๋‹ค.\n */\n {\n std: 'XCBR',\n part: '7-4',\n label: 'twin.iec61850.XCBR',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.XCBR'\n },\n {\n std: 'DPVA',\n part: '7-4',\n label: 'twin.iec61850.DPVA',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.DPVA'\n },\n {\n std: 'ZBAT',\n part: '7-4',\n label: 'twin.iec61850.ZBAT',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.ZBAT'\n }\n]\n\nexport const IEC61850_CONCEPTS: Isa95Concept[] = [...LOGICAL_NODES] // vocabulary-guard: allow โ€” ํ‘œ์ค€ ์šฉ์–ด(์œ„ ์ฃผ์„)\n\nexport function iec61850Coverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const known = new Set(axes)\n const concepts = IEC61850_CONCEPTS.map(c => {\n const axisMissing = !!c.axis && !known.has(c.axis)\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c\n return axisMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing } : fixed\n })\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n /* ์ด๋ฆ„์— (vocabulary) ๋ฅผ ๋‹ฌ์•„ ๋‘”๋‹ค โ€” ํ”„๋กœํ† ์ฝœ ์ ํ•ฉ์„ฑ์œผ๋กœ ์ฝํžˆ์ง€ ์•Š๊ฒŒ. */\n model: 'IEC 61850 (vocabulary)',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
1
+ {"version":3,"file":"iec61850-coverage.js","sourceRoot":"","sources":["../../../server/service/twin-model/iec61850-coverage.ts"],"names":[],"mappings":";;;AAiGA,4CAaC;AA9GD;;;;;;;;;;;;;;;GAeG;AACH,2DAA0F;AAE1F;;;GAGG;AACH,MAAM,aAAa,GAAmB;IACpC;;;OAGG;IACH;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;IACD;;;OAGG;IACH;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;IACD;;;;;;;;OAQG;IACH;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yBAAyB;KAChC;CACF,CAAA;AAEY,QAAA,iBAAiB,GAAmB,CAAC,GAAG,aAAa,CAAC,CAAA,CAAC,wCAAwC;AAE5G,SAAgB,gBAAgB,CAAC,IAAc;IAK7C,MAAM,QAAQ,GAAG,yBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,iCAAa,EAAC,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC5E,MAAM,KAAK,GAAG,CAAC,CAAuC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,CAAA;IACvG,OAAO;QACL,mDAAmD;QACnD,KAAK,EAAE,wBAAwB;QAC/B,QAAQ;QACR,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;KAC7H,CAAA;AACH,CAAC","sourcesContent":["/*\n * IEC 61850 ์ ํ•ฉ์„ฑ ๊ธฐ์ค€ โ€” **์—๋„ˆ์ง€ ํŠธ์œˆ์ด ํ‘œ์ค€์˜ ์–ด๋””๋ฅผ ์ฑ„์šฐ๊ณ  ์žˆ๋‚˜.**\n *\n * โ”€โ”€ ์™œ ๋”ฐ๋กœ ์žˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ธ์ŠคํŽ™์…˜์˜ ์ ํ•ฉ์„ฑ ํŒจ๋„์€ ํŠธ์œˆ ์ข…๋ฅ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ISA-95 ํ•˜๋‚˜๋งŒ ๋งํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์—๋„ˆ์ง€ ํŠธ์œˆ์—์„œ ๊ทธ๊ฒƒ์€\n * ๊ฑฐ์ง“์€ ์•„๋‹ˆ์ง€๋งŒ(์„ค๋น„ยท๊ณ„์ธตยท์†์„ฑ์€ ์—๋„ˆ์ง€์—์„œ๋„ ISA-95 ์ž์›์ด๋‹ค) **๋ถ€์กฑํ•˜๋‹ค** โ€” ๊ณ„๋Ÿ‰๊ธฐยท์ฐจ๋‹จ๊ธฐยทํƒœ์–‘๊ด‘ยท\n * ์ถ•์ „์ง€์˜ ์–ดํœ˜๋ฅผ ์ฃผ๋Š” ๊ฒƒ์€ IEC 61850 ์ด๊ณ , ๋ฌด์—‡์ด ๋น„์—ˆ๋Š”์ง€๋„ ๊ทธ ๋ชฉ๋ก์œผ๋กœ๋งŒ ์…€ ์ˆ˜ ์žˆ๋‹ค.\n *\n * โ”€โ”€ ์ฃผ์žฅ ์ˆ˜์ค€์„ ๋ชป ๋ฐ•๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์—ฌ๊ธฐ์„œ ์žฌ๋Š” ๊ฒƒ์€ **์–ดํœ˜์™€ ๋ชจ๋ธ**์ด๋‹ค. ํ”„๋กœํ† ์ฝœ(MMSยทGOOSEยท์ƒ˜ํ”Œ๋“œ๊ฐ’)์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋ฉฐ,\n * ๊ทธ ์ฃผ์žฅ์€ ์ ํ•ฉ์„ฑ ์‹œํ—˜์ด ๋’ท๋ฐ›์นจํ•ด์•ผ ํ•œ๋‹ค. ํ‘œ ์ด๋ฆ„์„ ใ€ŒIEC 61850 (vocabulary)ใ€๋กœ ์“ฐ๋Š” ์ด์œ ๋‹ค.\n *\n * โ”€โ”€ ๊ฐ’์€ ๊ด€์ธก์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ์ด๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ISA-95 ํ‘œ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๋‹ค(`isa95-coverage.ts` ๋จธ๋ฆฌ๋ง): ์‚ฌ๋žŒ์ด ํŒ๋‹จํ•ด ์ ๊ณ , ํ‹€๋ฆฌ๋ฉด ์—ฌ๊ธฐ๋ฅผ ๊ณ ์นœ๋‹ค.\n * ์ž๋™์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ํ•˜๋‚˜๋งŒ ์ž๋™์œผ๋กœ ํ•œ๋‹ค โ€” ์ถ• ์ด๋ฆ„์ด ์ปค๋„ ์ถ• ๋ชฉ๋ก์— ์—†์œผ๋ฉด ๊ตฌ์กฐ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค.\n */\nimport { reconcileAxes, type Isa95Concept, type CoverageLevel } from './isa95-coverage.js'\n\n/*\n * Part 7-4 โ€” ๋…ผ๋ฆฌ ๋…ธ๋“œ ํด๋ž˜์Šค. ์ด ํ”„๋กœํŒŒ์ผ์ด ์“ฐ๋Š” ๊ฒƒ๋งŒ ์ ๋Š”๋‹ค(ํ‘œ์ค€ ์ „์ฒด๋ฅผ ์˜ฎ๊ธฐ์ง€ ์•Š๋Š”๋‹ค):\n * ๊ณ„๋Ÿ‰ยท๊ณ„์ธกยท๊ฐœํยท๋ฐœ์ „ยท์ €์žฅ.\n */\nconst LOGICAL_NODES: Isa95Concept[] = [ // vocabulary-guard: allow โ€” IEC 61850 ์˜ ใ€Œ๋…ผ๋ฆฌ ๋…ธ๋“œ(logical node)ใ€๋Š” ํ‘œ์ค€ ์šฉ์–ด๋‹ค(์šฐ๋ฆฌ๊ฐ€ ์€ํ‡ด์‹œํ‚จ node ์–ดํœ˜๊ฐ€ ์•„๋‹ˆ๋‹ค)\n /*\n * ๊ณ„๋Ÿ‰(์ ์‚ฐ) โ€” ์ปค๋„ฅํ„ฐ๊ฐ€ ๋ˆ„์  ์ „๋ ฅ๋Ÿ‰์„ ์‹ค์–ด ์˜ค๊ณ  ์ƒํƒœ๊ฐ€ ์ง€์ ๋ณ„๋กœ ๋“ค๊ณ  ์žˆ๋‹ค. ํ™”๋ฉด์€ ๊ณ„๋Ÿ‰ ์ปดํฌ๋„ŒํŠธ๊ฐ€\n * ์ง€์ ์˜ ๊ฐ’์„ ๋ณด์ธ๋‹ค.\n */\n {\n std: 'MMTR',\n part: '7-4',\n label: 'twin.iec61850.MMTR',\n axis: 'equipment',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.MMTR'\n },\n /*\n * ๊ณ„์ธก(์œ ํšจ์ „๋ ฅยท์—ญ๋ฅ ) โ€” ํ‘œ๋ณธ์ด ์ˆ˜์š” ๊ตฌ๊ฐ„์œผ๋กœ ์ ‘ํžˆ๊ณ , ๊ตฌ๊ฐ„ยทํ”ผํฌยท๊ณ„์•ฝ ๋Œ€๋น„๊ฐ€ ๊ทธ ์œ„์— ์„ ๋‹ค.\n * ์ด ํ”„๋กœํŒŒ์ผ์—์„œ ๊ฐ€์žฅ ๋‘๊ป๊ฒŒ ์ฑ„์šด ์ž๋ฆฌ๋‹ค.\n */\n {\n std: 'MMXU',\n part: '7-4',\n label: 'twin.iec61850.MMXU',\n axis: 'demandWindows',\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.MMXU'\n },\n /*\n * โ”€โ”€ ์…‹์ด ํ•จ๊ป˜ ์˜ฌ๋ผ๊ฐ”๋‹ค (2026-08-15) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๊ฐœํยท๋ฐœ์ „ยท์ €์žฅ์€ ์˜ค๋ž˜ ใ€Œ๊ตฌ์กฐ๋งŒ ์žˆ์Œใ€์ด์—ˆ๋‹ค. ๋Šฅ๋ ฅ์ด ์ƒํƒœ ํ•„๋“œ๋ฅผ ์„ ์–ธํ•ด ๋‘์—ˆ๋Š”๋ฐ **๊ฐ’์„ ๋ฐ›๋Š” ๋ฌธ์ด\n * ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ**์ด๋‹ค. ์ด์ œ ์…‹ ๋‹ค ์‹ค์ œ๋กœ ๋ˆ๋‹ค: ์„ค๋น„ ์ƒํƒœ๊ฐ€ ๊ณ„์•ฝ์— ์„œ๊ณ (`EquipmentState`), ์ปค๋„์ด\n * `energy.equipment` ๋กœ ๋ฐ›์•„ ๊ทธ ์„ค๋น„์— ์ ๊ณ , ์”ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ทธ๋ฆฐ๋‹ค.\n *\n * ์„ธ ์ธต์„ ํ•จ๊ป˜ ์˜ฌ๋ฆฌ๋Š” ์ด์œ : ๊ฐ’์ด ์—†๋Š”๋ฐ ํ™”๋ฉด๋งŒ ๋งŒ๋“ค๋ฉด ์˜์›ํžˆ ใ€Œโ€”ใ€์ธ ์นด๋“œ๊ฐ€ ๋˜๊ณ , ํ™”๋ฉด์ด ์—†๋Š”๋ฐ\n * ๊ธฐ๋Šฅ๋งŒ ์˜ฌ๋ฆฌ๋ฉด ์•„๋ฌด๋„ ๊ทธ ๊ฐ’์„ ๋ณด์ง€ ๋ชปํ•œ๋‹ค. ใ€Œ๊ฐ’์ด ๋จผ์ €, ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ ๋‹ค์Œใ€์˜ ๊ฒฐ๊ณผ๋‹ค.\n */\n {\n std: 'XCBR',\n part: '7-4',\n label: 'twin.iec61850.XCBR',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.XCBR'\n },\n {\n std: 'DPVA',\n part: '7-4',\n label: 'twin.iec61850.DPVA',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.DPVA'\n },\n {\n std: 'ZBAT',\n part: '7-4',\n label: 'twin.iec61850.ZBAT',\n axis: null,\n shownOn: ['equipment'],\n structure: 'full',\n behavior: 'full',\n surface: 'full',\n note: 'twin.iec61850.note.ZBAT'\n }\n]\n\nexport const IEC61850_CONCEPTS: Isa95Concept[] = [...LOGICAL_NODES] // vocabulary-guard: allow โ€” ํ‘œ์ค€ ์šฉ์–ด(์œ„ ์ฃผ์„)\n\nexport function iec61850Coverage(axes: string[]): {\n model: string\n concepts: (Isa95Concept & { axisMissing?: boolean })[]\n totals: { concepts: number; structure: number; behavior: number; surface: number }\n} {\n const concepts = IEC61850_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)))\n const count = (k: 'structure' | 'behavior' | 'surface') => concepts.filter(c => c[k] === 'full').length\n return {\n /* ์ด๋ฆ„์— (vocabulary) ๋ฅผ ๋‹ฌ์•„ ๋‘”๋‹ค โ€” ํ”„๋กœํ† ์ฝœ ์ ํ•ฉ์„ฑ์œผ๋กœ ์ฝํžˆ์ง€ ์•Š๊ฒŒ. */\n model: 'IEC 61850 (vocabulary)',\n concepts,\n totals: { concepts: concepts.length, structure: count('structure'), behavior: count('behavior'), surface: count('surface') }\n }\n}\n"]}
@@ -34,6 +34,20 @@ export declare const ISA95_CONCEPTS: Isa95Concept[];
34
34
  * `axis` ๋ฅผ ์ปค๋„ ์ถ• ๋ชฉ๋ก๊ณผ ๋งž์ถฐ ๋ณธ๋‹ค: ์ถ•์ด ์žˆ๋‹ค๊ณ  ์ ํ˜€ ์žˆ๋Š”๋ฐ ์ปค๋„์— ์—†์œผ๋ฉด ๊ทธ ์„ ์–ธ์ด ๋‚ก์€ ๊ฒƒ์ด๋ฏ€๋กœ
35
35
  * **๊ตฌ์กฐ ์—†์Œ์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค**(์กฐ์šฉํžˆ ํ†ต๊ณผ์‹œํ‚ค๋ฉด ์ด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค).
36
36
  */
37
+ /**
38
+ * ์„ ์–ธํ•œ ์ถ•์„ ์ปค๋„์˜ ์ถ• ๋ชฉ๋ก๊ณผ ๋งž์ถ˜๋‹ค โ€” **์–ด๊ธ‹๋‚œ ๊ฒƒ์„ ์กฐ์šฉํžˆ ์ง€์šฐ์ง€ ์•Š๋Š”๋‹ค.**
39
+ *
40
+ * ๋‘ ์ž๋ฆฌ๊ฐ€ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋‹ค.
41
+ * ยท `axis` โ€” ๊ทธ ๊ฐœ๋… ์ž์‹ ์˜ ๋ฌธ. ์ปค๋„์— ์—†์œผ๋ฉด ๊ตฌ์กฐ๋ฅผ ใ€Œ์—†์Œใ€์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค.
42
+ * ยท `shownOn` โ€” ๊ทธ ์‚ฌ์‹ค์„ ๋“ค๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ถ•. ์˜ˆ์ „์—๋Š” ์—†๋Š” ์ถ•์„ **๋ง์—†์ด ๊ฑธ๋Ÿฌ ๋ƒˆ๋‹ค.** ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์ค„์€
43
+ * ใ€Œ๊ฐœ๋… ์ถ•์ด ์—†์Šต๋‹ˆ๋‹คใ€๋กœ ๋ณด์ด๊ณ , ์‚ฌ๋žŒ์€ ๊ทธ๊ฒƒ์„ **์›๋ž˜ ๊ทธ๋Ÿฐ ๊ฒƒ**์œผ๋กœ ์ฝ๋Š”๋‹ค. ์‹ค์ œ๋กœ ๊ทธ ์ผ์ด ์žˆ์—ˆ๋‹ค:
44
+ * EPCIS ํ‘œ์˜ ์ผ๊ณฑ ์ค„์ด ์ปค๋„์— ์—†๋Š” ์ถ•(`items`)์— ๊ธฐ๋Œ€๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ฒฝ๊ณ ๊ฐ€ ๋œฌ ๊ฒƒ์€ ๋‘ ์ค„๋ฟ์ด์—ˆ๋‹ค.
45
+ *
46
+ * ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์–ด๊ธ‹๋‚˜๋ฉด `axisMissing` ์ด๋‹ค โ€” ํ‘œ๊ฐ€ ์Šค์Šค๋กœ ใ€Œ์ตœ์‹ ์ด ์•„๋‹ˆ๋‹คใ€๋ผ๊ณ  ๋งํ•˜๊ฒŒ ํ•œ๋‹ค.
47
+ */
48
+ export declare function reconcileAxes(c: Isa95Concept, known: Set<string>): Isa95Concept & {
49
+ axisMissing?: boolean;
50
+ };
37
51
  export declare function isa95Coverage(axes: string[]): {
38
52
  model: string;
39
53
  concepts: (Isa95Concept & {
@@ -30,6 +30,7 @@
30
30
  */
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
32
  exports.ISA95_CONCEPTS = void 0;
33
+ exports.reconcileAxes = reconcileAxes;
33
34
  exports.isa95Coverage = isa95Coverage;
34
35
  /*
35
36
  * ๊ฐ€์šฉ ๋Šฅ๋ ฅ(2026-08-12, ์ปค๋„ 0.6.8) โ€” **ํŒ์ •๊ณผ ์ด์œ ๊ฐ€ ์ƒํƒœ์— ์‹ค๋ ค ์˜จ๋‹ค**(`capability {available, reason}`).
@@ -134,16 +135,29 @@ exports.ISA95_CONCEPTS = [...PART2, ...PART4];
134
135
  * `axis` ๋ฅผ ์ปค๋„ ์ถ• ๋ชฉ๋ก๊ณผ ๋งž์ถฐ ๋ณธ๋‹ค: ์ถ•์ด ์žˆ๋‹ค๊ณ  ์ ํ˜€ ์žˆ๋Š”๋ฐ ์ปค๋„์— ์—†์œผ๋ฉด ๊ทธ ์„ ์–ธ์ด ๋‚ก์€ ๊ฒƒ์ด๋ฏ€๋กœ
135
136
  * **๊ตฌ์กฐ ์—†์Œ์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค**(์กฐ์šฉํžˆ ํ†ต๊ณผ์‹œํ‚ค๋ฉด ์ด ํ‘œ๊ฐ€ ๊ฑฐ์ง“์ด ๋œ๋‹ค).
136
137
  */
138
+ /**
139
+ * ์„ ์–ธํ•œ ์ถ•์„ ์ปค๋„์˜ ์ถ• ๋ชฉ๋ก๊ณผ ๋งž์ถ˜๋‹ค โ€” **์–ด๊ธ‹๋‚œ ๊ฒƒ์„ ์กฐ์šฉํžˆ ์ง€์šฐ์ง€ ์•Š๋Š”๋‹ค.**
140
+ *
141
+ * ๋‘ ์ž๋ฆฌ๊ฐ€ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋‹ค.
142
+ * ยท `axis` โ€” ๊ทธ ๊ฐœ๋… ์ž์‹ ์˜ ๋ฌธ. ์ปค๋„์— ์—†์œผ๋ฉด ๊ตฌ์กฐ๋ฅผ ใ€Œ์—†์Œใ€์œผ๋กœ ๋‚ฎ์ถ”๊ณ  ๊ทธ ์‚ฌ์‹ค์„ ๋งํ•œ๋‹ค.
143
+ * ยท `shownOn` โ€” ๊ทธ ์‚ฌ์‹ค์„ ๋“ค๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์ถ•. ์˜ˆ์ „์—๋Š” ์—†๋Š” ์ถ•์„ **๋ง์—†์ด ๊ฑธ๋Ÿฌ ๋ƒˆ๋‹ค.** ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์ค„์€
144
+ * ใ€Œ๊ฐœ๋… ์ถ•์ด ์—†์Šต๋‹ˆ๋‹คใ€๋กœ ๋ณด์ด๊ณ , ์‚ฌ๋žŒ์€ ๊ทธ๊ฒƒ์„ **์›๋ž˜ ๊ทธ๋Ÿฐ ๊ฒƒ**์œผ๋กœ ์ฝ๋Š”๋‹ค. ์‹ค์ œ๋กœ ๊ทธ ์ผ์ด ์žˆ์—ˆ๋‹ค:
145
+ * EPCIS ํ‘œ์˜ ์ผ๊ณฑ ์ค„์ด ์ปค๋„์— ์—†๋Š” ์ถ•(`items`)์— ๊ธฐ๋Œ€๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ฒฝ๊ณ ๊ฐ€ ๋œฌ ๊ฒƒ์€ ๋‘ ์ค„๋ฟ์ด์—ˆ๋‹ค.
146
+ *
147
+ * ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์–ด๊ธ‹๋‚˜๋ฉด `axisMissing` ์ด๋‹ค โ€” ํ‘œ๊ฐ€ ์Šค์Šค๋กœ ใ€Œ์ตœ์‹ ์ด ์•„๋‹ˆ๋‹คใ€๋ผ๊ณ  ๋งํ•˜๊ฒŒ ํ•œ๋‹ค.
148
+ */
149
+ function reconcileAxes(c, known) {
150
+ const ownMissing = !!c.axis && !known.has(c.axis);
151
+ const shownOn = c.shownOn?.filter(a => known.has(a));
152
+ const lostShown = !!c.shownOn && (shownOn?.length ?? 0) !== c.shownOn.length;
153
+ const fixed = lostShown ? { ...c, shownOn } : c;
154
+ if (!ownMissing && !lostShown)
155
+ return fixed;
156
+ /* ๊ตฌ์กฐ๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์€ **์ž๊ธฐ ๋ฌธ์ด ์—†์–ด์ง„ ๊ฒฝ์šฐ**๋‹ค โ€” ๋‚จ์˜ ์ถ•์—์„œ ๋ณด์ด๋˜ ๊ฒƒ์€ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํ‘œ์‹œ์˜ ๋ฌธ์ œ๋‹ค. */
157
+ return ownMissing ? { ...fixed, structure: 'none', axisMissing: true } : { ...fixed, axisMissing: true };
158
+ }
137
159
  function isa95Coverage(axes) {
138
- const known = new Set(axes);
139
- const concepts = exports.ISA95_CONCEPTS.map(c => {
140
- const axisMissing = !!c.axis && !known.has(c.axis);
141
- /* ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ด ์—†์–ด์ง„ ์ถ•์€ **๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค** โ€” ์ฃฝ์€ ๋ฌธ์œผ๋กœ ๋ณด๋‚ด๋ฉด ํ™”๋ฉด์ด ๊ฑฐ์ง“๋ง์„ ํ•œ๋‹ค.
142
- `axis` ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๊ณ , ์—ฌ๊ธฐ๊ฐ€ ๋น„๋ฉด ๊ทธ ์ค„์€ ๋‹ค์‹œ "์ถ•์ด ์—†๋‹ค" ๋กœ ์ •์งํ•˜๊ฒŒ ๋Œ์•„๊ฐ„๋‹ค. */
143
- const shownOn = c.shownOn?.filter(a => known.has(a));
144
- const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c;
145
- return axisMissing ? { ...fixed, structure: 'none', axisMissing } : fixed;
146
- });
160
+ const concepts = exports.ISA95_CONCEPTS.map(c => reconcileAxes(c, new Set(axes)));
147
161
  /* ์ฑ„์šด ์ˆ˜๋Š” `full` ๋งŒ ์„ผ๋‹ค โ€” ๋ถ€๋ถ„์„ ์ฑ„์šด ๊ฒƒ์œผ๋กœ ์„ธ๋ฉด ๊ธฐ์ค€์ด ์Šค์Šค๋กœ๋ฅผ ์†์ธ๋‹ค. */
148
162
  const count = (k) => concepts.filter(c => c[k] === 'full').length;
149
163
  return {
@@ -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 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 /* ๋กœํŠธยท์„œ๋ธŒ๋กœํŠธ๋Š” ๊ฐœ์ฒด ์ถ•์ด ์•„๋‹ˆ๋ผ **๊ด€์ธก**์œผ๋กœ ์กด์žฌํ•œ๋‹ค(EPCIS ๊ฐœ์ฒด) โ€” ๊ตฌ์กฐ๋Š” ์ €๋„์ด ๊ฐ–๋Š”๋‹ค. */\n { std: 'MaterialLot', part: '2', label: 'twin.isa95.MaterialLot', axis: null, structure: 'partial', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.lot' },\n { std: 'MaterialSublot', part: '2', label: 'twin.isa95.MaterialSublot', axis: null, structure: 'none', behavior: 'none', surface: 'none' },\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\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 * `full` ์ด ์•„๋‹Œ ์ด์œ ๋Š” ๋‘˜์ด๋‹ค: **์‚ฌ๋žŒ๋งŒ ํŒ์ •ํ•œ๋‹ค**(์„ค๋น„ยท์ž์‚ฐ์˜ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋Š” ์•„์ง ๋ฐฐ์ •์— ์“ฐ์ง€ ์•Š๋Š”๋‹ค),\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 { 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 */\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 known = new Set(axes)\n const concepts = ISA95_CONCEPTS.map(c => {\n const axisMissing = !!c.axis && !known.has(c.axis)\n /* ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ด ์—†์–ด์ง„ ์ถ•์€ **๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค** โ€” ์ฃฝ์€ ๋ฌธ์œผ๋กœ ๋ณด๋‚ด๋ฉด ํ™”๋ฉด์ด ๊ฑฐ์ง“๋ง์„ ํ•œ๋‹ค.\n `axis` ์™€ ๊ฐ™์€ ๊ทœ์œจ์ด๊ณ , ์—ฌ๊ธฐ๊ฐ€ ๋น„๋ฉด ๊ทธ ์ค„์€ ๋‹ค์‹œ \"์ถ•์ด ์—†๋‹ค\" ๋กœ ์ •์งํ•˜๊ฒŒ ๋Œ์•„๊ฐ„๋‹ค. */\n const shownOn = c.shownOn?.filter(a => known.has(a))\n const fixed = shownOn && shownOn.length !== c.shownOn?.length ? { ...c, shownOn } : c\n return axisMissing ? { ...fixed, structure: 'none' as CoverageLevel, axisMissing } : fixed\n })\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 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 /* ๋กœํŠธยท์„œ๋ธŒ๋กœํŠธ๋Š” ๊ฐœ์ฒด ์ถ•์ด ์•„๋‹ˆ๋ผ **๊ด€์ธก**์œผ๋กœ ์กด์žฌํ•œ๋‹ค(EPCIS ๊ฐœ์ฒด) โ€” ๊ตฌ์กฐ๋Š” ์ €๋„์ด ๊ฐ–๋Š”๋‹ค. */\n { std: 'MaterialLot', part: '2', label: 'twin.isa95.MaterialLot', axis: null, structure: 'partial', behavior: 'full', surface: 'partial', note: 'twin.isa95.note.lot' },\n { std: 'MaterialSublot', part: '2', label: 'twin.isa95.MaterialSublot', axis: null, structure: 'none', behavior: 'none', surface: 'none' },\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\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 * `full` ์ด ์•„๋‹Œ ์ด์œ ๋Š” ๋‘˜์ด๋‹ค: **์‚ฌ๋žŒ๋งŒ ํŒ์ •ํ•œ๋‹ค**(์„ค๋น„ยท์ž์‚ฐ์˜ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋Š” ์•„์ง ๋ฐฐ์ •์— ์“ฐ์ง€ ์•Š๋Š”๋‹ค),\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 { 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"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ๊ฐœ์ฒด ์‹๋ณ„์ž โ†’ **ํ’ˆ๋ชฉ ์ฐธ์กฐ**. ๋Œ€์‘ ํ‘œ์˜ ๊ฐ’๊ณผ ๊ฒฌ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ชจ์–‘์œผ๋กœ ๋Œ๋ ค์ค€๋‹ค.
3
+ *
4
+ * SGTIN ์€ ํ‘œ์ค€์ด ์ž๋ฆฌ๋ฅผ ์ •ํ•ด ๋‘์—ˆ์œผ๋ฏ€๋กœ ๊ทธ ์ž๋ฆฌ์—์„œ ํ’ˆ๋ชฉ ์ฐธ์กฐ๋ฅผ ๊บผ๋‚ธ๋‹ค. ๊ทธ ๋ฐ–์˜ ๋ชจ์–‘์€ **์†๋Œ€์ง€
5
+ * ์•Š๋Š”๋‹ค** โ€” ์–ด๋А ๋ถ€ํ˜ธ๊ฐ€ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€๋Š” ์›๋ณธ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ , ์ปค๋„ ๊ณ„์•ฝ์ด ๊ทธ ๊ตฌ๋ถ„์ž๋ฅผ ์ •ํ•œ ์ ์ด ์—†๋‹ค.
6
+ * ์•ž์„œ ์ด ์ž๋ฆฌ์— ใ€Œ`@` ๋’ค๋Š” ๊ฐœ์ฒด๋‹คใ€๋ฅผ ๋„ฃ์—ˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ํ•œ ์›๋ณธ(chef)์˜ ๋ชจ์–‘์„ ๊ทœ์น™์œผ๋กœ ๊ตณํžŒ ๊ฒƒ์ด์—ˆ๋‹ค.
7
+ *
8
+ * ๊ทธ๋ž˜์„œ ์ž๋ฅด๋Š” ์ผ์€ ์—ฌ๊ธฐ์„œ ํ•˜์ง€ ์•Š๊ณ , **๊ทธ ํŠธ์œˆ์˜ ์„ ์–ธ๊ณผ ๊ฒฌ์ฃผ์–ด** ํŒ์ •ํ•œ๋‹ค(ยง`resolveByDeclaration`).
9
+ * ์„ ์–ธ์ด ๋‹ต์„ ์ฃผ์ง€ ๋ชปํ•˜๋ฉด `null` ์ด๋‹ค โ€” ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ๋‚จ์˜ ๋ ˆ์‹œํ”ผ์™€ ๊ฒฌ์ฃผ๊ฒŒ ๋˜๊ณ , ๊ทธ๊ฒƒ์ด ใ€Œ์„ค๊ณ„์™€
10
+ * ๋‹ค๋ฅด๋‹คใ€๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค.
11
+ */
12
+ export declare function itemRefOf(epc: unknown): string | null;
13
+ /**
14
+ * ์ด ์‹๋ณ„์ž๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” **์„ ์–ธ ํ•ญ๋ชฉ**์„ ์ฐพ๋Š”๋‹ค โ€” ์›๋ณธ์˜ ์ •์ฒด์„ฑ ๊ด€ํ–‰์„ ์•Œ์ง€ ์•Š๊ณ , ๊ตฌ๋ถ„์ž๋„ ๋ชจ๋ฅธ๋‹ค.
15
+ *
16
+ * ์„ธ ๊ฐ€์ง€๋ฅผ ์ฐจ๋ก€๋กœ ๋ณธ๋‹ค. ์–ด๋А ๋‹จ๊ณ„๋“  **ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค**(๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ํ‹€๋ฆฐ ๋‹ต๋ณด๋‹ค ๋‚ซ๋‹ค).
17
+ *
18
+ * โ‘  ๊ทธ๋Œ€๋กœ ๊ฐ™๋‹ค
19
+ * โ‘ก ๊ด€์ธก๋œ ์‹๋ณ„์ž๊ฐ€ ์„ ์–ธ์„ **ํ™•์žฅ**ํ•œ๋‹ค โ€” ๊ฐœ์ฒด๋Š” ์ž๊ธฐ ํด๋ž˜์Šค๋กœ ์‹œ์ž‘ํ•œ๋‹ค(`โ€ฆ/product-M1` + ๊ฐœ์ฒด ํ‘œ์‹œ)
20
+ * โ‘ข ํ™”๋ฉด์ด **์งง๊ฒŒ ์ค„์ธ** ์‹๋ณ„์ž๋ฅผ ๊ฑด๋„ธ๋‹ค โ€” ์„ ์–ธ์ด ๊ทธ๊ฒƒ์œผ๋กœ ๋๋‚œ๋‹ค(`net/class/product-M1`)
21
+ *
22
+ * โ‘กโ‘ข์€ ๋ถ€ํ˜ธ๋ฅผ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋ž˜์„œ ์›๋ณธ์ด `@`ยท`#`ยท`/` ๋ฌด์—‡์„ ์“ฐ๋“ , ๋˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์“ฐ์ง€ ์•Š๋“  ๊ฐ™์€ ๊ทœ์น™์ด ์„ ๋‹ค.
23
+ */
24
+ export declare function resolveByDeclaration<T>(ref: string | null, declared: Map<string, T>): T | undefined;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /*
3
+ * **๊ฐœ์ฒด์—์„œ ํ’ˆ๋ชฉ์œผ๋กœ** โ€” ์ •์ฒด์„ฑ ๋ชจ์–‘์ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋‹ค (2026-08-23).
4
+ *
5
+ * โ”€โ”€ ๋ฌด์—‡์ด ์กฐ์šฉํžˆ ๋น„์–ด ์žˆ์—ˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
6
+ * ํ™”๋ฉด์ด ใ€Œ์ด ๊ฐœ์ฒด๋Š” ์„ ์–ธ๋œ ์ž์žฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(๋ผ์ธ ๋‚ด๋ถ€์˜ ์ค‘๊ฐ„ ์‚ฐ๋ฌผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)ใ€๋ผ๊ณ  ๋งํ–ˆ๋Š”๋ฐ, ๊ทธ
7
+ * ํ’ˆ๋ชฉ์€ ์›๋ณธ์˜ ์„ ์–ธ์— ์ด๋ฆ„๊นŒ์ง€ ์žˆ์—ˆ๋‹ค(ใ€Œ๋ƒ‰๋™๊ทธ๋ฆฐ๋นˆ์Šคใ€). ๋Œ€์‘ ํ‘œ(`productionSpec.binding`)๋„ ๋ฉ€์ฉกํ–ˆ๋‹ค.
8
+ *
9
+ * ์›์ธ์€ **๊ฐœ์ฒด์—์„œ ํ’ˆ๋ชฉ์„ ๊บผ๋‚ด๋Š” ๊ทœ์น™**์ด์—ˆ๋‹ค. ๊ทธ ๊ทœ์น™์ด GS1 SGTIN URN ํ•˜๋‚˜๋งŒ ์•Œ์•˜๋‹ค.
10
+ *
11
+ * urn:epc:id:sgtin:0614141.077101.42 โ†’ 077101 (์•Œ๋˜ ๋ชจ์–‘)
12
+ * https://โ€ฆ/class/product-M0000438@M2R0001 โ†’ null (๋ชจ๋ฅด๋˜ ๋ชจ์–‘)
13
+ *
14
+ * ์›น URI ๋กœ ์ •์ฒด์„ฑ์„ ๋งํ•˜๋Š” ์›๋ณธ์—์„œ๋Š” ์–ธ์ œ๋‚˜ `null` ์ด ๋‚˜์™”๊ณ , ๊ทธ๋ž˜์„œ **๊ฐœ์ฒด๋ฅผ ์ž์žฌ์— ์ด์„ ์ˆ˜ ์—†์—ˆ๋‹ค.**
15
+ * ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด ๋‘ ๊ณณ์—์„œ ์กฐ์šฉํ•œ ๋นˆ์นธ์ด์—ˆ๋‹ค(๊ณ„๋ณด ์ ํ•ฉ์„ฑ ยท ์˜ค๋”๊ฐ€ ๋ฌด์—‡์„ ๋งŒ๋“œ๋‚˜). ใ€Œ์—†์œผ๋ฉด ๋ถ™์ด์ง€
16
+ * ์•Š๋Š”๋‹คใ€๋Š” ๊ทœ์œจ์„ ์ง€ํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด ์˜ค๋ฅ˜๋„ ๋‚˜์ง€ ์•Š์•˜๋‹ค.
17
+ *
18
+ * โ”€โ”€ ๋ฌด์—‡์„ ๋Œ๋ ค์ฃผ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
19
+ * **๊ทธ ํŠธ์œˆ์˜ ๋Œ€์‘ ํ‘œ๊ฐ€ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ชจ์–‘**์ด๋‹ค. ๋‘ ์„ธ๊ณ„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ฐ’์œผ๋กœ ์“ด๋‹ค.
20
+ *
21
+ * SGTIN ์„ธ๊ณ„ binding ๊ฐ’ = ํ’ˆ๋ชฉ ์ฐธ์กฐ ์ˆซ์ž(`077101`) โ†’ ์ˆซ์ž๋ฅผ ๋Œ๋ ค์ค€๋‹ค
22
+ * URI ์„ธ๊ณ„ binding ๊ฐ’ = ํด๋ž˜์Šค URI(`โ€ฆ/product-Mโ€ฆ`) โ†’ ํด๋ž˜์Šค URI ๋ฅผ ๋Œ๋ ค์ค€๋‹ค
23
+ *
24
+ * ๊ทธ๋ž˜์„œ ๋‘ ์„ธ๊ณ„๋ฅผ ํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹ตํ•œ๋‹ค โ€” ๋ถ€๋ฅด๋Š” ์ž๋ฆฌ๊ฐ€ ์›๋ณธ์˜ ์ •์ฒด์„ฑ ๋ฐฉ์‹์„ ์•Œ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
25
+ *
26
+ * โ”€โ”€ ๋ฌด์—‡์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
27
+ * **์–ด๋А ๋ถ€ํ˜ธ๊ฐ€ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค.** ๊ทธ๊ฒƒ์€ ์›๋ณธ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ  ์ปค๋„ ๊ณ„์•ฝ์ด ์ •ํ•œ ์ ์ด ์—†๋‹ค โ€” ํ•œ
28
+ * ์›๋ณธ(chef)์ด ์“ฐ๋Š” `@` ๋ฅผ ๊ทœ์น™์œผ๋กœ ๊ตณํžˆ๋ฉด ์ด ํ™”๋ฉด์ด ๊ทธ ๋ ˆ๊ฑฐ์‹œ ์œ„์— ์„œ๊ฒŒ ๋œ๋‹ค. ์ž๋ฅด๋Š” ํŒ๋‹จ์€ ๊ทธ ํŠธ์œˆ์˜
29
+ * **์„ ์–ธ**์ด ํ•˜๊ณ (ยง`resolveByDeclaration`), ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ๋‚จ์˜
30
+ * ๋ ˆ์‹œํ”ผ์™€ ๊ฒฌ์ฃผ๊ฒŒ ๋˜๊ณ , ๊ทธ๊ฒƒ์ด ใ€Œ์„ค๊ณ„์™€ ๋‹ค๋ฅด๋‹คใ€๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค.
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.itemRefOf = itemRefOf;
34
+ exports.resolveByDeclaration = resolveByDeclaration;
35
+ /**
36
+ * ๊ฐœ์ฒด ์‹๋ณ„์ž โ†’ **ํ’ˆ๋ชฉ ์ฐธ์กฐ**. ๋Œ€์‘ ํ‘œ์˜ ๊ฐ’๊ณผ ๊ฒฌ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ชจ์–‘์œผ๋กœ ๋Œ๋ ค์ค€๋‹ค.
37
+ *
38
+ * SGTIN ์€ ํ‘œ์ค€์ด ์ž๋ฆฌ๋ฅผ ์ •ํ•ด ๋‘์—ˆ์œผ๋ฏ€๋กœ ๊ทธ ์ž๋ฆฌ์—์„œ ํ’ˆ๋ชฉ ์ฐธ์กฐ๋ฅผ ๊บผ๋‚ธ๋‹ค. ๊ทธ ๋ฐ–์˜ ๋ชจ์–‘์€ **์†๋Œ€์ง€
39
+ * ์•Š๋Š”๋‹ค** โ€” ์–ด๋А ๋ถ€ํ˜ธ๊ฐ€ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€๋Š” ์›๋ณธ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ , ์ปค๋„ ๊ณ„์•ฝ์ด ๊ทธ ๊ตฌ๋ถ„์ž๋ฅผ ์ •ํ•œ ์ ์ด ์—†๋‹ค.
40
+ * ์•ž์„œ ์ด ์ž๋ฆฌ์— ใ€Œ`@` ๋’ค๋Š” ๊ฐœ์ฒด๋‹คใ€๋ฅผ ๋„ฃ์—ˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ํ•œ ์›๋ณธ(chef)์˜ ๋ชจ์–‘์„ ๊ทœ์น™์œผ๋กœ ๊ตณํžŒ ๊ฒƒ์ด์—ˆ๋‹ค.
41
+ *
42
+ * ๊ทธ๋ž˜์„œ ์ž๋ฅด๋Š” ์ผ์€ ์—ฌ๊ธฐ์„œ ํ•˜์ง€ ์•Š๊ณ , **๊ทธ ํŠธ์œˆ์˜ ์„ ์–ธ๊ณผ ๊ฒฌ์ฃผ์–ด** ํŒ์ •ํ•œ๋‹ค(ยง`resolveByDeclaration`).
43
+ * ์„ ์–ธ์ด ๋‹ต์„ ์ฃผ์ง€ ๋ชปํ•˜๋ฉด `null` ์ด๋‹ค โ€” ์ง์ž‘์œผ๋กœ ์ด์œผ๋ฉด ๋‚จ์˜ ๋ ˆ์‹œํ”ผ์™€ ๊ฒฌ์ฃผ๊ฒŒ ๋˜๊ณ , ๊ทธ๊ฒƒ์ด ใ€Œ์„ค๊ณ„์™€
44
+ * ๋‹ค๋ฅด๋‹คใ€๋Š” ๊ฑฐ์ง“ ์ง„๋‹จ์ด ๋œ๋‹ค.
45
+ */
46
+ function itemRefOf(epc) {
47
+ if (typeof epc !== 'string')
48
+ return null;
49
+ const s = epc.trim();
50
+ if (!s)
51
+ return null;
52
+ /* GS1 SGTIN โ€” ํšŒ์‚ฌ ์ ‘๋‘์‚ฌ์™€ ์ผ๋ จ๋ฒˆํ˜ธ ์‚ฌ์ด์˜ ํ’ˆ๋ชฉ ์ฐธ์กฐ. `idpat` ์˜ `*` ๋„ ๊ฐ™์€ ์ž๋ฆฌ์—์„œ ๊ฑธ๋ฆฐ๋‹ค. */
53
+ const sgtin = /sgtin:[^.]+\.([^.]+)\./.exec(s);
54
+ if (sgtin)
55
+ return sgtin[1];
56
+ /* ๊ทธ ๋ฐ–์˜ ์ •์ฒด์„ฑ(์›น URI ๋“ฑ)์€ ๊ทธ๋Œ€๋กœ ๋‚ธ๋‹ค โ€” ์ž๋ฅด๋Š” ํŒ๋‹จ์€ ์„ ์–ธ์ด ํ•œ๋‹ค. */
57
+ return s;
58
+ }
59
+ /**
60
+ * ์ด ์‹๋ณ„์ž๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” **์„ ์–ธ ํ•ญ๋ชฉ**์„ ์ฐพ๋Š”๋‹ค โ€” ์›๋ณธ์˜ ์ •์ฒด์„ฑ ๊ด€ํ–‰์„ ์•Œ์ง€ ์•Š๊ณ , ๊ตฌ๋ถ„์ž๋„ ๋ชจ๋ฅธ๋‹ค.
61
+ *
62
+ * ์„ธ ๊ฐ€์ง€๋ฅผ ์ฐจ๋ก€๋กœ ๋ณธ๋‹ค. ์–ด๋А ๋‹จ๊ณ„๋“  **ํ›„๋ณด๊ฐ€ ๋‘˜ ์ด์ƒ์ด๋ฉด ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค**(๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ํ‹€๋ฆฐ ๋‹ต๋ณด๋‹ค ๋‚ซ๋‹ค).
63
+ *
64
+ * โ‘  ๊ทธ๋Œ€๋กœ ๊ฐ™๋‹ค
65
+ * โ‘ก ๊ด€์ธก๋œ ์‹๋ณ„์ž๊ฐ€ ์„ ์–ธ์„ **ํ™•์žฅ**ํ•œ๋‹ค โ€” ๊ฐœ์ฒด๋Š” ์ž๊ธฐ ํด๋ž˜์Šค๋กœ ์‹œ์ž‘ํ•œ๋‹ค(`โ€ฆ/product-M1` + ๊ฐœ์ฒด ํ‘œ์‹œ)
66
+ * โ‘ข ํ™”๋ฉด์ด **์งง๊ฒŒ ์ค„์ธ** ์‹๋ณ„์ž๋ฅผ ๊ฑด๋„ธ๋‹ค โ€” ์„ ์–ธ์ด ๊ทธ๊ฒƒ์œผ๋กœ ๋๋‚œ๋‹ค(`net/class/product-M1`)
67
+ *
68
+ * โ‘กโ‘ข์€ ๋ถ€ํ˜ธ๋ฅผ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋ž˜์„œ ์›๋ณธ์ด `@`ยท`#`ยท`/` ๋ฌด์—‡์„ ์“ฐ๋“ , ๋˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์“ฐ์ง€ ์•Š๋“  ๊ฐ™์€ ๊ทœ์น™์ด ์„ ๋‹ค.
69
+ */
70
+ function resolveByDeclaration(ref, declared) {
71
+ if (!ref)
72
+ return undefined;
73
+ const exact = declared.get(ref);
74
+ if (exact !== undefined)
75
+ return exact;
76
+ let hit;
77
+ let found = 0;
78
+ for (const [id, value] of declared) {
79
+ if (!(ref.startsWith(id) || id.endsWith(ref)))
80
+ continue;
81
+ found++;
82
+ if (found > 1)
83
+ return undefined;
84
+ hit = value;
85
+ }
86
+ return hit;
87
+ }
88
+ //# sourceMappingURL=item-ref.js.map
@@ -0,0 +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"]}