Files
ratatoskr-go/internal/core/decider.go
Hermes 2957bf0d63
All checks were successful
build-test / build (push) Successful in 1m11s
internal/core: ядро-машина состояний (ProcessTurn поверх storage) + история задач в БД
- status = единственный источник истины (collecting/ready как фазы диалога)
- команды /start /cancel /skip /retry N /status N /continue N
- Decider интерфейс (аналитик→opencode, мок для тестов)
- task_history таблица для промпта аналитика
- allow ready→collecting (правка черновика)
2026-08-15 00:27:16 +05:00

49 lines
1.4 KiB
Go

package core
import (
"context"
"strings"
"github.com/kamelion/ratatoskr-go/internal/storage"
)
// Message — запись диалога.
type Message struct {
Role string // "user" | "assistant"
Content string
}
// Decision — вердикт аналитика.
type Decision struct {
Phase string // "ask" | "propose" | "abort"
Draft storage.Task // обновлённые поля черновика
Questions []string // вопросы для phase=ask
ChatReply string // ответ пользователю
}
// Decider — интерфейс для вызова аналитика (opencode).
type Decider interface {
Decide(ctx context.Context, history []Message, draft storage.Task, force bool) (Decision, error)
}
// Result — результат одного хода.
type Result struct {
Reply string
Action string // send | summary | created:N | abort | drop | greeting
TaskID int64
Status storage.Status
}
// consentPhrases — слова и фразы согласия.
var consentPhrases = []string{"создавай", "подтверждаю", "создать", "ок", "давай", "go"}
// isConsent проверяет, является ли текст согласием на создание.
func isConsent(text string) bool {
t := strings.ToLower(strings.TrimSpace(text))
for _, p := range consentPhrases {
if t == p {
return true
}
}
return false
}