@agent-phonon/protocol 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.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/json-schema/_index.json +3794 -0
- package/dist/json-schema/connect.hello.json +117 -0
- package/dist/json-schema/discovery.changed.json +190 -0
- package/dist/json-schema/discovery.get.json +183 -0
- package/dist/json-schema/discovery.list.json +182 -0
- package/dist/json-schema/document.prepare_upload.json +96 -0
- package/dist/json-schema/document.send.json +165 -0
- package/dist/json-schema/hook.fired.json +100 -0
- package/dist/json-schema/hook.resolve.json +96 -0
- package/dist/json-schema/interaction.cancel.json +48 -0
- package/dist/json-schema/interaction.request.json +376 -0
- package/dist/json-schema/interaction.response.json +68 -0
- package/dist/json-schema/project.create.json +89 -0
- package/dist/json-schema/project.get.json +76 -0
- package/dist/json-schema/project.git.deleteBranch.json +64 -0
- package/dist/json-schema/project.list.json +72 -0
- package/dist/json-schema/project.remove.json +69 -0
- package/dist/json-schema/project.worktree.create.json +88 -0
- package/dist/json-schema/project.worktree.list.json +77 -0
- package/dist/json-schema/project.worktree.remove.json +61 -0
- package/dist/json-schema/session.compress.json +72 -0
- package/dist/json-schema/session.create.json +128 -0
- package/dist/json-schema/session.inject.json +72 -0
- package/dist/json-schema/session.interrupt.json +58 -0
- package/dist/json-schema/session.list.json +127 -0
- package/dist/json-schema/session.send.json +132 -0
- package/dist/json-schema/session.status.json +94 -0
- package/dist/json-schema/session.switchModel.json +73 -0
- package/dist/json-schema/session.terminate.json +54 -0
- package/dist/json-schema/skill.install.json +171 -0
- package/dist/json-schema/skill.list.json +101 -0
- package/dist/json-schema/skill.uninstall.json +76 -0
- package/dist/json-schema/stream.ack.json +36 -0
- package/dist/json-schema/stream.event.json +381 -0
- package/dist/schemas/capabilities.d.ts +90 -0
- package/dist/schemas/capabilities.d.ts.map +1 -0
- package/dist/schemas/capabilities.js +59 -0
- package/dist/schemas/capabilities.js.map +1 -0
- package/dist/schemas/common.d.ts +66 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +97 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/connect.d.ts +111 -0
- package/dist/schemas/connect.d.ts.map +1 -0
- package/dist/schemas/connect.js +46 -0
- package/dist/schemas/connect.js.map +1 -0
- package/dist/schemas/device.d.ts +221 -0
- package/dist/schemas/device.d.ts.map +1 -0
- package/dist/schemas/device.js +59 -0
- package/dist/schemas/device.js.map +1 -0
- package/dist/schemas/discovery.d.ts +892 -0
- package/dist/schemas/discovery.d.ts.map +1 -0
- package/dist/schemas/discovery.js +66 -0
- package/dist/schemas/discovery.js.map +1 -0
- package/dist/schemas/document.d.ts +351 -0
- package/dist/schemas/document.d.ts.map +1 -0
- package/dist/schemas/document.js +103 -0
- package/dist/schemas/document.js.map +1 -0
- package/dist/schemas/env.d.ts +265 -0
- package/dist/schemas/env.d.ts.map +1 -0
- package/dist/schemas/env.js +44 -0
- package/dist/schemas/env.js.map +1 -0
- package/dist/schemas/file.d.ts +274 -0
- package/dist/schemas/file.d.ts.map +1 -0
- package/dist/schemas/file.js +72 -0
- package/dist/schemas/file.js.map +1 -0
- package/dist/schemas/hook.d.ts +132 -0
- package/dist/schemas/hook.d.ts.map +1 -0
- package/dist/schemas/hook.js +58 -0
- package/dist/schemas/hook.js.map +1 -0
- package/dist/schemas/interaction.d.ts +1583 -0
- package/dist/schemas/interaction.d.ts.map +1 -0
- package/dist/schemas/interaction.js +112 -0
- package/dist/schemas/interaction.js.map +1 -0
- package/dist/schemas/jsonrpc.d.ts +314 -0
- package/dist/schemas/jsonrpc.d.ts.map +1 -0
- package/dist/schemas/jsonrpc.js +64 -0
- package/dist/schemas/jsonrpc.js.map +1 -0
- package/dist/schemas/methods.d.ts +3826 -0
- package/dist/schemas/methods.d.ts.map +1 -0
- package/dist/schemas/methods.js +311 -0
- package/dist/schemas/methods.js.map +1 -0
- package/dist/schemas/policy.d.ts +81 -0
- package/dist/schemas/policy.d.ts.map +1 -0
- package/dist/schemas/policy.js +66 -0
- package/dist/schemas/policy.js.map +1 -0
- package/dist/schemas/project.d.ts +506 -0
- package/dist/schemas/project.d.ts.map +1 -0
- package/dist/schemas/project.js +148 -0
- package/dist/schemas/project.js.map +1 -0
- package/dist/schemas/session.d.ts +730 -0
- package/dist/schemas/session.d.ts.map +1 -0
- package/dist/schemas/session.js +287 -0
- package/dist/schemas/session.js.map +1 -0
- package/dist/schemas/skill.d.ts +465 -0
- package/dist/schemas/skill.d.ts.map +1 -0
- package/dist/schemas/skill.js +103 -0
- package/dist/schemas/skill.js.map +1 -0
- package/dist/schemas/stream.d.ts +688 -0
- package/dist/schemas/stream.d.ts.map +1 -0
- package/dist/schemas/stream.js +133 -0
- package/dist/schemas/stream.js.map +1 -0
- package/package.json +52 -0
- package/src/index.ts +24 -0
- package/src/schemas/capabilities.ts +62 -0
- package/src/schemas/common.ts +119 -0
- package/src/schemas/connect.ts +50 -0
- package/src/schemas/device.ts +67 -0
- package/src/schemas/discovery.ts +80 -0
- package/src/schemas/document.ts +121 -0
- package/src/schemas/env.ts +60 -0
- package/src/schemas/file.ts +97 -0
- package/src/schemas/hook.ts +66 -0
- package/src/schemas/interaction.ts +135 -0
- package/src/schemas/jsonrpc.ts +80 -0
- package/src/schemas/methods.ts +414 -0
- package/src/schemas/policy.ts +71 -0
- package/src/schemas/project.ts +185 -0
- package/src/schemas/session.ts +336 -0
- package/src/schemas/skill.ts +121 -0
- package/src/schemas/stream.ts +149 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import {
|
|
3
|
+
ConnectHelloParams,
|
|
4
|
+
ConnectWelcomeResult,
|
|
5
|
+
} from "./connect.js";
|
|
6
|
+
import {
|
|
7
|
+
DiscoveryListParams,
|
|
8
|
+
DiscoveryListResult,
|
|
9
|
+
DiscoveryGetParams,
|
|
10
|
+
DiscoveryGetResult,
|
|
11
|
+
DiscoveryChangedParams,
|
|
12
|
+
} from "./discovery.js";
|
|
13
|
+
import {
|
|
14
|
+
SessionCreateParams,
|
|
15
|
+
SessionCreateResult,
|
|
16
|
+
SessionSendParams,
|
|
17
|
+
SessionSendAck,
|
|
18
|
+
SessionInjectParams,
|
|
19
|
+
SessionInjectResult,
|
|
20
|
+
SessionCompressParams,
|
|
21
|
+
SessionCompressResult,
|
|
22
|
+
SessionSwitchModelParams,
|
|
23
|
+
SessionSwitchModelResult,
|
|
24
|
+
SessionInterruptParams,
|
|
25
|
+
SessionInterruptResult,
|
|
26
|
+
SessionTerminateParams,
|
|
27
|
+
SessionTerminateResult,
|
|
28
|
+
SessionStatusParams,
|
|
29
|
+
SessionStatusResult,
|
|
30
|
+
SessionListParams,
|
|
31
|
+
SessionListResult,
|
|
32
|
+
} from "./session.js";
|
|
33
|
+
import { StreamEvent, StreamAckParams } from "./stream.js";import {
|
|
34
|
+
HookFiredParams,
|
|
35
|
+
HookResolveParams,
|
|
36
|
+
HookResolveResult,
|
|
37
|
+
} from "./hook.js";
|
|
38
|
+
import { DocumentSendParams, DocumentSendResult, DocumentPrepareUploadParams, DocumentPrepareUploadResult } from "./document.js";
|
|
39
|
+
import {
|
|
40
|
+
InteractionRequestParams,
|
|
41
|
+
InteractionRequestResult,
|
|
42
|
+
InteractionResponseParams,
|
|
43
|
+
InteractionCancelParams,
|
|
44
|
+
InteractionCancelResult,
|
|
45
|
+
} from "./interaction.js";
|
|
46
|
+
import {
|
|
47
|
+
ProjectCreateParams,
|
|
48
|
+
ProjectCreateResult,
|
|
49
|
+
ProjectListParams,
|
|
50
|
+
ProjectListResult,
|
|
51
|
+
ProjectGetParams,
|
|
52
|
+
ProjectGetResult,
|
|
53
|
+
ProjectRemoveParams,
|
|
54
|
+
ProjectRemoveResult,
|
|
55
|
+
WorktreeCreateParams,
|
|
56
|
+
WorktreeCreateResult,
|
|
57
|
+
WorktreeListParams,
|
|
58
|
+
WorktreeListResult,
|
|
59
|
+
WorktreeRemoveParams,
|
|
60
|
+
WorktreeRemoveResult,
|
|
61
|
+
GitDeleteBranchParams,
|
|
62
|
+
GitDeleteBranchResult,
|
|
63
|
+
} from "./project.js";
|
|
64
|
+
import {
|
|
65
|
+
SkillInstallParams,
|
|
66
|
+
SkillInstallResult,
|
|
67
|
+
SkillUninstallParams,
|
|
68
|
+
SkillUninstallResult,
|
|
69
|
+
SkillListParams,
|
|
70
|
+
SkillListResult,
|
|
71
|
+
} from "./skill.js";
|
|
72
|
+
import { DeviceInfoParams, DeviceInfoResult, DeviceResourcesParams, DeviceResourcesResult } from "./device.js";
|
|
73
|
+
import {
|
|
74
|
+
FileReadParams,
|
|
75
|
+
FileReadResult,
|
|
76
|
+
FileWriteParams,
|
|
77
|
+
FileWriteResult,
|
|
78
|
+
FileListParams,
|
|
79
|
+
FileListResult,
|
|
80
|
+
FileStatParams,
|
|
81
|
+
FileStatResult,
|
|
82
|
+
FileMkdirParams,
|
|
83
|
+
FileMkdirResult,
|
|
84
|
+
} from "./file.js";
|
|
85
|
+
import { EnvSetParams, EnvSetResult, EnvListParams, EnvListResult, EnvDeleteParams, EnvDeleteResult } from "./env.js";
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* 方法注册表(design 全协议的单一事实来源)。
|
|
89
|
+
*
|
|
90
|
+
* 每个方法声明:
|
|
91
|
+
* - direction: 谁是 requester
|
|
92
|
+
* s2p = server → phonon (服务端下发操作)
|
|
93
|
+
* p2s = phonon → server (设备上报结果/事件/发现)
|
|
94
|
+
* - kind: "request"(需响应)| "notification"(无响应)
|
|
95
|
+
* - params / result 的 zod schema
|
|
96
|
+
*
|
|
97
|
+
* core 与 client-sdk 都 import 本表,确保两端对齐、可机器校验。
|
|
98
|
+
*/
|
|
99
|
+
|
|
100
|
+
const z_void = z.undefined();
|
|
101
|
+
|
|
102
|
+
export const METHODS = {
|
|
103
|
+
// --- 握手(phonon 拨出后先发)---
|
|
104
|
+
"connect.hello": {
|
|
105
|
+
direction: "p2s",
|
|
106
|
+
kind: "request",
|
|
107
|
+
params: ConnectHelloParams,
|
|
108
|
+
result: ConnectWelcomeResult,
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
// --- 设备级信息与可观测(server 查询)---
|
|
112
|
+
"device.info": {
|
|
113
|
+
direction: "s2p",
|
|
114
|
+
kind: "request",
|
|
115
|
+
params: DeviceInfoParams,
|
|
116
|
+
result: DeviceInfoResult,
|
|
117
|
+
},
|
|
118
|
+
"device.resources": {
|
|
119
|
+
direction: "s2p",
|
|
120
|
+
kind: "request",
|
|
121
|
+
params: DeviceResourcesParams,
|
|
122
|
+
result: DeviceResourcesResult,
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
// --- 发现(server 查询;phonon 主动推变更)---
|
|
126
|
+
"discovery.list": {
|
|
127
|
+
direction: "s2p",
|
|
128
|
+
kind: "request",
|
|
129
|
+
params: DiscoveryListParams,
|
|
130
|
+
result: DiscoveryListResult,
|
|
131
|
+
},
|
|
132
|
+
"discovery.get": {
|
|
133
|
+
direction: "s2p",
|
|
134
|
+
kind: "request",
|
|
135
|
+
params: DiscoveryGetParams,
|
|
136
|
+
result: DiscoveryGetResult,
|
|
137
|
+
},
|
|
138
|
+
"discovery.changed": {
|
|
139
|
+
direction: "p2s",
|
|
140
|
+
kind: "notification",
|
|
141
|
+
params: DiscoveryChangedParams,
|
|
142
|
+
result: z_void,
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
// --- session 原语(server 下发)---
|
|
146
|
+
"session.create": {
|
|
147
|
+
direction: "s2p",
|
|
148
|
+
kind: "request",
|
|
149
|
+
params: SessionCreateParams,
|
|
150
|
+
result: SessionCreateResult,
|
|
151
|
+
},
|
|
152
|
+
"session.send": {
|
|
153
|
+
direction: "s2p",
|
|
154
|
+
kind: "request",
|
|
155
|
+
params: SessionSendParams,
|
|
156
|
+
result: SessionSendAck,
|
|
157
|
+
},
|
|
158
|
+
"session.inject": {
|
|
159
|
+
direction: "s2p",
|
|
160
|
+
kind: "request",
|
|
161
|
+
params: SessionInjectParams,
|
|
162
|
+
result: SessionInjectResult,
|
|
163
|
+
},
|
|
164
|
+
"session.compress": {
|
|
165
|
+
direction: "s2p",
|
|
166
|
+
kind: "request",
|
|
167
|
+
params: SessionCompressParams,
|
|
168
|
+
result: SessionCompressResult,
|
|
169
|
+
},
|
|
170
|
+
"session.switchModel": {
|
|
171
|
+
direction: "s2p",
|
|
172
|
+
kind: "request",
|
|
173
|
+
params: SessionSwitchModelParams,
|
|
174
|
+
result: SessionSwitchModelResult,
|
|
175
|
+
},
|
|
176
|
+
"session.interrupt": {
|
|
177
|
+
direction: "s2p",
|
|
178
|
+
kind: "request",
|
|
179
|
+
params: SessionInterruptParams,
|
|
180
|
+
result: SessionInterruptResult,
|
|
181
|
+
},
|
|
182
|
+
"session.terminate": {
|
|
183
|
+
direction: "s2p",
|
|
184
|
+
kind: "request",
|
|
185
|
+
params: SessionTerminateParams,
|
|
186
|
+
result: SessionTerminateResult,
|
|
187
|
+
},
|
|
188
|
+
"session.status": {
|
|
189
|
+
direction: "s2p",
|
|
190
|
+
kind: "request",
|
|
191
|
+
params: SessionStatusParams,
|
|
192
|
+
result: SessionStatusResult,
|
|
193
|
+
},
|
|
194
|
+
"session.list": {
|
|
195
|
+
direction: "s2p",
|
|
196
|
+
kind: "request",
|
|
197
|
+
params: SessionListParams,
|
|
198
|
+
result: SessionListResult,
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
// --- 流式结果(phonon 上推;无响应)---
|
|
202
|
+
"stream.event": {
|
|
203
|
+
direction: "p2s",
|
|
204
|
+
kind: "notification",
|
|
205
|
+
params: StreamEvent,
|
|
206
|
+
result: z_void,
|
|
207
|
+
},
|
|
208
|
+
// --- 流式 ack(server 确认 seq,phonon 据此清 outbox,P0-4)---
|
|
209
|
+
"stream.ack": {
|
|
210
|
+
direction: "s2p",
|
|
211
|
+
kind: "notification",
|
|
212
|
+
params: StreamAckParams,
|
|
213
|
+
result: z_void,
|
|
214
|
+
},
|
|
215
|
+
|
|
216
|
+
// --- hook / HITL ---
|
|
217
|
+
"hook.fired": {
|
|
218
|
+
direction: "p2s",
|
|
219
|
+
kind: "request", // phonon 发起、阻塞等 server 裁决
|
|
220
|
+
params: HookFiredParams,
|
|
221
|
+
result: HookResolveResult,
|
|
222
|
+
},
|
|
223
|
+
"hook.resolve": {
|
|
224
|
+
direction: "s2p",
|
|
225
|
+
kind: "request",
|
|
226
|
+
params: HookResolveParams,
|
|
227
|
+
result: HookResolveResult,
|
|
228
|
+
},
|
|
229
|
+
|
|
230
|
+
// --- 文档交换(agent emit 指令 → phonon 读本地文件 → 上传,平面③ / D20)---
|
|
231
|
+
"document.send": {
|
|
232
|
+
direction: "p2s",
|
|
233
|
+
kind: "request",
|
|
234
|
+
params: DocumentSendParams,
|
|
235
|
+
result: DocumentSendResult,
|
|
236
|
+
},
|
|
237
|
+
"document.prepare_upload": {
|
|
238
|
+
direction: "p2s",
|
|
239
|
+
kind: "request", // 大文件凭证上传(P1-6)
|
|
240
|
+
params: DocumentPrepareUploadParams,
|
|
241
|
+
result: DocumentPrepareUploadResult,
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
// --- 人机交互(表单/卡片,agent主动或HITL发起,平面③ / D21)---
|
|
245
|
+
"interaction.request": {
|
|
246
|
+
direction: "p2s",
|
|
247
|
+
kind: "request", // blocking 时阻塞等人回填
|
|
248
|
+
params: InteractionRequestParams,
|
|
249
|
+
result: InteractionRequestResult,
|
|
250
|
+
},
|
|
251
|
+
"interaction.response": {
|
|
252
|
+
direction: "s2p",
|
|
253
|
+
kind: "notification", // 异步/非阻塞回填走这条
|
|
254
|
+
params: InteractionResponseParams,
|
|
255
|
+
result: z_void,
|
|
256
|
+
},
|
|
257
|
+
"interaction.cancel": {
|
|
258
|
+
direction: "s2p",
|
|
259
|
+
kind: "request", // 主动取消一个 pending 交互(P1-5)
|
|
260
|
+
params: InteractionCancelParams,
|
|
261
|
+
result: InteractionCancelResult,
|
|
262
|
+
},
|
|
263
|
+
|
|
264
|
+
// --- 项目管理(目录 + Git;server 下发,D23)---
|
|
265
|
+
"project.create": {
|
|
266
|
+
direction: "s2p",
|
|
267
|
+
kind: "request",
|
|
268
|
+
params: ProjectCreateParams,
|
|
269
|
+
result: ProjectCreateResult,
|
|
270
|
+
},
|
|
271
|
+
"project.list": {
|
|
272
|
+
direction: "s2p",
|
|
273
|
+
kind: "request",
|
|
274
|
+
params: ProjectListParams,
|
|
275
|
+
result: ProjectListResult,
|
|
276
|
+
},
|
|
277
|
+
"project.get": {
|
|
278
|
+
direction: "s2p",
|
|
279
|
+
kind: "request",
|
|
280
|
+
params: ProjectGetParams,
|
|
281
|
+
result: ProjectGetResult,
|
|
282
|
+
},
|
|
283
|
+
"project.remove": {
|
|
284
|
+
direction: "s2p",
|
|
285
|
+
kind: "request",
|
|
286
|
+
params: ProjectRemoveParams,
|
|
287
|
+
result: ProjectRemoveResult,
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
// --- worktree / git 子能力(D25)---
|
|
291
|
+
"project.worktree.create": {
|
|
292
|
+
direction: "s2p",
|
|
293
|
+
kind: "request",
|
|
294
|
+
params: WorktreeCreateParams,
|
|
295
|
+
result: WorktreeCreateResult,
|
|
296
|
+
},
|
|
297
|
+
"project.worktree.list": {
|
|
298
|
+
direction: "s2p",
|
|
299
|
+
kind: "request",
|
|
300
|
+
params: WorktreeListParams,
|
|
301
|
+
result: WorktreeListResult,
|
|
302
|
+
},
|
|
303
|
+
"project.worktree.remove": {
|
|
304
|
+
direction: "s2p",
|
|
305
|
+
kind: "request",
|
|
306
|
+
params: WorktreeRemoveParams,
|
|
307
|
+
result: WorktreeRemoveResult,
|
|
308
|
+
},
|
|
309
|
+
"project.git.deleteBranch": {
|
|
310
|
+
direction: "s2p",
|
|
311
|
+
kind: "request",
|
|
312
|
+
params: GitDeleteBranchParams,
|
|
313
|
+
result: GitDeleteBranchResult,
|
|
314
|
+
},
|
|
315
|
+
|
|
316
|
+
// --- 受控工作区文件读写(server 下发,project/worktree scoped)---
|
|
317
|
+
"file.read": {
|
|
318
|
+
direction: "s2p",
|
|
319
|
+
kind: "request",
|
|
320
|
+
params: FileReadParams,
|
|
321
|
+
result: FileReadResult,
|
|
322
|
+
},
|
|
323
|
+
"file.write": {
|
|
324
|
+
direction: "s2p",
|
|
325
|
+
kind: "request",
|
|
326
|
+
params: FileWriteParams,
|
|
327
|
+
result: FileWriteResult,
|
|
328
|
+
},
|
|
329
|
+
"file.list": {
|
|
330
|
+
direction: "s2p",
|
|
331
|
+
kind: "request",
|
|
332
|
+
params: FileListParams,
|
|
333
|
+
result: FileListResult,
|
|
334
|
+
},
|
|
335
|
+
"file.stat": {
|
|
336
|
+
direction: "s2p",
|
|
337
|
+
kind: "request",
|
|
338
|
+
params: FileStatParams,
|
|
339
|
+
result: FileStatResult,
|
|
340
|
+
},
|
|
341
|
+
"file.mkdir": {
|
|
342
|
+
direction: "s2p",
|
|
343
|
+
kind: "request",
|
|
344
|
+
params: FileMkdirParams,
|
|
345
|
+
result: FileMkdirResult,
|
|
346
|
+
},
|
|
347
|
+
|
|
348
|
+
// --- 环境变量配置(skill/agent 运行环境,默认脱敏)---
|
|
349
|
+
"env.set": {
|
|
350
|
+
direction: "s2p",
|
|
351
|
+
kind: "request",
|
|
352
|
+
params: EnvSetParams,
|
|
353
|
+
result: EnvSetResult,
|
|
354
|
+
},
|
|
355
|
+
"env.list": {
|
|
356
|
+
direction: "s2p",
|
|
357
|
+
kind: "request",
|
|
358
|
+
params: EnvListParams,
|
|
359
|
+
result: EnvListResult,
|
|
360
|
+
},
|
|
361
|
+
"env.delete": {
|
|
362
|
+
direction: "s2p",
|
|
363
|
+
kind: "request",
|
|
364
|
+
params: EnvDeleteParams,
|
|
365
|
+
result: EnvDeleteResult,
|
|
366
|
+
},
|
|
367
|
+
|
|
368
|
+
// --- skill 管理(给 agent 装/卸 skill,global|project 两级,D24)---
|
|
369
|
+
"skill.install": {
|
|
370
|
+
direction: "s2p",
|
|
371
|
+
kind: "request",
|
|
372
|
+
params: SkillInstallParams,
|
|
373
|
+
result: SkillInstallResult,
|
|
374
|
+
},
|
|
375
|
+
"skill.uninstall": {
|
|
376
|
+
direction: "s2p",
|
|
377
|
+
kind: "request",
|
|
378
|
+
params: SkillUninstallParams,
|
|
379
|
+
result: SkillUninstallResult,
|
|
380
|
+
},
|
|
381
|
+
"skill.list": {
|
|
382
|
+
direction: "s2p",
|
|
383
|
+
kind: "request",
|
|
384
|
+
params: SkillListParams,
|
|
385
|
+
result: SkillListResult,
|
|
386
|
+
},
|
|
387
|
+
} as const;
|
|
388
|
+
|
|
389
|
+
export type MethodName = keyof typeof METHODS;
|
|
390
|
+
export type MethodSpec = (typeof METHODS)[MethodName];
|
|
391
|
+
|
|
392
|
+
/** 取某方法的 params 类型。 */
|
|
393
|
+
export type ParamsOf<M extends MethodName> = z.infer<(typeof METHODS)[M]["params"]>;
|
|
394
|
+
/** 取某方法的 result 类型。 */
|
|
395
|
+
export type ResultOf<M extends MethodName> = z.infer<(typeof METHODS)[M]["result"]>;
|
|
396
|
+
|
|
397
|
+
/** 运行时校验某方法的 params。 */
|
|
398
|
+
export function parseParams<M extends MethodName>(
|
|
399
|
+
method: M,
|
|
400
|
+
data: unknown,
|
|
401
|
+
): ParamsOf<M> {
|
|
402
|
+
return METHODS[method].params.parse(data) as ParamsOf<M>;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/** 运行时校验某方法的 result。 */
|
|
406
|
+
export function parseResult<M extends MethodName>(
|
|
407
|
+
method: M,
|
|
408
|
+
data: unknown,
|
|
409
|
+
): ResultOf<M> {
|
|
410
|
+
return METHODS[method].result.parse(data) as ResultOf<M>;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/** 全部方法名(运行时数组)。 */
|
|
414
|
+
export const METHOD_NAMES = Object.keys(METHODS) as MethodName[];
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AgentId, ProjectId } from "./common.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 本地安全策略(design D27 / review P0-1)。
|
|
6
|
+
*
|
|
7
|
+
* phonon 不做终端用户鉴权(那是服务端的事),但**必须有设备主人配置的本地授权边界**——
|
|
8
|
+
* 否则任意接入的 server 都能让本地 agent 读任意文件、装任意 skill、删 worktree。
|
|
9
|
+
*
|
|
10
|
+
* 这是「设备 policy」,不是「用户鉴权」。每个 tenant 一份,phonon 在执行前据此拦截。
|
|
11
|
+
* 这些是本地配置,不进 device→server 的线协议;放协议包是为了类型共享与校验。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** 单个 tenant 的本地授权边界。 */
|
|
15
|
+
export const TenantPolicy = z.object({
|
|
16
|
+
/** 允许操作的项目根目录白名单(绝对路径)。document/project 路径必须落在其下。 */
|
|
17
|
+
allowedProjectRoots: z.array(z.string()).default([]),
|
|
18
|
+
/** 允许使用的 agent 白名单;空 = 不限制。 */
|
|
19
|
+
allowedAgents: z.array(AgentId).default([]),
|
|
20
|
+
/** 允许的方法白名单;空 = 全允许。用它可表达「只读租户」(只放查询类方法)。 */
|
|
21
|
+
allowedMethods: z.array(z.string()).default([]),
|
|
22
|
+
/** 是否允许全局 skill 安装(影响该 agent 所有项目,危险)。默认 false。 */
|
|
23
|
+
allowGlobalSkillInstall: z.boolean().default(false),
|
|
24
|
+
/** 是否允许从 url 安装 skill(供应链入口,危险)。默认 false。 */
|
|
25
|
+
allowUrlSkillInstall: z.boolean().default(false),
|
|
26
|
+
/** 是否允许物理删盘(project.remove deleteFiles / worktree force 等)。默认 false。 */
|
|
27
|
+
allowDeleteFiles: z.boolean().default(false),
|
|
28
|
+
/** document.send 是否允许发送项目/worktree 目录之外的文件。默认 false(project-scoped)。 */
|
|
29
|
+
allowExternalDocuments: z.boolean().default(false),
|
|
30
|
+
/** env.list reveal=true 是否允许返回环境变量明文。默认 false(只能脱敏查看)。 */
|
|
31
|
+
allowEnvReveal: z.boolean().default(false),
|
|
32
|
+
/** 单文件上传上限(字节);超出走 prepare_upload 或拒绝。 */
|
|
33
|
+
maxUploadBytes: z.number().int().positive().optional(),
|
|
34
|
+
/** 敏感路径黑名单(即使在 allowedProjectRoots 内也拒绝,如 .ssh/.aws/.env)。 */
|
|
35
|
+
denyPathPatterns: z.array(z.string()).default([
|
|
36
|
+
"**/.ssh/**",
|
|
37
|
+
"**/.aws/**",
|
|
38
|
+
"**/.env",
|
|
39
|
+
"**/.git/config",
|
|
40
|
+
"**/id_rsa*",
|
|
41
|
+
"**/*.pem",
|
|
42
|
+
"**/openclaw.json",
|
|
43
|
+
]),
|
|
44
|
+
});
|
|
45
|
+
export type TenantPolicy = z.infer<typeof TenantPolicy>;
|
|
46
|
+
|
|
47
|
+
/** policy 默认值(最严格:白名单空、写操作全关)。 */
|
|
48
|
+
export const DEFAULT_TENANT_POLICY: TenantPolicy = TenantPolicy.parse({});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 校验一个绝对路径是否落在某项目根白名单内(不含 deny 匹配)。
|
|
52
|
+
* 真实 glob/deny 匹配由 core 实现;这里给协议层一个轻量前缀检查骨架。
|
|
53
|
+
*/
|
|
54
|
+
export function isPathUnderRoots(absPath: string, roots: readonly string[]): boolean {
|
|
55
|
+
if (roots.length === 0) return false;
|
|
56
|
+
const norm = absPath.replace(/\\/g, "/");
|
|
57
|
+
return roots.some((r) => {
|
|
58
|
+
const root = r.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
59
|
+
return norm === root || norm.startsWith(root + "/");
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** policy 拒绝时的归一化结果(core 用,便于回 errPolicyDenied)。 */
|
|
64
|
+
export const PolicyDecision = z.object({
|
|
65
|
+
allowed: z.boolean(),
|
|
66
|
+
/** 拒绝原因(如 "path_outside_project" / "url_skill_disabled" / "delete_not_allowed")。 */
|
|
67
|
+
reason: z.string().optional(),
|
|
68
|
+
/** 关联 projectId(若适用)。 */
|
|
69
|
+
projectId: ProjectId.optional(),
|
|
70
|
+
});
|
|
71
|
+
export type PolicyDecision = z.infer<typeof PolicyDecision>;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ProjectId, Timestamp } from "./common.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 项目管理协议(design D23)。
|
|
6
|
+
*
|
|
7
|
+
* 一个项目 = 一个目录 + Git。所有 session 必须绑定一个项目(projectId)。
|
|
8
|
+
* 项目是磁盘上的客观目录,**设备级共享、不受 tenant 隔离**——不同 tenant 都能看到/用
|
|
9
|
+
* 同一项目,在其下各干各的;冲突风险用户自担。(隔离发生在会话/任务层,不在文件层。)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** 项目描述。 */
|
|
13
|
+
export const ProjectDescriptor = z.object({
|
|
14
|
+
projectId: ProjectId,
|
|
15
|
+
/** 展示名。 */
|
|
16
|
+
name: z.string().min(1),
|
|
17
|
+
/** 项目目录的绝对路径(设备本地)。 */
|
|
18
|
+
path: z.string().min(1),
|
|
19
|
+
/** 是否已 git init。 */
|
|
20
|
+
git: z.boolean().default(true),
|
|
21
|
+
/** 当前分支(若有)。 */
|
|
22
|
+
branch: z.string().optional(),
|
|
23
|
+
/** 可选:远端 URL。 */
|
|
24
|
+
remote: z.string().optional(),
|
|
25
|
+
createdAt: Timestamp,
|
|
26
|
+
});
|
|
27
|
+
export type ProjectDescriptor = z.infer<typeof ProjectDescriptor>;
|
|
28
|
+
|
|
29
|
+
// --- project.create ---
|
|
30
|
+
export const ProjectCreateParams = z.object({
|
|
31
|
+
/** 可选:幂等键(P0-3)。 */
|
|
32
|
+
clientRequestId: z.string().optional(),
|
|
33
|
+
name: z.string().min(1),
|
|
34
|
+
/**
|
|
35
|
+
* 可选:指定目录路径。缺省由 phonon 在受控工作区下按 name 生成
|
|
36
|
+
* (避免服务端越权指定任意本地路径)。
|
|
37
|
+
*/
|
|
38
|
+
path: z.string().optional(),
|
|
39
|
+
/** 是否 git init(默认 true,项目 = 目录 + Git)。 */
|
|
40
|
+
git: z.boolean().default(true),
|
|
41
|
+
/** 可选:初始化时设置的远端。 */
|
|
42
|
+
remote: z.string().optional(),
|
|
43
|
+
});
|
|
44
|
+
export type ProjectCreateParams = z.infer<typeof ProjectCreateParams>;
|
|
45
|
+
|
|
46
|
+
export const ProjectCreateResult = z.object({
|
|
47
|
+
project: ProjectDescriptor,
|
|
48
|
+
});
|
|
49
|
+
export type ProjectCreateResult = z.infer<typeof ProjectCreateResult>;
|
|
50
|
+
|
|
51
|
+
// --- project.list ---
|
|
52
|
+
export const ProjectListParams = z.object({}).default({});
|
|
53
|
+
export type ProjectListParams = z.infer<typeof ProjectListParams>;
|
|
54
|
+
|
|
55
|
+
export const ProjectListResult = z.object({
|
|
56
|
+
projects: z.array(ProjectDescriptor),
|
|
57
|
+
});
|
|
58
|
+
export type ProjectListResult = z.infer<typeof ProjectListResult>;
|
|
59
|
+
|
|
60
|
+
// --- project.get ---
|
|
61
|
+
export const ProjectGetParams = z.object({ projectId: ProjectId });
|
|
62
|
+
export type ProjectGetParams = z.infer<typeof ProjectGetParams>;
|
|
63
|
+
|
|
64
|
+
export const ProjectGetResult = z.object({ project: ProjectDescriptor });
|
|
65
|
+
export type ProjectGetResult = z.infer<typeof ProjectGetResult>;
|
|
66
|
+
|
|
67
|
+
// --- project.remove ---
|
|
68
|
+
export const ProjectRemoveParams = z.object({
|
|
69
|
+
projectId: ProjectId,
|
|
70
|
+
/**
|
|
71
|
+
* 是否删除物理目录。默认 false(仅从 phonon 解绑/注销,保留磁盘文件,防误删)。
|
|
72
|
+
* true 才真正删目录——危险操作,需 policy allowDeleteFiles。
|
|
73
|
+
*/
|
|
74
|
+
deleteFiles: z.boolean().default(false),
|
|
75
|
+
/**
|
|
76
|
+
* 有 active session 绑定本项目时的处理(P1-7 / Minimax#5):
|
|
77
|
+
* - reject(默认):还有 active session → errProjectHasActiveSessions
|
|
78
|
+
* - cascade :级联 terminate 所有 active session 再移除
|
|
79
|
+
*/
|
|
80
|
+
whenActiveSessions: z.enum(["reject", "cascade"]).default("reject"),
|
|
81
|
+
});
|
|
82
|
+
export type ProjectRemoveParams = z.infer<typeof ProjectRemoveParams>;
|
|
83
|
+
|
|
84
|
+
export const ProjectRemoveResult = z.object({
|
|
85
|
+
projectId: ProjectId,
|
|
86
|
+
removed: z.literal(true),
|
|
87
|
+
filesDeleted: z.boolean(),
|
|
88
|
+
/** cascade 时被级联 terminate 的 session。 */
|
|
89
|
+
terminatedSessions: z.array(z.string()).optional(),
|
|
90
|
+
});
|
|
91
|
+
export type ProjectRemoveResult = z.infer<typeof ProjectRemoveResult>;
|
|
92
|
+
|
|
93
|
+
// ===========================================================================
|
|
94
|
+
// Git / worktree 子能力(D25)
|
|
95
|
+
// worktree = 同一仓库的多个工作目录,天然适配「多 tenant/session 在同一项目各干各的」。
|
|
96
|
+
// ===========================================================================
|
|
97
|
+
|
|
98
|
+
/** worktree 描述。 */
|
|
99
|
+
export const WorktreeDescriptor = z.object({
|
|
100
|
+
/** worktree 标识(phonon 生成)。 */
|
|
101
|
+
worktreeId: z.string().min(1),
|
|
102
|
+
projectId: ProjectId,
|
|
103
|
+
/** worktree 的工作目录路径。 */
|
|
104
|
+
path: z.string().min(1),
|
|
105
|
+
/** 该 worktree 检出的分支。 */
|
|
106
|
+
branch: z.string().min(1),
|
|
107
|
+
/** 是否是主工作区(项目本体目录)。 */
|
|
108
|
+
isPrimary: z.boolean().default(false),
|
|
109
|
+
createdAt: Timestamp.optional(),
|
|
110
|
+
});
|
|
111
|
+
export type WorktreeDescriptor = z.infer<typeof WorktreeDescriptor>;
|
|
112
|
+
|
|
113
|
+
// --- project.worktree.create:基于某 branch 创建 worktree ---
|
|
114
|
+
export const WorktreeCreateParams = z.object({
|
|
115
|
+
/** 可选:幂等键(P0-3)。 */
|
|
116
|
+
clientRequestId: z.string().optional(),
|
|
117
|
+
projectId: ProjectId,
|
|
118
|
+
/** 基于哪个已有 branch 创建(检出点)。 */
|
|
119
|
+
baseBranch: z.string().min(1),
|
|
120
|
+
/**
|
|
121
|
+
* 可选:新建并检出的分支名。缺省则直接检出 baseBranch
|
|
122
|
+
* (注:同一 branch 不能被两个 worktree 同时检出,所以多开并发时通常传 newBranch)。
|
|
123
|
+
*/
|
|
124
|
+
newBranch: z.string().optional(),
|
|
125
|
+
/** 可选:指定 worktree 路径;缺省由 phonon 在受控区生成。 */
|
|
126
|
+
path: z.string().optional(),
|
|
127
|
+
});
|
|
128
|
+
export type WorktreeCreateParams = z.infer<typeof WorktreeCreateParams>;
|
|
129
|
+
|
|
130
|
+
export const WorktreeCreateResult = z.object({
|
|
131
|
+
worktree: WorktreeDescriptor,
|
|
132
|
+
});
|
|
133
|
+
export type WorktreeCreateResult = z.infer<typeof WorktreeCreateResult>;
|
|
134
|
+
|
|
135
|
+
// --- project.worktree.list ---
|
|
136
|
+
export const WorktreeListParams = z.object({ projectId: ProjectId });
|
|
137
|
+
export type WorktreeListParams = z.infer<typeof WorktreeListParams>;
|
|
138
|
+
|
|
139
|
+
export const WorktreeListResult = z.object({
|
|
140
|
+
worktrees: z.array(WorktreeDescriptor),
|
|
141
|
+
});
|
|
142
|
+
export type WorktreeListResult = z.infer<typeof WorktreeListResult>;
|
|
143
|
+
|
|
144
|
+
// --- project.worktree.remove:清理 worktree ---
|
|
145
|
+
export const WorktreeRemoveParams = z.object({
|
|
146
|
+
projectId: ProjectId,
|
|
147
|
+
worktreeId: z.string().min(1),
|
|
148
|
+
/**
|
|
149
|
+
* 是否强制清理(P1-7)。默认 false:
|
|
150
|
+
* 有未提交变更 → errWorktreeHasChanges;还有 active/running session 绑定 → errWorktreeInUse。
|
|
151
|
+
* force=true 才允许硬删,但会连带影响返回 affectedSessions。
|
|
152
|
+
*/
|
|
153
|
+
force: z.boolean().default(false),
|
|
154
|
+
});
|
|
155
|
+
export type WorktreeRemoveParams = z.infer<typeof WorktreeRemoveParams>;
|
|
156
|
+
|
|
157
|
+
export const WorktreeRemoveResult = z.object({
|
|
158
|
+
worktreeId: z.string(),
|
|
159
|
+
removed: z.literal(true),
|
|
160
|
+
/** 被连带影响(被迫 terminate)的 session(force 硬删时)。 */
|
|
161
|
+
affectedSessions: z.array(z.string()).optional(),
|
|
162
|
+
});
|
|
163
|
+
export type WorktreeRemoveResult = z.infer<typeof WorktreeRemoveResult>;
|
|
164
|
+
|
|
165
|
+
// --- project.git.deleteBranch:删除(已合并的)branch ---
|
|
166
|
+
export const GitDeleteBranchParams = z.object({
|
|
167
|
+
projectId: ProjectId,
|
|
168
|
+
branch: z.string().min(1),
|
|
169
|
+
/**
|
|
170
|
+
* 是否强制删除(P1-7)。默认 false:
|
|
171
|
+
* 未合并 → errBranchNotMerged;仍被某 worktree 检出 → errBranchInUse。
|
|
172
|
+
* force=true 强删未合并(git branch -D),返回 affectedWorktrees。
|
|
173
|
+
*/
|
|
174
|
+
force: z.boolean().default(false),
|
|
175
|
+
});
|
|
176
|
+
export type GitDeleteBranchParams = z.infer<typeof GitDeleteBranchParams>;
|
|
177
|
+
|
|
178
|
+
export const GitDeleteBranchResult = z.object({
|
|
179
|
+
branch: z.string(),
|
|
180
|
+
deleted: z.literal(true),
|
|
181
|
+
wasMerged: z.boolean().optional(),
|
|
182
|
+
/** 被连带影响的 worktree(force 硬删时)。 */
|
|
183
|
+
affectedWorktrees: z.array(z.string()).optional(),
|
|
184
|
+
});
|
|
185
|
+
export type GitDeleteBranchResult = z.infer<typeof GitDeleteBranchResult>;
|