openxiangda-skill-kit 2.3.24 → 2.3.26
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openxiangda-skill-kit",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.26",
|
|
4
4
|
"description": "OpenXiangda 2.0 中文 AI 技能的校验、分发与安装。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"README.md"
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"openxiangda-devkit-core": "2.
|
|
20
|
+
"openxiangda-devkit-core": "2.31.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"tsx": "4.23.12",
|
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": "871448e26196cbf1a121f67fbffe018afa216d15d88ee6c2d76663b0d16178ca"
|
|
8
8
|
}
|
|
9
9
|
]
|
|
10
10
|
}
|
|
@@ -72,6 +72,7 @@ pnpm dlx openxiangda@__OPENXIANGDA_VERSION__ skill install --force
|
|
|
72
72
|
| 审批、待办、消息或事件 | [工作流与通知](references/workflow-events.md) |
|
|
73
73
|
| 自定义事务、校验或外部集成 | [按需后端](references/backend.md) |
|
|
74
74
|
| 主子额度、审批占用释放、撤回修订重提 | [精确金额占用](references/decimal-reservations.md) |
|
|
75
|
+
| 热点读取、抢票、排队、名额预占与原结果恢复 | [缓存、排队与配额](references/managed-concurrency.md) |
|
|
75
76
|
| 管理成员或查看有效流程参数 | [应用管理](references/administration.md) |
|
|
76
77
|
| 检查、部署、生产发布与故障恢复 | [验收](references/testing.md)、[交付](references/delivery.md) |
|
|
77
78
|
| 需求记录与版本升级 | [全流程记录](references/appspec.md)、[升级](references/upgrading.md) |
|
|
@@ -29,6 +29,61 @@ pnpm openxiangda check
|
|
|
29
29
|
|
|
30
30
|
角色成员、维度授权和平台管理员由平台管理面维护,不属于应用开发 CLI。
|
|
31
31
|
|
|
32
|
+
### 条件唯一键
|
|
33
|
+
|
|
34
|
+
需要“同一编号只能有一条有效主档”时,在模型声明 `uniqueKeys`。平台在环境
|
|
35
|
+
激活时安装约束;普通 CRUD、导入和业务事务共用该约束。应用无需先查重再创建,
|
|
36
|
+
也无需另建锁服务。声明会自动要求平台能力 `data.unique-keys@1.0.0`,旧平台在
|
|
37
|
+
发布前明确报告缺少能力。未声明的模型不增加这一要求。
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
const partners = defineDataModel({
|
|
41
|
+
code: 'partners', name: '往来单位',
|
|
42
|
+
fields: [
|
|
43
|
+
{ code: 'externalId', label: '外部编号', type: 'text.short' },
|
|
44
|
+
{ code: 'name', label: '名称', type: 'text.short' },
|
|
45
|
+
{ code: 'state', label: '状态', type: 'option.single', options: [
|
|
46
|
+
{ value: 'active', label: '有效' }, { value: 'void', label: '作废' },
|
|
47
|
+
] },
|
|
48
|
+
],
|
|
49
|
+
uniqueKeys: [{
|
|
50
|
+
code: 'active-external-id',
|
|
51
|
+
fields: [{ fieldCode: 'externalId', normalizer: 'nfkc-upper-ascii-v1' }],
|
|
52
|
+
when: [{ fieldCode: 'state', operator: 'in', values: ['active'] }],
|
|
53
|
+
}],
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
规则只比较同一租户、应用与环境内的记录。上例中 `ABC` 和 `abc` 视为相同
|
|
58
|
+
编号,只有 `active` 记录参与;切换状态进入比较集合时也执行约束。平台不会猜测
|
|
59
|
+
业务中的有效、作废或软删除语义,条件由应用声明。
|
|
60
|
+
|
|
61
|
+
- 每模型最多 8 条,稳定 `code` 使用最长 20 字符的 lower-kebab-case;每条包含
|
|
62
|
+
1–4 个不重复字段、最多 4 个 AND 条件。
|
|
63
|
+
- 字段支持短文本、UUID、单选和单记录引用;单选/引用比较保存的 `value`,忽略标签。
|
|
64
|
+
- `exact-v1` 原样比较(默认);文本可用 `nfkc-space-v1` 做 NFKC 归一化、Unicode
|
|
65
|
+
空白折叠和首尾修剪,或 `nfkc-upper-ascii-v1` 再将 ASCII 小写转大写。非文本只
|
|
66
|
+
支持 exact;不按操作系统 locale 折叠其他文字大小写。
|
|
67
|
+
- 文本条件是 `empty` / `nonempty`,按 NFKC 空白规则判断;单选条件是 `in` /
|
|
68
|
+
`notIn`,包含 1–16 个已声明选项值。缺失选项不满足 `notIn`。
|
|
69
|
+
- 任一键字段为空或归一化后为空,该行不参加比较。需要每行填写时仍应声明字段
|
|
70
|
+
必填。参与比较的每个字段归一化后最多 256 个 UTF-8 字节。
|
|
71
|
+
|
|
72
|
+
重复写入返回 HTTP 409 `OPENXIANGDA_NATIVE_DATA_RESOURCE_UNIQUE_CONFLICT`,并给出
|
|
73
|
+
`resourceCode`、`ruleCode`;不会泄露其他记录 ID、值或原始 SQL。界面应让用户核实
|
|
74
|
+
输入并复用自己有权访问的记录,不自动重试创建。超长返回 HTTP 422
|
|
75
|
+
`OPENXIANGDA_NATIVE_DATA_RESOURCE_UNIQUE_VALUE_TOO_LONG`。事务中的任何操作失败,
|
|
76
|
+
该事务的记录、事件及回执整体回滚。
|
|
77
|
+
|
|
78
|
+
首次启用会检查历史数据。发现重复或超长时,激活失败且原环境 Head 保持;平台
|
|
79
|
+
不会自动合并、改名或删除数据。已有规则可原样保留或新增规则,修改/移除规则、
|
|
80
|
+
替换其字段类型或删除所用字段需要平台受管迁移。连接开发仍可添加普通字段,但
|
|
81
|
+
规则变化会要求先正式激活测试版本。回滚到旧模型时也应保留已经安装的规则。
|
|
82
|
+
|
|
83
|
+
平台为安装设置有界锁等待与扫描预算,超时不会留下部分约束。归一化依赖数据库
|
|
84
|
+
版本;跨 PostgreSQL 大版本升级由平台安排受管重建,不能由应用绕过规则或重试
|
|
85
|
+
写入来修复。
|
|
86
|
+
|
|
32
87
|
### 授权来源声明
|
|
33
88
|
|
|
34
89
|
应用可以在 `authz` 中声明四类授权来源,让平台从业务数据投影出维度授权、应用角色成员和
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# 缓存、排队与整数配额
|
|
2
|
+
|
|
3
|
+
`data.concurrency` 是可选的平台声明,用于限量申领、抢票和预约。平台负责缓存回源、等待资格、持久受理、受控 Native 事务及整数配额;应用通过 `openxiangda/react` 或 `openxiangda/mobile` 调用。平台必须声明能力 `data.managed-concurrency@1.0.0`。旧平台会在编译/发布能力检查阶段拒绝此声明。
|
|
4
|
+
|
|
5
|
+
## 声明与权限
|
|
6
|
+
|
|
7
|
+
完整且由双编译器测试验证的示例位于源码 `examples/managed-concurrency/declaration.ts`。调用 `defineOpenXiangdaApp(concurrencyExample())` 即可编译。把示例中的 `data.concurrency` 合入应用配置,并按实际业务配置模型和参与权限。
|
|
8
|
+
|
|
9
|
+
| 声明 | 作用 |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| `reads` | 命名读取、有限参数、字段、条件、权限范围、新鲜期、旧值期限、失效字段和回源预算 |
|
|
12
|
+
| `admission` | 本应用/环境所有命令共享的每秒速率、突发额度、在途上限 |
|
|
13
|
+
| `commands` | 当前用户的能力、按资源分队列、最长等待、处理截止、Native 守卫和原子写入 |
|
|
14
|
+
| `quotas` | 容量来源、业务记录上的分配 ID、可选的预占到期时间 |
|
|
15
|
+
|
|
16
|
+
参数限于 UUID、有限字符串枚举和有限整数范围;绑定只接受 `input`、可信 `actor`、字面量和平台生成的 `allocation`。每个命令最多 8 个操作、8 个记录守卫。首版不执行应用任意 JS/SQL,也不在锁内调用外部系统。通知和外部副作用接已有事务后事件。
|
|
17
|
+
|
|
18
|
+
配额来源模型的容量字段必须是整数;分配记录模型的引用字段必须是必填 UUID,模型设置 `mutationOwner: 'queued-command'`。角色仍须具备来源读取、分配模型创建和命令能力。普通 CRUD、导入、应用凭据均不能绕过命令所有权。用户身份由 `actor` 绑定,不能使用用户填写的人员编号决定名额归属。
|
|
19
|
+
|
|
20
|
+
`database-now` 条件使用数据库时间,并按“字段 操作符 当前时间”解释。例如截止前允许报名:`{ kind: 'database-now', field: 'closesAt', operator: 'gt' }`。资格和业务截止在执行时重验,因此等待或已受理不等于一定成功。
|
|
21
|
+
|
|
22
|
+
## 展示读取
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
const client = createManagedConcurrencyClient();
|
|
26
|
+
const snapshot = await client.read('offer', { id: selectedOfferId });
|
|
27
|
+
// snapshot.items、generatedAt、freshUntil、staleUntil、version、freshness
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
在平台身份初始化完成后创建并保持 `client` 实例稳定。它绑定应用、环境和当前用户;切换身份后旧客户端拒绝继续操作。组织内共享内容也要求登录与当前权限。`scope: 'application'` 不允许行策略或 actor 条件;个人/有行策略的数据使用 `scope: 'subject'`。
|
|
31
|
+
|
|
32
|
+
每次访问仍通过平台现有身份、版本与字段权限链路。缓存减少内容查询;不能据此宣称整个请求零 SQL。活动内容和余量使用不同读取声明与依赖,避免每次报名使详情失效。`dependencies` 必须覆盖返回和过滤字段。Native 提交在同一事务写失效事实,恢复任务负责可靠推进;变更传播有延迟,要求即时资格或即时关闭的判断必须放在命令守卫中。
|
|
33
|
+
|
|
34
|
+
冷缓存使用进程请求合并与跨副本刷新租约,短暂争用返回可重试响应。负缓存最长 5 秒,TTL 带随机抖动。可在应用版本激活后,用正常授权的 `read` 调用预热有限的热点 ID。首版提供认证后的 Redis/进程缓存,不提供公共 CDN 发布或自动扫描全量数据预热。
|
|
35
|
+
|
|
36
|
+
## 提交与原结果恢复
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
import { useMemo } from 'react';
|
|
40
|
+
import { createManagedConcurrencyClient, useManagedCommand,
|
|
41
|
+
ManagedCommandStatus } from 'openxiangda/react';
|
|
42
|
+
|
|
43
|
+
export function Claim({ offerId }: { offerId: string }) {
|
|
44
|
+
// 父级在平台身份就绪后挂载;身份变化时重新挂载此子树。
|
|
45
|
+
const client = useMemo(() => createManagedConcurrencyClient(), []);
|
|
46
|
+
const command = useManagedCommand({ client, command: 'claim',
|
|
47
|
+
input: { id: offerId }, storageKey: offerId });
|
|
48
|
+
return <>
|
|
49
|
+
<button disabled={command.state !== 'idle'}
|
|
50
|
+
onClick={() => void command.start().catch(() => {})}>申请</button>
|
|
51
|
+
<ManagedCommandStatus snapshot={command} />
|
|
52
|
+
{command.state === 'error' && <button
|
|
53
|
+
onClick={() => void command.resume().catch(() => {})}>恢复原操作</button>}
|
|
54
|
+
</>;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
挂载只恢复已有请求,用户调用 `start()` 才创建新意图。默认以 `sessionStorage` 保存原请求键及恢复资料,刷新后继续查原结果;浏览器禁止存储时明确失败,不自动改用易丢失的内存状态。可传入同接口的可靠存储。不要另写循环换请求键重试。
|
|
59
|
+
|
|
60
|
+
等待阶段只轮询签名票据,不重复查业务数据。SDK 遵守建议间隔并加抖动,故障时逐步退避至约 30 秒。组件卸载或 `stop()` 只停止观察,不取消已受理命令。取消使用 `cancel()`,会核对原命令并处理与受理竞争的情况。只有已知终态才能 `clear()` 开始新意图。
|
|
61
|
+
|
|
62
|
+
需要先排队再加载重型页面时,设置 `autoAccept: false`,用 `ManagedCommandGate` 的 `children={() => <HeavyContent />}` 延迟构建子树;用户确认后调用 `submit()`。命令输入在排队时固定。它不替代整站认证、应用启动元数据或未使用此能力的接口预算,也不能保护提前在父组件发起的请求。
|
|
63
|
+
|
|
64
|
+
| 状态 | 含义 |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| `waiting` / `admitted` | 等待/获准受理,尚未占名额 |
|
|
67
|
+
| `accepted` / `executing` / `retry_wait` | 已持久受理,平台继续处理 |
|
|
68
|
+
| `succeeded` | 权威事务已提交,原结果可恢复 |
|
|
69
|
+
| `rejected` / `expired` / `cancelled` | 明确终态 |
|
|
70
|
+
| `recovering` / `error` | 正在核对/暂时无法确认,保留原请求键 |
|
|
71
|
+
|
|
72
|
+
## 配额和发布边界
|
|
73
|
+
|
|
74
|
+
立即分配用 `quota.action: 'allocate', mode: 'committed'`;需要预占时声明 `reservationSeconds` 并用 `mode: 'reserved'`。另声明 `confirm`、`release` 命令,绑定原 `allocation`,该命令的 `operations` 为空。只有原主体可确认/释放;到期与确认竞争使用数据库时间及固定锁顺序。
|
|
75
|
+
|
|
76
|
+
原命令回执不可变。预占之后到期或释放,应调用 `client.allocation(allocationId)` 获取当前分配状态,不能用旧成功回执证明仍持有名额。首版同一池/主体保留永久去重事实,释放后不会自动重新报名;应用若需要新一轮,应使用新的权威资源/配额池,不能删除历史分配。
|
|
77
|
+
|
|
78
|
+
容量减少不能低于已预占加已确认数量。存在配额历史时,禁止删除来源、改写分配引用或发布移除配额映射的版本。应用激活先排空所有非终态命令;不会让旧任务在新 Head 上执行。连接开发消费已激活测试版本的并发声明,未激活的本地模型覆盖层不能作为持久命令契约。
|
|
79
|
+
|
|
80
|
+
## 资源上限与故障处理
|
|
81
|
+
|
|
82
|
+
| 边界 | 首版硬上限 |
|
|
83
|
+
| --- | --- |
|
|
84
|
+
| 每应用/环境等待 | 128 个资源队列、合计 10000 人,同时受声明的更小上限约束 |
|
|
85
|
+
| 缓存 | 单值 256 KiB;应用/环境累计 32 MiB、2048 个有效键;进程 L1 最多 256 个条目 |
|
|
86
|
+
| 回源 | 每进程 2 个、每应用跨副本 2 个;应用合计 20 次/秒并受声明预算限制 |
|
|
87
|
+
| HTTP | 并发能力普通入口每进程 8 个,查原结果独立 4 个 |
|
|
88
|
+
| worker | 每进程最多 2 个,同一资源通过数据库事务锁协调 |
|
|
89
|
+
|
|
90
|
+
Redis 不可用会停止新准入和缓存回源,绝不把所有请求直接放到数据库。已持久受理命令依赖 PostgreSQL 和现有 RabbitMQ 恢复;原结果在 Redis 故障时每进程最多 4 次/秒、4 个并发可回查。Redis 丢失会重建在途事实并换票据世代,临时等待位置可能变化。
|
|
91
|
+
|
|
92
|
+
RabbitMQ 的消息只是唤醒提示;队列丢失或发布失败由数据库恢复,重复消息读取同一命令。锁等待或慢执行触发有界重试与应用短暂暂停放行。系统并不承诺跨队列严格公平,也不承诺一旦排队就必定获票。
|
|
93
|
+
|
|
94
|
+
管理员可使用同源 POST `/openxiangda-api/v2/applications/:appCode/native/concurrency/status`,请求带 `environmentKey`,查看非终态数量/最早时间、最多 100 个配额池及当前进程缓存指标。`control` 接收 `{ environmentKey, paused: true }` 停止新受理;只允许应用超级管理员。停用或回滚前停止受理、排空命令、保留配额与原结果;不得通过删锁、删队列数据补偿业务。
|
|
95
|
+
|
|
96
|
+
暂停/恢复按同一个环境锁串行传播;Redis 不可用时控制接口明确报错。控制值是绝对值,可以使用相同 `paused` 重试并核对状态。数据库提交确认丢失时不猜测控制结果;受理始终复查数据库的暂停状态。
|
|
97
|
+
|
|
98
|
+
验证应包括内容 SQL 与授权 SQL 占比、每秒完成数、P95/P99、最老等待、连接数、锁等待和恢复时间。仓库故障测试证明协议边界,不代表任何客户环境的生产吞吐。部署者仍需使用目标硬件、真实权限和活动规模做容量验收。
|