Full pipeline: IMAP ingress -> OpenClaw dispatch -> callback -> SMTP reply. SQLite stateful storage with idempotency, threading, and retry logic. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
36 lines
1023 B
Go
36 lines
1023 B
Go
package database
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// Task status constants matching the requirement's state machine.
|
|
const (
|
|
StatusIgnored = "IGNORED"
|
|
StatusReceived = "RECEIVED"
|
|
StatusAIProcessing = "AI_PROCESSING"
|
|
StatusCallbackDone = "CALLBACK_DONE"
|
|
StatusSMTPRetrying = "SMTP_RETRYING"
|
|
StatusCompleted = "COMPLETED"
|
|
StatusFailed = "FAILED"
|
|
)
|
|
|
|
// Task represents a single email processing unit tracked through the pipeline.
|
|
type Task struct {
|
|
ID uint `gorm:"primaryKey;autoIncrement"`
|
|
TaskUUID string `gorm:"uniqueIndex;not null"`
|
|
ThreadID string `gorm:"index"`
|
|
MessageID string `gorm:"index"`
|
|
Sender string
|
|
Subject string
|
|
BodyPlain string
|
|
AIResponse string
|
|
Status string `gorm:"index;not null"`
|
|
AttemptOpenClaw int `gorm:"default:0"`
|
|
AttemptSMTP int `gorm:"default:0"`
|
|
LastError *string
|
|
NextRetryAt *time.Time
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
}
|