openxiangda 2.55.1 → 2.59.2

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 (152) hide show
  1. package/README.md +1 -0
  2. package/dist/browser/AuthoritativeSelector.d.ts +3 -2
  3. package/dist/browser/AuthoritativeSelector.d.ts.map +1 -1
  4. package/dist/browser/AuthoritativeSelector.js +20 -11
  5. package/dist/browser/AuthoritativeSelector.js.map +1 -1
  6. package/dist/browser/components/platform-fields/DateTimeField.d.ts +1 -1
  7. package/dist/browser/components/platform-fields/DateTimeField.d.ts.map +1 -1
  8. package/dist/browser/components/platform-fields/DateTimeField.js +15 -8
  9. package/dist/browser/components/platform-fields/DateTimeField.js.map +1 -1
  10. package/dist/browser/components/platform-fields/MobileDateTimeField.d.ts +1 -1
  11. package/dist/browser/components/platform-fields/MobileDateTimeField.d.ts.map +1 -1
  12. package/dist/browser/components/platform-fields/MobileDateTimeField.js +5 -3
  13. package/dist/browser/components/platform-fields/MobileDateTimeField.js.map +1 -1
  14. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.js +2 -2
  15. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.js.map +1 -1
  16. package/dist/browser/components/platform-fields/ResourceReferenceField.d.ts +3 -2
  17. package/dist/browser/components/platform-fields/ResourceReferenceField.d.ts.map +1 -1
  18. package/dist/browser/components/platform-fields/ResourceReferenceField.js +3 -3
  19. package/dist/browser/components/platform-fields/ResourceReferenceField.js.map +1 -1
  20. package/dist/browser/components/platform-fields/SubtableField.d.ts +11 -2
  21. package/dist/browser/components/platform-fields/SubtableField.d.ts.map +1 -1
  22. package/dist/browser/components/platform-fields/SubtableField.js +55 -24
  23. package/dist/browser/components/platform-fields/SubtableField.js.map +1 -1
  24. package/dist/browser/components/platform-fields/ZonedDateTimeField.js +2 -2
  25. package/dist/browser/components/platform-fields/ZonedDateTimeField.js.map +1 -1
  26. package/dist/browser/components/platform-fields/reference-binding-change.d.ts +6 -0
  27. package/dist/browser/components/platform-fields/reference-binding-change.d.ts.map +1 -0
  28. package/dist/browser/components/platform-fields/reference-binding-change.js +32 -0
  29. package/dist/browser/components/platform-fields/reference-binding-change.js.map +1 -0
  30. package/dist/browser/components/platform-fields/user-candidate-context.d.ts +3 -0
  31. package/dist/browser/components/platform-fields/user-candidate-context.d.ts.map +1 -1
  32. package/dist/browser/components/platform-fields/user-candidate-context.js +12 -4
  33. package/dist/browser/components/platform-fields/user-candidate-context.js.map +1 -1
  34. package/dist/browser/components/platform-fields/zoned-date-time.d.ts +4 -0
  35. package/dist/browser/components/platform-fields/zoned-date-time.d.ts.map +1 -1
  36. package/dist/browser/components/platform-fields/zoned-date-time.js +9 -1
  37. package/dist/browser/components/platform-fields/zoned-date-time.js.map +1 -1
  38. package/dist/browser/components/resource/GeneratedResourceCrud.d.ts.map +1 -1
  39. package/dist/browser/components/resource/GeneratedResourceCrud.js +2 -2
  40. package/dist/browser/components/resource/GeneratedResourceCrud.js.map +1 -1
  41. package/dist/browser/components/resource/GeneratedResourceForm.js +2 -2
  42. package/dist/browser/components/resource/GeneratedResourceForm.js.map +1 -1
  43. package/dist/browser/components/resource/ResourceFormFrame.d.ts +1 -1
  44. package/dist/browser/components/resource/ResourceFormFrame.d.ts.map +1 -1
  45. package/dist/browser/components/resource/ResourceFormFrame.js +12 -1
  46. package/dist/browser/components/resource/ResourceFormFrame.js.map +1 -1
  47. package/dist/browser/components/resource/SurfaceFields.d.ts +5 -1
  48. package/dist/browser/components/resource/SurfaceFields.d.ts.map +1 -1
  49. package/dist/browser/components/resource/SurfaceFields.js +13 -5
  50. package/dist/browser/components/resource/SurfaceFields.js.map +1 -1
  51. package/dist/browser/components/resource/generated-resource-definition.d.ts +1 -0
  52. package/dist/browser/components/resource/generated-resource-definition.d.ts.map +1 -1
  53. package/dist/browser/components/resource/resource-field-selection.d.ts +1 -0
  54. package/dist/browser/components/resource/resource-field-selection.d.ts.map +1 -1
  55. package/dist/browser/components/resource/resource-form-operations.d.ts.map +1 -1
  56. package/dist/browser/components/resource/resource-form-operations.js +3 -2
  57. package/dist/browser/components/resource/resource-form-operations.js.map +1 -1
  58. package/dist/browser/components/resource/useResourceFormDrafts.d.ts.map +1 -1
  59. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts +15 -3
  60. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts.map +1 -1
  61. package/dist/browser/components/workflow/StandardWorkflowPages.js +80 -20
  62. package/dist/browser/components/workflow/StandardWorkflowPages.js.map +1 -1
  63. package/dist/browser/components/workflow/WorkflowDelegationManager.js +13 -8
  64. package/dist/browser/components/workflow/WorkflowDelegationManager.js.map +1 -1
  65. package/dist/browser/components/workflow/WorkflowDiagram.d.ts.map +1 -1
  66. package/dist/browser/components/workflow/WorkflowDiagram.js +5 -2
  67. package/dist/browser/components/workflow/WorkflowDiagram.js.map +1 -1
  68. package/dist/browser/components/workflow/WorkflowFlowCanvas.d.ts.map +1 -1
  69. package/dist/browser/components/workflow/WorkflowFlowCanvas.js +2 -1
  70. package/dist/browser/components/workflow/WorkflowFlowCanvas.js.map +1 -1
  71. package/dist/browser/components/workflow/WorkflowNodeCard.d.ts +1 -1
  72. package/dist/browser/components/workflow/WorkflowNodeCard.d.ts.map +1 -1
  73. package/dist/browser/components/workflow/WorkflowNodeCard.js +7 -5
  74. package/dist/browser/components/workflow/WorkflowNodeCard.js.map +1 -1
  75. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.d.ts.map +1 -1
  76. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js +14 -11
  77. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js.map +1 -1
  78. package/dist/browser/components/workflow/WorkflowTaskForm.d.ts +3 -1
  79. package/dist/browser/components/workflow/WorkflowTaskForm.d.ts.map +1 -1
  80. package/dist/browser/components/workflow/WorkflowTaskForm.js +17 -8
  81. package/dist/browser/components/workflow/WorkflowTaskForm.js.map +1 -1
  82. package/dist/browser/components/workflow/standard-process-values.d.ts +10 -2
  83. package/dist/browser/components/workflow/standard-process-values.d.ts.map +1 -1
  84. package/dist/browser/components/workflow/standard-process-values.js +22 -1
  85. package/dist/browser/components/workflow/standard-process-values.js.map +1 -1
  86. package/dist/browser/components/workflow/workflow-flow-layout.d.ts.map +1 -1
  87. package/dist/browser/components/workflow/workflow-flow-layout.js +33 -3
  88. package/dist/browser/components/workflow/workflow-flow-layout.js.map +1 -1
  89. package/dist/browser/components/workflow/workflow-submission-form.d.ts +4 -0
  90. package/dist/browser/components/workflow/workflow-submission-form.d.ts.map +1 -1
  91. package/dist/browser/components/workflow/workflow-submission-form.js +20 -0
  92. package/dist/browser/components/workflow/workflow-submission-form.js.map +1 -1
  93. package/dist/browser/durable-command.js +2 -2
  94. package/dist/browser/durable-command.js.map +1 -1
  95. package/dist/browser/managed-read-recovery.d.ts +2 -0
  96. package/dist/browser/managed-read-recovery.d.ts.map +1 -1
  97. package/dist/browser/managed-read-recovery.js +6 -1
  98. package/dist/browser/managed-read-recovery.js.map +1 -1
  99. package/dist/browser/platform-client.d.ts +8 -1
  100. package/dist/browser/platform-client.d.ts.map +1 -1
  101. package/dist/browser/platform-client.js +39 -2
  102. package/dist/browser/platform-client.js.map +1 -1
  103. package/dist/browser/runtime-authorization-recovery.d.ts.map +1 -1
  104. package/dist/browser/runtime-authorization-recovery.js +36 -9
  105. package/dist/browser/runtime-authorization-recovery.js.map +1 -1
  106. package/dist/browser/runtime.d.ts +3 -1
  107. package/dist/browser/runtime.d.ts.map +1 -1
  108. package/dist/browser/runtime.js.map +1 -1
  109. package/dist/browser/workflow-operation-input.js +1 -1
  110. package/dist/browser/workflow-operation-input.js.map +1 -1
  111. package/dist/config.d.ts +2 -1
  112. package/dist/config.d.ts.map +1 -1
  113. package/dist/config.js +2 -1
  114. package/dist/config.js.map +1 -1
  115. package/dist/core.d.ts +5 -1
  116. package/dist/core.d.ts.map +1 -1
  117. package/dist/core.js +3 -1
  118. package/dist/core.js.map +1 -1
  119. package/dist/expressions.d.ts +4 -0
  120. package/dist/expressions.d.ts.map +1 -0
  121. package/dist/expressions.js +3 -0
  122. package/dist/expressions.js.map +1 -0
  123. package/documentation/administration.md +33 -0
  124. package/documentation/backend.md +117 -2
  125. package/documentation/data-authz.md +30 -0
  126. package/documentation/declarations-cheatsheet.md +2 -1
  127. package/documentation/development.md +7 -0
  128. package/documentation/field-components.md +44 -1
  129. package/documentation/getting-started.md +60 -7
  130. package/documentation/managed-concurrency-frontend.md +10 -4
  131. package/documentation/manifest.json +10 -10
  132. package/documentation/workflow-events.md +303 -9
  133. package/package.json +26 -21
  134. package/releases/2.55.5.json +30 -0
  135. package/releases/2.55.6.json +32 -0
  136. package/releases/2.57.1.json +31 -0
  137. package/releases/2.58.0.json +37 -0
  138. package/releases/2.58.1.json +31 -0
  139. package/releases/2.59.0.json +36 -0
  140. package/releases/2.59.1.json +37 -0
  141. package/releases/2.59.2.json +33 -0
  142. package/skills/manifest.json +1 -1
  143. package/skills/openxiangda-v2/SKILL.md +4 -4
  144. package/skills/openxiangda-v2/references/administration.md +33 -0
  145. package/skills/openxiangda-v2/references/backend.md +117 -2
  146. package/skills/openxiangda-v2/references/data-authz.md +30 -0
  147. package/skills/openxiangda-v2/references/declarations-cheatsheet.md +2 -1
  148. package/skills/openxiangda-v2/references/development.md +7 -0
  149. package/skills/openxiangda-v2/references/field-components.md +44 -1
  150. package/skills/openxiangda-v2/references/getting-started.md +60 -7
  151. package/skills/openxiangda-v2/references/managed-concurrency-frontend.md +10 -4
  152. package/skills/openxiangda-v2/references/workflow-events.md +303 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openxiangda",
3
- "version": "2.55.1",
3
+ "version": "2.59.2",
4
4
  "description": "OpenXiangda 2.0 的统一命令、应用 SDK、MCP 与中文 AI 技能资料。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,6 +14,10 @@
14
14
  "types": "./dist/core.d.ts",
15
15
  "import": "./dist/core.js"
16
16
  },
17
+ "./expressions": {
18
+ "types": "./dist/expressions.d.ts",
19
+ "import": "./dist/expressions.js"
20
+ },
17
21
  "./config": {
18
22
  "types": "./dist/config.d.ts",
19
23
  "import": "./dist/config.js"
@@ -67,13 +71,13 @@
67
71
  "dayjs": "1.11.18",
68
72
  "docx-preview": "0.3.7",
69
73
  "elkjs": "0.12.0",
70
- "openxiangda-cli": "2.6.83",
71
- "openxiangda-contracts": "2.63.0",
72
- "openxiangda-devkit-core": "2.48.2",
74
+ "openxiangda-cli": "2.7.2",
75
+ "openxiangda-contracts": "2.70.0",
76
+ "openxiangda-devkit-core": "2.52.0",
73
77
  "openxiangda-legacy": "npm:openxiangda@1.0.269",
74
- "openxiangda-mcp": "2.0.101",
75
- "openxiangda-nest": "2.14.3",
76
- "openxiangda-skill-kit": "2.3.81",
78
+ "openxiangda-mcp": "2.0.109",
79
+ "openxiangda-nest": "2.16.0",
80
+ "openxiangda-skill-kit": "2.3.90",
77
81
  "xlsx": "https://github.com/1377385356/openxiangda/releases/download/vendor-mirror/xlsx-0.20.3.tgz"
78
82
  },
79
83
  "peerDependencies": {
@@ -139,35 +143,36 @@
139
143
  },
140
144
  "openxiangdaRelease": {
141
145
  "schemaVersion": "openxiangda.release-notes/v1",
142
- "version": "2.55.1",
146
+ "version": "2.59.2",
143
147
  "status": "reviewed",
144
- "title": "持久原结果恢复与流程字段策略修复",
145
- "summary": "已受理命令的短读取超时不会提前终止原三十分钟观察;同步主线的条件必填错误清理和冻结的选填撤回原因策略。",
148
+ "title": "入口排队观察节奏与同源契约升级",
149
+ "summary": "尊重服务器入口排队查询间隔,并发行主线已评审的owned聚合容量及固定工作流阶段事务能力。",
146
150
  "newFeatures": [
147
- "固定流程定义支持 instanceCommands.withdraw.reasonRequired:false;省略仍必填,新声明要求 workflow.optional-withdrawal-reason@1.0.0。"
151
+ "模型可声明最高1000行的owned聚合容量,缺省500行、单子表500行与原子编辑边界不变。",
152
+ "固定且已协调的工作流阶段可显式启用一次阶段绑定的Native数据事务,并恢复原事务回执。"
148
153
  ],
149
154
  "fixes": [
150
- "已受理 durable 原结果查询收到 SDK 明确标记可恢复的短读取预算耗尽后,在原绝对截止前按退避继续只读查询;不重放提交。",
151
- "另一字段解除条件必填后清除 SDK 自己生成的旧必填错误,保留其他客户端、子表和服务端错误。"
155
+ "入口身份读取不再把60秒服务端查询提示压缩为15秒,保留最低间隔、抖动、原截止、取消及权限拒绝边界。",
156
+ "CLI模板使用本次根SDK精确版本,保证新建应用与发行能力一致。"
152
157
  ],
153
158
  "affectedUsers": [
154
- "使用 durable 持久命令的热点报名应用和包含条件必填或撤回策略的 V2 流程。"
159
+ "启用入口等待的V2应用,以及使用新增可选owned容量或工作流阶段事务声明的应用。"
155
160
  ],
156
161
  "upgradeSteps": [
157
- "使用正式精确版本升级应用 SDK;原结果恢复无需更改服务端协议。",
158
- "使用选填撤回原因时,平台必须具备对应能力;已有实例继续使用冻结版本。"
162
+ "精确安装完整同源发行组合;新增契约需匹配平台能力。高并发应用在真实页面和隔离HTTP请求图中校准查询节奏。"
159
163
  ],
160
164
  "knownLimitations": [
161
- "一次读取仍最多两分钟,总观察仍为原三十分钟;权限、依赖和普通网络错误不会被自动隐藏。",
162
- "容量必须在目标硬件上独立测量;单元验证不能证明万人或浏览器洪峰已通过。"
165
+ "本次客户万人复测尚未执行。上轮已登录万人HTTP图30分钟客户端与数据对账通过,严格网关对账仍保留18条已dispatch缺行。",
166
+ "不自动重放业务写入,不扩大权限或刷新原截止;不证明集中SSO、万人同秒提交、浏览器渲染容量或硬件绝对上限。"
163
167
  ],
164
168
  "issues": [],
165
169
  "compatibility": {
166
170
  "node": ">=24",
167
- "platform": "durable 恢复沿用既有结果协议;显式选填撤回原因要求 workflow.optional-withdrawal-reason@1.0.0"
171
+ "platform": "新增声明按目标平台能力协商;共享契约须消费同源版本",
172
+ "v1": "V1不消费本批V2运行时能力"
168
173
  },
169
- "sha256": "c6c0691f9fe9571dfe1c9078546a5db3f63645ba11a67a3f3d0d6324ba7713d1",
170
- "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.55.1"
174
+ "sha256": "f6d7b5a8d416ba728f598cd0e24680fb13ffab779a5ad568d306e02c0e77f5bf",
175
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.59.2"
171
176
  },
172
177
  "scripts": {
173
178
  "build": "node ../../scripts/prune-package-dist.mjs && tsc -p tsconfig.json && node scripts/copy-assets.mjs",
@@ -0,0 +1,30 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.55.5",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.55.5:具名业务与读取视角的边界",
6
+ "summary": "修复管理页面的读取 Perspective 被转发到受信业务 Data API 而导致合法业务提交拒绝的问题。",
7
+ "newFeatures": [],
8
+ "fixes": [
9
+ "Nest 具名业务 Data API 派生无读取视角的下游上下文,保留固定动作证明与原请求;普通 Data API 继续继承读取 Perspective。"
10
+ ],
11
+ "affectedUsers": [
12
+ "从已选择管理读取 Perspective 的页面调用 V2 Nest 具名业务动作的应用。"
13
+ ],
14
+ "upgradeSteps": [
15
+ "安装完整同源 SDK,执行应用 check,并分别验收合法提交、普通读取范围、当前成员事务守卫及原结果恢复。"
16
+ ],
17
+ "knownLimitations": [
18
+ "SDK HTTP 边界验收不代替真实角色和页面业务验收;本轮仅本机分发,不发布 npm。"
19
+ ],
20
+ "compatibility": {
21
+ "node": ">=24",
22
+ "platform": "native-4;保持 Native 服务主体读取视角拒绝检查",
23
+ "v1": "V1 引擎与应用不变"
24
+ },
25
+ "issues": [
26
+ "PLT-033"
27
+ ],
28
+ "sha256": "d8174bbf5684326c34ac3f467a3e2fdc12ef00f101edf442008ee59519a41e2d",
29
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.55.5"
30
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.55.6",
4
+ "status": "reviewed",
5
+ "title": "OpenXiangda 2.55.6:入口排队与身份加载连续性",
6
+ "summary": "修复平台入口等待期限与浏览器身份读取恢复期限不一致导致有效等待过早中断的问题。",
7
+ "newFeatures": [],
8
+ "fixes": [
9
+ "仅对有效平台入口回执接续身份等待,固定原期限并上限三十分钟,后续回执只能缩短。",
10
+ "入口身份读取遵循有界排队提示,普通请求、权限拒绝、投影重试和网络失败保持各自边界。"
11
+ ],
12
+ "affectedUsers": [
13
+ "启用 V2 平台入口排队并在拥挤时加载当前用户信息的应用。"
14
+ ],
15
+ "upgradeSteps": [
16
+ "安装同源 SDK 并重新构建应用,验证权限拒绝、入口期限、页面取消、原报名结果恢复及真实冷入口并发。"
17
+ ],
18
+ "knownLimitations": [
19
+ "本地测试不代表线上容量;r62 的 48 人中断仍保留,必须使用新隔离活动重新压测。",
20
+ "本次 HTTP 请求图不证明完整 SSO 或浏览器渲染上限。"
21
+ ],
22
+ "compatibility": {
23
+ "node": ">=24",
24
+ "platform": "V2 原入口回执协议;无数据库迁移",
25
+ "v1": "V1 引擎和应用不变"
26
+ },
27
+ "issues": [
28
+ "r62-entry-identity-interrupted"
29
+ ],
30
+ "sha256": "48803b23bb19feee37b60779064e03c2cb60c26a591f794755bcf4c2b5b887a7",
31
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.55.6"
32
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.57.1",
4
+ "status": "reviewed",
5
+ "title": "身份入口暂不可用时保留固定恢复期限",
6
+ "summary": "启用入口等待的平台可声明有界读取恢复预算,SDK继续恢复身份而不刷新原截止。",
7
+ "newFeatures": [],
8
+ "fixes": [
9
+ "修复入口429 unavailable无票据剩余时间时回落普通五分钟恢复的问题。",
10
+ "后续票据回执只能缩短截止;保留权限拒绝、失效、取消及写操作约束。"
11
+ ],
12
+ "affectedUsers": [
13
+ "使用高并发入口等待与runtime身份读取的V2应用。"
14
+ ],
15
+ "upgradeSteps": [
16
+ "同时使用提供recoveryBudgetMs的Server及同源SDK;无该元数据时维持原五分钟恢复。",
17
+ "完整分发组合通过正式门禁后部署,保留原压测失败与期限。"
18
+ ],
19
+ "knownLimitations": [
20
+ "本批尚未完成公开npm发行和学校站点部署,源码测试不代表线上验收。",
21
+ "恢复预算只用于读取重试,不提供身份或队列位置,不延长Redis票据。"
22
+ ],
23
+ "issues": [],
24
+ "compatibility": {
25
+ "node": ">=24",
26
+ "platform": "native-4、可选入口unavailable recoveryBudgetMs",
27
+ "v1": "V1不消费该恢复接口"
28
+ },
29
+ "sha256": "d797d800560e8e24b276c6674fa2ea303f89b844cf1f5ee7b1199543180174c4",
30
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.57.1"
31
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.58.0",
4
+ "status": "reviewed",
5
+ "title": "有界入口读取恢复与流程、开发配置能力更新",
6
+ "summary": "身份读取在原期限内恢复短暂网络失败;同时交付主线已合入的流程范围、主子事务和开发配置能力。",
7
+ "newFeatures": [
8
+ "具名流程支持保存前范围候选与一层 owned 主子创建闭包,仍由平台按实际资料及职责校验。",
9
+ "流程节点支持有界职责成员并集及可选操作原因,任务使用进入节点时冻结的规则。",
10
+ "显式 owned 子表支持最多500行及有界记录集合事务守卫,保留 CAS、字节与文件限额。",
11
+ "预发布开发配置可同步真实 Native 配置而不构建 Web/Nest 制品,不能晋级生产。",
12
+ "连接开发支持从源码接收有界后端事件交付,保留真实平台租约和确认边界。"
13
+ ],
14
+ "fixes": [
15
+ "身份 GET 不再因第三次短暂传输失败提前退出;采用有界指数退避,保留原恢复截止、单次超时、取消与明确权限拒绝。"
16
+ ],
17
+ "affectedUsers": [
18
+ "使用 V2 入口等待、具名流程、owned 子表或预发布开发配置的应用。"
19
+ ],
20
+ "upgradeSteps": [
21
+ "消费同源完整发行组合,并按声明协商目标平台能力。",
22
+ "入口预约、身份回执恢复和结果查询提示需配套平台更新;更新后重新校准真实页面请求图及性能测试。"
23
+ ],
24
+ "knownLimitations": [
25
+ "本轮尚未完成客户站点部署及新版本容量验收;源码验证不代表线上通过。",
26
+ "入口恢复仅重试读取,不自动重放报名等业务写操作,不续期原 Redis 票据。",
27
+ "此前8000人实验有7989人客户端30分钟内读回,最高完整通过仍5000人;实验不含SSO,不能代替首秒8000人完整浏览器容量结论。"
28
+ ],
29
+ "issues": [],
30
+ "compatibility": {
31
+ "node": ">=24",
32
+ "platform": "按声明协商对应 Native 与流程能力;入口恢复配套平台回执",
33
+ "v1": "V1不消费该V2接口"
34
+ },
35
+ "sha256": "ac8676f79afa9bc596508c7ca897ec60ffadf79f86ca36429dc1a279df23cf09",
36
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.58.0"
37
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.58.1",
4
+ "status": "reviewed",
5
+ "title": "同源交付记录流程历史及入口读取恢复",
6
+ "summary": "根包和模板消费新增 Nest 记录流程历史接口,并保留2.58.0的入口读取恢复与能力更新。",
7
+ "newFeatures": [
8
+ "Nest 用户上下文支持业务记录流程历史读取,复用 Native/RLS、记录实例绑定、分页及修订校验。"
9
+ ],
10
+ "fixes": [
11
+ "统一根包、CLI模板与Nest的精确发行版本,避免混用新增接口和旧归档。"
12
+ ],
13
+ "affectedUsers": [
14
+ "使用 Nest 工作流记录历史或入口等待恢复的V2应用。"
15
+ ],
16
+ "upgradeSteps": [
17
+ "安装完整同源发行组合;入口预约与结果查询退避需要配套平台更新并重新校准请求图。"
18
+ ],
19
+ "knownLimitations": [
20
+ "2.58.0及本批尚未完成客户站点新候选容量验收;上一轮8000人仅7989人客户端30分钟内读回,最高完整通过仍5000人。",
21
+ "不改变流程办理权限,不自动重放业务写操作,不覆盖SSO集中登录容量。"
22
+ ],
23
+ "issues": [],
24
+ "compatibility": {
25
+ "node": ">=24",
26
+ "platform": "复用平台当前用户记录流程历史与V2入口能力",
27
+ "v1": "V1不消费该V2接口"
28
+ },
29
+ "sha256": "9e7fb09dc8b7a0de8fff5e955e7d35cb4d4d1ce1be5fa1105a5d2c2517de6414",
30
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.58.1"
31
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.59.0",
4
+ "status": "reviewed",
5
+ "title": "托管查询断连恢复与流程表单能力更新",
6
+ "summary": "托管只读查询在认证传输层明确标记断连后沿原预算恢复;正式发行同时包含主线已评审的可选流程、子表及连接开发能力。",
7
+ "newFeatures": [
8
+ "流程支持发起人补正、具名业务补正命令、审批节点代理范围、批准后代理和原子Native阶段条件;新能力通过目标平台协商。",
9
+ "owned子表支持最少行数、可信初始流程事实、具名只读展示和任务字段来源;资源关联支持显式绑定变化清空。",
10
+ "日期字段支持分钟精度,日期事件支持可信来源投影;大型应用声明与JSON节点预算可显式协商扩展。",
11
+ "连接开发支持普通浏览器登录身份与平台可信后台调用;新增纯表达式入口供浏览器和Node共享流程表达式。"
12
+ ],
13
+ "fixes": [
14
+ "read、mine、result、allocation的已标记连接中断与繁忙共用固定预算、尝试上限、退避及取消边界;已受理观察继续原结果,不延长首次提交截止。",
15
+ "修复受控子表字段联动、审批已确认任务转交后的页面继续和普通浏览器业务API的CSRF传递。"
16
+ ],
17
+ "affectedUsers": [
18
+ "使用托管并发查询、标准流程表单、owned子表或普通角色连接开发的V2应用。"
19
+ ],
20
+ "upgradeSteps": [
21
+ "通过精确版本安装完整同源发行组合;启用新声明前核验目标平台能力。托管高并发应用需在真实浏览器与隔离压测中重新校准恢复行为。"
22
+ ],
23
+ "knownLimitations": [
24
+ "客户上一档万人HTTP请求图有29人结果观察被断连中断;后台全部终结但该档仍未完整通过。本版本的新万人复测尚未完成,既有最高完整通过为8000人HTTP请求图。",
25
+ "不自动重放业务写入,不将断连认定为已受理,不覆盖集中SSO登录或浏览器JS渲染容量;权限、依赖及未标记错误继续拒绝。",
26
+ "新增可选流程及普通角色源码调用需要配套平台能力;旧平台不能启用未支持的声明。"
27
+ ],
28
+ "issues": [],
29
+ "compatibility": {
30
+ "node": ">=24",
31
+ "platform": "托管断连恢复复用现有接口;新增声明按目标平台能力协商",
32
+ "v1": "V1不消费本批V2运行时能力"
33
+ },
34
+ "sha256": "7cdc36d28dc77f417b8bbbbdd8ab1fe0da4cdc3aead69c0b2ad6c87fdaae09bb",
35
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.59.0"
36
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.59.1",
4
+ "status": "reviewed",
5
+ "title": "同源托管断连恢复与声明生成修复",
6
+ "summary": "发布同源托管只读断连恢复及主线已评审能力,并补齐大型资源类型生成和自动审批只读详情的修复。",
7
+ "newFeatures": [
8
+ "流程支持发起人补正、具名业务补正命令、审批节点代理范围、批准后代理和原子Native阶段条件;新能力通过目标平台协商。",
9
+ "owned子表支持最少行数、可信初始流程事实、具名只读展示和任务字段来源;资源关联支持显式绑定变化清空。",
10
+ "日期字段支持分钟精度,日期事件支持可信来源投影;大型应用声明与JSON节点预算可显式协商扩展。",
11
+ "连接开发支持普通浏览器登录身份与平台可信后台调用;新增纯表达式入口供浏览器和Node共享流程表达式。"
12
+ ],
13
+ "fixes": [
14
+ "read、mine、result、allocation的已标记连接中断与繁忙共用固定预算、尝试上限、退避及取消边界;已受理观察继续原结果,不延长首次提交截止。",
15
+ "修复受控子表字段联动、审批已确认任务转交后的页面继续和普通浏览器业务API的CSRF传递。",
16
+ "大型资源目录使用命名条目与精确只读类型,避免TypeScript序列化上限;自动发起人审批允许已解析的完全只读详情,保留可编辑席位人工办理。"
17
+ ],
18
+ "affectedUsers": [
19
+ "使用托管并发查询、标准流程表单、owned子表或普通角色连接开发的V2应用。"
20
+ ],
21
+ "upgradeSteps": [
22
+ "通过精确版本安装完整同源发行组合;启用新声明前核验目标平台能力。托管高并发应用需在真实浏览器与隔离压测中重新校准恢复行为。"
23
+ ],
24
+ "knownLimitations": [
25
+ "客户上一档万人HTTP请求图有29人结果观察被断连中断;后台全部终结但该档仍未完整通过。本版本的新万人复测尚未完成,既有最高完整通过为8000人HTTP请求图。",
26
+ "不自动重放业务写入,不将断连认定为已受理,不覆盖集中SSO登录或浏览器JS渲染容量;权限、依赖及未标记错误继续拒绝。",
27
+ "新增可选流程及普通角色源码调用需要配套平台能力;旧平台不能启用未支持的声明。"
28
+ ],
29
+ "issues": [],
30
+ "compatibility": {
31
+ "node": ">=24",
32
+ "platform": "托管断连恢复复用现有接口;新增声明按目标平台能力协商",
33
+ "v1": "V1不消费本批V2运行时能力"
34
+ },
35
+ "sha256": "3a9716eafe5e14bfe5eda8b2482393e4aad28155fde5933f3fe759a6a98c5972",
36
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.59.1"
37
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": "openxiangda.release-notes/v1",
3
+ "version": "2.59.2",
4
+ "status": "reviewed",
5
+ "title": "入口排队观察节奏与同源契约升级",
6
+ "summary": "尊重服务器入口排队查询间隔,并发行主线已评审的owned聚合容量及固定工作流阶段事务能力。",
7
+ "newFeatures": [
8
+ "模型可声明最高1000行的owned聚合容量,缺省500行、单子表500行与原子编辑边界不变。",
9
+ "固定且已协调的工作流阶段可显式启用一次阶段绑定的Native数据事务,并恢复原事务回执。"
10
+ ],
11
+ "fixes": [
12
+ "入口身份读取不再把60秒服务端查询提示压缩为15秒,保留最低间隔、抖动、原截止、取消及权限拒绝边界。",
13
+ "CLI模板使用本次根SDK精确版本,保证新建应用与发行能力一致。"
14
+ ],
15
+ "affectedUsers": [
16
+ "启用入口等待的V2应用,以及使用新增可选owned容量或工作流阶段事务声明的应用。"
17
+ ],
18
+ "upgradeSteps": [
19
+ "精确安装完整同源发行组合;新增契约需匹配平台能力。高并发应用在真实页面和隔离HTTP请求图中校准查询节奏。"
20
+ ],
21
+ "knownLimitations": [
22
+ "本次客户万人复测尚未执行。上轮已登录万人HTTP图30分钟客户端与数据对账通过,严格网关对账仍保留18条已dispatch缺行。",
23
+ "不自动重放业务写入,不扩大权限或刷新原截止;不证明集中SSO、万人同秒提交、浏览器渲染容量或硬件绝对上限。"
24
+ ],
25
+ "issues": [],
26
+ "compatibility": {
27
+ "node": ">=24",
28
+ "platform": "新增声明按目标平台能力协商;共享契约须消费同源版本",
29
+ "v1": "V1不消费本批V2运行时能力"
30
+ },
31
+ "sha256": "f6d7b5a8d416ba728f598cd0e24680fb13ffab779a5ad568d306e02c0e77f5bf",
32
+ "url": "https://github.com/1377385356/openxiangda/releases/tag/v2.59.2"
33
+ }
@@ -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": "a8cd59d165b5b58e5c39ce53b7e19b6a886d0567d3da711f721fce35e806a591"
7
+ "sha256": "de040727097c72101701c3e9cdcb4dafa04284714d50b726a60d9e7b7003ce51"
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.55.1 auth status --cwd <应用目录> --base-url <平台地址> --json
44
- pnpm dlx openxiangda@2.55.1 login --cwd <应用目录> --base-url <平台地址>
45
- pnpm dlx openxiangda@2.55.1 create <应用目录> --base-url <同一平台地址>
46
- pnpm dlx openxiangda@2.55.1 skill install --force
43
+ pnpm dlx openxiangda@2.59.2 auth status --cwd <应用目录> --base-url <平台地址> --json
44
+ pnpm dlx openxiangda@2.59.2 login --cwd <应用目录> --base-url <平台地址>
45
+ pnpm dlx openxiangda@2.59.2 create <应用目录> --base-url <同一平台地址>
46
+ pnpm dlx openxiangda@2.59.2 skill install --force
47
47
  ```
48
48
 
49
49
  创建前把产品要求的目标平台明确带入命令,不从旧登录态推断站点。已有工作区从原绑定恢复,平台不一致时先解决登录与目标,不改 link 文件跨站创建。
@@ -91,10 +91,43 @@ export function ResponsibilityMembers() {
91
91
 
92
92
  读取沿用原流程管理权限。仅获成员管理委托的用户可能可以维护角色,同时没有权限读取关联流程;组件单独呈现该拒绝。返回不含成员、实例标识或业务事实,每页最多 100 条;最多 1000 个版本组合、32 MiB 源 JSON、10000 节点/引用,超限明确拒绝。
93
93
 
94
+ ### 多职责成员合并
95
+
96
+ 审批或抄送的 `app_role` / `app_role_in_scope` 来源可用 `roleCodes` 声明 2–8 个不同职责,
97
+ 与单职责 `roleCode` 互斥。例如:
98
+
99
+ ```ts
100
+ jointReviewers: {
101
+ provider: 'app_role',
102
+ roleCodes: ['student-office', 'organization'],
103
+ }
104
+ ```
105
+
106
+ 节点进入时读取这些职责的当前有效成员;范围角色共用同一份代码计算的 `scope`。
107
+ 同一人员只占一个审批席位或抄送名额,解析解释保留各职责来源。
108
+ 职责顺序决定重叠人员席位使用哪个职责的代理规则:采用首个匹配职责,
109
+ 不会借用后续职责的代理。已有任务保持原人员快照。
110
+
111
+ 管理员仅在代码开放人员来源配置的节点中调整职责组合;单选仍保存 `roleCode`,
112
+ 多选保存 `roleCodes`。保存、版本激活均检查所有职责,任何职责失效或查询失败都不能
113
+ 变成部分名单。总候选最多 200 个成员身份;去重后的审批上限仍受原 binding 限制,
114
+ 自动抄送最多 20 人。声明自动协商 `workflow.role-union@1.0.0`,无需初始化开关。
115
+
94
116
  管理范围检索使用 `listRoleManagementScopeValues(dimensionCode, { keyword, limit, offset })`,返回 `NativeRoleManagementScopeValuePage` 的 `id/label` 与 `limit/offset`。它使用 `openxiangda.native-role-management-scope-value-page/v2`,与 Data 字段选择器的 `value/label/cursor` 协议分开。权限仍要求对成员的分配或更新能力;只读权限不因此扩张。
95
117
 
96
118
  ## 限时审批代理 {#workflow-delegations}
97
119
 
120
+ 限定流程后,可进一步选择该职责在某个审批节点的代理。共享维护页的节点选项来自本人有效
121
+ 职责下的真实审批引用,包含当前及在途定义;不同节点可分别委托不同人员。不选节点覆盖
122
+ 范围内全部适用节点,全节点代理与重叠的单节点代理不能同时生效。预览和原操作回执保留范围,
123
+ 旧回执缺少节点仍按原规则读取;创建、撤销或到期均不改派已创建的任务。
124
+
125
+ 自定义页面使用 `WorkflowDelegationMutationRequest` 的create操作,在非空 `workflowCode`
126
+ 下传可选 `nodeId`;候选查询也携带同样的流程与节点。`delegationCatalog().sources[].nodeScopes`
127
+ 提供可选节点,服务器重新核验职责和范围,不能从客户端指定审批人身份。
128
+ 按节点创建必须使用预览/execute/receipt协议;旧 `createDelegation` 入口拒绝 `nodeId`,
129
+ 避免与不支持节点限制的旧服务联调时意外扩大范围。平台自动支持,无新增默认关闭开关。
130
+
98
131
  平台自动提供 `workflow.delegation-management@1.0.0`,没有额外的默认关闭开关。本人只能委托自己的有效审批职责;代理人必须具有同角色、覆盖原范围且有效期覆盖整个代理窗口的成员身份。采用平台数据库时间与 `[开始, 结束)` 区间,禁止自己代理、重叠链和环。管理员可全应用查看和撤销,创建由原审批人本人完成;成员管理委托不会扩大后台或代理管理权。
99
132
 
100
133
  标准管理入口、应用后台工具与门户个人页可复用 `WorkflowDelegationManager`。组件读取当前挂载应用和环境;`initialAll` 只是筛选意图,平台仍核验超管权限。宿主把草稿回调交给已有导航保护,避免切页时丢失输入或未知操作:
@@ -4,6 +4,8 @@
4
4
 
5
5
  平台网关验证当前用户完整的应用角色并集,并把经平台重验的角色、capability 与可选 Perspective 交给 Nest SDK。业务 controller 使用生成的 operation 合同和 capability 装饰器;平台仍是身份与授权的唯一所有者。请求作用域 `OpenXiangdaDataApiService` 自动继承 Perspective 读取投影;绕过 Data API 的自定义读取才使用 `@CurrentPerspective()` 显式投影。应用代码不替换身份、不保存平台凭据,也不建立第二套用户或权限状态。
6
6
 
7
+ `OpenXiangdaBusinessDataApiService` 的跨模型读写使用固定 operation 的受信业务证明,不向 Native 转发用户读取 Perspective。原请求的视角保持,普通 Data API 读取仍收窄;业务动作继续按当前用户角色并集授权,并在平台事务内核验当前成员范围、状态和 revision。不要通过清除浏览器所有请求的 Perspective 来修复业务提交,也不要把业务 facade 当作任意读取接口。
8
+
7
9
  ```bash
8
10
  pnpm openxiangda dev
9
11
  pnpm openxiangda check
@@ -16,7 +18,11 @@ operation、事件消费者、人员提供器,然后运行 `pnpm openxiangda c
16
18
 
17
19
  依赖安装失败会保留新源码并报告 `OPENXIANGDA_BACKEND_INSTALL_FAILED`;重试相同命令
18
20
  即可继续。关闭 backend 不自动删除用户源码。仅删除已经确认不用的后端目录和其依赖。
19
- 本地 `/api` 经过 connected proxy 进入 Nest;发布态由同源应用网关转发。
21
+ 开发者本地 `/api` 经过 connected proxy 进入 Nest;普通浏览器身份经过平台实时授权,
22
+ 在支持 `application.development-backend-invocations` 的预发布开发配置上通过当前
23
+ CLI 反向连接到本地 Nest。仅开放已声明 operation,保持短 invocation、请求断言和
24
+ 原业务幂等键。有限缓冲 HTTP 的预算与关闭/版本失效规则见
25
+ [普通角色与应用登录联调](getting-started.md#普通角色与应用登录联调)。发布态由同源应用网关转发。
20
26
 
21
27
  | 需求 | 使用的 SDK | 权威边界 |
22
28
  | --- | --- | --- |
@@ -50,6 +56,41 @@ operationCode、idempotencyKey;SDK 绑定当前环境并核验返回关联。N
50
56
  标准 PC/移动发起页在响应未知时保留原操作定位信息,刷新可继续查询;同一页面、原身份和
51
57
  版本内可手动重试冻结的标准输入,绝不自动重发或悄悄换键。
52
58
 
59
+ ### 补正重提的业务操作 {#correction-business-command}
60
+
61
+ 使用固定 Workflow 的 resubmit handler 执行业务重校验;请求是生成操作契约的
62
+ `WorkflowBusinessCommandInvocation`,身份、环境与具名动作由网关和请求作用域 SDK 验证。
63
+ 禁止接受页面自报的申请人、资格快照或下游节点。
64
+
65
+ ```ts
66
+ // 必须在当前资料读取和业务校验之前恢复同一用户的原任务结果。
67
+ const original = await businessProcess.resolveOriginalTaskCommand(invocation);
68
+ if (original.status === 'succeeded') return original.result;
69
+ if (original.status === 'failed') throw new Error(original.errorCode || 'WORKFLOW_COMMAND_FAILED');
70
+
71
+ // 合并当前申请与 task form 的受限字段,重验业务规则并准备当前资料的 guards。
72
+ // form.expectedRevision 与 invocation.expectedRevision 保持一致,不给系统字段赋客户端值。
73
+ return businessProcess.commandWithData({
74
+ workflow: invocation,
75
+ subject: { fromOperation: 'request' },
76
+ data: {
77
+ guards,
78
+ operations: [{ key: 'request', kind: 'update', resourceCode: 'requests',
79
+ id: invocation.recordId, expectedRevision: invocation.expectedRevision,
80
+ data: { lastValidatedAt: platformResolvedAt } }],
81
+ },
82
+ expectedTransition: { kind: 'correction-replay' },
83
+ });
84
+ ```
85
+
86
+ `lastValidatedAt` 为本例应用声明的非路由审计字段。任务 form 由平台在同一事务先应用,
87
+ 平台自动衔接其产生的主体 revision;业务 mutation 不能改写固定事实映射。
88
+ 守卫、字段、资格、下游解析或流转失败时,Native 更新与任务、会话、事件一起回滚。
89
+ 原结果查询使用既有 `/workflow/tasks/:id/commands/original`,核对当前 operation、任务、
90
+ 原键、命令、流程、业务记录和原用户输入摘要,不新建恢复表或自动换键重试。
91
+ `not_observed` 仅表示尚未看到确定回执;保留原输入、原 token 和原键,按用户显式操作恢复。
92
+ 声明及限制见[工作流](workflow-events.md#correction-business-command)。
93
+
53
94
  ### 数据修改的原结果恢复 {#data-business-commands}
54
95
 
55
96
  仅修改业务资料的具名动作,在 `platformAccess` 声明
@@ -93,6 +134,36 @@ return committed.receipt;
93
134
  服务端只持久保存意图和公开键的摘要,复用原 Native 回执,不建立第二份状态表。
94
135
  结果仅返回可信应用后端,应用按已声明的 responseSchema 向用户投影。
95
136
 
137
+ ### 数据写入的流程阶段前置条件 {#workflow-native-stage-guard}
138
+
139
+ 证明生成等具名动作需要把当前流程阶段与 Native 写入放在同一事务中时,声明固定条件:
140
+
141
+ ```ts
142
+ platformAccess: {
143
+ dataCommands: { mode: 'recoverable-native' },
144
+ workflow: { codes: ['certificate'] },
145
+ workflowStage: {
146
+ workflowCode: 'certificate', resourceCode: 'requests', actor: 'initiator',
147
+ runningNodeIds: ['applicant-confirm'], allowedStatuses: ['approved'],
148
+ },
149
+ }
150
+ ```
151
+
152
+ 编译器核对固定流程、来源资源与节点,并要求 `workflow.native-stage-guard` 1.0.0。
153
+ 声明后每次 `commitCommand` 必须在 `data.workflowStage` 传入所观测的
154
+ `instanceId`、`subjectRecordId`、`expectedInstanceSequence`;同时传入该来源记录的
155
+ `record-match` 或 `record-assert` guard,包含 `revision eq 原版本`。
156
+ 这些值由动作代码从授权读取结果组装,不允许用户指定可用阶段或替换策略。
157
+ `runningNodeIds` 限定运行中的主节点;`allowedStatuses` 明确列出其他允许状态,
158
+ 包括需要保留的 returned,未列出的状态拒绝。
159
+ `actor: 'reader'` 复用 Kernel 的实例读取权限;动作能力与 Native 数据范围仍独立核对。
160
+
161
+ 平台先恢复已提交的原回执,再获取 Kernel 实例锁、重验当前身份和阶段,然后持锁
162
+ 执行来源版本守卫、数据修改及回执提交。阶段、来源或序号变化明确拒绝;锁冲突返回
163
+ 可重试错误,保留原业务意图和键。已提交结果可在后续阶段或同环境新 Head 下恢复。
164
+ 此条件不属于通用 Data API guard,也不能与 decimalReservation 合并使用。
165
+ 上传准备仍在事务外:失败后不得关联文件,未关联上传由既有托管文件清理机制处理。
166
+
96
167
  自定义表单页若先用 `createResourceFormDraftClient` 保存认证草稿,并由 Named Action
97
168
  提交业务记录和流程,则在同一次 `OpenXiangdaBusinessProcessService.commit` 中传入
98
169
  `formDraft: { resourceCode, id, expectedRevision, mode, recordId?, viewCode? }`。草稿必须
@@ -111,7 +182,14 @@ return committed.receipt;
111
182
  重、不自行加锁、不在重试时重新生成业务时间。
112
183
 
113
184
  只读前置条件使用 `record-exists` 或 `record-match`,它们不要求同记录 mutation,
114
- 但仍执行 read capability、字段权限与行级授权。需要与数据库当前时间比较时使用
185
+ 但仍执行 read capability、字段权限与行级授权。多行申请引用同一类主数据时使用
186
+ `record-set-match`:`resourceCode`、`errorCode`、`records: [{ id, expectedRevision }]`
187
+ 及可选公共 `where`。每组1–500个不同UUID,所有组累计最多500条,守卫总数仍最多20条。
188
+ 同一资源只能使用一条集合守卫,应合并选择集合以保持资源及记录的固定锁序。
189
+ 例如国家选择可用 `where: { field: 'enabled', operator: 'eq', value: true }`;
190
+ 平台先确认全部记录有read授权,再锁定集合并重读,任一记录缺失、失权、停用或版本
191
+ 改变均原子拒绝。它不授予update,也不替代increment所需的record-assert。原成功回执
192
+ 恢复优先于主数据重新核验。需要与数据库当前时间比较时使用
115
193
  `databaseNowAssertion('publishAt', 'lte')`;平台在守卫行锁及写入前校验完成后,
116
194
  用一次 PostgreSQL `clock_timestamp()` 完成所有动态断言,并把该接受时刻作为
117
195
  `evaluatedAt` 存入幂等回执。它不是最终提交时刻。相同幂等键重放不会重新
@@ -269,6 +347,36 @@ await businessData.transaction({
269
347
  分派已接受后撤销角色,不会自动撤销历史分派;后续处理动作必须重新验证当前权限,
270
348
  由管理员重新分派。此规则应写入 AppSpec,并实测撤销先发生和分派先发生两种顺序。
271
349
 
350
+ ## 在事务中核对当前办理人的操作和范围 {#actor-authority}
351
+
352
+ 管理动作需要同时具备操作权限和业务范围时,在具名动作声明
353
+ `platformAccess: { roleAssertions: { roleCodes: ['college-admin'], actorAuthority: true } }`。
354
+ 这会要求平台 `data.transaction-actor-authority@1.0.0`。提交同一业务事务时增加:
355
+
356
+ ```ts
357
+ { kind: 'actor-authority', errorCode: 'OPENXIANGDA_MANAGEMENT_SCOPE_DENIED',
358
+ anyOf: [{ roleCode: 'college-admin',
359
+ scope: { dimensionCode: 'college', value: authoritativeCollegeCode, operation: 'manage' } }],
360
+ allowAppSuperAdmin: false }
361
+ ```
362
+
363
+ `anyOf` 为 1–20 个不同的角色/精确范围分支;角色必须在动作声明和当前授权定义内,
364
+ 范围维度必须在当前定义内。省略 scope 的分支仍需角色与本动作 capability 属于同一成员。
365
+ 当前办理人和 capability 仅从已验证动作取得,守卫不接收 userId、成员 ID 或能力输入。
366
+ 平台在同一事务锁定账号、相关有效 package 成员和授权投影,锁后以数据库时间重新解释;
367
+ 不能把不同成员的能力和范围拼接,也不使用账号部门、前端权限缓存或选人候选替代管理授权。
368
+ scope operations 省略、null、空数组或包含 `*` 表示允许全部,否则必须包含指定操作。
369
+
370
+ `allowAppSuperAdmin` 默认 false;只有明确设为 true 且当前应用管理员授权被锁定并验证时
371
+ 才能通过这个分支,它不代表审批参与人。单事务最多核对 400 条相关成员;超限返回
372
+ `OPENXIANGDA_ACTOR_AUTHORITY_BUSY`。锁冲突沿用 `OPENXIANGDA_ROLE_ASSERTION_CONFLICT`,
373
+ 锁等待最多 1 秒、单条 SQL 最多 10 秒(保留更紧的已有上限)。已先完成撤权则新提交拒绝;
374
+ 已先锁定并接受的事务结束后才能撤权。守卫失败返回应用声明的失败码及 `/guards/<index>`,
375
+ 业务写入、事件和回执一起回滚。结果未知继续查询原请求;已有成功回执重放不重复写入。
376
+ 普通 Data SDK、应用凭据、事件和队列上下文不能使用;未声明返回
377
+ `OPENXIANGDA_ACTOR_AUTHORITY_NOT_DECLARED`。仪器归属等业务事实仍由应用在同一事务
378
+ 使用 Native revision/CAS/记录守卫冻结;prepare 不授予后续提交权限。
379
+
272
380
  ## AI 能力目录与 MCP Facade {#ai-catalog}
273
381
 
274
382
  编译器为每个应用生成不可变的 AI 能力目录:资源的标准 CRUD 面(query/get/create/update/delete,
@@ -412,6 +520,13 @@ import {
412
520
  用户动作 send 的 schemaVersion 使用 OPENXIANGDA_NOTIFICATION_BUSINESS_SEND_V2;事件处理 sendFromEvent 使用 OPENXIANGDA_NOTIFICATION_EVENT_SEND_V2。二者的调用上下文和收件人来源不同,不能混用。
413
521
  ## 外部处理受控文件
414
522
 
523
+ 证明等业务动作需要核对真实审批状态时,可调用
524
+ `workflow.recordHistory(resourceCode, recordId, { instanceId?, limit: 1 })`(注入
525
+ `OpenXiangdaWorkflowService`)。它沿当前用户的 Native 读取和流程历史权限,返回实际
526
+ `recordRevision` 与 `instance.status`;不能用流程命令的执行成功推断审批已批准。
527
+ 记录修订不一致应重新核对;403/404/409 直接拒绝,不回退业务字段或应用缓存。
528
+ 此读取不授予任务办理或服务身份权限,offset 上限500、limit 上限100。
529
+
415
530
  需要水印或归档处理时,Nest DataApi 可签发短期对象下载地址。不要把要求登录态的 content URL 或用户 Cookie 交给外部服务。
416
531
 
417
532
  ```ts