fix: блокировать ввод в running-задачу (S3: нельзя running→collecting); разрешены /cancel и /status N
All checks were successful
CI / test (push) Successful in 46s
CI / build-and-package (amd64, linux) (push) Successful in 41s
CI / build-and-package (amd64, windows) (push) Successful in 40s

This commit is contained in:
Hermes
2026-08-16 23:21:30 +05:00
parent c8cd425b29
commit 76ec7d21f1

View File

@@ -83,14 +83,14 @@ func New(configPath, version, updateToken string) (*App, error) {
// OpenCode runner — один на аналитика и воркер // OpenCode runner — один на аналитика и воркер
ocRunner := &opencode.Runner{ ocRunner := &opencode.Runner{
Bin: cfg.OpenCode.Bin, Bin: cfg.OpenCode.Bin,
DBPath: cfg.OpenCode.DBPath, DBPath: cfg.OpenCode.DBPath,
Config: cfg.OpenCode.Config, Config: cfg.OpenCode.Config,
ConfigDir: cfg.OpenCode.ConfigDir, ConfigDir: cfg.OpenCode.ConfigDir,
IdleTimeout: cfg.OpenCode.IdleTimeout.Duration(), IdleTimeout: cfg.OpenCode.IdleTimeout.Duration(),
HardTimeout: cfg.OpenCode.HardTimeout.Duration(), HardTimeout: cfg.OpenCode.HardTimeout.Duration(),
PollInterval: cfg.OpenCode.PollMs.Duration(), PollInterval: cfg.OpenCode.PollMs.Duration(),
Stdout: os.Stderr, Stdout: os.Stderr,
} }
// Analyst (Decider) // Analyst (Decider)
@@ -266,6 +266,21 @@ func (a *App) handleIncoming(inc chat.Incoming) {
return return
} }
// Активная задача есть, но воркер её выполняет (running). Обычный ввод и команды
// редактирования НЕ должны переводить задачу обратно в collecting — это невалидный
// переход S3 (running → collecting). Разрешено лишь терминальное /cancel и /status N.
if task.Status == storage.StatusRunning {
switch {
case cmdName(text) == "/cancel":
// переходим на терминальный статус
case cmdName(text) == "/status" && hasArg(text):
// запрос статуса конкретной задачи — безопасно, не трогает машину состояний
default:
a.send(ctx, uid, "⏳ Задача ещё выполняется воркером. Дождитесь результата, или /cancel чтобы остановить.")
return
}
}
// Активная задача есть — обработка // Активная задача есть — обработка
result, err := a.CoreCtx.ProcessTurn(ctx, task.ID, text) result, err := a.CoreCtx.ProcessTurn(ctx, task.ID, text)
if err != nil { if err != nil {