diff --git a/cmd/picoclaw/cmd_status.go b/cmd/picoclaw/cmd_status.go index 07296784e..067f32332 100644 --- a/cmd/picoclaw/cmd_status.go +++ b/cmd/picoclaw/cmd_status.go @@ -98,5 +98,47 @@ func statusCmd() { fmt.Printf(" %s (%s): %s\n", provider, cred.AuthMethod, status) } } + + // Display enabled channels + fmt.Println("\nChannels:") + if cfg.Channels.WebSocket.Enabled { + fmt.Printf(" WebSocket: ✓ http://%s:%d\n", cfg.Channels.WebSocket.Host, cfg.Channels.WebSocket.Port) + } + if cfg.Channels.Telegram.Enabled { + fmt.Println(" Telegram: ✓") + } + if cfg.Channels.Discord.Enabled { + fmt.Println(" Discord: ✓") + } + if cfg.Channels.Slack.Enabled { + fmt.Println(" Slack: ✓") + } + if cfg.Channels.QQ.Enabled { + fmt.Println(" QQ: ✓") + } + if cfg.Channels.Feishu.Enabled { + fmt.Println(" Feishu: ✓") + } + if cfg.Channels.DingTalk.Enabled { + fmt.Println(" DingTalk: ✓") + } + if cfg.Channels.LINE.Enabled { + fmt.Println(" LINE: ✓") + } + if cfg.Channels.WeCom.Enabled { + fmt.Println(" WeCom: ✓") + } + if cfg.Channels.WeComApp.Enabled { + fmt.Println(" WeCom App: ✓") + } + if cfg.Channels.WhatsApp.Enabled { + fmt.Println(" WhatsApp: ✓") + } + if cfg.Channels.OneBot.Enabled { + fmt.Println(" OneBot: ✓") + } + if cfg.Channels.MaixCam.Enabled { + fmt.Println(" MaixCam: ✓") + } } } diff --git a/pkg/channels/manager.go b/pkg/channels/manager.go index 75edaf49e..2093621f7 100644 --- a/pkg/channels/manager.go +++ b/pkg/channels/manager.go @@ -202,6 +202,19 @@ func (m *Manager) initChannels() error { } } + if m.config.Channels.WebSocket.Enabled { + logger.DebugC("channels", "Attempting to initialize WebSocket channel") + websocket, err := NewWebSocketChannel(m.config.Channels.WebSocket, m.bus) + if err != nil { + logger.ErrorCF("channels", "Failed to initialize WebSocket channel", map[string]any{ + "error": err.Error(), + }) + } else { + m.channels["websocket"] = websocket + logger.InfoC("channels", "WebSocket channel enabled successfully") + } + } + logger.InfoCF("channels", "Channel initialization completed", map[string]any{ "enabled_channels": len(m.channels), }) diff --git a/pkg/config/config.go b/pkg/config/config.go index 036021e49..0bb98abdf 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -180,18 +180,19 @@ type AgentDefaults struct { } type ChannelsConfig struct { - WhatsApp WhatsAppConfig `json:"whatsapp"` - Telegram TelegramConfig `json:"telegram"` - Feishu FeishuConfig `json:"feishu"` - Discord DiscordConfig `json:"discord"` - MaixCam MaixCamConfig `json:"maixcam"` - QQ QQConfig `json:"qq"` - DingTalk DingTalkConfig `json:"dingtalk"` - Slack SlackConfig `json:"slack"` - LINE LINEConfig `json:"line"` - OneBot OneBotConfig `json:"onebot"` - WeCom WeComConfig `json:"wecom"` - WeComApp WeComAppConfig `json:"wecom_app"` + WhatsApp WhatsAppConfig `json:"whatsapp"` + Telegram TelegramConfig `json:"telegram"` + Feishu FeishuConfig `json:"feishu"` + Discord DiscordConfig `json:"discord"` + MaixCam MaixCamConfig `json:"maixcam"` + QQ QQConfig `json:"qq"` + DingTalk DingTalkConfig `json:"dingtalk"` + Slack SlackConfig `json:"slack"` + LINE LINEConfig `json:"line"` + OneBot OneBotConfig `json:"onebot"` + WeCom WeComConfig `json:"wecom"` + WeComApp WeComAppConfig `json:"wecom_app"` + WebSocket WebSocketConfig `json:"websocket"` } type WhatsAppConfig struct { @@ -296,6 +297,13 @@ type WeComAppConfig struct { ReplyTimeout int `json:"reply_timeout" env:"PICOCLAW_CHANNELS_WECOM_APP_REPLY_TIMEOUT"` } +type WebSocketConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_WEBSOCKET_ENABLED"` + Host string `json:"host" env:"PICOCLAW_CHANNELS_WEBSOCKET_HOST"` + Port int `json:"port" env:"PICOCLAW_CHANNELS_WEBSOCKET_PORT"` + AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_WEBSOCKET_ALLOW_FROM"` +} + type HeartbeatConfig struct { Enabled bool `json:"enabled" env:"PICOCLAW_HEARTBEAT_ENABLED"` Interval int `json:"interval" env:"PICOCLAW_HEARTBEAT_INTERVAL"` // minutes, min 5 diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 7654326e7..5b906b0c3 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -113,6 +113,12 @@ func DefaultConfig() *Config { AllowFrom: FlexibleStringSlice{}, ReplyTimeout: 5, }, + WebSocket: WebSocketConfig{ + Enabled: false, + Host: "0.0.0.0", + Port: 8080, + AllowFrom: FlexibleStringSlice{}, + }, }, Providers: ProvidersConfig{ OpenAI: OpenAIProviderConfig{WebSearch: true},