@tier0/sdk-v2 0.8.0 → 0.9.1
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/NOTICE.md +3 -1
- package/README.md +45 -11
- package/dist/cjs/capabilities.d.ts +8 -17
- package/dist/cjs/capabilities.js +17 -28
- package/dist/cjs/capabilities.js.map +1 -1
- package/dist/cjs/client.d.ts +524 -3
- package/dist/cjs/client.js +29 -6
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/cloud-transport.d.ts +4 -2
- package/dist/cjs/cloud-transport.js +27 -18
- package/dist/cjs/cloud-transport.js.map +1 -1
- package/dist/cjs/files.d.ts +26 -6
- package/dist/cjs/files.js +151 -28
- package/dist/cjs/files.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/openapi/api.generated.d.ts +1 -1
- package/dist/cjs/openapi/codecs.generated.d.ts +30 -161
- package/dist/cjs/openapi/codecs.generated.js +1 -1
- package/dist/cjs/openapi/codecs.generated.js.map +1 -1
- package/dist/cjs/openapi/types.generated.d.ts +33 -85
- package/dist/cjs/openapi/types.generated.js.map +1 -1
- package/dist/cjs/runtime.d.ts +13 -0
- package/dist/cjs/runtime.js +51 -0
- package/dist/cjs/runtime.js.map +1 -0
- package/dist/cjs/streams/capabilities.d.ts +8 -0
- package/dist/cjs/streams/capabilities.js +19 -0
- package/dist/cjs/streams/capabilities.js.map +1 -0
- package/dist/cjs/streams/contract.generated.d.ts +802 -0
- package/dist/cjs/streams/contract.generated.js +7 -0
- package/dist/cjs/streams/contract.generated.js.map +1 -0
- package/dist/cjs/streams/index.d.ts +3 -0
- package/dist/cjs/streams/index.js +20 -0
- package/dist/cjs/streams/index.js.map +1 -0
- package/dist/cjs/streams/messages.d.ts +42 -0
- package/dist/cjs/streams/messages.js +514 -0
- package/dist/cjs/streams/messages.js.map +1 -0
- package/dist/cjs/streams/requests.d.ts +93 -0
- package/dist/cjs/streams/requests.js +167 -0
- package/dist/cjs/streams/requests.js.map +1 -0
- package/dist/cjs/streams/transport.d.ts +16 -0
- package/dist/cjs/streams/transport.js +24 -0
- package/dist/cjs/streams/transport.js.map +1 -0
- package/dist/cjs/uns-v2/generated.d.ts +87 -22
- package/dist/cjs/uns-v2/generated.js +43 -8
- package/dist/cjs/uns-v2/generated.js.map +1 -1
- package/dist/esm/capabilities.d.ts +8 -17
- package/dist/esm/capabilities.js +17 -28
- package/dist/esm/capabilities.js.map +1 -1
- package/dist/esm/client.d.ts +524 -3
- package/dist/esm/client.js +27 -5
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/cloud-transport.d.ts +4 -2
- package/dist/esm/cloud-transport.js +27 -18
- package/dist/esm/cloud-transport.js.map +1 -1
- package/dist/esm/files.d.ts +26 -6
- package/dist/esm/files.js +151 -28
- package/dist/esm/files.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/openapi/api.generated.d.ts +1 -1
- package/dist/esm/openapi/codecs.generated.d.ts +30 -161
- 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 +33 -85
- package/dist/esm/openapi/types.generated.js.map +1 -1
- package/dist/esm/runtime.d.ts +13 -0
- package/dist/esm/runtime.js +46 -0
- package/dist/esm/runtime.js.map +1 -0
- package/dist/esm/streams/capabilities.d.ts +8 -0
- package/dist/esm/streams/capabilities.js +15 -0
- package/dist/esm/streams/capabilities.js.map +1 -0
- package/dist/esm/streams/contract.generated.d.ts +802 -0
- package/dist/esm/streams/contract.generated.js +6 -0
- package/dist/esm/streams/contract.generated.js.map +1 -0
- package/dist/esm/streams/index.d.ts +3 -0
- package/dist/esm/streams/index.js +4 -0
- package/dist/esm/streams/index.js.map +1 -0
- package/dist/esm/streams/messages.d.ts +42 -0
- package/dist/esm/streams/messages.js +475 -0
- package/dist/esm/streams/messages.js.map +1 -0
- package/dist/esm/streams/requests.d.ts +93 -0
- package/dist/esm/streams/requests.js +161 -0
- package/dist/esm/streams/requests.js.map +1 -0
- package/dist/esm/streams/transport.d.ts +16 -0
- package/dist/esm/streams/transport.js +20 -0
- package/dist/esm/streams/transport.js.map +1 -0
- package/dist/esm/uns-v2/generated.d.ts +87 -22
- package/dist/esm/uns-v2/generated.js +43 -8
- package/dist/esm/uns-v2/generated.js.map +1 -1
- package/package.json +46 -12
- package/skills/tier0-sdk-v2/SKILL.md +3 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/multipart.md +23 -8
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +3 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/create.md +9 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/state.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/update.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +2 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +13 -4
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/update.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-streams/SKILL.md +67 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/SKILL.md +5 -9
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/info.md +1 -1
package/NOTICE.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
This SDK is distributed under the MIT license in LICENSE.
|
|
4
4
|
|
|
5
|
-
The UNS lossless codec, transport safeguards
|
|
5
|
+
The UNS lossless codec, transport safeguards and capability clients, MQTT implementation, App request identity verifier, and selected regression tests were adapted from FREEZONEX/Tier0-sdk at commit `3e43f33f4d13729e61b3d7e9bd8225a42f6843a8` (MIT). The original copyright notice is retained.
|
|
6
|
+
|
|
7
|
+
The Stream requests/messages clients, trusted App runtime and their regression/native integration fixtures were adapted from FREEZONEX/Tier0-sdk at commit `4eb0d3f3a7dbee29600ef0872cfab871e344a677` (MIT) into this standalone package. This package does not depend on the retired SDK. NATS libraries (`@nats-io/nats-core`, `@nats-io/nkeys`, `@nats-io/nuid`) retain their Apache-2.0 licenses; their dependency `tweetnacl` uses the Unlicense.
|
|
6
8
|
|
|
7
9
|
Public API contracts were obtained from FREEZONEX/Tier0-Backend at the revision pinned in `contracts/upstream.json`. The bundled App request identity contract was inherited from the same SDK revision; its upstream contract digest is preserved in the generated source. This provenance does not establish deployment or interoperability with a later gateway revision.
|
package/README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# @tier0/sdk-v2
|
|
2
2
|
|
|
3
|
-
Tier0
|
|
3
|
+
Tier0 云端统一 TypeScript / JavaScript SDK,数据管理与 App Stream 交互均使用 `@tier0/sdk-v2`。旧 SDK 不再作为依赖。
|
|
4
4
|
|
|
5
|
-
`0.
|
|
5
|
+
`0.9.1` 包含接口合同变更,升级时需核对下方使用方式并确认目标后端已部署对应合同。平台接口统一使用 OpenAPI v2,能力发现使用 `state + reasonCode + operations`。Stream 请求与消息交互统一到本包的 `client.streams`;`client.stream` 保留 Stream 管理。文件上传支持并发分片与断点续传。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Collection 声明必须同时提供业务名称 `name`(例如「生产工单」)和稳定程序标识 `alias`(例如 `production_orders`),高层声明与底层请求类型一致。`name` 是唯一展示名称,不支持 `displayName`;ensure 仅在创建时写入名称,重复 ensure 保留用户改名,同目录重名明确报错。使用前需确认后端已包含 `business-name/1` 契约。
|
|
8
|
+
|
|
9
|
+
`0.7.x` 已移除旧 Controls 入口、生成操作、DTO 和错误类,不保留别名。能力发现不再以可选交互合同阻断 Namespace,未知核心合同仍严格拒绝。V2 的 `execution` / `retry` 和结果未知语义保持不变。
|
|
8
10
|
|
|
9
11
|
`0.6.0` 的 HTTP Source 只保留 `protocol: http-api`,通过 `config.role: client | server` 区分主动请求与入站服务。旧 `http` / `http_push` 配置需要迁移;响应时机属于 Stream,不再建立独立异步 Source。同步 singlemodel 合同后,Source 配置不再带 configVersion,Stream 输入不再带 sdkVersion;保留完整 module.exports 程序与原生 script 对象/Runtime program 字符串两种既有形态,不能将旧 transform 函数体直接改名迁入。
|
|
10
12
|
|
|
@@ -16,12 +18,14 @@ Tier0 云端新架构的独立 TypeScript / JavaScript SDK。新仓库、新 npm
|
|
|
16
18
|
|
|
17
19
|
## 安装与初始化
|
|
18
20
|
|
|
19
|
-
维护者发布前在本仓库运行 `npm ci`、`npm run check`,并验证生成的 `.tgz
|
|
21
|
+
维护者发布前在本仓库运行 `npm ci`、`npm run check`,并验证生成的 `.tgz`。本分支的功能应使用检查通过的 `tier0-sdk-v2-0.9.1.tgz` 在业务项目中验证:
|
|
20
22
|
|
|
21
23
|
```sh
|
|
22
|
-
npm install
|
|
24
|
+
npm install /path/to/tier0-sdk-v2-0.9.1.tgz
|
|
23
25
|
```
|
|
24
26
|
|
|
27
|
+
`0.9.1` 正式发布后再使用 `npm install @tier0/sdk-v2@0.9.1`。发布前,npm 的既有版本和 `next` 标签不代表本分支的完整功能。
|
|
28
|
+
|
|
25
29
|
```ts
|
|
26
30
|
import { createClient } from '@tier0/sdk-v2';
|
|
27
31
|
|
|
@@ -41,11 +45,12 @@ const user = await tier0.system.whoami();
|
|
|
41
45
|
| --- | --- |
|
|
42
46
|
| `tier0.source` | 数据源、连接文档、影响分析、版本历史与运行观测 |
|
|
43
47
|
| `tier0.stream` | Runtime programs、原生文档、校验、部署、回滚与运行记录 |
|
|
48
|
+
| `tier0.streams` | App 请求、实时业务消息与独立交互能力发现 |
|
|
44
49
|
| `tier0.uns` | 目录、Topic、Collection、Record、Sample、事务与 App 数据上下文 |
|
|
45
50
|
| `tier0.system` | `whoami()`、`info()` |
|
|
46
51
|
| `tier0.members` | `listWorkspace()` 用于 Workspace 级成员选择;`listApp({ appId })` 查询能使用指定 App 的成员 |
|
|
47
52
|
| `tier0.notifications` | `send()`、`get()` |
|
|
48
|
-
| `tier0.files` | `upload()`、`uploadMultipart()`、`url()`、`download()`、`delete()`、`multipart` 原子接口 |
|
|
53
|
+
| `tier0.files` | `upload()`、`uploadMultipart()`、`resumeMultipart()`、`url()`、`download()`、`delete()`、`multipart` 原子接口 |
|
|
49
54
|
| `tier0.mqttAuth` | 创建、删除 MQTT 凭证 |
|
|
50
55
|
| `tier0.agent` | `analyses`、`canvases`、`cards`、`jobs`、`jobRuns`、`library`、`results` |
|
|
51
56
|
| `tier0.capabilities` | 当前凭证可见的能力发现;就绪状态由服务端判断 |
|
|
@@ -53,6 +58,8 @@ const user = await tier0.system.whoami();
|
|
|
53
58
|
| `@tier0/sdk-v2/mq` | MQTT WebSocket 客户端与 broker 地址工具;不进入根入口依赖图 |
|
|
54
59
|
| `@tier0/sdk-v2/source` | `createSourceClient()`,独立 Source 客户端 |
|
|
55
60
|
| `@tier0/sdk-v2/stream` | `createStreamClient()`,独立 Stream 客户端 |
|
|
61
|
+
| `@tier0/sdk-v2/streams` | Stream 交互客户端、错误类与消息类型 |
|
|
62
|
+
| `@tier0/sdk-v2/runtime` | 受信 App 宿主 provider 安装与生命周期;业务页面无需调用 |
|
|
56
63
|
| `@tier0/sdk-v2/react` | `useTier0Query()`、`useTier0Mutation()`,需要 React 和 TanStack Query |
|
|
57
64
|
| `@tier0/sdk-v2/vue` | `useTier0Request()`,需要 Vue 3 |
|
|
58
65
|
| `@tier0/sdk-v2/server` | `createCloudAppRequestVerifier()`,仅服务端加载 `node:crypto` |
|
|
@@ -74,11 +81,11 @@ HTTP 调用统一使用 `/openapi/v2`。21 个重复 UNS 公共入口及生成
|
|
|
74
81
|
|
|
75
82
|
升级前应核对旧写请求的最终结果,包括集合初始化 seed。退役入口不再可调用,不能将未知结果的旧请求或幂等键直接改投新入口重做。当前入口的重试仍保留原路径、原键和原载荷。
|
|
76
83
|
|
|
77
|
-
`client.capabilities.discover()` 使用 `POST /openapi/v2/capabilities/discover` 和空对象,返回直接 JSON
|
|
84
|
+
`client.capabilities.discover()` 使用 `POST /openapi/v2/capabilities/discover` 和空对象,返回直接 JSON。能力发现使用合同 2.0,以 state、reasonCode 和 operations 表达结果,不再返回 enabled、allowed、releaseEnabled、availability;服务端必须同步部署该合同,只消费 Namespace、Source、Stream 管理能力,不以 App 交互域的版本标签作为前置条件。Source / Stream 的 `operations` 分别描述读取、配置、运行等操作,保留 `reasonCode`、`checkedAt`、`validUntil` 和 `requiresResourceCheck`;领域整体不可用时,读取或安全停用仍可能可用。证明到期后重新发现,实际操作仍需服务端检查具体资源权限和依赖。发现不代表设备在线或操作已成功,不自动重试。
|
|
78
85
|
|
|
79
86
|
## Source、Stream 与 UNS 分域
|
|
80
87
|
|
|
81
|
-
Source 负责连接外部系统,Stream 负责处理与运行,UNS 负责命名空间与业务数据。公开操作由固定的上游契约生成,业务入口按领域组织。Stream
|
|
88
|
+
Source 负责连接外部系统,Stream 负责处理与运行,UNS 负责命名空间与业务数据。公开操作由固定的上游契约生成,业务入口按领域组织。Stream 请求与消息交互使用本包 `client.streams.requests` / `client.streams.messages`,App 只安装一个 SDK。目录、Topic、集合基础 CRUD 统一使用 `metadata*`,查询、批量操作、软删除及恢复见 UNS Skill。
|
|
82
89
|
|
|
83
90
|
```ts
|
|
84
91
|
const sources = await tier0.source.documents.list({ page: 1, size: 20 });
|
|
@@ -95,7 +102,7 @@ Source/Stream 仍保留 `{ code, msg, requestId, data }` 响应以及 `UnsV2Erro
|
|
|
95
102
|
|
|
96
103
|
从最初提交迁移:`uns.sourceList` → `source.documents.list`;`uns.sourceDocumentGet` → `source.documents.get`;`uns.streamProgramDeploy` → `stream.programs.deploy`;`uns.streamDocumentValidate` → `stream.documents.validate`。这些管理方法已移出主入口的 `uns`。底层 `createUnsV2Client()` 仍提供完整生成契约供契约工具使用;数据专用客户端可用 `createUnsDataClient()`。
|
|
97
104
|
|
|
98
|
-
随包提供 Skill:总入口 [tier0-sdk-v2](skills/tier0-sdk-v2/SKILL.md) 下嵌套
|
|
105
|
+
随包提供 Skill:总入口 [tier0-sdk-v2](skills/tier0-sdk-v2/SKILL.md) 下嵌套 11 个领域子 Skill(`skills/tier0-sdk-v2/tier0-sdk-v2-<领域>/`),每个仍可独立发现,包含完整流程、参数边界、错误处理与可类型检查的示例:[Source](skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md)、[Stream](skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md)、[UNS](skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md)、[通知](skills/tier0-sdk-v2/tier0-sdk-v2-notifications/SKILL.md)、[系统](skills/tier0-sdk-v2/tier0-sdk-v2-system/SKILL.md)、[文件](skills/tier0-sdk-v2/tier0-sdk-v2-files/SKILL.md)、[MQTT](skills/tier0-sdk-v2/tier0-sdk-v2-mq/SKILL.md)、[成员](skills/tier0-sdk-v2/tier0-sdk-v2-members/SKILL.md)、[Agent](skills/tier0-sdk-v2/tier0-sdk-v2-agent/SKILL.md)、[App 数据](skills/tier0-sdk-v2/tier0-sdk-v2-data/SKILL.md)、[App Stream 交互](skills/tier0-sdk-v2/tier0-sdk-v2-streams/SKILL.md)。复杂流程的参考文档随 Skill 一起打包。在 Tier0 Console 上传时,把整个 `skills/tier0-sdk-v2/` 目录打成一个 zip。
|
|
99
106
|
|
|
100
107
|
## UNS 数据访问
|
|
101
108
|
|
|
@@ -113,7 +120,7 @@ await tier0.uns.recordFind(
|
|
|
113
120
|
);
|
|
114
121
|
```
|
|
115
122
|
|
|
116
|
-
|
|
123
|
+
`client.capabilities` 只校验 Namespace/Source/Stream 管理合同,不要求全局交互标签;同包 `client.streams.capabilities` 独立校验 App 请求合同,不阻断 Namespace。各自消费的核心合同未知仍拒绝,不将方法存在当作授权或运行就绪。
|
|
117
124
|
|
|
118
125
|
实际集合 ID 和有效权限从平台配置/数据上下文取得。管理操作中,App 凭证只能调用本 App 集合的 `appCollectionsEnsure` / `appCollectionsSchemaReplace` / `appCollectionsArchive` / `appCollectionsRestore`;SDK 中存在 `metadataInsertOne` 等其他管理方法,不表示 App 凭证有对应权限。App 数据授权 `appDataPolicyGet` / `appDataPolicyUpdate` 的调用方必须是:持有 `uns.write` 的登录会话、持有 `uns.write` 且 full_access、不绑定 App 的 personal / agent Key,或治理会话;运行时 App 凭证不能管理授权。Core-only 后台接口不导出到公开 SDK。
|
|
119
126
|
|
|
@@ -153,7 +160,7 @@ const bytes = await response.arrayBuffer();
|
|
|
153
160
|
|
|
154
161
|
保存 `filePath`,不把临时签名地址当作持久化引用。上传由平台签发地址后直传对象存储,平台 API Key 不传到存储域名;下载先获取签名地址,再匿名获取文件,避免认证重定向泄漏凭证。
|
|
155
162
|
|
|
156
|
-
超过 100 MiB
|
|
163
|
+
超过 100 MiB 自动使用分片上传,也可用 `upload(file, { multipart: {} })` 或 `uploadMultipart(file, options)` 对小文件显式分片。分片默认并发 4;仅同一地址、同一内容的 PUT 瞬时失败安全重试,init/complete 不自动重放。中断后 `MultipartUploadError.session` 保留文件身份、切片参数和成功分片,可用 `resumeMultipart(file, session, options)` 续传。进度包含字节、分片数和百分比;尝试过 complete 后必须先核对结果,不能直接续传。
|
|
157
164
|
|
|
158
165
|
返回的下载 `Response` 由调用方消费;文件传输配置超时约束取得响应头的阶段,后续流式读取由调用方管理。所有业务附件、头像、导入/导出文件使用平台文件存储,不以 App 本地目录作为持久化存储。
|
|
159
166
|
|
|
@@ -239,3 +246,30 @@ node scripts/check-live-stream-runtime.mjs <consumer> <workspaceId> .tmp/live-st
|
|
|
239
246
|
```
|
|
240
247
|
|
|
241
248
|
业务项目锁定实际安装的版本并同步更新随包 Skills;本地检查不代表线上业务验收通过。
|
|
249
|
+
|
|
250
|
+
平台接口与能力发现的本地联调可分别运行 `node scripts/sync-contracts.mjs <backend> --worktree --platform-only` 和 `node scripts/sync-capability-contract.mjs <backend> --worktree`。预览来源明确记录基线和内容摘要,不能直接发布。Backend 提交后,将两条命令的 `--worktree` 替换为正式提交 SHA,再运行 `npm run generate && npm run check`;UNS 数据模型仍使用其独立固定输入。
|
|
251
|
+
|
|
252
|
+
采集流程的 Source 创建/更新/状态变更、Stream 文档创建/更新/部署均可省略 `dryRun`(默认 false 提交)。SQL 新连接可在 `source.documents.create` 中直接传 `credentials.kind: usernamePassword` 与只写用户名/密码,不传 `credentials.method`;连接地址不携带秘密。`contracts/uns-v2/provenance.json` 的 `schemaUpdates` 记录这次有限合同更新,共享数据模型继续使用固定基础版本。
|
|
253
|
+
|
|
254
|
+
## App Stream 交互与旧包迁移
|
|
255
|
+
|
|
256
|
+
浏览器使用 `import { client } from "@tier0/sdk-v2"`,调用 `client.streams.requests.use({code}).invoke(input, {idempotencyKey})` 或 `client.streams.messages.use({topic}).subscribe(handler)`;受信宿主自动提供连接,浏览器不配置 API Key。服务端使用根入口 `createClient()`,沿用环境注入。订阅不再使用时 dispose,客户端退出时 `await client.dispose()`;请求与消息不会自动重放业务写入。
|
|
257
|
+
|
|
258
|
+
旧 `/cloud` 改用根入口,`/cloud/server` 改用 `/server`,`/openapi/react` 和 `/openapi/vue` 改用 `/react` 和 `/vue`。`/streams`、`/runtime` 的现役能力已原生迁入本包;宿主 runtime Symbol 保留原协议标识,避免破坏已有网关注入。Source/Stream 管理、文件、MQTT、通知、成员和集合继续使用本包现有入口;旧文件单例函数改为 `client.files` 对应方法。旧 `getCurrentProjectId`、Flow、Control 及项目接口已退役,不迁回。
|
|
259
|
+
|
|
260
|
+
| 旧包现役能力 | 统一后的入口与迁移方式 |
|
|
261
|
+
| --- | --- |
|
|
262
|
+
| 根入口、`/cloud` 的 `client` / `createClient` | `@tier0/sdk-v2` 根入口;同一实例提供数据管理和 App 交互 |
|
|
263
|
+
| Stream `describe` / `discover` / `invoke` | `client.streams.requests`;保留类型、幂等键和结果未知语义 |
|
|
264
|
+
| 消息 `publish` / `subscribe` / `onError` / `dispose` | `client.streams.messages`;原生 NATS WSS,消息需要浏览器 WebSocket 或 Node.js 22+;HTTP 仍支持 Node.js 20.19+ |
|
|
265
|
+
| 请求/invoke 能力发现 | `client.streams.capabilities.discover()`;`client.capabilities.discover()` 独立保留 Namespace/Source/Stream 作用域 |
|
|
266
|
+
| Trusted runtime provider / App 请求验签 | `/runtime` / `/server`;原有宿主 Symbol 协议保持不变 |
|
|
267
|
+
| `unsV2`、平台操作、MQTT | `client.uns` / `client.source` / `client.stream`、现有平台入口、`/mq`;旧包全部现役公开操作已有对应 v2 操作 |
|
|
268
|
+
| `uploadFile` / `uploadFileMultipart` / `resumeMultipartUpload` | `client.files.upload` / `uploadMultipart` / `resumeMultipart`;上传选项与返回类型从 `/files` 导入 |
|
|
269
|
+
| `getFileUrl` / `downloadFile` / `deleteFile` | `client.files.url` / `download` / `delete`;download 返回原生 `Response` |
|
|
270
|
+
| 旧 React / Vue 每接口 hook | `/react` 的通用 query/mutation、`/vue` 的 `useTier0Request`;使用统一 client 和对应方法 |
|
|
271
|
+
| Project、Control、Flow 及旧配置版本入口 | 已退役,不提供别名或重新导出 |
|
|
272
|
+
|
|
273
|
+
真实消息本地验收用 `npm run test:streams:artifact`(Go、Node.js 22+、`nats-server`,通过 `TIER0_STREAM_MESSAGES_BACKEND_DIR` 指向 Backend checkout)。脚本验证生产 Go issuer、TLS NATS、已安装 tarball 的 ESM/CJS 及浏览器依赖闭包;固定夹具身份不代表线上 SYS/Gateway/App 权限链路或浏览器端到端验收。
|
|
274
|
+
|
|
275
|
+
代码存在不代表已发布。先构建并安装这次统一实现的不可变制品,更新 App 模板、依赖锁与存量 App,再移除旧包;不能用旧 npm 0.7.2 替代本分支构建。完整交互说明见 [Stream 交互](skills/tier0-sdk-v2/tier0-sdk-v2-streams/SKILL.md)。
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { type CloudTransportConfig } from './cloud-transport.js';
|
|
1
|
+
import { CloudTransport, type CloudTransportConfig } from './cloud-transport.js';
|
|
2
2
|
import { type HttpClient } from './openapi/client.js';
|
|
3
|
-
export type CapabilityCode = 'namespace.v2' | 'source' | 'stream';
|
|
3
|
+
export type CapabilityCode = 'namespace.v2' | 'source' | 'stream' | 'stream.requests.v1' | 'stream.requests.invoke.v1';
|
|
4
4
|
export type CapabilityState = 'disabled' | 'not_supported' | 'unavailable' | 'readiness_unknown' | 'ready';
|
|
5
|
-
export type CapabilityAvailability = 'unavailable' | 'unknown' | 'available';
|
|
6
5
|
export interface CapabilityDiagnostics {
|
|
7
6
|
reasonCode?: string;
|
|
8
7
|
checkedAt?: string;
|
|
@@ -11,24 +10,15 @@ export interface CapabilityDiagnostics {
|
|
|
11
10
|
}
|
|
12
11
|
export interface CapabilityOperation extends CapabilityDiagnostics {
|
|
13
12
|
operation: string;
|
|
14
|
-
releaseEnabled: boolean;
|
|
15
|
-
enabled: boolean;
|
|
16
|
-
allowed: boolean;
|
|
17
13
|
state: CapabilityState;
|
|
18
|
-
|
|
14
|
+
reasonCode: string;
|
|
19
15
|
requiresResourceCheck: boolean;
|
|
20
16
|
}
|
|
21
17
|
export interface PublicCapability extends CapabilityDiagnostics {
|
|
22
18
|
code: CapabilityCode;
|
|
23
|
-
/**
|
|
24
|
-
releaseEnabled: boolean;
|
|
25
|
-
/** Server-assessed implementation/readiness, never inferred from releaseEnabled. */
|
|
26
|
-
enabled: boolean;
|
|
27
|
-
/** Authorization summary, not authorization for an individual operation. */
|
|
28
|
-
allowed: boolean;
|
|
19
|
+
/** Discovery does not grant access to a resource or confirm a successful run. */
|
|
29
20
|
state: CapabilityState;
|
|
30
|
-
|
|
31
|
-
availability: CapabilityAvailability;
|
|
21
|
+
reasonCode: string;
|
|
32
22
|
contractVersions: string[];
|
|
33
23
|
operations?: CapabilityOperation[];
|
|
34
24
|
}
|
|
@@ -41,7 +31,7 @@ export interface CapabilityDiscoverResponse {
|
|
|
41
31
|
product: 'cloud' | 'enterprise';
|
|
42
32
|
/** Trusted server configuration only; absent when unconfigured. */
|
|
43
33
|
productVersion?: string;
|
|
44
|
-
contractVersion: '
|
|
34
|
+
contractVersion: '2.0';
|
|
45
35
|
apiContractVersions: string[];
|
|
46
36
|
/** Public SDK contract labels, not npm package versions. */
|
|
47
37
|
sdkContractVersions: string[];
|
|
@@ -60,7 +50,8 @@ export declare class CapabilityError extends Error {
|
|
|
60
50
|
constructor(message: string, info: CapabilityErrorInfo);
|
|
61
51
|
}
|
|
62
52
|
export declare class CapabilitiesClient {
|
|
63
|
-
|
|
53
|
+
protected transport: CloudTransport;
|
|
54
|
+
protected readonly contracts: Partial<Record<CapabilityCode, string[]>>;
|
|
64
55
|
constructor(resolveClient?: () => HttpClient, config?: CloudTransportConfig);
|
|
65
56
|
/** Workspace comes exclusively from the authenticated key. One POST, no automatic retries or caching. */
|
|
66
57
|
discover(): Promise<CapabilityDiscoverResponse>;
|
package/dist/cjs/capabilities.js
CHANGED
|
@@ -56,6 +56,7 @@ const streamOperations = ['read', 'configure', 'validate', 'deploy', 'execute',
|
|
|
56
56
|
const resourceOperations = {
|
|
57
57
|
source: ['test', 'discover', 'enable'],
|
|
58
58
|
stream: ['deploy', 'execute'],
|
|
59
|
+
'stream.requests.invoke.v1': ['invoke'],
|
|
59
60
|
};
|
|
60
61
|
function operationFields(value, code, fail) {
|
|
61
62
|
if (value.operations === undefined)
|
|
@@ -63,7 +64,8 @@ function operationFields(value, code, fail) {
|
|
|
63
64
|
if (!Array.isArray(value.operations))
|
|
64
65
|
return fail();
|
|
65
66
|
const operations = [];
|
|
66
|
-
const supported = code === 'source' ? sourceOperations : code === 'stream' ? streamOperations :
|
|
67
|
+
const supported = code === 'source' ? sourceOperations : code === 'stream' ? streamOperations :
|
|
68
|
+
code === 'stream.requests.invoke.v1' ? ['invoke'] : [];
|
|
67
69
|
const seen = new Set();
|
|
68
70
|
for (const item of value.operations) {
|
|
69
71
|
if (!record(item) || !text(item.operation))
|
|
@@ -73,25 +75,18 @@ function operationFields(value, code, fail) {
|
|
|
73
75
|
if (seen.has(item.operation))
|
|
74
76
|
return fail();
|
|
75
77
|
seen.add(item.operation);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (typeof item.releaseEnabled !== 'boolean' || typeof item.enabled !== 'boolean' || typeof item.allowed !== 'boolean' ||
|
|
79
|
-
typeof item.requiresResourceCheck !== 'boolean' ||
|
|
78
|
+
if (!text(item.reasonCode) || typeof item.requiresResourceCheck !== 'boolean' ||
|
|
79
|
+
(value.state === 'disabled' && item.state !== 'disabled') ||
|
|
80
80
|
(resourceOperations[code]?.includes(item.operation) && !item.requiresResourceCheck) ||
|
|
81
|
-
|
|
82
|
-
!['disabled', 'not_supported', 'unavailable', 'readiness_unknown', 'ready'].includes(item.state) ||
|
|
83
|
-
item.availability !== expected || item.enabled !== ready ||
|
|
84
|
-
(ready && (!item.releaseEnabled || !item.allowed)) ||
|
|
85
|
-
(item.state === 'disabled' ? item.releaseEnabled : !item.releaseEnabled))
|
|
81
|
+
!['disabled', 'not_supported', 'unavailable', 'readiness_unknown', 'ready'].includes(item.state))
|
|
86
82
|
return fail();
|
|
87
|
-
operations.push({ operation: item.operation,
|
|
88
|
-
allowed: item.allowed, state: item.state, availability: item.availability,
|
|
83
|
+
operations.push({ operation: item.operation, state: item.state, reasonCode: item.reasonCode,
|
|
89
84
|
requiresResourceCheck: item.requiresResourceCheck, ...diagnostics(item, fail) });
|
|
90
85
|
}
|
|
91
86
|
return { operations };
|
|
92
87
|
}
|
|
93
88
|
/** Validate and explicitly project the frozen contract; unknown capabilities/extension fields are ignored. */
|
|
94
|
-
function discovery(value, status) {
|
|
89
|
+
function discovery(value, status, accepted) {
|
|
95
90
|
const fail = (version = false) => {
|
|
96
91
|
throw new CapabilityError(version ? 'Unsupported capability contract version.' : 'Invalid capability discovery response.', {
|
|
97
92
|
status, errorCode: version ? 'CAPABILITY_UNSUPPORTED_VERSION' : 'CAPABILITY_PROTOCOL_ERROR',
|
|
@@ -104,7 +99,7 @@ function discovery(value, status) {
|
|
|
104
99
|
!Array.isArray(value.capabilities) || !Array.isArray(value.deprecations) ||
|
|
105
100
|
(value.productVersion !== undefined && !text(value.productVersion)))
|
|
106
101
|
return fail();
|
|
107
|
-
if (!['cloud', 'enterprise'].includes(value.product) || value.contractVersion !== '
|
|
102
|
+
if (!['cloud', 'enterprise'].includes(value.product) || value.contractVersion !== '2.0' ||
|
|
108
103
|
!value.apiContractVersions.includes('openapi/v2'))
|
|
109
104
|
return fail(true);
|
|
110
105
|
const capabilities = [];
|
|
@@ -112,28 +107,21 @@ function discovery(value, status) {
|
|
|
112
107
|
for (const item of value.capabilities) {
|
|
113
108
|
if (!record(item) || !text(item.code))
|
|
114
109
|
return fail();
|
|
115
|
-
if (!Object.prototype.hasOwnProperty.call(
|
|
110
|
+
if (!Object.prototype.hasOwnProperty.call(accepted, item.code))
|
|
116
111
|
continue;
|
|
117
112
|
const code = item.code;
|
|
118
113
|
if (seen.has(code))
|
|
119
114
|
return fail();
|
|
120
115
|
seen.add(code);
|
|
121
|
-
if (
|
|
116
|
+
if (!text(item.reasonCode) ||
|
|
122
117
|
!['disabled', 'not_supported', 'unavailable', 'readiness_unknown', 'ready'].includes(item.state) ||
|
|
123
|
-
!
|
|
118
|
+
!strings(item.contractVersions))
|
|
124
119
|
return fail();
|
|
125
|
-
if (
|
|
120
|
+
if (accepted[code].some(version => !item.contractVersions.includes(version) ||
|
|
126
121
|
(version.startsWith('openapi/') && !value.apiContractVersions.includes(version))))
|
|
127
122
|
return fail(true);
|
|
128
|
-
const ready = item.state === 'ready';
|
|
129
|
-
const expectedAvailability = ready ? 'available' : item.state === 'readiness_unknown' ? 'unknown' : 'unavailable';
|
|
130
|
-
if (item.enabled !== ready || item.availability !== expectedAvailability ||
|
|
131
|
-
(ready && (!item.releaseEnabled || !item.allowed)) ||
|
|
132
|
-
(item.state === 'disabled' ? item.releaseEnabled : !item.releaseEnabled))
|
|
133
|
-
return fail();
|
|
134
123
|
capabilities.push({
|
|
135
|
-
code,
|
|
136
|
-
state: item.state, availability: item.availability,
|
|
124
|
+
code, state: item.state, reasonCode: item.reasonCode,
|
|
137
125
|
contractVersions: [...item.contractVersions],
|
|
138
126
|
...diagnostics(item, fail),
|
|
139
127
|
...operationFields(item, code, fail),
|
|
@@ -152,13 +140,14 @@ function discovery(value, status) {
|
|
|
152
140
|
}
|
|
153
141
|
return {
|
|
154
142
|
product: value.product, ...(value.productVersion === undefined ? {} : { productVersion: value.productVersion }),
|
|
155
|
-
contractVersion: '
|
|
143
|
+
contractVersion: '2.0', apiContractVersions: [...value.apiContractVersions],
|
|
156
144
|
sdkContractVersions: [...value.sdkContractVersions],
|
|
157
145
|
capabilities, deprecations,
|
|
158
146
|
};
|
|
159
147
|
}
|
|
160
148
|
class CapabilitiesClient {
|
|
161
149
|
transport;
|
|
150
|
+
contracts = contracts;
|
|
162
151
|
constructor(resolveClient = client_js_1.getClient, config = {}) {
|
|
163
152
|
this.transport = new cloud_transport_js_1.CloudTransport(resolveClient, config);
|
|
164
153
|
}
|
|
@@ -184,7 +173,7 @@ class CapabilitiesClient {
|
|
|
184
173
|
}
|
|
185
174
|
throw new CapabilityError(value.message, { status, errorCode: value.errorCode });
|
|
186
175
|
}
|
|
187
|
-
return discovery(value, status);
|
|
176
|
+
return discovery(value, status, this.contracts);
|
|
188
177
|
}
|
|
189
178
|
}
|
|
190
179
|
exports.CapabilitiesClient = CapabilitiesClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { CloudTransport, CloudTransportError, type CloudTransportConfig } from './cloud-transport.js';\nimport { getClient, type HttpClient } from './openapi/client.js';\n\nexport type CapabilityCode = 'namespace.v2' | 'source' | 'stream';\nexport type CapabilityState = 'disabled' | 'not_supported' | 'unavailable' | 'readiness_unknown' | 'ready';\nexport type CapabilityAvailability = 'unavailable' | 'unknown' | 'available';\n\nexport interface CapabilityDiagnostics {\n reasonCode?: string;\n checkedAt?: string;\n validUntil?: string;\n retryAfterMs?: number;\n}\n\nexport interface CapabilityOperation extends CapabilityDiagnostics {\n operation: string;\n releaseEnabled: boolean;\n enabled: boolean;\n allowed: boolean;\n state: CapabilityState;\n availability: CapabilityAvailability;\n requiresResourceCheck: boolean;\n}\n\nexport interface PublicCapability extends CapabilityDiagnostics {\n code: CapabilityCode;\n /** Public release and workspace gates; does not establish runtime readiness. */\n releaseEnabled: boolean;\n /** Server-assessed implementation/readiness, never inferred from releaseEnabled. */\n enabled: boolean;\n /** Authorization summary, not authorization for an individual operation. */\n allowed: boolean;\n state: CapabilityState;\n /** Not device online status or execution/ACK confirmation. */\n availability: CapabilityAvailability;\n contractVersions: string[];\n operations?: CapabilityOperation[];\n}\n\nexport interface CapabilityDeprecation {\n contract: string;\n replacement?: string;\n sunsetAt?: string;\n}\n\nexport interface CapabilityDiscoverResponse {\n product: 'cloud' | 'enterprise';\n /** Trusted server configuration only; absent when unconfigured. */\n productVersion?: string;\n contractVersion: '1.0';\n apiContractVersions: string[];\n /** Public SDK contract labels, not npm package versions. */\n sdkContractVersions: string[];\n capabilities: PublicCapability[];\n deprecations: CapabilityDeprecation[];\n}\n\nexport interface CapabilityErrorInfo {\n status?: number;\n /** Gateway string code (including unknown future codes), or an SDK-local CAPABILITY_* code. */\n errorCode: string;\n}\n\nexport class CapabilityError extends Error {\n readonly status?: number;\n readonly errorCode: string;\n readonly retryable = false;\n\n constructor(message: string, info: CapabilityErrorInfo) {\n super(message);\n this.name = 'CapabilityError';\n this.status = info.status;\n this.errorCode = info.errorCode;\n }\n}\n\nconst contracts: Record<CapabilityCode, string[]> = {\n 'namespace.v2': ['openapi/v2'],\n 'source': ['openapi/v2'],\n 'stream': ['openapi/v2'],\n};\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction text(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\nfunction strings(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(text) && new Set(value).size === value.length;\n}\n\n\nfunction diagnostics(value: Record<string, unknown>, fail: () => never): CapabilityDiagnostics {\n const result: CapabilityDiagnostics = {};\n for (const field of ['reasonCode', 'checkedAt', 'validUntil'] as const) {\n if (value[field] === undefined) continue;\n if (!text(value[field])) return fail();\n if (field !== 'reasonCode' && (!/^\\d{4}-\\d\\d-\\d\\d[Tt]\\d\\d:\\d\\d:\\d\\d(?:\\.\\d+)?(?:[Zz]|[+-]\\d\\d:\\d\\d)$/.test(value[field]) ||\n !Number.isFinite(Date.parse(value[field])))) return fail();\n result[field] = value[field];\n }\n if (value.retryAfterMs !== undefined) {\n if (typeof value.retryAfterMs !== 'number' || !Number.isSafeInteger(value.retryAfterMs) || value.retryAfterMs < 0) return fail();\n result.retryAfterMs = value.retryAfterMs;\n }\n if (result.validUntil !== undefined && (value.state !== 'ready' || result.checkedAt === undefined ||\n Date.parse(result.validUntil) <= Date.parse(result.checkedAt))) return fail();\n return result;\n}\n\nconst sourceOperations = ['read', 'configure', 'test', 'discover', 'enable', 'disable'];\nconst streamOperations = ['read', 'configure', 'validate', 'deploy', 'execute', 'disable'];\nconst resourceOperations: Partial<Record<CapabilityCode, readonly string[]>> = {\n source: ['test', 'discover', 'enable'],\n stream: ['deploy', 'execute'],\n};\n\nfunction operationFields(value: Record<string, unknown>, code: CapabilityCode, fail: () => never): { operations?: CapabilityOperation[] } {\n if (value.operations === undefined) return {};\n if (!Array.isArray(value.operations)) return fail();\n const operations: CapabilityOperation[] = [];\n const supported = code === 'source' ? sourceOperations : code === 'stream' ? streamOperations : [];\n const seen = new Set<string>();\n for (const item of value.operations) {\n if (!record(item) || !text(item.operation)) return fail();\n if (!supported.includes(item.operation)) continue;\n if (seen.has(item.operation)) return fail();\n seen.add(item.operation);\n const ready = item.state === 'ready';\n const expected = ready ? 'available' : item.state === 'readiness_unknown' ? 'unknown' : 'unavailable';\n if (typeof item.releaseEnabled !== 'boolean' || typeof item.enabled !== 'boolean' || typeof item.allowed !== 'boolean' ||\n typeof item.requiresResourceCheck !== 'boolean' ||\n (resourceOperations[code]?.includes(item.operation) && !item.requiresResourceCheck) ||\n (value.releaseEnabled === false && item.releaseEnabled !== false) ||\n !['disabled', 'not_supported', 'unavailable', 'readiness_unknown', 'ready'].includes(item.state as string) ||\n item.availability !== expected || item.enabled !== ready ||\n (ready && (!item.releaseEnabled || !item.allowed)) ||\n (item.state === 'disabled' ? item.releaseEnabled : !item.releaseEnabled)) return fail();\n operations.push({operation: item.operation, releaseEnabled: item.releaseEnabled, enabled: item.enabled,\n allowed: item.allowed, state: item.state as CapabilityState, availability: item.availability as CapabilityAvailability,\n requiresResourceCheck: item.requiresResourceCheck, ...diagnostics(item, fail)});\n }\n return { operations };\n}\n\n/** Validate and explicitly project the frozen contract; unknown capabilities/extension fields are ignored. */\nfunction discovery(value: unknown, status: number): CapabilityDiscoverResponse {\n const fail = (version = false): never => {\n throw new CapabilityError(version ? 'Unsupported capability contract version.' : 'Invalid capability discovery response.', {\n status, errorCode: version ? 'CAPABILITY_UNSUPPORTED_VERSION' : 'CAPABILITY_PROTOCOL_ERROR',\n });\n };\n if (!record(value)) return fail();\n if (!text(value.product) || !text(value.contractVersion) ||\n !strings(value.apiContractVersions) || !strings(value.sdkContractVersions) ||\n !Array.isArray(value.capabilities) || !Array.isArray(value.deprecations) ||\n (value.productVersion !== undefined && !text(value.productVersion))) return fail();\n if (!['cloud', 'enterprise'].includes(value.product) || value.contractVersion !== '1.0' ||\n !value.apiContractVersions.includes('openapi/v2')) return fail(true);\n\n const capabilities: PublicCapability[] = [];\n const seen = new Set<string>();\n for (const item of value.capabilities) {\n if (!record(item) || !text(item.code)) return fail();\n if (!Object.prototype.hasOwnProperty.call(contracts, item.code)) continue;\n const code = item.code as CapabilityCode;\n if (seen.has(code)) return fail();\n seen.add(code);\n if (typeof item.releaseEnabled !== 'boolean' || typeof item.enabled !== 'boolean' || typeof item.allowed !== 'boolean' ||\n !['disabled', 'not_supported', 'unavailable', 'readiness_unknown', 'ready'].includes(item.state as string) ||\n !['unavailable', 'unknown', 'available'].includes(item.availability as string) || !strings(item.contractVersions)) return fail();\n if (contracts[code].some(version =>\n !(item.contractVersions as string[]).includes(version) ||\n (version.startsWith('openapi/') && !(value.apiContractVersions as string[]).includes(version)))) return fail(true);\n const ready = item.state === 'ready';\n const expectedAvailability = ready ? 'available' : item.state === 'readiness_unknown' ? 'unknown' : 'unavailable';\n if (item.enabled !== ready || item.availability !== expectedAvailability ||\n (ready && (!item.releaseEnabled || !item.allowed)) ||\n (item.state === 'disabled' ? item.releaseEnabled : !item.releaseEnabled)) return fail();\n capabilities.push({\n code, releaseEnabled: item.releaseEnabled, enabled: item.enabled, allowed: item.allowed,\n state: item.state as CapabilityState, availability: item.availability as CapabilityAvailability,\n contractVersions: [...item.contractVersions],\n ...diagnostics(item, fail),\n ...operationFields(item, code, fail),\n });\n }\n const deprecations: CapabilityDeprecation[] = [];\n for (const item of value.deprecations) {\n if (!record(item) || !text(item.contract) ||\n (item.replacement !== undefined && !text(item.replacement)) ||\n (item.sunsetAt !== undefined && !text(item.sunsetAt))) return fail();\n deprecations.push({ contract: item.contract,\n ...(item.replacement === undefined ? {} : { replacement: item.replacement as string }),\n ...(item.sunsetAt === undefined ? {} : { sunsetAt: item.sunsetAt as string }),\n });\n }\n return {\n product: value.product as CapabilityDiscoverResponse['product'], ...(value.productVersion === undefined ? {} : { productVersion: value.productVersion as string }),\n contractVersion: '1.0', apiContractVersions: [...value.apiContractVersions],\n sdkContractVersions: [...value.sdkContractVersions],\n capabilities, deprecations,\n };\n}\n\nexport class CapabilitiesClient {\n private readonly transport: CloudTransport;\n\n constructor(resolveClient: () => HttpClient = getClient, config: CloudTransportConfig = {}) {\n this.transport = new CloudTransport(resolveClient, config);\n }\n\n /** Workspace comes exclusively from the authenticated key. One POST, no automatic retries or caching. */\n async discover(): Promise<CapabilityDiscoverResponse> {\n if (arguments.length !== 0) throw new TypeError('Tier0 SDK: capability discovery accepts no arguments.');\n let response: Awaited<ReturnType<CloudTransport['post']>>;\n try {\n response = await this.transport.post('/openapi/v2/capabilities/discover', {});\n } catch (error) {\n if (!(error instanceof CloudTransportError)) throw error;\n throw new CapabilityError('Capability discovery HTTP exchange failed.', {\n status: error.status, errorCode: `CAPABILITY_${error.kind}`,\n });\n }\n const { value, status, ok } = response;\n if (!ok) {\n if (!record(value) || !text(value.errorCode) || typeof value.message !== 'string') {\n throw new CapabilityError('Invalid capability error response.', { status, errorCode: 'CAPABILITY_PROTOCOL_ERROR' });\n }\n throw new CapabilityError(value.message, { status, errorCode: value.errorCode });\n }\n return discovery(value, status);\n }\n}\n\n/** Uses configureClient()/runtime environment, resolving the host and workspace key on every call. */\nexport const capabilities = new CapabilitiesClient();\n"]}
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { CloudTransport, CloudTransportError, type CloudTransportConfig } from './cloud-transport.js';\nimport { getClient, type HttpClient } from './openapi/client.js';\n\nexport type CapabilityCode = 'namespace.v2' | 'source' | 'stream' | 'stream.requests.v1' | 'stream.requests.invoke.v1';\nexport type CapabilityState = 'disabled' | 'not_supported' | 'unavailable' | 'readiness_unknown' | 'ready';\n\nexport interface CapabilityDiagnostics {\n reasonCode?: string;\n checkedAt?: string;\n validUntil?: string;\n retryAfterMs?: number;\n}\n\nexport interface CapabilityOperation extends CapabilityDiagnostics {\n operation: string;\n state: CapabilityState;\n reasonCode: string;\n requiresResourceCheck: boolean;\n}\n\nexport interface PublicCapability extends CapabilityDiagnostics {\n code: CapabilityCode;\n /** Discovery does not grant access to a resource or confirm a successful run. */\n state: CapabilityState;\n reasonCode: string;\n contractVersions: string[];\n operations?: CapabilityOperation[];\n}\n\nexport interface CapabilityDeprecation {\n contract: string;\n replacement?: string;\n sunsetAt?: string;\n}\n\nexport interface CapabilityDiscoverResponse {\n product: 'cloud' | 'enterprise';\n /** Trusted server configuration only; absent when unconfigured. */\n productVersion?: string;\n contractVersion: '2.0';\n apiContractVersions: string[];\n /** Public SDK contract labels, not npm package versions. */\n sdkContractVersions: string[];\n capabilities: PublicCapability[];\n deprecations: CapabilityDeprecation[];\n}\n\nexport interface CapabilityErrorInfo {\n status?: number;\n /** Gateway string code (including unknown future codes), or an SDK-local CAPABILITY_* code. */\n errorCode: string;\n}\n\nexport class CapabilityError extends Error {\n readonly status?: number;\n readonly errorCode: string;\n readonly retryable = false;\n\n constructor(message: string, info: CapabilityErrorInfo) {\n super(message);\n this.name = 'CapabilityError';\n this.status = info.status;\n this.errorCode = info.errorCode;\n }\n}\n\nconst contracts: Partial<Record<CapabilityCode, string[]>> = {\n 'namespace.v2': ['openapi/v2'],\n 'source': ['openapi/v2'],\n 'stream': ['openapi/v2'],\n};\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction text(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\nfunction strings(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(text) && new Set(value).size === value.length;\n}\n\n\nfunction diagnostics(value: Record<string, unknown>, fail: () => never): CapabilityDiagnostics {\n const result: CapabilityDiagnostics = {};\n for (const field of ['reasonCode', 'checkedAt', 'validUntil'] as const) {\n if (value[field] === undefined) continue;\n if (!text(value[field])) return fail();\n if (field !== 'reasonCode' && (!/^\\d{4}-\\d\\d-\\d\\d[Tt]\\d\\d:\\d\\d:\\d\\d(?:\\.\\d+)?(?:[Zz]|[+-]\\d\\d:\\d\\d)$/.test(value[field]) ||\n !Number.isFinite(Date.parse(value[field])))) return fail();\n result[field] = value[field];\n }\n if (value.retryAfterMs !== undefined) {\n if (typeof value.retryAfterMs !== 'number' || !Number.isSafeInteger(value.retryAfterMs) || value.retryAfterMs < 0) return fail();\n result.retryAfterMs = value.retryAfterMs;\n }\n if (result.validUntil !== undefined && (value.state !== 'ready' || result.checkedAt === undefined ||\n Date.parse(result.validUntil) <= Date.parse(result.checkedAt))) return fail();\n return result;\n}\n\nconst sourceOperations = ['read', 'configure', 'test', 'discover', 'enable', 'disable'];\nconst streamOperations = ['read', 'configure', 'validate', 'deploy', 'execute', 'disable'];\nconst resourceOperations: Partial<Record<CapabilityCode, readonly string[]>> = {\n source: ['test', 'discover', 'enable'],\n stream: ['deploy', 'execute'],\n 'stream.requests.invoke.v1': ['invoke'],\n};\n\nfunction operationFields(value: Record<string, unknown>, code: CapabilityCode, fail: () => never): { operations?: CapabilityOperation[] } {\n if (value.operations === undefined) return {};\n if (!Array.isArray(value.operations)) return fail();\n const operations: CapabilityOperation[] = [];\n const supported = code === 'source' ? sourceOperations : code === 'stream' ? streamOperations :\n code === 'stream.requests.invoke.v1' ? ['invoke'] : [];\n const seen = new Set<string>();\n for (const item of value.operations) {\n if (!record(item) || !text(item.operation)) return fail();\n if (!supported.includes(item.operation)) continue;\n if (seen.has(item.operation)) return fail();\n seen.add(item.operation);\n if (!text(item.reasonCode) || typeof item.requiresResourceCheck !== 'boolean' ||\n (value.state === 'disabled' && item.state !== 'disabled') ||\n (resourceOperations[code]?.includes(item.operation) && !item.requiresResourceCheck) ||\n !['disabled', 'not_supported', 'unavailable', 'readiness_unknown', 'ready'].includes(item.state as string)) return fail();\n operations.push({operation: item.operation, state: item.state as CapabilityState, reasonCode: item.reasonCode,\n requiresResourceCheck: item.requiresResourceCheck, ...diagnostics(item, fail)});\n }\n return { operations };\n}\n\n/** Validate and explicitly project the frozen contract; unknown capabilities/extension fields are ignored. */\nfunction discovery(value: unknown, status: number, accepted: Partial<Record<CapabilityCode, string[]>>): CapabilityDiscoverResponse {\n const fail = (version = false): never => {\n throw new CapabilityError(version ? 'Unsupported capability contract version.' : 'Invalid capability discovery response.', {\n status, errorCode: version ? 'CAPABILITY_UNSUPPORTED_VERSION' : 'CAPABILITY_PROTOCOL_ERROR',\n });\n };\n if (!record(value)) return fail();\n if (!text(value.product) || !text(value.contractVersion) ||\n !strings(value.apiContractVersions) || !strings(value.sdkContractVersions) ||\n !Array.isArray(value.capabilities) || !Array.isArray(value.deprecations) ||\n (value.productVersion !== undefined && !text(value.productVersion))) return fail();\n if (!['cloud', 'enterprise'].includes(value.product) || value.contractVersion !== '2.0' ||\n !value.apiContractVersions.includes('openapi/v2')) return fail(true);\n\n const capabilities: PublicCapability[] = [];\n const seen = new Set<string>();\n for (const item of value.capabilities) {\n if (!record(item) || !text(item.code)) return fail();\n if (!Object.prototype.hasOwnProperty.call(accepted, item.code)) continue;\n const code = item.code as CapabilityCode;\n if (seen.has(code)) return fail();\n seen.add(code);\n if (!text(item.reasonCode) ||\n !['disabled', 'not_supported', 'unavailable', 'readiness_unknown', 'ready'].includes(item.state as string) ||\n !strings(item.contractVersions)) return fail();\n if (accepted[code]!.some(version =>\n !(item.contractVersions as string[]).includes(version) ||\n (version.startsWith('openapi/') && !(value.apiContractVersions as string[]).includes(version)))) return fail(true);\n capabilities.push({\n code, state: item.state as CapabilityState, reasonCode: item.reasonCode,\n contractVersions: [...item.contractVersions],\n ...diagnostics(item, fail),\n ...operationFields(item, code, fail),\n });\n }\n const deprecations: CapabilityDeprecation[] = [];\n for (const item of value.deprecations) {\n if (!record(item) || !text(item.contract) ||\n (item.replacement !== undefined && !text(item.replacement)) ||\n (item.sunsetAt !== undefined && !text(item.sunsetAt))) return fail();\n deprecations.push({ contract: item.contract,\n ...(item.replacement === undefined ? {} : { replacement: item.replacement as string }),\n ...(item.sunsetAt === undefined ? {} : { sunsetAt: item.sunsetAt as string }),\n });\n }\n return {\n product: value.product as CapabilityDiscoverResponse['product'], ...(value.productVersion === undefined ? {} : { productVersion: value.productVersion as string }),\n contractVersion: '2.0', apiContractVersions: [...value.apiContractVersions],\n sdkContractVersions: [...value.sdkContractVersions],\n capabilities, deprecations,\n };\n}\n\nexport class CapabilitiesClient {\n protected transport: CloudTransport;\n protected readonly contracts: Partial<Record<CapabilityCode, string[]>> = contracts;\n\n constructor(resolveClient: () => HttpClient = getClient, config: CloudTransportConfig = {}) {\n this.transport = new CloudTransport(resolveClient, config);\n }\n\n /** Workspace comes exclusively from the authenticated key. One POST, no automatic retries or caching. */\n async discover(): Promise<CapabilityDiscoverResponse> {\n if (arguments.length !== 0) throw new TypeError('Tier0 SDK: capability discovery accepts no arguments.');\n let response: Awaited<ReturnType<CloudTransport['post']>>;\n try {\n response = await this.transport.post('/openapi/v2/capabilities/discover', {});\n } catch (error) {\n if (!(error instanceof CloudTransportError)) throw error;\n throw new CapabilityError('Capability discovery HTTP exchange failed.', {\n status: error.status, errorCode: `CAPABILITY_${error.kind}`,\n });\n }\n const { value, status, ok } = response;\n if (!ok) {\n if (!record(value) || !text(value.errorCode) || typeof value.message !== 'string') {\n throw new CapabilityError('Invalid capability error response.', { status, errorCode: 'CAPABILITY_PROTOCOL_ERROR' });\n }\n throw new CapabilityError(value.message, { status, errorCode: value.errorCode });\n }\n return discovery(value, status, this.contracts);\n }\n}\n\n/** Uses configureClient()/runtime environment, resolving the host and workspace key on every call. */\nexport const capabilities = new CapabilitiesClient();\n"]}
|