@things-factory/headless-twin 10.0.8 → 10.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/dist-server/engine/attention-digest.d.ts +52 -0
  2. package/dist-server/engine/attention-digest.js +76 -0
  3. package/dist-server/engine/attention-digest.js.map +1 -0
  4. package/dist-server/engine/canonical-ingest.d.ts +2 -2
  5. package/dist-server/engine/canonical-ingest.js +24 -2
  6. package/dist-server/engine/canonical-ingest.js.map +1 -1
  7. package/dist-server/engine/command-routing.d.ts +33 -0
  8. package/dist-server/engine/command-routing.js +53 -0
  9. package/dist-server/engine/command-routing.js.map +1 -0
  10. package/dist-server/engine/energy-topology.d.ts +86 -0
  11. package/dist-server/engine/energy-topology.js +144 -0
  12. package/dist-server/engine/energy-topology.js.map +1 -0
  13. package/dist-server/engine/index.d.ts +11 -0
  14. package/dist-server/engine/index.js +17 -0
  15. package/dist-server/engine/index.js.map +1 -1
  16. package/dist-server/engine/kpi-baseline.d.ts +78 -0
  17. package/dist-server/engine/kpi-baseline.js +123 -0
  18. package/dist-server/engine/kpi-baseline.js.map +1 -0
  19. package/dist-server/engine/kpi-fold.d.ts +137 -1
  20. package/dist-server/engine/kpi-fold.js +225 -0
  21. package/dist-server/engine/kpi-fold.js.map +1 -1
  22. package/dist-server/engine/kpi-query.d.ts +32 -1
  23. package/dist-server/engine/kpi-query.js +262 -20
  24. package/dist-server/engine/kpi-query.js.map +1 -1
  25. package/dist-server/engine/kpi-target.d.ts +17 -0
  26. package/dist-server/engine/kpi-target.js +24 -2
  27. package/dist-server/engine/kpi-target.js.map +1 -1
  28. package/dist-server/engine/live-attentions.d.ts +1 -0
  29. package/dist-server/engine/live-attentions.js +7 -1
  30. package/dist-server/engine/live-attentions.js.map +1 -1
  31. package/dist-server/engine/live-feed-registry.d.ts +25 -0
  32. package/dist-server/engine/live-feed-registry.js +51 -0
  33. package/dist-server/engine/live-feed-registry.js.map +1 -0
  34. package/dist-server/engine/load-meter.d.ts +181 -0
  35. package/dist-server/engine/load-meter.js +267 -0
  36. package/dist-server/engine/load-meter.js.map +1 -0
  37. package/dist-server/engine/local-declarations.d.ts +262 -0
  38. package/dist-server/engine/local-declarations.js +528 -0
  39. package/dist-server/engine/local-declarations.js.map +1 -0
  40. package/dist-server/engine/model-basis.d.ts +39 -6
  41. package/dist-server/engine/model-basis.js +69 -9
  42. package/dist-server/engine/model-basis.js.map +1 -1
  43. package/dist-server/engine/model-vocabulary.d.ts +17 -0
  44. package/dist-server/engine/model-vocabulary.js +81 -0
  45. package/dist-server/engine/model-vocabulary.js.map +1 -0
  46. package/dist-server/engine/oee-accumulator.d.ts +28 -0
  47. package/dist-server/engine/oee-accumulator.js +26 -1
  48. package/dist-server/engine/oee-accumulator.js.map +1 -1
  49. package/dist-server/engine/operation-basis.d.ts +32 -0
  50. package/dist-server/engine/operation-basis.js +87 -0
  51. package/dist-server/engine/operation-basis.js.map +1 -0
  52. package/dist-server/engine/property-effects.d.ts +30 -0
  53. package/dist-server/engine/property-effects.js +192 -0
  54. package/dist-server/engine/property-effects.js.map +1 -0
  55. package/dist-server/engine/runtime-key.d.ts +15 -0
  56. package/dist-server/engine/runtime-key.js +64 -0
  57. package/dist-server/engine/runtime-key.js.map +1 -0
  58. package/dist-server/engine/spec-coverage.js +3 -3
  59. package/dist-server/engine/spec-coverage.js.map +1 -1
  60. package/dist-server/engine/state-axes.d.ts +21 -0
  61. package/dist-server/engine/state-axes.js +59 -0
  62. package/dist-server/engine/state-axes.js.map +1 -0
  63. package/dist-server/engine/structure-diff.js +1 -1
  64. package/dist-server/engine/structure-diff.js.map +1 -1
  65. package/dist-server/engine/travel-estimator.d.ts +9 -2
  66. package/dist-server/engine/travel-estimator.js +11 -6
  67. package/dist-server/engine/travel-estimator.js.map +1 -1
  68. package/dist-server/engine/twin-engine.d.ts +418 -57
  69. package/dist-server/engine/twin-engine.js +1599 -306
  70. package/dist-server/engine/twin-engine.js.map +1 -1
  71. package/dist-server/engine/warm-start.d.ts +93 -13
  72. package/dist-server/engine/warm-start.js +114 -14
  73. package/dist-server/engine/warm-start.js.map +1 -1
  74. package/dist-server/index.d.ts +1 -0
  75. package/dist-server/index.js +17 -11
  76. package/dist-server/index.js.map +1 -1
  77. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.d.ts +5 -0
  78. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +48 -0
  79. package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -0
  80. package/dist-server/migrations/index.d.ts +2 -0
  81. package/dist-server/migrations/index.js +10 -0
  82. package/dist-server/migrations/index.js.map +1 -0
  83. package/dist-server/service/index.d.ts +3 -2
  84. package/dist-server/service/index.js +25 -17
  85. package/dist-server/service/index.js.map +1 -1
  86. package/dist-server/service/reference/discovery-result.d.ts +34 -0
  87. package/dist-server/service/reference/discovery-result.js +84 -0
  88. package/dist-server/service/reference/discovery-result.js.map +1 -0
  89. package/dist-server/service/reference/ingest-space.d.ts +53 -0
  90. package/dist-server/service/reference/ingest-space.js +79 -0
  91. package/dist-server/service/reference/ingest-space.js.map +1 -0
  92. package/dist-server/service/reference/knob-defaults.d.ts +20 -0
  93. package/dist-server/service/reference/knob-defaults.js +59 -0
  94. package/dist-server/service/reference/knob-defaults.js.map +1 -0
  95. package/dist-server/service/reference/reference-live.d.ts +23 -0
  96. package/dist-server/service/reference/reference-live.js +123 -6
  97. package/dist-server/service/reference/reference-live.js.map +1 -1
  98. package/dist-server/service/reference/reference-master.d.ts +227 -11
  99. package/dist-server/service/reference/reference-master.js +206 -25
  100. package/dist-server/service/reference/reference-master.js.map +1 -1
  101. package/dist-server/service/reference/reference-resolver.d.ts +33 -3
  102. package/dist-server/service/reference/reference-resolver.js +290 -23
  103. package/dist-server/service/reference/reference-resolver.js.map +1 -1
  104. package/dist-server/service/reference/template-registry.d.ts +19 -3
  105. package/dist-server/service/reference/template-registry.js.map +1 -1
  106. package/dist-server/service/twin-attention/twin-attention-query.d.ts +8 -1
  107. package/dist-server/service/twin-attention/twin-attention-query.js +39 -8
  108. package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
  109. package/dist-server/service/twin-audit/command-audit.d.ts +37 -0
  110. package/dist-server/service/twin-audit/command-audit.js +53 -0
  111. package/dist-server/service/twin-audit/command-audit.js.map +1 -0
  112. package/dist-server/service/twin-audit/index.d.ts +4 -0
  113. package/dist-server/service/twin-audit/index.js +8 -0
  114. package/dist-server/service/twin-audit/index.js.map +1 -0
  115. package/dist-server/service/twin-audit/twin-audit-event.d.ts +24 -0
  116. package/dist-server/service/twin-audit/twin-audit-event.js +125 -0
  117. package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -0
  118. package/dist-server/service/twin-audit/twin-audit-query.d.ts +4 -0
  119. package/dist-server/service/twin-audit/twin-audit-query.js +76 -0
  120. package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -0
  121. package/dist-server/service/twin-control/twin-control-mutation.d.ts +2 -0
  122. package/dist-server/service/twin-control/twin-control-mutation.js +50 -11
  123. package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
  124. package/dist-server/service/twin-event/twin-event-keys.d.ts +1 -1
  125. package/dist-server/service/twin-event/twin-event-keys.js +1 -1
  126. package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
  127. package/dist-server/service/twin-event/twin-event.d.ts +14 -5
  128. package/dist-server/service/twin-event/twin-event.js +46 -14
  129. package/dist-server/service/twin-event/twin-event.js.map +1 -1
  130. package/dist-server/service/twin-forecast/forecast-metrics.d.ts +13 -0
  131. package/dist-server/service/twin-forecast/forecast-metrics.js +57 -0
  132. package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -0
  133. package/dist-server/service/twin-forecast/forecast-tuning.d.ts +12 -0
  134. package/dist-server/service/twin-forecast/forecast-tuning.js +44 -0
  135. package/dist-server/service/twin-forecast/forecast-tuning.js.map +1 -0
  136. package/dist-server/service/twin-forecast/gap-analytics.d.ts +28 -2
  137. package/dist-server/service/twin-forecast/gap-analytics.js +43 -17
  138. package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
  139. package/dist-server/service/twin-forecast/twin-forecast-query.js +219 -39
  140. package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
  141. package/dist-server/service/twin-instance/twin-instance.d.ts +38 -5
  142. package/dist-server/service/twin-instance/twin-instance.js +66 -18
  143. package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
  144. package/dist-server/service/twin-journal/twin-journal-query.d.ts +11 -4
  145. package/dist-server/service/twin-journal/twin-journal-query.js +95 -15
  146. package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
  147. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +11 -5
  148. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +46 -27
  149. package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
  150. package/dist-server/service/twin-metrics/twin-metrics-query.d.ts +1 -0
  151. package/dist-server/service/twin-metrics/twin-metrics-query.js +63 -1
  152. package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
  153. package/dist-server/service/twin-model/epcis-coverage.d.ts +14 -0
  154. package/dist-server/service/twin-model/epcis-coverage.js +174 -0
  155. package/dist-server/service/twin-model/epcis-coverage.js.map +1 -0
  156. package/dist-server/service/twin-model/iec61850-coverage.d.ts +14 -0
  157. package/dist-server/service/twin-model/iec61850-coverage.js +98 -0
  158. package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -0
  159. package/dist-server/service/twin-model/index.d.ts +13 -0
  160. package/dist-server/service/twin-model/index.js +29 -0
  161. package/dist-server/service/twin-model/index.js.map +1 -0
  162. package/dist-server/service/twin-model/isa95-coverage.d.ts +48 -0
  163. package/dist-server/service/twin-model/isa95-coverage.js +155 -0
  164. package/dist-server/service/twin-model/isa95-coverage.js.map +1 -0
  165. package/dist-server/service/twin-model/project-structure.d.ts +16 -0
  166. package/dist-server/service/twin-model/project-structure.js +173 -0
  167. package/dist-server/service/twin-model/project-structure.js.map +1 -0
  168. package/dist-server/service/twin-model/standard-coverage.d.ts +9 -0
  169. package/dist-server/service/twin-model/standard-coverage.js +37 -0
  170. package/dist-server/service/twin-model/standard-coverage.js.map +1 -0
  171. package/dist-server/service/twin-model/twin-equipment.d.ts +64 -0
  172. package/dist-server/service/twin-model/twin-equipment.js +134 -0
  173. package/dist-server/service/twin-model/twin-equipment.js.map +1 -0
  174. package/dist-server/service/twin-model/twin-lineage-query.d.ts +3 -0
  175. package/dist-server/service/twin-model/twin-lineage-query.js +206 -0
  176. package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -0
  177. package/dist-server/service/twin-model/twin-location.d.ts +58 -0
  178. package/dist-server/service/twin-model/twin-location.js +130 -0
  179. package/dist-server/service/twin-model/twin-location.js.map +1 -0
  180. package/dist-server/service/twin-model/twin-model-item-query.d.ts +141 -0
  181. package/dist-server/service/twin-model/twin-model-item-query.js +852 -0
  182. package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -0
  183. package/dist-server/service/twin-model/twin-model-mutation.d.ts +57 -0
  184. package/dist-server/service/twin-model/twin-model-mutation.js +490 -0
  185. package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -0
  186. package/dist-server/service/twin-model/twin-model-query.d.ts +43 -0
  187. package/dist-server/service/twin-model/twin-model-query.js +551 -0
  188. package/dist-server/service/twin-model/twin-model-query.js.map +1 -0
  189. package/dist-server/service/twin-model/twin-model-tree-query.d.ts +3 -0
  190. package/dist-server/service/twin-model/twin-model-tree-query.js +158 -0
  191. package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -0
  192. package/dist-server/service/twin-model/twin-operation.d.ts +61 -0
  193. package/dist-server/service/twin-model/twin-operation.js +137 -0
  194. package/dist-server/service/twin-model/twin-operation.js.map +1 -0
  195. package/dist-server/service/twin-space/move-space.d.ts +65 -0
  196. package/dist-server/service/twin-space/move-space.js +166 -0
  197. package/dist-server/service/twin-space/move-space.js.map +1 -0
  198. package/dist-server/service/twin-space/space-integrity.d.ts +97 -0
  199. package/dist-server/service/twin-space/space-integrity.js +182 -0
  200. package/dist-server/service/twin-space/space-integrity.js.map +1 -0
  201. package/dist-server/service/twin-space/twin-space-area.js +4 -4
  202. package/dist-server/service/twin-space/twin-space-area.js.map +1 -1
  203. package/dist-server/service/twin-space/twin-space-representation.js +6 -6
  204. package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
  205. package/dist-server/service/twin-space/twin-space-resolver.d.ts +63 -1
  206. package/dist-server/service/twin-space/twin-space-resolver.js +365 -18
  207. package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
  208. package/dist-server/service/twin-space/twin-space.d.ts +17 -1
  209. package/dist-server/service/twin-space/twin-space.js +15 -5
  210. package/dist-server/service/twin-space/twin-space.js.map +1 -1
  211. package/dist-server/service/twin-state/twin-state-subscription.js +1 -1
  212. package/dist-server/service/twin-state/twin-state-subscription.js.map +1 -1
  213. package/dist-server/service/twin-structure/twin-structure.d.ts +1 -1
  214. package/dist-server/service/twin-structure/twin-structure.js +8 -7
  215. package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
  216. package/dist-server/service/twin-target/twin-target-resolver.js +21 -4
  217. package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
  218. package/dist-shared/axis-read.d.ts +12 -0
  219. package/dist-shared/axis-read.js +32 -0
  220. package/dist-shared/axis-read.js.map +1 -0
  221. package/dist-shared/entity-delta.d.ts +29 -0
  222. package/dist-shared/entity-delta.js +287 -0
  223. package/dist-shared/entity-delta.js.map +1 -0
  224. package/dist-shared/kpi-broadcast.d.ts +4 -0
  225. package/dist-shared/kpi-broadcast.js +16 -0
  226. package/dist-shared/kpi-broadcast.js.map +1 -0
  227. package/dist-shared/twin-level.d.ts +23 -0
  228. package/dist-shared/twin-level.js +52 -0
  229. package/dist-shared/twin-level.js.map +1 -0
  230. package/package.json +14 -12
  231. package/server/engine/attention-digest.ts +102 -0
  232. package/server/engine/canonical-ingest.ts +36 -4
  233. package/server/engine/command-routing.ts +67 -0
  234. package/server/engine/energy-topology.ts +189 -0
  235. package/server/engine/index.ts +17 -0
  236. package/server/engine/kpi-baseline.ts +202 -0
  237. package/server/engine/kpi-fold.ts +389 -1
  238. package/server/engine/kpi-query.ts +295 -22
  239. package/server/engine/kpi-target.ts +24 -2
  240. package/server/engine/live-attentions.ts +7 -2
  241. package/server/engine/live-feed-registry.ts +58 -0
  242. package/server/engine/load-meter.ts +384 -0
  243. package/server/engine/local-declarations.ts +700 -0
  244. package/server/engine/model-basis.ts +78 -10
  245. package/server/engine/model-vocabulary.ts +82 -0
  246. package/server/engine/oee-accumulator.ts +34 -1
  247. package/server/engine/operation-basis.ts +100 -0
  248. package/server/engine/property-effects.ts +199 -0
  249. package/server/engine/runtime-key.ts +58 -0
  250. package/server/engine/spec-coverage.ts +3 -3
  251. package/server/engine/state-axes.ts +60 -0
  252. package/server/engine/structure-diff.ts +1 -1
  253. package/server/engine/travel-estimator.ts +11 -6
  254. package/server/engine/twin-engine.ts +1710 -297
  255. package/server/engine/warm-start.ts +207 -22
  256. package/server/index.ts +13 -10
  257. package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +43 -0
  258. package/server/migrations/index.ts +7 -0
  259. package/server/service/index.ts +9 -1
  260. package/server/service/reference/discovery-result.ts +95 -0
  261. package/server/service/reference/ingest-space.ts +104 -0
  262. package/server/service/reference/knob-defaults.ts +59 -0
  263. package/server/service/reference/reference-live.ts +121 -6
  264. package/server/service/reference/reference-master.ts +362 -35
  265. package/server/service/reference/reference-resolver.ts +307 -23
  266. package/server/service/reference/template-registry.ts +20 -5
  267. package/server/service/twin-attention/twin-attention-query.ts +43 -6
  268. package/server/service/twin-audit/command-audit.ts +81 -0
  269. package/server/service/twin-audit/index.ts +5 -0
  270. package/server/service/twin-audit/twin-audit-event.ts +112 -0
  271. package/server/service/twin-audit/twin-audit-query.ts +72 -0
  272. package/server/service/twin-control/twin-control-mutation.ts +53 -13
  273. package/server/service/twin-event/twin-event-keys.ts +1 -1
  274. package/server/service/twin-event/twin-event.ts +52 -15
  275. package/server/service/twin-forecast/forecast-metrics.ts +60 -0
  276. package/server/service/twin-forecast/forecast-tuning.ts +40 -0
  277. package/server/service/twin-forecast/gap-analytics.ts +48 -9
  278. package/server/service/twin-forecast/twin-forecast-query.ts +211 -38
  279. package/server/service/twin-instance/twin-instance.ts +127 -22
  280. package/server/service/twin-journal/twin-journal-query.ts +108 -14
  281. package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +40 -23
  282. package/server/service/twin-metrics/twin-metrics-query.ts +60 -3
  283. package/server/service/twin-model/epcis-coverage.ts +195 -0
  284. package/server/service/twin-model/iec61850-coverage.ts +117 -0
  285. package/server/service/twin-model/index.ts +25 -0
  286. package/server/service/twin-model/isa95-coverage.ts +190 -0
  287. package/server/service/twin-model/project-structure.ts +199 -0
  288. package/server/service/twin-model/standard-coverage.ts +35 -0
  289. package/server/service/twin-model/twin-equipment.ts +150 -0
  290. package/server/service/twin-model/twin-lineage-query.ts +193 -0
  291. package/server/service/twin-model/twin-location.ts +140 -0
  292. package/server/service/twin-model/twin-model-item-query.ts +848 -0
  293. package/server/service/twin-model/twin-model-mutation.ts +503 -0
  294. package/server/service/twin-model/twin-model-query.ts +537 -0
  295. package/server/service/twin-model/twin-model-tree-query.ts +180 -0
  296. package/server/service/twin-model/twin-operation.ts +150 -0
  297. package/server/service/twin-space/move-space.ts +262 -0
  298. package/server/service/twin-space/space-integrity.ts +293 -0
  299. package/server/service/twin-space/twin-space-area.ts +4 -4
  300. package/server/service/twin-space/twin-space-representation.ts +6 -6
  301. package/server/service/twin-space/twin-space-resolver.ts +365 -22
  302. package/server/service/twin-space/twin-space.ts +40 -6
  303. package/server/service/twin-state/twin-state-subscription.ts +1 -1
  304. package/server/service/twin-structure/twin-structure.ts +10 -7
  305. package/server/service/twin-target/twin-target-resolver.ts +22 -4
  306. package/shared/axis-read.ts +28 -0
  307. package/shared/entity-delta.ts +286 -0
  308. package/shared/kpi-broadcast.ts +13 -0
  309. package/shared/twin-level.ts +48 -0
  310. package/test/adopt-structure-live.test.ts +133 -0
  311. package/test/attention-digest.test.ts +135 -0
  312. package/test/axis-read.test.ts +87 -0
  313. package/test/boot-resume.test.ts +205 -0
  314. package/test/canonical-ingest-vocabularies.test.ts +118 -0
  315. package/test/capability-mapping.test.ts +5 -5
  316. package/test/command-routing.test.ts +61 -0
  317. package/test/declaration-reaches-model.test.ts +178 -0
  318. package/test/discovery-result.test.ts +75 -0
  319. package/test/energy-topology.test.ts +113 -0
  320. package/test/entity-delta.test.ts +195 -25
  321. package/test/event-time-column.test.ts +67 -0
  322. package/test/forecast-metrics.test.ts +71 -0
  323. package/test/forecast-tuning.test.ts +42 -0
  324. package/test/gap-analytics.test.ts +34 -7
  325. package/test/ingest-bench.test.ts +9 -9
  326. package/test/ingest-running-guard.test.ts +136 -0
  327. package/test/ingest-space.test.ts +78 -0
  328. package/test/instance-cache-lifecycle.test.ts +110 -0
  329. package/test/kernel-kind-guard.test.ts +96 -0
  330. package/test/knob-defaults.test.ts +72 -0
  331. package/test/kpi-baseline-db.test.ts +216 -0
  332. package/test/kpi-baseline.test.ts +196 -0
  333. package/test/kpi-fold.test.ts +393 -2
  334. package/test/kpi-query-bench.test.ts +130 -0
  335. package/test/lineage-survives-restart.test.ts +203 -0
  336. package/test/live-feed-registry.test.ts +67 -0
  337. package/test/live-kernel-facts.test.ts +161 -0
  338. package/test/live-mirror-parity.test.ts +54 -14
  339. package/test/load-meter.test.ts +314 -0
  340. package/test/local-declarations.test.ts +554 -0
  341. package/test/master-to-twin.test.ts +128 -36
  342. package/test/model-basis.test.ts +56 -1
  343. package/test/model-vocabulary.test.ts +114 -0
  344. package/test/move-space.test.ts +149 -0
  345. package/test/mutation-gate.test.ts +122 -0
  346. package/test/oee-accumulator.test.ts +90 -7
  347. package/test/operation-basis.test.ts +100 -0
  348. package/test/operations-capability-db.test.ts +165 -0
  349. package/test/project-structure-db.test.ts +226 -0
  350. package/test/projection-reaches-screen.test.ts +272 -0
  351. package/test/property-effects.test.ts +96 -0
  352. package/test/registry-key-guard.test.ts +80 -0
  353. package/test/resync-origin-site.test.ts +77 -0
  354. package/test/runtime-key.test.ts +66 -0
  355. package/test/scale-twin-bench.test.ts +7 -7
  356. package/test/snapshot-freshness.test.ts +60 -0
  357. package/test/space-integrity.test.ts +223 -0
  358. package/test/standard-coverage.test.ts +94 -0
  359. package/test/state-axes.test.ts +74 -0
  360. package/test/streamline-e2e.test.ts +16 -16
  361. package/test/structure-revision-db.test.ts +16 -15
  362. package/test/tenant-registry-db.test.ts +149 -0
  363. package/test/twin-audit.test.ts +83 -0
  364. package/test/twin-model-item-db.test.ts +275 -0
  365. package/test/twin-model-tree-db.test.ts +176 -0
  366. package/test/twin-origin-resync.test.ts +114 -0
  367. package/test/warm-start-seam.test.ts +140 -0
  368. package/test/warm-start.test.ts +223 -4
  369. package/tsconfig.json +6 -1
  370. package/tsconfig.shared.json +23 -0
  371. package/tsconfig.shared.tsbuildinfo +1 -0
  372. package/tsconfig.tsbuildinfo +1 -0
  373. package/dist-server/engine/entity-delta.d.ts +0 -19
  374. package/dist-server/engine/entity-delta.js +0 -161
  375. package/dist-server/engine/entity-delta.js.map +0 -1
  376. package/dist-server/service/twin-event/backfill-keys.d.ts +0 -11
  377. package/dist-server/service/twin-event/backfill-keys.js +0 -63
  378. package/dist-server/service/twin-event/backfill-keys.js.map +0 -1
  379. package/dist-server/tsconfig.tsbuildinfo +0 -1
  380. package/server/engine/entity-delta.ts +0 -169
  381. package/server/service/twin-event/backfill-keys.ts +0 -72
@@ -0,0 +1,293 @@
1
+ /*
2
+ * 공간 ↔ 트윈 ↔ 가시화 정합성 — **순수**. 세 축이 서로 어긋난 자리를 찾는다.
3
+ *
4
+ * ── 왜 있나 (2026-08-13) ────────────────────────────────────────────────────
5
+ * 이 셋은 서로를 id 로만 가리킨다. 참조 무결성을 DB 가 지켜 주지 않는 지점이 많다:
6
+ * 공간·구역은 공간에 매이고, 로케이션·설비는 트윈에 매이고, 폴리곤은 **양쪽을 가리킨다.**
7
+ * 그래서 트윈을 옮기거나 떼거나(2026-08-13 추가) 원본을 다시 읽으면, 아무 오류 없이 **가리킬 것이
8
+ * 없는 도형**과 **소속 없는 로케이션**이 남는다. 증상은 "지도가 비었다" 뿐이고 원인은 화면에 없다.
9
+ *
10
+ * 그 어긋남을 사람이 눈으로 맞추고 있었다(spaceId 를 목록에서 대조). 기계가 대신 본다.
11
+ *
12
+ * ── 무엇을 사실로 보나 ─────────────────────────────────────────────────────
13
+ * 판정은 **조회 결과만** 받는다(DB 를 물지 않는다). 그래서 단위테스트로 전부 부를 수 있고, 호출측은
14
+ * 사실을 모으는 일만 한다. 각 발견은 언어 중립 코드 + 파라미터이고, 화면이 사람 말을 만든다.
15
+ *
16
+ * ── 심각도를 가른다 ────────────────────────────────────────────────────────
17
+ * `broken` 은 무언가 이미 보이지 않는 상태다(가리킬 대상이 없다). `warn` 은 아직 보이지만 뜻이
18
+ * 흐려진 상태다(소속 없음·대표 없음). 섞으면 사람이 무엇을 먼저 볼지 정할 수 없다.
19
+ */
20
+
21
+ export type SpaceIntegrityCode =
22
+ /** 트윈이 없는 공간을 가리킨다 — 그 트윈은 무대가 사라졌다. */
23
+ | 'twin-space-missing'
24
+ /** 레지스트리와 model 의 공간이 다르다 — 어느 쪽이 사실인지 알 수 없다. */
25
+ | 'twin-space-mismatch'
26
+ /** 폴리곤이 이 공간에 없는 구역을 가리킨다. */
27
+ | 'polygon-area-missing'
28
+ /** 폴리곤이 이 공간에 사는 어느 트윈에도 없는 로케이션·설비를 가리킨다. */
29
+ | 'polygon-target-missing'
30
+ /** 로케이션이 이 공간에 없는 구역에 소속되어 있다. */
31
+ | 'location-area-missing'
32
+ /** 대표 표현이 이 공간의 표현이 아니다. */
33
+ | 'primary-representation-missing'
34
+ /** 보드 표현이 보드를 가리키지 않는다(또는 없는 보드를 가리킨다). */
35
+ | 'board-representation-unbound'
36
+ /** 표현이 하나도 없는 공간에 트윈이 산다 — 볼 화면이 없다. */
37
+ | 'space-without-representation'
38
+ /** 어느 공간에도 속하지 않은 트윈 — 뗀 결과일 수 있다(사실이면 정상). */
39
+ | 'twin-without-space'
40
+ /**
41
+ * 이 트윈이 **담을 줄 모르는 어휘**를 받고 있다 — 리비전은 오르는데 상태가 채워지지 않는다.
42
+ *
43
+ * 커널은 모르는 `eventType` 을 버리고(전방 호환) 종류별로 센다(`state.unhandled`). 그 수가 0이
44
+ * 아니면 둘 중 하나다: 커넥터가 엉뚱한 트윈에 붙었거나(예: `energy.*` 가 창고 트윈으로), 커널이
45
+ * 낡아 새 어휘를 모른다. 둘 다 사람이 손봐야 하는 것이고, 조용히 두면 「정상인데 빈」 트윈이 된다.
46
+ */
47
+ | 'twin-unhandled-vocabulary'
48
+
49
+ export type SpaceIntegritySeverity = 'broken' | 'warn'
50
+
51
+ export interface SpaceIntegrityFinding {
52
+ code: SpaceIntegrityCode
53
+ severity: SpaceIntegritySeverity
54
+ /** 어디의 문제인가 — 화면이 그 자리로 데려갈 수 있게. */
55
+ spaceId?: string
56
+ instanceId?: string
57
+ representationId?: string
58
+ params?: Record<string, string | number>
59
+ /** 영어 canonical — 로그·폴백. */
60
+ message: string
61
+ }
62
+
63
+ /* ── 입력(조회 결과) ──────────────────────────────────────────────────────── */
64
+
65
+ export interface IntegritySpace {
66
+ spaceId: string
67
+ primaryRepresentationId?: string | null
68
+ }
69
+
70
+ export interface IntegrityInstance {
71
+ instanceId: string
72
+ /** 레지스트리 컬럼. */
73
+ spaceId?: string | null
74
+ /** 저장된 model 의 공간 — 레지스트리와 같아야 한다. */
75
+ modelSpaceId?: string | null
76
+ purpose?: string | null
77
+ /** 이 트윈의 로케이션 id 들. */
78
+ locationIds?: readonly string[]
79
+ /** 이 트윈의 설비 id 들. */
80
+ equipmentIds?: readonly string[]
81
+ /** 로케이션의 소속 구역 id 들(중복 가능). */
82
+ areaRefs?: readonly (string | undefined | null)[]
83
+ /**
84
+ * 커널이 담을 줄 몰라 버린 사건들 — 실행 중인 트윈의 상태에서 온다(`state.unhandled`).
85
+ *
86
+ * 정지한 트윈에서는 알 수 없으므로 `undefined` 다 — **없는 것과 모르는 것을 구별한다**(빈 배열을
87
+ * 넣으면 「받은 것이 없다」는 사실 주장이 되고, 그것은 우리가 확인한 바가 아니다).
88
+ */
89
+ unhandled?: readonly { eventType: string; count: number }[]
90
+ }
91
+
92
+ export interface IntegrityRepresentation {
93
+ id: string
94
+ spaceId: string
95
+ type: string
96
+ /** 보드 표현이면 보드 id. */
97
+ boardId?: string | null
98
+ /** 폴리곤 바인딩들. */
99
+ polygons?: readonly IntegrityPolygon[]
100
+ }
101
+
102
+ export interface IntegrityPolygon {
103
+ id?: string
104
+ /** 논리 구역 바인딩(그룹). */
105
+ groupId?: string | null
106
+ /** 개체 바인딩 — 로케이션 또는 설비. */
107
+ targetKind?: 'location' | 'equipment' | null
108
+ targetId?: string | null
109
+ }
110
+
111
+ export interface SpaceIntegrityInput {
112
+ spaces: readonly IntegritySpace[]
113
+ instances: readonly IntegrityInstance[]
114
+ representations: readonly IntegrityRepresentation[]
115
+ /** 공간별 구역 id 들. */
116
+ areasBySpace: Readonly<Record<string, readonly string[]>>
117
+ /** 존재하는 보드 id 들 — 보드 표현이 실제 보드를 가리키는지 본다. */
118
+ boardIds?: readonly string[]
119
+ }
120
+
121
+ /** 세 축을 맞대어 어긋난 자리를 모두 낸다. 비어 있으면 정합하다. */
122
+ export function checkSpaceIntegrity(input: SpaceIntegrityInput): SpaceIntegrityFinding[] {
123
+ const out: SpaceIntegrityFinding[] = []
124
+ const spaceIds = new Set(input.spaces.map(s => s.spaceId))
125
+ const areasOf = (spaceId: string) => new Set(input.areasBySpace[spaceId] ?? [])
126
+ const repsOf = (spaceId: string) => input.representations.filter(r => r.spaceId === spaceId)
127
+ const boards = new Set(input.boardIds ?? [])
128
+
129
+ /* 벤치 사본은 측정용 사본이라 이 검사의 대상이 아니다 — 사본의 공간은 잠깐 살고 지워진다. */
130
+ const instances = input.instances.filter(i => i.purpose !== 'bench')
131
+
132
+ /* ── 트윈 → 공간 ─────────────────────────────────────────────────────── */
133
+ for (const t of instances) {
134
+ const sid = (t.spaceId ?? '').trim()
135
+ const msid = (t.modelSpaceId ?? '').trim()
136
+
137
+ if (!sid) {
138
+ out.push({
139
+ code: 'twin-without-space',
140
+ severity: 'warn',
141
+ instanceId: t.instanceId,
142
+ message: `twin "${t.instanceId}" is on no site — it has no map or board to be drawn on`
143
+ })
144
+ } else if (!spaceIds.has(sid)) {
145
+ out.push({
146
+ code: 'twin-space-missing',
147
+ severity: 'broken',
148
+ instanceId: t.instanceId,
149
+ spaceId: sid,
150
+ message: `twin "${t.instanceId}" points at site "${sid}" which does not exist`
151
+ })
152
+ }
153
+
154
+ /* 두 곳이 어긋나면 어느 쪽이 사실인지 알 수 없다 — 보드는 model 을, 목록은 컬럼을 읽는다. */
155
+ if (sid !== msid) {
156
+ out.push({
157
+ code: 'twin-space-mismatch',
158
+ severity: 'broken',
159
+ instanceId: t.instanceId,
160
+ spaceId: sid || undefined,
161
+ params: { registry: sid || '—', model: msid || '—' },
162
+ message: `twin "${t.instanceId}" registry site "${sid || 'none'}" differs from its model site "${msid || 'none'}"`
163
+ })
164
+ }
165
+
166
+ /* 로케이션의 소속 구역은 **트윈이 속한 공간**의 것이어야 한다. */
167
+ if (sid && spaceIds.has(sid)) {
168
+ const have = areasOf(sid)
169
+ const refs = [...new Set((t.areaRefs ?? []).filter((x): x is string => !!x && !!x.trim()))]
170
+ const missing = refs.filter(r => !have.has(r)).sort()
171
+ if (missing.length) {
172
+ out.push({
173
+ code: 'location-area-missing',
174
+ severity: 'warn',
175
+ instanceId: t.instanceId,
176
+ spaceId: sid,
177
+ params: { count: missing.length, areas: missing.slice(0, 5).join(', ') },
178
+ message: `${missing.length} area(s) referenced by locations of "${t.instanceId}" do not exist in site "${sid}": ${missing
179
+ .slice(0, 5)
180
+ .join(', ')}`
181
+ })
182
+ }
183
+ }
184
+
185
+ /*
186
+ * 어휘가 맞는가 — 저널이 들어오는데 상태가 채워지지 않는 경우를 잡는다.
187
+ *
188
+ * `undefined` 는 「모른다」다(정지한 트윈). 세지 않는다 — 확인하지 않은 것을 정합으로도, 결함으로도
189
+ * 세지 않는 것이 이 하네스의 규율이다.
190
+ */
191
+ if (t.unhandled?.length) {
192
+ const total = t.unhandled.reduce((n, u) => n + u.count, 0)
193
+ const kinds = [...t.unhandled].sort((a, b) => b.count - a.count)
194
+ out.push({
195
+ code: 'twin-unhandled-vocabulary',
196
+ severity: 'warn',
197
+ instanceId: t.instanceId,
198
+ spaceId: sid || undefined,
199
+ params: { events: total, kinds: kinds.length, types: kinds.slice(0, 3).map(u => u.eventType).join(', ') },
200
+ message: `twin "${t.instanceId}" received ${total} event(s) of ${kinds.length} type(s) its kernel does not handle: ${kinds
201
+ .slice(0, 3)
202
+ .map(u => u.eventType)
203
+ .join(', ')}`
204
+ })
205
+ }
206
+ }
207
+
208
+ /* ── 공간 → 가시화 ───────────────────────────────────────────────────── */
209
+ for (const s of input.spaces) {
210
+ const reps = repsOf(s.spaceId)
211
+ const livesHere = instances.filter(t => (t.spaceId ?? '') === s.spaceId)
212
+
213
+ /* 트윈이 사는데 표현이 없으면 볼 화면이 없다. 트윈이 없는 빈 현장은 정상이므로 세지 않는다. */
214
+ if (livesHere.length && !reps.length) {
215
+ out.push({
216
+ code: 'space-without-representation',
217
+ severity: 'warn',
218
+ spaceId: s.spaceId,
219
+ params: { twins: livesHere.length },
220
+ message: `site "${s.spaceId}" has ${livesHere.length} twin(s) but no representation — there is nothing to draw them on`
221
+ })
222
+ }
223
+
224
+ const primary = (s.primaryRepresentationId ?? '').trim()
225
+ if (primary && !reps.some(r => r.id === primary)) {
226
+ out.push({
227
+ code: 'primary-representation-missing',
228
+ severity: 'broken',
229
+ spaceId: s.spaceId,
230
+ params: { representationId: primary },
231
+ message: `site "${s.spaceId}" points at primary representation "${primary}" which is not one of its representations`
232
+ })
233
+ }
234
+ }
235
+
236
+ /* ── 가시화 → 공간·트윈 ─────────────────────────────────────────────── */
237
+ for (const rep of input.representations) {
238
+ const have = areasOf(rep.spaceId)
239
+ /* 이 공간에 사는 트윈들의 개체 id — 폴리곤이 가리킬 수 있는 전부. */
240
+ const here = instances.filter(t => (t.spaceId ?? '') === rep.spaceId)
241
+ const locationIds = new Set(here.flatMap(t => [...(t.locationIds ?? [])]))
242
+ const equipmentIds = new Set(here.flatMap(t => [...(t.equipmentIds ?? [])]))
243
+
244
+ if (rep.type === 'board' && !(rep.boardId && boards.has(rep.boardId))) {
245
+ out.push({
246
+ code: 'board-representation-unbound',
247
+ severity: 'broken',
248
+ spaceId: rep.spaceId,
249
+ representationId: rep.id,
250
+ params: { boardId: rep.boardId ?? '—' },
251
+ message: `board representation "${rep.id}" of site "${rep.spaceId}" does not point at an existing board (${rep.boardId ?? 'none'})`
252
+ })
253
+ }
254
+
255
+ for (const p of rep.polygons ?? []) {
256
+ const gid = (p.groupId ?? '').trim()
257
+ if (gid && !have.has(gid)) {
258
+ out.push({
259
+ code: 'polygon-area-missing',
260
+ severity: 'broken',
261
+ spaceId: rep.spaceId,
262
+ representationId: rep.id,
263
+ params: { areaId: gid, polygonId: p.id ?? '—' },
264
+ message: `a polygon of representation "${rep.id}" binds area "${gid}" which does not exist in site "${rep.spaceId}"`
265
+ })
266
+ }
267
+ const tid = (p.targetId ?? '').trim()
268
+ if (tid && p.targetKind) {
269
+ const pool = p.targetKind === 'equipment' ? equipmentIds : locationIds
270
+ if (!pool.has(tid)) {
271
+ out.push({
272
+ code: 'polygon-target-missing',
273
+ severity: 'broken',
274
+ spaceId: rep.spaceId,
275
+ representationId: rep.id,
276
+ params: { kind: p.targetKind, targetId: tid, polygonId: p.id ?? '—' },
277
+ message: `a polygon of representation "${rep.id}" binds ${p.targetKind} "${tid}", which no twin on site "${rep.spaceId}" has`
278
+ })
279
+ }
280
+ }
281
+ }
282
+ }
283
+
284
+ return out
285
+ }
286
+
287
+ /** 심각한 것부터 — 화면이 정렬을 다시 정하지 않게 한 곳에서 정한다. */
288
+ export function sortFindings(findings: readonly SpaceIntegrityFinding[]): SpaceIntegrityFinding[] {
289
+ const rank = (s: SpaceIntegritySeverity) => (s === 'broken' ? 0 : 1)
290
+ return [...findings].sort(
291
+ (a, b) => rank(a.severity) - rank(b.severity) || a.code.localeCompare(b.code) || (a.spaceId ?? '').localeCompare(b.spaceId ?? '')
292
+ )
293
+ }
@@ -7,12 +7,12 @@ import { TwinSpaceRepresentation } from './twin-space-representation.js'
7
7
 
8
8
  /*
9
9
  * TwinSpaceArea — map/image 표현 위의 폴리곤 구역(design/ui/space-composition.md).
10
- * geometry=폴리곤(map=위경도, image=px). drillTo=클릭 시 이동할 board/표현(폴리곤→보드 모니터/시뮬 뷰).
11
- * binding=트윈 엔티티/데이터 태그(라이브 상태 결합). board 표현은 씬 컴포넌트가 이 역할을 대신함.
10
+ * geometry=폴리곤(map=위경도, image=px). drillTo=클릭 시 이동할 model/표현(폴리곤→보드 모니터/시뮬 뷰).
11
+ * binding=트윈 엔티티/데이터 태그(라이브 상태 결합). model 표현은 씬 컴포넌트가 이 역할을 대신함.
12
12
  */
13
13
  @Entity()
14
14
  @Index('ix_twin_space_area_0', (e: TwinSpaceArea) => [e.domain, e.representation])
15
- @ObjectType({ description: 'A polygon region on a map/image representation, linked to a board (drill-down) and bound to a twin entity.' })
15
+ @ObjectType({ description: 'A polygon region on a map/image representation, linked to a model (drill-down) and bound to a twin entity.' })
16
16
  export class TwinSpaceArea {
17
17
  @PrimaryGeneratedColumn('uuid')
18
18
  @Field(type => ID)
@@ -45,7 +45,7 @@ export class TwinSpaceArea {
45
45
  geometry?: any
46
46
 
47
47
  @Column({ type: 'simple-json', nullable: true })
48
- @Field(type => ScalarObject, { nullable: true, description: 'Drill-down target { kind:"board"|"representation"|"space", id } — click navigates to a board monitor/sim view.' })
48
+ @Field(type => ScalarObject, { nullable: true, description: 'Drill-down target { kind:"board"|"representation"|"space", id } — click navigates to a model monitor/sim view.' })
49
49
  drillTo?: any
50
50
 
51
51
  @Column({ type: 'simple-json', nullable: true })
@@ -6,13 +6,13 @@ import { Domain, ScalarObject } from '@things-factory/shell'
6
6
  import { TwinSpace } from './twin-space.js'
7
7
 
8
8
  /*
9
- * TwinSpaceRepresentation — 공간을 보는 한 방식(map|image|board), 복수·1개 primary(공간구성 아키텍처, design/ui/space-composition.md).
10
- * config(simple-json): board={boardId}(board-service 참조) / image={attachmentId|boardId,width,height} / map={center,zoom,provider}.
11
- * 폴리곤 영역은 TwinSpaceArea(map/image), board 표현은 씬 컴포넌트가 대신.
9
+ * TwinSpaceRepresentation — 공간을 보는 한 방식(map|image|model), 복수·1개 primary(공간구성 아키텍처, design/ui/space-composition.md).
10
+ * config(simple-json): model={boardId}(board-service 참조) / image={attachmentId|boardId,width,height} / map={center,zoom,provider}.
11
+ * 폴리곤 영역은 TwinSpaceArea(map/image), model 표현은 씬 컴포넌트가 대신.
12
12
  */
13
13
  @Entity()
14
14
  @Index('ix_twin_space_rep_0', (e: TwinSpaceRepresentation) => [e.domain, e.space])
15
- @ObjectType({ description: 'A way to view a Space (map | image | board). Multiple per space, one primary.' })
15
+ @ObjectType({ description: 'A way to view a Space (map | image | model). Multiple per space, one primary.' })
16
16
  export class TwinSpaceRepresentation {
17
17
  @PrimaryGeneratedColumn('uuid')
18
18
  @Field(type => ID)
@@ -33,7 +33,7 @@ export class TwinSpaceRepresentation {
33
33
  spaceId?: string
34
34
 
35
35
  @Column()
36
- @Field({ description: 'Representation type: map | image | board.' })
36
+ @Field({ description: 'Representation type: map | image | model.' })
37
37
  type: string
38
38
 
39
39
  @Column({ nullable: true })
@@ -49,7 +49,7 @@ export class TwinSpaceRepresentation {
49
49
  isPrimary?: boolean
50
50
 
51
51
  @Column({ type: 'simple-json', nullable: true })
52
- @Field(type => ScalarObject, { nullable: true, description: 'Type config: board {boardId} / image {attachmentId|boardId,width,height} / map {center,zoom,provider}.' })
52
+ @Field(type => ScalarObject, { nullable: true, description: 'Type config: model {boardId} / image {attachmentId|boardId,width,height} / map {center,zoom,provider}.' })
53
53
  config?: any
54
54
 
55
55
  @CreateDateColumn()