latestPrice(); if ($latest?->prediction_generated_at !== null && ! $this->option('force')) { $message = sprintf( 'Prediction already generated for %s at %s.', $latest->date->toDateString(), $latest->prediction_generated_at->toDateTimeString(), ); if (! $this->confirm($message.' Run again anyway?', default: false)) { $this->info('Skipped.'); return self::SUCCESS; } } $this->info('Generating prediction...'); $prediction = $predictor->generatePrediction(); if ($prediction === null) { $this->error('Could not generate a prediction — not enough price data.'); return self::FAILURE; } $this->info(sprintf( 'Done. [%s] direction=%s confidence=%d%% — %s', strtoupper($prediction->source->value), $prediction->direction->value, $prediction->confidence, $prediction->reasoning, )); } catch (Throwable $e) { $this->error("Prediction failed: {$e->getMessage()}"); return self::FAILURE; } return self::SUCCESS; } }