@tier0/sdk-v2 0.2.2 → 0.4.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/README.md +35 -15
- package/dist/cjs/capabilities.js +2 -2
- package/dist/cjs/capabilities.js.map +1 -1
- package/dist/cjs/client.d.ts +283 -375
- package/dist/cjs/cloud-transport.js +7 -3
- package/dist/cjs/cloud-transport.js.map +1 -1
- package/dist/cjs/controls.d.ts +19 -7
- package/dist/cjs/controls.js +37 -34
- package/dist/cjs/controls.js.map +1 -1
- package/dist/cjs/data/bootstrap.js +3 -2
- package/dist/cjs/data/bootstrap.js.map +1 -1
- package/dist/cjs/data/collection.d.ts +22 -0
- package/dist/cjs/data/collection.js +10 -9
- package/dist/cjs/data/collection.js.map +1 -1
- package/dist/cjs/data/schema.js +5 -1
- package/dist/cjs/data/schema.js.map +1 -1
- package/dist/cjs/files.d.ts +9 -9
- package/dist/cjs/mq/broker.d.ts +1 -1
- package/dist/cjs/mq/broker.js +1 -1
- package/dist/cjs/mq/broker.js.map +1 -1
- package/dist/cjs/mq/types.d.ts +1 -1
- package/dist/cjs/mq/types.js.map +1 -1
- package/dist/cjs/openapi/api.generated.d.ts +417 -541
- package/dist/cjs/openapi/api.generated.js +292 -377
- package/dist/cjs/openapi/api.generated.js.map +1 -1
- package/dist/cjs/openapi/client.js +1 -1
- package/dist/cjs/openapi/client.js.map +1 -1
- package/dist/cjs/openapi/codecs.generated.d.ts +394 -652
- package/dist/cjs/openapi/codecs.generated.js +2 -2
- package/dist/cjs/openapi/codecs.generated.js.map +1 -1
- package/dist/cjs/openapi/types.generated.d.ts +696 -905
- package/dist/cjs/openapi/types.generated.js.map +1 -1
- package/dist/cjs/source.d.ts +1 -7
- package/dist/cjs/source.js +2 -3
- package/dist/cjs/source.js.map +1 -1
- package/dist/cjs/stream.d.ts +0 -8
- package/dist/cjs/stream.js +3 -5
- package/dist/cjs/stream.js.map +1 -1
- package/dist/cjs/uns-v2/codec.js +1 -1
- package/dist/cjs/uns-v2/codec.js.map +1 -1
- package/dist/cjs/uns-v2/generated.d.ts +4590 -13315
- package/dist/cjs/uns-v2/generated.js +21 -42
- package/dist/cjs/uns-v2/generated.js.map +1 -1
- package/dist/esm/capabilities.js +2 -2
- package/dist/esm/capabilities.js.map +1 -1
- package/dist/esm/client.d.ts +283 -375
- package/dist/esm/cloud-transport.js +7 -3
- package/dist/esm/cloud-transport.js.map +1 -1
- package/dist/esm/controls.d.ts +19 -7
- package/dist/esm/controls.js +38 -35
- package/dist/esm/controls.js.map +1 -1
- package/dist/esm/data/bootstrap.js +4 -3
- package/dist/esm/data/bootstrap.js.map +1 -1
- package/dist/esm/data/collection.d.ts +22 -0
- package/dist/esm/data/collection.js +10 -10
- package/dist/esm/data/collection.js.map +1 -1
- package/dist/esm/data/schema.js +5 -1
- package/dist/esm/data/schema.js.map +1 -1
- package/dist/esm/files.d.ts +9 -9
- package/dist/esm/mq/broker.d.ts +1 -1
- package/dist/esm/mq/broker.js +1 -1
- package/dist/esm/mq/broker.js.map +1 -1
- package/dist/esm/mq/types.d.ts +1 -1
- package/dist/esm/mq/types.js.map +1 -1
- package/dist/esm/openapi/api.generated.d.ts +417 -541
- package/dist/esm/openapi/api.generated.js +292 -377
- package/dist/esm/openapi/api.generated.js.map +1 -1
- package/dist/esm/openapi/client.js +1 -1
- package/dist/esm/openapi/client.js.map +1 -1
- package/dist/esm/openapi/codecs.generated.d.ts +394 -652
- package/dist/esm/openapi/codecs.generated.js +1 -1
- package/dist/esm/openapi/codecs.generated.js.map +1 -1
- package/dist/esm/openapi/types.generated.d.ts +696 -905
- package/dist/esm/openapi/types.generated.js.map +1 -1
- package/dist/esm/source.d.ts +1 -7
- package/dist/esm/source.js +2 -3
- package/dist/esm/source.js.map +1 -1
- package/dist/esm/stream.d.ts +0 -8
- package/dist/esm/stream.js +3 -5
- package/dist/esm/stream.js.map +1 -1
- package/dist/esm/uns-v2/codec.js +2 -2
- package/dist/esm/uns-v2/codec.js.map +1 -1
- package/dist/esm/uns-v2/generated.d.ts +4590 -13315
- package/dist/esm/uns-v2/generated.js +21 -42
- package/dist/esm/uns-v2/generated.js.map +1 -1
- package/docs/acceptance-2026-10-22.md +3 -1
- package/package.json +2 -2
- package/skills/tier0-sdk-v2/SKILL.md +5 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-agent/SKILL.md +4 -4
- package/skills/tier0-sdk-v2/tier0-sdk-v2-controls/SKILL.md +5 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/SKILL.md +2 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/consistency.md +3 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/modeling.md +6 -4
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +13 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/schema-evolution.md +2 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/delete.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/url.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/app-members.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/platform-members.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/get.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/send.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/changes.md +4 -4
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/read.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +4 -4
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +11 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/lifecycle.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/read.md +25 -5
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/update.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/info.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/whoami.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +5 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/create.md +10 -6
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/delete.md +5 -5
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/namespace.md +4 -4
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/read.md +8 -7
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/restore.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/update.md +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 创建集合与记录
|
|
2
2
|
|
|
3
|
-
元数据使用 metadataInsertOne(POST /openapi/v2/uns/metadata)或
|
|
3
|
+
元数据使用 metadataInsertOne(POST /openapi/v2/uns/metadata)或 metadataBulkWrite 的 insertOne 项;kind 指定 directory/topic/collection。单条提供 data、可选 id;批量提供同一 kind 的 operations[{insertOne:{id?,data}}]。idempotencyKey 标识一个写入意图;dryRun=true 仅校验。schemaVersion 由服务端赋默认值。
|
|
4
4
|
|
|
5
5
|
集合 data 必须包含 name、recordSchema,可选 description、parentId、sampleSchema、indexes、semantics。parentId=null 表示根目录。索引创建后仍需确认状态为 ready。
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ export async function createDeviceCollection(
|
|
|
20
20
|
},
|
|
21
21
|
sampleSchema: {
|
|
22
22
|
type: 'object', additionalProperties: false, required: ['temperature'],
|
|
23
|
-
properties: { temperature: { type: 'number', unit: '°C' } },
|
|
23
|
+
properties: { temperature: { type: 'number', format: 'double', unit: '°C' } },
|
|
24
24
|
},
|
|
25
25
|
},
|
|
26
26
|
};
|
|
@@ -28,13 +28,17 @@ export async function createDeviceCollection(
|
|
|
28
28
|
if (preview.data.status !== 'validated') throw new Error('集合预检未通过');
|
|
29
29
|
const receipt = await client.uns.metadataInsertOne({ ...request, dryRun: false, idempotencyKey: intentKey });
|
|
30
30
|
if (receipt.data.status !== 'committed') return { state: 'unconfirmed' as const, receipt };
|
|
31
|
-
const current = await client.uns.
|
|
32
|
-
if (!current.data.
|
|
33
|
-
return { state: 'committed' as const, receipt, current: current.data.
|
|
31
|
+
const current = await client.uns.metadataFind({ kind: 'collection', filter: { _id: collectionId }, limit: 1 });
|
|
32
|
+
if (!current.data.items[0]) throw new Error('集合创建有回执,读回未确认');
|
|
33
|
+
return { state: 'committed' as const, receipt, current: current.data.items[0] };
|
|
34
34
|
}
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
单条 Record 新增默认返回 insertedId/status/replayed。需要创建后的数据、revision 和时间戳时,传 returnDocument:'after',同一次写入返回 value,无需再查询;可配合 projection,调用者必须同时具有读取权限。幂等重放返回原始创建快照,后续读取最新状态仍用 recordGet/recordFind。dryRun 的 value 是未提交预览。
|
|
38
|
+
|
|
39
|
+
returnDocument 只允许 none(默认)或 after,不支持 before;projection 只能和 after 一起传。新增仍是 insert,已存在的 ID 不会变成更新。after 的 value 包括服务端补入的字段,但只返回当前授权可见的数据:普通数据权限需 uns.write 和 uns.read,App 还要满足集合的 record:write / record:read 及当前员工、行和字段策略。服务端在提交前校验读取权限,重放时也重新校验;旧回执不能绕过已撤销的授权。
|
|
40
|
+
|
|
41
|
+
省略 returnDocument 与显式 none 保持相同幂等语义。不能用同一个意图键把原来的 none 改成 after 补取快照,否则返回 IDEMPOTENCY_CONFLICT;已创建的记录应改用读取接口。after 重放可对原始快照应用 projection,但不会变成最新记录。创建快照中的 revision 可用于下一次修改;若已有并发修改,版本冲突仍需显式处理。
|
|
38
42
|
|
|
39
43
|
批量新增返回 insertedCount/insertedIds 及适用的逐项错误。insertedIds 的键是原始输入从 0 开始的索引。省略自定义 ID 时从成功回执取得实际 ID,不能把名称当成 ID。
|
|
40
44
|
|
|
@@ -23,7 +23,7 @@ export async function deleteDevice(
|
|
|
23
23
|
}
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
元数据使用 metadataDeleteOne/Many,或
|
|
26
|
+
元数据使用 metadataDeleteOne/Many,或 metadataDeleteOne + returnDocument:before 返回删除前对象。它们执行软删除,增加 revision,不隐式级联目录后代、引用对象或集合数据。引用约束与版本冲突必须处理,不能自行扩展删除范围。
|
|
27
27
|
|
|
28
28
|
```ts
|
|
29
29
|
import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
@@ -31,7 +31,7 @@ import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
|
31
31
|
export async function deleteCollection(
|
|
32
32
|
id: string, intentKey: string, client: Tier0Client = createClient(),
|
|
33
33
|
) {
|
|
34
|
-
const current = (await client.uns.
|
|
34
|
+
const current = (await client.uns.metadataFind({ kind: 'collection', filter: { _id: id }, limit: 1 })).data.items[0];
|
|
35
35
|
if (!current) throw new Error('集合不存在或不可见,未执行删除');
|
|
36
36
|
const receipt = await client.uns.metadataDeleteOne({
|
|
37
37
|
kind: 'collection', filter: { _id: id }, expectedRevision: current.revision,
|
|
@@ -40,9 +40,9 @@ export async function deleteCollection(
|
|
|
40
40
|
if (receipt.data.status !== 'committed' || String(receipt.data.deletedCount) !== '1') {
|
|
41
41
|
return { state: 'unconfirmed' as const, receipt };
|
|
42
42
|
}
|
|
43
|
-
const deleted = await client.uns.
|
|
44
|
-
if (!deleted.data.
|
|
45
|
-
return { state: 'deleted' as const, receipt, deleted: deleted.data.
|
|
43
|
+
const deleted = await client.uns.metadataFind({ kind: 'collection', filter: { _id: id }, state: 'deleted', limit: 1 });
|
|
44
|
+
if (!deleted.data.items[0]) throw new Error('删除有回执,但删除状态读回未确认');
|
|
45
|
+
return { state: 'deleted' as const, receipt, deleted: deleted.data.items[0] };
|
|
46
46
|
}
|
|
47
47
|
```
|
|
48
48
|
|
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
| 场景 | 方法 |
|
|
6
6
|
| --- | --- |
|
|
7
|
-
| 单条/批量新增 | metadataInsertOne /
|
|
7
|
+
| 单条/批量新增 | metadataInsertOne / metadataBulkWrite 的 insertOne 项 |
|
|
8
8
|
| 单条/批量条件更新 | metadataUpdateOne / metadataUpdateMany |
|
|
9
|
-
| 更新并读取原子结果 |
|
|
9
|
+
| 更新并读取原子结果 | metadataUpdateOne / metadataReplaceOne + returnDocument:before/after |
|
|
10
10
|
| 同 kind 混合写入 | metadataBulkWrite |
|
|
11
11
|
| 跨 kind、有依赖的组合操作 | metadataTransact |
|
|
12
|
-
| 软删除并返回原对象 |
|
|
12
|
+
| 软删除并返回原对象 | metadataDeleteOne + returnDocument:before |
|
|
13
13
|
| 按明确 ID 批量恢复 | metadataRestore |
|
|
14
14
|
|
|
15
|
-
普通写操作只指定一个 kind。
|
|
15
|
+
普通写操作只指定一个 kind。updateMany/deleteMany/restore 固定原子执行;bulkWrite 默认 atomic=true,原子批次不接受 ordered=false。bulkWrite 显式 atomic=false 时 ordered=true 遇错停止,false 继续,并检查 results/errors。非原子执行有任一项已提交后失败时,`execution` 为 committed、`retry.safe` 为 false,错误的 data 是累计结果:序号小于 `nextIndex` 且不在 errors 里的操作已提交;有 `unknownUntil` 时 `[nextIndex, unknownUntil)` 结局未知,用同一个幂等键重试(不带键时只有按 id 的操作能先读回再续做,所以非原子批次始终带幂等键);没有 `unknownUntil` 时从 `nextIndex` 续做。第一块就结局未知时 `execution` 为 unknown。批次最多 200 项。不要给所有对象套一个相同 expectedRevision:需要逐项版本检查时在 bulkWrite 中分别提供。
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
18
|
import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
@@ -3,23 +3,24 @@
|
|
|
3
3
|
| 方法 | 必要输入 | 返回 data |
|
|
4
4
|
| --- | --- | --- |
|
|
5
5
|
| metadataFind | kinds;可选 filter、sort、projection、page、state | items、pageInfo |
|
|
6
|
-
|
|
|
7
|
-
| metadataCount /
|
|
6
|
+
| metadataFind + limit:1 | kind、filter;可选 state | 取 items[0],空结果视为未匹配 |
|
|
7
|
+
| metadataCount / metadataAggregate | kind/kinds 与查询条件;去重 pipeline 为 [{ $distinct: field }] | count / items、pageInfo;去重每项为 {value} |
|
|
8
8
|
| collectionDescribe | collectionId | 集合结构和数据能力 |
|
|
9
9
|
| recordFind | collectionId;可选 filter、sort、limit、cursor | items、pageInfo |
|
|
10
10
|
|
|
11
|
-
元数据查询配置字段写 name、parentId;系统字段写 _id、_meta.kind、_meta.revision。返回资源的配置在
|
|
11
|
+
元数据查询配置字段写 name、parentId;系统字段写 _id、_meta.kind、_meta.revision。返回资源的配置在 items[].data 中。state 为 active/deleted/all,默认 active。对象身份始终是 kind + id。
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
14
|
import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
15
15
|
|
|
16
16
|
export async function readDevices(collectionId: string, client: Tier0Client = createClient()) {
|
|
17
|
-
const collection = await client.uns.
|
|
18
|
-
|
|
17
|
+
const collection = await client.uns.metadataFind({ kind: 'collection', filter: { _id: collectionId }, limit: 1 });
|
|
18
|
+
const definition = collection.data.items[0];
|
|
19
|
+
if (!definition) throw new Error('集合不存在或不可见');
|
|
19
20
|
const records = await client.uns.recordFind({
|
|
20
21
|
collectionId, filter: { enabled: true }, sort: [['name', 1]], limit: 20,
|
|
21
22
|
});
|
|
22
|
-
return { definition:
|
|
23
|
+
return { definition: definition.data, items: records.data.items, pageInfo: records.data.pageInfo };
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
export async function listCollections(page = 1, client: Tier0Client = createClient()) {
|
|
@@ -31,4 +32,4 @@ export async function listCollections(page = 1, client: Tier0Client = createClie
|
|
|
31
32
|
|
|
32
33
|
按 pageInfo.hasMore/nextPage 继续元数据分页;不要把第一页当全量。recordFind 的游标循环见[数据工作流](data-workflows.md)。sort 是数组元组。
|
|
33
34
|
|
|
34
|
-
以上 metadataFind
|
|
35
|
+
以上 metadataFind 示例用于 Workspace 集成(会话、personal / agent Key)。App 凭证不能调用 metadataFind:用 dataAppContext 精确选择授权 alias,集合的 revision、indexStatus、ttl 也在其中。数据授权不等于元数据管理授权。网络/权限错误必须传播,不能用空数组掩盖错误。
|
|
@@ -8,7 +8,7 @@ import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
|
8
8
|
export async function restoreCollection(
|
|
9
9
|
id: string, intentKey: string, client: Tier0Client = createClient(),
|
|
10
10
|
) {
|
|
11
|
-
const deleted = (await client.uns.
|
|
11
|
+
const deleted = (await client.uns.metadataFind({ kind: 'collection', filter: { _id: id }, state: 'deleted', limit: 1 })).data.items[0];
|
|
12
12
|
if (!deleted) throw new Error('未找到待恢复集合');
|
|
13
13
|
const receipt = await client.uns.metadataRestore({
|
|
14
14
|
kind: 'collection', items: [{ id, expectedRevision: deleted.revision }], idempotencyKey: intentKey,
|
|
@@ -16,7 +16,7 @@ export async function restoreCollection(
|
|
|
16
16
|
if (receipt.data.status !== 'committed' || String(receipt.data.restoredCount) !== '1') {
|
|
17
17
|
return { state: 'unconfirmed' as const, receipt };
|
|
18
18
|
}
|
|
19
|
-
const current = (await client.uns.
|
|
19
|
+
const current = (await client.uns.metadataFind({ kind: 'collection', filter: { _id: id }, limit: 1 })).data.items[0];
|
|
20
20
|
if (!current) throw new Error('恢复有回执,读回未确认');
|
|
21
21
|
return { state: 'committed' as const, receipt, current };
|
|
22
22
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 修改记录、元数据和 Schema
|
|
2
2
|
|
|
3
|
-
元数据单条使用 metadataUpdateOne
|
|
3
|
+
元数据单条使用 metadataUpdateOne;returnDocument 默认 none,需要原子返回 value 时显式传 before/after。批量相同更新使用 metadataUpdateMany;不同更新使用 metadataBulkWrite。完整替换使用 metadataReplaceOne,replacement 是完整可写配置。
|
|
4
4
|
|
|
5
5
|
update 首版支持 $set/$unset/$setOnInsert。字段使用裸配置路径;_id/_meta 为只读。写前读取 revision,编辑页面携带 expectedRevision,冲突后重新比较。单条 upsert 需明确 _id 等值条件,新增内容满足完整创建约束;同 ID 的软删除对象必须显式恢复。
|
|
6
6
|
|
|
@@ -10,9 +10,9 @@ import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
|
10
10
|
export async function renameCollection(
|
|
11
11
|
id: string, name: string, intentKey: string, client: Tier0Client = createClient(),
|
|
12
12
|
) {
|
|
13
|
-
const current = (await client.uns.
|
|
13
|
+
const current = (await client.uns.metadataFind({ kind: 'collection', filter: { _id: id }, limit: 1 })).data.items[0];
|
|
14
14
|
if (!current) throw new Error('集合不存在或不可见');
|
|
15
|
-
return client.uns.
|
|
15
|
+
return client.uns.metadataUpdateOne({
|
|
16
16
|
kind: 'collection', filter: { _id: id }, expectedRevision: current.revision,
|
|
17
17
|
update: { $set: { name } }, returnDocument: 'after', upsert: false, idempotencyKey: intentKey,
|
|
18
18
|
});
|
|
@@ -27,7 +27,7 @@ import { createClient, type Tier0Client, type Schema } from '@tier0/sdk-v2';
|
|
|
27
27
|
export async function replaceRecordSchema(
|
|
28
28
|
id: string, recordSchema: Schema, intentKey: string, client: Tier0Client = createClient(),
|
|
29
29
|
) {
|
|
30
|
-
const current = (await client.uns.
|
|
30
|
+
const current = (await client.uns.metadataFind({ kind: 'collection', filter: { _id: id }, limit: 1 })).data.items[0];
|
|
31
31
|
if (!current) throw new Error('集合不存在或不可见');
|
|
32
32
|
const request = { kind: 'collection' as const, filter: { _id: id },
|
|
33
33
|
expectedRevision: current.revision, update: { $set: { recordSchema } } };
|