Foundation slice for Mantis #841 php/Mod/Agent RFC implementation: * CompleteTask now wraps in DB::transaction with idempotent credit awards and safe current_task_id clearing * Credits/{Award,GetBalance,GetCreditHistory} updated for agent_id + fleet_task_id ledger support and richer balance totals * GenerateCommand canonical agentic:generate wiring; legacy duplicate no longer registered * Boot wires brain:clean / brain:prune / brain:reindex * EmbedMemory exits early when memory already indexed * 3 follow-on fleet migrations reconcile fleet_nodes pointer column, fleet_tasks/credit_entries fk/index hygiene, fleet+credit constraints * 4 foundation tests under php/tests/Feature/Mod/Agent/ php -l clean on all modified files. pest unrunnable in sandbox (no vendor/). Foundation slice only: remaining model/action parity, full MCP tool/ service sweep, fleet controller auth-context, and 41-tool/45-action surface left for follow-up tickets. Co-authored-by: Codex <noreply@openai.com> Closes tasks.lthn.sh/view.php?id=841
61 lines
1.7 KiB
PHP
61 lines
1.7 KiB
PHP
<?php
|
|
|
|
// SPDX-License-Identifier: EUPL-1.2
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Core\Mod\Agentic\Jobs;
|
|
|
|
use Core\Mod\Agentic\Models\BrainMemory;
|
|
use Core\Mod\Agentic\Services\BrainService;
|
|
use Illuminate\Bus\Queueable;
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
use Illuminate\Foundation\Bus\Dispatchable;
|
|
use Illuminate\Queue\InteractsWithQueue;
|
|
use Illuminate\Queue\SerializesModels;
|
|
|
|
class EmbedMemory implements ShouldQueue
|
|
{
|
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
|
|
|
public int $tries = 3;
|
|
|
|
/**
|
|
* @var array<int, int>
|
|
*/
|
|
public array $backoff = [10, 60, 300];
|
|
|
|
public function __construct(
|
|
public string $memoryId,
|
|
) {}
|
|
|
|
public function handle(BrainService $brain): void
|
|
{
|
|
$memory = BrainMemory::find($this->memoryId);
|
|
|
|
if (! $memory instanceof BrainMemory || $memory->indexed_at !== null) {
|
|
return;
|
|
}
|
|
|
|
$vector = $brain->embed($memory->content);
|
|
|
|
$payload = $brain->buildQdrantPayload($memory->id, [
|
|
'workspace_id' => $memory->workspace_id,
|
|
'org' => $memory->getAttribute('org'),
|
|
'project' => $memory->project,
|
|
'agent_id' => $memory->agent_id,
|
|
'type' => $memory->type,
|
|
'tags' => $memory->tags ?? [],
|
|
'confidence' => $memory->confidence,
|
|
'source' => $memory->source ?? 'manual',
|
|
'content' => $memory->content,
|
|
'created_at' => $memory->created_at?->toIso8601String(),
|
|
]);
|
|
$payload['vector'] = $vector;
|
|
|
|
$brain->qdrantUpsert([$payload]);
|
|
$brain->elasticIndex($memory);
|
|
|
|
$memory->update(['indexed_at' => now()]);
|
|
}
|
|
}
|