Runner теперь ходит к постоянным serve по HTTP API (v1.17+, /api):
- клиент Client (create/send/wait/abort/messages/verdict)
- Pool: по одному serve на каталог, ленивый подъём, root-сервер в worktree,
выделение портов, ReleaseTask при завершении задачи
- Run: CreateSession('ratatoskr-<агент>') -> Send -> поллинг Verdict из
text-частей assistant-сообщений; idle/hard таймауты дают RC=-1
- вердикт извлекается из последнего assistant text-парта (плоский text)
- тесты: unit на фейковом HTTP-сервере; e2e эмулирует serve через httptest,
агент определяется по title сессии
24 lines
886 B
Go
24 lines
886 B
Go
//go:build linux || darwin || freebsd || netbsd || openbsd || aix || solaris
|
||
|
||
package opencode
|
||
|
||
import (
|
||
"os/exec"
|
||
"syscall"
|
||
)
|
||
|
||
// setpgid выделяет дочернему процессу собственную process-group, чтобы
|
||
// killGroup мог убить весь групповой процесс, а не чужой (тест-реннер и т.п.).
|
||
func setpgid(cmd *exec.Cmd) {
|
||
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
|
||
}
|
||
|
||
// killGroup шлёт SIGKILL всей process-group процесса (pgid == pid из-за
|
||
// Setpgid). Процесс уже завершён — возвращаем 0 и не отвлекаемся на ошибку
|
||
// ESRCH (группа могла сама разойтись).
|
||
func killGroup(proc *exec.Cmd) {
|
||
if proc == nil || proc.Process == nil {
|
||
return
|
||
}
|
||
_ = syscall.Kill(-proc.Process.Pid, syscall.SIGKILL)
|
||
} |