agent/php/Actions/Session/ListSessions.php
Virgil 1f333fc53d fix(agent-session): preserve handed-off sessions
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-01 21:53:19 +00:00

68 lines
1.8 KiB
PHP

<?php
/*
* Core PHP Framework
*
* Licensed under the European Union Public Licence (EUPL) v1.2.
* See LICENSE file for details.
*/
declare(strict_types=1);
namespace Core\Mod\Agentic\Actions\Session;
use Core\Actions\Action;
use Core\Mod\Agentic\Models\AgentSession;
use Core\Mod\Agentic\Services\AgentSessionService;
use Illuminate\Support\Collection;
/**
* List sessions for a workspace, with optional filtering.
*
* Usage:
* $sessions = ListSessions::run(1);
* $sessions = ListSessions::run(1, 'active', 'deploy-v2', 20);
*/
class ListSessions
{
use Action;
public function __construct(
private AgentSessionService $sessionService,
) {}
/**
* @return Collection<int, AgentSession>
*/
public function handle(int $workspaceId, ?string $status = null, ?string $planSlug = null, ?int $limit = null): Collection
{
if ($status !== null) {
$valid = ['active', 'paused', 'completed', 'failed', 'handed_off'];
if (! in_array($status, $valid, true)) {
throw new \InvalidArgumentException(
sprintf('status must be one of: %s', implode(', ', $valid))
);
}
}
// Active sessions use the optimised service method
if ($status === 'active' || $status === null) {
return $this->sessionService->getActiveSessions($workspaceId);
}
$query = AgentSession::query()
->where('workspace_id', $workspaceId)
->where('status', $status)
->orderBy('last_active_at', 'desc');
if ($planSlug !== null) {
$query->whereHas('plan', fn ($q) => $q->where('slug', $planSlug));
}
if ($limit !== null && $limit > 0) {
$query->limit(min($limit, 1000));
}
return $query->get();
}
}