@roll-agent/relay-protocol 0.1.0 → 0.2.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.
Files changed (35) hide show
  1. package/README.md +90 -39
  2. package/dist/conformance.d.ts +571 -4
  3. package/dist/conformance.js +677 -8
  4. package/dist/index.d.ts +3977 -303
  5. package/dist/index.js +664 -77
  6. package/dist/reference-adapter.d.ts +56 -0
  7. package/dist/reference-adapter.js +122 -0
  8. package/dist/schema/roll-relay-protocol-v1.1.schema.json +3791 -0
  9. package/fixtures/v1.1/invalid-approval-projection-raw-input-leak.json +19 -0
  10. package/fixtures/v1.1/invalid-authentication-local-only.json +12 -0
  11. package/fixtures/v1.1/invalid-file-picker-local-only.json +12 -0
  12. package/fixtures/v1.1/invalid-interaction-cancelled-reason-leak.json +10 -0
  13. package/fixtures/v1.1/invalid-interaction-resolved-result-leak.json +18 -0
  14. package/fixtures/v1.1/invalid-legacy-approval-candidate.json +7 -0
  15. package/fixtures/v1.1/invalid-legacy-approval-respond.json +7 -0
  16. package/fixtures/v1.1/invalid-n-minus-one-device-connect.json +6 -0
  17. package/fixtures/v1.1/invalid-non-normal-sensitivity.json +21 -0
  18. package/fixtures/v1.1/invalid-runtime-event-tool-input-leak.json +22 -0
  19. package/fixtures/v1.1/invalid-runtime-event-tool-output-leak.json +21 -0
  20. package/fixtures/v1.1/invalid-user-input-projection-secret-leak.json +22 -0
  21. package/fixtures/v1.1/manifest.json +673 -0
  22. package/fixtures/v1.1/valid-device-connect.json +6 -0
  23. package/fixtures/v1.1/valid-interaction-cancelled.json +9 -0
  24. package/fixtures/v1.1/valid-interaction-candidate-user-input.json +25 -0
  25. package/fixtures/v1.1/valid-interaction-request-approval.json +17 -0
  26. package/fixtures/v1.1/valid-interaction-request-user-input.json +40 -0
  27. package/fixtures/v1.1/valid-interaction-resolved.json +9 -0
  28. package/fixtures/v1.1/valid-runtime-ack.json +5 -0
  29. package/fixtures/v1.1/valid-runtime-encrypted-interaction.json +10 -0
  30. package/fixtures/v1.1/valid-runtime-event-runtime-n-minus-one.json +16 -0
  31. package/fixtures/v1.1/valid-runtime-event.json +16 -0
  32. package/fixtures/v1.1/valid-runtime-gap.json +7 -0
  33. package/fixtures/v1.1/valid-runtime-request.json +10 -0
  34. package/fixtures/v1.1/valid-runtime-response.json +8 -0
  35. package/package.json +8 -2
package/README.md CHANGED
@@ -9,7 +9,7 @@ Browser-safe 的 Roll Companion Relay Wire 契约。
9
9
 
10
10
  | 使用方 | 是否直接安装 | 用途 |
11
11
  |---|---:|---|
12
- | Browser Web App | 是 | 构造和校验 Relay frame |
12
+ | Browser Web App | 是 | 构造、校验并投影 Relay frame |
13
13
  | Cloud Relay Server | 是 | 校验、路由和持久化 Relay frame |
14
14
  | Local Companion Host | 是 | 与 Cloud 使用同一 Wire 契约 |
15
15
  | Local-only Desktop GUI | 否 | 直接使用 Runtime Protocol,不经过 Relay |
@@ -19,54 +19,105 @@ Browser-safe 的 Roll Companion Relay Wire 契约。
19
19
  pnpm add @roll-agent/relay-protocol
20
20
  ```
21
21
 
22
- 本包提供:
22
+ ## 版本
23
23
 
24
- - 显式冻结的 Relay Wire version、message/method registry;
25
- - `DeviceId`、`WorkspaceId`、Relay `requestId` / `envelopeId` Schema;
26
- - `device.connect`、request/response/event/ack/gap/encrypted frame Schema;
27
- - method-specific Params/Result parser;
28
- - 以 `(workspaceId, requestId)` 为幂等键的 `new/replay/conflict` 分类;
29
- - 稳定 Relay error code 与 retryability 映射;
30
- - JSON Schema、跨语言 fixtures 和可复用 conformance cases。
24
+ 支持矩阵是 `["1.1", "1.0"]`。Wire 1.1 新增 typed Interaction;Wire 1.0 的 registry、
25
+ Schema、fixtures 和 Approval fallback 保持冻结。
26
+
27
+ 为了让现有 Companion 和 Browser 不被 minor upgrade 静默升级,历史上没有版本后缀的
28
+ `RELAY_PROTOCOL_VERSION`、`relayMessageSchema`、`relayRequestMethodSchemas`、parser 和 type
29
+ 仍固定指向 Wire 1.0。新代码应使用 `LATEST_RELAY_PROTOCOL_VERSION` 和显式的 `*V10` /
30
+ `*V11` / `*ForVersion` API。
31
31
 
32
32
  ```ts
33
33
  import {
34
- RELAY_PROTOCOL_VERSION,
35
- relayMessageSchema,
36
- workspaceIdSchema,
34
+ LATEST_RELAY_PROTOCOL_VERSION,
35
+ parseRelayMessageForVersion,
36
+ relayMessageSchemaV11,
37
37
  } from "@roll-agent/relay-protocol";
38
- import {
39
- runRelayProtocolConformance,
40
- runtimeRelayProtocolConformanceAdapter,
41
- } from "@roll-agent/relay-protocol/conformance";
38
+
39
+ LATEST_RELAY_PROTOCOL_VERSION; // "1.1"
40
+ const frame = parseRelayMessageForVersion("1.1", input);
41
+ relayMessageSchemaV11.parse(frame);
42
42
  ```
43
43
 
44
- `@roll-agent/relay-protocol/schema` 导出 JSON Schema Draft 2020-12,
45
- `@roll-agent/relay-protocol/fixtures/v1/*` 导出 golden fixtures。
44
+ `CompanionRelayBridge.connect(transport)` 这一历史一参入口仍只表示 Wire 1.0。支持 Wire 1.1
45
+ 的 Host 必须使用显式协商版本的新入口;不得让旧调用自动选择 latest。
46
46
 
47
- `runRelayProtocolConformance()` 同时检查 frame、version 选择、完整 method registry 及其
48
- `query` / `mutation` / `local-only` disposition、duplicate/conflict 与错误码形状、基于调用方
49
- 已证明连续投递前缀的 ACK 边界、gap recovery、加密 metadata 和 Relay error retryability。
50
- Transport 必须自行保证发送失败后不会越过序号缺口;Companion Bridge 会终止失败的
51
- transport generation 并在重连后重放。当前只有 `"1.0"`,因此只能验证同版本与未知版本
52
- fail-closed;真实 `N/N-1` 矩阵必须等下一版 Relay Wire 存在后补齐,不能伪造历史版本。
47
+ ## Wire 1.1 Interaction
53
48
 
54
- ## 边界
49
+ Wire 1.1 增加 `interaction.request`、`interaction.resolved`、
50
+ `interaction.cancelled` 三种 Companion→Browser frame。Browser 通过 mutation
51
+ `interaction.candidate` 提交候选;`approval.candidate` 只存在于冻结的 Wire 1.0。
52
+
53
+ 远端候选不是 Runtime 的权威决议。Companion 仍持有 Runtime Handler、绝对 deadline 和
54
+ 本地 Policy;Approval approve candidate 必须在本机重新经过 Policy。
55
+
56
+ 安全投影只允许:
57
+
58
+ - Approval:`approvalId`、`agentName`、`toolName`、可选 `explanation`;
59
+ - User Input:五类安全表单 control 及其 bounded 字段;
60
+ - resolved/cancelled:Interaction identity,不回显 Runtime Result 或原始取消原因;
61
+ - Timeline:安全消息、状态和 Tool 完成摘要;Tool input/output delta 与 Approval preview 会被剥离。
62
+
63
+ Runtime JSON-RPC `id`、原始 Tool input/output、secret、完整 User Input Result、本地授权信息
64
+ 以及 Authentication/File Picker projector 都不能进入 Companion→Browser 投影。Browser→Companion 的
65
+ `interaction.candidate` 是 User Input Result 唯一允许的入站位置,并且必须关联原始表单重新校验。
66
+
67
+ Wire 1.1 的 pull 查询遵守同一边界:`thread.open` / `thread.snapshot` 必须把 Approval preview
68
+ 投影为可选 explanation、移除本地 reason,并把 Operation display 与 outcome reason 脱敏;
69
+ Host 对前两种结果调用 `projectRelayThreadSnapshotV11(value)`,对 `operation.get` 调用
70
+ `projectRelayOperationGetResultV11(value)`。两个 projector 遇到畸形 Runtime 结果都会抛错并
71
+ fail closed。第一方 `CompanionRelayBridgeV11` 已自动应用它们;自定义 Host 仍必须在构造
72
+ `runtime.response` 前显式调用,不能把 Runtime 原始结果直接发送。
73
+
74
+ 有意保留的内容包括完整 transcript 消息、Thread 标题/模型/时间元数据、安全 timeline 摘要,
75
+ 以及 `thread.capabilities.manifest` 中可能出现的 cwd、平台、Agent、Skill、Tool Schema、规则
76
+ 标识与 VCS 元数据。它们不是公开信息,Relay 与 Browser 宿主仍需按敏感数据保护。
77
+
78
+ 冻结的 Wire 1.0 没有这些安全投影,只适用于处在等价本地信任边界内的 legacy peer。它不是
79
+ 面向不受信 Cloud/Browser 的降级协议;需要远程投影的 Host 必须协商 1.1,失败时拒绝连接。
55
80
 
56
- 本包不包含 Transport、WebSocket、账号/设备数据库、本地 Policy、加密实现或 Cloud
57
- 部署代码。运行时代码只依赖 Browser-safe 的 `@roll-agent/protocol` 与 `zod`。
81
+ ## Browser reference adapter
58
82
 
59
- Browser 与 Cloud Relay 不能为了获得 Wire Schema 而安装 `@roll-agent/companion`。
60
- TypeScript/JavaScript 实现直接使用本包;其他语言使用本包发布的 JSON Schema、fixtures
61
- 与 conformance cases。
83
+ `@roll-agent/relay-protocol/reference-adapter` 提供最小、纯内存的 typed reference adapter:
84
+
85
+ ```ts
86
+ import { createRelayBrowserReferenceAdapter } from
87
+ "@roll-agent/relay-protocol/reference-adapter";
88
+
89
+ const adapter = createRelayBrowserReferenceAdapter({ protocolVersion: "1.1" });
90
+ const update = adapter.receive(frame);
91
+ const candidateRequest = adapter.createCandidate({
92
+ workspaceId,
93
+ interactionId,
94
+ method: "approval.request",
95
+ candidate: { decision: "reject", reason: "用户取消" },
96
+ });
97
+ ```
98
+
99
+ Adapter 只做 Schema 校验、pending correlation 和 candidate frame 构造。它不提供账号身份、
100
+ controller 选举、可靠投递、WebSocket、持久 outbox 或 Interaction WAL;这些 responder
101
+ context 必须由宿主注入。
102
+
103
+ ## Schema、fixtures 与 conformance
104
+
105
+ - `@roll-agent/relay-protocol/schema` 与 `/schema/v1.0`:冻结的 Wire 1.0 JSON Schema;
106
+ - `@roll-agent/relay-protocol/schema/v1.1`:Wire 1.1 JSON Schema;
107
+ - `@roll-agent/relay-protocol/fixtures/v1/*`:字节冻结的 Wire 1.0 golden fixtures;
108
+ - `@roll-agent/relay-protocol/fixtures/v1.1/*`:Wire 1.1 Interaction 与安全负例;
109
+ - `@roll-agent/relay-protocol/conformance`:可复用的 N/N-1 suite。
110
+
111
+ 历史 `runRelayProtocolConformance(adapter)` 一参调用固定执行 Wire 1.0 suite;新实现使用
112
+ `runRelayProtocolConformanceForVersion(version, adapter)` 显式选择 1.1 或 1.0。Suite 覆盖
113
+ 版本协商、完整 method registry、duplicate/conflict、ACK/gap、Interaction 生命周期、加密
114
+ metadata 和安全 sentinel。
115
+
116
+ ## 边界
62
117
 
63
- 当前只冻结 Relay Wire `"1.0"`。其中 `approval.candidate` 是现有 Approval 专属方法;
64
- 通用 typed interaction 与逻辑 `interactionId` 必须在后续 Relay Wire version 中定义,
65
- 不能静默扩张 `"1.0"`。
118
+ 本包不包含 Transport、WebSocket、账号/设备数据库、本地 Policy、加密实现或 Cloud 部署
119
+ 代码。运行时代码只依赖 Browser-safe 的 `@roll-agent/protocol` 与 `zod`。Browser 与 Cloud
120
+ Relay 不能为了获得 Wire Schema 而安装 `@roll-agent/companion`。
66
121
 
67
- Relay version 冻结外层 envelope、message type 与 recognized method registry。
68
- `local-only` 方法(当前为 `initialize`)只能由 Companion 在本地处理,不得转发给 Runtime;
69
- `query` / `mutation` 才是远程请求分类。既有 Runtime method 的 Params/Result 继续属于按
70
- Workspace 协商的 Runtime Protocol 契约;`relayRequestMethodSchemas` 是当前
71
- `@roll-agent/protocol` 依赖版本的 typed 视图,不应被解释为 Relay `"1.0"` 单独复制的一套
72
- Runtime Schema。
122
+ Relay `requestId`、逻辑 `interactionId`、Runtime JSON-RPC `id`、Runtime mutation
123
+ `requestId` 与 Relay `relaySequence` 是不同的类型和生命周期,不能互相复用。