diff --git a/bin/coding b/bin/coding index c408af3b2..79bafc302 100755 --- a/bin/coding +++ b/bin/coding @@ -9,6 +9,7 @@ set -e AGENT="" FORCE_AGENT="" ARGS=() +SERVICE_ARGS=() VERBOSE=false CONFIG_FILE="" PROJECT_DIR="" @@ -105,6 +106,10 @@ while [[ $# -gt 0 ]]; do --lsl-validate) exec node "$SCRIPT_DIR/../tests/integration/full-system-validation.test.js" ;; + --no-vkb|--no-constraints|--no-transcript|--no-logging|--no-health) + SERVICE_ARGS+=("$1") + shift + ;; --help|-h) show_help exit 0 @@ -177,6 +182,8 @@ export CODING_AGENT="$AGENT" export CODING_TOOLS_PATH="$SCRIPT_DIR/.." export CODING_REPO="$SCRIPT_DIR/.." export CODING_PROJECT_DIR="$PROJECT_DIR" +# Pass service args as a space-separated string +export SERVICE_ARGS_STR="${SERVICE_ARGS[*]}" # Launch appropriate agent case "$AGENT" in diff --git a/scripts/launch-claude.sh b/scripts/launch-claude.sh index 6bb5039ba..806f5b60a 100755 --- a/scripts/launch-claude.sh +++ b/scripts/launch-claude.sh @@ -58,6 +58,9 @@ verify_monitoring_systems() { } +# Reconstruct SERVICE_ARGS array from env var +SERVICE_ARGS=($SERVICE_ARGS_STR) + # Use target project directory if specified, otherwise use coding repo if [ -n "$CODING_PROJECT_DIR" ]; then TARGET_PROJECT_DIR="$CODING_PROJECT_DIR" @@ -136,7 +139,8 @@ if ! command -v node &> /dev/null; then fi # Start services using the simple startup script (from coding repo) -if ! "$CODING_REPO/start-services.sh"; then +# Forward any service-related arguments +if ! "$CODING_REPO/start-services.sh" "${SERVICE_ARGS[@]}"; then log "Error: Failed to start services" exit 1 fi diff --git a/scripts/launch-copilot.sh b/scripts/launch-copilot.sh index 32a470082..282b649f4 100755 --- a/scripts/launch-copilot.sh +++ b/scripts/launch-copilot.sh @@ -111,6 +111,9 @@ start_http_adapter() { fi } +# Reconstruct SERVICE_ARGS array from env var +SERVICE_ARGS=($SERVICE_ARGS_STR) + # Use target project directory if specified, otherwise use coding repo if [ -n "$CODING_PROJECT_DIR" ]; then TARGET_PROJECT_DIR="$CODING_PROJECT_DIR" @@ -148,7 +151,8 @@ if ! command -v node &> /dev/null; then fi # Start services using the simple startup script (from coding repo) -if ! "$CODING_REPO/start-services.sh"; then +# Forward any service-related arguments +if ! "$CODING_REPO/start-services.sh" "${SERVICE_ARGS[@]}"; then log "Error: Failed to start services" exit 1 fi diff --git a/scripts/start-services-robust.js b/scripts/start-services-robust.js index 37db526e1..3263f4a7e 100755 --- a/scripts/start-services-robust.js +++ b/scripts/start-services-robust.js @@ -40,6 +40,26 @@ const CODING_DIR = path.resolve(SCRIPT_DIR, '..'); const execAsync = promisify(exec); const psm = new ProcessStateManager(); +// Parse CLI arguments for service control +const args = process.argv.slice(2); +const SERVICE_FLAGS = { + skipVkb: args.includes('--no-vkb'), + skipConstraints: args.includes('--no-constraints'), + skipTranscript: args.includes('--no-transcript'), + skipLogging: args.includes('--no-logging'), + skipHealth: args.includes('--no-health') +}; + +if (Object.values(SERVICE_FLAGS).some(Boolean)) { + console.log('🔧 Service Configuration:'); + if (SERVICE_FLAGS.skipVkb) console.log(' - VKB Server disabled (--no-vkb)'); + if (SERVICE_FLAGS.skipConstraints) console.log(' - Constraint Monitor disabled (--no-constraints)'); + if (SERVICE_FLAGS.skipTranscript) console.log(' - Transcript Monitor disabled (--no-transcript)'); + if (SERVICE_FLAGS.skipLogging) console.log(' - Live Logging disabled (--no-logging)'); + if (SERVICE_FLAGS.skipHealth) console.log(' - Health Monitoring disabled (--no-health)'); + console.log(''); +} + // Service configurations const SERVICE_CONFIGS = { transcriptMonitor: { @@ -504,46 +524,54 @@ async function startAllServices() { console.log('📋 Starting REQUIRED services (Live Logging System)...'); console.log(''); - try { - const transcriptResult = await startServiceWithRetry( - SERVICE_CONFIGS.transcriptMonitor.name, - SERVICE_CONFIGS.transcriptMonitor.startFn, - SERVICE_CONFIGS.transcriptMonitor.healthCheckFn, - { - required: SERVICE_CONFIGS.transcriptMonitor.required, - maxRetries: SERVICE_CONFIGS.transcriptMonitor.maxRetries, - timeout: SERVICE_CONFIGS.transcriptMonitor.timeout - } - ); - results.successful.push(transcriptResult); - await registerWithPSM(transcriptResult, 'scripts/enhanced-transcript-monitor.js'); - } catch (error) { - results.failed.push({ - serviceName: SERVICE_CONFIGS.transcriptMonitor.name, - error: error.message, - required: true - }); + if (!SERVICE_FLAGS.skipTranscript) { + try { + const transcriptResult = await startServiceWithRetry( + SERVICE_CONFIGS.transcriptMonitor.name, + SERVICE_CONFIGS.transcriptMonitor.startFn, + SERVICE_CONFIGS.transcriptMonitor.healthCheckFn, + { + required: SERVICE_CONFIGS.transcriptMonitor.required, + maxRetries: SERVICE_CONFIGS.transcriptMonitor.maxRetries, + timeout: SERVICE_CONFIGS.transcriptMonitor.timeout + } + ); + results.successful.push(transcriptResult); + await registerWithPSM(transcriptResult, 'scripts/enhanced-transcript-monitor.js'); + } catch (error) { + results.failed.push({ + serviceName: SERVICE_CONFIGS.transcriptMonitor.name, + error: error.message, + required: true + }); + } + } else { + console.log('⏭️ Skipping Transcript Monitor (--no-transcript)'); } - try { - const coordinatorResult = await startServiceWithRetry( - SERVICE_CONFIGS.liveLoggingCoordinator.name, - SERVICE_CONFIGS.liveLoggingCoordinator.startFn, - SERVICE_CONFIGS.liveLoggingCoordinator.healthCheckFn, - { - required: SERVICE_CONFIGS.liveLoggingCoordinator.required, - maxRetries: SERVICE_CONFIGS.liveLoggingCoordinator.maxRetries, - timeout: SERVICE_CONFIGS.liveLoggingCoordinator.timeout - } - ); - results.successful.push(coordinatorResult); - await registerWithPSM(coordinatorResult, 'scripts/live-logging-coordinator.js'); - } catch (error) { - results.failed.push({ - serviceName: SERVICE_CONFIGS.liveLoggingCoordinator.name, - error: error.message, - required: true - }); + if (!SERVICE_FLAGS.skipLogging) { + try { + const coordinatorResult = await startServiceWithRetry( + SERVICE_CONFIGS.liveLoggingCoordinator.name, + SERVICE_CONFIGS.liveLoggingCoordinator.startFn, + SERVICE_CONFIGS.liveLoggingCoordinator.healthCheckFn, + { + required: SERVICE_CONFIGS.liveLoggingCoordinator.required, + maxRetries: SERVICE_CONFIGS.liveLoggingCoordinator.maxRetries, + timeout: SERVICE_CONFIGS.liveLoggingCoordinator.timeout + } + ); + results.successful.push(coordinatorResult); + await registerWithPSM(coordinatorResult, 'scripts/live-logging-coordinator.js'); + } catch (error) { + results.failed.push({ + serviceName: SERVICE_CONFIGS.liveLoggingCoordinator.name, + error: error.message, + required: true + }); + } + } else { + console.log('⏭️ Skipping Live Logging Coordinator (--no-logging)'); } console.log(''); @@ -552,85 +580,97 @@ async function startAllServices() { console.log('🔵 Starting OPTIONAL services (graceful degradation enabled)...'); console.log(''); - const vkbResult = await startServiceWithRetry( - SERVICE_CONFIGS.vkbServer.name, - SERVICE_CONFIGS.vkbServer.startFn, - SERVICE_CONFIGS.vkbServer.healthCheckFn, - { - required: SERVICE_CONFIGS.vkbServer.required, - maxRetries: SERVICE_CONFIGS.vkbServer.maxRetries, - timeout: SERVICE_CONFIGS.vkbServer.timeout - } - ); + if (!SERVICE_FLAGS.skipVkb) { + const vkbResult = await startServiceWithRetry( + SERVICE_CONFIGS.vkbServer.name, + SERVICE_CONFIGS.vkbServer.startFn, + SERVICE_CONFIGS.vkbServer.healthCheckFn, + { + required: SERVICE_CONFIGS.vkbServer.required, + maxRetries: SERVICE_CONFIGS.vkbServer.maxRetries, + timeout: SERVICE_CONFIGS.vkbServer.timeout + } + ); - if (vkbResult.status === 'success') { - results.successful.push(vkbResult); - await registerWithPSM(vkbResult, 'lib/vkb-server/cli.js'); + if (vkbResult.status === 'success') { + results.successful.push(vkbResult); + await registerWithPSM(vkbResult, 'lib/vkb-server/cli.js'); + } else { + results.degraded.push(vkbResult); + } } else { - results.degraded.push(vkbResult); + console.log('⏭️ Skipping VKB Server (--no-vkb)'); } console.log(''); // 3. OPTIONAL: Constraint Monitor - const constraintResult = await startServiceWithRetry( - SERVICE_CONFIGS.constraintMonitor.name, - SERVICE_CONFIGS.constraintMonitor.startFn, - SERVICE_CONFIGS.constraintMonitor.healthCheckFn, - { - required: SERVICE_CONFIGS.constraintMonitor.required, - maxRetries: SERVICE_CONFIGS.constraintMonitor.maxRetries, - timeout: SERVICE_CONFIGS.constraintMonitor.timeout - } - ); + if (!SERVICE_FLAGS.skipConstraints) { + const constraintResult = await startServiceWithRetry( + SERVICE_CONFIGS.constraintMonitor.name, + SERVICE_CONFIGS.constraintMonitor.startFn, + SERVICE_CONFIGS.constraintMonitor.healthCheckFn, + { + required: SERVICE_CONFIGS.constraintMonitor.required, + maxRetries: SERVICE_CONFIGS.constraintMonitor.maxRetries, + timeout: SERVICE_CONFIGS.constraintMonitor.timeout + } + ); - if (constraintResult.status === 'success') { - results.successful.push(constraintResult); - // No PSM registration for Docker-based service + if (constraintResult.status === 'success') { + results.successful.push(constraintResult); + // No PSM registration for Docker-based service + } else { + results.degraded.push(constraintResult); + } } else { - results.degraded.push(constraintResult); + console.log('⏭️ Skipping Constraint Monitor (--no-constraints)'); } console.log(''); // 4. OPTIONAL: Health Verifier - const healthVerifierResult = await startServiceWithRetry( - SERVICE_CONFIGS.healthVerifier.name, - SERVICE_CONFIGS.healthVerifier.startFn, - SERVICE_CONFIGS.healthVerifier.healthCheckFn, - { - required: SERVICE_CONFIGS.healthVerifier.required, - maxRetries: SERVICE_CONFIGS.healthVerifier.maxRetries, - timeout: SERVICE_CONFIGS.healthVerifier.timeout + if (!SERVICE_FLAGS.skipHealth) { + const healthVerifierResult = await startServiceWithRetry( + SERVICE_CONFIGS.healthVerifier.name, + SERVICE_CONFIGS.healthVerifier.startFn, + SERVICE_CONFIGS.healthVerifier.healthCheckFn, + { + required: SERVICE_CONFIGS.healthVerifier.required, + maxRetries: SERVICE_CONFIGS.healthVerifier.maxRetries, + timeout: SERVICE_CONFIGS.healthVerifier.timeout + } + ); + + if (healthVerifierResult.status === 'success') { + results.successful.push(healthVerifierResult); + await registerWithPSM(healthVerifierResult, 'scripts/health-verifier.js'); + } else { + results.degraded.push(healthVerifierResult); } - ); - if (healthVerifierResult.status === 'success') { - results.successful.push(healthVerifierResult); - await registerWithPSM(healthVerifierResult, 'scripts/health-verifier.js'); - } else { - results.degraded.push(healthVerifierResult); - } + console.log(''); - console.log(''); + // 5. OPTIONAL: StatusLine Health Monitor + const statuslineHealthResult = await startServiceWithRetry( + SERVICE_CONFIGS.statuslineHealthMonitor.name, + SERVICE_CONFIGS.statuslineHealthMonitor.startFn, + SERVICE_CONFIGS.statuslineHealthMonitor.healthCheckFn, + { + required: SERVICE_CONFIGS.statuslineHealthMonitor.required, + maxRetries: SERVICE_CONFIGS.statuslineHealthMonitor.maxRetries, + timeout: SERVICE_CONFIGS.statuslineHealthMonitor.timeout + } + ); - // 5. OPTIONAL: StatusLine Health Monitor - const statuslineHealthResult = await startServiceWithRetry( - SERVICE_CONFIGS.statuslineHealthMonitor.name, - SERVICE_CONFIGS.statuslineHealthMonitor.startFn, - SERVICE_CONFIGS.statuslineHealthMonitor.healthCheckFn, - { - required: SERVICE_CONFIGS.statuslineHealthMonitor.required, - maxRetries: SERVICE_CONFIGS.statuslineHealthMonitor.maxRetries, - timeout: SERVICE_CONFIGS.statuslineHealthMonitor.timeout + if (statuslineHealthResult.status === 'success') { + results.successful.push(statuslineHealthResult); + await registerWithPSM(statuslineHealthResult, 'scripts/statusline-health-monitor.js'); + } else { + results.degraded.push(statuslineHealthResult); } - ); - - if (statuslineHealthResult.status === 'success') { - results.successful.push(statuslineHealthResult); - await registerWithPSM(statuslineHealthResult, 'scripts/statusline-health-monitor.js'); } else { - results.degraded.push(statuslineHealthResult); + console.log('⏭️ Skipping Health Monitoring (--no-health)'); } console.log(''); diff --git a/start-services.sh b/start-services.sh index a01d1b065..e3262d223 100755 --- a/start-services.sh +++ b/start-services.sh @@ -18,7 +18,7 @@ if [ "$ROBUST_MODE" = "true" ]; then echo "" # Use the Node.js-based robust service starter - exec node "$SCRIPT_DIR/scripts/start-services-robust.js" + exec node "$SCRIPT_DIR/scripts/start-services-robust.js" "$@" fi # LEGACY MODE (kept for backward compatibility, disable with ROBUST_MODE=false)