@things-factory/ops-master 10.1.246 → 10.1.248

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 (429) hide show
  1. package/package.json +5 -5
  2. package/dist-client/bootstrap.d.ts +0 -19
  3. package/dist-client/bootstrap.js +0 -66
  4. package/dist-client/bootstrap.js.map +0 -1
  5. package/dist-client/index.d.ts +0 -17
  6. package/dist-client/index.js +0 -21
  7. package/dist-client/index.js.map +0 -1
  8. package/dist-client/master-change-approval.d.ts +0 -14
  9. package/dist-client/master-change-approval.js +0 -36
  10. package/dist-client/master-change-approval.js.map +0 -1
  11. package/dist-client/master-change-policy-axes.d.ts +0 -37
  12. package/dist-client/master-change-policy-axes.js +0 -29
  13. package/dist-client/master-change-policy-axes.js.map +0 -1
  14. package/dist-client/master-change-policy-panel.d.ts +0 -59
  15. package/dist-client/master-change-policy-panel.js +0 -454
  16. package/dist-client/master-change-policy-panel.js.map +0 -1
  17. package/dist-client/master-change-providers.d.ts +0 -4
  18. package/dist-client/master-change-providers.js +0 -91
  19. package/dist-client/master-change-providers.js.map +0 -1
  20. package/dist-client/pages/master/applied-when-dialog.d.ts +0 -48
  21. package/dist-client/pages/master/applied-when-dialog.js +0 -137
  22. package/dist-client/pages/master/applied-when-dialog.js.map +0 -1
  23. package/dist-client/pages/master/assignment-fields.d.ts +0 -27
  24. package/dist-client/pages/master/assignment-fields.js +0 -62
  25. package/dist-client/pages/master/assignment-fields.js.map +0 -1
  26. package/dist-client/pages/master/equipment-class.d.ts +0 -12
  27. package/dist-client/pages/master/equipment-class.js +0 -42
  28. package/dist-client/pages/master/equipment-class.js.map +0 -1
  29. package/dist-client/pages/master/equipment.d.ts +0 -12
  30. package/dist-client/pages/master/equipment.js +0 -58
  31. package/dist-client/pages/master/equipment.js.map +0 -1
  32. package/dist-client/pages/master/grist-iso-duration.d.ts +0 -20
  33. package/dist-client/pages/master/grist-iso-duration.js +0 -70
  34. package/dist-client/pages/master/grist-iso-duration.js.map +0 -1
  35. package/dist-client/pages/master/grist-reference.d.ts +0 -91
  36. package/dist-client/pages/master/grist-reference.js +0 -419
  37. package/dist-client/pages/master/grist-reference.js.map +0 -1
  38. package/dist-client/pages/master/import-rows.d.ts +0 -35
  39. package/dist-client/pages/master/import-rows.js +0 -66
  40. package/dist-client/pages/master/import-rows.js.map +0 -1
  41. package/dist-client/pages/master/iso-duration.d.ts +0 -34
  42. package/dist-client/pages/master/iso-duration.js +0 -76
  43. package/dist-client/pages/master/iso-duration.js.map +0 -1
  44. package/dist-client/pages/master/master-options.d.ts +0 -40
  45. package/dist-client/pages/master/master-options.js +0 -54
  46. package/dist-client/pages/master/master-options.js.map +0 -1
  47. package/dist-client/pages/master/master-page-base.d.ts +0 -369
  48. package/dist-client/pages/master/master-page-base.js +0 -657
  49. package/dist-client/pages/master/master-page-base.js.map +0 -1
  50. package/dist-client/pages/master/material-class.d.ts +0 -12
  51. package/dist-client/pages/master/material-class.js +0 -42
  52. package/dist-client/pages/master/material-class.js.map +0 -1
  53. package/dist-client/pages/master/material-definition.d.ts +0 -5
  54. package/dist-client/pages/master/material-definition.js +0 -14
  55. package/dist-client/pages/master/material-definition.js.map +0 -1
  56. package/dist-client/pages/master/material-revision-fields.d.ts +0 -2
  57. package/dist-client/pages/master/material-revision-fields.js +0 -43
  58. package/dist-client/pages/master/material-revision-fields.js.map +0 -1
  59. package/dist-client/pages/master/operation-definition.d.ts +0 -12
  60. package/dist-client/pages/master/operation-definition.js +0 -49
  61. package/dist-client/pages/master/operation-definition.js.map +0 -1
  62. package/dist-client/pages/master/operational-location.d.ts +0 -84
  63. package/dist-client/pages/master/operational-location.js +0 -432
  64. package/dist-client/pages/master/operational-location.js.map +0 -1
  65. package/dist-client/pages/master/person.d.ts +0 -12
  66. package/dist-client/pages/master/person.js +0 -41
  67. package/dist-client/pages/master/person.js.map +0 -1
  68. package/dist-client/pages/master/personnel-class.d.ts +0 -12
  69. package/dist-client/pages/master/personnel-class.js +0 -43
  70. package/dist-client/pages/master/personnel-class.js.map +0 -1
  71. package/dist-client/pages/master/physical-asset-class.d.ts +0 -12
  72. package/dist-client/pages/master/physical-asset-class.js +0 -40
  73. package/dist-client/pages/master/physical-asset-class.js.map +0 -1
  74. package/dist-client/pages/master/physical-asset.d.ts +0 -12
  75. package/dist-client/pages/master/physical-asset.js +0 -41
  76. package/dist-client/pages/master/physical-asset.js.map +0 -1
  77. package/dist-client/pages/master/recipe-definition.d.ts +0 -5
  78. package/dist-client/pages/master/recipe-definition.js +0 -14
  79. package/dist-client/pages/master/recipe-definition.js.map +0 -1
  80. package/dist-client/pages/master/reference-targets.d.ts +0 -42
  81. package/dist-client/pages/master/reference-targets.js +0 -82
  82. package/dist-client/pages/master/reference-targets.js.map +0 -1
  83. package/dist-client/pages/master/revision-comparison.d.ts +0 -49
  84. package/dist-client/pages/master/revision-comparison.js +0 -560
  85. package/dist-client/pages/master/revision-comparison.js.map +0 -1
  86. package/dist-client/pages/master/revision-view.d.ts +0 -34
  87. package/dist-client/pages/master/revision-view.js +0 -145
  88. package/dist-client/pages/master/revision-view.js.map +0 -1
  89. package/dist-client/pages/master/revision-workspace.d.ts +0 -50
  90. package/dist-client/pages/master/revision-workspace.js +0 -763
  91. package/dist-client/pages/master/revision-workspace.js.map +0 -1
  92. package/dist-client/pages/master/route-definition.d.ts +0 -19
  93. package/dist-client/pages/master/route-definition.js +0 -40
  94. package/dist-client/pages/master/route-definition.js.map +0 -1
  95. package/dist-client/pages/master/stop-reason.d.ts +0 -12
  96. package/dist-client/pages/master/stop-reason.js +0 -48
  97. package/dist-client/pages/master/stop-reason.js.map +0 -1
  98. package/dist-client/pages/master/test-specification.d.ts +0 -5
  99. package/dist-client/pages/master/test-specification.js +0 -14
  100. package/dist-client/pages/master/test-specification.js.map +0 -1
  101. package/dist-client/pages/master-axes.d.ts +0 -24
  102. package/dist-client/pages/master-axes.js +0 -39
  103. package/dist-client/pages/master-axes.js.map +0 -1
  104. package/dist-client/route.d.ts +0 -1
  105. package/dist-client/route.js +0 -81
  106. package/dist-client/route.js.map +0 -1
  107. package/dist-client/tsconfig.tsbuildinfo +0 -1
  108. package/dist-server/index.d.ts +0 -1
  109. package/dist-server/index.js +0 -19
  110. package/dist-server/index.js.map +0 -1
  111. package/dist-server/service/ai-entry/master-entry-rules.d.ts +0 -175
  112. package/dist-server/service/ai-entry/master-entry-rules.js +0 -302
  113. package/dist-server/service/ai-entry/master-entry-rules.js.map +0 -1
  114. package/dist-server/service/ai-entry/master-entry-targets.d.ts +0 -23
  115. package/dist-server/service/ai-entry/master-entry-targets.js +0 -293
  116. package/dist-server/service/ai-entry/master-entry-targets.js.map +0 -1
  117. package/dist-server/service/approval-route.d.ts +0 -37
  118. package/dist-server/service/approval-route.js +0 -34
  119. package/dist-server/service/approval-route.js.map +0 -1
  120. package/dist-server/service/asset/asset-lifecycle.d.ts +0 -106
  121. package/dist-server/service/asset/asset-lifecycle.js +0 -126
  122. package/dist-server/service/asset/asset-lifecycle.js.map +0 -1
  123. package/dist-server/service/asset/asset-master-resolver.d.ts +0 -53
  124. package/dist-server/service/asset/asset-master-resolver.js +0 -185
  125. package/dist-server/service/asset/asset-master-resolver.js.map +0 -1
  126. package/dist-server/service/asset/asset-master.d.ts +0 -21
  127. package/dist-server/service/asset/asset-master.js +0 -25
  128. package/dist-server/service/asset/asset-master.js.map +0 -1
  129. package/dist-server/service/asset/asset-query.d.ts +0 -16
  130. package/dist-server/service/asset/asset-query.js +0 -72
  131. package/dist-server/service/asset/asset-query.js.map +0 -1
  132. package/dist-server/service/asset/index.d.ts +0 -6
  133. package/dist-server/service/asset/index.js +0 -10
  134. package/dist-server/service/asset/index.js.map +0 -1
  135. package/dist-server/service/asset/physical-asset-class.d.ts +0 -34
  136. package/dist-server/service/asset/physical-asset-class.js +0 -104
  137. package/dist-server/service/asset/physical-asset-class.js.map +0 -1
  138. package/dist-server/service/asset/physical-asset.d.ts +0 -66
  139. package/dist-server/service/asset/physical-asset.js +0 -123
  140. package/dist-server/service/asset/physical-asset.js.map +0 -1
  141. package/dist-server/service/assignment/applied-when.d.ts +0 -24
  142. package/dist-server/service/assignment/applied-when.js +0 -16
  143. package/dist-server/service/assignment/applied-when.js.map +0 -1
  144. package/dist-server/service/assignment/assignment-history.d.ts +0 -92
  145. package/dist-server/service/assignment/assignment-history.js +0 -289
  146. package/dist-server/service/assignment/assignment-history.js.map +0 -1
  147. package/dist-server/service/assignment/assignment-write.d.ts +0 -42
  148. package/dist-server/service/assignment/assignment-write.js +0 -101
  149. package/dist-server/service/assignment/assignment-write.js.map +0 -1
  150. package/dist-server/service/assignment/master-value-claim.d.ts +0 -135
  151. package/dist-server/service/assignment/master-value-claim.js +0 -174
  152. package/dist-server/service/assignment/master-value-claim.js.map +0 -1
  153. package/dist-server/service/equipment/equipment-class.d.ts +0 -34
  154. package/dist-server/service/equipment/equipment-class.js +0 -104
  155. package/dist-server/service/equipment/equipment-class.js.map +0 -1
  156. package/dist-server/service/equipment/equipment-master-resolver.d.ts +0 -77
  157. package/dist-server/service/equipment/equipment-master-resolver.js +0 -266
  158. package/dist-server/service/equipment/equipment-master-resolver.js.map +0 -1
  159. package/dist-server/service/equipment/equipment-master.d.ts +0 -30
  160. package/dist-server/service/equipment/equipment-master.js +0 -53
  161. package/dist-server/service/equipment/equipment-master.js.map +0 -1
  162. package/dist-server/service/equipment/equipment-query.d.ts +0 -16
  163. package/dist-server/service/equipment/equipment-query.js +0 -72
  164. package/dist-server/service/equipment/equipment-query.js.map +0 -1
  165. package/dist-server/service/equipment/equipment.d.ts +0 -71
  166. package/dist-server/service/equipment/equipment.js +0 -138
  167. package/dist-server/service/equipment/equipment.js.map +0 -1
  168. package/dist-server/service/equipment/index.d.ts +0 -8
  169. package/dist-server/service/equipment/index.js +0 -12
  170. package/dist-server/service/equipment/index.js.map +0 -1
  171. package/dist-server/service/equipment/state-period-rules.d.ts +0 -95
  172. package/dist-server/service/equipment/state-period-rules.js +0 -122
  173. package/dist-server/service/equipment/state-period-rules.js.map +0 -1
  174. package/dist-server/service/equipment/stop-reason-query.d.ts +0 -11
  175. package/dist-server/service/equipment/stop-reason-query.js +0 -39
  176. package/dist-server/service/equipment/stop-reason-query.js.map +0 -1
  177. package/dist-server/service/equipment/stop-reason.d.ts +0 -58
  178. package/dist-server/service/equipment/stop-reason.js +0 -114
  179. package/dist-server/service/equipment/stop-reason.js.map +0 -1
  180. package/dist-server/service/index.d.ts +0 -82
  181. package/dist-server/service/index.js +0 -145
  182. package/dist-server/service/index.js.map +0 -1
  183. package/dist-server/service/location/index.d.ts +0 -5
  184. package/dist-server/service/location/index.js +0 -9
  185. package/dist-server/service/location/index.js.map +0 -1
  186. package/dist-server/service/location/location-master-resolver.d.ts +0 -60
  187. package/dist-server/service/location/location-master-resolver.js +0 -313
  188. package/dist-server/service/location/location-master-resolver.js.map +0 -1
  189. package/dist-server/service/location/location-master.d.ts +0 -26
  190. package/dist-server/service/location/location-master.js +0 -28
  191. package/dist-server/service/location/location-master.js.map +0 -1
  192. package/dist-server/service/location/location-query.d.ts +0 -15
  193. package/dist-server/service/location/location-query.js +0 -56
  194. package/dist-server/service/location/location-query.js.map +0 -1
  195. package/dist-server/service/location/operational-location.d.ts +0 -116
  196. package/dist-server/service/location/operational-location.js +0 -157
  197. package/dist-server/service/location/operational-location.js.map +0 -1
  198. package/dist-server/service/master-axis.d.ts +0 -40
  199. package/dist-server/service/master-axis.js +0 -57
  200. package/dist-server/service/master-axis.js.map +0 -1
  201. package/dist-server/service/master-change-approval/approval-input.d.ts +0 -17
  202. package/dist-server/service/master-change-approval/approval-input.js +0 -35
  203. package/dist-server/service/master-change-approval/approval-input.js.map +0 -1
  204. package/dist-server/service/master-change-approval/builtin-axes.d.ts +0 -4
  205. package/dist-server/service/master-change-approval/builtin-axes.js +0 -96
  206. package/dist-server/service/master-change-approval/builtin-axes.js.map +0 -1
  207. package/dist-server/service/master-change-approval/index.d.ts +0 -14
  208. package/dist-server/service/master-change-approval/index.js +0 -37
  209. package/dist-server/service/master-change-approval/index.js.map +0 -1
  210. package/dist-server/service/master-change-approval/master-change-axis.d.ts +0 -54
  211. package/dist-server/service/master-change-approval/master-change-axis.js +0 -17
  212. package/dist-server/service/master-change-approval/master-change-axis.js.map +0 -1
  213. package/dist-server/service/master-change-approval/master-change-flow.d.ts +0 -65
  214. package/dist-server/service/master-change-approval/master-change-flow.js +0 -125
  215. package/dist-server/service/master-change-approval/master-change-flow.js.map +0 -1
  216. package/dist-server/service/master-change-approval/master-change-resolver.d.ts +0 -18
  217. package/dist-server/service/master-change-approval/master-change-resolver.js +0 -58
  218. package/dist-server/service/master-change-approval/master-change-resolver.js.map +0 -1
  219. package/dist-server/service/master-change-policy.d.ts +0 -122
  220. package/dist-server/service/master-change-policy.js +0 -304
  221. package/dist-server/service/master-change-policy.js.map +0 -1
  222. package/dist-server/service/master-conformance-resolver.d.ts +0 -34
  223. package/dist-server/service/master-conformance-resolver.js +0 -153
  224. package/dist-server/service/master-conformance-resolver.js.map +0 -1
  225. package/dist-server/service/master-conformance.d.ts +0 -80
  226. package/dist-server/service/master-conformance.js +0 -266
  227. package/dist-server/service/master-conformance.js.map +0 -1
  228. package/dist-server/service/master-crud.d.ts +0 -55
  229. package/dist-server/service/master-crud.js +0 -93
  230. package/dist-server/service/master-crud.js.map +0 -1
  231. package/dist-server/service/master-list.d.ts +0 -12
  232. package/dist-server/service/master-list.js +0 -30
  233. package/dist-server/service/master-list.js.map +0 -1
  234. package/dist-server/service/master-page-query.d.ts +0 -33
  235. package/dist-server/service/master-page-query.js +0 -55
  236. package/dist-server/service/master-page-query.js.map +0 -1
  237. package/dist-server/service/master-page.d.ts +0 -85
  238. package/dist-server/service/master-page.js +0 -104
  239. package/dist-server/service/master-page.js.map +0 -1
  240. package/dist-server/service/material/index.d.ts +0 -7
  241. package/dist-server/service/material/index.js +0 -12
  242. package/dist-server/service/material/index.js.map +0 -1
  243. package/dist-server/service/material/material-axis-status.d.ts +0 -8
  244. package/dist-server/service/material/material-axis-status.js +0 -19
  245. package/dist-server/service/material/material-axis-status.js.map +0 -1
  246. package/dist-server/service/material/material-class.d.ts +0 -34
  247. package/dist-server/service/material/material-class.js +0 -104
  248. package/dist-server/service/material/material-class.js.map +0 -1
  249. package/dist-server/service/material/material-definition.d.ts +0 -45
  250. package/dist-server/service/material/material-definition.js +0 -125
  251. package/dist-server/service/material/material-definition.js.map +0 -1
  252. package/dist-server/service/material/material-effective-list.d.ts +0 -39
  253. package/dist-server/service/material/material-effective-list.js +0 -54
  254. package/dist-server/service/material/material-effective-list.js.map +0 -1
  255. package/dist-server/service/material/material-master-resolver.d.ts +0 -106
  256. package/dist-server/service/material/material-master-resolver.js +0 -351
  257. package/dist-server/service/material/material-master-resolver.js.map +0 -1
  258. package/dist-server/service/material/material-master.d.ts +0 -9
  259. package/dist-server/service/material/material-master.js +0 -24
  260. package/dist-server/service/material/material-master.js.map +0 -1
  261. package/dist-server/service/material/material-query.d.ts +0 -16
  262. package/dist-server/service/material/material-query.js +0 -79
  263. package/dist-server/service/material/material-query.js.map +0 -1
  264. package/dist-server/service/material/material-revision-content.d.ts +0 -10
  265. package/dist-server/service/material/material-revision-content.js +0 -92
  266. package/dist-server/service/material/material-revision-content.js.map +0 -1
  267. package/dist-server/service/material/material-revision-resolver.d.ts +0 -60
  268. package/dist-server/service/material/material-revision-resolver.js +0 -96
  269. package/dist-server/service/material/material-revision-resolver.js.map +0 -1
  270. package/dist-server/service/material/material-revision-service.d.ts +0 -179
  271. package/dist-server/service/material/material-revision-service.js +0 -687
  272. package/dist-server/service/material/material-revision-service.js.map +0 -1
  273. package/dist-server/service/material/material-revision.d.ts +0 -86
  274. package/dist-server/service/material/material-revision.js +0 -339
  275. package/dist-server/service/material/material-revision.js.map +0 -1
  276. package/dist-server/service/material/recipe-index.d.ts +0 -23
  277. package/dist-server/service/material/recipe-index.js +0 -44
  278. package/dist-server/service/material/recipe-index.js.map +0 -1
  279. package/dist-server/service/operation/index.d.ts +0 -6
  280. package/dist-server/service/operation/index.js +0 -10
  281. package/dist-server/service/operation/index.js.map +0 -1
  282. package/dist-server/service/operation/operation-definition.d.ts +0 -52
  283. package/dist-server/service/operation/operation-definition.js +0 -143
  284. package/dist-server/service/operation/operation-definition.js.map +0 -1
  285. package/dist-server/service/operation/operation-master-resolver.d.ts +0 -52
  286. package/dist-server/service/operation/operation-master-resolver.js +0 -187
  287. package/dist-server/service/operation/operation-master-resolver.js.map +0 -1
  288. package/dist-server/service/operation/operation-master.d.ts +0 -21
  289. package/dist-server/service/operation/operation-master.js +0 -28
  290. package/dist-server/service/operation/operation-master.js.map +0 -1
  291. package/dist-server/service/operation/operation-query.d.ts +0 -15
  292. package/dist-server/service/operation/operation-query.js +0 -56
  293. package/dist-server/service/operation/operation-query.js.map +0 -1
  294. package/dist-server/service/operation/operation-readiness-resolver.d.ts +0 -39
  295. package/dist-server/service/operation/operation-readiness-resolver.js +0 -111
  296. package/dist-server/service/operation/operation-readiness-resolver.js.map +0 -1
  297. package/dist-server/service/operation/operation-readiness.d.ts +0 -34
  298. package/dist-server/service/operation/operation-readiness.js +0 -133
  299. package/dist-server/service/operation/operation-readiness.js.map +0 -1
  300. package/dist-server/service/personnel/index.d.ts +0 -6
  301. package/dist-server/service/personnel/index.js +0 -10
  302. package/dist-server/service/personnel/index.js.map +0 -1
  303. package/dist-server/service/personnel/person.d.ts +0 -51
  304. package/dist-server/service/personnel/person.js +0 -119
  305. package/dist-server/service/personnel/person.js.map +0 -1
  306. package/dist-server/service/personnel/personnel-class-readiness.d.ts +0 -22
  307. package/dist-server/service/personnel/personnel-class-readiness.js +0 -98
  308. package/dist-server/service/personnel/personnel-class-readiness.js.map +0 -1
  309. package/dist-server/service/personnel/personnel-class.d.ts +0 -54
  310. package/dist-server/service/personnel/personnel-class.js +0 -114
  311. package/dist-server/service/personnel/personnel-class.js.map +0 -1
  312. package/dist-server/service/personnel/personnel-master-resolver.d.ts +0 -53
  313. package/dist-server/service/personnel/personnel-master-resolver.js +0 -187
  314. package/dist-server/service/personnel/personnel-master-resolver.js.map +0 -1
  315. package/dist-server/service/personnel/personnel-master.d.ts +0 -39
  316. package/dist-server/service/personnel/personnel-master.js +0 -34
  317. package/dist-server/service/personnel/personnel-master.js.map +0 -1
  318. package/dist-server/service/personnel/personnel-query.d.ts +0 -29
  319. package/dist-server/service/personnel/personnel-query.js +0 -79
  320. package/dist-server/service/personnel/personnel-query.js.map +0 -1
  321. package/dist-server/service/personnel/qualification.d.ts +0 -104
  322. package/dist-server/service/personnel/qualification.js +0 -147
  323. package/dist-server/service/personnel/qualification.js.map +0 -1
  324. package/dist-server/service/quality/index.d.ts +0 -4
  325. package/dist-server/service/quality/index.js +0 -8
  326. package/dist-server/service/quality/index.js.map +0 -1
  327. package/dist-server/service/quality/nonconformance-cause-resolver.d.ts +0 -12
  328. package/dist-server/service/quality/nonconformance-cause-resolver.js +0 -60
  329. package/dist-server/service/quality/nonconformance-cause-resolver.js.map +0 -1
  330. package/dist-server/service/quality/nonconformance-cause.d.ts +0 -20
  331. package/dist-server/service/quality/nonconformance-cause.js +0 -90
  332. package/dist-server/service/quality/nonconformance-cause.js.map +0 -1
  333. package/dist-server/service/recipe/index.d.ts +0 -10
  334. package/dist-server/service/recipe/index.js +0 -16
  335. package/dist-server/service/recipe/index.js.map +0 -1
  336. package/dist-server/service/recipe/recipe-definition.d.ts +0 -75
  337. package/dist-server/service/recipe/recipe-definition.js +0 -143
  338. package/dist-server/service/recipe/recipe-definition.js.map +0 -1
  339. package/dist-server/service/recipe/recipe-effective-list.d.ts +0 -49
  340. package/dist-server/service/recipe/recipe-effective-list.js +0 -96
  341. package/dist-server/service/recipe/recipe-effective-list.js.map +0 -1
  342. package/dist-server/service/recipe/recipe-master-resolver.d.ts +0 -28
  343. package/dist-server/service/recipe/recipe-master-resolver.js +0 -128
  344. package/dist-server/service/recipe/recipe-master-resolver.js.map +0 -1
  345. package/dist-server/service/recipe/recipe-master.d.ts +0 -37
  346. package/dist-server/service/recipe/recipe-master.js +0 -47
  347. package/dist-server/service/recipe/recipe-master.js.map +0 -1
  348. package/dist-server/service/recipe/recipe-query.d.ts +0 -21
  349. package/dist-server/service/recipe/recipe-query.js +0 -82
  350. package/dist-server/service/recipe/recipe-query.js.map +0 -1
  351. package/dist-server/service/recipe/recipe-revision-content.d.ts +0 -32
  352. package/dist-server/service/recipe/recipe-revision-content.js +0 -70
  353. package/dist-server/service/recipe/recipe-revision-content.js.map +0 -1
  354. package/dist-server/service/recipe/recipe-revision-line.d.ts +0 -30
  355. package/dist-server/service/recipe/recipe-revision-line.js +0 -95
  356. package/dist-server/service/recipe/recipe-revision-line.js.map +0 -1
  357. package/dist-server/service/recipe/recipe-revision-resolver.d.ts +0 -65
  358. package/dist-server/service/recipe/recipe-revision-resolver.js +0 -96
  359. package/dist-server/service/recipe/recipe-revision-resolver.js.map +0 -1
  360. package/dist-server/service/recipe/recipe-revision-service.d.ts +0 -183
  361. package/dist-server/service/recipe/recipe-revision-service.js +0 -754
  362. package/dist-server/service/recipe/recipe-revision-service.js.map +0 -1
  363. package/dist-server/service/recipe/recipe-revision.d.ts +0 -102
  364. package/dist-server/service/recipe/recipe-revision.js +0 -373
  365. package/dist-server/service/recipe/recipe-revision.js.map +0 -1
  366. package/dist-server/service/recipe/route-definition.d.ts +0 -51
  367. package/dist-server/service/recipe/route-definition.js +0 -114
  368. package/dist-server/service/recipe/route-definition.js.map +0 -1
  369. package/dist-server/service/resource/class-lineage.d.ts +0 -46
  370. package/dist-server/service/resource/class-lineage.js +0 -80
  371. package/dist-server/service/resource/class-lineage.js.map +0 -1
  372. package/dist-server/service/resource/class-members.d.ts +0 -36
  373. package/dist-server/service/resource/class-members.js +0 -59
  374. package/dist-server/service/resource/class-members.js.map +0 -1
  375. package/dist-server/service/resource/referrers.d.ts +0 -54
  376. package/dist-server/service/resource/referrers.js +0 -99
  377. package/dist-server/service/resource/referrers.js.map +0 -1
  378. package/dist-server/service/resource/resource-class.d.ts +0 -25
  379. package/dist-server/service/resource/resource-class.js +0 -29
  380. package/dist-server/service/resource/resource-class.js.map +0 -1
  381. package/dist-server/service/revision-baseline.d.ts +0 -71
  382. package/dist-server/service/revision-baseline.js +0 -87
  383. package/dist-server/service/revision-baseline.js.map +0 -1
  384. package/dist-server/service/row-lock.d.ts +0 -22
  385. package/dist-server/service/row-lock.js +0 -31
  386. package/dist-server/service/row-lock.js.map +0 -1
  387. package/dist-server/service/status/axis-stamp.d.ts +0 -16
  388. package/dist-server/service/status/axis-stamp.js +0 -22
  389. package/dist-server/service/status/axis-stamp.js.map +0 -1
  390. package/dist-server/service/status/index.d.ts +0 -3
  391. package/dist-server/service/status/index.js +0 -7
  392. package/dist-server/service/status/index.js.map +0 -1
  393. package/dist-server/service/status/master-status.d.ts +0 -38
  394. package/dist-server/service/status/master-status.js +0 -129
  395. package/dist-server/service/status/master-status.js.map +0 -1
  396. package/dist-server/service/test-spec/criteria-check.d.ts +0 -53
  397. package/dist-server/service/test-spec/criteria-check.js +0 -142
  398. package/dist-server/service/test-spec/criteria-check.js.map +0 -1
  399. package/dist-server/service/test-spec/criteria-rows.d.ts +0 -89
  400. package/dist-server/service/test-spec/criteria-rows.js +0 -139
  401. package/dist-server/service/test-spec/criteria-rows.js.map +0 -1
  402. package/dist-server/service/test-spec/index.d.ts +0 -6
  403. package/dist-server/service/test-spec/index.js +0 -11
  404. package/dist-server/service/test-spec/index.js.map +0 -1
  405. package/dist-server/service/test-spec/test-spec-effective-list.d.ts +0 -34
  406. package/dist-server/service/test-spec/test-spec-effective-list.js +0 -42
  407. package/dist-server/service/test-spec/test-spec-effective-list.js.map +0 -1
  408. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +0 -44
  409. package/dist-server/service/test-spec/test-spec-master-resolver.js +0 -144
  410. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +0 -1
  411. package/dist-server/service/test-spec/test-spec-master.d.ts +0 -6
  412. package/dist-server/service/test-spec/test-spec-master.js +0 -18
  413. package/dist-server/service/test-spec/test-spec-master.js.map +0 -1
  414. package/dist-server/service/test-spec/test-spec-query.d.ts +0 -15
  415. package/dist-server/service/test-spec/test-spec-query.js +0 -61
  416. package/dist-server/service/test-spec/test-spec-query.js.map +0 -1
  417. package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +0 -59
  418. package/dist-server/service/test-spec/test-spec-revision-resolver.js +0 -96
  419. package/dist-server/service/test-spec/test-spec-revision-resolver.js.map +0 -1
  420. package/dist-server/service/test-spec/test-spec-revision-service.d.ts +0 -178
  421. package/dist-server/service/test-spec/test-spec-revision-service.js +0 -685
  422. package/dist-server/service/test-spec/test-spec-revision-service.js.map +0 -1
  423. package/dist-server/service/test-spec/test-spec-revision.d.ts +0 -86
  424. package/dist-server/service/test-spec/test-spec-revision.js +0 -334
  425. package/dist-server/service/test-spec/test-spec-revision.js.map +0 -1
  426. package/dist-server/service/test-spec/test-specification.d.ts +0 -47
  427. package/dist-server/service/test-spec/test-specification.js +0 -119
  428. package/dist-server/service/test-spec/test-specification.js.map +0 -1
  429. package/dist-server/tsconfig.tsbuildinfo +0 -1
@@ -1,685 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TestSpecificationRefusal = void 0;
4
- exports.testSpecificationSubmissionHash = testSpecificationSubmissionHash;
5
- exports.testSpecificationApprovalInput = testSpecificationApprovalInput;
6
- exports.assertTestSpecificationApprovalInput = assertTestSpecificationApprovalInput;
7
- exports.createTestSpecificationDraft = createTestSpecificationDraft;
8
- exports.editTestSpecificationDraft = editTestSpecificationDraft;
9
- exports.freezeTestSpecificationDraft = freezeTestSpecificationDraft;
10
- exports.bindTestSpecificationApproval = bindTestSpecificationApproval;
11
- exports.publishTestSpecificationRevision = publishTestSpecificationRevision;
12
- exports.publishUnregulatedTestSpecification = publishUnregulatedTestSpecification;
13
- exports.resolveTestSpecification = resolveTestSpecification;
14
- exports.standTestSpecificationBaselines = standTestSpecificationBaselines;
15
- exports.testSpecificationRevisionForBasis = testSpecificationRevisionForBasis;
16
- exports.captureTestSpecificationBasis = captureTestSpecificationBasis;
17
- exports.testSpecificationRevisionOverview = testSpecificationRevisionOverview;
18
- exports.effectiveTestSpecification = effectiveTestSpecification;
19
- exports.saveAndPublishTestSpecification = saveAndPublishTestSpecification;
20
- const node_crypto_1 = require("node:crypto");
21
- const typeorm_1 = require("typeorm");
22
- const shell_1 = require("@things-factory/shell");
23
- const master_change_policy_1 = require("../master-change-policy");
24
- const criteria_check_1 = require("./criteria-check");
25
- const test_specification_1 = require("./test-specification");
26
- const test_spec_revision_1 = require("./test-spec-revision");
27
- const approval_input_1 = require("../master-change-approval/approval-input");
28
- const row_lock_1 = require("../row-lock");
29
- class TestSpecificationRefusal extends shell_1.Refusal {
30
- constructor(code, detail) {
31
- super(code, {}, detail ?? TEST_SPECIFICATION_REFUSALS[code] ?? 'The test specification change could not be applied.');
32
- }
33
- }
34
- exports.TestSpecificationRefusal = TestSpecificationRefusal;
35
- const TEST_SPECIFICATION_REFUSALS = {
36
- TRANSACTION_REQUIRED: 'This change requires a transaction.',
37
- INVALID_INSTANT: 'Enter a valid date and time including its time zone.',
38
- INVALID_CONTENT: 'The proposed specification content is invalid.',
39
- INVALID_CRITERIA: 'The proposed inspection criteria are invalid.',
40
- SPECIFICATION_NOT_FOUND: 'The specification does not exist in this domain.',
41
- REVISION_NOT_FOUND: 'The revision does not exist in this domain.',
42
- INVALID_BASE_REVISION: 'The proposed change is based on a different revision.',
43
- DRAFT_NOT_OWNED: 'Only the draft author can edit or submit it.',
44
- REVISION_FROZEN: 'This submitted revision cannot be edited. Create another draft.',
45
- DRAFT_CONFLICT: 'The draft changed. Reload it before saving.',
46
- PLAN_CONFLICT: 'The approved schedule changed. Review and submit a new draft.',
47
- INVALID_SUBMISSION: 'The submitted content does not match the frozen revision.',
48
- AUTHOR_CANNOT_APPROVE: 'The author cannot approve their own change.',
49
- RETROACTIVE_IMPACT: 'This change would alter criteria already used by recorded inspections.',
50
- FUTURE_PLAN_CONFLICT: 'This change conflicts with an approved future schedule.',
51
- NO_EFFECTIVE_REVISION: 'There is no published revision effective at the inspection time.',
52
- AMBIGUOUS_EFFECTIVITY: 'More than one revision is effective at the inspection time.',
53
- REVISION_INTEGRITY_FAILURE: 'The stored revision does not match its signed content.',
54
- BASIS_CONFLICT: 'This inspection already has a different specification or inspection time.',
55
- APPROVAL_LINE_REQUIRED: 'Configure an approval line before submitting this change.',
56
- REVISION_REQUIRED: 'Change the specification through a revision draft.'
57
- };
58
- function refuse(code, detail) {
59
- throw new TestSpecificationRefusal(code, detail);
60
- }
61
- function transaction(manager) {
62
- if (!manager.queryRunner?.isTransactionActive)
63
- refuse('TRANSACTION_REQUIRED');
64
- }
65
- function instant(value) {
66
- if (!(value instanceof Date) && (typeof value !== 'string' || !/(Z|[+-]\d{2}:\d{2})$/.test(value)))
67
- refuse('INVALID_INSTANT');
68
- const result = new Date(value);
69
- if (!Number.isFinite(result.getTime()))
70
- refuse('INVALID_INSTANT');
71
- return result;
72
- }
73
- function text(value, field) {
74
- if (typeof value !== 'string' || !value.trim())
75
- refuse('INVALID_CONTENT', field);
76
- return value.trim();
77
- }
78
- /** Sorted object keys, ordered arrays, ISO instants. This is the v1 submission encoding. */
79
- function canonical(value) {
80
- if (value === null || typeof value !== 'object')
81
- return JSON.stringify(value);
82
- if (Array.isArray(value))
83
- return '[' + value.map(canonical).join(',') + ']';
84
- return ('{' +
85
- Object.keys(value)
86
- .sort()
87
- .map(key => JSON.stringify(key) + ':' + canonical(value[key]))
88
- .join(',') +
89
- '}');
90
- }
91
- function testSpecificationSubmissionHash(revision) {
92
- return (0, node_crypto_1.createHash)('sha256')
93
- .update(canonical({
94
- schemaVersion: 1,
95
- revisionNumber: revision.revisionNumber,
96
- policyId: revision.policyId,
97
- domainId: revision.domainId,
98
- specId: revision.specId,
99
- baseRevisionId: revision.baseRevisionId,
100
- baseGeneration: revision.baseGeneration,
101
- version: revision.version,
102
- description: revision.description,
103
- criteria: revision.criteria,
104
- effectiveFrom: revision.effectiveFrom.toISOString(),
105
- reason: revision.reason
106
- }))
107
- .digest('hex');
108
- }
109
- /** Display values are a checked projection of the frozen revision, never a second editable source. */
110
- async function testSpecificationApprovalInput(manager, domainId, revisionId) {
111
- const draft = await revision(manager, domainId, revisionId);
112
- if (!draft.frozenAt || draft.contentHash !== testSpecificationSubmissionHash(draft))
113
- refuse('INVALID_SUBMISSION');
114
- const spec = await subject(manager, domainId, draft.specId);
115
- const base = draft.baseRevisionId ? await revision(manager, domainId, draft.baseRevisionId) : null;
116
- const plan = base ? await manager.findOneBy(test_spec_revision_1.TestSpecificationPlan, {
117
- domain: { id: domainId }, spec: { id: draft.specId }, generation: draft.baseGeneration
118
- }) : null;
119
- const segment = plan && base ? await manager.findOneBy(test_spec_revision_1.TestSpecificationSegment, {
120
- domain: { id: domainId }, plan: { id: plan.id }, revision: { id: base.id }
121
- }) : null;
122
- /*
123
- * How the base was published (2026-10-20) — the approval screen names a baseline base in plain words. Only the
124
- * base carries it: it was published before this draft existed and never changes, so the snapshot stays pinned.
125
- * The proposal is unpublished here and would read differently once published.
126
- */
127
- const basePlan = base ? await manager.findOneBy(test_spec_revision_1.TestSpecificationPlan, { domain: { id: domainId }, publishedRevision: { id: base.id } }) : null;
128
- const values = (row) => ({
129
- revisionNumber: row.revisionNumber,
130
- detail: {
131
- revisionId: row.id, createdAt: row.createdAt.toISOString(), frozenAt: row.frozenAt?.toISOString(),
132
- effectiveFrom: row.effectiveFrom.toISOString(), reason: row.reason,
133
- ...(row.id === base?.id ? { releaseKind: basePlan?.releaseKind ?? null } : {}),
134
- ...(row.id === base?.id && segment ? { validFrom: segment.validFrom.toISOString(), validTo: segment.validTo?.toISOString() ?? null } : {})
135
- },
136
- version: row.version,
137
- description: row.description,
138
- criteria: row.criteria
139
- });
140
- return {
141
- headline: spec.name,
142
- reason: draft.reason,
143
- effectiveFrom: draft.effectiveFrom.toISOString(),
144
- before: base ? values(base) : null,
145
- after: values(draft),
146
- revision: {
147
- revisionId: draft.id,
148
- hash: draft.contentHash,
149
- specId: draft.specId,
150
- baseGeneration: draft.baseGeneration
151
- }
152
- };
153
- }
154
- async function assertTestSpecificationApprovalInput(manager, domainId, input) {
155
- const reference = input?.revision;
156
- if (typeof reference?.revisionId !== 'string')
157
- refuse('INVALID_SUBMISSION');
158
- const expected = await testSpecificationApprovalInput(manager, domainId, reference.revisionId);
159
- if (!(0, approval_input_1.approvalInputMatches)(input, expected))
160
- refuse('INVALID_SUBMISSION');
161
- }
162
- function content(input) {
163
- const read = (0, criteria_check_1.readCriteria)(input.criteria);
164
- if (read.read === 'failed')
165
- refuse('INVALID_CRITERIA', read.detail);
166
- const judged = (0, criteria_check_1.judgeCriteria)(read.criteria);
167
- if (!judged.ok)
168
- refuse('INVALID_CRITERIA', judged.problems.join('\n'));
169
- // A JSON round trip makes the accepted value exactly the persisted value, not a caller-owned object.
170
- const criteria = JSON.parse(JSON.stringify(read.criteria));
171
- if (input.description != null && typeof input.description !== 'string')
172
- refuse('INVALID_CONTENT', 'description');
173
- return {
174
- version: text(input.version, 'version'),
175
- description: input.description ?? null,
176
- criteria,
177
- effectiveFrom: instant(input.effectiveFrom),
178
- reason: text(input.reason, 'reason')
179
- };
180
- }
181
- async function subject(manager, domainId, specId) {
182
- const spec = await manager.findOne(test_specification_1.TestSpecification, {
183
- where: { id: specId, domain: { id: domainId } },
184
- ...(0, row_lock_1.writeLockOn)(manager, test_specification_1.TestSpecification)
185
- });
186
- if (!spec)
187
- refuse('SPECIFICATION_NOT_FOUND');
188
- // Compare the current head and latest persisted plan in one SQL snapshot. A historical
189
- // knownAt query must not compare its selected old plan with the current head.
190
- const head = await manager.createQueryBuilder(test_specification_1.TestSpecification, 'head')
191
- .leftJoin(test_spec_revision_1.TestSpecificationPlan, 'plan', 'plan.spec = head.id AND plan.domain = head.domain')
192
- .select('head.planGeneration', 'generation')
193
- .addSelect('MAX(plan.generation)', 'latest')
194
- .where({ id: specId, domain: { id: domainId } })
195
- .groupBy('head.id').addGroupBy('head.planGeneration')
196
- .getRawOne();
197
- if (!head || Number(head.generation) !== Number(head.latest ?? 0)) {
198
- throw new shell_1.Refusal('PLAN_INTEGRITY_FAILURE', {}, 'The current plan generation does not match the latest published plan. Contact an administrator.');
199
- }
200
- return spec;
201
- }
202
- async function revision(manager, domainId, revisionId, locked = true) {
203
- const found = await manager.findOne(test_spec_revision_1.TestSpecificationRevision, {
204
- where: { id: revisionId, domain: { id: domainId } },
205
- ...(locked ? (0, row_lock_1.writeLockOn)(manager, test_spec_revision_1.TestSpecificationRevision) : {})
206
- });
207
- if (!found)
208
- refuse('REVISION_NOT_FOUND');
209
- return found;
210
- }
211
- /** A write lock valid on every supported SQL backend, including SQLite (no SELECT FOR UPDATE). */
212
- async function lockSubject(manager, domainId, specId) {
213
- transaction(manager);
214
- const locked = await manager
215
- .createQueryBuilder()
216
- .update(test_specification_1.TestSpecification)
217
- .set({ revisionLock: () => 'revision_lock + 1' })
218
- .where({ id: specId, domain: { id: domainId } })
219
- .execute();
220
- if (locked.affected !== 1)
221
- refuse('SPECIFICATION_NOT_FOUND');
222
- return subject(manager, domainId, specId);
223
- }
224
- async function createTestSpecificationDraft(manager, domainId, creatorId, asked) {
225
- transaction(manager);
226
- const accepted = content(asked.content);
227
- const policy = await (0, master_change_policy_1.masterChangePolicy)(manager, domainId, 'testSpecification');
228
- let spec;
229
- if (asked.specId) {
230
- spec = await lockSubject(manager, domainId, asked.specId);
231
- }
232
- else {
233
- spec = await manager.save(test_specification_1.TestSpecification, manager.create(test_specification_1.TestSpecification, {
234
- domain: { id: domainId },
235
- name: text(asked.name, 'name'),
236
- planGeneration: 0,
237
- revisionLock: 0,
238
- creator: { id: creatorId },
239
- updater: { id: creatorId }
240
- }));
241
- }
242
- const previous = await manager.findOne(test_spec_revision_1.TestSpecificationRevision, {
243
- where: { domain: { id: domainId }, spec: { id: spec.id } }, order: { revisionNumber: 'DESC' },
244
- ...(0, row_lock_1.writeLockOn)(manager, test_spec_revision_1.TestSpecificationRevision)
245
- });
246
- const revisionNumber = (previous?.revisionNumber ?? 0) + 1;
247
- let baseRevisionId = null;
248
- if (spec.planGeneration > 0) {
249
- baseRevisionId = (await resolveTestSpecification(manager, domainId, spec.id, accepted.effectiveFrom)).revision.id;
250
- }
251
- if (asked.baseRevisionId && asked.baseRevisionId !== baseRevisionId)
252
- refuse('INVALID_BASE_REVISION');
253
- const saved = await manager.save(test_spec_revision_1.TestSpecificationRevision, manager.create(test_spec_revision_1.TestSpecificationRevision, {
254
- ...accepted,
255
- policy: { id: policy.id },
256
- domain: { id: domainId },
257
- spec: { id: spec.id },
258
- baseRevision: baseRevisionId ? { id: baseRevisionId } : null,
259
- baseGeneration: spec.planGeneration,
260
- revisionNumber,
261
- editGeneration: 0,
262
- creator: { id: creatorId },
263
- createdAt: new Date(),
264
- frozenAt: null,
265
- contentHash: null,
266
- activityInstanceId: null
267
- }));
268
- return revision(manager, domainId, saved.id);
269
- }
270
- async function editTestSpecificationDraft(manager, domainId, actorId, revisionId, expectedEditGeneration, input) {
271
- transaction(manager);
272
- const accepted = content(input);
273
- const initial = await revision(manager, domainId, revisionId, false);
274
- const spec = await lockSubject(manager, domainId, initial.specId);
275
- const draft = await revision(manager, domainId, revisionId);
276
- if (draft.creatorId !== actorId)
277
- refuse('DRAFT_NOT_OWNED');
278
- if (draft.frozenAt)
279
- refuse('REVISION_FROZEN');
280
- if (draft.baseGeneration !== spec.planGeneration)
281
- refuse('PLAN_CONFLICT');
282
- // Moving the effective date across a scheduled boundary changes the before-image.
283
- const baseRevisionId = spec.planGeneration > 0
284
- ? (await resolveTestSpecification(manager, domainId, spec.id, accepted.effectiveFrom)).revision.id
285
- : null;
286
- const updated = await manager
287
- .createQueryBuilder()
288
- .update(test_spec_revision_1.TestSpecificationRevision)
289
- .set({
290
- ...accepted,
291
- baseRevision: baseRevisionId ? { id: baseRevisionId } : null,
292
- editGeneration: expectedEditGeneration + 1
293
- })
294
- .where({
295
- id: revisionId,
296
- domain: { id: domainId },
297
- creator: { id: actorId },
298
- editGeneration: expectedEditGeneration
299
- })
300
- .andWhere('frozen_at IS NULL')
301
- .execute();
302
- if (updated.affected !== 1)
303
- refuse('DRAFT_CONFLICT');
304
- return revision(manager, domainId, revisionId);
305
- }
306
- /** Product calls this in the same transaction as issuing its worklist approval. */
307
- async function freezeTestSpecificationDraft(manager, domainId, actorId, revisionId, expectedEditGeneration) {
308
- const initial = await revision(manager, domainId, revisionId, false);
309
- const spec = await lockSubject(manager, domainId, initial.specId);
310
- const draft = await revision(manager, domainId, revisionId);
311
- if (draft.creatorId !== actorId)
312
- refuse('DRAFT_NOT_OWNED');
313
- if (draft.frozenAt)
314
- refuse('REVISION_FROZEN');
315
- if (draft.editGeneration !== expectedEditGeneration)
316
- refuse('DRAFT_CONFLICT');
317
- if (draft.baseGeneration !== spec.planGeneration)
318
- refuse('PLAN_CONFLICT');
319
- const policy = await (0, master_change_policy_1.masterChangePolicy)(manager, domainId, 'testSpecification');
320
- if (draft.policyId !== policy.id)
321
- refuse('PLAN_CONFLICT');
322
- content(draft);
323
- const contentHash = testSpecificationSubmissionHash(draft);
324
- await manager.update(test_spec_revision_1.TestSpecificationRevision, { id: revisionId, domain: { id: domainId } }, { frozenAt: new Date(), contentHash });
325
- return revision(manager, domainId, revisionId);
326
- }
327
- async function bindTestSpecificationApproval(manager, domainId, revisionId, activityInstanceId) {
328
- transaction(manager);
329
- const initial = await revision(manager, domainId, revisionId, false);
330
- await lockSubject(manager, domainId, initial.specId);
331
- const draft = await revision(manager, domainId, revisionId);
332
- if (!draft.frozenAt || draft.activityInstanceId)
333
- refuse('INVALID_SUBMISSION');
334
- await manager.update(test_spec_revision_1.TestSpecificationRevision, { id: revisionId, domain: { id: domainId } }, { activityInstanceId: text(activityInstanceId, 'activityInstanceId') });
335
- }
336
- /** Internal completion callback only. Never expose this as an approved=true mutation. */
337
- async function publishTestSpecificationRevision(manager, domainId, revisionId, decision) {
338
- return publishRevision(manager, domainId, revisionId, {
339
- kind: 'approved',
340
- activityInstanceId: decision.activityInstanceId,
341
- actorId: decision.approverId,
342
- submissionHash: decision.submissionHash
343
- });
344
- }
345
- async function publishUnregulatedTestSpecification(manager, domainId, actorId, revisionId, editGeneration) {
346
- transaction(manager);
347
- const initial = await revision(manager, domainId, revisionId, false);
348
- await lockSubject(manager, domainId, initial.specId);
349
- const policy = await (0, master_change_policy_1.masterChangePolicy)(manager, domainId, 'testSpecification');
350
- if (policy.approvalRequired)
351
- throw new shell_1.Refusal('MASTER_APPROVAL_REQUIRED', {}, 'This change requires product approval.');
352
- const prior = await manager.findOneBy(test_spec_revision_1.TestSpecificationPlan, {
353
- domain: { id: domainId },
354
- publishedRevision: { id: revisionId },
355
- releaseKind: 'policy'
356
- });
357
- if (prior) {
358
- if (prior.publisherId !== actorId)
359
- refuse('DRAFT_NOT_OWNED');
360
- return prior;
361
- }
362
- const frozen = await freezeTestSpecificationDraft(manager, domainId, actorId, revisionId, editGeneration);
363
- return publishRevision(manager, domainId, revisionId, { kind: 'policy', actorId, submissionHash: frozen.contentHash });
364
- }
365
- async function publishRevision(manager, domainId, revisionId, decision) {
366
- const initial = await revision(manager, domainId, revisionId, false);
367
- const spec = await lockSubject(manager, domainId, initial.specId);
368
- const draft = await revision(manager, domainId, revisionId);
369
- if (!draft.frozenAt ||
370
- (decision.kind === 'approved'
371
- ? draft.activityInstanceId !== decision.activityInstanceId
372
- : !!draft.activityInstanceId) ||
373
- draft.contentHash !== decision.submissionHash ||
374
- testSpecificationSubmissionHash(draft) !== decision.submissionHash)
375
- refuse('INVALID_SUBMISSION');
376
- const policy = await (0, master_change_policy_1.masterChangePolicy)(manager, domainId, 'testSpecification');
377
- if (draft.policyId !== policy.id)
378
- refuse('PLAN_CONFLICT');
379
- if (policy.approvalRequired !== (decision.kind === 'approved'))
380
- throw new shell_1.Refusal('MASTER_APPROVAL_POLICY_MISMATCH', {}, 'Use the publication path required by the domain policy.');
381
- if (decision.kind === 'approved' && draft.creatorId === decision.actorId)
382
- refuse('AUTHOR_CANNOT_APPROVE');
383
- text(decision.actorId, 'publisher');
384
- const previousDecision = await manager.findOne(test_spec_revision_1.TestSpecificationPlan, {
385
- where: { domain: { id: domainId }, publishedRevision: { id: revisionId } },
386
- ...(0, row_lock_1.writeLockOn)(manager, test_spec_revision_1.TestSpecificationPlan)
387
- });
388
- if (previousDecision)
389
- return previousDecision;
390
- if (draft.baseGeneration !== spec.planGeneration)
391
- refuse('PLAN_CONFLICT');
392
- // Only replacement from effectiveFrom onward is supported in this slice, not arbitrary rescheduling.
393
- if (await manager.findOne(test_spec_revision_1.TestSpecificationBasis, {
394
- where: { domain: { id: domainId }, spec: { id: spec.id }, businessTime: (0, typeorm_1.MoreThanOrEqual)(draft.effectiveFrom) },
395
- ...(0, row_lock_1.writeLockOn)(manager, test_spec_revision_1.TestSpecificationBasis)
396
- }))
397
- refuse('RETROACTIVE_IMPACT');
398
- const oldPlan = await manager.findOne(test_spec_revision_1.TestSpecificationPlan, {
399
- where: { domain: { id: domainId }, spec: { id: spec.id }, generation: spec.planGeneration },
400
- ...(0, row_lock_1.writeLockOn)(manager, test_spec_revision_1.TestSpecificationPlan)
401
- });
402
- if (spec.planGeneration > 0 && !oldPlan)
403
- refuse('PLAN_CONFLICT');
404
- const oldSegments = oldPlan
405
- ? await manager.find(test_spec_revision_1.TestSpecificationSegment, {
406
- where: { domain: { id: domainId }, spec: { id: spec.id }, plan: { id: oldPlan.id } },
407
- order: { validFrom: 'ASC' },
408
- ...(0, row_lock_1.writeLockOn)(manager, test_spec_revision_1.TestSpecificationSegment)
409
- })
410
- : [];
411
- // Do not silently erase an already approved future appointment.
412
- if (oldSegments.some(segment => segment.validFrom >= draft.effectiveFrom))
413
- refuse('FUTURE_PLAN_CONFLICT');
414
- const recordedAt = new Date();
415
- const plan = await manager.save(test_spec_revision_1.TestSpecificationPlan, manager.create(test_spec_revision_1.TestSpecificationPlan, {
416
- domain: { id: domainId },
417
- spec: { id: spec.id },
418
- generation: spec.planGeneration + 1,
419
- recordedAt,
420
- activityInstanceId: decision.activityInstanceId ?? null,
421
- submissionHash: decision.submissionHash,
422
- approver: decision.kind === 'approved' ? { id: decision.actorId } : null,
423
- publisher: { id: decision.actorId },
424
- releaseKind: decision.kind,
425
- publishedRevision: { id: revisionId },
426
- policy: { id: policy.id }
427
- }));
428
- for (const old of oldSegments) {
429
- await manager.save(test_spec_revision_1.TestSpecificationSegment, manager.create(test_spec_revision_1.TestSpecificationSegment, {
430
- domain: { id: domainId },
431
- spec: { id: spec.id },
432
- plan: { id: plan.id },
433
- revision: { id: old.revisionId },
434
- validFrom: old.validFrom,
435
- validTo: !old.validTo || old.validTo > draft.effectiveFrom ? draft.effectiveFrom : old.validTo
436
- }));
437
- }
438
- await manager.save(test_spec_revision_1.TestSpecificationSegment, manager.create(test_spec_revision_1.TestSpecificationSegment, {
439
- domain: { id: domainId },
440
- spec: { id: spec.id },
441
- plan: { id: plan.id },
442
- revision: { id: revisionId },
443
- validFrom: draft.effectiveFrom,
444
- validTo: null
445
- }));
446
- const advanced = await manager.update(test_specification_1.TestSpecification, { id: spec.id, domain: { id: domainId }, planGeneration: spec.planGeneration }, { planGeneration: plan.generation });
447
- if (advanced.affected !== 1)
448
- refuse('PLAN_CONFLICT');
449
- return plan;
450
- }
451
- async function resolveTestSpecification(manager, domainId, specId, businessTime, knownAt = new Date()) {
452
- const at = instant(businessTime);
453
- const known = instant(knownAt);
454
- const plan = await manager.findOne(test_spec_revision_1.TestSpecificationPlan, {
455
- where: { domain: { id: domainId }, spec: { id: specId }, recordedAt: (0, typeorm_1.LessThanOrEqual)(known) },
456
- order: { generation: 'DESC' },
457
- ...(0, row_lock_1.writeLockOn)(manager, test_spec_revision_1.TestSpecificationPlan)
458
- });
459
- if (!plan)
460
- refuse('NO_EFFECTIVE_REVISION');
461
- /* 실행 조회도 뿌리와 최신 Plan 의 불변식을 지난다 — material·recipe 와 같은 자리다. */
462
- await subject(manager, domainId, specId);
463
- const query = manager
464
- .createQueryBuilder(test_spec_revision_1.TestSpecificationSegment, 'segment')
465
- .where({ domain: { id: domainId }, spec: { id: specId }, plan: { id: plan.id } })
466
- .andWhere('segment.validFrom <= :at', { at })
467
- .andWhere('(segment.validTo IS NULL OR segment.validTo > :at)', { at });
468
- (0, row_lock_1.lockRowsOf)(manager, query);
469
- const segments = await query.getMany();
470
- if (!segments.length)
471
- await refuseBeforeBaseline(manager, domainId, specId, at);
472
- if (segments.length !== 1)
473
- refuse(segments.length ? 'AMBIGUOUS_EFFECTIVITY' : 'NO_EFFECTIVE_REVISION');
474
- const selected = await revision(manager, domainId, segments[0].revisionId);
475
- if (!selected.frozenAt || selected.contentHash !== testSpecificationSubmissionHash(selected))
476
- refuse('REVISION_INTEGRITY_FAILURE');
477
- return { revision: selected, plan, segment: segments[0] };
478
- }
479
- /**
480
- * 기준선보다 앞선 시각을 물으면 **모른다고 말한다**(2026-09-24). 그 시각의 내용은 기록된 적이 없다 —
481
- * 행이 제자리에서 덮어써졌기 때문이다. 오늘 값이나 「유효한 것 없음」으로 답하지 않는다.
482
- */
483
- async function refuseBeforeBaseline(manager, domainId, specId, at) {
484
- const first = await manager.findOneBy(test_spec_revision_1.TestSpecificationPlan, {
485
- domain: { id: domainId }, spec: { id: specId }, generation: 1, releaseKind: 'baseline'
486
- });
487
- if (!first)
488
- return;
489
- const recorded = await manager.findOneBy(test_spec_revision_1.TestSpecificationRevision, { domain: { id: domainId }, id: first.publishedRevisionId });
490
- if (recorded && at < recorded.effectiveFrom)
491
- throw new shell_1.Refusal('BEFORE_BASELINE', { baselineAt: recorded.effectiveFrom.toISOString() }, `This master was first recorded at ${recorded.effectiveFrom.toISOString()}; nothing is known about it before then.`);
492
- }
493
- /**
494
- * **개정본이 하나도 없는 명세**마다 지금 서 있는 행을 첫 개정본으로 적는다 — 기준선(2026-09-24).
495
- *
496
- * 개정 체계보다 먼저 있던 행은 한 번도 개정본을 가진 적이 없어서, 새 검사가 고를 것이 없었다. 기준선은
497
- * 변경이 아니라 **지금 이 값으로 돌고 있다는 기록**이라 결재를 안 탄다. 대신 자기 성격을 이름으로 댄다 —
498
- * 발행 종류 `baseline`, 결재자·작성자·발행자는 비고, 세운 시각과 버전(`edition`)이 사유에 남는다.
499
- *
500
- * - 값은 행에 있는 그대로다. 고치지 않는다.
501
- * - 유효 시작은 **세운 시각**이다(`at` — 서버가 정한다). 앞으로 소급하지 않는다. 그 앞은 모른다.
502
- * - 행에 끝(`effectiveEnd`)이 적혀 있으면 그때 끝난다. 이미 지났으면 개정본만 서고 유효 구간은 없다.
503
- * - 개정본이 하나라도 있는 명세는 손대지 않는다. 찾는 것은 질의 하나다.
504
- * - 둘이 동시에 돌아도 하나만 선다 — 개정 번호 유니크와 루트의 세대 조건부 갱신이 막는다.
505
- */
506
- async function standTestSpecificationBaselines(manager, domainId, at, edition) {
507
- transaction(manager);
508
- const roots = await manager
509
- .createQueryBuilder(test_specification_1.TestSpecification, 'spec')
510
- .leftJoin(test_spec_revision_1.TestSpecificationRevision, 'rev', 'rev.spec_id = spec.id AND rev.domain_id = spec.domain_id')
511
- .where('spec.domain_id = :domainId', { domainId })
512
- .andWhere('rev.id IS NULL')
513
- .getMany();
514
- const outcome = { stood: 0, unreadable: [] };
515
- if (!roots.length)
516
- return outcome;
517
- const policy = await (0, master_change_policy_1.masterChangePolicy)(manager, domainId, 'testSpecification');
518
- for (const root of roots) {
519
- if (root.planGeneration !== 0) {
520
- outcome.unreadable.push({ name: root.name, problem: 'plan without revision' });
521
- continue;
522
- }
523
- const read = (0, criteria_check_1.readCriteria)(root.criteria ?? []);
524
- const judged = read.read === 'failed' ? { ok: false, problems: [read.detail] } : (0, criteria_check_1.judgeCriteria)(read.criteria);
525
- if (read.read === 'failed' || !judged.ok || !root.version?.trim()) {
526
- outcome.unreadable.push({
527
- name: root.name,
528
- problem: !root.version?.trim() ? 'no version' : judged.problems.join('; ')
529
- });
530
- continue;
531
- }
532
- const validFrom = root.effectiveStart && root.effectiveStart > at ? root.effectiveStart : at;
533
- const validTo = root.effectiveEnd ?? null;
534
- const saved = await manager.save(test_spec_revision_1.TestSpecificationRevision, manager.create(test_spec_revision_1.TestSpecificationRevision, {
535
- version: root.version.trim(),
536
- description: root.description ?? null,
537
- criteria: JSON.parse(JSON.stringify(read.criteria)),
538
- effectiveFrom: validFrom,
539
- reason: `baseline: the row as it stood, recorded by ${edition}`,
540
- policy: { id: policy.id },
541
- domain: { id: domainId },
542
- spec: { id: root.id },
543
- baseRevision: null,
544
- baseGeneration: 0,
545
- revisionNumber: 1,
546
- editGeneration: 0,
547
- creator: null,
548
- createdAt: at,
549
- frozenAt: at,
550
- contentHash: null,
551
- activityInstanceId: null
552
- }));
553
- const stood = await revision(manager, domainId, saved.id);
554
- const contentHash = testSpecificationSubmissionHash(stood);
555
- await manager.update(test_spec_revision_1.TestSpecificationRevision, { id: stood.id, domain: { id: domainId } }, { contentHash });
556
- const plan = await manager.save(test_spec_revision_1.TestSpecificationPlan, manager.create(test_spec_revision_1.TestSpecificationPlan, {
557
- domain: { id: domainId },
558
- spec: { id: root.id },
559
- generation: 1,
560
- recordedAt: at,
561
- activityInstanceId: null,
562
- submissionHash: contentHash,
563
- approver: null,
564
- publisher: null,
565
- releaseKind: 'baseline',
566
- publishedRevision: { id: stood.id },
567
- policy: { id: policy.id }
568
- }));
569
- if (!validTo || validTo > validFrom) {
570
- await manager.save(test_spec_revision_1.TestSpecificationSegment, manager.create(test_spec_revision_1.TestSpecificationSegment, {
571
- domain: { id: domainId },
572
- spec: { id: root.id },
573
- plan: { id: plan.id },
574
- revision: { id: stood.id },
575
- validFrom,
576
- validTo
577
- }));
578
- }
579
- const advanced = await manager.update(test_specification_1.TestSpecification, { id: root.id, domain: { id: domainId }, planGeneration: 0 }, { planGeneration: 1 });
580
- if (advanced.affected !== 1)
581
- refuse('PLAN_CONFLICT');
582
- outcome.stood++;
583
- }
584
- return outcome;
585
- }
586
- /** Replay reads verify the captured digest too, not only the currently effective schedule. */
587
- async function testSpecificationRevisionForBasis(manager, domainId, basis) {
588
- if (basis.domainId !== domainId)
589
- refuse('BASIS_CONFLICT');
590
- const selected = await revision(manager, domainId, basis.revisionId);
591
- if (selected.specId !== basis.specId || !selected.frozenAt || selected.contentHash !== basis.contentHash || testSpecificationSubmissionHash(selected) !== basis.contentHash) {
592
- refuse('REVISION_INTEGRITY_FAILURE');
593
- }
594
- return selected;
595
- }
596
- /** Must run inside the transaction that writes the inspection result. */
597
- async function captureTestSpecificationBasis(manager, domainId, specId, recordKey, businessTime) {
598
- const at = instant(businessTime);
599
- await lockSubject(manager, domainId, specId);
600
- const existing = await manager.findOne(test_spec_revision_1.TestSpecificationBasis, {
601
- where: { domain: { id: domainId }, recordKey },
602
- ...(0, row_lock_1.writeLockOn)(manager, test_spec_revision_1.TestSpecificationBasis)
603
- });
604
- if (existing) {
605
- if (existing.specId !== specId || existing.businessTime.getTime() !== at.getTime())
606
- refuse('BASIS_CONFLICT');
607
- await testSpecificationRevisionForBasis(manager, domainId, existing);
608
- return existing;
609
- }
610
- const resolvedAt = new Date();
611
- const selected = await resolveTestSpecification(manager, domainId, specId, at, resolvedAt);
612
- const saved = await manager.save(test_spec_revision_1.TestSpecificationBasis, manager.create(test_spec_revision_1.TestSpecificationBasis, {
613
- domain: { id: domainId },
614
- spec: { id: specId },
615
- recordKey: text(recordKey, 'recordKey'),
616
- businessTime: at,
617
- resolvedAt,
618
- revision: { id: selected.revision.id },
619
- contentHash: selected.revision.contentHash,
620
- plan: { id: selected.plan.id }
621
- }));
622
- return manager.findOneByOrFail(test_spec_revision_1.TestSpecificationBasis, { id: saved.id, domain: { id: domainId } });
623
- }
624
- async function testSpecificationRevisionOverview(manager, domainId, specId, at = new Date()) {
625
- const spec = await subject(manager, domainId, specId);
626
- const revisions = await manager.find(test_spec_revision_1.TestSpecificationRevision, {
627
- where: { domain: { id: domainId }, spec: { id: specId } },
628
- order: { createdAt: 'ASC', id: 'ASC' }
629
- });
630
- const plan = await manager.findOne(test_spec_revision_1.TestSpecificationPlan, {
631
- where: { domain: { id: domainId }, spec: { id: specId }, generation: spec.planGeneration }
632
- });
633
- const schedule = plan
634
- ? await manager.find(test_spec_revision_1.TestSpecificationSegment, {
635
- where: { domain: { id: domainId }, spec: { id: specId }, plan: { id: plan.id } },
636
- order: { validFrom: 'ASC' }
637
- })
638
- : [];
639
- /*
640
- * 개정본마다 **어떻게 발행됐는지**(`releaseKind`)를 함께 싣는다 — 발행한 적용계획의 값 그대로(2026-10-20).
641
- * 화면은 이것으로 기준선을 알아보고 사람의 말(「최초 기록」)로 적는다. 기준선의 사유는 서버가 쓴 기록
642
- * 문장인데 해시에 들어가 바꿀 수 없고, 문구로 알아보면 깨지기 쉽다. 발행 전 개정본은 null.
643
- */
644
- const kindOf = (0, approval_input_1.releaseKinds)(await manager.findBy(test_spec_revision_1.TestSpecificationPlan, { domain: { id: domainId }, spec: { id: specId } }));
645
- return {
646
- specId,
647
- name: spec.name,
648
- generation: spec.planGeneration,
649
- at: at.toISOString(),
650
- schedule: schedule.map(segment => ({
651
- ...segment,
652
- state: segment.validFrom > at ? 'scheduled' : segment.validTo && segment.validTo <= at ? 'expired' : 'current'
653
- })),
654
- revisions: revisions.map(item => ({ ...item, state: item.frozenAt ? 'frozen' : 'draft',
655
- releaseKind: kindOf(item.id) }))
656
- };
657
- }
658
- /** Read-time projection, never a clock-driven rewrite of the identity row. */
659
- async function effectiveTestSpecification(manager, domainId, spec, at = new Date()) {
660
- const selected = await resolveTestSpecification(manager, domainId, spec.id, at);
661
- return Object.assign(new test_specification_1.TestSpecification(), spec, {
662
- version: selected.revision.version,
663
- description: selected.revision.description,
664
- criteria: selected.revision.criteria,
665
- effectiveStart: selected.segment.validFrom,
666
- effectiveEnd: selected.segment.validTo ?? undefined
667
- });
668
- }
669
- /**
670
- * **비규제 사업장의 「저장」 한 번** — 초안을 만들고 바로 발행한다, 한 트랜잭션에서(ADR-0086 09-22 보탬).
671
- * 비규제면 사람이 누를 것은 저장 하나다. 두 걸음(초안 저장 → 발행)이 구조상 필연인 것처럼 보이게 하지 않는다.
672
- * 이 축이 승인제면 발행이 `MASTER_APPROVAL_REQUIRED` 로 거절되고, 같은 트랜잭션이라 초안도 함께 물러난다 —
673
- * 반쯤 저장된 것이 남지 않는다. 개정본 · 적용계획 · 구간은 두 걸음 때와 똑같이 선다.
674
- */
675
- async function saveAndPublishTestSpecification(manager, domainId, actorId, asked) {
676
- // Reuse the owned draft and its concurrency guard; publishing failure rolls back the edit too.
677
- if (asked.revisionId && !Number.isInteger(asked.editGeneration))
678
- refuse('DRAFT_CONFLICT');
679
- const draft = asked.revisionId
680
- ? await editTestSpecificationDraft(manager, domainId, actorId, asked.revisionId, asked.editGeneration, asked.content)
681
- : await createTestSpecificationDraft(manager, domainId, actorId, asked);
682
- const plan = await publishUnregulatedTestSpecification(manager, domainId, actorId, draft.id, draft.editGeneration);
683
- return { revision: await revision(manager, domainId, draft.id, false), plan };
684
- }
685
- //# sourceMappingURL=test-spec-revision-service.js.map