From cddafb403a17e743059b351bb85385009ae5e761 Mon Sep 17 00:00:00 2001 From: PixelTux Date: Wed, 11 Feb 2026 20:59:25 +0100 Subject: [PATCH 01/48] add build constraints for feishu to support 32-bit builds --- pkg/channels/feishu_32.go | 36 ++++++++++++++++++++++++ pkg/channels/{feishu.go => feishu_64.go} | 2 ++ 2 files changed, 38 insertions(+) create mode 100644 pkg/channels/feishu_32.go rename pkg/channels/{feishu.go => feishu_64.go} (98%) diff --git a/pkg/channels/feishu_32.go b/pkg/channels/feishu_32.go new file mode 100644 index 000000000..4e60fbc11 --- /dev/null +++ b/pkg/channels/feishu_32.go @@ -0,0 +1,36 @@ +//go:build !amd64 && !arm64 && !riscv64 && !mips64 && !ppc64 + +package channels + +import ( + "context" + "errors" + + "github.com/sipeed/picoclaw/pkg/bus" + "github.com/sipeed/picoclaw/pkg/config" +) + +// FeishuChannel is a stub implementation for 32-bit architectures +type FeishuChannel struct { + *BaseChannel +} + +// NewFeishuChannel returns an error on 32-bit architectures where the Feishu SDK is not supported +func NewFeishuChannel(cfg config.FeishuConfig, bus *bus.MessageBus) (*FeishuChannel, error) { + return nil, errors.New("feishu channel is not supported on 32-bit architectures (armv7l, 386, etc.). Please use a 64-bit system or disable feishu in your config") +} + +// Start is a stub method to satisfy the Channel interface +func (c *FeishuChannel) Start(ctx context.Context) error { + return nil +} + +// Stop is a stub method to satisfy the Channel interface +func (c *FeishuChannel) Stop(ctx context.Context) error { + return nil +} + +// Send is a stub method to satisfy the Channel interface +func (c *FeishuChannel) Send(ctx context.Context, msg bus.OutboundMessage) error { + return errors.New("feishu channel is not supported on 32-bit architectures") +} diff --git a/pkg/channels/feishu.go b/pkg/channels/feishu_64.go similarity index 98% rename from pkg/channels/feishu.go rename to pkg/channels/feishu_64.go index 014095ed3..531d21c7f 100644 --- a/pkg/channels/feishu.go +++ b/pkg/channels/feishu_64.go @@ -1,3 +1,5 @@ +//go:build amd64 || arm64 || riscv64 || mips64 || ppc64 + package channels import ( From 53df8d1f3def90db6fce163e2cd623130abeff47 Mon Sep 17 00:00:00 2001 From: Satyam Tiwari Date: Thu, 12 Feb 2026 21:48:51 +0530 Subject: [PATCH 02/48] feat: Add DuckDuckGo search fallback. - Refactor web tool to use Provider pattern (Brave/DuckDuckGo) - Add robust HTML scraping for keyless DuckDuckGo search - Update README with search provider guidelines --- README.md | 114 +++++++++++----------- pkg/tools/web.go | 241 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 236 insertions(+), 119 deletions(-) diff --git a/README.md b/README.md index 8f27a7808..2e4d8df15 100644 --- a/README.md +++ b/README.md @@ -51,12 +51,12 @@ ๐Ÿค– **AI-Bootstrapped**: Autonomous Go-native implementation โ€” 95% Agent-generated core with human-in-the-loop refinement. -| | OpenClaw | NanoBot | **PicoClaw** | -| --- | --- | --- |--- | -| **Language** | TypeScript | Python | **Go** | -| **RAM** | >1GB |>100MB| **< 10MB** | -| **Startup**
(0.8GHz core) | >500s | >30s | **<1s** | -| **Cost** | Mac Mini 599$ | Most Linux SBC
~50$ |**Any Linux Board**
**As low as 10$** | +| | OpenClaw | NanoBot | **PicoClaw** | +| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- | +| **Language** | TypeScript | Python | **Go** | +| **RAM** | >1GB | >100MB | **< 10MB** | +| **Startup**
(0.8GHz core) | >500s | >30s | **<1s** | +| **Cost** | Mac Mini 599$ | Most Linux SBC
~50$ | **Any Linux Board**
**As low as 10$** | PicoClaw @@ -86,7 +86,7 @@ PicoClaw can be deployed on almost any Linux device! -- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) or W(WiFi6) version, for Minimal Home Assistant +- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) or W(WiFi6) version, for Minimal Home Assistant - $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), or $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) for Automated Server Maintenance - $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) or $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) for Smart Monitoring @@ -123,7 +123,7 @@ make install > [!TIP] > Set your API key in `~/.picoclaw/config.json`. > Get API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) ยท [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM) -> Web search is **optional** - get free [Brave Search API](https://brave.com/search/api) (2000 free queries/month) +> Web search is **optional** - get free [Brave Search API](https://brave.com/search/api) (2000 free queries/month) or use built-in auto fallback. **1. Initialize** @@ -182,12 +182,12 @@ That's it! You have a working AI assistant in 2 minutes. Talk to your picoclaw through Telegram, Discord, or DingTalk -| Channel | Setup | -|---------|-------| -| **Telegram** | Easy (just a token) | -| **Discord** | Easy (bot token + intents) | -| **QQ** | Easy (AppID + AppSecret) | -| **DingTalk** | Medium (app credentials) | +| Channel | Setup | +| ------------ | -------------------------- | +| **Telegram** | Easy (just a token) | +| **Discord** | Easy (bot token + intents) | +| **QQ** | Easy (AppID + AppSecret) | +| **DingTalk** | Medium (app credentials) |
Telegram (Recommended) @@ -343,8 +343,6 @@ Connect Picoclaw to the Agent Social Network simply by sending a single message **Read `https://clawdchat.ai/skill.md` and follow the instructions to join [ClawdChat.ai](https://clawdchat.ai)** - - ## โš™๏ธ Configuration Config file: `~/.picoclaw/config.json` @@ -371,15 +369,15 @@ PicoClaw stores data in your configured workspace (default: `~/.picoclaw/workspa > [!NOTE] > Groq provides free voice transcription via Whisper. If configured, Telegram voice messages will be automatically transcribed. -| Provider | Purpose | Get API Key | -|----------|---------|-------------| -| `gemini` | LLM (Gemini direct) | [aistudio.google.com](https://aistudio.google.com) | -| `zhipu` | LLM (Zhipu direct) | [bigmodel.cn](bigmodel.cn) | -| `openrouter(To be tested)` | LLM (recommended, access to all models) | [openrouter.ai](https://openrouter.ai) | -| `anthropic(To be tested)` | LLM (Claude direct) | [console.anthropic.com](https://console.anthropic.com) | -| `openai(To be tested)` | LLM (GPT direct) | [platform.openai.com](https://platform.openai.com) | -| `deepseek(To be tested)` | LLM (DeepSeek direct) | [platform.deepseek.com](https://platform.deepseek.com) | -| `groq` | LLM + **Voice transcription** (Whisper) | [console.groq.com](https://console.groq.com) | +| Provider | Purpose | Get API Key | +| -------------------------- | --------------------------------------- | ------------------------------------------------------ | +| `gemini` | LLM (Gemini direct) | [aistudio.google.com](https://aistudio.google.com) | +| `zhipu` | LLM (Zhipu direct) | [bigmodel.cn](bigmodel.cn) | +| `openrouter(To be tested)` | LLM (recommended, access to all models) | [openrouter.ai](https://openrouter.ai) | +| `anthropic(To be tested)` | LLM (Claude direct) | [console.anthropic.com](https://console.anthropic.com) | +| `openai(To be tested)` | LLM (GPT direct) | [platform.openai.com](https://platform.openai.com) | +| `deepseek(To be tested)` | LLM (DeepSeek direct) | [platform.deepseek.com](https://platform.deepseek.com) | +| `groq` | LLM + **Voice transcription** (Whisper) | [console.groq.com](https://console.groq.com) |
Zhipu @@ -405,8 +403,8 @@ PicoClaw stores data in your configured workspace (default: `~/.picoclaw/workspa "zhipu": { "api_key": "Your API Key", "api_base": "https://open.bigmodel.cn/api/paas/v4" - }, - }, + } + } } ``` @@ -479,15 +477,15 @@ picoclaw agent -m "Hello" ## CLI Reference -| Command | Description | -|---------|-------------| -| `picoclaw onboard` | Initialize config & workspace | -| `picoclaw agent -m "..."` | Chat with the agent | -| `picoclaw agent` | Interactive chat mode | -| `picoclaw gateway` | Start the gateway | -| `picoclaw status` | Show status | -| `picoclaw cron list` | List all scheduled jobs | -| `picoclaw cron add ...` | Add a scheduled job | +| Command | Description | +| ------------------------- | ----------------------------- | +| `picoclaw onboard` | Initialize config & workspace | +| `picoclaw agent -m "..."` | Chat with the agent | +| `picoclaw agent` | Interactive chat mode | +| `picoclaw gateway` | Start the gateway | +| `picoclaw status` | Show status | +| `picoclaw cron list` | List all scheduled jobs | +| `picoclaw cron add ...` | Add a scheduled job | ### Scheduled Tasks / Reminders @@ -503,7 +501,7 @@ Jobs are stored in `~/.picoclaw/workspace/cron/` and processed automatically. PRs welcome! The codebase is intentionally small and readable. ๐Ÿค— -discord: +discord: PicoClaw @@ -515,21 +513,23 @@ This is normal if you haven't configured a search API key yet. PicoClaw will pro To enable web search: -1. Get a free API key at [https://brave.com/search/api](https://brave.com/search/api) (2000 free queries/month) -2. Add to `~/.picoclaw/config.json`: +1. **Option 1 (Recommended)**: Get a free API key at [https://brave.com/search/api](https://brave.com/search/api) (2000 free queries/month) for the best results. +2. **Option 2 (No Credit Card)**: If you don't have a key, we automatically fall back to **DuckDuckGo** (no key required). - ```json - { - "tools": { - "web": { - "search": { - "api_key": "YOUR_BRAVE_API_KEY", - "max_results": 5 - } - } - } - } - ``` +Add the key to `~/.picoclaw/config.json` if using Brave: + +```json +{ + "tools": { + "web": { + "search": { + "api_key": "YOUR_BRAVE_API_KEY", + "max_results": 5 + } + } + } +} +``` ### Getting content filtering errors @@ -543,9 +543,9 @@ This happens when another instance of the bot is running. Make sure only one `pi ## ๐Ÿ“ API Key Comparison -| Service | Free Tier | Use Case | -|---------|-----------|-----------| -| **OpenRouter** | 200K tokens/month | Multiple models (Claude, GPT-4, etc.) | -| **Zhipu** | 200K tokens/month | Best for Chinese users | -| **Brave Search** | 2000 queries/month | Web search functionality | -| **Groq** | Free tier available | Fast inference (Llama, Mixtral) | +| Service | Free Tier | Use Case | +| ---------------- | ------------------- | ------------------------------------- | +| **OpenRouter** | 200K tokens/month | Multiple models (Claude, GPT-4, etc.) | +| **Zhipu** | 200K tokens/month | Best for Chinese users | +| **Brave Search** | 2000 queries/month | Web search functionality | +| **Groq** | Free tier available | Fast inference (Llama, Mixtral) | diff --git a/pkg/tools/web.go b/pkg/tools/web.go index 3a3596865..f03bafbb4 100644 --- a/pkg/tools/web.go +++ b/pkg/tools/web.go @@ -13,11 +13,178 @@ import ( ) const ( - userAgent = "Mozilla/5.0 (compatible; picoclaw/1.0)" + userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" ) +type SearchProvider interface { + Search(ctx context.Context, query string, count int) (string, error) +} + +type BraveSearchProvider struct { + apiKey string +} + +func (p *BraveSearchProvider) Search(ctx context.Context, query string, count int) (string, error) { + searchURL := fmt.Sprintf("https://api.search.brave.com/res/v1/web/search?q=%s&count=%d", + url.QueryEscape(query), count) + + req, err := http.NewRequestWithContext(ctx, "GET", searchURL, nil) + if err != nil { + return "", fmt.Errorf("failed to create request: %w", err) + } + + req.Header.Set("Accept", "application/json") + req.Header.Set("X-Subscription-Token", p.apiKey) + + client := &http.Client{Timeout: 10 * time.Second} + resp, err := client.Do(req) + if err != nil { + return "", fmt.Errorf("request failed: %w", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", fmt.Errorf("failed to read response: %w", err) + } + + var searchResp struct { + Web struct { + Results []struct { + Title string `json:"title"` + URL string `json:"url"` + Description string `json:"description"` + } `json:"results"` + } `json:"web"` + } + + if err := json.Unmarshal(body, &searchResp); err != nil { + // Log error body for debugging + fmt.Printf("Brave API Error Body: %s\n", string(body)) + return "", fmt.Errorf("failed to parse response: %w", err) + } + + results := searchResp.Web.Results + if len(results) == 0 { + return fmt.Sprintf("No results for: %s", query), nil + } + + var lines []string + lines = append(lines, fmt.Sprintf("Results for: %s", query)) + for i, item := range results { + if i >= count { + break + } + lines = append(lines, fmt.Sprintf("%d. %s\n %s", i+1, item.Title, item.URL)) + if item.Description != "" { + lines = append(lines, fmt.Sprintf(" %s", item.Description)) + } + } + + return strings.Join(lines, "\n"), nil +} + +type DuckDuckGoSearchProvider struct{} + +func (p *DuckDuckGoSearchProvider) Search(ctx context.Context, query string, count int) (string, error) { + searchURL := fmt.Sprintf("https://html.duckduckgo.com/html/?q=%s", url.QueryEscape(query)) + + req, err := http.NewRequestWithContext(ctx, "GET", searchURL, nil) + if err != nil { + return "", fmt.Errorf("failed to create request: %w", err) + } + + req.Header.Set("User-Agent", userAgent) + + client := &http.Client{Timeout: 10 * time.Second} + resp, err := client.Do(req) + if err != nil { + return "", fmt.Errorf("request failed: %w", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", fmt.Errorf("failed to read response: %w", err) + } + + return p.extractResults(string(body), count, query) +} + +func (p *DuckDuckGoSearchProvider) extractResults(html string, count int, query string) (string, error) { + // Simple regex based extraction for DDG HTML + // Strategy: Find all result containers or key anchors directly + + // Try finding the result links directly first, as they are the most critical + // Pattern: Title + // The previous regex was a bit strict. Let's make it more flexible for attributes order/content + reLink := regexp.MustCompile(`]*class="[^"]*result__a[^"]*"[^>]*href="([^"]+)"[^>]*>([\s\S]*?)`) + matches := reLink.FindAllStringSubmatch(html, count+5) + + if len(matches) == 0 { + return fmt.Sprintf("No results found or extraction failed. Query: %s", query), nil + } + + var lines []string + lines = append(lines, fmt.Sprintf("Results for: %s (via DuckDuckGo)", query)) + + // Pre-compile snippet regex to run inside the loop + // We'll search for snippets relative to the link position or just globally if needed + // But simple global search for snippets might mismatch order. + // Since we only have the raw HTML string, let's just extract snippets globally and assume order matches (risky but simple for regex) + // Or better: Let's assume the snippet follows the link in the HTML + + // A better regex approach: iterate through text and find matches in order + // But for now, let's grab all snippets too + reSnippet := regexp.MustCompile(`([\s\S]*?)`) + snippetMatches := reSnippet.FindAllStringSubmatch(html, count+5) + + maxItems := min(len(matches), count) + + for i := 0; i < maxItems; i++ { + urlStr := matches[i][1] + title := stripTags(matches[i][2]) + title = strings.TrimSpace(title) + + // URL decoding if needed + if strings.Contains(urlStr, "uddg=") { + if u, err := url.QueryUnescape(urlStr); err == nil { + idx := strings.Index(u, "uddg=") + if idx != -1 { + urlStr = u[idx+5:] + } + } + } + + lines = append(lines, fmt.Sprintf("%d. %s\n %s", i+1, title, urlStr)) + + // Attempt to attach snippet if available and index aligns + if i < len(snippetMatches) { + snippet := stripTags(snippetMatches[i][1]) + snippet = strings.TrimSpace(snippet) + if snippet != "" { + lines = append(lines, fmt.Sprintf(" %s", snippet)) + } + } + } + + return strings.Join(lines, "\n"), nil +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func stripTags(content string) string { + re := regexp.MustCompile(`<[^>]+>`) + return re.ReplaceAllString(content, "") +} + type WebSearchTool struct { - apiKey string + provider SearchProvider maxResults int } @@ -25,8 +192,16 @@ func NewWebSearchTool(apiKey string, maxResults int) *WebSearchTool { if maxResults <= 0 || maxResults > 10 { maxResults = 5 } + + var provider SearchProvider + if apiKey != "" { + provider = &BraveSearchProvider{apiKey: apiKey} + } else { + provider = &DuckDuckGoSearchProvider{} + } + return &WebSearchTool{ - apiKey: apiKey, + provider: provider, maxResults: maxResults, } } @@ -59,10 +234,6 @@ func (t *WebSearchTool) Parameters() map[string]interface{} { } func (t *WebSearchTool) Execute(ctx context.Context, args map[string]interface{}) (string, error) { - if t.apiKey == "" { - return "Error: BRAVE_API_KEY not configured", nil - } - query, ok := args["query"].(string) if !ok { return "", fmt.Errorf("query is required") @@ -75,61 +246,7 @@ func (t *WebSearchTool) Execute(ctx context.Context, args map[string]interface{} } } - searchURL := fmt.Sprintf("https://api.search.brave.com/res/v1/web/search?q=%s&count=%d", - url.QueryEscape(query), count) - - req, err := http.NewRequestWithContext(ctx, "GET", searchURL, nil) - if err != nil { - return "", fmt.Errorf("failed to create request: %w", err) - } - - req.Header.Set("Accept", "application/json") - req.Header.Set("X-Subscription-Token", t.apiKey) - - client := &http.Client{Timeout: 10 * time.Second} - resp, err := client.Do(req) - if err != nil { - return "", fmt.Errorf("request failed: %w", err) - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - return "", fmt.Errorf("failed to read response: %w", err) - } - - var searchResp struct { - Web struct { - Results []struct { - Title string `json:"title"` - URL string `json:"url"` - Description string `json:"description"` - } `json:"results"` - } `json:"web"` - } - - if err := json.Unmarshal(body, &searchResp); err != nil { - return "", fmt.Errorf("failed to parse response: %w", err) - } - - results := searchResp.Web.Results - if len(results) == 0 { - return fmt.Sprintf("No results for: %s", query), nil - } - - var lines []string - lines = append(lines, fmt.Sprintf("Results for: %s", query)) - for i, item := range results { - if i >= count { - break - } - lines = append(lines, fmt.Sprintf("%d. %s\n %s", i+1, item.Title, item.URL)) - if item.Description != "" { - lines = append(lines, fmt.Sprintf(" %s", item.Description)) - } - } - - return strings.Join(lines, "\n"), nil + return t.provider.Search(ctx, query, count) } type WebFetchTool struct { From 875a16d2d6d6f8be4ff8cd482501979ebd48f2ca Mon Sep 17 00:00:00 2001 From: Wikig Date: Fri, 13 Feb 2026 02:09:59 +0800 Subject: [PATCH 03/48] update telegram username support --- pkg/channels/base.go | 17 ++++++++++++- pkg/channels/base_test.go | 53 +++++++++++++++++++++++++++++++++++++++ pkg/channels/telegram.go | 12 +++++---- 3 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 pkg/channels/base_test.go diff --git a/pkg/channels/base.go b/pkg/channels/base.go index fabec1a86..8d2d9a65b 100644 --- a/pkg/channels/base.go +++ b/pkg/channels/base.go @@ -59,7 +59,22 @@ func (c *BaseChannel) IsAllowed(senderID string) bool { for _, allowed := range c.allowList { // Strip leading "@" from allowed value for username matching trimmed := strings.TrimPrefix(allowed, "@") - if senderID == allowed || idPart == allowed || senderID == trimmed || idPart == trimmed || (userPart != "" && (userPart == allowed || userPart == trimmed)) { + allowedID := trimmed + allowedUser := "" + if idx := strings.Index(trimmed, "|"); idx > 0 { + allowedID = trimmed[:idx] + allowedUser = trimmed[idx+1:] + } + + // Support either side using "id|username" compound form. + // This keeps backward compatibility with legacy Telegram allowlist entries. + if senderID == allowed || + idPart == allowed || + senderID == trimmed || + idPart == trimmed || + idPart == allowedID || + (allowedUser != "" && senderID == allowedUser) || + (userPart != "" && (userPart == allowed || userPart == trimmed || userPart == allowedUser)) { return true } } diff --git a/pkg/channels/base_test.go b/pkg/channels/base_test.go new file mode 100644 index 000000000..f82b04c46 --- /dev/null +++ b/pkg/channels/base_test.go @@ -0,0 +1,53 @@ +package channels + +import "testing" + +func TestBaseChannelIsAllowed(t *testing.T) { + tests := []struct { + name string + allowList []string + senderID string + want bool + }{ + { + name: "empty allowlist allows all", + allowList: nil, + senderID: "anyone", + want: true, + }, + { + name: "compound sender matches numeric allowlist", + allowList: []string{"123456"}, + senderID: "123456|alice", + want: true, + }, + { + name: "compound sender matches username allowlist", + allowList: []string{"@alice"}, + senderID: "123456|alice", + want: true, + }, + { + name: "numeric sender matches legacy compound allowlist", + allowList: []string{"123456|alice"}, + senderID: "123456", + want: true, + }, + { + name: "non matching sender is denied", + allowList: []string{"123456"}, + senderID: "654321|bob", + want: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ch := NewBaseChannel("test", nil, nil, tt.allowList) + if got := ch.IsAllowed(tt.senderID); got != tt.want { + t.Fatalf("IsAllowed(%q) = %v, want %v", tt.senderID, got, tt.want) + } + }) + } +} + diff --git a/pkg/channels/telegram.go b/pkg/channels/telegram.go index 3ad4818c3..38f4dbb7d 100644 --- a/pkg/channels/telegram.go +++ b/pkg/channels/telegram.go @@ -177,15 +177,17 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat return } - senderID := fmt.Sprintf("%d", user.ID) + userID := fmt.Sprintf("%d", user.ID) + senderID := userID if user.Username != "" { - senderID = fmt.Sprintf("%d|%s", user.ID, user.Username) + senderID = fmt.Sprintf("%s|%s", userID, user.Username) } // ๆฃ€ๆŸฅ็™ฝๅๅ•๏ผŒ้ฟๅ…ไธบ่ขซๆ‹’็ป็š„็”จๆˆทไธ‹่ฝฝ้™„ไปถ - if !c.IsAllowed(senderID) { + if !c.IsAllowed(userID) && !c.IsAllowed(senderID) { logger.DebugCF("telegram", "Message rejected by allowlist", map[string]interface{}{ - "user_id": senderID, + "user_id": userID, + "username": user.Username, }) return } @@ -359,7 +361,7 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat "is_group": fmt.Sprintf("%t", message.Chat.Type != "private"), } - c.HandleMessage(fmt.Sprintf("%d", user.ID), fmt.Sprintf("%d", chatID), content, mediaPaths, metadata) + c.HandleMessage(senderID, fmt.Sprintf("%d", chatID), content, mediaPaths, metadata) } func (c *TelegramChannel) downloadPhoto(ctx context.Context, fileID string) string { From 2f5849b39dc47e25d71cf0d815d0a0af53bbfb62 Mon Sep 17 00:00:00 2001 From: Satyam Tiwari Date: Fri, 13 Feb 2026 14:42:55 +0530 Subject: [PATCH 04/48] feat: add support for DuckDuckGo and refactor Brave search configuration support the control with config.js --- README.md | 24 ++++++++++++++++++++---- pkg/agent/loop.go | 11 +++++++++-- pkg/config/config.go | 22 +++++++++++++++++----- pkg/migrate/config.go | 13 +++++++++---- pkg/tools/web.go | 29 ++++++++++++++++++++++------- 5 files changed, 77 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 1a8b81906..89d881fa9 100644 --- a/README.md +++ b/README.md @@ -194,9 +194,14 @@ picoclaw onboard }, "tools": { "web": { - "search": { + "brave": { + "enabled": false, "api_key": "YOUR_BRAVE_API_KEY", "max_results": 5 + }, + "duckduckgo": { + "enabled": true, + "max_results": 5 } } } @@ -507,8 +512,14 @@ picoclaw agent -m "Hello" }, "tools": { "web": { - "search": { - "api_key": "BSA..." + "brave": { + "enabled": false, + "api_key": "BSA...", + "max_results": 5 + }, + "duckduckgo": { + "enabled": true, + "max_results": 5 } } } @@ -564,9 +575,14 @@ Add the key to `~/.picoclaw/config.json` if using Brave: { "tools": { "web": { - "search": { + "brave": { + "enabled": false, "api_key": "YOUR_BRAVE_API_KEY", "max_results": 5 + }, + "duckduckgo": { + "enabled": true, + "max_results": 5 } } } diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index fac2856e9..4a5bbf341 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -63,8 +63,15 @@ func NewAgentLoop(cfg *config.Config, msgBus *bus.MessageBus, provider providers toolsRegistry.Register(tools.NewListDirTool(workspace, restrict)) toolsRegistry.Register(tools.NewExecTool(workspace, restrict)) - braveAPIKey := cfg.Tools.Web.Search.APIKey - toolsRegistry.Register(tools.NewWebSearchTool(braveAPIKey, cfg.Tools.Web.Search.MaxResults)) + if searchTool := tools.NewWebSearchTool(tools.WebSearchToolOptions{ + BraveAPIKey: cfg.Tools.Web.Brave.APIKey, + BraveMaxResults: cfg.Tools.Web.Brave.MaxResults, + BraveEnabled: cfg.Tools.Web.Brave.Enabled, + DuckDuckGoMaxResults: cfg.Tools.Web.DuckDuckGo.MaxResults, + DuckDuckGoEnabled: cfg.Tools.Web.DuckDuckGo.Enabled, + }); searchTool != nil { + toolsRegistry.Register(searchTool) + } toolsRegistry.Register(tools.NewWebFetchTool(50000)) // Register message tool diff --git a/pkg/config/config.go b/pkg/config/config.go index 56f1e1958..608cbc7c5 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -157,13 +157,20 @@ type GatewayConfig struct { Port int `json:"port" env:"PICOCLAW_GATEWAY_PORT"` } -type WebSearchConfig struct { - APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_WEB_SEARCH_API_KEY"` - MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_SEARCH_MAX_RESULTS"` +type BraveConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_BRAVE_ENABLED"` + APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_WEB_BRAVE_API_KEY"` + MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_BRAVE_MAX_RESULTS"` +} + +type DuckDuckGoConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_DUCKDUCKGO_ENABLED"` + MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_DUCKDUCKGO_MAX_RESULTS"` } type WebToolsConfig struct { - Search WebSearchConfig `json:"search"` + Brave BraveConfig `json:"brave"` + DuckDuckGo DuckDuckGoConfig `json:"duckduckgo"` } type ToolsConfig struct { @@ -249,10 +256,15 @@ func DefaultConfig() *Config { }, Tools: ToolsConfig{ Web: WebToolsConfig{ - Search: WebSearchConfig{ + Brave: BraveConfig{ + Enabled: false, APIKey: "", MaxResults: 5, }, + DuckDuckGo: DuckDuckGoConfig{ + Enabled: true, + MaxResults: 5, + }, }, }, } diff --git a/pkg/migrate/config.go b/pkg/migrate/config.go index d7fa63305..1559f9287 100644 --- a/pkg/migrate/config.go +++ b/pkg/migrate/config.go @@ -212,12 +212,17 @@ func ConvertConfig(data map[string]interface{}) (*config.Config, []string, error if tools, ok := getMap(data, "tools"); ok { if web, ok := getMap(tools, "web"); ok { + // Migrate old "search" config to "brave" if api_key is present if search, ok := getMap(web, "search"); ok { if v, ok := getString(search, "api_key"); ok { - cfg.Tools.Web.Search.APIKey = v + cfg.Tools.Web.Brave.APIKey = v + if v != "" { + cfg.Tools.Web.Brave.Enabled = true + } } if v, ok := getFloat(search, "max_results"); ok { - cfg.Tools.Web.Search.MaxResults = int(v) + cfg.Tools.Web.Brave.MaxResults = int(v) + cfg.Tools.Web.DuckDuckGo.MaxResults = int(v) } } } @@ -271,8 +276,8 @@ func MergeConfig(existing, incoming *config.Config) *config.Config { existing.Channels.MaixCam = incoming.Channels.MaixCam } - if existing.Tools.Web.Search.APIKey == "" { - existing.Tools.Web.Search = incoming.Tools.Web.Search + if existing.Tools.Web.Brave.APIKey == "" { + existing.Tools.Web.Brave = incoming.Tools.Web.Brave } return existing diff --git a/pkg/tools/web.go b/pkg/tools/web.go index f03bafbb4..dec4b89ee 100644 --- a/pkg/tools/web.go +++ b/pkg/tools/web.go @@ -188,16 +188,31 @@ type WebSearchTool struct { maxResults int } -func NewWebSearchTool(apiKey string, maxResults int) *WebSearchTool { - if maxResults <= 0 || maxResults > 10 { - maxResults = 5 - } +type WebSearchToolOptions struct { + BraveAPIKey string + BraveMaxResults int + BraveEnabled bool + DuckDuckGoMaxResults int + DuckDuckGoEnabled bool +} +func NewWebSearchTool(opts WebSearchToolOptions) *WebSearchTool { var provider SearchProvider - if apiKey != "" { - provider = &BraveSearchProvider{apiKey: apiKey} - } else { + maxResults := 5 + + // Priority: Brave > DuckDuckGo + if opts.BraveEnabled && opts.BraveAPIKey != "" { + provider = &BraveSearchProvider{apiKey: opts.BraveAPIKey} + if opts.BraveMaxResults > 0 { + maxResults = opts.BraveMaxResults + } + } else if opts.DuckDuckGoEnabled { provider = &DuckDuckGoSearchProvider{} + if opts.DuckDuckGoMaxResults > 0 { + maxResults = opts.DuckDuckGoMaxResults + } + } else { + return nil } return &WebSearchTool{ From c86e121688c3cf1a1423192effdb0ae68918d5ed Mon Sep 17 00:00:00 2001 From: Satyam Tiwari Date: Fri, 13 Feb 2026 15:41:37 +0530 Subject: [PATCH 05/48] refactor: update tool registry usage and enhance WebSearchTool execution result handling --- pkg/agent/loop.go | 4 ++-- pkg/tools/web.go | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 02885a458..dfe466dcb 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -77,9 +77,9 @@ func createToolRegistry(workspace string, restrict bool, cfg *config.Config, msg DuckDuckGoMaxResults: cfg.Tools.Web.DuckDuckGo.MaxResults, DuckDuckGoEnabled: cfg.Tools.Web.DuckDuckGo.Enabled, }); searchTool != nil { - toolsRegistry.Register(searchTool) + registry.Register(searchTool) } - toolsRegistry.Register(tools.NewWebFetchTool(50000)) + registry.Register(tools.NewWebFetchTool(50000)) // Message tool - available to both agent and subagent // Subagent uses it to communicate directly with user diff --git a/pkg/tools/web.go b/pkg/tools/web.go index 2d0fd0735..6fc89c95b 100644 --- a/pkg/tools/web.go +++ b/pkg/tools/web.go @@ -248,7 +248,7 @@ func (t *WebSearchTool) Parameters() map[string]interface{} { } } -func (t *WebSearchTool) Execute(ctx context.Context, args map[string]interface{}) (string, error) { +func (t *WebSearchTool) Execute(ctx context.Context, args map[string]interface{}) *ToolResult { query, ok := args["query"].(string) if !ok { return ErrorResult("query is required") @@ -261,7 +261,15 @@ func (t *WebSearchTool) Execute(ctx context.Context, args map[string]interface{} } } - return t.provider.Search(ctx, query, count) + result, err := t.provider.Search(ctx, query, count) + if err != nil { + return ErrorResult(fmt.Sprintf("search failed: %v", err)) + } + + return &ToolResult{ + ForLLM: result, + ForUser: result, + } } type WebFetchTool struct { From 1e17bac9f0e985b975ad5046781a558de51e033b Mon Sep 17 00:00:00 2001 From: zeo Date: Fri, 13 Feb 2026 21:38:14 +0800 Subject: [PATCH 06/48] fix: correct index bug in extractCodeBlocks and extractInlineCodes The previous implementation used len(codes)-1 in ReplaceAllStringFunc, which caused all placeholders to point to the same (last) index. This resulted in only the last code block being displayed correctly when multiple code blocks were present in a message. Now using a proper counter variable that increments for each match, ensuring each code block gets a unique placeholder index. --- pkg/channels/telegram.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/channels/telegram.go b/pkg/channels/telegram.go index 3ad4818c3..3e1c40e31 100644 --- a/pkg/channels/telegram.go +++ b/pkg/channels/telegram.go @@ -470,8 +470,11 @@ func extractCodeBlocks(text string) codeBlockMatch { codes = append(codes, match[1]) } + i := 0 text = re.ReplaceAllStringFunc(text, func(m string) string { - return fmt.Sprintf("\x00CB%d\x00", len(codes)-1) + placeholder := fmt.Sprintf("\x00CB%d\x00", i) + i++ + return placeholder }) return codeBlockMatch{text: text, codes: codes} @@ -491,8 +494,11 @@ func extractInlineCodes(text string) inlineCodeMatch { codes = append(codes, match[1]) } + i := 0 text = re.ReplaceAllStringFunc(text, func(m string) string { - return fmt.Sprintf("\x00IC%d\x00", len(codes)-1) + placeholder := fmt.Sprintf("\x00IC%d\x00", i) + i++ + return placeholder }) return inlineCodeMatch{text: text, codes: codes} From 878650c459493d2dfac36dbf3cd5cf103d579f58 Mon Sep 17 00:00:00 2001 From: lxowalle Date: Fri, 13 Feb 2026 22:19:18 +0800 Subject: [PATCH 07/48] * fix: heartbeat/service_test.go test failed --- pkg/heartbeat/service_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/heartbeat/service_test.go b/pkg/heartbeat/service_test.go index d7aed15f1..a2b59e350 100644 --- a/pkg/heartbeat/service_test.go +++ b/pkg/heartbeat/service_test.go @@ -17,7 +17,7 @@ func TestExecuteHeartbeat_Async(t *testing.T) { defer os.RemoveAll(tmpDir) hs := NewHeartbeatService(tmpDir, 30, true) - hs.started = true // Enable for testing + hs.stopChan = make(chan struct{}) // Enable for testing asyncCalled := false asyncResult := &tools.ToolResult{ @@ -55,7 +55,7 @@ func TestExecuteHeartbeat_Error(t *testing.T) { defer os.RemoveAll(tmpDir) hs := NewHeartbeatService(tmpDir, 30, true) - hs.started = true // Enable for testing + hs.stopChan = make(chan struct{}) // Enable for testing hs.SetHandler(func(prompt, channel, chatID string) *tools.ToolResult { return &tools.ToolResult{ @@ -93,7 +93,7 @@ func TestExecuteHeartbeat_Silent(t *testing.T) { defer os.RemoveAll(tmpDir) hs := NewHeartbeatService(tmpDir, 30, true) - hs.started = true // Enable for testing + hs.stopChan = make(chan struct{}) // Enable for testing hs.SetHandler(func(prompt, channel, chatID string) *tools.ToolResult { return &tools.ToolResult{ @@ -167,7 +167,7 @@ func TestExecuteHeartbeat_NilResult(t *testing.T) { defer os.RemoveAll(tmpDir) hs := NewHeartbeatService(tmpDir, 30, true) - hs.started = true // Enable for testing + hs.stopChan = make(chan struct{}) // Enable for testing hs.SetHandler(func(prompt, channel, chatID string) *tools.ToolResult { return nil From 15e3c7d08a1ff877e0d21ecc304e01e6fd96f138 Mon Sep 17 00:00:00 2001 From: seth <117851610+Sethispr@users.noreply.github.com> Date: Fri, 13 Feb 2026 08:05:14 -0800 Subject: [PATCH 08/48] chore: lint readme MD004 / ul-style Unordered list style [Expected: asterisk; Actual: dash] MD009 / no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1] MD012 / no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2] MD022 / blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] MD031 / blanks-around-fences Fenced code blocks should be surrounded by blank lines MD032 / blanks-around-lists Lists should be surrounded by blank lines --- README.md | 84 +++++++++++++++++++++++++++---------------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 2ba70881b..81d155f89 100644 --- a/README.md +++ b/README.md @@ -17,14 +17,12 @@ [ไธญๆ–‡](README.zh.md) | [ๆ—ฅๆœฌ่ชž](README.ja.md) | **English** - --- ๐Ÿฆ PicoClaw is an ultra-lightweight personal AI Assistant inspired by [nanobot](https://github.com/HKUDS/nanobot), refactored from the ground up in Go through a self-bootstrapping process, where the AI agent itself drove the entire architectural migration and code optimization. โšก๏ธ Runs on $10 hardware with <10MB RAM: That's 99% less memory than OpenClaw and 98% cheaper than a Mac mini! -
@@ -40,20 +38,19 @@
- > [!CAUTION] > **๐Ÿšจ SECURITY & OFFICIAL CHANNELS / ๅฎ‰ๅ…จๅฃฐๆ˜Ž** > > * **NO CRYPTO:** PicoClaw has **NO** official token/coin. All claims on `pump.fun` or other trading platforms are **SCAMS**. > * **OFFICIAL DOMAIN:** The **ONLY** official website is **[picoclaw.io](https://picoclaw.io)**, and company website is **[sipeed.com](https://sipeed.com)** -> * **Warning:** Many `.ai/.org/.com/.net/...` domains are registered by third parties. +> * **Warning:** Many `.ai/.org/.com/.net/...` domains are registered by third parties. > ## ๐Ÿ“ข News + 2026-02-13 ๐ŸŽ‰ PicoClaw hit 5000 stars in 4days! Thank you for the community! There are so many PRs&issues come in (during Chinese New Year holidays), we are finalizing the Project Roadmap and setting up the Developer Group to accelerate PicoClaw's development. ๐Ÿš€ Call to Action: Please submit your feature requests in GitHub Discussions. We will review and prioritize them during our upcoming weekly meeting. - 2026-02-09 ๐ŸŽ‰ PicoClaw Launched! Built in 1 day to bring AI Agents to $10 hardware with <10MB RAM. ๐Ÿฆ PicoClaw๏ผŒLet's Go๏ผ ## โœจ Features @@ -103,9 +100,9 @@ PicoClaw can be deployed on almost any Linux device! -- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) or W(WiFi6) version, for Minimal Home Assistant -- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), or $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) for Automated Server Maintenance -- $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) or $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) for Smart Monitoring +* $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) or W(WiFi6) version, for Minimal Home Assistant +* $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), or $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) for Automated Server Maintenance +* $50 [MaixCAM](https://www.aliexpress.com/item/1005008053333693.html) or $100 [MaixCAM2](https://www.kickstarter.com/projects/zepan/maixcam2-build-your-next-gen-4k-ai-camera) for Smart Monitoring @@ -220,8 +217,8 @@ picoclaw onboard **3. Get API Keys** -- **LLM Provider**: [OpenRouter](https://openrouter.ai/keys) ยท [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) ยท [Anthropic](https://console.anthropic.com) ยท [OpenAI](https://platform.openai.com) ยท [Gemini](https://aistudio.google.com/api-keys) -- **Web Search** (optional): [Brave Search](https://brave.com/search/api) - Free tier available (2000 requests/month) +* **LLM Provider**: [OpenRouter](https://openrouter.ai/keys) ยท [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) ยท [Anthropic](https://console.anthropic.com) ยท [OpenAI](https://platform.openai.com) ยท [Gemini](https://aistudio.google.com/api-keys) +* **Web Search** (optional): [Brave Search](https://brave.com/search/api) - Free tier available (2000 requests/month) > **Note**: See `config.example.json` for a complete configuration template. @@ -251,9 +248,9 @@ Talk to your picoclaw through Telegram, Discord, or DingTalk **1. Create a bot** -- Open Telegram, search `@BotFather` -- Send `/newbot`, follow prompts -- Copy the token +* Open Telegram, search `@BotFather` +* Send `/newbot`, follow prompts +* Copy the token **2. Configure** @@ -284,19 +281,19 @@ picoclaw gateway **1. Create a bot** -- Go to -- Create an application โ†’ Bot โ†’ Add Bot -- Copy the bot token +* Go to +* Create an application โ†’ Bot โ†’ Add Bot +* Copy the bot token **2. Enable intents** -- In the Bot settings, enable **MESSAGE CONTENT INTENT** -- (Optional) Enable **SERVER MEMBERS INTENT** if you plan to use allow lists based on member data +* In the Bot settings, enable **MESSAGE CONTENT INTENT** +* (Optional) Enable **SERVER MEMBERS INTENT** if you plan to use allow lists based on member data **3. Get your User ID** -- Discord Settings โ†’ Advanced โ†’ enable **Developer Mode** -- Right-click your avatar โ†’ **Copy User ID** +* Discord Settings โ†’ Advanced โ†’ enable **Developer Mode** +* Right-click your avatar โ†’ **Copy User ID** **4. Configure** @@ -314,10 +311,10 @@ picoclaw gateway **5. Invite the bot** -- OAuth2 โ†’ URL Generator -- Scopes: `bot` -- Bot Permissions: `Send Messages`, `Read Message History` -- Open the generated invite URL and add the bot to your server +* OAuth2 โ†’ URL Generator +* Scopes: `bot` +* Bot Permissions: `Send Messages`, `Read Message History` +* Open the generated invite URL and add the bot to your server **6. Run** @@ -332,8 +329,8 @@ picoclaw gateway **1. Create a bot** -- Go to [QQ Open Platform](https://connect.qq.com/) -- Create an application โ†’ Get **AppID** and **AppSecret** +* Go to [QQ Open Platform](https://connect.qq.com/) +* Create an application โ†’ Get **AppID** and **AppSecret** **2. Configure** @@ -365,9 +362,9 @@ picoclaw gateway **1. Create a bot** -- Go to [Open Platform](https://open.dingtalk.com/) -- Create an internal app -- Copy Client ID and Client Secret +* Go to [Open Platform](https://open.dingtalk.com/) +* Create an internal app +* Copy Client ID and Client Secret **2. Configure** @@ -400,8 +397,6 @@ Connect Picoclaw to the Agent Social Network simply by sending a single message **Read `https://clawdchat.ai/skill.md` and follow the instructions to join [ClawdChat.ai](https://clawdchat.ai)** - - ## โš™๏ธ Configuration Config file: `~/.picoclaw/config.json` @@ -464,12 +459,12 @@ When `restrict_to_workspace: true`, the following tools are sandboxed: Even with `restrict_to_workspace: false`, the `exec` tool blocks these dangerous commands: -- `rm -rf`, `del /f`, `rmdir /s` โ€” Bulk deletion -- `format`, `mkfs`, `diskpart` โ€” Disk formatting -- `dd if=` โ€” Disk imaging -- Writing to `/dev/sd[a-z]` โ€” Direct disk writes -- `shutdown`, `reboot`, `poweroff` โ€” System shutdown -- Fork bomb `:(){ :|:& };:` +* `rm -rf`, `del /f`, `rmdir /s` โ€” Bulk deletion +* `format`, `mkfs`, `diskpart` โ€” Disk formatting +* `dd if=` โ€” Disk imaging +* Writing to `/dev/sd[a-z]` โ€” Direct disk writes +* `shutdown`, `reboot`, `poweroff` โ€” System shutdown +* Fork bomb `:(){ :|:& };:` #### Error Examples @@ -488,6 +483,7 @@ Even with `restrict_to_workspace: false`, the `exec` tool blocks these dangerous If you need the agent to access paths outside the workspace: **Method 1: Config file** + ```json { "agents": { @@ -499,6 +495,7 @@ If you need the agent to access paths outside the workspace: ``` **Method 2: Environment variable** + ```bash export PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false ``` @@ -590,8 +587,9 @@ The subagent has access to tools (message, web_search, etc.) and can communicate | `interval` | `30` | Check interval in minutes (min: 5) | **Environment variables:** -- `PICOCLAW_HEARTBEAT_ENABLED=false` to disable -- `PICOCLAW_HEARTBEAT_INTERVAL=60` to change interval + +* `PICOCLAW_HEARTBEAT_ENABLED=false` to disable +* `PICOCLAW_HEARTBEAT_INTERVAL=60` to change interval ### Providers @@ -613,7 +611,7 @@ The subagent has access to tools (message, web_search, etc.) and can communicate **1. Get API key and base URL** -- Get [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) +* Get [API key](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) **2. Configure** @@ -724,9 +722,9 @@ picoclaw agent -m "Hello" PicoClaw supports scheduled reminders and recurring tasks through the `cron` tool: -- **One-time reminders**: "Remind me in 10 minutes" โ†’ triggers once after 10min -- **Recurring tasks**: "Remind me every 2 hours" โ†’ triggers every 2 hours -- **Cron expressions**: "Remind me at 9am daily" โ†’ uses cron expression +* **One-time reminders**: "Remind me in 10 minutes" โ†’ triggers once after 10min +* **Recurring tasks**: "Remind me every 2 hours" โ†’ triggers every 2 hours +* **Cron expressions**: "Remind me at 9am daily" โ†’ uses cron expression Jobs are stored in `~/.picoclaw/workspace/cron/` and processed automatically. From 45351a6a792f87841d8a15e628a90786a54affce Mon Sep 17 00:00:00 2001 From: Avisek Date: Fri, 13 Feb 2026 20:38:43 +0530 Subject: [PATCH 09/48] refactor: Trim trailing slashes from the API base URL and enhance API error messages with status codes. --- pkg/providers/http_provider.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index b1d0c0312..fc78a182f 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -42,7 +42,7 @@ func NewHTTPProvider(apiKey, apiBase, proxy string) *HTTPProvider { return &HTTPProvider{ apiKey: apiKey, - apiBase: apiBase, + apiBase: strings.TrimRight(apiBase, "/"), httpClient: client, } } @@ -116,7 +116,7 @@ func (p *HTTPProvider) Chat(ctx context.Context, messages []Message, tools []Too } if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("API error: %s", string(body)) + return nil, fmt.Errorf("API request failed:\n Status: %d\n Body: %s", resp.StatusCode, string(body)) } return p.parseResponse(body) From f294a71bc5771bf896fd13c47e651692d4925a5c Mon Sep 17 00:00:00 2001 From: ex-takashima Date: Sat, 14 Feb 2026 10:01:20 +0900 Subject: [PATCH 10/48] feat(channels): add LINE Official Account channel support Add LINE Messaging API as the 9th messaging channel using HTTP Webhook. Supports text/image/audio messages, group chat @mention detection, reply with quote, and loading animation. - No external SDK required (standard library only) - HMAC-SHA256 webhook signature verification - Reply Token (free) with Push API fallback - Group chat: respond only when @mentioned - Quote original message in replies using quoteToken Closes #146 Co-Authored-By: Claude Opus 4.6 --- .env.example | 2 + config/config.example.json | 9 + pkg/channels/line.go | 598 +++++++++++++++++++++++++++++++++++++ pkg/channels/manager.go | 13 + pkg/config/config.go | 20 ++ 5 files changed, 642 insertions(+) create mode 100644 pkg/channels/line.go diff --git a/.env.example b/.env.example index c450b6e8c..66539b634 100644 --- a/.env.example +++ b/.env.example @@ -9,6 +9,8 @@ # โ”€โ”€ Chat Channel โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ # TELEGRAM_BOT_TOKEN=123456:ABC... # DISCORD_BOT_TOKEN=xxx +# LINE_CHANNEL_SECRET=xxx +# LINE_CHANNEL_ACCESS_TOKEN=xxx # โ”€โ”€ Web Search (optional) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ # BRAVE_SEARCH_API_KEY=BSA... diff --git a/config/config.example.json b/config/config.example.json index ed5cb7048..593ca07c1 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -51,6 +51,15 @@ "bot_token": "xoxb-YOUR-BOT-TOKEN", "app_token": "xapp-YOUR-APP-TOKEN", "allow_from": [] + }, + "line": { + "enabled": false, + "channel_secret": "YOUR_LINE_CHANNEL_SECRET", + "channel_access_token": "YOUR_LINE_CHANNEL_ACCESS_TOKEN", + "webhook_host": "0.0.0.0", + "webhook_port": 18791, + "webhook_path": "/webhook/line", + "allow_from": [] } }, "providers": { diff --git a/pkg/channels/line.go b/pkg/channels/line.go new file mode 100644 index 000000000..580e98480 --- /dev/null +++ b/pkg/channels/line.go @@ -0,0 +1,598 @@ +package channels + +import ( + "bytes" + "context" + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "strings" + "sync" + "time" + + "github.com/sipeed/picoclaw/pkg/bus" + "github.com/sipeed/picoclaw/pkg/config" + "github.com/sipeed/picoclaw/pkg/logger" + "github.com/sipeed/picoclaw/pkg/utils" +) + +const ( + lineAPIBase = "https://api.line.me/v2/bot" + lineDataAPIBase = "https://api-data.line.me/v2/bot" + lineReplyEndpoint = lineAPIBase + "/message/reply" + linePushEndpoint = lineAPIBase + "/message/push" + lineContentEndpoint = lineDataAPIBase + "/message/%s/content" + lineBotInfoEndpoint = lineAPIBase + "/info" + lineLoadingEndpoint = lineAPIBase + "/chat/loading/start" + lineReplyTokenMaxAge = 25 * time.Second +) + +type replyTokenEntry struct { + token string + timestamp time.Time +} + +// LINEChannel implements the Channel interface for LINE Official Account +// using the LINE Messaging API with HTTP webhook for receiving messages +// and REST API for sending messages. +type LINEChannel struct { + *BaseChannel + config config.LINEConfig + httpServer *http.Server + botUserID string // Bot's user ID + botBasicID string // Bot's basic ID (e.g. @216ru...) + botDisplayName string // Bot's display name for text-based mention detection + replyTokens sync.Map // chatID -> replyTokenEntry + quoteTokens sync.Map // chatID -> quoteToken (string) + ctx context.Context + cancel context.CancelFunc +} + +// NewLINEChannel creates a new LINE channel instance. +func NewLINEChannel(cfg config.LINEConfig, messageBus *bus.MessageBus) (*LINEChannel, error) { + if cfg.ChannelSecret == "" || cfg.ChannelAccessToken == "" { + return nil, fmt.Errorf("line channel_secret and channel_access_token are required") + } + + base := NewBaseChannel("line", cfg, messageBus, cfg.AllowFrom) + + return &LINEChannel{ + BaseChannel: base, + config: cfg, + }, nil +} + +// Start launches the HTTP webhook server. +func (c *LINEChannel) Start(ctx context.Context) error { + logger.InfoC("line", "Starting LINE channel (Webhook Mode)") + + c.ctx, c.cancel = context.WithCancel(ctx) + + // Fetch bot profile to get bot's userId for mention detection + if err := c.fetchBotInfo(); err != nil { + logger.WarnCF("line", "Failed to fetch bot info (mention detection disabled)", map[string]interface{}{ + "error": err.Error(), + }) + } else { + logger.InfoCF("line", "Bot info fetched", map[string]interface{}{ + "bot_user_id": c.botUserID, + "basic_id": c.botBasicID, + "display_name": c.botDisplayName, + }) + } + + mux := http.NewServeMux() + path := c.config.WebhookPath + if path == "" { + path = "/webhook/line" + } + mux.HandleFunc(path, c.webhookHandler) + + addr := fmt.Sprintf("%s:%d", c.config.WebhookHost, c.config.WebhookPort) + c.httpServer = &http.Server{ + Addr: addr, + Handler: mux, + } + + go func() { + logger.InfoCF("line", "LINE webhook server listening", map[string]interface{}{ + "addr": addr, + "path": path, + }) + if err := c.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { + logger.ErrorCF("line", "Webhook server error", map[string]interface{}{ + "error": err.Error(), + }) + } + }() + + c.setRunning(true) + logger.InfoC("line", "LINE channel started (Webhook Mode)") + return nil +} + +// fetchBotInfo retrieves the bot's userId, basicId, and displayName from the LINE API. +func (c *LINEChannel) fetchBotInfo() error { + req, err := http.NewRequest(http.MethodGet, lineBotInfoEndpoint, nil) + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+c.config.ChannelAccessToken) + + client := &http.Client{Timeout: 10 * time.Second} + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("bot info API returned status %d", resp.StatusCode) + } + + var info struct { + UserID string `json:"userId"` + BasicID string `json:"basicId"` + DisplayName string `json:"displayName"` + } + if err := json.NewDecoder(resp.Body).Decode(&info); err != nil { + return err + } + + c.botUserID = info.UserID + c.botBasicID = info.BasicID + c.botDisplayName = info.DisplayName + return nil +} + +// Stop gracefully shuts down the HTTP server. +func (c *LINEChannel) Stop(ctx context.Context) error { + logger.InfoC("line", "Stopping LINE channel") + + if c.cancel != nil { + c.cancel() + } + + if c.httpServer != nil { + shutdownCtx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + if err := c.httpServer.Shutdown(shutdownCtx); err != nil { + logger.ErrorCF("line", "Webhook server shutdown error", map[string]interface{}{ + "error": err.Error(), + }) + } + } + + c.setRunning(false) + logger.InfoC("line", "LINE channel stopped") + return nil +} + +// webhookHandler handles incoming LINE webhook requests. +func (c *LINEChannel) webhookHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + body, err := io.ReadAll(r.Body) + if err != nil { + logger.ErrorCF("line", "Failed to read request body", map[string]interface{}{ + "error": err.Error(), + }) + http.Error(w, "Bad request", http.StatusBadRequest) + return + } + + signature := r.Header.Get("X-Line-Signature") + if !c.verifySignature(body, signature) { + logger.WarnC("line", "Invalid webhook signature") + http.Error(w, "Forbidden", http.StatusForbidden) + return + } + + var payload struct { + Events []lineEvent `json:"events"` + } + if err := json.Unmarshal(body, &payload); err != nil { + logger.ErrorCF("line", "Failed to parse webhook payload", map[string]interface{}{ + "error": err.Error(), + }) + http.Error(w, "Bad request", http.StatusBadRequest) + return + } + + // Return 200 immediately, process events asynchronously + w.WriteHeader(http.StatusOK) + + for _, event := range payload.Events { + go c.processEvent(event) + } +} + +// verifySignature validates the X-Line-Signature using HMAC-SHA256. +func (c *LINEChannel) verifySignature(body []byte, signature string) bool { + if signature == "" { + return false + } + + mac := hmac.New(sha256.New, []byte(c.config.ChannelSecret)) + mac.Write(body) + expected := base64.StdEncoding.EncodeToString(mac.Sum(nil)) + + return hmac.Equal([]byte(expected), []byte(signature)) +} + +// LINE webhook event types +type lineEvent struct { + Type string `json:"type"` + ReplyToken string `json:"replyToken"` + Source lineSource `json:"source"` + Message json.RawMessage `json:"message"` + Timestamp int64 `json:"timestamp"` +} + +type lineSource struct { + Type string `json:"type"` // "user", "group", "room" + UserID string `json:"userId"` + GroupID string `json:"groupId"` + RoomID string `json:"roomId"` +} + +type lineMessage struct { + ID string `json:"id"` + Type string `json:"type"` // "text", "image", "video", "audio", "file", "sticker" + Text string `json:"text"` + QuoteToken string `json:"quoteToken"` + Mention *struct { + Mentionees []lineMentionee `json:"mentionees"` + } `json:"mention"` + ContentProvider struct { + Type string `json:"type"` + } `json:"contentProvider"` +} + +type lineMentionee struct { + Index int `json:"index"` + Length int `json:"length"` + Type string `json:"type"` // "user", "all" + UserID string `json:"userId"` +} + +func (c *LINEChannel) processEvent(event lineEvent) { + if event.Type != "message" { + logger.DebugCF("line", "Ignoring non-message event", map[string]interface{}{ + "type": event.Type, + }) + return + } + + senderID := event.Source.UserID + chatID := c.resolveChatID(event.Source) + isGroup := event.Source.Type == "group" || event.Source.Type == "room" + + var msg lineMessage + if err := json.Unmarshal(event.Message, &msg); err != nil { + logger.ErrorCF("line", "Failed to parse message", map[string]interface{}{ + "error": err.Error(), + }) + return + } + + // In group chats, only respond when the bot is mentioned + if isGroup && !c.isBotMentioned(msg) { + logger.DebugCF("line", "Ignoring group message without mention", map[string]interface{}{ + "chat_id": chatID, + }) + return + } + + // Store reply token for later use + if event.ReplyToken != "" { + c.replyTokens.Store(chatID, replyTokenEntry{ + token: event.ReplyToken, + timestamp: time.Now(), + }) + } + + // Store quote token for quoting the original message in reply + if msg.QuoteToken != "" { + c.quoteTokens.Store(chatID, msg.QuoteToken) + } + + var content string + var mediaPaths []string + localFiles := []string{} + + defer func() { + for _, file := range localFiles { + if err := os.Remove(file); err != nil { + logger.DebugCF("line", "Failed to cleanup temp file", map[string]interface{}{ + "file": file, + "error": err.Error(), + }) + } + } + }() + + switch msg.Type { + case "text": + content = msg.Text + // Strip bot mention from text in group chats + if isGroup { + content = c.stripBotMention(content, msg) + } + case "image": + localPath := c.downloadContent(msg.ID, "image.jpg") + if localPath != "" { + localFiles = append(localFiles, localPath) + mediaPaths = append(mediaPaths, localPath) + content = "[image]" + } + case "audio": + localPath := c.downloadContent(msg.ID, "audio.m4a") + if localPath != "" { + localFiles = append(localFiles, localPath) + mediaPaths = append(mediaPaths, localPath) + content = "[audio]" + } + case "video": + localPath := c.downloadContent(msg.ID, "video.mp4") + if localPath != "" { + localFiles = append(localFiles, localPath) + mediaPaths = append(mediaPaths, localPath) + content = "[video]" + } + case "file": + content = "[file]" + case "sticker": + content = "[sticker]" + default: + content = fmt.Sprintf("[%s]", msg.Type) + } + + if strings.TrimSpace(content) == "" { + return + } + + metadata := map[string]string{ + "platform": "line", + "source_type": event.Source.Type, + "message_id": msg.ID, + } + + logger.DebugCF("line", "Received message", map[string]interface{}{ + "sender_id": senderID, + "chat_id": chatID, + "message_type": msg.Type, + "is_group": isGroup, + "preview": utils.Truncate(content, 50), + }) + + // Show typing/loading indicator (requires user ID, not group ID) + c.sendLoading(senderID) + + c.HandleMessage(senderID, chatID, content, mediaPaths, metadata) +} + +// isBotMentioned checks if the bot is mentioned in the message. +// It first checks the mention metadata (userId match), then falls back +// to text-based detection using the bot's display name, since LINE may +// not include userId in mentionees for Official Accounts. +func (c *LINEChannel) isBotMentioned(msg lineMessage) bool { + // Check mention metadata + if msg.Mention != nil { + for _, m := range msg.Mention.Mentionees { + if m.Type == "all" { + return true + } + if c.botUserID != "" && m.UserID == c.botUserID { + return true + } + } + // Mention metadata exists with mentionees but bot not matched by userId. + // The bot IS likely mentioned (LINE includes mention struct when bot is @-ed), + // so check if any mentionee overlaps with bot display name in text. + if c.botDisplayName != "" { + for _, m := range msg.Mention.Mentionees { + if m.Index >= 0 && m.Length > 0 { + runes := []rune(msg.Text) + end := m.Index + m.Length + if end <= len(runes) { + mentionText := string(runes[m.Index:end]) + if strings.Contains(mentionText, c.botDisplayName) { + return true + } + } + } + } + } + } + + // Fallback: text-based detection with display name + if c.botDisplayName != "" && strings.Contains(msg.Text, "@"+c.botDisplayName) { + return true + } + + return false +} + +// stripBotMention removes the @BotName mention text from the message. +func (c *LINEChannel) stripBotMention(text string, msg lineMessage) string { + stripped := false + + // Try to strip using mention metadata indices + if msg.Mention != nil { + runes := []rune(text) + for i := len(msg.Mention.Mentionees) - 1; i >= 0; i-- { + m := msg.Mention.Mentionees[i] + // Strip if userId matches OR if the mention text contains the bot display name + shouldStrip := false + if c.botUserID != "" && m.UserID == c.botUserID { + shouldStrip = true + } else if c.botDisplayName != "" && m.Index >= 0 && m.Length > 0 { + end := m.Index + m.Length + if end <= len(runes) { + mentionText := string(runes[m.Index:end]) + if strings.Contains(mentionText, c.botDisplayName) { + shouldStrip = true + } + } + } + if shouldStrip { + start := m.Index + end := m.Index + m.Length + if start >= 0 && end <= len(runes) { + runes = append(runes[:start], runes[end:]...) + stripped = true + } + } + } + if stripped { + return strings.TrimSpace(string(runes)) + } + } + + // Fallback: strip @DisplayName from text + if c.botDisplayName != "" { + text = strings.ReplaceAll(text, "@"+c.botDisplayName, "") + } + + return strings.TrimSpace(text) +} + +// resolveChatID determines the chat ID from the event source. +// For group/room messages, use the group/room ID; for 1:1, use the user ID. +func (c *LINEChannel) resolveChatID(source lineSource) string { + switch source.Type { + case "group": + return source.GroupID + case "room": + return source.RoomID + default: + return source.UserID + } +} + +// Send sends a message to LINE. It first tries the Reply API (free) +// using a cached reply token, then falls back to the Push API. +func (c *LINEChannel) Send(ctx context.Context, msg bus.OutboundMessage) error { + if !c.IsRunning() { + return fmt.Errorf("line channel not running") + } + + // Load and consume quote token for this chat + var quoteToken string + if qt, ok := c.quoteTokens.LoadAndDelete(msg.ChatID); ok { + quoteToken = qt.(string) + } + + // Try reply token first (free, valid for ~25 seconds) + if entry, ok := c.replyTokens.LoadAndDelete(msg.ChatID); ok { + tokenEntry := entry.(replyTokenEntry) + if time.Since(tokenEntry.timestamp) < lineReplyTokenMaxAge { + if err := c.sendReply(ctx, tokenEntry.token, msg.Content, quoteToken); err == nil { + logger.DebugCF("line", "Message sent via Reply API", map[string]interface{}{ + "chat_id": msg.ChatID, + "quoted": quoteToken != "", + }) + return nil + } + logger.DebugC("line", "Reply API failed, falling back to Push API") + } + } + + // Fall back to Push API + return c.sendPush(ctx, msg.ChatID, msg.Content, quoteToken) +} + +// buildTextMessage creates a text message object, optionally with quoteToken. +func buildTextMessage(content, quoteToken string) map[string]string { + msg := map[string]string{ + "type": "text", + "text": content, + } + if quoteToken != "" { + msg["quoteToken"] = quoteToken + } + return msg +} + +// sendReply sends a message using the LINE Reply API. +func (c *LINEChannel) sendReply(ctx context.Context, replyToken, content, quoteToken string) error { + payload := map[string]interface{}{ + "replyToken": replyToken, + "messages": []map[string]string{buildTextMessage(content, quoteToken)}, + } + + return c.callAPI(ctx, lineReplyEndpoint, payload) +} + +// sendPush sends a message using the LINE Push API. +func (c *LINEChannel) sendPush(ctx context.Context, to, content, quoteToken string) error { + payload := map[string]interface{}{ + "to": to, + "messages": []map[string]string{buildTextMessage(content, quoteToken)}, + } + + return c.callAPI(ctx, linePushEndpoint, payload) +} + +// sendLoading sends a loading animation indicator to the chat. +func (c *LINEChannel) sendLoading(chatID string) { + payload := map[string]interface{}{ + "chatId": chatID, + "loadingSeconds": 60, + } + if err := c.callAPI(c.ctx, lineLoadingEndpoint, payload); err != nil { + logger.DebugCF("line", "Failed to send loading indicator", map[string]interface{}{ + "error": err.Error(), + }) + } +} + +// callAPI makes an authenticated POST request to the LINE API. +func (c *LINEChannel) callAPI(ctx context.Context, endpoint string, payload interface{}) error { + body, err := json.Marshal(payload) + if err != nil { + return fmt.Errorf("failed to marshal payload: %w", err) + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, bytes.NewReader(body)) + if err != nil { + return fmt.Errorf("failed to create request: %w", err) + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "Bearer "+c.config.ChannelAccessToken) + + client := &http.Client{Timeout: 30 * time.Second} + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("API request failed: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + respBody, _ := io.ReadAll(resp.Body) + return fmt.Errorf("LINE API error (status %d): %s", resp.StatusCode, string(respBody)) + } + + return nil +} + +// downloadContent downloads media content from the LINE API. +func (c *LINEChannel) downloadContent(messageID, filename string) string { + url := fmt.Sprintf(lineContentEndpoint, messageID) + return utils.DownloadFile(url, filename, utils.DownloadOptions{ + LoggerPrefix: "line", + ExtraHeaders: map[string]string{ + "Authorization": "Bearer " + c.config.ChannelAccessToken, + }, + }) +} diff --git a/pkg/channels/manager.go b/pkg/channels/manager.go index b0e1416b6..44d3de7e9 100644 --- a/pkg/channels/manager.go +++ b/pkg/channels/manager.go @@ -149,6 +149,19 @@ func (m *Manager) initChannels() error { } } + if m.config.Channels.LINE.Enabled && m.config.Channels.LINE.ChannelAccessToken != "" { + logger.DebugC("channels", "Attempting to initialize LINE channel") + line, err := NewLINEChannel(m.config.Channels.LINE, m.bus) + if err != nil { + logger.ErrorCF("channels", "Failed to initialize LINE channel", map[string]interface{}{ + "error": err.Error(), + }) + } else { + m.channels["line"] = line + logger.InfoC("channels", "LINE channel enabled successfully") + } + } + logger.InfoCF("channels", "Channel initialization completed", map[string]interface{}{ "enabled_channels": len(m.channels), }) diff --git a/pkg/config/config.go b/pkg/config/config.go index 56f1e1958..4c20b8bef 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -75,6 +75,7 @@ type ChannelsConfig struct { QQ QQConfig `json:"qq"` DingTalk DingTalkConfig `json:"dingtalk"` Slack SlackConfig `json:"slack"` + LINE LINEConfig `json:"line"` } type WhatsAppConfig struct { @@ -133,6 +134,16 @@ type SlackConfig struct { AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_SLACK_ALLOW_FROM"` } +type LINEConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_LINE_ENABLED"` + ChannelSecret string `json:"channel_secret" env:"PICOCLAW_CHANNELS_LINE_CHANNEL_SECRET"` + ChannelAccessToken string `json:"channel_access_token" env:"PICOCLAW_CHANNELS_LINE_CHANNEL_ACCESS_TOKEN"` + WebhookHost string `json:"webhook_host" env:"PICOCLAW_CHANNELS_LINE_WEBHOOK_HOST"` + WebhookPort int `json:"webhook_port" env:"PICOCLAW_CHANNELS_LINE_WEBHOOK_PORT"` + WebhookPath string `json:"webhook_path" env:"PICOCLAW_CHANNELS_LINE_WEBHOOK_PATH"` + AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_LINE_ALLOW_FROM"` +} + type ProvidersConfig struct { Anthropic ProviderConfig `json:"anthropic"` OpenAI ProviderConfig `json:"openai"` @@ -231,6 +242,15 @@ func DefaultConfig() *Config { AppToken: "", AllowFrom: []string{}, }, + LINE: LINEConfig{ + Enabled: false, + ChannelSecret: "", + ChannelAccessToken: "", + WebhookHost: "0.0.0.0", + WebhookPort: 18791, + WebhookPath: "/webhook/line", + AllowFrom: FlexibleStringSlice{}, + }, }, Providers: ProvidersConfig{ Anthropic: ProviderConfig{}, From 6083168ab4f1b5a344c6cf422b0126cc6ede5ee2 Mon Sep 17 00:00:00 2001 From: zepan Date: Sat, 14 Feb 2026 09:11:44 +0800 Subject: [PATCH 11/48] update wechat group qrcode --- assets/wechat.png | Bin 146556 -> 148820 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/wechat.png b/assets/wechat.png index 73b09da6843c87f46fc1af759df8e5cdde24c36c..0f97fa3eed73bd214bb34cc945b771b00c64a878 100644 GIT binary patch literal 148820 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
Telegram๏ผˆๆŽจๅฅจ๏ผ‰ @@ -376,6 +377,56 @@ picoclaw gateway
+
+LINE + +**1. LINE ๅ…ฌๅผใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ไฝœๆˆ** + +- [LINE Developers Console](https://developers.line.biz/) ใซใ‚ขใ‚ฏใ‚ปใ‚น +- ใƒ—ใƒญใƒใ‚คใƒ€ใƒผใ‚’ไฝœๆˆ โ†’ Messaging API ใƒใƒฃใƒใƒซใ‚’ไฝœๆˆ +- **ใƒใƒฃใƒใƒซใ‚ทใƒผใ‚ฏใƒฌใƒƒใƒˆ** ใจ **ใƒใƒฃใƒใƒซใ‚ขใ‚ฏใ‚ปใ‚นใƒˆใƒผใ‚ฏใƒณ** ใ‚’ใ‚ณใƒ”ใƒผ + +**2. ่จญๅฎš** + +```json +{ + "channels": { + "line": { + "enabled": true, + "channel_secret": "YOUR_CHANNEL_SECRET", + "channel_access_token": "YOUR_CHANNEL_ACCESS_TOKEN", + "webhook_host": "0.0.0.0", + "webhook_port": 18791, + "webhook_path": "/webhook/line", + "allow_from": [] + } + } +} +``` + +**3. Webhook URL ใ‚’่จญๅฎš** + +LINE ใฎ Webhook ใซใฏ HTTPS ใŒๅฟ…่ฆใงใ™ใ€‚ใƒชใƒใƒผใ‚นใƒ—ใƒญใ‚ญใ‚ทใพใŸใฏใƒˆใƒณใƒใƒซใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„: + +```bash +# ngrok ใฎไพ‹ +ngrok http 18791 +``` + +LINE Developers Console ใง Webhook URL ใ‚’ `https://ใ‚ใชใŸใฎใƒ‰ใƒกใ‚คใƒณ/webhook/line` ใซ่จญๅฎšใ—ใ€**Webhook ใฎๅˆฉ็”จ** ใ‚’ๆœ‰ๅŠนใซใ—ใฆใใ ใ•ใ„ใ€‚ + +**4. ่ตทๅ‹•** + +```bash +picoclaw gateway +``` + +> ใ‚ฐใƒซใƒผใƒ—ใƒใƒฃใƒƒใƒˆใงใฏ @ใƒกใƒณใ‚ทใƒงใƒณๆ™‚ใฎใฟๅฟœ็ญ”ใ—ใพใ™ใ€‚่ฟ”ไฟกใฏๅ…ƒใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅผ•็”จใ™ใ‚‹ๅฝขๅผใงใ™ใ€‚ + +> **Docker Compose**: `picoclaw-gateway` ใ‚ตใƒผใƒ“ใ‚นใซ `ports: ["18791:18791"]` ใ‚’่ฟฝๅŠ ใ—ใฆ Webhook ใƒใƒผใƒˆใ‚’ๅ…ฌ้–‹ใ—ใฆใใ ใ•ใ„ใ€‚ + +
+ ## โš™๏ธ ่จญๅฎš ่จญๅฎšใƒ•ใ‚กใ‚คใƒซ: `~/.picoclaw/config.json` diff --git a/README.md b/README.md index 536444bc5..9c505d912 100644 --- a/README.md +++ b/README.md @@ -242,14 +242,15 @@ That's it! You have a working AI assistant in 2 minutes. ## ๐Ÿ’ฌ Chat Apps -Talk to your picoclaw through Telegram, Discord, or DingTalk +Talk to your picoclaw through Telegram, Discord, DingTalk, or LINE -| Channel | Setup | -| ------------ | -------------------------- | -| **Telegram** | Easy (just a token) | -| **Discord** | Easy (bot token + intents) | -| **QQ** | Easy (AppID + AppSecret) | -| **DingTalk** | Medium (app credentials) | +| Channel | Setup | +| ------------ | ---------------------------------- | +| **Telegram** | Easy (just a token) | +| **Discord** | Easy (bot token + intents) | +| **QQ** | Easy (AppID + AppSecret) | +| **DingTalk** | Medium (app credentials) | +| **LINE** | Medium (credentials + webhook URL) |
Telegram (Recommended) @@ -399,6 +400,56 @@ picoclaw gateway
+
+LINE + +**1. Create a LINE Official Account** + +- Go to [LINE Developers Console](https://developers.line.biz/) +- Create a provider โ†’ Create a Messaging API channel +- Copy **Channel Secret** and **Channel Access Token** + +**2. Configure** + +```json +{ + "channels": { + "line": { + "enabled": true, + "channel_secret": "YOUR_CHANNEL_SECRET", + "channel_access_token": "YOUR_CHANNEL_ACCESS_TOKEN", + "webhook_host": "0.0.0.0", + "webhook_port": 18791, + "webhook_path": "/webhook/line", + "allow_from": [] + } + } +} +``` + +**3. Set up Webhook URL** + +LINE requires HTTPS for webhooks. Use a reverse proxy or tunnel: + +```bash +# Example with ngrok +ngrok http 18791 +``` + +Then set the Webhook URL in LINE Developers Console to `https://your-domain/webhook/line` and enable **Use webhook**. + +**4. Run** + +```bash +picoclaw gateway +``` + +> In group chats, the bot responds only when @mentioned. Replies quote the original message. + +> **Docker Compose**: Add `ports: ["18791:18791"]` to the `picoclaw-gateway` service to expose the webhook port. + +
+ ## ClawdChat Join the Agent Social Network Connect Picoclaw to the Agent Social Network simply by sending a single message via the CLI or any integrated Chat App. From afc3a2cda3e9bfa0ed065edd5e079c72e1c2048d Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sat, 14 Feb 2026 16:35:49 +0800 Subject: [PATCH 21/48] feat: add provider `deepseek` --- pkg/config/config.go | 1 + pkg/providers/http_provider.go | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/pkg/config/config.go b/pkg/config/config.go index 6af9438a5..653f32a68 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -161,6 +161,7 @@ type ProvidersConfig struct { Nvidia ProviderConfig `json:"nvidia"` Moonshot ProviderConfig `json:"moonshot"` ShengSuanYun ProviderConfig `json:"shengsuanyun"` + DeepSeek ProviderConfig `json:"deepseek"` } type ProviderConfig struct { diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index fc78a182f..78485b0b9 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -303,6 +303,14 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { workspace = "." } return NewClaudeCliProvider(workspace), nil + case "deepseek": + if cfg.Providers.DeepSeek.APIKey != "" { + apiKey = cfg.Providers.DeepSeek.APIKey + apiBase = cfg.Providers.DeepSeek.APIBase + if apiBase == "" { + apiBase = "https://api.deepseek.com/v1" + } + } } } From 18d3634f1b3fc25e60cce317d3fbc4de815d4d0f Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sat, 14 Feb 2026 16:47:46 +0800 Subject: [PATCH 22/48] feat: Improve parameter fault tolerance for DeepSeek --- pkg/providers/http_provider.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 78485b0b9..6fcbd3055 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -310,6 +310,9 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { if apiBase == "" { apiBase = "https://api.deepseek.com/v1" } + if model != "deepseek-chat" && model != "deepseek-reasoner" { + model = "deepseek-chat" + } } } } From 7fa641a2edb41bd69268112d8683ded97a65a767 Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 16:50:21 +0800 Subject: [PATCH 23/48] feat: add OneBot channel support --- config/config.example.json | 8 + pkg/channels/manager.go | 13 + pkg/channels/onebot.go | 677 +++++++++++++++++++++++++++++++++++++ pkg/config/config.go | 18 + 4 files changed, 716 insertions(+) create mode 100644 pkg/channels/onebot.go diff --git a/config/config.example.json b/config/config.example.json index ee3ac97f7..f7e88357f 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -60,6 +60,14 @@ "webhook_port": 18791, "webhook_path": "/webhook/line", "allow_from": [] + }, + "onebot": { + "enabled": false, + "ws_url": "ws://127.0.0.1:3001", + "access_token": "", + "reconnect_interval": 5, + "group_trigger_prefix": [], + "allow_from": [] } }, "providers": { diff --git a/pkg/channels/manager.go b/pkg/channels/manager.go index 69e9b2b43..15f8c6037 100644 --- a/pkg/channels/manager.go +++ b/pkg/channels/manager.go @@ -163,6 +163,19 @@ func (m *Manager) initChannels() error { } } + if m.config.Channels.OneBot.Enabled && m.config.Channels.OneBot.WSUrl != "" { + logger.DebugC("channels", "Attempting to initialize OneBot channel") + onebot, err := NewOneBotChannel(m.config.Channels.OneBot, m.bus) + if err != nil { + logger.ErrorCF("channels", "Failed to initialize OneBot channel", map[string]interface{}{ + "error": err.Error(), + }) + } else { + m.channels["onebot"] = onebot + logger.InfoC("channels", "OneBot channel enabled successfully") + } + } + logger.InfoCF("channels", "Channel initialization completed", map[string]interface{}{ "enabled_channels": len(m.channels), }) diff --git a/pkg/channels/onebot.go b/pkg/channels/onebot.go new file mode 100644 index 000000000..fe6edbeea --- /dev/null +++ b/pkg/channels/onebot.go @@ -0,0 +1,677 @@ +package channels + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "strings" + "sync" + "time" + + "github.com/gorilla/websocket" + + "github.com/sipeed/picoclaw/pkg/bus" + "github.com/sipeed/picoclaw/pkg/config" + "github.com/sipeed/picoclaw/pkg/logger" +) + +type OneBotChannel struct { + *BaseChannel + config config.OneBotConfig + conn *websocket.Conn + ctx context.Context + cancel context.CancelFunc + dedup map[string]struct{} + dedupRing []string + dedupIdx int + mu sync.Mutex + writeMu sync.Mutex + echoCounter int64 +} + + +type oneBotRawEvent struct { + PostType string `json:"post_type"` + MessageType string `json:"message_type"` + SubType string `json:"sub_type"` + MessageID json.RawMessage `json:"message_id"` + UserID json.RawMessage `json:"user_id"` + GroupID json.RawMessage `json:"group_id"` + RawMessage string `json:"raw_message"` + Message json.RawMessage `json:"message"` + Sender json.RawMessage `json:"sender"` + SelfID json.RawMessage `json:"self_id"` + Time json.RawMessage `json:"time"` + MetaEventType string `json:"meta_event_type"` + Echo string `json:"echo"` + RetCode json.RawMessage `json:"retcode"` + Status string `json:"status"` +} + +type oneBotSender struct { + UserID json.RawMessage `json:"user_id"` + Nickname string `json:"nickname"` + Card string `json:"card"` +} + +type oneBotEvent struct { + PostType string + MessageType string + SubType string + MessageID string + UserID int64 + GroupID int64 + Content string + RawContent string + IsBotMentioned bool + Sender oneBotSender + SelfID int64 + Time int64 + MetaEventType string +} + +type oneBotAPIRequest struct { + Action string `json:"action"` + Params interface{} `json:"params"` + Echo string `json:"echo,omitempty"` +} + +type oneBotSendPrivateMsgParams struct { + UserID int64 `json:"user_id"` + Message string `json:"message"` +} + +type oneBotSendGroupMsgParams struct { + GroupID int64 `json:"group_id"` + Message string `json:"message"` +} + +func NewOneBotChannel(cfg config.OneBotConfig, messageBus *bus.MessageBus) (*OneBotChannel, error) { + base := NewBaseChannel("onebot", cfg, messageBus, cfg.AllowFrom) + + const dedupSize = 1024 + return &OneBotChannel{ + BaseChannel: base, + config: cfg, + dedup: make(map[string]struct{}, dedupSize), + dedupRing: make([]string, dedupSize), + dedupIdx: 0, + }, nil +} + +func (c *OneBotChannel) Start(ctx context.Context) error { + if c.config.WSUrl == "" { + return fmt.Errorf("OneBot ws_url not configured") + } + + logger.InfoCF("onebot", "Starting OneBot channel", map[string]interface{}{ + "ws_url": c.config.WSUrl, + }) + + c.ctx, c.cancel = context.WithCancel(ctx) + + if err := c.connect(); err != nil { + return fmt.Errorf("failed to connect to OneBot: %w", err) + } + + go c.listen() + + if c.config.ReconnectInterval > 0 { + go c.reconnectLoop() + } + + c.setRunning(true) + logger.InfoC("onebot", "OneBot channel started successfully") + + return nil +} + +func (c *OneBotChannel) connect() error { + dialer := websocket.DefaultDialer + dialer.HandshakeTimeout = 10 * time.Second + + header := make(map[string][]string) + if c.config.AccessToken != "" { + header["Authorization"] = []string{"Bearer " + c.config.AccessToken} + } + + conn, _, err := dialer.Dial(c.config.WSUrl, header) + if err != nil { + return err + } + + c.mu.Lock() + c.conn = conn + c.mu.Unlock() + + logger.InfoC("onebot", "WebSocket connected") + return nil +} + +func (c *OneBotChannel) reconnectLoop() { + interval := time.Duration(c.config.ReconnectInterval) * time.Second + if interval < 5*time.Second { + interval = 5 * time.Second + } + + for { + select { + case <-c.ctx.Done(): + return + case <-time.After(interval): + c.mu.Lock() + conn := c.conn + c.mu.Unlock() + + if conn == nil { + logger.InfoC("onebot", "Attempting to reconnect...") + if err := c.connect(); err != nil { + logger.ErrorCF("onebot", "Reconnect failed", map[string]interface{}{ + "error": err.Error(), + }) + } else { + go c.listen() + } + } + } + } +} + +func (c *OneBotChannel) Stop(ctx context.Context) error { + logger.InfoC("onebot", "Stopping OneBot channel") + c.setRunning(false) + + if c.cancel != nil { + c.cancel() + } + + c.mu.Lock() + if c.conn != nil { + c.conn.Close() + c.conn = nil + } + c.mu.Unlock() + + return nil +} + +func (c *OneBotChannel) Send(ctx context.Context, msg bus.OutboundMessage) error { + if !c.IsRunning() { + return fmt.Errorf("OneBot channel not running") + } + + c.mu.Lock() + conn := c.conn + c.mu.Unlock() + + if conn == nil { + return fmt.Errorf("OneBot WebSocket not connected") + } + + action, params, err := c.buildSendRequest(msg) + if err != nil { + return err + } + + c.writeMu.Lock() + c.echoCounter++ + echo := fmt.Sprintf("send_%d", c.echoCounter) + c.writeMu.Unlock() + + req := oneBotAPIRequest{ + Action: action, + Params: params, + Echo: echo, + } + + data, err := json.Marshal(req) + if err != nil { + return fmt.Errorf("failed to marshal OneBot request: %w", err) + } + + c.writeMu.Lock() + err = conn.WriteMessage(websocket.TextMessage, data) + c.writeMu.Unlock() + + if err != nil { + logger.ErrorCF("onebot", "Failed to send message", map[string]interface{}{ + "error": err.Error(), + }) + return err + } + + return nil +} + +func (c *OneBotChannel) buildSendRequest(msg bus.OutboundMessage) (string, interface{}, error) { + chatID := msg.ChatID + + if len(chatID) > 6 && chatID[:6] == "group:" { + groupID, err := strconv.ParseInt(chatID[6:], 10, 64) + if err != nil { + return "", nil, fmt.Errorf("invalid group ID in chatID: %s", chatID) + } + return "send_group_msg", oneBotSendGroupMsgParams{ + GroupID: groupID, + Message: msg.Content, + }, nil + } + + if len(chatID) > 8 && chatID[:8] == "private:" { + userID, err := strconv.ParseInt(chatID[8:], 10, 64) + if err != nil { + return "", nil, fmt.Errorf("invalid user ID in chatID: %s", chatID) + } + return "send_private_msg", oneBotSendPrivateMsgParams{ + UserID: userID, + Message: msg.Content, + }, nil + } + + userID, err := strconv.ParseInt(chatID, 10, 64) + if err != nil { + return "", nil, fmt.Errorf("invalid chatID for OneBot: %s", chatID) + } + + return "send_private_msg", oneBotSendPrivateMsgParams{ + UserID: userID, + Message: msg.Content, + }, nil +} + +func (c *OneBotChannel) listen() { + logger.InfoC("onebot", "WebSocket listener started") + for { + select { + case <-c.ctx.Done(): + logger.InfoC("onebot", "WebSocket listener stopping (context cancelled)") + return + default: + c.mu.Lock() + conn := c.conn + c.mu.Unlock() + + if conn == nil { + logger.WarnC("onebot", "WebSocket connection is nil, listener exiting") + return + } + + _, message, err := conn.ReadMessage() + if err != nil { + logger.ErrorCF("onebot", "WebSocket read error", map[string]interface{}{ + "error": err.Error(), + }) + c.mu.Lock() + if c.conn != nil { + c.conn.Close() + c.conn = nil + } + c.mu.Unlock() + return + } + + logger.DebugCF("onebot", "Raw WebSocket message received", map[string]interface{}{ + "length": len(message), + "payload": string(message), + }) + + var raw oneBotRawEvent + if err := json.Unmarshal(message, &raw); err != nil { + logger.WarnCF("onebot", "Failed to unmarshal raw event", map[string]interface{}{ + "error": err.Error(), + "payload": string(message), + }) + continue + } + + if raw.Echo != "" || raw.Status != "" { + logger.DebugCF("onebot", "Received API response, skipping", map[string]interface{}{ + "echo": raw.Echo, + "status": raw.Status, + }) + continue + } + + logger.DebugCF("onebot", "Parsed raw event", map[string]interface{}{ + "post_type": raw.PostType, + "message_type": raw.MessageType, + "sub_type": raw.SubType, + "meta_event_type": raw.MetaEventType, + }) + + c.handleRawEvent(&raw) + } + } +} + +func parseJSONInt64(raw json.RawMessage) (int64, error) { + if len(raw) == 0 { + return 0, nil + } + + var n int64 + if err := json.Unmarshal(raw, &n); err == nil { + return n, nil + } + + var s string + if err := json.Unmarshal(raw, &s); err == nil { + return strconv.ParseInt(s, 10, 64) + } + return 0, fmt.Errorf("cannot parse as int64: %s", string(raw)) +} + +func parseJSONString(raw json.RawMessage) string { + if len(raw) == 0 { + return "" + } + var s string + if err := json.Unmarshal(raw, &s); err == nil { + return s + } + + return string(raw) +} + +type parseMessageResult struct { + Text string + IsBotMentioned bool +} + +func parseMessageContentEx(raw json.RawMessage, selfID int64) parseMessageResult { + if len(raw) == 0 { + return parseMessageResult{} + } + + var s string + if err := json.Unmarshal(raw, &s); err == nil { + mentioned := false + if selfID > 0 { + cqAt := fmt.Sprintf("[CQ:at,qq=%d]", selfID) + if strings.Contains(s, cqAt) { + mentioned = true + s = strings.ReplaceAll(s, cqAt, "") + s = strings.TrimSpace(s) + } + } + return parseMessageResult{Text: s, IsBotMentioned: mentioned} + } + + var segments []map[string]interface{} + if err := json.Unmarshal(raw, &segments); err == nil { + var text string + mentioned := false + selfIDStr := strconv.FormatInt(selfID, 10) + for _, seg := range segments { + segType, _ := seg["type"].(string) + data, _ := seg["data"].(map[string]interface{}) + switch segType { + case "text": + if data != nil { + if t, ok := data["text"].(string); ok { + text += t + } + } + case "at": + if data != nil && selfID > 0 { + qqVal := fmt.Sprintf("%v", data["qq"]) + if qqVal == selfIDStr || qqVal == "all" { + mentioned = true + } + } + } + } + return parseMessageResult{Text: strings.TrimSpace(text), IsBotMentioned: mentioned} + } + return parseMessageResult{} +} + +func (c *OneBotChannel) handleRawEvent(raw *oneBotRawEvent) { + switch raw.PostType { + case "message": + evt, err := c.normalizeMessageEvent(raw) + if err != nil { + logger.WarnCF("onebot", "Failed to normalize message event", map[string]interface{}{ + "error": err.Error(), + }) + return + } + c.handleMessage(evt) + case "meta_event": + c.handleMetaEvent(raw) + case "notice": + logger.DebugCF("onebot", "Notice event received", map[string]interface{}{ + "sub_type": raw.SubType, + }) + case "request": + logger.DebugCF("onebot", "Request event received", map[string]interface{}{ + "sub_type": raw.SubType, + }) + case "": + logger.DebugCF("onebot", "Event with empty post_type (possibly API response)", map[string]interface{}{ + "echo": raw.Echo, + "status": raw.Status, + }) + default: + logger.DebugCF("onebot", "Unknown post_type", map[string]interface{}{ + "post_type": raw.PostType, + }) + } +} + +func (c *OneBotChannel) normalizeMessageEvent(raw *oneBotRawEvent) (*oneBotEvent, error) { + userID, err := parseJSONInt64(raw.UserID) + if err != nil { + return nil, fmt.Errorf("parse user_id: %w (raw: %s)", err, string(raw.UserID)) + } + + groupID, _ := parseJSONInt64(raw.GroupID) + selfID, _ := parseJSONInt64(raw.SelfID) + ts, _ := parseJSONInt64(raw.Time) + messageID := parseJSONString(raw.MessageID) + + parsed := parseMessageContentEx(raw.Message, selfID) + isBotMentioned := parsed.IsBotMentioned + + content := raw.RawMessage + if content == "" { + content = parsed.Text + } else if selfID > 0 { + cqAt := fmt.Sprintf("[CQ:at,qq=%d]", selfID) + if strings.Contains(content, cqAt) { + isBotMentioned = true + content = strings.ReplaceAll(content, cqAt, "") + content = strings.TrimSpace(content) + } + } + + var sender oneBotSender + if len(raw.Sender) > 0 { + if err := json.Unmarshal(raw.Sender, &sender); err != nil { + logger.WarnCF("onebot", "Failed to parse sender", map[string]interface{}{ + "error": err.Error(), + "sender": string(raw.Sender), + }) + } + } + + logger.DebugCF("onebot", "Normalized message event", map[string]interface{}{ + "message_type": raw.MessageType, + "user_id": userID, + "group_id": groupID, + "message_id": messageID, + "content_len": len(content), + "nickname": sender.Nickname, + }) + + return &oneBotEvent{ + PostType: raw.PostType, + MessageType: raw.MessageType, + SubType: raw.SubType, + MessageID: messageID, + UserID: userID, + GroupID: groupID, + Content: content, + RawContent: raw.RawMessage, + IsBotMentioned: isBotMentioned, + Sender: sender, + SelfID: selfID, + Time: ts, + MetaEventType: raw.MetaEventType, + }, nil +} + +func (c *OneBotChannel) handleMetaEvent(raw *oneBotRawEvent) { + switch raw.MetaEventType { + case "lifecycle": + logger.InfoCF("onebot", "Lifecycle event", map[string]interface{}{ + "sub_type": raw.SubType, + }) + case "heartbeat": + logger.DebugC("onebot", "Heartbeat received") + default: + logger.DebugCF("onebot", "Unknown meta_event_type", map[string]interface{}{ + "meta_event_type": raw.MetaEventType, + }) + } +} + +func (c *OneBotChannel) handleMessage(evt *oneBotEvent) { + if c.isDuplicate(evt.MessageID) { + logger.DebugCF("onebot", "Duplicate message, skipping", map[string]interface{}{ + "message_id": evt.MessageID, + }) + return + } + + content := evt.Content + if content == "" { + logger.DebugCF("onebot", "Received empty message, ignoring", map[string]interface{}{ + "message_id": evt.MessageID, + }) + return + } + + senderID := strconv.FormatInt(evt.UserID, 10) + var chatID string + + metadata := map[string]string{ + "message_id": evt.MessageID, + } + + switch evt.MessageType { + case "private": + chatID = "private:" + senderID + logger.InfoCF("onebot", "Received private message", map[string]interface{}{ + "sender": senderID, + "message_id": evt.MessageID, + "length": len(content), + "content": truncate(content, 100), + }) + + case "group": + groupIDStr := strconv.FormatInt(evt.GroupID, 10) + chatID = "group:" + groupIDStr + metadata["group_id"] = groupIDStr + + senderUserID, _ := parseJSONInt64(evt.Sender.UserID) + if senderUserID > 0 { + metadata["sender_user_id"] = strconv.FormatInt(senderUserID, 10) + } + + if evt.Sender.Card != "" { + metadata["sender_name"] = evt.Sender.Card + } else if evt.Sender.Nickname != "" { + metadata["sender_name"] = evt.Sender.Nickname + } + + triggered, strippedContent := c.checkGroupTrigger(content, evt.IsBotMentioned) + if !triggered { + logger.DebugCF("onebot", "Group message ignored (no trigger)", map[string]interface{}{ + "sender": senderID, + "group": groupIDStr, + "is_mentioned": evt.IsBotMentioned, + "content": truncate(content, 100), + }) + return + } + content = strippedContent + + logger.InfoCF("onebot", "Received group message", map[string]interface{}{ + "sender": senderID, + "group": groupIDStr, + "message_id": evt.MessageID, + "is_mentioned": evt.IsBotMentioned, + "length": len(content), + "content": truncate(content, 100), + }) + + default: + logger.WarnCF("onebot", "Unknown message type, cannot route", map[string]interface{}{ + "type": evt.MessageType, + "message_id": evt.MessageID, + "user_id": evt.UserID, + }) + return + } + + if evt.Sender.Nickname != "" { + metadata["nickname"] = evt.Sender.Nickname + } + + logger.DebugCF("onebot", "Forwarding message to bus", map[string]interface{}{ + "sender_id": senderID, + "chat_id": chatID, + "content": truncate(content, 100), + }) + + c.HandleMessage(senderID, chatID, content, []string{}, metadata) +} + +func (c *OneBotChannel) isDuplicate(messageID string) bool { + if messageID == "" || messageID == "0" { + return false + } + + c.mu.Lock() + defer c.mu.Unlock() + + if _, exists := c.dedup[messageID]; exists { + return true + } + + if old := c.dedupRing[c.dedupIdx]; old != "" { + delete(c.dedup, old) + } + c.dedupRing[c.dedupIdx] = messageID + c.dedup[messageID] = struct{}{} + c.dedupIdx = (c.dedupIdx + 1) % len(c.dedupRing) + + return false +} + +func truncate(s string, n int) string { + runes := []rune(s) + if len(runes) <= n { + return s + } + return string(runes[:n]) + "..." +} + +func (c *OneBotChannel) checkGroupTrigger(content string, isBotMentioned bool) (triggered bool, strippedContent string) { + if isBotMentioned { + return true, strings.TrimSpace(content) + } + + for _, prefix := range c.config.GroupTriggerPrefix { + if prefix == "" { + continue + } + if strings.HasPrefix(content, prefix) { + return true, strings.TrimSpace(strings.TrimPrefix(content, prefix)) + } + } + + return false, content +} diff --git a/pkg/config/config.go b/pkg/config/config.go index 6af9438a5..03dfe3133 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -77,6 +77,7 @@ type ChannelsConfig struct { DingTalk DingTalkConfig `json:"dingtalk"` Slack SlackConfig `json:"slack"` LINE LINEConfig `json:"line"` + OneBot OneBotConfig `json:"onebot"` } type WhatsAppConfig struct { @@ -145,6 +146,15 @@ type LINEConfig struct { AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_LINE_ALLOW_FROM"` } +type OneBotConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_ONEBOT_ENABLED"` + WSUrl string `json:"ws_url" env:"PICOCLAW_CHANNELS_ONEBOT_WS_URL"` + AccessToken string `json:"access_token" env:"PICOCLAW_CHANNELS_ONEBOT_ACCESS_TOKEN"` + ReconnectInterval int `json:"reconnect_interval" env:"PICOCLAW_CHANNELS_ONEBOT_RECONNECT_INTERVAL"` + GroupTriggerPrefix []string `json:"group_trigger_prefix" env:"PICOCLAW_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"` + AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_ONEBOT_ALLOW_FROM"` +} + type HeartbeatConfig struct { Enabled bool `json:"enabled" env:"PICOCLAW_HEARTBEAT_ENABLED"` Interval int `json:"interval" env:"PICOCLAW_HEARTBEAT_INTERVAL"` // minutes, min 5 @@ -265,6 +275,14 @@ func DefaultConfig() *Config { WebhookPath: "/webhook/line", AllowFrom: FlexibleStringSlice{}, }, + OneBot: OneBotConfig{ + Enabled: false, + WSUrl: "ws://127.0.0.1:3001", + AccessToken: "", + ReconnectInterval: 5, + GroupTriggerPrefix: []string{}, + AllowFrom: FlexibleStringSlice{}, + }, }, Providers: ProvidersConfig{ Anthropic: ProviderConfig{}, From 2720fa71c78d61733ba8ff26af8f66bf86f7468f Mon Sep 17 00:00:00 2001 From: karan Date: Sat, 14 Feb 2026 14:23:17 +0530 Subject: [PATCH 24/48] add I2C and SPI tools for hardware interaction (#140) * add I2C and SPI tools for hardware interaction - Implemented I2CTool for I2C bus interaction, including device scanning, reading, and writing. - Implemented SPITool for SPI bus communication, supporting device listing, data transfer, and reading. - Added platform-specific implementations for Linux and stubs for non-Linux platforms. - Updated agent loop to register new I2C and SPI tools. - Created documentation for hardware skills, including usage examples and pinmux setup instructions. * Remove build constraints for Linux from I2C and SPI tool files. --- pkg/agent/loop.go | 4 + pkg/tools/i2c.go | 147 ++++++++++ pkg/tools/i2c_linux.go | 282 +++++++++++++++++++ pkg/tools/i2c_other.go | 18 ++ pkg/tools/spi.go | 156 ++++++++++ pkg/tools/spi_linux.go | 196 +++++++++++++ pkg/tools/spi_other.go | 13 + skills/hardware/SKILL.md | 64 +++++ skills/hardware/references/board-pinout.md | 131 +++++++++ skills/hardware/references/common-devices.md | 78 +++++ 10 files changed, 1089 insertions(+) create mode 100644 pkg/tools/i2c.go create mode 100644 pkg/tools/i2c_linux.go create mode 100644 pkg/tools/i2c_other.go create mode 100644 pkg/tools/spi.go create mode 100644 pkg/tools/spi_linux.go create mode 100644 pkg/tools/spi_other.go create mode 100644 skills/hardware/SKILL.md create mode 100644 skills/hardware/references/board-pinout.md create mode 100644 skills/hardware/references/common-devices.md diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index ac8da9ffd..73e837119 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -81,6 +81,10 @@ func createToolRegistry(workspace string, restrict bool, cfg *config.Config, msg } registry.Register(tools.NewWebFetchTool(50000)) + // Hardware tools (I2C, SPI) - Linux only, returns error on other platforms + registry.Register(tools.NewI2CTool()) + registry.Register(tools.NewSPITool()) + // Message tool - available to both agent and subagent // Subagent uses it to communicate directly with user messageTool := tools.NewMessageTool() diff --git a/pkg/tools/i2c.go b/pkg/tools/i2c.go new file mode 100644 index 000000000..abca5ec1e --- /dev/null +++ b/pkg/tools/i2c.go @@ -0,0 +1,147 @@ +package tools + +import ( + "context" + "encoding/json" + "fmt" + "path/filepath" + "regexp" + "runtime" +) + +// I2CTool provides I2C bus interaction for reading sensors and controlling peripherals. +type I2CTool struct{} + +func NewI2CTool() *I2CTool { + return &I2CTool{} +} + +func (t *I2CTool) Name() string { + return "i2c" +} + +func (t *I2CTool) Description() string { + return "Interact with I2C bus devices for reading sensors and controlling peripherals. Actions: detect (list buses), scan (find devices on a bus), read (read bytes from device), write (send bytes to device). Linux only." +} + +func (t *I2CTool) Parameters() map[string]interface{} { + return map[string]interface{}{ + "type": "object", + "properties": map[string]interface{}{ + "action": map[string]interface{}{ + "type": "string", + "enum": []string{"detect", "scan", "read", "write"}, + "description": "Action to perform: detect (list available I2C buses), scan (find devices on a bus), read (read bytes from a device), write (send bytes to a device)", + }, + "bus": map[string]interface{}{ + "type": "string", + "description": "I2C bus number (e.g. \"1\" for /dev/i2c-1). Required for scan/read/write.", + }, + "address": map[string]interface{}{ + "type": "integer", + "description": "7-bit I2C device address (0x03-0x77). Required for read/write.", + }, + "register": map[string]interface{}{ + "type": "integer", + "description": "Register address to read from or write to. If set, sends register byte before read/write.", + }, + "data": map[string]interface{}{ + "type": "array", + "items": map[string]interface{}{"type": "integer"}, + "description": "Bytes to write (0-255 each). Required for write action.", + }, + "length": map[string]interface{}{ + "type": "integer", + "description": "Number of bytes to read (1-256). Default: 1. Used with read action.", + }, + "confirm": map[string]interface{}{ + "type": "boolean", + "description": "Must be true for write operations. Safety guard to prevent accidental writes.", + }, + }, + "required": []string{"action"}, + } +} + +func (t *I2CTool) Execute(ctx context.Context, args map[string]interface{}) *ToolResult { + if runtime.GOOS != "linux" { + return ErrorResult("I2C is only supported on Linux. This tool requires /dev/i2c-* device files.") + } + + action, ok := args["action"].(string) + if !ok { + return ErrorResult("action is required") + } + + switch action { + case "detect": + return t.detect() + case "scan": + return t.scan(args) + case "read": + return t.readDevice(args) + case "write": + return t.writeDevice(args) + default: + return ErrorResult(fmt.Sprintf("unknown action: %s (valid: detect, scan, read, write)", action)) + } +} + +// detect lists available I2C buses by globbing /dev/i2c-* +func (t *I2CTool) detect() *ToolResult { + matches, err := filepath.Glob("/dev/i2c-*") + if err != nil { + return ErrorResult(fmt.Sprintf("failed to scan for I2C buses: %v", err)) + } + + if len(matches) == 0 { + return SilentResult("No I2C buses found. You may need to:\n1. Load the i2c-dev module: modprobe i2c-dev\n2. Check that I2C is enabled in device tree\n3. Configure pinmux for your board (see hardware skill)") + } + + type busInfo struct { + Path string `json:"path"` + Bus string `json:"bus"` + } + + buses := make([]busInfo, 0, len(matches)) + re := regexp.MustCompile(`/dev/i2c-(\d+)`) + for _, m := range matches { + if sub := re.FindStringSubmatch(m); sub != nil { + buses = append(buses, busInfo{Path: m, Bus: sub[1]}) + } + } + + result, _ := json.MarshalIndent(buses, "", " ") + return SilentResult(fmt.Sprintf("Found %d I2C bus(es):\n%s", len(buses), string(result))) +} + +// isValidBusID checks that a bus identifier is a simple number (prevents path injection) +func isValidBusID(id string) bool { + matched, _ := regexp.MatchString(`^\d+$`, id) + return matched +} + +// parseI2CAddress extracts and validates an I2C address from args +func parseI2CAddress(args map[string]interface{}) (int, *ToolResult) { + addrFloat, ok := args["address"].(float64) + if !ok { + return 0, ErrorResult("address is required (e.g. 0x38 for AHT20)") + } + addr := int(addrFloat) + if addr < 0x03 || addr > 0x77 { + return 0, ErrorResult("address must be in valid 7-bit range (0x03-0x77)") + } + return addr, nil +} + +// parseI2CBus extracts and validates an I2C bus from args +func parseI2CBus(args map[string]interface{}) (string, *ToolResult) { + bus, ok := args["bus"].(string) + if !ok || bus == "" { + return "", ErrorResult("bus is required (e.g. \"1\" for /dev/i2c-1)") + } + if !isValidBusID(bus) { + return "", ErrorResult("invalid bus identifier: must be a number (e.g. \"1\")") + } + return bus, nil +} diff --git a/pkg/tools/i2c_linux.go b/pkg/tools/i2c_linux.go new file mode 100644 index 000000000..294f7ecbc --- /dev/null +++ b/pkg/tools/i2c_linux.go @@ -0,0 +1,282 @@ +package tools + +import ( + "encoding/json" + "fmt" + "syscall" + "unsafe" +) + +// I2C ioctl constants from Linux kernel headers (, ) +const ( + i2cSlave = 0x0703 // Set slave address (fails if in use by driver) + i2cFuncs = 0x0705 // Query adapter functionality bitmask + i2cSmbus = 0x0720 // Perform SMBus transaction + + // I2C_FUNC capability bits + i2cFuncSmbusQuick = 0x00010000 + i2cFuncSmbusReadByte = 0x00020000 + + // SMBus transaction types + i2cSmbusRead = 0 + i2cSmbusWrite = 1 + + // SMBus protocol sizes + i2cSmbusQuick = 0 + i2cSmbusByte = 1 +) + +// i2cSmbusData matches the kernel union i2c_smbus_data (34 bytes max). +// For quick and byte transactions only the first byte is used (if at all). +type i2cSmbusData [34]byte + +// i2cSmbusArgs matches the kernel struct i2c_smbus_ioctl_data. +type i2cSmbusArgs struct { + readWrite uint8 + command uint8 + size uint32 + data *i2cSmbusData +} + +// smbusProbe performs a single SMBus probe at the given address. +// Uses SMBus Quick Write (safest) or falls back to SMBus Read Byte for +// EEPROM address ranges where quick write can corrupt AT24RF08 chips. +// This matches i2cdetect's MODE_AUTO behavior. +func smbusProbe(fd int, addr int, hasQuick bool) bool { + // EEPROM ranges: use read byte (quick write can corrupt AT24RF08) + useReadByte := (addr >= 0x30 && addr <= 0x37) || (addr >= 0x50 && addr <= 0x5F) + + if !useReadByte && hasQuick { + // SMBus Quick Write: [START] [ADDR|W] [ACK/NACK] [STOP] + // Safest probe โ€” no data transferred + args := i2cSmbusArgs{ + readWrite: i2cSmbusWrite, + command: 0, + size: i2cSmbusQuick, + data: nil, + } + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), i2cSmbus, uintptr(unsafe.Pointer(&args))) + return errno == 0 + } + + // SMBus Read Byte: [START] [ADDR|R] [ACK/NACK] [DATA] [STOP] + var data i2cSmbusData + args := i2cSmbusArgs{ + readWrite: i2cSmbusRead, + command: 0, + size: i2cSmbusByte, + data: &data, + } + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), i2cSmbus, uintptr(unsafe.Pointer(&args))) + return errno == 0 +} + +// scan probes valid 7-bit addresses on a bus for connected devices. +// Uses the same hybrid probe strategy as i2cdetect's MODE_AUTO: +// SMBus Quick Write for most addresses, SMBus Read Byte for EEPROM ranges. +func (t *I2CTool) scan(args map[string]interface{}) *ToolResult { + bus, errResult := parseI2CBus(args) + if errResult != nil { + return errResult + } + + devPath := fmt.Sprintf("/dev/i2c-%s", bus) + fd, err := syscall.Open(devPath, syscall.O_RDWR, 0) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to open %s: %v (check permissions and i2c-dev module)", devPath, err)) + } + defer syscall.Close(fd) + + // Query adapter capabilities to determine available probe methods. + // I2C_FUNCS writes an unsigned long, which is word-sized on Linux. + var funcs uintptr + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), i2cFuncs, uintptr(unsafe.Pointer(&funcs))) + if errno != 0 { + return ErrorResult(fmt.Sprintf("failed to query I2C adapter capabilities on %s: %v", devPath, errno)) + } + + hasQuick := funcs&i2cFuncSmbusQuick != 0 + hasReadByte := funcs&i2cFuncSmbusReadByte != 0 + + if !hasQuick && !hasReadByte { + return ErrorResult(fmt.Sprintf("I2C adapter %s supports neither SMBus Quick nor Read Byte โ€” cannot probe safely", devPath)) + } + + type deviceEntry struct { + Address string `json:"address"` + Status string `json:"status,omitempty"` + } + + var found []deviceEntry + // Scan 0x08-0x77, skipping I2C reserved addresses 0x00-0x07 + for addr := 0x08; addr <= 0x77; addr++ { + // Set slave address โ€” EBUSY means a kernel driver owns this address + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), i2cSlave, uintptr(addr)) + if errno != 0 { + if errno == syscall.EBUSY { + found = append(found, deviceEntry{ + Address: fmt.Sprintf("0x%02x", addr), + Status: "busy (in use by kernel driver)", + }) + } + continue + } + + if smbusProbe(fd, addr, hasQuick) { + found = append(found, deviceEntry{ + Address: fmt.Sprintf("0x%02x", addr), + }) + } + } + + if len(found) == 0 { + return SilentResult(fmt.Sprintf("No devices found on %s. Check wiring and pull-up resistors.", devPath)) + } + + result, _ := json.MarshalIndent(map[string]interface{}{ + "bus": devPath, + "devices": found, + "count": len(found), + }, "", " ") + return SilentResult(fmt.Sprintf("Scan of %s:\n%s", devPath, string(result))) +} + +// readDevice reads bytes from an I2C device, optionally at a specific register +func (t *I2CTool) readDevice(args map[string]interface{}) *ToolResult { + bus, errResult := parseI2CBus(args) + if errResult != nil { + return errResult + } + + addr, errResult := parseI2CAddress(args) + if errResult != nil { + return errResult + } + + length := 1 + if l, ok := args["length"].(float64); ok { + length = int(l) + } + if length < 1 || length > 256 { + return ErrorResult("length must be between 1 and 256") + } + + devPath := fmt.Sprintf("/dev/i2c-%s", bus) + fd, err := syscall.Open(devPath, syscall.O_RDWR, 0) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to open %s: %v", devPath, err)) + } + defer syscall.Close(fd) + + // Set slave address + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), i2cSlave, uintptr(addr)) + if errno != 0 { + return ErrorResult(fmt.Sprintf("failed to set I2C address 0x%02x: %v", addr, errno)) + } + + // If register is specified, write it first + if regFloat, ok := args["register"].(float64); ok { + reg := int(regFloat) + if reg < 0 || reg > 255 { + return ErrorResult("register must be between 0x00 and 0xFF") + } + _, err := syscall.Write(fd, []byte{byte(reg)}) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to write register 0x%02x: %v", reg, err)) + } + } + + // Read data + buf := make([]byte, length) + n, err := syscall.Read(fd, buf) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to read from device 0x%02x: %v", addr, err)) + } + + // Format as hex bytes + hexBytes := make([]string, n) + intBytes := make([]int, n) + for i := 0; i < n; i++ { + hexBytes[i] = fmt.Sprintf("0x%02x", buf[i]) + intBytes[i] = int(buf[i]) + } + + result, _ := json.MarshalIndent(map[string]interface{}{ + "bus": devPath, + "address": fmt.Sprintf("0x%02x", addr), + "bytes": intBytes, + "hex": hexBytes, + "length": n, + }, "", " ") + return SilentResult(string(result)) +} + +// writeDevice writes bytes to an I2C device, optionally at a specific register +func (t *I2CTool) writeDevice(args map[string]interface{}) *ToolResult { + confirm, _ := args["confirm"].(bool) + if !confirm { + return ErrorResult("write operations require confirm: true. Please confirm with the user before writing to I2C devices, as incorrect writes can misconfigure hardware.") + } + + bus, errResult := parseI2CBus(args) + if errResult != nil { + return errResult + } + + addr, errResult := parseI2CAddress(args) + if errResult != nil { + return errResult + } + + dataRaw, ok := args["data"].([]interface{}) + if !ok || len(dataRaw) == 0 { + return ErrorResult("data is required for write (array of byte values 0-255)") + } + if len(dataRaw) > 256 { + return ErrorResult("data too long: maximum 256 bytes per I2C transaction") + } + + data := make([]byte, 0, len(dataRaw)+1) + + // If register is specified, prepend it to the data + if regFloat, ok := args["register"].(float64); ok { + reg := int(regFloat) + if reg < 0 || reg > 255 { + return ErrorResult("register must be between 0x00 and 0xFF") + } + data = append(data, byte(reg)) + } + + for i, v := range dataRaw { + f, ok := v.(float64) + if !ok { + return ErrorResult(fmt.Sprintf("data[%d] is not a valid byte value", i)) + } + b := int(f) + if b < 0 || b > 255 { + return ErrorResult(fmt.Sprintf("data[%d] = %d is out of byte range (0-255)", i, b)) + } + data = append(data, byte(b)) + } + + devPath := fmt.Sprintf("/dev/i2c-%s", bus) + fd, err := syscall.Open(devPath, syscall.O_RDWR, 0) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to open %s: %v", devPath, err)) + } + defer syscall.Close(fd) + + // Set slave address + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), i2cSlave, uintptr(addr)) + if errno != 0 { + return ErrorResult(fmt.Sprintf("failed to set I2C address 0x%02x: %v", addr, errno)) + } + + // Write data + n, err := syscall.Write(fd, data) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to write to device 0x%02x: %v", addr, err)) + } + + return SilentResult(fmt.Sprintf("Wrote %d byte(s) to device 0x%02x on %s", n, addr, devPath)) +} diff --git a/pkg/tools/i2c_other.go b/pkg/tools/i2c_other.go new file mode 100644 index 000000000..d1d581348 --- /dev/null +++ b/pkg/tools/i2c_other.go @@ -0,0 +1,18 @@ +//go:build !linux + +package tools + +// scan is a stub for non-Linux platforms. +func (t *I2CTool) scan(args map[string]interface{}) *ToolResult { + return ErrorResult("I2C is only supported on Linux") +} + +// readDevice is a stub for non-Linux platforms. +func (t *I2CTool) readDevice(args map[string]interface{}) *ToolResult { + return ErrorResult("I2C is only supported on Linux") +} + +// writeDevice is a stub for non-Linux platforms. +func (t *I2CTool) writeDevice(args map[string]interface{}) *ToolResult { + return ErrorResult("I2C is only supported on Linux") +} diff --git a/pkg/tools/spi.go b/pkg/tools/spi.go new file mode 100644 index 000000000..4805d6a35 --- /dev/null +++ b/pkg/tools/spi.go @@ -0,0 +1,156 @@ +package tools + +import ( + "context" + "encoding/json" + "fmt" + "path/filepath" + "regexp" + "runtime" +) + +// SPITool provides SPI bus interaction for high-speed peripheral communication. +type SPITool struct{} + +func NewSPITool() *SPITool { + return &SPITool{} +} + +func (t *SPITool) Name() string { + return "spi" +} + +func (t *SPITool) Description() string { + return "Interact with SPI bus devices for high-speed peripheral communication. Actions: list (find SPI devices), transfer (full-duplex send/receive), read (receive bytes). Linux only." +} + +func (t *SPITool) Parameters() map[string]interface{} { + return map[string]interface{}{ + "type": "object", + "properties": map[string]interface{}{ + "action": map[string]interface{}{ + "type": "string", + "enum": []string{"list", "transfer", "read"}, + "description": "Action to perform: list (find available SPI devices), transfer (full-duplex send/receive), read (receive bytes by sending zeros)", + }, + "device": map[string]interface{}{ + "type": "string", + "description": "SPI device identifier (e.g. \"2.0\" for /dev/spidev2.0). Required for transfer/read.", + }, + "speed": map[string]interface{}{ + "type": "integer", + "description": "SPI clock speed in Hz. Default: 1000000 (1 MHz).", + }, + "mode": map[string]interface{}{ + "type": "integer", + "description": "SPI mode (0-3). Default: 0. Mode sets CPOL and CPHA: 0=0,0 1=0,1 2=1,0 3=1,1.", + }, + "bits": map[string]interface{}{ + "type": "integer", + "description": "Bits per word. Default: 8.", + }, + "data": map[string]interface{}{ + "type": "array", + "items": map[string]interface{}{"type": "integer"}, + "description": "Bytes to send (0-255 each). Required for transfer action.", + }, + "length": map[string]interface{}{ + "type": "integer", + "description": "Number of bytes to read (1-4096). Required for read action.", + }, + "confirm": map[string]interface{}{ + "type": "boolean", + "description": "Must be true for transfer operations. Safety guard to prevent accidental writes.", + }, + }, + "required": []string{"action"}, + } +} + +func (t *SPITool) Execute(ctx context.Context, args map[string]interface{}) *ToolResult { + if runtime.GOOS != "linux" { + return ErrorResult("SPI is only supported on Linux. This tool requires /dev/spidev* device files.") + } + + action, ok := args["action"].(string) + if !ok { + return ErrorResult("action is required") + } + + switch action { + case "list": + return t.list() + case "transfer": + return t.transfer(args) + case "read": + return t.readDevice(args) + default: + return ErrorResult(fmt.Sprintf("unknown action: %s (valid: list, transfer, read)", action)) + } +} + +// list finds available SPI devices by globbing /dev/spidev* +func (t *SPITool) list() *ToolResult { + matches, err := filepath.Glob("/dev/spidev*") + if err != nil { + return ErrorResult(fmt.Sprintf("failed to scan for SPI devices: %v", err)) + } + + if len(matches) == 0 { + return SilentResult("No SPI devices found. You may need to:\n1. Enable SPI in device tree\n2. Configure pinmux for your board (see hardware skill)\n3. Check that spidev module is loaded") + } + + type devInfo struct { + Path string `json:"path"` + Device string `json:"device"` + } + + devices := make([]devInfo, 0, len(matches)) + re := regexp.MustCompile(`/dev/spidev(\d+\.\d+)`) + for _, m := range matches { + if sub := re.FindStringSubmatch(m); sub != nil { + devices = append(devices, devInfo{Path: m, Device: sub[1]}) + } + } + + result, _ := json.MarshalIndent(devices, "", " ") + return SilentResult(fmt.Sprintf("Found %d SPI device(s):\n%s", len(devices), string(result))) +} + +// parseSPIArgs extracts and validates common SPI parameters +func parseSPIArgs(args map[string]interface{}) (device string, speed uint32, mode uint8, bits uint8, errMsg string) { + dev, ok := args["device"].(string) + if !ok || dev == "" { + return "", 0, 0, 0, "device is required (e.g. \"2.0\" for /dev/spidev2.0)" + } + matched, _ := regexp.MatchString(`^\d+\.\d+$`, dev) + if !matched { + return "", 0, 0, 0, "invalid device identifier: must be in format \"X.Y\" (e.g. \"2.0\")" + } + + speed = 1000000 // default 1 MHz + if s, ok := args["speed"].(float64); ok { + if s < 1 || s > 125000000 { + return "", 0, 0, 0, "speed must be between 1 Hz and 125 MHz" + } + speed = uint32(s) + } + + mode = 0 + if m, ok := args["mode"].(float64); ok { + if int(m) < 0 || int(m) > 3 { + return "", 0, 0, 0, "mode must be 0-3" + } + mode = uint8(m) + } + + bits = 8 + if b, ok := args["bits"].(float64); ok { + if int(b) < 1 || int(b) > 32 { + return "", 0, 0, 0, "bits must be between 1 and 32" + } + bits = uint8(b) + } + + return dev, speed, mode, bits, "" +} diff --git a/pkg/tools/spi_linux.go b/pkg/tools/spi_linux.go new file mode 100644 index 000000000..12b696007 --- /dev/null +++ b/pkg/tools/spi_linux.go @@ -0,0 +1,196 @@ +package tools + +import ( + "encoding/json" + "fmt" + "runtime" + "syscall" + "unsafe" +) + +// SPI ioctl constants from Linux kernel headers. +// Calculated from _IOW('k', nr, size) macro: +// +// direction(1)<<30 | size<<16 | type(0x6B)<<8 | nr +const ( + spiIocWrMode = 0x40016B01 // _IOW('k', 1, __u8) + spiIocWrBitsPerWord = 0x40016B03 // _IOW('k', 3, __u8) + spiIocWrMaxSpeedHz = 0x40046B04 // _IOW('k', 4, __u32) + spiIocMessage1 = 0x40206B00 // _IOW('k', 0, struct spi_ioc_transfer) โ€” 32 bytes +) + +// spiTransfer matches Linux kernel struct spi_ioc_transfer (32 bytes on all architectures). +type spiTransfer struct { + txBuf uint64 + rxBuf uint64 + length uint32 + speedHz uint32 + delayUsecs uint16 + bitsPerWord uint8 + csChange uint8 + txNbits uint8 + rxNbits uint8 + wordDelay uint8 + pad uint8 +} + +// configureSPI opens an SPI device and sets mode, bits per word, and speed +func configureSPI(devPath string, mode uint8, bits uint8, speed uint32) (int, *ToolResult) { + fd, err := syscall.Open(devPath, syscall.O_RDWR, 0) + if err != nil { + return -1, ErrorResult(fmt.Sprintf("failed to open %s: %v (check permissions and spidev module)", devPath, err)) + } + + // Set SPI mode + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), spiIocWrMode, uintptr(unsafe.Pointer(&mode))) + if errno != 0 { + syscall.Close(fd) + return -1, ErrorResult(fmt.Sprintf("failed to set SPI mode %d: %v", mode, errno)) + } + + // Set bits per word + _, _, errno = syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), spiIocWrBitsPerWord, uintptr(unsafe.Pointer(&bits))) + if errno != 0 { + syscall.Close(fd) + return -1, ErrorResult(fmt.Sprintf("failed to set bits per word %d: %v", bits, errno)) + } + + // Set max speed + _, _, errno = syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), spiIocWrMaxSpeedHz, uintptr(unsafe.Pointer(&speed))) + if errno != 0 { + syscall.Close(fd) + return -1, ErrorResult(fmt.Sprintf("failed to set SPI speed %d Hz: %v", speed, errno)) + } + + return fd, nil +} + +// transfer performs a full-duplex SPI transfer +func (t *SPITool) transfer(args map[string]interface{}) *ToolResult { + confirm, _ := args["confirm"].(bool) + if !confirm { + return ErrorResult("transfer operations require confirm: true. Please confirm with the user before sending data to SPI devices.") + } + + dev, speed, mode, bits, errMsg := parseSPIArgs(args) + if errMsg != "" { + return ErrorResult(errMsg) + } + + dataRaw, ok := args["data"].([]interface{}) + if !ok || len(dataRaw) == 0 { + return ErrorResult("data is required for transfer (array of byte values 0-255)") + } + if len(dataRaw) > 4096 { + return ErrorResult("data too long: maximum 4096 bytes per SPI transfer") + } + + txBuf := make([]byte, len(dataRaw)) + for i, v := range dataRaw { + f, ok := v.(float64) + if !ok { + return ErrorResult(fmt.Sprintf("data[%d] is not a valid byte value", i)) + } + b := int(f) + if b < 0 || b > 255 { + return ErrorResult(fmt.Sprintf("data[%d] = %d is out of byte range (0-255)", i, b)) + } + txBuf[i] = byte(b) + } + + devPath := fmt.Sprintf("/dev/spidev%s", dev) + fd, errResult := configureSPI(devPath, mode, bits, speed) + if errResult != nil { + return errResult + } + defer syscall.Close(fd) + + rxBuf := make([]byte, len(txBuf)) + + xfer := spiTransfer{ + txBuf: uint64(uintptr(unsafe.Pointer(&txBuf[0]))), + rxBuf: uint64(uintptr(unsafe.Pointer(&rxBuf[0]))), + length: uint32(len(txBuf)), + speedHz: speed, + bitsPerWord: bits, + } + + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), spiIocMessage1, uintptr(unsafe.Pointer(&xfer))) + runtime.KeepAlive(txBuf) + runtime.KeepAlive(rxBuf) + if errno != 0 { + return ErrorResult(fmt.Sprintf("SPI transfer failed: %v", errno)) + } + + // Format received bytes + hexBytes := make([]string, len(rxBuf)) + intBytes := make([]int, len(rxBuf)) + for i, b := range rxBuf { + hexBytes[i] = fmt.Sprintf("0x%02x", b) + intBytes[i] = int(b) + } + + result, _ := json.MarshalIndent(map[string]interface{}{ + "device": devPath, + "sent": len(txBuf), + "received": intBytes, + "hex": hexBytes, + }, "", " ") + return SilentResult(string(result)) +} + +// readDevice reads bytes from SPI by sending zeros (read-only, no confirm needed) +func (t *SPITool) readDevice(args map[string]interface{}) *ToolResult { + dev, speed, mode, bits, errMsg := parseSPIArgs(args) + if errMsg != "" { + return ErrorResult(errMsg) + } + + length := 0 + if l, ok := args["length"].(float64); ok { + length = int(l) + } + if length < 1 || length > 4096 { + return ErrorResult("length is required for read (1-4096)") + } + + devPath := fmt.Sprintf("/dev/spidev%s", dev) + fd, errResult := configureSPI(devPath, mode, bits, speed) + if errResult != nil { + return errResult + } + defer syscall.Close(fd) + + txBuf := make([]byte, length) // zeros + rxBuf := make([]byte, length) + + xfer := spiTransfer{ + txBuf: uint64(uintptr(unsafe.Pointer(&txBuf[0]))), + rxBuf: uint64(uintptr(unsafe.Pointer(&rxBuf[0]))), + length: uint32(length), + speedHz: speed, + bitsPerWord: bits, + } + + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), spiIocMessage1, uintptr(unsafe.Pointer(&xfer))) + runtime.KeepAlive(txBuf) + runtime.KeepAlive(rxBuf) + if errno != 0 { + return ErrorResult(fmt.Sprintf("SPI read failed: %v", errno)) + } + + hexBytes := make([]string, len(rxBuf)) + intBytes := make([]int, len(rxBuf)) + for i, b := range rxBuf { + hexBytes[i] = fmt.Sprintf("0x%02x", b) + intBytes[i] = int(b) + } + + result, _ := json.MarshalIndent(map[string]interface{}{ + "device": devPath, + "bytes": intBytes, + "hex": hexBytes, + "length": len(rxBuf), + }, "", " ") + return SilentResult(string(result)) +} diff --git a/pkg/tools/spi_other.go b/pkg/tools/spi_other.go new file mode 100644 index 000000000..6dfc86fd1 --- /dev/null +++ b/pkg/tools/spi_other.go @@ -0,0 +1,13 @@ +//go:build !linux + +package tools + +// transfer is a stub for non-Linux platforms. +func (t *SPITool) transfer(args map[string]interface{}) *ToolResult { + return ErrorResult("SPI is only supported on Linux") +} + +// readDevice is a stub for non-Linux platforms. +func (t *SPITool) readDevice(args map[string]interface{}) *ToolResult { + return ErrorResult("SPI is only supported on Linux") +} diff --git a/skills/hardware/SKILL.md b/skills/hardware/SKILL.md new file mode 100644 index 000000000..e89d1b6e7 --- /dev/null +++ b/skills/hardware/SKILL.md @@ -0,0 +1,64 @@ +--- +name: hardware +description: Read and control I2C and SPI peripherals on Sipeed boards (LicheeRV Nano, MaixCAM, NanoKVM). +homepage: https://wiki.sipeed.com/hardware/en/lichee/RV_Nano/1_intro.html +metadata: {"nanobot":{"emoji":"๐Ÿ”ง","requires":{"tools":["i2c","spi"]}}} +--- + +# Hardware (I2C / SPI) + +Use the `i2c` and `spi` tools to interact with sensors, displays, and other peripherals connected to the board. + +## Quick Start + +``` +# 1. Find available buses +i2c detect + +# 2. Scan for connected devices +i2c scan (bus: "1") + +# 3. Read from a sensor (e.g. AHT20 temperature/humidity) +i2c read (bus: "1", address: 0x38, register: 0xAC, length: 6) + +# 4. SPI devices +spi list +spi read (device: "2.0", length: 4) +``` + +## Before You Start โ€” Pinmux Setup + +Most I2C/SPI pins are shared with WiFi on Sipeed boards. You must configure pinmux before use. + +See `references/board-pinout.md` for board-specific commands. + +**Common steps:** +1. Stop WiFi if using shared pins: `/etc/init.d/S30wifi stop` +2. Load i2c-dev module: `modprobe i2c-dev` +3. Configure pinmux with `devmem` (board-specific) +4. Verify with `i2c detect` and `i2c scan` + +## Safety + +- **Write operations** require `confirm: true` โ€” always confirm with the user first +- I2C addresses are validated to 7-bit range (0x03-0x77) +- SPI modes are validated (0-3 only) +- Maximum per-transaction: 256 bytes (I2C), 4096 bytes (SPI) + +## Common Devices + +See `references/common-devices.md` for register maps and usage of popular sensors: +AHT20, BME280, SSD1306 OLED, MPU6050 IMU, DS3231 RTC, INA219 power monitor, PCA9685 PWM, and more. + +## Troubleshooting + +| Problem | Solution | +|---------|----------| +| No I2C buses found | `modprobe i2c-dev` and check device tree | +| Permission denied | Run as root or add user to `i2c` group | +| No devices on scan | Check wiring, pull-up resistors (4.7k typical), and pinmux | +| Bus number changed | I2C adapter numbers can shift between boots; use `i2c detect` to find current assignment | +| WiFi stopped working | I2C-1/SPI-2 share pins with WiFi SDIO; can't use both simultaneously | +| `devmem` not found | Download separately or use `busybox devmem` | +| SPI transfer returns all zeros | Check MISO wiring and device power | +| SPI transfer returns all 0xFF | Device not responding; check CS pin and clock polarity (mode) | diff --git a/skills/hardware/references/board-pinout.md b/skills/hardware/references/board-pinout.md new file mode 100644 index 000000000..827dd0613 --- /dev/null +++ b/skills/hardware/references/board-pinout.md @@ -0,0 +1,131 @@ +# Board Pinout & Pinmux Reference + +## LicheeRV Nano (SG2002) + +### I2C Buses + +| Bus | Pins | Notes | +|-----|------|-------| +| I2C-1 | P18 (SCL), P21 (SDA) | **Shared with WiFi SDIO** โ€” must stop WiFi first | +| I2C-3 | Available on header | Check device tree for pin assignment | +| I2C-5 | Software (BitBang) | Slower but no pin conflicts | + +### SPI Buses + +| Bus | Pins | Notes | +|-----|------|-------| +| SPI-2 | P18 (CS), P21 (MISO), P22 (MOSI), P23 (SCK) | **Shared with WiFi** โ€” must stop WiFi first | +| SPI-4 | Software (BitBang) | Slower but no pin conflicts | + +### Setup Steps for I2C-1 + +```bash +# 1. Stop WiFi (shares pins with I2C-1) +/etc/init.d/S30wifi stop + +# 2. Configure pinmux for I2C-1 +devmem 0x030010D0 b 0x2 # P18 โ†’ I2C1_SCL +devmem 0x030010DC b 0x2 # P21 โ†’ I2C1_SDA + +# 3. Load i2c-dev module +modprobe i2c-dev + +# 4. Verify +ls /dev/i2c-* +``` + +### Setup Steps for SPI-2 + +```bash +# 1. Stop WiFi (shares pins with SPI-2) +/etc/init.d/S30wifi stop + +# 2. Configure pinmux for SPI-2 +devmem 0x030010D0 b 0x1 # P18 โ†’ SPI2_CS +devmem 0x030010DC b 0x1 # P21 โ†’ SPI2_MISO +devmem 0x030010E0 b 0x1 # P22 โ†’ SPI2_MOSI +devmem 0x030010E4 b 0x1 # P23 โ†’ SPI2_SCK + +# 3. Verify +ls /dev/spidev* +``` + +### Max Tested SPI Speed +- SPI-2 hardware: tested up to **93 MHz** +- `spidev_test` is pre-installed on the official image for loopback testing + +--- + +## MaixCAM + +### I2C Buses + +| Bus | Pins | Notes | +|-----|------|-------| +| I2C-1 | Overlaps with WiFi | Not recommended | +| I2C-3 | Overlaps with WiFi | Not recommended | +| I2C-5 | A15 (SCL), A27 (SDA) | **Recommended** โ€” software I2C, no conflicts | + +### Setup Steps for I2C-5 + +```bash +# Configure pins using pinmap utility +# (MaixCAM uses a pinmap tool instead of devmem) +# Refer to: https://wiki.sipeed.com/hardware/en/maixcam/gpio.html + +# Load i2c-dev +modprobe i2c-dev + +# Verify +ls /dev/i2c-* +``` + +--- + +## MaixCAM2 + +### I2C Buses + +| Bus | Pins | Notes | +|-----|------|-------| +| I2C-6 | A1 (SCL), A0 (SDA) | Available on header | +| I2C-7 | Available | Check device tree | + +### Setup Steps + +```bash +# Configure pinmap for I2C-6 +# A1 โ†’ I2C6_SCL, A0 โ†’ I2C6_SDA +# Refer to MaixCAM2 documentation for pinmap commands + +modprobe i2c-dev +ls /dev/i2c-* +``` + +--- + +## NanoKVM + +Uses the same SG2002 SoC as LicheeRV Nano. GPIO and I2C access follows the same pinmux procedure. Refer to the LicheeRV Nano section above. + +Check NanoKVM-specific pin headers for available I2C/SPI lines: +- https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/introduction.html + +--- + +## Common Issues + +### devmem not found +The `devmem` utility may not be in the default image. Options: +- Use `busybox devmem` if busybox is installed +- Download devmem from the Sipeed package repository +- Cross-compile from source (single C file) + +### Dynamic bus numbering +I2C adapter numbers can change between boots depending on driver load order. Always use `i2c detect` to find current bus assignments rather than hardcoding bus numbers. + +### Permissions +`/dev/i2c-*` and `/dev/spidev*` typically require root access. Options: +- Run picoclaw as root +- Add user to `i2c` and `spi` groups +- Create udev rules: `SUBSYSTEM=="i2c-dev", MODE="0666"` diff --git a/skills/hardware/references/common-devices.md b/skills/hardware/references/common-devices.md new file mode 100644 index 000000000..715e8ab7f --- /dev/null +++ b/skills/hardware/references/common-devices.md @@ -0,0 +1,78 @@ +# Common I2C/SPI Device Reference + +## I2C Devices + +### AHT20 โ€” Temperature & Humidity +- **Address:** 0x38 +- **Init:** Write `[0xBE, 0x08, 0x00]` then wait 10ms +- **Measure:** Write `[0xAC, 0x33, 0x00]`, wait 80ms, read 6 bytes +- **Parse:** Status=byte[0], Humidity=(byte[1]<<12|byte[2]<<4|byte[3]>>4)/2^20*100, Temp=(byte[3]&0x0F<<16|byte[4]<<8|byte[5])/2^20*200-50 +- **Notes:** No register addressing โ€” write command bytes directly (omit `register` param) + +### BME280 / BMP280 โ€” Temperature, Humidity, Pressure +- **Address:** 0x76 or 0x77 (SDO pin selects) +- **Chip ID register:** 0xD0 โ†’ BMP280=0x58, BME280=0x60 +- **Data registers:** 0xF7-0xFE (pressure, temperature, humidity) +- **Config:** Write 0xF2 (humidity oversampling), 0xF4 (temp/press oversampling + mode), 0xF5 (standby, filter) +- **Forced measurement:** Write `[0x25]` to register 0xF4, wait 40ms, read 8 bytes from 0xF7 +- **Calibration:** Read 26 bytes from 0x88 and 7 bytes from 0xE1 for compensation formulas +- **Also available via SPI** (mode 0 or 3) + +### SSD1306 โ€” 128x64 OLED Display +- **Address:** 0x3C (or 0x3D if SA0 high) +- **Command prefix:** 0x00 (write to register 0x00) +- **Data prefix:** 0x40 (write to register 0x40) +- **Init sequence:** `[0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x00, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF]` +- **Display on:** 0xAF, **Display off:** 0xAE +- **Also available via SPI** (faster, recommended for animations) + +### MPU6050 โ€” 6-axis Accelerometer + Gyroscope +- **Address:** 0x68 (or 0x69 if AD0 high) +- **WHO_AM_I:** Register 0x75 โ†’ should return 0x68 +- **Wake up:** Write `[0x00]` to register 0x6B (clear sleep bit) +- **Read accel:** 6 bytes from register 0x3B (XH,XL,YH,YL,ZH,ZL) โ€” signed 16-bit, default ยฑ2g +- **Read gyro:** 6 bytes from register 0x43 โ€” signed 16-bit, default ยฑ250ยฐ/s +- **Read temp:** 2 bytes from register 0x41 โ€” TempยฐC = value/340 + 36.53 + +### DS3231 โ€” Real-Time Clock +- **Address:** 0x68 +- **Read time:** 7 bytes from register 0x00 (seconds, minutes, hours, day, date, month, year) โ€” BCD encoded +- **Set time:** Write 7 BCD bytes to register 0x00 +- **Temperature:** 2 bytes from register 0x11 (signed, 0.25ยฐC resolution) +- **Status:** Register 0x0F โ€” bit 2 = busy, bit 0 = alarm 1 flag + +### INA219 โ€” Current & Power Monitor +- **Address:** 0x40-0x4F (A0,A1 pin selectable) +- **Config:** Register 0x00 โ€” set voltage range, gain, ADC resolution +- **Shunt voltage:** Register 0x01 (signed 16-bit, LSB=10ยตV) +- **Bus voltage:** Register 0x02 (bits 15:3, LSB=4mV) +- **Power:** Register 0x03 (after calibration) +- **Current:** Register 0x04 (after calibration) +- **Calibration:** Register 0x05 โ€” set based on shunt resistor value + +### PCA9685 โ€” 16-Channel PWM / Servo Controller +- **Address:** 0x40-0x7F (A0-A5 selectable, default 0x40) +- **Mode 1:** Register 0x00 โ€” bit 4=sleep, bit 5=auto-increment +- **Set PWM freq:** Sleep โ†’ write prescale to 0xFE โ†’ wake. Prescale = round(25MHz / (4096 ร— freq)) - 1 +- **Channel N on/off:** Registers 0x06+4*N to 0x09+4*N (ON_L, ON_H, OFF_L, OFF_H) +- **Servo 0ยฐ-180ยฐ:** ON=0, OFF=150-600 (at 50Hz). Typical: 0ยฐ=150, 90ยฐ=375, 180ยฐ=600 + +### AT24C256 โ€” 256Kbit EEPROM +- **Address:** 0x50-0x57 (A0-A2 selectable) +- **Read:** Write 2-byte address (high, low), then read N bytes +- **Write:** Write 2-byte address + up to 64 bytes (page write), wait 5ms for write cycle +- **Page size:** 64 bytes. Writes that cross page boundary wrap around. + +## SPI Devices + +### MCP3008 โ€” 8-Channel 10-bit ADC +- **Interface:** SPI mode 0, max 3.6 MHz @ 5V +- **Read channel N:** Send `[0x01, (0x80 | N<<4), 0x00]`, result in last 10 bits of bytes 1-2 +- **Formula:** value = ((byte[1] & 0x03) << 8) | byte[2] +- **Voltage:** value ร— Vref / 1024 + +### W25Q128 โ€” 128Mbit SPI Flash +- **Interface:** SPI mode 0 or 3, up to 104 MHz +- **Read ID:** Send `[0x9F, 0, 0, 0]` โ†’ manufacturer + device ID +- **Read data:** Send `[0x03, addr_high, addr_mid, addr_low]` + N zero bytes +- **Status:** Send `[0x05, 0]` โ†’ bit 0 = BUSY From 378045510d03f722ed909c41bccb3980598d59c4 Mon Sep 17 00:00:00 2001 From: easyzoom Date: Sat, 14 Feb 2026 13:56:08 +0800 Subject: [PATCH 25/48] feat: add device hotplug event notifications (USB on Linux) --- cmd/picoclaw/main.go | 15 +++ config/config.example.json | 4 + pkg/config/config.go | 10 ++ pkg/devices/events/events.go | 57 +++++++++ pkg/devices/service.go | 152 ++++++++++++++++++++++++ pkg/devices/source.go | 5 + pkg/devices/sources/usb_linux.go | 198 +++++++++++++++++++++++++++++++ pkg/devices/sources/usb_stub.go | 29 +++++ 8 files changed, 470 insertions(+) create mode 100644 pkg/devices/events/events.go create mode 100644 pkg/devices/service.go create mode 100644 pkg/devices/source.go create mode 100644 pkg/devices/sources/usb_linux.go create mode 100644 pkg/devices/sources/usb_stub.go diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index 21246cf41..86463c661 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -25,11 +25,13 @@ import ( "github.com/sipeed/picoclaw/pkg/channels" "github.com/sipeed/picoclaw/pkg/config" "github.com/sipeed/picoclaw/pkg/cron" + "github.com/sipeed/picoclaw/pkg/devices" "github.com/sipeed/picoclaw/pkg/heartbeat" "github.com/sipeed/picoclaw/pkg/logger" "github.com/sipeed/picoclaw/pkg/migrate" "github.com/sipeed/picoclaw/pkg/providers" "github.com/sipeed/picoclaw/pkg/skills" + "github.com/sipeed/picoclaw/pkg/state" "github.com/sipeed/picoclaw/pkg/tools" "github.com/sipeed/picoclaw/pkg/voice" ) @@ -751,6 +753,18 @@ func gatewayCmd() { } fmt.Println("โœ“ Heartbeat service started") + stateManager := state.NewManager(cfg.WorkspacePath()) + deviceService := devices.NewService(devices.Config{ + Enabled: cfg.Devices.Enabled, + MonitorUSB: cfg.Devices.MonitorUSB, + }, stateManager) + deviceService.SetBus(msgBus) + if err := deviceService.Start(ctx); err != nil { + fmt.Printf("Error starting device service: %v\n", err) + } else if cfg.Devices.Enabled { + fmt.Println("โœ“ Device event service started") + } + if err := channelManager.StartAll(ctx); err != nil { fmt.Printf("Error starting channels: %v\n", err) } @@ -763,6 +777,7 @@ func gatewayCmd() { fmt.Println("\nShutting down...") cancel() + deviceService.Stop() heartbeatService.Stop() cronService.Stop() agentLoop.Stop() diff --git a/config/config.example.json b/config/config.example.json index ee3ac97f7..288e16c58 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -113,6 +113,10 @@ "enabled": true, "interval": 30 }, + "devices": { + "enabled": false, + "monitor_usb": true + }, "gateway": { "host": "0.0.0.0", "port": 18790 diff --git a/pkg/config/config.go b/pkg/config/config.go index 6af9438a5..ce350f074 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -50,6 +50,7 @@ type Config struct { Gateway GatewayConfig `json:"gateway"` Tools ToolsConfig `json:"tools"` Heartbeat HeartbeatConfig `json:"heartbeat"` + Devices DevicesConfig `json:"devices"` mu sync.RWMutex } @@ -150,6 +151,11 @@ type HeartbeatConfig struct { Interval int `json:"interval" env:"PICOCLAW_HEARTBEAT_INTERVAL"` // minutes, min 5 } +type DevicesConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_DEVICES_ENABLED"` + MonitorUSB bool `json:"monitor_usb" env:"PICOCLAW_DEVICES_MONITOR_USB"` +} + type ProvidersConfig struct { Anthropic ProviderConfig `json:"anthropic"` OpenAI ProviderConfig `json:"openai"` @@ -299,6 +305,10 @@ func DefaultConfig() *Config { Enabled: true, Interval: 30, // default 30 minutes }, + Devices: DevicesConfig{ + Enabled: false, + MonitorUSB: true, + }, } } diff --git a/pkg/devices/events/events.go b/pkg/devices/events/events.go new file mode 100644 index 000000000..01226179c --- /dev/null +++ b/pkg/devices/events/events.go @@ -0,0 +1,57 @@ +package events + +import "context" + +type EventSource interface { + Kind() Kind + Start(ctx context.Context) (<-chan *DeviceEvent, error) + Stop() error +} + +type Action string + +const ( + ActionAdd Action = "add" + ActionRemove Action = "remove" + ActionChange Action = "change" +) + +type Kind string + +const ( + KindUSB Kind = "usb" + KindBluetooth Kind = "bluetooth" + KindPCI Kind = "pci" + KindGeneric Kind = "generic" +) + +type DeviceEvent struct { + Action Action + Kind Kind + DeviceID string // e.g. "1-2" for USB bus 1 dev 2 + Vendor string // Vendor name or ID + Product string // Product name or ID + Serial string // Serial number if available + Capabilities string // Human-readable capability description + Raw map[string]string // Raw properties for extensibility +} + +func (e *DeviceEvent) FormatMessage() string { + actionEmoji := "๐Ÿ”Œ" + actionText := "Connected" + if e.Action == ActionRemove { + actionEmoji = "๐Ÿ”Œ" + actionText = "Disconnected" + } + + msg := actionEmoji + " Device " + actionText + "\n\n" + msg += "Type: " + string(e.Kind) + "\n" + msg += "Device: " + e.Vendor + " " + e.Product + "\n" + if e.Capabilities != "" { + msg += "Capabilities: " + e.Capabilities + "\n" + } + if e.Serial != "" { + msg += "Serial: " + e.Serial + "\n" + } + return msg +} diff --git a/pkg/devices/service.go b/pkg/devices/service.go new file mode 100644 index 000000000..05a254729 --- /dev/null +++ b/pkg/devices/service.go @@ -0,0 +1,152 @@ +package devices + +import ( + "context" + "strings" + "sync" + + "github.com/sipeed/picoclaw/pkg/bus" + "github.com/sipeed/picoclaw/pkg/constants" + "github.com/sipeed/picoclaw/pkg/devices/events" + "github.com/sipeed/picoclaw/pkg/devices/sources" + "github.com/sipeed/picoclaw/pkg/logger" + "github.com/sipeed/picoclaw/pkg/state" +) + +type Service struct { + bus *bus.MessageBus + state *state.Manager + sources []events.EventSource + enabled bool + ctx context.Context + cancel context.CancelFunc + mu sync.RWMutex +} + +type Config struct { + Enabled bool + MonitorUSB bool // When true, monitor USB hotplug (Linux only) + // Future: MonitorBluetooth, MonitorPCI, etc. +} + +func NewService(cfg Config, stateMgr *state.Manager) *Service { + s := &Service{ + state: stateMgr, + enabled: cfg.Enabled, + sources: make([]EventSource, 0), + } + + if cfg.Enabled && cfg.MonitorUSB { + s.sources = append(s.sources, sources.NewUSBMonitor()) + } + + return s +} + +func (s *Service) SetBus(msgBus *bus.MessageBus) { + s.mu.Lock() + defer s.mu.Unlock() + s.bus = msgBus +} + +func (s *Service) Start(ctx context.Context) error { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.enabled || len(s.sources) == 0 { + logger.InfoC("devices", "Device event service disabled or no sources") + return nil + } + + s.ctx, s.cancel = context.WithCancel(ctx) + + for _, src := range s.sources { + eventCh, err := src.Start(s.ctx) + if err != nil { + logger.ErrorCF("devices", "Failed to start source", map[string]interface{}{ + "kind": src.Kind(), + "error": err.Error(), + }) + continue + } + go s.handleEvents(src.Kind(), eventCh) + logger.InfoCF("devices", "Device source started", map[string]interface{}{ + "kind": src.Kind(), + }) + } + + logger.InfoC("devices", "Device event service started") + return nil +} + +func (s *Service) Stop() { + s.mu.Lock() + defer s.mu.Unlock() + + if s.cancel != nil { + s.cancel() + s.cancel = nil + } + + for _, src := range s.sources { + src.Stop() + } + + logger.InfoC("devices", "Device event service stopped") +} + +func (s *Service) handleEvents(kind events.Kind, eventCh <-chan *events.DeviceEvent) { + for ev := range eventCh { + if ev == nil { + continue + } + s.sendNotification(ev) + } +} + +func (s *Service) sendNotification(ev *events.DeviceEvent) { + s.mu.RLock() + msgBus := s.bus + s.mu.RUnlock() + + if msgBus == nil { + return + } + + lastChannel := s.state.GetLastChannel() + if lastChannel == "" { + logger.DebugCF("devices", "No last channel, skipping notification", map[string]interface{}{ + "event": ev.FormatMessage(), + }) + return + } + + platform, userID := parseLastChannel(lastChannel) + if platform == "" || userID == "" || constants.IsInternalChannel(platform) { + return + } + + msg := ev.FormatMessage() + msgBus.PublishOutbound(bus.OutboundMessage{ + Channel: platform, + ChatID: userID, + Content: msg, + }) + + logger.InfoCF("devices", "Device notification sent", map[string]interface{}{ + "kind": ev.Kind, + "action": ev.Action, + "to": platform, + }) +} + +func parseLastChannel(lastChannel string) (platform, userID string) { + if lastChannel == "" { + return "", "" + } + parts := strings.SplitN(lastChannel, ":", 2) + if len(parts) != 2 || parts[0] == "" || parts[1] == "" { + return "", "" + } + return parts[0], parts[1] +} diff --git a/pkg/devices/source.go b/pkg/devices/source.go new file mode 100644 index 000000000..cbf0a7d88 --- /dev/null +++ b/pkg/devices/source.go @@ -0,0 +1,5 @@ +package devices + +import "github.com/sipeed/picoclaw/pkg/devices/events" + +type EventSource = events.EventSource diff --git a/pkg/devices/sources/usb_linux.go b/pkg/devices/sources/usb_linux.go new file mode 100644 index 000000000..1f6c068b3 --- /dev/null +++ b/pkg/devices/sources/usb_linux.go @@ -0,0 +1,198 @@ +//go:build linux + +package sources + +import ( + "bufio" + "context" + "fmt" + "os/exec" + "strings" + "sync" + + "github.com/sipeed/picoclaw/pkg/devices/events" + "github.com/sipeed/picoclaw/pkg/logger" +) + +var usbClassToCapability = map[string]string{ + "00": "Interface Definition (by interface)", + "01": "Audio", + "02": "CDC Communication (Network Card/Modem)", + "03": "HID (Keyboard/Mouse/Gamepad)", + "05": "Physical Interface", + "06": "Image (Scanner/Camera)", + "07": "Printer", + "08": "Mass Storage (USB Flash Drive/Hard Disk)", + "09": "USB Hub", + "0a": "CDC Data", + "0b": "Smart Card", + "0e": "Video (Camera)", + "dc": "Diagnostic Device", + "e0": "Wireless Controller (Bluetooth)", + "ef": "Miscellaneous", + "fe": "Application Specific", + "ff": "Vendor Specific", +} + +type USBMonitor struct { + cmd *exec.Cmd + cancel context.CancelFunc + mu sync.Mutex +} + +func NewUSBMonitor() *USBMonitor { + return &USBMonitor{} +} + +func (m *USBMonitor) Kind() events.Kind { + return events.KindUSB +} + +func (m *USBMonitor) Start(ctx context.Context) (<-chan *events.DeviceEvent, error) { + m.mu.Lock() + defer m.mu.Unlock() + + // udevadm monitor outputs: UDEV/KERNEL [timestamp] action devpath (subsystem) + // Followed by KEY=value lines, empty line separates events + // Use -s/--subsystem-match (eudev) or --udev-subsystem-match (systemd udev) + cmd := exec.CommandContext(ctx, "udevadm", "monitor", "--property", "--subsystem-match=usb") + stdout, err := cmd.StdoutPipe() + if err != nil { + return nil, fmt.Errorf("udevadm stdout pipe: %w", err) + } + + if err := cmd.Start(); err != nil { + return nil, fmt.Errorf("udevadm start: %w (is udevadm installed?)", err) + } + + m.cmd = cmd + eventCh := make(chan *events.DeviceEvent, 16) + + go func() { + defer close(eventCh) + scanner := bufio.NewScanner(stdout) + var props map[string]string + var action string + isUdev := false // Only UDEV events have complete info (ID_VENDOR, ID_MODEL); KERNEL events come first with less info + + for scanner.Scan() { + line := scanner.Text() + if line == "" { + // End of event block - only process UDEV events (skip KERNEL to avoid duplicate/incomplete notifications) + if isUdev && props != nil && (action == "add" || action == "remove") { + if ev := parseUSBEvent(action, props); ev != nil { + select { + case eventCh <- ev: + case <-ctx.Done(): + return + } + } + } + props = nil + action = "" + isUdev = false + continue + } + + idx := strings.Index(line, "=") + // First line of block: "UDEV [ts] action devpath" or "KERNEL[ts] action devpath" - no KEY=value + if idx <= 0 { + isUdev = strings.HasPrefix(strings.TrimSpace(line), "UDEV") + continue + } + + // Parse KEY=value + key := line[:idx] + val := line[idx+1:] + if props == nil { + props = make(map[string]string) + } + props[key] = val + + if key == "ACTION" { + action = val + } + } + + if err := scanner.Err(); err != nil { + logger.ErrorCF("devices", "udevadm scan error", map[string]interface{}{"error": err.Error()}) + } + cmd.Wait() + }() + + return eventCh, nil +} + +func (m *USBMonitor) Stop() error { + m.mu.Lock() + defer m.mu.Unlock() + if m.cmd != nil && m.cmd.Process != nil { + m.cmd.Process.Kill() + m.cmd = nil + } + return nil +} + +func parseUSBEvent(action string, props map[string]string) *events.DeviceEvent { + // Only care about add/remove for physical devices (not interfaces) + subsystem := props["SUBSYSTEM"] + if subsystem != "usb" { + return nil + } + // Skip interface events - we want device-level only to avoid duplicates + devType := props["DEVTYPE"] + if devType == "usb_interface" { + return nil + } + // Prefer usb_device, but accept if DEVTYPE not set (varies by udev version) + if devType != "" && devType != "usb_device" { + return nil + } + + ev := &events.DeviceEvent{ + Raw: props, + } + switch action { + case "add": + ev.Action = events.ActionAdd + case "remove": + ev.Action = events.ActionRemove + default: + return nil + } + ev.Kind = events.KindUSB + + ev.Vendor = props["ID_VENDOR"] + if ev.Vendor == "" { + ev.Vendor = props["ID_VENDOR_ID"] + } + if ev.Vendor == "" { + ev.Vendor = "Unknown Vendor" + } + + ev.Product = props["ID_MODEL"] + if ev.Product == "" { + ev.Product = props["ID_MODEL_ID"] + } + if ev.Product == "" { + ev.Product = "Unknown Device" + } + + ev.Serial = props["ID_SERIAL_SHORT"] + ev.DeviceID = props["DEVPATH"] + if bus := props["BUSNUM"]; bus != "" { + if dev := props["DEVNUM"]; dev != "" { + ev.DeviceID = bus + ":" + dev + } + } + + // Map USB class to capability + if class := props["ID_USB_CLASS"]; class != "" { + ev.Capabilities = usbClassToCapability[strings.ToLower(class)] + } + if ev.Capabilities == "" { + ev.Capabilities = "USB Device" + } + + return ev +} diff --git a/pkg/devices/sources/usb_stub.go b/pkg/devices/sources/usb_stub.go new file mode 100644 index 000000000..f08c2d406 --- /dev/null +++ b/pkg/devices/sources/usb_stub.go @@ -0,0 +1,29 @@ +//go:build !linux + +package sources + +import ( + "context" + + "github.com/sipeed/picoclaw/pkg/devices/events" +) + +type USBMonitor struct{} + +func NewUSBMonitor() *USBMonitor { + return &USBMonitor{} +} + +func (m *USBMonitor) Kind() events.Kind { + return events.KindUSB +} + +func (m *USBMonitor) Start(ctx context.Context) (<-chan *events.DeviceEvent, error) { + ch := make(chan *events.DeviceEvent) + close(ch) // Immediately close, no events + return ch, nil +} + +func (m *USBMonitor) Stop() error { + return nil +} From 1fcf3fde0f6e3d89ad753f05e413ab82ee7e62ee Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 17:23:18 +0800 Subject: [PATCH 26/48] style: fix format --- pkg/channels/onebot.go | 55 +++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/pkg/channels/onebot.go b/pkg/channels/onebot.go index fe6edbeea..7f48ef6c0 100644 --- a/pkg/channels/onebot.go +++ b/pkg/channels/onebot.go @@ -18,19 +18,18 @@ import ( type OneBotChannel struct { *BaseChannel - config config.OneBotConfig - conn *websocket.Conn - ctx context.Context - cancel context.CancelFunc - dedup map[string]struct{} - dedupRing []string - dedupIdx int - mu sync.Mutex - writeMu sync.Mutex - echoCounter int64 + config config.OneBotConfig + conn *websocket.Conn + ctx context.Context + cancel context.CancelFunc + dedup map[string]struct{} + dedupRing []string + dedupIdx int + mu sync.Mutex + writeMu sync.Mutex + echoCounter int64 } - type oneBotRawEvent struct { PostType string `json:"post_type"` MessageType string `json:"message_type"` @@ -44,9 +43,9 @@ type oneBotRawEvent struct { SelfID json.RawMessage `json:"self_id"` Time json.RawMessage `json:"time"` MetaEventType string `json:"meta_event_type"` - Echo string `json:"echo"` - RetCode json.RawMessage `json:"retcode"` - Status string `json:"status"` + Echo string `json:"echo"` + RetCode json.RawMessage `json:"retcode"` + Status string `json:"status"` } type oneBotSender struct { @@ -56,19 +55,19 @@ type oneBotSender struct { } type oneBotEvent struct { - PostType string - MessageType string - SubType string - MessageID string - UserID int64 - GroupID int64 - Content string - RawContent string - IsBotMentioned bool - Sender oneBotSender - SelfID int64 - Time int64 - MetaEventType string + PostType string + MessageType string + SubType string + MessageID string + UserID int64 + GroupID int64 + Content string + RawContent string + IsBotMentioned bool + Sender oneBotSender + SelfID int64 + Time int64 + MetaEventType string } type oneBotAPIRequest struct { @@ -264,7 +263,7 @@ func (c *OneBotChannel) buildSendRequest(msg bus.OutboundMessage) (string, inter return "", nil, fmt.Errorf("invalid user ID in chatID: %s", chatID) } return "send_private_msg", oneBotSendPrivateMsgParams{ - UserID: userID, + UserID: userID, Message: msg.Content, }, nil } From f7421128a0074fe7577ada0614a2eb58afe3d082 Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 17:46:47 +0800 Subject: [PATCH 27/48] style: remove unnecessary log messages in WebSocket listener --- pkg/channels/onebot.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/channels/onebot.go b/pkg/channels/onebot.go index 7f48ef6c0..ae563b831 100644 --- a/pkg/channels/onebot.go +++ b/pkg/channels/onebot.go @@ -280,11 +280,9 @@ func (c *OneBotChannel) buildSendRequest(msg bus.OutboundMessage) (string, inter } func (c *OneBotChannel) listen() { - logger.InfoC("onebot", "WebSocket listener started") for { select { case <-c.ctx.Done(): - logger.InfoC("onebot", "WebSocket listener stopping (context cancelled)") return default: c.mu.Lock() From 773ce9bcb6ba6a9cd59d0ff51053b2e31d610912 Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 19:58:19 +0800 Subject: [PATCH 28/48] fix: update BotStatus type in oneBotRawEvent and adjust status checks --- pkg/channels/onebot.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/channels/onebot.go b/pkg/channels/onebot.go index ae563b831..dadc9bc02 100644 --- a/pkg/channels/onebot.go +++ b/pkg/channels/onebot.go @@ -45,7 +45,12 @@ type oneBotRawEvent struct { MetaEventType string `json:"meta_event_type"` Echo string `json:"echo"` RetCode json.RawMessage `json:"retcode"` - Status string `json:"status"` + Status BotStatus `json:"status"` +} + +type BotStatus struct { + Online bool `json:"online"` + Good bool `json:"good"` } type oneBotSender struct { @@ -322,7 +327,7 @@ func (c *OneBotChannel) listen() { continue } - if raw.Echo != "" || raw.Status != "" { + if raw.Echo != "" || raw.Status.Online || raw.Status.Good { logger.DebugCF("onebot", "Received API response, skipping", map[string]interface{}{ "echo": raw.Echo, "status": raw.Status, From 60c3d96b5e5dbe155e2e4fdafea0a25bd78579fe Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 20:02:30 +0800 Subject: [PATCH 29/48] style: fix alignment of fields in BotStatus struct --- pkg/channels/onebot.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/channels/onebot.go b/pkg/channels/onebot.go index dadc9bc02..674acf520 100644 --- a/pkg/channels/onebot.go +++ b/pkg/channels/onebot.go @@ -50,7 +50,7 @@ type oneBotRawEvent struct { type BotStatus struct { Online bool `json:"online"` - Good bool `json:"good"` + Good bool `json:"good"` } type oneBotSender struct { From 8cff6cf3123c71bacf0ee534352a3cac55e2b3f0 Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 20:25:55 +0800 Subject: [PATCH 30/48] fix: improve connection handling in OneBotChannel --- pkg/channels/onebot.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pkg/channels/onebot.go b/pkg/channels/onebot.go index 674acf520..5d97fab9c 100644 --- a/pkg/channels/onebot.go +++ b/pkg/channels/onebot.go @@ -116,13 +116,20 @@ func (c *OneBotChannel) Start(ctx context.Context) error { c.ctx, c.cancel = context.WithCancel(ctx) if err := c.connect(); err != nil { - return fmt.Errorf("failed to connect to OneBot: %w", err) + logger.WarnCF("onebot", "Initial connection failed, will retry in background", map[string]interface{}{ + "error": err.Error(), + }) + } else { + go c.listen() } - go c.listen() - if c.config.ReconnectInterval > 0 { go c.reconnectLoop() + } else { + // If reconnect is disabled but initial connection failed, we cannot recover + if c.conn == nil { + return fmt.Errorf("failed to connect to OneBot and reconnect is disabled") + } } c.setRunning(true) From a24cbd43855b19c4bb7defe1774e6dc17ff4c6db Mon Sep 17 00:00:00 2001 From: Artem Yadelskyi Date: Sat, 14 Feb 2026 14:44:19 +0200 Subject: [PATCH 31/48] feat(docker): Added curl for Docker image --- .gitignore | 6 +++++- Dockerfile | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 6ba411758..6a61e26b1 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,8 @@ coverage.html # Ralph workspace ralph/ .ralph/ -tasks/ \ No newline at end of file +tasks/ + +# Editors +.vscode/ +.idea/ diff --git a/Dockerfile b/Dockerfile index 8db995545..5587198fe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,9 +18,9 @@ RUN make build # ============================================================ # Stage 2: Minimal runtime image # ============================================================ -FROM alpine:3.21 +FROM alpine:3.23 -RUN apk add --no-cache ca-certificates tzdata +RUN apk add --no-cache ca-certificates tzdata curl # Copy binary COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw diff --git a/go.mod b/go.mod index f4c233ea8..78683203f 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/larksuite/oapi-sdk-go/v3 v3.5.3 github.com/mymmrac/telego v1.6.0 github.com/open-dingtalk/dingtalk-stream-sdk-go v0.9.1 - github.com/openai/openai-go/v3 v3.21.0 + github.com/openai/openai-go/v3 v3.22.0 github.com/slack-go/slack v0.17.3 github.com/tencent-connect/botgo v0.2.1 golang.org/x/oauth2 v0.35.0 diff --git a/go.sum b/go.sum index 9174d2889..80e40a33f 100644 --- a/go.sum +++ b/go.sum @@ -92,8 +92,8 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/open-dingtalk/dingtalk-stream-sdk-go v0.9.1 h1:Lb/Uzkiw2Ugt2Xf03J5wmv81PdkYOiWbI8CNBi1boC8= github.com/open-dingtalk/dingtalk-stream-sdk-go v0.9.1/go.mod h1:ln3IqPYYocZbYvl9TAOrG/cxGR9xcn4pnZRLdCTEGEU= -github.com/openai/openai-go/v3 v3.21.0 h1:3GpIR/W4q/v1uUOVuK3zYtQiF3DnRrZag/sxbtvEdtc= -github.com/openai/openai-go/v3 v3.21.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= +github.com/openai/openai-go/v3 v3.22.0 h1:6MEoNoV8sbjOVmXdvhmuX3BjVbVdcExbVyGixiyJ8ys= +github.com/openai/openai-go/v3 v3.22.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= From a9557aa0736ecc8bc6836b59a8d1e21fe73546fa Mon Sep 17 00:00:00 2001 From: lxowalle Date: Sun, 15 Feb 2026 00:16:42 +0800 Subject: [PATCH 32/48] feat: Support installing built-in AGENT files and skills during `picoclaw onboard` --- .gitignore | 1 + Dockerfile | 6 +- Makefile | 31 +-- cmd/picoclaw/main.go | 224 +++++------------- workspace/AGENT.md | 12 + workspace/IDENTITY.md | 56 +++++ workspace/SOUL.md | 17 ++ workspace/USER.md | 21 ++ workspace/memory/MEMORY.md | 21 ++ {skills => workspace/skills}/github/SKILL.md | 0 .../skills}/hardware/SKILL.md | 0 .../hardware/references/board-pinout.md | 0 .../hardware/references/common-devices.md | 0 .../skills}/skill-creator/SKILL.md | 0 .../skills}/summarize/SKILL.md | 0 {skills => workspace/skills}/tmux/SKILL.md | 0 .../skills}/tmux/scripts/find-sessions.sh | 0 .../skills}/tmux/scripts/wait-for-text.sh | 0 {skills => workspace/skills}/weather/SKILL.md | 0 19 files changed, 190 insertions(+), 199 deletions(-) create mode 100644 workspace/AGENT.md create mode 100644 workspace/IDENTITY.md create mode 100644 workspace/SOUL.md create mode 100644 workspace/USER.md create mode 100644 workspace/memory/MEMORY.md rename {skills => workspace/skills}/github/SKILL.md (100%) rename {skills => workspace/skills}/hardware/SKILL.md (100%) rename {skills => workspace/skills}/hardware/references/board-pinout.md (100%) rename {skills => workspace/skills}/hardware/references/common-devices.md (100%) rename {skills => workspace/skills}/skill-creator/SKILL.md (100%) rename {skills => workspace/skills}/summarize/SKILL.md (100%) rename {skills => workspace/skills}/tmux/SKILL.md (100%) rename {skills => workspace/skills}/tmux/scripts/find-sessions.sh (100%) rename {skills => workspace/skills}/tmux/scripts/wait-for-text.sh (100%) rename {skills => workspace/skills}/weather/SKILL.md (100%) diff --git a/.gitignore b/.gitignore index 6ba411758..4e5a83f8a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ build/ *.out /picoclaw /picoclaw-test +cmd/picoclaw/workspace # Picoclaw specific diff --git a/Dockerfile b/Dockerfile index 8db995545..217de3124 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,12 +25,8 @@ RUN apk add --no-cache ca-certificates tzdata # Copy binary COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw -# Copy builtin skills -COPY --from=builder /src/skills /opt/picoclaw/skills - # Create picoclaw home directory -RUN mkdir -p /root/.picoclaw/workspace/skills && \ - cp -r /opt/picoclaw/skills/* /root/.picoclaw/workspace/skills/ 2>/dev/null || true +RUN /usr/local/bin/picoclaw onboard ENTRYPOINT ["picoclaw"] CMD ["gateway"] diff --git a/Makefile b/Makefile index 2defcce31..55144bf1e 100644 --- a/Makefile +++ b/Makefile @@ -67,6 +67,8 @@ all: build build: @echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..." @mkdir -p $(BUILD_DIR) + @rm -r ./$(CMD_DIR)/workspace 2>/dev/null || true + @cp -r workspace ./$(CMD_DIR)/workspace 2>/dev/null || true $(GO) build $(GOFLAGS) $(LDFLAGS) -o $(BINARY_PATH) ./$(CMD_DIR) @echo "Build complete: $(BINARY_PATH)" @ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME) @@ -74,6 +76,8 @@ build: ## build-all: Build picoclaw for all platforms build-all: @echo "Building for multiple platforms..." + @rm -r ./$(CMD_DIR)/workspace 2>/dev/null || true + @cp -r workspace ./$(CMD_DIR)/workspace 2>/dev/null || true @mkdir -p $(BUILD_DIR) GOOS=linux GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 ./$(CMD_DIR) GOOS=linux GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR) @@ -89,35 +93,8 @@ install: build @cp $(BUILD_DIR)/$(BINARY_NAME) $(INSTALL_BIN_DIR)/$(BINARY_NAME) @chmod +x $(INSTALL_BIN_DIR)/$(BINARY_NAME) @echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)" - @echo "Installing builtin skills to $(WORKSPACE_SKILLS_DIR)..." - @mkdir -p $(WORKSPACE_SKILLS_DIR) - @for skill in $(BUILTIN_SKILLS_DIR)/*/; do \ - if [ -d "$$skill" ]; then \ - skill_name=$$(basename "$$skill"); \ - if [ -f "$$skill/SKILL.md" ]; then \ - cp -r "$$skill" $(WORKSPACE_SKILLS_DIR); \ - echo " โœ“ Installed skill: $$skill_name"; \ - fi; \ - fi; \ - done @echo "Installation complete!" -## install-skills: Install builtin skills to workspace -install-skills: - @echo "Installing builtin skills to $(WORKSPACE_SKILLS_DIR)..." - @mkdir -p $(WORKSPACE_SKILLS_DIR) - @for skill in $(BUILTIN_SKILLS_DIR)/*/; do \ - if [ -d "$$skill" ]; then \ - skill_name=$$(basename "$$skill"); \ - if [ -f "$$skill/SKILL.md" ]; then \ - mkdir -p $(WORKSPACE_SKILLS_DIR)/$$skill_name; \ - cp -r "$$skill" $(WORKSPACE_SKILLS_DIR); \ - echo " โœ“ Installed skill: $$skill_name"; \ - fi; \ - fi; \ - done - @echo "Skills installation complete!" - ## uninstall: Remove picoclaw from system uninstall: @echo "Uninstalling $(BINARY_NAME)..." diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index 86463c661..191ff8239 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -11,12 +11,14 @@ import ( "context" "fmt" "io" + "io/fs" "os" "os/signal" "path/filepath" "runtime" "strings" "time" + "embed" "github.com/chzyer/readline" "github.com/sipeed/picoclaw/pkg/agent" @@ -36,6 +38,10 @@ import ( "github.com/sipeed/picoclaw/pkg/voice" ) +//go:embed workspace +var embeddedFiles embed.FS + + var ( version = "dev" gitCommit string @@ -208,6 +214,7 @@ func printHelp() { fmt.Println(" version Show version information") } + func onboard() { configPath := getConfigPath() @@ -229,10 +236,6 @@ func onboard() { } workspace := cfg.WorkspacePath() - os.MkdirAll(workspace, 0755) - os.MkdirAll(filepath.Join(workspace, "memory"), 0755) - os.MkdirAll(filepath.Join(workspace, "skills"), 0755) - createWorkspaceTemplates(workspace) fmt.Printf("%s picoclaw is ready!\n", logo) @@ -242,170 +245,57 @@ func onboard() { fmt.Println(" 2. Chat: picoclaw agent -m \"Hello!\"") } +func copyEmbeddedToTarget(targetDir string) error { + // Ensure target directory exists + if err := os.MkdirAll(targetDir, 0755); err != nil { + return fmt.Errorf("Failed to create target directory: %w", err) + } + + // Walk through all files in embed.FS + err := fs.WalkDir(embeddedFiles, "workspace", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + // Skip directories + if d.IsDir() { + return nil + } + + // Read embedded file + data, err := embeddedFiles.ReadFile(path) + if err != nil { + return fmt.Errorf("Failed to read embedded file %s: %w", path, err) + } + + new_path, err := filepath.Rel("workspace", path) + if err != nil { + return fmt.Errorf("Failed to get relative path for %s: %v\n", path, err) + } + + // Build target file path + targetPath := filepath.Join(targetDir, new_path) + + // Ensure target file's directory exists + if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { + return fmt.Errorf("Failed to create directory %s: %w", filepath.Dir(targetPath), err) + } + + // Write file + if err := os.WriteFile(targetPath, data, 0644); err != nil { + return fmt.Errorf("Failed to write file %s: %w", targetPath, err) + } + + return nil + }) + + return err +} + func createWorkspaceTemplates(workspace string) { - templates := map[string]string{ - "AGENTS.md": `# Agent Instructions - -You are a helpful AI assistant. Be concise, accurate, and friendly. - -## Guidelines - -- Always explain what you're doing before taking actions -- Ask for clarification when request is ambiguous -- Use tools to help accomplish tasks -- Remember important information in your memory files -- Be proactive and helpful -- Learn from user feedback -`, - "SOUL.md": `# Soul - -I am picoclaw, a lightweight AI assistant powered by AI. - -## Personality - -- Helpful and friendly -- Concise and to the point -- Curious and eager to learn -- Honest and transparent - -## Values - -- Accuracy over speed -- User privacy and safety -- Transparency in actions -- Continuous improvement -`, - "USER.md": `# User - -Information about user goes here. - -## Preferences - -- Communication style: (casual/formal) -- Timezone: (your timezone) -- Language: (your preferred language) - -## Personal Information - -- Name: (optional) -- Location: (optional) -- Occupation: (optional) - -## Learning Goals - -- What the user wants to learn from AI -- Preferred interaction style -- Areas of interest -`, - "IDENTITY.md": `# Identity - -## Name -PicoClaw ๐Ÿฆž - -## Description -Ultra-lightweight personal AI assistant written in Go, inspired by nanobot. - -## Version -0.1.0 - -## Purpose -- Provide intelligent AI assistance with minimal resource usage -- Support multiple LLM providers (OpenAI, Anthropic, Zhipu, etc.) -- Enable easy customization through skills system -- Run on minimal hardware ($10 boards, <10MB RAM) - -## Capabilities - -- Web search and content fetching -- File system operations (read, write, edit) -- Shell command execution -- Multi-channel messaging (Telegram, WhatsApp, Feishu) -- Skill-based extensibility -- Memory and context management - -## Philosophy - -- Simplicity over complexity -- Performance over features -- User control and privacy -- Transparent operation -- Community-driven development - -## Goals - -- Provide a fast, lightweight AI assistant -- Support offline-first operation where possible -- Enable easy customization and extension -- Maintain high quality responses -- Run efficiently on constrained hardware - -## License -MIT License - Free and open source - -## Repository -https://github.com/sipeed/picoclaw - -## Contact -Issues: https://github.com/sipeed/picoclaw/issues -Discussions: https://github.com/sipeed/picoclaw/discussions - ---- - -"Every bit helps, every bit matters." -- Picoclaw -`, - } - - for filename, content := range templates { - filePath := filepath.Join(workspace, filename) - if _, err := os.Stat(filePath); os.IsNotExist(err) { - os.WriteFile(filePath, []byte(content), 0644) - fmt.Printf(" Created %s\n", filename) - } - } - - memoryDir := filepath.Join(workspace, "memory") - os.MkdirAll(memoryDir, 0755) - memoryFile := filepath.Join(memoryDir, "MEMORY.md") - if _, err := os.Stat(memoryFile); os.IsNotExist(err) { - memoryContent := `# Long-term Memory - -This file stores important information that should persist across sessions. - -## User Information - -(Important facts about user) - -## Preferences - -(User preferences learned over time) - -## Important Notes - -(Things to remember) - -## Configuration - -- Model preferences -- Channel settings -- Skills enabled -` - os.WriteFile(memoryFile, []byte(memoryContent), 0644) - fmt.Println(" Created memory/MEMORY.md") - - skillsDir := filepath.Join(workspace, "skills") - if _, err := os.Stat(skillsDir); os.IsNotExist(err) { - os.MkdirAll(skillsDir, 0755) - fmt.Println(" Created skills/") - } - } - - for filename, content := range templates { - filePath := filepath.Join(workspace, filename) - if _, err := os.Stat(filePath); os.IsNotExist(err) { - os.WriteFile(filePath, []byte(content), 0644) - fmt.Printf(" Created %s\n", filename) - } + err := copyEmbeddedToTarget(workspace) + if err != nil { + fmt.Printf("Error copying workspace templates: %v\n", err) } } diff --git a/workspace/AGENT.md b/workspace/AGENT.md new file mode 100644 index 000000000..5f5fa6480 --- /dev/null +++ b/workspace/AGENT.md @@ -0,0 +1,12 @@ +# Agent Instructions + +You are a helpful AI assistant. Be concise, accurate, and friendly. + +## Guidelines + +- Always explain what you're doing before taking actions +- Ask for clarification when request is ambiguous +- Use tools to help accomplish tasks +- Remember important information in your memory files +- Be proactive and helpful +- Learn from user feedback \ No newline at end of file diff --git a/workspace/IDENTITY.md b/workspace/IDENTITY.md new file mode 100644 index 000000000..dabb0e14b --- /dev/null +++ b/workspace/IDENTITY.md @@ -0,0 +1,56 @@ +# Identity + +## Name +PicoClaw ๐Ÿฆž + +## Description +Ultra-lightweight personal AI assistant written in Go, inspired by nanobot. + +## Version +0.1.0 + +## Purpose +- Provide intelligent AI assistance with minimal resource usage +- Support multiple LLM providers (OpenAI, Anthropic, Zhipu, etc.) +- Enable easy customization through skills system +- Run on minimal hardware ($10 boards, <10MB RAM) + +## Capabilities + +- Web search and content fetching +- File system operations (read, write, edit) +- Shell command execution +- Multi-channel messaging (Telegram, WhatsApp, Feishu) +- Skill-based extensibility +- Memory and context management + +## Philosophy + +- Simplicity over complexity +- Performance over features +- User control and privacy +- Transparent operation +- Community-driven development + +## Goals + +- Provide a fast, lightweight AI assistant +- Support offline-first operation where possible +- Enable easy customization and extension +- Maintain high quality responses +- Run efficiently on constrained hardware + +## License +MIT License - Free and open source + +## Repository +https://github.com/sipeed/picoclaw + +## Contact +Issues: https://github.com/sipeed/picoclaw/issues +Discussions: https://github.com/sipeed/picoclaw/discussions + +--- + +"Every bit helps, every bit matters." +- Picoclaw \ No newline at end of file diff --git a/workspace/SOUL.md b/workspace/SOUL.md new file mode 100644 index 000000000..0be8834f5 --- /dev/null +++ b/workspace/SOUL.md @@ -0,0 +1,17 @@ +# Soul + +I am picoclaw, a lightweight AI assistant powered by AI. + +## Personality + +- Helpful and friendly +- Concise and to the point +- Curious and eager to learn +- Honest and transparent + +## Values + +- Accuracy over speed +- User privacy and safety +- Transparency in actions +- Continuous improvement \ No newline at end of file diff --git a/workspace/USER.md b/workspace/USER.md new file mode 100644 index 000000000..91398a019 --- /dev/null +++ b/workspace/USER.md @@ -0,0 +1,21 @@ +# User + +Information about user goes here. + +## Preferences + +- Communication style: (casual/formal) +- Timezone: (your timezone) +- Language: (your preferred language) + +## Personal Information + +- Name: (optional) +- Location: (optional) +- Occupation: (optional) + +## Learning Goals + +- What the user wants to learn from AI +- Preferred interaction style +- Areas of interest \ No newline at end of file diff --git a/workspace/memory/MEMORY.md b/workspace/memory/MEMORY.md new file mode 100644 index 000000000..265271db9 --- /dev/null +++ b/workspace/memory/MEMORY.md @@ -0,0 +1,21 @@ +# Long-term Memory + +This file stores important information that should persist across sessions. + +## User Information + +(Important facts about user) + +## Preferences + +(User preferences learned over time) + +## Important Notes + +(Things to remember) + +## Configuration + +- Model preferences +- Channel settings +- Skills enabled \ No newline at end of file diff --git a/skills/github/SKILL.md b/workspace/skills/github/SKILL.md similarity index 100% rename from skills/github/SKILL.md rename to workspace/skills/github/SKILL.md diff --git a/skills/hardware/SKILL.md b/workspace/skills/hardware/SKILL.md similarity index 100% rename from skills/hardware/SKILL.md rename to workspace/skills/hardware/SKILL.md diff --git a/skills/hardware/references/board-pinout.md b/workspace/skills/hardware/references/board-pinout.md similarity index 100% rename from skills/hardware/references/board-pinout.md rename to workspace/skills/hardware/references/board-pinout.md diff --git a/skills/hardware/references/common-devices.md b/workspace/skills/hardware/references/common-devices.md similarity index 100% rename from skills/hardware/references/common-devices.md rename to workspace/skills/hardware/references/common-devices.md diff --git a/skills/skill-creator/SKILL.md b/workspace/skills/skill-creator/SKILL.md similarity index 100% rename from skills/skill-creator/SKILL.md rename to workspace/skills/skill-creator/SKILL.md diff --git a/skills/summarize/SKILL.md b/workspace/skills/summarize/SKILL.md similarity index 100% rename from skills/summarize/SKILL.md rename to workspace/skills/summarize/SKILL.md diff --git a/skills/tmux/SKILL.md b/workspace/skills/tmux/SKILL.md similarity index 100% rename from skills/tmux/SKILL.md rename to workspace/skills/tmux/SKILL.md diff --git a/skills/tmux/scripts/find-sessions.sh b/workspace/skills/tmux/scripts/find-sessions.sh similarity index 100% rename from skills/tmux/scripts/find-sessions.sh rename to workspace/skills/tmux/scripts/find-sessions.sh diff --git a/skills/tmux/scripts/wait-for-text.sh b/workspace/skills/tmux/scripts/wait-for-text.sh similarity index 100% rename from skills/tmux/scripts/wait-for-text.sh rename to workspace/skills/tmux/scripts/wait-for-text.sh diff --git a/skills/weather/SKILL.md b/workspace/skills/weather/SKILL.md similarity index 100% rename from skills/weather/SKILL.md rename to workspace/skills/weather/SKILL.md From dbf2739783ccebc7b66a3b7f013551faca0c62d7 Mon Sep 17 00:00:00 2001 From: lxowalle Date: Sun, 15 Feb 2026 02:26:42 +0800 Subject: [PATCH 33/48] fix: Remove the waiting animation for Telegram replies to reduce the risk of being rate-limited. --- pkg/channels/telegram.go | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/pkg/channels/telegram.go b/pkg/channels/telegram.go index 0934dbd08..b14b1632e 100644 --- a/pkg/channels/telegram.go +++ b/pkg/channels/telegram.go @@ -320,37 +320,14 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat } } - // Create new context for thinking animation with timeout - thinkCtx, thinkCancel := context.WithTimeout(ctx, 5*time.Minute) + // Create cancel function for thinking state + _, thinkCancel := context.WithTimeout(ctx, 5*time.Minute) c.stopThinking.Store(chatIDStr, &thinkingCancel{fn: thinkCancel}) pMsg, err := c.bot.SendMessage(ctx, tu.Message(tu.ID(chatID), "Thinking... ๐Ÿ’ญ")) if err == nil { pID := pMsg.MessageID c.placeholders.Store(chatIDStr, pID) - - go func(cid int64, mid int) { - dots := []string{".", "..", "..."} - emotes := []string{"๐Ÿ’ญ", "๐Ÿค”", "โ˜๏ธ"} - i := 0 - ticker := time.NewTicker(2000 * time.Millisecond) - defer ticker.Stop() - for { - select { - case <-thinkCtx.Done(): - return - case <-ticker.C: - i++ - text := fmt.Sprintf("Thinking%s %s", dots[i%len(dots)], emotes[i%len(emotes)]) - _, editErr := c.bot.EditMessageText(thinkCtx, tu.EditMessageText(tu.ID(chatID), mid, text)) - if editErr != nil { - logger.DebugCF("telegram", "Failed to edit thinking message", map[string]interface{}{ - "error": editErr.Error(), - }) - } - } - } - }(chatID, pID) } metadata := map[string]string{ From 7140e73d464285c79b6c71d9d26e1febde7c4b0a Mon Sep 17 00:00:00 2001 From: lxowalle Date: Sun, 15 Feb 2026 03:07:12 +0800 Subject: [PATCH 34/48] * fix fmt bug --- cmd/picoclaw/main.go | 66 +++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index 191ff8239..e424fb7d3 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -9,6 +9,7 @@ package main import ( "bufio" "context" + "embed" "fmt" "io" "io/fs" @@ -18,7 +19,6 @@ import ( "runtime" "strings" "time" - "embed" "github.com/chzyer/readline" "github.com/sipeed/picoclaw/pkg/agent" @@ -41,7 +41,6 @@ import ( //go:embed workspace var embeddedFiles embed.FS - var ( version = "dev" gitCommit string @@ -214,7 +213,6 @@ func printHelp() { fmt.Println(" version Show version information") } - func onboard() { configPath := getConfigPath() @@ -246,50 +244,50 @@ func onboard() { } func copyEmbeddedToTarget(targetDir string) error { - // Ensure target directory exists - if err := os.MkdirAll(targetDir, 0755); err != nil { - return fmt.Errorf("Failed to create target directory: %w", err) - } + // Ensure target directory exists + if err := os.MkdirAll(targetDir, 0755); err != nil { + return fmt.Errorf("Failed to create target directory: %w", err) + } - // Walk through all files in embed.FS - err := fs.WalkDir(embeddedFiles, "workspace", func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } + // Walk through all files in embed.FS + err := fs.WalkDir(embeddedFiles, "workspace", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } - // Skip directories - if d.IsDir() { - return nil - } + // Skip directories + if d.IsDir() { + return nil + } - // Read embedded file - data, err := embeddedFiles.ReadFile(path) - if err != nil { - return fmt.Errorf("Failed to read embedded file %s: %w", path, err) - } + // Read embedded file + data, err := embeddedFiles.ReadFile(path) + if err != nil { + return fmt.Errorf("Failed to read embedded file %s: %w", path, err) + } new_path, err := filepath.Rel("workspace", path) if err != nil { return fmt.Errorf("Failed to get relative path for %s: %v\n", path, err) } - // Build target file path - targetPath := filepath.Join(targetDir, new_path) + // Build target file path + targetPath := filepath.Join(targetDir, new_path) - // Ensure target file's directory exists - if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { - return fmt.Errorf("Failed to create directory %s: %w", filepath.Dir(targetPath), err) - } + // Ensure target file's directory exists + if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { + return fmt.Errorf("Failed to create directory %s: %w", filepath.Dir(targetPath), err) + } - // Write file - if err := os.WriteFile(targetPath, data, 0644); err != nil { - return fmt.Errorf("Failed to write file %s: %w", targetPath, err) - } + // Write file + if err := os.WriteFile(targetPath, data, 0644); err != nil { + return fmt.Errorf("Failed to write file %s: %w", targetPath, err) + } - return nil - }) + return nil + }) - return err + return err } func createWorkspaceTemplates(workspace string) { From 5faa67b77d9ceba411eb8de2627a43319a17b3dd Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 05:23:42 +0800 Subject: [PATCH 35/48] feat: add `Github Copilot` provider --- go.mod | 5 ++ go.sum | 4 ++ pkg/config/config.go | 4 ++ pkg/providers/github_copilot_provider.go | 85 ++++++++++++++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 pkg/providers/github_copilot_provider.go diff --git a/go.mod b/go.mod index f4c233ea8..206f1aafd 100644 --- a/go.mod +++ b/go.mod @@ -19,12 +19,16 @@ require ( golang.org/x/oauth2 v0.35.0 ) + + require ( github.com/andybalholm/brotli v1.2.0 // indirect github.com/bytedance/gopkg v0.1.3 // indirect github.com/bytedance/sonic v1.15.0 // indirect github.com/bytedance/sonic/loader v0.5.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect + github.com/github/copilot-sdk/go v0.1.23 + github.com/google/jsonschema-go v0.4.2 // indirect github.com/go-resty/resty/v2 v2.17.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/grbit/go-json v0.11.0 // indirect @@ -43,4 +47,5 @@ require ( golang.org/x/net v0.50.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/sys v0.41.0 // indirect + ) diff --git a/go.sum b/go.sum index 9174d2889..8f9575122 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/github/copilot-sdk/go v0.1.23 h1:uExtO/inZQndCZMiSAA1hvXINiz9tqo/MZgQzFzurxw= +github.com/github/copilot-sdk/go v0.1.23/go.mod h1:GdwwBfMbm9AABLEM3x5IZKw4ZfwCYxZ1BgyytmZenQ0= github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= github.com/go-resty/resty/v2 v2.17.1 h1:x3aMpHK1YM9e4va/TMDRlusDDoZiQ+ViDu/WpA6xTM4= @@ -56,6 +58,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/jsonschema-go v0.4.2 h1:tmrUohrwoLZZS/P3x7ex0WAVknEkBZM46iALbcqoRA8= +github.com/google/jsonschema-go v0.4.2/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= diff --git a/pkg/config/config.go b/pkg/config/config.go index bbfa2e40b..eafdb006e 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -168,6 +168,7 @@ type ProvidersConfig struct { Moonshot ProviderConfig `json:"moonshot"` ShengSuanYun ProviderConfig `json:"shengsuanyun"` DeepSeek ProviderConfig `json:"deepseek"` + GitHubCopilot ProviderConfig `json:"github_copilot"` } type ProviderConfig struct { @@ -175,8 +176,11 @@ type ProviderConfig struct { APIBase string `json:"api_base" env:"PICOCLAW_PROVIDERS_{{.Name}}_API_BASE"` Proxy string `json:"proxy,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_PROXY"` AuthMethod string `json:"auth_method,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_AUTH_METHOD"` + ConnectMode string `json:"connect_mode,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_CONNECT_MODE"` //only for Github Copilot, `stdio` or `grpc` } + + type GatewayConfig struct { Host string `json:"host" env:"PICOCLAW_GATEWAY_HOST"` Port int `json:"port" env:"PICOCLAW_GATEWAY_PORT"` diff --git a/pkg/providers/github_copilot_provider.go b/pkg/providers/github_copilot_provider.go new file mode 100644 index 000000000..67fbdd568 --- /dev/null +++ b/pkg/providers/github_copilot_provider.go @@ -0,0 +1,85 @@ +package providers + +import ( + "context" + "fmt" + + json "encoding/json" + copilot "github.com/github/copilot-sdk/go" +) + +type GitHubCopilotProvider struct { + uri string + connectMode string // `stdio` or `grpc`` + + session *copilot.Session +} + +func NewGitHubCopilotProvider(uri string, connectMode string, model string) *GitHubCopilotProvider { + + var session *copilot.Session + + switch connectMode { + + case "stdio": + + case "grpc": + client := copilot.NewClient(&copilot.ClientOptions{ + CLIUrl: uri, + }) + if err := client.Start(context.Background()); err != nil { + fmt.Errorf("Can't connect to Github Copilot, https://github.com/github/copilot-sdk/blob/main/docs/getting-started.md#connecting-to-an-external-cli-server for details") + } + defer client.Stop() + session, _ = client.CreateSession(context.Background(), &copilot.SessionConfig{ + Model: model, + Hooks: &copilot.SessionHooks{ + + }, + }) + } + + return &GitHubCopilotProvider{ + uri: uri, + connectMode: connectMode, + + session: session, + } +} + +// Chat sends a chat request to GitHub Copilot +func (p *GitHubCopilotProvider) Chat(ctx context.Context, messages []Message, tools []ToolDefinition, model string, options map[string]interface{}) (*LLMResponse, error) { + type tempMessage struct { + Role string `json:"role"` + Content string `json:"content"` + } + out := make([]tempMessage, 0, len(messages)) + + for _, msg := range messages { + out = append(out, tempMessage{ + Role: msg.Role, + Content: msg.Content, + }) + } + + fullcontent,_ := json.Marshal(out) + + + + + content,_ := p.session.Send(ctx,copilot.MessageOptions{ + Prompt: string(fullcontent), + }) + + return &LLMResponse{ + FinishReason : "stop", + Content: content, + }, nil + +} + + +func (p *GitHubCopilotProvider) GetDefaultModel() string { + + return "gpt-4.1" +} From 0aab8d8afcb69659c663dbcbff2fd0ec77cb4208 Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 06:10:00 +0800 Subject: [PATCH 36/48] feat:add `github_copilot` to providers factory --- pkg/providers/http_provider.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 6fcbd3055..013f787d1 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -314,7 +314,17 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { model = "deepseek-chat" } } + case "github_copilot", "copilot": + if cfg.Providers.GitHubCopilot.APIBase != "" { + apiBase = cfg.Providers.GitHubCopilot.APIBase + }else { + apiBase = "localhost:4321" // no `http://` beacause grpc mode` + } + return NewGitHubCopilotProvider(apiBase, cfg.Providers.GitHubCopilot.ConnectMode, model), nil + } + + } // Fallback: detect provider from model name From 6c392c338758053b928a92bff86769fbd6160c3a Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 06:11:07 +0800 Subject: [PATCH 37/48] fix: openclaw crash because of empty config --- pkg/providers/github_copilot_provider.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pkg/providers/github_copilot_provider.go b/pkg/providers/github_copilot_provider.go index 67fbdd568..4774ac703 100644 --- a/pkg/providers/github_copilot_provider.go +++ b/pkg/providers/github_copilot_provider.go @@ -4,8 +4,10 @@ import ( "context" "fmt" - json "encoding/json" + json "encoding/json" + copilot "github.com/github/copilot-sdk/go" + ) type GitHubCopilotProvider struct { @@ -18,7 +20,9 @@ type GitHubCopilotProvider struct { func NewGitHubCopilotProvider(uri string, connectMode string, model string) *GitHubCopilotProvider { var session *copilot.Session - + if connectMode == "" { + connectMode = "grpc" + } switch connectMode { case "stdio": @@ -37,6 +41,7 @@ func NewGitHubCopilotProvider(uri string, connectMode string, model string) *Git }, }) + } return &GitHubCopilotProvider{ @@ -66,10 +71,11 @@ func (p *GitHubCopilotProvider) Chat(ctx context.Context, messages []Message, to - + fmt.Println("[DEBUG] call p.session.Send") content,_ := p.session.Send(ctx,copilot.MessageOptions{ Prompt: string(fullcontent), }) + fmt.Println("[DEBUG] end cal") return &LLMResponse{ FinishReason : "stop", From ecbe31599efae9f622a6c4a502503be005b59eab Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 06:30:31 +0800 Subject: [PATCH 38/48] chore: remove redundant debug output --- pkg/providers/github_copilot_provider.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/providers/github_copilot_provider.go b/pkg/providers/github_copilot_provider.go index 4774ac703..a6cd20d9f 100644 --- a/pkg/providers/github_copilot_provider.go +++ b/pkg/providers/github_copilot_provider.go @@ -71,11 +71,11 @@ func (p *GitHubCopilotProvider) Chat(ctx context.Context, messages []Message, to - fmt.Println("[DEBUG] call p.session.Send") + content,_ := p.session.Send(ctx,copilot.MessageOptions{ Prompt: string(fullcontent), }) - fmt.Println("[DEBUG] end cal") + return &LLMResponse{ FinishReason : "stop", From 7a9659971df856f9dd91b302dcb33ebde5d0e4a3 Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 06:55:20 +0800 Subject: [PATCH 39/48] make fmt --- pkg/config/config.go | 34 ++++++------ pkg/providers/github_copilot_provider.go | 66 +++++++++++------------- pkg/providers/http_provider.go | 9 ++-- 3 files changed, 49 insertions(+), 60 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index eafdb006e..b6d4e0b7f 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -157,30 +157,28 @@ type DevicesConfig struct { } type ProvidersConfig struct { - Anthropic ProviderConfig `json:"anthropic"` - OpenAI ProviderConfig `json:"openai"` - OpenRouter ProviderConfig `json:"openrouter"` - Groq ProviderConfig `json:"groq"` - Zhipu ProviderConfig `json:"zhipu"` - VLLM ProviderConfig `json:"vllm"` - Gemini ProviderConfig `json:"gemini"` - Nvidia ProviderConfig `json:"nvidia"` - Moonshot ProviderConfig `json:"moonshot"` - ShengSuanYun ProviderConfig `json:"shengsuanyun"` - DeepSeek ProviderConfig `json:"deepseek"` + Anthropic ProviderConfig `json:"anthropic"` + OpenAI ProviderConfig `json:"openai"` + OpenRouter ProviderConfig `json:"openrouter"` + Groq ProviderConfig `json:"groq"` + Zhipu ProviderConfig `json:"zhipu"` + VLLM ProviderConfig `json:"vllm"` + Gemini ProviderConfig `json:"gemini"` + Nvidia ProviderConfig `json:"nvidia"` + Moonshot ProviderConfig `json:"moonshot"` + ShengSuanYun ProviderConfig `json:"shengsuanyun"` + DeepSeek ProviderConfig `json:"deepseek"` GitHubCopilot ProviderConfig `json:"github_copilot"` } type ProviderConfig struct { - APIKey string `json:"api_key" env:"PICOCLAW_PROVIDERS_{{.Name}}_API_KEY"` - APIBase string `json:"api_base" env:"PICOCLAW_PROVIDERS_{{.Name}}_API_BASE"` - Proxy string `json:"proxy,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_PROXY"` - AuthMethod string `json:"auth_method,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_AUTH_METHOD"` - ConnectMode string `json:"connect_mode,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_CONNECT_MODE"` //only for Github Copilot, `stdio` or `grpc` + APIKey string `json:"api_key" env:"PICOCLAW_PROVIDERS_{{.Name}}_API_KEY"` + APIBase string `json:"api_base" env:"PICOCLAW_PROVIDERS_{{.Name}}_API_BASE"` + Proxy string `json:"proxy,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_PROXY"` + AuthMethod string `json:"auth_method,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_AUTH_METHOD"` + ConnectMode string `json:"connect_mode,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_CONNECT_MODE"` //only for Github Copilot, `stdio` or `grpc` } - - type GatewayConfig struct { Host string `json:"host" env:"PICOCLAW_GATEWAY_HOST"` Port int `json:"port" env:"PICOCLAW_GATEWAY_PORT"` diff --git a/pkg/providers/github_copilot_provider.go b/pkg/providers/github_copilot_provider.go index a6cd20d9f..39a3f7e9f 100644 --- a/pkg/providers/github_copilot_provider.go +++ b/pkg/providers/github_copilot_provider.go @@ -7,21 +7,20 @@ import ( json "encoding/json" copilot "github.com/github/copilot-sdk/go" - ) type GitHubCopilotProvider struct { uri string connectMode string // `stdio` or `grpc`` - - session *copilot.Session + + session *copilot.Session } func NewGitHubCopilotProvider(uri string, connectMode string, model string) *GitHubCopilotProvider { var session *copilot.Session - if connectMode == "" { - connectMode = "grpc" + if connectMode == "" { + connectMode = "grpc" } switch connectMode { @@ -37,55 +36,48 @@ func NewGitHubCopilotProvider(uri string, connectMode string, model string) *Git defer client.Stop() session, _ = client.CreateSession(context.Background(), &copilot.SessionConfig{ Model: model, - Hooks: &copilot.SessionHooks{ - - }, + Hooks: &copilot.SessionHooks{}, }) - + } return &GitHubCopilotProvider{ uri: uri, connectMode: connectMode, - - session: session, + + session: session, } } // Chat sends a chat request to GitHub Copilot func (p *GitHubCopilotProvider) Chat(ctx context.Context, messages []Message, tools []ToolDefinition, model string, options map[string]interface{}) (*LLMResponse, error) { - type tempMessage struct { - Role string `json:"role"` - Content string `json:"content"` - } - out := make([]tempMessage, 0, len(messages)) + type tempMessage struct { + Role string `json:"role"` + Content string `json:"content"` + } + out := make([]tempMessage, 0, len(messages)) - for _, msg := range messages { - out = append(out, tempMessage{ - Role: msg.Role, - Content: msg.Content, - }) - } + for _, msg := range messages { + out = append(out, tempMessage{ + Role: msg.Role, + Content: msg.Content, + }) + } - fullcontent,_ := json.Marshal(out) - + fullcontent, _ := json.Marshal(out) + content, _ := p.session.Send(ctx, copilot.MessageOptions{ + Prompt: string(fullcontent), + }) + + return &LLMResponse{ + FinishReason: "stop", + Content: content, + }, nil - - content,_ := p.session.Send(ctx,copilot.MessageOptions{ - Prompt: string(fullcontent), - }) - - - return &LLMResponse{ - FinishReason : "stop", - Content: content, - }, nil - } - func (p *GitHubCopilotProvider) GetDefaultModel() string { - return "gpt-4.1" + return "gpt-4.1" } diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 013f787d1..1bd440fc0 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -317,13 +317,12 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { case "github_copilot", "copilot": if cfg.Providers.GitHubCopilot.APIBase != "" { apiBase = cfg.Providers.GitHubCopilot.APIBase - }else { - apiBase = "localhost:4321" // no `http://` beacause grpc mode` - } + } else { + apiBase = "localhost:4321" // no `http://` beacause grpc mode` + } return NewGitHubCopilotProvider(apiBase, cfg.Providers.GitHubCopilot.ConnectMode, model), nil - + } - } From f6d6221c09d67ce3c395c9281b17d8547cc61bbb Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 07:00:40 +0800 Subject: [PATCH 40/48] make fmt --- pkg/providers/http_provider.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 1bd440fc0..d723ba872 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -318,7 +318,7 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { if cfg.Providers.GitHubCopilot.APIBase != "" { apiBase = cfg.Providers.GitHubCopilot.APIBase } else { - apiBase = "localhost:4321" // no `http://` beacause grpc mode` + apiBase = "localhost:4321" } return NewGitHubCopilotProvider(apiBase, cfg.Providers.GitHubCopilot.ConnectMode, model), nil From 5a6ad37dab6edf3068fea334c407ad234dee8382 Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 07:34:12 +0800 Subject: [PATCH 41/48] code fmt --- cmd/picoclaw/main.go | 66 +++++++++++++++++----------------- pkg/providers/http_provider.go | 2 +- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index 191ff8239..e424fb7d3 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -9,6 +9,7 @@ package main import ( "bufio" "context" + "embed" "fmt" "io" "io/fs" @@ -18,7 +19,6 @@ import ( "runtime" "strings" "time" - "embed" "github.com/chzyer/readline" "github.com/sipeed/picoclaw/pkg/agent" @@ -41,7 +41,6 @@ import ( //go:embed workspace var embeddedFiles embed.FS - var ( version = "dev" gitCommit string @@ -214,7 +213,6 @@ func printHelp() { fmt.Println(" version Show version information") } - func onboard() { configPath := getConfigPath() @@ -246,50 +244,50 @@ func onboard() { } func copyEmbeddedToTarget(targetDir string) error { - // Ensure target directory exists - if err := os.MkdirAll(targetDir, 0755); err != nil { - return fmt.Errorf("Failed to create target directory: %w", err) - } + // Ensure target directory exists + if err := os.MkdirAll(targetDir, 0755); err != nil { + return fmt.Errorf("Failed to create target directory: %w", err) + } - // Walk through all files in embed.FS - err := fs.WalkDir(embeddedFiles, "workspace", func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } + // Walk through all files in embed.FS + err := fs.WalkDir(embeddedFiles, "workspace", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } - // Skip directories - if d.IsDir() { - return nil - } + // Skip directories + if d.IsDir() { + return nil + } - // Read embedded file - data, err := embeddedFiles.ReadFile(path) - if err != nil { - return fmt.Errorf("Failed to read embedded file %s: %w", path, err) - } + // Read embedded file + data, err := embeddedFiles.ReadFile(path) + if err != nil { + return fmt.Errorf("Failed to read embedded file %s: %w", path, err) + } new_path, err := filepath.Rel("workspace", path) if err != nil { return fmt.Errorf("Failed to get relative path for %s: %v\n", path, err) } - // Build target file path - targetPath := filepath.Join(targetDir, new_path) + // Build target file path + targetPath := filepath.Join(targetDir, new_path) - // Ensure target file's directory exists - if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { - return fmt.Errorf("Failed to create directory %s: %w", filepath.Dir(targetPath), err) - } + // Ensure target file's directory exists + if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { + return fmt.Errorf("Failed to create directory %s: %w", filepath.Dir(targetPath), err) + } - // Write file - if err := os.WriteFile(targetPath, data, 0644); err != nil { - return fmt.Errorf("Failed to write file %s: %w", targetPath, err) - } + // Write file + if err := os.WriteFile(targetPath, data, 0644); err != nil { + return fmt.Errorf("Failed to write file %s: %w", targetPath, err) + } - return nil - }) + return nil + }) - return err + return err } func createWorkspaceTemplates(workspace string) { diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index d723ba872..52a380239 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -318,7 +318,7 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { if cfg.Providers.GitHubCopilot.APIBase != "" { apiBase = cfg.Providers.GitHubCopilot.APIBase } else { - apiBase = "localhost:4321" + apiBase = "localhost:4321" } return NewGitHubCopilotProvider(apiBase, cfg.Providers.GitHubCopilot.ConnectMode, model), nil From 9eb1a53fb856993e2a4be853773e51e94be156e4 Mon Sep 17 00:00:00 2001 From: lxowalle Date: Sun, 15 Feb 2026 07:43:46 +0800 Subject: [PATCH 42/48] fix: PR workflow execution failure --- .github/workflows/pr.yml | 6 ++++++ Makefile | 25 ++++++++++++++++++------- cmd/picoclaw/main.go | 1 + 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 35ad87ac5..fac7597ea 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -32,6 +32,9 @@ jobs: with: go-version-file: go.mod + - name: Run go generate + run: go generate ./... + - name: Run go vet run: go vet ./... @@ -47,6 +50,9 @@ jobs: with: go-version-file: go.mod + - name: Run go generate + run: go generate ./... + - name: Run go test run: go test ./... diff --git a/Makefile b/Makefile index 55144bf1e..058fdb790 100644 --- a/Makefile +++ b/Makefile @@ -63,21 +63,24 @@ BINARY_PATH=$(BUILD_DIR)/$(BINARY_NAME)-$(PLATFORM)-$(ARCH) # Default target all: build +## generate: Run generate +generate: + @echo "Run generate..." + @rm -r ./$(CMD_DIR)/workspace 2>/dev/null || true + @$(GO) generate ./... + @echo "Run generate complete" + ## build: Build the picoclaw binary for current platform -build: +build: generate @echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..." @mkdir -p $(BUILD_DIR) - @rm -r ./$(CMD_DIR)/workspace 2>/dev/null || true - @cp -r workspace ./$(CMD_DIR)/workspace 2>/dev/null || true - $(GO) build $(GOFLAGS) $(LDFLAGS) -o $(BINARY_PATH) ./$(CMD_DIR) + @$(GO) build $(GOFLAGS) $(LDFLAGS) -o $(BINARY_PATH) ./$(CMD_DIR) @echo "Build complete: $(BINARY_PATH)" @ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME) ## build-all: Build picoclaw for all platforms -build-all: +build-all: generate @echo "Building for multiple platforms..." - @rm -r ./$(CMD_DIR)/workspace 2>/dev/null || true - @cp -r workspace ./$(CMD_DIR)/workspace 2>/dev/null || true @mkdir -p $(BUILD_DIR) GOOS=linux GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 ./$(CMD_DIR) GOOS=linux GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR) @@ -116,6 +119,14 @@ clean: @rm -rf $(BUILD_DIR) @echo "Clean complete" +## fmt: Format Go code +vet: + @$(GO) vet ./... + +## fmt: Format Go code +test: + @$(GO) test ./... + ## fmt: Format Go code fmt: @$(GO) fmt ./... diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index e424fb7d3..2129662d7 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -38,6 +38,7 @@ import ( "github.com/sipeed/picoclaw/pkg/voice" ) +//go:generate cp -r ../../workspace . //go:embed workspace var embeddedFiles embed.FS From 0a4bf32e81fb8bb93b78c76b5dbbce5a84cb8b30 Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 07:54:04 +0800 Subject: [PATCH 43/48] try after workflow fix --- pkg/providers/github_copilot_provider.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/providers/github_copilot_provider.go b/pkg/providers/github_copilot_provider.go index 39a3f7e9f..ec9b1b68d 100644 --- a/pkg/providers/github_copilot_provider.go +++ b/pkg/providers/github_copilot_provider.go @@ -25,7 +25,7 @@ func NewGitHubCopilotProvider(uri string, connectMode string, model string) *Git switch connectMode { case "stdio": - + //todo case "grpc": client := copilot.NewClient(&copilot.ClientOptions{ CLIUrl: uri, From 4b886b65739a91a771a38d793b89b2c2c250a50f Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 08:02:23 +0800 Subject: [PATCH 44/48] fix: not used result --- pkg/providers/github_copilot_provider.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pkg/providers/github_copilot_provider.go b/pkg/providers/github_copilot_provider.go index ec9b1b68d..5058819f5 100644 --- a/pkg/providers/github_copilot_provider.go +++ b/pkg/providers/github_copilot_provider.go @@ -16,7 +16,7 @@ type GitHubCopilotProvider struct { session *copilot.Session } -func NewGitHubCopilotProvider(uri string, connectMode string, model string) *GitHubCopilotProvider { +func NewGitHubCopilotProvider(uri string, connectMode string, model string) (*GitHubCopilotProvider, error) { var session *copilot.Session if connectMode == "" { @@ -31,7 +31,7 @@ func NewGitHubCopilotProvider(uri string, connectMode string, model string) *Git CLIUrl: uri, }) if err := client.Start(context.Background()); err != nil { - fmt.Errorf("Can't connect to Github Copilot, https://github.com/github/copilot-sdk/blob/main/docs/getting-started.md#connecting-to-an-external-cli-server for details") + return nil, fmt.Errorf("Can't connect to Github Copilot, https://github.com/github/copilot-sdk/blob/main/docs/getting-started.md#connecting-to-an-external-cli-server for details") } defer client.Stop() session, _ = client.CreateSession(context.Background(), &copilot.SessionConfig{ @@ -44,9 +44,8 @@ func NewGitHubCopilotProvider(uri string, connectMode string, model string) *Git return &GitHubCopilotProvider{ uri: uri, connectMode: connectMode, - - session: session, - } + session: session, + }, nil } // Chat sends a chat request to GitHub Copilot From 16e5a0295386c034b8812c16831dda17b7a209b1 Mon Sep 17 00:00:00 2001 From: Lixeer <1612655510@qq.com> Date: Sun, 15 Feb 2026 08:06:29 +0800 Subject: [PATCH 45/48] fix(http_provider): Remove extra parameter from CreateProvider function. --- pkg/providers/http_provider.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 52a380239..0bea16d6a 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -320,7 +320,7 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { } else { apiBase = "localhost:4321" } - return NewGitHubCopilotProvider(apiBase, cfg.Providers.GitHubCopilot.ConnectMode, model), nil + return NewGitHubCopilotProvider(apiBase, cfg.Providers.GitHubCopilot.ConnectMode, model) } From 0a88ff08172fa93aef1f3c781e96c0150cfdd136 Mon Sep 17 00:00:00 2001 From: xiaoen <2768753269@qq.com> Date: Sun, 15 Feb 2026 00:28:36 +0800 Subject: [PATCH 46/48] fix: resolve multiple bugs from code review #116 Fixes four issues identified in the community code review: - Session persistence broken on Windows: session keys like "telegram:123456" contain ':', which is illegal in Windows filenames. filepath.Base() strips drive-letter prefixes on Windows, causing Save() to silently fail. Added sanitizeFilename() to replace invalid chars in the filename while keeping the original key in the JSON payload. - HTTP client with no timeout: HTTPProvider used Timeout: 0 (infinite wait), which can hang the entire agent if an API endpoint becomes unresponsive. Set a 120s safety timeout. - Slack AllowFrom type mismatch: SlackConfig used plain []string while every other channel uses FlexibleStringSlice, so numeric user IDs in Slack config would fail to parse. - Token estimation wrong for CJK: estimateTokens() divided byte length by 4, but CJK characters are 3 bytes each, causing ~3x overestimation and premature summarization. Switched to utf8.RuneCountInString() / 3 for better cross-language accuracy. Also added unit tests for the session filename sanitization. Ref #116 --- pkg/agent/loop.go | 6 ++- pkg/config/config.go | 10 ++--- pkg/providers/http_provider.go | 3 +- pkg/session/manager.go | 20 +++++++-- pkg/session/manager_test.go | 74 ++++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 pkg/session/manager_test.go diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 73e837119..f3dd94090 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -16,6 +16,7 @@ import ( "sync" "sync/atomic" "time" + "unicode/utf8" "github.com/sipeed/picoclaw/pkg/bus" "github.com/sipeed/picoclaw/pkg/config" @@ -768,10 +769,13 @@ func (al *AgentLoop) summarizeBatch(ctx context.Context, batch []providers.Messa } // estimateTokens estimates the number of tokens in a message list. +// Uses rune count instead of byte length so that CJK and other multi-byte +// characters are not over-counted (a Chinese character is 3 bytes but roughly +// one token). func (al *AgentLoop) estimateTokens(messages []providers.Message) int { total := 0 for _, m := range messages { - total += len(m.Content) / 4 // Simple heuristic: 4 chars per token + total += utf8.RuneCountInString(m.Content) / 3 } return total } diff --git a/pkg/config/config.go b/pkg/config/config.go index bbfa2e40b..70afb27f9 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -130,10 +130,10 @@ type DingTalkConfig struct { } type SlackConfig struct { - Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_SLACK_ENABLED"` - BotToken string `json:"bot_token" env:"PICOCLAW_CHANNELS_SLACK_BOT_TOKEN"` - AppToken string `json:"app_token" env:"PICOCLAW_CHANNELS_SLACK_APP_TOKEN"` - AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_SLACK_ALLOW_FROM"` + Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_SLACK_ENABLED"` + BotToken string `json:"bot_token" env:"PICOCLAW_CHANNELS_SLACK_BOT_TOKEN"` + AppToken string `json:"app_token" env:"PICOCLAW_CHANNELS_SLACK_APP_TOKEN"` + AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_SLACK_ALLOW_FROM"` } type LINEConfig struct { @@ -261,7 +261,7 @@ func DefaultConfig() *Config { Enabled: false, BotToken: "", AppToken: "", - AllowFrom: []string{}, + AllowFrom: FlexibleStringSlice{}, }, LINE: LINEConfig{ Enabled: false, diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 6fcbd3055..b6a17e6b2 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -15,6 +15,7 @@ import ( "net/http" "net/url" "strings" + "time" "github.com/sipeed/picoclaw/pkg/auth" "github.com/sipeed/picoclaw/pkg/config" @@ -28,7 +29,7 @@ type HTTPProvider struct { func NewHTTPProvider(apiKey, apiBase, proxy string) *HTTPProvider { client := &http.Client{ - Timeout: 0, + Timeout: 120 * time.Second, } if proxy != "" { diff --git a/pkg/session/manager.go b/pkg/session/manager.go index 193ad2b30..9981d4901 100644 --- a/pkg/session/manager.go +++ b/pkg/session/manager.go @@ -145,13 +145,27 @@ func (sm *SessionManager) TruncateHistory(key string, keepLast int) { session.Updated = time.Now() } +// sanitizeFilename converts a session key into a cross-platform safe filename. +// Session keys use "channel:chatID" (e.g. "telegram:123456") but ':' is the +// volume separator on Windows, so filepath.Base would misinterpret the key. +// We replace it with '_'. The original key is preserved inside the JSON file, +// so loadSessions still maps back to the right in-memory key. +func sanitizeFilename(key string) string { + return strings.ReplaceAll(key, ":", "_") +} + func (sm *SessionManager) Save(key string) error { if sm.storage == "" { return nil } - // Validate key to avoid invalid filenames and path traversal. - if key == "" || key == "." || key == ".." || key != filepath.Base(key) || strings.Contains(key, "/") || strings.Contains(key, "\\") { + filename := sanitizeFilename(key) + + // filepath.IsLocal rejects empty names, "..", absolute paths, and + // OS-reserved device names (NUL, COM1 โ€ฆ on Windows). + // The extra checks reject "." and any directory separators so that + // the session file is always written directly inside sm.storage. + if filename == "." || !filepath.IsLocal(filename) || strings.ContainsAny(filename, `/\`) { return os.ErrInvalid } @@ -182,7 +196,7 @@ func (sm *SessionManager) Save(key string) error { return err } - sessionPath := filepath.Join(sm.storage, key+".json") + sessionPath := filepath.Join(sm.storage, filename+".json") tmpFile, err := os.CreateTemp(sm.storage, "session-*.tmp") if err != nil { return err diff --git a/pkg/session/manager_test.go b/pkg/session/manager_test.go new file mode 100644 index 000000000..5ef5f4349 --- /dev/null +++ b/pkg/session/manager_test.go @@ -0,0 +1,74 @@ +package session + +import ( + "os" + "path/filepath" + "testing" +) + +func TestSanitizeFilename(t *testing.T) { + tests := []struct { + input string + expected string + }{ + {"simple", "simple"}, + {"telegram:123456", "telegram_123456"}, + {"discord:987654321", "discord_987654321"}, + {"slack:C01234", "slack_C01234"}, + {"no-colons-here", "no-colons-here"}, + {"multiple:colons:here", "multiple_colons_here"}, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + got := sanitizeFilename(tt.input) + if got != tt.expected { + t.Errorf("sanitizeFilename(%q) = %q, want %q", tt.input, got, tt.expected) + } + }) + } +} + +func TestSave_WithColonInKey(t *testing.T) { + tmpDir := t.TempDir() + sm := NewSessionManager(tmpDir) + + // Create a session with a key containing colon (typical channel session key). + key := "telegram:123456" + sm.GetOrCreate(key) + sm.AddMessage(key, "user", "hello") + + // Save should succeed even though the key contains ':' + if err := sm.Save(key); err != nil { + t.Fatalf("Save(%q) failed: %v", key, err) + } + + // The file on disk should use sanitized name. + expectedFile := filepath.Join(tmpDir, "telegram_123456.json") + if _, err := os.Stat(expectedFile); os.IsNotExist(err) { + t.Fatalf("expected session file %s to exist", expectedFile) + } + + // Load into a fresh manager and verify the session round-trips. + sm2 := NewSessionManager(tmpDir) + history := sm2.GetHistory(key) + if len(history) != 1 { + t.Fatalf("expected 1 message after reload, got %d", len(history)) + } + if history[0].Content != "hello" { + t.Errorf("expected message content %q, got %q", "hello", history[0].Content) + } +} + +func TestSave_RejectsPathTraversal(t *testing.T) { + tmpDir := t.TempDir() + sm := NewSessionManager(tmpDir) + + badKeys := []string{"", ".", "..", "foo/bar", "foo\\bar"} + for _, key := range badKeys { + sm.GetOrCreate(key) + if err := sm.Save(key); err == nil { + t.Errorf("Save(%q) should have failed but didn't", key) + } + } +} From 9a3f3611c30e6108707ace0af56b9b35158f0a75 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Sun, 15 Feb 2026 09:50:01 +0800 Subject: [PATCH 47/48] ci: init goreleaser --- .gitignore | 3 +++ .goreleaser.yaml | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 .goreleaser.yaml diff --git a/.gitignore b/.gitignore index 3e5cee80f..ce30d749e 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ tasks/ # Editors .vscode/ .idea/ + +# Added by goreleaser init: +dist/ diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 000000000..a2c158331 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,61 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj +version: 2 + +before: + hooks: + - go mod tidy + +builds: + - env: + - CGO_ENABLED=0 + goos: + - linux + - windows + - darwin + - freebsd + goarch: + - amd64 + - arm64 + - riscv64 + - s390x + - mips64 + - arm + main: ./cmd/picoclaw + ignore: + - goos: windows + goarch: arm + +archives: + - formats: [tar.gz] + # this name template makes the OS and Arch compatible with the results of `uname`. + name_template: >- + {{ .ProjectName }}_ + {{- title .Os }}_ + {{- if eq .Arch "amd64" }}x86_64 + {{- else if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + # use zip for windows archives + format_overrides: + - goos: windows + formats: [zip] + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +upx: + - enabled: true + compress: best + lzma: true + +release: + footer: >- + + --- + + Released by [GoReleaser](https://github.com/goreleaser/goreleaser). diff --git a/Dockerfile b/Dockerfile index 59c28a1aa..433d962f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # ============================================================ # Stage 1: Build the picoclaw binary # ============================================================ -FROM golang:1.25.7-alpine AS builder +FROM golang:1.26.0-alpine AS builder RUN apk add --no-cache git make From 214b201bfaf2577a6ea53896c1bf626a63af41c6 Mon Sep 17 00:00:00 2001 From: zepan Date: Sun, 15 Feb 2026 20:49:58 +0800 Subject: [PATCH 48/48] update wechat group qrcode --- README.md | 2 +- README.zh.md | 4 ++-- assets/wechat.png | Bin 148820 -> 143766 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a61a1abf4..091af2811 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ > * **NO CRYPTO:** PicoClaw has **NO** official token/coin. All claims on `pump.fun` or other trading platforms are **SCAMS**. > * **OFFICIAL DOMAIN:** The **ONLY** official website is **[picoclaw.io](https://picoclaw.io)**, and company website is **[sipeed.com](https://sipeed.com)** > * **Warning:** Many `.ai/.org/.com/.net/...` domains are registered by third parties. -> +> * **Warning:** picoclaw is in early development now and may have unresolved network security issues. Do not deploy to production environments before the v1.0 release. ## ๐Ÿ“ข News diff --git a/README.zh.md b/README.zh.md index f94abce88..5a1c3c50b 100644 --- a/README.zh.md +++ b/README.zh.md @@ -45,8 +45,8 @@ > * **ๆ— ๅŠ ๅฏ†่ดงๅธ (NO CRYPTO):** PicoClaw **ๆฒกๆœ‰** ๅ‘่กŒไปปไฝ•ๅฎ˜ๆ–นไปฃๅธใ€Token ๆˆ–่™šๆ‹Ÿ่ดงๅธใ€‚ๆ‰€ๆœ‰ๅœจ `pump.fun` ๆˆ–ๅ…ถไป–ไบคๆ˜“ๅนณๅฐไธŠ็š„็›ธๅ…ณๅฃฐ็งฐๅ‡ไธบ **่ฏˆ้ช—**ใ€‚ > * **ๅฎ˜ๆ–นๅŸŸๅ:** ๅ”ฏไธ€็š„ๅฎ˜ๆ–น็ฝ‘็ซ™ๆ˜ฏ **[picoclaw.io](https://picoclaw.io)**๏ผŒๅ…ฌๅธๅฎ˜็ฝ‘ๆ˜ฏ **[sipeed.com](https://sipeed.com)**ใ€‚ > * **่ญฆๆƒ•:** ่ฎธๅคš `.ai/.org/.com/.net/...` ๅŽ็ผ€็š„ๅŸŸๅ่ขซ็ฌฌไธ‰ๆ–นๆŠขๆณจ๏ผŒ่ฏทๅ‹ฟ่ฝปไฟกใ€‚ -> -> +> * **ๆณจๆ„:** picoclawๆญฃๅœจๅˆๆœŸ็š„ๅฟซ้€ŸๅŠŸ่ƒฝๅผ€ๅ‘้˜ถๆฎต๏ผŒๅฏ่ƒฝๆœ‰ๅฐšๆœชไฟฎๅค็š„็ฝ‘็ปœๅฎ‰ๅ…จ้—ฎ้ข˜๏ผŒๅœจ1.0ๆญฃๅผ็‰ˆๅ‘ๅธƒๅ‰๏ผŒ่ฏทไธ่ฆๅฐ†ๅ…ถ้ƒจ็ฝฒๅˆฐ็”Ÿไบง็Žฏๅขƒไธญ + ## ๐Ÿ“ข ๆ–ฐ้—ป (News) diff --git a/assets/wechat.png b/assets/wechat.png index 0f97fa3eed73bd214bb34cc945b771b00c64a878..d62c8d09db29a2bf18e191f6f1df264e1d9c5331 100644 GIT binary patch literal 143766 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%0A+oB}cT_YjG9fPI42Y_jE47MQ;T;dv& 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 TVP}o%A2+w>JZEn=uNe6krd#FG literal 148820 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 J!3sLb{{ncip^5+i

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 J!3sLb{{ncip^5+i literal 146556 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 P-L#S$T5!k2xaR)=>fm$F From d7822e5d5246d57ae24ba2d37b6397851d4884a9 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Sat, 14 Feb 2026 09:47:55 +0800 Subject: [PATCH 12/48] chore: fmt code in build --- .github/workflows/build.yml | 4 ++++ pkg/channels/base_test.go | 1 - pkg/tools/web.go | 8 ++++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 465d1d6d4..6a138b818 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,6 +15,10 @@ jobs: uses: actions/setup-go@v5 with: go-version-file: go.mod + - name: fmt + run: | + make fmt + git diff --exit-code || (echo "::error::Code is not formatted. Run 'make fmt' and commit the changes." && exit 1) - name: Build run: make build-all diff --git a/pkg/channels/base_test.go b/pkg/channels/base_test.go index f82b04c46..78c6d1d66 100644 --- a/pkg/channels/base_test.go +++ b/pkg/channels/base_test.go @@ -50,4 +50,3 @@ func TestBaseChannelIsAllowed(t *testing.T) { }) } } - diff --git a/pkg/tools/web.go b/pkg/tools/web.go index 6fc89c95b..804d9d168 100644 --- a/pkg/tools/web.go +++ b/pkg/tools/web.go @@ -114,7 +114,7 @@ func (p *DuckDuckGoSearchProvider) Search(ctx context.Context, query string, cou func (p *DuckDuckGoSearchProvider) extractResults(html string, count int, query string) (string, error) { // Simple regex based extraction for DDG HTML // Strategy: Find all result containers or key anchors directly - + // Try finding the result links directly first, as they are the most critical // Pattern: Title // The previous regex was a bit strict. Let's make it more flexible for attributes order/content @@ -133,14 +133,14 @@ func (p *DuckDuckGoSearchProvider) extractResults(html string, count int, query // But simple global search for snippets might mismatch order. // Since we only have the raw HTML string, let's just extract snippets globally and assume order matches (risky but simple for regex) // Or better: Let's assume the snippet follows the link in the HTML - + // A better regex approach: iterate through text and find matches in order // But for now, let's grab all snippets too reSnippet := regexp.MustCompile(`([\s\S]*?)`) snippetMatches := reSnippet.FindAllStringSubmatch(html, count+5) maxItems := min(len(matches), count) - + for i := 0; i < maxItems; i++ { urlStr := matches[i][1] title := stripTags(matches[i][2]) @@ -157,7 +157,7 @@ func (p *DuckDuckGoSearchProvider) extractResults(html string, count int, query } lines = append(lines, fmt.Sprintf("%d. %s\n %s", i+1, title, urlStr)) - + // Attempt to attach snippet if available and index aligns if i < len(snippetMatches) { snippet := stripTags(snippetMatches[i][1]) From ff9297336103d50b64fd75660f8b866847959ad9 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Sat, 14 Feb 2026 09:56:21 +0800 Subject: [PATCH 13/48] chore: fix tab in build --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6a138b818..0f075b0bb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,8 +15,9 @@ jobs: uses: actions/setup-go@v5 with: go-version-file: go.mod + - name: fmt - run: | + run: | make fmt git diff --exit-code || (echo "::error::Code is not formatted. Run 'make fmt' and commit the changes." && exit 1) From ac79a23e0a1cb6d0b5b97208a3c63a1832df13a3 Mon Sep 17 00:00:00 2001 From: ex-takashima Date: Sat, 14 Feb 2026 11:21:47 +0900 Subject: [PATCH 14/48] style: fix gofmt formatting (CRLF -> LF) Co-Authored-By: Claude Opus 4.6 --- pkg/channels/base_test.go | 1 - pkg/channels/line.go | 1196 ++++++++++++++++++------------------- pkg/tools/web.go | 8 +- 3 files changed, 602 insertions(+), 603 deletions(-) diff --git a/pkg/channels/base_test.go b/pkg/channels/base_test.go index f82b04c46..78c6d1d66 100644 --- a/pkg/channels/base_test.go +++ b/pkg/channels/base_test.go @@ -50,4 +50,3 @@ func TestBaseChannelIsAllowed(t *testing.T) { }) } } - diff --git a/pkg/channels/line.go b/pkg/channels/line.go index 580e98480..ffb5533e8 100644 --- a/pkg/channels/line.go +++ b/pkg/channels/line.go @@ -1,598 +1,598 @@ -package channels - -import ( - "bytes" - "context" - "crypto/hmac" - "crypto/sha256" - "encoding/base64" - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "strings" - "sync" - "time" - - "github.com/sipeed/picoclaw/pkg/bus" - "github.com/sipeed/picoclaw/pkg/config" - "github.com/sipeed/picoclaw/pkg/logger" - "github.com/sipeed/picoclaw/pkg/utils" -) - -const ( - lineAPIBase = "https://api.line.me/v2/bot" - lineDataAPIBase = "https://api-data.line.me/v2/bot" - lineReplyEndpoint = lineAPIBase + "/message/reply" - linePushEndpoint = lineAPIBase + "/message/push" - lineContentEndpoint = lineDataAPIBase + "/message/%s/content" - lineBotInfoEndpoint = lineAPIBase + "/info" - lineLoadingEndpoint = lineAPIBase + "/chat/loading/start" - lineReplyTokenMaxAge = 25 * time.Second -) - -type replyTokenEntry struct { - token string - timestamp time.Time -} - -// LINEChannel implements the Channel interface for LINE Official Account -// using the LINE Messaging API with HTTP webhook for receiving messages -// and REST API for sending messages. -type LINEChannel struct { - *BaseChannel - config config.LINEConfig - httpServer *http.Server - botUserID string // Bot's user ID - botBasicID string // Bot's basic ID (e.g. @216ru...) - botDisplayName string // Bot's display name for text-based mention detection - replyTokens sync.Map // chatID -> replyTokenEntry - quoteTokens sync.Map // chatID -> quoteToken (string) - ctx context.Context - cancel context.CancelFunc -} - -// NewLINEChannel creates a new LINE channel instance. -func NewLINEChannel(cfg config.LINEConfig, messageBus *bus.MessageBus) (*LINEChannel, error) { - if cfg.ChannelSecret == "" || cfg.ChannelAccessToken == "" { - return nil, fmt.Errorf("line channel_secret and channel_access_token are required") - } - - base := NewBaseChannel("line", cfg, messageBus, cfg.AllowFrom) - - return &LINEChannel{ - BaseChannel: base, - config: cfg, - }, nil -} - -// Start launches the HTTP webhook server. -func (c *LINEChannel) Start(ctx context.Context) error { - logger.InfoC("line", "Starting LINE channel (Webhook Mode)") - - c.ctx, c.cancel = context.WithCancel(ctx) - - // Fetch bot profile to get bot's userId for mention detection - if err := c.fetchBotInfo(); err != nil { - logger.WarnCF("line", "Failed to fetch bot info (mention detection disabled)", map[string]interface{}{ - "error": err.Error(), - }) - } else { - logger.InfoCF("line", "Bot info fetched", map[string]interface{}{ - "bot_user_id": c.botUserID, - "basic_id": c.botBasicID, - "display_name": c.botDisplayName, - }) - } - - mux := http.NewServeMux() - path := c.config.WebhookPath - if path == "" { - path = "/webhook/line" - } - mux.HandleFunc(path, c.webhookHandler) - - addr := fmt.Sprintf("%s:%d", c.config.WebhookHost, c.config.WebhookPort) - c.httpServer = &http.Server{ - Addr: addr, - Handler: mux, - } - - go func() { - logger.InfoCF("line", "LINE webhook server listening", map[string]interface{}{ - "addr": addr, - "path": path, - }) - if err := c.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { - logger.ErrorCF("line", "Webhook server error", map[string]interface{}{ - "error": err.Error(), - }) - } - }() - - c.setRunning(true) - logger.InfoC("line", "LINE channel started (Webhook Mode)") - return nil -} - -// fetchBotInfo retrieves the bot's userId, basicId, and displayName from the LINE API. -func (c *LINEChannel) fetchBotInfo() error { - req, err := http.NewRequest(http.MethodGet, lineBotInfoEndpoint, nil) - if err != nil { - return err - } - req.Header.Set("Authorization", "Bearer "+c.config.ChannelAccessToken) - - client := &http.Client{Timeout: 10 * time.Second} - resp, err := client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("bot info API returned status %d", resp.StatusCode) - } - - var info struct { - UserID string `json:"userId"` - BasicID string `json:"basicId"` - DisplayName string `json:"displayName"` - } - if err := json.NewDecoder(resp.Body).Decode(&info); err != nil { - return err - } - - c.botUserID = info.UserID - c.botBasicID = info.BasicID - c.botDisplayName = info.DisplayName - return nil -} - -// Stop gracefully shuts down the HTTP server. -func (c *LINEChannel) Stop(ctx context.Context) error { - logger.InfoC("line", "Stopping LINE channel") - - if c.cancel != nil { - c.cancel() - } - - if c.httpServer != nil { - shutdownCtx, cancel := context.WithTimeout(ctx, 5*time.Second) - defer cancel() - if err := c.httpServer.Shutdown(shutdownCtx); err != nil { - logger.ErrorCF("line", "Webhook server shutdown error", map[string]interface{}{ - "error": err.Error(), - }) - } - } - - c.setRunning(false) - logger.InfoC("line", "LINE channel stopped") - return nil -} - -// webhookHandler handles incoming LINE webhook requests. -func (c *LINEChannel) webhookHandler(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - return - } - - body, err := io.ReadAll(r.Body) - if err != nil { - logger.ErrorCF("line", "Failed to read request body", map[string]interface{}{ - "error": err.Error(), - }) - http.Error(w, "Bad request", http.StatusBadRequest) - return - } - - signature := r.Header.Get("X-Line-Signature") - if !c.verifySignature(body, signature) { - logger.WarnC("line", "Invalid webhook signature") - http.Error(w, "Forbidden", http.StatusForbidden) - return - } - - var payload struct { - Events []lineEvent `json:"events"` - } - if err := json.Unmarshal(body, &payload); err != nil { - logger.ErrorCF("line", "Failed to parse webhook payload", map[string]interface{}{ - "error": err.Error(), - }) - http.Error(w, "Bad request", http.StatusBadRequest) - return - } - - // Return 200 immediately, process events asynchronously - w.WriteHeader(http.StatusOK) - - for _, event := range payload.Events { - go c.processEvent(event) - } -} - -// verifySignature validates the X-Line-Signature using HMAC-SHA256. -func (c *LINEChannel) verifySignature(body []byte, signature string) bool { - if signature == "" { - return false - } - - mac := hmac.New(sha256.New, []byte(c.config.ChannelSecret)) - mac.Write(body) - expected := base64.StdEncoding.EncodeToString(mac.Sum(nil)) - - return hmac.Equal([]byte(expected), []byte(signature)) -} - -// LINE webhook event types -type lineEvent struct { - Type string `json:"type"` - ReplyToken string `json:"replyToken"` - Source lineSource `json:"source"` - Message json.RawMessage `json:"message"` - Timestamp int64 `json:"timestamp"` -} - -type lineSource struct { - Type string `json:"type"` // "user", "group", "room" - UserID string `json:"userId"` - GroupID string `json:"groupId"` - RoomID string `json:"roomId"` -} - -type lineMessage struct { - ID string `json:"id"` - Type string `json:"type"` // "text", "image", "video", "audio", "file", "sticker" - Text string `json:"text"` - QuoteToken string `json:"quoteToken"` - Mention *struct { - Mentionees []lineMentionee `json:"mentionees"` - } `json:"mention"` - ContentProvider struct { - Type string `json:"type"` - } `json:"contentProvider"` -} - -type lineMentionee struct { - Index int `json:"index"` - Length int `json:"length"` - Type string `json:"type"` // "user", "all" - UserID string `json:"userId"` -} - -func (c *LINEChannel) processEvent(event lineEvent) { - if event.Type != "message" { - logger.DebugCF("line", "Ignoring non-message event", map[string]interface{}{ - "type": event.Type, - }) - return - } - - senderID := event.Source.UserID - chatID := c.resolveChatID(event.Source) - isGroup := event.Source.Type == "group" || event.Source.Type == "room" - - var msg lineMessage - if err := json.Unmarshal(event.Message, &msg); err != nil { - logger.ErrorCF("line", "Failed to parse message", map[string]interface{}{ - "error": err.Error(), - }) - return - } - - // In group chats, only respond when the bot is mentioned - if isGroup && !c.isBotMentioned(msg) { - logger.DebugCF("line", "Ignoring group message without mention", map[string]interface{}{ - "chat_id": chatID, - }) - return - } - - // Store reply token for later use - if event.ReplyToken != "" { - c.replyTokens.Store(chatID, replyTokenEntry{ - token: event.ReplyToken, - timestamp: time.Now(), - }) - } - - // Store quote token for quoting the original message in reply - if msg.QuoteToken != "" { - c.quoteTokens.Store(chatID, msg.QuoteToken) - } - - var content string - var mediaPaths []string - localFiles := []string{} - - defer func() { - for _, file := range localFiles { - if err := os.Remove(file); err != nil { - logger.DebugCF("line", "Failed to cleanup temp file", map[string]interface{}{ - "file": file, - "error": err.Error(), - }) - } - } - }() - - switch msg.Type { - case "text": - content = msg.Text - // Strip bot mention from text in group chats - if isGroup { - content = c.stripBotMention(content, msg) - } - case "image": - localPath := c.downloadContent(msg.ID, "image.jpg") - if localPath != "" { - localFiles = append(localFiles, localPath) - mediaPaths = append(mediaPaths, localPath) - content = "[image]" - } - case "audio": - localPath := c.downloadContent(msg.ID, "audio.m4a") - if localPath != "" { - localFiles = append(localFiles, localPath) - mediaPaths = append(mediaPaths, localPath) - content = "[audio]" - } - case "video": - localPath := c.downloadContent(msg.ID, "video.mp4") - if localPath != "" { - localFiles = append(localFiles, localPath) - mediaPaths = append(mediaPaths, localPath) - content = "[video]" - } - case "file": - content = "[file]" - case "sticker": - content = "[sticker]" - default: - content = fmt.Sprintf("[%s]", msg.Type) - } - - if strings.TrimSpace(content) == "" { - return - } - - metadata := map[string]string{ - "platform": "line", - "source_type": event.Source.Type, - "message_id": msg.ID, - } - - logger.DebugCF("line", "Received message", map[string]interface{}{ - "sender_id": senderID, - "chat_id": chatID, - "message_type": msg.Type, - "is_group": isGroup, - "preview": utils.Truncate(content, 50), - }) - - // Show typing/loading indicator (requires user ID, not group ID) - c.sendLoading(senderID) - - c.HandleMessage(senderID, chatID, content, mediaPaths, metadata) -} - -// isBotMentioned checks if the bot is mentioned in the message. -// It first checks the mention metadata (userId match), then falls back -// to text-based detection using the bot's display name, since LINE may -// not include userId in mentionees for Official Accounts. -func (c *LINEChannel) isBotMentioned(msg lineMessage) bool { - // Check mention metadata - if msg.Mention != nil { - for _, m := range msg.Mention.Mentionees { - if m.Type == "all" { - return true - } - if c.botUserID != "" && m.UserID == c.botUserID { - return true - } - } - // Mention metadata exists with mentionees but bot not matched by userId. - // The bot IS likely mentioned (LINE includes mention struct when bot is @-ed), - // so check if any mentionee overlaps with bot display name in text. - if c.botDisplayName != "" { - for _, m := range msg.Mention.Mentionees { - if m.Index >= 0 && m.Length > 0 { - runes := []rune(msg.Text) - end := m.Index + m.Length - if end <= len(runes) { - mentionText := string(runes[m.Index:end]) - if strings.Contains(mentionText, c.botDisplayName) { - return true - } - } - } - } - } - } - - // Fallback: text-based detection with display name - if c.botDisplayName != "" && strings.Contains(msg.Text, "@"+c.botDisplayName) { - return true - } - - return false -} - -// stripBotMention removes the @BotName mention text from the message. -func (c *LINEChannel) stripBotMention(text string, msg lineMessage) string { - stripped := false - - // Try to strip using mention metadata indices - if msg.Mention != nil { - runes := []rune(text) - for i := len(msg.Mention.Mentionees) - 1; i >= 0; i-- { - m := msg.Mention.Mentionees[i] - // Strip if userId matches OR if the mention text contains the bot display name - shouldStrip := false - if c.botUserID != "" && m.UserID == c.botUserID { - shouldStrip = true - } else if c.botDisplayName != "" && m.Index >= 0 && m.Length > 0 { - end := m.Index + m.Length - if end <= len(runes) { - mentionText := string(runes[m.Index:end]) - if strings.Contains(mentionText, c.botDisplayName) { - shouldStrip = true - } - } - } - if shouldStrip { - start := m.Index - end := m.Index + m.Length - if start >= 0 && end <= len(runes) { - runes = append(runes[:start], runes[end:]...) - stripped = true - } - } - } - if stripped { - return strings.TrimSpace(string(runes)) - } - } - - // Fallback: strip @DisplayName from text - if c.botDisplayName != "" { - text = strings.ReplaceAll(text, "@"+c.botDisplayName, "") - } - - return strings.TrimSpace(text) -} - -// resolveChatID determines the chat ID from the event source. -// For group/room messages, use the group/room ID; for 1:1, use the user ID. -func (c *LINEChannel) resolveChatID(source lineSource) string { - switch source.Type { - case "group": - return source.GroupID - case "room": - return source.RoomID - default: - return source.UserID - } -} - -// Send sends a message to LINE. It first tries the Reply API (free) -// using a cached reply token, then falls back to the Push API. -func (c *LINEChannel) Send(ctx context.Context, msg bus.OutboundMessage) error { - if !c.IsRunning() { - return fmt.Errorf("line channel not running") - } - - // Load and consume quote token for this chat - var quoteToken string - if qt, ok := c.quoteTokens.LoadAndDelete(msg.ChatID); ok { - quoteToken = qt.(string) - } - - // Try reply token first (free, valid for ~25 seconds) - if entry, ok := c.replyTokens.LoadAndDelete(msg.ChatID); ok { - tokenEntry := entry.(replyTokenEntry) - if time.Since(tokenEntry.timestamp) < lineReplyTokenMaxAge { - if err := c.sendReply(ctx, tokenEntry.token, msg.Content, quoteToken); err == nil { - logger.DebugCF("line", "Message sent via Reply API", map[string]interface{}{ - "chat_id": msg.ChatID, - "quoted": quoteToken != "", - }) - return nil - } - logger.DebugC("line", "Reply API failed, falling back to Push API") - } - } - - // Fall back to Push API - return c.sendPush(ctx, msg.ChatID, msg.Content, quoteToken) -} - -// buildTextMessage creates a text message object, optionally with quoteToken. -func buildTextMessage(content, quoteToken string) map[string]string { - msg := map[string]string{ - "type": "text", - "text": content, - } - if quoteToken != "" { - msg["quoteToken"] = quoteToken - } - return msg -} - -// sendReply sends a message using the LINE Reply API. -func (c *LINEChannel) sendReply(ctx context.Context, replyToken, content, quoteToken string) error { - payload := map[string]interface{}{ - "replyToken": replyToken, - "messages": []map[string]string{buildTextMessage(content, quoteToken)}, - } - - return c.callAPI(ctx, lineReplyEndpoint, payload) -} - -// sendPush sends a message using the LINE Push API. -func (c *LINEChannel) sendPush(ctx context.Context, to, content, quoteToken string) error { - payload := map[string]interface{}{ - "to": to, - "messages": []map[string]string{buildTextMessage(content, quoteToken)}, - } - - return c.callAPI(ctx, linePushEndpoint, payload) -} - -// sendLoading sends a loading animation indicator to the chat. -func (c *LINEChannel) sendLoading(chatID string) { - payload := map[string]interface{}{ - "chatId": chatID, - "loadingSeconds": 60, - } - if err := c.callAPI(c.ctx, lineLoadingEndpoint, payload); err != nil { - logger.DebugCF("line", "Failed to send loading indicator", map[string]interface{}{ - "error": err.Error(), - }) - } -} - -// callAPI makes an authenticated POST request to the LINE API. -func (c *LINEChannel) callAPI(ctx context.Context, endpoint string, payload interface{}) error { - body, err := json.Marshal(payload) - if err != nil { - return fmt.Errorf("failed to marshal payload: %w", err) - } - - req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, bytes.NewReader(body)) - if err != nil { - return fmt.Errorf("failed to create request: %w", err) - } - - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+c.config.ChannelAccessToken) - - client := &http.Client{Timeout: 30 * time.Second} - resp, err := client.Do(req) - if err != nil { - return fmt.Errorf("API request failed: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - respBody, _ := io.ReadAll(resp.Body) - return fmt.Errorf("LINE API error (status %d): %s", resp.StatusCode, string(respBody)) - } - - return nil -} - -// downloadContent downloads media content from the LINE API. -func (c *LINEChannel) downloadContent(messageID, filename string) string { - url := fmt.Sprintf(lineContentEndpoint, messageID) - return utils.DownloadFile(url, filename, utils.DownloadOptions{ - LoggerPrefix: "line", - ExtraHeaders: map[string]string{ - "Authorization": "Bearer " + c.config.ChannelAccessToken, - }, - }) -} +package channels + +import ( + "bytes" + "context" + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "strings" + "sync" + "time" + + "github.com/sipeed/picoclaw/pkg/bus" + "github.com/sipeed/picoclaw/pkg/config" + "github.com/sipeed/picoclaw/pkg/logger" + "github.com/sipeed/picoclaw/pkg/utils" +) + +const ( + lineAPIBase = "https://api.line.me/v2/bot" + lineDataAPIBase = "https://api-data.line.me/v2/bot" + lineReplyEndpoint = lineAPIBase + "/message/reply" + linePushEndpoint = lineAPIBase + "/message/push" + lineContentEndpoint = lineDataAPIBase + "/message/%s/content" + lineBotInfoEndpoint = lineAPIBase + "/info" + lineLoadingEndpoint = lineAPIBase + "/chat/loading/start" + lineReplyTokenMaxAge = 25 * time.Second +) + +type replyTokenEntry struct { + token string + timestamp time.Time +} + +// LINEChannel implements the Channel interface for LINE Official Account +// using the LINE Messaging API with HTTP webhook for receiving messages +// and REST API for sending messages. +type LINEChannel struct { + *BaseChannel + config config.LINEConfig + httpServer *http.Server + botUserID string // Bot's user ID + botBasicID string // Bot's basic ID (e.g. @216ru...) + botDisplayName string // Bot's display name for text-based mention detection + replyTokens sync.Map // chatID -> replyTokenEntry + quoteTokens sync.Map // chatID -> quoteToken (string) + ctx context.Context + cancel context.CancelFunc +} + +// NewLINEChannel creates a new LINE channel instance. +func NewLINEChannel(cfg config.LINEConfig, messageBus *bus.MessageBus) (*LINEChannel, error) { + if cfg.ChannelSecret == "" || cfg.ChannelAccessToken == "" { + return nil, fmt.Errorf("line channel_secret and channel_access_token are required") + } + + base := NewBaseChannel("line", cfg, messageBus, cfg.AllowFrom) + + return &LINEChannel{ + BaseChannel: base, + config: cfg, + }, nil +} + +// Start launches the HTTP webhook server. +func (c *LINEChannel) Start(ctx context.Context) error { + logger.InfoC("line", "Starting LINE channel (Webhook Mode)") + + c.ctx, c.cancel = context.WithCancel(ctx) + + // Fetch bot profile to get bot's userId for mention detection + if err := c.fetchBotInfo(); err != nil { + logger.WarnCF("line", "Failed to fetch bot info (mention detection disabled)", map[string]interface{}{ + "error": err.Error(), + }) + } else { + logger.InfoCF("line", "Bot info fetched", map[string]interface{}{ + "bot_user_id": c.botUserID, + "basic_id": c.botBasicID, + "display_name": c.botDisplayName, + }) + } + + mux := http.NewServeMux() + path := c.config.WebhookPath + if path == "" { + path = "/webhook/line" + } + mux.HandleFunc(path, c.webhookHandler) + + addr := fmt.Sprintf("%s:%d", c.config.WebhookHost, c.config.WebhookPort) + c.httpServer = &http.Server{ + Addr: addr, + Handler: mux, + } + + go func() { + logger.InfoCF("line", "LINE webhook server listening", map[string]interface{}{ + "addr": addr, + "path": path, + }) + if err := c.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { + logger.ErrorCF("line", "Webhook server error", map[string]interface{}{ + "error": err.Error(), + }) + } + }() + + c.setRunning(true) + logger.InfoC("line", "LINE channel started (Webhook Mode)") + return nil +} + +// fetchBotInfo retrieves the bot's userId, basicId, and displayName from the LINE API. +func (c *LINEChannel) fetchBotInfo() error { + req, err := http.NewRequest(http.MethodGet, lineBotInfoEndpoint, nil) + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+c.config.ChannelAccessToken) + + client := &http.Client{Timeout: 10 * time.Second} + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("bot info API returned status %d", resp.StatusCode) + } + + var info struct { + UserID string `json:"userId"` + BasicID string `json:"basicId"` + DisplayName string `json:"displayName"` + } + if err := json.NewDecoder(resp.Body).Decode(&info); err != nil { + return err + } + + c.botUserID = info.UserID + c.botBasicID = info.BasicID + c.botDisplayName = info.DisplayName + return nil +} + +// Stop gracefully shuts down the HTTP server. +func (c *LINEChannel) Stop(ctx context.Context) error { + logger.InfoC("line", "Stopping LINE channel") + + if c.cancel != nil { + c.cancel() + } + + if c.httpServer != nil { + shutdownCtx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + if err := c.httpServer.Shutdown(shutdownCtx); err != nil { + logger.ErrorCF("line", "Webhook server shutdown error", map[string]interface{}{ + "error": err.Error(), + }) + } + } + + c.setRunning(false) + logger.InfoC("line", "LINE channel stopped") + return nil +} + +// webhookHandler handles incoming LINE webhook requests. +func (c *LINEChannel) webhookHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + body, err := io.ReadAll(r.Body) + if err != nil { + logger.ErrorCF("line", "Failed to read request body", map[string]interface{}{ + "error": err.Error(), + }) + http.Error(w, "Bad request", http.StatusBadRequest) + return + } + + signature := r.Header.Get("X-Line-Signature") + if !c.verifySignature(body, signature) { + logger.WarnC("line", "Invalid webhook signature") + http.Error(w, "Forbidden", http.StatusForbidden) + return + } + + var payload struct { + Events []lineEvent `json:"events"` + } + if err := json.Unmarshal(body, &payload); err != nil { + logger.ErrorCF("line", "Failed to parse webhook payload", map[string]interface{}{ + "error": err.Error(), + }) + http.Error(w, "Bad request", http.StatusBadRequest) + return + } + + // Return 200 immediately, process events asynchronously + w.WriteHeader(http.StatusOK) + + for _, event := range payload.Events { + go c.processEvent(event) + } +} + +// verifySignature validates the X-Line-Signature using HMAC-SHA256. +func (c *LINEChannel) verifySignature(body []byte, signature string) bool { + if signature == "" { + return false + } + + mac := hmac.New(sha256.New, []byte(c.config.ChannelSecret)) + mac.Write(body) + expected := base64.StdEncoding.EncodeToString(mac.Sum(nil)) + + return hmac.Equal([]byte(expected), []byte(signature)) +} + +// LINE webhook event types +type lineEvent struct { + Type string `json:"type"` + ReplyToken string `json:"replyToken"` + Source lineSource `json:"source"` + Message json.RawMessage `json:"message"` + Timestamp int64 `json:"timestamp"` +} + +type lineSource struct { + Type string `json:"type"` // "user", "group", "room" + UserID string `json:"userId"` + GroupID string `json:"groupId"` + RoomID string `json:"roomId"` +} + +type lineMessage struct { + ID string `json:"id"` + Type string `json:"type"` // "text", "image", "video", "audio", "file", "sticker" + Text string `json:"text"` + QuoteToken string `json:"quoteToken"` + Mention *struct { + Mentionees []lineMentionee `json:"mentionees"` + } `json:"mention"` + ContentProvider struct { + Type string `json:"type"` + } `json:"contentProvider"` +} + +type lineMentionee struct { + Index int `json:"index"` + Length int `json:"length"` + Type string `json:"type"` // "user", "all" + UserID string `json:"userId"` +} + +func (c *LINEChannel) processEvent(event lineEvent) { + if event.Type != "message" { + logger.DebugCF("line", "Ignoring non-message event", map[string]interface{}{ + "type": event.Type, + }) + return + } + + senderID := event.Source.UserID + chatID := c.resolveChatID(event.Source) + isGroup := event.Source.Type == "group" || event.Source.Type == "room" + + var msg lineMessage + if err := json.Unmarshal(event.Message, &msg); err != nil { + logger.ErrorCF("line", "Failed to parse message", map[string]interface{}{ + "error": err.Error(), + }) + return + } + + // In group chats, only respond when the bot is mentioned + if isGroup && !c.isBotMentioned(msg) { + logger.DebugCF("line", "Ignoring group message without mention", map[string]interface{}{ + "chat_id": chatID, + }) + return + } + + // Store reply token for later use + if event.ReplyToken != "" { + c.replyTokens.Store(chatID, replyTokenEntry{ + token: event.ReplyToken, + timestamp: time.Now(), + }) + } + + // Store quote token for quoting the original message in reply + if msg.QuoteToken != "" { + c.quoteTokens.Store(chatID, msg.QuoteToken) + } + + var content string + var mediaPaths []string + localFiles := []string{} + + defer func() { + for _, file := range localFiles { + if err := os.Remove(file); err != nil { + logger.DebugCF("line", "Failed to cleanup temp file", map[string]interface{}{ + "file": file, + "error": err.Error(), + }) + } + } + }() + + switch msg.Type { + case "text": + content = msg.Text + // Strip bot mention from text in group chats + if isGroup { + content = c.stripBotMention(content, msg) + } + case "image": + localPath := c.downloadContent(msg.ID, "image.jpg") + if localPath != "" { + localFiles = append(localFiles, localPath) + mediaPaths = append(mediaPaths, localPath) + content = "[image]" + } + case "audio": + localPath := c.downloadContent(msg.ID, "audio.m4a") + if localPath != "" { + localFiles = append(localFiles, localPath) + mediaPaths = append(mediaPaths, localPath) + content = "[audio]" + } + case "video": + localPath := c.downloadContent(msg.ID, "video.mp4") + if localPath != "" { + localFiles = append(localFiles, localPath) + mediaPaths = append(mediaPaths, localPath) + content = "[video]" + } + case "file": + content = "[file]" + case "sticker": + content = "[sticker]" + default: + content = fmt.Sprintf("[%s]", msg.Type) + } + + if strings.TrimSpace(content) == "" { + return + } + + metadata := map[string]string{ + "platform": "line", + "source_type": event.Source.Type, + "message_id": msg.ID, + } + + logger.DebugCF("line", "Received message", map[string]interface{}{ + "sender_id": senderID, + "chat_id": chatID, + "message_type": msg.Type, + "is_group": isGroup, + "preview": utils.Truncate(content, 50), + }) + + // Show typing/loading indicator (requires user ID, not group ID) + c.sendLoading(senderID) + + c.HandleMessage(senderID, chatID, content, mediaPaths, metadata) +} + +// isBotMentioned checks if the bot is mentioned in the message. +// It first checks the mention metadata (userId match), then falls back +// to text-based detection using the bot's display name, since LINE may +// not include userId in mentionees for Official Accounts. +func (c *LINEChannel) isBotMentioned(msg lineMessage) bool { + // Check mention metadata + if msg.Mention != nil { + for _, m := range msg.Mention.Mentionees { + if m.Type == "all" { + return true + } + if c.botUserID != "" && m.UserID == c.botUserID { + return true + } + } + // Mention metadata exists with mentionees but bot not matched by userId. + // The bot IS likely mentioned (LINE includes mention struct when bot is @-ed), + // so check if any mentionee overlaps with bot display name in text. + if c.botDisplayName != "" { + for _, m := range msg.Mention.Mentionees { + if m.Index >= 0 && m.Length > 0 { + runes := []rune(msg.Text) + end := m.Index + m.Length + if end <= len(runes) { + mentionText := string(runes[m.Index:end]) + if strings.Contains(mentionText, c.botDisplayName) { + return true + } + } + } + } + } + } + + // Fallback: text-based detection with display name + if c.botDisplayName != "" && strings.Contains(msg.Text, "@"+c.botDisplayName) { + return true + } + + return false +} + +// stripBotMention removes the @BotName mention text from the message. +func (c *LINEChannel) stripBotMention(text string, msg lineMessage) string { + stripped := false + + // Try to strip using mention metadata indices + if msg.Mention != nil { + runes := []rune(text) + for i := len(msg.Mention.Mentionees) - 1; i >= 0; i-- { + m := msg.Mention.Mentionees[i] + // Strip if userId matches OR if the mention text contains the bot display name + shouldStrip := false + if c.botUserID != "" && m.UserID == c.botUserID { + shouldStrip = true + } else if c.botDisplayName != "" && m.Index >= 0 && m.Length > 0 { + end := m.Index + m.Length + if end <= len(runes) { + mentionText := string(runes[m.Index:end]) + if strings.Contains(mentionText, c.botDisplayName) { + shouldStrip = true + } + } + } + if shouldStrip { + start := m.Index + end := m.Index + m.Length + if start >= 0 && end <= len(runes) { + runes = append(runes[:start], runes[end:]...) + stripped = true + } + } + } + if stripped { + return strings.TrimSpace(string(runes)) + } + } + + // Fallback: strip @DisplayName from text + if c.botDisplayName != "" { + text = strings.ReplaceAll(text, "@"+c.botDisplayName, "") + } + + return strings.TrimSpace(text) +} + +// resolveChatID determines the chat ID from the event source. +// For group/room messages, use the group/room ID; for 1:1, use the user ID. +func (c *LINEChannel) resolveChatID(source lineSource) string { + switch source.Type { + case "group": + return source.GroupID + case "room": + return source.RoomID + default: + return source.UserID + } +} + +// Send sends a message to LINE. It first tries the Reply API (free) +// using a cached reply token, then falls back to the Push API. +func (c *LINEChannel) Send(ctx context.Context, msg bus.OutboundMessage) error { + if !c.IsRunning() { + return fmt.Errorf("line channel not running") + } + + // Load and consume quote token for this chat + var quoteToken string + if qt, ok := c.quoteTokens.LoadAndDelete(msg.ChatID); ok { + quoteToken = qt.(string) + } + + // Try reply token first (free, valid for ~25 seconds) + if entry, ok := c.replyTokens.LoadAndDelete(msg.ChatID); ok { + tokenEntry := entry.(replyTokenEntry) + if time.Since(tokenEntry.timestamp) < lineReplyTokenMaxAge { + if err := c.sendReply(ctx, tokenEntry.token, msg.Content, quoteToken); err == nil { + logger.DebugCF("line", "Message sent via Reply API", map[string]interface{}{ + "chat_id": msg.ChatID, + "quoted": quoteToken != "", + }) + return nil + } + logger.DebugC("line", "Reply API failed, falling back to Push API") + } + } + + // Fall back to Push API + return c.sendPush(ctx, msg.ChatID, msg.Content, quoteToken) +} + +// buildTextMessage creates a text message object, optionally with quoteToken. +func buildTextMessage(content, quoteToken string) map[string]string { + msg := map[string]string{ + "type": "text", + "text": content, + } + if quoteToken != "" { + msg["quoteToken"] = quoteToken + } + return msg +} + +// sendReply sends a message using the LINE Reply API. +func (c *LINEChannel) sendReply(ctx context.Context, replyToken, content, quoteToken string) error { + payload := map[string]interface{}{ + "replyToken": replyToken, + "messages": []map[string]string{buildTextMessage(content, quoteToken)}, + } + + return c.callAPI(ctx, lineReplyEndpoint, payload) +} + +// sendPush sends a message using the LINE Push API. +func (c *LINEChannel) sendPush(ctx context.Context, to, content, quoteToken string) error { + payload := map[string]interface{}{ + "to": to, + "messages": []map[string]string{buildTextMessage(content, quoteToken)}, + } + + return c.callAPI(ctx, linePushEndpoint, payload) +} + +// sendLoading sends a loading animation indicator to the chat. +func (c *LINEChannel) sendLoading(chatID string) { + payload := map[string]interface{}{ + "chatId": chatID, + "loadingSeconds": 60, + } + if err := c.callAPI(c.ctx, lineLoadingEndpoint, payload); err != nil { + logger.DebugCF("line", "Failed to send loading indicator", map[string]interface{}{ + "error": err.Error(), + }) + } +} + +// callAPI makes an authenticated POST request to the LINE API. +func (c *LINEChannel) callAPI(ctx context.Context, endpoint string, payload interface{}) error { + body, err := json.Marshal(payload) + if err != nil { + return fmt.Errorf("failed to marshal payload: %w", err) + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, bytes.NewReader(body)) + if err != nil { + return fmt.Errorf("failed to create request: %w", err) + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "Bearer "+c.config.ChannelAccessToken) + + client := &http.Client{Timeout: 30 * time.Second} + resp, err := client.Do(req) + if err != nil { + return fmt.Errorf("API request failed: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + respBody, _ := io.ReadAll(resp.Body) + return fmt.Errorf("LINE API error (status %d): %s", resp.StatusCode, string(respBody)) + } + + return nil +} + +// downloadContent downloads media content from the LINE API. +func (c *LINEChannel) downloadContent(messageID, filename string) string { + url := fmt.Sprintf(lineContentEndpoint, messageID) + return utils.DownloadFile(url, filename, utils.DownloadOptions{ + LoggerPrefix: "line", + ExtraHeaders: map[string]string{ + "Authorization": "Bearer " + c.config.ChannelAccessToken, + }, + }) +} diff --git a/pkg/tools/web.go b/pkg/tools/web.go index 6fc89c95b..804d9d168 100644 --- a/pkg/tools/web.go +++ b/pkg/tools/web.go @@ -114,7 +114,7 @@ func (p *DuckDuckGoSearchProvider) Search(ctx context.Context, query string, cou func (p *DuckDuckGoSearchProvider) extractResults(html string, count int, query string) (string, error) { // Simple regex based extraction for DDG HTML // Strategy: Find all result containers or key anchors directly - + // Try finding the result links directly first, as they are the most critical // Pattern: Title // The previous regex was a bit strict. Let's make it more flexible for attributes order/content @@ -133,14 +133,14 @@ func (p *DuckDuckGoSearchProvider) extractResults(html string, count int, query // But simple global search for snippets might mismatch order. // Since we only have the raw HTML string, let's just extract snippets globally and assume order matches (risky but simple for regex) // Or better: Let's assume the snippet follows the link in the HTML - + // A better regex approach: iterate through text and find matches in order // But for now, let's grab all snippets too reSnippet := regexp.MustCompile(`([\s\S]*?)`) snippetMatches := reSnippet.FindAllStringSubmatch(html, count+5) maxItems := min(len(matches), count) - + for i := 0; i < maxItems; i++ { urlStr := matches[i][1] title := stripTags(matches[i][2]) @@ -157,7 +157,7 @@ func (p *DuckDuckGoSearchProvider) extractResults(html string, count int, query } lines = append(lines, fmt.Sprintf("%d. %s\n %s", i+1, title, urlStr)) - + // Attempt to attach snippet if available and index aligns if i < len(snippetMatches) { snippet := stripTags(snippetMatches[i][1]) From 6463796fa1cb436f6d6f654dce1463c661e74586 Mon Sep 17 00:00:00 2001 From: ex-takashima Date: Sat, 14 Feb 2026 11:32:42 +0900 Subject: [PATCH 15/48] fix: update tests to match upstream API changes Fix web_test.go and config_test.go to use current function signatures after merging upstream changes (WebSearchToolOptions, BraveConfig). Co-Authored-By: Claude Opus 4.6 --- pkg/config/config_test.go | 11 +++++++---- pkg/tools/web_test.go | 23 ++++++----------------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 0a5e7b56f..14618b109 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -136,11 +136,14 @@ func TestDefaultConfig_WebTools(t *testing.T) { cfg := DefaultConfig() // Verify web tools defaults - if cfg.Tools.Web.Search.MaxResults != 5 { - t.Error("Expected MaxResults 5, got ", cfg.Tools.Web.Search.MaxResults) + if cfg.Tools.Web.Brave.MaxResults != 5 { + t.Error("Expected Brave MaxResults 5, got ", cfg.Tools.Web.Brave.MaxResults) } - if cfg.Tools.Web.Search.APIKey != "" { - t.Error("Search API key should be empty by default") + if cfg.Tools.Web.Brave.APIKey != "" { + t.Error("Brave API key should be empty by default") + } + if cfg.Tools.Web.DuckDuckGo.MaxResults != 5 { + t.Error("Expected DuckDuckGo MaxResults 5, got ", cfg.Tools.Web.DuckDuckGo.MaxResults) } } diff --git a/pkg/tools/web_test.go b/pkg/tools/web_test.go index 30bc7d991..988eada16 100644 --- a/pkg/tools/web_test.go +++ b/pkg/tools/web_test.go @@ -173,30 +173,19 @@ func TestWebTool_WebFetch_Truncation(t *testing.T) { } } -// TestWebTool_WebSearch_NoApiKey verifies error handling when API key is missing +// TestWebTool_WebSearch_NoApiKey verifies that nil is returned when no provider is configured func TestWebTool_WebSearch_NoApiKey(t *testing.T) { - tool := NewWebSearchTool("", 5) - ctx := context.Background() - args := map[string]interface{}{ - "query": "test", - } + tool := NewWebSearchTool(WebSearchToolOptions{BraveAPIKey: "", BraveMaxResults: 5}) - result := tool.Execute(ctx, args) - - // Should return error result - if !result.IsError { - t.Errorf("Expected error when API key is missing") - } - - // Should mention missing API key - if !strings.Contains(result.ForLLM, "BRAVE_API_KEY") && !strings.Contains(result.ForUser, "BRAVE_API_KEY") { - t.Errorf("Expected API key error message, got ForLLM: %s", result.ForLLM) + // Should return nil when no provider is enabled + if tool != nil { + t.Errorf("Expected nil when no search provider is configured") } } // TestWebTool_WebSearch_MissingQuery verifies error handling for missing query func TestWebTool_WebSearch_MissingQuery(t *testing.T) { - tool := NewWebSearchTool("test-key", 5) + tool := NewWebSearchTool(WebSearchToolOptions{BraveAPIKey: "test-key", BraveMaxResults: 5, BraveEnabled: true}) ctx := context.Background() args := map[string]interface{}{} From 7304ab7d3357d861894078ba012231eccc952624 Mon Sep 17 00:00:00 2001 From: qiaoborui Date: Sat, 14 Feb 2026 12:37:49 +0800 Subject: [PATCH 16/48] fix(auth): align OpenAI OAuth authorize URL and params --- pkg/auth/oauth.go | 39 +++++++++++++++++++++++---------------- pkg/auth/oauth_test.go | 20 +++++++++++++++----- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/pkg/auth/oauth.go b/pkg/auth/oauth.go index ecd9ba265..4f26e0eba 100644 --- a/pkg/auth/oauth.go +++ b/pkg/auth/oauth.go @@ -19,18 +19,20 @@ import ( ) type OAuthProviderConfig struct { - Issuer string - ClientID string - Scopes string - Port int + Issuer string + ClientID string + Scopes string + Originator string + Port int } func OpenAIOAuthConfig() OAuthProviderConfig { return OAuthProviderConfig{ - Issuer: "https://auth.openai.com", - ClientID: "app_EMoamEEZ73f0CkXaXp7hrann", - Scopes: "openid profile email offline_access", - Port: 1455, + Issuer: "https://auth.openai.com", + ClientID: "app_EMoamEEZ73f0CkXaXp7hrann", + Scopes: "openid profile email offline_access", + Originator: "codex_cli_rs", + Port: 1455, } } @@ -288,15 +290,20 @@ func BuildAuthorizeURL(cfg OAuthProviderConfig, pkce PKCECodes, state, redirectU func buildAuthorizeURL(cfg OAuthProviderConfig, pkce PKCECodes, state, redirectURI string) string { params := url.Values{ - "response_type": {"code"}, - "client_id": {cfg.ClientID}, - "redirect_uri": {redirectURI}, - "scope": {cfg.Scopes}, - "code_challenge": {pkce.CodeChallenge}, - "code_challenge_method": {"S256"}, - "state": {state}, + "response_type": {"code"}, + "client_id": {cfg.ClientID}, + "redirect_uri": {redirectURI}, + "scope": {cfg.Scopes}, + "code_challenge": {pkce.CodeChallenge}, + "code_challenge_method": {"S256"}, + "id_token_add_organizations": {"true"}, + "codex_cli_simplified_flow": {"true"}, + "state": {state}, } - return cfg.Issuer + "/authorize?" + params.Encode() + if cfg.Originator != "" { + params.Set("originator", cfg.Originator) + } + return cfg.Issuer + "/oauth/authorize?" + params.Encode() } func exchangeCodeForTokens(cfg OAuthProviderConfig, code, codeVerifier, redirectURI string) (*AuthCredential, error) { diff --git a/pkg/auth/oauth_test.go b/pkg/auth/oauth_test.go index 9f8013217..2348ee277 100644 --- a/pkg/auth/oauth_test.go +++ b/pkg/auth/oauth_test.go @@ -10,10 +10,11 @@ import ( func TestBuildAuthorizeURL(t *testing.T) { cfg := OAuthProviderConfig{ - Issuer: "https://auth.example.com", - ClientID: "test-client-id", - Scopes: "openid profile", - Port: 1455, + Issuer: "https://auth.example.com", + ClientID: "test-client-id", + Scopes: "openid profile", + Originator: "codex_cli_rs", + Port: 1455, } pkce := PKCECodes{ CodeVerifier: "test-verifier", @@ -22,7 +23,7 @@ func TestBuildAuthorizeURL(t *testing.T) { u := BuildAuthorizeURL(cfg, pkce, "test-state", "http://localhost:1455/auth/callback") - if !strings.HasPrefix(u, "https://auth.example.com/authorize?") { + if !strings.HasPrefix(u, "https://auth.example.com/oauth/authorize?") { t.Errorf("URL does not start with expected prefix: %s", u) } if !strings.Contains(u, "client_id=test-client-id") { @@ -40,6 +41,15 @@ func TestBuildAuthorizeURL(t *testing.T) { if !strings.Contains(u, "response_type=code") { t.Error("URL missing response_type") } + if !strings.Contains(u, "id_token_add_organizations=true") { + t.Error("URL missing id_token_add_organizations") + } + if !strings.Contains(u, "codex_cli_simplified_flow=true") { + t.Error("URL missing codex_cli_simplified_flow") + } + if !strings.Contains(u, "originator=codex_cli_rs") { + t.Error("URL missing originator") + } } func TestParseTokenResponse(t *testing.T) { From 11a6f5eb7190caf1574884d761ffbcba0ed067c9 Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 12:43:44 +0800 Subject: [PATCH 17/48] docs: update QQ Open Platform link to correct URL --- README.ja.md | 2 +- README.md | 2 +- README.zh.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.ja.md b/README.ja.md index 48105ce2f..48fc2057f 100644 --- a/README.ja.md +++ b/README.ja.md @@ -314,7 +314,7 @@ picoclaw gateway **1. Bot ใ‚’ไฝœๆˆ** -- [QQ ใ‚ชใƒผใƒ—ใƒณใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ](https://connect.qq.com/) ใซใ‚ขใ‚ฏใ‚ปใ‚น +- [QQ ใ‚ชใƒผใƒ—ใƒณใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ](https://q.qq.com/#) ใซใ‚ขใ‚ฏใ‚ปใ‚น - ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ไฝœๆˆ โ†’ **AppID** ใจ **AppSecret** ใ‚’ๅ–ๅพ— **2. ่จญๅฎš** diff --git a/README.md b/README.md index 536444bc5..dd38d306d 100644 --- a/README.md +++ b/README.md @@ -337,7 +337,7 @@ picoclaw gateway **1. Create a bot** -- Go to [QQ Open Platform](https://connect.qq.com/) +- Go to [QQ Open Platform](https://q.qq.com/#) - Create an application โ†’ Get **AppID** and **AppSecret** **2. Configure** diff --git a/README.zh.md b/README.zh.md index f2c9bf780..f94abce88 100644 --- a/README.zh.md +++ b/README.zh.md @@ -342,7 +342,7 @@ picoclaw gateway **1. ๅˆ›ๅปบๆœบๅ™จไบบ** -* ๅ‰ๅพ€ [QQ ๅผ€ๆ”พๅนณๅฐ](https://connect.qq.com/) +* ๅ‰ๅพ€ [QQ ๅผ€ๆ”พๅนณๅฐ](https://q.qq.com/#) * ๅˆ›ๅปบๅบ”็”จ โ†’ ่Žทๅ– **AppID** ๅ’Œ **AppSecret** **2. ้…็ฝฎ** From da804a074858b07633c585f91c4a765601f142d7 Mon Sep 17 00:00:00 2001 From: qiaoborui Date: Sat, 14 Feb 2026 12:48:16 +0800 Subject: [PATCH 18/48] fix(codex): include required instructions and improve account-id extraction --- pkg/auth/oauth.go | 3 +++ pkg/auth/oauth_test.go | 27 +++++++++++++++++++++++++++ pkg/providers/codex_provider.go | 5 +++++ pkg/providers/codex_provider_test.go | 6 ++++++ 4 files changed, 41 insertions(+) diff --git a/pkg/auth/oauth.go b/pkg/auth/oauth.go index 4f26e0eba..1a6589641 100644 --- a/pkg/auth/oauth.go +++ b/pkg/auth/oauth.go @@ -359,6 +359,9 @@ func parseTokenResponse(body []byte, provider string) (*AuthCredential, error) { if accountID := extractAccountID(tokenResp.AccessToken); accountID != "" { cred.AccountID = accountID + } else if accountID := extractAccountID(tokenResp.IDToken); accountID != "" { + // Recent OpenAI OAuth responses may only include chatgpt_account_id in id_token claims. + cred.AccountID = accountID } return cred, nil diff --git a/pkg/auth/oauth_test.go b/pkg/auth/oauth_test.go index 2348ee277..0d2ccc9a5 100644 --- a/pkg/auth/oauth_test.go +++ b/pkg/auth/oauth_test.go @@ -1,6 +1,7 @@ package auth import ( + "encoding/base64" "encoding/json" "net/http" "net/http/httptest" @@ -91,6 +92,32 @@ func TestParseTokenResponseNoAccessToken(t *testing.T) { } } +func TestParseTokenResponseAccountIDFromIDToken(t *testing.T) { + idToken := makeJWTWithAccountID("acc-from-id") + resp := map[string]interface{}{ + "access_token": "not-a-jwt", + "refresh_token": "test-refresh-token", + "expires_in": 3600, + "id_token": idToken, + } + body, _ := json.Marshal(resp) + + cred, err := parseTokenResponse(body, "openai") + if err != nil { + t.Fatalf("parseTokenResponse() error: %v", err) + } + + if cred.AccountID != "acc-from-id" { + t.Errorf("AccountID = %q, want %q", cred.AccountID, "acc-from-id") + } +} + +func makeJWTWithAccountID(accountID string) string { + header := base64.RawURLEncoding.EncodeToString([]byte(`{"alg":"none","typ":"JWT"}`)) + payload := base64.RawURLEncoding.EncodeToString([]byte(`{"https://api.openai.com/auth":{"chatgpt_account_id":"` + accountID + `"}}`)) + return header + "." + payload + ".sig" +} + func TestExchangeCodeForTokens(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/oauth/token" { diff --git a/pkg/providers/codex_provider.go b/pkg/providers/codex_provider.go index 3463389a5..c0b10bd5b 100644 --- a/pkg/providers/codex_provider.go +++ b/pkg/providers/codex_provider.go @@ -18,6 +18,8 @@ type CodexProvider struct { tokenSource func() (string, string, error) } +const defaultCodexInstructions = "You are Codex, a coding assistant." + func NewCodexProvider(token, accountID string) *CodexProvider { opts := []option.RequestOption{ option.WithBaseURL("https://chatgpt.com/backend-api/codex"), @@ -138,6 +140,9 @@ func buildCodexParams(messages []Message, tools []ToolDefinition, model string, if instructions != "" { params.Instructions = openai.Opt(instructions) + } else { + // ChatGPT Codex backend requires instructions to be present. + params.Instructions = openai.Opt(defaultCodexInstructions) } if maxTokens, ok := options["max_tokens"].(int); ok { diff --git a/pkg/providers/codex_provider_test.go b/pkg/providers/codex_provider_test.go index 605183d5e..1a5a8cafa 100644 --- a/pkg/providers/codex_provider_test.go +++ b/pkg/providers/codex_provider_test.go @@ -21,6 +21,12 @@ func TestBuildCodexParams_BasicMessage(t *testing.T) { if params.Model != "gpt-4o" { t.Errorf("Model = %q, want %q", params.Model, "gpt-4o") } + if !params.Instructions.Valid() { + t.Fatal("Instructions should be set") + } + if params.Instructions.Or("") != defaultCodexInstructions { + t.Errorf("Instructions = %q, want %q", params.Instructions.Or(""), defaultCodexInstructions) + } } func TestBuildCodexParams_SystemAsInstructions(t *testing.T) { From 1299b204652a7ff57b8ffea8a5ab14838ff3e97f Mon Sep 17 00:00:00 2001 From: moveyield Date: Sat, 14 Feb 2026 13:23:16 +0800 Subject: [PATCH 19/48] refactor: remove unused min func Signed-off-by: moveyield --- pkg/tools/web.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pkg/tools/web.go b/pkg/tools/web.go index 804d9d168..ccd995842 100644 --- a/pkg/tools/web.go +++ b/pkg/tools/web.go @@ -171,13 +171,6 @@ func (p *DuckDuckGoSearchProvider) extractResults(html string, count int, query return strings.Join(lines, "\n"), nil } -func min(a, b int) int { - if a < b { - return a - } - return b -} - func stripTags(content string) string { re := regexp.MustCompile(`<[^>]+>`) return re.ReplaceAllString(content, "") From 7d45101fcd7675b50504b75f49bc0abcf9896722 Mon Sep 17 00:00:00 2001 From: ex-takashima Date: Sat, 14 Feb 2026 13:22:24 +0900 Subject: [PATCH 20/48] docs: add LINE channel setup instructions to README Add LINE Official Account setup guide to both README.md and README.ja.md, including configuration, webhook URL setup, and Docker Compose port note. Co-Authored-By: Claude Opus 4.6 --- README.ja.md | 53 +++++++++++++++++++++++++++++++++++++++++- README.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 110 insertions(+), 8 deletions(-) diff --git a/README.ja.md b/README.ja.md index 48105ce2f..a6e81c302 100644 --- a/README.ja.md +++ b/README.ja.md @@ -223,7 +223,7 @@ picoclaw agent -m "What is 2+2?" ## ๐Ÿ’ฌ ใƒใƒฃใƒƒใƒˆใ‚ขใƒ—ใƒช -Telegramใ€Discordใ€QQใ€DingTalk ใง PicoClaw ใจไผš่ฉฑใงใใพใ™ +Telegramใ€Discordใ€QQใ€DingTalkใ€LINE ใง PicoClaw ใจไผš่ฉฑใงใใพใ™ | ใƒใƒฃใƒใƒซ | ใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ— | |---------|------------| @@ -231,6 +231,7 @@ Telegramใ€Discordใ€QQใ€DingTalk ใง PicoClaw ใจไผš่ฉฑใงใใพใ™ | **Discord** | ็ฐกๅ˜๏ผˆBot ใƒˆใƒผใ‚ฏใƒณ + Intents๏ผ‰ | | **QQ** | ็ฐกๅ˜๏ผˆAppID + AppSecret๏ผ‰ | | **DingTalk** | ๆ™ฎ้€š๏ผˆใ‚ขใƒ—ใƒช่ช่จผๆƒ…ๅ ฑ๏ผ‰ | +| **LINE** | ๆ™ฎ้€š๏ผˆ่ช่จผๆƒ…ๅ ฑ + Webhook URL๏ผ‰ |