2025-11-23 18:23:51 +01:00
|
|
|
import * as xmlrpc from 'xmlrpc';
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
import { createLogger, formatError } from '../utils/logger';
|
2025-11-23 18:23:51 +01:00
|
|
|
import {
|
|
|
|
|
ProcessInfo,
|
|
|
|
|
ProcessInfoSchema,
|
|
|
|
|
SupervisorStateInfo,
|
|
|
|
|
SupervisorStateInfoSchema,
|
|
|
|
|
ConfigInfo,
|
|
|
|
|
ConfigInfoSchema,
|
|
|
|
|
ReloadConfigResult,
|
|
|
|
|
ReloadConfigResultSchema,
|
|
|
|
|
ProcessActionResult,
|
|
|
|
|
LogTailResult,
|
|
|
|
|
SystemInfo,
|
|
|
|
|
} from './types';
|
|
|
|
|
|
|
|
|
|
export interface SupervisorClientConfig {
|
|
|
|
|
host: string;
|
|
|
|
|
port: number;
|
|
|
|
|
username?: string;
|
|
|
|
|
password?: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class SupervisorClient {
|
|
|
|
|
private client: xmlrpc.Client;
|
|
|
|
|
private config: SupervisorClientConfig;
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
private logger: ReturnType<typeof createLogger>;
|
2025-11-23 18:23:51 +01:00
|
|
|
|
|
|
|
|
constructor(config: SupervisorClientConfig) {
|
|
|
|
|
this.config = config;
|
|
|
|
|
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
// Create logger with supervisor context
|
|
|
|
|
this.logger = createLogger({
|
|
|
|
|
component: 'SupervisorClient',
|
|
|
|
|
host: config.host,
|
|
|
|
|
port: config.port,
|
|
|
|
|
});
|
|
|
|
|
|
2025-11-23 18:43:55 +01:00
|
|
|
const clientOptions: any = {
|
2025-11-23 18:23:51 +01:00
|
|
|
host: config.host,
|
|
|
|
|
port: config.port,
|
|
|
|
|
path: '/RPC2',
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Add basic auth if credentials provided
|
|
|
|
|
if (config.username && config.password) {
|
|
|
|
|
clientOptions.basic_auth = {
|
|
|
|
|
user: config.username,
|
|
|
|
|
pass: config.password,
|
|
|
|
|
};
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
this.logger.debug('Basic auth configured');
|
2025-11-23 18:23:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.client = xmlrpc.createClient(clientOptions);
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
this.logger.info({ config: { host: config.host, port: config.port } }, 'Supervisor client initialized');
|
2025-11-23 18:23:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
* Generic method call wrapper with error handling and logging
|
2025-11-23 18:23:51 +01:00
|
|
|
*/
|
|
|
|
|
private async call<T>(method: string, params: any[] = []): Promise<T> {
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
const startTime = Date.now();
|
|
|
|
|
|
|
|
|
|
// Log the method call
|
|
|
|
|
this.logger.debug({ method, params }, `Calling XML-RPC method: ${method}`);
|
|
|
|
|
|
2025-11-23 18:23:51 +01:00
|
|
|
return new Promise((resolve, reject) => {
|
2025-11-23 18:43:55 +01:00
|
|
|
this.client.methodCall(method, params, (error: any, value: any) => {
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
const duration = Date.now() - startTime;
|
|
|
|
|
|
2025-11-23 18:23:51 +01:00
|
|
|
if (error) {
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
const errorInfo = formatError(error);
|
|
|
|
|
this.logger.error({
|
|
|
|
|
method,
|
|
|
|
|
params,
|
|
|
|
|
duration,
|
|
|
|
|
error: errorInfo,
|
|
|
|
|
}, `XML-RPC call failed: ${method} (${duration}ms) - ${errorInfo.message}`);
|
|
|
|
|
|
2025-11-23 18:43:55 +01:00
|
|
|
reject(new Error(`XML-RPC Error: ${error?.message || 'Unknown error'}`));
|
2025-11-23 18:23:51 +01:00
|
|
|
} else {
|
feat: implement comprehensive logging infrastructure (Phases 1-3)
Added production-ready logging using Pino with structured JSON output,
pretty printing in development, and automatic sensitive data redaction.
## Phase 1: Core Logger Setup
- Installed pino, pino-http, and pino-pretty dependencies
- Created logger utility (lib/utils/logger.ts):
- Environment-based log levels (debug in dev, info in prod)
- Pretty printing with colors in development
- JSON structured logs in production
- Sensitive data redaction (passwords, tokens, auth headers)
- Custom serializers for errors and requests
- Helper functions for child loggers and timing
- Added LOG_LEVEL environment variable to .env.example
- Configured Next.js for Turbopack with external pino packages
## Phase 2: API Request Logging
- Created API logger wrapper (lib/utils/api-logger.ts):
- withLogging() HOF for wrapping API route handlers
- Automatic request/response logging with timing
- Correlation ID generation (X-Request-ID header)
- Error catching and structured error responses
- logPerformance() helper for timing operations
- createApiLogger() for manual logging in routes
## Phase 3: Supervisor Client Logging
- Updated lib/supervisor/client.ts:
- Added logger instance to SupervisorClient class
- Comprehensive XML-RPC call logging (method, params, duration)
- Error logging with full context and stack traces
- Success logging with result size tracking
- DEBUG level logs for all XML-RPC operations
- Constructor logging for client initialization
## Configuration Changes
- Updated next.config.ts for Turbopack compatibility
- Added serverComponentsExternalPackages for pino
- Removed null-loader workaround (not needed)
## Features Implemented
✅ Request correlation IDs for tracing
✅ Performance timing for all operations
✅ Sensitive data redaction (passwords, auth)
✅ Environment-based log formatting
✅ Structured JSON logs for production
✅ Pretty colored logs for development
✅ Error serialization with stack traces
✅ Ready for log aggregation (stdout/JSON)
## Next Steps (Phases 4-7)
- Update ~30 API routes with logging
- Add React Query/hooks error logging
- Implement client-side error boundary
- Add documentation and testing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
|
|
|
this.logger.debug({
|
|
|
|
|
method,
|
|
|
|
|
duration,
|
|
|
|
|
resultSize: JSON.stringify(value).length,
|
|
|
|
|
}, `XML-RPC call successful: ${method} (${duration}ms)`);
|
|
|
|
|
|
2025-11-23 18:23:51 +01:00
|
|
|
resolve(value);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===== System Methods =====
|
|
|
|
|
|
|
|
|
|
async getAPIVersion(): Promise<string> {
|
|
|
|
|
return this.call<string>('supervisor.getAPIVersion');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getSupervisorVersion(): Promise<string> {
|
|
|
|
|
return this.call<string>('supervisor.getSupervisorVersion');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getIdentification(): Promise<string> {
|
|
|
|
|
return this.call<string>('supervisor.getIdentification');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getState(): Promise<SupervisorStateInfo> {
|
|
|
|
|
const result = await this.call<any>('supervisor.getState');
|
|
|
|
|
return SupervisorStateInfoSchema.parse(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getPID(): Promise<number> {
|
|
|
|
|
return this.call<number>('supervisor.getPID');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getSystemInfo(): Promise<SystemInfo> {
|
|
|
|
|
const [apiVersion, supervisorVersion, identification, state, pid] = await Promise.all([
|
|
|
|
|
this.getAPIVersion(),
|
|
|
|
|
this.getSupervisorVersion(),
|
|
|
|
|
this.getIdentification(),
|
|
|
|
|
this.getState(),
|
|
|
|
|
this.getPID(),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
apiVersion,
|
|
|
|
|
supervisorVersion,
|
|
|
|
|
identification,
|
|
|
|
|
state,
|
|
|
|
|
pid,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===== Process Info Methods =====
|
|
|
|
|
|
|
|
|
|
async getAllProcessInfo(): Promise<ProcessInfo[]> {
|
|
|
|
|
const result = await this.call<any[]>('supervisor.getAllProcessInfo');
|
|
|
|
|
return result.map((item) => ProcessInfoSchema.parse(item));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getProcessInfo(name: string): Promise<ProcessInfo> {
|
|
|
|
|
const result = await this.call<any>('supervisor.getProcessInfo', [name]);
|
|
|
|
|
return ProcessInfoSchema.parse(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getAllConfigInfo(): Promise<ConfigInfo[]> {
|
|
|
|
|
const result = await this.call<any[]>('supervisor.getAllConfigInfo');
|
|
|
|
|
return result.map((item) => ConfigInfoSchema.parse(item));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===== Process Control Methods =====
|
|
|
|
|
|
|
|
|
|
async startProcess(name: string, wait: boolean = true): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.startProcess', [name, wait]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async startProcessGroup(name: string, wait: boolean = true): Promise<ProcessActionResult[]> {
|
|
|
|
|
return this.call<ProcessActionResult[]>('supervisor.startProcessGroup', [name, wait]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async startAllProcesses(wait: boolean = true): Promise<ProcessActionResult[]> {
|
|
|
|
|
return this.call<ProcessActionResult[]>('supervisor.startAllProcesses', [wait]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async stopProcess(name: string, wait: boolean = true): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.stopProcess', [name, wait]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async stopProcessGroup(name: string, wait: boolean = true): Promise<ProcessActionResult[]> {
|
|
|
|
|
return this.call<ProcessActionResult[]>('supervisor.stopProcessGroup', [name, wait]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async stopAllProcesses(wait: boolean = true): Promise<ProcessActionResult[]> {
|
|
|
|
|
return this.call<ProcessActionResult[]>('supervisor.stopAllProcesses', [wait]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async restartProcess(name: string): Promise<boolean> {
|
|
|
|
|
await this.stopProcess(name, true);
|
|
|
|
|
return this.startProcess(name, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async signalProcess(name: string, signal: string): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.signalProcess', [name, signal]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async signalProcessGroup(name: string, signal: string): Promise<ProcessActionResult[]> {
|
|
|
|
|
return this.call<ProcessActionResult[]>('supervisor.signalProcessGroup', [name, signal]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async signalAllProcesses(signal: string): Promise<ProcessActionResult[]> {
|
|
|
|
|
return this.call<ProcessActionResult[]>('supervisor.signalAllProcesses', [signal]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===== Log Methods =====
|
|
|
|
|
|
|
|
|
|
async readProcessStdoutLog(
|
|
|
|
|
name: string,
|
|
|
|
|
offset: number,
|
|
|
|
|
length: number
|
|
|
|
|
): Promise<string> {
|
|
|
|
|
return this.call<string>('supervisor.readProcessStdoutLog', [name, offset, length]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async readProcessStderrLog(
|
|
|
|
|
name: string,
|
|
|
|
|
offset: number,
|
|
|
|
|
length: number
|
|
|
|
|
): Promise<string> {
|
|
|
|
|
return this.call<string>('supervisor.readProcessStderrLog', [name, offset, length]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async tailProcessStdoutLog(
|
|
|
|
|
name: string,
|
|
|
|
|
offset: number,
|
|
|
|
|
length: number
|
|
|
|
|
): Promise<LogTailResult> {
|
|
|
|
|
const result = await this.call<[string, number, boolean]>('supervisor.tailProcessStdoutLog', [
|
|
|
|
|
name,
|
|
|
|
|
offset,
|
|
|
|
|
length,
|
|
|
|
|
]);
|
|
|
|
|
return {
|
|
|
|
|
bytes: result[0],
|
|
|
|
|
offset: result[1],
|
|
|
|
|
overflow: result[2],
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async tailProcessStderrLog(
|
|
|
|
|
name: string,
|
|
|
|
|
offset: number,
|
|
|
|
|
length: number
|
|
|
|
|
): Promise<LogTailResult> {
|
|
|
|
|
const result = await this.call<[string, number, boolean]>('supervisor.tailProcessStderrLog', [
|
|
|
|
|
name,
|
|
|
|
|
offset,
|
|
|
|
|
length,
|
|
|
|
|
]);
|
|
|
|
|
return {
|
|
|
|
|
bytes: result[0],
|
|
|
|
|
offset: result[1],
|
|
|
|
|
overflow: result[2],
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async clearProcessLogs(name: string): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.clearProcessLogs', [name]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async clearAllProcessLogs(): Promise<ProcessActionResult[]> {
|
|
|
|
|
return this.call<ProcessActionResult[]>('supervisor.clearAllProcessLogs');
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-23 22:58:03 +01:00
|
|
|
async readLog(offset: number, length: number): Promise<string> {
|
|
|
|
|
return this.call<string>('supervisor.readLog', [offset, length]);
|
2025-11-23 18:23:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async clearLog(): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.clearLog');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===== Configuration Methods =====
|
|
|
|
|
|
|
|
|
|
async reloadConfig(): Promise<ReloadConfigResult> {
|
|
|
|
|
const result = await this.call<any>('supervisor.reloadConfig');
|
|
|
|
|
return ReloadConfigResultSchema.parse({
|
|
|
|
|
added: result[0],
|
|
|
|
|
changed: result[1],
|
|
|
|
|
removed: result[2],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async addProcessGroup(name: string): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.addProcessGroup', [name]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async removeProcessGroup(name: string): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.removeProcessGroup', [name]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ===== Supervisor Control Methods =====
|
|
|
|
|
|
|
|
|
|
async shutdown(): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.shutdown');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async restart(): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.restart');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async sendProcessStdin(name: string, chars: string): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.sendProcessStdin', [name, chars]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async sendRemoteCommEvent(type: string, data: string): Promise<boolean> {
|
|
|
|
|
return this.call<boolean>('supervisor.sendRemoteCommEvent', [type, data]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Factory function to create a supervisor client from environment variables
|
|
|
|
|
*/
|
|
|
|
|
export function createSupervisorClient(config?: Partial<SupervisorClientConfig>): SupervisorClient {
|
|
|
|
|
const defaultConfig: SupervisorClientConfig = {
|
|
|
|
|
host: process.env.SUPERVISOR_HOST || 'localhost',
|
|
|
|
|
port: parseInt(process.env.SUPERVISOR_PORT || '9001', 10),
|
|
|
|
|
username: process.env.SUPERVISOR_USERNAME,
|
|
|
|
|
password: process.env.SUPERVISOR_PASSWORD,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return new SupervisorClient({ ...defaultConfig, ...config });
|
|
|
|
|
}
|