@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 @@
1
+ {"version":3,"file":"reference-probe.js","sourceRoot":"","sources":["../../../server/service/reference/reference-probe.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReferenceAdapter, SiteDescriptor } from './reference-adapter.js'\nimport type { ReferenceMaster } from './reference-master.js'\nimport { capabilitiesOf } from './reference-adapter.js'\nimport { REFERENCE_STEPS, type ReferenceStep } from './reference-progress.js'\n\n/*\n * **커넥터 점검 하네스** — 실 원본에 붙여 「무엇이 채워지고 무엇이 비는가」를 한 번에 본다.\n *\n * ── 왜 필요한가 (2026-08-21) ────────────────────────────────────────────────\n * chef v1 커넥터를 만들 때 실 인스턴스(포천)에 붙이는 확인을 매번 손으로 했다 — curl 로 필드를 묻고,\n * 일회용 스크립트로 마스터를 읽고, 결과를 눈으로 셌다. 그 방식은 세 가지를 잃는다:\n * · 같은 확인을 다음 커넥터에서 처음부터 다시 만든다.\n * · 무엇을 확인했는지가 어디에도 남지 않는다.\n * · **앱을 띄워야 알 수 있는 것**이 되어 버린다 — dev 서버가 남의 것이면 확인 자체가 막힌다.\n *\n * 그래서 어댑터 규약만 아는 자리에 둔다. 어댑터는 `testConnection` · `discoverSites` · `fetchMaster` ·\n * `openLiveFeed` 를 갖는 객체이고, 그 넷을 순서대로 부르는 일에 커넥터별 지식이 필요하지 않다.\n *\n * ── 무엇을 하지 않는가 ──────────────────────────────────────────────────────\n * · **판단하지 않는다.** 「합격」을 매기지 않고 센 것을 그대로 낸다 — 무엇이 충분한지는 커넥터마다\n * 다르고, 그 판단은 체크리스트 문서가 한다.\n * · **저장하지 않는다.** 트윈을 만들지도, 커서를 남기지도 않는다. 원본을 읽기만 한다.\n * · **라이브는 부르지 않는 것이 기본이다.** 첫 주기는 전량 읽기이므로 실 운영 원본에 부담이 된다\n * (포천은 로트 99,095 · 투입 290,688 · 재고 141,358건이다). 부를 때는 호출부가 명시한다.\n */\n\n/** 마스터 한 벌에서 센 것 — 커넥터와 무관한 자리 이름으로만 센다. */\nexport interface MasterCounts {\n locations: number\n areas: number\n equipment: number\n materialDefinitions: number\n operations: number\n /** 생산 선언이 없으면 `undefined` — 0 과 구별한다(선언 자체가 없는 것과 비어 있는 것은 다르다). */\n materials?: number\n materialsWithHome?: number\n routes?: number\n recipes?: number\n recipesWithRoute?: number\n locationTypes?: number\n resourceTypes?: number\n}\n\nexport interface ProbeStep {\n key: ReferenceStep | string\n detail?: string\n /** 그 단계가 끝난 시각까지 걸린 밀리초 — 어느 단계가 느린지 보이게 한다. */\n elapsedMs: number\n}\n\nexport interface ProbeReport {\n adapter: string\n /** 어댑터가 선언하고 **구현까지 있는** 능력. 선언만 있는 것은 여기 나오지 않는다. */\n capabilities: string[]\n connection?: { ok: boolean; readiness?: string; notes?: string[]; error?: string }\n sites?: { siteId: string; name?: string }[]\n /** 사이트마다 한 벌 — 마스터는 사이트 단위다. */\n masters: {\n siteId: string\n steps: ProbeStep[]\n counts?: MasterCounts\n warnings: string[]\n space?: unknown\n identity?: unknown\n /** 표본 — 눈으로 확인할 몇 건. 전체를 싣지 않는다(원본이 수천 건이다). */\n samples?: { recipes?: unknown[]; routes?: unknown[]; locations?: unknown[] }\n elapsedMs: number\n error?: string\n }[]\n /** 라이브를 부른 경우에만 — 한 주기가 낸 기록을 종류별로 센다. */\n live?: { records: number; byShape: Record<string, number>; samples: unknown[]; elapsedMs: number; error?: string }\n /** 선언한 단계 중 **한 번도 보고되지 않은** 것. 선언해 두고 보내지 않으면 화면의 진행이 멈춘 것처럼 보인다. */\n silentSteps?: string[]\n /** 선언하지 않은 이름으로 보고한 단계. 표준 낱말 밖의 값은 화면이 번역할 수 없다. */\n unknownSteps?: string[]\n}\n\n/** 기록의 모양을 이름 붙인다 — 커널 낱말로만 가린다(커넥터를 알 필요가 없다). */\nfunction shapeOf(r: any): string {\n if (r?.inputQuantityList || r?.outputQuantityList) return 'transformation'\n if (r?.taskId) return 'task'\n if (r?.orderId) return 'order'\n if (r?.quantityList || r?.epcList) return 'observation'\n return 'other'\n}\n\nfunction countMaster(ref: ReferenceMaster): MasterCounts {\n const m: any = ref\n const d = m.productionSpec?.definition\n return {\n locations: m.locations?.length ?? 0,\n areas: (m.locations ?? []).filter((l: any) => l.role === 'area').length,\n equipment: m.equipment?.length ?? 0,\n materialDefinitions: m.materialDefinitions?.length ?? 0,\n operations: m.operations?.length ?? 0,\n ...(d\n ? {\n materials: d.materials?.length ?? 0,\n materialsWithHome: (d.materials ?? []).filter((x: any) => x.locationType).length,\n routes: d.routes?.length ?? 0,\n recipes: d.recipes?.length ?? 0,\n recipesWithRoute: (d.recipes ?? []).filter((x: any) => x.route).length,\n locationTypes: d.locationTypes?.length ?? 0,\n resourceTypes: d.resourceTypes?.length ?? 0\n }\n : {})\n }\n}\n\nconst messageOf = (w: unknown): string => (typeof w === 'string' ? w : `${(w as any)?.code}: ${(w as any)?.message}`)\n\n/**\n * 사람이 읽는 줄로 자른다 — **자랐다는 사실을 함께 적는다.**\n *\n * 경고에 값 목록이 붙는다(어느 자리가 걸렀는지). 88건이면 UUID 88개가 한 줄에 쏟아져 보고를 읽을 수\n * 없게 된다. 그래서 사람용 출력에서만 자르고, 전체는 보고 객체(`--json`)에 그대로 남긴다.\n */\nconst brief = (text: string, max = 300): string =>\n text.length <= max ? text : `${text.slice(0, max)}… (${text.length}자 중 앞 ${max}자 — 전체는 보고 객체에 있다)`\n\n/**\n * 어댑터 한 벌을 실 원본에 붙여 본다.\n *\n * 실패를 던지지 않는다 — **어디까지 갔는지가 보고의 내용**이다. 연결이 안 되면 그 사실이, 마스터가\n * 실패하면 어느 단계에서 실패했는지가 보고에 남는다(예외로 끝나면 그 정보가 사라진다).\n */\nexport async function probeReference(opts: {\n adapter: ReferenceAdapter\n config: any\n /** 특정 사이트만 볼 때. 없으면 `discoverSites` 가 낸 전부. */\n siteId?: string\n /**\n * 라이브 한 주기를 부를지. **기본은 부르지 않는다** — 첫 주기가 전량 읽기다.\n * `waitMs` 만큼 기다린 뒤 멈춘다(주기가 끝나지 않았으면 그때까지 받은 것만 센다).\n */\n live?: { waitMs: number; sampleCount?: number }\n /** 표본 건수 — 기본 3건. */\n sampleCount?: number\n}): Promise<ProbeReport> {\n const { adapter, config } = opts\n const sampleCount = opts.sampleCount ?? 3\n const report: ProbeReport = { adapter: adapter.type, capabilities: capabilitiesOf(adapter), masters: [] }\n\n if (adapter.testConnection) {\n try {\n report.connection = (await adapter.testConnection(config)) as any\n } catch (e: any) {\n report.connection = { ok: false, error: e?.message ?? String(e) }\n }\n /* 연결이 안 되면 더 가지 않는다 — 그 뒤 실패는 모두 같은 원인의 반복이다. */\n if (report.connection && report.connection.ok === false) return report\n }\n\n let sites: SiteDescriptor[] = []\n try {\n sites = adapter.discoverSites ? await adapter.discoverSites(config) : []\n } catch (e: any) {\n report.sites = []\n report.masters.push({ siteId: '(사이트를 찾지 못했다)', steps: [], warnings: [], elapsedMs: 0, error: e?.message ?? String(e) })\n return report\n }\n if (opts.siteId) sites = sites.filter(s => s.siteId === opts.siteId)\n report.sites = sites.map(s => ({ siteId: s.siteId, name: s.name }))\n\n const declared = new Set<string>(adapter.masterSteps ?? [])\n const reported = new Set<string>()\n const unknown = new Set<string>()\n\n for (const site of sites) {\n const t0 = Date.now()\n const steps: ProbeStep[] = []\n try {\n const ref = await adapter.fetchMaster!(config, site, s => {\n reported.add(String(s.key))\n if (!(REFERENCE_STEPS as readonly string[]).includes(String(s.key))) unknown.add(String(s.key))\n steps.push({ key: s.key, detail: s.detail, elapsedMs: Date.now() - t0 })\n })\n const m: any = ref\n const d = m.productionSpec?.definition\n report.masters.push({\n siteId: site.siteId,\n steps,\n counts: countMaster(ref),\n warnings: (m.warnings ?? []).map(messageOf),\n space: m.space,\n identity: m.identity,\n samples: {\n recipes: (d?.recipes ?? []).slice(0, sampleCount),\n routes: (d?.routes ?? []).slice(0, sampleCount),\n locations: (m.locations ?? []).slice(0, sampleCount)\n },\n elapsedMs: Date.now() - t0\n })\n } catch (e: any) {\n /* 어느 단계까지 갔는지를 남긴다 — 그것이 다음에 볼 자리다. */\n report.masters.push({ siteId: site.siteId, steps, warnings: [], elapsedMs: Date.now() - t0, error: e?.message ?? String(e) })\n }\n }\n\n const silent = [...declared].filter(s => !reported.has(s))\n if (silent.length) report.silentSteps = silent\n if (unknown.size) report.unknownSteps = [...unknown]\n\n if (opts.live && adapter.openLiveFeed && sites.length) {\n const t0 = Date.now()\n const got: unknown[] = []\n try {\n const stop = adapter.openLiveFeed(config, sites[0], rs => got.push(...rs))\n await new Promise(r => setTimeout(r, opts.live.waitMs))\n stop()\n const byShape: Record<string, number> = {}\n for (const r of got) byShape[shapeOf(r)] = (byShape[shapeOf(r)] ?? 0) + 1\n report.live = {\n records: got.length,\n byShape,\n samples: got.slice(0, opts.live.sampleCount ?? sampleCount),\n elapsedMs: Date.now() - t0\n }\n } catch (e: any) {\n report.live = { records: got.length, byShape: {}, samples: [], elapsedMs: Date.now() - t0, error: e?.message ?? String(e) }\n }\n }\n\n return report\n}\n\n/** 보고를 사람이 읽는 줄로 — 화면이 아니라 터미널·로그가 읽는다. */\nexport function formatProbeReport(r: ProbeReport): string {\n const out: string[] = []\n out.push(`커넥터 ${r.adapter} · 능력 ${r.capabilities.length ? r.capabilities.join(',') : '(없음)'}`)\n if (r.connection) {\n out.push(`연결 ${r.connection.ok ? 'ok' : '실패'}${r.connection.readiness ? ` · 읽기준비 ${r.connection.readiness}` : ''}`)\n for (const n of r.connection.notes ?? []) out.push(` · ${brief(n)}`)\n if (r.connection.error) out.push(` · ${r.connection.error}`)\n }\n for (const m of r.masters) {\n out.push(`사이트 ${m.siteId} — ${(m.elapsedMs / 1000).toFixed(1)}초`)\n for (const s of m.steps) out.push(` [${(s.elapsedMs / 1000).toFixed(1)}s] ${s.key}${s.detail ? ` — ${s.detail}` : ''}`)\n if (m.error) out.push(` 실패: ${m.error}`)\n if (m.counts) {\n const c = m.counts\n out.push(\n ` 로케이션 ${c.locations}(존 ${c.areas}) · 설비 ${c.equipment} · 자재정의 ${c.materialDefinitions} · 공정 ${c.operations}`\n )\n if (c.materials !== undefined) {\n out.push(\n ` 선언자재 ${c.materials}(보관 로케이션 있는 것 ${c.materialsWithHome}) · 경로 ${c.routes} · 레시피 ${c.recipes}(경로 붙은 것 ${c.recipesWithRoute})`\n )\n } else {\n out.push(' 생산 선언 없음 — 레시피가 하나도 성립하지 않았다')\n }\n }\n for (const w of m.warnings) out.push(` 경고 ${brief(w)}`)\n }\n if (r.silentSteps?.length) out.push(`선언했으나 보고되지 않은 단계: ${r.silentSteps.join(', ')}`)\n if (r.unknownSteps?.length) out.push(`표준 낱말 밖의 단계 이름: ${r.unknownSteps.join(', ')}`)\n if (r.live) {\n out.push(\n `라이브 한 주기 — 기록 ${r.live.records}건 (${Object.entries(r.live.byShape).map(([k, v]) => `${k} ${v}`).join(' · ') || '없음'}) · ${(r.live.elapsedMs / 1000).toFixed(1)}초`\n )\n if (r.live.error) out.push(` 실패: ${r.live.error}`)\n }\n return out.join('\\n')\n}\n"]}
@@ -0,0 +1,17 @@
1
+ export declare class TwinReferenceProgressMessage {
2
+ source: string;
3
+ siteId: string;
4
+ step: string;
5
+ done: number;
6
+ total?: number;
7
+ siteIndex: number;
8
+ siteCount: number;
9
+ detail?: string;
10
+ failed?: boolean;
11
+ error?: string;
12
+ }
13
+ export declare class TwinReferenceProgressSubscription {
14
+ twinReferenceProgress(payload: {
15
+ twinReferenceProgress: TwinReferenceProgressMessage;
16
+ }, source: string): TwinReferenceProgressMessage;
17
+ }
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TwinReferenceProgressSubscription = exports.TwinReferenceProgressMessage = void 0;
4
+ const tslib_1 = require("tslib");
5
+ /*
6
+ * 유입 진행 구독 — **트윈을 만드는 동안 무엇을 하고 있는지 화면이 안다.**
7
+ *
8
+ * 마스터 읽기는 원본에 여러 질의를 보내는 긴 작업이고, 그 사이 화면은 아무것도 알 수 없었다. 단계를
9
+ * 아는 것은 어댑터뿐이므로 어댑터가 **표준 낱말**로 말하고(`REFERENCE_STEPS`) 호스트가 자기 두 단계를
10
+ * 더해 이 채널로 흘린다.
11
+ *
12
+ * 낱말이 표준이므로 화면은 **단계마다 번역 하나**만 두면 모든 커넥터를 보여 준다.
13
+ */
14
+ const type_graphql_1 = require("type-graphql");
15
+ const shell_1 = require("@things-factory/shell");
16
+ const graphql_yoga_1 = require("graphql-yoga");
17
+ const reference_progress_js_1 = require("./reference-progress.js");
18
+ let TwinReferenceProgressMessage = class TwinReferenceProgressMessage {
19
+ };
20
+ exports.TwinReferenceProgressMessage = TwinReferenceProgressMessage;
21
+ tslib_1.__decorate([
22
+ (0, type_graphql_1.Field)({ description: 'Which reference (source) this belongs to.' }),
23
+ tslib_1.__metadata("design:type", String)
24
+ ], TwinReferenceProgressMessage.prototype, "source", void 0);
25
+ tslib_1.__decorate([
26
+ (0, type_graphql_1.Field)({ description: 'Which site is being built.' }),
27
+ tslib_1.__metadata("design:type", String)
28
+ ], TwinReferenceProgressMessage.prototype, "siteId", void 0);
29
+ tslib_1.__decorate([
30
+ (0, type_graphql_1.Field)({ description: `Standard step name — one of: ${reference_progress_js_1.REFERENCE_STEPS.join(' | ')}.` }),
31
+ tslib_1.__metadata("design:type", String)
32
+ ], TwinReferenceProgressMessage.prototype, "step", void 0);
33
+ tslib_1.__decorate([
34
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'Steps finished for this site.' }),
35
+ tslib_1.__metadata("design:type", Number)
36
+ ], TwinReferenceProgressMessage.prototype, "done", void 0);
37
+ tslib_1.__decorate([
38
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int, {
39
+ nullable: true,
40
+ description: 'Total steps for this site. Absent when the adapter did not declare its steps — the UI then shows no percentage rather than inventing one.'
41
+ }),
42
+ tslib_1.__metadata("design:type", Number)
43
+ ], TwinReferenceProgressMessage.prototype, "total", void 0);
44
+ tslib_1.__decorate([
45
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'Index of the site being built (0-based).' }),
46
+ tslib_1.__metadata("design:type", Number)
47
+ ], TwinReferenceProgressMessage.prototype, "siteIndex", void 0);
48
+ tslib_1.__decorate([
49
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'How many sites are being built.' }),
50
+ tslib_1.__metadata("design:type", Number)
51
+ ], TwinReferenceProgressMessage.prototype, "siteCount", void 0);
52
+ tslib_1.__decorate([
53
+ (0, type_graphql_1.Field)({ nullable: true, description: 'A fact within the step, such as how many rows were read.' }),
54
+ tslib_1.__metadata("design:type", String)
55
+ ], TwinReferenceProgressMessage.prototype, "detail", void 0);
56
+ tslib_1.__decorate([
57
+ (0, type_graphql_1.Field)({ nullable: true, description: 'True when this step failed. The UI keeps the progress panel and marks this step.' }),
58
+ tslib_1.__metadata("design:type", Boolean)
59
+ ], TwinReferenceProgressMessage.prototype, "failed", void 0);
60
+ tslib_1.__decorate([
61
+ (0, type_graphql_1.Field)({ nullable: true, description: 'Why it failed. Present only on failure.' }),
62
+ tslib_1.__metadata("design:type", String)
63
+ ], TwinReferenceProgressMessage.prototype, "error", void 0);
64
+ exports.TwinReferenceProgressMessage = TwinReferenceProgressMessage = tslib_1.__decorate([
65
+ (0, type_graphql_1.ObjectType)({ description: 'One step of progress while a reference is being imported into twins.' })
66
+ ], TwinReferenceProgressMessage);
67
+ let TwinReferenceProgressSubscription = class TwinReferenceProgressSubscription {
68
+ twinReferenceProgress(payload, source) {
69
+ return payload.twinReferenceProgress;
70
+ }
71
+ };
72
+ exports.TwinReferenceProgressSubscription = TwinReferenceProgressSubscription;
73
+ tslib_1.__decorate([
74
+ (0, type_graphql_1.Subscription)(returns => TwinReferenceProgressMessage, {
75
+ subscribe: ({ args, context }) => {
76
+ const { source } = args;
77
+ const domainId = context?.state?.domain?.id;
78
+ /* 테넌트 격리 — 도메인이 없으면 빈 구독이다(다른 테넌트의 진행을 흘리지 않는다). */
79
+ if (!domainId)
80
+ return (0, graphql_yoga_1.pipe)(shell_1.pubsub.subscribe('twin-reference-progress'), (0, graphql_yoga_1.filter)(() => false));
81
+ return (0, graphql_yoga_1.pipe)(shell_1.pubsub.subscribe('twin-reference-progress'), (0, graphql_yoga_1.filter)((p) => p.twinReferenceProgress.source === source));
82
+ },
83
+ description: 'Progress while importing a reference — standard step names, so one translation per step covers every connector.'
84
+ }),
85
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
86
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('source')),
87
+ tslib_1.__metadata("design:type", Function),
88
+ tslib_1.__metadata("design:paramtypes", [Object, String]),
89
+ tslib_1.__metadata("design:returntype", TwinReferenceProgressMessage)
90
+ ], TwinReferenceProgressSubscription.prototype, "twinReferenceProgress", null);
91
+ exports.TwinReferenceProgressSubscription = TwinReferenceProgressSubscription = tslib_1.__decorate([
92
+ (0, type_graphql_1.Resolver)()
93
+ ], TwinReferenceProgressSubscription);
94
+ //# sourceMappingURL=reference-progress-subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-progress-subscription.js","sourceRoot":"","sources":["../../../server/service/reference/reference-progress-subscription.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;GAQG;AACH,+CAAwF;AACxF,iDAA8C;AAC9C,+CAA2C;AAE3C,mEAAyD;AAGlD,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;CAiCxC,CAAA;AAjCY,oEAA4B;AAEvC;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;;4DACtD;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;;4DACvC;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,gCAAgC,uCAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;;0DAC3E;AAGZ;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;;0DACzD;AAMZ;IAJC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE;QAClB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,2IAA2I;KACzJ,CAAC;;2DACY;AAGd;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;;+DAC/D;AAGjB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;;+DACtD;AAGjB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,0DAA0D,EAAE,CAAC;;4DACpF;AAGf;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kFAAkF,EAAE,CAAC;;4DAC3G;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;;2DACpE;uCAhCH,4BAA4B;IADxC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,sEAAsE,EAAE,CAAC;GACvF,4BAA4B,CAiCxC;AAGM,IAAM,iCAAiC,GAAvC,MAAM,iCAAiC;IAc5C,qBAAqB,CACX,OAAgE,EACzD,MAAc;QAE7B,OAAO,OAAO,CAAC,qBAAqB,CAAA;IACtC,CAAC;CACF,CAAA;AApBY,8EAAiC;AAc5C;IAbC,IAAA,2BAAY,EAAC,OAAO,CAAC,EAAE,CAAC,4BAA4B,EAAE;QACrD,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;YACvB,MAAM,QAAQ,GAAI,OAAe,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAA;YACpD,oDAAoD;YACpD,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAA,mBAAI,EAAC,cAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,EAAE,IAAA,qBAAM,EAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;YAC5F,OAAO,IAAA,mBAAI,EACT,cAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,EAC3C,IAAA,qBAAM,EAAC,CAAC,CAA0D,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,KAAK,MAAM,CAAC,CAClH,CAAA;QACH,CAAC;QACD,WAAW,EAAE,iHAAiH;KAC/H,CAAC;IAEC,mBAAA,IAAA,mBAAI,GAAE,CAAA;IACN,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;;;4CACb,4BAA4B;8EAE9B;4CAnBU,iCAAiC;IAD7C,IAAA,uBAAQ,GAAE;GACE,iCAAiC,CAoB7C","sourcesContent":["/*\n * 유입 진행 구독 — **트윈을 만드는 동안 무엇을 하고 있는지 화면이 안다.**\n *\n * 마스터 읽기는 원본에 여러 질의를 보내는 긴 작업이고, 그 사이 화면은 아무것도 알 수 없었다. 단계를\n * 아는 것은 어댑터뿐이므로 어댑터가 **표준 낱말**로 말하고(`REFERENCE_STEPS`) 호스트가 자기 두 단계를\n * 더해 이 채널로 흘린다.\n *\n * 낱말이 표준이므로 화면은 **단계마다 번역 하나**만 두면 모든 커넥터를 보여 준다.\n */\nimport { Arg, Field, Int, ObjectType, Resolver, Root, Subscription } from 'type-graphql'\nimport { pubsub } from '@things-factory/shell'\nimport { filter, pipe } from 'graphql-yoga'\n\nimport { REFERENCE_STEPS } from './reference-progress.js'\n\n@ObjectType({ description: 'One step of progress while a reference is being imported into twins.' })\nexport class TwinReferenceProgressMessage {\n @Field({ description: 'Which reference (source) this belongs to.' })\n source: string\n\n @Field({ description: 'Which site is being built.' })\n siteId: string\n\n @Field({ description: `Standard step name — one of: ${REFERENCE_STEPS.join(' | ')}.` })\n step: string\n\n @Field(type => Int, { description: 'Steps finished for this site.' })\n done: number\n\n @Field(type => Int, {\n nullable: true,\n description: 'Total steps for this site. Absent when the adapter did not declare its steps — the UI then shows no percentage rather than inventing one.'\n })\n total?: number\n\n @Field(type => Int, { description: 'Index of the site being built (0-based).' })\n siteIndex: number\n\n @Field(type => Int, { description: 'How many sites are being built.' })\n siteCount: number\n\n @Field({ nullable: true, description: 'A fact within the step, such as how many rows were read.' })\n detail?: string\n\n @Field({ nullable: true, description: 'True when this step failed. The UI keeps the progress panel and marks this step.' })\n failed?: boolean\n\n @Field({ nullable: true, description: 'Why it failed. Present only on failure.' })\n error?: string\n}\n\n@Resolver()\nexport class TwinReferenceProgressSubscription {\n @Subscription(returns => TwinReferenceProgressMessage, {\n subscribe: ({ args, context }) => {\n const { source } = args\n const domainId = (context as any)?.state?.domain?.id\n /* 테넌트 격리 — 도메인이 없으면 빈 구독이다(다른 테넌트의 진행을 흘리지 않는다). */\n if (!domainId) return pipe(pubsub.subscribe('twin-reference-progress'), filter(() => false))\n return pipe(\n pubsub.subscribe('twin-reference-progress'),\n filter((p: { twinReferenceProgress: TwinReferenceProgressMessage }) => p.twinReferenceProgress.source === source)\n )\n },\n description: 'Progress while importing a reference — standard step names, so one translation per step covers every connector.'\n })\n twinReferenceProgress(\n @Root() payload: { twinReferenceProgress: TwinReferenceProgressMessage },\n @Arg('source') source: string\n ): TwinReferenceProgressMessage {\n return payload.twinReferenceProgress\n }\n}\n"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 표준 단계. 순서는 대개 이 차례이지만 **강제하지 않는다** — 원본에 따라 없는 자리가 있고, 그때는 그
3
+ * 단계를 선언하지도 보내지도 않는다.
4
+ */
5
+ export declare const REFERENCE_STEPS: readonly ["schema", "space", "locations", "equipment", "operations", "materials", "routes", "recipes", "testSpecifications", "persons", "assets", "provision", "start"];
6
+ export type ReferenceStep = (typeof REFERENCE_STEPS)[number];
7
+ /** 호스트가 마스터 읽기 뒤에 하는 단계 — 어댑터의 선언에 이만큼을 더해 분모를 만든다. */
8
+ export declare const HOST_STEPS: ReferenceStep[];
9
+ /**
10
+ * 한 단계의 진행 — 구독으로 흐르는 메시지의 몸통.
11
+ *
12
+ * `detail` 은 **그 단계 안에서 사람이 알아야 하는 것**이다(읽은 건수 등). 비어 있어도 된다 — 지어내지
13
+ * 않는다.
14
+ */
15
+ export interface ReferenceProgress {
16
+ /** 어느 사이트를 만드는 중인가. */
17
+ siteId: string;
18
+ step: ReferenceStep;
19
+ /** 이 사이트에서 끝낸 단계 수. */
20
+ done: number;
21
+ /** 이 사이트의 전체 단계 수 — 어댑터가 선언하지 않으면 없다(그때 퍼센트를 만들지 않는다). */
22
+ total?: number;
23
+ /** 여러 사이트를 한 번에 만들 때, 지금 몇 번째인가. */
24
+ siteIndex: number;
25
+ siteCount: number;
26
+ /** 그 단계 안의 사실 — 「자리 128건」처럼. */
27
+ detail?: string;
28
+ /** 이 단계에서 실패했는가. 실패해도 화면이 그 자리를 그대로 보여 줄 수 있어야 한다. */
29
+ failed?: boolean;
30
+ /** 실패 이유 — 실패했을 때만. */
31
+ error?: string;
32
+ }
33
+ /**
34
+ * 전체 진행률 — **분모를 알 때만 낸다.**
35
+ *
36
+ * 사이트가 여럿이면 사이트 사이의 진행도 함께 센다: 앞선 사이트는 끝난 것으로 본다.
37
+ */
38
+ export declare function referencePercent(p: ReferenceProgress): number | undefined;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ /*
3
+ * 유입 진행 단계 — **모든 커넥터가 같은 낱말로 말한다.**
4
+ *
5
+ * ── 왜 표준화하나 (2026-08-21) ──────────────────────────────────────────────
6
+ * 마스터 읽기는 원본에 여러 질의를 보내는 긴 작업이고, 그 사이 화면은 아무것도 알 수 없었다. 커넥터마다
7
+ * 자기 낱말로 말하게 두면 화면이 커넥터 수만큼 문구를 알아야 하고, 새 커넥터가 생기면 화면에 낯선 글자가
8
+ * 나온다.
9
+ *
10
+ * 그래서 낱말을 고정한다. 그리고 그 낱말은 **트윈의 자리 이름**이다 — 커넥터가 지금 채우는 자리가 곧
11
+ * 지금 하는 일이다(`design/integration/connector-checklist.md` 의 마스터 축과 같은 이름).
12
+ *
13
+ * 그러면 셋이 함께 얻어진다.
14
+ * · 화면은 **단계마다 하나의 번역**만 두면 모든 커넥터를 보여 준다.
15
+ * · 사람은 원본이 달라도 **같은 말로** 진행을 읽는다.
16
+ * · 실패했을 때 「어느 자리를 읽다 실패했다」가 곧 「트윈의 무엇이 비었다」가 된다.
17
+ *
18
+ * ── 퍼센트를 만들려면 분모가 있어야 한다 ────────────────────────────────────
19
+ * 어댑터가 **자기가 보낼 단계를 미리 선언**한다(`ReferenceAdapter.masterSteps`). 그것이 분모다. 선언하지
20
+ * 않으면 화면은 퍼센트를 보이지 않고 단계 이름만 보인다 — **모르는 진행률을 지어내지 않는다.**
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.HOST_STEPS = exports.REFERENCE_STEPS = void 0;
24
+ exports.referencePercent = referencePercent;
25
+ /**
26
+ * 표준 단계. 순서는 대개 이 차례이지만 **강제하지 않는다** — 원본에 따라 없는 자리가 있고, 그때는 그
27
+ * 단계를 선언하지도 보내지도 않는다.
28
+ */
29
+ exports.REFERENCE_STEPS = [
30
+ /** 원본 스키마 확인 — 무엇을 물을 수 있는지 먼저 본다(판이 다를 수 있다). */
31
+ 'schema',
32
+ /** 공간·좌표 — 자리가 놓일 좌표계. */
33
+ 'space',
34
+ /** 자리 — 물건이 놓이고 작업이 일어나는 곳. */
35
+ 'locations',
36
+ /** 설비 — 일하는 것. */
37
+ 'equipment',
38
+ /** 공정 — 무슨 일을 하는가. */
39
+ 'operations',
40
+ /** 자재 — 무엇이 흐르는가. */
41
+ 'materials',
42
+ /** 경로 — 공정의 순서. */
43
+ 'routes',
44
+ /** 레시피 — 투입과 산출. */
45
+ 'recipes',
46
+ /** 시험 명세 — 무엇을 어떻게 검사하는가. */
47
+ 'testSpecifications',
48
+ /** 인원. */
49
+ 'persons',
50
+ /** 물리자산. */
51
+ 'assets',
52
+ /** 트윈 생성 — 여기부터는 호스트가 하는 일이다(어댑터가 선언하지 않는다). */
53
+ 'provision',
54
+ /** 기동. */
55
+ 'start'
56
+ ];
57
+ /** 호스트가 마스터 읽기 뒤에 하는 단계 — 어댑터의 선언에 이만큼을 더해 분모를 만든다. */
58
+ exports.HOST_STEPS = ['provision', 'start'];
59
+ /**
60
+ * 전체 진행률 — **분모를 알 때만 낸다.**
61
+ *
62
+ * 사이트가 여럿이면 사이트 사이의 진행도 함께 센다: 앞선 사이트는 끝난 것으로 본다.
63
+ */
64
+ function referencePercent(p) {
65
+ if (!p.total || p.total <= 0 || p.siteCount <= 0)
66
+ return undefined;
67
+ const perSite = 1 / p.siteCount;
68
+ const within = Math.min(p.done, p.total) / p.total;
69
+ return Math.round((p.siteIndex * perSite + within * perSite) * 100);
70
+ }
71
+ //# sourceMappingURL=reference-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-progress.js","sourceRoot":"","sources":["../../../server/service/reference/reference-progress.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAsEH,4CAKC;AAzED;;;GAGG;AACU,QAAA,eAAe,GAAG;IAC7B,kDAAkD;IAClD,QAAQ;IACR,0BAA0B;IAC1B,OAAO;IACP,+BAA+B;IAC/B,WAAW;IACX,kBAAkB;IAClB,WAAW;IACX,sBAAsB;IACtB,YAAY;IACZ,qBAAqB;IACrB,WAAW;IACX,mBAAmB;IACnB,QAAQ;IACR,oBAAoB;IACpB,SAAS;IACT,6BAA6B;IAC7B,oBAAoB;IACpB,UAAU;IACV,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,gDAAgD;IAChD,WAAW;IACX,UAAU;IACV,OAAO;CACC,CAAA;AAIV,uDAAuD;AAC1C,QAAA,UAAU,GAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;AA2BjE;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,CAAoB;IACnD,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IAClE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAA;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAA;AACrE,CAAC","sourcesContent":["/*\n * 유입 진행 단계 — **모든 커넥터가 같은 낱말로 말한다.**\n *\n * ── 왜 표준화하나 (2026-08-21) ──────────────────────────────────────────────\n * 마스터 읽기는 원본에 여러 질의를 보내는 긴 작업이고, 그 사이 화면은 아무것도 알 수 없었다. 커넥터마다\n * 자기 낱말로 말하게 두면 화면이 커넥터 수만큼 문구를 알아야 하고, 새 커넥터가 생기면 화면에 낯선 글자가\n * 나온다.\n *\n * 그래서 낱말을 고정한다. 그리고 그 낱말은 **트윈의 자리 이름**이다 — 커넥터가 지금 채우는 자리가 곧\n * 지금 하는 일이다(`design/integration/connector-checklist.md` 의 마스터 축과 같은 이름).\n *\n * 그러면 셋이 함께 얻어진다.\n * · 화면은 **단계마다 하나의 번역**만 두면 모든 커넥터를 보여 준다.\n * · 사람은 원본이 달라도 **같은 말로** 진행을 읽는다.\n * · 실패했을 때 「어느 자리를 읽다 실패했다」가 곧 「트윈의 무엇이 비었다」가 된다.\n *\n * ── 퍼센트를 만들려면 분모가 있어야 한다 ────────────────────────────────────\n * 어댑터가 **자기가 보낼 단계를 미리 선언**한다(`ReferenceAdapter.masterSteps`). 그것이 분모다. 선언하지\n * 않으면 화면은 퍼센트를 보이지 않고 단계 이름만 보인다 — **모르는 진행률을 지어내지 않는다.**\n */\n\n/**\n * 표준 단계. 순서는 대개 이 차례이지만 **강제하지 않는다** — 원본에 따라 없는 자리가 있고, 그때는 그\n * 단계를 선언하지도 보내지도 않는다.\n */\nexport const REFERENCE_STEPS = [\n /** 원본 스키마 확인 — 무엇을 물을 수 있는지 먼저 본다(판이 다를 수 있다). */\n 'schema',\n /** 공간·좌표 — 자리가 놓일 좌표계. */\n 'space',\n /** 자리 — 물건이 놓이고 작업이 일어나는 곳. */\n 'locations',\n /** 설비 — 일하는 것. */\n 'equipment',\n /** 공정 — 무슨 일을 하는가. */\n 'operations',\n /** 자재 — 무엇이 흐르는가. */\n 'materials',\n /** 경로 — 공정의 순서. */\n 'routes',\n /** 레시피 — 투입과 산출. */\n 'recipes',\n /** 시험 명세 — 무엇을 어떻게 검사하는가. */\n 'testSpecifications',\n /** 인원. */\n 'persons',\n /** 물리자산. */\n 'assets',\n /** 트윈 생성 — 여기부터는 호스트가 하는 일이다(어댑터가 선언하지 않는다). */\n 'provision',\n /** 기동. */\n 'start'\n] as const\n\nexport type ReferenceStep = (typeof REFERENCE_STEPS)[number]\n\n/** 호스트가 마스터 읽기 뒤에 하는 단계 — 어댑터의 선언에 이만큼을 더해 분모를 만든다. */\nexport const HOST_STEPS: ReferenceStep[] = ['provision', 'start']\n\n/**\n * 한 단계의 진행 — 구독으로 흐르는 메시지의 몸통.\n *\n * `detail` 은 **그 단계 안에서 사람이 알아야 하는 것**이다(읽은 건수 등). 비어 있어도 된다 — 지어내지\n * 않는다.\n */\nexport interface ReferenceProgress {\n /** 어느 사이트를 만드는 중인가. */\n siteId: string\n step: ReferenceStep\n /** 이 사이트에서 끝낸 단계 수. */\n done: number\n /** 이 사이트의 전체 단계 수 — 어댑터가 선언하지 않으면 없다(그때 퍼센트를 만들지 않는다). */\n total?: number\n /** 여러 사이트를 한 번에 만들 때, 지금 몇 번째인가. */\n siteIndex: number\n siteCount: number\n /** 그 단계 안의 사실 — 「자리 128건」처럼. */\n detail?: string\n /** 이 단계에서 실패했는가. 실패해도 화면이 그 자리를 그대로 보여 줄 수 있어야 한다. */\n failed?: boolean\n /** 실패 이유 — 실패했을 때만. */\n error?: string\n}\n\n/**\n * 전체 진행률 — **분모를 알 때만 낸다.**\n *\n * 사이트가 여럿이면 사이트 사이의 진행도 함께 센다: 앞선 사이트는 끝난 것으로 본다.\n */\nexport function referencePercent(p: ReferenceProgress): number | undefined {\n if (!p.total || p.total <= 0 || p.siteCount <= 0) return undefined\n const perSite = 1 / p.siteCount\n const within = Math.min(p.done, p.total) / p.total\n return Math.round((p.siteIndex * perSite + within * perSite) * 100)\n}\n"]}