@pisell/private-materials 6.12.168 → 6.12.170

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 (275) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/meta.js +1 -1
  5. package/build/lowcode/render/default/view.css +1 -1
  6. package/build/lowcode/render/default/view.js +10 -10
  7. package/build/lowcode/view.css +1 -1
  8. package/build/lowcode/view.js +10 -10
  9. package/es/components/HDLKiosk/{contracts → app/contracts}/config.js +1 -1
  10. package/es/components/HDLKiosk/app/manifest.js +11 -11
  11. package/es/components/HDLKiosk/app/operations.js +92 -0
  12. package/es/components/HDLKiosk/app/workflow/barcode.js +7 -3
  13. package/es/components/HDLKiosk/app/workflow/index.js +16 -0
  14. package/es/components/HDLKiosk/app/workflow/predicates.js +1 -1
  15. package/es/components/HDLKiosk/app/workflow/quick.js +1 -1
  16. package/es/components/HDLKiosk/app/workflow/registry.js +4 -4
  17. package/es/components/HDLKiosk/app/workflow/scale.js +5 -1
  18. package/es/components/HDLKiosk/components/common/HDLKioskSkuOptionsSelection/index.less +1 -1
  19. package/es/components/HDLKiosk/components/overlays/HDLKioskModal/index.less +1 -1
  20. package/es/components/HDLKiosk/components/shell/HDLKioskBottomBarHost/index.js +4 -1
  21. package/es/components/HDLKiosk/docs/00-/346/226/207/344/273/266/345/257/274/350/210/252.md +104 -167
  22. package/es/components/HDLKiosk/docs/01-/346/240/270/345/277/203/350/277/220/350/241/214/346/234/272/345/210/266.md +95 -89
  23. package/es/components/HDLKiosk/docs/02-Host/351/200/202/351/205/215/344/270/216/344/270/232/345/212/241/346/225/260/346/215/256.md +20 -19
  24. package/es/components/HDLKiosk/docs/04-/350/256/276/345/244/207/344/270/216/347/247/260/351/207/215.md +43 -26
  25. package/es/components/HDLKiosk/docs/05-/344/272/244/346/230/223/345/256/211/345/205/250.md +2 -0
  26. package/es/components/HDLKiosk/docs/08-/346/227/240/345/244/264Application/350/277/220/350/241/214/346/227/266/351/207/215/346/236/204/350/256/276/350/256/241.md +719 -0
  27. package/es/components/HDLKiosk/docs/09-Entry/350/256/276/345/244/207/344/272/213/344/273/266/351/207/215/346/236/204/344/277/256/345/244/215/346/212/245/345/221/212.md +187 -0
  28. package/es/components/HDLKiosk/docs/README.md +6 -2
  29. package/es/components/HDLKiosk/docs//345/256/236/346/226/275/350/277/233/345/272/246.md +8 -7
  30. package/es/components/HDLKiosk/docs//346/236/266/346/236/204/350/256/276/350/256/241.md +16 -18
  31. package/es/components/HDLKiosk/index.js +32 -30
  32. package/es/components/HDLKiosk/index.less +8 -3
  33. package/es/components/HDLKiosk/kernel/README.md +13 -12
  34. package/es/components/HDLKiosk/kernel/application/defineApplication.js +63 -24
  35. package/es/components/HDLKiosk/kernel/application/defineSlice.js +6 -6
  36. package/es/components/HDLKiosk/kernel/application/runtime.js +237 -0
  37. package/es/components/HDLKiosk/kernel/operations/coordinator.js +1 -1
  38. package/es/components/HDLKiosk/kernel/operations/registry.js +3 -3
  39. package/es/components/HDLKiosk/kernel/operations/sessionEpoch.js +1 -1
  40. package/es/components/HDLKiosk/kernel/operations/types.js +7 -3
  41. package/es/components/HDLKiosk/kernel/workflow/actor.js +16 -17
  42. package/es/components/HDLKiosk/kernel/workflow/compiler.js +14 -16
  43. package/es/components/HDLKiosk/runtime/createRuntime.js +238 -0
  44. package/es/components/HDLKiosk/{devices → runtime/devices}/dedupeStore.js +1 -1
  45. package/es/components/HDLKiosk/{devices → runtime/devices}/scaleIngress.js +1 -1
  46. package/es/components/HDLKiosk/{devices/scale/runtime.js → runtime/devices/scaleStore.js} +18 -24
  47. package/es/components/HDLKiosk/{devices → runtime/devices}/scannerIngress.js +1 -1
  48. package/es/components/HDLKiosk/runtime/devices/scannerSessionPort.js +60 -0
  49. package/es/components/HDLKiosk/runtime/devices/scannerSessionRouter.js +212 -0
  50. package/es/components/HDLKiosk/runtime/operations/barcode.js +18 -0
  51. package/es/components/HDLKiosk/runtime/operations/cart.js +44 -0
  52. package/es/components/HDLKiosk/{app → runtime}/operations/cartConsistency.js +1 -1
  53. package/es/components/HDLKiosk/{app → runtime}/operations/checkout.js +95 -110
  54. package/es/components/HDLKiosk/{app → runtime}/operations/checkoutRequirements.js +1 -1
  55. package/es/components/HDLKiosk/{app → runtime}/operations/checkoutSafety.js +1 -1
  56. package/es/components/HDLKiosk/{app → runtime}/operations/coordinator.js +2 -2
  57. package/es/components/HDLKiosk/runtime/operations/customization.js +70 -0
  58. package/es/components/HDLKiosk/{app → runtime}/operations/errors.js +1 -1
  59. package/es/components/HDLKiosk/runtime/operations/fulfillment.js +6 -0
  60. package/es/components/HDLKiosk/runtime/operations/identity.js +55 -0
  61. package/es/components/HDLKiosk/runtime/operations/registry.js +34 -0
  62. package/es/components/HDLKiosk/runtime/operations/session.js +29 -0
  63. package/es/components/HDLKiosk/runtime/operations/types.js +13 -0
  64. package/es/components/HDLKiosk/runtime/session/blockPolicy.js +14 -0
  65. package/es/components/HDLKiosk/runtime/{createWorkflowSession.js → session/createSession.js} +67 -17
  66. package/es/components/HDLKiosk/runtime/{domainTransitionRunner.js → session/transitionRunner.js} +10 -5
  67. package/es/components/HDLKiosk/runtime/{workflowContext.js → session/workflowContext.js} +2 -2
  68. package/es/components/HDLKiosk/runtime/{workflowLifecycle.js → session/workflowLifecycle.js} +2 -2
  69. package/es/components/HDLKiosk/runtime/triggers.js +28 -0
  70. package/es/components/HDLKiosk/slices/catalog/Screen/index.js +15 -8
  71. package/es/components/HDLKiosk/slices/catalog/Screen/index.less +74 -13
  72. package/es/components/HDLKiosk/slices/catalog/slice.js +2 -2
  73. package/es/components/HDLKiosk/slices/customization/Screen/index.js +34 -35
  74. package/es/components/HDLKiosk/slices/customization/Screen/index.less +5 -0
  75. package/es/components/HDLKiosk/slices/customization/slice.js +2 -3
  76. package/es/components/HDLKiosk/slices/fulfillment/slice.js +2 -2
  77. package/es/components/HDLKiosk/slices/fulfillment/view.js +1 -1
  78. package/es/components/HDLKiosk/slices/identity/Screen/index.less +1 -1
  79. package/es/components/HDLKiosk/slices/identity/slice.js +2 -2
  80. package/es/components/HDLKiosk/slices/identity/view.js +1 -1
  81. package/es/components/HDLKiosk/slices/payment/Screen/index.less +1 -1
  82. package/es/components/HDLKiosk/slices/payment/slice.js +3 -3
  83. package/es/components/HDLKiosk/slices/primaryProductPrompt/slice.js +1 -1
  84. package/es/components/HDLKiosk/{runtime → ui}/HDLKioskWorkflowView.js +68 -129
  85. package/es/components/HDLKiosk/ui/ScaleSimulatorConsole/index.js +387 -0
  86. package/es/components/HDLKiosk/ui/ScaleSimulatorConsole/index.less +621 -0
  87. package/es/components/HDLKiosk/{app → ui}/ScreenRenderer.js +1 -1
  88. package/es/components/HDLKiosk/ui/collaborationStatus.js +11 -0
  89. package/es/components/HDLKiosk/ui/controllers/useHDLKioskActionDispatcher.js +66 -0
  90. package/es/components/HDLKiosk/{runtime → ui}/controllers/useHDLKioskCustomerController.js +1 -1
  91. package/es/components/HDLKiosk/ui/controllers/useHDLKioskDeviceController.js +25 -0
  92. package/es/components/HDLKiosk/ui/controllers/useHDLKioskExitController.js +53 -0
  93. package/es/components/HDLKiosk/{runtime → ui}/controllers/useHDLKioskScreenData.js +1 -1
  94. package/es/components/HDLKiosk/ui/controllers/useHDLKioskSessionController.js +39 -0
  95. package/es/components/HDLKiosk/{app → ui}/entry/Screen/index.js +8 -6
  96. package/es/components/HDLKiosk/{app → ui}/entry/model.js +2 -2
  97. package/es/components/HDLKiosk/ui/scale.js +20 -0
  98. package/es/components/HDLKiosk/{runtime/useHostSnapshot.js → ui/snapshots.js} +6 -8
  99. package/es/components/HDLKiosk/{app → ui}/views.js +1 -1
  100. package/es/components/HDLKiosk/{runtime → ui}/workflowEvent.js +1 -1
  101. package/es/components/HDLKiosk/utils.js +4 -4
  102. package/es/components/bigSale/templates/HDLKiosk/README.md +43 -0
  103. package/es/components/bigSale/templates/HDLKiosk/adapter/createHost.js +7 -7
  104. package/es/components/bigSale/templates/HDLKiosk/adapter/{devices.js → devices/devicePort.js} +10 -38
  105. package/es/components/bigSale/templates/HDLKiosk/adapter/{capabilities.js → host/capabilities.js} +2 -2
  106. package/es/components/bigSale/templates/HDLKiosk/adapter/{fulfillment.js → host/fulfillmentWriter.js} +3 -3
  107. package/es/components/bigSale/templates/HDLKiosk/adapter/{projection.js → host/projection.js} +24 -14
  108. package/es/components/bigSale/templates/HDLKiosk/adapter/{telemetry.js → host/telemetry.js} +1 -1
  109. package/es/components/bigSale/templates/HDLKiosk/adapter/sales/cart.js +187 -0
  110. package/es/components/bigSale/templates/HDLKiosk/adapter/sales/catalog.js +160 -0
  111. package/es/components/bigSale/templates/HDLKiosk/adapter/{customizationProduct.js → sales/customizationProduct.js} +3 -3
  112. package/es/components/bigSale/templates/HDLKiosk/adapter/sales/fulfillment.js +31 -0
  113. package/es/components/bigSale/templates/HDLKiosk/adapter/sales/identity.js +57 -0
  114. package/es/components/bigSale/templates/HDLKiosk/adapter/sales/index.js +18 -0
  115. package/es/components/bigSale/templates/HDLKiosk/adapter/sales/payment.js +123 -0
  116. package/es/components/bigSale/templates/HDLKiosk/adapter/sales/session.js +71 -0
  117. package/es/components/bigSale/templates/HDLKiosk/adapter/sales/weightedOperations.js +124 -0
  118. package/es/components/bigSale/templates/HDLKiosk/adapter/{weightedProduct.js → sales/weightedProduct.js} +2 -2
  119. package/es/components/bigSale/templates/HDLKiosk/adapter/useBigSaleHDLKioskAdapter.js +41 -0
  120. package/es/components/bigSale/templates/HDLKiosk/adapter/useBigSaleHDLKioskHost.js +10 -7
  121. package/es/components/bigSale/templates/HDLKiosk/cart/useBigSaleHDLKioskCart.js +122 -0
  122. package/es/components/bigSale/templates/HDLKiosk/{adapter → hooks}/useHDLKioskEntryPreparationToast.js +2 -1
  123. package/es/components/bigSale/templates/HDLKiosk/index.js +42 -148
  124. package/es/components/bigSale/templates/HDLKiosk/{adapter/scaleTrigger.js → runtime/BigSaleScaleRuntimeOwner.js} +33 -62
  125. package/es/components/bigSale/templates/HDLKiosk/{adapter → runtime}/HDLKioskPaymentRuntime.js +4 -3
  126. package/es/components/bigSale/templates/HDLKiosk/runtime/scaleBridge.js +44 -0
  127. package/lib/components/HDLKiosk/{contracts → app/contracts}/config.js +1 -1
  128. package/lib/components/HDLKiosk/app/manifest.js +18 -19
  129. package/lib/components/HDLKiosk/app/operations.js +105 -0
  130. package/lib/components/HDLKiosk/app/workflow/barcode.js +7 -3
  131. package/lib/components/HDLKiosk/app/workflow/index.js +16 -0
  132. package/lib/components/HDLKiosk/app/workflow/predicates.js +1 -0
  133. package/lib/components/HDLKiosk/app/workflow/quick.js +1 -1
  134. package/lib/components/HDLKiosk/app/workflow/registry.js +3 -3
  135. package/lib/components/HDLKiosk/app/workflow/scale.js +5 -1
  136. package/lib/components/HDLKiosk/components/common/HDLKioskSkuOptionsSelection/index.less +1 -1
  137. package/lib/components/HDLKiosk/components/overlays/HDLKioskModal/index.less +1 -1
  138. package/lib/components/HDLKiosk/components/shell/HDLKioskBottomBarHost/index.js +4 -1
  139. package/lib/components/HDLKiosk/docs/00-/346/226/207/344/273/266/345/257/274/350/210/252.md +104 -167
  140. package/lib/components/HDLKiosk/docs/01-/346/240/270/345/277/203/350/277/220/350/241/214/346/234/272/345/210/266.md +95 -89
  141. package/lib/components/HDLKiosk/docs/02-Host/351/200/202/351/205/215/344/270/216/344/270/232/345/212/241/346/225/260/346/215/256.md +20 -19
  142. package/lib/components/HDLKiosk/docs/04-/350/256/276/345/244/207/344/270/216/347/247/260/351/207/215.md +43 -26
  143. package/lib/components/HDLKiosk/docs/05-/344/272/244/346/230/223/345/256/211/345/205/250.md +2 -0
  144. package/lib/components/HDLKiosk/docs/08-/346/227/240/345/244/264Application/350/277/220/350/241/214/346/227/266/351/207/215/346/236/204/350/256/276/350/256/241.md +719 -0
  145. package/lib/components/HDLKiosk/docs/09-Entry/350/256/276/345/244/207/344/272/213/344/273/266/351/207/215/346/236/204/344/277/256/345/244/215/346/212/245/345/221/212.md +187 -0
  146. package/lib/components/HDLKiosk/docs/README.md +6 -2
  147. package/lib/components/HDLKiosk/docs//345/256/236/346/226/275/350/277/233/345/272/246.md +8 -7
  148. package/lib/components/HDLKiosk/docs//346/236/266/346/236/204/350/256/276/350/256/241.md +16 -18
  149. package/lib/components/HDLKiosk/index.js +35 -33
  150. package/lib/components/HDLKiosk/index.less +8 -3
  151. package/lib/components/HDLKiosk/kernel/README.md +13 -12
  152. package/lib/components/HDLKiosk/kernel/application/defineApplication.js +65 -25
  153. package/lib/components/HDLKiosk/kernel/application/defineSlice.js +6 -6
  154. package/lib/components/HDLKiosk/kernel/application/runtime.js +237 -0
  155. package/lib/components/HDLKiosk/kernel/operations/coordinator.js +1 -1
  156. package/lib/components/HDLKiosk/kernel/operations/registry.js +3 -3
  157. package/lib/components/HDLKiosk/kernel/operations/sessionEpoch.js +1 -1
  158. package/lib/components/HDLKiosk/kernel/operations/types.js +8 -3
  159. package/lib/components/HDLKiosk/kernel/workflow/actor.js +16 -17
  160. package/lib/components/HDLKiosk/kernel/workflow/compiler.js +14 -16
  161. package/lib/components/HDLKiosk/runtime/createRuntime.js +239 -0
  162. package/lib/components/HDLKiosk/{devices → runtime/devices}/dedupeStore.js +1 -1
  163. package/lib/components/HDLKiosk/{devices → runtime/devices}/scaleIngress.js +1 -1
  164. package/lib/components/HDLKiosk/{devices/scale/runtime.js → runtime/devices/scaleStore.js} +17 -27
  165. package/lib/components/HDLKiosk/{devices → runtime/devices}/scannerIngress.js +1 -1
  166. package/lib/components/HDLKiosk/runtime/devices/scannerSessionPort.js +60 -0
  167. package/lib/components/HDLKiosk/runtime/devices/scannerSessionRouter.js +212 -0
  168. package/lib/components/HDLKiosk/runtime/operations/barcode.js +17 -0
  169. package/lib/components/HDLKiosk/runtime/operations/cart.js +46 -0
  170. package/lib/components/HDLKiosk/{app → runtime}/operations/cartConsistency.js +1 -1
  171. package/lib/components/HDLKiosk/{app → runtime}/operations/checkout.js +97 -112
  172. package/lib/components/HDLKiosk/{app → runtime}/operations/checkoutRequirements.js +1 -1
  173. package/lib/components/HDLKiosk/{app → runtime}/operations/checkoutSafety.js +1 -1
  174. package/lib/components/HDLKiosk/{app → runtime}/operations/coordinator.js +2 -2
  175. package/lib/components/HDLKiosk/runtime/operations/customization.js +73 -0
  176. package/lib/components/HDLKiosk/{app → runtime}/operations/errors.js +1 -1
  177. package/lib/components/HDLKiosk/runtime/operations/fulfillment.js +5 -0
  178. package/lib/components/HDLKiosk/runtime/operations/identity.js +55 -0
  179. package/lib/components/HDLKiosk/runtime/operations/registry.js +34 -0
  180. package/lib/components/HDLKiosk/runtime/operations/session.js +30 -0
  181. package/lib/components/HDLKiosk/runtime/operations/types.js +14 -0
  182. package/lib/components/HDLKiosk/runtime/session/blockPolicy.js +14 -0
  183. package/lib/components/HDLKiosk/runtime/{createWorkflowSession.js → session/createSession.js} +71 -21
  184. package/lib/components/HDLKiosk/runtime/{domainTransitionRunner.js → session/transitionRunner.js} +10 -5
  185. package/lib/components/HDLKiosk/runtime/{workflowContext.js → session/workflowContext.js} +2 -2
  186. package/lib/components/HDLKiosk/runtime/{workflowLifecycle.js → session/workflowLifecycle.js} +2 -2
  187. package/lib/components/HDLKiosk/runtime/triggers.js +28 -0
  188. package/lib/components/HDLKiosk/slices/catalog/Screen/index.js +15 -8
  189. package/lib/components/HDLKiosk/slices/catalog/Screen/index.less +74 -13
  190. package/lib/components/HDLKiosk/slices/catalog/slice.js +3 -3
  191. package/lib/components/HDLKiosk/slices/customization/Screen/index.js +35 -36
  192. package/lib/components/HDLKiosk/slices/customization/Screen/index.less +5 -0
  193. package/lib/components/HDLKiosk/slices/customization/slice.js +5 -6
  194. package/lib/components/HDLKiosk/slices/fulfillment/slice.js +3 -3
  195. package/lib/components/HDLKiosk/slices/fulfillment/view.js +1 -1
  196. package/lib/components/HDLKiosk/slices/identity/Screen/index.less +1 -1
  197. package/lib/components/HDLKiosk/slices/identity/slice.js +4 -4
  198. package/lib/components/HDLKiosk/slices/identity/view.js +1 -1
  199. package/lib/components/HDLKiosk/slices/payment/Screen/index.less +1 -1
  200. package/lib/components/HDLKiosk/slices/payment/slice.js +5 -5
  201. package/lib/components/HDLKiosk/slices/primaryProductPrompt/slice.js +1 -1
  202. package/lib/components/HDLKiosk/{runtime → ui}/HDLKioskWorkflowView.js +69 -130
  203. package/lib/components/HDLKiosk/ui/ScaleSimulatorConsole/index.js +390 -0
  204. package/lib/components/HDLKiosk/ui/ScaleSimulatorConsole/index.less +621 -0
  205. package/lib/components/HDLKiosk/{app → ui}/ScreenRenderer.js +1 -1
  206. package/lib/components/HDLKiosk/ui/collaborationStatus.js +11 -0
  207. package/lib/components/HDLKiosk/ui/controllers/useHDLKioskActionDispatcher.js +67 -0
  208. package/lib/components/HDLKiosk/{runtime → ui}/controllers/useHDLKioskCustomerController.js +1 -1
  209. package/lib/components/HDLKiosk/ui/controllers/useHDLKioskDeviceController.js +26 -0
  210. package/lib/components/HDLKiosk/ui/controllers/useHDLKioskExitController.js +54 -0
  211. package/lib/components/HDLKiosk/{runtime → ui}/controllers/useHDLKioskScreenData.js +1 -1
  212. package/lib/components/HDLKiosk/ui/controllers/useHDLKioskSessionController.js +40 -0
  213. package/lib/components/HDLKiosk/{app → ui}/entry/Screen/index.js +8 -6
  214. package/lib/components/HDLKiosk/{app → ui}/entry/model.js +2 -2
  215. package/lib/components/HDLKiosk/ui/scale.js +24 -0
  216. package/lib/components/HDLKiosk/{runtime/useHostSnapshot.js → ui/snapshots.js} +6 -7
  217. package/lib/components/HDLKiosk/{app → ui}/views.js +1 -1
  218. package/lib/components/HDLKiosk/{runtime → ui}/workflowEvent.js +1 -1
  219. package/lib/components/HDLKiosk/utils.js +4 -4
  220. package/lib/components/bigSale/templates/HDLKiosk/README.md +43 -0
  221. package/lib/components/bigSale/templates/HDLKiosk/adapter/createHost.js +9 -9
  222. package/lib/components/bigSale/templates/HDLKiosk/adapter/{devices.js → devices/devicePort.js} +10 -38
  223. package/lib/components/bigSale/templates/HDLKiosk/adapter/{capabilities.js → host/capabilities.js} +2 -2
  224. package/lib/components/bigSale/templates/HDLKiosk/adapter/{fulfillment.js → host/fulfillmentWriter.js} +3 -3
  225. package/lib/components/bigSale/templates/HDLKiosk/adapter/{projection.js → host/projection.js} +25 -14
  226. package/lib/components/bigSale/templates/HDLKiosk/adapter/{telemetry.js → host/telemetry.js} +1 -1
  227. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales/cart.js +189 -0
  228. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales/catalog.js +162 -0
  229. package/lib/components/bigSale/templates/HDLKiosk/adapter/{customizationProduct.js → sales/customizationProduct.js} +4 -4
  230. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales/fulfillment.js +31 -0
  231. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales/identity.js +57 -0
  232. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales/index.js +18 -0
  233. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales/payment.js +123 -0
  234. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales/session.js +71 -0
  235. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales/weightedOperations.js +126 -0
  236. package/lib/components/bigSale/templates/HDLKiosk/adapter/{weightedProduct.js → sales/weightedProduct.js} +3 -3
  237. package/lib/components/bigSale/templates/HDLKiosk/adapter/useBigSaleHDLKioskAdapter.js +42 -0
  238. package/lib/components/bigSale/templates/HDLKiosk/adapter/useBigSaleHDLKioskHost.js +10 -7
  239. package/lib/components/bigSale/templates/HDLKiosk/cart/useBigSaleHDLKioskCart.js +124 -0
  240. package/lib/components/bigSale/templates/HDLKiosk/{adapter → hooks}/useHDLKioskEntryPreparationToast.js +2 -1
  241. package/lib/components/bigSale/templates/HDLKiosk/index.js +43 -149
  242. package/lib/components/bigSale/templates/HDLKiosk/{adapter/scaleTrigger.js → runtime/BigSaleScaleRuntimeOwner.js} +31 -61
  243. package/lib/components/bigSale/templates/HDLKiosk/{adapter → runtime}/HDLKioskPaymentRuntime.js +4 -3
  244. package/lib/components/bigSale/templates/HDLKiosk/runtime/scaleBridge.js +44 -0
  245. package/package.json +2 -2
  246. package/es/components/HDLKiosk/app/constants.js +0 -9
  247. package/es/components/HDLKiosk/app/operations/barcode.js +0 -22
  248. package/es/components/HDLKiosk/app/operations/cart.js +0 -60
  249. package/es/components/HDLKiosk/app/operations/fulfillment.js +0 -11
  250. package/es/components/HDLKiosk/app/operations/session.js +0 -41
  251. package/es/components/HDLKiosk/app/operations/types.js +0 -11
  252. package/es/components/HDLKiosk/devices/entryArbiter.js +0 -33
  253. package/es/components/HDLKiosk/runtime/controllers/useHDLKioskDeviceController.js +0 -75
  254. package/es/components/HDLKiosk/runtime/controllers/useHDLKioskScannerController.js +0 -160
  255. package/es/components/HDLKiosk/runtime/controllers/useHDLKioskSessionController.js +0 -185
  256. package/es/components/HDLKiosk/runtime/useWorkflowSnapshot.js +0 -12
  257. package/es/components/HDLKiosk/slices/customization/operation.js +0 -80
  258. package/es/components/HDLKiosk/slices/identity/operation.js +0 -60
  259. package/es/components/bigSale/templates/HDLKiosk/adapter/sales.js +0 -692
  260. package/lib/components/HDLKiosk/app/constants.js +0 -9
  261. package/lib/components/HDLKiosk/app/operations/barcode.js +0 -21
  262. package/lib/components/HDLKiosk/app/operations/cart.js +0 -62
  263. package/lib/components/HDLKiosk/app/operations/fulfillment.js +0 -10
  264. package/lib/components/HDLKiosk/app/operations/session.js +0 -42
  265. package/lib/components/HDLKiosk/app/operations/types.js +0 -12
  266. package/lib/components/HDLKiosk/devices/entryArbiter.js +0 -33
  267. package/lib/components/HDLKiosk/runtime/controllers/useHDLKioskDeviceController.js +0 -76
  268. package/lib/components/HDLKiosk/runtime/controllers/useHDLKioskScannerController.js +0 -161
  269. package/lib/components/HDLKiosk/runtime/controllers/useHDLKioskSessionController.js +0 -186
  270. package/lib/components/HDLKiosk/runtime/useWorkflowSnapshot.js +0 -13
  271. package/lib/components/HDLKiosk/slices/customization/operation.js +0 -83
  272. package/lib/components/HDLKiosk/slices/identity/operation.js +0 -60
  273. package/lib/components/bigSale/templates/HDLKiosk/adapter/sales.js +0 -694
  274. /package/es/components/HDLKiosk/{app → ui}/entry/Screen/index.less +0 -0
  275. /package/lib/components/HDLKiosk/{app → ui}/entry/Screen/index.less +0 -0
@@ -32,7 +32,7 @@ Screen Renderer 根据当前节点与最新 Projection 渲染
32
32
 
33
33
  | 状态类型 | 例子 | 所有者 | 为什么不能混用 |
34
34
  | -------- | -------------------------------------------------- | ---------------- | -------------------------------------------- |
35
- | 业务事实 | Cart、Customer、Summary、Payment | Host/OS | 前端推测会产生重复支付、假优惠或脏订单 |
35
+ | 业务事实 | Cart、Customer、Summary、Payment | Host/OS | 前端推测会产生重复支付、假优惠或脏订单 |
36
36
  | 流程状态 | entry、nodeId、fulfillment 本地选择、session epoch | Workflow Runtime | 只回答“顾客处于哪一步”,不能证明订单已写成功 |
37
37
  | 展示输入 | options 选中项、搜索词、Modal 内选择 | Screen | 可以随页面销毁,不得成为结账依据 |
38
38
 
@@ -40,31 +40,31 @@ Screen Renderer 根据当前节点与最新 Projection 渲染
40
40
 
41
41
  ## 2. 目录与运行时角色
42
42
 
43
- | 目录/文件 | 运行时角色 | 输入 | 输出 | 解决的问题 |
44
- | ----------------------------------------------------------------------------- | --------------------------- | -------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------- |
45
- | [`contracts/`](../contracts) | Core 与任意 Host 的最小协议 | 无宿主实现 | DTO、Port、Capability、Result、Workflow schema | 防止 BigSale/SalesSDK 类型渗入整个物料 |
46
- | [`kernel/`](../kernel) | 无 UI 运行内核 | 注入的 Registry、Policy、Runner、Lifecycle | Application API、Compiler、Actor、通用 Coordinator | 复用执行机制,同时阻断商家业务和 Host 反向依赖 |
47
- | [`slices/`](../slices) | HDLKiosk 业务切片 | Slice 定义、View、Screen/Dialog | 可复用业务能力与其本地界面 | 一个业务能力的规则、私有写入和界面同置 |
48
- | [`app/manifest.ts`](../app/manifest.ts) | 应用唯一装配点 | Slices、Workflows、应用级 Operations | Activity/Operation/Workflow Manifest | 自动收集依赖并在启动前验证引用完整性 |
49
- | [`app/workflow/`](../app/workflow) | 三入口业务编排与本地策略 | Activity 数组与特殊分支 | Quick/Barcode/Scale Definition | 流程顺序集中在应用目录,不和 Slice 实现混杂 |
50
- | [`runtime/createWorkflowSession.ts`](../runtime/createWorkflowSession.ts) | 一次点餐会话的组合根 | entry、Host、locale、可选 Lifecycle 扩展 | Kernel 与 HDLKiosk 业务实现的稳定组合 | 避免页面各自创建状态机或副作用执行器 |
51
- | [`app/workflow/registry.ts`](../app/workflow/registry.ts) | Activity Registry 类型视图 | Application Manifest | 带 HDLKiosk 字面量类型的 Registry | Runtime 不再维护第二份 Activity 清单 |
52
- | [`kernel/workflow/compiler.ts`](../kernel/workflow/compiler.ts) | Definition 结构校验 | Workflow Definition + 注入的 Registry | 冻结后的可执行 Definition 或 issues | 防止未知 Intent、非法跳转和无界循环进入 Actor |
53
- | [`app/workflow/policy.ts`](../app/workflow/policy.ts) | HDLKiosk 业务策略校验 | 编译后的 Definition | 支付门禁等业务 issues | 结构规则不与具体交易策略混在一起 |
54
- | [`kernel/workflow/actor.ts`](../kernel/workflow/actor.ts) | 单会话流程执行器 | Activity Intent、Navigation、Definition、Runner | WorkflowSnapshot、Transition | 解决双击、乱序导航和 Exit Command 完成前跳页 |
55
- | [`runtime/domainTransitionRunner.ts`](../runtime/domainTransitionRunner.ts) | Activity 离开策略执行器 | Exit Policy、Host Projection、Coordinator | advance/stay/blocked、支付回执 | Actor 不理解 Predicate、购物车和支付 Operation |
56
- | [`runtime/workflowLifecycle.ts`](../runtime/workflowLifecycle.ts) | 已提交状态的业务生命周期出口 | Actor 提交后的 Snapshot | telemetry | 诊断不进入状态机内核 |
57
- | [`kernel/operations/coordinator.ts`](../kernel/operations/coordinator.ts) | 通用副作用调度器 | Operation request + 应用 Policy | 规范化 OperationResult | 解决重复 intent、排队、超时和旧 Promise;不认识支付 |
58
- | [`app/operations.ts`](../app/operations.ts) | 共享 Operation 公共入口 | 跨 Slice Operation 与执行策略 | 稳定的统一导出面 | 避免消费者穿透私有实现目录 |
59
- | [`app/operations/coordinator.ts`](../app/operations/coordinator.ts) | HDLKiosk Operation Policy | Host、支付门禁、冲突域、遥测 | 绑定业务语义的 Coordinator | 把交易规则留在应用层而不是通用 Kernel |
60
- | [`app/operations/checkoutRequirements.ts`](../app/operations/checkoutRequirements.ts) | 支付前业务要求注册 | Requirement ID、Workflow Context、Projection | 当前适用 ID 与校验结果 | 新增采集事实时不改 Checkout 主流程 |
61
- | [`runtime/controllers/`](../runtime/controllers) | React 生命周期协调 | Host、Config、Projection、Actor | session/device/customer 状态 | 将根组件中的生命周期职责拆开 |
62
- | [`runtime/HDLKioskWorkflowView.tsx`](../runtime/HDLKioskWorkflowView.tsx) | 活跃会话 UI 编排 | Controllers、Projection、Actor snapshot | Renderer、Shell、全局 Dialog props | 防止根组件和具体 Screen 混入运行时协调逻辑 |
63
- | [`devices/`](../devices) | 设备入口治理 | 标准化扫码/称重事件 | accept/reject、entry claim | 解决首页多入口竞争、重复事件和错误页面消费 |
64
- | [`devices/scale/`](../devices/scale) | 顶层称重快照 | Adapter 发布的秤状态 | 全生命周期统一 Scale Snapshot | 让 Entry 和详情页共享同一秤连接,不反复挂卸原生 Hook |
65
- | [`app/ScreenRenderer.tsx`](../app/ScreenRenderer.tsx) | Workflow 到 Slice View 装配 | Definition、Snapshot、View Context | 当前 View 与 modal base | 页面不参与中央流程判断 |
66
- | [`components/`](../components) | 共享 Shell、Overlay 与控件 | 只读 ViewModel、语义 callback | 跨 Slice React UI | 共享视觉能力不反向拥有商家流程 |
67
- | [`testing/`](../testing) | 可替换 Host | fixture、可控异步结果 | Fake Host、调用记录 | 不启动 BigSale 也能确定性验证 Core |
43
+ | 目录/文件 | 运行时角色 | 输入 | 输出 | 解决的问题 |
44
+ | --------------------------------------------------------------------------------------------- | ---------------------------------- | ----------------------------------------------- | -------------------------------------------------- | ---------------------------------------------------- |
45
+ | [`app/contracts/`](../app/contracts) | Application 与任意 Host 的最小协议 | 无宿主实现 | DTO、Port、Capability、Result、Workflow schema | 防止 BigSale/SalesSDK 类型渗入应用层 |
46
+ | [`kernel/`](../kernel) | 无 UI 运行内核 | 注入的 Registry、Policy、Runner、Lifecycle | Application API、Compiler、Actor、通用 Coordinator | 复用执行机制,同时阻断商家业务和 Host 反向依赖 |
47
+ | [`slices/`](../slices) | HDLKiosk 业务切片 | Slice 定义、View、Screen/Dialog | 可复用业务能力与其本地界面 | 一个业务能力的规则、私有写入和界面同置 |
48
+ | [`app/manifest.ts`](../app/manifest.ts) | 应用唯一装配点 | Slices、Workflows、应用级 Operations | Activity/Operation/Workflow Manifest | 自动收集依赖并在启动前验证引用完整性 |
49
+ | [`app/workflow/`](../app/workflow) | 三入口业务编排与本地策略 | Activity 数组与特殊分支 | Quick/Barcode/Scale Definition | 流程顺序集中在应用目录,不和 Slice 实现混杂 |
50
+ | [`runtime/session/createSession.ts`](../runtime/session/createSession.ts) | 一次点餐会话的组合根 | entry、Host、locale、可选 Lifecycle 扩展 | Kernel 组合与 Payment Projection 桥接 | 避免页面创建状态机或驱动业务流程 |
51
+ | [`app/workflow/registry.ts`](../app/workflow/registry.ts) | Activity Registry 类型视图 | Application Manifest | 带 HDLKiosk 字面量类型的 Registry | Runtime 不再维护第二份 Activity 清单 |
52
+ | [`kernel/workflow/compiler.ts`](../kernel/workflow/compiler.ts) | Definition 结构校验 | Workflow Definition + 注入的 Registry | 冻结后的可执行 Definition 或 issues | 防止未知 Intent、非法跳转和无界循环进入 Actor |
53
+ | [`app/workflow/policy.ts`](../app/workflow/policy.ts) | HDLKiosk 业务策略校验 | 编译后的 Definition | 支付门禁等业务 issues | 结构规则不与具体交易策略混在一起 |
54
+ | [`kernel/workflow/actor.ts`](../kernel/workflow/actor.ts) | 单会话流程执行器 | Activity Intent、Navigation、Definition、Runner | WorkflowSnapshot、Transition | 解决双击、乱序导航和 Exit Command 完成前跳页 |
55
+ | [`runtime/session/transitionRunner.ts`](../runtime/session/transitionRunner.ts) | Activity 离开策略执行器 | Exit Policy、Host Projection、Coordinator | advance/stay/blocked、支付回执 | Actor 不理解 Predicate、购物车和支付 Operation |
56
+ | [`runtime/session/workflowLifecycle.ts`](../runtime/session/workflowLifecycle.ts) | 已提交状态的业务生命周期出口 | Actor 提交后的 Snapshot | telemetry | 诊断不进入状态机内核 |
57
+ | [`kernel/operations/coordinator.ts`](../kernel/operations/coordinator.ts) | 通用副作用调度器 | Operation request + 应用 Policy | 规范化 OperationResult | 解决重复 intent、排队、超时和旧 Promise;不认识支付 |
58
+ | [`runtime/index.ts`](../runtime/index.ts) | 共享 Runtime 公共入口 | Operation Handler 与 Session Factory | 稳定的统一导出面 | 避免消费者穿透私有实现目录 |
59
+ | [`runtime/operations/coordinator.ts`](../runtime/operations/coordinator.ts) | HDLKiosk Operation Policy | Host、支付门禁、冲突域、遥测 | 绑定业务语义的 Coordinator | 把交易规则留在应用层而不是通用 Kernel |
60
+ | [`runtime/operations/checkoutRequirements.ts`](../runtime/operations/checkoutRequirements.ts) | 支付前业务要求注册 | Requirement ID、Workflow Context、Projection | 当前适用 ID 与校验结果 | 新增采集事实时不改 Checkout 主流程 |
61
+ | [`ui/controllers/`](../ui/controllers) | React 生命周期协调 | Host、Config、Projection、Actor | session/device/customer 状态 | 将根组件中的生命周期职责拆开 |
62
+ | [`ui/HDLKioskWorkflowView.tsx`](../ui/HDLKioskWorkflowView.tsx) | 活跃会话 UI 编排 | Controllers、Projection、Actor snapshot | Renderer、Shell、全局 Dialog props | 防止根组件和具体 Screen 混入运行时协调逻辑 |
63
+ | [`devices/`](../devices) | 设备入口治理 | 标准化扫码/称重事件 | accept/reject、entry claim | 解决首页多入口竞争、重复事件和错误页面消费 |
64
+ | [`devices/scale/`](../devices/scale) | 顶层称重快照 | Adapter 发布的秤状态 | 全生命周期统一 Scale Snapshot | 让 Entry 和详情页共享同一秤连接,不反复挂卸原生 Hook |
65
+ | [`ui/ScreenRenderer.tsx`](../ui/ScreenRenderer.tsx) | Workflow 到 Slice View 装配 | Definition、Snapshot、View Context | 当前 View 与 modal base | 页面不参与中央流程判断 |
66
+ | [`components/`](../components) | 共享 Shell、Overlay 与控件 | 只读 ViewModel、语义 callback | 跨 Slice React UI | 共享视觉能力不反向拥有商家流程 |
67
+ | [`testing/`](../testing) | 可替换 Host | fixture、可控异步结果 | Fake Host、调用记录 | 不启动 BigSale 也能确定性验证 Core |
68
68
 
69
69
  ## 3. Root 与 Session 如何装配
70
70
 
@@ -83,26 +83,28 @@ Screen Renderer 根据当前节点与最新 Projection 渲染
83
83
 
84
84
  ```text
85
85
  SessionController.start(request)
86
- → 校验 enabledEntries / capability / production readiness
87
- → EntryArbiter.claim(request.entry)
88
- → createHDLKioskWorkflowSession(entry, host, options)
86
+ → HDLKiosk Runtime 校验 enabledEntries / capability / production readiness
87
+ → Application Runtime manual/automatic Trigger
88
+ → Runtime Admission(HDLKiosk 最多一个活跃 Session)
89
+ → HDLKiosk Session Factory
90
+ → createHDLKioskWorkflowSession(entry, host, options)
89
91
  → hdlKioskApplication Manifest
90
- → createHDLKioskOperationRegistry()(从 Slice/Manifest 自动收集)
92
+ → createHDLKioskOperationRegistry()(从 Runtime Binding 收集 Handler)
91
93
  → compileWorkflowStructure(builtInDefinition)
92
94
  → validateHDLKioskWorkflowPolicy(definition)
93
95
  → createOperationCoordinator(host, registry)
94
96
  → createHDLKioskTransitionRunner(host, coordinator)
95
97
  → createWorkflowActor(definition, runner, lifecycle)
96
- → session.ensure
97
- → Barcode:在尚未发布会话时执行 barcode.consume
98
- → 入口准备成功后发布 active session;失败则释放入口 claim
98
+ → session.ensure
99
+ → Runtime Registry 发布 active Session;失败则不注册
99
100
  ```
100
101
 
101
102
  重要细节:
102
103
 
103
- - 同一个入口的并发 `start` 共享 `startPromiseRef`,不同入口不会抢占;
104
+ - 同一个入口的并发 `start` 由 HDLKiosk Runtime 共享一个 Promise,跨入口竞争由 Runtime Admission 拒绝;
105
+ - Runtime snapshot 是 Session / starting / start error 的唯一状态源,React Controller 只做生命周期适配,不再镜像 Registry 状态;
104
106
  - Barcode/Scale 是会话的外部入口,不是 Workflow Activity。Barcode Workflow 天然从 Catalog 开始,Scale Workflow 天然从 Fulfillment 开始;首个业务页 Back 因此落入会话级清单并回 Entry,无需“入口节点不可回访”或 history skip 特例;
105
- - Host 引用变化会销毁旧 Actor,并重置 arbiter/ingress;
107
+ - Host 引用变化会 dispose 旧 Runtime/Actor,并重置 ingress;
106
108
  - capability 变化不会要求 Host 引用变化,因此不应销毁订单;
107
109
  - session reset 只有在 Host 写入器确认空订单且 consistency barrier 完成后,才 dispose Actor、释放入口并回到 Entry;React Projection 只负责随后收敛展示,不反向否定 Host receipt。
108
110
 
@@ -160,7 +162,7 @@ Projection 的职责是“读取和标准化”,不是新 Store:
160
162
  - 不把 callback 成功直接变成支付成功;
161
163
  - 不把本地 fingerprint 当成服务端 revision。
162
164
 
163
- [`useHostSnapshot.ts`](../runtime/useHostSnapshot.ts) 用 `useSyncExternalStore` 消费 Projection。BigSale 接入主要依赖父级 Context rerender,其他外部事实可通过 Adapter 的显式订阅触发。
165
+ [`ui/snapshots.ts`](../ui/snapshots.ts) 用 `useSyncExternalStore` 消费 Projection。BigSale 接入主要依赖父级 Context rerender,其他外部事实可通过 Adapter 的显式订阅触发。
164
166
 
165
167
  ## 6. Slice、Workflow 与 Actor
166
168
 
@@ -182,7 +184,7 @@ Workflow 用有序 Slice 数组描述静态编排。数组顺序是默认主路
182
184
  customizationSlice,
183
185
  fulfillmentSlice,
184
186
  paymentMethodSlice,
185
- { slice: paymentCompletedSlice, end: 'success' },
187
+ { slice: paymentCompletedSlice, isTerminal: true },
186
188
  ],
187
189
  }
188
190
  ```
@@ -198,7 +200,7 @@ Workflow 作者不会填写 Screen、Predicate、Operation 或 failureTarget;
198
200
 
199
201
  Slice 在一条流程只出现一次时,Step ID 默认就是 Slice ID;同一 Slice 多次出现时,每次必须显式使用 `slice:用途`,例如 `catalog:initial`、`catalog:final`。这样既保持常规流程易读,也不会把复用能力误认为同一个运行位置。
200
202
 
201
- Slice Intent 使用 `next()`,或在 `intentPrecondition/effect` 上声明 `navigate: 'next'`,决定相邻 Step 的默认移动。不会自动前进的 Intent 只在 Workflow `on` 中指定目标。Back 是独立 Navigation,由 Actor 的实际页面历史解析。没有下一项的 Step 不会被推测为成功,必须声明 `end: 'success' | 'blocked'`。
203
+ Slice Intent 使用 `next()`,或在 `intentPrecondition/effect` 上声明 `navigate: 'next'`,决定相邻 Step 的默认移动。不会自动前进的 Intent 只在 Workflow `on` 中指定目标。Back 是独立 Navigation,由 Actor 的实际页面历史解析。没有下一项的 Step 不会被自动推测为合法终点,必须声明 `isTerminal: true`。`isTerminal` 只表达 Workflow 图结构,不表达具体业务的成功或失败结果。
202
204
 
203
205
  Predicate 是本地可信的纯真假判断,例如 `cart.notEmpty`;Intent Precondition 表示某个 Intent 提交前必须满足的 Predicate。作者 API 使用 `intentPrecondition(predicateId)`,底层行为记录 `{ kind: 'precondition', predicate }`,编译后存入 `exitPolicy.precondition`。Predicate 只返回 boolean;它与能返回 `allow | bypass | cancel | redirect | defer | block` 的 Navigation Guard 是两套独立能力。
204
206
 
@@ -214,7 +216,7 @@ Step ID 只标识“一次出现”。Runtime 判断加载哪类数据、是否
214
216
 
215
217
  [`slices/<name>/slice.ts`](../slices) 是本地可信 Slice 定义,每个 Slice 声明:
216
218
 
217
- - 业务 Activity 使用哪个 `screen.id`,以及该 Screen 的 `view`;
219
+ - 业务 Activity 使用哪个 `surface.id`,以及该 Screen 的 `view`;
218
220
  - 可以接受哪些 Intent;
219
221
  - 支持 page 还是 modal;
220
222
  - 某个 Intent 是否需要纯 Predicate 作为 Precondition;
@@ -222,28 +224,30 @@ Step ID 只标识“一次出现”。Runtime 判断加载哪类数据、是否
222
224
  - Screen 内有哪些不会离开节点的 Command;
223
225
  - 使用该 Slice 的流程在支付前需要哪些业务事实。
224
226
 
225
- 例如 `identity.complete` / `identity.omit` 可在携带输入时执行 `identity.sync`,`customization.complete` 执行主商品同步,`paymentMethod.complete` 检查 Host 已确认支付成功。EFTPOS 派发和店员支付授权是 Payment 页面 Command,不作为流程 Intent。`defineKioskApplication` 从 Slice 自动生成 Activity Contract 与 Operation 注册信息;远端定义只看到 `Slice ID + 标准 Intent → target`,不能替换这些安全规则。
227
+ 例如 `identity.complete` / `identity.omit` 可在携带输入时执行 `identity.sync`,`customization.complete` 执行主商品同步,`paymentMethod.complete` 检查 Host 已确认支付成功。EFTPOS 派发和店员支付授权是 Payment 页面 Command,不作为流程 Intent。`defineApplication` 从 Slice 自动生成 Activity Contract 与 Operation 注册信息;远端定义只看到 `Slice ID + 标准 Intent → target`,不能替换这些安全规则。
226
228
 
227
- Slice 的业务定义与 React View 分离:Slice `id` 是 Workflow 和 Actor 使用的业务 Activity;`screen.id` 会被 Compiler 复制为 Workflow Node 的 `screenId`,供 Shell、Controller 和数据加载策略使用;`app/views.ts` 按 Activity 注册本地可信 View。各 Slice 的 `view.tsx` 仍负责 ViewModel 派生与组件装配,但不会进入 `defineSlice` 或 Workflow Definition。
229
+ Slice 的业务定义与 React View 文件分离但按 feature 并置:Slice `id` 是 Workflow 和 Actor 使用的业务 Activity;`surface.id` 会被 Compiler 复制为 Workflow Node 的 `surfaceId`,供 Shell、Controller 和数据加载策略使用;`ui/views.ts` 按 Activity 注册本地可信 View。各 Slice 的 `view.tsx` 仍负责 ViewModel 派生与组件装配,但不会进入 `defineSlice` 或 Workflow Definition。
228
230
 
229
- | Slice 定义 | 编译/运行期形态 | 唯一用途 |
230
- | --- | --- | --- |
231
- | `id` | Node `activity` | 业务状态、Intent 和流程编排 |
232
- | `screen.id` | Node `screenId` | Shell 变体、数据加载和页面类别判断 |
233
- | `app/views.ts` 中的 Activity 映射 | 仅应用展示层使用 | React UI 渲染 |
231
+ | Slice 定义 | 编译/运行期形态 | 唯一用途 |
232
+ | -------------------------------- | ---------------- | ---------------------------------- |
233
+ | `id` | Node `activity` | 业务状态、Intent 和流程编排 |
234
+ | `surface.id` | Node `surfaceId` | Shell 变体、数据加载和页面类别判断 |
235
+ | `ui/views.ts` 中的 Activity 映射 | 仅应用展示层使用 | React UI 渲染 |
234
236
 
235
- 因此 `id`、`screen` 和 `view` 不互相替代:`catalog` 是商品浏览页面,`primaryProductPrompt` 是覆盖在 Catalog 上的独立 Modal Slice。店员支付授权不改变当前页面,因此是 `paymentMethod` 的 Screen Command,而不是独立 Activity。Application Manifest 是业务运行 Contract 的唯一索引,`app/views.ts` 是展示实现的唯一索引。View 使用同步本地组件引用,不产生运行期 UI chunk;纯 Compiler/Actor 依赖链也不会加载该注册表。Renderer 若发现 View 缺失,仍使用 `BlockingNotice` fail closed,且不会改变 Workflow。
237
+ 因此 `id`、`screen` 和 `view` 不互相替代:`catalog` 是商品浏览页面,`primaryProductPrompt` 是覆盖在 Catalog 上的独立 Modal Slice。店员支付授权不改变当前页面,因此是 `paymentMethod` 的 Screen Command,而不是独立 Activity。Application Manifest 是业务运行 Contract 的唯一索引,`ui/views.ts` 是展示实现的唯一索引。View 使用同步本地组件引用,不产生运行期 UI chunk;纯 Compiler/Actor 依赖链也不会加载该注册表。Renderer 若发现 View 缺失,仍使用 `BlockingNotice` fail closed,且不会改变 Workflow。
236
238
 
237
- `slices/index.ts` 对整套 Slice 清单执行一次类型约束:`screen.id` 只能取 HDLKiosk 的非 Entry `ScreenId`。`app/views.ts` 使用完整的 `Record<ActivityId, HDLKioskSliceView>`,因此新增 Activity 若没有注册 View 会产生类型错误。Kernel 的 `defineSlice` 同时拒绝空 `screen.id`。
239
+ `slices/index.ts` 对整套 Slice 清单执行一次类型约束:`surface.id` 只能取 HDLKiosk 的非 Entry `ScreenId`。`ui/views.ts` 使用完整的 `Record<ActivityId, HDLKioskSliceView>`,因此新增 Activity 若没有注册 View 会产生类型错误。Kernel 的 `defineSlice` 同时拒绝空 `surface.id`。
238
240
 
239
- Compiler 从实际使用的 Slice 汇总 Checkout Requirement ID,但不把判断函数或 Host 字段写入 Workflow。当前 HDLKiosk 默认注册表为空;未来增加其他业务要求时仍由 [`checkoutRequirements.ts`](../app/operations/checkoutRequirements.ts) 集中判断。
241
+ Compiler 从实际使用的 Slice 汇总 Checkout Requirement ID,但不把判断函数或 Host 字段写入 Workflow。当前 HDLKiosk 默认注册表为空;未来增加其他业务要求时仍由 [`checkoutRequirements.ts`](../runtime/operations/checkoutRequirements.ts) 集中判断。
240
242
 
241
243
  `WorkflowEvent` 同时约束 Activity、Intent 和必要输入:例如 `identity.omit` 必须携带身份输入,`fulfillment.complete` 必须携带 fulfillment context patch。Back 使用不携带业务输入的 `NAVIGATE_BACK`。Barcode 入口的条码输入不是 Workflow Event,而是 Session Controller 在发布会话前交给 `barcode.consume` 的 Command 输入。Screen Command 由 `OperationInputMap` 约束 Command ID 与输入类型。
242
244
 
243
245
  Step 可选声明 Modal 展示关系:
244
246
 
245
247
  ```ts
246
- presentation: { mode: 'modal' }
248
+ presentation: {
249
+ mode: 'modal';
250
+ }
247
251
  ```
248
252
 
249
253
  这只控制渲染层级。Actor Surface 保留进入 Modal 前实际展示的 Page,Workflow 不指定背景 Step。Compiler 会拒绝以 Modal 作为首节点或 Modal 直接进入另一个 Modal。
@@ -261,7 +265,7 @@ presentation: { mode: 'modal' }
261
265
  - 指向自身或更早 Step 的非 Back 跳转是否声明有限 `repeat`;
262
266
  - Modal presentation 引用是否合法。
263
267
 
264
- 结构校验通过后,Compiler 还会将所有 Step 对应 Activity 的 `checkoutRequirements` 去重汇总到编译结果。该字段是本地 Activity Contract 的派生值,不是 Workflow Definition 的作者输入。
268
+ 结构校验通过后,Compiler 还会将所有 Step 对应 Activity 的通用 `requirements` 去重汇总到编译结果。Kernel 不解释这些 ID;HDLKiosk Domain 再把其中的 Checkout Requirement 交给本地注册表校验。该字段是 Activity Contract 的派生值,不是 Workflow Definition 的作者输入。
265
269
 
266
270
  随后 `policy.ts` 校验 HDLKiosk 交易规则,例如 `checkout.open` 必须来自
267
271
  `paymentMethod`,并且该支付步骤必须具有本地 Checkout Prepare 门禁。两类校验都在
@@ -273,7 +277,7 @@ session 创建前完成,但结构错误与业务安全错误保持独立。
273
277
 
274
278
  Actor 使用单 mailbox:
275
279
 
276
- 1. 忽略 success end、blocked 或 disposed 后的新事件;
280
+ 1. 忽略 terminal、blocked 或 disposed 后的新事件;
277
281
  2. 同时校验事件的 `stepId` 和 `activityId`,拒绝旧 Screen 或同类 Activity 旧实例的迟到回调;
278
282
  3. 校验 Intent 是否由当前 Activity 暴露,并查找 Transition;Back 则读取页面历史;
279
283
  4. 通过注入的 Context Reducer 合并受限 contextPatch;
@@ -285,15 +289,15 @@ Actor 使用单 mailbox:
285
289
 
286
290
  结果到节点的映射:
287
291
 
288
- | OperationResult | Actor 行为 |
289
- | ---------------- | ------------------------------------------------------------- |
290
- | `succeeded` | 进入 target |
291
- | `cancelled` | 留在当前 Step |
292
- | `failed` | 留在当前 Step,并展示可恢复错误 |
293
- | `partialFailure` | 保留当前 Step,Actor 进入 blocked;命令可能只完成一部分 |
294
- | `unknown` | 保留当前 Step,Actor 进入 blocked;不能确认副作用是否已经发生 |
292
+ | OperationResult | Actor 行为 |
293
+ | ---------------- | --------------------------------------------------------------------------------- |
294
+ | `succeeded` | 进入 target |
295
+ | `cancelled` | 留在当前 Step |
296
+ | `failed` | 留在当前 Step,并展示可恢复错误 |
297
+ | `partialFailure` | 保留当前 Step 并展示错误;仅支付派发或 reset 等 P0 副作用进入 blocked |
298
+ | `unknown` | 保留当前 Step 并展示错误;仅可能重复扣款、跨订单污染或 reset 不完整时进入 blocked |
295
299
 
296
- `blocked` 是运行时安全状态,不是可编排的 Activity。UI 在 Actor 阻塞时统一覆盖安全提示,因此 Workflow 中不存在为了显示错误而设置的伪业务节点。
300
+ `blocked` 是运行时 P0 安全状态,不是可编排的 Activity。UI 在 Actor 阻塞时统一覆盖安全提示,因此 Workflow 中不存在为了显示错误而设置的伪业务节点。普通 Cart、Customer、Fulfillment 和支付前置校验的模糊结果停留原页并允许显式重试,不锁死整个 Actor。
297
301
 
298
302
  ## 7. Operation Registry 与 Coordinator
299
303
 
@@ -310,17 +314,17 @@ partialFailure/unknown 的 Screen Command 会通过 Actor 的 system block 入
310
314
 
311
315
  当前 Operation 组:
312
316
 
313
- | Operation | scope | timeout | 核心职责 |
314
- | ------------------------------------ | -------- | ------- | -------------------------------------------------------------------------------------- |
315
- | `session.ensure/reset` | session | 15s | 建立/清理订单并验证 reset |
316
- | `identity.sync` | customer | 15s | 按 `customerId` 有无应用认证客户或清除订单客户,并执行 consistency、重报价和写后观察 |
317
- | `barcode.consume` | cart | — | 调宿主扫码 Flow;规格选择完成前不启动写后一致性检查 |
318
- | `cart.addProduct` | cart | — | 调宿主商品 Flow,等待规格或其它业务选择后验证写入 |
319
- | `cart.update/remove` | cart | 15s | 数量修改/删除、summary 重算和目标行验证 |
320
- | `product.syncPrimaryWeightedProduct` | cart | — | 首次写入可能等待 OS 额外业务弹窗;更新或写入后验证重量/options 和写后证据 |
321
- | `product.removePrimaryProduct` | cart | 15s | 将主商品置为不存在;本来不存在时直接成功,存在时验证删除结果 |
322
- | `checkout.prepare*` | checkout | 20s | fulfillment、cart、summary 稳定性与 token |
323
- | `checkout.open` | checkout | 120s | 消费 token、冻结危险写并打开 Host 支付 |
317
+ | Operation | scope | timeout | 核心职责 |
318
+ | ------------------------------------ | -------- | ------- | ------------------------------------------------------------------------------------ |
319
+ | `session.ensure/reset` | session | 15s | 建立/清理订单并验证 reset |
320
+ | `identity.sync` | customer | 15s | 按 `customerId` 有无应用认证客户或清除订单客户,并执行 consistency、重报价和写后观察 |
321
+ | `barcode.consume` | cart | — | 调宿主扫码 Flow;规格选择完成前不启动写后一致性检查 |
322
+ | `cart.addProduct` | cart | — | 调宿主商品 Flow,等待规格或其它业务选择后验证写入 |
323
+ | `cart.update/remove` | cart | 15s | 数量修改/删除、summary 重算和目标行验证 |
324
+ | `product.syncPrimaryWeightedProduct` | cart | — | 首次写入可能等待 OS 额外业务弹窗;更新或写入后验证重量/options 和写后证据 |
325
+ | `product.removePrimaryProduct` | cart | 15s | 将主商品置为不存在;本来不存在时直接成功,存在时验证删除结果 |
326
+ | `checkout.prepare*` | checkout | 20s | fulfillment、cart、summary 稳定性与 token |
327
+ | `checkout.open` | checkout | 120s | 消费 token、冻结危险写并打开 Host 支付 |
324
328
 
325
329
  ### 7.2 冲突矩阵
326
330
 
@@ -344,7 +348,7 @@ none ↔ 不参与互斥
344
348
  - session epoch 变化后丢弃旧结果;
345
349
  - 调用应用注入的冲突、错误、Context 和生命周期 Policy。
346
350
 
347
- [`app/operations/coordinator.ts`](../app/operations/coordinator.ts) 只负责 HDLKiosk 交易语义:
351
+ [`runtime/operations/coordinator.ts`](../runtime/operations/coordinator.ts) 只负责 HDLKiosk 交易语义:
348
352
 
349
353
  - 注入 `HDLKioskHost` 和最新 Workflow Context;
350
354
  - 定义 session/cart/customer/checkout 的冲突矩阵;
@@ -431,7 +435,7 @@ Shell Login
431
435
 
432
436
  ### 8.5 返回 Entry 能力接口
433
437
 
434
- 当前物料不维护 idle 计时器或警告弹窗。Payment 成功展示在 Checkout Screen 内,10 秒倒计时或手动返回都调用 `returnToEntry(reason?)`:它对并发请求去重,执行 `session.reset`,验证 Host 空订单和一致性,再释放 Actor、Ingress 与 session epoch。
438
+ 当前物料不维护 idle 计时器或警告弹窗。Payment 成功展示在 Checkout Screen 内,10 秒倒计时或手动返回都调用 `returnToEntry(reason?)`:它对并发请求去重,执行 `session.reset`,并通过 Runtime snapshot 统一发布 `returning/returnError`;验证 Host 空订单和一致性后,再释放 Actor、Ingress 与 session epoch。
435
439
 
436
440
  未来应用级生命周期策略可以决定何时调用该接口,但不能直接清 React 状态或只切换页面。支付 pending/unknown、reset 失败等情况仍由既有安全策略 fail closed。
437
441
 
@@ -476,7 +480,7 @@ Core:Entry Ingress 负责去重、仲裁和启动会话;活跃 Screen 只消
476
480
  ```text
477
481
  HDLKiosk root
478
482
  → HDLKioskWorkflowView(运行时状态转 props)
479
- → app/ScreenRenderer(按 Activity 查询 app/views.ts 中的本地 View)
483
+ → ui/ScreenRenderer(按 Activity 查询 ui/views.ts 中的本地 View)
480
484
  → slices/<name>/view + Screen/Dialog
481
485
  → components/shell + components/overlays + components/common
482
486
  → Activity Action callback
@@ -548,7 +552,7 @@ Entry click
548
552
 
549
553
  ```text
550
554
  CatalogScreen command(cart.addProduct)
551
- → HDLKioskWorkflowView command router
555
+ → useHDLKioskActionDispatcher
552
556
  → session.executeCommand
553
557
  → Coordinator: cart.addProduct
554
558
  → Operation: Host addProduct
@@ -583,24 +587,26 @@ Scale 与 Quick 复用同一套称重商品原子操作和页面,差异只保
583
587
  → checkout.open consumes token
584
588
  → Checkout Safety freezes dangerous writes
585
589
  → Host result + Payment Projection
586
- → result / failed / blocked
590
+ → Session Payment Projection bridge
591
+ → paymentMethod.complete 本地门禁
592
+ → paymentCompleted / failed / blocked
587
593
  ```
588
594
 
589
595
  ## 12. 修改需求应该落在哪里
590
596
 
591
- | 需求 | 首选位置 | 同步检查 |
592
- | --------------------- | ---------------------------------------------------------- | ----------------------------------------- |
593
- | 调整节点顺序 | `app/workflow/*.ts` | 03 文档、definition/actor 测试 |
594
- | 新增跨 Slice 副作用 | `contracts` + `app/operations` + Host Port | conflict scope、timeout、unknown、adapter |
595
- | 新增 BigSale 字段映射 | BigSale Adapter | Core DTO 是否真的需要扩展 |
596
- | 新增设备来源 | Adapter Device Port | Core Ingress 是否已有相同语义 |
597
- | 修改入口消费条件 | Device/Session Controller | capability、payment freeze、dedupe |
598
- | 修改页面局部交互 | `slices/<name>/Screen` + `view.tsx` | 不得直接调用 Host;样式留在组件目录 |
599
- | 新增业务 Dialog | Slice `presentation` + `slices/<name>/Dialog` | 不新增第二套导航状态 |
600
- | 修改会话级 UI 协调 | `runtime/HDLKioskWorkflowView.tsx` | 不把 Controller/Actor 传入具体组件 |
601
- | 新增审计或持久化观察 | 外层 `WorkflowLifecycle` 扩展 | 不得让 Kernel 依赖存储或恢复策略 |
602
- | 新增跨刷新恢复 | Kernel 外初始化决策模块 + Actor 初始状态 | OS 事实、隐私、支付优先级、人工处置 |
603
- | 调整支付安全 | Kernel `checkoutSafety` + 业务 `checkout` | 必须更新 05 文档与集成测试 |
597
+ | 需求 | 首选位置 | 同步检查 |
598
+ | --------------------- | -------------------------------------------------- | ----------------------------------------- |
599
+ | 调整节点顺序 | `app/workflow/*.ts` | 03 文档、definition/actor 测试 |
600
+ | 新增跨 Slice 副作用 | `app/contracts` + `runtime/operations` + Host Port | conflict scope、timeout、unknown、adapter |
601
+ | 新增 BigSale 字段映射 | BigSale Adapter | Core DTO 是否真的需要扩展 |
602
+ | 新增设备来源 | Adapter Device Port | Core Ingress 是否已有相同语义 |
603
+ | 修改入口消费条件 | Device/Session Controller | capability、payment freeze、dedupe |
604
+ | 修改页面局部交互 | `slices/<name>/Screen` + `view.tsx` | 不得直接调用 Host;样式留在组件目录 |
605
+ | 新增业务 Dialog | Slice `presentation` + `slices/<name>/Dialog` | 不新增第二套导航状态 |
606
+ | 修改会话级 UI 协调 | `ui/HDLKioskWorkflowView.tsx` | 不把 Controller/Actor 传入具体组件 |
607
+ | 新增审计或持久化观察 | 外层 `WorkflowLifecycle` 扩展 | 不得让 Kernel 依赖存储或恢复策略 |
608
+ | 新增跨刷新恢复 | Kernel 外初始化决策模块 + Actor 初始状态 | OS 事实、隐私、支付优先级、人工处置 |
609
+ | 调整支付安全 | Kernel `checkoutSafety` + 业务 `checkout` | 必须更新 05 文档与集成测试 |
604
610
 
605
611
  ## 13. 当前刻意不做的抽象
606
612
 
@@ -55,20 +55,21 @@ Core 不能反向 import BigSale;Adapter 不能决定下一个 Workflow 节点
55
55
 
56
56
  | 文件 | 具体职责 | 不应放入的逻辑 |
57
57
  | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------- |
58
- | [`index.tsx`](../../bigSale/templates/HDLKiosk/index.tsx) | 合并 config、读取 Engine plugin、创建 Scale Hub/Runtime、装配 Host 和 Core | Workflow 节点、购物车操作 |
58
+ | [`index.tsx`](../../bigSale/templates/HDLKiosk/index.tsx) | 合并 config、读取 Engine plugin、挂载 Scale Owner、装配 Host 和 Core | Workflow 节点、购物车操作 |
59
59
  | [`primaryWeightedProduct.ts`](../../bigSale/templates/HDLKiosk/primaryWeightedProduct.ts) | 从 catalog list 的首条 data variant 解析称重主商品 | 商品查询、隐式 fallback |
60
60
  | [`types.ts`](../../bigSale/templates/HDLKiosk/types.ts) | 声明模板内部 `HDLKioskBigSaleHostBridge`,隔离尚未标准化的宿主窄能力 | BigSale 公共 Props、通用 SalesSDK 类型 |
61
61
  | [`adapter/useBigSaleHDLKioskHost.ts`](../../bigSale/templates/HDLKiosk/adapter/useBigSaleHDLKioskHost.ts) | 用 ref 持有最新 Context/bridge/scan handle,稳定 Host 引用 | DTO 字段转换 |
62
62
  | [`adapter/createHost.ts`](../../bigSale/templates/HDLKiosk/adapter/createHost.ts) | 组合 Sales/Device/Telemetry Port 和动态 capabilities | React 页面逻辑 |
63
- | [`adapter/capabilities.ts`](../../bigSale/templates/HDLKiosk/adapter/capabilities.ts) | 将当前真实方法/bridge 组合为能力位 | 猜测业务成功 |
64
- | [`adapter/projection.ts`](../../bigSale/templates/HDLKiosk/adapter/projection.ts) | Cart/Customer/Summary/Payment 标准化、lineId、fingerprint | 发命令、主动修订单 |
65
- | [`adapter/sales.ts`](../../bigSale/templates/HDLKiosk/adapter/sales.ts) | 实现全部 `HDLSalesPort` query/command,转换结果 | 决定 target Screen |
66
- | [`adapter/weightedProduct.ts`](../../bigSale/templates/HDLKiosk/adapter/weightedProduct.ts) | 解析称重商品、单位价格换算、验证重量、生成 prepared product | 原生秤监听、页面状态 |
67
- | [`adapter/customizationProduct.ts`](../../bigSale/templates/HDLKiosk/adapter/customizationProduct.ts) | 安全投影单选 options、验证 selection、合成 SKU/options payload | 通用商品详情 Flow |
68
- | [`adapter/devices.ts`](../../bigSale/templates/HDLKiosk/adapter/devices.ts) | 扫码/称重原始订阅转 `HDLDeviceEvent`,管理连接与释放 | 判断当前 Workflow 是否消费 |
69
- | [`adapter/scaleTrigger.tsx`](../../bigSale/templates/HDLKiosk/adapter/scaleTrigger.tsx) | 隔离 `useNativeScale`、入口触发边沿、连接状态、共享 Scale Runtime | 称重商品价格计算 |
63
+ | [`adapter/host/capabilities.ts`](../../bigSale/templates/HDLKiosk/adapter/host/capabilities.ts) | 将当前真实方法/bridge 组合为能力位 | 猜测业务成功 |
64
+ | [`adapter/host/projection.ts`](../../bigSale/templates/HDLKiosk/adapter/host/projection.ts) | Cart/Customer/Summary/Payment 标准化、lineId、fingerprint | 发命令、主动修订单 |
65
+ | [`adapter/sales/`](../../bigSale/templates/HDLKiosk/adapter/sales) | 按能力实现 `HDLSalesPort` query/command,并在 `index.ts` 组合 | 决定 target Screen |
66
+ | [`adapter/sales/weightedProduct.ts`](../../bigSale/templates/HDLKiosk/adapter/sales/weightedProduct.ts) | 解析称重商品、单位价格换算、验证重量、生成 prepared product | 原生秤监听、页面状态 |
67
+ | [`adapter/sales/customizationProduct.ts`](../../bigSale/templates/HDLKiosk/adapter/sales/customizationProduct.ts) | 安全投影单选 options、验证 selection、合成 SKU/options payload | 通用商品详情 Flow |
68
+ | [`adapter/devices/devicePort.ts`](../../bigSale/templates/HDLKiosk/adapter/devices/devicePort.ts) | 扫码原始事件与 ScaleBridge 标准事件汇入 `HDLDevicePort` | 判断当前 Workflow 是否消费 |
69
+ | [`runtime/scaleBridge.ts`](../../bigSale/templates/HDLKiosk/runtime/scaleBridge.ts) | 统一 Scale Snapshot、owner 身份与标准设备事件流 | React Hook、称重商品价格计算 |
70
+ | [`runtime/BigSaleScaleRuntimeOwner.tsx`](../../bigSale/templates/HDLKiosk/runtime/BigSaleScaleRuntimeOwner.tsx) | 隔离 `useNativeScale`,校验实时帧并发布给 ScaleBridge | Workflow 跳转、购物车写入 |
70
71
  | [`adapter/normalize.ts`](../../bigSale/templates/HDLKiosk/adapter/normalize.ts) | Host 错误与未知结果标准化、安全路径读取 | 业务重试策略 |
71
- | [`adapter/telemetry.ts`](../../bigSale/templates/HDLKiosk/adapter/telemetry.ts) | 当前 no-op Telemetry Port,保留正式 sink 接口 | `console` 散落埋点 |
72
+ | [`adapter/host/telemetry.ts`](../../bigSale/templates/HDLKiosk/adapter/host/telemetry.ts) | 当前 no-op Telemetry Port,保留正式 sink 接口 | `console` 散落埋点 |
72
73
 
73
74
  兼容层还扩展了 SalesSDK Products Context:
74
75
 
@@ -84,12 +85,12 @@ Core 不能反向 import BigSale;Adapter 不能决定下一个 Workflow 节点
84
85
  ```mermaid
85
86
  flowchart LR
86
87
  CTX["BigSaleContext\nsales / products / cart / customer / summary"]
87
- BRIDGE["Internal HDLKioskBigSaleHostBridge\ncurrent: scale hub subscriptions\nreserved: member / fulfillment"]
88
+ BRIDGE["Internal HDLKioskBigSaleHostBridge\nscale event source / member / fulfillment"]
88
89
  PLUGIN["Engine nativeScaleTools"]
89
90
  REF["Stable source refs\nlatest context / bridge / scan"]
90
91
  PROJECTION["projection.ts\nObservedSalesSnapshot"]
91
92
  SALES["sales.ts\nHDLSalesPort"]
92
- DEVICE["devices.ts + scaleTrigger.tsx\nHDLDevicePort / ScaleRuntime"]
93
+ DEVICE["devicePort.ts + ScaleBridge + ScaleOwner\nHDLDevicePort / ScaleRuntime"]
93
94
  CAP["capabilities.ts\ndynamic capability getter"]
94
95
  HOST["Stable HDLKioskHost"]
95
96
  CORE["Independent HDLKiosk Core"]
@@ -120,10 +121,10 @@ resolveHDLKioskBigSaleConfig
120
121
  ↓
121
122
  读取 Engine nativeScaleTools plugin
122
123
  ↓
123
- 创建 ScaleTriggerHub + HDLScaleRuntime
124
+ 创建 ScaleBridge(内部统一 ownerId + HDLScaleRuntime + device events)
124
125
  ↓
125
126
  创建模板内部 internalBridge
126
- └─ weight/connection 订阅来自 ScaleTriggerHub
127
+ └─ subscribeScaleEvents 来自 ScaleBridge
127
128
  ↓
128
129
  useBigSaleHDLKioskHost → stable HDLKioskHost
129
130
  ↓
@@ -338,25 +339,25 @@ acquireScanFocus(handler, { priority: 100, id: 'hdl-kiosk' })
338
339
  `useNativeScale` 是 Hook,不能直接塞进普通 Adapter 函数。`BigSaleScaleRuntimeOwner` 常驻模板顶层:
339
340
 
340
341
  - Hook `autoStart` 随物料 active;
341
- - 发布完整 Scale Snapshot 给 Core `HDLScaleRuntime`;
342
- - 发布连接状态和首次有效正重给 `ScaleTriggerHub`;
342
+ - 通过 `ScaleBridge` 发布完整 Snapshot 给 Core `HDLScaleRuntime`;
343
+ - 通过同一个 Bridge 发布连接状态和首次有效正重标准事件;
343
344
  - 重量回落到阈值下后才允许下一次入口触发;
344
345
  - Error Boundary 将 Hook 异常转成 scale error,不炸毁 HDLKiosk;
345
346
  - ownerId 防止多个发布者同时写同一 Runtime。
346
347
 
347
- 内部 Bridge 的 `subscribeWeightChange/subscribeScaleConnection` 只承接 ScaleTriggerHub 的入口事件;当前详情实时读数和 capability 仍要求 `nativeScaleTools.useNativeScale`,不能把一个只发入口事件的 bridge 冒充完整称重能力。
348
+ 内部 Host Bridge 只暴露一个 `subscribeScaleEvents` 标准事件源;详情连续读数直接读取同一 `ScaleBridge.runtime`。Capability 仍要求 `nativeScaleTools.useNativeScale`,不能把一个没有真实 Hook 来源的 Bridge 冒充完整称重能力。
348
349
 
349
350
  ## 13. 模板内部 Narrow Host Bridge
350
351
 
351
352
  [`HDLKioskBigSaleHostBridge`](../../bigSale/templates/HDLKiosk/types.ts) 只承接尚未由 SalesSDK 标准化的能力。它有意声明在 `bigSale/templates/HDLKiosk` 内部,不从 `bigSale/types.ts` 导出,也不通过 `BigSaleProps → BigSaleBaseProps → BigSaleTemplateRendererProps` 透传。
352
353
 
353
- 当前装配提供称重 Hub 订阅和 Identity H5 认证客户读取;履约字段仍是模板适配层的待接能力描述,并不存在外部调用方:
354
+ 当前装配提供 ScaleBridge 事件订阅和 Identity H5 认证客户读取;履约字段仍是模板适配层的待接能力描述,并不存在外部调用方:
354
355
 
355
356
  | Bridge | 契约要求 |
356
357
  | ---------------------------------- | ------------------------------------------- |
357
358
  | `getAuthenticatedCustomer` | 按 customerId 读取模板内认证结果;只读,不在 UI 中写订单客户 |
358
359
  | `writeFulfillment` | 真正写入堂食/外带订单事实,不能只改 UI 参数 |
359
- | `subscribeWeightChange/Connection` | 可选入口触发覆盖,不替代详情 Scale Runtime |
360
+ | `subscribeScaleEvents` | ScaleBridge 的标准入口事件;连续详情读数来自同一 Bridge Runtime |
360
361
 
361
362
  Bridge 使用 getter/ref 消费最新实例。新增字段前先判断它是否应成为 SalesSDK 正式能力;不要把业务对象塞进通用 metadata。
362
363
 
@@ -433,7 +434,7 @@ Abort 的时机很重要:dispatch 前可 cancelled;dispatch 后再 abort 通
433
434
  | 连续加购进入 checking | Core cart consistency + SalesSDK barrier | Host 屏障与 React pending 展示态是否混淆 |
434
435
  | Catalog 加购时闪动 | Shell/Screen busy presentation | 是否全屏遮罩或全部卡片透明度变化,不先怀疑数据丢失 |
435
436
  | Scale 入口 unavailable | plugin + capability + bridge gating | `useNativeScale`、prepared product、queryProducts 是否齐全 |
436
- | Scale 有读数但不自动进入 | `scaleTrigger` + Core ScaleIngress | 阈值、connection、重复边沿、当前 session lock |
437
+ | Scale 有读数但不自动进入 | `ScaleBridge` + Core ScaleIngress | 阈值、connection、重复边沿、当前 session lock |
437
438
  | 登录成功但金额不变 | identity Operation + Summary Projection | customer 是否写入、consistency/重报价是否完成 |
438
439
  | Checkout 后 blocked | callback normalizer + Payment Projection | 是明确 failed 还是 unknown,禁止直接放行 |
439
440
  | 刷新后存在旧订单或支付状态 | Host/OS 订单与支付处置 | 当前 OS payment/cart 事实与员工处置入口 |