| Server IP : 35.80.110.71 / Your IP : 216.73.216.221 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64 User : ubuntu ( 1000) PHP Version : 8.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/almanac/current/routes/ |
Upload File : |
<?php
use App\Jobs\ClusterUnansweredQuestionsJob;
use App\Jobs\IngestConnectorJob;
use App\Jobs\PruneExpiredConversationsJob;
use App\Models\Connector;
use App\Models\Workspace;
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schedule;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
// Per-source incremental re-sync. Each active connector polls its source
// every 10 minutes; backoff + paused connectors are skipped inside the job.
Schedule::call(function () {
Connector::query()
->where('status', Connector::STATUS_ACTIVE)
->chunkById(100, function ($connectors) {
foreach ($connectors as $c) {
if ($c->backoff_until !== null && $c->backoff_until->isFuture()) {
continue;
}
IngestConnectorJob::dispatch($c->workspace_id, $c->id);
}
});
})->everyTenMinutes()->name('almanac:ingest-tick')->withoutOverlapping();
// Nightly: cluster unanswered_questions for every workspace with enough volume.
Schedule::call(function () {
Workspace::query()->chunkById(100, function ($workspaces) {
foreach ($workspaces as $w) {
ClusterUnansweredQuestionsJob::dispatch($w->id);
}
});
})->dailyAt('02:00')->name('almanac:cluster-gap-report');
// Daily: prune expired conversations + cascade.
Schedule::job(new PruneExpiredConversationsJob())
->dailyAt('03:00')
->name('almanac:prune-expired-conversations');