@ai-matrx/desktop-protocol 0.1.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/dist/index.js ADDED
@@ -0,0 +1,853 @@
1
+ // src/schema/primitives.ts
2
+ import { z } from "zod";
3
+ var PROTOCOL_MAJOR = 1;
4
+ var PROTOCOL_MINOR = 0;
5
+ var ProtocolVersion = z.string().regex(/^[1-9][0-9]{0,2}\.[0-9]{1,3}$/);
6
+ var RequestId = z.string().min(1).max(64).regex(/^[A-Za-z0-9_-]+$/);
7
+ var ResourceId = z.string().regex(/^(pty|watch)_[A-Za-z0-9]{16,40}$/);
8
+ var DeviceId = z.string().regex(/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/);
9
+ var AbsPath = z.string().min(1).max(4096).regex(/^(\/|[A-Za-z]:\/)[^\\\u0000]*$/);
10
+ var u32 = z.int().min(0).max(4294967295);
11
+ var nonNegInt = z.int().min(0);
12
+ var epochMs = z.int().min(0);
13
+
14
+ // src/schema/errors.ts
15
+ import { z as z2 } from "zod";
16
+ var ErrorCode = z2.enum([
17
+ "AUTH_REQUIRED",
18
+ "AUTH_INVALID",
19
+ "AUTH_EXPIRED",
20
+ "AUTH_FORBIDDEN",
21
+ // signed in, but not this device's owner
22
+ "AUTH_DEVICE_REVOKED",
23
+ // kill switch
24
+ "PERMISSION_DENIED_OS",
25
+ "NOT_FOUND",
26
+ "CONFLICT",
27
+ "INVALID_PARAMS",
28
+ "RESOURCE_BUSY",
29
+ "RESOURCE_GONE",
30
+ "CANCELLED",
31
+ "TIMEOUT",
32
+ "PLATFORM_UNSUPPORTED",
33
+ "RATE_LIMITED",
34
+ "INTERNAL",
35
+ "PROTOCOL_VERSION_UNSUPPORTED",
36
+ // NEW: hello refused, carries data.upgrade
37
+ "PROTOCOL_ERROR",
38
+ // NEW: malformed envelope/frame, credit overrun, unknown sid
39
+ "UNKNOWN_OPERATION",
40
+ // NEW: cap.op not served by this core version
41
+ "DEVICE_OFFLINE",
42
+ // NEW: relay has no live device socket (retryable)
43
+ "PAYLOAD_TOO_LARGE"
44
+ // NEW: message or frame above limits.max_*_bytes
45
+ ]);
46
+ var ErrorReason = z2.enum([
47
+ "not_a_directory",
48
+ "is_a_directory",
49
+ "directory_not_empty",
50
+ "already_exists",
51
+ "stale_write",
52
+ // fs.write if_match_mtime_ms mismatch → CONFLICT
53
+ "binary_content",
54
+ // utf8 read of non-UTF-8 bytes → INVALID_PARAMS
55
+ "not_utf8_boundary",
56
+ "patch_no_match",
57
+ "patch_ambiguous",
58
+ "resource_exited",
59
+ "resource_expired",
60
+ "control_taken",
61
+ // another client of the same user took control
62
+ "window_exhausted"
63
+ ]);
64
+ var ProtocolErrorBody = z2.strictObject({
65
+ code: ErrorCode,
66
+ message: z2.string().max(300),
67
+ // short, human, never a stack trace or a token
68
+ retryable: z2.boolean(),
69
+ data: z2.strictObject({
70
+ reason: ErrorReason.optional(),
71
+ cap: z2.string().max(32).optional(),
72
+ op: z2.string().max(64).optional(),
73
+ path: AbsPath.optional(),
74
+ settings_url: z2.string().max(512).optional(),
75
+ // PERMISSION_DENIED_OS deep link
76
+ retry_after_ms: nonNegInt.optional(),
77
+ limit_bytes: nonNegInt.optional(),
78
+ upgrade: z2.strictObject({
79
+ min_version: ProtocolVersion,
80
+ max_version: ProtocolVersion,
81
+ download_url: z2.url().optional()
82
+ }).optional()
83
+ }).optional()
84
+ });
85
+
86
+ // src/schema/frame.ts
87
+ import { z as z3 } from "zod";
88
+
89
+ // src/error.ts
90
+ var DesktopProtocolError = class extends Error {
91
+ code;
92
+ retryable;
93
+ data;
94
+ constructor(code, message, options = {}) {
95
+ super(message, options.cause === void 0 ? void 0 : { cause: options.cause });
96
+ this.name = "DesktopProtocolError";
97
+ this.code = code;
98
+ this.retryable = options.retryable ?? false;
99
+ this.data = options.data;
100
+ }
101
+ /** The wire body (ProtocolErrorBody) — what a core or relay sends for this error. */
102
+ toBody() {
103
+ return this.data === void 0 ? { code: this.code, message: this.message, retryable: this.retryable } : { code: this.code, message: this.message, retryable: this.retryable, data: this.data };
104
+ }
105
+ };
106
+ function isDesktopProtocolError(value) {
107
+ return value instanceof DesktopProtocolError || value instanceof Error && value.name === "DesktopProtocolError" && "code" in value;
108
+ }
109
+
110
+ // src/frame.ts
111
+ var FRAME_HEADER_BYTES = 16;
112
+ var FRAME_VERSION = 1;
113
+ var FRAME_STRUCT_FORMAT = ">BBBBIII";
114
+ var FrameFlag = { FIN: 1, REPLAY: 2 };
115
+ var FrameChannel = {
116
+ /** core→client: pty output, fs.read_stream bytes */
117
+ DATA: 0,
118
+ /** core→client: stderr of a non-pty process (reserved for exec.spawn in v1.1) */
119
+ STDERR: 1,
120
+ /** client→core: keystrokes / stdin to sid */
121
+ STDIN: 2,
122
+ /** core→client: serialized terminal screen (attach when since_seq is outside the ring) */
123
+ SNAPSHOT: 3,
124
+ /** relay↔device hop only: a JSON envelope carried inside a binary frame so the relay can route
125
+ * by cid without parsing JSON. Never seen by clients. */
126
+ ENVELOPE: 255
127
+ };
128
+ var U32_MAX = 4294967295;
129
+ var CHANNELS = new Set(Object.values(FrameChannel));
130
+ function frameError(message) {
131
+ return new DesktopProtocolError("PROTOCOL_ERROR", message);
132
+ }
133
+ function checkU32(name, value) {
134
+ if (!Number.isInteger(value) || value < 0 || value > U32_MAX) throw frameError(`frame ${name} is not a u32: ${value}`);
135
+ }
136
+ function assertFrameHeader(h) {
137
+ if (h.version !== FRAME_VERSION) throw frameError(`unsupported frame version ${String(h.version)}`);
138
+ if (!Number.isInteger(h.flags) || h.flags < 0 || h.flags > 3) throw frameError(`reserved frame flag bits set: ${h.flags}`);
139
+ if (!CHANNELS.has(h.channel)) throw frameError(`unknown frame channel ${String(h.channel)}`);
140
+ checkU32("cid", h.cid);
141
+ checkU32("sid", h.sid);
142
+ checkU32("seq", h.seq);
143
+ }
144
+ function encodeFrame(h, payload) {
145
+ assertFrameHeader(h);
146
+ const out = new Uint8Array(FRAME_HEADER_BYTES + payload.byteLength);
147
+ const v = new DataView(out.buffer);
148
+ v.setUint8(0, h.version);
149
+ v.setUint8(1, h.flags);
150
+ v.setUint8(2, h.channel);
151
+ v.setUint8(3, 0);
152
+ v.setUint32(4, h.cid);
153
+ v.setUint32(8, h.sid);
154
+ v.setUint32(12, h.seq);
155
+ out.set(payload, FRAME_HEADER_BYTES);
156
+ return out;
157
+ }
158
+ function decodeFrame(buf) {
159
+ const bytes = buf instanceof Uint8Array ? buf : new Uint8Array(buf);
160
+ if (bytes.byteLength < FRAME_HEADER_BYTES) throw frameError(`short frame: ${bytes.byteLength} bytes`);
161
+ const v = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
162
+ if (v.getUint8(3) !== 0) throw frameError("reserved frame byte 3 is not 0");
163
+ const header = {
164
+ version: v.getUint8(0),
165
+ flags: v.getUint8(1),
166
+ channel: v.getUint8(2),
167
+ cid: v.getUint32(4),
168
+ sid: v.getUint32(8),
169
+ seq: v.getUint32(12)
170
+ };
171
+ assertFrameHeader(header);
172
+ return { header, payload: bytes.subarray(FRAME_HEADER_BYTES) };
173
+ }
174
+ function readCid(frame) {
175
+ if (frame.byteLength < FRAME_HEADER_BYTES) throw frameError(`short frame: ${frame.byteLength} bytes`);
176
+ return new DataView(frame.buffer, frame.byteOffset, frame.byteLength).getUint32(4);
177
+ }
178
+ function stampCid(frame, cid) {
179
+ if (frame.byteLength < FRAME_HEADER_BYTES) throw frameError(`short frame: ${frame.byteLength} bytes`);
180
+ checkU32("cid", cid);
181
+ new DataView(frame.buffer, frame.byteOffset, frame.byteLength).setUint32(4, cid);
182
+ return frame;
183
+ }
184
+ function hasFlag(header, flag) {
185
+ return (header.flags & flag) !== 0;
186
+ }
187
+
188
+ // src/schema/frame.ts
189
+ var FrameHeader = z3.strictObject({
190
+ version: z3.literal(FRAME_VERSION),
191
+ flags: z3.int().min(0).max(3),
192
+ channel: z3.union([z3.literal(0), z3.literal(1), z3.literal(2), z3.literal(3), z3.literal(255)]),
193
+ cid: u32,
194
+ sid: u32,
195
+ seq: u32
196
+ });
197
+ var DEFAULT_WINDOW_BYTES = 262144;
198
+ var DEFAULT_MAX_FRAME_PAYLOAD_BYTES = 65536;
199
+ var DEFAULT_MAX_MESSAGE_BYTES = 8388608;
200
+
201
+ // src/schema/envelope.ts
202
+ import { z as z4 } from "zod";
203
+ var ClientType = z4.enum(["screen", "web", "extension", "server", "test"]);
204
+ var Limits = z4.strictObject({
205
+ max_message_bytes: z4.int().min(65536),
206
+ max_frame_payload_bytes: z4.int().min(4096),
207
+ default_window_bytes: z4.int().min(4096),
208
+ max_streams_per_client: z4.int().min(1),
209
+ max_resources_per_user: z4.int().min(1)
210
+ });
211
+ var OpDescriptor = z4.strictObject({ cap: z4.string().max(32), op: z4.string().max(64), since: ProtocolVersion });
212
+ var Welcome = z4.strictObject({
213
+ protocol_version: ProtocolVersion,
214
+ // negotiated = min(client, core) within the same major
215
+ session_id: z4.string().min(8).max(64),
216
+ client_id: z4.string().min(8).max(64),
217
+ // this connection's identity in the Session Manager
218
+ device_id: DeviceId,
219
+ device_name: z4.string().max(128),
220
+ app_version: z4.string().max(32),
221
+ platform: z4.enum(["darwin", "win32", "linux"]),
222
+ ops: z4.array(OpDescriptor),
223
+ limits: Limits,
224
+ server_time_ms: epochMs
225
+ });
226
+ var HelloMsg = z4.strictObject({
227
+ type: z4.literal("hello"),
228
+ id: RequestId,
229
+ // answered by response{id, result: Welcome} or error{id}
230
+ protocolVersion: ProtocolVersion,
231
+ clientType: ClientType,
232
+ clientVersion: z4.string().min(1).max(32)
233
+ });
234
+ var RequestMsg = z4.strictObject({
235
+ id: RequestId,
236
+ type: z4.literal("request"),
237
+ cap: z4.string().min(1).max(32),
238
+ op: z4.string().min(1).max(64),
239
+ params: z4.unknown()
240
+ // validated by the Router against OPS[cap.op].params — once, there
241
+ });
242
+ var ResponseMsg = z4.strictObject({ id: RequestId, type: z4.literal("response"), result: z4.unknown() });
243
+ var ErrorMsg = z4.strictObject({ id: RequestId, type: z4.literal("error"), error: ProtocolErrorBody });
244
+ var StreamMeta = z4.discriminatedUnion("kind", [
245
+ /** Binds request id → numeric sid; binary frames for this stream follow. */
246
+ z4.strictObject({
247
+ kind: z4.literal("open"),
248
+ sid: u32,
249
+ window_bytes: z4.int().min(4096),
250
+ resource_id: ResourceId.optional()
251
+ }),
252
+ /** Frames after this (channel SNAPSHOT) are a serialized screen; live DATA resumes after. */
253
+ z4.strictObject({ kind: z4.literal("snapshot"), cols: z4.int().min(1), rows: z4.int().min(1) }),
254
+ /** Frames [from_seq, to_seq] are gone from the ring; a snapshot follows. */
255
+ z4.strictObject({ kind: z4.literal("gap"), from_seq: u32, to_seq: u32 })
256
+ ]);
257
+ var StreamMsg = z4.strictObject({ id: RequestId, type: z4.literal("stream"), seq: u32, meta: StreamMeta });
258
+ var EndReason = z4.enum(["completed", "cancelled", "detached", "resource_exited", "error"]);
259
+ var EndMsg = z4.strictObject({ id: RequestId, type: z4.literal("end"), seq: u32, reason: EndReason.optional() });
260
+ var CancelMsg = z4.strictObject({ id: RequestId, type: z4.literal("cancel") });
261
+ var CreditMsg = z4.strictObject({ id: RequestId, type: z4.literal("credit"), n: z4.int().min(1).max(2147483647) });
262
+ var EventMsg = z4.strictObject({
263
+ type: z4.literal("event"),
264
+ cap: z4.string().min(1).max(32),
265
+ name: z4.string().min(1).max(64),
266
+ payload: z4.unknown(),
267
+ // validated against EVENTS[cap.name]
268
+ resourceId: ResourceId.optional()
269
+ });
270
+ var RelayMsg = z4.discriminatedUnion("op", [
271
+ /** Fresh access token before the current one expires (relay closes 4008 at exp + 60 s). */
272
+ z4.strictObject({ type: z4.literal("relay"), op: z4.literal("reauth"), token: z4.string().min(16).max(8192) })
273
+ ]);
274
+ var PING_TEXT = '{"type":"ping"}';
275
+ var PONG_TEXT = '{"type":"pong"}';
276
+ var ClientToCoreMsg = z4.discriminatedUnion("type", [HelloMsg, RequestMsg, CancelMsg, CreditMsg]);
277
+ var CoreToClientMsg = z4.discriminatedUnion("type", [ResponseMsg, ErrorMsg, StreamMsg, EndMsg, CreditMsg, EventMsg]);
278
+ var CloseCode = {
279
+ NORMAL: 1e3,
280
+ GOING_AWAY: 1001,
281
+ // relay deploy / app quit — reconnect immediately
282
+ AUTH_INVALID: 4001,
283
+ AUTH_FORBIDDEN: 4003,
284
+ DEVICE_NOT_FOUND: 4004,
285
+ AUTH_EXPIRED: 4008,
286
+ // no reauth before exp + 60 s
287
+ REPLACED: 4009,
288
+ // a newer device socket for the same device took over
289
+ DEVICE_REVOKED: 4010,
290
+ // kill switch — do NOT reconnect
291
+ PROTOCOL_ERROR: 4400,
292
+ UPGRADE_REQUIRED: 4426
293
+ };
294
+
295
+ // src/schema/sysinfo.ts
296
+ import { z as z5 } from "zod";
297
+ var OsPermissionName = z5.enum([
298
+ "full_disk_access",
299
+ "accessibility",
300
+ "screen_recording",
301
+ "microphone",
302
+ "camera",
303
+ "automation",
304
+ "contacts",
305
+ "calendars",
306
+ "photos",
307
+ "location",
308
+ "local_network",
309
+ "bluetooth",
310
+ "notifications"
311
+ ]);
312
+ var SysinfoGetParams = z5.strictObject({});
313
+ var SysinfoGetResult = z5.strictObject({
314
+ device_id: DeviceId,
315
+ device_name: z5.string().max(128),
316
+ hostname: z5.string().max(255),
317
+ platform: z5.enum(["darwin", "win32", "linux"]),
318
+ os_version: z5.string().max(64),
319
+ arch: z5.enum(["arm64", "x64"]),
320
+ app_version: z5.string().max(32),
321
+ protocol_version: ProtocolVersion,
322
+ user: z5.strictObject({ username: z5.string().max(128), shell: z5.string().max(512) }),
323
+ paths: z5.strictObject({
324
+ home: AbsPath,
325
+ desktop: AbsPath,
326
+ documents: AbsPath,
327
+ downloads: AbsPath,
328
+ app_data: AbsPath,
329
+ temp: AbsPath
330
+ }),
331
+ cpu: z5.strictObject({ model: z5.string().max(128), cores: z5.int().min(1) }),
332
+ memory: z5.strictObject({ total_bytes: nonNegInt, free_bytes: nonNegInt }),
333
+ uptime_seconds: nonNegInt,
334
+ on_battery: z5.boolean().nullable(),
335
+ sleep_prevented: z5.boolean(),
336
+ // true while any remote session holds the power blocker
337
+ permissions: z5.array(
338
+ z5.strictObject({
339
+ name: OsPermissionName,
340
+ state: z5.enum(["granted", "denied", "not_determined", "not_applicable"]),
341
+ settings_url: z5.string().max(512).nullable()
342
+ })
343
+ )
344
+ });
345
+
346
+ // src/schema/fs.ts
347
+ import { z as z6 } from "zod";
348
+ var FsKind = z6.enum(["file", "dir", "symlink"]);
349
+ var FsEntry = z6.strictObject({
350
+ name: z6.string().max(1024),
351
+ path: AbsPath,
352
+ kind: FsKind,
353
+ size: nonNegInt,
354
+ mtime: z6.number().min(0),
355
+ // seconds, float — daemon parity
356
+ mtime_ms: epochMs,
357
+ mode: z6.int().min(0).max(4095),
358
+ target: AbsPath.nullable(),
359
+ // symlink target, never followed
360
+ hidden: z6.boolean()
361
+ });
362
+ var FsListParams = z6.strictObject({
363
+ path: AbsPath,
364
+ recursive: z6.boolean().default(false),
365
+ depth: z6.int().min(1).max(32).default(1),
366
+ pattern: z6.string().max(256).optional(),
367
+ // glob on name
368
+ limit: z6.int().min(1).max(5e3).default(500),
369
+ page_token: z6.string().max(256).optional(),
370
+ show_hidden: z6.boolean().default(false),
371
+ sort: z6.enum(["name", "mtime", "size", "kind"]).default("kind")
372
+ });
373
+ var FsListResult = z6.strictObject({
374
+ entries: z6.array(FsEntry),
375
+ truncated: z6.boolean(),
376
+ next_page_token: z6.string().max(256).nullable(),
377
+ scanned: nonNegInt
378
+ });
379
+ var FsStatParams = z6.strictObject({ path: AbsPath });
380
+ var FsStatResult = FsEntry;
381
+ var FsEncoding = z6.enum(["utf8", "base64"]);
382
+ var FsReadParams = z6.strictObject({
383
+ path: AbsPath,
384
+ encoding: FsEncoding.default("utf8"),
385
+ offset: nonNegInt.default(0),
386
+ limit: z6.int().min(1).max(4194304).default(262144)
387
+ });
388
+ var FsReadResult = z6.strictObject({
389
+ content: z6.string(),
390
+ encoding: FsEncoding,
391
+ size: nonNegInt,
392
+ offset: nonNegInt,
393
+ next_offset: nonNegInt,
394
+ truncated: z6.boolean(),
395
+ mime: z6.string().max(128).nullable(),
396
+ mtime_ms: epochMs
397
+ // pass back as if_match_mtime_ms to guard a later write
398
+ });
399
+ var FsReadStreamParams = z6.strictObject({
400
+ path: AbsPath,
401
+ offset: nonNegInt.default(0),
402
+ length: nonNegInt.optional(),
403
+ // absent = to EOF
404
+ window_bytes: z6.int().min(4096).max(16777216).optional()
405
+ });
406
+ var FsReadStreamResult = z6.strictObject({ size: nonNegInt, mime: z6.string().max(128).nullable(), mtime_ms: epochMs });
407
+ var FsWriteParams = z6.strictObject({
408
+ path: AbsPath,
409
+ content: z6.string().max(5592406),
410
+ // ≤ 4 MiB of bytes after base64 decode
411
+ encoding: FsEncoding.default("utf8"),
412
+ mode: z6.int().min(0).max(4095).optional(),
413
+ create_parents: z6.boolean().default(false),
414
+ /** Optimistic concurrency: CONFLICT/stale_write if the file changed since this mtime. */
415
+ if_match_mtime_ms: epochMs.optional(),
416
+ /** Refuse to replace an existing file (CONFLICT/already_exists). */
417
+ exclusive: z6.boolean().default(false)
418
+ });
419
+ var FsWriteResult = z6.strictObject({ path: AbsPath, size: nonNegInt, mtime_ms: epochMs, created: z6.boolean() });
420
+ var FsMkdirParams = z6.strictObject({ path: AbsPath, parents: z6.boolean().default(false) });
421
+ var FsMkdirResult = z6.strictObject({ path: AbsPath, created: z6.boolean() });
422
+ var FsMoveParams = z6.strictObject({ from_path: AbsPath, to_path: AbsPath, overwrite: z6.boolean().default(false) });
423
+ var FsMoveResult = z6.strictObject({ from_path: AbsPath, to_path: AbsPath });
424
+ var FsDeleteParams = z6.strictObject({
425
+ path: AbsPath,
426
+ recursive: z6.boolean().default(false),
427
+ to_trash: z6.boolean().default(true)
428
+ });
429
+ var FsDeleteResult = z6.strictObject({ deleted: z6.literal(true), trashed_to: AbsPath.nullable() });
430
+ var FsWatchParams = z6.strictObject({
431
+ path: AbsPath,
432
+ recursive: z6.boolean().default(false),
433
+ ignore: z6.array(z6.string().max(256)).max(64).default([]),
434
+ debounce_ms: z6.int().min(0).max(5e3).default(50)
435
+ });
436
+ var FsWatchResult = z6.strictObject({ resource_id: ResourceId, path: AbsPath });
437
+ var FsPatchParams = z6.strictObject({
438
+ path: AbsPath,
439
+ edits: z6.array(
440
+ z6.strictObject({
441
+ old_text: z6.string(),
442
+ new_text: z6.string(),
443
+ replace_all: z6.boolean().default(false)
444
+ })
445
+ ).min(1).max(256),
446
+ create_if_missing: z6.boolean().default(false)
447
+ });
448
+ var FsPatchResult = z6.strictObject({ path: AbsPath, applied: nonNegInt, size: nonNegInt, mtime_ms: epochMs });
449
+ var FsSearchPathsParams = z6.strictObject({
450
+ pattern: z6.string().min(1).max(512),
451
+ cwd: AbsPath,
452
+ hidden: z6.boolean().default(false),
453
+ max_results: z6.int().min(1).max(5e3).default(100)
454
+ });
455
+ var FsSearchPathsResult = z6.strictObject({ paths: z6.array(AbsPath), truncated: z6.boolean() });
456
+ var FsSearchContentParams = z6.strictObject({
457
+ query: z6.string().min(1).max(1024),
458
+ cwd: AbsPath,
459
+ regex: z6.boolean().default(true),
460
+ case_sensitive: z6.boolean().default(false),
461
+ include: z6.array(z6.string().max(256)).max(64).optional(),
462
+ exclude: z6.array(z6.string().max(256)).max(64).optional(),
463
+ max_results: z6.int().min(1).max(5e3).default(100)
464
+ });
465
+ var FsSearchContentResult = z6.strictObject({
466
+ results: z6.array(
467
+ z6.strictObject({
468
+ path: AbsPath,
469
+ lines: z6.string(),
470
+ line_number: z6.int().min(1),
471
+ submatches: z6.array(z6.strictObject({ match: z6.string(), start: nonNegInt, end: nonNegInt }))
472
+ })
473
+ ),
474
+ truncated: z6.boolean()
475
+ });
476
+ var FsChange = z6.strictObject({
477
+ type: z6.enum(["created", "modified", "deleted", "moved"]),
478
+ path: AbsPath,
479
+ to_path: AbsPath.optional(),
480
+ kind: z6.enum(["file", "dir", "symlink", "unknown"])
481
+ });
482
+ var FsChangedEvent = z6.strictObject({ changes: z6.array(FsChange).min(1).max(1e3), overflow: z6.boolean() });
483
+
484
+ // src/schema/exec.ts
485
+ import { z as z7 } from "zod";
486
+ var Signal = z7.enum(["SIGINT", "SIGTERM", "SIGKILL", "SIGHUP", "SIGQUIT", "SIGTSTP", "SIGCONT", "SIGUSR1", "SIGUSR2"]);
487
+ var cols = z7.int().min(2).max(1e3);
488
+ var rows = z7.int().min(1).max(500);
489
+ var ExecPtyStartParams = z7.strictObject({
490
+ cols,
491
+ rows,
492
+ cwd: AbsPath.optional(),
493
+ // default: home
494
+ shell: z7.string().max(512).optional(),
495
+ // default: user's login shell (PowerShell on Windows)
496
+ args: z7.array(z7.string().max(4096)).max(64).optional(),
497
+ env: z7.record(z7.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).max(128), z7.string().max(32768)).optional(),
498
+ name: z7.string().max(64).optional(),
499
+ // tab label
500
+ window_bytes: z7.int().min(4096).max(16777216).optional()
501
+ });
502
+ var PtyInfo = z7.strictObject({
503
+ resource_id: ResourceId,
504
+ pid: z7.int().min(1),
505
+ shell: z7.string().max(512),
506
+ cwd: AbsPath,
507
+ // live, from OSC 7 / process cwd
508
+ title: z7.string().max(256),
509
+ name: z7.string().max(64).nullable(),
510
+ cols,
511
+ rows,
512
+ state: z7.enum(["running", "exited"]),
513
+ exit_code: z7.int().nullable(),
514
+ exit_signal: Signal.nullable(),
515
+ last_seq: u32,
516
+ created_at_ms: epochMs,
517
+ controller_client_id: z7.string().max(64).nullable(),
518
+ // null = orphaned (in grace period)
519
+ attached_clients: nonNegInt,
520
+ orphan_expires_at_ms: epochMs.nullable()
521
+ });
522
+ var ExecPtyStartResult = PtyInfo;
523
+ var ExecPtyWriteParams = z7.strictObject({ resource_id: ResourceId, data: z7.string().min(1).max(65536) });
524
+ var ExecPtyWriteResult = z7.strictObject({ written: nonNegInt });
525
+ var ExecPtyResizeParams = z7.strictObject({ resource_id: ResourceId, cols, rows });
526
+ var ExecPtyResizeResult = z7.strictObject({ cols, rows });
527
+ var ExecPtySignalParams = z7.strictObject({ resource_id: ResourceId, signal: Signal });
528
+ var ExecPtySignalResult = z7.strictObject({ delivered: z7.boolean() });
529
+ var ExecPtyKillParams = z7.strictObject({ resource_id: ResourceId, grace_ms: z7.int().min(0).max(3e4).default(2e3) });
530
+ var ExecPtyKillResult = z7.strictObject({ exit_code: z7.int().nullable(), exit_signal: Signal.nullable() });
531
+ var ExecListParams = z7.strictObject({});
532
+ var ExecListResult = z7.strictObject({ sessions: z7.array(PtyInfo) });
533
+ var ExecRunParams = z7.strictObject({
534
+ command: z7.string().min(1).max(131072),
535
+ cwd: AbsPath.optional(),
536
+ cwd_key: z7.string().max(128).optional(),
537
+ env: z7.record(z7.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).max(128), z7.string().max(32768)).optional(),
538
+ stdin: z7.string().max(1048576).optional(),
539
+ timeout: z7.int().min(1).max(3600).default(60),
540
+ // seconds, daemon parity
541
+ max_output_bytes: z7.int().min(1024).max(8388608).default(1048576)
542
+ });
543
+ var ExecRunResult = z7.strictObject({
544
+ exit_code: z7.int(),
545
+ stdout: z7.string(),
546
+ stderr: z7.string(),
547
+ cwd: AbsPath,
548
+ duration_ms: nonNegInt,
549
+ timed_out: z7.boolean(),
550
+ output_truncated: z7.boolean()
551
+ });
552
+ var ExecExitedEvent = z7.strictObject({ exit_code: z7.int().nullable(), exit_signal: Signal.nullable() });
553
+ var ExecTitleEvent = z7.strictObject({ title: z7.string().max(256) });
554
+ var ExecCwdEvent = z7.strictObject({ cwd: AbsPath });
555
+
556
+ // src/schema/session.ts
557
+ import { z as z8 } from "zod";
558
+ var SessionAttachParams = z8.strictObject({
559
+ resource_id: ResourceId,
560
+ mode: z8.enum(["control", "read_only"]).default("control"),
561
+ since_seq: u32.optional(),
562
+ window_bytes: z8.int().min(4096).max(16777216).optional()
563
+ });
564
+ var ResourceInfo = z8.discriminatedUnion("kind", [
565
+ z8.strictObject({ kind: z8.literal("pty"), pty: PtyInfo }),
566
+ z8.strictObject({
567
+ kind: z8.literal("watch"),
568
+ resource_id: ResourceId,
569
+ path: AbsPath,
570
+ orphan_expires_at_ms: epochMs.nullable()
571
+ })
572
+ ]);
573
+ var SessionAttachResult = ResourceInfo;
574
+ var SessionDetachParams = z8.strictObject({ resource_id: ResourceId });
575
+ var SessionDetachResult = z8.strictObject({ orphan_expires_at_ms: epochMs.nullable() });
576
+ var SessionReleaseParams = z8.strictObject({ resource_id: ResourceId });
577
+ var SessionReleaseResult = z8.strictObject({ released: z8.literal(true) });
578
+ var SessionListParams = z8.strictObject({});
579
+ var SessionListResult = z8.strictObject({ resources: z8.array(ResourceInfo) });
580
+ var SessionControlChangedEvent = z8.strictObject({ controller_client_id: z8.string().max(64).nullable(), your_mode: z8.enum(["control", "read_only"]) });
581
+
582
+ // src/schema/relay.ts
583
+ import { z as z9 } from "zod";
584
+ var RelayDeviceStatusEvent = z9.strictObject({
585
+ online: z9.boolean(),
586
+ since_ms: epochMs,
587
+ app_version: z9.string().max(32).nullable(),
588
+ protocol_version: ProtocolVersion.nullable()
589
+ });
590
+ var RelayAuthExpiringEvent = z9.strictObject({ expires_at_ms: epochMs });
591
+ var RelayCallRequest = z9.strictObject({
592
+ cap: z9.string().min(1).max(32),
593
+ op: z9.string().min(1).max(64),
594
+ params: z9.unknown(),
595
+ timeout_ms: z9.int().min(100).max(37e5).default(7e4)
596
+ });
597
+ var RelayCallResponse = z9.discriminatedUnion("ok", [
598
+ z9.strictObject({ ok: z9.literal(true), result: z9.unknown() }),
599
+ z9.strictObject({ ok: z9.literal(false), error: ProtocolErrorBody })
600
+ ]);
601
+ var RelayStatusResponse = RelayDeviceStatusEvent;
602
+
603
+ // src/schema/registry.ts
604
+ var FS_ERR = ["NOT_FOUND", "PERMISSION_DENIED_OS", "INVALID_PARAMS", "RESOURCE_BUSY", "INTERNAL"];
605
+ var OPS = {
606
+ "sysinfo.get": { params: SysinfoGetParams, result: SysinfoGetResult, kind: "unary", since: "1.0", errors: ["INTERNAL"] },
607
+ "fs.list": { params: FsListParams, result: FsListResult, kind: "unary", since: "1.0", errors: FS_ERR },
608
+ "fs.stat": { params: FsStatParams, result: FsStatResult, kind: "unary", since: "1.0", errors: FS_ERR },
609
+ "fs.read": { params: FsReadParams, result: FsReadResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "PAYLOAD_TOO_LARGE"] },
610
+ "fs.read_stream": { params: FsReadStreamParams, result: FsReadStreamResult, kind: "stream", since: "1.0", errors: [...FS_ERR, "CANCELLED"] },
611
+ "fs.write": { params: FsWriteParams, result: FsWriteResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "CONFLICT", "PAYLOAD_TOO_LARGE"] },
612
+ "fs.mkdir": { params: FsMkdirParams, result: FsMkdirResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "CONFLICT"] },
613
+ "fs.move": { params: FsMoveParams, result: FsMoveResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "CONFLICT"] },
614
+ "fs.delete": { params: FsDeleteParams, result: FsDeleteResult, kind: "unary", since: "1.0", errors: FS_ERR },
615
+ "fs.watch": { params: FsWatchParams, result: FsWatchResult, kind: "resource", since: "1.0", errors: [...FS_ERR, "RATE_LIMITED"] },
616
+ "fs.patch": { params: FsPatchParams, result: FsPatchResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "CONFLICT"] },
617
+ "fs.search_paths": { params: FsSearchPathsParams, result: FsSearchPathsResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "TIMEOUT"] },
618
+ "fs.search_content": { params: FsSearchContentParams, result: FsSearchContentResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "TIMEOUT"] },
619
+ "exec.pty.start": { params: ExecPtyStartParams, result: ExecPtyStartResult, kind: "resource", since: "1.0", errors: ["INVALID_PARAMS", "NOT_FOUND", "RATE_LIMITED", "PLATFORM_UNSUPPORTED", "INTERNAL"] },
620
+ "exec.pty.write": { params: ExecPtyWriteParams, result: ExecPtyWriteResult, kind: "unary", since: "1.0", errors: ["RESOURCE_GONE", "AUTH_FORBIDDEN", "INVALID_PARAMS"] },
621
+ "exec.pty.resize": { params: ExecPtyResizeParams, result: ExecPtyResizeResult, kind: "unary", since: "1.0", errors: ["RESOURCE_GONE", "AUTH_FORBIDDEN"] },
622
+ "exec.pty.signal": { params: ExecPtySignalParams, result: ExecPtySignalResult, kind: "unary", since: "1.0", errors: ["RESOURCE_GONE", "AUTH_FORBIDDEN", "PLATFORM_UNSUPPORTED"] },
623
+ "exec.pty.kill": { params: ExecPtyKillParams, result: ExecPtyKillResult, kind: "unary", since: "1.0", errors: ["RESOURCE_GONE", "AUTH_FORBIDDEN"] },
624
+ "exec.list": { params: ExecListParams, result: ExecListResult, kind: "unary", since: "1.0", errors: ["INTERNAL"] },
625
+ "exec.run": { params: ExecRunParams, result: ExecRunResult, kind: "unary", since: "1.0", errors: ["INVALID_PARAMS", "NOT_FOUND", "TIMEOUT", "CANCELLED", "INTERNAL"] },
626
+ "session.attach": { params: SessionAttachParams, result: SessionAttachResult, kind: "stream", since: "1.0", errors: ["RESOURCE_GONE", "AUTH_FORBIDDEN", "RESOURCE_BUSY"] },
627
+ "session.detach": { params: SessionDetachParams, result: SessionDetachResult, kind: "unary", since: "1.0", errors: ["RESOURCE_GONE"] },
628
+ "session.release": { params: SessionReleaseParams, result: SessionReleaseResult, kind: "unary", since: "1.0", errors: ["RESOURCE_GONE", "AUTH_FORBIDDEN"] },
629
+ "session.list": { params: SessionListParams, result: SessionListResult, kind: "unary", since: "1.0", errors: ["INTERNAL"] }
630
+ };
631
+ var EVENTS = {
632
+ "fs.changed": FsChangedEvent,
633
+ "exec.exited": ExecExitedEvent,
634
+ "exec.title": ExecTitleEvent,
635
+ "exec.cwd": ExecCwdEvent,
636
+ "session.control_changed": SessionControlChangedEvent,
637
+ "relay.device_status": RelayDeviceStatusEvent,
638
+ "relay.auth_expiring": RelayAuthExpiringEvent
639
+ };
640
+ var NAMED_SCHEMAS = {
641
+ ProtocolVersion,
642
+ RequestId,
643
+ ResourceId,
644
+ DeviceId,
645
+ AbsPath,
646
+ ErrorCode,
647
+ ErrorReason,
648
+ ProtocolErrorBody,
649
+ FrameHeader,
650
+ ClientType,
651
+ Limits,
652
+ OpDescriptor,
653
+ Welcome,
654
+ HelloMsg,
655
+ RequestMsg,
656
+ ResponseMsg,
657
+ ErrorMsg,
658
+ StreamMeta,
659
+ StreamMsg,
660
+ EndReason,
661
+ EndMsg,
662
+ CancelMsg,
663
+ CreditMsg,
664
+ EventMsg,
665
+ RelayMsg,
666
+ ClientToCoreMsg,
667
+ CoreToClientMsg,
668
+ OsPermissionName,
669
+ SysinfoGetParams,
670
+ SysinfoGetResult,
671
+ FsKind,
672
+ FsEntry,
673
+ FsListParams,
674
+ FsListResult,
675
+ FsStatParams,
676
+ FsEncoding,
677
+ FsReadParams,
678
+ FsReadResult,
679
+ FsReadStreamParams,
680
+ FsReadStreamResult,
681
+ FsWriteParams,
682
+ FsWriteResult,
683
+ FsMkdirParams,
684
+ FsMkdirResult,
685
+ FsMoveParams,
686
+ FsMoveResult,
687
+ FsDeleteParams,
688
+ FsDeleteResult,
689
+ FsWatchParams,
690
+ FsWatchResult,
691
+ FsPatchParams,
692
+ FsPatchResult,
693
+ FsSearchPathsParams,
694
+ FsSearchPathsResult,
695
+ FsSearchContentParams,
696
+ FsSearchContentResult,
697
+ FsChange,
698
+ FsChangedEvent,
699
+ Signal,
700
+ ExecPtyStartParams,
701
+ PtyInfo,
702
+ ExecPtyWriteParams,
703
+ ExecPtyWriteResult,
704
+ ExecPtyResizeParams,
705
+ ExecPtyResizeResult,
706
+ ExecPtySignalParams,
707
+ ExecPtySignalResult,
708
+ ExecPtyKillParams,
709
+ ExecPtyKillResult,
710
+ ExecListParams,
711
+ ExecListResult,
712
+ ExecRunParams,
713
+ ExecRunResult,
714
+ ExecExitedEvent,
715
+ ExecTitleEvent,
716
+ ExecCwdEvent,
717
+ SessionAttachParams,
718
+ ResourceInfo,
719
+ SessionDetachParams,
720
+ SessionDetachResult,
721
+ SessionReleaseParams,
722
+ SessionReleaseResult,
723
+ SessionListParams,
724
+ SessionListResult,
725
+ SessionControlChangedEvent,
726
+ RelayDeviceStatusEvent,
727
+ RelayAuthExpiringEvent,
728
+ RelayCallRequest,
729
+ RelayCallResponse
730
+ };
731
+ export {
732
+ AbsPath,
733
+ CancelMsg,
734
+ ClientToCoreMsg,
735
+ ClientType,
736
+ CloseCode,
737
+ CoreToClientMsg,
738
+ CreditMsg,
739
+ DEFAULT_MAX_FRAME_PAYLOAD_BYTES,
740
+ DEFAULT_MAX_MESSAGE_BYTES,
741
+ DEFAULT_WINDOW_BYTES,
742
+ DesktopProtocolError,
743
+ DeviceId,
744
+ EVENTS,
745
+ EndMsg,
746
+ EndReason,
747
+ ErrorCode,
748
+ ErrorMsg,
749
+ ErrorReason,
750
+ EventMsg,
751
+ ExecCwdEvent,
752
+ ExecExitedEvent,
753
+ ExecListParams,
754
+ ExecListResult,
755
+ ExecPtyKillParams,
756
+ ExecPtyKillResult,
757
+ ExecPtyResizeParams,
758
+ ExecPtyResizeResult,
759
+ ExecPtySignalParams,
760
+ ExecPtySignalResult,
761
+ ExecPtyStartParams,
762
+ ExecPtyStartResult,
763
+ ExecPtyWriteParams,
764
+ ExecPtyWriteResult,
765
+ ExecRunParams,
766
+ ExecRunResult,
767
+ ExecTitleEvent,
768
+ FRAME_HEADER_BYTES,
769
+ FRAME_STRUCT_FORMAT,
770
+ FRAME_VERSION,
771
+ FrameChannel,
772
+ FrameFlag,
773
+ FrameHeader,
774
+ FsChange,
775
+ FsChangedEvent,
776
+ FsDeleteParams,
777
+ FsDeleteResult,
778
+ FsEncoding,
779
+ FsEntry,
780
+ FsKind,
781
+ FsListParams,
782
+ FsListResult,
783
+ FsMkdirParams,
784
+ FsMkdirResult,
785
+ FsMoveParams,
786
+ FsMoveResult,
787
+ FsPatchParams,
788
+ FsPatchResult,
789
+ FsReadParams,
790
+ FsReadResult,
791
+ FsReadStreamParams,
792
+ FsReadStreamResult,
793
+ FsSearchContentParams,
794
+ FsSearchContentResult,
795
+ FsSearchPathsParams,
796
+ FsSearchPathsResult,
797
+ FsStatParams,
798
+ FsStatResult,
799
+ FsWatchParams,
800
+ FsWatchResult,
801
+ FsWriteParams,
802
+ FsWriteResult,
803
+ HelloMsg,
804
+ Limits,
805
+ NAMED_SCHEMAS,
806
+ OPS,
807
+ OpDescriptor,
808
+ OsPermissionName,
809
+ PING_TEXT,
810
+ PONG_TEXT,
811
+ PROTOCOL_MAJOR,
812
+ PROTOCOL_MINOR,
813
+ ProtocolErrorBody,
814
+ ProtocolVersion,
815
+ PtyInfo,
816
+ RelayAuthExpiringEvent,
817
+ RelayCallRequest,
818
+ RelayCallResponse,
819
+ RelayDeviceStatusEvent,
820
+ RelayMsg,
821
+ RelayStatusResponse,
822
+ RequestId,
823
+ RequestMsg,
824
+ ResourceId,
825
+ ResourceInfo,
826
+ ResponseMsg,
827
+ SessionAttachParams,
828
+ SessionAttachResult,
829
+ SessionControlChangedEvent,
830
+ SessionDetachParams,
831
+ SessionDetachResult,
832
+ SessionListParams,
833
+ SessionListResult,
834
+ SessionReleaseParams,
835
+ SessionReleaseResult,
836
+ Signal,
837
+ StreamMeta,
838
+ StreamMsg,
839
+ SysinfoGetParams,
840
+ SysinfoGetResult,
841
+ Welcome,
842
+ assertFrameHeader,
843
+ decodeFrame,
844
+ encodeFrame,
845
+ epochMs,
846
+ hasFlag,
847
+ isDesktopProtocolError,
848
+ nonNegInt,
849
+ readCid,
850
+ stampCid,
851
+ u32
852
+ };
853
+ //# sourceMappingURL=index.js.map