openxiangda 2.26.0 → 2.28.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.
- package/dist/core.d.ts +1 -1
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js.map +1 -1
- package/documentation/backend.md +2 -0
- package/documentation/decimal-reservations.md +111 -0
- package/documentation/delivery.md +24 -0
- package/documentation/getting-started.md +7 -7
- package/documentation/manifest.json +12 -6
- package/documentation/reference/cli.md +1 -1
- package/documentation/reference/mcp.md +53 -0
- package/package.json +25 -29
- package/releases/2.27.0.json +38 -0
- package/releases/2.28.0.json +37 -0
- package/skills/manifest.json +1 -1
- package/skills/openxiangda-v2/SKILL.md +5 -4
- package/skills/openxiangda-v2/references/backend.md +2 -0
- package/skills/openxiangda-v2/references/cli.md +1 -1
- package/skills/openxiangda-v2/references/decimal-reservations.md +111 -0
- package/skills/openxiangda-v2/references/delivery.md +24 -0
- package/skills/openxiangda-v2/references/getting-started.md +7 -7
- package/skills/openxiangda-v2/references/mcp.md +53 -0
package/dist/core.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { BusinessProcessCommand, BusinessProcessCommandQuery, BusinessProcessCommandList, DataAuditEntry, DataAuditPage, DataAggregateMeasureType, DataAggregatePage, DataAggregateQuery, DataBatchQueryItemResult, DataBatchQueryOperation, DataBatchQueryRequest, DataBatchQueryResult, DataExportRequest, DataFieldOption, DataFieldSourcePage, DataFieldSourceQuery, DataFieldSourceLaunchBinding, DataFieldSurface, DataFilePreview, DataFileRef, DataFileUploadPlan, DataFileDownloadSession, DataFileOutputRequest, DataFileOutputPlan, DataPage, DataQuery, DataRecord, DataResourceSurface, DataTransactionOperation, DataTransactionRequest, DataTransactionResult, DataWhere, DirectoryEntry, DirectoryEntryPage, DirectoryResolveRequest, LabeledValue, NativeAuthorizationManagementCatalog, NativeAuthorizationMutationReceipt, NativeRoleManagementAction, NativeRoleManagementAuthority, NativeRoleManagementGrant, NativeRoleManagementGrantMutationResult, NativeRoleManagementGrantPage, NativeRoleMembership, NativeRoleMembershipMutationResult, NativeRoleMembershipPage, NativeScopeGrant, NotificationDeliveryV2, NotificationMessageDetailV2, NotificationReadReceiptV2, ResourceReferenceValue, RuntimeAuthorizationContext, RuntimeAuthorizationIdentity, StableAddressValue, StableLocationValue, SubjectProfile, WorkflowDetailNavigation, WorkflowBusinessData, WorkflowBusinessDataStatus, WorkflowCommandResult, WorkflowDetailSurfaceV2, WorkflowInstance, WorkflowSurface, WorkflowTask, WorkflowTimeline, WorkflowWorkCenterItem, } from 'openxiangda-contracts/browser';
|
|
1
|
+
export type { BusinessProcessCommand, BusinessProcessCommandQuery, BusinessProcessCommandList, DataAuditEntry, DataAuditPage, DataAggregateMeasureType, DataAggregatePage, DataAggregateQuery, DataBatchQueryItemResult, DataBatchQueryOperation, DataBatchQueryRequest, DataBatchQueryResult, DataExportRequest, DataFieldOption, DataFieldSourcePage, DataFieldSourceQuery, DataFieldSourceLaunchBinding, DataFieldSurface, DataFilePreview, DataFileRef, DataFileUploadPlan, DataFileDownloadSession, DataFileOutputRequest, DataFileOutputPlan, DataPage, DataQuery, DataRecord, DataResourceSurface, DataTransactionOperation, DataDecimalReservationTransition, DataTransactionRequest, DataTransactionResult, DataWhere, DirectoryEntry, DirectoryEntryPage, DirectoryResolveRequest, LabeledValue, NativeAuthorizationManagementCatalog, NativeAuthorizationMutationReceipt, NativeRoleManagementAction, NativeRoleManagementAuthority, NativeRoleManagementGrant, NativeRoleManagementGrantMutationResult, NativeRoleManagementGrantPage, NativeRoleMembership, NativeRoleMembershipMutationResult, NativeRoleMembershipPage, NativeScopeGrant, NotificationDeliveryV2, NotificationMessageDetailV2, NotificationReadReceiptV2, ResourceReferenceValue, RuntimeAuthorizationContext, RuntimeAuthorizationIdentity, StableAddressValue, StableLocationValue, SubjectProfile, WorkflowDetailNavigation, WorkflowBusinessData, WorkflowBusinessDataStatus, WorkflowCommandResult, WorkflowDetailSurfaceV2, WorkflowInstance, WorkflowSurface, WorkflowTask, WorkflowTimeline, WorkflowWorkCenterItem, } from 'openxiangda-contracts/browser';
|
|
2
2
|
export * from './browser/platform-client';
|
|
3
3
|
export * from './browser/runtime-meta';
|
|
4
4
|
export * from './browser/components/platform-fields/resource-query';
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,cAAc,EACd,aAAa,EACb,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,4BAA4B,EAC5B,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EACZ,oCAAoC,EACpC,kCAAkC,EAClC,0BAA0B,EAC1B,6BAA6B,EAC7B,yBAAyB,EACzB,uCAAuC,EACvC,6BAA6B,EAC7B,oBAAoB,EACpB,kCAAkC,EAClC,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qDAAqD,CAAC;AACpE,mBAAmB,6DAA6D,CAAC"}
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,cAAc,EACd,aAAa,EACb,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,4BAA4B,EAC5B,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,wBAAwB,EACxB,gCAAgC,EAChC,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EACZ,oCAAoC,EACpC,kCAAkC,EAClC,0BAA0B,EAC1B,6BAA6B,EAC7B,yBAAyB,EACzB,uCAAuC,EACvC,6BAA6B,EAC7B,oBAAoB,EACpB,kCAAkC,EAClC,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qDAAqD,CAAC;AACpE,mBAAmB,6DAA6D,CAAC"}
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAqEA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qDAAqD,CAAC"}
|
package/documentation/backend.md
CHANGED
|
@@ -321,3 +321,5 @@ if (output.status === 'pending') {
|
|
|
321
321
|
```
|
|
322
322
|
|
|
323
323
|
这些方法适用于当前用户、具名业务动作和应用服务身份,沿用各自权限;业务记录绑定仍需正式数据事务。输出目前支持 OSS/MinIO,受字段上限与100MiB硬上限约束,上传凭据五分钟后过期,完成须在额外十分钟内进行。过期错误应由调用者建立新的处理意图,不能无限重试相同过期计划。下载最长五分钟,签发后到期前为短期委托,不能即时撤回。不要在日志、持久草稿或业务数据中保存签名地址、POST policy 或签名字段。
|
|
324
|
+
|
|
325
|
+
主子记录共享精确金额额度、撤回修订和审批释放,请使用[精确金额占用](decimal-reservations.md)的受管提交及终态事务。
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# 主子记录精确金额占用
|
|
2
|
+
|
|
3
|
+
需要跨多条子记录共享主记录额度时,使用平台 `data.decimal-reservations` 1.1.0,
|
|
4
|
+
金额字段声明 `number.decimal`、`precision: 18`、`scale: 2`、`exactDecimal: true`。
|
|
5
|
+
JSON 金额使用字符串。平台在父记录锁内用 PostgreSQL NUMERIC 校验占用;应用不做
|
|
6
|
+
浮点求和、不维护另一个余额字段。此能力需要匹配 SDK、平台镜像和迁移;包安装成功
|
|
7
|
+
不表示目标环境已就绪,先检查平台能力和正式部署回执。
|
|
8
|
+
|
|
9
|
+
## 声明与首次提交
|
|
10
|
+
|
|
11
|
+
提交的 Named Action 在 `platformAccess.decimalReservation` 声明 `mode: 'reserve'`、
|
|
12
|
+
资源、amount/currency/relation/parent/root/status 六个字段、主子关系取值和允许状态,
|
|
13
|
+
并用 `platformAccess.workflow.codes` 声明实际审批。当前用户仍需资源与字段读写权限。
|
|
14
|
+
首次使用会冻结环境内该资源的映射;已有未入账子记录时拒绝启用,不自动补账。
|
|
15
|
+
|
|
16
|
+
在 `OpenXiangdaBusinessProcessService.commit` 顶层增加:
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
const decimalReservation = {
|
|
20
|
+
parentId,
|
|
21
|
+
expectedParentRevision: parent.revision,
|
|
22
|
+
childOperationKey: 'child',
|
|
23
|
+
reservationKey: submission.reservationKey,
|
|
24
|
+
amount: '123.45',
|
|
25
|
+
currencyCode: 'CNY',
|
|
26
|
+
};
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`childOperationKey` 同 `workflow.subject.fromOperation`,选中唯一一条该资源的
|
|
30
|
+
create 或 update。平台原子完成子记录、占额、审批命令和可选本人草稿消费。
|
|
31
|
+
审批通过将 reserved 改为 committed,继续占额;驳回或撤回释放一次。
|
|
32
|
+
|
|
33
|
+
## 撤回后修订并重提
|
|
34
|
+
|
|
35
|
+
released 子记录仍不能通过普通 CRUD 或 `BusinessData.transaction` 修改金额、
|
|
36
|
+
状态、父/root/关系等保护字段。界面把修订保存到本人 FormDraft,重提时一次提交:
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
await businessProcess.commit({
|
|
40
|
+
idempotencyKey: submission.idempotencyKey,
|
|
41
|
+
data: {
|
|
42
|
+
operations: [{
|
|
43
|
+
key: 'child', kind: 'update', resourceCode: 'contracts',
|
|
44
|
+
id: child.id, expectedRevision: child.revision,
|
|
45
|
+
data: {
|
|
46
|
+
title: draft.title,
|
|
47
|
+
amount: '123.45',
|
|
48
|
+
status: { value: 'approving' },
|
|
49
|
+
},
|
|
50
|
+
}],
|
|
51
|
+
},
|
|
52
|
+
formDraft: {
|
|
53
|
+
resourceCode: 'contracts', id: draft.id,
|
|
54
|
+
expectedRevision: draft.revision, mode: 'update', recordId: child.id,
|
|
55
|
+
},
|
|
56
|
+
decimalReservation,
|
|
57
|
+
workflow: { workflowCode: 'contract-approval', subject: { fromOperation: 'child' } },
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
每次新的提交意图使用新的 reservationKey 和提交键;网络结果未知时保留原键及原
|
|
62
|
+
payload查询/重试,不能用新键重做旧请求。更新保留父/root/关系,失败会整体回滚,
|
|
63
|
+
本人草稿仍可恢复,正式金额与审批命令不会半完成。普通主记录继续原来的无额度路径。
|
|
64
|
+
|
|
65
|
+
## 真实审批事件终态
|
|
66
|
+
|
|
67
|
+
在真实审批消费者的 `platformAccess` 增加以下声明;其中状态取值由应用自己的
|
|
68
|
+
资源选项决定。审批必须声明同一 subject 资源,且存在该资源的 reserve 动作映射。
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
platformAccess: {
|
|
72
|
+
decimalReservation: {
|
|
73
|
+
resourceCode: 'contracts', workflowCode: 'contract-approval',
|
|
74
|
+
outcomes: [
|
|
75
|
+
{ eventType: 'openxiangda.workflow.instance.completed.v2', mode: 'commit', eligibleChildStatuses: ['signing'] },
|
|
76
|
+
{ eventType: 'openxiangda.workflow.instance.rejected.v2', mode: 'release', eligibleChildStatuses: ['rejected'] },
|
|
77
|
+
{ eventType: 'openxiangda.workflow.instance.withdrawn.v2', mode: 'release', eligibleChildStatuses: ['draft'] },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
每个 eventType 也必须列在订阅的 eventTypes 中。不得使用自造应用事件或
|
|
84
|
+
native-data execution 订阅获得此权限。事件 handler 中用已有的
|
|
85
|
+
`OpenXiangdaApplicationDataApiService`,将终态附加到原事务:
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { idempotentTransaction } from 'openxiangda/nest';
|
|
89
|
+
|
|
90
|
+
await applicationData.transaction(idempotentTransaction(
|
|
91
|
+
context.idempotencyKey,
|
|
92
|
+
[childStatusUpdate, auditCreate],
|
|
93
|
+
[],
|
|
94
|
+
{ decimalReservation: {
|
|
95
|
+
reservationKey: originalSubmission.reservationKey,
|
|
96
|
+
transitionKey: context.idempotencyKey,
|
|
97
|
+
childOperationIndex: 0,
|
|
98
|
+
} },
|
|
99
|
+
));
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
选中的 childStatusUpdate 必须是该资源唯一 update,保留正常 expectedRevision。
|
|
103
|
+
模式和金额不能放进终态请求;平台从真实 leased delivery、原始及当前不可变订阅、
|
|
104
|
+
workflow command/instance/subject revision 和台账验证,SDK自动继承已验签事件上下文。
|
|
105
|
+
普通应用凭据或自填事件头不构成授权。精确同键、同payload重放返回原完整事务结果;
|
|
106
|
+
旧轮次不能释放重提后的新占用。重放仍受当前权限、有效事件租约和父记录可读性约束。
|
|
107
|
+
|
|
108
|
+
首批只覆盖主子额度和三个真实审批结果。作废/终止释放 committed 必须另有受管
|
|
109
|
+
真实业务动作;状态枚举不代表已实现该能力,签后金额变更仍拒绝。锁等待最多2秒、
|
|
110
|
+
单条SQL最多5秒,较严格的已有约束优先;retryable 409
|
|
111
|
+
`OPENXIANGDA_NATIVE_DECIMAL_CONTENTION` 不允许换键掩盖未知结果。
|
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
应用开发者从工作区执行 `pnpm openxiangda`。平台负责应用版本、运行状态和恢复决定。工具链自身的 npm 发布由平台维护者负责,应用项目无需复制发包脚本或平台验证矩阵。
|
|
4
4
|
|
|
5
|
+
## 按原操作自助诊断
|
|
6
|
+
|
|
7
|
+
保留原 requestId、commandId、DeploymentRun ID 或 fileId;应用管理员可在已有
|
|
8
|
+
登录工作区查询,不需要服务器账号。目标平台需提供 `application.scoped-diagnostics@1`。
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pnpm openxiangda logs --request-id <原请求ID> --json
|
|
12
|
+
pnpm openxiangda logs --command-id <原命令UUID> --json
|
|
13
|
+
pnpm openxiangda logs --file-id <受管文件UUID> --environment test --json
|
|
14
|
+
pnpm openxiangda logs --deployment-run-id <原RunUUID> --environment production --json
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
requestId 默认最近一小时,结果会显示实际 from/to;跨日排查可传一对 UTC ISO
|
|
18
|
+
时间 `--from` / `--to`(最多 24 小时)。其余定位器按原 ID 查,不接受时间窗口。
|
|
19
|
+
默认环境是 test;production 必须显式选择。结果包含实际站点、应用、环境、观测时间、
|
|
20
|
+
持久状态和是否截断,只投影允许的元数据,不返回业务正文、文件名或密钥。
|
|
21
|
+
|
|
22
|
+
`observed` 仅表示查到事实,仍需看每条状态;`not_observed` 不表示原写入没有发生;
|
|
23
|
+
`unavailable` 表示本次诊断暂不可用。三者都不会重放原操作。保留原 ID、输入和幂等键,
|
|
24
|
+
按返回的下一步查询原回执,不创建新运行代替未知结果。文件存在不等于当前用户可下载。
|
|
25
|
+
|
|
26
|
+
原有 `pnpm openxiangda logs [deploymentId]` 保持部署日志行为。MCP 的
|
|
27
|
+
`application_diagnostics` 使用同一范围和状态约定;requestId 的 from/to 必须明确提供。
|
|
28
|
+
|
|
5
29
|
## 测试部署
|
|
6
30
|
|
|
7
31
|
源码托管仍可通过 `pnpm openxiangda source push` 提交和推送,但不是测试发布的前置步骤。
|
|
@@ -68,10 +68,10 @@ MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置
|
|
|
68
68
|
以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
|
|
69
69
|
|
|
70
70
|
```bash
|
|
71
|
-
pnpm dlx openxiangda@2.
|
|
72
|
-
pnpm dlx openxiangda@2.
|
|
73
|
-
pnpm dlx openxiangda@2.
|
|
74
|
-
pnpm dlx openxiangda@2.
|
|
71
|
+
pnpm dlx openxiangda@2.28.0 skill install --force
|
|
72
|
+
pnpm dlx openxiangda@2.28.0 auth status --base-url <平台地址> --json
|
|
73
|
+
pnpm dlx openxiangda@2.28.0 login --cwd my-app --base-url https://platform.example.com
|
|
74
|
+
pnpm dlx openxiangda@2.28.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.
|
|
178
|
-
pnpm dlx openxiangda@2.
|
|
179
|
-
pnpm dlx openxiangda@2.
|
|
177
|
+
pnpm dlx openxiangda@2.28.0 auth status --base-url <平台> --json
|
|
178
|
+
pnpm dlx openxiangda@2.28.0 source resolve <仓库URL> --base-url <平台> --json
|
|
179
|
+
pnpm dlx openxiangda@2.28.0 source clone <仓库URL> <新目录> --base-url <平台> --json
|
|
180
180
|
```
|
|
181
181
|
|
|
182
182
|
登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "openxiangda.documentation/v1",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.28.0",
|
|
4
4
|
"topics": [
|
|
5
5
|
{
|
|
6
6
|
"id": "getting-started",
|
|
7
7
|
"title": "安装与开始开发",
|
|
8
8
|
"file": "getting-started.md",
|
|
9
|
-
"sha256": "
|
|
9
|
+
"sha256": "e8be6499d3a6493926f5cd71243562a267325a0b800a511ebc31cf841ddfa08e"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"id": "product-design",
|
|
@@ -90,7 +90,13 @@
|
|
|
90
90
|
"id": "backend",
|
|
91
91
|
"title": "按需后端与业务动作",
|
|
92
92
|
"file": "backend.md",
|
|
93
|
-
"sha256": "
|
|
93
|
+
"sha256": "b4f99040c588e384f2b64e4ac74efb4a0728c900feda6170996f3fe5b863d92a"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "decimal-reservations",
|
|
97
|
+
"title": "主子记录精确金额占用",
|
|
98
|
+
"file": "decimal-reservations.md",
|
|
99
|
+
"sha256": "a40f402a297476e37aecdb1a19caa5156b772f35f637b8f7e75fb25864c46321"
|
|
94
100
|
},
|
|
95
101
|
{
|
|
96
102
|
"id": "administration",
|
|
@@ -108,7 +114,7 @@
|
|
|
108
114
|
"id": "delivery",
|
|
109
115
|
"title": "部署、生产晋级与恢复",
|
|
110
116
|
"file": "delivery.md",
|
|
111
|
-
"sha256": "
|
|
117
|
+
"sha256": "fe26351024801784640c876efd3e9816294fc41b4a41fd719856e17425adc106"
|
|
112
118
|
},
|
|
113
119
|
{
|
|
114
120
|
"id": "upgrading",
|
|
@@ -120,13 +126,13 @@
|
|
|
120
126
|
"id": "cli",
|
|
121
127
|
"title": "CLI 命令参考",
|
|
122
128
|
"file": "reference/cli.md",
|
|
123
|
-
"sha256": "
|
|
129
|
+
"sha256": "c3803d06724b6879788d695fc3a9a5a9894299dc50fde5bad58d8320ea4ba32e"
|
|
124
130
|
},
|
|
125
131
|
{
|
|
126
132
|
"id": "mcp",
|
|
127
133
|
"title": "MCP 配置与工具参考",
|
|
128
134
|
"file": "reference/mcp.md",
|
|
129
|
-
"sha256": "
|
|
135
|
+
"sha256": "23a4da755e482f96e520d98f7527052c60bfb9727b48827a661e0f0eaf8ea838"
|
|
130
136
|
}
|
|
131
137
|
]
|
|
132
138
|
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
| `pnpm openxiangda accept` | 远端变更 | 按计划准备可选的真实预发验收身份 |
|
|
16
16
|
| `pnpm openxiangda deploy` | 远端变更 | 部署测试环境或显式复用测试版本部署生产 |
|
|
17
17
|
| `pnpm openxiangda status` | 只读 | 查询最近或指定部署状态 |
|
|
18
|
-
| `pnpm openxiangda logs` | 只读 |
|
|
18
|
+
| `pnpm openxiangda logs` | 只读 | 查询部署日志或应用原操作事实 |
|
|
19
19
|
| `pnpm openxiangda cancel` | 远端变更 | 幂等取消尚未提交激活的部署 |
|
|
20
20
|
| `pnpm openxiangda retry` | 远端变更 | 显式重试可恢复的失败部署 |
|
|
21
21
|
| `pnpm openxiangda start` | 远端变更 | 从当前不可变版本启动应用环境 |
|
|
@@ -561,6 +561,59 @@ MCP 使用项目锁定的根包;在客户端配置下列 stdio 启动参数,
|
|
|
561
561
|
}
|
|
562
562
|
```
|
|
563
563
|
|
|
564
|
+
## application_diagnostics
|
|
565
|
+
|
|
566
|
+
查询应用原操作事实。在当前应用和明确环境内只读查询 requestId、commandId、deploymentRunId 或 fileId。requestId 必须传成对 UTC from/to,最多 24 小时;其余类型不传窗口。未观测到不表示未执行,禁止据此换键重放。
|
|
567
|
+
|
|
568
|
+
- 只读:是
|
|
569
|
+
- 可替换文件或改变远端状态:否
|
|
570
|
+
- 幂等:否
|
|
571
|
+
|
|
572
|
+
输入参数:
|
|
573
|
+
|
|
574
|
+
```json
|
|
575
|
+
{
|
|
576
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
577
|
+
"type": "object",
|
|
578
|
+
"properties": {
|
|
579
|
+
"environment": {
|
|
580
|
+
"default": "test",
|
|
581
|
+
"description": "目标环境;默认 test,production 必须明确选择",
|
|
582
|
+
"type": "string",
|
|
583
|
+
"enum": [
|
|
584
|
+
"test",
|
|
585
|
+
"production"
|
|
586
|
+
]
|
|
587
|
+
},
|
|
588
|
+
"kind": {
|
|
589
|
+
"type": "string",
|
|
590
|
+
"enum": [
|
|
591
|
+
"requestId",
|
|
592
|
+
"commandId",
|
|
593
|
+
"deploymentRunId",
|
|
594
|
+
"fileId"
|
|
595
|
+
]
|
|
596
|
+
},
|
|
597
|
+
"id": {
|
|
598
|
+
"type": "string",
|
|
599
|
+
"minLength": 1,
|
|
600
|
+
"maxLength": 128
|
|
601
|
+
},
|
|
602
|
+
"from": {
|
|
603
|
+
"type": "string"
|
|
604
|
+
},
|
|
605
|
+
"to": {
|
|
606
|
+
"type": "string"
|
|
607
|
+
}
|
|
608
|
+
},
|
|
609
|
+
"required": [
|
|
610
|
+
"kind",
|
|
611
|
+
"id"
|
|
612
|
+
],
|
|
613
|
+
"additionalProperties": false
|
|
614
|
+
}
|
|
615
|
+
```
|
|
616
|
+
|
|
564
617
|
## cancel_deployment
|
|
565
618
|
|
|
566
619
|
取消未激活部署。仅在用户授权且平台 recovery.cancelAllowed 为真时取消;激活后的运行不能取消。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openxiangda",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.28.0",
|
|
4
4
|
"description": "OpenXiangda 2.0 的统一命令、应用 SDK、MCP 与中文 AI 技能资料。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -60,13 +60,13 @@
|
|
|
60
60
|
"antd-mobile": "5.42.3",
|
|
61
61
|
"dayjs": "1.11.18",
|
|
62
62
|
"docx-preview": "0.3.7",
|
|
63
|
-
"openxiangda-cli": "2.5.
|
|
64
|
-
"openxiangda-contracts": "2.
|
|
65
|
-
"openxiangda-devkit-core": "2.
|
|
63
|
+
"openxiangda-cli": "2.5.22",
|
|
64
|
+
"openxiangda-contracts": "2.24.0",
|
|
65
|
+
"openxiangda-devkit-core": "2.26.0",
|
|
66
66
|
"openxiangda-legacy": "npm:openxiangda@1.0.269",
|
|
67
|
-
"openxiangda-mcp": "2.0.
|
|
68
|
-
"openxiangda-nest": "2.
|
|
69
|
-
"openxiangda-skill-kit": "2.3.
|
|
67
|
+
"openxiangda-mcp": "2.0.46",
|
|
68
|
+
"openxiangda-nest": "2.7.1",
|
|
69
|
+
"openxiangda-skill-kit": "2.3.20",
|
|
70
70
|
"xlsx": "https://github.com/1377385356/openxiangda/releases/download/vendor-mirror/xlsx-0.20.3.tgz"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
@@ -132,44 +132,40 @@
|
|
|
132
132
|
},
|
|
133
133
|
"openxiangdaRelease": {
|
|
134
134
|
"schemaVersion": "openxiangda.release-notes/v1",
|
|
135
|
-
"version": "2.
|
|
135
|
+
"version": "2.28.0",
|
|
136
136
|
"status": "reviewed",
|
|
137
|
-
"title": "OpenXiangda 2.
|
|
138
|
-
"summary": "
|
|
137
|
+
"title": "OpenXiangda 2.28.0:应用原操作自助诊断",
|
|
138
|
+
"summary": "应用管理员通过现有工作区查询原请求、持久命令、部署和受管文件的脱敏事实,减少依赖平台人员登录服务器定位问题的情况。",
|
|
139
139
|
"newFeatures": [
|
|
140
|
-
"
|
|
141
|
-
"
|
|
142
|
-
"受信业务动作可读取声明角色的最小候选信息,服务端限定租户、环境、角色和有效期,提交时仍重新授权。"
|
|
140
|
+
"logs 增加 request-id、command-id、deployment-run-id、file-id 四种互斥定位器,MCP 提供相同范围的 application_diagnostics 只读工具。",
|
|
141
|
+
"结果显示实际站点、应用、环境、时间窗口及观测时间;SDK 校验查询与响应关联,只保留受支持的元数据。"
|
|
143
142
|
],
|
|
144
143
|
"fixes": [
|
|
145
|
-
"
|
|
146
|
-
"新建应用和可选后端依赖安装失败保留安全错误分类与恢复提示,安装有界且不回显 registry 凭据。",
|
|
147
|
-
"浏览器请求、导出与授权刷新统一保留安全请求定位信息;网络写入结果未知时不自动重放。"
|
|
144
|
+
"明确区分已观测、未观测和诊断暂不可用;未知结果不再被解释成原操作未执行,也不会触发换键重放。"
|
|
148
145
|
],
|
|
149
146
|
"affectedUsers": [
|
|
150
|
-
"
|
|
151
|
-
"需要类型化 Native 资源绑定及业务角色候选的受管 Nest 扩展。"
|
|
147
|
+
"需要按原操作 ID 自助排查发布、工作流和文件状态的 OpenXiangda 2.0 应用管理员及开发者。"
|
|
152
148
|
],
|
|
153
149
|
"upgradeSteps": [
|
|
154
|
-
"
|
|
155
|
-
"
|
|
156
|
-
"
|
|
150
|
+
"应用消费 openxiangda@2.28.0 并更新锁文件;使用已有工作区开发者登录,不需要服务器账号。",
|
|
151
|
+
"平台应提供 application.scoped-diagnostics@1;查询默认使用 test,生产环境需显式传 --environment production。",
|
|
152
|
+
"保留原操作 ID。request-id 默认查询最近一小时,也可传一对 UTC from/to,窗口最多 24 小时;其他定位器不接受时间窗口。"
|
|
157
153
|
],
|
|
158
154
|
"knownLimitations": [
|
|
159
|
-
"
|
|
160
|
-
"
|
|
161
|
-
"
|
|
162
|
-
"
|
|
155
|
+
"诊断受应用管理权限和当前租户、环境约束;普通应用服务凭据不因此获得管理权限。",
|
|
156
|
+
"每次最多返回 50 条事实,可能标记截断;不返回业务正文、文件名、原始日志或密钥。",
|
|
157
|
+
"未观测不表示原写入未发生,已观测不表示业务验收完成。暂不可用时保留原键与输入,按提示继续查询。",
|
|
158
|
+
"此次新增能力不改变共享 Native 编译器摘要;公开包发行与实际站点部署分别验证。"
|
|
163
159
|
],
|
|
164
160
|
"issues": [],
|
|
165
161
|
"compatibility": {
|
|
166
162
|
"node": ">=24",
|
|
167
163
|
"workspaceGenerations": "v2",
|
|
168
|
-
"platform": "
|
|
169
|
-
"v1": "独立 V1
|
|
164
|
+
"platform": "新诊断入口要求 application.scoped-diagnostics@1.0.0 或兼容 1.x;原 logs [deploymentId] 和未使用此能力的应用保持原行为。",
|
|
165
|
+
"v1": "独立 V1 引擎和工作区不受影响。"
|
|
170
166
|
},
|
|
171
|
-
"sha256": "
|
|
172
|
-
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.
|
|
167
|
+
"sha256": "80c18512f5cb76850e738b9e802261af68e27f6582b3f686781da7c9d4367c2a",
|
|
168
|
+
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.28.0"
|
|
173
169
|
},
|
|
174
170
|
"scripts": {
|
|
175
171
|
"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.27.0",
|
|
4
|
+
"status": "reviewed",
|
|
5
|
+
"title": "OpenXiangda 2.27.0:精确额度审批生命周期",
|
|
6
|
+
"summary": "补齐主子记录精确金额占用的审批终态声明、原轮次事务参数及撤回修订重提接入,保持平台对金额、身份和审批事实的统一校验。",
|
|
7
|
+
"newFeatures": [
|
|
8
|
+
"HTTP 事件订阅可声明同资源审批的额度终态:通过继续占额,驳回或撤回释放;两侧编译器共同校验审批、资源、状态和固定迁移模式。",
|
|
9
|
+
"Native 事务支持绑定原 reservationKey、transitionKey 和唯一子记录 update,Nest 继承已验证的事件上下文,不允许客户端自报额度迁移模式。",
|
|
10
|
+
"提供本人 FormDraft 与 BusinessProcess update 重提组合示例,将修改正式金额、重新占额、消费草稿和生成审批命令放在同一平台事务。"
|
|
11
|
+
],
|
|
12
|
+
"fixes": [
|
|
13
|
+
"事件终态声明参与能力使用摘要;目标必须满足 data.decimal-reservations@1.1.0,不能把仅有数据表和通用防护的旧服务端当作完整额度能力。"
|
|
14
|
+
],
|
|
15
|
+
"affectedUsers": [
|
|
16
|
+
"需要以主记录金额约束多条子记录,并在审批通过、驳回、撤回和重提间管理额度的 OpenXiangda 2.0 应用。"
|
|
17
|
+
],
|
|
18
|
+
"upgradeSteps": [
|
|
19
|
+
"应用固定 openxiangda@2.27.0,更新锁文件,重新生成契约并执行适用检查;平台同步升级匹配的公共编译器、额度实现和向前迁移。",
|
|
20
|
+
"在实际资源和审批中声明 reserve 动作及终态订阅,先确认没有未入账的历史子记录。保留未完成请求的原幂等键和输入。",
|
|
21
|
+
"预发验证并发超额、精确小数、权限拒绝、通过保留占额、释放一次及同记录修订重提。真实验收前保持额度入口禁用。"
|
|
22
|
+
],
|
|
23
|
+
"knownLimitations": [
|
|
24
|
+
"普通 CRUD 不开放 released 子记录保护字段写入;修订先保存本人草稿,再通过原子 update 重提。",
|
|
25
|
+
"作废或终止需要另行实现真实受管业务动作,签后金额变更不在首批能力内。旧轮次事件不能释放新轮次额度。",
|
|
26
|
+
"原回执重放仍要求当前授权、有效事件租约和父记录可读性。",
|
|
27
|
+
"公开包发行不是客户部署或业务验收,不提供应用侧浮点求和替代台账的降级路径。"
|
|
28
|
+
],
|
|
29
|
+
"issues": [],
|
|
30
|
+
"compatibility": {
|
|
31
|
+
"node": ">=24",
|
|
32
|
+
"workspaceGenerations": "v2",
|
|
33
|
+
"platform": "额度应用要求 data.decimal-reservations@1.1.0,并使用与目标平台一致的共享编译器。未启用额度的应用保持原有行为。",
|
|
34
|
+
"v1": "独立 V1 引擎和工作区不受影响。"
|
|
35
|
+
},
|
|
36
|
+
"sha256": "ff07310ebff47f32988ba6c6117f0072daca6497700c8f24ed1c10c92c081b06",
|
|
37
|
+
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.27.0"
|
|
38
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "openxiangda.release-notes/v1",
|
|
3
|
+
"version": "2.28.0",
|
|
4
|
+
"status": "reviewed",
|
|
5
|
+
"title": "OpenXiangda 2.28.0:应用原操作自助诊断",
|
|
6
|
+
"summary": "应用管理员通过现有工作区查询原请求、持久命令、部署和受管文件的脱敏事实,减少依赖平台人员登录服务器定位问题的情况。",
|
|
7
|
+
"newFeatures": [
|
|
8
|
+
"logs 增加 request-id、command-id、deployment-run-id、file-id 四种互斥定位器,MCP 提供相同范围的 application_diagnostics 只读工具。",
|
|
9
|
+
"结果显示实际站点、应用、环境、时间窗口及观测时间;SDK 校验查询与响应关联,只保留受支持的元数据。"
|
|
10
|
+
],
|
|
11
|
+
"fixes": [
|
|
12
|
+
"明确区分已观测、未观测和诊断暂不可用;未知结果不再被解释成原操作未执行,也不会触发换键重放。"
|
|
13
|
+
],
|
|
14
|
+
"affectedUsers": [
|
|
15
|
+
"需要按原操作 ID 自助排查发布、工作流和文件状态的 OpenXiangda 2.0 应用管理员及开发者。"
|
|
16
|
+
],
|
|
17
|
+
"upgradeSteps": [
|
|
18
|
+
"应用消费 openxiangda@2.28.0 并更新锁文件;使用已有工作区开发者登录,不需要服务器账号。",
|
|
19
|
+
"平台应提供 application.scoped-diagnostics@1;查询默认使用 test,生产环境需显式传 --environment production。",
|
|
20
|
+
"保留原操作 ID。request-id 默认查询最近一小时,也可传一对 UTC from/to,窗口最多 24 小时;其他定位器不接受时间窗口。"
|
|
21
|
+
],
|
|
22
|
+
"knownLimitations": [
|
|
23
|
+
"诊断受应用管理权限和当前租户、环境约束;普通应用服务凭据不因此获得管理权限。",
|
|
24
|
+
"每次最多返回 50 条事实,可能标记截断;不返回业务正文、文件名、原始日志或密钥。",
|
|
25
|
+
"未观测不表示原写入未发生,已观测不表示业务验收完成。暂不可用时保留原键与输入,按提示继续查询。",
|
|
26
|
+
"此次新增能力不改变共享 Native 编译器摘要;公开包发行与实际站点部署分别验证。"
|
|
27
|
+
],
|
|
28
|
+
"issues": [],
|
|
29
|
+
"compatibility": {
|
|
30
|
+
"node": ">=24",
|
|
31
|
+
"workspaceGenerations": "v2",
|
|
32
|
+
"platform": "新诊断入口要求 application.scoped-diagnostics@1.0.0 或兼容 1.x;原 logs [deploymentId] 和未使用此能力的应用保持原行为。",
|
|
33
|
+
"v1": "独立 V1 引擎和工作区不受影响。"
|
|
34
|
+
},
|
|
35
|
+
"sha256": "80c18512f5cb76850e738b9e802261af68e27f6582b3f686781da7c9d4367c2a",
|
|
36
|
+
"url": "https://github.com/1377385356/openxiangda/releases/tag/v2.28.0"
|
|
37
|
+
}
|
package/skills/manifest.json
CHANGED
|
@@ -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": "
|
|
7
|
+
"sha256": "87568d43231b261b889782237c8bbe6f2d6237190c4f7ce74cd754e83f9336fd"
|
|
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.
|
|
44
|
-
pnpm dlx openxiangda@2.
|
|
45
|
-
pnpm dlx openxiangda@2.
|
|
46
|
-
pnpm dlx openxiangda@2.
|
|
43
|
+
pnpm dlx openxiangda@2.28.0 auth status --cwd <应用目录> --base-url <平台地址> --json
|
|
44
|
+
pnpm dlx openxiangda@2.28.0 login --cwd <应用目录> --base-url <平台地址>
|
|
45
|
+
pnpm dlx openxiangda@2.28.0 create <应用目录> --base-url <同一平台地址>
|
|
46
|
+
pnpm dlx openxiangda@2.28.0 skill install --force
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
创建前把产品要求的目标平台明确带入命令,不从旧登录态推断站点。已有工作区从原绑定恢复,平台不一致时先解决登录与目标,不改 link 文件跨站创建。
|
|
@@ -71,6 +71,7 @@ pnpm dlx openxiangda@2.26.0 skill install --force
|
|
|
71
71
|
| 外部无账号表单、续填、上传、本人记录 | [匿名公开访问](references/public-access.md) |
|
|
72
72
|
| 审批、待办、消息或事件 | [工作流与通知](references/workflow-events.md) |
|
|
73
73
|
| 自定义事务、校验或外部集成 | [按需后端](references/backend.md) |
|
|
74
|
+
| 主子额度、审批占用释放、撤回修订重提 | [精确金额占用](references/decimal-reservations.md) |
|
|
74
75
|
| 管理成员或查看有效流程参数 | [应用管理](references/administration.md) |
|
|
75
76
|
| 检查、部署、生产发布与故障恢复 | [验收](references/testing.md)、[交付](references/delivery.md) |
|
|
76
77
|
| 需求记录与版本升级 | [全流程记录](references/appspec.md)、[升级](references/upgrading.md) |
|
|
@@ -321,3 +321,5 @@ if (output.status === 'pending') {
|
|
|
321
321
|
```
|
|
322
322
|
|
|
323
323
|
这些方法适用于当前用户、具名业务动作和应用服务身份,沿用各自权限;业务记录绑定仍需正式数据事务。输出目前支持 OSS/MinIO,受字段上限与100MiB硬上限约束,上传凭据五分钟后过期,完成须在额外十分钟内进行。过期错误应由调用者建立新的处理意图,不能无限重试相同过期计划。下载最长五分钟,签发后到期前为短期委托,不能即时撤回。不要在日志、持久草稿或业务数据中保存签名地址、POST policy 或签名字段。
|
|
324
|
+
|
|
325
|
+
主子记录共享精确金额额度、撤回修订和审批释放,请使用[精确金额占用](decimal-reservations.md)的受管提交及终态事务。
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
| `pnpm openxiangda accept` | 远端变更 | 按计划准备可选的真实预发验收身份 |
|
|
16
16
|
| `pnpm openxiangda deploy` | 远端变更 | 部署测试环境或显式复用测试版本部署生产 |
|
|
17
17
|
| `pnpm openxiangda status` | 只读 | 查询最近或指定部署状态 |
|
|
18
|
-
| `pnpm openxiangda logs` | 只读 |
|
|
18
|
+
| `pnpm openxiangda logs` | 只读 | 查询部署日志或应用原操作事实 |
|
|
19
19
|
| `pnpm openxiangda cancel` | 远端变更 | 幂等取消尚未提交激活的部署 |
|
|
20
20
|
| `pnpm openxiangda retry` | 远端变更 | 显式重试可恢复的失败部署 |
|
|
21
21
|
| `pnpm openxiangda start` | 远端变更 | 从当前不可变版本启动应用环境 |
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# 主子记录精确金额占用
|
|
2
|
+
|
|
3
|
+
需要跨多条子记录共享主记录额度时,使用平台 `data.decimal-reservations` 1.1.0,
|
|
4
|
+
金额字段声明 `number.decimal`、`precision: 18`、`scale: 2`、`exactDecimal: true`。
|
|
5
|
+
JSON 金额使用字符串。平台在父记录锁内用 PostgreSQL NUMERIC 校验占用;应用不做
|
|
6
|
+
浮点求和、不维护另一个余额字段。此能力需要匹配 SDK、平台镜像和迁移;包安装成功
|
|
7
|
+
不表示目标环境已就绪,先检查平台能力和正式部署回执。
|
|
8
|
+
|
|
9
|
+
## 声明与首次提交
|
|
10
|
+
|
|
11
|
+
提交的 Named Action 在 `platformAccess.decimalReservation` 声明 `mode: 'reserve'`、
|
|
12
|
+
资源、amount/currency/relation/parent/root/status 六个字段、主子关系取值和允许状态,
|
|
13
|
+
并用 `platformAccess.workflow.codes` 声明实际审批。当前用户仍需资源与字段读写权限。
|
|
14
|
+
首次使用会冻结环境内该资源的映射;已有未入账子记录时拒绝启用,不自动补账。
|
|
15
|
+
|
|
16
|
+
在 `OpenXiangdaBusinessProcessService.commit` 顶层增加:
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
const decimalReservation = {
|
|
20
|
+
parentId,
|
|
21
|
+
expectedParentRevision: parent.revision,
|
|
22
|
+
childOperationKey: 'child',
|
|
23
|
+
reservationKey: submission.reservationKey,
|
|
24
|
+
amount: '123.45',
|
|
25
|
+
currencyCode: 'CNY',
|
|
26
|
+
};
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`childOperationKey` 同 `workflow.subject.fromOperation`,选中唯一一条该资源的
|
|
30
|
+
create 或 update。平台原子完成子记录、占额、审批命令和可选本人草稿消费。
|
|
31
|
+
审批通过将 reserved 改为 committed,继续占额;驳回或撤回释放一次。
|
|
32
|
+
|
|
33
|
+
## 撤回后修订并重提
|
|
34
|
+
|
|
35
|
+
released 子记录仍不能通过普通 CRUD 或 `BusinessData.transaction` 修改金额、
|
|
36
|
+
状态、父/root/关系等保护字段。界面把修订保存到本人 FormDraft,重提时一次提交:
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
await businessProcess.commit({
|
|
40
|
+
idempotencyKey: submission.idempotencyKey,
|
|
41
|
+
data: {
|
|
42
|
+
operations: [{
|
|
43
|
+
key: 'child', kind: 'update', resourceCode: 'contracts',
|
|
44
|
+
id: child.id, expectedRevision: child.revision,
|
|
45
|
+
data: {
|
|
46
|
+
title: draft.title,
|
|
47
|
+
amount: '123.45',
|
|
48
|
+
status: { value: 'approving' },
|
|
49
|
+
},
|
|
50
|
+
}],
|
|
51
|
+
},
|
|
52
|
+
formDraft: {
|
|
53
|
+
resourceCode: 'contracts', id: draft.id,
|
|
54
|
+
expectedRevision: draft.revision, mode: 'update', recordId: child.id,
|
|
55
|
+
},
|
|
56
|
+
decimalReservation,
|
|
57
|
+
workflow: { workflowCode: 'contract-approval', subject: { fromOperation: 'child' } },
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
每次新的提交意图使用新的 reservationKey 和提交键;网络结果未知时保留原键及原
|
|
62
|
+
payload查询/重试,不能用新键重做旧请求。更新保留父/root/关系,失败会整体回滚,
|
|
63
|
+
本人草稿仍可恢复,正式金额与审批命令不会半完成。普通主记录继续原来的无额度路径。
|
|
64
|
+
|
|
65
|
+
## 真实审批事件终态
|
|
66
|
+
|
|
67
|
+
在真实审批消费者的 `platformAccess` 增加以下声明;其中状态取值由应用自己的
|
|
68
|
+
资源选项决定。审批必须声明同一 subject 资源,且存在该资源的 reserve 动作映射。
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
platformAccess: {
|
|
72
|
+
decimalReservation: {
|
|
73
|
+
resourceCode: 'contracts', workflowCode: 'contract-approval',
|
|
74
|
+
outcomes: [
|
|
75
|
+
{ eventType: 'openxiangda.workflow.instance.completed.v2', mode: 'commit', eligibleChildStatuses: ['signing'] },
|
|
76
|
+
{ eventType: 'openxiangda.workflow.instance.rejected.v2', mode: 'release', eligibleChildStatuses: ['rejected'] },
|
|
77
|
+
{ eventType: 'openxiangda.workflow.instance.withdrawn.v2', mode: 'release', eligibleChildStatuses: ['draft'] },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
每个 eventType 也必须列在订阅的 eventTypes 中。不得使用自造应用事件或
|
|
84
|
+
native-data execution 订阅获得此权限。事件 handler 中用已有的
|
|
85
|
+
`OpenXiangdaApplicationDataApiService`,将终态附加到原事务:
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { idempotentTransaction } from 'openxiangda/nest';
|
|
89
|
+
|
|
90
|
+
await applicationData.transaction(idempotentTransaction(
|
|
91
|
+
context.idempotencyKey,
|
|
92
|
+
[childStatusUpdate, auditCreate],
|
|
93
|
+
[],
|
|
94
|
+
{ decimalReservation: {
|
|
95
|
+
reservationKey: originalSubmission.reservationKey,
|
|
96
|
+
transitionKey: context.idempotencyKey,
|
|
97
|
+
childOperationIndex: 0,
|
|
98
|
+
} },
|
|
99
|
+
));
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
选中的 childStatusUpdate 必须是该资源唯一 update,保留正常 expectedRevision。
|
|
103
|
+
模式和金额不能放进终态请求;平台从真实 leased delivery、原始及当前不可变订阅、
|
|
104
|
+
workflow command/instance/subject revision 和台账验证,SDK自动继承已验签事件上下文。
|
|
105
|
+
普通应用凭据或自填事件头不构成授权。精确同键、同payload重放返回原完整事务结果;
|
|
106
|
+
旧轮次不能释放重提后的新占用。重放仍受当前权限、有效事件租约和父记录可读性约束。
|
|
107
|
+
|
|
108
|
+
首批只覆盖主子额度和三个真实审批结果。作废/终止释放 committed 必须另有受管
|
|
109
|
+
真实业务动作;状态枚举不代表已实现该能力,签后金额变更仍拒绝。锁等待最多2秒、
|
|
110
|
+
单条SQL最多5秒,较严格的已有约束优先;retryable 409
|
|
111
|
+
`OPENXIANGDA_NATIVE_DECIMAL_CONTENTION` 不允许换键掩盖未知结果。
|
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
应用开发者从工作区执行 `pnpm openxiangda`。平台负责应用版本、运行状态和恢复决定。工具链自身的 npm 发布由平台维护者负责,应用项目无需复制发包脚本或平台验证矩阵。
|
|
4
4
|
|
|
5
|
+
## 按原操作自助诊断
|
|
6
|
+
|
|
7
|
+
保留原 requestId、commandId、DeploymentRun ID 或 fileId;应用管理员可在已有
|
|
8
|
+
登录工作区查询,不需要服务器账号。目标平台需提供 `application.scoped-diagnostics@1`。
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pnpm openxiangda logs --request-id <原请求ID> --json
|
|
12
|
+
pnpm openxiangda logs --command-id <原命令UUID> --json
|
|
13
|
+
pnpm openxiangda logs --file-id <受管文件UUID> --environment test --json
|
|
14
|
+
pnpm openxiangda logs --deployment-run-id <原RunUUID> --environment production --json
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
requestId 默认最近一小时,结果会显示实际 from/to;跨日排查可传一对 UTC ISO
|
|
18
|
+
时间 `--from` / `--to`(最多 24 小时)。其余定位器按原 ID 查,不接受时间窗口。
|
|
19
|
+
默认环境是 test;production 必须显式选择。结果包含实际站点、应用、环境、观测时间、
|
|
20
|
+
持久状态和是否截断,只投影允许的元数据,不返回业务正文、文件名或密钥。
|
|
21
|
+
|
|
22
|
+
`observed` 仅表示查到事实,仍需看每条状态;`not_observed` 不表示原写入没有发生;
|
|
23
|
+
`unavailable` 表示本次诊断暂不可用。三者都不会重放原操作。保留原 ID、输入和幂等键,
|
|
24
|
+
按返回的下一步查询原回执,不创建新运行代替未知结果。文件存在不等于当前用户可下载。
|
|
25
|
+
|
|
26
|
+
原有 `pnpm openxiangda logs [deploymentId]` 保持部署日志行为。MCP 的
|
|
27
|
+
`application_diagnostics` 使用同一范围和状态约定;requestId 的 from/to 必须明确提供。
|
|
28
|
+
|
|
5
29
|
## 测试部署
|
|
6
30
|
|
|
7
31
|
源码托管仍可通过 `pnpm openxiangda source push` 提交和推送,但不是测试发布的前置步骤。
|
|
@@ -68,10 +68,10 @@ MCP 服务随项目根包一起安装,AI 客户端的 stdio 连接仍需配置
|
|
|
68
68
|
以下命令的版本占位符由随包资料替换为该根包的精确版本。网站源码阅读者应先确认要使用的发行版本。
|
|
69
69
|
|
|
70
70
|
```bash
|
|
71
|
-
pnpm dlx openxiangda@2.
|
|
72
|
-
pnpm dlx openxiangda@2.
|
|
73
|
-
pnpm dlx openxiangda@2.
|
|
74
|
-
pnpm dlx openxiangda@2.
|
|
71
|
+
pnpm dlx openxiangda@2.28.0 skill install --force
|
|
72
|
+
pnpm dlx openxiangda@2.28.0 auth status --base-url <平台地址> --json
|
|
73
|
+
pnpm dlx openxiangda@2.28.0 login --cwd my-app --base-url https://platform.example.com
|
|
74
|
+
pnpm dlx openxiangda@2.28.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.
|
|
178
|
-
pnpm dlx openxiangda@2.
|
|
179
|
-
pnpm dlx openxiangda@2.
|
|
177
|
+
pnpm dlx openxiangda@2.28.0 auth status --base-url <平台> --json
|
|
178
|
+
pnpm dlx openxiangda@2.28.0 source resolve <仓库URL> --base-url <平台> --json
|
|
179
|
+
pnpm dlx openxiangda@2.28.0 source clone <仓库URL> <新目录> --base-url <平台> --json
|
|
180
180
|
```
|
|
181
181
|
|
|
182
182
|
登录缺失或站点不匹配时,先按该平台执行 login。resolve 根据平台已经登记的绑定返回
|
|
@@ -561,6 +561,59 @@ MCP 使用项目锁定的根包;在客户端配置下列 stdio 启动参数,
|
|
|
561
561
|
}
|
|
562
562
|
```
|
|
563
563
|
|
|
564
|
+
## application_diagnostics
|
|
565
|
+
|
|
566
|
+
查询应用原操作事实。在当前应用和明确环境内只读查询 requestId、commandId、deploymentRunId 或 fileId。requestId 必须传成对 UTC from/to,最多 24 小时;其余类型不传窗口。未观测到不表示未执行,禁止据此换键重放。
|
|
567
|
+
|
|
568
|
+
- 只读:是
|
|
569
|
+
- 可替换文件或改变远端状态:否
|
|
570
|
+
- 幂等:否
|
|
571
|
+
|
|
572
|
+
输入参数:
|
|
573
|
+
|
|
574
|
+
```json
|
|
575
|
+
{
|
|
576
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
577
|
+
"type": "object",
|
|
578
|
+
"properties": {
|
|
579
|
+
"environment": {
|
|
580
|
+
"default": "test",
|
|
581
|
+
"description": "目标环境;默认 test,production 必须明确选择",
|
|
582
|
+
"type": "string",
|
|
583
|
+
"enum": [
|
|
584
|
+
"test",
|
|
585
|
+
"production"
|
|
586
|
+
]
|
|
587
|
+
},
|
|
588
|
+
"kind": {
|
|
589
|
+
"type": "string",
|
|
590
|
+
"enum": [
|
|
591
|
+
"requestId",
|
|
592
|
+
"commandId",
|
|
593
|
+
"deploymentRunId",
|
|
594
|
+
"fileId"
|
|
595
|
+
]
|
|
596
|
+
},
|
|
597
|
+
"id": {
|
|
598
|
+
"type": "string",
|
|
599
|
+
"minLength": 1,
|
|
600
|
+
"maxLength": 128
|
|
601
|
+
},
|
|
602
|
+
"from": {
|
|
603
|
+
"type": "string"
|
|
604
|
+
},
|
|
605
|
+
"to": {
|
|
606
|
+
"type": "string"
|
|
607
|
+
}
|
|
608
|
+
},
|
|
609
|
+
"required": [
|
|
610
|
+
"kind",
|
|
611
|
+
"id"
|
|
612
|
+
],
|
|
613
|
+
"additionalProperties": false
|
|
614
|
+
}
|
|
615
|
+
```
|
|
616
|
+
|
|
564
617
|
## cancel_deployment
|
|
565
618
|
|
|
566
619
|
取消未激活部署。仅在用户授权且平台 recovery.cancelAllowed 为真时取消;激活后的运行不能取消。
|