refactor: optimize configuration and tool implementations

- Standardized error handling across tool implementations
- Improved return type consistency for tool execution results
- Simplified configuration parsing and type definitions
- Enhanced type safety for various configuration schemas
- Cleaned up and normalized tool response structures
- Updated SSE and event subscription tool implementations
This commit is contained in:
jango-blockchained
2025-02-04 00:56:45 +01:00
parent 9a02bdaf11
commit bc1dc8278a
65 changed files with 7094 additions and 7675 deletions

View File

@@ -1,77 +1,86 @@
import { config } from 'dotenv';
import { resolve } from 'path';
import { config } from "dotenv";
import { resolve } from "path";
// Load environment variables based on NODE_ENV
const envFile = process.env.NODE_ENV === 'production'
? '.env'
: process.env.NODE_ENV === 'test'
? '.env.test'
: '.env.development';
const envFile =
process.env.NODE_ENV === "production"
? ".env"
: process.env.NODE_ENV === "test"
? ".env.test"
: ".env.development";
console.log(`Loading environment from ${envFile}`);
config({ path: resolve(process.cwd(), envFile) });
// Home Assistant Configuration
export const HASS_CONFIG = {
HOST: process.env.HASS_HOST || 'http://homeassistant.local:8123',
TOKEN: process.env.HASS_TOKEN,
SOCKET_URL: process.env.HASS_SOCKET_URL || 'ws://homeassistant.local:8123/api/websocket',
BASE_URL: process.env.HASS_HOST || 'http://homeassistant.local:8123',
SOCKET_TOKEN: process.env.HASS_TOKEN
HOST: process.env.HASS_HOST || "http://homeassistant.local:8123",
TOKEN: process.env.HASS_TOKEN,
SOCKET_URL:
process.env.HASS_SOCKET_URL ||
"ws://homeassistant.local:8123/api/websocket",
BASE_URL: process.env.HASS_HOST || "http://homeassistant.local:8123",
SOCKET_TOKEN: process.env.HASS_TOKEN,
};
// Server Configuration
export const SERVER_CONFIG = {
PORT: parseInt(process.env.PORT || '3000', 10),
NODE_ENV: process.env.NODE_ENV || 'development',
DEBUG: process.env.DEBUG === 'true',
LOG_LEVEL: process.env.LOG_LEVEL || 'info'
PORT: parseInt(process.env.PORT || "3000", 10),
NODE_ENV: process.env.NODE_ENV || "development",
DEBUG: process.env.DEBUG === "true",
LOG_LEVEL: process.env.LOG_LEVEL || "info",
};
// AI Configuration
export const AI_CONFIG = {
PROCESSOR_TYPE: process.env.PROCESSOR_TYPE || 'claude',
OPENAI_API_KEY: process.env.OPENAI_API_KEY
PROCESSOR_TYPE: process.env.PROCESSOR_TYPE || "claude",
OPENAI_API_KEY: process.env.OPENAI_API_KEY,
};
// Rate Limiting Configuration
export const RATE_LIMIT_CONFIG = {
REGULAR: parseInt(process.env.RATE_LIMIT_REGULAR || '100', 10),
WEBSOCKET: parseInt(process.env.RATE_LIMIT_WEBSOCKET || '1000', 10)
REGULAR: parseInt(process.env.RATE_LIMIT_REGULAR || "100", 10),
WEBSOCKET: parseInt(process.env.RATE_LIMIT_WEBSOCKET || "1000", 10),
};
// Security Configuration
export const SECURITY_CONFIG = {
JWT_SECRET: process.env.JWT_SECRET || 'default_secret_key_change_in_production',
CORS_ORIGINS: (process.env.CORS_ORIGINS || 'http://localhost:3000,http://localhost:8123')
.split(',')
.map(origin => origin.trim())
JWT_SECRET:
process.env.JWT_SECRET || "default_secret_key_change_in_production",
CORS_ORIGINS: (
process.env.CORS_ORIGINS || "http://localhost:3000,http://localhost:8123"
)
.split(",")
.map((origin) => origin.trim()),
};
// Test Configuration
export const TEST_CONFIG = {
HASS_HOST: process.env.TEST_HASS_HOST || 'http://localhost:8123',
HASS_TOKEN: process.env.TEST_HASS_TOKEN || 'test_token',
HASS_SOCKET_URL: process.env.TEST_HASS_SOCKET_URL || 'ws://localhost:8123/api/websocket',
PORT: parseInt(process.env.TEST_PORT || '3001', 10)
HASS_HOST: process.env.TEST_HASS_HOST || "http://localhost:8123",
HASS_TOKEN: process.env.TEST_HASS_TOKEN || "test_token",
HASS_SOCKET_URL:
process.env.TEST_HASS_SOCKET_URL || "ws://localhost:8123/api/websocket",
PORT: parseInt(process.env.TEST_PORT || "3001", 10),
};
// Mock Configuration (for testing)
export const MOCK_CONFIG = {
SERVICES: process.env.MOCK_SERVICES === 'true',
RESPONSES_DIR: process.env.MOCK_RESPONSES_DIR || '__tests__/mock-responses'
SERVICES: process.env.MOCK_SERVICES === "true",
RESPONSES_DIR: process.env.MOCK_RESPONSES_DIR || "__tests__/mock-responses",
};
// Validate required configuration
function validateConfig() {
const missingVars: string[] = [];
const missingVars: string[] = [];
if (!HASS_CONFIG.TOKEN) missingVars.push('HASS_TOKEN');
if (!SECURITY_CONFIG.JWT_SECRET) missingVars.push('JWT_SECRET');
if (!HASS_CONFIG.TOKEN) missingVars.push("HASS_TOKEN");
if (!SECURITY_CONFIG.JWT_SECRET) missingVars.push("JWT_SECRET");
if (missingVars.length > 0) {
throw new Error(`Missing required environment variables: ${missingVars.join(', ')}`);
}
if (missingVars.length > 0) {
throw new Error(
`Missing required environment variables: ${missingVars.join(", ")}`,
);
}
}
// Export configuration validation
@@ -79,11 +88,11 @@ export const validateConfiguration = validateConfig;
// Export all configurations as a single object
export const AppConfig = {
HASS: HASS_CONFIG,
SERVER: SERVER_CONFIG,
AI: AI_CONFIG,
RATE_LIMIT: RATE_LIMIT_CONFIG,
SECURITY: SECURITY_CONFIG,
TEST: TEST_CONFIG,
MOCK: MOCK_CONFIG
};
HASS: HASS_CONFIG,
SERVER: SERVER_CONFIG,
AI: AI_CONFIG,
RATE_LIMIT: RATE_LIMIT_CONFIG,
SECURITY: SECURITY_CONFIG,
TEST: TEST_CONFIG,
MOCK: MOCK_CONFIG,
};