@opengeni/agent-proto 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.
@@ -0,0 +1,1080 @@
1
+ import { BinaryWriter, BinaryReader } from '@bufbuild/protobuf/wire';
2
+
3
+ declare const protobufPackage = "opengeni.agent.v1";
4
+ declare enum ErrorCode {
5
+ ERROR_CODE_UNSPECIFIED = 0,
6
+ /** ERROR_CODE_UNSUPPORTED - The requested op is not implemented / not permitted on this platform. */
7
+ ERROR_CODE_UNSUPPORTED = 1,
8
+ /** ERROR_CODE_OS - A filesystem/exec/git op failed at the OS layer (see `detail`). */
9
+ ERROR_CODE_OS = 2,
10
+ /** ERROR_CODE_NOT_FOUND - The path/ref/target referenced by the op does not exist. */
11
+ ERROR_CODE_NOT_FOUND = 3,
12
+ /** ERROR_CODE_CONSENT_REQUIRED - The op was rejected by consent/capability gating (e.g. screen-control off). */
13
+ ERROR_CODE_CONSENT_REQUIRED = 4,
14
+ /** ERROR_CODE_TIMEOUT - The op timed out inside the agent. */
15
+ ERROR_CODE_TIMEOUT = 5,
16
+ /** ERROR_CODE_DRAINING - The agent is shutting down / draining and cannot accept new work. */
17
+ ERROR_CODE_DRAINING = 6,
18
+ /** ERROR_CODE_PROTOCOL - A protocol-level violation (bad envelope, unknown op for this version). */
19
+ ERROR_CODE_PROTOCOL = 7,
20
+ /** ERROR_CODE_STREAM - A required stream channel could not be opened on the relay. */
21
+ ERROR_CODE_STREAM = 8,
22
+ /** ERROR_CODE_AGENT_OFFLINE - The control plane synthesized this because no agent responded (offline). */
23
+ ERROR_CODE_AGENT_OFFLINE = 9,
24
+ /** ERROR_CODE_FENCED - An epoch fence rejected a stale op; caller should re-resolve and retry. */
25
+ ERROR_CODE_FENCED = 10
26
+ }
27
+ declare function errorCodeFromJSON(object: any): ErrorCode;
28
+ declare function errorCodeToJSON(object: ErrorCode): string;
29
+ /** The operating system family the agent runs on. */
30
+ declare enum Os {
31
+ OS_UNSPECIFIED = 0,
32
+ OS_LINUX = 1,
33
+ OS_MACOS = 2,
34
+ OS_WINDOWS = 3
35
+ }
36
+ declare function osFromJSON(object: any): Os;
37
+ declare function osToJSON(object: Os): string;
38
+ /** CPU architecture. */
39
+ declare enum Arch {
40
+ ARCH_UNSPECIFIED = 0,
41
+ ARCH_X86_64 = 1,
42
+ ARCH_AARCH64 = 2
43
+ }
44
+ declare function archFromJSON(object: any): Arch;
45
+ declare function archToJSON(object: Arch): string;
46
+ /** The kind of byte stream a relay channel carries. */
47
+ declare enum StreamKind {
48
+ STREAM_KIND_UNSPECIFIED = 0,
49
+ /** STREAM_KIND_PTY - An interactive pseudo-terminal (ttyd-equivalent). */
50
+ STREAM_KIND_PTY = 1,
51
+ /** STREAM_KIND_DESKTOP - A desktop framebuffer (noVNC-equivalent) for view + computer-use. */
52
+ STREAM_KIND_DESKTOP = 2
53
+ }
54
+ declare function streamKindFromJSON(object: any): StreamKind;
55
+ declare function streamKindToJSON(object: StreamKind): string;
56
+ declare enum DeviceAuthState {
57
+ DEVICE_AUTH_STATE_UNSPECIFIED = 0,
58
+ /** DEVICE_AUTH_STATE_PENDING - The user has not yet completed the flow; keep polling. */
59
+ DEVICE_AUTH_STATE_PENDING = 1,
60
+ /** DEVICE_AUTH_STATE_AUTHORIZED - The user authorized; `credentials` are present. */
61
+ DEVICE_AUTH_STATE_AUTHORIZED = 2,
62
+ /** DEVICE_AUTH_STATE_DENIED - The user explicitly denied the request. */
63
+ DEVICE_AUTH_STATE_DENIED = 3,
64
+ /** DEVICE_AUTH_STATE_EXPIRED - The device_code expired before authorization. */
65
+ DEVICE_AUTH_STATE_EXPIRED = 4,
66
+ /** DEVICE_AUTH_STATE_SLOW_DOWN - The agent is polling too fast and must slow down. */
67
+ DEVICE_AUTH_STATE_SLOW_DOWN = 5
68
+ }
69
+ declare function deviceAuthStateFromJSON(object: any): DeviceAuthState;
70
+ declare function deviceAuthStateToJSON(object: DeviceAuthState): string;
71
+ declare enum FsEntryKind {
72
+ FS_ENTRY_KIND_UNSPECIFIED = 0,
73
+ FS_ENTRY_KIND_FILE = 1,
74
+ FS_ENTRY_KIND_DIRECTORY = 2,
75
+ FS_ENTRY_KIND_SYMLINK = 3
76
+ }
77
+ declare function fsEntryKindFromJSON(object: any): FsEntryKind;
78
+ declare function fsEntryKindToJSON(object: FsEntryKind): string;
79
+ declare enum GitOp {
80
+ GIT_OP_UNSPECIFIED = 0,
81
+ GIT_OP_STATUS = 1,
82
+ GIT_OP_DIFF = 2,
83
+ GIT_OP_LOG = 3,
84
+ GIT_OP_ADD = 4,
85
+ GIT_OP_COMMIT = 5,
86
+ GIT_OP_BRANCH = 6,
87
+ GIT_OP_CHECKOUT = 7,
88
+ GIT_OP_PULL = 8,
89
+ GIT_OP_PUSH = 9,
90
+ /** GIT_OP_RAW - Any other subcommand, passed through verbatim via `args`. */
91
+ GIT_OP_RAW = 15
92
+ }
93
+ declare function gitOpFromJSON(object: any): GitOp;
94
+ declare function gitOpToJSON(object: GitOp): string;
95
+ declare enum GoingOfflineReason {
96
+ GOING_OFFLINE_REASON_UNSPECIFIED = 0,
97
+ /** GOING_OFFLINE_REASON_USER_STOP - The user stopped the foreground process. */
98
+ GOING_OFFLINE_REASON_USER_STOP = 1,
99
+ /** GOING_OFFLINE_REASON_UPDATE - The agent is restarting itself for a self-update. */
100
+ GOING_OFFLINE_REASON_UPDATE = 2,
101
+ /** GOING_OFFLINE_REASON_HOST_SHUTDOWN - The host is shutting down / suspending. */
102
+ GOING_OFFLINE_REASON_HOST_SHUTDOWN = 3
103
+ }
104
+ declare function goingOfflineReasonFromJSON(object: any): GoingOfflineReason;
105
+ declare function goingOfflineReasonToJSON(object: GoingOfflineReason): string;
106
+ declare enum StreamRole {
107
+ STREAM_ROLE_UNSPECIFIED = 0,
108
+ /** STREAM_ROLE_AGENT - The agent producing pty/desktop bytes. */
109
+ STREAM_ROLE_AGENT = 1,
110
+ /** STREAM_ROLE_CLIENT - The viewer/pty client consuming them (and sending input back). */
111
+ STREAM_ROLE_CLIENT = 2
112
+ }
113
+ declare function streamRoleFromJSON(object: any): StreamRole;
114
+ declare function streamRoleToJSON(object: StreamRole): string;
115
+ declare enum StreamCloseReason {
116
+ STREAM_CLOSE_REASON_UNSPECIFIED = 0,
117
+ /** STREAM_CLOSE_REASON_NORMAL - Normal end (pty exited, viewer left). */
118
+ STREAM_CLOSE_REASON_NORMAL = 1,
119
+ /** STREAM_CLOSE_REASON_PROCESS_EXIT - The producing process ended. */
120
+ STREAM_CLOSE_REASON_PROCESS_EXIT = 2,
121
+ /** STREAM_CLOSE_REASON_FENCED - The epoch fence invalidated the channel (a swap-away). */
122
+ STREAM_CLOSE_REASON_FENCED = 3,
123
+ /** STREAM_CLOSE_REASON_TRANSPORT_ERROR - A relay/transport error (the client should reconnect+resume). */
124
+ STREAM_CLOSE_REASON_TRANSPORT_ERROR = 4,
125
+ /** STREAM_CLOSE_REASON_RATE_LIMITED - Rate-limit / backpressure shed the channel. */
126
+ STREAM_CLOSE_REASON_RATE_LIMITED = 5
127
+ }
128
+ declare function streamCloseReasonFromJSON(object: any): StreamCloseReason;
129
+ declare function streamCloseReasonToJSON(object: StreamCloseReason): string;
130
+ declare enum PointerAction {
131
+ POINTER_ACTION_UNSPECIFIED = 0,
132
+ POINTER_ACTION_MOVE = 1,
133
+ POINTER_ACTION_DOWN = 2,
134
+ POINTER_ACTION_UP = 3,
135
+ POINTER_ACTION_CLICK = 4,
136
+ POINTER_ACTION_DOUBLE_CLICK = 5
137
+ }
138
+ declare function pointerActionFromJSON(object: any): PointerAction;
139
+ declare function pointerActionToJSON(object: PointerAction): string;
140
+ declare enum PointerButton {
141
+ POINTER_BUTTON_UNSPECIFIED = 0,
142
+ POINTER_BUTTON_LEFT = 1,
143
+ POINTER_BUTTON_RIGHT = 2,
144
+ POINTER_BUTTON_MIDDLE = 3
145
+ }
146
+ declare function pointerButtonFromJSON(object: any): PointerButton;
147
+ declare function pointerButtonToJSON(object: PointerButton): string;
148
+ declare enum KeyAction {
149
+ KEY_ACTION_UNSPECIFIED = 0,
150
+ KEY_ACTION_DOWN = 1,
151
+ KEY_ACTION_UP = 2,
152
+ KEY_ACTION_PRESS = 3
153
+ }
154
+ declare function keyActionFromJSON(object: any): KeyAction;
155
+ declare function keyActionToJSON(object: KeyAction): string;
156
+ /**
157
+ * A typed error returned by the agent (or synthesized by the control plane for
158
+ * a non-responding agent). `code` is a stable machine-readable discriminant;
159
+ * `message` is human-facing; `retryable` lets the turn layer decide whether to
160
+ * pause-and-retry (a reconnect blip) versus surface a hard failure.
161
+ */
162
+ interface AgentError {
163
+ code: ErrorCode;
164
+ message: string;
165
+ retryable: boolean;
166
+ /** Optional structured detail (e.g. an OS errno, a git exit code) for logs. */
167
+ detail: {
168
+ [key: string]: string;
169
+ };
170
+ }
171
+ declare const AgentError: MessageFns<AgentError>;
172
+ interface AgentError_DetailEntry {
173
+ key: string;
174
+ value: string;
175
+ }
176
+ declare const AgentError_DetailEntry: MessageFns<AgentError_DetailEntry>;
177
+ /**
178
+ * The agent's self-description, sent on connect (the "hello") and refreshed on
179
+ * reconnect. The control plane folds this into the negotiated SessionCapabilities
180
+ * document (every capability cell is available:false+reason, never absent).
181
+ */
182
+ interface Hello {
183
+ agentId: string;
184
+ workspaceId: string;
185
+ /** Semantic version of the running agent binary (drives staged self-update). */
186
+ agentVersion: string;
187
+ os: Os;
188
+ arch: Arch;
189
+ /** Human-friendly machine name (hostname by default; user-overridable). */
190
+ machineName: string;
191
+ /** The agent-reported working root the control plane treats as the sandbox cwd. */
192
+ workspaceRoot: string;
193
+ /** Capabilities the agent can serve given its platform + consent grants. */
194
+ capabilities: Capabilities | undefined;
195
+ /** The update channel this agent follows (stable|beta), for fleet-pinning. */
196
+ updateChannel: string;
197
+ /**
198
+ * A resume token minted by a prior connection, echoed so the control plane can
199
+ * recognize a reconnect (vs a fresh enrollment) and fence by epoch. Empty on
200
+ * first connect.
201
+ */
202
+ resumeToken: string;
203
+ }
204
+ declare const Hello: MessageFns<Hello>;
205
+ /**
206
+ * What the agent is able and consented to do. Each bool is a hard capability
207
+ * gate; the control plane maps a false to a CapabilityUnavailableReason.
208
+ */
209
+ interface Capabilities {
210
+ /** Channel-A structural surface (always true for a connected agent). */
211
+ exec: boolean;
212
+ filesystem: boolean;
213
+ git: boolean;
214
+ /** An interactive PTY can be opened over the relay. */
215
+ pty: boolean;
216
+ /** A desktop framebuffer is available (a display exists or Xvfb is enabled). */
217
+ desktop: boolean;
218
+ /** The user consented to whole-machine access during enrollment. */
219
+ consentedWholeMachine: boolean;
220
+ /** The user consented to screen capture + synthetic input (computer-use). */
221
+ consentedScreenControl: boolean;
222
+ /** Display detail (absent => headless / no display). */
223
+ display: Display | undefined;
224
+ }
225
+ declare const Capabilities: MessageFns<Capabilities>;
226
+ /** Detail about the agent's graphical display, when one is present. */
227
+ interface Display {
228
+ /** e.g. ":0", ":99" (Xvfb), or a platform handle. */
229
+ id: string;
230
+ width: number;
231
+ height: number;
232
+ /** True when backed by a virtual framebuffer (Xvfb) rather than a real screen. */
233
+ virtual: boolean;
234
+ }
235
+ declare const Display: MessageFns<Display>;
236
+ /**
237
+ * The agent begins enrollment by asking the control plane to start a device
238
+ * flow. The control plane returns a user-code + verification URL the user visits
239
+ * to consent (whole-machine + optional screen-control) and authorize.
240
+ */
241
+ interface DeviceAuthStartRequest {
242
+ /**
243
+ * The agent's stable install identity (a per-install keypair fingerprint),
244
+ * bound to the enrollment so the issued credentials are non-transferable.
245
+ */
246
+ installFingerprint: string;
247
+ os: Os;
248
+ arch: Arch;
249
+ machineName: string;
250
+ /** The update channel the user selected at install time. */
251
+ updateChannel: string;
252
+ }
253
+ declare const DeviceAuthStartRequest: MessageFns<DeviceAuthStartRequest>;
254
+ interface DeviceAuthStartResponse {
255
+ /** Short code the user types at the verification URL. */
256
+ userCode: string;
257
+ /** The opaque device code the agent polls with. */
258
+ deviceCode: string;
259
+ /** Where the user goes to authorize (e.g. https://get.opengeni.ai/device). */
260
+ verificationUri: string;
261
+ /** A pre-filled convenience URL embedding the user_code. */
262
+ verificationUriComplete: string;
263
+ /** Seconds the device_code remains valid. */
264
+ expiresInSeconds: number;
265
+ /** Minimum seconds the agent must wait between polls. */
266
+ pollIntervalSeconds: number;
267
+ }
268
+ declare const DeviceAuthStartResponse: MessageFns<DeviceAuthStartResponse>;
269
+ /** The agent polls until the user authorizes (or it expires / is denied). */
270
+ interface DeviceAuthPollRequest {
271
+ deviceCode: string;
272
+ }
273
+ declare const DeviceAuthPollRequest: MessageFns<DeviceAuthPollRequest>;
274
+ interface DeviceAuthPollResponse {
275
+ state: DeviceAuthState;
276
+ /** Present only when state == AUTHORIZED. */
277
+ credentials: EnrollmentCredentials | undefined;
278
+ }
279
+ declare const DeviceAuthPollResponse: MessageFns<DeviceAuthPollResponse>;
280
+ /**
281
+ * The scoped credentials persisted (0600) on the machine after enrollment.
282
+ * These are workspace-scoped — they can address only this workspace's agents.
283
+ */
284
+ interface EnrollmentCredentials {
285
+ agentId: string;
286
+ workspaceId: string;
287
+ /**
288
+ * The NATS CONNECT AUTH-TOKEN the agent presents (the signed `oge_` enrollment
289
+ * bearer). The server runs with AUTH CALLOUT (dossier §10.1 / M-AUTH): on connect
290
+ * the agent passes this as the auth-token; nats-server issues an authorization
291
+ * request to the control-plane's callout responder, which validates the bearer
292
+ * and returns a SIGNED user JWT scoping the connection to pub/sub ONLY
293
+ * `agent.<ws>.>` (+ `_INBOX.>`). That per-subject scope IS the per-workspace
294
+ * tenancy boundary — there is NO per-machine creds file to ship. (Field name kept
295
+ * for proto stability; it now carries the bearer, not an operator creds-file body.)
296
+ */
297
+ natsCredentials: string;
298
+ /**
299
+ * The NATS server URL(s) to dial. For the control plane these are `wss://` URLs
300
+ * (the relay-symmetric TLS ingress) so the agent rides the same TLS endpoint as
301
+ * the stream relay — no separate public TCP load balancer (dossier M-AUTH).
302
+ */
303
+ natsUrls: string[];
304
+ /** The relay edge base URL for opening stream channels. */
305
+ relayUrl: string;
306
+ /** The minisign public key the agent pins for self-update verification. */
307
+ updatePubkey: string;
308
+ /** Whether the user consented to whole-machine access. */
309
+ consentedWholeMachine: boolean;
310
+ /** Whether the user consented to screen capture + synthetic input. */
311
+ consentedScreenControl: boolean;
312
+ /**
313
+ * The agent's PRODUCER token for the relay edge (dossier §10.5 / the relay-dial
314
+ * protocol). Presented as `StreamOpen.token` when the agent registers a
315
+ * pty/desktop channel (role=AGENT). It is a control-plane-minted, workspace+agent
316
+ * -scoped `ogr_` HMAC token the relay verifies on its own merits — DISTINCT from
317
+ * the viewer's `ogs_` stream token (which the control plane mints per viewer and
318
+ * the relay also verifies). The relay pairs the producer and consumer by the
319
+ * channel key once BOTH tokens pass. Additive proto3 field; empty for an
320
+ * enrollment minted before the relay-token plane is configured (the agent then
321
+ * presents an empty token the relay rejects, surfacing the gap loudly).
322
+ */
323
+ relayToken: string;
324
+ }
325
+ declare const EnrollmentCredentials: MessageFns<EnrollmentCredentials>;
326
+ interface ExecRequest {
327
+ /** argv[0] is the program; the agent does NOT shell-interpret unless `shell`. */
328
+ command: string[];
329
+ /** When true, `command` is joined and run through the platform shell. */
330
+ shell: boolean;
331
+ /** Working directory; defaults to the agent's workspace_root when empty. */
332
+ cwd: string;
333
+ /** Extra environment variables layered over the agent's environment. */
334
+ env: {
335
+ [key: string]: string;
336
+ };
337
+ /** Optional stdin fed to the process. */
338
+ stdin: Uint8Array;
339
+ /** Hard wall-clock timeout; 0 means the control-plane default. */
340
+ timeoutMs: number;
341
+ }
342
+ declare const ExecRequest: MessageFns<ExecRequest>;
343
+ interface ExecRequest_EnvEntry {
344
+ key: string;
345
+ value: string;
346
+ }
347
+ declare const ExecRequest_EnvEntry: MessageFns<ExecRequest_EnvEntry>;
348
+ interface ExecResponse {
349
+ exitCode: number;
350
+ stdout: Uint8Array;
351
+ stderr: Uint8Array;
352
+ /** True when the process was killed by `timeout_ms`. */
353
+ timedOut: boolean;
354
+ /** Wall-clock duration the process ran. */
355
+ durationMs: string;
356
+ }
357
+ declare const ExecResponse: MessageFns<ExecResponse>;
358
+ interface FsReadRequest {
359
+ path: string;
360
+ /** Optional byte offset + length for ranged reads (0 length => to EOF). */
361
+ offset: string;
362
+ length: string;
363
+ }
364
+ declare const FsReadRequest: MessageFns<FsReadRequest>;
365
+ interface FsReadResponse {
366
+ content: Uint8Array;
367
+ /** Total size of the file (so a ranged read knows there is more). */
368
+ totalSize: string;
369
+ }
370
+ declare const FsReadResponse: MessageFns<FsReadResponse>;
371
+ interface FsWriteRequest {
372
+ path: string;
373
+ content: Uint8Array;
374
+ /** Create parent directories as needed. */
375
+ createParents: boolean;
376
+ /** Append rather than truncate-and-write. */
377
+ append: boolean;
378
+ /** POSIX mode for a newly created file (e.g. 0644); 0 => platform default. */
379
+ mode: number;
380
+ }
381
+ declare const FsWriteRequest: MessageFns<FsWriteRequest>;
382
+ interface FsWriteResponse {
383
+ bytesWritten: string;
384
+ }
385
+ declare const FsWriteResponse: MessageFns<FsWriteResponse>;
386
+ interface FsListRequest {
387
+ path: string;
388
+ /** Recurse into subdirectories. */
389
+ recursive: boolean;
390
+ }
391
+ declare const FsListRequest: MessageFns<FsListRequest>;
392
+ interface FsListResponse {
393
+ entries: FsEntry[];
394
+ }
395
+ declare const FsListResponse: MessageFns<FsListResponse>;
396
+ interface FsEntry {
397
+ name: string;
398
+ /** Path relative to the listed directory. */
399
+ path: string;
400
+ kind: FsEntryKind;
401
+ size: string;
402
+ /** Last-modified time, unix epoch ms. */
403
+ modifiedMs: string;
404
+ mode: number;
405
+ }
406
+ declare const FsEntry: MessageFns<FsEntry>;
407
+ interface FsMkdirRequest {
408
+ path: string;
409
+ /** Create intermediate directories (mkdir -p). */
410
+ parents: boolean;
411
+ mode: number;
412
+ }
413
+ declare const FsMkdirRequest: MessageFns<FsMkdirRequest>;
414
+ interface FsMkdirResponse {
415
+ }
416
+ declare const FsMkdirResponse: MessageFns<FsMkdirResponse>;
417
+ interface FsMoveRequest {
418
+ from: string;
419
+ to: string;
420
+ /** Overwrite the destination if it exists. */
421
+ overwrite: boolean;
422
+ }
423
+ declare const FsMoveRequest: MessageFns<FsMoveRequest>;
424
+ interface FsMoveResponse {
425
+ }
426
+ declare const FsMoveResponse: MessageFns<FsMoveResponse>;
427
+ interface FsStatRequest {
428
+ path: string;
429
+ }
430
+ declare const FsStatRequest: MessageFns<FsStatRequest>;
431
+ interface FsStatResponse {
432
+ /** Absent when the path does not exist (the op still succeeds; `exists=false`). */
433
+ exists: boolean;
434
+ entry: FsEntry | undefined;
435
+ }
436
+ declare const FsStatResponse: MessageFns<FsStatResponse>;
437
+ interface FsRemoveRequest {
438
+ path: string;
439
+ /** Remove directories recursively. */
440
+ recursive: boolean;
441
+ }
442
+ declare const FsRemoveRequest: MessageFns<FsRemoveRequest>;
443
+ interface FsRemoveResponse {
444
+ }
445
+ declare const FsRemoveResponse: MessageFns<FsRemoveResponse>;
446
+ /**
447
+ * A single git operation. The agent runs git against the repo rooted at `cwd`
448
+ * (or workspace_root) and returns structured results where it can, falling back
449
+ * to raw stdout for pass-through subcommands.
450
+ */
451
+ interface GitRequest {
452
+ op: GitOp;
453
+ /** Repo working directory; defaults to workspace_root. */
454
+ cwd: string;
455
+ /** Free-form args for ops that pass through (e.g. log/diff flags). */
456
+ args: string[];
457
+ }
458
+ declare const GitRequest: MessageFns<GitRequest>;
459
+ interface GitResponse {
460
+ exitCode: number;
461
+ /** Raw stdout/stderr for pass-through fidelity. */
462
+ stdout: Uint8Array;
463
+ stderr: Uint8Array;
464
+ /** Structured status, present for GIT_OP_STATUS. */
465
+ status: GitStatus | undefined;
466
+ }
467
+ declare const GitResponse: MessageFns<GitResponse>;
468
+ interface GitStatus {
469
+ branch: string;
470
+ /** The upstream tracking branch, if any. */
471
+ upstream: string;
472
+ ahead: number;
473
+ behind: number;
474
+ files: GitFileStatus[];
475
+ clean: boolean;
476
+ }
477
+ declare const GitStatus: MessageFns<GitStatus>;
478
+ interface GitFileStatus {
479
+ path: string;
480
+ /** Two-letter porcelain code (e.g. " M", "??", "A "). */
481
+ code: string;
482
+ staged: boolean;
483
+ }
484
+ declare const GitFileStatus: MessageFns<GitFileStatus>;
485
+ /**
486
+ * Open a PTY. The agent allocates a pseudo-terminal, spawns the shell/command,
487
+ * and registers a relay stream channel of kind PTY. The returned `channel`
488
+ * identifies the stream the viewer connects to.
489
+ */
490
+ interface PtyOpenRequest {
491
+ /** Shell/command to run; empty => the user's default login shell. */
492
+ command: string[];
493
+ cwd: string;
494
+ env: {
495
+ [key: string]: string;
496
+ };
497
+ cols: number;
498
+ rows: number;
499
+ /** The TERM value to advertise (e.g. "xterm-256color"). */
500
+ term: string;
501
+ }
502
+ declare const PtyOpenRequest: MessageFns<PtyOpenRequest>;
503
+ interface PtyOpenRequest_EnvEntry {
504
+ key: string;
505
+ value: string;
506
+ }
507
+ declare const PtyOpenRequest_EnvEntry: MessageFns<PtyOpenRequest_EnvEntry>;
508
+ interface PtyOpenResponse {
509
+ /** A handle for subsequent resize/close control ops. */
510
+ ptyId: string;
511
+ /** The relay stream channel carrying the PTY bytes. */
512
+ channel: StreamChannel | undefined;
513
+ }
514
+ declare const PtyOpenResponse: MessageFns<PtyOpenResponse>;
515
+ /**
516
+ * Write input bytes to a PTY. (Bulk interactive bytes normally ride the stream
517
+ * plane as StreamFrames; this control op exists for programmatic injection.)
518
+ */
519
+ interface PtyWriteRequest {
520
+ ptyId: string;
521
+ data: Uint8Array;
522
+ }
523
+ declare const PtyWriteRequest: MessageFns<PtyWriteRequest>;
524
+ interface PtyWriteResponse {
525
+ bytesWritten: string;
526
+ }
527
+ declare const PtyWriteResponse: MessageFns<PtyWriteResponse>;
528
+ interface PtyResizeRequest {
529
+ ptyId: string;
530
+ cols: number;
531
+ rows: number;
532
+ }
533
+ declare const PtyResizeRequest: MessageFns<PtyResizeRequest>;
534
+ interface PtyResizeResponse {
535
+ }
536
+ declare const PtyResizeResponse: MessageFns<PtyResizeResponse>;
537
+ interface PtyCloseRequest {
538
+ ptyId: string;
539
+ }
540
+ declare const PtyCloseRequest: MessageFns<PtyCloseRequest>;
541
+ interface PtyCloseResponse {
542
+ /** The exit code of the PTY's root process, if it had exited. */
543
+ exitCode: number;
544
+ }
545
+ declare const PtyCloseResponse: MessageFns<PtyCloseResponse>;
546
+ /**
547
+ * Ensure a desktop framebuffer stream exists, registering a relay channel of
548
+ * kind DESKTOP. Idempotent: repeated calls return the same live channel.
549
+ */
550
+ interface DesktopEnsureRequest {
551
+ /** Request a specific geometry (0 => the display's native geometry). */
552
+ width: number;
553
+ height: number;
554
+ }
555
+ declare const DesktopEnsureRequest: MessageFns<DesktopEnsureRequest>;
556
+ interface DesktopEnsureResponse {
557
+ channel: StreamChannel | undefined;
558
+ display: Display | undefined;
559
+ }
560
+ declare const DesktopEnsureResponse: MessageFns<DesktopEnsureResponse>;
561
+ /**
562
+ * Inject one synthetic computer-use input event on the machine's desktop — the
563
+ * CONTROL-PLANE twin of the relay DesktopInput (the agent drives its OWN screen
564
+ * for computer-use; there is no human viewer channel). Reuses the relay
565
+ * DesktopInput event shapes; there is no channel_id (this goes straight to the
566
+ * display, not a relay channel). Injection is gated on consented_screen_control:
567
+ * an ungated call fails with ERROR_CODE_CONSENT_REQUIRED and never touches the OS.
568
+ */
569
+ interface DesktopInputRequest {
570
+ event: {
571
+ $case: "pointer";
572
+ pointer: PointerEvent;
573
+ } | {
574
+ $case: "key";
575
+ key: KeyEvent;
576
+ } | {
577
+ $case: "scroll";
578
+ scroll: ScrollEvent;
579
+ } | undefined;
580
+ }
581
+ declare const DesktopInputRequest: MessageFns<DesktopInputRequest>;
582
+ interface DesktopInputResponse {
583
+ }
584
+ declare const DesktopInputResponse: MessageFns<DesktopInputResponse>;
585
+ /**
586
+ * Capture a single screenshot of the machine's desktop as a PNG. A VIEW op: it
587
+ * needs a display, NOT screen-control consent (the view/control decoupling), so
588
+ * it is not consent-gated. Returns the encoded image plus its geometry so the
589
+ * caller can size a canvas without decoding.
590
+ */
591
+ interface DesktopScreenshotRequest {
592
+ }
593
+ declare const DesktopScreenshotRequest: MessageFns<DesktopScreenshotRequest>;
594
+ interface DesktopScreenshotResponse {
595
+ png: Uint8Array;
596
+ width: number;
597
+ height: number;
598
+ }
599
+ declare const DesktopScreenshotResponse: MessageFns<DesktopScreenshotResponse>;
600
+ /**
601
+ * The agent's periodic liveness ping. Carries a metrics sample so the control
602
+ * plane can upsert the machine's last-sample without a separate RPC. The
603
+ * `seq` increments per heartbeat so the control plane can detect a gap.
604
+ */
605
+ interface Heartbeat {
606
+ seq: string;
607
+ /** Agent monotonic uptime in ms. */
608
+ uptimeMs: string;
609
+ /**
610
+ * The number of sessions currently sharing this machine (lease refcount as the
611
+ * agent sees it; the authoritative count lives in Postgres).
612
+ */
613
+ activeSessions: number;
614
+ metrics: MetricsSample | undefined;
615
+ /**
616
+ * True when the agent is draining for a pending self-update (prefer other
617
+ * sandboxes for new work).
618
+ */
619
+ draining: boolean;
620
+ }
621
+ declare const Heartbeat: MessageFns<Heartbeat>;
622
+ interface HeartbeatAck {
623
+ /** The control plane may instruct the agent to adjust its heartbeat cadence. */
624
+ nextIntervalMs: number;
625
+ /** The control plane may signal a pending fleet action (e.g. update available). */
626
+ updateAvailable: boolean;
627
+ }
628
+ declare const HeartbeatAck: MessageFns<HeartbeatAck>;
629
+ /** On-demand metrics request (the dashboard force-poll path). */
630
+ interface MetricsRequest {
631
+ }
632
+ declare const MetricsRequest: MessageFns<MetricsRequest>;
633
+ /** A point-in-time machine metrics sample. */
634
+ interface MetricsSample {
635
+ /** Unix epoch ms when sampled. */
636
+ sampledAtMs: string;
637
+ /** CPU utilization 0..100 (whole machine). */
638
+ cpuPercent: number;
639
+ /** Load averages. */
640
+ load1: number;
641
+ load5: number;
642
+ load15: number;
643
+ memUsedBytes: string;
644
+ memTotalBytes: string;
645
+ diskUsedBytes: string;
646
+ diskTotalBytes: string;
647
+ /** A contention signal (run-queue length / pressure), if available. */
648
+ runQueue: number;
649
+ /** Per-GPU samples, when GPUs are present. */
650
+ gpus: GpuSample[];
651
+ }
652
+ declare const MetricsSample: MessageFns<MetricsSample>;
653
+ interface GpuSample {
654
+ name: string;
655
+ /** Utilization 0..100. */
656
+ utilPercent: number;
657
+ memUsedBytes: string;
658
+ memTotalBytes: string;
659
+ }
660
+ declare const GpuSample: MessageFns<GpuSample>;
661
+ /**
662
+ * A cheap liveness probe — the control plane requests it to test that a
663
+ * responder exists on the subject (the NATS "is there an agent" check).
664
+ */
665
+ interface PingRequest {
666
+ /** Echoed back so the caller can correlate / measure RTT. */
667
+ nonce: string;
668
+ }
669
+ declare const PingRequest: MessageFns<PingRequest>;
670
+ interface PingResponse {
671
+ nonce: string;
672
+ /** The agent's monotonic clock, for skew estimation. */
673
+ agentMonotonicMs: string;
674
+ }
675
+ declare const PingResponse: MessageFns<PingResponse>;
676
+ /**
677
+ * Sent by the agent on a clean stop (SIGINT/SIGTERM) so the lease flips to
678
+ * offline IMMEDIATELY rather than waiting on heartbeat dead-detection.
679
+ */
680
+ interface GoingOffline {
681
+ reason: GoingOfflineReason;
682
+ /** Optional human note (e.g. "user pressed Ctrl-C"). */
683
+ message: string;
684
+ }
685
+ declare const GoingOffline: MessageFns<GoingOffline>;
686
+ /**
687
+ * On reconnect, the agent presents its resume token; the control plane fences by
688
+ * epoch and either accepts the resume (same machine, new connection generation)
689
+ * or, if the token is unknown/stale, requires a fresh hello.
690
+ */
691
+ interface ResumeRequest {
692
+ agentId: string;
693
+ resumeToken: string;
694
+ /** The lease epoch the agent last observed, for the integer fence. */
695
+ lastKnownEpoch: number;
696
+ }
697
+ declare const ResumeRequest: MessageFns<ResumeRequest>;
698
+ interface ResumeResponse {
699
+ accepted: boolean;
700
+ /**
701
+ * The new lease epoch the control plane assigned to this connection. Any op
702
+ * fenced by an older epoch must re-resolve and retry.
703
+ */
704
+ epoch: number;
705
+ /** A fresh resume token for the NEXT reconnect (tokens rotate per generation). */
706
+ resumeToken: string;
707
+ }
708
+ declare const ResumeResponse: MessageFns<ResumeResponse>;
709
+ /** The agent asks whether a newer build is available for its channel + target. */
710
+ interface UpdateCheckRequest {
711
+ currentVersion: string;
712
+ channel: string;
713
+ os: Os;
714
+ arch: Arch;
715
+ }
716
+ declare const UpdateCheckRequest: MessageFns<UpdateCheckRequest>;
717
+ interface UpdateCheckResponse {
718
+ updateAvailable: boolean;
719
+ manifest: UpdateManifest | undefined;
720
+ }
721
+ declare const UpdateCheckResponse: MessageFns<UpdateCheckResponse>;
722
+ /**
723
+ * A signed channel manifest. It is itself minisign-signed out-of-band; this
724
+ * message is the decoded body the updater reasons over.
725
+ */
726
+ interface UpdateManifest {
727
+ channel: string;
728
+ version: string;
729
+ /** The minimum version still permitted (downgrade-attack protection). */
730
+ minSupported: string;
731
+ /** Staged-rollout gate: an agent applies when blake3(agentId+salt)%100 < percent. */
732
+ rolloutPercent: number;
733
+ cohortSalt: string;
734
+ artifacts: UpdateArtifact[];
735
+ notesUrl: string;
736
+ signedAtMs: string;
737
+ /** When true, override drain and update mid-session (security CVE path). */
738
+ force: boolean;
739
+ }
740
+ declare const UpdateManifest: MessageFns<UpdateManifest>;
741
+ interface UpdateArtifact {
742
+ /** Target triple, e.g. "x86_64-unknown-linux-musl". */
743
+ target: string;
744
+ url: string;
745
+ size: string;
746
+ sha256: string;
747
+ /** URL of the detached minisign signature for the artifact. */
748
+ minisigUrl: string;
749
+ }
750
+ declare const UpdateArtifact: MessageFns<UpdateArtifact>;
751
+ /**
752
+ * Before applying, the updater asks the control plane whether it may proceed
753
+ * (the control plane reads the Postgres lease refcount). The agent drains until
754
+ * the refcount reaches zero or a grace window elapses.
755
+ */
756
+ interface UpdateMayProceedRequest {
757
+ agentId: string;
758
+ targetVersion: string;
759
+ }
760
+ declare const UpdateMayProceedRequest: MessageFns<UpdateMayProceedRequest>;
761
+ interface UpdateMayProceedResponse {
762
+ mayProceed: boolean;
763
+ /** When false, the number of live sessions blocking the update. */
764
+ activeSessions: number;
765
+ }
766
+ declare const UpdateMayProceedResponse: MessageFns<UpdateMayProceedResponse>;
767
+ /**
768
+ * Wraps an op-specific request. `request_id` correlates a response to a request
769
+ * even over fan-out; `epoch` carries the lease/active epoch the control plane
770
+ * resolved this op against, so the agent can reject a stale op (ERROR_CODE_FENCED).
771
+ */
772
+ interface ControlRequest {
773
+ requestId: string;
774
+ epoch: number;
775
+ op: {
776
+ $case: "ping";
777
+ ping: PingRequest;
778
+ } | {
779
+ $case: "hello";
780
+ hello: Hello;
781
+ } | {
782
+ $case: "resume";
783
+ resume: ResumeRequest;
784
+ } | {
785
+ $case: "exec";
786
+ exec: ExecRequest;
787
+ } | {
788
+ $case: "fsRead";
789
+ fsRead: FsReadRequest;
790
+ } | {
791
+ $case: "fsWrite";
792
+ fsWrite: FsWriteRequest;
793
+ } | {
794
+ $case: "fsList";
795
+ fsList: FsListRequest;
796
+ } | {
797
+ $case: "fsMkdir";
798
+ fsMkdir: FsMkdirRequest;
799
+ } | {
800
+ $case: "fsMove";
801
+ fsMove: FsMoveRequest;
802
+ } | {
803
+ $case: "fsStat";
804
+ fsStat: FsStatRequest;
805
+ } | {
806
+ $case: "fsRemove";
807
+ fsRemove: FsRemoveRequest;
808
+ } | {
809
+ $case: "git";
810
+ git: GitRequest;
811
+ } | {
812
+ $case: "ptyOpen";
813
+ ptyOpen: PtyOpenRequest;
814
+ } | {
815
+ $case: "ptyWrite";
816
+ ptyWrite: PtyWriteRequest;
817
+ } | {
818
+ $case: "ptyResize";
819
+ ptyResize: PtyResizeRequest;
820
+ } | {
821
+ $case: "ptyClose";
822
+ ptyClose: PtyCloseRequest;
823
+ } | {
824
+ $case: "desktopEnsure";
825
+ desktopEnsure: DesktopEnsureRequest;
826
+ } | {
827
+ $case: "metrics";
828
+ metrics: MetricsRequest;
829
+ } | {
830
+ $case: "updateMayProceed";
831
+ updateMayProceed: UpdateMayProceedRequest;
832
+ } | {
833
+ $case: "desktopInput";
834
+ desktopInput: DesktopInputRequest;
835
+ } | {
836
+ $case: "desktopScreenshot";
837
+ desktopScreenshot: DesktopScreenshotRequest;
838
+ } | undefined;
839
+ }
840
+ declare const ControlRequest: MessageFns<ControlRequest>;
841
+ /** Wraps an op-specific response, or an error. `request_id` echoes the request. */
842
+ interface ControlResponse {
843
+ requestId: string;
844
+ /** Present when the op failed; when set, `result` is empty. */
845
+ error: AgentError | undefined;
846
+ result: {
847
+ $case: "ping";
848
+ ping: PingResponse;
849
+ } | {
850
+ $case: "hello";
851
+ hello: HelloAck;
852
+ } | {
853
+ $case: "resume";
854
+ resume: ResumeResponse;
855
+ } | {
856
+ $case: "exec";
857
+ exec: ExecResponse;
858
+ } | {
859
+ $case: "fsRead";
860
+ fsRead: FsReadResponse;
861
+ } | {
862
+ $case: "fsWrite";
863
+ fsWrite: FsWriteResponse;
864
+ } | {
865
+ $case: "fsList";
866
+ fsList: FsListResponse;
867
+ } | {
868
+ $case: "fsMkdir";
869
+ fsMkdir: FsMkdirResponse;
870
+ } | {
871
+ $case: "fsMove";
872
+ fsMove: FsMoveResponse;
873
+ } | {
874
+ $case: "fsStat";
875
+ fsStat: FsStatResponse;
876
+ } | {
877
+ $case: "fsRemove";
878
+ fsRemove: FsRemoveResponse;
879
+ } | {
880
+ $case: "git";
881
+ git: GitResponse;
882
+ } | {
883
+ $case: "ptyOpen";
884
+ ptyOpen: PtyOpenResponse;
885
+ } | {
886
+ $case: "ptyWrite";
887
+ ptyWrite: PtyWriteResponse;
888
+ } | {
889
+ $case: "ptyResize";
890
+ ptyResize: PtyResizeResponse;
891
+ } | {
892
+ $case: "ptyClose";
893
+ ptyClose: PtyCloseResponse;
894
+ } | {
895
+ $case: "desktopEnsure";
896
+ desktopEnsure: DesktopEnsureResponse;
897
+ } | {
898
+ $case: "metrics";
899
+ metrics: MetricsSample;
900
+ } | {
901
+ $case: "updateMayProceed";
902
+ updateMayProceed: UpdateMayProceedResponse;
903
+ } | {
904
+ $case: "desktopInput";
905
+ desktopInput: DesktopInputResponse;
906
+ } | {
907
+ $case: "desktopScreenshot";
908
+ desktopScreenshot: DesktopScreenshotResponse;
909
+ } | undefined;
910
+ }
911
+ declare const ControlResponse: MessageFns<ControlResponse>;
912
+ /**
913
+ * The control plane's acknowledgement of a Hello, carrying the epoch it assigned
914
+ * and a resume token for the next reconnect.
915
+ */
916
+ interface HelloAck {
917
+ epoch: number;
918
+ resumeToken: string;
919
+ /** The heartbeat interval the agent should use. */
920
+ heartbeatIntervalMs: number;
921
+ }
922
+ declare const HelloAck: MessageFns<HelloAck>;
923
+ /**
924
+ * Wraps a message the AGENT originates (not a reply to a ControlRequest):
925
+ * heartbeats, the clean going-offline signal. These are published on the agent's
926
+ * outbound subject; the control plane folds them into lease/metrics state.
927
+ */
928
+ interface AgentEvent {
929
+ agentId: string;
930
+ event: {
931
+ $case: "heartbeat";
932
+ heartbeat: Heartbeat;
933
+ } | {
934
+ $case: "goingOffline";
935
+ goingOffline: GoingOffline;
936
+ } | undefined;
937
+ }
938
+ declare const AgentEvent: MessageFns<AgentEvent>;
939
+ /** The control plane's ack of an AgentEvent (e.g. a HeartbeatAck). */
940
+ interface AgentEventAck {
941
+ ack: {
942
+ $case: "heartbeat";
943
+ heartbeat: HeartbeatAck;
944
+ } | undefined;
945
+ }
946
+ declare const AgentEventAck: MessageFns<AgentEventAck>;
947
+ /**
948
+ * Identifies a relay stream channel. The viewer/pty client connects to the
949
+ * relay with this channel's coordinates plus a scoped `ogs_` token; the agent
950
+ * dials out and registers the same channel. `{workspace_id, agent_id, port}`
951
+ * is the routing key.
952
+ */
953
+ interface StreamChannel {
954
+ channelId: string;
955
+ workspaceId: string;
956
+ agentId: string;
957
+ kind: StreamKind;
958
+ /** The logical port the channel maps to (so resolveExposedPort can address it). */
959
+ port: number;
960
+ }
961
+ declare const StreamChannel: MessageFns<StreamChannel>;
962
+ /**
963
+ * Open a stream channel on the relay. Sent by both ends (agent registers; client
964
+ * attaches) as the first frame of a relay connection.
965
+ */
966
+ interface StreamOpen {
967
+ channel: StreamChannel | undefined;
968
+ /**
969
+ * The scoped stream token (`ogs_` envelope) authorizing this channel; the
970
+ * relay validates authenticity + the lease/active-epoch fence.
971
+ */
972
+ token: string;
973
+ /** Whether the sender is the producing agent or the consuming viewer. */
974
+ role: StreamRole;
975
+ /**
976
+ * For resume: the last frame sequence the sender successfully processed, so
977
+ * the peer can replay from there after a reconnect blip.
978
+ */
979
+ resumeFromSeq: string;
980
+ }
981
+ declare const StreamOpen: MessageFns<StreamOpen>;
982
+ /** The relay's acknowledgement of a StreamOpen. */
983
+ interface StreamOpenAck {
984
+ accepted: boolean;
985
+ error: AgentError | undefined;
986
+ /** The sequence the peer will resume sending from. */
987
+ resumeFromSeq: string;
988
+ }
989
+ declare const StreamOpenAck: MessageFns<StreamOpenAck>;
990
+ /**
991
+ * A data frame carrying raw stream bytes in either direction. `seq` is a
992
+ * monotonic per-channel-per-direction counter enabling resume-from-seq. For a
993
+ * DESKTOP channel `data` is an encoded framebuffer chunk; for PTY it is raw tty
994
+ * bytes. Input (client→agent) for desktop computer-use rides DesktopInput
995
+ * instead so synthetic events are typed, not opaque bytes.
996
+ */
997
+ interface StreamFrame {
998
+ channelId: string;
999
+ seq: string;
1000
+ data: Uint8Array;
1001
+ /** Unix epoch ms the frame was produced (for latency/lag metrics). */
1002
+ producedAtMs: string;
1003
+ }
1004
+ declare const StreamFrame: MessageFns<StreamFrame>;
1005
+ /**
1006
+ * Close a stream channel. Either end may send it; the relay tears down the
1007
+ * channel and notifies the peer.
1008
+ */
1009
+ interface StreamClose {
1010
+ channelId: string;
1011
+ reason: StreamCloseReason;
1012
+ message: string;
1013
+ }
1014
+ declare const StreamClose: MessageFns<StreamClose>;
1015
+ /**
1016
+ * Typed computer-use input from a client to a desktop channel (client→agent).
1017
+ * Synthetic input is gated on consented_screen_control; an ungated input op
1018
+ * fails with ERROR_CODE_CONSENT_REQUIRED.
1019
+ */
1020
+ interface DesktopInput {
1021
+ channelId: string;
1022
+ event: {
1023
+ $case: "pointer";
1024
+ pointer: PointerEvent;
1025
+ } | {
1026
+ $case: "key";
1027
+ key: KeyEvent;
1028
+ } | {
1029
+ $case: "scroll";
1030
+ scroll: ScrollEvent;
1031
+ } | undefined;
1032
+ }
1033
+ declare const DesktopInput: MessageFns<DesktopInput>;
1034
+ interface PointerEvent {
1035
+ x: number;
1036
+ y: number;
1037
+ action: PointerAction;
1038
+ button: PointerButton;
1039
+ }
1040
+ declare const PointerEvent: MessageFns<PointerEvent>;
1041
+ interface KeyEvent {
1042
+ /** A platform-independent key name (e.g. "Enter", "a", "ctrl+c") OR text to type. */
1043
+ key: string;
1044
+ isText: boolean;
1045
+ action: KeyAction;
1046
+ }
1047
+ declare const KeyEvent: MessageFns<KeyEvent>;
1048
+ interface ScrollEvent {
1049
+ x: number;
1050
+ y: number;
1051
+ deltaX: number;
1052
+ deltaY: number;
1053
+ }
1054
+ declare const ScrollEvent: MessageFns<ScrollEvent>;
1055
+ type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
1056
+ type DeepPartial<T> = T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {
1057
+ $case: string;
1058
+ } ? {
1059
+ [K in keyof Omit<T, "$case">]?: DeepPartial<T[K]>;
1060
+ } & {
1061
+ $case: T["$case"];
1062
+ } : T extends {} ? {
1063
+ [K in keyof T]?: DeepPartial<T[K]>;
1064
+ } : Partial<T>;
1065
+ type KeysOfUnion<T> = T extends T ? keyof T : never;
1066
+ type Exact<P, I extends P> = P extends Builtin ? P : P & {
1067
+ [K in keyof P]: Exact<P[K], I[K]>;
1068
+ } & {
1069
+ [K in Exclude<keyof I, KeysOfUnion<P>>]: never;
1070
+ };
1071
+ interface MessageFns<T> {
1072
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
1073
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
1074
+ fromJSON(object: any): T;
1075
+ toJSON(message: T): unknown;
1076
+ create<I extends Exact<DeepPartial<T>, I>>(base?: I): T;
1077
+ fromPartial<I extends Exact<DeepPartial<T>, I>>(object: I): T;
1078
+ }
1079
+
1080
+ export { AgentError, AgentError_DetailEntry, AgentEvent, AgentEventAck, Arch, Capabilities, ControlRequest, ControlResponse, type DeepPartial, DesktopEnsureRequest, DesktopEnsureResponse, DesktopInput, DesktopInputRequest, DesktopInputResponse, DesktopScreenshotRequest, DesktopScreenshotResponse, DeviceAuthPollRequest, DeviceAuthPollResponse, DeviceAuthStartRequest, DeviceAuthStartResponse, DeviceAuthState, Display, EnrollmentCredentials, ErrorCode, type Exact, ExecRequest, ExecRequest_EnvEntry, ExecResponse, FsEntry, FsEntryKind, FsListRequest, FsListResponse, FsMkdirRequest, FsMkdirResponse, FsMoveRequest, FsMoveResponse, FsReadRequest, FsReadResponse, FsRemoveRequest, FsRemoveResponse, FsStatRequest, FsStatResponse, FsWriteRequest, FsWriteResponse, GitFileStatus, GitOp, GitRequest, GitResponse, GitStatus, GoingOffline, GoingOfflineReason, GpuSample, Heartbeat, HeartbeatAck, Hello, HelloAck, KeyAction, KeyEvent, type MessageFns, MetricsRequest, MetricsSample, Os, PingRequest, PingResponse, PointerAction, PointerButton, PointerEvent, PtyCloseRequest, PtyCloseResponse, PtyOpenRequest, PtyOpenRequest_EnvEntry, PtyOpenResponse, PtyResizeRequest, PtyResizeResponse, PtyWriteRequest, PtyWriteResponse, ResumeRequest, ResumeResponse, ScrollEvent, StreamChannel, StreamClose, StreamCloseReason, StreamFrame, StreamKind, StreamOpen, StreamOpenAck, StreamRole, UpdateArtifact, UpdateCheckRequest, UpdateCheckResponse, UpdateManifest, UpdateMayProceedRequest, UpdateMayProceedResponse, archFromJSON, archToJSON, deviceAuthStateFromJSON, deviceAuthStateToJSON, errorCodeFromJSON, errorCodeToJSON, fsEntryKindFromJSON, fsEntryKindToJSON, gitOpFromJSON, gitOpToJSON, goingOfflineReasonFromJSON, goingOfflineReasonToJSON, keyActionFromJSON, keyActionToJSON, osFromJSON, osToJSON, pointerActionFromJSON, pointerActionToJSON, pointerButtonFromJSON, pointerButtonToJSON, protobufPackage, streamCloseReasonFromJSON, streamCloseReasonToJSON, streamKindFromJSON, streamKindToJSON, streamRoleFromJSON, streamRoleToJSON };