@pisell/private-materials 6.12.166 → 6.12.168

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 (115) 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.js +11 -11
  6. package/build/lowcode/view.js +11 -11
  7. package/es/components/HDLKiosk/app/ScreenRenderer.js +7 -7
  8. package/es/components/HDLKiosk/app/views.js +2 -1
  9. package/es/components/HDLKiosk/app/workflow/barcode.js +12 -35
  10. package/es/components/HDLKiosk/app/workflow/{guards.js → predicates.js} +9 -9
  11. package/es/components/HDLKiosk/app/workflow/quick.js +3 -6
  12. package/es/components/HDLKiosk/app/workflow/registry.js +1 -1
  13. package/es/components/HDLKiosk/app/workflow/scale.js +3 -12
  14. package/es/components/HDLKiosk/components/shell/HDLKioskBottomBarHost/index.js +12 -10
  15. package/es/components/HDLKiosk/components/shell/HDLKioskShell/index.js +1 -0
  16. package/es/components/HDLKiosk/docs/00-/346/226/207/344/273/266/345/257/274/350/210/252.md +7 -7
  17. 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 +47 -40
  18. package/es/components/HDLKiosk/docs/03-/344/270/232/345/212/241/346/265/201/347/250/213/344/270/216/344/272/244/344/272/222/350/247/204/345/210/231.md +3 -3
  19. package/es/components/HDLKiosk/docs/05-/344/272/244/346/230/223/345/256/211/345/205/250.md +1 -1
  20. package/es/components/HDLKiosk/docs/07-/345/220/216/347/273/255/345/267/245/344/275/234.md +1 -1
  21. package/es/components/HDLKiosk/docs/README.md +2 -2
  22. package/es/components/HDLKiosk/docs//345/256/236/346/226/275/350/277/233/345/272/246.md +3 -3
  23. package/es/components/HDLKiosk/docs//346/236/266/346/236/204/350/256/276/350/256/241.md +11 -11
  24. package/es/components/HDLKiosk/index.js +0 -1
  25. package/es/components/HDLKiosk/kernel/README.md +8 -9
  26. package/es/components/HDLKiosk/kernel/application/defineApplication.js +18 -19
  27. package/es/components/HDLKiosk/kernel/application/defineSlice.js +8 -13
  28. package/es/components/HDLKiosk/kernel/workflow/actor.js +118 -28
  29. package/es/components/HDLKiosk/kernel/workflow/compiler.js +35 -41
  30. package/es/components/HDLKiosk/kernel/workflow/selectors.js +9 -0
  31. package/es/components/HDLKiosk/runtime/HDLKioskWorkflowView.js +10 -9
  32. package/es/components/HDLKiosk/runtime/controllers/useHDLKioskCustomerController.js +1 -1
  33. package/es/components/HDLKiosk/runtime/createWorkflowSession.js +3 -3
  34. package/es/components/HDLKiosk/runtime/domainTransitionRunner.js +9 -9
  35. package/es/components/HDLKiosk/runtime/workflowEvent.js +9 -4
  36. package/es/components/HDLKiosk/runtime/workflowLifecycle.js +3 -3
  37. package/es/components/HDLKiosk/slices/catalog/PrimaryProductPromptDialog/index.js +1 -2
  38. package/es/components/HDLKiosk/slices/catalog/Screen/index.js +11 -38
  39. package/es/components/HDLKiosk/slices/catalog/Screen/model.js +1 -5
  40. package/es/components/HDLKiosk/slices/catalog/slice.js +4 -16
  41. package/es/components/HDLKiosk/slices/catalog/view.js +4 -6
  42. package/es/components/HDLKiosk/slices/customization/Screen/index.js +9 -11
  43. package/es/components/HDLKiosk/slices/customization/operation.js +23 -4
  44. package/es/components/HDLKiosk/slices/customization/slice.js +5 -9
  45. package/es/components/HDLKiosk/slices/customization/view.js +3 -2
  46. package/es/components/HDLKiosk/slices/fulfillment/Screen/index.js +6 -6
  47. package/es/components/HDLKiosk/slices/fulfillment/slice.js +5 -8
  48. package/es/components/HDLKiosk/slices/identity/Screen/index.js +18 -12
  49. package/es/components/HDLKiosk/slices/identity/slice.js +4 -11
  50. package/es/components/HDLKiosk/slices/index.js +3 -2
  51. package/es/components/HDLKiosk/slices/payment/Screen/index.js +5 -5
  52. package/es/components/HDLKiosk/slices/payment/slice.js +7 -8
  53. package/es/components/HDLKiosk/slices/primaryProductPrompt/slice.js +14 -0
  54. package/es/components/HDLKiosk/slices/primaryProductPrompt/view.js +23 -0
  55. package/es/components/HDLKiosk/utils.js +3 -2
  56. package/es/components/bigSale/templates/HDLKiosk/auth/HDLKioskIdentityAuthPanel.js +17 -2
  57. package/es/pro/Login2.0/Login2.d.ts +2 -0
  58. package/es/pro/Login2.0/Login2.js +9 -1
  59. package/es/pro/Login2.0/Register2.d.ts +2 -0
  60. package/es/pro/Login2.0/Register2.js +9 -1
  61. package/lib/components/HDLKiosk/app/ScreenRenderer.js +7 -7
  62. package/lib/components/HDLKiosk/app/views.js +2 -1
  63. package/lib/components/HDLKiosk/app/workflow/barcode.js +11 -34
  64. package/lib/components/HDLKiosk/app/workflow/{guards.js → predicates.js} +9 -9
  65. package/lib/components/HDLKiosk/app/workflow/quick.js +3 -6
  66. package/lib/components/HDLKiosk/app/workflow/registry.js +1 -1
  67. package/lib/components/HDLKiosk/app/workflow/scale.js +3 -12
  68. package/lib/components/HDLKiosk/components/shell/HDLKioskBottomBarHost/index.js +12 -10
  69. package/lib/components/HDLKiosk/components/shell/HDLKioskShell/index.js +1 -0
  70. package/lib/components/HDLKiosk/docs/00-/346/226/207/344/273/266/345/257/274/350/210/252.md +7 -7
  71. 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 +47 -40
  72. package/lib/components/HDLKiosk/docs/03-/344/270/232/345/212/241/346/265/201/347/250/213/344/270/216/344/272/244/344/272/222/350/247/204/345/210/231.md +3 -3
  73. package/lib/components/HDLKiosk/docs/05-/344/272/244/346/230/223/345/256/211/345/205/250.md +1 -1
  74. package/lib/components/HDLKiosk/docs/07-/345/220/216/347/273/255/345/267/245/344/275/234.md +1 -1
  75. package/lib/components/HDLKiosk/docs/README.md +2 -2
  76. package/lib/components/HDLKiosk/docs//345/256/236/346/226/275/350/277/233/345/272/246.md +3 -3
  77. package/lib/components/HDLKiosk/docs//346/236/266/346/236/204/350/256/276/350/256/241.md +11 -11
  78. package/lib/components/HDLKiosk/index.js +0 -1
  79. package/lib/components/HDLKiosk/kernel/README.md +8 -9
  80. package/lib/components/HDLKiosk/kernel/application/defineApplication.js +18 -19
  81. package/lib/components/HDLKiosk/kernel/application/defineSlice.js +8 -14
  82. package/lib/components/HDLKiosk/kernel/workflow/actor.js +118 -28
  83. package/lib/components/HDLKiosk/kernel/workflow/compiler.js +35 -41
  84. package/lib/components/HDLKiosk/kernel/workflow/selectors.js +10 -0
  85. package/lib/components/HDLKiosk/runtime/HDLKioskWorkflowView.js +10 -9
  86. package/lib/components/HDLKiosk/runtime/controllers/useHDLKioskCustomerController.js +1 -1
  87. package/lib/components/HDLKiosk/runtime/createWorkflowSession.js +3 -3
  88. package/lib/components/HDLKiosk/runtime/domainTransitionRunner.js +9 -9
  89. package/lib/components/HDLKiosk/runtime/workflowEvent.js +9 -4
  90. package/lib/components/HDLKiosk/runtime/workflowLifecycle.js +3 -3
  91. package/lib/components/HDLKiosk/slices/catalog/PrimaryProductPromptDialog/index.js +1 -2
  92. package/lib/components/HDLKiosk/slices/catalog/Screen/index.js +13 -40
  93. package/lib/components/HDLKiosk/slices/catalog/Screen/model.js +0 -5
  94. package/lib/components/HDLKiosk/slices/catalog/slice.js +2 -15
  95. package/lib/components/HDLKiosk/slices/catalog/view.js +4 -6
  96. package/lib/components/HDLKiosk/slices/customization/Screen/index.js +9 -11
  97. package/lib/components/HDLKiosk/slices/customization/operation.js +23 -3
  98. package/lib/components/HDLKiosk/slices/customization/slice.js +3 -7
  99. package/lib/components/HDLKiosk/slices/customization/view.js +3 -2
  100. package/lib/components/HDLKiosk/slices/fulfillment/Screen/index.js +6 -6
  101. package/lib/components/HDLKiosk/slices/fulfillment/slice.js +4 -7
  102. package/lib/components/HDLKiosk/slices/identity/Screen/index.js +17 -11
  103. package/lib/components/HDLKiosk/slices/identity/slice.js +4 -11
  104. package/lib/components/HDLKiosk/slices/index.js +2 -1
  105. package/lib/components/HDLKiosk/slices/payment/Screen/index.js +5 -5
  106. package/lib/components/HDLKiosk/slices/payment/slice.js +6 -7
  107. package/lib/components/HDLKiosk/slices/primaryProductPrompt/slice.js +14 -0
  108. package/lib/components/HDLKiosk/slices/primaryProductPrompt/view.js +25 -0
  109. package/lib/components/HDLKiosk/utils.js +3 -2
  110. package/lib/components/bigSale/templates/HDLKiosk/auth/HDLKioskIdentityAuthPanel.js +16 -1
  111. package/lib/pro/Login2.0/Login2.d.ts +2 -0
  112. package/lib/pro/Login2.0/Login2.js +9 -1
  113. package/lib/pro/Login2.0/Register2.d.ts +2 -0
  114. package/lib/pro/Login2.0/Register2.js +9 -1
  115. package/package.json +4 -4
@@ -26,7 +26,7 @@ Entry → Identity → Customization → Catalog → Fulfillment
26
26
  → Payment Method / Payment Completed → Entry
27
27
  ```
28
28
 
29
- - Identity Slice 在 `guards.beforeEnter` 中声明进入条件,Quick 只在该 occurrence 配置 `useGuards: ['beforeEnter']`。本 Step 登录或 Skip 成功后守卫返回 `skip`,因此后退会跳过它。Fulfillment Back 因没有更早的可进入 Step,导航目标变为 `sessionExit`;全局守卫返回 `defer(confirmEndOrder)` 并打开结束订单确认。确认后返回 Entry,取消则留在当前页。
29
+ - Quick 的 Identity occurrence 显式声明 `visitPolicy: 'once'`。登录或 Omit 成功后,该 Step 在本会话不再进入,也不写入 Back 页面历史。当没有更早的已访问页面时,Back 的导航目标为 `sessionExit`;全局会话策略返回 `defer(confirmEndOrder)` 并打开结束订单确认。确认后返回 Entry,取消则留在当前页。
30
30
  - Fulfillment 统一位于 Payment 之前确认堂食/外带。
31
31
  - Customization 只在稳定正净重且必选 options 完整时启用 Next。
32
32
  - “I don't need Malatang” 直接跳过主商品并进入 Catalog;如果正在编辑已确认主商品,则先移除该行。
@@ -67,7 +67,7 @@ Entry 消费第一个有效重量边沿后启动以 Fulfillment 为首节点的
67
67
 
68
68
  ## 6. 会员中途插入
69
69
 
70
- Identity 的 Skip 只表示当前以 Guest 继续。Shell 可在本地策略允许的页面执行 `identity.sync`。登录、Customer 写入、重报价和 Projection 验证成功后仍留在原节点;`partial`/`unknown` 不得带着未确认价格继续。
70
+ Identity 的 Omit 只表示当前以 Guest 继续。Shell 可在本地策略允许的页面执行 `identity.sync`。登录、Customer 写入、重报价和 Projection 验证成功后仍留在原节点;`partial`/`unknown` 不得带着未确认价格继续。
71
71
 
72
72
  ## 7. UI 和修改规则
73
73
 
@@ -76,6 +76,6 @@ Identity 的 Skip 只表示当前以 Guest 继续。Shell 可在本地策略允
76
76
  - 尺寸校准以上线环境的实际渲染值反推:当 72px 在目标倍率下实测为 100px,而原型目标为 108px 时,当前自有视觉值统一乘以 `108 / 100 = 1.08`;外部生产组件不参与这一次修正。
77
77
  - Screen 不得直接 import BigSale/SalesSDK,也不本地计算最终金额。
78
78
  - Screen 内部写操作使用 Screen Command;离开节点的写操作使用 Activity Exit Effect。
79
- - `product.syncPrimaryWeightedProduct` 属于 Customization `completed` 的 Exit Effect,不是输入变化时的 Screen Command。
79
+ - `product.syncPrimaryWeightedProduct` 属于 Customization `complete` 的 Exit Effect,不是输入变化时的 Screen Command。
80
80
  - Shell 的购物车、金额和 Drawer 只消费 Host 已确认 Projection。
81
81
  - 调整节点顺序时同步更新 Workflow Definition、compiler/definition/actor/Screen 测试和实施进度。
@@ -31,7 +31,7 @@ Host 无法证明写后事实时,Operation 不能返回 succeeded。Cart 和 C
31
31
 
32
32
  ## 3. Checkout Prepared Freshness
33
33
 
34
- Prepare 不是某个页面之前或某个 Workflow outcome 的固定副作用。Checkout Coordinator 把它作为所有支付 dispatch 的前置条件,对当前事实版本执行 `ensurePrepared(currentVersion)`。
34
+ Prepare 不是某个页面之前或某个 Workflow Intent 的固定副作用。Checkout Coordinator 把它作为所有支付 dispatch 的前置条件,对当前事实版本执行 `ensurePrepared(currentVersion)`。
35
35
 
36
36
  事实版本至少包括 session epoch、cart fingerprint、customer/voucher/promotion revision、Summary 应付金额/币种、Requirement 集合和支付能力上下文。状态为:
37
37
 
@@ -35,7 +35,7 @@
35
35
  ### P1-1 商品和 Catalog
36
36
 
37
37
  - 将模板内临时固定商品 ID 改为租户/门店正式称重商品配置;商品结构已经切换为 OS `queryProducts`,不得恢复本地 fallback;
38
- - 确认 Quick 是否允许跳过称重主商品;若不允许,从 `customization` Activity Contract/Workflow 中删除 `skipped` Outcome;
38
+ - 确认 Quick 是否允许排除称重主商品;若不允许,从 `customization` Activity Contract/Workflow 中移除 `omit` Intent;
39
39
  - 大目录分页/虚拟滚动与分类切换性能;分类、子分类和本地搜索首版已完成;
40
40
  - 缺货、下架、菜单不可用、价格变化;
41
41
  - Barcode 细分 added/requiresSelection/notFound/cancelled;
@@ -9,7 +9,7 @@
9
9
 
10
10
  1. [架构设计.md](./架构设计.md):理解独立物料边界、依赖方向和全局不变量;
11
11
  2. [00-文件导航.md](./00-文件导航.md):快速查找每个目录和关键文件的角色、调用方与修改落点;
12
- 3. [01-核心运行机制.md](./01-核心运行机制.md):沿 Activity Contract、Outcome Actor、Command Coordinator、Controller 和 Screen 的真实调用链理解 Core;
12
+ 3. [01-核心运行机制.md](./01-核心运行机制.md):沿 Activity Contract、Intent/Navigation Actor、Command Coordinator、Controller 和 Screen 的真实调用链理解 Core;
13
13
  4. [02-Host 适配与业务数据.md](./02-Host适配与业务数据.md):理解 BigSale 兼容层每个文件解决的问题、字段映射和当前缺口;
14
14
  5. [实施进度.md](./实施进度.md):确认当前已完成能力、临时策略和已知风险;
15
15
  6. [03-业务流程与交互规则.md](./03-业务流程与交互规则.md):理解三入口和当前权威流程;
@@ -31,7 +31,7 @@
31
31
  | ------------------------------------------------------- | ------------------------------------------------------------------------------ | ---------------------- |
32
32
  | [00-文件导航.md](./00-文件导航.md) | 目录职责、关键文件角色、调用关系和常见修改落点 | 详细业务顺序和字段定义 |
33
33
  | [架构设计.md](./架构设计.md) | 边界、总图、状态所有权、不变量 | 实施流水账 |
34
- | [01-核心运行机制.md](./01-核心运行机制.md) | Core 代码地图、Activity/Outcome/Command/Actor/Controller 调用链、修改落点 | BigSale 原始字段 |
34
+ | [01-核心运行机制.md](./01-核心运行机制.md) | Core 代码地图、Activity/Intent/Navigation/Command/Actor/Controller 调用链、修改落点 | BigSale 原始字段 |
35
35
  | [02-Host 适配与业务数据.md](./02-Host适配与业务数据.md) | BigSale 兼容层代码地图、痛点与形式、Projection/Command/商品/设备映射、真实缺口 | Screen 导航 |
36
36
  | [03-业务流程与交互规则.md](./03-业务流程与交互规则.md) | 三入口、会员、主商品提交、页面行为、UI 基线 | OS 内部实现 |
37
37
  | [04-设备与称重.md](./04-设备与称重.md) | Scanner、任意页面扫码方案、Scale、事件仲裁和称重商品 | 支付实现细节 |
@@ -36,7 +36,7 @@
36
36
  | Scale | 待实机 | 顶层 Runtime、自动入口;有效重量先进入 Fulfillment,再进入与 Quick 共用的 Customization,本地草稿在 Next 时提交 | 真秤全矩阵、正式商品 |
37
37
  | Catalog | 待实机 | HDLKiosk 模板驱动现有 retail Product Provider 正式 load 后读取快照;分类/搜索/商品卡、连续加购、订单悬浮栏及购物车 Drawer 已完成 | 大目录虚拟化、复杂规格接管、实机视觉 |
38
38
  | Cart Overlay | 待业务/实机 | 已替代独立 Review/Voucher Slice;复用全局 BottomBar,展示 Host 商品、数量、卡券入口、小计和备注能力 | 称重/定制重新编辑、价格变化反馈、促销/税/节省明细 |
39
- | Identity 登录 | 待实机 | BigSale 内注册 H5 Login2/Register2;认证结果经 memberRecognized 进入 identity.sync,客户写入、订单一致性和重报价统一由 Adapter/Operation 完成 | 登录/注册实机交互、错误文案与客户搜索结果验收 |
39
+ | Identity 登录 | 待实机 | BigSale 内注册 H5 Login2/Register2;认证结果经 complete 进入 identity.sync,客户写入、订单一致性和重报价统一由 Adapter/Operation 完成 | 登录/注册实机交互、错误文案与客户搜索结果验收 |
40
40
  | 会员中途登录 | 待 Host | Activity 级本地入口策略、customer/cart 互斥、统一 Screen Command、重新计价验证;partial/unknown 阻塞 Workflow | 将同一 H5 认证能力接入 Shell/Cart Overlay 入口 |
41
41
  | Fulfillment | 待 Host | Workflow Context 已接;支付 dispatch 前的 `ensurePrepared` 统一写入并验证履约方式 | 当前仍允许临时模拟 |
42
42
  | Voucher | 已并入 Overlay | 不再是 Workflow Slice;由 Cart Overlay 展示并操作当前用户卡券 | 真实券列表、应用、撤销和 quote |
@@ -73,7 +73,7 @@
73
73
  - Customization 将称重/options 保持为页面本地草稿,输入变化不写 OS;Next 才通过 `addProductWithFlow` 提交,加购成功后前进;底栏和 Drawer 统一读取已确认的 `summary.due/cart.lines`;
74
74
  - Customization 通过本物料内的 `HDLKioskSkuOptionsSelection` 将原 ProductData 直接作为共享 `skuOptionsSelection` 的 dataSource,只转换选中结果;独立运行缺少 Engine 上下文时直接读取同一 option 结构兜底;
75
75
  - HDLKiosk 已删除主商品额外业务弹窗相关的 Activity、Host Contract、Projection 和 Checkout Requirement;是否展示额外弹窗由 OS 加购流内部决定;
76
- - Customization 称重/options 只保持本地草稿,Next 才调用 `addProductWithFlow`,加购成功后才前进;Barcode 主商品询问仍归入 `catalogWithPrimaryProductPrompt` Activity 内部;
76
+ - Barcode 主商品询问使用独立 Modal Slice;拒绝或 Customization 跳过后直接进入 Fulfillment,Back 按真实页面历史返回 Catalog,再次前进沿用已提交的标准结果;
77
77
  - Cart Mutation 以 Host consistency barrier 为权威,不再被晚一帧提交的 `consistencyPending` 展示态误判为 unknown;
78
78
  - 普通 Catalog/Cart Overlay 写操作不显示全屏遮罩;Catalog 批量锁定卡片时保持原视觉,减少短操作闪烁;
79
79
  - Scale Hook 在顶层单一运行,Entry 和 Customization 详情消费同一快照;Scale workflow 从 `fulfillment` 开始,再复用 `customization` 页面分支;
@@ -111,7 +111,7 @@
111
111
  - Result 取餐号只读取当前订单或匹配 `salesDetail.header` 的 `shop_full_order_number`;支付成功后 Projection 仍缺号时按已确认 `orderId` 回查订单详情,始终不从支付结果猜测字段,也不以其它订单编号降级;
112
112
  - Barcode 当前使用“激活 Session → 消费首码 → Catalog → 缺主商品时询问 → Yes 时 Fulfillment → 称重详情 → Next/OS 加购成功 → Catalog”的路径;No 保持在 Catalog 且不要求 Fulfillment,Cart Overlay 完成订单复核与卡券操作;
113
113
  - 移除遗留 `hdl-shell__footer` 与 `resolveScreenBottomBar`:Fulfillment、Customization、Catalog 改为声明实时 BottomBar,由 Shell 内唯一 `HDLKioskBottomBarHost` 渲染。BottomBar 当前区分 `visible / masked / hidden`:退出确认及 Catalog 主商品询问等普通 Modal 保留底栏并由遮罩阻止交互,同时自动收起 CartDrawer;只有等待员工、支付未决和 blocked 等不可导航状态才隐藏。购物车图标已接入基于 `CompensatedPisellContainer` 的底部 Drawer,展示 Host 已确认的商品、定制摘要、数量和金额,并在三个 Catalog workflow 中复用既有改数量/删除 Operation;
114
- - Workflow 使用线性优先的 Slice 数组:数组表达主路径,Slice Outcome 通过 `next()` / `back()` 或带方向的 Guard/Effect 补齐默认相邻移动,`on` 只描述分支、合流和跳跃;同一 Slice 可用 `slice:用途` 多次出现。非 Back 回路必须声明有限 repeat,Actor 超限即阻塞;Outcome 同时携带 `stepId/activityId`,避免同类 Activity 的旧实例误触发当前 Step。支付不确定是 Actor blocked 状态,不作为业务节点;
114
+ - Workflow 使用线性优先的 Slice 数组:数组表达主路径,Slice Intent 通过 `next()` 或 `navigate: 'next'` 补齐默认前进,`on` 只描述分支、合流和跳跃;Back 是独立 Navigation,并按实际页面历史解析。同一 Slice 可用 `slice:用途` 多次出现,回路必须声明有限 repeat,Actor 超限即阻塞;Intent 同时携带 `stepId/activityId`,避免同类 Activity 的迟到实例误触发当前 Step。支付不确定是 Actor blocked 状态,不作为业务节点;
115
115
  - `slices/<name>/slice.ts` 是各业务能力唯一导出的 `defineSlice` 结果:Slice `id` 标识业务 Activity,`screen.id` 标识页面类别;`view.tsx` 就地完成该 Slice 的 ViewModel 派生和组件装配,`app/views.ts` 单独维护完整的 Activity → View 本地注册表,`ScreenRenderer` 进行同步解析。Kernel、Slice 和 Workflow 不依赖 React View;公共类型与跨 Slice 纯方法分别集中在根 `types.ts`、`utils.ts`;
116
116
  - Kernel 已不依赖 HDLKiosk contracts:结构 Compiler、Actor 和通用 Coordinator 位于 `kernel/`;`app/operations.ts` 是共享业务副作用的公共入口,私有实现位于 `app/operations/`,其中 Coordinator 注入 HDLKioskHost、冲突矩阵、支付冻结、错误分类和遥测。Slice 专属 Operation 与对应 Slice 同置;
117
117
  - HDLKiosk 阻断式 Dialog 已统一到 `HDLKioskModal → PisellModal`,默认层级高于 CartDrawer;BottomBar 的三态解析、组件依赖边界、Checkout 安全及现有 Dialog/Screen 定向用例通过,HDLKiosk 汇总 Less 编译、变更组件 esbuild 语法转换和 `git diff --check` 通过;
@@ -71,7 +71,7 @@ flowchart TB
71
71
  HOST --> OPS
72
72
  PROJ --> CONTROLLER
73
73
  PROJ --> VIEW --> UI
74
- UI -->|"Activity Outcome"| VIEW
74
+ UI -->|"Activity Intent / Navigation"| VIEW
75
75
  VIEW --> ACTOR
76
76
  UI -->|"Screen Command"| VIEW
77
77
  VIEW --> COORD
@@ -106,20 +106,20 @@ Kernel ✕ HDLKiosk contracts / BigSale / SalesSDK / merchant workflows / Screen
106
106
  | ----------------------- | -------------------------------------------------------------------- | --------------------------------------------- |
107
107
  | Contracts/Ports | HDLKiosk 自有 DTO、能力和结果语义 | BigSale 字段兼容 |
108
108
  | Projection | 标准化 Host 可观察事实 | 发业务命令 |
109
- | Slice | 将 Screen、合法 Outcome、局部 Command、退出 Effect 和 Requirement 收敛为业务能力 | 前后节点和 Host 实现 |
109
+ | Slice | 将 Screen、合法 Intent、局部 Command、退出 Effect 和 Requirement 收敛为业务能力 | 前后节点和 Host 实现 |
110
110
  | Application Manifest | 汇总 Slice、Workflow 和 Operation 引用并生成可信注册表 | React 生命周期和订单事实 |
111
111
  | Structural Compiler | Step ID、相邻导航、可达性、终点、Modal 和有界循环 | 支付和购物车策略 |
112
112
  | HDLKiosk Policy | 编译后检查支付来源和 Checkout Prepare 等交易约束 | 修改节点结构 |
113
- | Workflow Actor | mailbox、step/activity 防迟到、running/blocked、节点提交和循环计数 | Host、Guard、Operation、支付解释和持久化 |
114
- | Transition Runner | 执行 Guard/Exit Command,把结果归一为 advance/stay/blocked | React、节点数组位置 |
113
+ | Workflow Actor | mailbox、step/activity 防迟到、running/blocked、节点提交和循环计数 | Host、Predicate、Operation、支付解释和持久化 |
114
+ | Transition Runner | 求值 Predicate/执行 Exit Command,将结果归一为 advance/stay/blocked | React、节点数组位置 |
115
115
  | Operations | 封装业务 Command 和写后验证 | Screen 导航 |
116
116
  | Requirement Registry | 判断支付前业务要求对当前订单是否适用,并校验 Host Projection | Workflow 节点编排和 UI |
117
117
  | Kernel Coordinator | 用应用注入的 Context/Scope/Policy 处理冲突、去重、timeout 和 epoch | 支付含义、Host、业务错误和节点目标 |
118
118
  | HDLKiosk Operation Policy | 注入 Host Context、冲突矩阵、支付 freeze、错误分类和遥测 | Screen 导航 |
119
119
  | Workflow | 用有序 Slice 数组表达主路径,以 `on` 描述分支、合流和受限回路 | Screen 内部动作和订单事实 |
120
120
  | Controllers | session/device/customer 生命周期;提供验证式 `returnToEntry` | OS 字段转换、决定自动返回时机 |
121
- | View assembly | 把 Activity 节点和 Projection 转换为组件输入,并路由 Outcome/Command | 决定目标节点 |
122
- | Screens/Dialogs/Layouts | 展示、局部输入、Screen Command 和 Activity Outcome | 直接调用 Host、Actor 或 Controller |
121
+ | View assembly | 把 Activity 节点和 Projection 转换为组件输入,并路由 Intent/Navigation/Command | 决定目标节点 |
122
+ | Screens/Dialogs/Layouts | 展示、局部输入、Screen Command、Activity Intent 和 Back Navigation | 直接调用 Host、Actor 或 Controller |
123
123
  | BigSale Adapter | DTO 转换、callback、插件、capability | 决定流程节点 |
124
124
 
125
125
  ## 5. Host 契约
@@ -157,9 +157,9 @@ Screen:输入和展示状态
157
157
 
158
158
  1. Core 不 import BigSale、SalesSDK、Engine plugin 或 raw tempOrder。
159
159
  2. Adapter 不决定 Workflow 目标节点。
160
- 3. Screen 不直接调用 Host;内部写操作发送 Command,离开步骤发送 Activity Outcome。
161
- 4. Slice 是 Screen、Outcome、Command 和退出策略的唯一业务定义;Activity Registry 和 Operation Registry 从 Application Manifest 派生,不维护平行清单。
162
- 5. Workflow 作者只排列已注册 Slice;规范化后的运行结构不得包含 Screen、Guard、Operation 或 failureTarget。重复 Slice 必须使用 `slice:用途` 标识每次出现。
160
+ 3. Screen 不直接调用 Host;内部写操作发送 Command,离开步骤发送 Activity Intent,返回发送 Navigation。
161
+ 4. Slice 是 Screen、Intent、Command 和退出策略的唯一业务定义;Activity Registry 和 Operation Registry 从 Application Manifest 派生,不维护平行清单。
162
+ 5. Workflow 作者只排列已注册 Slice;规范化后的运行结构不得包含 Screen、Predicate、Operation 或 failureTarget。重复 Slice 必须使用 `slice:用途` 标识每次出现。
163
163
  6. 只有可被业务编排者独立排序或分支的里程碑才成为节点;Dialog 内部询问、选择和等待阶段留在 Activity 内。
164
164
  7. Operation 不渲染 UI,不直接切 Screen。
165
165
  8. Cart/Customer/Summary/Payment 以 Host Projection 为权威。
@@ -186,7 +186,7 @@ Scale ───────┘
186
186
 
187
187
  入口定义不同顺序,复用 Identity、Fulfillment、Customization、Catalog、Cart、Checkout 等 Screen/Operation。会员中途登录是共享 session 行为,不复制到每个 Workflow 节点。
188
188
 
189
- Barcode/Scale 是外部 ingress,不放入 Step 数组。Barcode 首码先归属并激活 Session,在 Session `readyForCommands && cartWritable` 后通过 `barcode.consume` 完成;首屏类型由 Workflow Definition 决定,Scanner 不依赖 Catalog。Scale 当前从 Fulfillment 开始。Slice 在 `guards` 中声明纯函数,Workflow occurrence 用 `useGuards` 选择启用阶段,Compiler 只在 Node 中保留 `guardPhases`。Actor 的全局 `beforeEach` 管线对初始进入、前进、后退、显式目标和 `sessionExit` 使用同一套 `to/from` 导航判定。退出确认是全局 guard 的 `defer` 决策,Shell 只消费 `pendingNavigation.request`,不在 View 或 Kernel 中判断具体 Activity 名称。
189
+ Barcode/Scale 是外部 ingress,不放入 Step 数组。Barcode 首码先归属并激活 Session,在 Session `readyForCommands && cartWritable` 后通过 `barcode.consume` 完成;首屏类型由 Workflow Definition 决定,Scanner 不依赖 Catalog。Scale 当前从 Fulfillment 开始。业务 Step 当前不启用本地 `beforeEnter`;Identity 通过 Workflow 中可见的 `visitPolicy: 'once'` 表达会话内只进入一次。Actor 的全局 `beforeEach` 管线仅承载会话安全策略。退出确认由其返回 `defer`,Shell 只消费 `pendingNavigation.request`,不在 View 或 Kernel 中判断具体 Activity 名称。
190
190
 
191
191
  权威节点顺序见 [03-业务流程与交互规则.md](./03-业务流程与交互规则.md)。
192
192
 
@@ -222,7 +222,7 @@ HDLKiosk 无法独立保证:
222
222
  ```text
223
223
  components/HDLKiosk/
224
224
  ├── app/ # 应用清单、三入口流程、共享 Operation 入口和节点渲染装配
225
- │ ├── workflow/ # Quick / Barcode / Scale + registry / guards / policy
225
+ │ ├── workflow/ # Quick / Barcode / Scale + registry / predicates / navigation guards / policy
226
226
  │ ├── operations.ts # 跨 Slice Operation 的唯一公共导入面
227
227
  │ ├── operations/ # 公共入口背后的私有实现与测试
228
228
  │ └── entry/ # Workflow 外三入口页面
@@ -61,7 +61,6 @@ function HDLKioskContent({ host, config, isActive = true, entryDataPreparing = f
61
61
  config,
62
62
  isActive,
63
63
  starting,
64
- session,
65
64
  sessionRef,
66
65
  activeRef,
67
66
  scannerIngress,
@@ -10,10 +10,9 @@
10
10
  const identity = defineSlice({
11
11
  id: 'identity',
12
12
  screen: { id: 'identity' },
13
- outcomes: {
14
- identified: effect(identifyCustomer, { navigate: 'next' }),
15
- skipped: next(),
16
- back: back(),
13
+ intents: {
14
+ complete: effect(identifyCustomer, { navigate: 'next' }),
15
+ omit: next(),
17
16
  },
18
17
  commands: {
19
18
  requestSmsCode,
@@ -40,11 +39,11 @@ const views = {
40
39
  ```
41
40
 
42
41
  - `defineSlice`:把业务 Activity、Screen 描述、语义出口、Screen 内 Command 和离开时 Effect 放在一起;
43
- - `next()` / `back()`:声明默认相邻移动,不再额外维护 navigation 清单;
42
+ - `next()`:声明默认前进;Back 由独立 Navigation 和页面历史处理;
44
43
  - `defineWorkflow`:数组只表达 Slice 顺序,`on` 只处理跳跃、分支、合流和有界回路;
45
44
  - `defineKioskApplication`:汇总 Slice、Workflow 与应用级 Operation,并自动生成 Activity/Operation Manifest。
46
45
 
47
- Slice 的 `outcomes` 是“业务活动对流程公开的结果”,不是按钮或 DOM 事件。不会离开 Screen 的动作放进 `commands`。支付门禁、设备监听、购物车写入验证等商家规则不进入 Kernel。
46
+ Slice 的 `intents` 是“业务活动请求流程执行的意图”,不是按钮或 DOM 事件。Back 使用独立 Navigation;不会离开 Screen 的动作放进 `commands`。支付门禁、设备监听、购物车写入验证等商家规则不进入 Kernel。
48
47
 
49
48
  三个标识的职责固定如下:Slice `id` 是 Workflow 引用的业务 Activity;`screen.id` 是 Shell、数据加载和展示策略使用的页面类别;React View 由应用层按 Activity 单独注册。不导航的业务操作声明为当前 Slice 的 Command,例如 `paymentMethod` 内的店员支付授权。
50
49
 
@@ -54,8 +53,8 @@ Compiler 只把 `screen.id` 复制为节点的 `screenId`。Renderer 再按节
54
53
 
55
54
  | 目录 | 负责 | 由应用注入 |
56
55
  | --- | --- | --- |
57
- | `application/` | Slice/Workflow/Application 作者 API、Manifest 生成 | Screen 描述、Outcome、Operation 引用 |
58
- | `workflow/` | 结构编译、Actor mailbox、节点提交、有界循环 | Activity Registry、Guard Registry、Transition Runner、Context Reducer |
56
+ | `application/` | Slice/Workflow/Application 作者 API、Manifest 生成 | Screen 描述、Intent、Operation 引用 |
57
+ | `workflow/` | 结构编译、Actor mailbox、节点提交、有界循环 | Activity Registry、Predicate Registry、Navigation Guard Registry、Transition Runner、Context Reducer |
59
58
  | `operations/` | 排队、冲突仲裁、intent 去重、timeout、Abort、session epoch | Context factory、错误分类、冲突规则、业务 Policy、观察器 |
60
59
  | `lifecycle.ts` | 组合 Actor 提交后的只读观察器 | telemetry、审计或持久化观察器 |
61
60
 
@@ -71,7 +70,7 @@ Workflow ┘ │
71
70
  Structural Compiler ─ Actor
72
71
  │
73
72
  Screen Command ───────────────────── Operation Coordinator
74
- Activity Outcome ─ Transition Runner ───────────┘
73
+ Activity Intent ─ Transition Runner ────────────┘
75
74
  ```
76
75
 
77
76
  当前会话只在内存中运行,不包含 checkpoint 或恢复策略。需要恢复时,由应用层读取 OS 事实和持久化证据,形成 Actor 初始化输入;Kernel 只保留 Lifecycle 和初始化参数这些扩展点。
@@ -27,10 +27,10 @@ function defineKioskApplication(definition) {
27
27
  var _slice$commands;
28
28
  if (slices.has(slice.id)) throw new Error(`Duplicate Kiosk Slice: ${slice.id}`);
29
29
  const operationIds = /* @__PURE__ */ new Set();
30
- Object.values(slice.outcomes).forEach((outcome) => {
31
- if (outcome.kind !== "effect") return;
32
- registerOperation(outcome.operation);
33
- operationIds.add(outcome.operation.id);
30
+ Object.values(slice.intents).forEach((intent) => {
31
+ if (intent.kind !== "effect") return;
32
+ registerOperation(intent.operation);
33
+ operationIds.add(intent.operation.id);
34
34
  });
35
35
  Object.values((_slice$commands = slice.commands) !== null && _slice$commands !== void 0 ? _slice$commands : {}).forEach((operation) => {
36
36
  registerOperation(operation);
@@ -77,31 +77,30 @@ function createApplicationActivityRegistry(application) {
77
77
  const contracts = /* @__PURE__ */ new Map();
78
78
  application.slices.forEach(({ definition }) => {
79
79
  var _definition$presentat, _definition$additiona;
80
- const exitPolicies = Object.fromEntries(Object.entries(definition.outcomes).flatMap(([outcome, behavior]) => {
80
+ const exitPolicies = {};
81
+ Object.entries(definition.intents).forEach(([intent, behavior]) => {
81
82
  let policy;
82
- if (behavior.kind === "guard") policy = { guard: behavior.guard };
83
+ if (behavior.kind === "precondition") policy = { precondition: behavior.predicate };
83
84
  else if (behavior.kind === "effect") policy = {
84
- guard: behavior.guard,
85
- command: {
86
- id: behavior.operation.id,
87
- when: behavior.when
88
- }
85
+ precondition: behavior.precondition,
86
+ command: { id: behavior.operation.id }
89
87
  };
90
- return policy ? [[outcome, Object.freeze(policy)]] : [];
91
- }));
88
+ if (policy) exitPolicies[intent] = Object.freeze(policy);
89
+ });
92
90
  const primaryPresentation = (_definition$presentat = definition.presentation) !== null && _definition$presentat !== void 0 ? _definition$presentat : "page";
93
91
  contracts.set(definition.id, Object.freeze({
94
92
  id: definition.id,
95
93
  screenId: definition.screen.id,
96
- outcomes: Object.freeze(Object.keys(definition.outcomes)),
94
+ intents: Object.freeze(Object.keys(definition.intents)),
97
95
  exitPolicies: Object.freeze(exitPolicies),
98
- navigationGuards: definition.guards ? Object.freeze(Object.fromEntries(Object.keys(definition.guards).map((phase) => [phase, getKioskSliceNavigationGuardId(definition.id, phase)]))) : void 0,
96
+ navigationGuards: definition.guards ? Object.freeze(Object.keys(definition.guards).reduce((guards, rawPhase) => {
97
+ const phase = rawPhase;
98
+ guards[phase] = getKioskSliceNavigationGuardId(definition.id, phase);
99
+ return guards;
100
+ }, {})) : void 0,
99
101
  allowedPresentations: Object.freeze([...new Set([primaryPresentation, ...(_definition$additiona = definition.additionalPresentations) !== null && _definition$additiona !== void 0 ? _definition$additiona : []])]),
100
102
  requirements: definition.requirements ? Object.freeze([...definition.requirements]) : void 0,
101
- navigation: Object.freeze({
102
- forward: Object.freeze(Object.entries(definition.outcomes).filter(([, behavior]) => behavior.navigate === "next").map(([outcome]) => outcome)),
103
- backward: Object.freeze(Object.entries(definition.outcomes).filter(([, behavior]) => behavior.navigate === "previous").map(([outcome]) => outcome))
104
- })
103
+ navigation: Object.freeze({ forward: Object.freeze(Object.entries(definition.intents).filter(([, behavior]) => behavior.navigate === "next").map(([intent]) => intent)) })
105
104
  }));
106
105
  });
107
106
  return Object.freeze({
@@ -1,27 +1,22 @@
1
1
  import { _objectSpread2 } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
2
2
  //#region src/components/HDLKiosk/kernel/application/defineSlice.ts
3
- const back = () => Object.freeze({
4
- kind: "complete",
5
- navigate: "previous"
6
- });
7
- const guard = (guardId, options = {}) => Object.freeze({
8
- kind: "guard",
9
- guard: guardId,
3
+ const intentPrecondition = (predicate, options = {}) => Object.freeze({
4
+ kind: "precondition",
5
+ predicate,
10
6
  navigate: options.navigate
11
7
  });
12
8
  const effect = (operation, options = {}) => Object.freeze({
13
9
  kind: "effect",
14
10
  operation,
15
- when: options.when,
16
- guard: options.guard,
11
+ precondition: options.precondition,
17
12
  navigate: options.navigate
18
13
  });
19
14
  function defineSlice(slice) {
20
15
  var _slice$guards;
21
16
  if (!slice.id.trim()) throw new Error("Kiosk Slice id cannot be empty");
22
17
  if (!slice.screen.id.trim()) throw new Error(`Kiosk Slice ${slice.id} screen id cannot be empty`);
23
- Object.entries(slice.outcomes).forEach(([outcome]) => {
24
- if (!outcome.trim()) throw new Error(`Kiosk Slice ${slice.id} has an empty outcome`);
18
+ Object.entries(slice.intents).forEach(([intent]) => {
19
+ if (!intent.trim()) throw new Error(`Kiosk Slice ${slice.id} has an empty intent`);
25
20
  });
26
21
  Object.entries((_slice$guards = slice.guards) !== null && _slice$guards !== void 0 ? _slice$guards : {}).forEach(([phase, navigationGuard]) => {
27
22
  if (phase !== "beforeEnter") throw new Error(`Kiosk Slice ${slice.id} has an unknown navigation guard phase: ${phase}`);
@@ -29,11 +24,11 @@ function defineSlice(slice) {
29
24
  });
30
25
  return Object.freeze(_objectSpread2(_objectSpread2({}, slice), {}, {
31
26
  screen: Object.freeze(_objectSpread2({}, slice.screen)),
32
- outcomes: Object.freeze(_objectSpread2({}, slice.outcomes)),
27
+ intents: Object.freeze(_objectSpread2({}, slice.intents)),
33
28
  guards: slice.guards ? Object.freeze(_objectSpread2({}, slice.guards)) : void 0,
34
29
  commands: slice.commands ? Object.freeze(_objectSpread2({}, slice.commands)) : void 0,
35
30
  requirements: slice.requirements ? Object.freeze([...slice.requirements]) : void 0
36
31
  }));
37
32
  }
38
33
  //#endregion
39
- export { back, defineSlice, effect, guard };
34
+ export { defineSlice, effect, intentPrecondition };