openxiangda 2.35.3 → 2.44.0

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 (135) hide show
  1. package/dist/browser/FilePreviewPage.d.ts.map +1 -1
  2. package/dist/browser/FilePreviewPage.js +4 -2
  3. package/dist/browser/FilePreviewPage.js.map +1 -1
  4. package/dist/browser/ManagedCommand.d.ts +1 -0
  5. package/dist/browser/ManagedCommand.d.ts.map +1 -1
  6. package/dist/browser/ManagedCommand.js +1 -1
  7. package/dist/browser/ManagedCommand.js.map +1 -1
  8. package/dist/browser/Shell.d.ts.map +1 -1
  9. package/dist/browser/Shell.js +1 -1
  10. package/dist/browser/Shell.js.map +1 -1
  11. package/dist/browser/components/administration/RoleMembershipManager.d.ts +7 -0
  12. package/dist/browser/components/administration/RoleMembershipManager.d.ts.map +1 -0
  13. package/dist/browser/components/administration/RoleMembershipManager.js +724 -0
  14. package/dist/browser/components/administration/RoleMembershipManager.js.map +1 -0
  15. package/dist/browser/components/administration/membership-batch-model.d.ts +17 -0
  16. package/dist/browser/components/administration/membership-batch-model.d.ts.map +1 -0
  17. package/dist/browser/components/administration/membership-batch-model.js +117 -0
  18. package/dist/browser/components/administration/membership-batch-model.js.map +1 -0
  19. package/dist/browser/components/platform-fields/AttachmentFileList.d.ts.map +1 -1
  20. package/dist/browser/components/platform-fields/AttachmentFileList.js +2 -1
  21. package/dist/browser/components/platform-fields/AttachmentFileList.js.map +1 -1
  22. package/dist/browser/components/platform-fields/MobileManagedFileField.d.ts +3 -1
  23. package/dist/browser/components/platform-fields/MobileManagedFileField.d.ts.map +1 -1
  24. package/dist/browser/components/platform-fields/MobileManagedFileField.js +9 -5
  25. package/dist/browser/components/platform-fields/MobileManagedFileField.js.map +1 -1
  26. package/dist/browser/components/resource/SurfaceFields.d.ts +3 -2
  27. package/dist/browser/components/resource/SurfaceFields.d.ts.map +1 -1
  28. package/dist/browser/components/resource/SurfaceFields.js +9 -9
  29. package/dist/browser/components/resource/SurfaceFields.js.map +1 -1
  30. package/dist/browser/components/resource/useResourceFormDrafts.d.ts.map +1 -1
  31. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts +8 -1
  32. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts.map +1 -1
  33. package/dist/browser/components/workflow/StandardWorkflowPages.js +277 -69
  34. package/dist/browser/components/workflow/StandardWorkflowPages.js.map +1 -1
  35. package/dist/browser/components/workflow/WorkflowAssignmentRoutingEditor.d.ts +8 -0
  36. package/dist/browser/components/workflow/WorkflowAssignmentRoutingEditor.d.ts.map +1 -0
  37. package/dist/browser/components/workflow/WorkflowAssignmentRoutingEditor.js +174 -0
  38. package/dist/browser/components/workflow/WorkflowAssignmentRoutingEditor.js.map +1 -0
  39. package/dist/browser/components/workflow/WorkflowAssignmentRoutingManager.d.ts +3 -0
  40. package/dist/browser/components/workflow/WorkflowAssignmentRoutingManager.d.ts.map +1 -0
  41. package/dist/browser/components/workflow/WorkflowAssignmentRoutingManager.js +75 -0
  42. package/dist/browser/components/workflow/WorkflowAssignmentRoutingManager.js.map +1 -0
  43. package/dist/browser/components/workflow/WorkflowBusinessStepRecoveryPanel.d.ts +14 -0
  44. package/dist/browser/components/workflow/WorkflowBusinessStepRecoveryPanel.d.ts.map +1 -0
  45. package/dist/browser/components/workflow/WorkflowBusinessStepRecoveryPanel.js +117 -0
  46. package/dist/browser/components/workflow/WorkflowBusinessStepRecoveryPanel.js.map +1 -0
  47. package/dist/browser/components/workflow/WorkflowDelegationManager.d.ts +14 -0
  48. package/dist/browser/components/workflow/WorkflowDelegationManager.d.ts.map +1 -0
  49. package/dist/browser/components/workflow/WorkflowDelegationManager.js +204 -0
  50. package/dist/browser/components/workflow/WorkflowDelegationManager.js.map +1 -0
  51. package/dist/browser/components/workflow/WorkflowNodeCard.d.ts.map +1 -1
  52. package/dist/browser/components/workflow/WorkflowNodeCard.js +5 -2
  53. package/dist/browser/components/workflow/WorkflowNodeCard.js.map +1 -1
  54. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.d.ts.map +1 -1
  55. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js +6 -5
  56. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js.map +1 -1
  57. package/dist/browser/components/workflow/WorkflowTaskCommandReceipt.d.ts +10 -0
  58. package/dist/browser/components/workflow/WorkflowTaskCommandReceipt.d.ts.map +1 -0
  59. package/dist/browser/components/workflow/WorkflowTaskCommandReceipt.js +59 -0
  60. package/dist/browser/components/workflow/WorkflowTaskCommandReceipt.js.map +1 -0
  61. package/dist/browser/components/workflow/WorkflowTaskDraftPanel.d.ts +17 -0
  62. package/dist/browser/components/workflow/WorkflowTaskDraftPanel.d.ts.map +1 -0
  63. package/dist/browser/components/workflow/WorkflowTaskDraftPanel.js +136 -0
  64. package/dist/browser/components/workflow/WorkflowTaskDraftPanel.js.map +1 -0
  65. package/dist/browser/components/workflow/WorkflowTaskFiles.d.ts +20 -0
  66. package/dist/browser/components/workflow/WorkflowTaskFiles.d.ts.map +1 -0
  67. package/dist/browser/components/workflow/WorkflowTaskFiles.js +124 -0
  68. package/dist/browser/components/workflow/WorkflowTaskFiles.js.map +1 -0
  69. package/dist/browser/components/workflow/WorkflowTaskForm.d.ts +49 -0
  70. package/dist/browser/components/workflow/WorkflowTaskForm.d.ts.map +1 -0
  71. package/dist/browser/components/workflow/WorkflowTaskForm.js +141 -0
  72. package/dist/browser/components/workflow/WorkflowTaskForm.js.map +1 -0
  73. package/dist/browser/components/workflow/workflow-routing-draft.d.ts +4 -0
  74. package/dist/browser/components/workflow/workflow-routing-draft.d.ts.map +1 -0
  75. package/dist/browser/components/workflow/workflow-routing-draft.js +9 -0
  76. package/dist/browser/components/workflow/workflow-routing-draft.js.map +1 -0
  77. package/dist/browser/durable-command.d.ts +9 -0
  78. package/dist/browser/durable-command.d.ts.map +1 -1
  79. package/dist/browser/durable-command.js +67 -13
  80. package/dist/browser/durable-command.js.map +1 -1
  81. package/dist/browser/navigation-guard.d.ts +3 -1
  82. package/dist/browser/navigation-guard.d.ts.map +1 -1
  83. package/dist/browser/navigation-guard.js +7 -3
  84. package/dist/browser/navigation-guard.js.map +1 -1
  85. package/dist/browser/platform-client.d.ts +67 -3
  86. package/dist/browser/platform-client.d.ts.map +1 -1
  87. package/dist/browser/platform-client.js +135 -5
  88. package/dist/browser/platform-client.js.map +1 -1
  89. package/dist/browser/record-detail.css +10 -0
  90. package/dist/browser/runtime.d.ts +2 -0
  91. package/dist/browser/runtime.d.ts.map +1 -1
  92. package/dist/browser/runtime.js +5 -1
  93. package/dist/browser/runtime.js.map +1 -1
  94. package/dist/browser/styles.css +81 -0
  95. package/dist/browser/workflow-task-command-recovery.d.ts +17 -0
  96. package/dist/browser/workflow-task-command-recovery.d.ts.map +1 -0
  97. package/dist/browser/workflow-task-command-recovery.js +50 -0
  98. package/dist/browser/workflow-task-command-recovery.js.map +1 -0
  99. package/dist/browser/workflow-task-file-upload.d.ts +18 -0
  100. package/dist/browser/workflow-task-file-upload.d.ts.map +1 -0
  101. package/dist/browser/workflow-task-file-upload.js +35 -0
  102. package/dist/browser/workflow-task-file-upload.js.map +1 -0
  103. package/dist/config.d.ts +1 -1
  104. package/dist/config.d.ts.map +1 -1
  105. package/dist/core.d.ts +5 -1
  106. package/dist/core.d.ts.map +1 -1
  107. package/dist/core.js +1 -0
  108. package/dist/core.js.map +1 -1
  109. package/dist/nest.d.ts +2 -2
  110. package/dist/nest.d.ts.map +1 -1
  111. package/dist/nest.js.map +1 -1
  112. package/dist/react.d.ts +8 -2
  113. package/dist/react.d.ts.map +1 -1
  114. package/dist/react.js +7 -1
  115. package/dist/react.js.map +1 -1
  116. package/documentation/administration.md +128 -1
  117. package/documentation/frontend.md +2 -0
  118. package/documentation/getting-started.md +7 -7
  119. package/documentation/managed-concurrency-frontend.md +9 -4
  120. package/documentation/manifest.json +6 -6
  121. package/documentation/workflow-events.md +213 -3
  122. package/package.json +24 -34
  123. package/releases/2.43.0.json +38 -0
  124. package/releases/2.44.0.json +36 -0
  125. package/skills/manifest.json +1 -1
  126. package/skills/openxiangda-v2/SKILL.md +4 -4
  127. package/skills/openxiangda-v2/references/administration.md +128 -1
  128. package/skills/openxiangda-v2/references/frontend.md +2 -0
  129. package/skills/openxiangda-v2/references/getting-started.md +7 -7
  130. package/skills/openxiangda-v2/references/managed-concurrency-frontend.md +9 -4
  131. package/skills/openxiangda-v2/references/workflow-events.md +213 -3
  132. package/releases/2.35.0.json +0 -42
  133. package/releases/2.35.1.json +0 -43
  134. package/releases/2.35.2.json +0 -45
  135. package/releases/2.35.3.json +0 -46
@@ -68,10 +68,10 @@ MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置
68
68
  以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
69
69
 
70
70
  ```bash
71
- pnpm dlx openxiangda@2.35.3 skill install --force
72
- pnpm dlx openxiangda@2.35.3 auth status --base-url <平台地址> --json
73
- pnpm dlx openxiangda@2.35.3 login --cwd my-app --base-url https://platform.example.com
74
- pnpm dlx openxiangda@2.35.3 create my-app --base-url https://platform.example.com
71
+ pnpm dlx openxiangda@2.44.0 skill install --force
72
+ pnpm dlx openxiangda@2.44.0 auth status --base-url <平台地址> --json
73
+ pnpm dlx openxiangda@2.44.0 login --cwd my-app --base-url https://platform.example.com
74
+ pnpm dlx openxiangda@2.44.0 create my-app --base-url https://platform.example.com
75
75
  cd my-app
76
76
  pnpm openxiangda context --json
77
77
  pnpm openxiangda dev
@@ -174,9 +174,9 @@ MCP 的 `docs_read` 可以读取本说明,当前没有独立的源码操作 MC
174
174
  无需本地工作区,使用本 Skill 随包精确版本或已安装的对应 CLI:
175
175
 
176
176
  ```bash
177
- pnpm dlx openxiangda@2.35.3 auth status --base-url <平台> --json
178
- pnpm dlx openxiangda@2.35.3 source resolve <仓库URL> --base-url <平台> --json
179
- pnpm dlx openxiangda@2.35.3 source clone <仓库URL> <新目录> --base-url <平台> --json
177
+ pnpm dlx openxiangda@2.44.0 auth status --base-url <平台> --json
178
+ pnpm dlx openxiangda@2.44.0 source resolve <仓库URL> --base-url <平台> --json
179
+ pnpm dlx openxiangda@2.44.0 source clone <仓库URL> <新目录> --base-url <平台> --json
180
180
  ```
181
181
 
182
182
  登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
@@ -224,17 +224,22 @@ export function ClaimAction({ offerId }: { offerId: string }) {
224
224
 
225
225
  ```tsx
226
226
  const client = useMemo(() => createManagedConcurrencyClient(), []);
227
- const command = useDurableCommand({client,command:'registration-enroll',resourceKey:activityId,acceptanceRecoveryMs:30*60*1000});
227
+ const command = useDurableCommand({client,command:'registration-enroll',resourceKey:activityId,
228
+ acceptanceRecoveryMs:30*60*1000,discoveryRecoveryMs:30*60*1000});
228
229
  // 仅真实点击提交;不是 useEffect 或页面 mount 回调。
229
230
  const submit = () => command.submit({activity:activityId,channel:channelId,agreed:true,phone});
230
231
  ```
231
232
 
232
- hook 从 `openxiangda/react` 和 `openxiangda/mobile` 导出。state、initialized、isObserving、requestKey、receipt、errorCode 用于统一状态区;submit(input)、resume()、refresh()、stop() 分别为明确提交、用冻结 input 重试原请求、恢复查询和停止观察。挂载只查本地原 key 或服务端 mine,不自动 enqueue。未知应答保留原 key 与 input;用户恢复后先查原结果,不能换 key 重试。浏览器存储失败在提交前明确失败。未知应答后的恢复按钮调用 resume(),不传当前可能已经修改的表单。snapshot.input 可恢复本地冻结表单;跨设备只有回执时不展示推测的原输入。一次明确 submit/resume 期间,429、暂时5xx或网络错误会按原 key/input 自动退避恢复,先查原结果再重试 enqueue,默认最多6次、最长120秒;可用 acceptanceRecoveryMs 明确配置120000至1800000毫秒,更长预算最多120次,遵守更长的 Retry-After。预算从首次明确提交计时,刷新或 resume() 不重置;旧版意图没有时间时从首次明确恢复计时,无法证明更早的提交时间。尚无 receipt 时只能提示“正在确认受理”,不能承诺可关闭页面。用完预算保留原意图,停止自动入队,refresh() 仍可只读核对迟到结果;这不是报名失败。该预算只控制受理恢复,不是后端最终完成时限承诺。如果刷新时原请求尚未被平台受理,挂载只查询,明确点击 resume() 才重新启动有界受理重试。
233
+ hook 从 `openxiangda/react` 和 `openxiangda/mobile` 导出。state、initialized、isObserving、acceptanceConfirmed、requestKey、receipt、errorCode 用于统一状态区;submit(input)、resume()、refresh()、stop() 分别为明确提交、用冻结 input 重试原请求、恢复查询和停止观察。挂载只查本地原 key 或服务端 mine,不自动 enqueue。未知应答保留原 key 与 input;用户恢复后先查原结果,不能换 key 重试。浏览器存储失败在提交前明确失败。未知应答后的恢复按钮调用 resume(),不传当前可能已经修改的表单。snapshot.input 可恢复本地冻结表单;跨设备只有回执时不展示推测的原输入。一次明确 submit/resume 期间,429、暂时5xx或网络错误会按原 key/input 自动退避恢复,先查原结果再重试 enqueue,默认最多6次、最长120秒;可用 acceptanceRecoveryMs 明确配置120000至1800000毫秒,更长预算最多120次,遵守更长的 Retry-After。预算从首次明确提交计时,刷新或 resume() 不重置;旧版意图没有时间时从首次明确恢复计时,无法证明更早的提交时间。尚无已核对归属的受理回执时 acceptanceConfirmed 为 false,只能提示“正在确认受理”,不能承诺可关闭页面。为 true 仅证明此原申请曾持久受理,不代表已成功,也不能替代服务端证明。用完预算保留原意图,停止自动入队,refresh() 仍可只读核对迟到结果;这不是报名失败。该预算只控制受理恢复,不是后端最终完成时限承诺。如果刷新时原请求尚未被平台受理,挂载只查询,明确点击 resume() 才重新启动有界受理重试。
233
234
 
234
- 已受理申请的自动观察最多持续到首次明确提交后的 30 分钟,默认受理恢复仍为 120 秒,两者分别计算。每次结果读取同时受单次 120 秒和原提交剩余时间限制;刷新和 resume 不重新获得观察时间。跨设备没有本地首次时间时,用原回执 acceptedAt 计算观察窗口,不能以页面挂载时间重新计时。达到窗口后保留原意图,状态为 recovering、isObserving 为 false,提示稍后核对;明确 refresh 仍可查询迟到终态,但不重新启动已经到期的自动观察,也不自动提交。
235
+ 初查/refresh 的 discoveryRecoveryMs 默认仍是 120000 毫秒,应用可以显式配置 1 至 1800000 毫秒。上面的 30 分钟是热点应用的主动选择,不会扩大其他应用默认值。一轮发现的原键 result 和必要的 mine 共用固定、单调计时的读取截止;有尚未到期的原申请时还取原提交剩余窗口的较小值。每次底层只读调用在剩余预算大于 120 秒时最多 120 次请求,其他情况最多 12 次,遵守服务端退避与随机抖动。同一控制器的重复 refresh 共用当前任务,stop 后再次挂载可以开始新读取,旧代次的迟到应答不能覆盖新状态。这项预算不续期、不写入,也不为首个提交额外添加等待。
236
+
237
+ 已受理申请的自动观察最多持续到首次明确提交后的 30 分钟,默认受理恢复仍为 120 秒,两者分别计算。自动观察的每次结果读取同时受单次 120 秒和原提交剩余时间限制;刷新和 resume 不重新获得观察时间。跨设备没有本地首次时间时,用原回执 acceptedAt 计算观察窗口,不能以页面挂载时间重新计时。达到窗口后保留原意图,状态为 recovering、isObserving 为 false,提示稍后核对;明确 refresh 仍可用有界初查预算查询迟到终态,但不重新启动已经到期的自动观察,也不自动提交。
235
238
 
236
239
  正常待处理结果每次至少间隔 5 秒,遵守更长的服务端 retryAfterMs,再加随机抖动。单次只读恢复耗尽且仍是已知预算繁忙时,外层可在原观察窗口内指数退避继续;权限、依赖、网络故障或悬挂请求超过读取预算时立即停止自动观察,显示 error 并保留原回执和请求键。终态停止。受理恢复中核对原结果同样只允许已知预算繁忙继续,读取依赖失败不能被外层重试隐藏。一个业务区域只挂载一个观察者。离开或关闭页面不撤销已受理请求,平台自动继续;新设备通过 mine 找到本人的原请求。position 为空时显示「已受理,稍后可查看」,不要显示虚假的精确人数或预计秒数。
237
240
 
238
- refresh 会优先恢复 mine 返回的新进行中周期,避免本地历史 succeeded 遮蔽另一个设备的新申请。不要在 mount 发现历史 succeeded 时自动跳成功页或永久禁用提交。它可能已经被管理员取消,需结合当前业务记录展示。只有用户明确再次点击 submit,且原请求已有终态,SDK 才创建新的 requestKey;活跃请求或未知应答始终恢复原 key。平台明确返回未受理的参数错误(400 + CONCURRENCY_INPUT_INVALID 等约定错误)时,SDK 才清除被拒输入,允许修正后再提交;未知 400、409、429、5xx 和网络错误仍保留原意图。成功提示以 receipt.state==='succeeded' 和 receipt.result 为准,accepted/executing 只显示「已登记,处理中」。
241
+ refresh 有本地原键时先薄查询原 key;找到已受理非终态后不再 mine。没有本地意图或原申请已有终态时,mine 优先恢复新的进行中周期,避免本地历史 succeeded 遮蔽另一个设备的新申请。原键明确 404 后保留一次本人列表兜底;未确认的本地意图只能采用同原键回执。列表中只有别的活跃周期时显示 recovering / CONCURRENCY_ORIGINAL_REQUEST_REQUIRED,并保留原 key/input;没有匹配时显示 CONCURRENCY_ACCEPTANCE_UNCONFIRMED,提供「核对原申请」和「恢复原申请」动作。不能把无匹配解释为业务失败,也不丢弃可能迟到受理的原意图。已知读取繁忙耗尽显示 recovering,真实依赖、网络、权限或未知 400 显示 error;两种状态均保留原键、输入和已受理回执,读取失败不自动提交。
242
+
243
+ 不要在 mount 发现历史 succeeded 时自动跳成功页或永久禁用提交。它可能已经被管理员取消,需结合当前业务记录展示。只有用户明确再次点击 submit,且原请求已有终态,SDK 才创建新的 requestKey;活跃请求或未知应答始终恢复原 key。平台明确返回未受理的参数错误(400 + CONCURRENCY_INPUT_INVALID 等约定错误)时,SDK 才清除被拒输入,允许修正后再提交;未知 400、409、429、5xx 和网络错误仍保留原意图。成功提示以 receipt.state==='succeeded' 和 receipt.result 为准,accepted/executing 只显示「已登记,处理中」。
239
244
 
240
245
  permit 的 ManagedCommandGate 仍只用于 admitted 短确认,不用于 durable。durable 不能套任意前端 onSubmit 冒充后台事务,真正业务必须由已声明的 backend-plan handler 返回受管计划。
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": "openxiangda.documentation/v1",
3
- "version": "2.35.3",
3
+ "version": "2.44.0",
4
4
  "topics": [
5
5
  {
6
6
  "id": "getting-started",
7
7
  "title": "安装与开始开发",
8
8
  "file": "getting-started.md",
9
- "sha256": "f32771aac73fa5cbe2ef41f30f997abb723d18fb48b1fa6418553a7632da073b"
9
+ "sha256": "5a0fd1357652426798651f3a947308abb2a47d391a4c523a4f9739c564ce4d0d"
10
10
  },
11
11
  {
12
12
  "id": "product-design",
@@ -60,7 +60,7 @@
60
60
  "id": "frontend",
61
61
  "title": "页面与标准组件扩展",
62
62
  "file": "frontend.md",
63
- "sha256": "d2e313a5bfffc9aea46e4f9936ae79908588c2a4727824e2b211b886baa1f392"
63
+ "sha256": "9fdc5f950356843dca2dcfad3c0f5ff0d44b5158bd79cbd0f14ae99a48a543cf"
64
64
  },
65
65
  {
66
66
  "id": "field-components",
@@ -84,7 +84,7 @@
84
84
  "id": "workflow-events",
85
85
  "title": "审批、事件与通知",
86
86
  "file": "workflow-events.md",
87
- "sha256": "4dcb4b24aeb1f94f2d8c8261b41b0a602c365eeb68fc89592274397dbb9915e1"
87
+ "sha256": "712024dc7f01a645c458aa98bc53b3ca817909356ca9255c2ab857698f4d66ef"
88
88
  },
89
89
  {
90
90
  "id": "backend",
@@ -114,13 +114,13 @@
114
114
  "id": "managed-concurrency-frontend",
115
115
  "title": "并发能力的前端接入",
116
116
  "file": "managed-concurrency-frontend.md",
117
- "sha256": "0adcbada38bbe2c5775d92f5ca00a232ead076058c6833ebcd9cf9cb798eb0f5"
117
+ "sha256": "0e6c4aa63ae82f7ce8c19c1dea061688c6507cebe93733be715b27fab71afa2e"
118
118
  },
119
119
  {
120
120
  "id": "administration",
121
121
  "title": "应用管理与有效配置",
122
122
  "file": "administration.md",
123
- "sha256": "b023843d340e6664aca09009b2a6d195ce5fc0a92de4c075c2a9db54e99f3b17"
123
+ "sha256": "a5e17ced019746f314bf9a2005b023786308204233565b96ddf3db2150de2216"
124
124
  },
125
125
  {
126
126
  "id": "testing",
@@ -153,13 +153,55 @@ Workflow 发起只接受 `{ resourceCode, id }` 形式的 `dataRef`,并要求
153
153
 
154
154
  ## 标准工作流范围
155
155
 
156
- 首期只支持 `approval`、`condition`、`end`,以及 `single`、`any`、`all`、`sequence` 审批模式。标准操作为提交、同意、拒绝、退回、重新提交、转交、委托、前/后加签、撤回、管理员改派、管理员终止和不改变流程状态的催办。
156
+ 标准节点支持 `approval`、`condition`、`cc`、`end`,以及 `single`、`any`、`all`、`sequence` 审批模式。标准操作为提交、同意、拒绝、退回、重新提交、转交、委托、前/后加签、撤回、管理员改派、管理员终止和不改变流程状态的催办。
157
157
 
158
158
  除命令集之外,平台为实例管理员提供两个维护动作:`admin_jump`(把处于运行或退回状态的实例跳转到指定节点)与 `admin_delete`(删除实例,可选同时删除表单数据、是否触发自动化)。两者走平台管理端点的预览/执行两步流程并要求同源浏览器请求,不属于应用声明的工作流命令,也不占用 `commandToken` 命令合同。
159
159
 
160
160
  复杂业务状态机继续放在应用领域服务。不要把任意 JavaScript、Service Task、BPMN、通用长事务或业务记录复制进 Workflow。
161
161
 
162
162
  所有页面和消息动作必须来自后端 Workflow Surface 的 `operations[]`。前端、模板和渠道 Adapter 不自行推断操作权限。
163
+
164
+ ### 自动抄送 {#automatic-cc}
165
+
166
+ 在固定拓扑中声明 `cc` 节点,进入时解析接收人、保存抄送事实,然后继续 `next`。
167
+ 完整声明例子见 `examples/workflow-administration/automatic-cc.ts`:
168
+
169
+ ```ts
170
+ copy: {
171
+ id: 'copy', kind: 'cc', title: '抄送办理负责人',
172
+ binding: 'readers', next: 'approved', emptyPolicy: 'block',
173
+ administration: { assigneeProviders: ['app_role', 'fixed_users'] },
174
+ },
175
+ ```
176
+
177
+ 接收 binding 支持 `fixed_users`、`initiator`、`input_users`、`form_field_users`、
178
+ `app_role`、`app_role_in_scope`、`previous_node_actor`。仅使用事务内原生来源,
179
+ 不支持 `application_provider` 或需要申请人交互的 `initiator_select`。名单按用户去重,
180
+ 每次进入最多 20 人;`min/max` 默认 1/20,非空名单仍必须符合声明的下限。
181
+ 角色查询超过 200 条有效成员行时明确拒绝,不能使用截断后的名单。
182
+ 范围角色要求对应范围的 `cc` 授权(或未限制操作、`*`),仅 `approve` 不满足。
183
+ 抄送不套用审批代理。
184
+
185
+ `emptyPolicy: 'block'` 在真实空名单时回滚触发动作,补齐人员后可重试原申请或任务;
186
+ `'skip'` 记录无人跳过并继续。未知角色、失效账号、非法输入和超限均属于错误,
187
+ 不会被 skip 吞掉。通知默认开启;`notify: false` 仍保存抄送审计、事件和实例阅读关系,
188
+ Notification Hub 不生成该次抄送消息。渠道失败通过原 Hub 恢复,不回滚流程。
189
+
190
+ 进入记录、系统抄送日志及事件在同一事务提交。原命令重放不重复抄送;退回等导致实际
191
+ 再次进入时产生新轮次,可采用新的兼容节点配置,过去名单和配置保持冻结。时间线显示
192
+ “流程自动抄送”,不会把系统动作记为发起人的人工操作。
193
+
194
+ 接收人可以使用既有抄送列表及实例详情,不获得审批权、后台权限或通用业务数据读取权。
195
+ 标准流程详情由服务器按页面代码声明的固定详情字段投影读取;需要排除敏感字段时,
196
+ 在 `crud.detail` 和 `subject.factProjection` 中明确选择允许字段,不能仅在浏览器隐藏。
197
+ 通用 Data API 继续核验当前数据授权,流程节点不提供字段权限配置。
198
+
199
+ 含 cc 的包自动声明 `workflow.automatic-cc@1.0.0`,平台正式迁移后自动提供该能力,
200
+ 没有额外开关。管理员仅可修改名称、说明及代码显式开放的接收来源,
201
+ `next/emptyPolicy/notify` 保持代码所有;配置 SDK 见[应用管理](./administration.md#node-administration)。
202
+
203
+ ### 工作流命令
204
+
163
205
  Surface 同时签发短期、一次性的 `commandToken`,绑定当前用户/会话、应用环境
164
206
  Head、实例/任务版本、允许的命令集合与 CSRF。命令请求只提交
165
207
  `commandToken + idempotencyKey + input`;旧的 caller-authored
@@ -242,8 +284,8 @@ Native Data 事件的 capture plan 由当前 Head 的 Event、Data、AuthZ revis
242
284
  不是增量 patch。definition 和 activation 必须一致声明
243
285
  `acceptedCommandDeactivationPolicy`:`finish-pinned` 让已接受的 durable process
244
286
  command 按固定版本完成,`cancel-on-deactivate` 在声明删除后取消尚未启动的命令;
245
- 既有 Workflow instance 始终按固定版本继续。所有审批人 Provider 的 `min/max`
246
- 默认 1/200,最大 200。
287
+ 既有 Workflow instance 始终按固定版本继续。审批人 Provider 的 `min/max`
288
+ 默认 1/200,最大 200;自动抄送默认 1/20,最大 20。
247
289
  需要按流程实例串行投递时只声明 `ordering: 'workflow-instance'`,不接受下划线别名。
248
290
 
249
291
  平台按 desired set 直接覆盖环境 Head,不做版本比较。因此 `openxiangda deploy`
@@ -402,3 +444,171 @@ readability: {
402
444
  说明的执行位置只能是 submission、某节点的 node_input 或 completion。它是对已有逻辑的注释,不会自动执行计算或产生新流程节点。没有实际计算步骤时,不应写成“系统已计算总金额”。条件的变量必须存在于输入 Schema;对旧未标注定义,读取投影会明确给出未知来源诊断。
403
445
 
404
446
  可选 `source: { path, symbol?, digest }` 只返回源码位置和 SHA256,不返回源码内容。path 指向工作区 apps/packages/platform 下的代码文件,digest 为 `sha256:<原始文件字节摘要>`。工作区加载时核对文件存在、无符号链接、大小和摘要;源码变化后以 WORKFLOW_LOGIC_DESCRIPTION_STALE 阻止封装,开发者应核实说明并更新引用。32 个文件、单文件 2MiB、总量 8MiB 为上限。元数据不能验证任意 TypeScript 的业务含义,业务说明及验收仍由开发者维护。
447
+
448
+ ## 持久业务步骤
449
+
450
+ 必须收到业务计算或外部操作结果后才继续的流程,用固定 `action` 节点。平台自动
451
+ 提供 `workflow.durable-business-step@1.0.0`;应用包含动作时自动声明能力需求并
452
+ 按需引导标准 Nest 后端,普通无动作应用保持原合同。字段显隐/编辑/必填继续由
453
+ 页面代码负责;动作版本、Schema、条件和连线只由开发者发布。
454
+
455
+ ```ts
456
+ const amountSchema = { type: 'object', additionalProperties: false,
457
+ required: ['amountCents'], properties: { amountCents: { type: 'integer', minimum: 0 } } };
458
+ // 放入已声明流程的 nodes;amount-route 必须是同一固定定义中的真实目标。
459
+ const calculate = {
460
+ id: 'calculate', kind: 'action', title: '核算金额', next: 'amount-route',
461
+ handler: { code: 'calculate-v1', version: 1, mode: 'pure' },
462
+ inputSchema: amountSchema, outputSchema: amountSchema,
463
+ inputs: { amountCents: { source: 'fact', path: 'amountCents' } },
464
+ };
465
+ // 放入 events.subscriptions;应用 backend.enabled=true,消费 generated manifest。
466
+ const subscription = {
467
+ code: 'calculate-v1', eventTypes: ['openxiangda.workflow.step.requested.v2'],
468
+ filter: { workflowStep: { handlerCode: 'calculate-v1' } },
469
+ payload: { includeChanges: false, fields: [] },
470
+ };
471
+ ```
472
+
473
+ 成功输出写入 `steps.calculate.amountCents`。后续条件或动作只能读取每条路径上
474
+ 已经完成的生产者;前向/自引用、非法路径和输入类型不兼容会拒绝编译。步骤后
475
+ 需要 HTTP provider 或发起人选人的组合暂不支持,先在动作中产生有 Schema 的
476
+ 人员数据,再使用原生人员字段/角色分派。示例见
477
+ `examples/workflow-administration/business-step.ts`。
478
+
479
+ Nest 使用 `@OpenXiangdaEventHandler(generatedContract)` 注册实现,`handle` 返回
480
+ `{ output, receipt? }`;上下文 `workflowStep` 包含验证过的固定请求,
481
+ `idempotencyKey` 是稳定 executionId。不得通过返回值任意指定下一节点或调用
482
+ Workflow 跳转。使用标准 `PlatformOpenXiangdaEventReceiptStore`;内存 receipt
483
+ 不能完成业务步骤。
484
+
485
+ `pure` 用于无外部效果的计算;`reconciled-effect` 必须实现 `reconcile(event,
486
+ context)`:成功返回 `{ status:'succeeded', result:{output,receipt?} }`,确定未执行
487
+ 返回 `{status:'not-executed'}`,无法确定返回 `{status:'unknown'}`。每次尝试先
488
+ 核对原执行键,未知结果需要人工核对后重放原事件。增加v2时保留v1合同及代码;
489
+ 旧具名版本合同不可变,缺失实现明确失败,不自动改用最新版本。
490
+
491
+ 输入输出各16KiB、回执2KiB,最多32映射、200节点;Schema闭合且有界,无远端
492
+ 引用或正则执行。平台先持久保存合法结果,再尝试流转;下游缺人等失败保留
493
+ `result_ready`,恢复仅推进,不再次执行处理器。自动恢复最多5次,每批20;
494
+ outbox容量等事务故障会回滚,处理器按原键核对后重交,不承诺跨服务绝对一次。
495
+ 撤回后的未领取步骤拒绝执行,已开始的外部操作仍需原键核对。
496
+
497
+ 管理员在标准实例管理页或 `WorkflowBusinessStepRecoveryPanel` 查看并继续受阻
498
+ 步骤;公开客户端为 `loadWorkflowBusinessStepRecovery`、
499
+ `previewWorkflowBusinessStepRecovery`、`executeWorkflowBusinessStepRecovery`。
500
+ 复用原管理权限/token/CAS/CSRF/审计,提交失败保留相同token/input/idempotencyKey。
501
+ 组件通过 `onDraftStateChange` 报告 dirty/busy/unknown;宿主将其接入已有导航保护,
502
+ 提交中或结果未知时保留组件和实例。未知结果只允许显式重试原恢复请求;首次明确
503
+ 的4xx拒绝可保留原因并重新预览。宿主刷新失败不改变已经确认的提交结果。
504
+ 等待处理器的失败从原事件管理受控重放,保留原执行键。普通详情只显示安全状态
505
+ 摘要;原输入、输出和外部回执不放入普通时间线。
506
+
507
+ ## 代码任务页面与补填 {#task-page-submit}
508
+
509
+ 需要办理人补填时,在定义的 `taskPages` 声明命名页面,审批节点以
510
+ `taskPageCode` 引用。页面字段顺序、`readonly`、`required`、`visibleWhen` 和
511
+ `requiredWhen` 属于应用代码;流程管理员不能覆盖页面字段、条件或连线。
512
+ 字段类型和编码来自同一个 Native 模型。例子见
513
+ `examples/workflow-administration/task-page.ts`。
514
+
515
+ 页面表达式只读取本页 `values.*`,平台以合并后的业务值强制显隐和必填。
516
+ 最多16页、每页64字段、单次值64KiB,表达式8层/64节点。
517
+ 系统、流水号和隐藏字段不可作为补填入口。根附件、图片复用平台托管文件;
518
+ 签名、子表和富文本仍需后续任务页面支持,不将它们降为任意 JSON。
519
+
520
+ 标准 PC/手机任务页和 `WorkflowTaskOperationsPanel` 自动显示当前参与人的
521
+ `surface.taskForm`。`save_form` 表示“提交补填,继续办理”,不是私有草稿。
522
+ approve/resubmit 携带 `form: { expectedRevision, values }` 时,Native 业务更新、
523
+ 事实刷新、任务决定和下游流转同事务提交。reject/return/transfer 等操作不得
524
+ 夹带表单。审批人仅获得当前任务对应的单记录/页面字段入口,不获得通用 CRUD。
525
+
526
+ 相同幂等键不同输入拒绝;结果未知时保留原 token/input/key。共享组件锁定
527
+ 编辑,只重试原请求或调用 `loadWorkflowTaskCommandReceipt(taskId, key, tokenDigest)`
528
+ 查询本人原回执。重载只保存定位信息和 SHA256 token 摘要,不保存凭据或表单。
529
+ `not_observed` 仍然未知;只有平台锁住确切凭证、确认数据库时间已过期且未使用
530
+ 的 `expired_unconsumed` 才能解除等待,供用户核对资料后重新确认。
531
+ 组件复用宿主的 `OpenXiangdaApplication` 导航保护;成功后刷新失败不变成提交失败。
532
+
533
+ 嵌入自定义详情时,可用 `renderLayout={({ content, actions, surface }) => ...}` 将补填表单和
534
+ 恢复提示放在可滚动正文,将操作按钮放在底栏。两部分始终使用同一个任务面板,
535
+ 不要分别创建两个面板或复制其表单、请求和回执状态。`surface` 是面板当前实际展示的
536
+ 资料,自定义详情用它显示刷新后的字段;加载或无可用资料时为空。标准详情已采用该布局。
537
+
538
+ 多人补填与管理纠错使用 Native 记录 CAS,冲突保留输入。首次请求的明确拒绝会只读刷新,
539
+ 修订变化时对照最新已保存值和本人输入,核对前锁住字段与操作;可选择保留输入或采用最新值。
540
+ 拒绝后的读取失败明确提示本次未提交,锁住旧操作,恢复读取后再核对;未知结果仍只能恢复原请求。
541
+ 补填刷新固定事实投影;
542
+ 修改已计算步骤的输入时清除当前失效输出及依赖输出。仅退回 replay 且所有前向
543
+ 审批路径确定重经生产者时允许;resume_current 或后置补填跳过重算会返回
544
+ `WORKFLOW_TASK_FORM_RECOMPUTATION_REQUIRED` 并回滚,历史结果与签名保持。
545
+ 自动能力为 `workflow.task-page-submit@1.0.0`,平台初始化无需额外开关。
546
+
547
+ ### 任务私有草稿
548
+
549
+ 标准PC/手机任务页和嵌入面板提供“保存私有草稿”“我的草稿”。暂存仅本人可见,
550
+ 不会更新业务资料、事实、待办或推进任务;可以保存尚未完成必填的标量输入。
551
+ 页面的显隐/只读规则和Native类型仍强制,管理员没有字段覆盖或读取他人草稿的入口。
552
+
553
+ 自定义页面从 `openxiangda/core` 或 `openxiangda/react` 调用
554
+ `loadWorkflowTaskDrafts(taskId)`、`saveWorkflowTaskDraft(taskId, input)` 和
555
+ `removeWorkflowTaskDraft(taskId, { id, expectedRevision })`。
556
+ 保存输入为 `{ id, expectedRevision, recordRevision, values }`:首写前固定UUID及
557
+ `expectedRevision: 0`;recordRevision来自当前taskForm.expectedRevision。
558
+ 身份、环境、业务记录和固定页面由平台派生,不传actor/resource/page作为授权。
559
+ 可编译例子见 `examples/workflow-administration/task-draft.ts`。
560
+
561
+ 最多20份/90天与同用户、应用、环境、资源的其他表单草稿共享,单份最多64字段/64KiB。
562
+ 字段支持根附件、图片,暂不包含签名、富文本或子表。读到不兼容草稿时只返回安全标识与诊断,
563
+ 不静默丢弃或泄露旧值。失去任务、角色或代理资格后不能继续读/用。
564
+
565
+ 读取不会自动覆盖输入;采用前确认,业务基线变化先核对并再次保存。相同输入暂存成功后
566
+ 可安全离开,后续新编辑恢复导航保护;浏览器持久存储不保存字段值。
567
+ 结果未知保留原id/CAS/values,仅核对同id或重试原保存;同一次最后保存确认不新增修订,
568
+ 其他CAS冲突保留输入。新id必须是用户明确另存,不能用自动另存掩盖未知结果。
569
+
570
+ 正式 `form: { expectedRevision, values, draft: { id, expectedRevision } }` 可以包含暂存之后的新编辑。
571
+ 平台锁住本人草稿及业务基线,再沿原save_form/approve/resubmit命令同事务更新业务并消费,
572
+ 失败全部回滚。原成功命令重试先返回唯一Workflow回执,不因草稿已消费重复写入。
573
+ 任务真正关闭才过期未消费草稿,all/sequence任务仍可办理时保留其他人的有效草稿。
574
+ 能力 `workflow.task-private-drafts@1.0.0` 自动提供,无额外配置开关。
575
+
576
+ ### 任务附件与图片
577
+
578
+ 当前任务的可编辑 `file/image` 字段自动接入标准 PC/手机上传、缩略图、预览和下载。
579
+ 当前处理资格不授通用资源 CRUD;平台从固定任务派生记录、页面、身份和环境,
580
+ 上传时还核验**已保存业务资料对应的页面状态**。局部修改才显示附件字段时,
581
+ 先“保存补填”使字段生效,再上传;组件说明此边界,不自动提交业务值。
582
+
583
+ 自定义页面可从 `openxiangda/core` 或 `openxiangda/react` 调用:
584
+
585
+ ```ts
586
+ const input = { id: crypto.randomUUID(), fieldCode: 'evidence',
587
+ fileName: file.name, fileSize: file.size, contentType: file.type };
588
+ const plan = await initiateWorkflowTaskFileUpload(taskId, input);
589
+ // pending 才按 plan.uploadMethod/uploadUrl/headers 上传原 File;ready 直接采用 plan.file。
590
+ const readyFile = await completeWorkflowTaskFileUpload(taskId, input.id);
591
+ // 结果未知时:loadWorkflowTaskFileUploadPlan(taskId, input.id),或重试同 ID/规格。
592
+ ```
593
+
594
+ 上传 ID 必须在第一次请求前固定。标准组件一次处理一个文件;上传中或结果未知时
595
+ 保留原 File、ID、规格和当前输入,锁住新任务动作与草稿写入,提供“核对原上传”
596
+ 和“重试原上传”。ready 结果不再 PUT;完成响应丢失后只恢复原完成结果。
597
+ 文件字节、签名地址与表单值不进入浏览器持久存储。离开未完成上传时需先确认结果。
598
+
599
+ 预览字段组件传入 `workflowFileBinding: { taskId, resourceCode, recordId, fieldCode }`;
600
+ 正式实例详情使用原 `instanceId` binding。同一 binding 只提供一种范围。
601
+ 仅本人当前任务可读私有暂存文件,其他处理人和管理员没有私有读取特权。
602
+ 当前根业务记录已经引用的文件可按该任务页面规则读取;隐藏、资格失效或任务关闭后拒绝。
603
+ 通用 Native 完成、删除和未绑定文件读取不能绕过此范围。
604
+
605
+ 附件完成后仍只是当前输入;私有草稿延长文件保留至该草稿到期,业务绑定再移除引用
606
+ 仍尊重该保留期。原 save_form/approve/resubmit 验证真实文件状态、字段、范围与元数据,
607
+ 同事务提交业务引用、事实、任务决定和草稿消费;失败全回滚。完成上传时平台复制为
608
+ 独占正式对象,旧上传地址不能再修改正式字节。
609
+
610
+ 单文件不超过字段限制与100MiB;每账号/应用/环境最多100个尚未业务绑定的任务文件,
611
+ 声明大小合计200MiB。此大小是上传容量预算,staging/正式对象与缩略图另有存储开销。
612
+ 复用既有 Native 文件引用 worker 和 GC;流式正式复制限时10秒。
613
+ 需要服务端正式 SQL `AddWorkflowTaskManagedFilesV2` 和自动能力
614
+ `workflow.task-managed-files@1.0.0`,初始化无需新增开关。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openxiangda",
3
- "version": "2.35.3",
3
+ "version": "2.44.0",
4
4
  "description": "OpenXiangda 2.0 的统一命令、应用 SDK、MCP 与中文 AI 技能资料。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -66,13 +66,13 @@
66
66
  "dayjs": "1.11.18",
67
67
  "docx-preview": "0.3.7",
68
68
  "elkjs": "0.12.0",
69
- "openxiangda-cli": "2.6.21",
70
- "openxiangda-contracts": "2.35.0",
71
- "openxiangda-devkit-core": "2.36.0",
69
+ "openxiangda-cli": "2.6.37",
70
+ "openxiangda-contracts": "2.43.0",
71
+ "openxiangda-devkit-core": "2.41.2",
72
72
  "openxiangda-legacy": "npm:openxiangda@1.0.269",
73
- "openxiangda-mcp": "2.0.63",
74
- "openxiangda-nest": "2.11.1",
75
- "openxiangda-skill-kit": "2.3.41",
73
+ "openxiangda-mcp": "2.0.73",
74
+ "openxiangda-nest": "2.13.3",
75
+ "openxiangda-skill-kit": "2.3.52",
76
76
  "xlsx": "https://github.com/1377385356/openxiangda/releases/download/vendor-mirror/xlsx-0.20.3.tgz"
77
77
  },
78
78
  "peerDependencies": {
@@ -138,49 +138,39 @@
138
138
  },
139
139
  "openxiangdaRelease": {
140
140
  "schemaVersion": "openxiangda.release-notes/v1",
141
- "version": "2.35.3",
141
+ "version": "2.44.0",
142
142
  "status": "reviewed",
143
- "title": "OpenXiangda 2.35.3:运行时繁忙恢复与可读流程图",
144
- "summary": "应用进入时可有界等待平台明确的繁忙响应,同身份刷新保留页面和原申请;流程图使用与不可变执行定义同源的投影展示说明、变量来源与实例路径。",
143
+ "title": "OpenXiangda 2.44.0:当前任务的托管附件与图片",
144
+ "summary": "代码任务页面支持根附件与图片,普通审批人通过固定任务上传和预览,草稿保留和正式流程提交复用平台文件生命周期。",
145
145
  "newFeatures": [
146
- "现有运行时 current 读取在明确的入口繁忙时按服务端提示和抖动退避,最长等待五分钟、最多一百二十次读取,并支持离页取消。",
147
- "公开 WorkflowReadability、validateWorkflowReadability、projectWorkflowGraph 及共享 WorkflowDiagram,展示流程说明、条件优先级、变量来源和持久执行决定对应的路径,支持搜索、键盘及窄屏节点列表。",
148
- "流程图使用懒加载 React Flow 与 ELK 正交布局,支持直角连线、平移缩放、节点定位、分支条件标签和缩略导航。",
149
- "审批节点可显式声明管理员可调整的模式、人员来源和按钮上限;编译器复用有界校验,SDK 提供配置读取、CAS 更新和幂等回执,任务冻结有效配置。"
146
+ "任务文件 SDK 支持固定 ID 的原计划与完成恢复,标准 PC/手机上传及预览自动接入。",
147
+ "编译器按可编辑任务文件申请 workflow.task-managed-files 自动能力,无额外默认关闭开关。"
150
148
  ],
151
149
  "fixes": [
152
- "启动、焦点和可见性检查合并挂起身份读取;同身份刷新保留已验证页面和草稿,临时服务故障可重新检查,真实身份、环境、权限作用域变化或拒绝使旧受管客户端失效。",
153
- "退出通知优先于仍在加载的身份请求,旧响应和取消回调不会恢复旧身份或覆盖登录入口。验证 current 成功后仅清除当前路径的入口等待截止。",
154
- "安全只读传输故障最多三次总尝试;权限投影等待保留原十秒限制,普通应用请求和写入不会因本次修改自动重放。",
155
- "管理员流程节点配置使用平台已有的 admin controller,修正上下文、配置读取和保存地址,保留环境、CAS、幂等操作标识与权限拒绝。",
156
- "管理员流程节点配置保留平台返回的具体冲突错误码,页面可准确提示配置修订和幂等冲突。",
157
- "StrictMode 同一提交的清理、重挂载接管原 current owner,避免重复初始化读取;观察取消立即生效,无人接管时释放共享请求,安装身份必须仍有活跃观察者,原读取预算与退出优先级保留。",
158
- "标准任务和实例详情按应用声明返回对应设备的用户流程中心,避免普通申请人被带入管理后台;独立详情组件可显式指定返回路径,抽屉关闭和页面授权保持原行为。"
150
+ "上传结果未知时保留原文件与请求并锁住新流程动作和草稿写入;ready 结果不再次 PUT。",
151
+ "任务表单和本人草稿比较使用任务文件范围,避免依赖通用 CRUD 预览资格。"
159
152
  ],
160
153
  "affectedUsers": [
161
- "使用 V2 运行时及持久排队能力的活动报名、预约、抢票应用开发者。",
162
- "需要展示不可变流程定义、说明及实例执行路径,或启用有界审批节点配置的平台维护者和应用开发者。"
154
+ "声明 file/image 任务补填页面的 V2 应用开发者、办理人和平台维护者。"
163
155
  ],
164
156
  "upgradeSteps": [
165
- "将应用 openxiangda 精确升级到 2.35.3;平台流程图消费者将 openxiangda-contracts 精确升级到 2.35.0,同批工具链使用 openxiangda-devkit-core 2.36.0 和 openxiangda-cli 2.6.21,更新锁文件。",
166
- "统一验证运行时繁忙恢复、同身份刷新、退出与真实身份切换,以及流程图说明与持久执行路径后发布同一冻结候选;启用管理员节点配置时确认平台支持 workflow.node-administration。",
167
- "在目标服务器另外测量完整页面进入、提交、自然结果查询及最终处理时间;客户端恢复测试不作为硬件并发容量证据。"
157
+ "消费同批本地 SDK/contracts 与匹配平台 Server,应用迁移 AddWorkflowTaskManagedFilesV2,刷新资料并重启。",
158
+ "局部修改才显示附件字段时先保存补填,再上传;自定义页面固定上传 UUID,并保留原请求处理未知结果。"
168
159
  ],
169
160
  "knownLimitations": [
170
- "运行时繁忙恢复只用于现有 current 读取;未知 429、权限或版本拒绝和非繁忙依赖失败不扩展等待,初始化成功不表示业务请求已经受理。",
171
- "本次发布保留持久申请的原请求键、观察截止和自然轮询策略;队列的受理、执行和最终结果仍由平台负责。",
172
- "流程图说明不改变不可变执行定义及持久实例决定,不补造不存在的执行边,也不改变流程授权。",
173
- "管理员节点配置只调整应用明确开放的边界,字段行为继续由应用页面与代码维护;未声明该能力的应用不启用新的配置入口。"
161
+ "本轮交付根 file/image,签名、富文本和 owned 子表仍按后续任务页面切片验证。",
162
+ "上传资格依据已保存资料的页面状态;管理员不能配置字段权限。",
163
+ "本轮是本地迁移实验,npm 发布与学校生产迁移分别另行执行。"
174
164
  ],
175
165
  "issues": [],
176
166
  "compatibility": {
177
167
  "node": ">=24",
178
168
  "workspaceGenerations": "v2",
179
- "platform": "入口繁忙恢复需要平台提供 CONCURRENCY_BOOTSTRAP_BUSY 或 CONCURRENCY_API_BUSY 契约;可读流程图需要匹配的只读平台接口,管理员节点配置需要 workflow.node-administration 能力。持久排队沿用 data.managed-concurrency.durable@1.0.0。",
180
- "v1": "V1 分发引擎及业务不变。"
169
+ "platform": "workflow.task-managed-files@1.0.0 与 AddWorkflowTaskManagedFilesV2",
170
+ "v1": "1.x 引擎独立,本轮不改变其上传入口。"
181
171
  },
182
- "sha256": "31ce7268d3e443bf8fd5d26f0be82be6b1a24ff22f25d0735c7abf4a83fe92dd",
183
- "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.35.3"
172
+ "sha256": "b4d4027b81772f5c63ef0638b7ffa9c73374799a398bd17c8828ed126410e4da",
173
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.44.0"
184
174
  },
185
175
  "scripts": {
186
176
  "build": "node ../../scripts/prune-package-dist.mjs && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
@@ -0,0 +1,38 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.43.0",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.43.0:持久命令的有界发现与原申请恢复",
6
+ "summary": "热点应用可显式延长只读发现预算,刷新合并并优先核对原键;未知受理保留原申请与输入,避免误报排队成功。",
7
+ "newFeatures": [
8
+ "DurableCommandOptions 与 useDurableCommand 新增 discoveryRecoveryMs,默认 120 秒,可显式配置最长 30 分钟;每次发现共享固定截止。",
9
+ "DurableCommandSnapshot 新增 acceptanceConfirmed,供界面区分已确认受理与仍需核对的原申请。"
10
+ ],
11
+ "fixes": [
12
+ "已确认非终态优先读取原键,原键 404 保留受控本人列表兜底;未确认原意图不会被其他周期覆盖。",
13
+ "重复刷新合并,停止后重新挂载可重新只读发现;回执同时核对原键、operationId 和作用域。",
14
+ "CLI 内置模板与同批 SDK 精确版本同步,中文接入资料随 skill-kit 发布。"
15
+ ],
16
+ "affectedUsers": [
17
+ "使用持久命令排队提交、原申请恢复的 V2 页面开发者及应用用户。"
18
+ ],
19
+ "upgradeSteps": [
20
+ "安装同批正式 openxiangda 包,刷新技能资料并重启应用;按应用需求显式配置 discoveryRecoveryMs。",
21
+ "排队文案以 acceptanceConfirmed 为准,未知受理提供显式恢复原申请操作,不在挂载时重放提交。",
22
+ "本轮能力不要求新服务端契约或 SQL;使用此前新增的工作流能力时仍需对应平台正式迁移与服务端版本。"
23
+ ],
24
+ "knownLimitations": [
25
+ "延长只读发现预算不会延长原首次提交的受理或观察窗口,也不会自动补单。",
26
+ "单元与发行门禁不证明实际服务器容量;入口、受理和本人结果须在目标环境独立测量。",
27
+ "浏览器尚未取得受理回执时,离页不能保证原申请已经进入后台队列。"
28
+ ],
29
+ "issues": [],
30
+ "compatibility": {
31
+ "node": ">=24",
32
+ "workspaceGenerations": "v2",
33
+ "platform": "现有 managed concurrency durable command 契约;新增恢复选项为可选。",
34
+ "v1": "V1 引擎保持独立,本轮无行为变更。"
35
+ },
36
+ "sha256": "456c5671abc109c2cadc82bd22ae82adb2756293b63ee79aad941fc3450138d3",
37
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.43.0"
38
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.44.0",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.44.0:当前任务的托管附件与图片",
6
+ "summary": "代码任务页面支持根附件与图片,普通审批人通过固定任务上传和预览,草稿保留和正式流程提交复用平台文件生命周期。",
7
+ "newFeatures": [
8
+ "任务文件 SDK 支持固定 ID 的原计划与完成恢复,标准 PC/手机上传及预览自动接入。",
9
+ "编译器按可编辑任务文件申请 workflow.task-managed-files 自动能力,无额外默认关闭开关。"
10
+ ],
11
+ "fixes": [
12
+ "上传结果未知时保留原文件与请求并锁住新流程动作和草稿写入;ready 结果不再次 PUT。",
13
+ "任务表单和本人草稿比较使用任务文件范围,避免依赖通用 CRUD 预览资格。"
14
+ ],
15
+ "affectedUsers": [
16
+ "声明 file/image 任务补填页面的 V2 应用开发者、办理人和平台维护者。"
17
+ ],
18
+ "upgradeSteps": [
19
+ "消费同批本地 SDK/contracts 与匹配平台 Server,应用迁移 AddWorkflowTaskManagedFilesV2,刷新资料并重启。",
20
+ "局部修改才显示附件字段时先保存补填,再上传;自定义页面固定上传 UUID,并保留原请求处理未知结果。"
21
+ ],
22
+ "knownLimitations": [
23
+ "本轮交付根 file/image,签名、富文本和 owned 子表仍按后续任务页面切片验证。",
24
+ "上传资格依据已保存资料的页面状态;管理员不能配置字段权限。",
25
+ "本轮是本地迁移实验,npm 发布与学校生产迁移分别另行执行。"
26
+ ],
27
+ "issues": [],
28
+ "compatibility": {
29
+ "node": ">=24",
30
+ "workspaceGenerations": "v2",
31
+ "platform": "workflow.task-managed-files@1.0.0 与 AddWorkflowTaskManagedFilesV2",
32
+ "v1": "1.x 引擎独立,本轮不改变其上传入口。"
33
+ },
34
+ "sha256": "b4d4027b81772f5c63ef0638b7ffa9c73374799a398bd17c8828ed126410e4da",
35
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.44.0"
36
+ }
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "name": "openxiangda-v2",
6
6
  "description": "使用 OpenXiangda 2.0 从模糊业务想法、已有资料或具体变更出发,通过对话发现模块、完成详细产品设计,由当前 AI Agent 按需用 Image 2.5 等图片能力形成视觉参考,直接实现真实页面并在浏览器修正,再检查和交付应用;维护 1.x 应用时使用对应的 1.x 技能。",
7
- "sha256": "e70281f337585990895c4f75765c55b759167506656749d865fc749b6c2419ac"
7
+ "sha256": "9350d7e567e877208b86929f0eeedade792f9750989ca08055061092c980ec37"
8
8
  }
9
9
  ]
10
10
  }
@@ -40,10 +40,10 @@ AI 接到新应用、页面或改版任务时,在同一个 OpenXiangda 工作
40
40
  未创建工作区时使用本 Skill 随根包发布的精确版本:
41
41
 
42
42
  ```bash
43
- pnpm dlx openxiangda@2.35.3 auth status --cwd <应用目录> --base-url <平台地址> --json
44
- pnpm dlx openxiangda@2.35.3 login --cwd <应用目录> --base-url <平台地址>
45
- pnpm dlx openxiangda@2.35.3 create <应用目录> --base-url <同一平台地址>
46
- pnpm dlx openxiangda@2.35.3 skill install --force
43
+ pnpm dlx openxiangda@2.44.0 auth status --cwd <应用目录> --base-url <平台地址> --json
44
+ pnpm dlx openxiangda@2.44.0 login --cwd <应用目录> --base-url <平台地址>
45
+ pnpm dlx openxiangda@2.44.0 create <应用目录> --base-url <同一平台地址>
46
+ pnpm dlx openxiangda@2.44.0 skill install --force
47
47
  ```
48
48
 
49
49
  创建前把产品要求的目标平台明确带入命令,不从旧登录态推断站点。已有工作区从原绑定恢复,平台不一致时先解决登录与目标,不改 link 文件跨站创建。