@sema-agent/sdk 9.7.1 → 9.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -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/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,10 @@ GateNotToolApprovalError,
|
|
|
24
24
|
// design/172 流内审批回决四则(#151 车4;已随 server 7.3.0 / SDK 6.7.0 发布):200 / 409 首决回显 /
|
|
25
25
|
// 409 幂等键撞 ask / 410 窗已关(带 gate 坐标三件)/ 425 转投递面中(取终局路由信息,非重试受理)。
|
|
26
26
|
AskDecidedError, AskIdempotencyConflictError, AskGoneError, AskParkingError,
|
|
27
|
+
// 契约 §14(server ≥7.88.0):`device.*` 族兜底 —— 8 个有发送点的码 + 3 个今天只经 core 文案上 wire 的
|
|
28
|
+
// 成员,一把 catch 后按 `errorCode` 分支(status 分不出来:409 上骑着 4 个不同处置的码);两个平铺材料键
|
|
29
|
+
// `currentRev` / `activeTaskId` 已提到具名属性上。
|
|
30
|
+
DeviceError,
|
|
27
31
|
/** `DENIED` 态的唯一合法归因值(消费端做「路由失败 vs 人拒」判别用,别手抄字符串)。 */
|
|
28
32
|
DENY_REASON_ROUTING_FAILURE } from "./errors.js";
|
|
29
33
|
/** 2c session-sync — the NDJSON entry-stream truncation error + the PURE §7 relation classifier (the local peer
|
|
@@ -65,6 +69,12 @@ export { RulesResource } from "./resources/rules.js";
|
|
|
65
69
|
/** design/183 —— 身份收编面(`client.adoption`)的类型面。回执只有一种包络(首次与幂等重跑同形);
|
|
66
70
|
* `status` 闭集不含 `rejected`(拒一律 typed 409);史实 `immutableReport` 与现势 `current` 各住各的字段。 */
|
|
67
71
|
export { AdoptionResource } from "./resources/adoption.js";
|
|
72
|
+
/** 契约 §14(server ≥7.88.0 / O4 / S-4 / S-470)—— **device 车道管理面**(`client.devices`)。
|
|
73
|
+
* 六动词的形与它们的探测位、反枚举 404、typed `device.*` 族全在那只 resource 的顶注。
|
|
74
|
+
* 🔴 首绑不在这里:它是提交体的顶层键 `TaskRequest.deviceId`(§14.6)。
|
|
75
|
+
* 🔴 **executor 侧的协议面在子路径 `@sema-agent/sdk/device`**(闭集词表 + 两向帧型 + 握手签名字节),
|
|
76
|
+
* 刻意不进主入口:那一层是 Node-only(回 `Buffer`),而主入口是同构的。 */
|
|
77
|
+
export { DevicesResource } from "./resources/devices.js";
|
|
68
78
|
/** 未知形兜底的窄化谓词 —— 两族帧的类型只描述 v1;先读成 {@link ApprovalFrameEnvelope},窄不下来就
|
|
69
79
|
* 呈通用卡(design/172 §3.1「未知形永不 auto-deny」)。运行期值,消费端要真调它。 */
|
|
70
80
|
export { isApprovalRequestFrameV1, isApprovalRevokeFrameV1 } from "./resources/tool-approvals.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,OAAO,EAAE,WAAW,EAA+C,MAAM,aAAa,CAAC;AACvF;qEACqE;AACrE,OAAO,EAAE,aAAa,EAA4B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* devices — **device 车道的管理面**(server ≥7.88.0;契约 `docs/ASSISTANT-WIRE-CONTRACT.md` §14。
|
|
3
|
+
* 形逐字取自 server `src/http/routes/devices.ts` 的 `sendJson` / `sendError` 铸造点)。
|
|
4
|
+
*
|
|
5
|
+
* `list()` → GET /v1/devices §14.1
|
|
6
|
+
* `sessionBinding(rootSessionId)` → GET /v1/devices/sessions/{id} §14.2
|
|
7
|
+
* `rebind(rootSessionId, {...})` → POST /v1/devices/sessions/{id}/rebind §14.3
|
|
8
|
+
* `issueEnrollToken()` → POST /v1/devices/enroll-tokens §14.4
|
|
9
|
+
* `enroll({...})` → POST /v1/devices/enroll §14.4
|
|
10
|
+
* `revoke(deviceId, {...})` → POST /v1/devices/{deviceId}/revoke §14.5
|
|
11
|
+
*
|
|
12
|
+
* 首绑**不在这里** —— 它是提交体的顶层键 {@link import("../types.js").TaskRequest.deviceId}(§14.6):
|
|
13
|
+
* 「在我名下的设备里挑一台跑」是**提交**的属性,不是一次管理动作。v1 **无隐式重绑**,换设备是 {@link
|
|
14
|
+
* DevicesResource.rebind} 那一次显式动作(它有前态 CAS + 无活跃 run 门 + 审计行)。
|
|
15
|
+
*
|
|
16
|
+
* ── 探测:**位缺席 ≠ 位为假** ─────────────────────────────────────────────────────────────────────
|
|
17
|
+
* 先读 `capabilities().deviceExecutor`:
|
|
18
|
+
* · `false` ⇒ 本部署没有 device 车道,六动词一律 **501 `capability.device_lane_required`**
|
|
19
|
+
* ({@link import("../errors.js").CapabilityUnavailableError})—— **别渲入口**;
|
|
20
|
+
* · 对象且 `management === true` ⇒ 六动词在场(谓词与该族 501 判据逐字同源:store + hub + 准入链三件齐);
|
|
21
|
+
* · 对象但 `management` **缺席** ⇒ 对面是 **7.88.0 之前**的 server,判不出来 ⇒ 只能按 501 试探。
|
|
22
|
+
* 🔴 别把缺席读成 `false`(两者处置不同),也别把 `deviceExecutor` 是对象读成「管理面一定在」——
|
|
23
|
+
* 那一位问的是**设备侧**接入面(executor 连不连得上),本位问的是**壳侧**管理动词。
|
|
24
|
+
*
|
|
25
|
+
* ── 鉴权与调用方域(六动词同一口径)────────────────────────────────────────────────────────────────
|
|
26
|
+
* owner 域 = **验证过的** `(tenant, subject)` 复合身份:subject 取 verified principal 链,tenant 取
|
|
27
|
+
* registry auth-bridge JWT 的 `scope` claim(签名真源,**恒不取自自报头**)。缺 tenant claim 且非 explicit
|
|
28
|
+
* operator ⇒ **403 `auth.forbidden`**(响亮拒,不给静默空视图)。
|
|
29
|
+
* 🔴 **签发口没有 operator 豁免**:它只为调用方**自己**签(体里没有 `target` 键),所以一个没有 tenant
|
|
30
|
+
* claim 的 operator 在那一口与任何无域凭据同答 403 —— 静默签给 operator 自己会把一个没人授权过的复合
|
|
31
|
+
* 身份写进 devices 行的 owner。
|
|
32
|
+
*
|
|
33
|
+
* ── 反枚举:404 是**一种**答案 ─────────────────────────────────────────────────────────────────────
|
|
34
|
+
* 🔴 `not_found.device`({@link import("../errors.js").NotFoundError})**五臂同码同串**:绑定不在 /
|
|
35
|
+
* 绑定不是你的 / 目标设备不在 / 不是绑定域的 / 已吊销。读面上读作「没有可见的绑定」;换绑上读作
|
|
36
|
+
* 「这条路不通,材料从 {@link DevicesResource.sessionBinding} 重取」。**别按文案分岔,也别据此推断存在性。**
|
|
37
|
+
*
|
|
38
|
+
* ── 重试姿态:四个 POST 都是 **AT-MOST-ONCE**(亲读 `transport.ts` 的 `canRetry`)────────────────────
|
|
39
|
+
* `canRetry = GET || (submit && idempotencyKey !== null)`,而本族四个写动词都**不是** submit-class、也不挂
|
|
40
|
+
* 幂等键 ⇒ SDK **一次都不重试**(两个读动词是 GET,照常重试)。这不是遗漏,是各口的语义各自要求的:
|
|
41
|
+
* · `rebind` 是**前态 CAS** —— 一次「成功了但响应丢了」的自动重试会拿到 409 `device.rebind_rev_conflict`,
|
|
42
|
+
* 在壳上与「别人刚把绑定挪走了」**完全同形**。让调用方自己决定(正解 = 回读 {@link
|
|
43
|
+
* DevicesResource.sessionBinding} 看落在哪,而不是重发);
|
|
44
|
+
* · `enroll` 本身幂等(同 token + 同 pubkey 同 200),重试**安全**,但那是调用方的判断,不是 SDK 替它
|
|
45
|
+
* 默认打开 —— 它也过限速;
|
|
46
|
+
* · `issueEnrollToken` 重试会**多签一枚** token(无害但烧限速额,且多一份明文要收好);
|
|
47
|
+
* · `revoke` 幂等(二次仍 200,不写第二条审计行),重试安全。
|
|
48
|
+
* 要自动重试的调用方自己包一层,并按上面逐口的判据决定重发还是回读。
|
|
49
|
+
*
|
|
50
|
+
* ── typed 错误(`device.*` 前缀族 → {@link import("../errors.js").DeviceError})──────────────────────
|
|
51
|
+
* 按 `errorCode` 分支,**不按 status**(409 上骑着 4 个不同处置的码)。逐码处置见
|
|
52
|
+
* {@link import("../errors.js").DeviceError} 的顶注。
|
|
53
|
+
*/
|
|
54
|
+
import type { Transport } from "../transport.js";
|
|
55
|
+
import type { DeviceEnrollRequest, DeviceRebindRequest, DeviceRevokeRequest, DeviceEnrollResult, DeviceEnrollToken, DeviceListResult, DeviceRebindResult, DeviceRevokeResult, DeviceSessionBinding } from "../types.js";
|
|
56
|
+
export declare class DevicesResource {
|
|
57
|
+
private readonly t;
|
|
58
|
+
constructor(t: Transport);
|
|
59
|
+
/**
|
|
60
|
+
* GET /v1/devices — 设备列表(§14.1)。owner 域过滤;explicit operator 全量。
|
|
61
|
+
*
|
|
62
|
+
* 🔴 **吊销行不列**(revoked 是终态,重注册 = 新 deviceId;列出来只会被当换绑目标然后撞 404)⇒
|
|
63
|
+
* 「列表里没有」**不等于**「这个 id 不存在」,只等于「它不是一个可用的换绑目标」。
|
|
64
|
+
* 每行的 `status` 就是提交期准入链第三步判的那一位(`offline` ⇒ 带 `deviceId` 提交拿 409 `device.offline`)。
|
|
65
|
+
*
|
|
66
|
+
* 403 `auth.forbidden`(判不出调用方域)/ 501 `capability.device_lane_required`(非 device 部署)。
|
|
67
|
+
*/
|
|
68
|
+
list(opts?: {
|
|
69
|
+
signal?: AbortSignal;
|
|
70
|
+
}): Promise<DeviceListResult>;
|
|
71
|
+
/**
|
|
72
|
+
* GET /v1/devices/sessions/:rootSessionId — 一条根会话的绑定读面(§14.2;壳换绑 UX 的全部材料)。
|
|
73
|
+
*
|
|
74
|
+
* `boundDevice.rev` 就是 {@link rebind} 的 `expectedRev` 要回显的前态 —— **先读这一口再换绑**。
|
|
75
|
+
* 未绑定 / 不是你的 ⇒ **404 同码同串**(反枚举;读作「没有可见的绑定」,不是「这条会话不存在」)。
|
|
76
|
+
*/
|
|
77
|
+
sessionBinding(rootSessionId: string, opts?: {
|
|
78
|
+
signal?: AbortSignal;
|
|
79
|
+
}): Promise<DeviceSessionBinding>;
|
|
80
|
+
/**
|
|
81
|
+
* POST /v1/devices/sessions/:rootSessionId/rebind — **显式**换绑(§14.3;v1 无隐式重绑)。
|
|
82
|
+
*
|
|
83
|
+
* `expectedRev` **必填** = 从 {@link sessionBinding} 读到的行 rev:强制显式前态,两个操作员并发换绑
|
|
84
|
+
* 不互踩。门序(逐字冻结,server 侧五步):
|
|
85
|
+
* 1. owner 门(非属主 **404 反枚举同串**);
|
|
86
|
+
* 2. 目标设备在场门(`toDeviceId` 在、属**绑定行的域**、未吊销;不中 ⇒ 404 **同串**);
|
|
87
|
+
* 3. **无活跃 run 门**(CAS 前判,durable 判据 = run store 的 session claim,含 parked):在场 ⇒
|
|
88
|
+
* 409 `device.rebind_active_run`,体带 **`activeTaskId`**(cancel 它或等终局后重发);
|
|
89
|
+
* run store 缺席 ⇒ 501 `capability.run_store_required`(门无判据即拒);
|
|
90
|
+
* 4. 前态 CAS:rev 不符 ⇒ 409 `device.rebind_rev_conflict`,体带 **`currentRev`**(壳一跳重定位)。
|
|
91
|
+
* 🔴 `toDeviceId` **同**但 rev 错**仍然** 409 —— 前态错就是错;
|
|
92
|
+
* 5. 赢 ⇒ 200 {@link import("../types.js").DeviceRebindResult}。
|
|
93
|
+
*
|
|
94
|
+
* 🔴 两个拒码的材料是**平铺顶层键**(`{error, errorCode, activeTaskId}` / `{error, errorCode, currentRev}`),
|
|
95
|
+
* **不在 `details` 之类的子对象里** —— SDK 已把它们提到 {@link import("../errors.js").DeviceError} 的
|
|
96
|
+
* 具名属性上,别再去 body 里找一层嵌套(黑板 [6051]① 真机对表案)。
|
|
97
|
+
*
|
|
98
|
+
* **幂等形**:`toDeviceId` ≡ 当前绑定 ∧ `expectedRev` ≡ 当前 rev ⇒ 200 回显、`rev` **不加**、不写审计行。
|
|
99
|
+
* 🔴 `workspaceCarryover: "none"` 是**冻结字面**(两个 200 形恒带):换绑只改路由、**不搬工作区字节** ——
|
|
100
|
+
* 壳必须据此向用户诚实披露「新设备上是全新工作区」。
|
|
101
|
+
* ⚠️ **在途指令不迁移**:park 赎回 / 迟到指令按**指令铸造时**的绑定校验,恒拒 `device.identity_mismatch`
|
|
102
|
+
* (403),不静默改道新设备(新设备上没有那个工作区)。
|
|
103
|
+
* ⚠️ **别与提交并发**(§14.3/§14.6 成文残留:步 3 与步 4 是两只店的两笔操作,check→act 之间有窗)——
|
|
104
|
+
* 先换绑拿到 200 再提交,或提交后用 {@link sessionBinding} 回读一次。
|
|
105
|
+
*/
|
|
106
|
+
rebind(rootSessionId: string, body: DeviceRebindRequest, opts?: {
|
|
107
|
+
signal?: AbortSignal;
|
|
108
|
+
}): Promise<DeviceRebindResult>;
|
|
109
|
+
/**
|
|
110
|
+
* POST /v1/devices/enroll-tokens — 签发一枚一次性注册 token(§14.4)。
|
|
111
|
+
*
|
|
112
|
+
* 体是**闭形、零受理键**(多余键 = 400 `request.body_shape` 并点名键路径)⇒ 本方法**不收 body**:
|
|
113
|
+
* 签发对象恒 = 调用方**自己**的复合身份。「代别人签发」要一条「谁可以代谁」的授权面,v1 不做,所以
|
|
114
|
+
* **explicit operator 也不豁免域门**(没有 tenant claim ⇒ 403 `auth.forbidden`)。
|
|
115
|
+
*
|
|
116
|
+
* 🔴 `token` 是**明文一现** —— 库里只有 sha256 摘要,丢了就**重签**,没有「找回」。别落日志、别进
|
|
117
|
+
* durable 流;把它交给设备之后就忘掉。
|
|
118
|
+
* `ttlSec` = 部署旋钮 `DEVICE_ENROLL_TOKEN_TTL_SEC`(缺省 900),`expiresAt` **自 DB now 起算**。
|
|
119
|
+
*
|
|
120
|
+
* 429 `limit.rate_exceeded` + `retry-after`({@link import("../errors.js").LimitExceededError})——
|
|
121
|
+
* 🔴 **限速检查抛了 = 拒**(fail-closed;亲读 server `device-enrollment.ts` 的 `rateGate`:catch 臂答的是
|
|
122
|
+
* 这个码 + `retryAfterSec`,不是放行 —— 那正是 token 撞库最想要的一刻)。两口过的是**同一只**限速器,
|
|
123
|
+
* 按动词分键(`issue:<tenant>\0<subject>` / `enroll:<tenant>\0<subject>`)。
|
|
124
|
+
*/
|
|
125
|
+
issueEnrollToken(opts?: {
|
|
126
|
+
signal?: AbortSignal;
|
|
127
|
+
}): Promise<DeviceEnrollToken>;
|
|
128
|
+
/**
|
|
129
|
+
* POST /v1/devices/enroll — 用那枚 token 把一台设备注册进来(§14.4)。
|
|
130
|
+
*
|
|
131
|
+
* 🔴 **pre-auth 的是「设备」不是「调用方」**:设备此刻还没有 deviceId、没有密钥对进库,所以这条口挂
|
|
132
|
+
* 不了**设备**凭据门 —— 但调用方**仍须**带已验证的复合身份(缺 tenant claim = 403 `auth.forbidden`)。
|
|
133
|
+
* 缺域就放行等于「谁拿到 token 谁就是那个人」。
|
|
134
|
+
* 🔴 `deviceId` 与 `owner` **不是入参**:前者由 server 铸(`dev_<ulid>`),后者恒取验证过的复合身份。
|
|
135
|
+
* 🔴 `pubkey` 是设备**自己生成**的公钥 —— 私钥从不上行,它就是设备的凭据(握手签名走
|
|
136
|
+
* `@sema-agent/sdk/device` 的 `buildHelloSignaturePayload`)。
|
|
137
|
+
*
|
|
138
|
+
* 403 `device.enrollment_invalid` 是这一口的**唯一**对外拒绝码:四种理由(token 不存在 / 已过期 /
|
|
139
|
+
* 绑的不是你的复合身份 / 已被**另一把** pubkey 用过)在 wire 上**逐字节同形**,连文案都一样 ——
|
|
140
|
+
* 反枚举,不是含糊。处置 = 找签发方要一个新 token。
|
|
141
|
+
* ⚠️ 同 token + **同** pubkey 重试是**幂等的 200**(不是拒):响应丢失后的安全重试,且与真注册 wire
|
|
142
|
+
* **同形** ⇒ 别试图从响应分辨「我是不是第一个」。
|
|
143
|
+
* 400 `request.field_invalid`:`platformOs` 词表外(v1 闭集 `darwin | linux`,**不静默收第三个值**)/
|
|
144
|
+
* 各列超字节上限(**截断的值是另一个值**,门上就拒)。400 `request.body_shape`:必填键缺席(`<key> is required`)
|
|
145
|
+
* 或多余键(点名键路径)—— 体是闭形。
|
|
146
|
+
*/
|
|
147
|
+
enroll(body: DeviceEnrollRequest, opts?: {
|
|
148
|
+
signal?: AbortSignal;
|
|
149
|
+
}): Promise<DeviceEnrollResult>;
|
|
150
|
+
/**
|
|
151
|
+
* POST /v1/devices/:deviceId/revoke — 吊销一台设备(§14.5)。属主本人或 explicit operator
|
|
152
|
+
* (后者按**行的**域,不跨域铸)。
|
|
153
|
+
*
|
|
154
|
+
* `reason` ≤512 字节(超出 400 `request.field_invalid` —— 一条被截断的审计理由是**另一个**理由)。
|
|
155
|
+
* 行不在 / 不是你的 ⇒ 404 `not_found.device` **同串**(operator 也不例外:它的全量可见性由 {@link list}
|
|
156
|
+
* 提供,吊销口不承担第二种存在性回答)。**幂等**:二次吊销仍 200,但不写第二条审计行。
|
|
157
|
+
*
|
|
158
|
+
* 🔴 **吊销是终态**,立刻生效在三个面上:
|
|
159
|
+
* ① 活连接 —— 作废连接租约 + 推进连接世代在**同一个店事务**里 ⇒ 活连接收到 `bye:revoked` 并断开,
|
|
160
|
+
* 在途指令按 outcome-unknown 收尾(设计窗 = 5s 内);
|
|
161
|
+
* ② 该会话后续每一次提交 = 403 `device.revoked`;
|
|
162
|
+
* ③ 重新注册得到的是一个**新** `deviceId` —— 旧行不复活(拿旧 enrollment token 重放也是 403
|
|
163
|
+
* `device.revoked`)。所以**别**把吊销当「临时下线」用:没有反向动词。
|
|
164
|
+
*/
|
|
165
|
+
revoke(deviceId: string, body?: DeviceRevokeRequest, opts?: {
|
|
166
|
+
signal?: AbortSignal;
|
|
167
|
+
}): Promise<DeviceRevokeResult>;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=devices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../src/resources/devices.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAAD,CAAC,EAAE,SAAS;IAEzC;;;;;;;;OAQG;IACG,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAItE;;;;;OAKG;IACG,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQ3G;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,MAAM,CACV,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,mBAAmB,EACzB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAS9B;;;;;;;;;;;;;;;OAeG;IACG,gBAAgB,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAInF;;;;;;;;;;;;;;;;;;OAkBG;IACG,MAAM,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIrG;;;;;;;;;;;;;;OAcG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAWzH"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
export class DevicesResource {
|
|
2
|
+
t;
|
|
3
|
+
constructor(t) {
|
|
4
|
+
this.t = t;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* GET /v1/devices — 设备列表(§14.1)。owner 域过滤;explicit operator 全量。
|
|
8
|
+
*
|
|
9
|
+
* 🔴 **吊销行不列**(revoked 是终态,重注册 = 新 deviceId;列出来只会被当换绑目标然后撞 404)⇒
|
|
10
|
+
* 「列表里没有」**不等于**「这个 id 不存在」,只等于「它不是一个可用的换绑目标」。
|
|
11
|
+
* 每行的 `status` 就是提交期准入链第三步判的那一位(`offline` ⇒ 带 `deviceId` 提交拿 409 `device.offline`)。
|
|
12
|
+
*
|
|
13
|
+
* 403 `auth.forbidden`(判不出调用方域)/ 501 `capability.device_lane_required`(非 device 部署)。
|
|
14
|
+
*/
|
|
15
|
+
async list(opts) {
|
|
16
|
+
return this.t.request({ method: "GET", path: "/v1/devices", signal: opts?.signal });
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* GET /v1/devices/sessions/:rootSessionId — 一条根会话的绑定读面(§14.2;壳换绑 UX 的全部材料)。
|
|
20
|
+
*
|
|
21
|
+
* `boundDevice.rev` 就是 {@link rebind} 的 `expectedRev` 要回显的前态 —— **先读这一口再换绑**。
|
|
22
|
+
* 未绑定 / 不是你的 ⇒ **404 同码同串**(反枚举;读作「没有可见的绑定」,不是「这条会话不存在」)。
|
|
23
|
+
*/
|
|
24
|
+
async sessionBinding(rootSessionId, opts) {
|
|
25
|
+
return this.t.request({
|
|
26
|
+
method: "GET",
|
|
27
|
+
path: `/v1/devices/sessions/${encodeURIComponent(rootSessionId)}`,
|
|
28
|
+
signal: opts?.signal,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* POST /v1/devices/sessions/:rootSessionId/rebind — **显式**换绑(§14.3;v1 无隐式重绑)。
|
|
33
|
+
*
|
|
34
|
+
* `expectedRev` **必填** = 从 {@link sessionBinding} 读到的行 rev:强制显式前态,两个操作员并发换绑
|
|
35
|
+
* 不互踩。门序(逐字冻结,server 侧五步):
|
|
36
|
+
* 1. owner 门(非属主 **404 反枚举同串**);
|
|
37
|
+
* 2. 目标设备在场门(`toDeviceId` 在、属**绑定行的域**、未吊销;不中 ⇒ 404 **同串**);
|
|
38
|
+
* 3. **无活跃 run 门**(CAS 前判,durable 判据 = run store 的 session claim,含 parked):在场 ⇒
|
|
39
|
+
* 409 `device.rebind_active_run`,体带 **`activeTaskId`**(cancel 它或等终局后重发);
|
|
40
|
+
* run store 缺席 ⇒ 501 `capability.run_store_required`(门无判据即拒);
|
|
41
|
+
* 4. 前态 CAS:rev 不符 ⇒ 409 `device.rebind_rev_conflict`,体带 **`currentRev`**(壳一跳重定位)。
|
|
42
|
+
* 🔴 `toDeviceId` **同**但 rev 错**仍然** 409 —— 前态错就是错;
|
|
43
|
+
* 5. 赢 ⇒ 200 {@link import("../types.js").DeviceRebindResult}。
|
|
44
|
+
*
|
|
45
|
+
* 🔴 两个拒码的材料是**平铺顶层键**(`{error, errorCode, activeTaskId}` / `{error, errorCode, currentRev}`),
|
|
46
|
+
* **不在 `details` 之类的子对象里** —— SDK 已把它们提到 {@link import("../errors.js").DeviceError} 的
|
|
47
|
+
* 具名属性上,别再去 body 里找一层嵌套(黑板 [6051]① 真机对表案)。
|
|
48
|
+
*
|
|
49
|
+
* **幂等形**:`toDeviceId` ≡ 当前绑定 ∧ `expectedRev` ≡ 当前 rev ⇒ 200 回显、`rev` **不加**、不写审计行。
|
|
50
|
+
* 🔴 `workspaceCarryover: "none"` 是**冻结字面**(两个 200 形恒带):换绑只改路由、**不搬工作区字节** ——
|
|
51
|
+
* 壳必须据此向用户诚实披露「新设备上是全新工作区」。
|
|
52
|
+
* ⚠️ **在途指令不迁移**:park 赎回 / 迟到指令按**指令铸造时**的绑定校验,恒拒 `device.identity_mismatch`
|
|
53
|
+
* (403),不静默改道新设备(新设备上没有那个工作区)。
|
|
54
|
+
* ⚠️ **别与提交并发**(§14.3/§14.6 成文残留:步 3 与步 4 是两只店的两笔操作,check→act 之间有窗)——
|
|
55
|
+
* 先换绑拿到 200 再提交,或提交后用 {@link sessionBinding} 回读一次。
|
|
56
|
+
*/
|
|
57
|
+
async rebind(rootSessionId, body, opts) {
|
|
58
|
+
return this.t.request({
|
|
59
|
+
method: "POST",
|
|
60
|
+
path: `/v1/devices/sessions/${encodeURIComponent(rootSessionId)}/rebind`,
|
|
61
|
+
body,
|
|
62
|
+
signal: opts?.signal,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* POST /v1/devices/enroll-tokens — 签发一枚一次性注册 token(§14.4)。
|
|
67
|
+
*
|
|
68
|
+
* 体是**闭形、零受理键**(多余键 = 400 `request.body_shape` 并点名键路径)⇒ 本方法**不收 body**:
|
|
69
|
+
* 签发对象恒 = 调用方**自己**的复合身份。「代别人签发」要一条「谁可以代谁」的授权面,v1 不做,所以
|
|
70
|
+
* **explicit operator 也不豁免域门**(没有 tenant claim ⇒ 403 `auth.forbidden`)。
|
|
71
|
+
*
|
|
72
|
+
* 🔴 `token` 是**明文一现** —— 库里只有 sha256 摘要,丢了就**重签**,没有「找回」。别落日志、别进
|
|
73
|
+
* durable 流;把它交给设备之后就忘掉。
|
|
74
|
+
* `ttlSec` = 部署旋钮 `DEVICE_ENROLL_TOKEN_TTL_SEC`(缺省 900),`expiresAt` **自 DB now 起算**。
|
|
75
|
+
*
|
|
76
|
+
* 429 `limit.rate_exceeded` + `retry-after`({@link import("../errors.js").LimitExceededError})——
|
|
77
|
+
* 🔴 **限速检查抛了 = 拒**(fail-closed;亲读 server `device-enrollment.ts` 的 `rateGate`:catch 臂答的是
|
|
78
|
+
* 这个码 + `retryAfterSec`,不是放行 —— 那正是 token 撞库最想要的一刻)。两口过的是**同一只**限速器,
|
|
79
|
+
* 按动词分键(`issue:<tenant>\0<subject>` / `enroll:<tenant>\0<subject>`)。
|
|
80
|
+
*/
|
|
81
|
+
async issueEnrollToken(opts) {
|
|
82
|
+
return this.t.request({ method: "POST", path: "/v1/devices/enroll-tokens", signal: opts?.signal });
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* POST /v1/devices/enroll — 用那枚 token 把一台设备注册进来(§14.4)。
|
|
86
|
+
*
|
|
87
|
+
* 🔴 **pre-auth 的是「设备」不是「调用方」**:设备此刻还没有 deviceId、没有密钥对进库,所以这条口挂
|
|
88
|
+
* 不了**设备**凭据门 —— 但调用方**仍须**带已验证的复合身份(缺 tenant claim = 403 `auth.forbidden`)。
|
|
89
|
+
* 缺域就放行等于「谁拿到 token 谁就是那个人」。
|
|
90
|
+
* 🔴 `deviceId` 与 `owner` **不是入参**:前者由 server 铸(`dev_<ulid>`),后者恒取验证过的复合身份。
|
|
91
|
+
* 🔴 `pubkey` 是设备**自己生成**的公钥 —— 私钥从不上行,它就是设备的凭据(握手签名走
|
|
92
|
+
* `@sema-agent/sdk/device` 的 `buildHelloSignaturePayload`)。
|
|
93
|
+
*
|
|
94
|
+
* 403 `device.enrollment_invalid` 是这一口的**唯一**对外拒绝码:四种理由(token 不存在 / 已过期 /
|
|
95
|
+
* 绑的不是你的复合身份 / 已被**另一把** pubkey 用过)在 wire 上**逐字节同形**,连文案都一样 ——
|
|
96
|
+
* 反枚举,不是含糊。处置 = 找签发方要一个新 token。
|
|
97
|
+
* ⚠️ 同 token + **同** pubkey 重试是**幂等的 200**(不是拒):响应丢失后的安全重试,且与真注册 wire
|
|
98
|
+
* **同形** ⇒ 别试图从响应分辨「我是不是第一个」。
|
|
99
|
+
* 400 `request.field_invalid`:`platformOs` 词表外(v1 闭集 `darwin | linux`,**不静默收第三个值**)/
|
|
100
|
+
* 各列超字节上限(**截断的值是另一个值**,门上就拒)。400 `request.body_shape`:必填键缺席(`<key> is required`)
|
|
101
|
+
* 或多余键(点名键路径)—— 体是闭形。
|
|
102
|
+
*/
|
|
103
|
+
async enroll(body, opts) {
|
|
104
|
+
return this.t.request({ method: "POST", path: "/v1/devices/enroll", body, signal: opts?.signal });
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* POST /v1/devices/:deviceId/revoke — 吊销一台设备(§14.5)。属主本人或 explicit operator
|
|
108
|
+
* (后者按**行的**域,不跨域铸)。
|
|
109
|
+
*
|
|
110
|
+
* `reason` ≤512 字节(超出 400 `request.field_invalid` —— 一条被截断的审计理由是**另一个**理由)。
|
|
111
|
+
* 行不在 / 不是你的 ⇒ 404 `not_found.device` **同串**(operator 也不例外:它的全量可见性由 {@link list}
|
|
112
|
+
* 提供,吊销口不承担第二种存在性回答)。**幂等**:二次吊销仍 200,但不写第二条审计行。
|
|
113
|
+
*
|
|
114
|
+
* 🔴 **吊销是终态**,立刻生效在三个面上:
|
|
115
|
+
* ① 活连接 —— 作废连接租约 + 推进连接世代在**同一个店事务**里 ⇒ 活连接收到 `bye:revoked` 并断开,
|
|
116
|
+
* 在途指令按 outcome-unknown 收尾(设计窗 = 5s 内);
|
|
117
|
+
* ② 该会话后续每一次提交 = 403 `device.revoked`;
|
|
118
|
+
* ③ 重新注册得到的是一个**新** `deviceId` —— 旧行不复活(拿旧 enrollment token 重放也是 403
|
|
119
|
+
* `device.revoked`)。所以**别**把吊销当「临时下线」用:没有反向动词。
|
|
120
|
+
*/
|
|
121
|
+
async revoke(deviceId, body, opts) {
|
|
122
|
+
return this.t.request({
|
|
123
|
+
method: "POST",
|
|
124
|
+
path: `/v1/devices/${encodeURIComponent(deviceId)}/revoke`,
|
|
125
|
+
// 体是闭形(受理键只有 `reason`)。`reason` 缺席时**显式**送 `{}`:server 的 `readJson` 把零字节体
|
|
126
|
+
// 折成 `{}`(亲读 `http/request-guards.ts`,两种写法都过门),送一个显式空对象只是让 wire 上的形
|
|
127
|
+
// 不依赖那条折叠 —— 折叠是 server 的内部好意,不是本口声明过的受理形。
|
|
128
|
+
body: body ?? {},
|
|
129
|
+
signal: opts?.signal,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=devices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/resources/devices.ts"],"names":[],"mappings":"AAkEA,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,CAAY;QAAZ,MAAC,GAAD,CAAC,CAAW;IAAG,CAAC;IAE7C;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,IAA+B;QACxC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxG,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,aAAqB,EAAE,IAA+B;QACzE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAuB;YAC1C,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,wBAAwB,kBAAkB,CAAC,aAAa,CAAC,EAAE;YACjE,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,KAAK,CAAC,MAAM,CACV,aAAqB,EACrB,IAAyB,EACzB,IAA+B;QAE/B,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAqB;YACxC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,wBAAwB,kBAAkB,CAAC,aAAa,CAAC,SAAS;YACxE,IAAI;YACJ,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAA+B;QACpD,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxH,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,MAAM,CAAC,IAAyB,EAAE,IAA+B;QACrE,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxH,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,IAA0B,EAAE,IAA+B;QACxF,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAqB;YACxC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,eAAe,kBAAkB,CAAC,QAAQ,CAAC,SAAS;YAC1D,0EAA0E;YAC1E,oEAAoE;YACpE,2CAA2C;YAC3C,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/types.d.ts
CHANGED
|
@@ -448,6 +448,36 @@ export interface TaskRequest {
|
|
|
448
448
|
* workspaceDir = cwd)。🔒 安全:cwd 是宿主路径,**只在 local 单用户(REQUIRE_PRINCIPAL=false / host adapter)
|
|
449
449
|
* honor;云/多租户 MUST ignore**(否则租户可把共享 worker 指到任意宿主路径 = 路径穿越,同 env-defer 信任边界)。 */
|
|
450
450
|
cwd?: string;
|
|
451
|
+
/**
|
|
452
|
+
* 🔴 **device 车道的首绑写协议**(server ≥7.88.0 / S-470;契约 `docs/ASSISTANT-WIRE-CONTRACT.md` §14.6)
|
|
453
|
+
* —— 「在我自己名下的设备里挑**这一台**跑」。与 {@link cwd} **同级同信任姿势**:调用方供给、server 闸裁;
|
|
454
|
+
* 它**不是身份**(身份恒取验证过的复合身份链),只是一个选择子。
|
|
455
|
+
*
|
|
456
|
+
* · **仅根任务携带**:绑定键是**根会话**,子代(subagent / cascade / verify)无条件继承,不另绑;
|
|
457
|
+
* **resume 家族**(`/decide` `/answer` `/plan_review` `/wake`)**不收**这个键 —— 车道随树固定。
|
|
458
|
+
* · 🔴 **非 device 车道收到它 = 400 `request.precondition_unmet`**(拒因文案点名 `REMOTE_EXEC=device`)。
|
|
459
|
+
* 刻意**不静默忽略**:否则调用方会以为自己指定了执行设备,而那条声明从未存在。先探
|
|
460
|
+
* {@link Capabilities.deviceExecutor} —— `false` ⇒ 别发。
|
|
461
|
+
* · **首绑** = INSERT-if-absent CAS ⇒ 并发单赢家:输家**同**设备 = 幂等成功,输家**异**设备 =
|
|
462
|
+
* 409 `device.claim_conflict`。**后续根提交**:缺席 = 沿用绑定 / 携且同 = 幂等(绑定 `rev` 不动)/
|
|
463
|
+
* 携且异 = 403 `device.identity_mismatch`。**v1 无隐式重绑** —— 换设备是
|
|
464
|
+
* {@link import("./resources/devices.js").DevicesResource.rebind} 那次显式动作。
|
|
465
|
+
* · **提交期准入链三步**(全 fail-closed):绑定解出(否 = 409 `device.not_bound`)→ devices 行 active
|
|
466
|
+
* (行不在/不是你的 = 404 `not_found.device` 反枚举同串;吊销 = 403 `device.revoked`)→ presence 在线
|
|
467
|
+
* (否 = 409 `device.offline`)。任何一步查表故障 = **拒**。
|
|
468
|
+
* · 🔴 **常规拒绝的读面代价为零**:除 `device.claim_conflict` / `device.identity_mismatch`(两条真并发,
|
|
469
|
+
* 发生在建行之后、server 会终结并释放刚建的 run ⇒ 同会话可**立刻**再提交)以外,每一条拒绝都在
|
|
470
|
+
* server 建任何东西**之前**答出 ⇒ 没有 run 行、没有会话占用。对 `POST /v1/runs` 是**可观察的**:
|
|
471
|
+
* 自带 `taskId` 撞 `device.offline` 之后,设备上线用**同一个** `taskId` 重试会得到一次**真受理**。
|
|
472
|
+
* · ⚠️ 反面(如实披露):那条自带 `taskId` 的幂等重放**也过准入链** —— executor 短暂掉线的窗里,同
|
|
473
|
+
* `taskId` 重试拿到的是 `409 device.offline` 而**不是**那张 `202` 收据(原 run 不受影响,走重连宽限)。
|
|
474
|
+
* 正解 = `GET /v1/runs/<taskId>` 读真相,或等 executor 重连后再试。
|
|
475
|
+
* · ⚠️ 换绑与提交**不要并发**(§14.6 末段成文残留:换绑的「无活跃 run」门是 check→act);先 rebind
|
|
476
|
+
* 拿到 200 再提交,或提交后用
|
|
477
|
+
* {@link import("./resources/devices.js").DevicesResource.sessionBinding} 回读一次。
|
|
478
|
+
* · 走 device 车道**不会**比 host 车道多问任何一次工具审批(`permissionMode` 读数同构造)。
|
|
479
|
+
*/
|
|
480
|
+
deviceId?: string;
|
|
451
481
|
/** 🔴 E18 resume-at / REWIND(core 答 §J=方案A "fork-from-entry";core prepare-task.ts:529 `spec.resumeAt`,
|
|
452
482
|
* service main.ts:1150-1166)—— 从会话历史里**某条已发生的消息**分叉一条新支线(不是 mutate 旧 run)。值 = 该消息的
|
|
453
483
|
* **E2 message eventId**(`AgentEvent.eventId`,client 在流里见过的那个),**非** core 内部 entryId —— service 持有
|
|
@@ -3237,6 +3267,17 @@ export interface Capabilities {
|
|
|
3237
3267
|
protocolVersion: number;
|
|
3238
3268
|
maxInflightPerDevice: number;
|
|
3239
3269
|
wsPath: string;
|
|
3270
|
+
/** 🔴 **`/v1/devices/*` 管理面六动词在不在**(server ≥7.88.0,契约 §14;`routes/capabilities.ts`
|
|
3271
|
+
* 的 `deviceExecutor` 对象;谓词与该族 501 `capability.device_lane_required` 的判据**逐字同源**
|
|
3272
|
+
* —— device store + hub + 准入链三件齐,由 `boot/device-lane.ts` 一处建齐)。
|
|
3273
|
+
*
|
|
3274
|
+
* 🔴 **present-iff**:这一位**缺席**说明对面是 **7.88.0 之前**的 server —— 那台 worker 判不出来,
|
|
3275
|
+
* 只能按 501 试探(`client.devices.*` 会抛 {@link import("./errors.js").CapabilityUnavailableError})。
|
|
3276
|
+
* **别把缺席读成 `false`**:两者的处置不同(false = 这台 server 明说没有这一面,别渲入口;
|
|
3277
|
+
* 缺席 = 不知道,可以试一次)。
|
|
3278
|
+
* ⚠️ 与上面三位**不同轴**:那三位是**设备侧**接入面(executor 连 WS 要知道的);本位是**壳/管理侧**
|
|
3279
|
+
* (谁能列设备、换绑、签发、注册、吊销)。一位为真不蕴含另一位为真。 */
|
|
3280
|
+
management?: boolean;
|
|
3240
3281
|
[k: string]: unknown;
|
|
3241
3282
|
};
|
|
3242
3283
|
/** 记忆**引擎**位(server `routes/capabilities.ts:210` = `projectMemoryEngineCapability(deps.memoryPosture)`,
|
|
@@ -4310,6 +4351,98 @@ export interface LeaderRecord {
|
|
|
4310
4351
|
result?: unknown;
|
|
4311
4352
|
error?: string;
|
|
4312
4353
|
}
|
|
4354
|
+
/** 设备列表的一行(server `deviceListRow`;冻结键集)。 */
|
|
4355
|
+
export interface DeviceSummary {
|
|
4356
|
+
deviceId: string;
|
|
4357
|
+
/** 设备 displayName。**空串诚实缺席**(server 侧 `displayName !== "" ? {name} : {}`)—— 缺席的读法是
|
|
4358
|
+
* 「这台设备没起名」,不是「读不出来」。 */
|
|
4359
|
+
name?: string;
|
|
4360
|
+
/** 🔴 `presence` 的真源 = **本副本汇聚端的活连接在场性**(device lane v1 部署形 = 单副本)。
|
|
4361
|
+
* 这一位就是提交期准入链第三步判的那一位:`offline` 时带 `deviceId` 提交会拿 409 `device.offline`。 */
|
|
4362
|
+
status: "online" | "offline";
|
|
4363
|
+
/** ISO-8601。**从未连过则缺席**(不是 `null`、也不是 epoch 0)。 */
|
|
4364
|
+
lastSeenAt?: string;
|
|
4365
|
+
}
|
|
4366
|
+
/** `GET /v1/devices` 的 200 体。
|
|
4367
|
+
* 🔴 **吊销行不列**(revoked 是终态,重注册 = 新 deviceId;列出来只会被当换绑目标然后撞 404)。
|
|
4368
|
+
* owner 域过滤;explicit operator 全量。 */
|
|
4369
|
+
export interface DeviceListResult {
|
|
4370
|
+
devices: DeviceSummary[];
|
|
4371
|
+
}
|
|
4372
|
+
/** 一条会话↔设备绑定(server `boundDeviceOf`;冻结键集)。 */
|
|
4373
|
+
export interface DeviceBinding {
|
|
4374
|
+
deviceId: string;
|
|
4375
|
+
/** 前态版本号 —— 换绑动词的 `expectedRev` 要回显的就是它(强制显式前态,两操作员并发换绑不互踩)。 */
|
|
4376
|
+
rev: number;
|
|
4377
|
+
/** ISO-8601。 */
|
|
4378
|
+
boundAt: string;
|
|
4379
|
+
}
|
|
4380
|
+
/** `GET /v1/devices/sessions/:rootSessionId` 的 200 体(S-4 绑定读面 = 壳换绑 UX 的全部材料)。 */
|
|
4381
|
+
export interface DeviceSessionBinding {
|
|
4382
|
+
rootSessionId: string;
|
|
4383
|
+
boundDevice: DeviceBinding;
|
|
4384
|
+
}
|
|
4385
|
+
/** `POST /v1/devices/sessions/:rootSessionId/rebind` 的请求体。⚠️ server 7.88.2 对这一口**不做键闭集**(六动词里唯一一个:
|
|
4386
|
+
* 多余键被静默丢弃,不像 enroll / revoke 那样 400 `request.body_shape` 点名)—— server 侧已立票补齐;本 SDK 不发多余键。 */
|
|
4387
|
+
export interface DeviceRebindRequest {
|
|
4388
|
+
toDeviceId: string;
|
|
4389
|
+
/** 🔴 **必填** = 从 {@link DeviceBinding.rev} 读到的前态。强制显式前态,两个操作员并发换绑不互踩;
|
|
4390
|
+
* 非负整数(否则 400 `request.field_invalid`)。`toDeviceId` **同**但 rev 错**仍然** 409。 */
|
|
4391
|
+
expectedRev: number;
|
|
4392
|
+
}
|
|
4393
|
+
/** `POST /v1/devices/:deviceId/revoke` 的请求体(闭形,受理键只有 `reason`)。 */
|
|
4394
|
+
export interface DeviceRevokeRequest {
|
|
4395
|
+
/** ≤512 字节(超出 400 `request.field_invalid` —— 一条被截断的审计理由是**另一个**理由)。 */
|
|
4396
|
+
reason?: string;
|
|
4397
|
+
}
|
|
4398
|
+
/** `POST /v1/devices/sessions/:rootSessionId/rebind` 的 200 体(换绑赢 / 幂等,两形**同键集**)。 */
|
|
4399
|
+
export interface DeviceRebindResult {
|
|
4400
|
+
rootSessionId: string;
|
|
4401
|
+
deviceId: string;
|
|
4402
|
+
rev: number;
|
|
4403
|
+
/** 🔴 **冻结字面**(两个 200 形恒带):换绑只改路由,**不搬工作区字节** —— 壳必须据此向用户诚实披露
|
|
4404
|
+
* 「新设备上是全新工作区」。今天没有第二个值;联合留单成员是因为它是一个**声明**而不是一个开关。 */
|
|
4405
|
+
workspaceCarryover: "none";
|
|
4406
|
+
}
|
|
4407
|
+
/** `POST /v1/devices/enroll-tokens` 的 200 体(签发)。 */
|
|
4408
|
+
export interface DeviceEnrollToken {
|
|
4409
|
+
/** 🔴 **明文一现** —— 库里只有 sha256 摘要,丢了就重签,**没有「找回」**。别落日志。 */
|
|
4410
|
+
token: string;
|
|
4411
|
+
/** ISO-8601,**自 DB now 起算**(不是客户端时钟)。 */
|
|
4412
|
+
expiresAt: string;
|
|
4413
|
+
/** 部署旋钮 `DEVICE_ENROLL_TOKEN_TTL_SEC`(缺省 900)。 */
|
|
4414
|
+
ttlSec: number;
|
|
4415
|
+
}
|
|
4416
|
+
/** `POST /v1/devices/enroll` 的请求体(**闭形**:集外键 = 400 `request.body_shape` 并点名键路径)。
|
|
4417
|
+
* 🔴 `deviceId` 与 `owner` **不是入参**:前者由 server 铸(`dev_<ulid>`),后者恒取**验证过的**复合身份。 */
|
|
4418
|
+
export interface DeviceEnrollRequest {
|
|
4419
|
+
/** 签发口给的明文一次性 token。 */
|
|
4420
|
+
token: string;
|
|
4421
|
+
/** 设备自己生成的 Ed25519 **公**钥。私钥**从不上行** —— 它就是设备的凭据。 */
|
|
4422
|
+
pubkey: string;
|
|
4423
|
+
/** v1 闭集。第三个值(如 `win32`)= 400 `request.field_invalid`,**不静默收**。 */
|
|
4424
|
+
platformOs: "darwin" | "linux";
|
|
4425
|
+
platformArch?: string;
|
|
4426
|
+
displayName?: string;
|
|
4427
|
+
/** 设备侧的根 —— 每条指令都相对它解析。必填非空。 */
|
|
4428
|
+
workspaceRoot: string;
|
|
4429
|
+
}
|
|
4430
|
+
/** `POST /v1/devices/enroll` 的 200 体。
|
|
4431
|
+
* 🔴 响应里**没有任何一次性明文**(设备的凭据是它自己生成、从未上行的私钥)。
|
|
4432
|
+
* 🔴 **幂等重放与真注册 wire 同形**(同 200、同 `deviceId`):同 token + **同** pubkey 重试是响应丢失后的
|
|
4433
|
+
* 安全重试;同 token + **异** pubkey = 403 `device.enrollment_invalid`。两者可分辨就等于给「这个 token
|
|
4434
|
+
* 用过没有」开一个探针,所以刻意同形 —— 别试图从响应里分辨自己是不是第一个。 */
|
|
4435
|
+
export interface DeviceEnrollResult {
|
|
4436
|
+
deviceId: string;
|
|
4437
|
+
}
|
|
4438
|
+
/** `POST /v1/devices/:deviceId/revoke` 的 200 体。**幂等**(二次吊销仍 200,但不写第二条审计行)。 */
|
|
4439
|
+
export interface DeviceRevokeResult {
|
|
4440
|
+
deviceId: string;
|
|
4441
|
+
/** 单成员:吊销是**终态**,没有别的答案。 */
|
|
4442
|
+
status: "revoked";
|
|
4443
|
+
/** ISO-8601;店里没有时刻时**诚实缺席**(server `revokedAtMs !== null ? {revokedAt} : {}`)。 */
|
|
4444
|
+
revokedAt?: string;
|
|
4445
|
+
}
|
|
4313
4446
|
/** §1 CheckpointSummary —— core 对每个 PENDING checkpoint 的轻量投影(summarizeCheckpoint, 全 store 后端一致)。
|
|
4314
4447
|
* inbox/总览 的共享行形状。可选字段缺则 OMIT 不是 null。🔴 只投影 severity 标量, **不带 riskDescriptor 对象**。 */
|
|
4315
4448
|
export interface CheckpointSummary {
|