@sema-agent/sdk 9.7.1 → 9.8.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/README.md +77 -0
- package/dist/client.d.ts +8 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -0
- package/dist/client.js.map +1 -1
- package/dist/device/index.d.ts +407 -0
- package/dist/device/index.d.ts.map +1 -0
- package/dist/device/index.js +223 -0
- package/dist/device/index.js.map +1 -0
- package/dist/errors.d.ts +53 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +66 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/devices.d.ts +169 -0
- package/dist/resources/devices.d.ts.map +1 -0
- package/dist/resources/devices.js +133 -0
- package/dist/resources/devices.js.map +1 -0
- package/dist/types.d.ts +133 -0
- package/dist/types.d.ts.map +1 -1
- package/openapi.yaml +476 -0
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -49,10 +49,87 @@ for await (const ev of client.runs.events(task.taskId)) {
|
|
|
49
49
|
`NotFoundError` with `errorCode: "not_found.route"`, distinguishable from every other 404 on this family and
|
|
50
50
|
from the 501 `capability.rule_store_required`).
|
|
51
51
|
- `client.elicitations` — answer an inbound MCP elicitation form.
|
|
52
|
+
- `client.devices` — the **device lane admin face** (server >= 7.88.0, wire contract §14): `list` /
|
|
53
|
+
`sessionBinding` / `rebind` / `issueEnrollToken` / `enroll` / `revoke`. Gate on
|
|
54
|
+
`capabilities.deviceExecutor` — `false` means all six answer 501 `capability.device_lane_required`, so hide
|
|
55
|
+
the entry; an object with `management === true` means they are mounted (`rebind` additionally needs the run
|
|
56
|
+
store: without it the server answers `501 capability.run_store_required` even with `management === true`); an object with `management` **absent**
|
|
57
|
+
means a pre-7.88.0 peer that cannot answer (probe by 501 — **absence is not `false`**). First-bind is not a
|
|
58
|
+
verb here: it is the submit body's top-level `deviceId` (§14.6).
|
|
52
59
|
- `client.workflows`, `client.fleet`, `client.models`, `client.usage`, `client.trace`, … — see the typed exports in `dist/index.d.ts` and the bundled `openapi.yaml`.
|
|
53
60
|
|
|
61
|
+
### `@sema-agent/sdk/device` — the executor-side protocol face
|
|
62
|
+
|
|
63
|
+
A separate subpath (**Node-only** — it returns `Buffer`) mirroring `@sema-agent/server/device-protocol`: the
|
|
64
|
+
closed-set vocabularies, both directions' frame types, and the two pure functions that build the bytes a device
|
|
65
|
+
signs during the handshake. An executor depends on **this**, never on the server package (layering), and the
|
|
66
|
+
mirror is watched by a five-cell same-source anchor gate against the server's *published bytes*.
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { buildHelloSignaturePayload, DEVICE_WS_PATH } from "@sema-agent/sdk/device";
|
|
70
|
+
import { sign } from "node:crypto";
|
|
71
|
+
const signatureB64 = sign(null, buildHelloSignaturePayload({ nonce, deviceId, epoch, protocolVersion: 1 }), privateKey).toString("base64");
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The byte layout is frozen across repos: getting one byte wrong makes **every** legal executor fail with
|
|
75
|
+
`auth_failed`, and the server deliberately will not say which half was wrong. The protocol's prose source of
|
|
76
|
+
truth is the server repo's `docs/DEVICE-EXECUTOR-PROTOCOL.md` (§1.3 = the signature bytes, the fixed test
|
|
77
|
+
vector, and the per-case `epoch` rejection table — note that a trailing `Z` is accepted while a leading `Z` is
|
|
78
|
+
not, so a decoder that rejects "any Z" is wrong).
|
|
79
|
+
|
|
54
80
|
Typed errors (`APIError` hierarchy: `AuthError`, `RateLimitedError`, `ConflictError`, `ApprovalStaleError`, …) let callers branch on semantics instead of strings.
|
|
55
81
|
|
|
82
|
+
## 9.8.1 — 2026-09-19(spec-only patch;零运行时改动)
|
|
83
|
+
|
|
84
|
+
- `spec/openapi.yaml` device 四个文本字段的长度单位写真:`DeviceRevokeRequest.reason` / `DeviceEnrollRequest.{displayName,platformArch,workspaceRoot}` 在 server 侧按 **UTF-8 字节**门禁(`Buffer.byteLength`),本文件的全局单位约定只在字段**显式写明 UTF-8** 时才允许这个例外——9.8.0 的 `reason` 只写了 BYTES、另三个字段没有 `maxLength`。现在四个字段都带 server 的数字作**宽松字符界**(方向刻意:多字节值可过 schema、被 server 以点名字段的 400 拒,绝不出现客户端假拒)并写明 UTF-8。codex 补审 r1 抓出(sdk 台账 K-03)。
|
|
85
|
+
|
|
86
|
+
## 9.8.0 — 2026-09-19(additive;追平 server **7.88.0 → 7.88.2** 的 device 车道面;新子路径 `@sema-agent/sdk/device`;devDep server 钉 7.87.1 → 7.88.2)
|
|
87
|
+
|
|
88
|
+
**一句话:device 车道在 SDK 上此前是一片空白 —— 管理面六动词无型、提交体的 `deviceId` 无键、能力位 `deviceExecutor.management` 只能从索引签名拿 `unknown`、而 executor 最需要的那两只纯函数(握手签名的字节编码)只存在于 server 包里;这一车把四件一次补齐,并给协议镜像装上对 server **发布字节**的同源锚门五格。**
|
|
89
|
+
|
|
90
|
+
### 谁需要 / 谁受伤 / 什么补偿
|
|
91
|
+
|
|
92
|
+
- **谁需要**:①**设备端 executor 的实现方**(cli 的 `sema device serve`,以及任何第三方 executor)—— 握手签名的逐字节编码是**运行时代码**而不是一份型,手抄错一个字节的后果是**所有**合法 executor 恒 `auth_failed`,而 server 不会告诉你坏的是哪一半;分层公理又不允许一个 executor 去依赖整只 server 包(那会把 SQL 驱动 / undici / ws 倒灌进客户端)。②**壳与看板** —— 「列我的设备 / 这条会话绑在哪台 / 换一台 / 签发注册码 / 注册 / 吊销」六个动词此前只能手抄 fetch。③**提交方** —— 首绑此前只能绕过型面硬塞一个未声明的顶层键。
|
|
93
|
+
- **谁受伤**:**没有人因为升级本 SDK 而行为变化**(纯新增:零删除、零改名、零收窄;主入口的运行时一个字节没动)。唯一动过的旧路径是 `device.*` 的 409:9.7.1 上它们落通用 `ConflictError`(已带 `activeTaskId`),9.8.0 落 `DeviceError` —— **`DeviceError extends ConflictError`**,所以 `instanceof ConflictError` 与 `.activeTaskId` 两种旧读法逐字照旧(复审 F1 红先钉 `devices.test.ts`)。受伤的是**旧读法**:①把 `capabilities.deviceExecutor.management` 的**缺席**读成 `false` —— 缺席的含义是「对面是 7.88.0 之前的 server,判不出来」,与「这台明说没有管理面」处置相反;②指望在 `device.rebind_*` 的拒绝体里找一层 `details` —— `currentRev` / `activeTaskId` 是**平铺顶层键**(server `sendError` 把 `extra` spread 到顶层),本版把它们提到 `DeviceError` 的具名属性上;③把 `not_found.device` 当存在性答案(它是**五臂同码同串**的反枚举 404)。
|
|
94
|
+
- **什么补偿**:①镜像的真源在 server 包,由 **同源锚门五格**看住(见下),锚门红了的分流(server 加名 ⇒ 补镜像;server 删名 ⇒ 下一 major)写在门的文件头,不留给下一个人现场发明;②每一处「缺席该怎么读」都写进类型顶注**与随包 `openapi.yaml` 的 description**,并逐条有机器钉(`test/devices.test.ts` 42 格 + `test/device-protocol.test.ts` 26 格 + 锚门 6 格);③`device.busy` 落在 `RateLimitedError` 而不是 `DeviceError` 这一形**如实登记为 characterization**(理由见下),不靠给规则加特例来抹平。
|
|
95
|
+
|
|
96
|
+
### 逐件
|
|
97
|
+
|
|
98
|
+
1. **新子路径 `@sema-agent/sdk/device`** —— `@sema-agent/server/device-protocol`(server ≥7.88.0)的**镜像**:16 个运行时导出(`DEVICE_WS_PATH` / `DEVICE_PROTOCOL_VERSION` / `DEVICE_MIN_PROTOCOL_VERSION` / `DEVICE_HELLO_DOMAIN_TAG` / `DEVICE_WS_LIMITS` / 七张闭集词表 / `DEVICE_INSTRUCTION_KINDS` / `DEVICE_OUTCOME_ERROR_CODES` / `buildHelloSignaturePayload` / `decodeUlid16`)+ 25 个型导出(两向帧型、per-kind 入参、结局判别联合)。`buildHelloSignaturePayload` / `decodeUlid16` **照 server 实现重写**,零运行时依赖(只用 Node 全局 `Buffer`,不 import 任何包)。
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { buildHelloSignaturePayload, DEVICE_WS_PATH } from "@sema-agent/sdk/device";
|
|
102
|
+
import { sign } from "node:crypto";
|
|
103
|
+
const signatureB64 = sign(null, buildHelloSignaturePayload({ nonce, deviceId, epoch, protocolVersion: 1 }), privateKey).toString("base64");
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
🔴 **这条子路径是 Node-only**(回 `Buffer`,可直接喂 `node:crypto`),刻意**不进**主入口 —— 主入口仍是同构的(relay 态要能在浏览器里构造)。🔴 **别在镜像里做设计**:要加名字 / 改值 / 改判据,先去 server 仓改。
|
|
107
|
+
|
|
108
|
+
2. **同源锚门五格**(`test/live/device-protocol-mirror.test.ts`,走既有 `SEMA_SDK_FENCE_SERVER_DIR` 形,对**钉版真 server 的发布字节**):①运行时导出名集合相等(两向差集分开报,因为两个方向的处置**相反**);②每个非函数导出**深等**(闭集数组的**顺序**也比 —— 集合相等不够);③固定向量 **两边各算一次**再比 hex,且都要等于协议文档 §1.3 冻结的那串 102 字节;④`decodeUlid16` 对 §1.3 拒绝集**逐格同答**(`null` vs 16 字节,含「末位 `Z` 通过 / 首位 `Z` 被拒」那一对判别位,以及两个入口**刻意不同**的拒绝形:回 null vs 抛);⑤`.d.ts` 的导出名集合**与每个型的声明体**都相等 —— **型面**漂了先在这里红(帧型是纯型,前四格看不见它)。
|
|
109
|
+
|
|
110
|
+
🔴 格⑤ 比「体」而不只比「名」,是**本车自查撞出来的**:镜像里最可能犯的错不是少导出一个名字,而是**名字对、体抄错**(`instructionId` 少个字母 / `number` 写成 `string` / 漏一个可选字段)—— 那一类对 ①②③④ 结构性失明(纯型,零运行时),对「名集合相等」也失明。体的比对读的是发布字节里 `dist/device-ws-protocol.d.ts` 的声明(子路径那只 d.ts 只有一张名单),归一化**只**抹两类纯书写差异(`.d.ts` 发射器补的成员尾 `;`、手写源多行联合的前导 `|`),并写明不许再往归一化里加规则。
|
|
111
|
+
|
|
112
|
+
判别力实测七发变异,每发只红它该红的格:闭集顺序调换 → 1 格(②);domain tag 改一字节 → 4 格(②③③b④);解码器「拒掉任何 Z」→ 3 格(③b④ + 本包那格);删一个型导出 → 1 格(⑤);**帧字段改名 / 字段类型改窄 / 漏一个可选字段 → 各 1 格(⑤ 的体半场)**,而这三发在扩之前一格都不红。
|
|
113
|
+
|
|
114
|
+
3. **`TaskRequest.deviceId?: string`**(契约 §14.6 首绑写协议)—— 「在我名下的设备里挑这一台跑」,与 `cwd` 同级同信任姿势。**仅根任务携带**(resume 家族不收,车道随树固定);**非 device 车道收到它 = 400 `request.precondition_unmet`**(刻意不静默忽略);首绑是 INSERT-if-absent CAS(并发单赢家,输家异设备 = 409 `device.claim_conflict`);后续根提交缺席 = 沿用 / 同 = 幂等 / 异 = 403 `device.identity_mismatch`(v1 无隐式重绑)。⚠️ 如实披露两条残余:自带 `taskId` 的幂等重放**也过准入链**(executor 短暂掉线的窗里同 `taskId` 重试拿 409 `device.offline` 而不是那张 202);换绑的「无活跃 run」门是 check→act,所以**别让换绑与提交并发**。
|
|
115
|
+
|
|
116
|
+
4. **`Capabilities.deviceExecutor.management?: boolean`** —— 具名可选键(此前落进 `[k: string]: unknown` 只能拿 `unknown`)。**present-iff**:缺席 = 7.88.0 之前的 server,判不出来 ⇒ 只能按 501 试探。与同对象里那三位**不同轴**:那三位是**设备侧**接入面(executor 连不连得上),本位是**壳侧**管理动词在不在。
|
|
117
|
+
|
|
118
|
+
5. **`client.devices` 六动词**(`list` / `sessionBinding` / `rebind` / `issueEnrollToken` / `enroll` / `revoke`)+ 11 个 wire 型(`DeviceSummary` / `DeviceListResult` / `DeviceBinding` / `DeviceSessionBinding` / `DeviceRebindRequest` / `DeviceRebindResult` / `DeviceEnrollToken` / `DeviceEnrollRequest` / `DeviceEnrollResult` / `DeviceRevokeRequest` / `DeviceRevokeResult`)。几处消费端必须知道的形:`issueEnrollToken()` **不收任何入参**(零受理键闭形,签发对象恒 = 调用方自己,v1 不做代签,所以 **explicit operator 也不豁免域门**);`token` 是**明文一现**(库里只有 sha256 摘要,丢了重签);`enroll` 的幂等重放与真注册 **wire 同形**(分得出来就等于给「这个 token 用过没有」开一个探针);`rebind` 的 200 恒带**冻结字面** `workspaceCarryover: "none"`(换绑只改路由、不搬工作区字节,壳必须据此披露「新设备上是全新工作区」);`revoke` 是**终态**,没有反向动词。⚠️ **四个写动词都是 AT-MOST-ONCE**(它们不是 submit-class、也不挂幂等键 ⇒ `transport.ts` 的 `canRetry` 不认 ⇒ SDK 一次都不重试):`rebind` 是前态 CAS,一次「成功了但响应丢了」的自动重试会拿到 409 `device.rebind_rev_conflict`,在壳上与「别人刚把绑定挪走了」**完全同形**,所以正解是回读绑定而不是重发;`enroll` / `revoke` 本身幂等(重试安全,但那是调用方的判断);`issueEnrollToken` 重试会多签一枚 token(无害但烧限速额)。两个读动词是 GET,照常重试。
|
|
119
|
+
|
|
120
|
+
6. **typed `DeviceError`**(`device.*` 前缀族兜底)—— 带具名 `currentRev` / `activeTaskId`(守卫式提取:非有限数 / 非串 ⇒ 字段缺席)。**按 `errorCode` 分支,不按 status**:409 上骑着四个处置完全不同的码。⚠️ **`device.busy`(429)刻意不落本类**:它落 `RateLimitedError`(429 状态臂排在 11 个前缀族之前,而那条排序本身有出处),因为它是 per-device 在途槽满的**背压**码,`RateLimitedError` 多带的 `retryAfterMs` 正是它唯一能指导调用方的量;为了让它也 `instanceof DeviceError` 而改臂序会丢掉退避窗并给规则加一个特例。这一形有一格 characterization 钉着。⚠️ `not_found.device` / `capability.device_lane_required` / `limit.rate_exceeded` **不在**本族(各自走更早的前缀臂 —— device 闭集刻意不为已有语义再铸同义码)。
|
|
121
|
+
|
|
122
|
+
7. **随包 `openapi.yaml`**:六条 `/v1/devices` 路径(`x-status: gated`,与 adoption 同待遇 —— 非 device 部署六动词一律 501 `capability.device_lane_required`)+ 11 个 `Device*` schema + `TaskRequest.deviceId` + `Capabilities.deviceExecutor.management`。第三方按 spec 生成客户端这条路上,device 面**第一次**存在。
|
|
123
|
+
|
|
124
|
+
8. **devDep `@sema-agent/server` 7.87.1 → 7.88.2** —— 这不是顺手更新:`server-keyset-parity` 的**方向④**(零容忍,无豁免名单)会拿 devDep 的 dist 抽 server 提交体的受理键集,`TaskRequest.deviceId` 对 7.87.1 是一个**假 affordance**(调用方写上去被静默丢弃,没有任何 4xx 能让人发现),所以那道门当场红。门给的两条出路只有「server 真收」或「删声明(major)」—— 提货到真收它的那一版是唯一正解。
|
|
125
|
+
|
|
126
|
+
### 未闭环(如实登记,不承诺)
|
|
127
|
+
|
|
128
|
+
- **锚门只在 fixture 在场的机器上跑**(`SEMA_SDK_FENCE_SERVER_DIR`;runner 缺件 exit 3 SKIP)。默认 `npm test` 的机器上看住镜像的是本包自己那 26 格(向量 + 逐格拒绝集 + 闭集字面与顺序),它证「算得对」,不证「与 server 发布字节相等」。
|
|
129
|
+
- **镜像对齐的是 7.88.2 这一版的发布字节**,不代表与别的部署一致:更老的部署读 `capabilities.deviceExecutor.protocolVersion` / `wsPath`,那才是活答案。
|
|
130
|
+
- `DEVICE_OUTCOME_ERROR_CODES` 在 server 侧带 `satisfies readonly (FileErrorCode | ExecutionErrorCode)[]`(拿 core 的型当编译期对账的另一半);本包零运行时依赖、也不 devDep core,所以镜像**没有**那一半,它由锚门格②(逐成员深等)从 server 发布字节那边看住。
|
|
131
|
+
- `device.provider_mismatch` / `device.attached_elsewhere` / `device.busy` 今天**没有 HTTP 发送点**(只经 core 错误文案 `[device.*] …` 上 wire),本版对它们的断言是「族兜底真上 wire 那天也带码落 typed」这一形,**不是**已发生的 wire 读数。
|
|
132
|
+
|
|
56
133
|
## 9.7.1 — 2026-09-18(additive;追平 server **7.87.1** 单点 patch;devDep server 钉 7.87.0 → 7.87.1)
|
|
57
134
|
|
|
58
135
|
**一句话:`capabilities.approvalsStreamLive`(S-455,审批推送面带不带 `live_pending`/`live_resolved` 事件族,两项合取 `checkpointStore ∧ toolApproval`,缺席=老 server 判不出、别读成「这台不推」)补齐,`FleetTaskRow.queuedCount` 幻影键登记随 server 7.87.1 生产侧整删一句版本断点(处置不变,仍留声明到下一个 major),`fence-calibration` 已核账 head 抬到 7.87.1。**
|
package/dist/client.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ import { WorkspaceResource } from "./resources/workspace.js";
|
|
|
21
21
|
import { AttachmentsResource } from "./resources/attachments.js";
|
|
22
22
|
import { RulesResource } from "./resources/rules.js";
|
|
23
23
|
import { AdoptionResource } from "./resources/adoption.js";
|
|
24
|
+
import { DevicesResource } from "./resources/devices.js";
|
|
24
25
|
import type { Principal, Capabilities, ScenarioDetail } from "./types.js";
|
|
25
26
|
/** Auth posture for the worker door.
|
|
26
27
|
* - `string` — the worker `SERVICE_AUTH_TOKEN` (the normal, fail-closed path).
|
|
@@ -144,6 +145,13 @@ export declare class AgentClient {
|
|
|
144
145
|
/** design/183 —— **身份收编**(form b 纯身份重绑)。operator-only 的一次性部署级动作,不是业务面;
|
|
145
146
|
* 无 SQL 后端 ⇒ 501 `capability.adoption_store_required`。 */
|
|
146
147
|
readonly adoption: AdoptionResource;
|
|
148
|
+
/** 契约 §14(server ≥7.88.0)—— **device 车道管理面**六动词(列 / 读绑定 / 换绑 / 签发 / 注册 / 吊销)。
|
|
149
|
+
* 先探 `capabilities().deviceExecutor`:`false` ⇒ 六动词一律 501 `capability.device_lane_required`,别渲入口;
|
|
150
|
+
* 对象且 `management === true` ⇒ 在场(`rebind` 另需 run store:无 SQL 后端时它单独回 501
|
|
151
|
+
* `capability.run_store_required`,与 `management` 位无关);对象但该位**缺席** ⇒ 对面是 7.88.0 之前的 server,只能按 501 试探
|
|
152
|
+
* (**别把缺席读成 false**)。首绑不在这里 —— 那是提交体的顶层键 `TaskRequest.deviceId`(§14.6)。
|
|
153
|
+
* 握手协议面(executor 侧)在子路径 `@sema-agent/sdk/device`,与本资源不同层。 */
|
|
154
|
+
readonly devices: DevicesResource;
|
|
147
155
|
private readonly config;
|
|
148
156
|
private readonly transport;
|
|
149
157
|
/** GET /v1/capabilities — one call replaces probe-by-501 (LIVE, service 7aa0f3d).
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -31,6 +31,7 @@ import { WorkspaceResource } from "./resources/workspace.js";
|
|
|
31
31
|
import { AttachmentsResource } from "./resources/attachments.js";
|
|
32
32
|
import { RulesResource } from "./resources/rules.js";
|
|
33
33
|
import { AdoptionResource } from "./resources/adoption.js";
|
|
34
|
+
import { DevicesResource } from "./resources/devices.js";
|
|
34
35
|
/** true iff the URL's host is a loopback address (localhost / 127.0.0.0/8 / ::1). */
|
|
35
36
|
function isLoopbackBaseUrl(baseUrl) {
|
|
36
37
|
let hostname;
|
|
@@ -108,6 +109,13 @@ export class AgentClient {
|
|
|
108
109
|
/** design/183 —— **身份收编**(form b 纯身份重绑)。operator-only 的一次性部署级动作,不是业务面;
|
|
109
110
|
* 无 SQL 后端 ⇒ 501 `capability.adoption_store_required`。 */
|
|
110
111
|
adoption;
|
|
112
|
+
/** 契约 §14(server ≥7.88.0)—— **device 车道管理面**六动词(列 / 读绑定 / 换绑 / 签发 / 注册 / 吊销)。
|
|
113
|
+
* 先探 `capabilities().deviceExecutor`:`false` ⇒ 六动词一律 501 `capability.device_lane_required`,别渲入口;
|
|
114
|
+
* 对象且 `management === true` ⇒ 在场(`rebind` 另需 run store:无 SQL 后端时它单独回 501
|
|
115
|
+
* `capability.run_store_required`,与 `management` 位无关);对象但该位**缺席** ⇒ 对面是 7.88.0 之前的 server,只能按 501 试探
|
|
116
|
+
* (**别把缺席读成 false**)。首绑不在这里 —— 那是提交体的顶层键 `TaskRequest.deviceId`(§14.6)。
|
|
117
|
+
* 握手协议面(executor 侧)在子路径 `@sema-agent/sdk/device`,与本资源不同层。 */
|
|
118
|
+
devices;
|
|
111
119
|
config;
|
|
112
120
|
transport;
|
|
113
121
|
/** GET /v1/capabilities — one call replaces probe-by-501 (LIVE, service 7aa0f3d).
|
|
@@ -235,6 +243,7 @@ export class AgentClient {
|
|
|
235
243
|
this.attachments = new AttachmentsResource(t);
|
|
236
244
|
this.rules = new RulesResource(t);
|
|
237
245
|
this.adoption = new AdoptionResource(t);
|
|
246
|
+
this.devices = new DevicesResource(t);
|
|
238
247
|
}
|
|
239
248
|
}
|
|
240
249
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACzH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@sema-agent/sdk/device` —— device lane 的 **executor 侧协议面镜像**(闭集词表 + 两向帧型 +
|
|
3
|
+
* 握手签名的字节编码)。
|
|
4
|
+
*
|
|
5
|
+
* ══ 真源不在这里 ══════════════════════════════════════════════════════════════════════════════
|
|
6
|
+
* 🔴 **本文件的真源 = `@sema-agent/server` 的包子路径 `@sema-agent/server/device-protocol`**
|
|
7
|
+
* (server ≥7.88.0;server 树里的 `src/device-protocol.ts` → `src/device-ws-protocol.ts`)。
|
|
8
|
+
* 本文件是它的**镜像**,一个字都不是本仓的设计:
|
|
9
|
+
* · 要加一个名字 / 改一个值 / 改一条判据 ⇒ **先去 server 仓改**,再把这里跟上;
|
|
10
|
+
* · **别在这里做设计**。镜像里长出来的第二个判据 = 协议分叉的起点,而 wire 的两端分属两仓,
|
|
11
|
+
* 分叉的症状是「所有合法 executor 恒 `auth_failed`」而不是一次编译红。
|
|
12
|
+
*
|
|
13
|
+
* ══ 为什么要镜像(而不是直接 import server 包)══════════════════════════════════════════════════
|
|
14
|
+
* 分层公理:usage plane 的消费方(cli 的 `sema device serve`、别家 executor)依赖 **SDK**,不依赖
|
|
15
|
+
* server 包 —— 一个 executor 装一整只 HTTP 服务端(含 SQL 驱动、undici、ws)只为拿两个纯函数,是把
|
|
16
|
+
* 部署面倒灌进客户端。同时 SDK 有**零运行时依赖**纪律,所以这里不能 `import "@sema-agent/server"`。
|
|
17
|
+
* 剩下唯一诚实的形就是:**镜像 + 同源锚门**。
|
|
18
|
+
*
|
|
19
|
+
* ══ 谁看住它 ═══════════════════════════════════════════════════════════════════════════════════
|
|
20
|
+
* `packages/sdk/test/live/device-protocol-mirror.test.ts` —— 对**钉版真 server 的发布字节**
|
|
21
|
+
* (`SEMA_SDK_FENCE_SERVER_DIR` 指向的 `dist/device-protocol.js` / `.d.ts`)跑五格(格③ 分「固定向量」
|
|
22
|
+
* 与「向量之外逐条对拍」两支,所以文件里是 6 个 `it`):
|
|
23
|
+
* ①运行时导出名集合相等;②每个闭集常量 / `DEVICE_WS_LIMITS` / 标量常量深等(数组**顺序**也相等);
|
|
24
|
+
* ③固定向量的 102 字节 hex 两边各算一次后相等;④`decodeUlid16` 对协议文档 §1.3 拒绝集逐格同答
|
|
25
|
+
* (含 `null` vs 16 字节的判别);⑤`.d.ts` 的导出名集合相等(型面漂了先在这里红)。
|
|
26
|
+
* 锚门红了的**分流**:
|
|
27
|
+
* · **server 加了名字** ⇒ 这里补镜像(additive,随下一个 minor 出门);
|
|
28
|
+
* · **server 删了名字 / 改了值** ⇒ 那是 server 的 BREAKING,本包**下一个 major** 才跟(镜像不许
|
|
29
|
+
* 先删:删了之后消费方的编译红会指向 SDK,而真正的决定发生在 server)。
|
|
30
|
+
*
|
|
31
|
+
* ══ 运行时面 ═══════════════════════════════════════════════════════════════════════════════════
|
|
32
|
+
* 🔴 本子路径是 **Node-only**(`buildHelloSignaturePayload` 回 `Buffer`,与 server 侧逐字节同形,
|
|
33
|
+
* 可直接喂 `node:crypto` 的 `sign()`)。主入口 `@sema-agent/sdk` 仍是同构的 —— 别把 `Buffer` 带进去。
|
|
34
|
+
* 零 import:`Buffer` 是 Node 全局,本文件不引任何包(零运行时依赖纪律)。
|
|
35
|
+
*
|
|
36
|
+
* ══ 三行上手(executor 实现者视角)═════════════════════════════════════════════════════════════
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { buildHelloSignaturePayload, DEVICE_WS_PATH } from "@sema-agent/sdk/device";
|
|
39
|
+
* import { sign } from "node:crypto";
|
|
40
|
+
* const signatureB64 = sign(null, buildHelloSignaturePayload({ nonce, deviceId, epoch, protocolVersion: 1 }), privateKey).toString("base64");
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* 协议的**散文**真源 = server 仓 `docs/DEVICE-EXECUTOR-PROTOCOL.md`(§1.3 = 签名字节 + 固定向量 +
|
|
44
|
+
* epoch 逐格拒绝集);管理面(`/v1/devices/*`)在本包的 `client.devices`,不在这一层。
|
|
45
|
+
*/
|
|
46
|
+
/** 唯一的 upgrade 路径(协议 §5.1:`GET /v1/device/ws`)。
|
|
47
|
+
* 🔴 刻意**不**硬编码在 executor 里:它也从 `capabilities.deviceExecutor.wsPath` 上 wire,那一位才是
|
|
48
|
+
* 「这台 server 的路径」的活答案;本常量是本镜像所锚的那一版的值。 */
|
|
49
|
+
export declare const DEVICE_WS_PATH = "/v1/device/ws";
|
|
50
|
+
/** server 铸/认的协议版本。加帧/加字段 = additive 不升版;改语义 = 升版(§5.6)。 */
|
|
51
|
+
export declare const DEVICE_PROTOCOL_VERSION = 1;
|
|
52
|
+
/** 低于此版本 ⇒ `helloReject: protocol_version_unsupported`(响亮拒,不静默降级)。 */
|
|
53
|
+
export declare const DEVICE_MIN_PROTOCOL_VERSION = 1;
|
|
54
|
+
/** 握手签名的 domain tag —— 换域即换 tag,防止别处的 Ed25519 签名被拿来当握手用。 */
|
|
55
|
+
export declare const DEVICE_HELLO_DOMAIN_TAG = "sema.device.hello.v1";
|
|
56
|
+
/**
|
|
57
|
+
* 传输面硬帽。
|
|
58
|
+
*
|
|
59
|
+
* 🔴 `maxPreAuthFrameBytes` 与 `handshakeDeadlineMs` 是**未鉴权洪泛**的边界(§5.1 pre-auth 资源边界):
|
|
60
|
+
* server 侧它们早于任何 SQL 查询生效;executor 侧的用处是**自己别铸超帽的帧**(超帽 = 协议错误断连)。
|
|
61
|
+
*/
|
|
62
|
+
export declare const DEVICE_WS_LIMITS: {
|
|
63
|
+
/** 单帧上限(§5.1:文本帧 JSON,超限 = 协议错误)。 */
|
|
64
|
+
readonly maxFrameBytes: number;
|
|
65
|
+
/** 鉴权**之前**允许的帧尺寸(hello 首帧)。 */
|
|
66
|
+
readonly maxPreAuthFrameBytes: 4096;
|
|
67
|
+
/** upgrade 到 helloAck/helloReject 的墙钟上限。 */
|
|
68
|
+
readonly handshakeDeadlineMs: 5000;
|
|
69
|
+
/** `payload` 下行分片的默认片长(单帧帽之下留出 base64 膨胀与帧头余量)。 */
|
|
70
|
+
readonly defaultPayloadPartBytes: number;
|
|
71
|
+
};
|
|
72
|
+
/** 设备 → 服务端的帧型全集。 */
|
|
73
|
+
export declare const DEVICE_FRAME_TYPES: readonly ["hello", "generationAck", "heartbeat", "result", "chunk", "goodbye"];
|
|
74
|
+
export type DeviceFrameType = (typeof DEVICE_FRAME_TYPES)[number];
|
|
75
|
+
/** 服务端 → 设备的帧型全集。 */
|
|
76
|
+
export declare const DEVICE_SERVER_FRAME_TYPES: readonly ["challenge", "helloAck", "helloReject", "instruction", "payload", "cancel", "resultAck", "chunkAck", "bye", "ping"];
|
|
77
|
+
export type DeviceServerFrameType = (typeof DEVICE_SERVER_FRAME_TYPES)[number];
|
|
78
|
+
/** 握手拒因(§5.1/§5.2)。`auth_failed` 刻意同时承载「不存在的 deviceId」与「验签失败」——反枚举,
|
|
79
|
+
* server **不会**告诉你坏的是哪一半;逐码处置见协议文档 §1.4。 */
|
|
80
|
+
export declare const DEVICE_HELLO_REJECT_CODES: readonly ["auth_failed", "revoked", "protocol_version_unsupported", "draining", "already_connected"];
|
|
81
|
+
export type DeviceHelloRejectCode = (typeof DEVICE_HELLO_REJECT_CODES)[number];
|
|
82
|
+
/** 服务端主动断连的理由(§5.2)。 */
|
|
83
|
+
export declare const DEVICE_BYE_REASONS: readonly ["revoked", "draining", "superseded"];
|
|
84
|
+
export type DeviceByeReason = (typeof DEVICE_BYE_REASONS)[number];
|
|
85
|
+
/** 设备优雅下线的理由(§5.2)。 */
|
|
86
|
+
export declare const DEVICE_GOODBYE_REASONS: readonly ["shutdown", "sleep", "user_stop"];
|
|
87
|
+
export type DeviceGoodbyeReason = (typeof DEVICE_GOODBYE_REASONS)[number];
|
|
88
|
+
/** 上行流片的种类。`exit` = exec 流的**唯一**终止片,直接承载 exitCode。 */
|
|
89
|
+
export declare const DEVICE_CHUNK_KINDS: readonly ["stdout", "stderr", "data", "exit"];
|
|
90
|
+
export type DeviceChunkKind = (typeof DEVICE_CHUNK_KINDS)[number];
|
|
91
|
+
/** cancel 的终局回执状态(§5.3)。 */
|
|
92
|
+
export declare const DEVICE_CANCEL_STATES: readonly ["not_started", "killed"];
|
|
93
|
+
export type DeviceCancelState = (typeof DEVICE_CANCEL_STATES)[number];
|
|
94
|
+
/**
|
|
95
|
+
* 指令 kind ↔ core 的 FileSystem+Shell 面 1:1(§5.1;双端穷举 switch)。
|
|
96
|
+
*
|
|
97
|
+
* 🔴 `hello.supports` 报的是**你实现了哪些**(帧上是 `string[]`,不是本联合 —— 协议是 additive 的,
|
|
98
|
+
* 一个更新的 executor 会报老 server 还不认识的 kind);汇聚端与自己的闭集取交集,不认识的 kind
|
|
99
|
+
* **恒不下发**。`writeFileGuarded` 是声明式的:没报 ⇒ 该面在云侧恒 undefined,**不被仿真**。
|
|
100
|
+
*/
|
|
101
|
+
export declare const DEVICE_INSTRUCTION_KINDS: readonly ["exec", "execStream", "readTextFile", "readTextLines", "readBinaryFile", "writeFile", "writeFileExclusive", "writeFileGuarded", "appendFile", "fileInfo", "listDir", "canonicalPath", "exists", "readLink", "createDir", "remove", "createTempDir", "createTempFile", "statBatch"];
|
|
102
|
+
export type DeviceInstructionKind = (typeof DEVICE_INSTRUCTION_KINDS)[number];
|
|
103
|
+
/**
|
|
104
|
+
* 结果帧的错误码闭集 = core 的 `FileErrorCode ∪ ExecutionErrorCode`(§5.1「error code 全闭集」:
|
|
105
|
+
* 未知值在 server 侧映射为协议错误而非透传 string)。
|
|
106
|
+
*
|
|
107
|
+
* ⚠️ 镜像与 server 的**一处形差,刻意如此**:server 侧这张表带
|
|
108
|
+
* `satisfies readonly (FileErrorCode | ExecutionErrorCode)[]`,拿 core 的型当编译期对账的另一半。
|
|
109
|
+
* 本包零运行时依赖、也不 devDep core,所以这里**没有**那一半 —— 它由锚门格②(逐成员深等)从
|
|
110
|
+
* server 发布字节那边看住。别在这里补一个「差不多」的本地联合:那会变成第二个判据。
|
|
111
|
+
*/
|
|
112
|
+
export declare const DEVICE_OUTCOME_ERROR_CODES: readonly ["aborted", "already_exists", "auth_failed", "callback_error", "invalid", "is_directory", "not_directory", "not_found", "not_supported", "outcome_unknown", "permission_denied", "precondition_failed", "shell_unavailable", "spawn_error", "suspended", "target_unavailable", "timeout", "transport_lost", "unknown"];
|
|
113
|
+
export type DeviceOutcomeErrorCode = (typeof DEVICE_OUTCOME_ERROR_CODES)[number];
|
|
114
|
+
/** 设备文件面的 wire 投影(云侧 adapter 负责映射到 core `FileInfo`;协议层只冻结形)。 */
|
|
115
|
+
export interface WireFileInfo {
|
|
116
|
+
path: string;
|
|
117
|
+
kind: "file" | "dir" | "symlink" | "other";
|
|
118
|
+
size: number;
|
|
119
|
+
mtimeMs: number;
|
|
120
|
+
mode?: number;
|
|
121
|
+
}
|
|
122
|
+
/** 守卫写的前置条件在 wire 上的投影(core `WriteExpectation` 的字段子集,逐字同名)。
|
|
123
|
+
* 🔴 wire 型刻意**不是** core 的型:core 加一个字段不该无声地变成一条设备必须懂的新前置条件。 */
|
|
124
|
+
export interface WireWriteExpectation {
|
|
125
|
+
canonicalPath: string;
|
|
126
|
+
fileId?: string;
|
|
127
|
+
exclusive?: boolean;
|
|
128
|
+
noFollow?: boolean;
|
|
129
|
+
}
|
|
130
|
+
/** 指令结局(§5.1 `InstructionOutcome`)。`ok:true` 的 `kind` 是闭集 —— server 认不出的成功 kind 是
|
|
131
|
+
* **协议错误**,不会被静默读成 `void`。 */
|
|
132
|
+
export type DeviceInstructionOutcome = {
|
|
133
|
+
ok: true;
|
|
134
|
+
kind: "exec";
|
|
135
|
+
exitCode: number;
|
|
136
|
+
truncated?: {
|
|
137
|
+
stdout?: boolean;
|
|
138
|
+
stderr?: boolean;
|
|
139
|
+
};
|
|
140
|
+
} | {
|
|
141
|
+
ok: true;
|
|
142
|
+
kind: "read";
|
|
143
|
+
} | {
|
|
144
|
+
ok: true;
|
|
145
|
+
kind: "stat";
|
|
146
|
+
info?: WireFileInfo;
|
|
147
|
+
entries?: WireFileInfo[];
|
|
148
|
+
existsValue?: boolean;
|
|
149
|
+
canonicalPath?: string;
|
|
150
|
+
linkTarget?: string | null;
|
|
151
|
+
}
|
|
152
|
+
/** 写面的**落盘对象收据**。`created` 缺席 = 设备没说,**不猜**(消费方据此如实降级)。 */
|
|
153
|
+
| {
|
|
154
|
+
ok: true;
|
|
155
|
+
kind: "write";
|
|
156
|
+
canonicalPath: string;
|
|
157
|
+
inode?: string;
|
|
158
|
+
created?: boolean;
|
|
159
|
+
} | {
|
|
160
|
+
ok: true;
|
|
161
|
+
kind: "void";
|
|
162
|
+
} | {
|
|
163
|
+
ok: true;
|
|
164
|
+
kind: "cancelled";
|
|
165
|
+
state: DeviceCancelState;
|
|
166
|
+
} | {
|
|
167
|
+
ok: false;
|
|
168
|
+
errorCode: DeviceOutcomeErrorCode;
|
|
169
|
+
message: string;
|
|
170
|
+
};
|
|
171
|
+
/** per-kind 精确入参(§5.1:`InstructionArgs` 按 kind 判别,非 any)。 */
|
|
172
|
+
export interface DeviceInstructionArgsByKind {
|
|
173
|
+
exec: {
|
|
174
|
+
command: string;
|
|
175
|
+
};
|
|
176
|
+
execStream: {
|
|
177
|
+
command: string;
|
|
178
|
+
};
|
|
179
|
+
readTextFile: {
|
|
180
|
+
path: string;
|
|
181
|
+
};
|
|
182
|
+
readTextLines: {
|
|
183
|
+
path: string;
|
|
184
|
+
offset?: number;
|
|
185
|
+
limit?: number;
|
|
186
|
+
};
|
|
187
|
+
readBinaryFile: {
|
|
188
|
+
path: string;
|
|
189
|
+
};
|
|
190
|
+
/** 内容**不在** args 里:走 `payload` 下行子序,args 只带长度与摘要供设备校验。 */
|
|
191
|
+
writeFile: {
|
|
192
|
+
path: string;
|
|
193
|
+
contentLen: number;
|
|
194
|
+
sha256: string;
|
|
195
|
+
};
|
|
196
|
+
writeFileExclusive: {
|
|
197
|
+
path: string;
|
|
198
|
+
contentLen: number;
|
|
199
|
+
sha256: string;
|
|
200
|
+
};
|
|
201
|
+
/** `expect` = core `WriteExpectation` 的 wire 投影:设备在**同一原子步**里验证它并回落盘收据。 */
|
|
202
|
+
writeFileGuarded: {
|
|
203
|
+
path: string;
|
|
204
|
+
contentLen: number;
|
|
205
|
+
sha256: string;
|
|
206
|
+
expect: WireWriteExpectation;
|
|
207
|
+
};
|
|
208
|
+
appendFile: {
|
|
209
|
+
path: string;
|
|
210
|
+
contentLen: number;
|
|
211
|
+
sha256: string;
|
|
212
|
+
};
|
|
213
|
+
fileInfo: {
|
|
214
|
+
path: string;
|
|
215
|
+
};
|
|
216
|
+
listDir: {
|
|
217
|
+
path: string;
|
|
218
|
+
};
|
|
219
|
+
canonicalPath: {
|
|
220
|
+
path: string;
|
|
221
|
+
};
|
|
222
|
+
exists: {
|
|
223
|
+
path: string;
|
|
224
|
+
};
|
|
225
|
+
readLink: {
|
|
226
|
+
path: string;
|
|
227
|
+
};
|
|
228
|
+
createDir: {
|
|
229
|
+
path: string;
|
|
230
|
+
recursive?: boolean;
|
|
231
|
+
};
|
|
232
|
+
remove: {
|
|
233
|
+
path: string;
|
|
234
|
+
recursive?: boolean;
|
|
235
|
+
};
|
|
236
|
+
createTempDir: {
|
|
237
|
+
prefix?: string;
|
|
238
|
+
};
|
|
239
|
+
createTempFile: {
|
|
240
|
+
prefix?: string;
|
|
241
|
+
suffix?: string;
|
|
242
|
+
};
|
|
243
|
+
statBatch: {
|
|
244
|
+
paths: string[];
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
export type DeviceChallengeFrame = {
|
|
248
|
+
t: "challenge";
|
|
249
|
+
nonce: string;
|
|
250
|
+
protocolVersion: number;
|
|
251
|
+
};
|
|
252
|
+
export type DeviceHelloAckFrame = {
|
|
253
|
+
t: "helloAck";
|
|
254
|
+
ok: true;
|
|
255
|
+
heartbeatIntervalMs: number;
|
|
256
|
+
maxInflight: number;
|
|
257
|
+
/** ⚠️ canonical 十进制**字符串**(SQL BIGINT 超 2^53,wire 不声明装不下 SQL 类型的字段)。 */
|
|
258
|
+
gen: string;
|
|
259
|
+
pendingInstructions: string[];
|
|
260
|
+
chunkWatermarks: Record<string, number>;
|
|
261
|
+
};
|
|
262
|
+
export type DeviceHelloRejectFrame = {
|
|
263
|
+
t: "helloReject";
|
|
264
|
+
code: DeviceHelloRejectCode;
|
|
265
|
+
minProtocolVersion?: number;
|
|
266
|
+
};
|
|
267
|
+
export type DeviceInstructionFrame = {
|
|
268
|
+
[K in DeviceInstructionKind]: {
|
|
269
|
+
t: "instruction";
|
|
270
|
+
gen: string;
|
|
271
|
+
instructionId: string;
|
|
272
|
+
rootSessionId: string;
|
|
273
|
+
issuedSeq: number;
|
|
274
|
+
kind: K;
|
|
275
|
+
args: DeviceInstructionArgsByKind[K];
|
|
276
|
+
cwd?: string;
|
|
277
|
+
shellEnv?: Record<string, string>;
|
|
278
|
+
timeoutMs: number;
|
|
279
|
+
};
|
|
280
|
+
}[DeviceInstructionKind];
|
|
281
|
+
export type DevicePayloadFrame = {
|
|
282
|
+
t: "payload";
|
|
283
|
+
gen: string;
|
|
284
|
+
instructionId: string;
|
|
285
|
+
part: "begin" | "chunk" | "commit";
|
|
286
|
+
offset?: number;
|
|
287
|
+
dataB64?: string;
|
|
288
|
+
totalLen?: number;
|
|
289
|
+
sha256?: string;
|
|
290
|
+
};
|
|
291
|
+
export type DeviceServerFrame = DeviceChallengeFrame | DeviceHelloAckFrame | DeviceHelloRejectFrame | DeviceInstructionFrame | DevicePayloadFrame | {
|
|
292
|
+
t: "cancel";
|
|
293
|
+
gen: string;
|
|
294
|
+
instructionId: string;
|
|
295
|
+
} | {
|
|
296
|
+
t: "resultAck";
|
|
297
|
+
gen: string;
|
|
298
|
+
instructionId: string;
|
|
299
|
+
} | {
|
|
300
|
+
t: "chunkAck";
|
|
301
|
+
gen: string;
|
|
302
|
+
instructionId: string;
|
|
303
|
+
upToStreamSeq: number;
|
|
304
|
+
} | {
|
|
305
|
+
t: "bye";
|
|
306
|
+
gen: string;
|
|
307
|
+
reason: DeviceByeReason;
|
|
308
|
+
} | {
|
|
309
|
+
t: "ping";
|
|
310
|
+
};
|
|
311
|
+
export type DeviceHelloFrame = {
|
|
312
|
+
t: "hello";
|
|
313
|
+
protocolVersion: number;
|
|
314
|
+
deviceId: string;
|
|
315
|
+
epoch: string;
|
|
316
|
+
signatureB64: string;
|
|
317
|
+
platform: {
|
|
318
|
+
os: string;
|
|
319
|
+
arch: string;
|
|
320
|
+
executorVersion: string;
|
|
321
|
+
};
|
|
322
|
+
workspaceRoot: string;
|
|
323
|
+
pathFlavor: string;
|
|
324
|
+
/** 🔴 刻意是 `string[]` 而不是 `DeviceInstructionKind[]`:协议 additive,一个**更新的** executor 会
|
|
325
|
+
* 声明本 server 还不认识的 kind。收窄在这里拒 = 老 server 认不下新 executor。 */
|
|
326
|
+
supports: string[];
|
|
327
|
+
resuming?: {
|
|
328
|
+
unackedResults: number;
|
|
329
|
+
};
|
|
330
|
+
};
|
|
331
|
+
export type DeviceFrame = DeviceHelloFrame | {
|
|
332
|
+
t: "generationAck";
|
|
333
|
+
gen: string;
|
|
334
|
+
} | {
|
|
335
|
+
t: "heartbeat";
|
|
336
|
+
gen: string;
|
|
337
|
+
seq: number;
|
|
338
|
+
inflight: string[];
|
|
339
|
+
} | {
|
|
340
|
+
t: "result";
|
|
341
|
+
gen: string;
|
|
342
|
+
instructionId: string;
|
|
343
|
+
deviceSeq: number;
|
|
344
|
+
outcome: DeviceInstructionOutcome;
|
|
345
|
+
} | {
|
|
346
|
+
t: "chunk";
|
|
347
|
+
gen: string;
|
|
348
|
+
instructionId: string;
|
|
349
|
+
streamSeq: number;
|
|
350
|
+
kind: DeviceChunkKind;
|
|
351
|
+
dataB64?: string;
|
|
352
|
+
exitCode?: number;
|
|
353
|
+
} | {
|
|
354
|
+
t: "goodbye";
|
|
355
|
+
gen: string;
|
|
356
|
+
reason: DeviceGoodbyeReason;
|
|
357
|
+
graceMs?: number;
|
|
358
|
+
};
|
|
359
|
+
export type DeviceResultFrame = Extract<DeviceFrame, {
|
|
360
|
+
t: "result";
|
|
361
|
+
}>;
|
|
362
|
+
export type DeviceChunkFrame = Extract<DeviceFrame, {
|
|
363
|
+
t: "chunk";
|
|
364
|
+
}>;
|
|
365
|
+
export type DeviceGoodbyeFrame = Extract<DeviceFrame, {
|
|
366
|
+
t: "goodbye";
|
|
367
|
+
}>;
|
|
368
|
+
export type DeviceHeartbeatFrame = Extract<DeviceFrame, {
|
|
369
|
+
t: "heartbeat";
|
|
370
|
+
}>;
|
|
371
|
+
/**
|
|
372
|
+
* 26 位 Crockford base32(ULID)→ **16 字节**。非法字符 / 长度 / 首字符溢出 ⇒ `null`(**不猜**:
|
|
373
|
+
* 一个被静默补零的 epoch 会让两个不同的 executor 进程签出同一份字节)。
|
|
374
|
+
*
|
|
375
|
+
* 逐格判据(协议文档 §1.3 的拒绝集,锚门格④对着 server 发布字节逐格同答):
|
|
376
|
+
* · 合法(如 `01J8ZQ4T9X7M3K5N6P8R0S2V4W`)⇒ 16 字节;
|
|
377
|
+
* · **小写** ⇒ `null`(Crockford 纸面大小写不敏感,本协议**刻意敏感** —— 同一个 ULID 的两种拼法会让
|
|
378
|
+
* 一条连接被世代围栏当成两条,那比一次失败的握手坏得多);
|
|
379
|
+
* · 首字符 `8`/`9`/`A`…`Z`(128 位溢出形)⇒ `null`;25 / 27 字符 ⇒ `null`;
|
|
380
|
+
* · 含被排除的字母 `I`/`L`/`O`/`U` ⇒ `null`;
|
|
381
|
+
* · 🔴 判别位:**末位** `Z` 通过(它就是值 31),**首位** `Z` 被拒(溢出)。「拒掉任何 Z」的解码器是错的。
|
|
382
|
+
*/
|
|
383
|
+
export declare function decodeUlid16(s: string): Buffer | null;
|
|
384
|
+
/**
|
|
385
|
+
* 握手签名的**唯一**字节编码(协议 §1.3 / §5.1 末,跨仓冻结):
|
|
386
|
+
* `"sema.device.hello.v1" ‖ u32be(len(nonce))‖nonce ‖ u32be(len(deviceId))‖deviceId ‖ epoch16 ‖ u32be(version)`。
|
|
387
|
+
*
|
|
388
|
+
* 长度前缀是 **字节** 长度(不是字符数);domain tag **没有**长度前缀;`epoch16` 是 ULID 的 128 位
|
|
389
|
+
* (最高字节在前),**不是**时间戳、也不是 u64。
|
|
390
|
+
*
|
|
391
|
+
* 🔴 任一处分歧的后果不是「偶尔验不过」,而是**所有**合法 executor 恒 `auth_failed`,且 server 不会
|
|
392
|
+
* 告诉你坏的是哪一半。所以有固定向量(协议文档 §1.3;本包的锚门格③两边各算一次后比 hex):
|
|
393
|
+
* `nonce="bm9uY2UtdGVzdC12ZWN0b3I="`(**按收到的字符串取字节,不 base64 解码**)、
|
|
394
|
+
* `deviceId="dev_01J8ZQ4T9X0000000000000000"`、`epoch="01J8ZQ4T9X7M3K5N6P8R0S2V4W"`、
|
|
395
|
+
* `protocolVersion=1` ⇒ 102 字节。
|
|
396
|
+
*
|
|
397
|
+
* 坏 `epoch` / 越界 `protocolVersion` 是**抛**,不是回 null —— 一个签不出来的握手必须在铸帧那一刻就
|
|
398
|
+
* 停,而不是发一个注定被 `auth_failed` 的帧上去(低层判 null 要用 {@link decodeUlid16}:两个入口的
|
|
399
|
+
* 拒绝形**刻意不同**,协议文档 §1.3 有逐格表)。
|
|
400
|
+
*/
|
|
401
|
+
export declare function buildHelloSignaturePayload(input: {
|
|
402
|
+
nonce: string;
|
|
403
|
+
deviceId: string;
|
|
404
|
+
epoch: string;
|
|
405
|
+
protocolVersion: number;
|
|
406
|
+
}): Buffer;
|
|
407
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/device/index.ts"],"names":[],"mappings":"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"}
|