@tier0/sdk-v2 0.6.2 → 0.6.3
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 +16 -29
- package/dist/cjs/uns-v2/generated.d.ts +18 -31
- package/dist/cjs/uns-v2/generated.js +18 -39
- package/dist/cjs/uns-v2/generated.js.map +1 -1
- package/dist/esm/uns-v2/generated.d.ts +18 -31
- package/dist/esm/uns-v2/generated.js +18 -39
- package/dist/esm/uns-v2/generated.js.map +1 -1
- package/package.json +1 -2
- package/skills/tier0-sdk-v2/SKILL.md +3 -12
- package/skills/tier0-sdk-v2/tier0-sdk-v2-agent/SKILL.md +0 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-controls/SKILL.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/SKILL.md +2 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/SKILL.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/delete.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/download.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/multipart.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/upload.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-members/SKILL.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-mq/SKILL.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/references/quickstart.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/SKILL.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/send.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/create.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/protocols.md +3 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/read.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +7 -7
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +9 -10
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/delete.md +9 -16
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +20 -18
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/http-server.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/update.md +5 -7
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/SKILL.md +0 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/info.md +0 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/whoami.md +1 -1
- package/docs/acceptance-2026-10-22.md +0 -90
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tier0/sdk-v2",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "Tier0 Cloud new-architecture SDK for TypeScript and JavaScript",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
"dist",
|
|
23
23
|
"skills",
|
|
24
24
|
"README.md",
|
|
25
|
-
"docs/acceptance-2026-10-22.md",
|
|
26
25
|
"LICENSE",
|
|
27
26
|
"NOTICE.md"
|
|
28
27
|
],
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tier0-sdk-v2
|
|
3
|
-
description: 使用 @tier0/sdk-v2
|
|
3
|
+
description: 使用 @tier0/sdk-v2 开发 Tier0 云端 TypeScript/JavaScript 应用:Source 数据源、Stream 处理程序、UNS 集合与记录、App 自有数据(@tier0/sdk-v2/data)、通知、文件存储、MQTT、成员、系统身份与能力、Controls 和 Agent,按任务进入对应子 Skill,并处理配置、身份和框架集成。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Tier0 SDK v2 应用集成
|
|
7
7
|
|
|
8
|
-
面向应用代码编写;运行时为 Node.js 20.19+。独立包 `@tier0/sdk-v2` 的版本以 package.json 为准(UNS v2 契约 5.0.0),是否可从 npm 安装须检查实际发布状态;未发布时安装仓库构建的 tarball。新参数还需要目标环境部署对应后端,不能只凭 SDK
|
|
8
|
+
面向应用代码编写;运行时为 Node.js 20.19+。独立包 `@tier0/sdk-v2` 的版本以 package.json 为准(UNS v2 契约 5.0.0),是否可从 npm 安装须检查实际发布状态;未发布时安装仓库构建的 tarball。新参数还需要目标环境部署对应后端,不能只凭 SDK 方法存在判断可用。
|
|
9
9
|
|
|
10
10
|
## 选择业务入口
|
|
11
11
|
|
|
@@ -54,15 +54,6 @@ export async function inspectConnection() {
|
|
|
54
54
|
|
|
55
55
|
`createClient()` 的 HTTP 不自动重试。UNS 错误的 `execution` 说明执行到哪一步、`retry.safe` 说明能否用同一请求重发;带 `outcomeUnknown` 的失败应先对账,保留原意图键;取消请求不代表服务端撤销。App 数据层(`@tier0/sdk-v2/data`)会按 `retry.safe` 自动重试,见 App 数据 Skill。Source/Stream 仍使用底层 UNS v2 契约,所以错误类名保留 UNS,不代表它们仍属于数据入口。
|
|
56
56
|
|
|
57
|
-
## 从首版入口迁移
|
|
58
|
-
|
|
59
|
-
- `client.uns.sourceList(body)` → `client.source.documents.list(body)`。
|
|
60
|
-
- `client.uns.sourceDocumentGet(body)` → `client.source.documents.get(body)`。
|
|
61
|
-
- `client.uns.streamProgramDeploy(body)` → `client.stream.programs.deploy(body)`。
|
|
62
|
-
- `client.uns.streamDocumentValidate(body)` → `client.stream.documents.validate(body)`。
|
|
63
|
-
- `client.uns.recordFind(body)` 保持不变;Control 使用 `client.controls.use({ code })`。
|
|
64
|
-
- 低层 `createUnsV2Client` 保留完整生成契约,供契约工具使用;业务主入口不再把 Source/Stream/Control 混入 `client.uns`。
|
|
65
|
-
|
|
66
57
|
React/Vue 示例与验签见 [集成参考](references/integration.md)。完成接入时验证目标入口、真实身份、响应解包和错误分支;SDK 本地测试通过不代表环境联调完成。
|
|
67
58
|
|
|
68
|
-
公开 HTTP 入口统一为 `/openapi/v2
|
|
59
|
+
公开 HTTP 入口统一为 `/openapi/v2`。Source 配置用 documents.*,Stream 草稿用 documents.*、发布用 programs.deploy;App 数据层提供 insertMany/findOneAnd*/distinct 等便捷方法。业务代码优先使用领域入口,底层 createUnsV2Client 供契约工具使用。
|
|
@@ -69,5 +69,3 @@ result.create 的 operationId 由调用方持有;保存超时后可用 `result
|
|
|
69
69
|
cards.update 要带读取时的完整 expectedCardSpec;library.update 要带完整 expectedItem 快照。409 表示内容已变化,应重新读取并合并用户意图,不能自动覆盖。具体示例见 [结果与卡片编辑](references/results.md)。
|
|
70
70
|
|
|
71
71
|
结果附件/图片使用 [文件 Skill](../tier0-sdk-v2-files/SKILL.md) 的持久化 filePath,不保存签名 URL 作为长期资源。失败保留 ApiError.status/code/errorCode;写入 outcomeUnknown 时先查询对应资源,不自动重发。
|
|
72
|
-
|
|
73
|
-
旧 Namespace 节点的语义索引和 path 关系接口未纳入 v2,不再提供 nodes/relations 方法。
|
|
@@ -5,9 +5,9 @@ description: 使用 @tier0/sdk-v2 发现、描述和调用 Tier0 Control 业务
|
|
|
5
5
|
|
|
6
6
|
# Control 契约调用
|
|
7
7
|
|
|
8
|
-
Control 是已发布的业务调用入口;它可由 Stream 提供,但调用方不选择内部 streamId、entryId 或部署版本。使用服务端 client.controls,实际调用 `/openapi/v2/uns/controls/discover|describe|invoke
|
|
8
|
+
Control 是已发布的业务调用入口;它可由 Stream 提供,但调用方不选择内部 streamId、entryId 或部署版本。使用服务端 client.controls,实际调用 `/openapi/v2/uns/controls/discover|describe|invoke`。
|
|
9
9
|
|
|
10
|
-
调用按服务端现有统一权限及 App 业务策略校验;不配置逐 Key 的 Control scopes/codes
|
|
10
|
+
调用按服务端现有统一权限及 App 业务策略校验;不配置逐 Key 的 Control scopes/codes。
|
|
11
11
|
|
|
12
12
|
## 发现和读取契约
|
|
13
13
|
|
|
@@ -21,6 +21,8 @@ description: 使用 @tier0/sdk-v2/data 在 App 服务端声明并读写本 App
|
|
|
21
21
|
|
|
22
22
|
## 最小用法
|
|
23
23
|
|
|
24
|
+
新 App 没有集合时是正常空态:`uns.dataAppContext({})` 返回 `dataState: "uninitialized"` 和空集合,不创建任何数据。无需先调用 context 或手工激活数据策略;声明真实业务集合后,第一次数据访问会自动初始化。`dataState: "ready"` 也不代表可访问整个工作空间,仍以返回的集合授权为准。引用已有 WMS 等集合需要明确共享授权,不能创建同名空集合代替。管理员停用返回 `FORBIDDEN`、reason `APP_DATA_POLICY_DISABLED`,不得自动恢复。
|
|
25
|
+
|
|
24
26
|
```ts
|
|
25
27
|
import { z } from 'zod';
|
|
26
28
|
import { createDataClient } from '@tier0/sdk-v2/data';
|
|
@@ -15,7 +15,7 @@ description: 使用 @tier0/sdk-v2 实现 Tier0 应用附件、头像、导入导
|
|
|
15
15
|
| 服务端转发、浏览器保存附件 | [下载](references/download.md) |
|
|
16
16
|
| 删除对象及核验回执 | [删除](references/delete.md) |
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
文件传输使用 v2 接口;分片顺序上传,中断后由调用方核对会话状态。
|
|
19
19
|
|
|
20
20
|
业务文件使用平台对象存储,数据库保存返回的 filePath。App 本地目录可用于临时处理和构建,但不能替代持久化上传。使用服务端 client.files,API Key 不下发给浏览器或对象存储。
|
|
21
21
|
|
|
@@ -17,6 +17,6 @@ export async function deleteAttachment(filePath: string, client: Tier0Client = c
|
|
|
17
17
|
}
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
删除前明确目标及业务引用,读取/下载不附带删除。返回已解包的 {deleted}
|
|
20
|
+
删除前明确目标及业务引用,读取/下载不附带删除。返回已解包的 {deleted},检查 deleted 确认结果。
|
|
21
21
|
|
|
22
22
|
对象删除不提供 SDK 恢复功能。401/403 处理身份与授权;网络中断/结果未知时先对账,不把错误当“已经不存在”,不自动换身份重试。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 下载与应用附件保存
|
|
2
2
|
|
|
3
|
-
v2 方法:`files.download({filePath,…}, {signal}?) → Promise<Response
|
|
3
|
+
v2 方法:`files.download({filePath,…}, {signal}?) → Promise<Response>`。返回值本身就是 Response。
|
|
4
4
|
|
|
5
5
|
v2 先请求文件 URL,再匿名读取对象存储;不沿用带 Key 的重定向下载链。平台认证信息不能转发给存储。
|
|
6
6
|
|
|
@@ -37,6 +37,6 @@ export async function uploadWithProgress(
|
|
|
37
37
|
|
|
38
38
|
成功后才持久化 filePath。中断 session 包含 fileKey、uploadId、parts(partNumber/etag)、completionAttempted;session 不是完成回执,不公开到日志或无关用户。
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
分片顺序上传,无自动重试、并发参数或一键续传。部分 PUT 可能成功但回执丢失,不能仅凭本地 parts 判断远端完整状态。跨域存储需要暴露 ETag 响应头。
|
|
41
41
|
|
|
42
42
|
completionAttempted=true 表示 complete 可能已提交,先对账最终文件,不能直接 abort 或重复 complete。明确放弃未完成会话时才调用 abort;初始化请求本身结果未知且无 session 时,保存错误信息交由平台对账,不猜 uploadId。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 上传并保存文件引用
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
使用 `client.files.upload(file, options)`;独立入口为 `createFilesClient`(@tier0/sdk-v2/files)。Node.js 20.19+。浏览器只调用应用自己的上传接口,平台 Key 留在服务端。
|
|
4
4
|
|
|
5
5
|
| 参数 | 类型 | 必填 | 说明 |
|
|
6
6
|
| --- | --- | --- | --- |
|
|
@@ -24,4 +24,4 @@ export async function uploadAttachment(file: File, client: Tier0Client = createC
|
|
|
24
24
|
|
|
25
25
|
业务表持久化 filePath;临时签名 URL 不作为长期引用。文件写入和业务记录写入不是原子事务,业务保存失败时记录待清理对象,只在任务授权范围内清理。
|
|
26
26
|
|
|
27
|
-
文件大于 100 MiB 时自动分片;阈值不是单文件产品上限,套餐配额/文件类型限制由后端决定。需要进度时显式用 [uploadMultipart](multipart.md)。
|
|
27
|
+
文件大于 100 MiB 时自动分片;阈值不是单文件产品上限,套餐配额/文件类型限制由后端决定。需要进度时显式用 [uploadMultipart](multipart.md)。
|
|
@@ -7,7 +7,7 @@ description: 使用 @tier0/sdk-v2 查询 Tier0 Workspace 成员、搜索用户
|
|
|
7
7
|
|
|
8
8
|
参数表、成员选择和有界增量分页见 [Workspace 成员](references/platform-members.md)。v1 的项目成员接口未迁入 v2,不能用 Workspace 列表代替 App 授权名单。
|
|
9
9
|
|
|
10
|
-
公开入口有两个:`client.members.listWorkspace` 只用于 Workspace 级的成员选择;需要能使用某个 App 的成员时用 `client.members.listApp
|
|
10
|
+
公开入口有两个:`client.members.listWorkspace` 只用于 Workspace 级的成员选择;需要能使用某个 App 的成员时用 `client.members.listApp`。App 成员由服务端授权决定。使用服务端 API Key;平台授权决定可查询范围。
|
|
11
11
|
|
|
12
12
|
## 搜索与展示候选人
|
|
13
13
|
|
|
@@ -53,4 +53,4 @@ export async function* scanMembers(
|
|
|
53
53
|
|
|
54
54
|
增量时间包含边界,按 userId/updatedAt 去重,成功完成后再保存水位;跨页没有固定快照保证。只向界面返回实际需要字段。
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
Workspace 列表只用于 Workspace 级选择,不能冒充某 App 的可访问用户;需要 App 可用成员时用 `members.listApp`(见 [App 可用成员](app-members.md))。无权限时报告配置问题,不以用户手填 ID 绕过。
|
|
@@ -5,7 +5,7 @@ description: 使用 @tier0/sdk-v2/mq 连接 Tier0 MQTT WebSocket Broker,管理
|
|
|
5
5
|
|
|
6
6
|
# MQTT 实时消息
|
|
7
7
|
|
|
8
|
-
连接配置、完整订阅生命周期、通配符、发布及鉴权排查见 [Quickstart](references/quickstart.md)
|
|
8
|
+
连接配置、完整订阅生命周期、通配符、发布及鉴权排查见 [Quickstart](references/quickstart.md)。实际 MQTT 主题和消息格式按目标环境确认。
|
|
9
9
|
|
|
10
10
|
`Tier0MQClient` 从独立子入口导入。它面向消息客户端;配置平台采集连接用 Source,运行处理逻辑用 Stream。HTTP SDK 的“不自动重试”不等于 MQTT 禁用重连或 QoS 重投递。
|
|
11
11
|
|
|
@@ -45,7 +45,7 @@ export async function subscribeTelemetry(
|
|
|
45
45
|
|
|
46
46
|
回调是 (topic,payload),payload 为字符串。subscribe 返回 void,订阅失败通过 error 事件,不把函数返回当 broker SUBACK。此例独占连接;共享连接只退订自己的 handler,不关闭其他消费者。
|
|
47
47
|
|
|
48
|
-
+ 匹配一层,#
|
|
48
|
+
+ 匹配一层,# 匹配多层,订阅范围必须属于任务和主题授权。主题和消息格式以目标平台的实际契约为准。App 服务端订阅新 UNS Record 变更用 `@tier0/sdk-v2/data` 的 `data.subscribe`(`records:subscribe` 服务端推送),不是 MQTT 主题。
|
|
49
49
|
|
|
50
50
|
## 发布
|
|
51
51
|
|
|
@@ -66,4 +66,4 @@ connect/disconnect/error/message/subscriptionDropped 反映客户端状态。isC
|
|
|
66
66
|
|
|
67
67
|
创建凭据用 client.mqttAuth.create({name}),撤销用 delete({id}),检查 success。回执的 clientID 对应配置 clientId;完整密码只在创建时返回一次,受控保存。
|
|
68
68
|
|
|
69
|
-
Not authorized/CONNACK 5/重连循环时核对注入的 Key 类型、过期/撤销、授权和 Broker ws/wss 地址。v2 不回退 Enterprise
|
|
69
|
+
Not authorized/CONNACK 5/重连循环时核对注入的 Key 类型、过期/撤销、授权和 Broker ws/wss 地址。v2 不回退 Enterprise 身份;不因连接失败自动新建凭据。
|
|
@@ -18,7 +18,7 @@ description: 使用 @tier0/sdk-v2 发送和查询 Tier0 站内通知、Web/Deskt
|
|
|
18
18
|
- type 固定 inbox;Swagger 的 string 不代表接受任意类型。
|
|
19
19
|
- 用人读姓名/邮箱选择收件人,ID 由成员数据解析并保持字符串,不让用户填写 ID。Workspace 成员不等于 App 可访问用户。
|
|
20
20
|
- title 最多50字符,content 最多800字符。mode 按真实发布环境选择 test/live;test 会创建测试消息,不能当预检。
|
|
21
|
-
- App sender 使用 getCurrentAppId() 的真实 APP_ID
|
|
21
|
+
- App sender 使用 getCurrentAppId() 的真实 APP_ID,导航和名称展示按目标前端支持核实。
|
|
22
22
|
- sender/link/meta 是展示提示,不作为授权。新代码不使用废弃 source 字段。
|
|
23
23
|
- 同一业务事件、收件人、内容使用稳定 idempotencyKey;新事件使用新键,不因超时随机换键。
|
|
24
24
|
|
|
@@ -37,6 +37,6 @@ Desktop 属于 web,不存在 desktop 渠道。显式单渠道不补齐,重
|
|
|
37
37
|
|
|
38
38
|
send 返回直接对象 {messageId,status,createdAt},get 返回直接状态对象,没有 data 外层。accepted 表示受理,sent 表示已发送,不是用户已读;failed 检查 errorCode/message。
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
ApiError 提供 status/errorCode/msg。未知结果先对账;已有 messageId 按 ID 查,没有按 idempotencyKey 查询的 SDK 入口。HTTP SDK 不自动重试。
|
|
41
41
|
|
|
42
42
|
完整示例与参数边界均在操作参考中。Skill 示例不会自动发送消息,也不授予真实发送权限。
|
|
@@ -34,7 +34,7 @@ export async function sendCompletedOrder(
|
|
|
34
34
|
}
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
sender.id 来自真实 APP_ID UUID
|
|
37
|
+
sender.id 来自真实 APP_ID UUID。需带链接时传已验证可访问的业务 https 地址,或确认目标前端支持的相对路由。
|
|
38
38
|
|
|
39
39
|
other 发送者应给人读名称,如 `{type:'other',name:'库存同步服务'}`。app 不重复硬编码名称。sender/meta/link 都是展示导航提示,不是授权证明。meta 值为字符串,序列化最多 500 字节;sender.name 最多100字符。source 是废弃别名,不用于新代码。
|
|
40
40
|
|
|
@@ -56,7 +56,7 @@ other 发送者应给人读名称,如 `{type:'other',name:'库存同步服务'
|
|
|
56
56
|
|
|
57
57
|
成功为直接 {messageId,status,createdAt},没有 data。accepted 是异步受理,sent 不是已读,详见[查询](get.md)。
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
错误通过 ApiError 的 status/errorCode/msg 判断。
|
|
60
60
|
|
|
61
61
|
| HTTP / errorCode | 处理 |
|
|
62
62
|
| --- | --- |
|
|
@@ -23,7 +23,7 @@ Source 维护连接配置、认证引用与源状态。脚本处理用 [Stream](
|
|
|
23
23
|
|
|
24
24
|
## 核心约束
|
|
25
25
|
|
|
26
|
-
1. Source 配置统一使用 documents.*,原生文档为 `{name,protocol,config}`,HTTP API 显式指定 `config.role`。HTTP 统一为 `protocol: http-api` + `config.role: client/server`;Client 主动请求,Server 接收入站请求,不能互换。HTTPServer 统一接收入站请求,固定前缀后的路由和响应时机属于 Stream
|
|
26
|
+
1. Source 配置统一使用 documents.*,原生文档为 `{name,protocol,config}`,HTTP API 显式指定 `config.role`。HTTP 统一为 `protocol: http-api` + `config.role: client/server`;Client 主动请求,Server 接收入站请求,不能互换。HTTPServer 统一接收入站请求,固定前缀后的路由和响应时机属于 Stream。
|
|
27
27
|
2. 已有 ID 和 revision 时优先用 documents.update 的 patch,避免额外 get;完整替换 document 前读取完整文档,安全列表摘要不能无损回写。原生 ID 是十进制字符串,revision 原样传递,不转 Number。
|
|
28
28
|
3. 现有 Source 修改、启停、删除都要 expectedRevision。没有任何 Stream 引用时可直接提交;有草稿、活动、历史或不可见引用时仍需 confirmedImpactRevision。先形成精确意图,再读取全部影响分页;回执不可合成、跨意图复用或静默刷新。提供的回执始终严格校验,不自动获取并同意影响。
|
|
29
29
|
4. 配置中保留认证/TLS 引用,不写明文秘密;HTTP Client 新凭据走创建专用 credentials;Server 不携带 Client auth/TLS 配置。
|
|
@@ -94,7 +94,7 @@ Server 的固定前缀 `/ingest/v1/{workspaceId}/{sourceId}` 和 Bearer 要求
|
|
|
94
94
|
| --- | --- | --- |
|
|
95
95
|
| basic | username、password | 省略时 REQUEST;可显式绑定受限 HTTP 方法 |
|
|
96
96
|
| bearer | token | 省略时 REQUEST;上方 GET 示例保持明确的方法限制 |
|
|
97
|
-
| apiKey | headerName、value | 省略或 REQUEST
|
|
97
|
+
| apiKey | headerName、value | 省略或 REQUEST |
|
|
98
98
|
| oauth2ClientCredentials | tokenUrl、clientId、clientSecret;可选 scope、clientAuthentication | 省略、REQUEST 或 GET |
|
|
99
99
|
|
|
100
100
|
OAuth 的 `clientAuthentication` 支持 `client_secret_post`(默认)和 `client_secret_basic`。REQUEST 表示绑定 Source 基址,实际路径和方法仍由执行宿主逐次授权;显式方法的已有绑定不能解释成 REQUEST 的基址范围。vendor SESSION 合同独立保留,不是此 inline 创建的 method,也不新增独立公开凭据 API。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 协议与连接配置
|
|
2
2
|
|
|
3
|
-
先调用 `source.protocols.list({})`。协议枚举存在不等于目标环境驱动或凭据解析器已就绪。HTTP Source 统一使用 `protocol: 'http-api'`,通过文档的 `config.role: 'client' | 'server'` 区分主动请求和入站服务,与 Enterprise
|
|
3
|
+
先调用 `source.protocols.list({})`。协议枚举存在不等于目标环境驱动或凭据解析器已就绪。HTTP Source 统一使用 `protocol: 'http-api'`,通过文档的 `config.role: 'client' | 'server'` 区分主动请求和入站服务,与 Enterprise 的一协议两角色模型一致。角色和协议能力以目标环境目录为准。
|
|
4
4
|
|
|
5
5
|
| 配置字段 | 类型 | 必填 | 说明 |
|
|
6
6
|
| --- | --- | --- | --- |
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
| auth.credentialRef | string | 有认证时 | 已存在且可用的凭据引用 |
|
|
12
12
|
| tls.caRef / clientIdentityRef | string | 否 | 已存在的 CA/客户端身份引用 |
|
|
13
13
|
|
|
14
|
-
以下只构造文档,不执行创建;实际地址、主题、设备 unitId
|
|
14
|
+
以下只构造文档,不执行创建;实际地址、主题、设备 unitId 由任务上下文提供。需要预览配置问题时使用 documents.create 的 dryRun;正式创建本身执行校验。
|
|
15
15
|
|
|
16
16
|
```ts
|
|
17
17
|
import { createClient, type CloudSourceDocument } from '@tier0/sdk-v2';
|
|
@@ -35,7 +35,7 @@ HTTP Client 的 options 支持 headers 和 parameters;headers 可包含目录
|
|
|
35
35
|
|
|
36
36
|
SQL options 包含 tlsMode(verify-full/disable)和 queries(资源名→固定 SQL);脚本不能替换任意 SQL。OPC UA、SAP、Teamcenter 等按能力和服务端校验配置,不从 HTTP 模板生造字段。不要为通过校验自动移除认证或关闭 TLS。
|
|
37
37
|
|
|
38
|
-
HTTP Client 示例不能用于 Server。HTTPServer 通过 `source.documents.*` 配置监听源,固定前缀为 `/ingest/v1/{workspaceId}/{sourceId}`;Stream 注册相对业务路由和处理函数,见 [HTTPServer Stream](../../tier0-sdk-v2-stream/references/http-server.md)
|
|
38
|
+
HTTP Client 示例不能用于 Server。HTTPServer 通过 `source.documents.*` 配置监听源,固定前缀为 `/ingest/v1/{workspaceId}/{sourceId}`;Stream 注册相对业务路由和处理函数,见 [HTTPServer Stream](../../tier0-sdk-v2-stream/references/http-server.md)。响应时机在 Stream 层处理。
|
|
39
39
|
|
|
40
40
|
Cloud 的角色位于 `config.role`;Enterprise 投影的顶层 `role` 不能直接抄入 Cloud 管理文档。Server 配置见[创建](create.md),以 `http://managed` 和空 options 保存,不从 Client 模板推导。
|
|
41
41
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
| source.runtime.get | /openapi/v2/uns/sources/runtime/get | id(必填) | 运行状态 |
|
|
8
8
|
| source.observations.get | /openapi/v2/uns/sources/observations/get | items:id、expectedRevision | 指定源和修订的观测 |
|
|
9
9
|
|
|
10
|
-
page 从 1 开始,size 1–200。列表默认安全摘要。get 省略 view
|
|
10
|
+
page 从 1 开始,size 1–200。列表默认安全摘要。get 省略 view 时返回 full;summary 需要 uns.source.view 或 uns.source.manage,full 需要 uns.source.manage;API Key 读取完整文档还必须是 full_access(includeDocument:true 同样适用)。未知 revision 时可读取 summary;要完整替换 document 或查看配置时读取 full。已持有写回执中的 ID/revision 时,可直接提交 patch,无需为了编辑再 get;服务端仍会检查版本冲突。摘要不能用于重建完整配置。
|
|
11
11
|
|
|
12
12
|
```ts
|
|
13
13
|
import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
@@ -14,9 +14,9 @@ description: 使用 @tier0/sdk-v2 的 client.stream 创建、查询、修改和
|
|
|
14
14
|
| 新建并绑定 HTTP Client Source | [创建](references/create.md) | documents.create({program}) |
|
|
15
15
|
| HTTPServer 固定前缀与业务路由 | [HTTPServer](references/http-server.md) | documents.create({document})、api.stream.onRequest、ctx.reply |
|
|
16
16
|
| 列表、完整文档、运行记录 | [查询](references/read.md) | programs.list、documents.get、observations.get、runs.list |
|
|
17
|
-
| 修改草稿、脚本和绑定 | [修改](references/update.md) | documents.
|
|
17
|
+
| 修改草稿、脚本和绑定 | [修改](references/update.md) | documents.update(需要预览时 validate) |
|
|
18
18
|
| 发布、停用、版本回滚 | [部署](references/deploy.md) | programs.deploy/rollback、documents.disable |
|
|
19
|
-
|
|
|
19
|
+
| 删除 | [删除](references/delete.md) | programs.delete |
|
|
20
20
|
| 隔离样例测试、流程衔接 | [生命周期](references/lifecycle.md) | sampleTest |
|
|
21
21
|
|
|
22
22
|
## 两种文档形态
|
|
@@ -26,20 +26,20 @@ description: 使用 @tier0/sdk-v2 的 client.stream 创建、查询、修改和
|
|
|
26
26
|
| Runtime program | name、script 字符串、sourceBindings、timeoutMs | documents.create/update/validate({program}) |
|
|
27
27
|
| 云端原生文档 | name、model、script 对象、sources、entries | documents.create/get/update/validate |
|
|
28
28
|
|
|
29
|
-
程序必须是完整 `module.exports = api => { ... }`,执行器 API 是 api.sources/api.uns/api.stream,与 npm 包的 client.source 不同。Runtime sourceBindings 为 sourceId/configRevision/acquisition;原生 sources 还使用 alias/resources。连接凭据不进脚本或 acquisition,秘密材料由 Source 执行宿主管理,不通过脚本读取、记录或返回。定时入口使用 api.stream.every
|
|
29
|
+
程序必须是完整 `module.exports = api => { ... }`,执行器 API 是 api.sources/api.uns/api.stream,与 npm 包的 client.source 不同。Runtime sourceBindings 为 sourceId/configRevision/acquisition;原生 sources 还使用 alias/resources。连接凭据不进脚本或 acquisition,秘密材料由 Source 执行宿主管理,不通过脚本读取、记录或返回。定时入口使用 api.stream.every;npm 的 client.controls 管理入口不作为 Goja 的 Stream 注册参数。
|
|
30
30
|
|
|
31
31
|
## 核心约束
|
|
32
32
|
|
|
33
33
|
1. documents.get({id,view:"summary"}) 返回安全摘要,不含可回写脚本;完整编辑使用 documents.get 或上次 documents.create/update 返回的完整文档。保留未修改的 sources/entries/script 字段。
|
|
34
34
|
2. create/update 保存草稿,不自动发布;documents 没有 deploy,云端 program 发布使用 programs.deploy。不能将已保存报告为已运行。
|
|
35
35
|
3. 所有更新/部署/删除携带当前 expectedRevision。原生停用另需 expectedActiveRelease,避免停掉他人刚发布的版本。
|
|
36
|
-
4. versionId
|
|
37
|
-
5. resources=[] 是空冻结资源集,不是通配符。写入本身由服务端校验,需要预览时单独 validate;当前云端程序 timeoutMs 上限 30000
|
|
36
|
+
4. versionId 使用已知发布回执的 activeVersion,或从 versions.list 选定,不把 release 序号当 ID。expectedSourceRevision 仅用于恰好一个依赖源,不代表多个源的修订。
|
|
37
|
+
5. resources=[] 是空冻结资源集,不是通配符。写入本身由服务端校验,需要预览时单独 validate;当前云端程序 timeoutMs 上限 30000。
|
|
38
38
|
6. HTTPServer 响应时机在 Stream:普通返回等处理/提交完成;HTTP onRequest 内 await ctx.reply 可先回复一次再继续,仍受超时/并发/权限约束,断线不取消但 shutdown 可取消,不保证崩溃重放。
|
|
39
39
|
7. 仅执行用户要求的生命周期步骤;修改脚本不自动授予发布、停用或删除权限。
|
|
40
40
|
|
|
41
41
|
## 成功与异常
|
|
42
42
|
|
|
43
|
-
响应保留 code/msg/requestId/data。创建/更新回执的 revision 可直接用于发布;programs 发布回执的 activeRelease 是同次事务保存的正整数发布序号,无需前后 get。programs 回执和查询结果无活跃发布时省略 activeRelease,activeVersion
|
|
43
|
+
响应保留 code/msg/requestId/data。创建/更新回执的 revision 可直接用于发布;programs 发布回执的 activeRelease 是同次事务保存的正整数发布序号,无需前后 get。programs 回执和查询结果无活跃发布时省略 activeRelease,activeVersion 为字符串 0。校验要检查 valid,样例要检查 completed/failed,删除要检查 deleted;发布后按回执的 activeRelease 筛选 runs.list 才能确认该版本运行。样例 writePreview 不代表线上数据写入。
|
|
44
44
|
|
|
45
|
-
UnsV2OutcomeUnknownError
|
|
45
|
+
UnsV2OutcomeUnknownError、发布超时或取消后保留原路由、载荷和幂等键;允许恢复时原样重发取得原回执,不用新键重复发布。回执缺少 activeRelease 时不得用当前 head 替代。版本冲突先比较当前草稿,不能忽略 expectedRevision。不同写入意图使用不同键;本地 SDK 测试不能代替目标环境联调。
|
|
@@ -13,24 +13,23 @@
|
|
|
13
13
|
|
|
14
14
|
## HTTP Client Source 绑定示例
|
|
15
15
|
|
|
16
|
-
先按[Source 查询](../../tier0-sdk-v2-source/references/read.md)选定真实 HTTP Client Source。脚本的 api.sources 属于平台执行器,与应用中的 client.source 不同。sourceId 保持字符串,configRevision
|
|
16
|
+
先按[Source 查询](../../tier0-sdk-v2-source/references/read.md)选定真实 HTTP Client Source。脚本的 api.sources 属于平台执行器,与应用中的 client.source 不同。sourceId 保持字符串,configRevision 使用 Source 创建、更新回执或完整查询得到的修订。已有回执时直接传入 source;没有快照时再调用 source.documents.get({id,view:"full"}) 并检查 data.document。省略 `config.role` 时按正式协议目录默认为 client;Server 走入站语义,不能创建为主动请求程序。
|
|
17
17
|
|
|
18
18
|
```ts
|
|
19
|
-
import { createClient, type Tier0Client, type RuntimeStreamDefinition } from '@tier0/sdk-v2';
|
|
19
|
+
import { createClient, type Tier0Client, type RuntimeStreamDefinition, type CloudSourceDocumentView } from '@tier0/sdk-v2';
|
|
20
20
|
|
|
21
21
|
export async function createHttpStream(
|
|
22
|
-
|
|
22
|
+
source: CloudSourceDocumentView, name: string, intentKey: string, client: Tier0Client = createClient(),
|
|
23
23
|
) {
|
|
24
|
+
const sourceId = source.id;
|
|
24
25
|
if (!/^[1-9][0-9]*$/.test(sourceId)) throw new Error('Source ID 必须是正十进制字符串');
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (source.data.document.protocol !== 'http-api' || 'sourceType' in source.data.document.config ||
|
|
28
|
-
(source.data.document.config.role ?? 'client') !== 'client') {
|
|
26
|
+
if (source.document.protocol !== 'http-api' || 'sourceType' in source.document.config ||
|
|
27
|
+
(source.document.config.role ?? 'client') !== 'client') {
|
|
29
28
|
throw new Error('此主动请求示例需要 HTTP API Client Source');
|
|
30
29
|
}
|
|
31
30
|
const document: RuntimeStreamDefinition = {
|
|
32
31
|
name, timeoutMs: 5000,
|
|
33
|
-
sourceBindings: [{ sourceId, configRevision: source.
|
|
32
|
+
sourceBindings: [{ sourceId, configRevision: source.revision, acquisition: {} }],
|
|
34
33
|
script: [
|
|
35
34
|
'module.exports = api => {',
|
|
36
35
|
' const upstream = api.sources.use({ id: ' + JSON.stringify(sourceId) + ', resources: [] });',
|
|
@@ -51,8 +50,8 @@ export async function createHttpStream(
|
|
|
51
50
|
|
|
52
51
|
将 path="orders"、60 秒周期改为业务实际值。示例保存草稿,不部署,也不将返回值自动写入 UNS;需要写入集合时按执行器能力定义 api.uns 操作。resources=[] 是空冻结资源集,不是通配授权。源地址和凭据留在 Source,不能拷进 acquisition 或脚本。
|
|
53
52
|
|
|
54
|
-
创建 data 为 CloudStreamDocumentView 或预检结果,实际保存返回 id、revision 和完整 document;预检不生成 ID。需要展示预检时单独调用 documents.validate({program});普通保存无需先校验再保存。当前后端创建/校验需要注册 Worker 可用。TEMPORARILY_UNAVAILABLE
|
|
53
|
+
创建 data 为 CloudStreamDocumentView 或预检结果,实际保存返回 id、revision 和完整 document;预检不生成 ID。需要展示预检时单独调用 documents.validate({program});普通保存无需先校验再保存。当前后端创建/校验需要注册 Worker 可用。TEMPORARILY_UNAVAILABLE 不代表脚本一定错误。
|
|
55
54
|
|
|
56
|
-
|
|
55
|
+
创建结局未知时先按已知 ID 或业务标识核对状态;允许重试时保留原请求与幂等键。
|
|
57
56
|
|
|
58
57
|
原生编辑器形态 `documents.create({dryRun, document})` 的 document 为 name/model/script对象/sources/entries,script 为 `{code,timeoutMs}`,sources 用 alias/sourceId/configRevision/resources/acquisition。不要把上面的 script 字符串直接塞入原生文档。
|
|
@@ -5,31 +5,24 @@
|
|
|
5
5
|
| 字段 | 类型 | 必填 | 说明 |
|
|
6
6
|
| --- | --- | --- | --- |
|
|
7
7
|
| id | string | 是 | 十进制字符串 |
|
|
8
|
-
| expectedRevision | integer | 建议提供 |
|
|
8
|
+
| expectedRevision | integer | 建议提供 | 当前回执或查询的修订 |
|
|
9
9
|
| dryRun | boolean | 是 | true 预检;false 提交 |
|
|
10
10
|
| idempotencyKey | string | 否 | 最多 128 字符 |
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
使用已确认目标的回执或查询快照,评估活跃发布/调用依赖。停止运行与删除是两个操作,删除请求不自动授予对 Source/UNS 数据的清理权限。
|
|
13
13
|
|
|
14
14
|
```ts
|
|
15
|
-
import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
15
|
+
import { createClient, type Tier0Client, type CloudStreamStopView } from '@tier0/sdk-v2';
|
|
16
16
|
|
|
17
|
-
export async function deleteStream(
|
|
18
|
-
|
|
17
|
+
export async function deleteStream(
|
|
18
|
+
current: Pick<CloudStreamStopView, 'id' | 'revision'>, intentKey: string, client: Tier0Client = createClient(),
|
|
19
|
+
) {
|
|
19
20
|
const receipt = await client.stream.programs.delete({
|
|
20
|
-
id, expectedRevision: current.revision, dryRun: false, idempotencyKey: intentKey,
|
|
21
|
+
id: current.id, expectedRevision: current.revision, dryRun: false, idempotencyKey: intentKey,
|
|
21
22
|
});
|
|
22
23
|
if (!('deleted' in receipt.data) || receipt.data.deleted !== true) throw new Error('未确认删除');
|
|
23
|
-
|
|
24
|
-
while (true) {
|
|
25
|
-
const { data } = await client.stream.programs.list({ archived: true, page, size: 200 });
|
|
26
|
-
const archived = data.list.find(item => item.id === id);
|
|
27
|
-
if (archived) return { receipt, archived };
|
|
28
|
-
if (!data.hasMore) return { receipt, archived: undefined };
|
|
29
|
-
if (typeof data.nextPage !== 'number' || data.nextPage <= page) throw new Error('无有效下一页');
|
|
30
|
-
page = data.nextPage;
|
|
31
|
-
}
|
|
24
|
+
return { receipt, current: receipt.data };
|
|
32
25
|
}
|
|
33
26
|
```
|
|
34
27
|
|
|
35
|
-
成功 data 为 `{id,revision,deleted:true}`;预检为 `{validated:true,sideEffects:false}
|
|
28
|
+
成功 data 为 `{id,revision,deleted:true}`;预检为 `{validated:true,sideEffects:false}`。默认以 deleted 回执确认本次删除,无需遍历归档列表。需要独立审计时再按页查询 programs.list({archived:true,page,size}),找不到不能伪造读回确认。不要捕获所有 get 异常并返回删除成功。并发冲突重新评估,不用无版本保护的请求覆盖。
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
| --- | --- |
|
|
15
15
|
| revision | 草稿修订;传给下次写入的 expectedRevision,冲突时显式处理 |
|
|
16
16
|
| activeVersion | 不可变发布版本 ID;回滚的 versionId 使用这个 ID,不使用发布序号 |
|
|
17
|
-
| activeRelease | 本次事务记录的正整数发布序号;与 runs.list 中的 release
|
|
17
|
+
| activeRelease | 本次事务记录的正整数发布序号;与 runs.list 中的 release 对照;无活跃发布或回执未记录时省略 |
|
|
18
18
|
|
|
19
|
-
programs 回执的 activeVersion:'0'
|
|
19
|
+
programs 回执的 activeVersion:'0' 表示无活跃版本;programs 的 activeRelease 此时省略;documents 的 activeRelease 此时为 0。
|
|
20
20
|
|
|
21
21
|
```ts
|
|
22
|
-
import { createClient, type Tier0Client, type CloudStreamDocumentView } from '@tier0/sdk-v2';
|
|
22
|
+
import { createClient, type Tier0Client, type CloudStreamDocumentView, type CloudStreamStopView } from '@tier0/sdk-v2';
|
|
23
23
|
|
|
24
24
|
export async function deployStream(current: CloudStreamDocumentView, intentKey: string, client: Tier0Client = createClient()) {
|
|
25
25
|
const sources = current.document.sources ?? [];
|
|
@@ -35,40 +35,42 @@ export async function deployStream(current: CloudStreamDocumentView, intentKey:
|
|
|
35
35
|
}
|
|
36
36
|
const release = receipt.data.activeRelease;
|
|
37
37
|
if (release === undefined || BigInt(String(release)) <= 0n) {
|
|
38
|
-
throw new Error('
|
|
38
|
+
throw new Error('回执缺少发布编号;保留原请求,不用当前发布编号替代');
|
|
39
39
|
}
|
|
40
40
|
return { receipt, release };
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
export async function disableStream(
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
export async function disableStream(
|
|
44
|
+
current: Pick<CloudStreamStopView, 'id' | 'revision' | 'activeRelease'>,
|
|
45
|
+
intentKey: string, client: Tier0Client = createClient(),
|
|
46
|
+
) {
|
|
47
|
+
if (BigInt(String(current.activeRelease)) <= 0n) throw new Error('没有活跃发布可停用');
|
|
46
48
|
const receipt = await client.stream.documents.disable({
|
|
47
|
-
id, expectedRevision: current.revision, expectedActiveRelease: current.activeRelease,
|
|
49
|
+
id: current.id, expectedRevision: current.revision, expectedActiveRelease: current.activeRelease,
|
|
48
50
|
dryRun: false, idempotencyKey: intentKey,
|
|
49
51
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
if (!('id' in receipt.data) || String(receipt.data.activeRelease) !== '0') {
|
|
53
|
+
throw new Error('未返回停用回执');
|
|
54
|
+
}
|
|
55
|
+
return { receipt, current: receipt.data };
|
|
53
56
|
}
|
|
54
57
|
```
|
|
55
58
|
|
|
56
|
-
将创建或更新回执的 current 传给 deployStream,只发一次发布请求。只有手上没有草稿快照时才先 documents.get。使用 [按发布号查询运行记录](read.md#观察本次发布)
|
|
59
|
+
将创建或更新回执的 current 传给 deployStream,只发一次发布请求。只有手上没有草稿快照时才先 documents.get。使用 [按发布号查询运行记录](read.md#观察本次发布) 才能观察这次发布,观察窗口汇总不能证明该版本运行。发布成功不表示外部连接健康或执行成功。停用使用已确认的 id/revision/activeRelease(可来自发布回执),返回的 current 可直接用于删除;不需要前后各 get。停用保留草稿。仅修改草稿的任务不额外发布/停用。
|
|
57
60
|
|
|
58
61
|
## 回滚到明确版本
|
|
59
62
|
|
|
60
63
|
```ts
|
|
61
|
-
import { createClient, type Tier0Client } from '@tier0/sdk-v2';
|
|
64
|
+
import { createClient, type Tier0Client, type CloudStreamStopView } from '@tier0/sdk-v2';
|
|
62
65
|
|
|
63
66
|
export async function rollbackStream(
|
|
64
|
-
|
|
67
|
+
current: Pick<CloudStreamStopView, 'id' | 'revision'>, versionId: string, intentKey: string, client: Tier0Client = createClient(),
|
|
65
68
|
) {
|
|
66
|
-
// versionId
|
|
67
|
-
const { data: current } = await client.stream.documents.get({ id });
|
|
69
|
+
// versionId 使用已知发布回执的 activeVersion,或从 programs.versions.list 选定。
|
|
68
70
|
return client.stream.programs.rollback({
|
|
69
|
-
id, versionId, expectedRevision: current.revision, dryRun: false, idempotencyKey: intentKey,
|
|
71
|
+
id: current.id, versionId, expectedRevision: current.revision, dryRun: false, idempotencyKey: intentKey,
|
|
70
72
|
});
|
|
71
73
|
}
|
|
72
74
|
```
|
|
73
75
|
|
|
74
|
-
检查回执 activeVersion 与 activeRelease。超时或 UnsV2OutcomeUnknownError
|
|
76
|
+
检查回执 activeVersion 与 activeRelease。超时或 UnsV2OutcomeUnknownError 时保留原路由、载荷和幂等键;允许恢复时原样重发以取得原回执,不用新键再次发布。回执缺少 activeRelease 时不能用当前 head 替代本次请求的发布编号。相同草稿使用不同键仍会创建新发布,expectedRevision 仅保护草稿修订。预览用 dryRun=true,返回 validated/sideEffects,不保证稍后的实际发布一定成功。
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## 保存原生程序草稿
|
|
8
8
|
|
|
9
|
-
使用完整原生 `document`:script 是 `{code,timeoutMs}`,sources 使用 alias。这与 `program` 的 script
|
|
9
|
+
使用完整原生 `document`:script 是 `{code,timeoutMs}`,sources 使用 alias。这与 `program` 的 script 字符串形态不同。
|
|
10
10
|
|
|
11
11
|
```ts
|
|
12
12
|
import { createClient, type Tier0Client, type CloudStreamDocument } from '@tier0/sdk-v2';
|
|
@@ -6,23 +6,21 @@
|
|
|
6
6
|
| --- | --- | --- | --- |
|
|
7
7
|
| id | string | 是 | 十进制字符串 |
|
|
8
8
|
| document | CloudStreamDocument | 是 | name、model、script、sources、entries 完整文档 |
|
|
9
|
-
| expectedRevision | integer | 建议始终提供 |
|
|
9
|
+
| expectedRevision | integer | 建议始终提供 | 当前回执或查询的修订,防止覆盖他人修改 |
|
|
10
10
|
| dryRun | boolean | 是 | true 预检;false 保存 |
|
|
11
11
|
| idempotencyKey | string | 否 | 本次更新独立意图键 |
|
|
12
12
|
|
|
13
13
|
## 示例:更新描述,保持脚本和绑定
|
|
14
14
|
|
|
15
15
|
```ts
|
|
16
|
-
import { createClient, type Tier0Client, type CloudStreamDocument } from '@tier0/sdk-v2';
|
|
16
|
+
import { createClient, type Tier0Client, type CloudStreamDocument, type CloudStreamDocumentView } from '@tier0/sdk-v2';
|
|
17
17
|
|
|
18
18
|
export async function updateStreamDescription(
|
|
19
|
-
|
|
19
|
+
current: CloudStreamDocumentView, description: string, intentKey: string, client: Tier0Client = createClient(),
|
|
20
20
|
) {
|
|
21
|
-
const { data: current } = await client.stream.documents.get({ id, view: 'full' });
|
|
22
|
-
if (!('document' in current)) throw new Error('需要完整 Stream 文档');
|
|
23
21
|
const document: CloudStreamDocument = { ...current.document, description };
|
|
24
22
|
const saved = await client.stream.documents.update({
|
|
25
|
-
id, expectedRevision: current.revision, document, dryRun: false, idempotencyKey: intentKey,
|
|
23
|
+
id: current.id, expectedRevision: current.revision, document, dryRun: false, idempotencyKey: intentKey,
|
|
26
24
|
});
|
|
27
25
|
if (!('id' in saved.data)) throw new Error('未返回已保存文档');
|
|
28
26
|
return { receipt: saved, current: saved.data };
|
|
@@ -31,4 +29,4 @@ export async function updateStreamDescription(
|
|
|
31
29
|
|
|
32
30
|
代码应用可直接用 documents.update({id, expectedRevision, program, dryRun:false, idempotencyKey}),由服务端编译入口和绑定。编辑完整文档时保留 script.code/timeoutMs,并同步 entries/sources;写入本身执行校验,只有需要提前展示问题时才单独 validate。不要对documents.get 的 summary 做展开更新。
|
|
33
31
|
|
|
34
|
-
响应是完整 CloudStreamDocumentView 或预检结果;把 saved.data 直接传给下一步[发布示例](deploy.md),无需为了 revision
|
|
32
|
+
响应是完整 CloudStreamDocumentView 或预检结果;把 saved.data 直接传给下一步[发布示例](deploy.md),无需为了 revision 再读取。示例复用创建/更新回执;只有缺少完整文档时才先 get({id,view:"full"}) 并确认 document 存在。保存草稿不会自动部署,activeDocument 可能仍是旧发布版本。VERSION_CONFLICT 后重新读取、比较并决策;不无条件覆盖。
|
|
@@ -10,8 +10,6 @@ description: 使用 @tier0/sdk-v2 查询 Tier0 凭证身份、平台版本、MQT
|
|
|
10
10
|
| 诊断 Key 所属 Workspace 和权限 | [whoami](references/whoami.md) |
|
|
11
11
|
| 查看平台版本、解析 Broker 地址 | [info](references/info.md) |
|
|
12
12
|
|
|
13
|
-
v1 的内部 reload 接口不属于 v2 公共 SDK,不能在普通诊断时调用。
|
|
14
|
-
|
|
15
13
|
使用服务端 `createClient()` 或显式传入 apiHost/apiKey。系统排查从只读信息开始,不因功能不可用自动创建 Key、修改权限或部署服务。
|
|
16
14
|
|
|
17
15
|
## 最小诊断
|
|
@@ -19,5 +19,3 @@ export async function inspectService(client: Tier0Client = createClient()) {
|
|
|
19
19
|
返回已解包对象,name/version/capabilities/mqttBroker 均可能省略。mqttBroker 是连接串,可能裸 host、host:port、tcp://host:1883 或完整 ws/wss,不能直接拼 wss:// 前缀。toWebSocketUrl 保留已有 WebSocket URL;TCP 端口不直接复用为 WebSocket 端口。实际端口/路径由环境决定。
|
|
20
20
|
|
|
21
21
|
info.capabilities 的简略字符串列表不是就绪证明。进一步读取 client.capabilities.discover 的 releaseEnabled、allowed、state、availability,区分开关、授权与运行能力;详见[系统 Skill](../SKILL.md)。
|
|
22
|
-
|
|
23
|
-
v1 的 /gw/reload 是内部管理操作,未纳入 v2 公共 SDK,不复制旧 reload 示例,也不在连通性诊断中尝试重载服务。
|
|
@@ -14,7 +14,7 @@ export async function inspectCredential(client: Tier0Client = createClient()) {
|
|
|
14
14
|
}
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
返回已解包的 userID/userName/email/workspaceID/workspaceName/apiKeyName/keyPrefix/permissions/roles/keyType
|
|
17
|
+
返回已解包的 userID/userName/email/workspaceID/workspaceName/apiKeyName/keyPrefix/permissions/roles/keyType。大整数保留 number|bigint;需要字符串时用 String,不先转 Number。
|
|
18
18
|
|
|
19
19
|
App Key 是共享业务凭证,不代表访问 App 的自然人。whoami 不能用于登录、当前用户、操作人审计或选择通知收件人;当前人来自应用认证会话,收件人从成员数据解析。
|
|
20
20
|
|