use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionHooks;
use Revolution\Copilot\Types\Hooks\ErrorOccurredHookInput;
use Revolution\Copilot\Types\Hooks\ErrorOccurredHookOutput;
use Revolution\Copilot\Types\Hooks\PostToolUseHookInput;
use Revolution\Copilot\Types\Hooks\PostToolUseHookOutput;
use Revolution\Copilot\Types\Hooks\PreToolUseHookInput;
use Revolution\Copilot\Types\Hooks\PreToolUseHookOutput;
use Revolution\Copilot\Types\Hooks\SessionEndHookInput;
use Revolution\Copilot\Types\Hooks\SessionEndHookOutput;
use Revolution\Copilot\Types\Hooks\SessionStartHookInput;
use Revolution\Copilot\Types\Hooks\SessionStartHookOutput;
use Revolution\Copilot\Types\Hooks\UserPromptSubmittedHookInput;
use Revolution\Copilot\Types\Hooks\UserPromptSubmittedHookOutput;
Copilot::start(function (CopilotSession $session) {
$response = $session->sendAndWait(prompt: 'READMEの要点をまとめて');
dump($response->content());
}, config: [
'model' => 'gpt-5',
'hooks' => new SessionHooks(
onSessionStart: function (SessionStartHookInput $input): ?SessionStartHookOutput {
return new SessionStartHookOutput(
additionalContext: "Project root: {$input->cwd}",
);
},
onUserPromptSubmitted: function (UserPromptSubmittedHookInput $input): ?UserPromptSubmittedHookOutput {
if (str_starts_with($input->prompt, '/fix')) {
return new UserPromptSubmittedHookOutput(
modifiedPrompt: '現在のエラーを修正して、変更点を要約して。',
);
}
return null;
},
onPreToolUse: function (PreToolUseHookInput $input): ?PreToolUseHookOutput {
$blocked = ['bash', 'shell', 'delete_file'];
if (in_array($input->toolName, $blocked, true)) {
return new PreToolUseHookOutput(
permissionDecision: 'deny',
permissionDecisionReason: "{$input->toolName} はこの環境では許可されていません",
);
}
return new PreToolUseHookOutput(permissionDecision: 'allow');
},
onPostToolUse: function (PostToolUseHookInput $input): ?PostToolUseHookOutput {
if ($input->toolName === 'read_file') {
return new PostToolUseHookOutput(
additionalContext: '必要なら関連ファイルも探索して比較してください。',
);
}
return null;
},
onErrorOccurred: function (ErrorOccurredHookInput $input): ?ErrorOccurredHookOutput {
if ($input->errorContext === 'model_call' && $input->recoverable) {
return new ErrorOccurredHookOutput(
errorHandling: 'retry',
retryCount: 2,
userNotification: '一時的なモデルエラーのためリトライします。',
);
}
return null;
},
onSessionEnd: function (SessionEndHookInput $input): ?SessionEndHookOutput {
if ($input->reason !== 'complete') {
return new SessionEndHookOutput(
sessionSummary: "Session ended with reason: {$input->reason}",
);
}
return null;
},
),
]);