automation

package
v0.6.71 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 27, 2026 License: MIT Imports: 21 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrTaskNotFound = errors.New("automation task not found")
)

Functions

func BuildDispatchText

func BuildDispatchText(action Action) (string, error)

func NextRunAt

func NextRunAt(from time.Time, schedule Schedule) time.Time

func ShouldEscalateInternalWorkflowFailure added in v0.6.36

func ShouldEscalateInternalWorkflowFailure(task Task) bool

func ValidateTask

func ValidateTask(task Task) error

Types

type Action

type Action struct {
	Type            ActionType `json:"type"`
	Text            string     `json:"text"`
	Prompt          string     `json:"prompt,omitempty"`
	Provider        string     `json:"provider,omitempty"`
	Model           string     `json:"model,omitempty"`
	Profile         string     `json:"profile,omitempty"`
	StateKey        string     `json:"state_key,omitempty"`
	SessionKey      string     `json:"session_key,omitempty"`
	ResumeThreadID  string     `json:"resume_thread_id,omitempty"`
	SourceMessageID string     `json:"source_message_id,omitempty"`
	ReasoningEffort string     `json:"reasoning_effort,omitempty"`
	Variant         string     `json:"variant,omitempty"`
	Personality     string     `json:"personality,omitempty"`
	PromptPrefix    string     `json:"prompt_prefix,omitempty"`
	WorkspaceDir    string     `json:"workspace_dir,omitempty"`
	MentionUserIDs  []string   `json:"mention_user_ids,omitempty"`
}

type ActionType

type ActionType string
const (
	ActionTypeRunLLM ActionType = "run_llm"
)

type Actor

type Actor struct {
	UserID string `json:"user_id,omitempty"`
	OpenID string `json:"open_id,omitempty"`
	Name   string `json:"name,omitempty"`
}

func (Actor) PreferredID

func (a Actor) PreferredID() string

type Engine

type Engine struct {
	// contains filtered or unexported fields
}

func NewEngine

func NewEngine(store *Store, sender Sender) *Engine

func (*Engine) RegisterSystemTask

func (e *Engine) RegisterSystemTask(name string, interval time.Duration, run SystemTaskFunc) error

func (*Engine) Run

func (e *Engine) Run(ctx context.Context)

func (*Engine) SetLLMRunner

func (e *Engine) SetLLMRunner(runner LLMRunner)

func (*Engine) SetRunEnv

func (e *Engine) SetRunEnv(env map[string]string)

func (*Engine) SetSessionActivityChecker added in v0.6.62

func (e *Engine) SetSessionActivityChecker(checker SessionActivityChecker)

func (*Engine) SetUserTaskCompletionHook added in v0.6.0

func (e *Engine) SetUserTaskCompletionHook(hook UserTaskCompletionHook)

func (*Engine) SetUserTaskTimeout

func (e *Engine) SetUserTaskTimeout(timeout time.Duration)

type LLMRunner

type LLMRunner interface {
	Run(ctx context.Context, req agentbridge.RunRequest) (agentbridge.RunResult, error)
}

type ManageMode

type ManageMode string
const (
	ManageModeCreatorOnly ManageMode = "creator_only"
	ManageModeScopeAll    ManageMode = "scope_all"
)

type Route

type Route struct {
	ReceiveIDType string `json:"receive_id_type"`
	ReceiveID     string `json:"receive_id"`
}

type Schedule

type Schedule struct {
	Type         ScheduleType `json:"type"`
	EverySeconds int          `json:"every_seconds"`
	CronExpr     string       `json:"cron_expr,omitempty"`
}

type ScheduleType

type ScheduleType string
const (
	ScheduleTypeInterval ScheduleType = "interval"
	ScheduleTypeCron     ScheduleType = "cron"
)

type Scope

type Scope struct {
	Kind ScopeKind `json:"kind"`
	ID   string    `json:"id"`
}

type ScopeKind

type ScopeKind string
const (
	ScopeKindUser ScopeKind = "user"
	ScopeKindChat ScopeKind = "chat"
)

type Sender added in v0.3.20

type Sender = messaging.AutomationSender

type SessionActivityChecker added in v0.6.62

type SessionActivityChecker interface {
	IsSessionActive(sessionKey string) bool
}

SessionActivityChecker checks whether a session is currently processing a user message. The automation engine uses this to skip task execution when the target session is busy, avoiding interruption of user conversations.

type Snapshot

type Snapshot struct {
	Version int    `json:"version"`
	Tasks   []Task `json:"tasks"`
}

type Store

type Store struct {
	// contains filtered or unexported fields
}

func NewStore

func NewStore(path string) *Store

func (*Store) ClaimDueTasks

func (s *Store) ClaimDueTasks(at time.Time, limit int) ([]Task, error)

func (*Store) CreateTask

func (s *Store) CreateTask(task Task) (Task, error)

func (*Store) GetTask

func (s *Store) GetTask(taskID string) (Task, error)

func (*Store) ListTasks

func (s *Store) ListTasks(scope Scope, statusFilter string, limit int) ([]Task, error)

func (*Store) PatchTask

func (s *Store) PatchTask(taskID string, mutate func(task *Task) error) (Task, error)

func (*Store) Path

func (s *Store) Path() string

func (*Store) RecordTaskResult

func (s *Store) RecordTaskResult(taskID string, at time.Time, runErr error) error

func (*Store) RecordTaskResumeThreadID added in v0.6.48

func (s *Store) RecordTaskResumeThreadID(taskID, nextThreadID string) error

func (*Store) RecordTaskSignal added in v0.5.23

func (s *Store) RecordTaskSignal(taskID string, at time.Time, kind, message string, pause bool) error

func (*Store) RecordTaskSourceMessageID added in v0.6.49

func (s *Store) RecordTaskSourceMessageID(taskID, messageID string) error

RecordTaskSourceMessageID persists the first sent message ID as the thread anchor for subsequent runs. It only writes if source_message_id is not yet set, making it safe to call on every successful run.

func (*Store) ResetRunningTasks

func (s *Store) ResetRunningTasks() error

func (*Store) UnclaimTask added in v0.6.62

func (s *Store) UnclaimTask(taskID string) error

UnclaimTask reverts a prior ClaimDueTasks claim for the given task. It sets Running=false, decrements RunCount (if positive), and resets NextRunAt to zero so the task becomes immediately eligible on the next scheduling tick. This is used when the engine skips execution because the target session is busy, without recording a run result. NOTE: Implemented via updateSnapshot (not PatchTask) to bypass the auto-recompute of NextRunAt that PatchTask applies to active tasks.

type SystemTaskFunc

type SystemTaskFunc func(ctx context.Context)

type Task

type Task struct {
	ID                  string     `json:"id"`
	Title               string     `json:"title,omitempty"`
	Scope               Scope      `json:"scope"`
	Route               Route      `json:"route"`
	Creator             Actor      `json:"creator"`
	ManageMode          ManageMode `json:"manage_mode"`
	Schedule            Schedule   `json:"schedule"`
	Action              Action     `json:"action"`
	Status              TaskStatus `json:"status"`
	MaxRuns             int        `json:"max_runs,omitempty"`
	RunCount            int        `json:"run_count,omitempty"`
	CreatedAt           time.Time  `json:"created_at"`
	UpdatedAt           time.Time  `json:"updated_at"`
	NextRunAt           time.Time  `json:"next_run_at"`
	LastRunAt           time.Time  `json:"last_run_at,omitempty"`
	DeletedAt           time.Time  `json:"deleted_at,omitempty"`
	Running             bool       `json:"running,omitempty"`
	LastResult          string     `json:"last_result,omitempty"`
	LastSignalKind      string     `json:"last_signal_kind,omitempty"`
	LastSignalMessage   string     `json:"last_signal_message,omitempty"`
	ConsecutiveFailures int        `json:"consecutive_failures,omitempty"`
	Revision            int64      `json:"revision"`
}

func NormalizeTask

func NormalizeTask(task Task) Task

type TaskStatus

type TaskStatus string
const (
	TaskStatusActive  TaskStatus = "active"
	TaskStatusPaused  TaskStatus = "paused"
	TaskStatusDeleted TaskStatus = "deleted"
)

func ParseStatusFilter

func ParseStatusFilter(raw string) (TaskStatus, bool, error)

type UserTaskCompletionHook added in v0.6.0

type UserTaskCompletionHook func(task Task, err error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL