@graphty/remote-logger 1.2.2 → 1.2.3

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 (64) hide show
  1. package/README.md +1 -1
  2. package/dist/client/RemoteLogClient.d.ts +2 -1
  3. package/dist/client/RemoteLogClient.d.ts.map +1 -1
  4. package/dist/client/RemoteLogClient.js +20 -10
  5. package/dist/client/RemoteLogClient.js.map +1 -1
  6. package/dist/client/types.d.ts +6 -0
  7. package/dist/client/types.d.ts.map +1 -1
  8. package/dist/mcp/index.d.ts +1 -1
  9. package/dist/mcp/index.d.ts.map +1 -1
  10. package/dist/mcp/index.js +20 -1
  11. package/dist/mcp/index.js.map +1 -1
  12. package/dist/mcp/mcp-server.d.ts +5 -0
  13. package/dist/mcp/mcp-server.d.ts.map +1 -1
  14. package/dist/mcp/mcp-server.js +6 -5
  15. package/dist/mcp/mcp-server.js.map +1 -1
  16. package/dist/mcp/tools/index.d.ts +6 -6
  17. package/dist/mcp/tools/index.d.ts.map +1 -1
  18. package/dist/mcp/tools/index.js +1 -1
  19. package/dist/mcp/tools/index.js.map +1 -1
  20. package/dist/mcp/tools/logs-clear.d.ts +1 -2
  21. package/dist/mcp/tools/logs-clear.d.ts.map +1 -1
  22. package/dist/mcp/tools/logs-get-all.d.ts +1 -2
  23. package/dist/mcp/tools/logs-get-all.d.ts.map +1 -1
  24. package/dist/mcp/tools/logs-get-errors.d.ts +1 -2
  25. package/dist/mcp/tools/logs-get-errors.d.ts.map +1 -1
  26. package/dist/mcp/tools/logs-get-file-path.d.ts +8 -2
  27. package/dist/mcp/tools/logs-get-file-path.d.ts.map +1 -1
  28. package/dist/mcp/tools/logs-get-file-path.js +1 -1
  29. package/dist/mcp/tools/logs-get-file-path.js.map +1 -1
  30. package/dist/mcp/tools/logs-receive.d.ts +1 -2
  31. package/dist/mcp/tools/logs-receive.d.ts.map +1 -1
  32. package/dist/mcp/tools/logs-search.d.ts +1 -2
  33. package/dist/mcp/tools/logs-search.d.ts.map +1 -1
  34. package/dist/server/dual-server.d.ts +7 -4
  35. package/dist/server/dual-server.d.ts.map +1 -1
  36. package/dist/server/dual-server.js +108 -46
  37. package/dist/server/dual-server.js.map +1 -1
  38. package/dist/server/log-server.d.ts +2 -2
  39. package/dist/server/log-server.d.ts.map +1 -1
  40. package/dist/server/log-server.js +32 -55
  41. package/dist/server/log-server.js.map +1 -1
  42. package/dist/server/self-signed-cert.d.ts +9 -0
  43. package/dist/server/self-signed-cert.d.ts.map +1 -1
  44. package/dist/server/self-signed-cert.js +9 -0
  45. package/dist/server/self-signed-cert.js.map +1 -1
  46. package/dist/ui/ConsoleCaptureUI.d.ts.map +1 -1
  47. package/dist/ui/ConsoleCaptureUI.js +6 -1
  48. package/dist/ui/ConsoleCaptureUI.js.map +1 -1
  49. package/package.json +2 -1
  50. package/src/client/RemoteLogClient.ts +22 -11
  51. package/src/client/types.ts +6 -0
  52. package/src/mcp/index.ts +42 -0
  53. package/src/mcp/mcp-server.ts +6 -5
  54. package/src/mcp/tools/index.ts +7 -0
  55. package/src/mcp/tools/logs-clear.ts +1 -1
  56. package/src/mcp/tools/logs-get-all.ts +1 -1
  57. package/src/mcp/tools/logs-get-errors.ts +1 -1
  58. package/src/mcp/tools/logs-get-file-path.ts +2 -2
  59. package/src/mcp/tools/logs-receive.ts +1 -1
  60. package/src/mcp/tools/logs-search.ts +1 -1
  61. package/src/server/dual-server.ts +146 -53
  62. package/src/server/log-server.ts +35 -60
  63. package/src/server/self-signed-cert.ts +9 -0
  64. package/src/ui/ConsoleCaptureUI.ts +6 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ConsoleCaptureUI.js","sourceRoot":"","sources":["../../src/ui/ConsoleCaptureUI.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConsoleCaptureUI.js","sourceRoot":"","sources":["../../src/ui/ConsoleCaptureUI.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphty/remote-logger",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
4
4
  "description": "Remote logging client and server for browser debugging",
5
5
  "author": "Adam Powers <apowers@ato.ms>",
6
6
  "main": "dist/index.js",
@@ -69,6 +69,7 @@
69
69
  },
70
70
  "dependencies": {
71
71
  "@modelcontextprotocol/sdk": "^1.0.0",
72
+ "internal-ip": "^8.0.1",
72
73
  "selfsigned": "^2.4.1",
73
74
  "zod": "^3.25.0"
74
75
  },
@@ -38,6 +38,7 @@ const DEFAULT_BATCH_INTERVAL_MS = 1000;
38
38
  const DEFAULT_MAX_RETRIES = 3;
39
39
  const DEFAULT_RETRY_DELAY_MS = 1000;
40
40
  const DEFAULT_SESSION_PREFIX = "session";
41
+ const DEFAULT_TIMEOUT_MS = 5000;
41
42
 
42
43
  /**
43
44
  * Generates a unique session ID with the given prefix.
@@ -86,6 +87,7 @@ export class RemoteLogClient {
86
87
  private readonly throttlePatterns: ThrottlePattern[];
87
88
  private readonly projectMarker: string | undefined;
88
89
  private readonly worktreePath: string | undefined;
90
+ private readonly timeoutMs: number;
89
91
 
90
92
  private pendingLogs: LogEntry[] = [];
91
93
  private batchTimer: ReturnType<typeof setTimeout> | null = null;
@@ -106,6 +108,7 @@ export class RemoteLogClient {
106
108
  this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;
107
109
  this.retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
108
110
  this.throttlePatterns = options.throttlePatterns ?? [];
111
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
109
112
 
110
113
  // Priority: explicit option > global variable
111
114
  this.projectMarker = options.projectMarker ?? getGlobalValue("__REMOTE_LOG_PROJECT_MARKER__");
@@ -229,7 +232,7 @@ export class RemoteLogClient {
229
232
  /**
230
233
  * Makes the actual HTTP request to send logs.
231
234
  * @param logs - The log entries to send
232
- * @throws Error if the request fails
235
+ * @throws Error if the request fails or times out
233
236
  */
234
237
  private async sendRequest(logs: LogEntry[]): Promise<void> {
235
238
  const requestBody: {
@@ -250,16 +253,24 @@ export class RemoteLogClient {
250
253
  requestBody.worktreePath = this.worktreePath;
251
254
  }
252
255
 
253
- const response = await fetch(`${this.serverUrl}/log`, {
254
- method: "POST",
255
- headers: {
256
- "Content-Type": "application/json",
257
- },
258
- body: JSON.stringify(requestBody),
259
- });
260
-
261
- if (!response.ok) {
262
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
256
+ const controller = new AbortController();
257
+ const timeoutId = setTimeout(() => { controller.abort(); }, this.timeoutMs);
258
+
259
+ try {
260
+ const response = await fetch(`${this.serverUrl}/log`, {
261
+ method: "POST",
262
+ headers: {
263
+ "Content-Type": "application/json",
264
+ },
265
+ body: JSON.stringify(requestBody),
266
+ signal: controller.signal,
267
+ });
268
+
269
+ if (!response.ok) {
270
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
271
+ }
272
+ } finally {
273
+ clearTimeout(timeoutId);
263
274
  }
264
275
  }
265
276
 
@@ -59,4 +59,10 @@ export interface RemoteLogClientOptions {
59
59
  * __REMOTE_LOG_WORKTREE_PATH__ global variable (injected by Vite plugin).
60
60
  */
61
61
  worktreePath?: string;
62
+ /**
63
+ * Request timeout in milliseconds.
64
+ * Requests that take longer than this will be aborted and retried.
65
+ * @default 5000
66
+ */
67
+ timeoutMs?: number;
62
68
  }
package/src/mcp/index.ts CHANGED
@@ -6,17 +6,59 @@
6
6
  */
7
7
 
8
8
  export { createMcpServer, getToolNames, startMcpServer } from "./mcp-server.js";
9
+
10
+ // Re-export all tool handlers, schemas, and definitions for programmatic use
9
11
  export {
12
+ // logs_get_file_path
13
+ getLogFilePath,
14
+ // logs_clear
15
+ logsClearHandler,
16
+ type LogsClearInput,
17
+ logsClearInputSchema,
18
+ type LogsClearOutput,
19
+ logsClearTool,
20
+ // logs_get_all
21
+ logsGetAllHandler,
22
+ type LogsGetAllInput,
23
+ logsGetAllInputSchema,
24
+ type LogsGetAllOutput,
25
+ logsGetAllTool,
26
+ // logs_get_errors
27
+ logsGetErrorsHandler,
28
+ type LogsGetErrorsInput,
29
+ logsGetErrorsInputSchema,
30
+ type LogsGetErrorsOutput,
31
+ logsGetErrorsTool,
32
+ logsGetFilePathHandler,
33
+ type LogsGetFilePathInput,
34
+ logsGetFilePathInputSchema,
35
+ type LogsGetFilePathOutput,
36
+ logsGetFilePathTool,
37
+ // logs_get_recent
10
38
  logsGetRecentHandler,
11
39
  type LogsGetRecentInput,
12
40
  logsGetRecentInputSchema,
13
41
  type LogsGetRecentOutput,
14
42
  logsGetRecentTool,
43
+ // logs_list_sessions
15
44
  logsListSessionsHandler,
16
45
  type LogsListSessionsInput,
17
46
  logsListSessionsInputSchema,
18
47
  type LogsListSessionsOutput,
19
48
  logsListSessionsTool,
49
+ // logs_receive
50
+ logsReceiveHandler,
51
+ type LogsReceiveInput,
52
+ logsReceiveInputSchema,
53
+ type LogsReceiveOutput,
54
+ logsReceiveTool,
55
+ // logs_search
56
+ logsSearchHandler,
57
+ type LogsSearchInput,
58
+ logsSearchInputSchema,
59
+ type LogsSearchOutput,
60
+ logsSearchTool,
61
+ // logs_status
20
62
  logsStatusHandler,
21
63
  type LogsStatusInput,
22
64
  logsStatusInputSchema,
@@ -61,8 +61,9 @@ export function getToolNames(): string[] {
61
61
 
62
62
  /**
63
63
  * Server instructions for LLMs describing the overall purpose and usage.
64
+ * Exported for testing purposes.
64
65
  */
65
- const SERVER_INSTRUCTIONS = `Remote Logger MCP Server - View console.log output from browser applications.
66
+ export const SERVER_INSTRUCTIONS = `Remote Logger MCP Server - View console.log output from browser applications.
66
67
 
67
68
  ## What is Remote Logging?
68
69
 
@@ -82,7 +83,7 @@ Remote logging is especially valuable for LLM assistants like this one - it enab
82
83
 
83
84
  ## Architecture
84
85
 
85
- Browser App → HTTP POST to /logs → Log Server (stores in memory + JSONL files) → MCP Tools (query logs)
86
+ Browser App → HTTP POST to /log → Log Server (stores in memory + JSONL files) → MCP Tools (query logs)
86
87
 
87
88
  ## Setting Up a Browser App to Send Logs
88
89
 
@@ -96,8 +97,8 @@ Install: npm install @graphty/remote-logger
96
97
  import { RemoteLogClient } from "@graphty/remote-logger";
97
98
 
98
99
  const logger = new RemoteLogClient({
99
- serverUrl: "http://localhost:9080/logs", // Get this from logs_status
100
- projectMarker: "my-project", // Optional: for filtering
100
+ serverUrl: "http://localhost:9080", // Get this from logs_status (client appends /log)
101
+ projectMarker: "my-project", // Optional: for filtering
101
102
  });
102
103
 
103
104
  // Intercept all console.log/warn/error calls
@@ -110,7 +111,7 @@ logger.log("INFO", "Hello from browser!");
110
111
  ### Option 2: Raw fetch() calls
111
112
 
112
113
  \`\`\`typescript
113
- fetch("http://localhost:9080/logs", {
114
+ fetch("http://localhost:9080/log", {
114
115
  method: "POST",
115
116
  headers: { "Content-Type": "application/json" },
116
117
  body: JSON.stringify({
@@ -7,24 +7,29 @@ export {
7
7
  logsClearHandler,
8
8
  type LogsClearInput,
9
9
  logsClearInputSchema,
10
+ type LogsClearOutput,
10
11
  logsClearTool,
11
12
  } from "./logs-clear.js";
12
13
  export {
13
14
  logsGetAllHandler,
14
15
  type LogsGetAllInput,
15
16
  logsGetAllInputSchema,
17
+ type LogsGetAllOutput,
16
18
  logsGetAllTool,
17
19
  } from "./logs-get-all.js";
18
20
  export {
19
21
  logsGetErrorsHandler,
20
22
  type LogsGetErrorsInput,
21
23
  logsGetErrorsInputSchema,
24
+ type LogsGetErrorsOutput,
22
25
  logsGetErrorsTool,
23
26
  } from "./logs-get-errors.js";
24
27
  export {
28
+ getLogFilePath,
25
29
  logsGetFilePathHandler,
26
30
  type LogsGetFilePathInput,
27
31
  logsGetFilePathInputSchema,
32
+ type LogsGetFilePathOutput,
28
33
  logsGetFilePathTool,
29
34
  } from "./logs-get-file-path.js";
30
35
  export {
@@ -45,12 +50,14 @@ export {
45
50
  logsReceiveHandler,
46
51
  type LogsReceiveInput,
47
52
  logsReceiveInputSchema,
53
+ type LogsReceiveOutput,
48
54
  logsReceiveTool,
49
55
  } from "./logs-receive.js";
50
56
  export {
51
57
  logsSearchHandler,
52
58
  type LogsSearchInput,
53
59
  logsSearchInputSchema,
60
+ type LogsSearchOutput,
54
61
  logsSearchTool,
55
62
  } from "./logs-search.js";
56
63
  export {
@@ -29,7 +29,7 @@ export type LogsClearInput = z.infer<typeof logsClearInputSchema>;
29
29
  /**
30
30
  * Output type for the logs_clear handler.
31
31
  */
32
- interface LogsClearOutput {
32
+ export interface LogsClearOutput {
33
33
  /** Whether the operation succeeded */
34
34
  success: boolean;
35
35
  /** Number of sessions cleared */
@@ -25,7 +25,7 @@ export type LogsGetAllInput = z.infer<typeof logsGetAllInputSchema>;
25
25
  /**
26
26
  * Output type for the logs_get_all handler.
27
27
  */
28
- interface LogsGetAllOutput {
28
+ export interface LogsGetAllOutput {
29
29
  /** Logs grouped by session ID */
30
30
  sessions: Record<string, LogEntry[]>;
31
31
  /** Number of sessions */
@@ -27,7 +27,7 @@ export type LogsGetErrorsInput = z.infer<typeof logsGetErrorsInputSchema>;
27
27
  /**
28
28
  * Output type for the logs_get_errors handler.
29
29
  */
30
- interface LogsGetErrorsOutput {
30
+ export interface LogsGetErrorsOutput {
31
31
  /** Array of ERROR level log entries */
32
32
  errors: LogEntryWithSession[];
33
33
  /** Number of errors returned */
@@ -31,7 +31,7 @@ export type LogsGetFilePathInput = z.infer<typeof logsGetFilePathInputSchema>;
31
31
  /**
32
32
  * Output type for the logs_get_file_path handler.
33
33
  */
34
- interface LogsGetFilePathOutput {
34
+ export interface LogsGetFilePathOutput {
35
35
  /** Full path to the JSONL log file */
36
36
  path: string;
37
37
  /** Whether the file exists */
@@ -46,7 +46,7 @@ interface LogsGetFilePathOutput {
46
46
  * @param projectMarker - The project marker
47
47
  * @returns Full path to the JSONL file
48
48
  */
49
- function getLogFilePath(projectMarker: string): string {
49
+ export function getLogFilePath(projectMarker: string): string {
50
50
  return path.join(os.tmpdir(), "remote-logger", projectMarker, "logs.jsonl");
51
51
  }
52
52
 
@@ -47,7 +47,7 @@ export type LogsReceiveInput = z.infer<typeof logsReceiveInputSchema>;
47
47
  /**
48
48
  * Output type for the logs_receive handler.
49
49
  */
50
- interface LogsReceiveOutput {
50
+ export interface LogsReceiveOutput {
51
51
  /** Whether the operation succeeded */
52
52
  success: boolean;
53
53
  /** Number of logs stored */
@@ -33,7 +33,7 @@ export type LogsSearchInput = z.infer<typeof logsSearchInputSchema>;
33
33
  /**
34
34
  * Output type for the logs_search handler.
35
35
  */
36
- interface LogsSearchOutput {
36
+ export interface LogsSearchOutput {
37
37
  /** Matching log entries */
38
38
  results: LogEntryWithSession[];
39
39
  /** Number of results returned */
@@ -8,8 +8,9 @@
8
8
 
9
9
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
10
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
11
- import type * as http from "http";
12
- import type * as https from "https";
11
+ import * as http from "http";
12
+ import * as https from "https";
13
+ import { internalIpV4Sync } from "internal-ip";
13
14
  import * as net from "net";
14
15
  import * as os from "os";
15
16
  import * as path from "path";
@@ -35,6 +36,90 @@ const MAX_PORT_SCAN_ATTEMPTS = 100;
35
36
  /** Maximum port number allowed (ports 9000-9099 per project guidelines) */
36
37
  const MAX_PORT_NUMBER = 9099;
37
38
 
39
+ /** Maximum retries for binding after EADDRINUSE during listen */
40
+ const MAX_BIND_RETRIES = 10;
41
+
42
+ /**
43
+ * Attempt to bind an HTTP/HTTPS server to a port with retry on EADDRINUSE.
44
+ * This handles race conditions where a port becomes unavailable between
45
+ * port scanning and actual binding.
46
+ * @param serverFactory - Function to create a new server instance
47
+ * @param startPort - Starting port to try
48
+ * @param host - Host to bind to
49
+ * @param quiet - Suppress output messages
50
+ * @param maxPort - Maximum port number to scan up to (default: 9099)
51
+ * @returns Promise resolving to bound server and actual port
52
+ */
53
+ async function tryBindWithRetry(
54
+ serverFactory: () => http.Server | https.Server,
55
+ startPort: number,
56
+ host: string,
57
+ quiet: boolean,
58
+ maxPort: number = MAX_PORT_NUMBER,
59
+ ): Promise<{ server: http.Server | https.Server; port: number }> {
60
+ let port = startPort;
61
+ let attempts = 0;
62
+
63
+ while (attempts < MAX_BIND_RETRIES) {
64
+ if (port > maxPort) {
65
+ break;
66
+ }
67
+
68
+ const server = serverFactory();
69
+
70
+ try {
71
+ await new Promise<void>((resolve, reject) => {
72
+ const errorHandler = (err: NodeJS.ErrnoException): void => {
73
+ if (err.code === "EADDRINUSE") {
74
+ if (!quiet) {
75
+ // eslint-disable-next-line no-console
76
+ console.log(
77
+ `${colors.yellow}Port ${port} claimed during bind, trying ${port + 1}...${colors.reset}`,
78
+ );
79
+ }
80
+ reject(err);
81
+ } else {
82
+ reject(err);
83
+ }
84
+ };
85
+
86
+ server.once("error", errorHandler);
87
+ server.listen({ port, host, exclusive: false }, () => {
88
+ server.removeListener("error", errorHandler);
89
+ resolve();
90
+ });
91
+ });
92
+
93
+ // Success - server is bound
94
+ if (!quiet) {
95
+ // eslint-disable-next-line no-console
96
+ console.log(
97
+ `${colors.green}HTTP server listening on ${host}:${port}${colors.reset}`,
98
+ );
99
+ }
100
+ return { server, port };
101
+ } catch (err) {
102
+ if ((err as NodeJS.ErrnoException).code === "EADDRINUSE") {
103
+ port++;
104
+ attempts++;
105
+ continue;
106
+ }
107
+ // Re-throw non-EADDRINUSE errors
108
+ throw err;
109
+ }
110
+ }
111
+
112
+ // Exhausted retries
113
+ const errorMsg = `Could not bind to any port after ${attempts} attempts. ` +
114
+ `Ports ${startPort}-${port - 1} are all in use or were claimed during bind.`;
115
+
116
+ if (!quiet) {
117
+ console.error(`${colors.red}${errorMsg}${colors.reset}`);
118
+ }
119
+
120
+ throw new Error(errorMsg);
121
+ }
122
+
38
123
  /**
39
124
  * Check if a port is available for binding.
40
125
  * @param port - Port number to check
@@ -72,16 +157,22 @@ async function isPortAvailable(port: number, host: string): Promise<boolean> {
72
157
  * @param basePort - Starting port number
73
158
  * @param host - Host to bind to
74
159
  * @param quiet - Suppress output messages
160
+ * @param maxPort - Maximum port number to scan up to (default: 9099)
75
161
  * @returns Promise resolving to available port number
76
162
  * @throws Error if no available port found within MAX_PORT_SCAN_ATTEMPTS
77
163
  */
78
- export async function findAvailablePort(basePort: number, host: string, quiet: boolean = false): Promise<number> {
164
+ export async function findAvailablePort(
165
+ basePort: number,
166
+ host: string,
167
+ quiet: boolean = false,
168
+ maxPort: number = MAX_PORT_NUMBER,
169
+ ): Promise<number> {
79
170
  let port = basePort;
80
171
  let attempts = 0;
81
172
 
82
173
  while (attempts < MAX_PORT_SCAN_ATTEMPTS) {
83
- if (port > MAX_PORT_NUMBER) {
84
- // Wrap around if we exceed max port (shouldn't happen normally)
174
+ if (port > maxPort) {
175
+ // Stop if we exceed max port
85
176
  break;
86
177
  }
87
178
 
@@ -107,12 +198,12 @@ export async function findAvailablePort(basePort: number, host: string, quiet: b
107
198
  }
108
199
 
109
200
  // No available port found
110
- const errorMsg = `Could not find available port after ${MAX_PORT_SCAN_ATTEMPTS} attempts starting from ${basePort}. ` +
111
- `Ports ${basePort}-${port - 1} are all in use. ` +
201
+ const errorMsg = `Could not find available port after ${attempts} attempts starting from ${basePort}. ` +
202
+ `Ports ${basePort}-${Math.min(port - 1, maxPort)} are all in use. ` +
112
203
  `Try killing existing processes: pkill -f "remote-log-server"`;
113
204
 
114
205
  if (!quiet) {
115
-
206
+
116
207
  console.error(`${colors.red}${errorMsg}${colors.reset}`);
117
208
  }
118
209
 
@@ -125,7 +216,7 @@ export async function findAvailablePort(basePort: number, host: string, quiet: b
125
216
  export interface DualServerOptions {
126
217
  /** Port for HTTP server (default: 9080) */
127
218
  httpPort?: number;
128
- /** Host for HTTP server (default: localhost) */
219
+ /** Host for HTTP server (default: 0.0.0.0) */
129
220
  httpHost?: string;
130
221
  /** Enable MCP server (default: true) */
131
222
  mcpEnabled?: boolean;
@@ -145,6 +236,8 @@ export interface DualServerOptions {
145
236
  jsonlWriter?: JsonlWriter;
146
237
  /** Only serve /log POST and /health GET endpoints (default: false) */
147
238
  logReceiveOnly?: boolean;
239
+ /** Maximum port number to scan up to (default: 9099) */
240
+ maxPortNumber?: number;
148
241
  }
149
242
 
150
243
  /**
@@ -176,7 +269,7 @@ export interface DualServerResult {
176
269
  export async function createDualServer(options: DualServerOptions = {}): Promise<DualServerResult> {
177
270
  const {
178
271
  httpPort: requestedPort = 9080,
179
- httpHost = "localhost",
272
+ httpHost = "0.0.0.0",
180
273
  mcpEnabled = true,
181
274
  httpEnabled = true,
182
275
  quiet = false,
@@ -185,6 +278,7 @@ export async function createDualServer(options: DualServerOptions = {}): Promise
185
278
  logReceiveOnly = false,
186
279
  certPath,
187
280
  keyPath,
281
+ maxPortNumber = MAX_PORT_NUMBER,
188
282
  } = options;
189
283
 
190
284
  // Create or use provided JSONL writer
@@ -204,18 +298,31 @@ export async function createDualServer(options: DualServerOptions = {}): Promise
204
298
  // Start HTTP server if enabled
205
299
  if (httpEnabled) {
206
300
  // Find an available port starting from the requested port
207
- actualHttpPort = await findAvailablePort(requestedPort, httpHost, quiet);
208
-
209
- const result = createLogServer({
210
- port: actualHttpPort,
211
- host: httpHost,
212
- storage,
301
+ const startPort = await findAvailablePort(requestedPort, httpHost, quiet, maxPortNumber);
302
+
303
+ // Factory function to create server instances (for retry on bind failure)
304
+ const createServerInstance = (): http.Server | https.Server => {
305
+ return createLogServer({
306
+ port: startPort, // Port is set but not used until bind
307
+ host: httpHost,
308
+ storage,
309
+ quiet: true, // Quiet during factory, messages handled by tryBindWithRetry
310
+ logReceiveOnly,
311
+ certPath,
312
+ keyPath,
313
+ }).server;
314
+ };
315
+
316
+ // Bind with retry logic to handle race conditions
317
+ const bindResult = await tryBindWithRetry(
318
+ createServerInstance,
319
+ startPort,
320
+ httpHost,
213
321
  quiet,
214
- logReceiveOnly,
215
- certPath,
216
- keyPath,
217
- });
218
- httpServer = result.server;
322
+ maxPortNumber,
323
+ );
324
+ httpServer = bindResult.server;
325
+ actualHttpPort = bindResult.port;
219
326
 
220
327
  // Track connections for graceful shutdown
221
328
  httpServer.on("connection", (socket: net.Socket) => {
@@ -229,37 +336,6 @@ export async function createDualServer(options: DualServerOptions = {}): Promise
229
336
  httpServer.keepAliveTimeout = 1000;
230
337
  httpServer.headersTimeout = 2000;
231
338
 
232
- // Wait for HTTP server to be listening
233
- const serverToStart = httpServer;
234
- const portToUse = actualHttpPort;
235
- await new Promise<void>((resolve, reject) => {
236
- serverToStart.on("error", (err: NodeJS.ErrnoException) => {
237
- // Provide helpful error message for port conflicts
238
- if (err.code === "EADDRINUSE") {
239
- const errorMsg = `Port ${portToUse} is already in use. ` +
240
- `This shouldn't happen after port scanning - there may be a race condition. ` +
241
- `Try again or kill existing processes: pkill -f "remote-log-server"`;
242
- if (!quiet) {
243
-
244
- console.error(`${colors.red}${errorMsg}${colors.reset}`);
245
- }
246
- reject(new Error(errorMsg));
247
- } else {
248
- reject(err);
249
- }
250
- });
251
- serverToStart.listen({ port: portToUse, host: httpHost, exclusive: false }, () => {
252
- serverToStart.removeListener("error", reject);
253
- if (!quiet) {
254
- // eslint-disable-next-line no-console
255
- console.log(
256
- `${colors.green}HTTP server listening on ${httpHost}:${portToUse}${colors.reset}`,
257
- );
258
- }
259
- resolve();
260
- });
261
- });
262
-
263
339
  // Set server config in storage so MCP tools can report it
264
340
  // Determine protocol based on whether valid cert files were provided
265
341
  const useHttps = certPath && keyPath && certFilesExist(certPath, keyPath);
@@ -273,11 +349,28 @@ export async function createDualServer(options: DualServerOptions = {}): Promise
273
349
  } else {
274
350
  mode = "dual";
275
351
  }
352
+ // When bound to all interfaces (0.0.0.0), detect the machine's IP address
353
+ // for the endpoint URL since 0.0.0.0 is not a routable address for clients
354
+ let endpointHost = httpHost;
355
+ if (httpHost === "0.0.0.0") {
356
+ const internalIp = internalIpV4Sync();
357
+ if (internalIp) {
358
+ endpointHost = internalIp;
359
+ } else {
360
+ // Fallback for local-only use - don't use hostname as it may not resolve
361
+ endpointHost = "127.0.0.1";
362
+ if (!quiet) {
363
+ console.warn(
364
+ `${colors.yellow}Could not detect LAN IP. Endpoint URL will only work locally.${colors.reset}`,
365
+ );
366
+ }
367
+ }
368
+ }
276
369
  storage.setServerConfig({
277
370
  httpPort: actualHttpPort,
278
371
  httpHost,
279
372
  protocol,
280
- httpEndpoint: `${protocol}://${httpHost}:${actualHttpPort}/log`,
373
+ httpEndpoint: `${protocol}://${endpointHost}:${actualHttpPort}/log`,
281
374
  mode,
282
375
  });
283
376
  }