@kdonev/termscape 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.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +288 -0
  3. package/dist/agents/env.d.ts +36 -0
  4. package/dist/agents/env.d.ts.map +1 -0
  5. package/dist/agents/env.js +61 -0
  6. package/dist/agents/env.js.map +1 -0
  7. package/dist/agents/profiles.d.ts +45 -0
  8. package/dist/agents/profiles.d.ts.map +1 -0
  9. package/dist/agents/profiles.js +123 -0
  10. package/dist/agents/profiles.js.map +1 -0
  11. package/dist/agents/resolve.d.ts +16 -0
  12. package/dist/agents/resolve.d.ts.map +1 -0
  13. package/dist/agents/resolve.js +71 -0
  14. package/dist/agents/resolve.js.map +1 -0
  15. package/dist/agents/router.d.ts +29 -0
  16. package/dist/agents/router.d.ts.map +1 -0
  17. package/dist/agents/router.js +83 -0
  18. package/dist/agents/router.js.map +1 -0
  19. package/dist/agents/tokens.d.ts +21 -0
  20. package/dist/agents/tokens.d.ts.map +1 -0
  21. package/dist/agents/tokens.js +39 -0
  22. package/dist/agents/tokens.js.map +1 -0
  23. package/dist/agents/wiring.d.ts +30 -0
  24. package/dist/agents/wiring.d.ts.map +1 -0
  25. package/dist/agents/wiring.js +110 -0
  26. package/dist/agents/wiring.js.map +1 -0
  27. package/dist/browser.d.ts +13 -0
  28. package/dist/browser.d.ts.map +1 -0
  29. package/dist/browser.js +34 -0
  30. package/dist/browser.js.map +1 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +200 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/db/index.d.ts +14 -0
  36. package/dist/db/index.d.ts.map +1 -0
  37. package/dist/db/index.js +24 -0
  38. package/dist/db/index.js.map +1 -0
  39. package/dist/db/migrations.d.ts +15 -0
  40. package/dist/db/migrations.d.ts.map +1 -0
  41. package/dist/db/migrations.js +176 -0
  42. package/dist/db/migrations.js.map +1 -0
  43. package/dist/db/store.d.ts +71 -0
  44. package/dist/db/store.d.ts.map +1 -0
  45. package/dist/db/store.js +341 -0
  46. package/dist/db/store.js.map +1 -0
  47. package/dist/hub.d.ts +188 -0
  48. package/dist/hub.d.ts.map +1 -0
  49. package/dist/hub.js +636 -0
  50. package/dist/hub.js.map +1 -0
  51. package/dist/hub.tgz +0 -0
  52. package/dist/mcp/server.d.ts +31 -0
  53. package/dist/mcp/server.d.ts.map +1 -0
  54. package/dist/mcp/server.js +66 -0
  55. package/dist/mcp/server.js.map +1 -0
  56. package/dist/paths.d.ts +27 -0
  57. package/dist/paths.d.ts.map +1 -0
  58. package/dist/paths.js +31 -0
  59. package/dist/paths.js.map +1 -0
  60. package/dist/protocol/address.d.ts +15 -0
  61. package/dist/protocol/address.d.ts.map +1 -0
  62. package/dist/protocol/address.js +39 -0
  63. package/dist/protocol/address.js.map +1 -0
  64. package/dist/protocol/domain.d.ts +151 -0
  65. package/dist/protocol/domain.d.ts.map +1 -0
  66. package/dist/protocol/domain.js +104 -0
  67. package/dist/protocol/domain.js.map +1 -0
  68. package/dist/protocol/index.d.ts +7 -0
  69. package/dist/protocol/index.d.ts.map +1 -0
  70. package/dist/protocol/index.js +7 -0
  71. package/dist/protocol/index.js.map +1 -0
  72. package/dist/protocol/inject.d.ts +29 -0
  73. package/dist/protocol/inject.d.ts.map +1 -0
  74. package/dist/protocol/inject.js +40 -0
  75. package/dist/protocol/inject.js.map +1 -0
  76. package/dist/protocol/mcp-tools.d.ts +45 -0
  77. package/dist/protocol/mcp-tools.d.ts.map +1 -0
  78. package/dist/protocol/mcp-tools.js +46 -0
  79. package/dist/protocol/mcp-tools.js.map +1 -0
  80. package/dist/protocol/peer.d.ts +304 -0
  81. package/dist/protocol/peer.d.ts.map +1 -0
  82. package/dist/protocol/peer.js +183 -0
  83. package/dist/protocol/peer.js.map +1 -0
  84. package/dist/protocol/ws.d.ts +416 -0
  85. package/dist/protocol/ws.d.ts.map +1 -0
  86. package/dist/protocol/ws.js +119 -0
  87. package/dist/protocol/ws.js.map +1 -0
  88. package/dist/remote/deployer.d.ts +78 -0
  89. package/dist/remote/deployer.d.ts.map +1 -0
  90. package/dist/remote/deployer.js +216 -0
  91. package/dist/remote/deployer.js.map +1 -0
  92. package/dist/remote/enroll.d.ts +14 -0
  93. package/dist/remote/enroll.d.ts.map +1 -0
  94. package/dist/remote/enroll.js +244 -0
  95. package/dist/remote/enroll.js.map +1 -0
  96. package/dist/remote/join-script.d.ts +29 -0
  97. package/dist/remote/join-script.d.ts.map +1 -0
  98. package/dist/remote/join-script.js +709 -0
  99. package/dist/remote/join-script.js.map +1 -0
  100. package/dist/remote/join.d.ts +19 -0
  101. package/dist/remote/join.d.ts.map +1 -0
  102. package/dist/remote/join.js +195 -0
  103. package/dist/remote/join.js.map +1 -0
  104. package/dist/remote/lan.d.ts +45 -0
  105. package/dist/remote/lan.d.ts.map +1 -0
  106. package/dist/remote/lan.js +105 -0
  107. package/dist/remote/lan.js.map +1 -0
  108. package/dist/remote/peer-serve.d.ts +27 -0
  109. package/dist/remote/peer-serve.d.ts.map +1 -0
  110. package/dist/remote/peer-serve.js +274 -0
  111. package/dist/remote/peer-serve.js.map +1 -0
  112. package/dist/remote/peer.d.ts +62 -0
  113. package/dist/remote/peer.d.ts.map +1 -0
  114. package/dist/remote/peer.js +250 -0
  115. package/dist/remote/peer.js.map +1 -0
  116. package/dist/remote/registry.d.ts +104 -0
  117. package/dist/remote/registry.d.ts.map +1 -0
  118. package/dist/remote/registry.js +359 -0
  119. package/dist/remote/registry.js.map +1 -0
  120. package/dist/remote/tarball.d.ts +9 -0
  121. package/dist/remote/tarball.d.ts.map +1 -0
  122. package/dist/remote/tarball.js +22 -0
  123. package/dist/remote/tarball.js.map +1 -0
  124. package/dist/server.d.ts +54 -0
  125. package/dist/server.d.ts.map +1 -0
  126. package/dist/server.js +438 -0
  127. package/dist/server.js.map +1 -0
  128. package/dist/session/manager.d.ts +104 -0
  129. package/dist/session/manager.d.ts.map +1 -0
  130. package/dist/session/manager.js +421 -0
  131. package/dist/session/manager.js.map +1 -0
  132. package/dist/session/pty.d.ts +114 -0
  133. package/dist/session/pty.d.ts.map +1 -0
  134. package/dist/session/pty.js +300 -0
  135. package/dist/session/pty.js.map +1 -0
  136. package/package.json +49 -0
  137. package/web/assets/index-B2JtCtHa.css +1 -0
  138. package/web/assets/index-BOqZOoep.js +107 -0
  139. package/web/index.html +13 -0
@@ -0,0 +1,416 @@
1
+ import { z } from 'zod';
2
+ export declare const BinaryFrameKind: {
3
+ readonly PtyOutput: 1;
4
+ readonly PtyInput: 2;
5
+ };
6
+ export type BinaryFrameKind = (typeof BinaryFrameKind)[keyof typeof BinaryFrameKind];
7
+ export declare function encodeBinaryFrame(kind: BinaryFrameKind, sessionId: string, payload: Uint8Array): Uint8Array;
8
+ export interface DecodedBinaryFrame {
9
+ kind: number;
10
+ sessionId: string;
11
+ payload: Uint8Array;
12
+ }
13
+ export declare function decodeBinaryFrame(buf: Uint8Array): DecodedBinaryFrame;
14
+ export declare const ClientMsg: z.ZodDiscriminatedUnion<[z.ZodObject<{
15
+ t: z.ZodLiteral<"hello">;
16
+ token: z.ZodString;
17
+ }, z.core.$strip>, z.ZodObject<{
18
+ t: z.ZodLiteral<"attach">;
19
+ sessionId: z.ZodString;
20
+ }, z.core.$strip>, z.ZodObject<{
21
+ t: z.ZodLiteral<"detach">;
22
+ sessionId: z.ZodString;
23
+ }, z.core.$strip>, z.ZodObject<{
24
+ t: z.ZodLiteral<"resize">;
25
+ sessionId: z.ZodString;
26
+ cols: z.ZodNumber;
27
+ rows: z.ZodNumber;
28
+ }, z.core.$strip>, z.ZodObject<{
29
+ t: z.ZodLiteral<"createWorkspace">;
30
+ name: z.ZodString;
31
+ rootPath: z.ZodString;
32
+ hostId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
33
+ }, z.core.$strip>, z.ZodObject<{
34
+ t: z.ZodLiteral<"removeWorkspace">;
35
+ workspaceId: z.ZodString;
36
+ }, z.core.$strip>, z.ZodObject<{
37
+ t: z.ZodLiteral<"startSession">;
38
+ workspaceId: z.ZodString;
39
+ profile: z.ZodString;
40
+ name: z.ZodOptional<z.ZodString>;
41
+ cwd: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strip>, z.ZodObject<{
43
+ t: z.ZodLiteral<"stopSession">;
44
+ sessionId: z.ZodString;
45
+ }, z.core.$strip>, z.ZodObject<{
46
+ t: z.ZodLiteral<"removeSession">;
47
+ sessionId: z.ZodString;
48
+ }, z.core.$strip>, z.ZodObject<{
49
+ t: z.ZodLiteral<"resumeSession">;
50
+ sessionId: z.ZodString;
51
+ }, z.core.$strip>, z.ZodObject<{
52
+ t: z.ZodLiteral<"resumeWorkspace">;
53
+ workspaceId: z.ZodString;
54
+ }, z.core.$strip>, z.ZodObject<{
55
+ t: z.ZodLiteral<"moveWindow">;
56
+ sessionId: z.ZodString;
57
+ rect: z.ZodObject<{
58
+ x: z.ZodNumber;
59
+ y: z.ZodNumber;
60
+ w: z.ZodNumber;
61
+ h: z.ZodNumber;
62
+ z: z.ZodNumber;
63
+ collapsed: z.ZodBoolean;
64
+ }, z.core.$strip>;
65
+ }, z.core.$strip>, z.ZodObject<{
66
+ t: z.ZodLiteral<"setViewport">;
67
+ viewport: z.ZodObject<{
68
+ panX: z.ZodNumber;
69
+ panY: z.ZodNumber;
70
+ zoom: z.ZodNumber;
71
+ }, z.core.$strip>;
72
+ }, z.core.$strip>, z.ZodObject<{
73
+ t: z.ZodLiteral<"addHost">;
74
+ label: z.ZodString;
75
+ sshHost: z.ZodString;
76
+ sshUser: z.ZodString;
77
+ sshPort: z.ZodDefault<z.ZodNumber>;
78
+ privateKeyPath: z.ZodOptional<z.ZodString>;
79
+ }, z.core.$strip>, z.ZodObject<{
80
+ t: z.ZodLiteral<"removeHost">;
81
+ hostId: z.ZodString;
82
+ }, z.core.$strip>, z.ZodObject<{
83
+ t: z.ZodLiteral<"connectHost">;
84
+ hostId: z.ZodString;
85
+ }, z.core.$strip>], "t">;
86
+ export type ClientMsg = z.infer<typeof ClientMsg>;
87
+ export declare const HubState: z.ZodObject<{
88
+ hubVersion: z.ZodString;
89
+ enrollUrl: z.ZodNullable<z.ZodString>;
90
+ enrollAltUrl: z.ZodNullable<z.ZodString>;
91
+ hosts: z.ZodArray<z.ZodObject<{
92
+ id: z.ZodString;
93
+ label: z.ZodString;
94
+ kind: z.ZodDefault<z.ZodEnum<{
95
+ ssh: "ssh";
96
+ enrolled: "enrolled";
97
+ }>>;
98
+ sshHost: z.ZodNullable<z.ZodString>;
99
+ sshUser: z.ZodNullable<z.ZodString>;
100
+ sshPort: z.ZodDefault<z.ZodNumber>;
101
+ platform: z.ZodNullable<z.ZodString>;
102
+ hubVersion: z.ZodNullable<z.ZodString>;
103
+ state: z.ZodEnum<{
104
+ error: "error";
105
+ disconnected: "disconnected";
106
+ connecting: "connecting";
107
+ connected: "connected";
108
+ }>;
109
+ lastSeenAt: z.ZodNullable<z.ZodNumber>;
110
+ error: z.ZodNullable<z.ZodString>;
111
+ }, z.core.$strip>>;
112
+ workspaces: z.ZodArray<z.ZodObject<{
113
+ id: z.ZodString;
114
+ name: z.ZodString;
115
+ kind: z.ZodEnum<{
116
+ local: "local";
117
+ remote: "remote";
118
+ }>;
119
+ rootPath: z.ZodString;
120
+ hostId: z.ZodNullable<z.ZodString>;
121
+ color: z.ZodString;
122
+ createdAt: z.ZodNumber;
123
+ archivedAt: z.ZodNullable<z.ZodNumber>;
124
+ }, z.core.$strip>>;
125
+ sessions: z.ZodArray<z.ZodObject<{
126
+ id: z.ZodString;
127
+ workspaceId: z.ZodString;
128
+ name: z.ZodString;
129
+ address: z.ZodString;
130
+ profile: z.ZodString;
131
+ cwd: z.ZodString;
132
+ agentSessionUuid: z.ZodNullable<z.ZodString>;
133
+ spawnedBy: z.ZodNullable<z.ZodString>;
134
+ state: z.ZodEnum<{
135
+ starting: "starting";
136
+ running: "running";
137
+ stopped: "stopped";
138
+ exited: "exited";
139
+ failed: "failed";
140
+ }>;
141
+ status: z.ZodEnum<{
142
+ idle: "idle";
143
+ busy: "busy";
144
+ unknown: "unknown";
145
+ }>;
146
+ statusText: z.ZodNullable<z.ZodString>;
147
+ title: z.ZodNullable<z.ZodString>;
148
+ pid: z.ZodNullable<z.ZodNumber>;
149
+ exitCode: z.ZodNullable<z.ZodNumber>;
150
+ cols: z.ZodNumber;
151
+ rows: z.ZodNumber;
152
+ resumable: z.ZodBoolean;
153
+ createdAt: z.ZodNumber;
154
+ exitedAt: z.ZodNullable<z.ZodNumber>;
155
+ lastActiveAt: z.ZodNumber;
156
+ window: z.ZodObject<{
157
+ x: z.ZodNumber;
158
+ y: z.ZodNumber;
159
+ w: z.ZodNumber;
160
+ h: z.ZodNumber;
161
+ z: z.ZodNumber;
162
+ collapsed: z.ZodBoolean;
163
+ }, z.core.$strip>;
164
+ }, z.core.$strip>>;
165
+ messages: z.ZodArray<z.ZodObject<{
166
+ id: z.ZodString;
167
+ fromAddr: z.ZodString;
168
+ toAddr: z.ZodString;
169
+ body: z.ZodString;
170
+ sentAt: z.ZodNumber;
171
+ deliveredAt: z.ZodNullable<z.ZodNumber>;
172
+ deliveryState: z.ZodEnum<{
173
+ failed: "failed";
174
+ delivered: "delivered";
175
+ }>;
176
+ error: z.ZodNullable<z.ZodString>;
177
+ }, z.core.$strip>>;
178
+ viewport: z.ZodObject<{
179
+ panX: z.ZodNumber;
180
+ panY: z.ZodNumber;
181
+ zoom: z.ZodNumber;
182
+ }, z.core.$strip>;
183
+ profiles: z.ZodArray<z.ZodObject<{
184
+ id: z.ZodString;
185
+ description: z.ZodString;
186
+ mcp: z.ZodBoolean;
187
+ resumable: z.ZodBoolean;
188
+ }, z.core.$strip>>;
189
+ }, z.core.$strip>;
190
+ export type HubState = z.infer<typeof HubState>;
191
+ export declare const ServerMsg: z.ZodDiscriminatedUnion<[z.ZodObject<{
192
+ t: z.ZodLiteral<"ready">;
193
+ state: z.ZodObject<{
194
+ hubVersion: z.ZodString;
195
+ enrollUrl: z.ZodNullable<z.ZodString>;
196
+ enrollAltUrl: z.ZodNullable<z.ZodString>;
197
+ hosts: z.ZodArray<z.ZodObject<{
198
+ id: z.ZodString;
199
+ label: z.ZodString;
200
+ kind: z.ZodDefault<z.ZodEnum<{
201
+ ssh: "ssh";
202
+ enrolled: "enrolled";
203
+ }>>;
204
+ sshHost: z.ZodNullable<z.ZodString>;
205
+ sshUser: z.ZodNullable<z.ZodString>;
206
+ sshPort: z.ZodDefault<z.ZodNumber>;
207
+ platform: z.ZodNullable<z.ZodString>;
208
+ hubVersion: z.ZodNullable<z.ZodString>;
209
+ state: z.ZodEnum<{
210
+ error: "error";
211
+ disconnected: "disconnected";
212
+ connecting: "connecting";
213
+ connected: "connected";
214
+ }>;
215
+ lastSeenAt: z.ZodNullable<z.ZodNumber>;
216
+ error: z.ZodNullable<z.ZodString>;
217
+ }, z.core.$strip>>;
218
+ workspaces: z.ZodArray<z.ZodObject<{
219
+ id: z.ZodString;
220
+ name: z.ZodString;
221
+ kind: z.ZodEnum<{
222
+ local: "local";
223
+ remote: "remote";
224
+ }>;
225
+ rootPath: z.ZodString;
226
+ hostId: z.ZodNullable<z.ZodString>;
227
+ color: z.ZodString;
228
+ createdAt: z.ZodNumber;
229
+ archivedAt: z.ZodNullable<z.ZodNumber>;
230
+ }, z.core.$strip>>;
231
+ sessions: z.ZodArray<z.ZodObject<{
232
+ id: z.ZodString;
233
+ workspaceId: z.ZodString;
234
+ name: z.ZodString;
235
+ address: z.ZodString;
236
+ profile: z.ZodString;
237
+ cwd: z.ZodString;
238
+ agentSessionUuid: z.ZodNullable<z.ZodString>;
239
+ spawnedBy: z.ZodNullable<z.ZodString>;
240
+ state: z.ZodEnum<{
241
+ starting: "starting";
242
+ running: "running";
243
+ stopped: "stopped";
244
+ exited: "exited";
245
+ failed: "failed";
246
+ }>;
247
+ status: z.ZodEnum<{
248
+ idle: "idle";
249
+ busy: "busy";
250
+ unknown: "unknown";
251
+ }>;
252
+ statusText: z.ZodNullable<z.ZodString>;
253
+ title: z.ZodNullable<z.ZodString>;
254
+ pid: z.ZodNullable<z.ZodNumber>;
255
+ exitCode: z.ZodNullable<z.ZodNumber>;
256
+ cols: z.ZodNumber;
257
+ rows: z.ZodNumber;
258
+ resumable: z.ZodBoolean;
259
+ createdAt: z.ZodNumber;
260
+ exitedAt: z.ZodNullable<z.ZodNumber>;
261
+ lastActiveAt: z.ZodNumber;
262
+ window: z.ZodObject<{
263
+ x: z.ZodNumber;
264
+ y: z.ZodNumber;
265
+ w: z.ZodNumber;
266
+ h: z.ZodNumber;
267
+ z: z.ZodNumber;
268
+ collapsed: z.ZodBoolean;
269
+ }, z.core.$strip>;
270
+ }, z.core.$strip>>;
271
+ messages: z.ZodArray<z.ZodObject<{
272
+ id: z.ZodString;
273
+ fromAddr: z.ZodString;
274
+ toAddr: z.ZodString;
275
+ body: z.ZodString;
276
+ sentAt: z.ZodNumber;
277
+ deliveredAt: z.ZodNullable<z.ZodNumber>;
278
+ deliveryState: z.ZodEnum<{
279
+ failed: "failed";
280
+ delivered: "delivered";
281
+ }>;
282
+ error: z.ZodNullable<z.ZodString>;
283
+ }, z.core.$strip>>;
284
+ viewport: z.ZodObject<{
285
+ panX: z.ZodNumber;
286
+ panY: z.ZodNumber;
287
+ zoom: z.ZodNumber;
288
+ }, z.core.$strip>;
289
+ profiles: z.ZodArray<z.ZodObject<{
290
+ id: z.ZodString;
291
+ description: z.ZodString;
292
+ mcp: z.ZodBoolean;
293
+ resumable: z.ZodBoolean;
294
+ }, z.core.$strip>>;
295
+ }, z.core.$strip>;
296
+ }, z.core.$strip>, z.ZodObject<{
297
+ t: z.ZodLiteral<"sessionUpserted">;
298
+ session: z.ZodObject<{
299
+ id: z.ZodString;
300
+ workspaceId: z.ZodString;
301
+ name: z.ZodString;
302
+ address: z.ZodString;
303
+ profile: z.ZodString;
304
+ cwd: z.ZodString;
305
+ agentSessionUuid: z.ZodNullable<z.ZodString>;
306
+ spawnedBy: z.ZodNullable<z.ZodString>;
307
+ state: z.ZodEnum<{
308
+ starting: "starting";
309
+ running: "running";
310
+ stopped: "stopped";
311
+ exited: "exited";
312
+ failed: "failed";
313
+ }>;
314
+ status: z.ZodEnum<{
315
+ idle: "idle";
316
+ busy: "busy";
317
+ unknown: "unknown";
318
+ }>;
319
+ statusText: z.ZodNullable<z.ZodString>;
320
+ title: z.ZodNullable<z.ZodString>;
321
+ pid: z.ZodNullable<z.ZodNumber>;
322
+ exitCode: z.ZodNullable<z.ZodNumber>;
323
+ cols: z.ZodNumber;
324
+ rows: z.ZodNumber;
325
+ resumable: z.ZodBoolean;
326
+ createdAt: z.ZodNumber;
327
+ exitedAt: z.ZodNullable<z.ZodNumber>;
328
+ lastActiveAt: z.ZodNumber;
329
+ window: z.ZodObject<{
330
+ x: z.ZodNumber;
331
+ y: z.ZodNumber;
332
+ w: z.ZodNumber;
333
+ h: z.ZodNumber;
334
+ z: z.ZodNumber;
335
+ collapsed: z.ZodBoolean;
336
+ }, z.core.$strip>;
337
+ }, z.core.$strip>;
338
+ }, z.core.$strip>, z.ZodObject<{
339
+ t: z.ZodLiteral<"sessionRemoved">;
340
+ sessionId: z.ZodString;
341
+ }, z.core.$strip>, z.ZodObject<{
342
+ t: z.ZodLiteral<"workspaceUpserted">;
343
+ workspace: z.ZodObject<{
344
+ id: z.ZodString;
345
+ name: z.ZodString;
346
+ kind: z.ZodEnum<{
347
+ local: "local";
348
+ remote: "remote";
349
+ }>;
350
+ rootPath: z.ZodString;
351
+ hostId: z.ZodNullable<z.ZodString>;
352
+ color: z.ZodString;
353
+ createdAt: z.ZodNumber;
354
+ archivedAt: z.ZodNullable<z.ZodNumber>;
355
+ }, z.core.$strip>;
356
+ }, z.core.$strip>, z.ZodObject<{
357
+ t: z.ZodLiteral<"workspaceRemoved">;
358
+ workspaceId: z.ZodString;
359
+ }, z.core.$strip>, z.ZodObject<{
360
+ t: z.ZodLiteral<"hostUpserted">;
361
+ host: z.ZodObject<{
362
+ id: z.ZodString;
363
+ label: z.ZodString;
364
+ kind: z.ZodDefault<z.ZodEnum<{
365
+ ssh: "ssh";
366
+ enrolled: "enrolled";
367
+ }>>;
368
+ sshHost: z.ZodNullable<z.ZodString>;
369
+ sshUser: z.ZodNullable<z.ZodString>;
370
+ sshPort: z.ZodDefault<z.ZodNumber>;
371
+ platform: z.ZodNullable<z.ZodString>;
372
+ hubVersion: z.ZodNullable<z.ZodString>;
373
+ state: z.ZodEnum<{
374
+ error: "error";
375
+ disconnected: "disconnected";
376
+ connecting: "connecting";
377
+ connected: "connected";
378
+ }>;
379
+ lastSeenAt: z.ZodNullable<z.ZodNumber>;
380
+ error: z.ZodNullable<z.ZodString>;
381
+ }, z.core.$strip>;
382
+ }, z.core.$strip>, z.ZodObject<{
383
+ t: z.ZodLiteral<"hostRemoved">;
384
+ hostId: z.ZodString;
385
+ }, z.core.$strip>, z.ZodObject<{
386
+ t: z.ZodLiteral<"hostLog">;
387
+ hostId: z.ZodString;
388
+ line: z.ZodString;
389
+ }, z.core.$strip>, z.ZodObject<{
390
+ t: z.ZodLiteral<"messageSent">;
391
+ message: z.ZodObject<{
392
+ id: z.ZodString;
393
+ fromAddr: z.ZodString;
394
+ toAddr: z.ZodString;
395
+ body: z.ZodString;
396
+ sentAt: z.ZodNumber;
397
+ deliveredAt: z.ZodNullable<z.ZodNumber>;
398
+ deliveryState: z.ZodEnum<{
399
+ failed: "failed";
400
+ delivered: "delivered";
401
+ }>;
402
+ error: z.ZodNullable<z.ZodString>;
403
+ }, z.core.$strip>;
404
+ }, z.core.$strip>, z.ZodObject<{
405
+ t: z.ZodLiteral<"snapshot">;
406
+ sessionId: z.ZodString;
407
+ serialized: z.ZodString;
408
+ cols: z.ZodNumber;
409
+ rows: z.ZodNumber;
410
+ }, z.core.$strip>, z.ZodObject<{
411
+ t: z.ZodLiteral<"error">;
412
+ message: z.ZodString;
413
+ sessionId: z.ZodOptional<z.ZodString>;
414
+ }, z.core.$strip>], "t">;
415
+ export type ServerMsg = z.infer<typeof ServerMsg>;
416
+ //# sourceMappingURL=ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,eAAe;;;CAGlB,CAAC;AACX,MAAM,MAAM,eAAe,GACzB,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAEzD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,GAClB,UAAU,CASZ;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,kBAAkB,CAOrE;AAMD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAwCpB,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAElD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBnB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAqBpB,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { z } from 'zod';
2
+ import { Host, Message, Session, Viewport, Workspace, WindowRect, AgentProfileInfo, } from './domain.js';
3
+ /* ------------------------------------------------------------------ *
4
+ * Binary framing for PTY traffic.
5
+ *
6
+ * Control messages are JSON text frames; terminal bytes ride in binary
7
+ * frames so we never base64 the hot path. Layout:
8
+ * [0] frame kind
9
+ * [1] session id length (utf8 bytes, <= 255)
10
+ * [2..n] session id
11
+ * [n..] raw payload
12
+ * ------------------------------------------------------------------ */
13
+ export const BinaryFrameKind = {
14
+ PtyOutput: 0x01,
15
+ PtyInput: 0x02,
16
+ };
17
+ export function encodeBinaryFrame(kind, sessionId, payload) {
18
+ const id = new TextEncoder().encode(sessionId);
19
+ if (id.length > 255)
20
+ throw new Error('session id too long for binary frame');
21
+ const out = new Uint8Array(2 + id.length + payload.length);
22
+ out[0] = kind;
23
+ out[1] = id.length;
24
+ out.set(id, 2);
25
+ out.set(payload, 2 + id.length);
26
+ return out;
27
+ }
28
+ export function decodeBinaryFrame(buf) {
29
+ if (buf.length < 2)
30
+ throw new Error('binary frame too short');
31
+ const kind = buf[0];
32
+ const idLen = buf[1];
33
+ if (buf.length < 2 + idLen)
34
+ throw new Error('binary frame truncated');
35
+ const sessionId = new TextDecoder().decode(buf.subarray(2, 2 + idLen));
36
+ return { kind, sessionId, payload: buf.subarray(2 + idLen) };
37
+ }
38
+ /* ------------------------------------------------------------------ *
39
+ * Control messages
40
+ * ------------------------------------------------------------------ */
41
+ export const ClientMsg = z.discriminatedUnion('t', [
42
+ z.object({ t: z.literal('hello'), token: z.string() }),
43
+ // terminal attach / detach drives the LOD swap on the canvas
44
+ z.object({ t: z.literal('attach'), sessionId: z.string() }),
45
+ z.object({ t: z.literal('detach'), sessionId: z.string() }),
46
+ z.object({ t: z.literal('resize'), sessionId: z.string(), cols: z.number().int().positive(), rows: z.number().int().positive() }),
47
+ // workspaces
48
+ z.object({ t: z.literal('createWorkspace'), name: z.string().min(1), rootPath: z.string().min(1), hostId: z.string().nullable().optional() }),
49
+ z.object({ t: z.literal('removeWorkspace'), workspaceId: z.string() }),
50
+ // sessions
51
+ z.object({
52
+ t: z.literal('startSession'),
53
+ workspaceId: z.string(),
54
+ profile: z.string(),
55
+ name: z.string().optional(),
56
+ cwd: z.string().optional(),
57
+ }),
58
+ z.object({ t: z.literal('stopSession'), sessionId: z.string() }),
59
+ z.object({ t: z.literal('removeSession'), sessionId: z.string() }),
60
+ z.object({ t: z.literal('resumeSession'), sessionId: z.string() }),
61
+ z.object({ t: z.literal('resumeWorkspace'), workspaceId: z.string() }),
62
+ // canvas layout
63
+ z.object({ t: z.literal('moveWindow'), sessionId: z.string(), rect: WindowRect }),
64
+ z.object({ t: z.literal('setViewport'), viewport: Viewport }),
65
+ // hosts
66
+ z.object({
67
+ t: z.literal('addHost'),
68
+ label: z.string(),
69
+ sshHost: z.string(),
70
+ sshUser: z.string(),
71
+ sshPort: z.number().int().positive().default(22),
72
+ privateKeyPath: z.string().optional(),
73
+ }),
74
+ z.object({ t: z.literal('removeHost'), hostId: z.string() }),
75
+ z.object({ t: z.literal('connectHost'), hostId: z.string() }),
76
+ ]);
77
+ export const HubState = z.object({
78
+ hubVersion: z.string(),
79
+ /**
80
+ * Where another machine can reach this hub's join page, or null when the
81
+ * hub is bound to loopback and nothing else can see it.
82
+ */
83
+ enrollUrl: z.string().nullable(),
84
+ /**
85
+ * The same page by IP, when the primary uses this machine's name. A name
86
+ * only resolves if the other machine's network can resolve it, so the
87
+ * numeric form is always offered rather than assumed unnecessary.
88
+ */
89
+ enrollAltUrl: z.string().nullable(),
90
+ hosts: z.array(Host),
91
+ workspaces: z.array(Workspace),
92
+ sessions: z.array(Session),
93
+ messages: z.array(Message),
94
+ viewport: Viewport,
95
+ profiles: z.array(AgentProfileInfo),
96
+ });
97
+ export const ServerMsg = z.discriminatedUnion('t', [
98
+ z.object({ t: z.literal('ready'), state: HubState }),
99
+ z.object({ t: z.literal('sessionUpserted'), session: Session }),
100
+ z.object({ t: z.literal('sessionRemoved'), sessionId: z.string() }),
101
+ z.object({ t: z.literal('workspaceUpserted'), workspace: Workspace }),
102
+ z.object({ t: z.literal('workspaceRemoved'), workspaceId: z.string() }),
103
+ z.object({ t: z.literal('hostUpserted'), host: Host }),
104
+ z.object({ t: z.literal('hostRemoved'), hostId: z.string() }),
105
+ // Deploy progress. A remote install rebuilds native modules and takes
106
+ // minutes; without this the panel is a frozen button.
107
+ z.object({ t: z.literal('hostLog'), hostId: z.string(), line: z.string() }),
108
+ z.object({ t: z.literal('messageSent'), message: Message }),
109
+ // sent on attach: serialized screen, replayed before the live stream
110
+ z.object({
111
+ t: z.literal('snapshot'),
112
+ sessionId: z.string(),
113
+ serialized: z.string(),
114
+ cols: z.number(),
115
+ rows: z.number(),
116
+ }),
117
+ z.object({ t: z.literal('error'), message: z.string(), sessionId: z.string().optional() }),
118
+ ]);
119
+ //# sourceMappingURL=ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { type Server as NetServer } from 'node:net';
2
+ import { Client as SshClient } from 'ssh2';
3
+ /**
4
+ * Provisions and reaches a hub on a remote machine.
5
+ *
6
+ * The chosen model is a daemon on the remote host rather than an `ssh`
7
+ * subprocess per terminal, so remote sessions survive the SSH link dropping.
8
+ * That costs a deploy step, which is what most of this file is.
9
+ *
10
+ * The remote hub always binds 127.0.0.1 on its own machine. It is reachable
11
+ * only through the tunnel opened here, so it is never exposed on a network
12
+ * interface even briefly.
13
+ */
14
+ export interface HostCredentials {
15
+ sshHost: string;
16
+ sshUser: string;
17
+ sshPort: number;
18
+ privateKeyPath?: string;
19
+ passphrase?: string;
20
+ }
21
+ export interface DeployResult {
22
+ /** Loopback URL on *this* machine that tunnels to the remote hub. */
23
+ localUrl: string;
24
+ remotePort: number;
25
+ remoteHubVersion: string;
26
+ /** Close the tunnel and the SSH connection. */
27
+ dispose: () => Promise<void>;
28
+ }
29
+ export interface DeployOptions extends HostCredentials {
30
+ /** Token the remote hub will require on its /peer endpoint. */
31
+ token: string;
32
+ /** Local tarball produced by `npm pack`, uploaded when the remote is stale. */
33
+ packagePath?: string;
34
+ expectedVersion: string;
35
+ /** Where the hub lives on the remote machine. */
36
+ remoteDir?: string;
37
+ log?: (line: string) => void;
38
+ }
39
+ export declare function sshConnect(c: HostCredentials): Promise<SshClient>;
40
+ export interface ExecResult {
41
+ code: number;
42
+ stdout: string;
43
+ stderr: string;
44
+ }
45
+ export declare function exec(conn: SshClient, command: string): Promise<ExecResult>;
46
+ export interface Probe {
47
+ nodeVersion: string | null;
48
+ nodeMajor: number;
49
+ installedVersion: string | null;
50
+ }
51
+ /** What is already on the remote machine, before we change anything. */
52
+ export declare function probe(conn: SshClient, remoteDir?: string): Promise<Probe>;
53
+ /**
54
+ * Install or upgrade the hub on the remote machine. Native modules are rebuilt
55
+ * there, because node-pty and better-sqlite3 prebuilds are per platform and
56
+ * per architecture and the remote is frequently neither.
57
+ */
58
+ export declare function provision(conn: SshClient, opts: DeployOptions): Promise<void>;
59
+ /**
60
+ * Start the remote hub detached, so it outlives this SSH session — the whole
61
+ * reason for running a daemon instead of an ssh subprocess.
62
+ */
63
+ export declare function startRemoteHub(conn: SshClient, opts: DeployOptions): Promise<{
64
+ port: number;
65
+ version: string;
66
+ }>;
67
+ /**
68
+ * Local TCP listener that pipes every connection through the SSH channel to
69
+ * the remote hub's loopback port. Gives us a plain ws:// URL to hand the peer
70
+ * client, which keeps SSH entirely out of the peer protocol.
71
+ */
72
+ export declare function openTunnel(conn: SshClient, remotePort: number): Promise<{
73
+ localPort: number;
74
+ server: NetServer;
75
+ }>;
76
+ /** Probe, provision if needed, start, and tunnel. */
77
+ export declare function deploy(opts: DeployOptions): Promise<DeployResult>;
78
+ //# sourceMappingURL=deployer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.d.ts","sourceRoot":"","sources":["../../src/remote/deployer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,IAAI,SAAS,EAAE,MAAM,UAAU,CAAC;AAGlE,OAAO,EAAE,MAAM,IAAI,SAAS,EAAsB,MAAM,MAAM,CAAC;AAE/D;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAsBD,wBAAgB,UAAU,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAOjE;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW1E;AAED,MAAM,WAAW,KAAK;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wEAAwE;AACxE,wBAAsB,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,SAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,CAW3F;AAWD;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAyEf;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC5C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC,CAqBnD;AAED,qDAAqD;AACrD,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCvE"}