bot

package
v0.260305.1330-hotfix Latest Latest
Warning

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

Go to latest
Published: Mar 5, 2026 License: MPL-2.0 Imports: 28 Imported by: 0

Documentation

Index

Constants

View Source
const (
	DefaultMaxImageSize = 25 * 1024 * 1024 // 25MB
	DefaultMaxDocSize   = 50 * 1024 * 1024 // 50MB
)

Variables

View Source
var AllowedMIMETypes = map[string]string{

	"image/jpeg": "image",
	"image/png":  "image",
	"image/gif":  "image",
	"image/webp": "image",

	"application/pdf": "document",
	"text/plain":      "document",
	"text/markdown":   "document",
	"text/csv":        "document",

	"application/msword": "document",
	"application/vnd.openxmlformats-officedocument.wordprocessingml.document": "document",

	"application/vnd.ms-excel": "document",
	"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "document",
}

AllowedMIMETypes lists supported file types

Functions

func BuildActionKeyboard

func BuildActionKeyboard() *imbot.KeyboardBuilder

BuildActionKeyboard builds the inline keyboard for actions (Clear/Bind)

func BuildCancelKeyboard

func BuildCancelKeyboard() *imbot.KeyboardBuilder

BuildCancelKeyboard builds a simple cancel keyboard

func BuildCreateConfirmKeyboard

func BuildCreateConfirmKeyboard(path string) (*imbot.KeyboardBuilder, string)

BuildCreateConfirmKeyboard builds the confirmation keyboard for creating a directory

func BuildCustomPathPrompt

func BuildCustomPathPrompt() string

BuildCustomPathPrompt returns the text for custom path input prompt

func ExpandPath

func ExpandPath(path string) (string, error)

ExpandPath expands ~ to home directory and returns absolute path

func InitChatSchema

func InitChatSchema(db *sql.DB) error

InitChatSchema initializes the chat schema

func ParseTextResponse added in v0.260305.1400

func ParseTextResponse(text string) (approved bool, remember bool, isValid bool)

ParseTextResponse parses user text input as a permission response Returns: (approved, remember, isValid)

func SendDirectoryBrowser

func SendDirectoryBrowser(ctx context.Context, bot imbot.Bot, browser *DirectoryBrowser, chatID string, editMessageID string) (string, error)

SendDirectoryBrowser sends or updates the directory browser message

func ValidateProjectPath

func ValidateProjectPath(path string) error

ValidateProjectPath checks if the path exists and is accessible

Types

type BindFlowState

type BindFlowState struct {
	ChatID       string
	CurrentPath  string
	Page         int
	TotalDirs    int
	PageSize     int
	MessageID    string // Message ID to edit
	ExpiresAt    time.Time
	WaitingInput bool     // Waiting for custom path input
	PromptMsgID  string   // Prompt message ID for cleanup
	Dirs         []string // Current directory list (for navigation by index)
}

BindFlowState represents the state of an ongoing bind flow

type BotHandler added in v0.260305.1400

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

BotHandler encapsulates all bot message handling logic and dependencies

func NewBotHandler added in v0.260305.1400

func NewBotHandler(
	ctx context.Context,
	botSetting BotSetting,
	chatStore *ChatStore,
	sessionMgr *session.Manager,
	agentBoot *agentboot.AgentBoot,
	summaryEngine *summarizer.Engine,
	directoryBrowser *DirectoryBrowser,
	manager *imbot.Manager,
) *BotHandler

NewBotHandler creates a new bot handler with all dependencies

func (*BotHandler) HandleMessage added in v0.260305.1400

func (h *BotHandler) HandleMessage(msg imbot.Message, platform imbot.Platform, botUUID string)

HandleMessage is the main entry point for handling bot messages

func (*BotHandler) SendText added in v0.260305.1400

func (h *BotHandler) SendText(hCtx HandlerContext, text string)

SendText sends a plain text message

type BotLifecycle added in v0.260305.1400

type BotLifecycle interface {
	// Start starts a bot by UUID
	Start(ctx context.Context, uuid string) error
	// Stop stops a bot by UUID
	Stop(uuid string)
	// IsRunning checks if a bot is running
	IsRunning(uuid string) bool
	// Sync ensures running bots match the enabled settings
	Sync(ctx context.Context) error
}

BotLifecycle defines the interface for controlling bot lifecycle This allows the API layer to control bot startup/shutdown without direct dependency on the Manager type

type BotSetting added in v0.260305.1400

type BotSetting struct {
	UUID          string            `json:"uuid,omitempty"`
	Name          string            `json:"name,omitempty"`           // User-defined name for the bot
	Token         string            `json:"token,omitempty"`          // Legacy: for backward compatibility
	Platform      string            `json:"platform"`                 // Platform identifier
	AuthType      string            `json:"auth_type"`                // Auth type: token, oauth, qr
	Auth          map[string]string `json:"auth"`                     // Dynamic auth fields based on platform
	ProxyURL      string            `json:"proxy_url,omitempty"`      // Optional proxy URL
	ChatIDLock    string            `json:"chat_id,omitempty"`        // Optional chat ID lock
	BashAllowlist []string          `json:"bash_allowlist,omitempty"` // Optional bash command allowlist
	Enabled       bool              `json:"enabled"`                  // Whether this bot is enabled
	CreatedAt     string            `json:"created_at,omitempty"`
	UpdatedAt     string            `json:"updated_at,omitempty"`
}

BotSetting represents bot configuration with platform-specific auth

type Chat

type Chat struct {
	ChatID      string `json:"chat_id"`
	Platform    string `json:"platform"`
	ProjectPath string `json:"project_path,omitempty"`
	OwnerID     string `json:"owner_id,omitempty"`
	SessionID   string `json:"session_id,omitempty"`

	// Group-specific
	IsWhitelisted bool   `json:"is_whitelisted"`
	WhitelistedBy string `json:"whitelisted_by,omitempty"`

	// Bash state
	BashCwd string `json:"bash_cwd,omitempty"`

	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

Chat represents all state associated with a chat (direct or group)

type ChatStore

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

ChatStore handles unified chat persistence

func NewChatStore

func NewChatStore(db *sql.DB) (*ChatStore, error)

NewChatStore creates a new chat store

func (*ChatStore) AddToWhitelist

func (s *ChatStore) AddToWhitelist(chatID, platform, addedBy string) error

AddToWhitelist adds a chat to the whitelist

func (*ChatStore) BindProject

func (s *ChatStore) BindProject(chatID, platform, projectPath, ownerID string) error

BindProject binds a project to a chat (creates chat if not exists)

func (*ChatStore) GetBashCwd

func (s *ChatStore) GetBashCwd(chatID string) (string, bool, error)

GetBashCwd retrieves the bash working directory for a chat

func (*ChatStore) GetChat

func (s *ChatStore) GetChat(chatID string) (*Chat, error)

GetChat retrieves a chat by ID

func (*ChatStore) GetOrCreateChat

func (s *ChatStore) GetOrCreateChat(chatID, platform string) (*Chat, error)

GetOrCreateChat gets a chat or creates it if not exists

func (*ChatStore) GetProjectPath

func (s *ChatStore) GetProjectPath(chatID string) (string, bool, error)

GetProjectPath retrieves the project path for a chat

func (*ChatStore) GetSession

func (s *ChatStore) GetSession(chatID string) (string, bool, error)

GetSession retrieves the session for a chat

func (*ChatStore) IsWhitelisted

func (s *ChatStore) IsWhitelisted(chatID string) bool

IsWhitelisted checks if a chat is whitelisted

func (*ChatStore) ListChatsByOwner

func (s *ChatStore) ListChatsByOwner(ownerID, platform string) ([]*Chat, error)

ListChatsByOwner lists all chats owned by a user

func (*ChatStore) RemoveFromWhitelist

func (s *ChatStore) RemoveFromWhitelist(chatID string) error

RemoveFromWhitelist removes a chat from the whitelist

func (*ChatStore) SetBashCwd

func (s *ChatStore) SetBashCwd(chatID, cwd string) error

SetBashCwd sets the bash working directory for a chat

func (*ChatStore) SetSession

func (s *ChatStore) SetSession(chatID, sessionID string) error

SetSession sets the session for a chat (creates chat if not exists)

func (*ChatStore) UpdateChat

func (s *ChatStore) UpdateChat(chatID string, fn func(*Chat)) error

UpdateChat updates specific fields of a chat

func (*ChatStore) UpsertChat

func (s *ChatStore) UpsertChat(chat *Chat) error

UpsertChat creates or updates a chat

type CompletionCallback added in v0.260305.1400

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

func (*CompletionCallback) OnComplete added in v0.260305.1400

func (c *CompletionCallback) OnComplete(result *agentboot.CompletionResult)

type DirectoryBrowser

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

DirectoryBrowser manages directory navigation for bind flow

func NewDirectoryBrowser

func NewDirectoryBrowser() *DirectoryBrowser

NewDirectoryBrowser creates a new directory browser

func (*DirectoryBrowser) BuildKeyboard

func (b *DirectoryBrowser) BuildKeyboard(chatID string) (*BindFlowState, *imbot.KeyboardBuilder, string, error)

BuildKeyboard builds the inline keyboard for directory browsing

func (*DirectoryBrowser) Clear

func (b *DirectoryBrowser) Clear(chatID string)

Clear removes the state for a chat

func (*DirectoryBrowser) GetCurrentPath

func (b *DirectoryBrowser) GetCurrentPath(chatID string) string

GetCurrentPath returns the current path for a chat

func (*DirectoryBrowser) GetState

func (b *DirectoryBrowser) GetState(chatID string) *BindFlowState

GetState returns the current state for a chat

func (*DirectoryBrowser) IsWaitingInput

func (b *DirectoryBrowser) IsWaitingInput(chatID string) bool

IsWaitingInput checks if the chat is waiting for custom path input

func (*DirectoryBrowser) Navigate

func (b *DirectoryBrowser) Navigate(chatID string, path string) error

Navigate navigates to a subdirectory

func (*DirectoryBrowser) NavigateByIndex

func (b *DirectoryBrowser) NavigateByIndex(chatID string, index int) error

NavigateByIndex navigates to a subdirectory by index (stored in state.Dirs)

func (*DirectoryBrowser) NavigateUp

func (b *DirectoryBrowser) NavigateUp(chatID string) error

NavigateUp navigates to the parent directory

func (*DirectoryBrowser) NextPage

func (b *DirectoryBrowser) NextPage(chatID string) error

NextPage moves to the next page of directories

func (*DirectoryBrowser) PrevPage

func (b *DirectoryBrowser) PrevPage(chatID string) error

PrevPage moves to the previous page of directories

func (*DirectoryBrowser) SetMessageID

func (b *DirectoryBrowser) SetMessageID(chatID string, messageID string)

SetMessageID sets the message ID for editing

func (*DirectoryBrowser) SetWaitingInput

func (b *DirectoryBrowser) SetWaitingInput(chatID string, waiting bool, promptMsgID string)

SetWaitingInput sets the waiting for input state

func (*DirectoryBrowser) Start

func (b *DirectoryBrowser) Start(chatID string) (*BindFlowState, error)

Start begins a new bind flow for a chat

type FileStore added in v0.260305.1400

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

FileStore handles project-based file storage for bot media

func NewFileStore added in v0.260305.1400

func NewFileStore() *FileStore

NewFileStore creates a new file store with default limits

func NewFileStoreWithLimits added in v0.260305.1400

func NewFileStoreWithLimits(maxImageSize, maxDocSize int64) *FileStore

NewFileStoreWithLimits creates a new file store with custom limits

func NewFileStoreWithProxy added in v0.260305.1400

func NewFileStoreWithProxy(proxyURL string) (*FileStore, error)

NewFileStoreWithProxy creates a new file store with proxy support

func (*FileStore) DownloadFile added in v0.260305.1400

func (s *FileStore) DownloadFile(ctx context.Context, projectPath, url, mimeType string) (*StoredFile, error)

DownloadFile downloads a file from a URL to the project's .download directory Returns an error if file size exceeds limits

func (*FileStore) GetDownloadDir added in v0.260305.1400

func (s *FileStore) GetDownloadDir(projectPath string) string

GetDownloadDir returns the .download directory for a project

func (*FileStore) IsAllowedSize added in v0.260305.1400

func (s *FileStore) IsAllowedSize(mimeType string, size int64) bool

IsAllowedSize checks if the size is within limits for the mime type

func (*FileStore) IsAllowedType added in v0.260305.1400

func (s *FileStore) IsAllowedType(mimeType string) bool

IsAllowedType checks if the mime type is allowed

func (*FileStore) SetTelegramToken added in v0.260305.1400

func (s *FileStore) SetTelegramToken(token string)

SetTelegramToken sets the Telegram bot token for resolving file URLs

func (*FileStore) StoreFile added in v0.260305.1400

func (s *FileStore) StoreFile(ctx context.Context, projectPath string, reader io.Reader, filename, mimeType string) (*StoredFile, error)

StoreFile stores a file from a reader to the project's .download directory

type HandlerContext added in v0.260305.1400

type HandlerContext struct {
	Bot       imbot.Bot
	BotUUID   string
	ChatID    string
	SenderID  string
	MessageID string
	Platform  imbot.Platform
	IsDirect  bool
	IsGroup   bool
	Text      string
	Media     []imbot.MediaAttachment
	Metadata  map[string]interface{}
}

HandlerContext contains per-message context data

type IMPrompter added in v0.260305.1400

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

IMPrompter implements ask.Prompter using IM (Telegram, etc.) for user interaction

func NewIMPrompter added in v0.260305.1400

func NewIMPrompter(manager *imbot.Manager) *IMPrompter

NewIMPrompter creates a new IM-based prompter

func (*IMPrompter) GetPendingRequest added in v0.260305.1400

func (p *IMPrompter) GetPendingRequest(requestID string) (*ask.Request, bool)

GetPendingRequest returns a pending request by ID

func (*IMPrompter) GetPendingRequestsForChat added in v0.260305.1400

func (p *IMPrompter) GetPendingRequestsForChat(chatID string) []ask.Request

GetPendingRequestsForChat returns all pending requests for a specific chat

func (*IMPrompter) OnApproval added in v0.260305.1400

OnApproval implements agentboot.ApprovalHandler. It handles permission confirmation requests via IM.

func (*IMPrompter) OnAsk added in v0.260305.1400

OnAsk implements agentboot.AskHandler. It handles user questions/selections via IM.

func (*IMPrompter) Prompt added in v0.260305.1400

func (p *IMPrompter) Prompt(ctx context.Context, req ask.Request) (ask.Result, error)

Prompt prompts the user via IM for response This implements the ask.Prompter interface

func (*IMPrompter) PromptPermission added in v0.260305.1400

PromptPermission implements the legacy agentboot.UserPrompter interface Deprecated: Use OnApproval instead

func (*IMPrompter) SetDefaultTimeout added in v0.260305.1400

func (p *IMPrompter) SetDefaultTimeout(timeout time.Duration)

SetDefaultTimeout sets the default timeout for requests

func (*IMPrompter) SubmitDecision added in v0.260305.1400

func (p *IMPrompter) SubmitDecision(requestID string, approved bool, remember bool, reason string) error

SubmitDecision submits a user's decision for a pending request Deprecated: Use SubmitResult instead

func (*IMPrompter) SubmitResult added in v0.260305.1400

func (p *IMPrompter) SubmitResult(requestID string, result ask.Result) error

SubmitResult submits a result for a pending request

func (*IMPrompter) SubmitUserResponse added in v0.260305.1400

func (p *IMPrompter) SubmitUserResponse(requestID string, response ask.Response) error

SubmitUserResponse submits a user response for a pending request This parses the response using the appropriate tool handler

type Manager

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

Manager manages the lifecycle of running bot instances

func NewManager

func NewManager(store SettingsStore, sessionMgr *session.Manager, agentBoot *agentboot.AgentBoot,
) *Manager

NewManager creates a new bot manager with a settings store

func (*Manager) IsRunning

func (m *Manager) IsRunning(uuid string) bool

IsRunning checks if a bot is running

func (*Manager) SetDBPath added in v0.260305.1400

func (m *Manager) SetDBPath(dbPath string)

SetDBPath sets the database path for chat store operations

func (*Manager) Start

func (m *Manager) Start(parentCtx context.Context, uuid string) error

Start starts a bot by UUID

func (*Manager) StartEnabled

func (m *Manager) StartEnabled(ctx context.Context) error

StartEnabled starts all enabled bots

func (*Manager) StartEnabledStopDisabled added in v0.260305.1400

func (m *Manager) StartEnabledStopDisabled(ctx context.Context) error

StartEnabledStopDisabled is a convenience method that ensures running bots match enabled settings. It's an alias for Sync() with clearer naming for specific use cases.

func (*Manager) Stop

func (m *Manager) Stop(uuid string)

Stop stops a bot by UUID

func (*Manager) StopAll

func (m *Manager) StopAll()

StopAll stops all running bots

func (*Manager) Sync added in v0.260305.1400

func (m *Manager) Sync(ctx context.Context) error

Sync ensures the running bots match the enabled settings in the store. It starts bots that are enabled but not running, and stops bots that are running but disabled.

type ResponseMeta

type ResponseMeta struct {
	ProjectPath string
	ChatID      string
	UserID      string
	SessionID   string
}

ResponseMeta contains metadata for response formatting

type SettingsStore added in v0.260305.1400

type SettingsStore interface {
	// GetSettingsByUUIDInterface returns settings by UUID as interface{}
	GetSettingsByUUIDInterface(uuid string) (interface{}, error)
	// ListEnabledSettingsInterface returns all enabled settings as interface{}
	ListEnabledSettingsInterface() (interface{}, error)
}

SettingsStore defines the interface for bot settings storage This allows both the legacy bot.Store and the new db.ImBotSettingsStore to be used

type Store

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

func NewStore

func NewStore(dbPath string) (*Store, error)

func NewStoreForChatOnly added in v0.260305.1400

func NewStoreForChatOnly(dbPath string) (*Store, error)

NewStoreForChatOnly creates a minimal bot.Store for chat state management only

func (*Store) AddGroupToWhitelist

func (s *Store) AddGroupToWhitelist(groupID, platform, addedBy string) error

func (*Store) ChatStore

func (s *Store) ChatStore() *ChatStore

ChatStore returns the chat store

func (*Store) Close

func (s *Store) Close() error

func (*Store) DB

func (s *Store) DB() *sql.DB

DB returns the underlying database connection

func (*Store) GetBashCwd

func (s *Store) GetBashCwd(chatID string) (string, bool, error)

func (*Store) GetSessionForChat

func (s *Store) GetSessionForChat(chatID string) (string, bool, error)

func (*Store) IsGroupWhitelisted

func (s *Store) IsGroupWhitelisted(groupID string) bool

func (*Store) ListWhitelistedGroups

func (s *Store) ListWhitelistedGroups() ([]struct {
	GroupID   string
	Platform  string
	AddedBy   string
	CreatedAt string
}, error)

ListWhitelistedGroups returns all whitelisted groups

func (*Store) RemoveGroupFromWhitelist

func (s *Store) RemoveGroupFromWhitelist(groupID string) error

func (*Store) SetBashCwd

func (s *Store) SetBashCwd(chatID, cwd string) error

func (*Store) SetSessionForChat

func (s *Store) SetSessionForChat(chatID, sessionID string) error

type StoredFile added in v0.260305.1400

type StoredFile struct {
	Path     string // Full path: {projectPath}/.agent/{filename}
	RelPath  string // Relative path for agent: .agent/{filename}
	URL      string // Original URL
	Filename string
	Size     int64
	MimeType string
}

StoredFile represents a stored file

type TelegramFile added in v0.260305.1400

type TelegramFile struct {
	Ok     bool `json:"ok"`
	Result struct {
		FileID   string `json:"file_id"`
		FileSize int    `json:"file_size"`
		FilePath string `json:"file_path"`
	} `json:"result"`
}

TelegramFile represents the response from Telegram's getFile API

Jump to

Keyboard shortcuts

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