跳转到主要内容

会话生命周期事件

会话生命周期事件是通知会话的创建、删除、更新以及前台 / 后台状态变化(TUI+服务器模式下)的事件。

事件类型

SessionLifecycleEventType enum 中定义了 5 个事件类型。
事件说明
session.created创建了新会话
session.deleted会话被删除
session.updated会话被更新
session.foreground会话移到前台
session.background会话移到后台
use Revolution\Copilot\Enums\SessionLifecycleEventType;

// 获取事件类型的值
echo SessionLifecycleEventType::SESSION_CREATED->value; // 'session.created'

订阅事件

使用 onLifecycle() 方法可以订阅会话生命周期事件。
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionLifecycleEvent;

// 获取 Client 并订阅生命周期事件
$client = Copilot::client();

// 订阅所有生命周期事件
$unsubscribe = $client->onLifecycle(function (SessionLifecycleEvent $event) {
    match ($event->type) {
        SessionLifecycleEventType::SESSION_CREATED => info("会话创建: {$event->sessionId}"),
        SessionLifecycleEventType::SESSION_DELETED => info("会话删除: {$event->sessionId}"),
        SessionLifecycleEventType::SESSION_FOREGROUND => info("前台: {$event->sessionId}"),
        SessionLifecycleEventType::SESSION_BACKGROUND => info("后台: {$event->sessionId}"),
        default => null,
    };
});

// 取消订阅
$unsubscribe();

SessionLifecycleEvent

SessionLifecycleEvent 是包含生命周期事件详情的 readonly class。
use Revolution\Copilot\Types\SessionLifecycleEvent;
use Revolution\Copilot\Types\SessionLifecycleEventMetadata;

readonly class SessionLifecycleEvent implements Arrayable
{
    public function __construct(
        public SessionLifecycleEventType $type,  // 事件类型
        public string $sessionId,                 // 会话 ID
        public ?SessionLifecycleEventMetadata $metadata = null,  // 元数据(删除时不包含)
    ) {}
}

SessionLifecycleEventMetadata

包含会话元数据的类(删除事件中不包含)。
readonly class SessionLifecycleEventMetadata implements Arrayable
{
    public function __construct(
        public string $startTime,      // 会话开始时间
        public string $modifiedTime,   // 最后更新时间
        public ?string $summary = null, // 会话摘要
    ) {}
}

前台会话管理

当连接到以 TUI+服务器模式(--ui-server)运行的服务器时,可以管理前台会话。

获取当前的前台会话

use Revolution\Copilot\Facades\Copilot;

$client = Copilot::client();

// 获取当前显示在 TUI 中的会话 ID
$sessionId = $client->getForegroundSessionId();

if ($sessionId !== null) {
    echo "当前的前台会话: {$sessionId}";
}

设置前台会话

use Revolution\Copilot\Facades\Copilot;

$client = Copilot::client();

// 在 TUI 中显示特定会话
$client->setForegroundSessionId('session-123');

ForegroundSessionInfo

包含前台会话信息的 readonly class。
use Revolution\Copilot\Types\ForegroundSessionInfo;

readonly class ForegroundSessionInfo implements Arrayable
{
    public function __construct(
        public ?string $sessionId = null,      // 前台会话 ID
        public ?string $workspacePath = null,  // 工作区路径
    ) {}
}

在 TCP 模式下的使用

以 TUI+服务器模式启动 Copilot CLI,从 SDK 连接就可以利用生命周期事件。
# 以 TUI+服务器模式启动 Copilot CLI
copilot --ui-server --port 8080
use Revolution\Copilot\Facades\Copilot;

// 以 TCP 模式连接服务器
$client = Copilot::useTcp('tcp://127.0.0.1:8080')->client();

// 订阅生命周期事件
$client->onLifecycle(function (SessionLifecycleEvent $event) {
    // 事件处理
});

注意事项

  • session.foregroundsession.background 事件仅在 TUI+服务器模式下发生
  • 会话被删除时(session.deletedmetadata 属性为 null
  • onLifecycle() 会返回用于取消订阅的回调函数
  • 这与 Session Hooks 中的 onSessionStartonSessionEnd 是不同的功能
最新信息请参考 GitHub 仓库
最后修改于 2026年7月13日