@dyrra/protocol 0.1.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/dist/rpc.d.ts ADDED
@@ -0,0 +1,433 @@
1
+ import { z } from "zod";
2
+ import { Scope } from "./common.js";
3
+ /**
4
+ * Протокол gateway ↔ Dyrra Agent.app поверх исходящего WSS (ТЗ 7.9, 7.10).
5
+ * JSON-фреймы для управления, бинарные — для данных.
6
+ */
7
+ export declare const RpcMethod: z.ZodEnum<{
8
+ "actions.perform": "actions.perform";
9
+ "apps.activate": "apps.activate";
10
+ "apps.list": "apps.list";
11
+ "apps.open": "apps.open";
12
+ "clipboard.get": "clipboard.get";
13
+ "clipboard.set": "clipboard.set";
14
+ "connection.grant": "connection.grant";
15
+ "connection.revoke": "connection.revoke";
16
+ "cursor.position": "cursor.position";
17
+ "display.info": "display.info";
18
+ "files.download": "files.download";
19
+ "files.upload.begin": "files.upload.begin";
20
+ "files.upload.chunk": "files.upload.chunk";
21
+ "files.upload.end": "files.upload.end";
22
+ heartbeat: "heartbeat";
23
+ hello: "hello";
24
+ "permissions.get": "permissions.get";
25
+ "queue.offer": "queue.offer";
26
+ screenshot: "screenshot";
27
+ "shell.run": "shell.run";
28
+ "system.reboot": "system.reboot";
29
+ "ui.tree": "ui.tree";
30
+ "urls.open": "urls.open";
31
+ "vnc.close": "vnc.close";
32
+ "vnc.open": "vnc.open";
33
+ "windows.list": "windows.list";
34
+ }>;
35
+ export type RpcMethod = z.infer<typeof RpcMethod>;
36
+ /** Методы, доступные только на облачных Mac (ТЗ 7.10). */
37
+ export declare const CLOUD_ONLY_METHODS: RpcMethod[];
38
+ /** Право, необходимое для каждого метода. Приложение проверяет это локально (ТЗ 3.4). */
39
+ export declare const METHOD_SCOPE: Partial<Record<RpcMethod, Scope>>;
40
+ export declare const RpcRequest: z.ZodObject<{
41
+ id: z.ZodString;
42
+ method: z.ZodEnum<{
43
+ "actions.perform": "actions.perform";
44
+ "apps.activate": "apps.activate";
45
+ "apps.list": "apps.list";
46
+ "apps.open": "apps.open";
47
+ "clipboard.get": "clipboard.get";
48
+ "clipboard.set": "clipboard.set";
49
+ "connection.grant": "connection.grant";
50
+ "connection.revoke": "connection.revoke";
51
+ "cursor.position": "cursor.position";
52
+ "display.info": "display.info";
53
+ "files.download": "files.download";
54
+ "files.upload.begin": "files.upload.begin";
55
+ "files.upload.chunk": "files.upload.chunk";
56
+ "files.upload.end": "files.upload.end";
57
+ heartbeat: "heartbeat";
58
+ hello: "hello";
59
+ "permissions.get": "permissions.get";
60
+ "queue.offer": "queue.offer";
61
+ screenshot: "screenshot";
62
+ "shell.run": "shell.run";
63
+ "system.reboot": "system.reboot";
64
+ "ui.tree": "ui.tree";
65
+ "urls.open": "urls.open";
66
+ "vnc.close": "vnc.close";
67
+ "vnc.open": "vnc.open";
68
+ "windows.list": "windows.list";
69
+ }>;
70
+ connectionId: z.ZodOptional<z.ZodString>;
71
+ params: z.ZodOptional<z.ZodUnknown>;
72
+ }, z.core.$strip>;
73
+ export type RpcRequest = z.infer<typeof RpcRequest>;
74
+ export declare const RpcErrorBody: z.ZodObject<{
75
+ code: z.ZodString;
76
+ message: z.ZodString;
77
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
78
+ }, z.core.$strip>;
79
+ export declare const RpcResponse: z.ZodObject<{
80
+ id: z.ZodString;
81
+ result: z.ZodOptional<z.ZodUnknown>;
82
+ error: z.ZodOptional<z.ZodObject<{
83
+ code: z.ZodString;
84
+ message: z.ZodString;
85
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
86
+ }, z.core.$strip>>;
87
+ }, z.core.$strip>;
88
+ export type RpcResponse = z.infer<typeof RpcResponse>;
89
+ /** События от приложения к gateway (без id, ответа не ждут). */
90
+ export declare const MachineEventType: z.ZodEnum<{
91
+ availability_changed: "availability_changed";
92
+ connection_revoked: "connection_revoked";
93
+ paused: "paused";
94
+ permissions_changed: "permissions_changed";
95
+ queued_commands_ack: "queued_commands_ack";
96
+ recording_ready: "recording_ready";
97
+ resumed: "resumed";
98
+ }>;
99
+ export type MachineEventType = z.infer<typeof MachineEventType>;
100
+ export declare const MachineEvent: z.ZodObject<{
101
+ event: z.ZodEnum<{
102
+ availability_changed: "availability_changed";
103
+ connection_revoked: "connection_revoked";
104
+ paused: "paused";
105
+ permissions_changed: "permissions_changed";
106
+ queued_commands_ack: "queued_commands_ack";
107
+ recording_ready: "recording_ready";
108
+ resumed: "resumed";
109
+ }>;
110
+ connectionId: z.ZodOptional<z.ZodString>;
111
+ data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
112
+ }, z.core.$strip>;
113
+ export type MachineEvent = z.infer<typeof MachineEvent>;
114
+ /**
115
+ * Команды, дождавшиеся пробуждения Mac (ТЗ 7.16).
116
+ *
117
+ * Gateway предлагает их приложению, а приложение по настройке человека
118
+ * отвечает событием queued_commands_ack. Текст, который агент собирается
119
+ * ввести, в описание не попадает.
120
+ */
121
+ export declare const QueueOffer: z.ZodObject<{
122
+ connectionId: z.ZodString;
123
+ platformName: z.ZodString;
124
+ commands: z.ZodArray<z.ZodObject<{
125
+ commandId: z.ZodString;
126
+ type: z.ZodString;
127
+ summary: z.ZodString;
128
+ expiresAt: z.ZodString;
129
+ }, z.core.$strip>>;
130
+ }, z.core.$strip>;
131
+ export type QueueOffer = z.infer<typeof QueueOffer>;
132
+ /** Решение приложения по предложенным командам. */
133
+ export declare const QueueAck: z.ZodObject<{
134
+ accepted: z.ZodDefault<z.ZodArray<z.ZodString>>;
135
+ declined: z.ZodDefault<z.ZodArray<z.ZodString>>;
136
+ }, z.core.$strip>;
137
+ export type QueueAck = z.infer<typeof QueueAck>;
138
+ export declare const Heartbeat: z.ZodObject<{
139
+ appVersion: z.ZodString;
140
+ macosVersion: z.ZodString;
141
+ mode: z.ZodEnum<{
142
+ cloud: "cloud";
143
+ connected: "connected";
144
+ vm: "vm";
145
+ }>;
146
+ permissions: z.ZodObject<{
147
+ screenRecording: z.ZodBoolean;
148
+ accessibility: z.ZodBoolean;
149
+ }, z.core.$strip>;
150
+ display: z.ZodNullable<z.ZodObject<{
151
+ widthPoints: z.ZodNumber;
152
+ heightPoints: z.ZodNumber;
153
+ scaleFactor: z.ZodNumber;
154
+ displayId: z.ZodNumber;
155
+ }, z.core.$strip>>;
156
+ paused: z.ZodBoolean;
157
+ availability: z.ZodEnum<{
158
+ asleep: "asleep";
159
+ no_gui_session: "no_gui_session";
160
+ ready: "ready";
161
+ screen_locked: "screen_locked";
162
+ }>;
163
+ cpu: z.ZodOptional<z.ZodNumber>;
164
+ memUsedMb: z.ZodOptional<z.ZodNumber>;
165
+ diskFreeGb: z.ZodOptional<z.ZodNumber>;
166
+ hiddenAppCount: z.ZodDefault<z.ZodNumber>;
167
+ }, z.core.$strip>;
168
+ export type Heartbeat = z.infer<typeof Heartbeat>;
169
+ export declare const HelloParams: z.ZodObject<{
170
+ appVersion: z.ZodString;
171
+ macosVersion: z.ZodString;
172
+ mode: z.ZodEnum<{
173
+ cloud: "cloud";
174
+ connected: "connected";
175
+ vm: "vm";
176
+ }>;
177
+ }, z.core.$strip>;
178
+ export declare const ConnectionGrant: z.ZodObject<{
179
+ connectionId: z.ZodString;
180
+ platformName: z.ZodString;
181
+ scopes: z.ZodArray<z.ZodEnum<{
182
+ clipboard: "clipboard";
183
+ files: "files";
184
+ input: "input";
185
+ record: "record";
186
+ screen: "screen";
187
+ shell: "shell";
188
+ }>>;
189
+ }, z.core.$strip>;
190
+ export type ConnectionGrant = z.infer<typeof ConnectionGrant>;
191
+ /** Параметры и результаты по методам — используются роутером на обеих сторонах. */
192
+ export declare const RPC_PARAMS: {
193
+ readonly hello: z.ZodObject<{
194
+ appVersion: z.ZodString;
195
+ macosVersion: z.ZodString;
196
+ mode: z.ZodEnum<{
197
+ cloud: "cloud";
198
+ connected: "connected";
199
+ vm: "vm";
200
+ }>;
201
+ }, z.core.$strip>;
202
+ readonly heartbeat: z.ZodObject<{
203
+ appVersion: z.ZodString;
204
+ macosVersion: z.ZodString;
205
+ mode: z.ZodEnum<{
206
+ cloud: "cloud";
207
+ connected: "connected";
208
+ vm: "vm";
209
+ }>;
210
+ permissions: z.ZodObject<{
211
+ screenRecording: z.ZodBoolean;
212
+ accessibility: z.ZodBoolean;
213
+ }, z.core.$strip>;
214
+ display: z.ZodNullable<z.ZodObject<{
215
+ widthPoints: z.ZodNumber;
216
+ heightPoints: z.ZodNumber;
217
+ scaleFactor: z.ZodNumber;
218
+ displayId: z.ZodNumber;
219
+ }, z.core.$strip>>;
220
+ paused: z.ZodBoolean;
221
+ availability: z.ZodEnum<{
222
+ asleep: "asleep";
223
+ no_gui_session: "no_gui_session";
224
+ ready: "ready";
225
+ screen_locked: "screen_locked";
226
+ }>;
227
+ cpu: z.ZodOptional<z.ZodNumber>;
228
+ memUsedMb: z.ZodOptional<z.ZodNumber>;
229
+ diskFreeGb: z.ZodOptional<z.ZodNumber>;
230
+ hiddenAppCount: z.ZodDefault<z.ZodNumber>;
231
+ }, z.core.$strip>;
232
+ readonly screenshot: z.ZodObject<{
233
+ format: z.ZodDefault<z.ZodEnum<{
234
+ jpeg: "jpeg";
235
+ png: "png";
236
+ }>>;
237
+ quality: z.ZodDefault<z.ZodNumber>;
238
+ maxWidth: z.ZodOptional<z.ZodNumber>;
239
+ response: z.ZodDefault<z.ZodEnum<{
240
+ base64: "base64";
241
+ binary: "binary";
242
+ }>>;
243
+ }, z.core.$strip>;
244
+ readonly "actions.perform": z.ZodObject<{
245
+ actions: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
246
+ type: z.ZodLiteral<"move">;
247
+ x: z.ZodNumber;
248
+ y: z.ZodNumber;
249
+ }, z.core.$strip>, z.ZodObject<{
250
+ type: z.ZodLiteral<"click">;
251
+ x: z.ZodNumber;
252
+ y: z.ZodNumber;
253
+ button: z.ZodDefault<z.ZodEnum<{
254
+ left: "left";
255
+ middle: "middle";
256
+ right: "right";
257
+ }>>;
258
+ count: z.ZodDefault<z.ZodNumber>;
259
+ modifiers: z.ZodDefault<z.ZodArray<z.ZodEnum<{
260
+ alt: "alt";
261
+ cmd: "cmd";
262
+ ctrl: "ctrl";
263
+ fn: "fn";
264
+ shift: "shift";
265
+ }>>>;
266
+ }, z.core.$strip>, z.ZodObject<{
267
+ type: z.ZodLiteral<"mouse_down">;
268
+ x: z.ZodNumber;
269
+ y: z.ZodNumber;
270
+ button: z.ZodDefault<z.ZodEnum<{
271
+ left: "left";
272
+ middle: "middle";
273
+ right: "right";
274
+ }>>;
275
+ }, z.core.$strip>, z.ZodObject<{
276
+ type: z.ZodLiteral<"mouse_up">;
277
+ x: z.ZodNumber;
278
+ y: z.ZodNumber;
279
+ button: z.ZodDefault<z.ZodEnum<{
280
+ left: "left";
281
+ middle: "middle";
282
+ right: "right";
283
+ }>>;
284
+ }, z.core.$strip>, z.ZodObject<{
285
+ type: z.ZodLiteral<"drag">;
286
+ from: z.ZodObject<{
287
+ x: z.ZodNumber;
288
+ y: z.ZodNumber;
289
+ }, z.core.$strip>;
290
+ to: z.ZodObject<{
291
+ x: z.ZodNumber;
292
+ y: z.ZodNumber;
293
+ }, z.core.$strip>;
294
+ button: z.ZodDefault<z.ZodEnum<{
295
+ left: "left";
296
+ middle: "middle";
297
+ right: "right";
298
+ }>>;
299
+ durationMs: z.ZodDefault<z.ZodNumber>;
300
+ }, z.core.$strip>, z.ZodObject<{
301
+ type: z.ZodLiteral<"scroll">;
302
+ x: z.ZodNumber;
303
+ y: z.ZodNumber;
304
+ dx: z.ZodDefault<z.ZodNumber>;
305
+ dy: z.ZodDefault<z.ZodNumber>;
306
+ }, z.core.$strip>, z.ZodObject<{
307
+ type: z.ZodLiteral<"type">;
308
+ text: z.ZodString;
309
+ }, z.core.$strip>, z.ZodObject<{
310
+ type: z.ZodLiteral<"key">;
311
+ keys: z.ZodArray<z.ZodString>;
312
+ }, z.core.$strip>, z.ZodObject<{
313
+ type: z.ZodLiteral<"wait">;
314
+ ms: z.ZodNumber;
315
+ }, z.core.$strip>, z.ZodObject<{
316
+ type: z.ZodLiteral<"click_element">;
317
+ snapshotId: z.ZodString;
318
+ elementId: z.ZodString;
319
+ }, z.core.$strip>, z.ZodObject<{
320
+ type: z.ZodLiteral<"set_value">;
321
+ snapshotId: z.ZodString;
322
+ elementId: z.ZodString;
323
+ text: z.ZodString;
324
+ }, z.core.$strip>], "type">>;
325
+ expectBundleId: z.ZodOptional<z.ZodString>;
326
+ }, z.core.$strip>;
327
+ readonly "ui.tree": z.ZodObject<{
328
+ scope: z.ZodDefault<z.ZodEnum<{
329
+ all_windows: "all_windows";
330
+ frontmost: "frontmost";
331
+ menu_bar: "menu_bar";
332
+ }>>;
333
+ interactiveOnly: z.ZodDefault<z.ZodBoolean>;
334
+ format: z.ZodDefault<z.ZodEnum<{
335
+ compact: "compact";
336
+ json: "json";
337
+ }>>;
338
+ }, z.core.$strip>;
339
+ readonly "shell.run": z.ZodObject<{
340
+ command: z.ZodString;
341
+ cwd: z.ZodOptional<z.ZodString>;
342
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
343
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
344
+ }, z.core.$strip>;
345
+ readonly "files.upload.begin": z.ZodObject<{
346
+ path: z.ZodString;
347
+ sizeBytes: z.ZodNumber;
348
+ sha256: z.ZodString;
349
+ }, z.core.$strip>;
350
+ readonly "urls.open": z.ZodObject<{
351
+ url: z.ZodString;
352
+ }, z.core.$strip>;
353
+ readonly "clipboard.set": z.ZodObject<{
354
+ text: z.ZodString;
355
+ }, z.core.$strip>;
356
+ readonly "connection.grant": z.ZodObject<{
357
+ connectionId: z.ZodString;
358
+ platformName: z.ZodString;
359
+ scopes: z.ZodArray<z.ZodEnum<{
360
+ clipboard: "clipboard";
361
+ files: "files";
362
+ input: "input";
363
+ record: "record";
364
+ screen: "screen";
365
+ shell: "shell";
366
+ }>>;
367
+ }, z.core.$strip>;
368
+ readonly "connection.revoke": z.ZodObject<{
369
+ connectionId: z.ZodString;
370
+ }, z.core.$strip>;
371
+ };
372
+ export declare const RPC_RESULTS: {
373
+ readonly screenshot: z.ZodObject<{
374
+ mime: z.ZodString;
375
+ data: z.ZodString;
376
+ imageWidth: z.ZodNumber;
377
+ imageHeight: z.ZodNumber;
378
+ widthPoints: z.ZodNumber;
379
+ heightPoints: z.ZodNumber;
380
+ scale: z.ZodNumber;
381
+ }, z.core.$strip>;
382
+ readonly "display.info": z.ZodObject<{
383
+ widthPoints: z.ZodNumber;
384
+ heightPoints: z.ZodNumber;
385
+ scaleFactor: z.ZodNumber;
386
+ displayId: z.ZodNumber;
387
+ }, z.core.$strip>;
388
+ readonly "permissions.get": z.ZodObject<{
389
+ screenRecording: z.ZodBoolean;
390
+ accessibility: z.ZodBoolean;
391
+ }, z.core.$strip>;
392
+ readonly "ui.tree": z.ZodObject<{
393
+ snapshotId: z.ZodString;
394
+ app: z.ZodNullable<z.ZodObject<{
395
+ bundleId: z.ZodString;
396
+ name: z.ZodString;
397
+ }, z.core.$strip>>;
398
+ elements: z.ZodArray<z.ZodObject<{
399
+ id: z.ZodString;
400
+ role: z.ZodString;
401
+ subrole: z.ZodOptional<z.ZodString>;
402
+ title: z.ZodOptional<z.ZodString>;
403
+ description: z.ZodOptional<z.ZodString>;
404
+ value: z.ZodOptional<z.ZodString>;
405
+ identifier: z.ZodOptional<z.ZodString>;
406
+ frame: z.ZodObject<{
407
+ x: z.ZodNumber;
408
+ y: z.ZodNumber;
409
+ w: z.ZodNumber;
410
+ h: z.ZodNumber;
411
+ }, z.core.$strip>;
412
+ enabled: z.ZodBoolean;
413
+ focused: z.ZodBoolean;
414
+ actions: z.ZodDefault<z.ZodArray<z.ZodString>>;
415
+ }, z.core.$strip>>;
416
+ compact: z.ZodOptional<z.ZodString>;
417
+ truncated: z.ZodDefault<z.ZodBoolean>;
418
+ }, z.core.$strip>;
419
+ readonly "shell.run": z.ZodObject<{
420
+ exitCode: z.ZodNumber;
421
+ stdout: z.ZodString;
422
+ stderr: z.ZodString;
423
+ durationMs: z.ZodNumber;
424
+ truncated: z.ZodBoolean;
425
+ timedOut: z.ZodBoolean;
426
+ }, z.core.$strip>;
427
+ readonly "clipboard.get": z.ZodObject<{
428
+ text: z.ZodString;
429
+ }, z.core.$strip>;
430
+ };
431
+ export declare const HEARTBEAT_INTERVAL_MS = 15000;
432
+ export declare const OFFLINE_AFTER_MS = 45000;
433
+ //# sourceMappingURL=rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAA0C,KAAK,EAAE,MAAM,aAAa,CAAC;AAU5E;;;GAGG;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BM,CAAC;AAC7B,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAElD,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB,EAAE,SAAS,EAA+C,CAAC;AAE1F,yFAAyF;AACzF,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAiB1D,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQM,CAAC;AAC9B,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,eAAO,MAAM,YAAY;;;;iBAMM,CAAC;AAEhC,eAAO,MAAM,WAAW;;;;;;;;iBAMM,CAAC;AAC/B,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,gEAAgE;AAChE,eAAO,MAAM,gBAAgB;;;;;;;;EAUM,CAAC;AACpC,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,YAAY;;;;;;;;;;;;iBAMM,CAAC;AAChC,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD;;;;;;GAMG;AACH,eAAO,MAAM,UAAU;;;;;;;;;iBAaM,CAAC;AAC9B,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD,mDAAmD;AACnD,eAAO,MAAM,QAAQ;;;iBAKM,CAAC;AAC5B,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcM,CAAC;AAC7B,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAElD,eAAO,MAAM,WAAW;;;;;;;;iBAMM,CAAC;AAE/B,eAAO,MAAM,eAAe;;;;;;;;;;;iBAMM,CAAC;AACnC,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,mFAAmF;AACnF,eAAO,MAAM,UAAU;aACrB,KAAK;;;;;;;;;aACL,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACT,UAAU;;;;;;;;;;;;aACV,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAIjB,SAAS;;;;;;;;;;;;aACT,WAAW;;;;;;aACX,oBAAoB;;;;;aACpB,WAAW;;;aACX,eAAe;;;aACf,kBAAkB;;;;;;;;;;;;aAClB,mBAAmB;;;CACX,CAAC;AAEX,eAAO,MAAM,WAAW;aACtB,UAAU;;;;;;;;;aACV,cAAc;;;;;;aACd,iBAAiB;;;;aACjB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;aACT,WAAW;;;;;;;;aACX,eAAe;;;CACP,CAAC;AAEX,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAC5C,eAAO,MAAM,gBAAgB,QAAS,CAAC"}
package/dist/rpc.js ADDED
@@ -0,0 +1,185 @@
1
+ import { z } from "zod";
2
+ import { Action } from "./actions.js";
3
+ import { Availability, DisplayInfo, Permissions, Scope } from "./common.js";
4
+ import { ClipboardText, FileUploadBegin, OpenUrlRequest, ShellRequest, ShellResult, } from "./system.js";
5
+ import { Screenshot, ScreenshotRequest, UiTree, UiTreeRequest } from "./screen.js";
6
+ /**
7
+ * Протокол gateway ↔ Dyrra Agent.app поверх исходящего WSS (ТЗ 7.9, 7.10).
8
+ * JSON-фреймы для управления, бинарные — для данных.
9
+ */
10
+ export const RpcMethod = z
11
+ .enum([
12
+ "hello",
13
+ "heartbeat",
14
+ "display.info",
15
+ "permissions.get",
16
+ "screenshot",
17
+ "actions.perform",
18
+ "cursor.position",
19
+ "ui.tree",
20
+ "shell.run",
21
+ "files.upload.begin",
22
+ "files.upload.chunk",
23
+ "files.upload.end",
24
+ "files.download",
25
+ "apps.open",
26
+ "apps.activate",
27
+ "apps.list",
28
+ "windows.list",
29
+ "urls.open",
30
+ "clipboard.get",
31
+ "clipboard.set",
32
+ "connection.grant",
33
+ "connection.revoke",
34
+ "queue.offer",
35
+ "vnc.open",
36
+ "vnc.close",
37
+ "system.reboot",
38
+ ])
39
+ .meta({ id: "RpcMethod" });
40
+ /** Методы, доступные только на облачных Mac (ТЗ 7.10). */
41
+ export const CLOUD_ONLY_METHODS = ["vnc.open", "vnc.close", "system.reboot"];
42
+ /** Право, необходимое для каждого метода. Приложение проверяет это локально (ТЗ 3.4). */
43
+ export const METHOD_SCOPE = {
44
+ screenshot: "screen",
45
+ "ui.tree": "screen",
46
+ "windows.list": "screen",
47
+ "actions.perform": "input",
48
+ "cursor.position": "screen",
49
+ "apps.open": "input",
50
+ "apps.activate": "input",
51
+ "apps.list": "screen",
52
+ "urls.open": "input",
53
+ "shell.run": "shell",
54
+ "files.upload.begin": "files",
55
+ "files.upload.chunk": "files",
56
+ "files.upload.end": "files",
57
+ "files.download": "files",
58
+ "clipboard.get": "clipboard",
59
+ "clipboard.set": "clipboard",
60
+ };
61
+ export const RpcRequest = z
62
+ .object({
63
+ id: z.string(),
64
+ method: RpcMethod,
65
+ /** Подключение, от имени которого идёт вызов. Приложение сверяет его права. */
66
+ connectionId: z.string().optional(),
67
+ params: z.unknown().optional(),
68
+ })
69
+ .meta({ id: "RpcRequest" });
70
+ export const RpcErrorBody = z
71
+ .object({
72
+ code: z.string(),
73
+ message: z.string(),
74
+ details: z.record(z.string(), z.unknown()).optional(),
75
+ })
76
+ .meta({ id: "RpcErrorBody" });
77
+ export const RpcResponse = z
78
+ .object({
79
+ id: z.string(),
80
+ result: z.unknown().optional(),
81
+ error: RpcErrorBody.optional(),
82
+ })
83
+ .meta({ id: "RpcResponse" });
84
+ /** События от приложения к gateway (без id, ответа не ждут). */
85
+ export const MachineEventType = z
86
+ .enum([
87
+ "paused",
88
+ "resumed",
89
+ "permissions_changed",
90
+ "availability_changed",
91
+ "connection_revoked",
92
+ "recording_ready",
93
+ "queued_commands_ack",
94
+ ])
95
+ .meta({ id: "MachineEventType" });
96
+ export const MachineEvent = z
97
+ .object({
98
+ event: MachineEventType,
99
+ connectionId: z.string().optional(),
100
+ data: z.record(z.string(), z.unknown()).optional(),
101
+ })
102
+ .meta({ id: "MachineEvent" });
103
+ /**
104
+ * Команды, дождавшиеся пробуждения Mac (ТЗ 7.16).
105
+ *
106
+ * Gateway предлагает их приложению, а приложение по настройке человека
107
+ * отвечает событием queued_commands_ack. Текст, который агент собирается
108
+ * ввести, в описание не попадает.
109
+ */
110
+ export const QueueOffer = z
111
+ .object({
112
+ connectionId: z.string(),
113
+ platformName: z.string(),
114
+ commands: z.array(z.object({
115
+ commandId: z.string(),
116
+ type: z.string(),
117
+ summary: z.string(),
118
+ expiresAt: z.string(),
119
+ })),
120
+ })
121
+ .meta({ id: "QueueOffer" });
122
+ /** Решение приложения по предложенным командам. */
123
+ export const QueueAck = z
124
+ .object({
125
+ accepted: z.array(z.string()).default([]),
126
+ declined: z.array(z.string()).default([]),
127
+ })
128
+ .meta({ id: "QueueAck" });
129
+ export const Heartbeat = z
130
+ .object({
131
+ appVersion: z.string(),
132
+ macosVersion: z.string(),
133
+ mode: z.enum(["connected", "cloud", "vm"]),
134
+ permissions: Permissions,
135
+ display: DisplayInfo.nullable(),
136
+ paused: z.boolean(),
137
+ availability: Availability,
138
+ cpu: z.number().min(0).max(100).optional(),
139
+ memUsedMb: z.number().int().nonnegative().optional(),
140
+ diskFreeGb: z.number().nonnegative().optional(),
141
+ hiddenAppCount: z.number().int().nonnegative().default(0),
142
+ })
143
+ .meta({ id: "Heartbeat" });
144
+ export const HelloParams = z
145
+ .object({
146
+ appVersion: z.string(),
147
+ macosVersion: z.string(),
148
+ mode: z.enum(["connected", "cloud", "vm"]),
149
+ })
150
+ .meta({ id: "HelloParams" });
151
+ export const ConnectionGrant = z
152
+ .object({
153
+ connectionId: z.string(),
154
+ platformName: z.string(),
155
+ scopes: z.array(Scope),
156
+ })
157
+ .meta({ id: "ConnectionGrant" });
158
+ /** Параметры и результаты по методам — используются роутером на обеих сторонах. */
159
+ export const RPC_PARAMS = {
160
+ hello: HelloParams,
161
+ heartbeat: Heartbeat,
162
+ screenshot: ScreenshotRequest,
163
+ "actions.perform": z.object({
164
+ actions: z.array(Action).min(1).max(50),
165
+ expectBundleId: z.string().min(1).max(255).optional(),
166
+ }),
167
+ "ui.tree": UiTreeRequest,
168
+ "shell.run": ShellRequest,
169
+ "files.upload.begin": FileUploadBegin,
170
+ "urls.open": OpenUrlRequest,
171
+ "clipboard.set": ClipboardText,
172
+ "connection.grant": ConnectionGrant,
173
+ "connection.revoke": z.object({ connectionId: z.string() }),
174
+ };
175
+ export const RPC_RESULTS = {
176
+ screenshot: Screenshot,
177
+ "display.info": DisplayInfo,
178
+ "permissions.get": Permissions,
179
+ "ui.tree": UiTree,
180
+ "shell.run": ShellResult,
181
+ "clipboard.get": ClipboardText,
182
+ };
183
+ export const HEARTBEAT_INTERVAL_MS = 15_000;
184
+ export const OFFLINE_AFTER_MS = 45_000;
185
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}