nikcli-remote 1.0.9 → 1.0.11

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.d.cts CHANGED
@@ -71,22 +71,6 @@ interface ClientMessage {
71
71
  type: string;
72
72
  [key: string]: unknown;
73
73
  }
74
- interface ServerMessage {
75
- type: string;
76
- payload?: unknown;
77
- timestamp: number;
78
- }
79
- interface TerminalData {
80
- data: string;
81
- }
82
- interface TerminalResize {
83
- cols: number;
84
- rows: number;
85
- }
86
- interface CommandMessage {
87
- command: string;
88
- args?: string[];
89
- }
90
74
  interface ClientConnection {
91
75
  id: string;
92
76
  authenticated: boolean;
@@ -118,8 +102,8 @@ declare const MessageTypes: {
118
102
  };
119
103
 
120
104
  /**
121
- * @nikcli/remote - Native Remote Server
122
- * WebSocket-based remote terminal with mobile-friendly web client
105
+ * @nikcli/remote - Direct Terminal Streaming Server
106
+ * Proxies NikCLI's stdin/stdout to WebSocket clients for true real-time terminal access
123
107
  */
124
108
 
125
109
  interface RemoteServerEvents {
@@ -130,13 +114,9 @@ interface RemoteServerEvents {
130
114
  'client:error': (clientId: string, error: Error) => void;
131
115
  'tunnel:connected': (url: string) => void;
132
116
  'tunnel:error': (error: Error) => void;
133
- command: (cmd: {
134
- clientId: string;
135
- command: string;
136
- args?: string[];
137
- }) => void;
138
117
  message: (client: ClientConnection, message: ClientMessage) => void;
139
118
  error: (error: Error) => void;
119
+ 'terminal:output': (data: string) => void;
140
120
  }
141
121
  declare class RemoteServer extends EventEmitter {
142
122
  private config;
@@ -144,19 +124,35 @@ declare class RemoteServer extends EventEmitter {
144
124
  private wss;
145
125
  private clients;
146
126
  private session;
147
- private terminal;
148
- private tunnel;
149
127
  private heartbeatTimer;
150
128
  private sessionTimeoutTimer;
151
129
  private isRunning;
152
130
  private sessionSecret;
131
+ private originalStdoutWrite;
132
+ private originalStdinOn;
153
133
  constructor(config?: Partial<ServerConfig>);
154
134
  /**
155
- * Start the remote server
135
+ * Generate a random secret
136
+ */
137
+ private generateSecret;
138
+ /**
139
+ * Start the remote server - creates WebSocket server that proxies stdin/stdout
156
140
  */
157
141
  start(options?: {
158
142
  name?: string;
143
+ processForStreaming?: {
144
+ stdout: NodeJS.WriteStream;
145
+ stdin: NodeJS.ReadStream;
146
+ };
159
147
  }): Promise<RemoteSession>;
148
+ /**
149
+ * Setup stdin/stdout proxy to forward to WebSocket clients
150
+ */
151
+ private setupStdioProxy;
152
+ /**
153
+ * Clean output for mobile display - remove ANSI codes and TUI artifacts
154
+ */
155
+ private cleanOutputForMobile;
160
156
  /**
161
157
  * Stop the server
162
158
  */
@@ -164,6 +160,10 @@ declare class RemoteServer extends EventEmitter {
164
160
  /**
165
161
  * Broadcast message to all authenticated clients
166
162
  */
163
+ private broadcastToAll;
164
+ /**
165
+ * Public broadcast method for compatibility
166
+ */
167
167
  broadcast(message: BroadcastMessage): void;
168
168
  /**
169
169
  * Send notification to clients
@@ -182,11 +182,15 @@ declare class RemoteServer extends EventEmitter {
182
182
  */
183
183
  getConnectedCount(): number;
184
184
  /**
185
- * Write to terminal
185
+ * Write data to all connected clients (for manual output streaming)
186
+ */
187
+ writeToClients(data: string): void;
188
+ /**
189
+ * Alias for writeToClients - for compatibility
186
190
  */
187
191
  writeToTerminal(data: string): void;
188
192
  /**
189
- * Resize terminal
193
+ * Resize terminal (for compatibility - not used in direct streaming mode)
190
194
  */
191
195
  resizeTerminal(cols: number, rows: number): void;
192
196
  /**
@@ -229,59 +233,65 @@ declare class RemoteServer extends EventEmitter {
229
233
  * Generate client ID
230
234
  */
231
235
  private generateClientId;
232
- /**
233
- * Generate secret
234
- */
235
- private generateSecret;
236
236
  }
237
237
 
238
238
  /**
239
- * @nikcli/remote - Terminal Manager
240
- * PTY-based terminal with fallback to basic spawn
239
+ * @nikcli/remote - Tunnel Manager
240
+ * Provides public URL access via various tunnel providers
241
241
  */
242
242
 
243
- interface TerminalConfig {
244
- shell: string;
245
- cols: number;
246
- rows: number;
247
- cwd?: string;
248
- env?: Record<string, string>;
243
+ interface TunnelResult {
244
+ url: string;
245
+ provider: TunnelProvider;
246
+ close: () => Promise<void>;
249
247
  }
250
- declare class TerminalManager extends EventEmitter {
251
- private config;
252
- private ptyProcess;
248
+ /**
249
+ * Create a tunnel for the given port using the specified provider
250
+ */
251
+ declare function createTunnel(port: number, provider?: TunnelProvider): Promise<TunnelResult>;
252
+ declare class TunnelManager {
253
+ private provider;
253
254
  private process;
254
- private running;
255
- constructor(config: TerminalConfig);
255
+ private url;
256
+ private tunnelInstance;
257
+ constructor(provider: TunnelProvider);
256
258
  /**
257
- * Start the terminal
259
+ * Create tunnel and return public URL
258
260
  */
259
- start(): void;
261
+ create(port: number): Promise<string>;
260
262
  /**
261
- * Write data to terminal
263
+ * Close tunnel
262
264
  */
263
- write(data: string): void;
265
+ close(): Promise<void>;
264
266
  /**
265
- * Resize terminal
267
+ * Get tunnel URL
266
268
  */
267
- resize(cols: number, rows: number): void;
269
+ getUrl(): string | null;
268
270
  /**
269
- * Clear terminal
271
+ * Create localtunnel
270
272
  */
271
- clear(): void;
273
+ private createLocaltunnel;
272
274
  /**
273
- * Kill terminal process
275
+ * Create localtunnel via CLI
274
276
  */
275
- destroy(): void;
277
+ private createLocaltunnelCli;
276
278
  /**
277
- * Check if terminal is running
279
+ * Create cloudflared tunnel
278
280
  */
279
- isRunning(): boolean;
281
+ private createCloudflared;
280
282
  /**
281
- * Check if using PTY
283
+ * Create ngrok tunnel
282
284
  */
283
- hasPty(): boolean;
285
+ private createNgrok;
284
286
  }
287
+ /**
288
+ * Check if a tunnel provider is available
289
+ */
290
+ declare function checkTunnelAvailability(provider: TunnelProvider): Promise<boolean>;
291
+ /**
292
+ * Find best available tunnel provider
293
+ */
294
+ declare function findAvailableTunnel(): Promise<TunnelProvider | null>;
285
295
 
286
296
  /**
287
297
  * @nikcli/remote - Mobile Web Client
@@ -289,9 +299,37 @@ declare class TerminalManager extends EventEmitter {
289
299
  */
290
300
  declare function getWebClient(): string;
291
301
 
302
+ /**
303
+ * @nikcli/remote - Enterprise Terminal Streaming
304
+ *
305
+ * Direct stdin/stdout streaming for true real-time terminal access.
306
+ * No fake PTY - mobile sees your actual NikCLI terminal.
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * import { RemoteServer, createTunnel } from '@nikcli/remote'
311
+ *
312
+ * const server = new RemoteServer()
313
+ * const session = await server.start({
314
+ * name: 'my-terminal',
315
+ * processForStreaming: {
316
+ * stdout: process.stdout,
317
+ * stdin: process.stdin,
318
+ * },
319
+ * })
320
+ *
321
+ * // Create public tunnel
322
+ * const tunnelUrl = await createTunnel(session.port, 'cloudflared')
323
+ * console.log('Access your terminal:', tunnelUrl)
324
+ * ```
325
+ */
326
+
327
+ /**
328
+ * Create a remote server with streaming in one call
329
+ */
292
330
  declare function createRemoteServer(config?: Partial<ServerConfig>): Promise<{
293
331
  server: RemoteServer;
294
332
  session: RemoteSession;
295
333
  }>;
296
334
 
297
- export { type BroadcastMessage, type ClientMessage, type CommandMessage, DEFAULT_CONFIG, type DeviceInfo, MessageTypes, type RemoteNotification, RemoteServer, type RemoteServerEvents, type RemoteSession, type ServerConfig, type ServerMessage, type SessionStatus, type TerminalConfig, type TerminalData, TerminalManager, type TerminalResize, type TunnelProvider, createRemoteServer, getWebClient };
335
+ export { type BroadcastMessage, type ClientMessage, DEFAULT_CONFIG, type DeviceInfo, MessageTypes, type RemoteNotification, RemoteServer, type RemoteServerEvents, type RemoteSession, type ServerConfig, type SessionStatus, TunnelManager, type TunnelProvider, type TunnelResult, checkTunnelAvailability, createRemoteServer, createTunnel, findAvailableTunnel, getWebClient };
package/dist/index.d.ts CHANGED
@@ -71,22 +71,6 @@ interface ClientMessage {
71
71
  type: string;
72
72
  [key: string]: unknown;
73
73
  }
74
- interface ServerMessage {
75
- type: string;
76
- payload?: unknown;
77
- timestamp: number;
78
- }
79
- interface TerminalData {
80
- data: string;
81
- }
82
- interface TerminalResize {
83
- cols: number;
84
- rows: number;
85
- }
86
- interface CommandMessage {
87
- command: string;
88
- args?: string[];
89
- }
90
74
  interface ClientConnection {
91
75
  id: string;
92
76
  authenticated: boolean;
@@ -118,8 +102,8 @@ declare const MessageTypes: {
118
102
  };
119
103
 
120
104
  /**
121
- * @nikcli/remote - Native Remote Server
122
- * WebSocket-based remote terminal with mobile-friendly web client
105
+ * @nikcli/remote - Direct Terminal Streaming Server
106
+ * Proxies NikCLI's stdin/stdout to WebSocket clients for true real-time terminal access
123
107
  */
124
108
 
125
109
  interface RemoteServerEvents {
@@ -130,13 +114,9 @@ interface RemoteServerEvents {
130
114
  'client:error': (clientId: string, error: Error) => void;
131
115
  'tunnel:connected': (url: string) => void;
132
116
  'tunnel:error': (error: Error) => void;
133
- command: (cmd: {
134
- clientId: string;
135
- command: string;
136
- args?: string[];
137
- }) => void;
138
117
  message: (client: ClientConnection, message: ClientMessage) => void;
139
118
  error: (error: Error) => void;
119
+ 'terminal:output': (data: string) => void;
140
120
  }
141
121
  declare class RemoteServer extends EventEmitter {
142
122
  private config;
@@ -144,19 +124,35 @@ declare class RemoteServer extends EventEmitter {
144
124
  private wss;
145
125
  private clients;
146
126
  private session;
147
- private terminal;
148
- private tunnel;
149
127
  private heartbeatTimer;
150
128
  private sessionTimeoutTimer;
151
129
  private isRunning;
152
130
  private sessionSecret;
131
+ private originalStdoutWrite;
132
+ private originalStdinOn;
153
133
  constructor(config?: Partial<ServerConfig>);
154
134
  /**
155
- * Start the remote server
135
+ * Generate a random secret
136
+ */
137
+ private generateSecret;
138
+ /**
139
+ * Start the remote server - creates WebSocket server that proxies stdin/stdout
156
140
  */
157
141
  start(options?: {
158
142
  name?: string;
143
+ processForStreaming?: {
144
+ stdout: NodeJS.WriteStream;
145
+ stdin: NodeJS.ReadStream;
146
+ };
159
147
  }): Promise<RemoteSession>;
148
+ /**
149
+ * Setup stdin/stdout proxy to forward to WebSocket clients
150
+ */
151
+ private setupStdioProxy;
152
+ /**
153
+ * Clean output for mobile display - remove ANSI codes and TUI artifacts
154
+ */
155
+ private cleanOutputForMobile;
160
156
  /**
161
157
  * Stop the server
162
158
  */
@@ -164,6 +160,10 @@ declare class RemoteServer extends EventEmitter {
164
160
  /**
165
161
  * Broadcast message to all authenticated clients
166
162
  */
163
+ private broadcastToAll;
164
+ /**
165
+ * Public broadcast method for compatibility
166
+ */
167
167
  broadcast(message: BroadcastMessage): void;
168
168
  /**
169
169
  * Send notification to clients
@@ -182,11 +182,15 @@ declare class RemoteServer extends EventEmitter {
182
182
  */
183
183
  getConnectedCount(): number;
184
184
  /**
185
- * Write to terminal
185
+ * Write data to all connected clients (for manual output streaming)
186
+ */
187
+ writeToClients(data: string): void;
188
+ /**
189
+ * Alias for writeToClients - for compatibility
186
190
  */
187
191
  writeToTerminal(data: string): void;
188
192
  /**
189
- * Resize terminal
193
+ * Resize terminal (for compatibility - not used in direct streaming mode)
190
194
  */
191
195
  resizeTerminal(cols: number, rows: number): void;
192
196
  /**
@@ -229,59 +233,65 @@ declare class RemoteServer extends EventEmitter {
229
233
  * Generate client ID
230
234
  */
231
235
  private generateClientId;
232
- /**
233
- * Generate secret
234
- */
235
- private generateSecret;
236
236
  }
237
237
 
238
238
  /**
239
- * @nikcli/remote - Terminal Manager
240
- * PTY-based terminal with fallback to basic spawn
239
+ * @nikcli/remote - Tunnel Manager
240
+ * Provides public URL access via various tunnel providers
241
241
  */
242
242
 
243
- interface TerminalConfig {
244
- shell: string;
245
- cols: number;
246
- rows: number;
247
- cwd?: string;
248
- env?: Record<string, string>;
243
+ interface TunnelResult {
244
+ url: string;
245
+ provider: TunnelProvider;
246
+ close: () => Promise<void>;
249
247
  }
250
- declare class TerminalManager extends EventEmitter {
251
- private config;
252
- private ptyProcess;
248
+ /**
249
+ * Create a tunnel for the given port using the specified provider
250
+ */
251
+ declare function createTunnel(port: number, provider?: TunnelProvider): Promise<TunnelResult>;
252
+ declare class TunnelManager {
253
+ private provider;
253
254
  private process;
254
- private running;
255
- constructor(config: TerminalConfig);
255
+ private url;
256
+ private tunnelInstance;
257
+ constructor(provider: TunnelProvider);
256
258
  /**
257
- * Start the terminal
259
+ * Create tunnel and return public URL
258
260
  */
259
- start(): void;
261
+ create(port: number): Promise<string>;
260
262
  /**
261
- * Write data to terminal
263
+ * Close tunnel
262
264
  */
263
- write(data: string): void;
265
+ close(): Promise<void>;
264
266
  /**
265
- * Resize terminal
267
+ * Get tunnel URL
266
268
  */
267
- resize(cols: number, rows: number): void;
269
+ getUrl(): string | null;
268
270
  /**
269
- * Clear terminal
271
+ * Create localtunnel
270
272
  */
271
- clear(): void;
273
+ private createLocaltunnel;
272
274
  /**
273
- * Kill terminal process
275
+ * Create localtunnel via CLI
274
276
  */
275
- destroy(): void;
277
+ private createLocaltunnelCli;
276
278
  /**
277
- * Check if terminal is running
279
+ * Create cloudflared tunnel
278
280
  */
279
- isRunning(): boolean;
281
+ private createCloudflared;
280
282
  /**
281
- * Check if using PTY
283
+ * Create ngrok tunnel
282
284
  */
283
- hasPty(): boolean;
285
+ private createNgrok;
284
286
  }
287
+ /**
288
+ * Check if a tunnel provider is available
289
+ */
290
+ declare function checkTunnelAvailability(provider: TunnelProvider): Promise<boolean>;
291
+ /**
292
+ * Find best available tunnel provider
293
+ */
294
+ declare function findAvailableTunnel(): Promise<TunnelProvider | null>;
285
295
 
286
296
  /**
287
297
  * @nikcli/remote - Mobile Web Client
@@ -289,9 +299,37 @@ declare class TerminalManager extends EventEmitter {
289
299
  */
290
300
  declare function getWebClient(): string;
291
301
 
302
+ /**
303
+ * @nikcli/remote - Enterprise Terminal Streaming
304
+ *
305
+ * Direct stdin/stdout streaming for true real-time terminal access.
306
+ * No fake PTY - mobile sees your actual NikCLI terminal.
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * import { RemoteServer, createTunnel } from '@nikcli/remote'
311
+ *
312
+ * const server = new RemoteServer()
313
+ * const session = await server.start({
314
+ * name: 'my-terminal',
315
+ * processForStreaming: {
316
+ * stdout: process.stdout,
317
+ * stdin: process.stdin,
318
+ * },
319
+ * })
320
+ *
321
+ * // Create public tunnel
322
+ * const tunnelUrl = await createTunnel(session.port, 'cloudflared')
323
+ * console.log('Access your terminal:', tunnelUrl)
324
+ * ```
325
+ */
326
+
327
+ /**
328
+ * Create a remote server with streaming in one call
329
+ */
292
330
  declare function createRemoteServer(config?: Partial<ServerConfig>): Promise<{
293
331
  server: RemoteServer;
294
332
  session: RemoteSession;
295
333
  }>;
296
334
 
297
- export { type BroadcastMessage, type ClientMessage, type CommandMessage, DEFAULT_CONFIG, type DeviceInfo, MessageTypes, type RemoteNotification, RemoteServer, type RemoteServerEvents, type RemoteSession, type ServerConfig, type ServerMessage, type SessionStatus, type TerminalConfig, type TerminalData, TerminalManager, type TerminalResize, type TunnelProvider, createRemoteServer, getWebClient };
335
+ export { type BroadcastMessage, type ClientMessage, DEFAULT_CONFIG, type DeviceInfo, MessageTypes, type RemoteNotification, RemoteServer, type RemoteServerEvents, type RemoteSession, type ServerConfig, type SessionStatus, TunnelManager, type TunnelProvider, type TunnelResult, checkTunnelAvailability, createRemoteServer, createTunnel, findAvailableTunnel, getWebClient };