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 01/46] 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 7304ab7d3357d861894078ba012231eccc952624 Mon Sep 17 00:00:00 2001 From: qiaoborui Date: Sat, 14 Feb 2026 12:37:49 +0800 Subject: [PATCH 02/46] 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 da804a074858b07633c585f91c4a765601f142d7 Mon Sep 17 00:00:00 2001 From: qiaoborui Date: Sat, 14 Feb 2026 12:48:16 +0800 Subject: [PATCH 03/46] 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 7fa641a2edb41bd69268112d8683ded97a65a767 Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 16:50:21 +0800 Subject: [PATCH 04/46] 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 1fcf3fde0f6e3d89ad753f05e413ab82ee7e62ee Mon Sep 17 00:00:00 2001 From: Hoshina Date: Sat, 14 Feb 2026 17:23:18 +0800 Subject: [PATCH 05/46] 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 06/46] 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 07/46] 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 08/46] 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 09/46] 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 10/46] 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 11/46] 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 12/46] 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 13/46] * 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 14/46] 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 15/46] 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 16/46] 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 17/46] 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 18/46] 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 19/46] 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 20/46] 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 21/46] 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 22/46] 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 23/46] 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 24/46] 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 25/46] 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 26/46] 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 27/46] 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 zcmeFZcT|(zwl5r{BSnzjq7>;Oy%P{=B8DO$UFk(SNGBBO9R&oX2qK+`bZJsUk=~1x z(0f7+5R#jBpL5UN_kQD!@qOPvXN-N{FjhvwDp_+qbFMY#Z~mSKJBwWb+@FGEU0!B-X5RnLFYGS>H3?xU z0Wm%v2jCVp9zHc5wi^J%&65!CA1}avzVL40$>JF$Lu1p=&aUpBURYoM!1%=E)bz~k-25thZGB^NYkOxG zd3%iYS@V5^9tpk7Sz~4IXw+{UG>A=ScwPFem{6kgi z<>lHWJb9QS*eXzcxg?)F8-)zJ6G32v>Anw&vzNLE%b`J>FIvRFWE2Ns|J#{$}V zc;;QOfUOqGi`fdQ>P5)NgTj4Z;7NZ8KIFg<3piO4zTVe8FNa(nG2EOB~&#S0O?UA7O*Yh zc$qyeUL+i8rd`yuv;1Fu6eoz$7x9>Dx=j!w7iEcwFwDy;hIIO`CSOs^VeFEv_0BhJ z%2E#l?B`!$0l7%XvQ_dwf7?F~&6CTB1>{fVZ8{di+8BT*%(dtt_TJ*-_C|%Tfw?*7 zA3^^Rvhd&$WW=xisM^BWWi6S)Y*C$nxu<-PlTcO9Q*&FOposS=OTmZtvpbln|CkW% zS%%bgQst>kmEi|5$^`Y%N%B43ibOdbxp!W`Lc>-7t*+|7U7-UTq`(|J7U5NfAx&5S zyE6ubQ44*9snwCyefD^q{ew<`4sjk@z12Zp{(P*TOWzWdQWcTfVSP%#2Tb%I2|ZI# z?+94&WBkPT=pmhvjHO$^=`v$kYu)E(`I(@>=a`gfvmh zMlF@}-CA_37i_~^y~{|dbfmALArDh{v09##ei;g>;=%z9a#rTr|>-okbDyIus z?Nb+)pS>(wDx;GxdIluu`gHY+{S?4YKdD;znS5c(JAeM|$D*m*tiL)`tF9sH0vvw4 zxWTQow(Cr6S?y?^Yu!}-gRZHbdJFS*5GYltH=l8>d<$Y;;y_!Uulgpe8?zejkN4}J~^{o#ceu&8HcQO3d1h5 zRfNV=X#u+bW`%iV2DCN=SqAn^hgIBoVdQ6Skmy9f>!c5V8Hlp-jw*2xz#Vj_a^rp1 z53mzkl}na|g#P6F?^`o?v9LPN%!}-ASp}W*KJiWr>Vy%}s%Abs5<3lIg7le`n-Vt@ z{8^Mla1zVOxXUix7GzRpx!G?w(iGR2MuS(xW`y^kOuZi28{MPl>GZ{=nT8(Urhewu z*$2CL-s%t+ekeNjH7w?A+Zog?TTxF!-(SJiM7$a0-~A?7#6ll2q5gAPUcF>jw&FsQ z+`VN&;^#Zco=L(>rM=t;Ha?6f;$SGZMzL`H*|)U;XVQlsjLKJYJGHxBVMLnp5sx7XuIhE8csSk2~Q{mWuiPiJB3o*4lMmgTI}h7G)~uN@4-2 zVg^_M)DB|+&t-^P=*t}bv$?h|=SQrtH;;COz!Rn*d$U*oKVs?MIrsEY^9FFkQqDmc*kf2SKrSpf&7Pl|eu&|k4Cz{>c>HYTQq^cz)nC-l%3Mry z^sJvL!fY|r=tsCGD78XFw-p$U7&67Xl^xLNZ4rI$h$sIxdNFW32Z<(Z)0 zf?jQ=p79FTKI_3q{sq(u`7n>D`KxJ%_>a!MI75w3&XfY1d-2klFr$p~dnK{`35V+` z#FkL;H9nOOFILIY(vy`N$T3{w7gD!<7%))++q;)F+MfrZj^xV%3f)}Es5{WFJ8Kuo zU;c!nm}zl)Ew6&WkZf10w=5VP0Y^i!ssjJ{`Ahg;CKmPYb_@~KoQkXPFn5MR{ z5Mz}5jnb=l6)-^FHppuKb)43 zm-@2cI8DR-L-5%)-r7BD={028%$12ILH+!2k)ylm*2~{o)cEqg60ny&l`6irg@Zn& zD&Nct)sEj#aBjBS1gnW@)T)m4$>V* zy9k|CrIvQt)l@Vl%?+e?j41a5r&|ZO9j%RCF5bfHBBwTe4bND&{#;dAtq*G#4y${M z1r+O}%eNA5>p0kuN3*F0Q>{(qy4~8NUU+=+%*EJHoG>d%79g-ewGU=UZu;Uhhy}Q& zK_UYh&CDEBOF8>1Rp!OtE^+*n{ruL%s*Tt)I=lrg{7l~Mm)-nuVCG+#2n zuB8&K0Kbq4W-%Rs&e>oAWCbQ>OCxKOkaOwPU~2hj>sg23L<5$?Y|!hh<&s zQm}xhT6DMn6qK&83Ctb7Wj2_`0_Yq$F}bT)z-UjfmL-Rux(f1H2;VsS){`j$XJ6{K zfkt>ne*HYGc$Vg;v`C*dV_0T^?4#2h2|M2W(}IZc#>D@FZRJzD#_@iAR1n7t_;)H2 zc~uZtHqQG8rB>n_Uu~iNq1S7d%z$-?R=XLsC>de-p{fP7o*^4Zr`K1=#K_Gx7O*$% z+XJ~Ieu)Ll=;Ivina=`7tzm=PGX=#0i%5@;SG7)!y|4-_0M`Qx_|GmA(TS%KSO5rg z0mA|;T0VIcM@dW{CxEj0PMk36<+#T7Uvp=G|ESHx+|?Gqj!1{)|yZ&*J7~5aJIG2}dT3)Z2OLZm{>O~5!IGWY^J8VAfcUJ z-|??iN%z_o$sub~t&T{6&IVDEO#LK2Dnx$=R2T{D;;X2f#>{NR+)Dd_aq43Gi80tZ z-oB%dI5~#}Xe6h!6)OZgGj>RLjVJQf25U;ip3eR*OA{YXy$rL$i%&lH-)z##OHgF0 zZ!oqsSF%}q^^RWu=)}WP?zx24ZN_g@Tw2YZ^>DJ>8<~nZ!Na3sM-3r?obEMfCC}~m z{Elye1r^0muityZN~OMsY2x&}ya=J5=nZ9BFasCfd=+Xk@Q{B^`P^giiW#-*!XD_j z)T^e=J5EJn$ta8kEGL&XwMZ{-l&l=lS_K^awW7N)Lmq`>s@%i2QNL0sd!d2LFP zao?GQMd!yrV-{!lACY1WFW$F1>1&sh7m7R+LYm8*GN-CTo?f%YO5w`vj6Ph`^7D}u zG}R4}MVU7#+7giw40Wly**^Qe=Y#V1J86`b9yynfL)L)|Yv>_&MT%_4Q-ick(KH5E z5*S-~+ke$O=NENk6Y({|9hP+5gtWR!|4s$(pH8U5KYi0t;*UXE4N{VZPxC)(fPqg} ztS3e;v;%QxsXc$eb|*u_NA;cTM60p3V1C2^wR^{1qDzpxjjDSDt?ds3|$v3vI7usvItIM#}9dsdA zEP5_r?Bs8<{j2k-I%nfvkEA)#rgTK@b3CRUi#(F=Nq6u3d>0S||7=$)38l>xk$#=r z#^2ViUk!XwjE3>8XnEJS2KB^B-fh46oFw38R`XpdW!a*WsX*^bv{^vNx2idz0ytPjPQG`He_cok#f;i3?Dh3(4;RfHtneLAY^Xe}+TZtWG-ZE`x@Y&(~Jg;y%d=xzkJ?78Ng0f3}Q%lk870utud!t`W zU-&k#_RAof_5zgpvC*|6^0wM@rUg_;dOP=FYQZlkD`K(Z-nsb( zR*yeJKPu#1-0!J3TlHCmu5W!x-VErr!7AtH=FJ^vemEM5RDcA^2E;b%Atq<-;Zh#v zI}8Kg1sOy{19J@0x^>}qq7);vyuHvf5N4RKrWicT_T4XbFunS z*K@bNG=DyM*1kq{unJvFlp%?@9g%#l1~KU(g(t5Owv+A1>-%r)`I5P^0TwzxQ-=ST z(c{BZA+Z2@=+n=wlm24U&+f;Y_+bHox3Pd_iSpv$QtRVfddnmFJ(QvGR59?;Pq*tm z+$Nw4aW8M2dH%G&@H|92?}%>EDL)7rwkMT6gsC{X$6)~yr^O5Y5_TK2 zD_uez>^ym)OJKE`C?1%mbk>sDILM+Zsq5GAxijh^15kA?c@2)e+o#zD;AlK>l8?aUi# zSU_Hj(|~1z9Y=YtdH)Yt(Y=k&V!~?%TAxoifxSOWF5?hWEao(_WB$HusYjsO4UkU$ zPg$QXMrIIDFb-hp1>pde!JBFgIMt{+fA-Nj_Qbw@c%n21d33Lq=r7jWlH45>w~Q+M{C@EsuyR-*iAaDAJ?W zFeW>Q{PU({w38Z27d|oGNrMF(n5knV4uFVkdyE<6SQuwOI3HF73s6+YV6cF*vT64j zebD}F?!6FNzo7}>+&M0~a#_Oym|vhk@OI&?ng%paGTM0o3s@Bao~$olTwno}IOmQO z2eIXGVgV4y)g%^B9~d#HFP$8*bZbUl2=0F*;h-mAU*|Ac5jW>D5P-i;5itFQe4_N_ zCp(?h8%k-3PX*3vFPa?`hppx#FBtyp92}V|RJMOk@I6>KFxH|zSeBW1npbTozxEu# z?~wiWi%`Vn&${t?SJoubg9r;3I3&DbVkad>f-`V-)a?&{vIq`ZI&GN6%`2lFb-;7( zdn0kf@9K77jLbyyQL#dZa@??hu)h|S2hBUeV()uy+YGu1#x2dc$Ha&u9-2=r7t#je zf5@X-14m&<{0<)KsT6foYj6cu31j%%B2We^Fhp=$!B59RCm* zgrUofZ{O+#qDjF>=$DNw>jMKfAMS>RrRt+!f2NaN?p^(Ogkjpgm}iKb9??%w_t>mC zpk#?i@D!Nv{!deF3S=n{T=2=ALU+5~JPMrAErP%jAh<&?p~&~GGu=RiX+a#n+W$R= zpgociJ}`*+3EVJyEOk;f1J~_I%)Idi4KzB8oIr)|qV)?hJ7o?H9vpY^db&3!o3ygk zj^ov>S%^i+XAdQ7H#kS;u0%u;dIkhcXXHnBVlrfxY3Mb3{_?a+!-HaI$jSJ$S&?eI96WZ-r8zGDGG_hhQbK+I-|x>ekD z>Ehv!xHuF4#7N9+XD7&3eWLi&c%LwU!L85IknDT^+;piDRHMe!}M~A zD2dR{_E~d)hl$CP$c_G8hAShMLX@z1{Y(vI+2EVQxkayZnR|C2Wc$BGcSeY_n`C%@ zgL15PtE`Q{kEfw;zjwDU{kh>M^bo35&5Ys-@qzipck7rs?NIz`9LObbPMxT9TliCv zAzAcDh4lnot}5`J_qfoq;|oz5{C?zJY1o&lYps!44z^2-T?-b_q2J?Eq$$zZS=W`p z9@UEfRHiyv!5?E+vL2YRT@a`Ae~&&}A|K)Kk~zo>4vC9Y>*Hw7i_Jr>;ruOgmP;cl z*QQkBO8<{JPC2yaqK8LC@8rRwNn-O&rCb?WUnE+#tfcs+n}O7h)*dpiQ*#AAX|wcu zRL2o*Db_hJij|^a`h~lmOOLDjq+IB}lGp+hU!y$l5+0@9mMw)*}c$NB6`%n5) zGnncM`0_UH1Tss;yu)oi%V#cUP!R+!XBu0Zch-#sh*;#{cHDBeO5fLQx17*VvLp8; z={KFD$U;{F-ft6nNg*{WO@RmTso&;Cj$xE5Y(M1c{jTilGM}Zby>PBn&d?}uJM{}) zh0H6S{;}^uI_)nzHhol6lmAW|b|@-lPI|}doWA;|)mtv_2V=g@PBmznGSGVnypkEn zay=wz#I5Xq*Vp_@D5fA{<)u(zPtM{-vSC*IqpL?9z#P$$U-aiEm7TjL;lIWDQrKGq zBA!t$*V*qv0zkcG4fBTx?`c8B6 z4W~331mgWY*cv>)sY^n2z*&^<;(0A$7=R20yg ziA&6i+<;Fcnqb_ef8mt({+%$&zho(69v#XY3oAeEFEqBYaeb#loPx&fF%|85g%JJ~ z^wE#RgPFQOV9cq%Yk~)nsz|-(noO0P2|{8i->AR2J{kXW>1GrEm}kyd?SnMwt`foW zSW}s^5-qM4np?@b=DaB95&|6Rd~KzEEd&Nf%Z8ar7P^gG3mGv#3)tJ^qQsYt~fEZNifP(&-*b7MP`R!ZX z&Akvhpvee;JpJ?p;WPbVdP#Lsj`R8#-(^X5%Nw_+Peq&g{w$a~O5HNG=l$h=6LV4F zoCh=;WF50q97;}%p)?NmT56Sq_sYdEGtJ1XP|r6B97T^VK3R2T_|0|v3u!i4+SpuE zRq3F~{u&q;GUOp|A9(oo)eDdQGASb=U$G(KC8tv%u~qfVQo+oI>VD_RuTIM7z3L`} zVca3QSjNPPS0oqsqas<=rw3#qU zWP}^#KiZx`{yBn4Q=vFs`oFXV{&R@wDuaO86k{|A+V`KbxTza8i3Uxoj- z|7;|)h6OOp`T@Jr_DpJ}^i5zKYKC(Ld4lfJR>XT2mRJCV#LDs&5h?9ez1ODPR zlyM9TaDb9J&9^4yxE1e}D=hA~v1k(9SCJzmfa`g@-!W2@MXSuT0T&&l=$V6C<|VpU zU5nq;AUv(`LyIz{ z&Rz3$sMzR<68n^@e^ZII^W+9)ig))L}?fK7M9pb zOLN{!Y8fTW{x2Nt8(7?3%_jFrlEm(?JMo$lRY3_B@WwIkl)45BXy3y~NYvdFP0-c< z47X!@;z`7LoPV2E*Z3;8p~z9s6jtVBXsBma-)Fe#oiMQI{w1b=-Ce-}|MCBWIs2u| z*~B94)0z3xfgX>~i^J9A0qAah@kEIFw3>IYDY%_+B#SDh*X4rhgryu62|@4r2iGf`v%_hr|~BwSa{yKlKv-2ENL#Ec+3Kbu!i^6!IRmX zEm)9m=nWgb6CHEbtLZ>l=u%0!(gJ`eQm8wQ-71iUN?yASx`leaXWACK^)g0dRV6|& z@xn-2`szA_7H>k=4BBJO7;f-PI#ZVT8E>fYvAmZGkFEi@KQCUbM6_l^9wOggh zu72yf3zyxv_^Vqfl)kc8qr?zZKYO(JOax?`2@bqQ5@P{uRfVfFy(bh0B>~tsL)lbyFtZb&ZBBa}L^p$W_+P%< zx}lw2*R(c@of?ZW_^?jB?>PD2O@71cKpP{MqtSPZU*^#|&d5gA?I*;tK2ql;&u9Jq z7QekUsJ+y0uQL&URR$E$IN)B zqQ%r16)h@D97+buHzOQPKX){&zo1;nAe>hf9LZJMr)4F#YkQB9SOc*+o1n&nv{$JM z91zCu$>WR7OhX3@4DdC&tqG7bamZvMw9Z&9IFT6(h(A1#;F<6t%(6<79{pW3N3wVu z56x4^e5JLT*+anq7sTa2g{q2Nr}-0k7C4^_-^?!5EnF9mhstN3r$vBkP=za|u?2PE z3|TfmQ&SDhpY*3~HTL=|lykxpMA{mpXLe{Jv6i0u_=CyCF%~0klI$n0v zU7pn;T1s4PWiY-emDeoZ&9fN23^!rUxuakj$2(2E6JVQ>!W zct0<`QMU!;x<{2aok$tPC%}~PS80?Efz4wXTb!A zUWzNQ>``HooGw6-SiteK7EUbSRXq5H<^$fun3+^>xl72=>L0Wswe!?8)9P{J=Wl!- zn-BLN-Am4t*{p`xmkZO+qKtIFto2`K4gySs8;0#5!dBi~xnj+6fHT>@w%L^sc`Ts+ zK2qu?km`oQxvh$LZ3LYLybGDZVS1y}p^A1WO@xzMOfGBFRKaxN_m{5oGlS0758Pws zhF5RU*7HAG!RL0<`<2;iYDkKrsdb2~8d97fMO|(1)m7jHn{(q$G8V9&?F2bz#6|B< zx-6DG#0^K~XK23ao>lEe{_5 z%!rd8e9)G*Y6A$h*60%+DFvbsRWs)$NZ0n&9DAjBrKzfY&RkLx)v)uZ`_U$VD;97) z{agC!0`(LXW?1X6@pnM~1-!TdO1oEY!GyRuuP##@)Y7=9m#yBW4NOyF-)u9loeAMZ z+fN>TMI5aER7<_Rb|LkEq(C7xM{VoP9k2xqKMruU6n81C_X$4JNqTTbp|1PhXq;Jz zi%RZ~k|ySE3(>Q4PS!Q((<^>UrUm05d3J$mp@-h6j7cze#a_LE^{-^&CM&?sq<21L zS==Qv%n((CEYxlO^td%xKqKmLW87-xN&@0By>6RYNB_#%wkYAla^arji1!Ol%o*S2 zGt!O;f)*8qnt_LGE24LkNbvXOLlqmL?1B9U@=rEy%?&p- zSLE#QR`9P7z8}cE$TvQ%(zJ1_&ru&Y3f$fMLf)|lCa|BKFmyG0BVh-^CCg5)?c(Nl z;rsUi;T&=t!07%<9irrS?e>+v-J=hoYdNlgTJb4d$1j-LM77i5E_xT-`N$$=#@$II`4$KDqFxWFw(9Scy;zWUZ?h*HJ^cvRugtIJ8qsee9I znM2jxHOW@EC6%A7b35^l-PMJhO$x>4oXB9zRTIV>e5*xqW)<2CzGL#O+!yXIxcS+Q z{$y87odXFQh%@jzNKHcFM%jjDw^5;=BA>^vAy?dDz+B^fm?vJ(mDBh{(g~xN4fp+J zUU|h?Cb#h+rNY{Hb{M9!>ky-dPmGAhY;G3(-w>pRZ7b{=ICOl_ZCk z@_M{JuSX;LBu>Cx?F^`7m?gWg-h^?BCB=f41Z)oe;ZmE74TswYi|7S=I^geQ45yn*7NZ1@-bcLn zxs5k@K_11LicnC@shp#gVTNf}pzMzXw%?WmBhS`13lR-nRBWj7r`qbu$juyICm2Ch z@mnUU3*%@0`uom%+RjgZOrMtLNWEy#`XumSPEdO+`t&L({n)PN%dRE4&)yMrknjx0 zl=vsjXGY&SV=a~)JCeMC{$ig&jAyJgc+-C1m6`5f;T{voFD0mNUXoyU; z?IeDmKU|h-zK`L)QD^Gm>1~fzhx0_=uMNj&X)Q=Ox^%I2aZ)E}D1IhlO~`G!7wVbq z`|G2)aO~Upqi6}^3UBwMV-rrc)n+x87JK=K5ymYUcHg!3cMKM!h>c-rg&)R)JV>2p zq3!bXsVcj@{uTNAUsW?J_Hiv9ws0*dzF&=Y?oP%1hYg)f*u@-k(7t8r2*T14MwcUxPl1i?8t2SA9DbeBpMV9v1tSYFdBm zeQG-5St*iL6E!bIj+bzE4`!VRBoC6WLjq%u(4a!JMi%tV@go zi*XIoDjb2h1@%prvQ_AP47KOEKa1BznYClo!iE%39#a%^ws=rK;TDw{jIZqM=;p?l zYTVLtE37jtU4e900JO3kkEU1+q|lUiTs=DYl(k_PmYBeBOB_Eni}8-8LaRU-O0BB*bYl>4_d3bFP9Y9n;5|CnN$$*OS zMGKZl=a+@Hx2qY5y`VDsN?GW+ugN$@ev7MV)2s13k|lr^zOp ztV0~-BHR%6mh%fHU=EQ}F<9P&INk}Y<0ygx$DGw>pj;@DzMMB#J~hp<3k-az%u5QOx4Y+U(Vd&V zvve1Av(kRYQr(`bA=~U&a#CuntnlurtKloq%FBGJCy1y-EP&)FvbGX9a;-iqRM>D* z|7N*PX?XFoJ)5YrMe0k@@UM5&l-YJ1{=4bY_&KNuj{;*qEuA)`LVD3*mLpTnm!Gk= zYOgPp3<+GhLKTLBd=TY5OEjYrLUz}^7Hr9ef#c+NxIYWi0>#8!jHKC=0F(e|VY`Dc z$zHDbcf?_O!S8;1A|-L6M(ge*UU)VHZ|3-m8?JV zQ#0eLQjlFC11yax3ZRAZjK4?0eo-s?aCbYBmw%ftO&kPNrg%Pb_mqJeOdo|XS~_`Y zRxSEHT+>n6csc`hIu37fv06kXygG%_qqg86D!+(c%q>OcNkORL?ScoAzbVIU<6R+~ z=9ubhIX^9}S<62M#y%o#&wHVw4 z{n)~WXnrz{5%-JeWRNn6bNm_bY)q3ihTA16PKxFognFAWupvBz5argf#Pegud+@-@ zv|0O_2JSE~*2F~lxR**z0T=1#g-rc~oHrz)sf$U2^6KptelIlJUFv!zB;aoFb55KJ z!NJR&ji~k&0pNk_% z;K{ceG)iQRcJ?k6%8Y$$N$K5wd(Tku{%a%T^QiHQzL_JgI04dksimQ{9R@WdovXv1 zGWis(zOV)h;7z`~L7AV$FQ|f={G5>>;mMs}EU0z2_FwE!6II#`c8cx- z0v&OFN^M}Jx>nuK`nV-8*FjHOkyl@SNWO>t=EeX1R~GJni-MYW|JN|d0e_P!(t-fF z948O*2wb`G+nFZy9&NF7%OLNgCUq$xkrz!kTbuv6kQWA|ISc>p9KutdJ(=1((w_TD zWMV^L$hW=v0{vcF3)49c+5YIfxQ#y?LLJ06j$t#^7SxwGuXJyI(CjmNYfFyW^KF$9 zPnsrBN#5%(HdV?+RQuk%+YPDnZuX_=|MDLP{HB|#qX!Kr7h3}E^oKsQnk3sV)Hw-3 zG5RPYOT_Kx4HIoNe*Qu)sATay?z0*HiRHrO^zvy(l5=VDdO;LNZ}zQEgb&Q!gx+88 zhlUp}mP@m*8)agKam?A;M4m3bRS2C~qM|8-hl~8&Y~RajHBhHA50vrOff7(tlUbwL zM%AZJ`gLlGC)J9Q#OiY0+4^XZ)c1ziEWI^7)%V0l{4h=c%&?iIF4q~qD*%R7{W zP6+h_uvh|4QQ}AMa#^*!Z*Q626g(zg^0n&D8v!Z_sIL(wFei5&(RO*qZD)H=gmy_g zjQ-3k;TPy_w@;3rf0(uE*CGKgZ~qRq85TNxKs@NzFI1cRo0KzGBy1WQ6oTr{Z+|E3 zO+~)+tuU}eeSJ_|zK7QSDCiFqflHd;1GTbW(%&vX5^W9>xZ_Xr5y zN;BcORYspe#uZ5?PeF9bI4FobHf$-)tXAd0(hGp#N6ZeuzFr-Nx9*Y&^t2FOE2At; zCcc2Fhi($f_~8cLc9A1xkA{hBtl4Dt^if;5{_jq;NR3pQn1{bAQ^QC&xE11M7-8T0 zuYB^Utf1*_cOd;^e&v`pAK(qU^CZrOml^!ZdoXNG%}CX+kN?>8RBl@eRVk?beigaX zXgxs??%W%68|v7`cvBPv_J^8tCzdZ+_Huu?lVAI_3j9iG4~HnF;4rK|EWemVm-js7 z#J^Uy)+#YQcsc%#M<*})8*U1UKoU@w2@D@vZX!sAAcJ}7lgn#bC3R<-^i%-Q z`w7uLh8FLH;vz-@=jA&h4ol%Kq6%XA*Dl!~^@yV*)8E$5aJRFbL-Qd{5K71!w3O^S z-NUAFJJW=)k&I=|V0U9_dEC(|HR#V`jd`j1u@9Hp*Z?7@&A87tp@k;SiX=fFhrfN(fawbcu3f4Z z+5k~xGm9p~k(D?YDEd5?F~{Iw`j_!<+2{cmFH{-~nNKB*Snj6cJh#p?^7ja~b+~f+ zydJB3yaqC_NYn}GvtYeucvr_3VtaE~_$cZDC&pMkH_uQIw8GKm(cU~&Th3Wta(Z6k5}_!lG~f^HQLuE$iU%La7YlkLMS_C6JkY_K911M{(Ecg1YLlVDwS%?Dmga8mBU+bf?2L6^=i-Kbbo-oYza@=%!{*?*tPCw++UtT4Yu$#rIqSrhLk1I2gvpF|*p*iUmX+68x;M zWKnm!^SW*F^sUEi=}N$7>K>kb7y?;KMX3#^a9vC^GJMAIw9wn|MoICgi+Y=3sf7p} z9U_Xbt^WkC)ar`&uqF>*t=wdPm4KhR#gSqFwg{Fvg%-3>;H(X75y$IO988Hu3@Vz? z1b@X3!ytf(0B>fhP9TMYg<@t8^P2~J##EV(VH+yR-GvwW$8+8xh_(`Z4y=~Xa}k(yqH+j(rl1EyjaKwav-I~eO6~!aI4|og@wxDPvGPR0 zq}yHXv{{Ba+hbo3m z>rnGSOW^spwlVQ#d^roptKi|LKuo;7;Q0<$^#kR% zhMWRni|n__e4|?QE6p+E7F?rTlMh_z=SQDrL=)1zb5BSTm9g?u(5%v5TMj+TyW`hv zJ`FwOW@jHiRq=6ESH5R-GkPId^zrJB0xy0H$`OgbIujkl?O2S8=vXtHqRZL*nbEtX z-Ccd})|NE>tybq%-)?AhHZ*1aL|orZF4}(O zhG8`)C!@98F{5En{`c78BXT@XH7~QH=+$v~m+L3Er!kCgYkqYKc=Mg~fRQToOXADY zdkJUzI8^ExQU%Q&jBgaEzoORWY@96yoFk9YjwZ0qnL~S7*k4N~<3Tz(OL2~&jl9VD za($k_wdp>_ZbV4&C~J6eYeA+evm02G{LcG;Sg$ogcP87^+3|tW$zx^yuL+pFV!94A zAxb4bNEtDODXjRj>#ptg)@90tEAd5D&zqb+9M3EOa24Iju*8_#zmEp`7HT;iQUGksG?_hIfKD21}ax*tDjiwBhM39RMm6e61Gl(OJJ zY{WTUyuBws+R^O^OCentrT)DBmRO-Ya5WP)Lb+!m)S}4OqAhG3d+WEY9>>Ropxs}u z?5~R%WqQ>meq%-+}EqI}Z@r#4EH67LSk*iq{NkT7R@QrUgnLxY`;ednYV|ZqFvY zyMP83gv$30uGojZf!_PsFwSkfl4_%NZB|TPd~eOS1gedn?1ZD!^rEQ|CuU=9(x~_z zqws}m{+kCcpK4`Z=8z1mCDG3Oz)@1@*4yv4u{*OrK;^99&hVXa;==AV8UyQG zaFtrZdkDEyi#k<+A5Ux>H7=-Irrl~szAgEIvRI6+OQPpD5rs^aVF7q6uCB!iUKhc) z;jqYuINfd5MQlaG8{!;kNDkoE8@+L9y|X*N$cpI}$COx$J6mZ^x*$}iEEcN(;}D{SydIsi_g%@&N9(rnm`RR!Fm+X|6D$>7$C!BR7@ne$bw$iGYr0ndz)V{ysvbBZRRn>YRn|=y3IZVH!sHK`*gfcqoG+YOOB7g%;qw zqn#$6&cvnD*F`{`qAD8)I3A(KS?0qA`S%dJ{^F-=1hbkOycZD&n2Y2%4){m0^uO24=~#lmLjwoi4472v|e4k26!w25ScO~YHANa`alSvp4Yibu+@ zBL9Qv{hbwO)1%s_5?UoEscsUZ)X8q?D%Kc63z#av-6XTql4N;rKBVd@P}%1d2mOxQ z{Uqsbd)`}=vNHihINFdBD}50nv(qFw0krzy=a2L{u%g`O*pK(U7a|&p5#ho9XH~}; zaex(Q2o37#MXyTt$=p*PUH44myOLcTYs7BP^O=tva98#>4p~_$Ts=@5(QZi_xN=~- z*O;)A`6R@ZmP3rXj{>p*naCN-gf%wW+c0oHbJYb|r)*GSD}yjmgib<7s7~ zV~iW1qowg?ABG_aIl^7)sd-%`JU}=J0sGV@yCe#@azxAYz?8GdQlvk(i-h!yFR^%W z1sHI8#f!gLNqioHB#sKQ{kG(2!D%#}w!ywpU|;{ax0u_VlvqLbV#flCEbowwPHy4& zshCx&V%6!Bg`OQ0{G!~MCWFt#x^haltgFN>1#gdPyAL8d%_Bvb>V=Ox`%MX3U6=Ya zZi4fe@I9;(Jf#)WXM+S$kYY3l0pB@y+4?i^B-2;b-43!{m_mHUHRGrX@DFK44B%o8 zSP^PUg3-F6=7qkKHTNf{@7HrMWJr2C(syNJIibbC87_3&T-KtHR)Bi3a!QkbU_e=a zSYXZ}pNazoLS*c9m|(tC?FEcY)tQzAC0?6u5R{7uc4u&vFs&tA&E)&-Y35lX>>9q# zwP<<-ItsP8@ZHB3O(DH^Hz^R`6qmnvhq`+nfVhE17sU5U>RRlsF1AcJc##ZjZ2*E= z*5;d+iP8Ls%y$xDWe&1I85aeT@quOkG(zx1p0R<42f-ic~1>73l4y9)CA$iL>=5jGJxmf6uDB z=M#>!DW>mu>i_`w_+dEC+h4r5zsuii@V5^9tpk7Sz<-wx1bJPn2DwhVwrKgUj*u;B zf7_W4swB9eKh$%MeX-j1dZ2_8K&eUaz7Ky(%4**@mg{p`;3)BKI^CtQDj=kE%rgCh z4)Jcz|LJRnp^-1Wl&;wvSg7^4y0>TN1{+lgXNvP)-dw~Q?x{~PN4Q&L?;_0(yh_p? z1>IPVp3=HHEVKP0h}b4k_<`dP{LiO(&>dp|J$dtTW(ZhPoe+c4xc7A3cgX$qRwLgu z<%^GReDDGQGV=EFE0(DH*UHZ9lE@8cw9kz&IM&VjeP4FJIhib{%p%*uy|PqTPzV61 zF=i=<2HzA(v{RuL48~3=IJG6SgNB?&f~t-+IYh|2tV{j}Z|@z|RJ3l720;TNARxU9 z2nvWasS-eGBBEGAk4gs-0fA6Mkt!VlMXI1wiS%khZ%S`cqy?ozLJbh&TYB!f_n!0K z81Mb@JMRw$15MUmd+oK?n&159Hy3Suz~2_1`qCd~xf^g1=lSS~!Fr_;XvUt3(MzkP z100>t*TzrYpN)C>La`HasPtDQdZ0bew+=+OTuf0tve+D$ zt5F39#w3mSQWDpTfH_0kkevznttDl{DMzp3;Cyo|Qo-iw0%MR=6mRV;<D1vD3V zX!`t+igDq0yE@ebaS2;HL3w+@&Pn<~T{vX|4fk`Y(fZi&BV0@Yfw{Fh^+Nr}adjor zcW-RU&lH95OMkYp%zX1G_*zp&g6GDy-6Q;=MN5&8R8D` z`NTq)EH9^j0)dLX&()WtI-xZK2yTbWO52FZyERG=qu+NtGCQDk<3@|# zo{a3IfT>&59x0QaV2LT0KUse=GMPje7k(=^c4B8Q2 zb-D5%!cpq2r{`!(9~H`T&svAxray%QgwOl;7{J1Y77?{fzD+-lPTcZ_!&gZiIb(EG>*RdHe~k)hE$8I$~e z#qLDzUFML>Yb<)GGMcUqg)DkZB(a{%S>BG?p~i0>AN;+AVLob-m9Nk2HDyG?cat8~ zg=AsHJ4CVy)|9MH*w5Hzl9642 zUP?W_iq8ytF+*$TF>(9V)8xIld~Q)XfyR?lfnT{@9j)#_e};`O0@qw=)Xat0av+sg zu>$5_`u=$!OiSkb?`Bl{U?f5!`9SV46D-?Cei^6(oXGK(-4RGAZnqm8EsU-BoufE- zyyt~ojLO{a`l#~k&2&`lE<1YU(zd|_b8{U$oXobmy>hjwWM}o_v-M}^D1@9jQyLYH z@}5y|&@4SygDzHj!YE%cyuvVj*MUti(yLasz}@ijv1@`1&H&o~V0iN)Y`qE)^SlbNaaoHd;`Pa{qM>f|Z1fNCa)y&4` z3+Bs}A6;BJ4C!l+=H22_%ouDFN%&=6W0aH?&n9$O4uK*%$3FPNk8?=Z=g_3j zT}bgenbu?bn0w2tr<(SxojIG(zIY?WSiutgHR!zOy2v~av_lCKo3*TD@O|fCdicwV zu29TUn=uA{=ae=jbhY=?SYzJ=r3s-rW}T!w&m(g?%0lqXg;KbF6zEhK=#;^&M~906 z47vH}*JMHR;Iu$L$*I_0i8nF#m4xaqJ^ir=p#){EHsi9AtP|>u9k+L}crn~)DGtj? zN7>40lgXCJ+(oq~F!Wf>I2dZv$?r~O$+O)E?U`YhP1n9n%$^TNKV1x27=9+A*6nXM zt!4GdCx}{Z301n0gpzN&C^vD z2G7$v9x2YIS$w_Ffta%u&-D(X=06%MCby?PAP}STS5Ax~O4ajJ3~#|tmu!T5~bTEp7W zmFeciKh3XRQ~X5Naz-+Bu(j!wcY3}7k3z4s%$@|8{(i+vsTt9Q=Js{zulL5P2HAf` z^#9Z$TlU9LFTne;r8e>Tv5ds9dp?R|21jh;nk^TptuKH2%sf16h5M-G5})dgUWd;o z4?m+%%vp;6?yRaY)h5=>RyAKnk(mW-D0ZF4XK+{Z2qJe!WP3bsmsQtShMRTBW&G5- z6>{mp+Zb23G%_W3fUj|(J!ecx{?vB|)_arFrnNCf>C~c)vyq1ed%}Zg+=#Dkfv&x@ zk*w5Y@mkHpxU2Iy!vX55Z+YKi%JNHov5uDCZcK{c=;XP5%I<`T7!L5k6X>=cAH~lD zJLf7c`zEDcOdpYHv|$RktrT|>By5)nZid7+soyw%grryg3`?F{r@W-3I(ur=hCe7T zZJ+xNwBn&;^jh9<0|)y1c*ieuv*rD>t#2vaDxRLR!Yc}Xa(ckyW2n!kG3>5rX>VCp zmGCp(`?IFF+P*>-!#Cx0)vdu_ranb_;kF^)T(yOs7Dv&aj?+?yM!`owB{pw-zVWif z#o>}q!lCVZdUoqST>{0le{FWSp4#PDPK(LHMb;h{saTCMy>k+58E7_Q_0kq)1yTrvBq~mc=lqo~hb9L zvH9iS5C<$rMen0Q6{UDqWtO?OZ|EE2MZ5MJ58Mn>v7t1 zpiLuQRRR-HuW6#H0nZixnBt8F*R$>Kwv`a)F-pR!9%dACmYCdfvod*OPlqKZNT7D+ zX=JPD#`C(>VSEH7gIGZw3Nvq)GEU}R>XdSF- zdgXyrH;vF4h1tYTS&D?J=N4?mITcNW#n+69XRc4;_EicBho5u zDp65wH?Q-0K`f{2>a_?%?b0mzs=shktQVt9Qm-L8&%PWfb~<18rKV0#hxO@!!?%*j zHz#P=uQv)Nh*A#Np(8=qQ`qpQZ`l9t8>WJYn%5+tf@RaaBzp2OFK<4UsDIo=Wn0s! z(hpTfq|I;}RkzKsvI=Fc(`ds?jycf1uxL;(0ar2o4S7t1N{6_dN{erJyEX8R$0KS; zY)53z2VashHxn{(=I|-SGj}ls^yR!qw4EFEcpb{0=B*Upz0(pX4)*uFz&Qbbw*8#7 zZEyqu2W&GDQ2^NL|D)K#jGz-N$(6s){t>>s8A($7h%CBZJLq12zqTS>r$tnliwbI} zeMY7U{ms5#TP3`Mnqg)IH0Nn5vI8a|K?X< zE0sqa_}_nw{aioyZ~s5MS3O#79r9tAIq7KHEUgO@bL0wp5xamDhqfP22W zz0wJfF76n{Kpx@~?d+y3h5_#de@Rr=MFP;Cff!*&4{mOj(zbaZtSa>z@>z3+9N_>V zeJ@#@btWav(4f9+@g1M8aoF%b1q5s6_>|+9kAYr3pK=EnQDlLD!fuA%@e1kD*rK2G zT9f2?sLquhUe zk;k#E)6Bz86MsYQ_3v=e$(kA^g?|}#7F0gVp26{4k&<^rqzN%W+3GJz49;8P+>J?f z+6;bwt=Nf6t2<=NQ^xACP6v-2Wd}x;=xkg?te%%o(Q9D*VOII=aw)5^pmSYgRFG2a z6Ka*n@#AD)<>Kmgb6(cK>J3}vKpTK2*MlP=c;_e#`-Bxd+f?FSn5Iv26=~bz7zUsRd$qzlYIesNbN51PXj7qag z@TNzKWXTQt>K^C%8oVdsOa?2I=_JG}jtay(CM>;pCa#M1#H~Pttj@TYvo#`O4)yTL?lEM4IIvn^pRyPZFQB&v3bjk z-zTOT7$sT_1mnW&g@XgTsCIC2KgfLuF8980Rk4Nv_aiYXF^6YQQU{E$u3J-Gv3a`q zd}mpWPh$YVL(JLBAXsC=-PvD!QPv4FuyWBW%Pj?Ig$g+M7{9PfuC3l5UpX=NUAI~$z^wfgfoQGn2Pw~kOKu7E^68zDCV^ntA_K|R_jn|EP z1(YuA9Py`cfeBu-I8eS)(C}=#v)^dxZnM#Atst#SwX@8>&Ky4%`+>4$h^&ik?NK(? zcj%p!t;-)PzQ1@rK$Sm5ePk|aKIJA>moc)evOXx+o$3iD{y4qi zVhOeh9l@A>c}{5LlTh_%<5Mll;ns%dt}0A5S`pHs@GiU20G@jv@)pN*9$IhJB@}=B z(M093j6nFedtd(W5h-I*H!S|EDs*f8)~N>*R;TNY0=ybkY`-6J9x_Ej#9k2xK1{D7 zXjSy`mOVDzeB^Sdvu_)B^3T#QLI~6KH$^G8HjlXO12ZS5&10f79t|{Umg{_X2K`yh z(r*u%-t#Q@>T$}ony3QYdGD9pIvLJ!Q((QYnV2R{wemB>(i6}ci zd0nQnw8S9mGR@vOije^X({D(NA##)KC(B1VnFyF4c%>bJQxfe@;oz@WGb8~H?b$id z%xNyUVW?vvOAoz+{X$jZ!wZ}N#J-~J(=Qwu6BR$1+Iy6ln+a-4#YiQ8PY{!$#6UzS z2QffC9hys+AssBih;$;rZv*X6M(p#GZ=@kTJABGF@fkaQMm;?IYt03c`{cImGr#ib z09A2v+X!rl%jY-5pN}NAte1J(aR%QpI*J(gggw=Zt(K)gA^EqBtJhcebre=(9D!5| zTx1MfgzvvDVw;J(wu6EQ61wd_qa1X8L#!BCRqv#@=o43~1(n@0#y8dYSivAVWbV)b z=^B=f%(B0@_Va_q682PsvTdQMuA>K&J?F(!91niQj|o;i2<-Uc`vZ6*=;5#j+x;*+ zrvX{fVx*X4_obXjnTPyEC(W>~yi8Zv{O#7=Zr&T0wGFZLBF}tcz#xgDBT#b%D(=9a z(Vq`k1lq%hKmE)>B}OzZHtY}x z=C96c^@=6YA3yMXTRl6~#g}r4wZl+)b!hAw1=<-cPdvgMVZ&5U>cjObL+7{V*Cozx zZK-IOrf?0gv(uwI(3BjUMPG;fOQ8A;O+**uAqU2mMe6L@pKz%1>V-mB~%4*u#sC z+YVS=e;|Jq#d`w5IcmqSA8MW&w6ZnPf3dDM6f)!a?Ro8?O&+=z9pn8g`;+ejg0h1= zgJ|WjZAA!;vSp0CXcqmHXkS5B7DK=Ddb$ib=pkbN7}cI~WP1y|CP^vBzaa<$`fH&m zIY}kM>9PjHZ6|t z;$qt*qZtN zhA2TIu@A(yO0W<9<6i!hTO}VVK`-*b0WrPr3!G5672t6X1hT`2Iq2VzPTISmNYfs+ z!wfHs!TyHuOK6k7fFP+~AL4KJ&(m_?aC|2DW@a#IO%4$3IfJz~SIEo&YTd&-ABPrW zcR-o&vc4;V4ZHA~*g*rA}Zs{$5G(gf?fC!#J^3!6Hzp_#$)I4~Ekk!35EF&pJRpLd)} z5}v0bHodp#$w9Q(+y45hQm!#jcroI&>-RqKQ&72SUt0j!=Fw+J*GFXaPjOL8h#Not zHo#$`HNjrxDmBKwSKtpN`49{uG3S>j7{UcUr;ZYpprL|XH@c(d>e7y*m1XicFg+d67o7Cc)k+z!98cj)M&g( zGF=w`X2di50i}nu?wSn35m?Z(5H?#86Y}j!h#2=T@;YI+tIJC3lLwfLZWa4hiyBpF z8_Gnvq^<%@dTjKxAfY4rLw|!N-RtRA<#^ z$IARWc-cnRRJ@8DQbUtG?Vr>+PI^@{zS$PkV?Igo*?_tu=FMV08vT!hi5Yt6OdH7; zhvc|kas8mYXBy6(^Rn93ELQ7|I`3@!AFhOxXlpvupj)!y9rG5nHu_}TswS$VPJiV) zWHtkOw-Gm5s}BdLv0`kyEARTp2@{#bbCL|HcYRKbbH!qygJ0bC9EnXOz8WKyPGYTh zOgKKxvPqel7R3IXD!hYMT%mVc9s3N$MvC%W;uBfr1bG9#+6kp~Kkv_F(H-7&wW#;SVc61xLr59mwa_~t+ z+UwZ0wyMiWvklPt#!R_E8xLasT4+5l_GH-)do+!4mU-Z)KJlbi6R+{2%Hm`kLsT9f z72&j)z~Kuk5|1y{;LV3Ps{_59GytcnbI)44ovYD6n@eXMkdIeYEm%){g%5 zRv5HF^W)N9pS$0A&GQ;BpFK*{T94XQeo(XGeI|A1=7PTju>?U$QXcia?))_6-o$z8 zd5?(?8JbZ{F8yp!9zs;quK?IJ*xWe++cCu5nM9dL5?cc68BwhD`koGfK6ygFd&M*5 z$sX-P$V~zb{}Yc4_133qDrwIZIp%;>kv~5QbrS#s19JD5dJW>&0uYsWS4Wq~9$6OI zZ@topY}FJG!Kq(R3Owq+xtRV%3kf0alNk*dQT>z;!S@tl&6wEFc-wI8wP-J}=U7ce zYnjG-C%3r>ywr)VcQ#u$bQzndK@jb+;jrmJ6do++WoV~zaHX$DDpSajVhL>JT;iI~ zbw2T~+B>?j2Je*JCO<)Z0RW@U496}}6rpChGv^T6=17@V7``*kK66|iHX${2T>I&> zN)yAIoBMd4c%BsB7X|)cwyqvVH)VYdzE-f@_4kb_jpU3 zgTN!mV@kYvC8Wz$`n=taT@rGlCDt)4Q_WJ``8pPPDHd;6GXln{;BUzN)7P*>uUXMu z{qxk;Uuqll6egZMl<3?rik+XAmg+FuYlHZL8AqM>zXmA_dvfR95864~(48L-PgQ>j z8m4*jEMJc~cr!==4bb)9=iR3dSZ@m0(WN8kTu1m!+w`e{%H>a^)22&Qu}o6d54)gL zd!1SI30MU(Ft_V6CpaI!6ehbLDk9QQTmVUx5Ua_5oWPYJbE`Wkb5K%3EEM(q{Mc`Z zri8x}d|9%Y;Xs&|{tthGCP$h;R*SX~^Btrl7zgUR%|0+`_~QQ>{tMd{dvM8L8hol} zlMJ-zKSkezz#06A?XtB1=8j?rwK@Sirh@+*@qbT5k=2x(kA1WOzKVok5y@-_!mj+$ z;sMCb`5T#|I)-O9GZ)nu;VU2fAB?Sh_|NAl9}HJv3A+s70HNUr|K!8~XO(#$KU-zhvMT#bj_bl>VO%?(6PyGhdsNSE~xIKtjwco`LwW~#<+Xe)pU4|8v?b^9UxK? zzP9;aBF0;0A)`M%`{ayEdXON%tkK1#TOZgdK;5+4i)?~yfi&iC2!pRl<~d(oSyi5q z%T61c)^(w#rnYZ+;7_B6G%j)|XO{o5 zcw|AM=OqB{xe2IzG%ijkzV*DFxuCtwR_vRzxsMKmGp?wqe*A!rQ5E&?&yXGR^($FU za zc%&&zwB-Z^72gwvJD`Yjz8Xw$Hp$jZW}OVKk&^Q@!y+}2raszld3d#~1zt1u$A0jf zDf0|!(983^m3VJ>M_;44eY*FC*X3C|*S>&kPm22N<)JS!^V;h)ICJF=rH#xSJzHx_ zYcGl1yKh(xZ#=zI`s8n~=0R96-iL!ls@UQpUPv;@RSru}$_{jKYg~v(MBmO@#AfYx z0wwVcq9=|P#l6~yv^7fS-2--SK8nKH|A0|=ZSNh>3SSdOa1g^keuPh{ z56qrg>r}hb$lRQfl!C)fh;^_|OOHCeC@5ZAb1KOV64kHkRMQemXthd=BFoK?dr<5o zJsgVNVktw|(edTgXt#3%t>>*SbyGL8^M{h8KoP0oSSwiqWSm_w!ox$ilDoUR6{i&* z9VvC*y^l*46iTzoyw^w>xzjhEiDL*SdCf-~Xc8pH^BBk9b=t;Aap(iaE3gUr4SKC= zzYoHvbr*5gai#(t^J^51xSi16+}HD%rFwi6A)(%Q^1F3x0Zv2#;$rdXNQU&7z!0mV zT>yG!>NTN!-HYynC~${*`uv3taely6m%k8tmS8x2anIJ#PKbcw4b>ehz2X~>P%)j>1_VCYLO< zLC51sm236kU58_p{@+k6yFgXOW-^*Nf7e+yIXtn=<=hjQAdlCV6s}1#SbRY?Lc3G2 z3@X;PUUC%}*3k)_v>f)eTz4Vv=S@0-Q*bQ#E9NwTB`l2OI+2{{{`fe@M#3q1Lxxso z&Z@8byTZX(M$)eS{ZUC+dBwZQ`3&3fEU&6(ll2aXQG0;OOp`}2G*~*hi8CQh&7^Pq zg_+RQm?NW;}Uus_u*2WAQ)y z2Q$xF*QM$>i)TeomEEWczws#J9CL!pkVxttIv|tX9nFGNZikZvgSd(^85%E-%(q&& zzK*Xtdy3+e;5MpqC`JwNpcv-b<6N>pmkOF^{iV(~V@p$6fm29IMNsRU>Ai;y1U78D zu}nmUcJGvMC;qwy{EyNGrW?NKitHFTwHnn$-n(3($j2Sr0e+O4zQV9|VFJr9j~H^h zoKV~=o0p<}>Tw2(i0kBUzah+WvEiw#B^ZGiN}s%2k(UL`GaNeE1K?SL_6zP*E^)e$ zJ%>LV0uFO!nGL+FEqsj2sb;Ev>peN*cNged&${#t)^h^dR-1g5j~y@~=RbnbIcOP6 zOg&=T)5rh%G=~lKys}y)W7OxK-{r=A@ABBzHQbA(;g^WfIT_g4?(zpeDiv;T#!k@Z%saod5E!g5b#p^W-yk$opWM5Z zaD`*D@;211&G!Q!p!f(}fb2jKPx2ArHApy43+;Jy%`rm;Q(B#3G+3hA(lp84+sS}UheR062$Pj5GNHCUU3&IZ?DkQNI- zS`1OJrTb%8JOaQXX2f&qkqxkY#6D4wwgJIL7e^;1%LhzH0t@fB54uE*WiMhWe7`jn7DDJ3njkn z$gJ1hY9uvNO$a2L8$vbfdi znk}F$l45bvN8byz&VuXFp4$%)9Im+ka%O5;IL-B@Jat*j&#K=L##Uqp#^+IhuR0hL zzE=Q+JOC&MZ~k{w{C&9wHY*rHfzjcv-7U7!y(a7MxSLG6O&$J@3w%U-hVYpkCb0Q7 zDuBX9%vYlA{KW>-S$#J1+CYh4m}({!mxKqVLfp1#R<=Cl!{7+`e+Qk%-2Y7N`kMY% zYWMl>p&mY%tg9W2U1J1U$@j_Ft405gOd;+g2WWyNV3(q>Yce3Z$eG686#I8%3UU3T zn>h!5SPoy!0VoGq#_q23k%PpxR0P_C04!)fWL=ae;^n)-jy!Q)1YnH8v?-zQ#bGj!jem z))2)(=0tY--XZX`RfkqOu9|)we>R)ZJ*bPbTX1dprS{zCtQX%c<^l4zOa>Luq~-0A z-D}XhLobe~f7x4Os*&=}0I@h+pu1?e+wj)^by#EgVx-kImTN zSoc?cw&Z=b?Ws1o4{3?*%R(VzXR@MZqd<#3M;DRI zZJdbK2sv|v#_)?tE+6gajJ+STQ+?6d*8@zmdzCy_#8wYYAfy9g1nA>u;;O|KNuv0N zrtm_!w%mu;iCQab#yZx93{-v$EXy-xh(KTc9OU5s*R{Wxm zXy$I~EVsF3TszJp`7lK7zVj2g8w9}Ziq83JQ={C8{5DtP;RN8|)5nh1IDSi(B<8he zNPX!i8Mx5x*bJ0Bd7}|8tI46xu0{a`#03N&%jtWC@Fg>{(hfGqGFo!qtX_Py%21!V zh&!mHP<=Kw?|KlO4|FYL)|qK3QC)B82{gZY> z{_%E%U=)XTCy(IxkCo2{zP0pLmL=Pz+42_^#%VDSX9*T#M*>8));hi@IVVT60rZQn zlAq;LkE>WirnM5}5AFsCLBd4x1ZVgj-UXP)ySf?8WAB~R^BQw*bP>s&ojlrY{2t}* zZb&V+0hkbxzy{sy)rpOw61)9W>)hl_t0;@s{`y+?XN&>LYCJA6&t-a5Kjd0gFfYk~ z=76Kg43GW(K5GI}&pc_)HB`@s!#cY3hxz?b-g(T+RN&l#rtJG6|erAld ztT`Z!?%T^Vx*4AE1B4z*CMs!OF&;hR5&Ov{lq@hubJ$6e~qy|Tj}=L7FYlp_LE z^d8SjhTmDKGjC77T5eaB96y~MGT!QTQP{}pvbBZFD&p>_b3~=&nlrsaUDm7KBbMT7 zRg3ldJ%OjTRW53L=_#-?BsXU_acLy1^$ej_OKKUUKisee``!ykGI_Ugfc6mwk3^G z6YK@6;d3Qd-Q5dc>Sqz{5}vIV5JFYu ztqcq+U*~1cjHSNle7_<~Z4E!8W(^S)d?pR)?BJk^V{rI~aveAs@!_5YqvoAMF#LnE z$d_aLXVFQFkLtVYFcd0QAqsuo8)AvXPxC&&#rN81<&o(5n%eSk*}L7ho4+-wKXp}; zNIM}DWd&?w0sw(zj+`OCoMA%EmY@K%3dK9Opw3CImCrk!a*~@Jbr)+wIonto6(p2Qn+sB6;HY-MG2g zkFFP=bz9y`XK{t$GhgGqc<@N{8_?Hm%mq&Z6^cmd47Mxy$V~Z6^sXc?N%_^i(Lug- z>dU-?#^o1C<7>#lYU_<;9h64wbU9&C zz1(NA-Z6h8ig9ZrlAR}q7~9kD>SIMfTtT&Hkn{io+(8j3{@&sD%u^~4JaGo06PH10 z2e)U6=&ES!MzSuabfZV_H{7515kd!O*_==sc054;_#^o-er1LKdbGnY)Rv&Y;}zVF&` zS%DiTw>AuL0yr%$mJ8sc^nU_{vFYCs=ng1qAj#nO5{qsKU@I$WWFH4RJ<)B~=C-Z$ z09t|ngD4N5*$&K)$dcv6_!0{v05^&r7fkE>Q0-ksUpb+D`9aW$`$69qIoh?We*^&@ zR}MP|Q1k!H=~yD1_s@Kj|L^%Wm^P3KA&mkJkqZuW$n2{NBCy)u5MnCqU%!dH>852z zxt-H8L*3y1X{Fx?ocrw~B?uXsHc?^Js)dx=LR`{jU47t7{^`%0WRD!5On#FR_bH8< zrARFWM~$5PA0`t~uzTJ$g?+tF1zu~F;%!_}jS z-z}z$r*90HO?D3Gak*>X3u36@9|p=hmRW4HDlLI8?9=ArSj7+NrReeri>YEst^gWJ z4|z$IE3?Pylx}2JL=bH0IewFT2H1hj7j4^ss+0?07*l3r54ly8fw`wBmRJazvnC3X z!x#WzJlhS&UtHgamY;#p6!>+!V_V8L| zwD!ZQgaM{*mrJcB^~OI^_#g2?4gJcrTkqeY_&0F*d}M}1Rh7DmV+awfj?Q(*=u%sB z*V@1WsDKaEq1fNzZC^h^9}X401B>vkik&;Yc}=OgDVasHD$;P#?#V)3Y1fY^`YX^c z`gjJMZM5%og7U2aU(EvT{O>anf|o`IZdh7tJ@38?&rD%gSRcl6u23F(w$|(&1Knq~dE&NQqDt8edWs#=J5t z$Hu5}e8NR!TSaHO9yrwYPMvjIkpgT;+236Pi0IxCRy#&5U}I}9oGh-XHh1rt>O9ud zu{yAHefLUk_6{i;Ql|md-Zysu}lj< zg5?$wGJQ3;!(=mQF4|=4qNH%D;<|)TstEi^W9S`i4QXZW$Umf_WTUFcfQl!o*fCXZ z2f;}(-hRB?F7^GFKlw?09Y zJJ7+uQQr8eyO>Z6!wA+69XqHkS-(QDOyTqH2T3>223+J`ROquXV22!F?-31fUto7?D^RB$Wh$81zg3O8 z>T%)f%A&5QR_?H^p=LoA*<-(zGvmt#bNj08_T&NKDW`KWf5Dl@Y>c;UU>did%wRS) zb8S?fIe;eesxL2*Ba3DU9V7`nQ)44!ru!tS>UoMUuXRy*TwN;-Lf$c^Jqz#&+WR8I>O=UbC?! z-Om>tUkZH0MaA&OFnXq}(wv4h8zVv=o`Xcc6<&ea+x_3R81^ zD$Ln2z1FoT%d!MbzzlX%Ki;5$mZJTSGyJ)bsbA;NtvYggtV1O#>Q+yS=Njm^HWgDW@=RU3^grB;#Ly`4$(RAYl+x^yG1VKG8mWOUIo)A;~#9-#RHn%g^z{ z@f~Nfg03~S`RN{=N6J{>tHb2JW}aQ%wg;1kx&2Yl+)X`zv%ZBTQB`v+;1t?v_E*{o z8J{i$&K|oN1<59x(sFFXbI-~MSqG@LMncBlV<=PhUJ_FWl_kSRD4uA13aL8heWu;u zm*X<937V&`#m$^{keoMuQq%CcmXS6o+ETiRuEiCU#|{N3boeGvtPS5a>uc>hJB7U0 zsPwDW_MGd~xG9IFu1rNW#FiVE3Ry0SAP&tP{f3+)NsjIK@yaINsSWXc^P?GhX=TzC zNwwYxGVTdVV;z)xLBw=mY^w-@YCrU!V_$%(%4UY!Vfq>o1ypk3yo%1BoGp4j-k|vv z5Iz?f0D(1hP=fN5cFMWD7y|<+@#SyGloA4fws5>>3&S~)wR+&M+VezU)LpMMU)@&h zY2uR#sO1S&_<7bw)uJ@F*gVHq#4g~Fc+yvHboW?EVWFW?XH-Ds$C)kh$KjjN2OVHu zG|k|PNiLI3WC75x7g&(%X54c)Yj!O+p}qb_J%DH0ko2j* zjw~Kg%AuwAHIgy@;uyR^%Qd*k;0=^>tks>0U;&P)%WE%$Z25T=eg!B`Y;8{HwJ7C9 zVpwL3?L2<1>|M01J)1Y0voT zJc{Y&mS)=P8L>`^eTsH%%ha7q+maJ}?RA*}WbU4VC4a*eW;5Yp*UtKvrol{e22{}v zwu0Bxm(_URY5D?!_usk%Z^~pbCyvd1j6kp4?cn)2s8beBH0%;=H=-XOPxI)3c)Y%A z@!&`oiF*i8-1l7uh6WeJ4~q|}-{$sgo@%dJC}Vx^AChD9mmdyHsCXt)k7}w{nsa=n zSL2|J1FpK^`Cx}f5sfVXjR|)68KTsm9UkQEL*C9h188s!Km&FF4M-EY|9}D+0Jmm$ z{PTkV3fKl>mt64sXnd!+1 zCg^jwrh}ir0QOiH+N{)cXqt$~c>&gTKGG#;K7iPBiU9vIG$W(RTBp(x)7K_h6LK;55hG~RMill!MjuNED|FHqCh znvjX}jHy6JC{3rlU-_D6WYp`F6DfwAQAUNQ7`mb)9frXkD~%j#MVyoULEEa7x^h*1 zSvp>bF-OZ#Bu@JE-Q#a=8FUa=K5*GIXUwtzlSv6D`~j>T^R{K$rV7)!yT@ zvpzA>R}3_dWJ#BSKNI10i^=E<$7mUYAzV_fPo=1pBv*T3aP3#CJqWK`fPedcjTk)< z*k^&r3Sa80DVG_BcK%d?{#Y03WArV&OE87|FyOiN6FN^s*;osTWeLS7JSx}2yQp7Q zU4i^+e(|~>3?jPOpSVnn1jnKLeG^DzLTu9}?KJNH4qz%;d0yF@=}zV2smI(d z|Dub^?IDP5dh2I`GtWvm+g5`()zt7!>ra)=Czqpxql)NrrZHj1@xCGyRS(q4naOdPiH{n_O zRrH*>t$wB5;QUs%BXUARBlN{3V3HM;(KyyThTtO$eRUHrC5AVa{Cs(LqNS1o_QIN` zak=XPCgeCtRS+50;lV2q+`6ypbu|qy3+FY=`JDKzJ1*-CgSchX7I3}h0^Z+e1!@v5 z;4=z=l;r$ve1twz_M0N;@m4g9k&MU&@M z_E?#JXrcFw6RtjDr~+#dstcdku`DQnPcFHc#`Kv9c0xgJ7q<3pcHOPn|Lllq>s13w ziQWDLQQ>*D!m9~iCq?r7kEJrxgop7`cxQMX>tn=96d$+Tpvp5*xctJQ)ffk>zaq-4QPP&%T3(_u2 z+JhL7P6^p1NRmS%P-Zop_(iZFM_GWB=q;@pY6;Rd~QT9vmM_^ z8K}lvY9`VFqjTWBOniX0n~-kb-_CVr(wV&e=BMuI;1!LtGVMBDl&Kp_U}`!O?`Noj zz19E@ZpH)s8D)c@aUjzZt&+WuYbqOR>k`(~OeHy`^C^x_9k|7~#HVowuCla{oCtFJ z!5B8jx?hPukL$(-jiO%FT=X)$_I)#8A=X8Wr_HNx9Xj_(uPyU*rJv-Dmj(cp2pKo| z#jpo%20Rx7nLz{!}SlGu)_y+B-wT^FU zv&{jMU9yP*CtSsLwGE~ zGwtES=aczS0ArwL710BrHex%4%)-~oaCpu=mIReWHRlim|3HdT04aW9wE#lwMG)@; zX)U-BF#H1mmBh|N0RZVBQ>Gqsz7K#YqUP?B)WE~n{`>H?|KEB*Imgy|0(}0ZHhgiE z5|MNN4zvdWf!Q9R=~nQ_#P(^UVTnoi4=)X&jPm+hS7tNSXn4B%D3?wC2;TnFKL?3> zMa0bcSQ=#B%>iFU)Nv-|IBl0ugnImV?u!ZCzU~vY5O)zp9Isq9$%7bTTWn&cH&5d% zs7vAK6F%I*zflZ<@@ddP`~&W4{=>oaUw$L_{0C5MD%RP)_lGO=X&?FlI!fTa5u=*` zGC||pZC6(!j+9sYHn)j1^|%*UL6^&PMg894eQf!DvjL|ah-`PF5hep4hStP= zyQ~uCUO)TxH1PfjSJxK&sT|@aA-Fvi(MD&hH&FTZ#Sty5k!9o$w#?U3HbP9djmR2# z$C;SR#6Bb9hume((eew~k5Rw0g*>VAo(bBX$)yNR;tQ0eNGFuff_GyRBjQ*Wn)Lo_ zzA@r9D5V?^+Iev z-($q%fj_kgd~HCGNLH*OMx(zkrw*t3B}Fe(#b19G$@cWweW^~N|BJTwj)wDnzeY!p zNums*Mhy~)8qvEHEg~ZkL>DB2=)qu=5S%9q&m!q$Nw$aE| zt@j15H~CdlOJbE=XS1R$1;j5v4XJ>)z`{|PgeZ)Vh>S^mOLzORgY5H4wM)!$m(ICe zzQx^Xz)?Z z6~Zvka1qHp<=DVDGT=|5_nCxbB=QAjQPB{O!ke4f3u`&8Yx z{yR0&59!OIJ-YhO{Gk6#x%kI)0_;izcKoFY(}o~!*nszy2h&a>pN-|n2!Tf8jBYBKp4_k18Clm!fW(vhjPy%gjJJr_OQ2Yw%kuV*jrFKQ5!6S56bw zfI!BYO0dh_kzcTHkogIj^2`_rFx~CnUWi3&ie`n8=u@i|D{nSP-z^A^4o+9|V>`Kq zfTFpmf8nnULmcGXN+unj=~PjB;r zi@E+a$BPGa{uxrf^Ud2K4L3#_s1Q9GVqZ;>|iUbef<#ac%<)R%& zvfx&HRp_Rp9BT89M8|0+ZSHZrBDW57dxss2JW^_qCaM7rDe}jjACn3p-Y5A6O>W*^UbhGswhVbij!CDyd+OpR06 zI16q7TsH_YfH>3NKHUYsUAC|!_0I{9DZapU4?LN8p|u@vSZNoud7HAGt+?HLl@)k1 zzD9yvC%!hH?BKHrMLvwVG`rfIHQhZ`?Hmgw2eW_E2EhPSLnHER{3i?!Pqh~k59 zbWFNg#*5_=tsT3wmTaffmzRqBvuMfBcIerjH+=<0{p=~^z2@jmvp|Up7!TU!JKmwnVNlAU zDQNAuh3eCNYpQB2wTl9Ef-3vyKWZ#<$`d1`DjpgHyvMZD2>aa)c#h(xaA#%}{Sg9^ z4pDwSz!?VONj8~|HXZRD7)cg-&=|caHQHbjI?3;v_?lxOrY_ig{X~-p$IFBv6&BhD z#aQ5}h7~ei3@x8theU^%O|~o#G?J%4j-Nyl4@(Klc;>kswrO;wMEHzcuW5wXlF zXL`6xoUA+b&=)O;ipMXq<^!qYiM!*$eh z5c-Gde}(5U?Qm}@;T77Z1kl+-WlC0l(k;VN(of43s7iCJ`h5}xX`5)%;=N(-8d;F8 z0_Y4{<9UZeukqw$oKYX;h_kvD|5E|ZaGLjis%y6|KxfZ7Zpes}`$!IaM!50~d*kh} zy*6;p4>O;ai@O47mlx0EIEbIHidVV_QaJ4nV`ubdD!uVHZvhE3Bhnk+4j1A(aU;S?qdb9}zd4J{AtK9*`6aF<)$Y8Sejs0@!=yL1=r9OcQZ`htZ z&$wr%@N}XO6kw~jv}s11P3azKd^-n~B>RFNSg4HIkBz8lFZlA8@A0n&k5BxOhzaLz zvL~ExJE!-Sp8f{{@uxwI+$DU;a=1cDIQ?vG#UGb$^v!MQ8;|~ljd4-sn>TY@yry*uIaeO=ay!!e)|kJLU5a#Rf$5s` zm7s_5*G8OwpK(rH9XFsqE*|ilOKvNAJEu@jh$>pUq8=~B&VEwugh^q;>QbOg>}Z>U zB!Z_Z8*QC~!L*e_^fZkxTHgNexb(%F$~K*wH_wVNy7bf%cNC?cD_C`HyxxLytSIR! zA@oEG6#iwx&P6}!B41_4s84b<470uM?1wRp`uB5RKt5m02rqU>=NnP~Z0kS~Ns+); zmcRCt@&f$f(kg(ZCLl2B4IvJrV8ZFY)iT^oa*(wwcMH#D{{ZFenvVC=`g03vbRtgF z!FyKXMU_}g#|1|7#YC2blQq26)r8q#y1ra!u1}CaT6c_X(>9kGcnVRjB!Ba3=-xSS z$jOdGj55Xb1m3&F6TN_+0%cdmqF5AB1W&eK#9;RgUKTou(cSr07EMHcx%e05j{4g0 zGwY13;={n&VVo*49&HtPrp+{Zb8TuD<7&;J$B}{1LH9Lx^MsR|NR6}Ew_X9?){o1M z6H|YeH=StB4AscLEjyr)>jdcu`yT)6)<65nbTpqsv?ILr4R8g*fs0c6jcLooRIf=6 zZxs*2Urbw#B?D;Z%ZPV~uOsH87EiQ=9(z&E5c>-{g=$Z-$zyxiz*yQ@rlVB6)22ZeP0@8O-imuo&=E<)RX}&JHt@g|;~OLQ)xc~&4be6>xkc3` zu9k)mr*TB@B0}p!JX1#awlVSVuqtjwySFO2x4YDfyoUnxJNYdkuuLIXhw;Oy!=Um_ z-my4Qu?>Opn2fDZ#N-|2NvY~*{t9CPgG71^r$O)4n&OcyQ7Z=O!o8SJZVJ(FRk^9O zaO{{T3OqP;L2yjV3I})gfQ62Kk2(1Sl4jBDF;d$pDcNv>_kQIrd5K_5wbgf&4-U?> z^Nnah2-@leQFZ4Yxs)vUKP$>qra|fehNM~Liv3g~W^PTMS7B<#RCGn|?(cwYh>yRS zxGML9l;wt-uUO1)5_}8))cC4bdL^~XMu$<=@&v*cBMF*Bb3!nvW1RB-0}04m+nzLO zm!F7Mr1BF8ck0`0OI&;_;Cj;jBywJSJE$Y$0puv0c!3ZPBS!9KoFKx$VD=(koIpze zgRy^q13xb7_>Mz?eWi#8Bb?{zE#4M!Hb};ez0M`WA%Kck=ZQB0A}scV`oK^!-2lAD zzSqXcLX1UI2JO->{5cJp{n_<7*2k@^!Thh7!m%pX5&Z7v1%PA{W3cC<2PD(Fv4na` zNS*6BGXw zxjS;e!~`n6FhVk*5bEX$mqBBR#lj3&ap^{hOt|5JhZD@Q+v&ix5LfB#ix1&2%k00aS_D=##xM3n7Ll!w4`^9ex@VqdYThQ9)c*SU_owYtK9!2;gnbbC@VH3& z^o!!PT+p^nJV^d3sD&)iaEX&}+?D1?g#LiP#+xSqk`fuv5>7}wyBI)G{d+YpiL^KX zErUrcuY9f-^06GO^L6J;gYtH1IzyM0d`qYXP)AurlRSdL;)mo0?lcqg88Z#L)y*FD zeAf8S!N{rsS&%i$Lq7JZs6T*UG7qQ`$FcuFwom=YF!PZOH^L5{@}vm3ab9Ovvr3B>}oM?PfKaPV8`r8c=2H*!~LsT zSQS~txWS1|?tj;R8r*90$0rF39pTPILtLxsxQA!V_SSP}xgpOm!Hv}7!ON8b95!hX z5M>zExOk5UjKp8eorxF!x!rsS3Aj{r@;szYY_VQm!MEO8Bko!X>k>rk{ldGKP5jQB zu7eXp9$4;jc(hc}1;nLpILs_nA!>T8(tFS!Psb>8Z6VRpC6YFY!r_c@=`#kK2#rl!te}Y?S zAmvs4+H)r9M6xs+I+)kjMtN&O8~(i9lRKC`-9*bK$!aK9CQbu92RpVSl?6up*@!B2 z!=fXPYVnkrb#*CY4@!PTUjO|rpvdNVdx9CD1H3PoIdvRWXm(zP{rV8uJ#5J4wWTcz9@3} zY0a}?%t1TVC+1ssLlI-)ka*XGHGm@>oC7l$URFiQ;HFy&7azu(g0_ItBaSrKbMwU$ zb)+y}ECQ*rFpAqRGk$lhR$P|O|DKP*K)l}T{e>eKa!2UzC4g2)BMaPU@2$m1I83TW zbJ5sH^!Zd^nv<-Xi#(3T*LhP6SBoYIhP6r%-1?->|EiEqxF7%XmMj!8rz*6AE%fFv z1ipLd>STK(BCj}>AJq?wfe(#Ha|2(~uRFq~> z8KUgO;JtU{lR4FO29(wm>e(q|{qK0gHfTE9pXM}NMr5})2#!cKQW~(Q(^EM0#u$>Qg#OO$_T~Rb(j*_pdyghe!{Yq}v(c_-W?dPFSB;NM< zz&2g6+YEoWZVkV2gc;P1ye2hOM!#Nul@2Os_@}pB5cOM11Loq`1{k3jn<~a+=bmwS ztQae#GpoRi2L&A<4MYAhOIYxd#xm&Y^uHnR2Wt*_9n&-GoS zvK6{-mX?;xv)u5fBU|}L-N~X?n+m%a8cy5ciqUy=Ko#`|#Bc5_ufz;%T$+61vw-ux z0@>%Dy0@?zt*DQ`SUy1gyDevGX1YB(&y_>xG7nYo%I#Gpb%}XdtYUV{KwyJXF(GX6 z^q%qX*O7c-vFCM3wl$#-!)KHSb2i*uQ6G!SAzMDfga1xKKt4Zt2#77u47{!0&|ZP( ziO$I0UI=ew_scL(LcF?d^AYMEJj87##85G_|-pjF=oHrH8$C>w!T-8u~ z&q~afBK%RZlv#IbFvC=H;}sfT|v};%T39?vKbb{ zB|D^i&F)G=;|~o`xL1Gv?)&k(sB2&(-%B~U0a;dPdf=)*C{`Kj%&hUY2E%3bKL3F{ z`t|D>sPJ!2(RryC8dYR`T#gm^#iX|YL(j9$APt6urMN*hZ%pD|=-ex3Tf1aCily_4 zw|Lx?KVM`dJER149XC7jC4mL|*$|^%{_~H#jd5ZKv3>cPcFxzEwLfpgeOR*2>1^iM zCx;&(2_je(8swvq{cQ%jp}*q>7bTDr;tz&P(fE*a(yy)k-CTzoDgbpRv?vzC%}4~I zC@KZCbcO%b(KjdB>|MeOLETKpmV-1H*>f~8sUO`t zRhNr@w*A7cf-z#r;4Zw|tx73efKQg^Tw|LG_#*2GApil0CNpO}5AYUQ($nyuMli_v zWtojG*>Z}T!8aCh4((jbgwT}jhK)#nvoLaJ*(Yvv-gl0Uv zJq9m?PC97d9nBYcU9?&nN+lE)Dy6w(!*O#d%_diXq1b56sA75UpxD# z<@h31)<%K2`hDU25Y*FsC%u$#4>lL(F*^)dYF-)nJ!XtXfEHt*nnvm_S&&ZxZ1^%FKR%l3sFJ6j;RZNTG5 zd{KA?6Vh1)<4;p zt4lv!&O;8B9%)^#_dU?S1J zabYBJ12524#A$E5zdwmr&a>xFjBK`Z!?m$O$@HHtK%k@h{P8-z@Qo-y=3I6liHz;( zcsC)>KL>(Y_8x3uQxm^=~=yz3Atf@&peo*;=WO>CMMZB#}4pD#0V@WMzSh z$QJDrS37Dhw+FNRJG$?ovhD88*dP8eKaZpP9J6QPTvTnB=se05i;r98FBVg!R6m z*)cF8w=mH+0kk1RFJE8RHzc8PE4%M@m+pDuzb>s_%3RdQWZJXXc#937LnI>AzzoSJ z8IMsTT`6o%rd@)`GncjmuK7RiaPoUa-UjF`+l&a8**->dZtZt5-TB4yCL!<1TOs|l zFmqMqOv6gzIf6Dug$5ziK5ov3;#A%?uVnt!wj%uF7GI)Q@m=+c$(eFTe(QgJcHuq0 ziN-GK*gmPaFfuu*XBzQJ|OA7RffBC0$o*j4W)EWZiqD}N#Vq$knE(@Jveyc zJuHW5Pi3PRH*JoiO)WA-q}(Vd^bmM=?Pq6+qyx*Rp4;(tN1w@*l-8F`iX#0Ls;iT{ zK|358*AvHyZO=?d2zhcY))KHS2#E_w-Gx`_c%s=qCpPicN^9DWHx_ij35H_< zC7{S`WF#m&jY6{w&v!k4!*FxeYA4azZne|nh#HHdF*oA(JiJbO2DLk!81D*m&pIxV@S6N#@p=~G*b2CI`KEQMdPKz zdp>8yKTWXP>+iL#Z~&8H6go6Wwlo3%fsiksiQ+cICT-hNI-(lbx?C|--@H6t_+5*i zQMs)d#os(kK+Tm1gn@GAyNiH^H@{kbnzEk(ohdJI zsCn12|9tm$@q4^%^e?Q}R&iWA{E1xA7ooQVJcj08%lt*;oxDH8;m(UF{zy}s>`%AV zpZS8$KTwEvfKNNn2xNywDgv&h61YpEyxIo@uRoK^Px9S1kKmC{Y{KRpJ!(+a@YU1c{&64 zn(A0tPxskX<<@y@k(vSi)9e5KPk`!}yzm0(d0e*(;jMG``V;Mg^L6BhwTdmNZ%L$~ z!DkR3n`cUaIo%2W9Xvjw@CG=>r_B`mqIZ zm0>WtfQ6Q`FL8+g#c*o0sa$+RV`BUf9w4a25s#%LR-2J?yD{1v0y_A;%3?-?K)~7Z zCLA;p-RdXWRG`RvUMI4Dl<7)+jmrB3m*yq!9OP$3qucXc$hf@p0zD7<{Fne0Mh519 zp8}C;NCq(jJomAQ2VpHL)UybM#s09&HHJ2k+3ydpy(%$uSCE6GSItHrwt4Jh8_VI5 z<*^ru5~0}ELuXqL?*Ptk1E8(Qy5#-~P($5h8F&55$TswsEXq2-v|KI%*Z4$hafj0W z=c$<}FPG5A*RaaN|mmXWv6uxC-t$Xhkqts1ctK5-_g-op;eeI(cP6 ze{4y!u&|&bX^GP9LENF%4T)H!r7jc&n>@t0@^I6TZ8>jNoo%IqiPri{0n`NcdqYl3 zD3d7m`#~D93fg4-5>pKji-%HS z&mgp$>r|k;4<0@hwm4Ud-G)ML0jbZVOo|j(4lg>oz`01;%oCu1OD<>H(HP(O9 zS%&sM^2o!xUEQaBCpNV*5b|v8Ps2V)OtQv5Er|F$6qAs{NRLZ zhdnCM8d|B2-(sV%&vpgCg~2rtvZk)d##en>NOZ^Oz}k%;#eQ99sd0S&%cSCjqmQaC zhCkfv_IpjT^Uy~+h}GbR8-%%zHXl=Ln|xm<%Y_1(*`);ZT8ABVG@9$;A*cF<^MNY& zCDeGh%F4)gp#WccwWW*U>lPbQ+0Tq-+dPD~Js8u}n-4-X1O!y~8e04cdpNRp6f)9zDE`1SmsRblm7Cuq2xK>n{NU^*RXVnV%q8$F z=spco-10l)n54|&#-1~jB`C;r^|$TTD&Ke>5k_FcI$p*YB;+GPTSTN=;noTYrfoOh zW62o#E+?cdEm(39pezS*AVGRsCCaDa(+@DoVU?9Z3pKT>sbnIw-JSkQs^_562&CA2+&#s3@vt4oL| zSo5KIC!ds&V_J`SP$_<2&zIqG;%|=N85{cG2_7fX05=8EVzDTKIh_YDl`rq{BZDL4 z@&M}P=XB{8 zEnlh)P84AKgHUeGIZbPzMl`m})9G2@mA=b+6r_pfvVFehJvmx*87H%elOuJ0Ye58oguW)0jGTo!ULY+n*5_ZHPG@nl$ z&<(txMUhXEpLpnhV_bv}weu{VO1tZ7#2MOP3IxiXHHQ(9y;sCZ$asd|KZq-E@H+nd zAxTVmdUDPU6`jc>ti>VT$%)v@q=mP0mkyxmF`sq+rr5~GB+MwrnRa+lKOaLa?$m}- z*iz7saxmP2=a729QK1N5$Y8WjnTQm@6vJM=#sofyFWq|McBIZjw)_^Atvo|uiBZ0R znA>ej0j*iwhjr-Ppyw`t`>zo3<3j$!q|k2m$AS;GtA~2x-vyp;5+7aKYZ@3(<|pK0 zKWmsb)HpM(8<1>z?@K3_++l#YocsCC=mcyr4Z3-FeKGywX0WhLT-Mw z{?m_mIcCj~Wl#Q)tNj`e0}-n{T;6%4ehYfxeeG0V8bMC=VHsYboUO&^2lc5ARWFX| zCngGfRW@pI-_Q+E5Hn!WcI%$aNR!Cba)$iER<~j|-9++0NIzVWn);OP<|{~!bLNSD zVq2Btk7tuI*0P=L_Vz`&566!^M)6prt3siV%{jo#iQGHzAjCQQxzbcbG0o6-b|=%% zspbg=1N^{BK0!flz6)+iaXc*W+k`XnF|}vHytk{y>k{E;CK=A<_i_Cj)&R=%$cLe~ zIp*f!Z%CpO-|W(=HJz7Z7!%S2^B~^_$=;fuo`?|+(J2{Wb+1zz^4xQ!Q|(1J(|6QA zjdgduH$puiMz#9^EVK5Y53l^u1Bm5njJvNoOlvv53-NkA7vhd0^!a<46CdH*#%2y- zK$=L$*S&f5S@}h4Rjqy|{lLcq5D3)%nCigp483~5$cU=R`eOp4FNPcqwuVhQB;-pq z#Cb|N5_`3q72VfWx%50v6p#;sR$hG@T&&WZ`Ps+0M+V?qPj##1J{#ott;Ibc=BAMv z2s<{YcE#wU=63ZEcc=LBL$5{kE`QQ`V$!Qf8%XQjbaZGO5xEoLtI_o6t^KQG0cfrlcB1?vXYg9j`A0``YK(AIgn zwHk+?=981!lEOVzLX->GddQoxKI8-321yvlRr$qOhl7P>eC5W{2hJ~5e6p(?0mtjR z`we`AnRs|KQfuHxwk$AG<*mm~inSRJL@HAHdz>5;zZ;_etJmA<*^aNP zDmPF8wJITX0A=qHfKvwQR+M2q;qn5h_Qi?P`W)Tp%kr{u5AUhJ`l&vu0dJT%ljQ~y zyG*fONcTNTkS@Yal$b})AG5Fkys_B`QpNR8SP~S5j-Cf`}Tkxwq%Y^qSCEO|M zIFXtmC~Ju%o2A1my-iAfo{XWd)i@owX4EE(q8$DR-XLF4A=nm0H13Itk)YE7`0m5n z*mqZU{rg-Ia@Q*5H=GZ)g?x+R19Yldo_ zuTW|aVPg(~;@9kT6aPK?bQ#jQ%GOZ;@#XZk*u1*nXxK3iy9^(saLzF{zlOQH!O}m4 z3L$3zF2H^`hjl$tAFzGw?ZDL|hX4z9{+~tLb4J6$=L9S!16r@_T}hZ;zmhdPWjfoW zSbYhmlE}AJypzmto!c&<%B2Ee$Ua_%6apGpO()I(A|B!ez^#%)yo8$%mCSW4lJa93 zHi$8?>UU`llCY$9?i7iBJDr6DZMFaHZ4U=pXq-;a0n|jLytQHB%0q+ZmG?KydM~my zE!cAAkYgX8&4S`5UtHo^A8-h327w^5n{vW1~_ z0tZ!i^YX=v^LDO(uDm<;oj3cqk}})twy8gJu4>tvTy{96wjoJ2_pT4*{DdD75P~jj=^JZt~1@~-fEaJv4- zP%bo`@5G=*nHO4&;Wtu=;4A$pcOYA*U^2C~>-9{_21fQ7rKMZmCzC+G8{}(O{&^`c zlw;vyRct#Kk8K1xvSf{+^IhoAO>h=sY(^PPQb4pBPX2N~|OCXI5 zCL5J6wz-AHJ5>v{ETX+whI`m8_iSEX4J&5a<}U9*)oFdTZ{Qlp zX7QRaq#O;dB>&+$vq}zf4Tdbz|V z@0XiCNF&_Ah;gnTn^!Jol+M%{G+L*OYtY{g+*oWCZ-#nPxTr%-)4Z>ToJbRP{H*$w z9#APzNhc!L6WrpDw9?|49zDZmf?PEoHwEXZllD2jA*A)UzgMJ-eY1`H-a7p@emGd# zIjos23^dWf(bxh+XaruNeagSs){7;wJlFiDeub%dm!#u>x;j7oJ`mR>Z%W_-(EbW| z=}!d+8Ab^x_dsT-otZsWJbF1}XgYD6AQu=FooXtbEUjoam?5D`%NU*Pa-C2vVnW-7jLt zC8LY37$H(0eo}m#-xKxjyh2ph^_XVat8oz&mgzubuXZN)J}YOB0uCYx0+=Ee0%3jb zinc?KZ|WN@K5v8TA@3bYe4!MUz5~F!mKo(@s5*EyQ8!h4#A8;yrDb@IkHf%=26Amwf_dtWb%y!pyeNVe zo~4}%uh2@@hcPo=o7;X|S)Rh4SAAUrrNzYRXr=D*2nISN{zDebK=r7MS4(d5yZ2yZ ze^$M{rCrv5HGhkXY!{7ctDvu1N{8Pu?PwkdpSuN*AaMjaGuT&pPIwJY_0i0Z^vAGQ z8L*qirE#6T9CFBl(SJl)39pmU)@SnI7np>@PR024YH0uBqD4CEl9gv%)s}VF=G$kD z56;B7B~HHd_Re#0UNP?BoZ+ua*}V|FV|j^+^2w+LGrIqTeU| z7Hqho=AXt*>=dknBovJ4ueW}I;e66P+^-hI>L{AdsDBBj#wWnP;|*NlwlFTj&vndJ zRQ5a~Sg*dMewR0ey*BxiCVeUOc>$=P+<#k3|7|ZlKFv^c$RVmul#9@^o2=8^-7)#S zB=KDh*&(W%$MsW-Z95Rr4~2t72?o63yE^}x!-ywS{d40`O{|uI;iu0J793@D&ua<% zhPY`SM}nKBXka_CkzNrr?HLrcIsC7UZCX{10s>#ir26W8(7(}T(&U7i@6VCCm1XhL zS$OfidPCDu4=SN3ElzA*l^w1tC`eeF0EKorPFd^Y!%WCcZYzF^-Jl-6drqpS0xk0?!Y0NG*V( zl*ET<2NAbzNS%DuxVat%HAip$$3MR%g3BQfR4~l-?<7g%uNUFZoje%ZufL~T9N)Y; z>7}4kJ~ntRD}panNgfX%3K%qE%gvc_+1~Mo$>h9|Qfn7YQ?=${9%rjy2hVPh(w%0$ zl)dfAWblp=ic}z;)&zfhditVpU)n7Vp2Und;mZ+vfzYJ$3R{~fe-x-3Iq|TKN$l_P zo~04TjqQ!Pm0L4WA7Xp&x?MDo(_52k?!U;9VR-tHK3-1DE~MC%>0T>rSg< zo-BUmO#3AZ@wO!El2f`RvFjWTQXnRDC&ZkV@sCO`cL{MO9me0g5{+YG3~dH(od{Q?OTyoYqbLO(rZq2kdu2_CLyFFI=5#om1I0 zYT4S=CG^1NxMV@P6lJNLJN%yaxT$!2GR!kS3xYxb>TO&a52LICHJqYv{D>$NGW^fWvhfNmr z*GKnFQjgyFs@0UmZ}#@1tkcp;ZQ?#o1aAWb;_P}NgH%Uhp6V#K+Zga@CKrderhnt- z;C6wP`;niBBX5oSbN=<2A@L%f?CQnyh*(*Yo~Sian{qI;-)s8A=;r=*hqD81aRn}! zpoN(Y=#7i2n7ylSnvf28O|~Ihl&NBC5zckJhTwqb^*uH4{kx|Ct1!~`oOAdddh_>k z>a|cSb67pZPfyL?VFsy&Pb=x%#LUw>L35KE-WTB(8rCD z%4~4ydS8*vw)8L8zPms0l8e^39N0G&E;^I$3QnW}5?d=q<@DU93Qk%KU-VPOcAMOu z3qtT_PR!T7Jm2SX==R+-|5{LBYGZidH-6W6)lN2Lpw41^Y;Jd=?og8)rcA#sb1X74 zWxjGF=@sFHVVr(NdI!Z0ctZYtW4Mw*6o#>ZzQ`m7Mq~wAxHiKf88A`w#%Y4(xO#z$ zlvmXWeH~3iUE{5y`Sn_I_L{?f0F&i~cHtyuXf&|kIpJCU`-!#!Cb!K-ky^Mg)zR|Q z(CP+{B$-bQyYCW*wDx5mC(H#ZG1qk*gyWdM;9-k|kvDc$I(Nr6#jH@~%vL}D=y~DN zG&L2Y17-U)vcWDq51^aundKnUESq$`jU=@-Cq5r^IQ*r`@@N@J)$n@Qgn3mt1$ubd7C{z2(UikEU6AGIv`bcKiwN3@$3>s4)#?7bVEX4{zg z*CIm&_X}wYS_NL=jW}DGvsM9;$T2QfcL&$nTJxhoCd1F&{)&+cncGD+9@q36Wx=CuA7mwu2=<43<+x zov*9CDOs`g_WFS$%%8?Lx!pN(2} zuu!DX0|sk(FX_g8!&EFO+(=87f(Z)E5l9P!b>GCp+Fvz?MIrCJcazBJ)mW}+2qPR} z=NU|poCH5F>z^}5v+L5iN*m*S%ZkywF;y>?)t{wN>q1jHPGpGc-t;CqB{5o%TJw&O zLs@>(-TF$bS95^_IsjJ3@&nYeFTBQsq5)@DY1=At8hZO*=9ft7u6qfT2~` z+ITe^geMNKQp?z1zSX%;`O81FA?WlAG63UX5dtg^0>8$bgbSs5$h`bS^1L5y@xHBk z(fs%m>w>Q?G_CnW7O57Gz$QE@31JH=i$#R!f~m_1Z#OO$IT5yTUM6^rAS8P>!3`l= zSf}EApswW#OaCF8jNo6?6o-Atz^r$u2sVRC>%9&~F`?3Y7Kq2nFFv#3*rB4+D8@A2 zN3sMc=Phhf>DF0J$avD3K6q-$f*3Z6jkqQa>v~rp>C#%?3>*c6h-67jAuit$GQbc~5O=5B&sifX-#0>^{ z=Z`HU&1q5CI?y$@UJmYT=Je+D?r1RVwWtt_+CRN?(puvmk!Nl(m4;7M_# z=O&a@0QG@vMc#R15`PXunq%)#&{nX0FI<}XAwa~v$5Aig?Qf5w7pGYydf;uBIli8K zR_S*+I5}Rgh`)20EFQd9kQ@){8>(9ND6|!08k(ABd@+S37HRkc1YLXjUmc^sb?4V^nX3s5<}qA2;0;v%a+;+~LkR95T^sRe zq}6udQ+p}AT=}`Kq}FUk*2z8NRm&I4qll1u$n-zJZxu6(_c11pH2IFr; zhIUmYo;J7MN!Lm{*@GvIPCtTzPO}+=u&MkT!sdKpOenP|B_uPaTIbD88QrmE|8B4= zdCz^-RRLu2dF&O*6HKtqmraQ3xIrDSCmyM~K^GZJlH<%cTYd?mQFkQCwgSpnnm{Q_ z=;_cYLim{6{8IgvFaGBDos{cpR1=?@P`=g~R^9=jjir@QdqrHYjDM7iW;ndao>N0? za?ClXBrUc;#7CoTE8GVj44md6%`j9Jk#2vJYTEY8V+zXDZxpP&3KY&PR&b4n7r0tn zP;|t+^1p#FJ71rx#nhkW>>%lGDjA9I;?28h!0&c(HD~Px`DB9<2p5ovBJs>3!dgp> z;FKG#+mW_ADa`kucDOW!KovdsIBXV?VyB;x7T*bnYGYDeV6{1wR}?BZqO@Jz(CxAn4%Erp-?WJJXxD^f zT1!hmss=h-76~mx8Dg%AW0%2c-wFiuYJv2 z@U@t>&nLpalPqq2bIfGoOWW)BTXTL3ykCm?i_YOSPW44S)|6R+-sjo`QieA#>arDaXy$XRk%<#zu^-T3c@B*V|6Ehb0WjgwIxeHt2m%4_Y%J0?}L zD?1;(qfK-5(%)f~@EP{&07eA_ne*e|G0PK34UshQHmAWh#@pUMo}4~HOr2NSO*u9I zfun2c+2}D~vV^faiF#<6}xI4DqZ)sv*a@tq;L9uC>{m*E9Rec_6h|rjd z4L7qxB{(Lx%lhsa)Yq0IHLr-9_P!tk(1gkc#R^7h{Q{zJ?kkAZHkk&IvDH-cl}yi? z_f`tYF{(6y=W-zs2*;%Z`0v#=!gVcHpR;$Oa+esw6yO!`(TQAAU&i_JZ3rRZ$v9C>>8oNz zXur@a_TCw`p`Iix>+kco+!IDPPGRbh|7vsvD{_UJf0*^rqvKk(ve}w1X=YMM!Hr5t z!$aHo$N`~EU9Iz{wctFLIO`-hniH^XGRf|y0~it0K8a+vO1B&QX=xA_<)DVd(`cl2 z{@NzSm(%b`O?_o0oeo{q`_9K7t6qz*Qry7GVgeO0+XpuIJ+IqYRl}-b4{1={bwoJyHC(!t3lj6|1pATxgI%nW1{^me`g*cpQ#~19k zCojzU>Xx`98&q5#xJ*Yo@oe(L0?zwfpt4le=_kbij-Bt?S=v{Msd#FdTwqWN8{4`1 zz_o~!F}h=znfFLj}zHD1Gne}&y$PHd`2(O z-jb8U{{HjdFGVPZ(3NNY$AXHem20P0UcX=eP4Y<&#g|Stwr!9qrr(2nj6*j_;Al%T zO-!@O4vQ&KMvNt)2GkNLmj_s-(loBbBaEU2=1~CV%edTL9Uzn=i%LKb($DwlL<7rA zL#eOQMpDg(iXkltCs$UK03@MndAg_og1CB`qRazEsdEA`2|1KtIAT#cA6VqiNub%Q zH(0s3UFbA-pdXGbX1=fUwlONaxgTok*|j&dJ1|9MGKy5d1*7HDqujw6bJg20TBUzo`cv3X*j;9Jm7^AxF!-4|5V>bWvPj|mLo?3 zM^%je1mY9s(b+qX>jgWsaTWCm5dGFfp=l?78vDKz zg|>z74HfceH@{K^&FHSW#>84>!tAkOrv)yVkW2~{u?EZV;tcfwjF4wEDmDL3UTv<( z%%tn}N_8D-T+2!}KqRpXvd=bk7A^W~ z$l@bt-6jzdNTD=m*J5*aE!#kZXFRHS59ixjlT_+i=6ZGiL1jriwZ(Z7=Zwi(r8E$Y0zB|uCTaIp zr1VnZ1vV>}TPlK(MJqtn@JQwqrWjx4VV3cp0vq$d8DK%m{ea5^Xmg4|n4h!Mc9@9T zC!^#ZlMtXZYVMlS_&_`7UbWkya!muPa#@X6Go5$*-c4%Qw2fkHJBW4vN_57^l9-8- z@$>ps70JfGSiH8KkUvuHFjC8z(n;`fP}8Ql+#rt%29LhozAN35RoItgX|uMk1_U7P zktZ6h#Q^3hmN)2jBEbJgqG)@inM^wYem|mEbF?WqP^kZ<;Q23`~wg zrD6w|{-%V~FK35)+)GX!?-^qVr(x(dD2sf-csbTb7` znNyZT^|ezv>?JiTdB172^{O10BuMa!x3?1L;)oU;}GdAqBLOCFCW>=PjwXoKv{ zRE&<*NPCKOf?du`bGB%Dr4?&h=Iyfhn^qbE?{p>7+@oz)oA+SMgy09``9&L2sf5DJ zL~|Jl35fd)N00*D9SWCMh(FGlO3t$8rRurbD$6F0)n1-x z+Ry8KL@5x;S;I|dx3iWK8b=xJE*#%QUBnlnm(G|&k!GEXNZOXf4K*14o zfghAwTBN}M^8IZtL_46nCz2paHO-PTkA^mGrqQXsURD0x<~j#CO+^}J5k}NU%cC|0 zg@o91w$hsUIyZ}hDIqx=anY->KF510ARucXHsc)7JaQmr)=Av;za|xLa{QW=P`ADT zVdart&=}#`??XzTrq=0wBdp#ZE6>{$6%tY25^6tDjNz+}2@Yx2J+DbFhiRz#hdKv& zOW)APU4;6azgWFmZ6Ve#+6e3SUo&6DO^38=y;Mv~56(PSZ4oplG_k2Hh_EzSJNzQ* zaY5vz#)q0N#(2S!_mfZ_5|qL+@E;31!S(>?fJ*#tJ1|q_&UV;Zz1MJNbo=nsAcV8Z z)FugdLX@DYl+Te+yn3}G-l5gC?dRObt-|=JH{RO$an-Fip?t&(6mB=j_h=&tdIza^ z(O>hd<$2<{vsnf2LvQe+oNGKsv^82>W^PKa(b7sDoZ|2PV{lSPc%r4nG_r0!bt!u4L zMs4#^#QW*$7M>?&>2zYTzi=!mHr)6N|ry^Ha`SqDMjU|Jc2vZWhclv9hnptm*fJZdskUw_fVIHYgUx5oj~ecgF=bToM>ZrXK|My@ul z*6mIIHT`JT-8q?fXP10 z6p1a&uPUHysZO2ky{kc>RNn)&X%#8EQ7>Iu9B}t6*(cNHNoSm2I~{zfE_0P}m4<#Y zBdVpTjj~A133T^zv_n@YBum2h^3Hr#;cngnj1re3I6E_tik&zrKPti@GGl{Js^Y}? z;lAun8*(Yft(CCfrJ8F6Uw^jL`nZas3s5#Z&jW0RF?Nyx&7fh1KjVd zv|L|J$SvkAS8qKL!aK7zV~qLjZ8ueXu7G3??}VV!+U8@#xowucOzGjyF#| zUfqADl?`uVmTWt)Oa{i5olSwJB}RQ+OIfWUX&lW(p(&6{>WU9 zL60bC!N-sttnCDEj9m~GmASHK9@_}wmD7gC7HhLV%>72(%(F^zbOgbM0!1N)6wrl3 zT(Euf)48QLoJLcK$4yDoXfr#w&Ef!EF=_q2!lFAo3@;luST?n;HO7+UYY&XXOZM*g z8sD+)J(LV!i$wF3V3bS{KDX;w1rRZSsZF>AYUSp}4u+xl2Xy1oQiu^ zY!WksEM{+2GwV|jZkp=E@%NhMxcBuR`iXn2iNwkof|Z%v9D!RJ0&WRFi2uGN4c}-$ z&H!AC(x?|s@nZBrW3H9#?;3VrL-o%rZ$_446=l^3*f%%v5`e$4MD6^y>qTI+*Tj+X z9Y^4fO7qgm8oO^{Fkp2h zLiC~KzGmZ$dahqy_x62}PxZ3HQ?HWyx?jH30{M$l7<~$wnIF#0z2U9F_BUmWm0fTh z71+g1+uhWgm-)xN^7psO5y3e+H`=;Hqf7q*DOv!p11|W+aZeyxPGDvWsN5+1=SxQx zM4uS))Q8|~8<0IplH89@USR+fNu4wjFnI9t=IN6=$2koR8VHi&&pEE* z(Dh^8Rt`BoJ($Dt-%w9B=^=N1XE4S7Fax}TekVMs(~Xq+@Qjm=|Jc?A8EGdz>Lcdw=8t-E}C(o9LL%w9UbvDS0+J>=$7X&{^6e0GvskvK5v0_d3DsJ znvuQRCu)hKZ#Gqq+wluV7E>Za(!Xn@yw1@zweg~eQ4*?%-d9?9la2Q9%%P?f8`GFl7xfoKxWvsjY5jyzmTRc)hBPatyx zl)RHTg@4a`1H^H&!3cCwBOOCNZA$)-E1J4A^ z8bQ+sbIFLsCf-SRdz|#dQq|ztKm(+`&U2*kKQHhnA-K)KK5)n)6CIK^97 z6AWIGD1p0<4FxIdL#&tDll-siqqb!$cq3xIkp?Q_hmzov0j|f8YsDLqX*m{5#(?Rl z7oQw0*_5+&_(dk@!C?F6;u_DoO;V``YfyRsz2<78UZw^7beI>KH8W>Fy-hW-)T=ti zQC7)K0&SwcosCzvIt^LgK%Y%ijrj=8b`-Mr;nq+{ONToVZ*pUSQ5Ry-Ax%xxc8FKu z@}jatbEG(d%wOEC0zr>THrOmjOX_QHeMlyTw>f3f^ zjlKbSKo_#o>$c$>l`VBqs*|rje)8~P>!ti0Hc82@L$G^65#^DcrC|#CQ@fD{uy3Wl zD?NIch>oj*Oq#}6eB_F7LH9F#dJUd;q|KuU=6;{@GYybknq~basD&lgd$3R-__Pp8UU_#%4@77WYVvRw<7xvM&IKx zq_y+;=ufop`da*SE&Q~&PdYy+zNrqN)`q7tq>6umCQdd<5N73C?f@=|y4d+t^-xbM zRzO!?iherrfe>r<{409qj|AU5OxFw89$fX>Aw>vS_)B`s){dn5ZARhYVu=Cq*LJ?_^5)9`;yq-yDWNDzD?G( z4K4;D1*9?)dDk-945YJ_EvKtLcrA=T#9xLz7Z`5#P`MUUqTr|&ZpVe|$QN`eT|X7- zasGva2>@yHzBYTt(cjLOqi)3dQu7C&8QgyK@+)^74_z&QXC$bTC9zc7eW@U~_8o{+ z=RYt7^rwJ{BZchIMJIwO*B#fo_dz5ZYY}5G=)t)*K(-oBvSISjgnsg~$A_EtYrGou zFZB}wV!na@!XT&r+~fadhxCmS2usvgZMZp9lvJH!^nrFux6w*PVf6H=SNXIEEuV7M zlkL=Z-sVV?XYcUh+OkUhSK1JvGg$m_8Fk|3qWK}upGtgc6^nfgZ;V|Q`}1mteY+(n zkM)7$P{S&+VxCX_o-jgQFA%&T*A(eJOkb_|^of9`7yni(z~^uenX7}bdQ-}1b2Ywy zsq0&jnjho-GXQn=R9F3s*mncBIsD)HF&>^SQ>6ne?NpT?hn=2IRmND}tEA9p+{VP1 zAqN1yQK?_^_|62}yMPc2*>3U4v?U(PIwA0l_42{fbohwo~H`Y9T-Imy`qHm-QY)2*l zDPFn}fAzrE71)$H0puil2&coa$z>urO^~A7rH@*t9$&vpd&DBB$|Xqo>Kj>Wz4D4u0DH3?Fvc1}52yyr zI$)Sb0Gy*mO zpPh-{q8*O`OCbH`sUVWsmRv8sfrSyiDy=7d#*?unSqj7i*=@UAcrzv8n6cH!7G})d zOQq_Dxaqy6$KmQYTo%MiHIkt7UIM0wd>;`Vf-V@cA1(pN3lQNzXCZu))_Js0zOc!>i>`9adXC z2b-b~A0Xuyc=Vemu=IP#*(FVvw2aU$iP-XOW>x3H1&<#&Sh8V$R*dlkUo5*~ zMIq)GPDKbIMpbQe+|!MhFKK0nC-z!JIBx0>T!23W-+cJqF}vuMEHYlVaSHHV1@2fk zvrK@Wm(|Z2)^t?+<1(AL=3nL~JOE6xGM#jKA5XY9?USr%9l+O_CaAIiodBm)x-%q* zm-oC_y#UmdsyC^k;;AG)smDFpgFWzkL}v!zW%RIx_D|XwPO%C7K-(8Zk?&mhtYY2^ zNw#gkzY&3~7J~YN1RX!69vCBU+^BF><4iJBJo_G4fxdb7juauvMWQ(--hbt}x7c9X zmcS!!_#npv#(mRKJ>^BHS>)pET9#Ayu`}_1o!FNdAla1B6{x!Ve~rv7Y22TNR~S^459LLR|4qP8L!6? z?Wv)s)-@S}OMP^iIa{kP%w7_lOzCn}I2TitfBXs#{Nd>^*MK*H?st|NBUw`zwu~9V zAVpM%miOjb&bT;FvkCqih4{Z$-v4tY{=fV`&KjgjwOvbfU8S_pk&Zam-ZjvbV2&dk zSSGrP=K~pcAE)71I7I ztTIB+ObKYmzPI379Ju|K;lEf~=LC?eYWcm#ZrK5z`;Ki;*&oZh^Gm5Y`Q`(T0j^xW z1(Cn{{ezypdo&uVm`zdvvvUn?$m$IAc{%-_Pi1)dnDC7~uXujSgS$S4y2U+`9{1Q7 z<-yWO#9{rqrt2g78M@{2+=5J^0p9Mhtt4IQ1PT!cNoJztZqKk7Fd}dW$XAfB;%vJ$ zTNjAr^(rOMEf0NPLpAZ---6nq+}fJ^r~02bMaGYAEe~$L$fy_kR%*0NU&Jyx@wrg> z$@QM9KbiFb;r#`CeKNS(vOEV-TzEUJ@hgBw;U^~E+8L<)4`XFE1?IZH2y)?4gTipw z!-H5bWJbmVLegpjd1Qwb8N1N(F&Yo*u<}TIQRAU@D$PPv3>*?aBpIHL_-U7o4{4D5 zTm?w1#BbhXa7r*M-Qxhm-jMmh=2*n+i);FX6>ISmrB8GC#ERYb_C32fJHT@#mZN}P z;ed&G>U^YpZz6v_KN`4L)~D8b%@lWfH&1=r7&iS*j%vwl}-|5&rSglcYII2_X0OqUZn^T zChu^hfj-$#DYy6XWKW$IY-g-`5oDZ_9Xrc)X~X^x=;GsR?8toVb|xyI1M;Rm701&% zb>f55{kLz$*@#zH8T^C&LlnT@MU2{3s`+z$d{9|twe@vLYEGSkX1U;0k*B$&1dW37 zvAVZky$Bn@F>tV%X5<^Q^cUp#5@ag+Nu~QjI9EWbz!)k5?KJ~6*;rDxL}E({IGV9@ z@1p)}s;CQw-tByC1Y$t?vDLiDy3=Y~>e;?5TQPHStEc6Am@?1x(`2!+;&X?~^R^E1 zZa>_XjBFyEzq(=YJh^VuWYAOJatqSLH(w&TZryV zy7BpK<0FKw?=h?4A8Uh9Rh^C&T17zDod4G{hwDZIh(%B=#cUW)oj)|wxTebSHML~GLftzF(zq*^hAFVrI8VmVAT+@ z3Z@<^18hNlrH|u1Y!Z8MOb=V;x1a|0Y@!{`0?8}7zbfe=`N)Qp?Lrhmr;+%j(Bezi z0=F>wGX56|@jcV;SUYewGrd=)UjF8Rk~Y?Q}p@~-P}u-rIc-3|I4 zwR01={uOf9S5E!Ii!v%JN)#BI3*9lEaWM_3 zkAHDfUgrCZ@w2}nZ8k|2V1rP6L-`L#Aq!}`t$dQl9D$KjK|o_7TN{uKo^*n5yjysH z(s>eS&6FUGZgKyr6@!3g&PEli!vMpB4UuC5c5+e}Y90ej>0j$%=@9LZ^ZO|9?O#8> zxG`X>FlH;RC3gyVVx7v7OJ#-a5NY?QMTcDYW1l~%nGg@m^5lCR5OqX>X_ zIz$xE8LpQ9pS`rnX;`&DNMU{46DO~OcUED%HK-JbXN?k!*>T+z=;x2L!-Ym=Y+uj7 z=_hlVBL%m)8D!q=;7p#@x9>~S?K+-;+u={9po|D$-imTS(dRx8c+lHC7U3nAawWJ* zLNV_<@mtEJ`E`rAkNaJ_Xcs|w6{UdHP+hVkR08`rGZ6H>r=PL1$!jy7P-Uv6s%q)hx$p-wqf*V zmcSKa`F=$=?5_en`FiGD-_=A6I(JK?=oI7aiZc**#0BdRM8i6`F$>tx76#w}p8>;p z#aFJYBOxnmC&7p3lE>4>dnSeOXEcgzuPe&@xTSF2w9ScDeSm(L7bO;bL1SmwCD~h@;jgGH*eQxPzw5KauOirTW?-t1i z9x5to2f$7<{B34e{BW+wVn6E+RMNA^T-{y5L?Z?fH!b%1MAC16G$ieu$pd2;mzIf1)62Bs@8%OWK^{V}n_wiFew(;5To?pmQgw z{su#gH)34=1NEh8VFw8j#DToIYZ3iOrlQwlcy?dgQ-Lv%!f2?qW;j2589k`A<8(7c*@?i0GCF8zd+2EDc(P9%Ds3vYu*eonJ%$Om`XQHsbre^LXb zF5FNM^tKqlleVD5tXI>`0UL$w0j-R7atyVjUNkI?V{fm82*;JwX$|lJy`Xrnv{ka@ z3Q+c0zqx*bsYW=@=uE$-IU?q`piyXVdybB`V;g^Z!LOWXBs)1m@ zu0!~VZZ1oR%`gDe3M9{DNzjHCWd1V` zkq%cU+5qI?tf)^VNYk$gRi?Lk@5){B;{u;dPywt7b-m3(+<0!-H$BhUN7o#Ak@0nk zhx{swBBkIaxudXp&V1?_5{sNb+fClcZ#eUq%y>0E;d}pQeD7`L!xnYY@aG(#LG>Vb zAs!wrpmqH_G_YZN_@@Z7(PJdXIwl%z=INgp{mG>R8uzK_0VP3bG2q}ZB0;-C2(wwz z>yVQgzZh~gt4LkYPCg=}{9f58)mR_G2@}dCT}M@!Y)-oCmUZ)#W3B zIWHUfgAz!r6u#j^ABE9l;{pSx`_%p3?ZAjU5JP+jqX7P5Nv{(tIe9TeZdMVse0y^l zbz}|*;G1xC6fFTMTaVLMK$s$LJEYo%m99on)t1aH2F6Lsd~(Kv4)6AArs4(vTqMSv z@9fTV;n0R&FbCRGPPOb20DD;0MqG|h5!4i=2QeRzRxTQGeUw;PA>u))nhknimW9@t zz1i>|klM`o zW<_INzz5A=>(7^cNWFhBkhuj4S|Hj;LN2pNWHkLs_vfoi7mu8rbD~DYMrlI3qCuXg zF*qj>jvMushDkYQ-|+P-Kh7^JgI_n__B`0q4+Lzz^8Hs1-voGqI|r`W;m@nSzD!bQ zd3ajMldY>-w78N93d|cWb~91D6e;dsc^?KzXA%Pr1vUF=0a?^^cjs9AnwJtS*g+~O z7mRaGd6ZTD{9^n@X_}YH@6P88v*FR>KSa^I8uU!r!bI1j1am2?tu=vzqfqYhI8N^5 z{c=@iaOZbPGXj)>{KtSP=s%!qM_3>KcE-LSpZ<}ztU6w`|pSvm=%3` zA;ut(q0Ce|(A0Q?0HfbUZgplO9}CrjI0SXUPBp7tuZaf!0exrA20X97VA9tln%se@ z@Q%twb%)yWB9jE%S5s4?3I4JD^$hRc;Y!890Y-i{sNa%{6RX@HfPD_AzIb*|Lb15O zIF9G4?|Tygxw-e_)kB>*-i2S|BGH}m~>qfLzOG67r`kgC3dsc6K>b=?;Z`Q<* zOdT>0KxmEi7C~R;8$~1|`Xl4a96!U)QH>6sZI<4LEB3o;n_fFKvZX+SruIfCJ_@!g z`~4r#CIkpR%fdj`*pUJuA_(Hr2@84==QGNM`lY!Ayk7$h0dE_M0f(q#>~YT;J)v~u zYijW^Me)=wXm5W#m;3DMJD+S4yEDD(0d2}Z#=ehRmE>)Xluq<8JZmMTO6z7{Lz7kB z0Z&{X{_IuqZZW}{0#n*^KldbHpkyf@e%h0`LiuOc_i;-)rnYq7N4{buBp;65 zR(E}@c5IQyK3H6_DtL0Ke+G2wWPor0v0nIvu5KiLligZkmDLfL7ZrmWp+iv!z& zc=dR8edu09nT%|{Vz#f(i*dd@pPGrIw^gxQY@WP!q*UE^-3T0RTBB5>^piO4HkD{i zUOq@14Lg9S1&wDc|8PfsT{9gClrGCJB>dWDzP_&bu$~B;N9~CLve2<_VSz9y-8P~m z&;?@Po=wvIBx8%*6dEBZGFoFmhqUVmw5y_xCtc*|p#ml+kG&>&9}bQ3b&lUF?X|g( z^u8Ga1qN(${(VD@wmw#!E|@=;t%|2WJ@wsG;qGnQBvn-+@xPTqemk}Bg{akK4kl~b z62%=&eaU9e>KwgW`WFQL|MbJea;*rZk6)+yQRqnOm|*YYri@mlRu+`HYolA&{xH?) zqPORT=e9q|VOOI`B{f!HV!Mj$ZmP84_0Fq4!XyP5FXoLh5{>+8M@#eC_;a(za6Oxh zw}Zc2rSYmNLTC4qC{+SM2+-Jxi<79CW+Q#1^Knj!rR3YUKR+;K19LT3A3eS9RD^lT z=!CD*GVsHs;uw|s{hql2zW;3R^;6X4gGB)XPmTVkBq9w?8pIzG@L!XTpcJDM<}El{NkwPUrew} z^6n(4-dSo&Vv0(7!il`wB63^Be+*u?$#ghVbKaO>OJwEsE)hw>Rk)B=(f)-1V*iMnr;Uwml1!csbjx4gP+R@L#Wsp@Nv4M|tH3@1GPkJ47J9sF zBumLo^tWI`EYR(*Ye%6L`eYEU4?n0#q(|!Wnt2mAt=jHc+9M10w$v;&YIqr=PQfzWJi^ zeV0&G!mQz><*Vs!t<;&PFED+NdTBy{*=6vxfu*@Q)OqF&-0xk~9N)%A+DPNch3-zS zLqcKj577uD+5Y;>`sK&is?(0`yCu9m?ogSu^GGSX5DW?5KKk{8ACBAC?$#aZfHs%CAcK zN_UU>hM#qMH^kJat>1HspwFbe@8Q`!4FtzrZV+sr#MY*XXHh{7XKKk`q8x;OhpX~c zQ}!Cr?t*A=8(imJqPJHzETdgr-9>bkIDllidP43`?5}Bja6W^JfX0t=*F}EQSAPEN zNK__*SuZ}P(9B}N!sS}DQ`outgs;O&t`0G*9pjT`)Jh38pGh8&RxMsqDp27yATu<0 z1#bg^4)1ucR6O4r1k)UruEC#$uFt!RICS!cSh3?uuL7dK<0mJFfEsng$CVcg=u8ifYi@2W)J?%wTkn4>}L&n)UENZhM!{nPonqas$uhP$-#gc~r4pFp> zy=Gb(A?ZqXr5NXHLJOr^5qY;PQudwznM}V>t%tL&O(w;bCcd>VYeM(E>qwVLmRUUO z!a@mj-H)PY=Jb#IL4WY`z-Z*jT2?p|?{&hi_oJ^( zL1^@w7JGU|O>d?Syfeuoz+Prn{@tzLnqgX}|6BE?XD{1=M2+--YFrOrVee`<`TgzG zWhViUW@`g<62CDC1M^`51k{0^%JrHCeb@RREn?xAv=<*oa$jE?Q9_D!S$jV++%=@( zR#9XMZxYxbIlRdAE#;VO;{9cJwZhwbm+zS5T0?Ga1jTji@el}DdTu#gRdPgPP(R`2 zXu>B@`mKjoh=`Ky&#fv!^{fBVF1JkHMgdSK&0z&i3n-$VDMBb`=CjHnH%Uik*bX6p zs`|u*xBD;Y;uek91X9NdUm%9Luk>C{dEs2sIS|*@;*6i0miR^RJW9t=#17x50aSz+Y3MS5 z;+98eUEadFOZ~?F$oYJM8!la+iXC-(W@+5~+F5Q%ZkQ4nIka`yMsN5vi*^2qcq||q zk%m16(d;RJ0hZQbZw2Tb*#oH@X*Z5Zn7&mzIaXh~KvvCvK)))amXzItdl?nGQMZeN zyDAbg8w6)*8COP~4W-vX-EhW4go}^1|MWQc>DD^gFfRF$!gHFvw(JM;$Uz^-xzsK! z5m0ve_itT|D zCteWNBpv8Fn#}gkB~dz-mX{yr4!pqY>6higJIFe+kjKJ~A;j)N7U=+d*wbI^bVYNmTzeXQuUHUQ(Sh{^4h&4WJ zuMHVx+@aa)F~umm14riFPdmj9EaUpQx>%IiKFiEdd2FDcj1%XFM>sR8b4MFv!-KeD z6p`-*E;m4+6A@+zu)-GE7?&AiG1r{pd;Bg6TsL>5QNZA$^wrF7+l(vCjnopD_~8+9 zb->S^rSX~gojlGVR+-r4I+-&CijCVZ$3#Vl4GR+dV5Ly)wGmS^B&wBwujv)?tfPUW zrV>p(%Btpk%&+i-)ma}nE&~^H+>I4nj>3?;{c}Rw=A%iYaY)t6AA$1i;E!16t&ZD@ zVM!NpHSKTf_j+xyr~z^ys{*$QT=}qLgsyKxizeqa{adoxkvH(_LwV{JB4E(74NE)j zbP-nAw>E1yJ@42gq|Vf-y#1Qw>!qC{4WsX-)!H*}6`~k}kY481Fo+6v+`lD9{&&`g z0okL$&}%JfYO_4fkpx8-<<`ru{EJz73JAKSGcF|5gjZ}x)X6DLdX`tn! zfx?*$)%sCJG=DE6cWx-V3mxE7r*pvm{ME}FkWbK&-@i}D?j83$iSwNoOG-#P{(I(` zy|j+&bc77ST4Tu%OUKBn1$*|yVUyX;ymHw-P7$0lj@rY_lE4CiYTt}bvlAxUG`!;l zxI0`p>Z+oj-hx`as!I4nZA~PzYI++xcd(EzZClCIY2i_ak6RMv<(N%^nbe{h>aMg& zNDQuO5kB@k&IPW6H<=WGzJDIN6<7RVzan;63NrdD4nU2#vUQ0#F*4GG8#3Nw%Rx-a zKAP8}*7l>RtZuUY@-4|bP77pFRL0Lzqi`v#N=6<${`6JWO9#_G1n7mvIyr9SMLHZ( zLHPKya^2ywMfl{R=md}y`h9paCAo<%qi+XS zwxl?&5Ap9q829Ew7hYE0rjAjlvuJ+-`P9-fpe95IgXS*D#k&XzeNt7zW%JJ2PDPYUO36MGhglJ?3)!af!<^X6gz#5&B?_vlvCe|gx&l4%iq(I(5Y zhM2E8_G=M65Y&{ZP{lXgBa=>I(|aKJK>Fbzpv>cJ_JG~xci{`-^;JKzO{EUhU4Cr0 z_=9`=jIo9ALp_XZM&BfrX9$xyPceXI-$rkd6Re_Q^W|9 zJ%WCgfG8%tlvOVVPJ3%S z4-?b=fhP8|VnK$ORroh>e`ewSyvz6FjG!D_?_Hq*`~j9%`)-bB8yj1lmtY#Gz6(c^ zq2^4iX1R0mQ{0$yklP*SpaE*(c2tK#9Bp2l3@5a#8uINnZEqj*eUnGzq*pqB0LolfSuRGNv%}NaYvE!kCFp!u3WAmjJF= zWy%DdN0}z~p~CN+`9gZ+HU1zrtOqY4R8Z4Py#e8ZLK%&B9-XZ9|3TTHvae|UhPto~ zmk0`BO$MV!i>g9wDP&wBvphJHE(Q{^ZL&ppvo}E9L_&&bHJGkid32k^r?hqqr!9q! zS4dMiJ$=)y-op?uz0;l*4CvsgV6K)25jt?L3<*0qbsDljXxP|V9)i4Eq;KIOB?xMVv{$|dFDFvBz3Z;|)_)`c@J$f^1W3+upP*a_ z8UZp5s{R4t`-WbdMs%VZwnh@s)>I)%Dm0-!Z@#i0{dJ{&hWY3&Ium!J%r{t}#pXaB zdMaomkr2{{raZ_hk2&M);+Z8gp}H^9XR<-0R8GQlpOIJyCIz~-{3{e{f!$WOZl>8o z(6qq5^-LS0U<91ArWU}GJlGCF*ly%59zd^t4;H(jTpL)S_AS&Jt?C*YI{f{#=evNR z=V3NkP|B6;YAewmmJ~S^7n!F*Ha#U47DMg2?tQ_&neoR8%{4}~)0J`jYnNoURF}f( z+@1z~#e(=%gxiwi=UQlNZn>;cZo1GtKEU?g;8hZg#gb!nWL~plnFEz4MZTBjEq1B< z#o6^;qOr8?)^hIWrHPW)iEts+%7X@rmg-!~y|nD=(oGWlYzDHQdEgz0oG&N(ZI}`& zzow+<;P=MV-=`FryGrM=3L ztO|AZr~`f+2`4N2wqZ#|zl|(MM3x){cGz*XmCnrZD!fIMq?}3&+2!In7s&d5$&rlykGg?pz2RC9&GQc^$)W@{YXiA`bO#jp zFN(^1rZfJ5;sy+VAI{j2d9=~|99N%~tABsr{onNRo?SLc59=|z)dG~eYioUcJ ziPMT{xPXvDX~$h!2xooys_mU$kAGY0g7Gij_hhkgZ=1WG*gDc= z{NBe5H%{6xjCzv7P?RY1s9FBwucD1$$&Xk*XVz9B^f3=OyIMjR4=|xE5z3t4m@uV+l`j z47^ZE&G7-Vvpzj;qjH$Mb;I&NK5HZe-r2 zP#^C|;WLZPw}U;d9(H(b$!N_cVsYOZ-1;3Vb_Upr*FGR-kRvql?P!C8krxGpqRG4N zKMj+6Llt@{bs}EHeB;`DG~~bhS9@(gN*6VK*mMn){Xv2$Sg6&0|0oU$H| z5A>I@^HOTaa~@|$FVE_Po@&xaN%Q2bf_rS=P(uM6(B^CRC2hv|4}7|QhVv%;c}b+3 zY!#nE%Pl{|4uvhaUt|-zjG&z-*qcMeG0}Pb2-Y8JRu+f%cUzle;8Pc|pG{%mPGDo!9%fWrZvu?F7@U+A?e+X-wo}HgMG> zd){mxA4wZ4x+L{u^=y*#pFr_gKYdK@w_XRIl@R*rZEalU2TEgR2r!xyGB@7M@M>7L z=x}zWG1k?LG{9kY6LJ#{hH*DT*s%+j5wJKzeoFAXEz ztrcb$n{UY!Df2E?^@te^1QBGM$;V~gWy56p6hahB#4-cz!pSTJ#KdEg{NIs!_;0t6 z*1*mDHsH%9tZ*^nB$Y0ce|71f2j$I^P5-L&=)#dV2P|kzZ4bX#P4cbip)`ixl@X0~ z*t}W_2=3}7Sh?F${2vq2zec40Q$M*S4p%PmxLPIqRNkbGPDTxxZw;MnLFKd(1W|>B zn97cZltu3b@7BDfCH2gNc3?1YmR3T?!xtY*dFpe7aF>QEk2%MT)BB!R|GP^)9{ySi zSE-1zWo(zH?fpP{sVI+Gv^_9US)dxHwphY;7oSv>ISjCjJIb0TTzeU|VWFxuEefGr z@b%c|YUyQfxHmQ!lKwk*IO{2I&yUq}gbdOZ2xk{wj}?vRjFmPP?B}?CnDMM)sEVqM z)rQ$U`4o<`H~A)LzLqR2(p0uSaqxZ~+fVDbDVvPfoy5TjCCNaELAlOElc6S~p09-; zPf@tZ(8&M5DGUC$!fPjhrEaBMKxn!q)r59rPT~T zlwbtLC`W|x>BREUT>vWXQmCYtAB_oHlfKuN@5SL-<192diU$jYP{_wDT&O^y?~3+h zHtII6RSdp{Obt7OK)D&g9+uP#)h6!?#LLKGHkH zb$AN49jl+17q&-7mSTA^imRz=-}Y0-QdPJ$s-k|@Ge#xdI|d^BuINh~ujFD-1&HE3 z^h0Le(ETk|UIJb5M;SKB>lP#?b&i2-CKCcX`e$^~W<^`C>+#s10CvK*i$)z;)v}%A zP&X95#{gR%k5gheaO&FFnxaFYK{x57fN7F8zpbzhf)DewOk$3h(a&%1KWu04W=>Ge z$tEdm;lU11w@9O6M?N_>DL+mZ9WTrxH~F)cuFu7MVh$~q*v`RNU5n3S1iHmcFIGNn zPG*eo5k0Zqe7O0V4BFk>F7w)ZyBYiMFWaB2^~<&sqJ6AH^VD%ufc4s+3nFuMd;i2n zD)!L*7e(IR-nVZu1rWC4VTmxF9hM^T7Qax{g`dg}b6vUVpFew)ru#9=DNb#Ekl>}` z4kTVrQ@$HaCE6L!R(h7r+qtF!VnBmHe=8JWP3j&nNe@L?q>y=D)K3L3s?(eMiEs5^?Y7@0UA{e z@$_r(Q;8)H99mru31+OQquO*;vx6l2*aZ&{W<%Pd)Ye2POG*Em(RM`CcG5-{U1w$Q zY5!%iuync2Tl38%{|xlW>~}w-b<1*4sv_YY@ez$xb-K+5TvZP|F%qXNQ_!{2|K}n@ zuJ|^hEa&0+fi9pAba&=P6eBY3-^>PiT^IzxutUqD5$!N?K91J3feEiWVm`#$_v>O~ z0>f~!6x0!;5B|0MbB8zoG`5q{8ZInZ>~XYqY1~X10m1Z+j1B;{fsz(00DYbOJMxL# zL*xW+!}pv&E-pd}F^MDiPkWpZD-<}qbhWW9g3GirvRtA-20ii>_|5vnNyLudb%W*O)-HKJ4MVu@;*(1qo`#y*@acJ;0OQ>7dkLxx z?nMUA@jxI65b@L&j4VhBzYGhZh#~Kdx+yw24x@(NKAA?R(vI1qo>q_AEVcS)XTp zWEEq*;Fs7E zJxCJl^0s6je=d}C%O)my~j)%@Ha8ma?HZEi{$Q-FG+Vp_($(` zgO9cCPie?H7fY;a8CBoj+pd=a@f>N-A^_^A6rg_6Vdu{%Q5Jzet||Wk_3=*u@)rT@ zr_f-z;5=`A-C?ETn535=is~((V=^^3-HO+w%~3V3%%aA|M^DLNx-M$nduZ^9t&ZI% zo4656o^>BKI*|>G4*dpWxog=PYg30@S?fL?(aDS28r^wdB^~y@TXHDK7kV0w%wV;p%ODJwM9+ znk`GGuh-P32Bces-}~H@q}FagL6oGv3X+~oSpzC{iqj5ctl<+zG7A-oM1xPnjTXNG zRSbZ(4Zu81w66WV{D*Y^x%?9P4RGi=;uF)IH0>!bmO``N2Y!@jMYVK;VDCOq*^JYv z6u{y5UvYN(T*hD1`wDn1wVzcByFPx$301o^BfTpAV;?f=3{g}7gvk%^e#6d(M`0@{E#GMRGyq}Hw8eNZj@pf>q2W0&P>-8rKqI#p)+~_)c*|v3T zYsH`aOK$J}65VZ~1K5C`94~uba8!q25{CSW(Z+@ck^oiEBN)mc8Wq3Rh3Fh1?8!G@ zQGX*s9{q`*O#UekNU{H&3qJXx(T;3T6ciV379R$uO!8wgx~8!h?)-L_nK%FhVrtVN z0GP54HrV9RKcLT9*d>St#!R^exe_6AMAwz)XhuVIZ(cc-MMWs^0I=-iZpjU_FPQ7| zDOysrcVrSDk_idexE_%Qct?4?#Sj|HklOJe-^sS zFHpxd`+T(=6n`XpS^Fz8EUPgbgy-|P4wytC7J-57422G)*6p+ldb@e%YQB6{(--<> zqvKiaenuSVZ`4LKCwi`Z^rXnr9Qp+FjNj#$gWA+}o^ypw{3~b}Js@T?B5h*sJ9JzK;(^jkKz#tcul>_~y}kIH zo=wviR%bn*4JbD(J)eOJ)1NQ7mD!jwp9PCMc z?8$&U$glb~DM#~5#!j~@FHUQ`?#nD0OlkxHqktp31=&sxUw*9PEo0{S!bGkKf134``L| zsw#);O5#5PvgPIfAMV~f9P0mnA062vW6f?VM3!VLgdy2dXc4l82-$bWj3sM!p%6-v zER#L!*thINmJCLAnUQ5Mrt|Fm{d~^%cYS~7oa;J&e9j-|k1o0{<~8Q^dOn}`<9^(a z`>x6Ut-FY3Y}=`e@E*JH)<(@fDa>R22KujgKyd}ZFG{KmS6xn^N%ZnMKb_Pb#M=N< zdt2e`ijiLP*M0sWvHud;|EYie8Cxv)?)IE3 zS+~FKVc4gMHtQV6qIHdS(zkPEsiuF0y9+0%uj;Gg1RgIyL*{7f2v>7?5e6fB)xWRt ztM zF_||nYD-^EQ3{y)^9~EprVzy?aCa(nGTIiBn-??Q`N|@_;0%{ zD>EzE=&P#kaR24kfcO?`Ch0+GD=kp}Jlc-lHGm$%W~RHcJ_H;$qHBH#soKxF&ipNb z6xNarpOU5UgSGyWa&9b7rz58Bk?$1j-fO14Uu}|Y+y$#{tbli!E&17-Y`J`+P&|E= zGIXt1giyx0z*wO{Fm4@SOyuRa8KJ))Uj4yP8%*o%gSI0A1!fTPT|!-fB}sy5&0CDfWH=<=tFZlzq&JSJan@jSfxz0u=t8+zJtHZ_n*S_zaZHskDflOWpuhk)n{hs zBb8USLxPva0(x`u$pVziWTTdRA>+X@%WvyY3G$%w$bo5AkR6kM%L?B-GxC3NX;MWJ zGmftU+Ng`OelIGzV02*Zw@B!g>M&!|lv&`sfU0G{kit0z3>|QAErvt<>!p~@H%6Um zANFiKd*QtA6aVIxEbL7!qC}0)XGqz&9yAG5K$GD0Cc=1e1daDw=B>(%+VaA+B z+u5i8E#m<6J2Vqva4a^po_VsjpSAe1XNG-GP^?v9s-s8Nq0RHR6R@RzB&ee$-M-^!ww(wTMIB{)WSpz@RM zAc#n!{86qZ@TL@7mXU9@&QvflI;Y#0u)tmezeT`K2~dc%2Ms*34{+O4x#d{)B)L{D z?uv}T3Lv&8N^x#f&O9o6QKX9k0y92tLX27k^es=sbDOr!p_@U$>{y0h5{Appk~bbC z1-ep1ic-#QbRjR1fQtcY@w@z*yjhd#!|xf%-8^63utTo09q{tm{o;dWlm%zTLh|1_ zKFkzIbSPLWKYZw$EFpc-D}oaC#tv~4Z~q#HWte>$IGkpkoPIN1Fe+Aa^=ppoxYzg0 zzjXH%q9i`Ddm+wv`)tA00#s17-JATKmlsm2jbuC~Q*?)_1A{>s*o&!V(9afA$?E?qkOv1Jb;$-f3kh?0U>h&eb|i*bxOf12~{p!)-8!!qc@U zkwD}-!ff2>vtPJr44_uSL!fi%#~fWa4LLgXSvhE-6y7DkJiaUWcEuZYZz4PU@yYF*q_Ry3oiXtgUs)1nM zg%`z%L|YgKi*nw@yz+~Dq>uKsv-!jP1IbuGp8{P?J_5`EYUZ}14*FrFRI9rrA$-p3 z`Jq#e^_DM!PToGfzXf~7czRYg|Q@(QeflS!X0z^`QZt{){ z4R4$^%laNr>wE8L;6Jt6CVvzDwy4Wt60-60_IK5MF(wr?V5|%zP!YWIs3S=MVCv9p z4K!JqM^M1u(|TKYEvV+szcBln<*Y|zT6%eC+u{jt#iqiUTZ2Xk8@LK&$3+#$ww~9K6hz0_rr_M#o#Pj&T*W8AFcNRNjvU+XDeYC8wLsB`$>ByT5>2|7Gki?An}E#xx$GiZJu zm;Xq*?vnQor01B|zrrQbWx>2epFLM&n)jsr0;e_}1{L6&pW~R*WN1v;MHKwj?*hi9 z!-R7+?bnJC1An1$6=X|xUORMUy!0`gbN4!0=7B-wOf*%+QfN6e=ezANqA+!M7yVf- zh)%9lY{;PUUV2T^dzMQ=Nzrc~*zL`qCVgR42g~6^hUh1eN&=d&%Im%2YrZAFHcel> zdYPgN{FU=QDGio?c$$uK27WUtN|WveO22#}t_g&DG0V2%rqRZIuv)$faLBX?p+pP5 zvJX*(bI}SkWdgPlyxUvEhhGr8tGyQp{+^(OLSbCzfQ`+B33 z6t0`^U@8Ka^+&TZk^&f^AJ5^nOTeLbW%UoF;z?R_k;~Ph#X7fV`R=1L-H(^5KEb0< znKND+iC;^DRsKH+F<1om8`f@h+P~RF)`-9v<3f`6W6d(Et4lkj|5}30xgsviWQlJ+ zdnGO)_c@Z5q?pk$?FozFajia{$4>44ZbN${_@1gb+uE(b-Q}*nWP_aE(LoBW5;AOg z)Mfil>nU_#X(^gDlF5j{t7_*CcT7yVCus#|x2X0rjaeXE-QM)GXO$Vq|Jx2BS{`o~!p zr31W^w!36&J-EBH4IUL2_)oS?H?5nlsS1s_xz4hFHp6NP)+j0%c4QKd_uKv8oLAF@ zHJ@MC@`nXBjxB^&fc%-aT4Jbb7cKQ}8Y7wz)ox-Fo>LFRJ}c~1e=Cz~7-NogFQ-qj z!1#nnTuo9?o}YJT((S;DY!1CAI&=oQ*7}vruEVWgyIu(2Tx5Q7|D}xvTZo#%c7lHo zTx~>6K%C$PIaZCIt~HBxpZjr?Ii5>u=44c;=ekuZ`7j zoBY}qjCk!87t+BOH0JHbNpv%BbhhB^;L*zW{AAwg7{oWoZp{{9Mgeuf06gTf4Nn@}P}-Xik5(8}(WrCMDi> z82cr6bn3gicksER#4Ol4oB1ZoEU_AsyKl4>ID<4D1Ncff$0LMrbInXA?<{h0@K`@t z{#r2_aFOa_SmpH!ge$)1;W@dKNXVYR?Q9;%aqc5RRAiNSt79oKN@uJrmX`U)oHpB* zV(T=xM!qSogIL#|e@ zAU=JH)mxR659MHNtE%S%GSnxke%yHr>67@CViU5$J*_VrerUXc>g*LTh;5d3rxw8&StfK;lVsY8oEp|J3;VOrYjMMPX%rqOQAql}m; zz3V;Etm+;pcGoEGpL%xgnij*2n)%La;;Vr*xkW-ZCE^`CQ>jGqgmpWS&i*;tsU3mE zJ)PM;}`)u zq|pGcVXp4C&1znmu;oF!FVXdp7OSn1>hp04Y5K8{b!9gknwf~bdkrZ#{-plgvO@Fb zUEj8I^C(%Yd_T`E00ZxxSof_5GHX)>jaTEfThZ}H*!B*d;11MuCWQ<3N%CiW>Uh_W z&|gg2ALtd2W?JD~2sRwu{p0JVk<+VtRZSP@L%RamB60O8qLjl=KWIpJbya9w(B<{y z=3+*%+^(;$txD`~$Ps1xux2g_MyBqVT8d8YVi{JA1G{QHYbLH1HT|g1)ue1-YvJ!L z@(y;>n@BMpmFLx4iiy>6SvEcOdDGo_acFv`L+QtM$8i&<;p?ts>+IsXe4kM5ufqqFay3UX;mReB%S%wln^2JFQV1KKAp;nIS$;x}MUb9qe@Q96S^$ z@^tEDvTNP_gfsnWi5Y{UrleR*}|`i-!d(6Q69Il4rq<`?*qF{w?5#r|73*ALMc>4n=9Q!tIx!%T<+ z>5^0wYS%>0;P}uDcv%#$VIl-LM-hVa7T50#U+&yXwt{bkw!esU)eEENQVH2gFt~qM zXXTCTNf^R=VuM)E?)!kX*s~a-QudGW6VP)&B}kYXY&HfuJkdGIz( zouYgsk~@^PTm>NG)ja4c_(DnvYSpz4sC5AIzPN#Hgcq!0Krod#~!Km4` zhyJqcA*gEH5juEvYuY$v1>LoHeegn+&6i1vW6dJ|t_%zfy)MFGcU7ADHIQR*%*N-g z2x1eUAK`B}jui2lnFh~uSp97Jy;m!AdylIqaF>pS*A~VxFI;0m@Y73H)rO66q##0I zMES{lDXjggheu&qLJ@!5Dx#f-`n1u@+*cfw+2Kh{9!bHM0iH^cnv&ILeVfslafeIL zvoxhh@C$7~>p?5}4)G1%O@q)K;cda~kae5fsTtY!^tV(7v(de{5~TGF5up_^#dYZ4 zKsFh5@D{!*+v7Sj+~}+=?hP2d_UfUkYwbqB-lE^{&hQ4y-l_Urp4eAa9djXh24{&82o>L0m;5gQ59o(kXRelasoQwMn+E;6Gl>TC2W?r2 ztd0at0u8@Ke@khY0S|AO;#Au8y8V?gj)-IDa!{bX&M(s+d9UR$bK?DN{;FN+EVV9` zQj)goQ_4N1f2|m(Ah8;MO^X;`)>=I4#2Fa8uDR4>Los0l^NU>7GSIIpL$$#wuZAvc zvpG&Tf^?>X?;lKYp(D2U);-@Rd9^}t&Eio9U)Z5a=)FxTp%zIHI63PE)1P9U{pOfu_?Fq!GciG-xv2a+m3QZo+bi^J?(rH z{dokT{=v$!BAvO_y=;l;JtWAu6IHFpMrgO9N_}2KnG?QAn7o7!jwLSC5_ShsplxOv|F-}c1Fn36R){VqM2yQW$%3l#UG=~9NwJ@mg$Lyz=31OzP zzPB2PAF77=lnG)|QSi#!*UrH=W9~DEXV*>2U=?zM`EF1eTD$ z5Y=9)*UhPv(0~&q!HX>3eU-0Dc{>;AMv2t9X-HEO%#C5Tn-fK7c> zC!k(P`F#84R(0qGeJv;bspo_KCWEJJw?JKYULC$+o+)BpioFx9U1aIRnItIr<5(Jkm9 zgu^CW5ziws;AdKRV6m6w-580b%9=%H8r2*ZZ<`e_ofRw0PEec=_DD=aO0r@(lx=i{ z{y?71F$EU}Zei?3wYy5Cs6t$R$!;H4s=)&OCFBHoZ_%hHSg2Fxx2?Uh>W`+HUYA~) zJvXJY+flRa>M8HxN)jVi+U|H|rsvnz*ZjP!URSVMh+Wx9`Ws<}(7PlE;+`!aqCX1b!z%~1{f zU&c{(ThMI(ta~sM)~4%vMD2wcXoR07wQ+r_LBq+q%rgIbGdD&bnVyf%2za9CDCE}I{dp*F%|hkB z!xM}wjPF*CdLM4@>3wvO$g>z7l6`(t;C*JbCH1jmB{U-N>BDpUHs{;}6E6lrcHM}N z$P|AdZyPkhAq_6Yld)(J=8cZYVZI|}_-2A8`SMno3-&tSC5k9}YKtgk>y@%INY}sA z(nLR&3US#a1yQ7}I;I;7`Hdplov@K3Ewsrb5#r7L5*=bY9&PStm z!N1}tsIu`>j8jL1*xf*&J1IXFdHRN=_c8a_I_+07KW&QuOI7Wc#wh)fD&pvzqH945 z<-4%%BKhIJ217WO1t}(o|FsG`)Ql2j?>kw{pGo_H!P(V zp5(k!gV80kq+l5k0{x!)$xn3;cG5$XrvK(G3{38AiMLPO_-!%n;(dItm8w>T>Rxvq z)xrEk8UlUnb)5=-FU&VJP-lo%K%1BeIdDeBs?vO^i=|UG&Q~7&a`UeDYkLuh&t3^8 z&g!%rI%Z-zaGlfmtnovMxd-@#=7(KB#rzeg3swBlLt-Zic(b#33@viy{`|E&cDvBhOzP+gOXi}e(D!OsG72(suM@T-L z&`%^7wDJrVx)rW93yrNbesM{@$rrY@DkGh%KG$q@QmsfVC$!C4!6*zonftEaA>4NV^b#~*?ClRIaUC&|K2`d2- z1AfJrAYYabXd#y7h@v4HI^74all>ox8I>oz1{_;g9VP6)&l^FNCg>|WlOz8155yU;e4P3B6#qanoKYudL0~ZmD_bMV?Sg3Tfn0Lp zEyz(mt~*qfdmSn9;vNANjlJ=$>@DwvB89Bjf>B@EGwU;T;EH(@B5kNBIQ?V7V6Io5 ze~pXVgKD=bvuRzik8`NFTd3&l6wO^SwGnO?st8QA4v)RW0%F)pe{&4VhR&QL8$lyMLb*oA^sBKdDQ1&7 zD;Z7`Td%s1jkpAlNy-`nCt~eBs7g{c7H$7PEHOuV9FGxD5%SrC=jD^fT2i294It(& z(ncstBGN6-O+G7eouUf6Wb$j;pBCaVJfMw1K&(*5f`+sh(o;Nb+sroK4=WH6d2cndwBJ!^ zSX(Tqn~O>PewZ3xkOSX%E>$Bn9-~kAS^Mkq^j5-2pW*}?|a}-wOH-K3( z3{AR&cZk|k^xm@VczCwi^#Ogpj8e002b@u&Jc zp8ycGba%3%7M>6ra_XC~s+i`$U4toFvL3r4d0_<{Ox=KIBnu9;fiBRFly-;q@(3t4uQ+8 zmJV?ft&H$~(U-l0eShRNJO>Ajo#kL*eNNZsRmi&xnm8WFtxN7tTl1*?AO8~zxpnNY zFI|%fjks2EE8-sRVWv(DS(xQ!9Skr0m}uN%c?REHj5~wGY7cKs1J}sHuRI67Dlh%y zkHqoEZ4=Fm_=K#y?={3y!PBE#(@(sv#rF{z@=&?q)hSyOK^Ew}lQ+ozMZrnaSiTY7;c^gdEzk zS5DYKW7i3?tMofJp_vC?7)=t$@0yMo-P|fPjwRTg9;s7k0lv*L(%~D^OJe(S;9nNhUkqNr80D;D($8LTmNB0hu-hCqH~Y-^ zw!F?=or=GBrrOWjkap-Q=rj~Q$JNE^`n<7!`mJ5=*+|H|fckk)*)7X~GUqt~yjHT) z^x#{U47FQPeCE!nCgS2_XTf&rz;3`JL1O=b<50)qhav z^KSu>*PJu~9fjbgu4)$fW<56XGqz2Lao{|JEy7TrMoa&SjEd&tr&uloWyyL?z3ZDr zGgCL$Y;DG8DHjh^I3@Dzav(!OA&T<9-L}BW5WcPhddJGBBPA!ixB>Af>V!aArTir| z4Q+>=*>i5XeB6CB(3Kce{x;0a;qYf1Uz&J1+0f*7=vSZR#@{Vu8X~92i>j(Igc+*H ziaRRV(eIqjhg9N&Tw%q*E7usanY_aL$CJ695|r* zb*ZZ2hr)TL5O<1azRUMq6t*7hr;%~b%k~J|ewz|%VO767+fQR#i(dY06q=Z1|$@6pI>3yLFdyE_w;2>Ik+?WpD zPV||1!+Sr4HD+IndO1#jK`NaHNuj_g?{)L#wi{3**afbR=Bg8n$VHzzMboDzw%YQ0 z8pFv&GV0uves|{@5BA%@bKQpB`v;IX2xu*&fL_Y_&Ei1I~=9a{=Zme|dp$@~zr%%%;@eKks3P>JTv= zFW#1;LSWbkjH^$3Ly9hvHN6!pJbkLjx@R^7g5#rjKw>yn@z-c23sp~SxyqZ(G~BP} zXncKIa368ul8{$iisIU66EIfXK}Dk|8bxquR=qN(`%dW@V`3#A`s|F7K0>6K;s+so zws{|wsgL3Q+O0_8+DQqAZ*EeOtve5Q?Cjzbd0TE;s`V@-59z0E>;hFij0eGw4_oOv z;IzC<5dM`|YOa-HK%M`KF_8B0Pt}QYOfm`(T=r`u9Z_R}KQ~^m5$_hgEg$bXchUb{ zqk97dujzPzZfck|f^rm$y1j!hRT0tTW+1H4EHypJgfG?lTaoMU01zSsyo?d|2^y_A z9N)5TPgZX@o9$`(MuB85=$)Ad^T~ryg>$$BIqzTsCp*s!z$-%tyf77RU+wuAD~n9w*{p6W(Y)8@xE{+38F7S0rU zZpFnWP`584?f~_d0N1ylqkBWlW{=icAa+rpCTrvr?A4$y9B`p|atmjh%x)~rVfDCP1|{P>2dMH~3<#wFN2|IOD{B5GjAWk( zl02wDl813eE|G=yZ<0qIPz3$|@y9+?ouoH1P`Bwy{=#_1dfKEfpDW$;?Sd|82K`{C z7$VBHX3~c3?pNaHvVe5*0nhCA_R7M5Qs<*v+192+VM9}u{#n;-~{lhY0c92PnbF~RT=%96bhf zJpJ;pAV$qTPM(IEGQIu_IAhDgV~Atq z+t?P&K6fg38;yDNU|Rb$kpg_bUweewQ3>Y!gt&@Nj3INc&2h%?l39ppA{FVQ*8PpF z75UkbJ-&*Hv>xcez7v|0%t)}kn&&i|xBr0%_Nwu@pZsfeu>6f|0n4Mw$rRK^xYl9G ze*9YC*_;=r<(|K(Q=qJ~(LLHLOKnP)U)yp)YT1?p8FS6b{MC+MI)N?}Wj398fj3v&18^3~YIOzl* z^8?5#f&))CzyEczlX+N^=Q0re5jUmT?XZW29@+wKG z4$xYS_Z^pSEpQ?{FDzvEXzZRBGP z-lzp#tO9Q#v0Pqz{;WT5D^JDf?{X-T+hiJnj1yc=^&zPF73j zNnN(6D+V5Cd#@ljT%!44Hsaq%Rya75zu3gI8=KQ-N5ZUh0`q*OB4xH%m=2#EjuIR) z-bRF>t;$5AzBkNj69u>&J!uo&XZU5RWjy#gwI8B-#fzv2gr;$5$E=aj*C$CrZf#6RH#a>JL^=sCL ziJ>GBVDNa>(c?Q2{b1a+zrD9=oa0@X1DV6dT78m>H&UNgu@#v5V3s~O!uDws|3I_{ zEGeA-KwyTTo`VBt;r8R3t5%F|E2Cx27n}}wG|3aOb7m4%qh0jZO>esGgy~X+h8ZX? zHm;vHFC2pIH!QQ`!PX#ekBqqh<#+aaVOX%$Td<*wNFzkSvIM(&V-p>$eQUx z-4G*kAcuZfenZkoWWw!zRnn~_O9Src&&Tg0;&oeF0paASfOZDYz}TW+D~bW3Ili^W z{}{dH_Aar{v82FA25o)(Es77vr3^$_kNvgxJ@F2a2+b!Yt*SsWmK|pDt}*j!oWgO* zjjs1e?%E1HXy6U5Ot~Kp(k7iT%-??y56l}z_F^6jo={2&jl@yQh$h^o=(!&;Bq-v> zhix-pK(GM&qEVt-$8bVui7}PaDZZjnw85l+64s1<%6A=pH$b3YiNZ|(grSbwJWUC7zkRtZqivuP5={-U%PVImHFpOZ-~QKH||bb>f~5QJWjV~Sik8s z<29o&V2sb`9HJyPm{^FbPv(EYcwbKHrTUyf`SJdRkG6yEiY+2sG|kEHKal3|s%9 z=GP(fIGQpp0iv*S(IC{4kEr5;^YEHSGXv|Q*(;SA0(soZg%bm(6>!Bjy8}G447XU??+l>JyTsX;LQ7_(g$KqbsuO&*Q@BOhU z3S=36UPdj7E?Vv`-HSu*s8A#u9vV$kUC>)(Y4uL#=D}!wv>&6i;m5`#o!%j;qsdPr z{}|`Oq!1Q(Oe-7ihn4}Wf5zQWpP0lfAD6;nUD&HB;VkB6z7-)mpFzcyypvp#3O;kJ z!>`uz)TC?m8+%c;Q-2_yx{MCz-BhAOroiZ40a&Vieo$gqflvyx0?bBS3$z(Ku?);vi7g2hJd_);Bf`4{Qx=jRxHD2)fWv5XO9Yomtvo(NrjCMW>UXWaZ@-DEC8zp>PU%fsv2mCTh=>4bWRw_@{r zFmv1RHLEN?EaAihaA&-SnFqPwi^;bVO8-Et{|h|tT2>O;7bX&mX4ekLLh-Jpv)y9d z&dQ%kl)xqQRpPx>=?L4A2roB}YZ28Z==2|Lx84d|yP>5nI)4>v8^_0z!vvS>esmw}dBUqhd#HbX~7hy1e$9s;BfQ@YQ zaP;z82)-x2TAFLuZrj!4k#y_Jnegv8TH2g5NXG*Zi)}kZ1fHLTCt=;cogfFtARh*N za+^}Fl9v&Buw1Hm-smlnWIxLA$OmHWv#jDEa3;R-IxdL242+9+2Qy0j?0x=pikJJR zISpmbm)4b0jBGK$dEZgw8%XegbOCsABLzfjzqh9=coktNqpJY9H>pD4B~$813Nu?e*E$ z(xuCFg(#A`v<>@OWC%m&Jce$OzM@el+3=-w1gQ2uUjh3T=L3pe{_gJWNOuDvgGFz9 zEwS6aeoXJf6S#n#==}Vo!vculL3IZ5I`hyJx%m~Ie=O8k_|mv+&-%2-P(Lk~3Z496 zs?|;85Nt=24AAd)dCYE3AmpG32`q48!Ka{K@G|Mvl=)}ea5NtIt^pLW#Wx9&N%e)1 zdmv2hb*!7(gJQ}sZWEgOn`%AhcF#>NO9qD?vp|Uj2)!XvGuT4&fRWNmL!dZ%+tg6= zxia(Dk$-8awT4jT?FANgPd&C4%83tX*^~E}r5IviwmlbS*V~)I1UYQQXh7;O1getD z7~&7_={E<@5nlN9o%Nla(Sx=O_p_P4HqoC76%|{x?oq5zv20jn8SO&DQA>l$;N$+w zvtCz%z!x}Aaxkkw1d)?N6j>9U=M9G`~@gTM@*CgnJm5dd4Hkl9=RupPM=Y8F-nIG@yg?Z;tkV z{jJns{MYtt7^ZyugBsU*iMv}bY!`K~smqaM@}gOCm~PLxWQ%Ihh6eG7GKFENRq;gw z5?%P;aKZv-7z0V_6GAn-HPz%*m9x9*;Du+p3~^+FN%-%duTs8<=B%S%I z>LRm9e=vS|7QQs0%7>cl0odeX-s!akx2dJie;~0N9Z@-voRr{zb6#`f0QE?2d?Q2Q zs*INHsAL*Xn=`%E>H~^!UgnmtMo%X7A#)zmDtZJHirvvc2!cIp6_W-D7)MpqhK_v8 zx=&yWQ5TzJo{p+1yPCblzFreR)4BV z9p`1KnJBVaGdp0!UnHJTgCXkk#AE!RV}6XXe(0O9uzh2?ywo3Y))c?=#l04d+lQc} z+aoS6)ffGwzjeJSEs7N%O#{o*h8Gge2lH%t+ zwqhvsEug)n8r78qBcHyni*3q)*Zb?V}B?x@rPv9FHaa&oX?pPdVt|q~|TJl9}ybRb#qU^F7>pSK-_d zi{+LZ)x!yby6X!*Y0;aST&MG_DTw#i{>xmmjB+ufEs+VKd)BS&q=KRNcJ!}jOAk^X zuSa=SqzyuEhbah(sGP7;2t%bm@C%Q=LoXD+HAF@N_-Z3paeF7 zf46D=LtmK~7Twx%8A)0xgDyyJTthWA>+-h_Pj=-^8}+{M9x8X;E*Y=hr>IJYkloTp z6U4GYgv$~u-Q^Xnn4Yz|8;o)DI0c2)o*uLlK%DpYpN}?kS^jXmkI))_KjzjZqb~dr zjC=JeSbto3Dm0(mDngrT={N5NMVwNV9K}>3G=hQ=7tc^P9rY#Yp8KhBHb&c=nE~<_ zNTza z=fZ9Hk<6nVDQZ;DMjqJFZ(#pGv?L+OY@j!wSjMs<8U61s(x91&O1k~1kFU;b6f+aKX}(fFpv2%gTx!LcC4JiYPI z18Xt&=*{qpsq~xi#|nn|%lwtYzsFCh*aPJWEE=?c1#tu3&OB9q=|`b)+7jt0&wqz3 z=!F#uG0Cn%HpS4P`UYS=l$Ht0C*u`2@Ot#_ zN)a*_!h)kzg2i!e(+*_4D6sWo!@(|t`;=QbNlH&VjhdV!_l#5QVG~uUh}XNC&u2Xv zPdS=CdU98~GVQLNV0;G${OT3i%}ZD)XoJ98$mi}j>*;O0SRF386Cm~_IytQGR2-k3 z!*J%Fm?&j9!J%{e6w$yWRd3RVxV4R=$Po%Nt#QZ`W(iU4SSc*kn;(j8W+3EznD&d3 z|MF|wh%rY`L*jOyQgV~A!u|k4g)m0egTBCQkZ(<&q=O@-!QYuYhuKXB)x;54VbE92 z5>Mfjc7(YCsTiM)rt7B3wHB>~CGoIVf#ox7AuGjPB!|Sdh+?ta;B@{tJ^KTbCG+TZ5x3Vt7PUUTaxP+`yWK4u$xaOVWbX7x$j{44 z5BBn6!%H0-%Y`fX+&Gb(H+4h#3I7#)MVsxM%iApQG_!Q@%|~K_a6?USO3A~qTO5B; ztN!(Qyr)v^3?ANLb(;9|mo2^-&A(aG!fh+vs86w7JM21iGr6w;92 z!jv13(o~GeEu#Q?6Gee05;IlX@~8~$hh)1~agCMxOw;@Im*$$KnTwEOA zNHWB`3yD!Oa|U@D${BvQSbn)?>z-2|>^#SKNkNF|J>v=`{}wyNj&>|bWh|UW?t4V=?X%}8Ql+T9ir z2sK~Mn*rawL>%mpU4H0@kPG@C)esL(D}iR78S}4H&B8Yb(pu6}vq~vUOx(8T65Vy= z$BD+BIb6i>{2#q}b2IBTd^59JBQp5*G;en%x}m$_14u`vy*-0XX<$uWd-4TvW1SE` zPFN*0D*wz#(n{6J8bYH<+K%cDgbL9+0Bwtng$l}&zu`? z9f+x0B)C%;(o=XO7xfAY?RPblXTun1u|{_3LI7u2wZ ztE~=YO!+EK{ow9+O5o|7#$()JcPobD4`lN7KZJ`ts$Cr+GenBR9G(ZbwX3+SsuADa zfuS|ncXZi{r#a!_rs4Klr&F+d+{#Zk9|uf&wVJ=3!~#23CqUAIC;O(l+FAHQ27(@Z z96Z}(Y7vl#h1MJ)^AK%s;o0Yy!u56KOus!}lj{F1-DPM0Yd)eK#q_P~YMk!_Ls~$3 zw1dVnEJ}BTzD`-Hp){p_^Q%gdfqf`MoK&d`fA|E0YrT(G!DdEfEEV8 zu8|h_^FSCC?}e{7AYZe5{eBHx(PG|%%1z+SJ4ZrBile@sz^@L^{_f#Gh|=kGf+hUe z7+`AF3HU}e<}cw<_djvrY9>u(p?|ne%{MvcFTXY~8!F$|9*G*>fqqm@*gN#I3Ly7l zcQobDN86wd1$3ZFdSE{65MLMH=l;2K)Qc$ox;eAuS!i{C+ixwqK_%T z`eXo_r&CzmcDrI>f)GLJFL}N12XJnJNf$(5Y2Mgs@ehR0->vn?qB(z2@)3jH^)RZ- zlsZpvaIrk$NIFGIzRBf?VEW@b;3>F9Q~^L7JiQ}Vt0=Z7umWTr^Vv=+q=?$i7fmS# z_ZKPdG6P(HIqYo*#2~PwHG04GyEUvIU-r#O+c@;rUYtfITOSn2mSR(M$V5s&Y2&qOI zO|BRG$GK@w0Tp8M0*WH*0pap{$>qA<1R<^DzQjebyriZI{{gQ+?QU#TW?7+&ty^i8 zm$^bbPf);xM3E1sA(SA}8|8vJyp*YZ5+(@l&6shhDHu1Jh3}1^02kePe8Y?+nf_bP zEqbhxCn^3p&9L;FcfAWWVZN?E;s|fPZv!wK1fTi?A+rvMZ*pc-%pJD(-ci#z=LnBN z{-i9EPK{fv!vHPRt(;VF`=4TV5qpaQus@I_@*7YaOQTk8KrZn~o(q}%>nF!j0&BqI zaZ)-9@15oQXZ`2cVHwxUbB@dBzF0*~pdj6GRjKdi<_12-gx2W&fn2#^N9Lb-$+*JR zyAcc4z_aZ`@w2)6r=tM+)w9%?&pqVZg&u*9I{3SQ2Bc69$a380l!&DZP|9^_6aT0O zJ7^&T+1}WTX=y=cPczN#4>fIR76_S7(AY9Ha#f? z!hm)7-qzpNNvAuO9JX}9zrPAfCpZup0Oe$@)roNI=Vm}H^jhH)PoDqfiT5)S z$ft?dx~4arc{;P#P!~S+3Rg8-y$%gAOVGa}yGmQ2J)avUa2oI1bhf;})Lb{1?!v|T ztO1r((keBgWb6r506aClxre+SE1XvBHk)GiOh-4{65t zxz&yeREdlSURxW5&DFT9WhlA3$ zTqcsuDvKsr?H@@N7nH;&%F*Fj;GHipja8#fTrl> z7;&5HADY-;=P7dHBbcFVz!L#jVk3IkI6hcK?C$(!LjSE{E97&TBsZyik4z*P&k6VQo9eb zK+Kw0pHZYf_u56_qX31E{tJb}?KzJhy2^6R`U8)%(g=H8vHpQ5kB{%vhcgsor&Z=j+)&~iQ1z`us2DC$> zWZ}0a!J>&05Oy^#u{aSxxM0M&D*GIKht56@Bf~*q@3(Q45G;+9uL5Gm?EF z_ts}kLm{gZ7m?@7D~YV=@8_0lo_Z_rj1=~L`Vz;y9v`czlwt6GoqzKc3Kaz83n%H% znFKrVlpKf7Ui!9t!~a5!Xs>BwrUSG2^vAE;y7hkOY2>u}Y`YUFGpG~3qF)8TqzxG8 zbAaE({{&f0Zd)AAgpD7g481@uYWYU3C9FXiOW|sjp#I=q8M^(g@pMvL^X*lFh(1hh zfK3oj)YuZCj51PTI6%?M?8rMp2eFiFZBPL0ybGoT$bEp#oIm$~=$uzZbt~vMB=ZUl zsY{kt5t^7c8U@f+SA*}p6L#wSn>i>Q^jYTR!4@n{7#!<-Nfyip;NuuNSQT_*aEv_w z=0xEQsJT%pnF5YJTQwnmV#Be+V(60wX10De#p>`sPHy|sRKe40gxm=S6LObFCtD>+ zaru-2uQ55!4B>d!n!PD4BB=s-!e+Z9)-HYQtN#jopptnpqxfHHW~WZJs6ZSIY$38D zDnUXI0I7}UT{S`^1Rn(+o|5`5&d<$-Vubc>Io>8`I4!v(#N{9<)E@MR)O8lQa*sx! z9YSuYzlRPYcgFzx&k(%Z9fDpJp1Z&pu2q!x_I6HRc(+^hjhTk6{lNaI7i4WdO87)# zJSFgAtG)g}a+EsR3P=Z+WTU!emN(XdN>3M=#rLKk#E34<_oTZLg^EBQXj%`r zSc`XnNl@6~(}MWn{<(qd^P~UVKm~XdMu<#^ys7ajXZTfa_?x)vU4_hhm}$-|&mULD z0;WB*=7D}Dd>Js?FPDM|3n#I(-@#gyOkrgTVQ1edB$d;Rd8{%H+fpOkStSd5vd(jp zCA;HrTZWSTs_!HAeMaI{yf3tq!M(eH0n<^^ExHE)Ad=vQrTjgN0;S^bVfKN;RHIC) z%X=T%RuyMx##nS39x5)M^ajWgm6E)rN4-J?<+i*)u$>LJ1)kD` zqfPfqU?qm)O9;c!?*kl?@PJUo*pZ-uMQrbk7WGud*B zixvk4^cvNHSqr2g=lX+B-TDR4KW)^T`O)j>{dUuh6&KFrQC zaE=lAqt&Ps@?}Xxyy&7J%EsTk1mj&nf1nUq>NWoBx`>`y&j3;TetY(jJ`_`Z2<=Bl*r-|Hh#W99VpEBzG#d~e_{3d^po^>(PvOMyq4_zJXWDK zR_D-#Lk~GRxjk@B3_QNq8p_nMblV9q0Am&nA>1};bc@gyqKB5}Hr|Zy8MN2)fNpy3 z)w-I{=hXo_-y@{H7=DOlJk@+*n!0V$>w?#A@b$FykcghbD#=KeoI2g`lNvxO?)uN= zF#eZZq-AlhLj8K05$Z{+J)!Qje9=-V`{rc%ejf)lqELq>=_Or%9IRC`JvHra=;wRx zOqRc~-&S)S+z|Ur#EVzmge~I#mo6K%tIJ;hThJe0iU<-|Ug$4DCtX>cF2A18E*dAY zh**?+dq6pnWj1O4HZz6_qx??DAD9yuP;S#IiITMVEq-H2uMV*^(t*wk z8;YGbE1lny=Dx9BY^e`I9t7o(N29SK^Q zJ}wXy_1+@A|EDxB3dd<5q@Qomh&5+Q^jv(cz{dlPRmB1>D`4`9-$mSvdJBEG z_|~;W$3$%`4{b`ug<#~1tmd|C5=UJt)T44=O|p-UutbSO+6`2njE0aA9@NOX8r8l( zkTTUpxwfFIlE&PHe4ruZ;#>QWW)s`JH^KK!pmY=KNb~MT@3tRFY?>g5$73_cSfW^} zVNPrRvz0cqy~=`WR9ka`vXJ#IAls zq5&=(FLFLl0Td979ld0hWZa3*IXshbx50}q>g_esegA~s_|MbDEe&u`70W|^XEvP8 z+|rt_*hxZ8l+9w-cR3MIWY&JWe72UrLdRKs?JE;I(KOlPm-xZ~-S=YMC10m)&cw?y z2wXJ>C_3PZqRr(Di&P8Cn`XZc6{`_}!>{N!h%_)C1GFOxlA_dyEw`;oy1x44 zi!)5QO$jS-=BaY}wAd=>s4i4Q8haCVzr}vVmaMG{16B;w3b1z#$?{U-Nohmh5X*i5UZaPjyiAau*5j z4v%Ipo3L$dBWf9bU61a4D8b3*mNHlMh)0a%Z&#^>;R>~JO|O9(*<}SrtUrDy@H;4> zq|!!z;=#r;56mzBh!VQcHRCi4(7t3|-?l&OdE2jjsyuUQbMN-TfX}%4Y)dZxEV5*Q zz-1G76>~PW<-N;3GU)fJ3qE5>YN10pUbzC?{5B6&o8Ft4S8LTZrx2rumLw7dWMpUS+ z-cQs|JjbRt)cCZTs!6f~6HolSuySkNHGPX0WR|%HPAOn!l&}KI{*5HC6sfRGp3N-9 zHhi~gD`XA_oP9QlXf3ozpn4>0wN(3Pv(UpRnNMhEb9KLLUpl{C8RIuTP%Z+Jtyrdlg&K6g3r2Z6%aU?H7sC zSb~VW_}Tb}m6OdS2+>x#yV8UMgQOB4uW=QM=yy}%>*w9S7%Cr0KV8RbB^|*bhyWeg zLEfFzPC8Q*@nPEVi%683Rhtf6H+2aEBUf|PZt3=5&fYCAUzjqGjzPo*l!#x^fazNE zgLED1>-9ZmJ-_9=MbN(={@&jrcm0%EFYRdIH63vT)9|+tt-@ z&;tVBSzB6K(5)qXs}8e%`mFX{9Z@2BTx{hKZ{Lu4YEUaeLLM8X;E7usAiWxF zy3)~0pobPHN%%Zsab850;2E3qndzepvp_{^6hm4jB!cCwDCLQAtn!6;#F)f)+dTkyP zM8dA<|0c|@z;@U>+2R9pX^+5#%KI|6{$6Q*kQg#@v`*tZTC+_Umc)!bIEkz?zKVL;x3RPU-VrI~27*=Q&Iy37Y(8hkUPqrp?itQ}a#Wxz<~Zl*ys(YWlj07B z>vq++??aM{4RqTH>{39TW+m9!PgWYr3{I{y>N+03HW|0c$e<%Fs=t zyr3K1^`4f3Xs%g;0np{=k0s~#(e@vwW@0dO>Ud2nGt^=yW%zuN0y*}9R%!@ z|2ar^Dk&ZTC%dse_?kUp)$saaLd)Iqg32G))%f1eK_<3*rwHn@GuXJy71vQN?0hP? z(fJVCg`FI2u@Z=z>fW|y<22iw_~z>Kl)mYZ4{iuwDRWD+?^5M3S0ke%5@KEa(;^q! zWt`F~DY>{U&~2;Cu-l=x$t=HU$~r z{jy2I&NzcY+MR6!j8;{3=ueb&?LGHU!^P;M6XSBjk<|eQPJ90i9*Aaq!1r#W=<6{% zP0SlC^8dEc{s;dRSKdD7gyoj&NQO1W2oS1|WDLk&uYZJlegF8ka|df#$xq#Rc@f|1 z29_4KYL539XM_bfcuyaX9>4lPn0=IP6pGNH$mpe+vKA5l2RX^0U@E zEa?YoYkwB3R|8};Am+zRn&F%nt=`489Z%;xxBIyE(*qZz97$?>SM-%TG?&*p&W2+h z0S-$-m2}JBBb0xs#GaC=47si}{U(Lm-H;rRfI88y3 ze&C4*BrER8s8E$Ona5II*&<`kc>~vuemHhO@Y&Ar#8Vao*}Jx_R#F|<(z6hJW10Ic z9s3hUEr*9Io^#opE6)BhlNKg!qMMNm&EsD+UvvQTM8S0+>iKK;kD!}?uZ`+PX~Lht zJU^=g&)Fr7{W2RB;)3>5#lP&}J{bF|(qj#!d=fYiS$%xxPi9^JPJ4wBs%$x9sA zpZW?roWa^ZmH`-CVxz-RE+RKmSDfixHaAM2sKrQ1D9WAo2*aH_sj!FPO?8W9oEM0B z_dUQZKq=|)0EO?vV=Vg-Tzl+OSZ>i?%&YCoV8-xRHrS?OXA#~ev_SBg?G#WI{{#6Y z9E`lMYnWdFy+F`ZR9Mw{?U?t*0bT*FY_Di)7h*)9?ouF?bp-~G7u!SAd`;x7uRt+CQnmoxu5+2p|>ZpymRK#?nPo`T!<2N!4o z8h~MiF#%Nb$5pys**5I~-o8#g9SF2&Zja5ik5z`%YS<6>ly=$&ey&6$ zgsrlFue6O<+Q%WDC5p-YFRz;)K(f1Dx3mAl>$Y?fJnGuF=y8RNed4Np&n-Lg_%hWO zg+FLKN9(&`)p4KRcX)C@lQOEE%XTuok>Te4*fZRFU=rzaOz6x3m(f zuOnH8@fy$E6srQW{2dY8j$j|?&WUFv7vQ${wgZscq9caIsS<;c)E7?Krk!qhx5tep z+8NzaFbPU@c(TFmiI7lFzYdcuCNcGS{rva#n+lP_kG=+FNt$P9RyRA~)V`(oXzEIc ziodn@lpV`FfNgC8A{o*UVM_?_`nO?x-W-9p?>U%>>vY6mvFpTNYrwj&?HU&7=R5r| zb=>5E00*2Ny*F83IYXyzPKnnfhe`C$tl$2kdMileXIVIvbA!)1MY$>vdcx=KRZ(bI z@WoajeRc&!A!HGDJ{zlSv%1ZXZM)uwT;Nh*;y?$Np52I`xA(YnZta1w3WM%L-|^ae z7-y;~Gp4XS_%!90BHt@N$9ejxnYlw~Q2t&tvMxxF%A4tvA>KpjaY^6oY3(ja3h8^* zrUuobs&5p%D`wpL134N27HJ!0u;7+w!H$33dB=e6{m~^utC|;icA&}Wj2hb#_eV7? zKL`m+C5@d5Sw4K_YbAA|JM&YkB(OI~B~08i6herKiqfOnr?Gre=LG@XwaMF?OWf_m$8jvD$Z8C9M_m%!ogY^Le*!qJs?pNv z;Ov)OrWOhOPY%fEQzGAg55v9ZpBd%FV6zzKx}|#&n(n_pwoMwdwtc#lRzA5V`BYb8 zMI)4LswvQ6n->%~6`DrZ2L{2`0H}>KcSkMXzd6?-`+=`zN}hX4|C!>K_mj6y#^;XC zsB7g<`fV(->^lCNuW#RZlRM{3KUHH-=%&j*bA z=L2E_9t&O9$i}OwN$jv6C7f|yQ~*+ML!SchJnnYjIm80y{RSTN7$-lO}!vHFQbzo*b6|#<_ zJHc46L@~e|vzUT}fuhQm5gDM#qQ0FEI+ikem0CDgaDh!hHk~2~i8v4{xSw6NtR$Eh zi71$X31QpP=!cmNO4u3SXDoKxZZyC`zc#l9a^({2^411U*a^#HN}eq2$Mfg3gyvjq zN0d&ucS>S~8B8#|Sm2fmBr9xlVppso3bfIMc|fz*0N9KL3*`9v z@6r8bCJ}km#BbxM(1H1SWx2b}TxKUbu#Ybs%DV{>U16_d`-~3;X0>R-iWBhAAm=Br zGY78%B>wk~%g+Dnj$c8cQT5syRO|3(v@_3{aP)Xe=ef&H1;ID6PwYjHhpLfDQxtp` z{(lH}ZF3hksqME;Qz@rM~BCSG`pEeSwqt;rcxyuUSvrexxSJzgdg|0uE60O#xNe z+J4m5k>k+k6+4+sVO@6j_l0!8p9;-gbo*jB9`p~U09sX}-PeL&W+eozOL++Xi^&Sd|g zKhP$E<0~&pM*3Ilibm^`E|%0OBedL#OuV+PXI&5b#bz!~0|+@`lF6~`PGva z_1xrZFB#^&VZf><=RpVcWP#^YH7EsF4ph;!&T|%W)-Z&e$Gg_ITnctmZbPAO3ImJ z+`!?wj8n^EMKNyTdAY;ZVo$Z!u6^*lXu{4}c?b6}70~e<)0F(@0V||&@U6Pem7gid-t2`~XseSRw*RI?vI;r#|ZXvQy5azgq+>q$^$%x!Voj}b3l&MRN8h+HZQ z^gMpmSUSXhrEb!!H3d=5u0>^^F1taO98(B0rT-R0z$wG$4f`jfx<_1eQ}yiXj=xMb zF494e-Pwt1+LGJG*#C~o0dE0NIqH9)atcr+;A%%s^^2I1*4T?w*>rG9CUVlXGq?1= zaZC##$SmnBrf3CLQTqyXXEc67^1aNcP{9ZX-2v2=SZ!`w)9v)4JLVqoRkh0{ zX?Jz7B)oX9Rom>YoX)vm0-#`XmEE=;UAdkqS<~ez(YNF(H=$@Oovv7Vr)A`JX|y3* zShJF>GbOSa$Hma=bA2={rpjeBV|U<#dDl@Pb9%Ik51X4%heoVJI#5d+F)z8r5Ec}7 zfqX{wVH%hQ6C2<=Xt2-w)XCNhUIBR!)uqwYk(W>RQFkk{!hACDQqdh0?C5p>qSc{} z$Z$s0!Fe$AUm}3p0e5L0jJGjB@b>JHXVemL2WV*94SfuPZI zGg&aTekMCcvwz*W(C8X<$i&Z+X*u6wznSY97Qr953`%xylwXk1SmZc{F@|szXgRZ8GFr;Ja@2)D!G;H%g-~ZnS89 zo~lHK69f=vmyg>Vd+bWCEUioIUr{yW6ur~jZ)=Y5Zk2qhq`XP`wZVm+tKAr}bk*DArK9G+uIddvN6nzddJmMleLv97QJVLu2bKAEjsu_T2qgp3G?5 zQ=+NqpW=CI+kV*^^qe!j7k4abJo$Vxx!{BltLghJ*s0I-z0?lBi4+rV35UCl(v$TN zLn7oNXb)&>ZbkV6fdP5-bVSkJu7$<5S4V%@%=r$r*RqyW76V^U9*|k9LCg(rXEuRu zJQ<2$5mcRKMma%NIj~Mx=-Z-#Ty%uqbsg`DNNz3tdu*%xGZ|d;*OW{Fy7p3IiurY` zTNZ9-qkLZ5mk%aA=e*^qE+`W={}c&`L$?s1OLRl>Bj*8qm8~P5F^_k=;J~N+~D-qTk$`j;b{tH>Gz<6T0 zvGW)-l}xM8?}69AS6rb%T*8Zwqa5BPds3`aS(GNhHbpz`_j4)8Al9(n#z-jsIw;bb0 zmIY|i$d~4F@|TJvNAQ5lw@(>gWD*T0iq(ngpgk5~QcM`iOAYWX0TU+M-``qugUx*P zjVukYmenhbCz_P&B%Bv_XZwOk^iT9OoJe#&2PCnYjl!p1jfsiRU+OQEto-=pTw;^V zIoNB_uo+!eaov5T;Qf;Y@{7RTO7l4)(_|RC{OuP#@(+aF{4rB-Xn>wtKa5e}K05sH zI^rd-_KjF>v5DA-RtZK^1c%r#8nuW606zt`&Cvi>KtmmI0BJZ(7QiO%oXnFykR|Y+ z6|+EtoCnPP%Y=p)StD6lBO<5uV0gsd>(TkSf`Y)0$Ue@xKY%nf926Y%ov?DQO8F1O z4Y_3|4}nvO1a9n%1=x6O)^yBv$=yXM00b9C=^r4Knz?1@A_ za28CW{@3p`S5tVPDC*BnRqK-jE~0yHlwY;GRlhSF?rsiWNNC~T9oSntnL&b~?9|rr ze&*ksYp@J$9)Z*CC@q&tDV!7n|j;}EYlD3k=D?dE?0lz()W?w+Ta z>>Sn+?qc?dv-$B`87~X((UI%#qy%7QRFUl`oMSQXo zdBUwz+uA1cdA+E+#%$*ccIpz4F)r;?Wbrl=X>X~jO+%;K?8dmz6W;o%R*up79Ch~x zPdwz!g=FeD_f}bhwTBy2yf2mF8U^;x`8ZvmswF&K(I|M$#tOeJF1vb(aHWbLjD#z| zOE&wlGi6!4CtJwK1}oXtQ(4r;phu^qOq70)>9wj0-F#XAyUVVcvurR18ZZc3S)BQL zYBFUuy2-^sxGGI&vi1JeL+%>WQnubLeyF2Nuz6omMB6c|0R-!8g7^bF$5phz_O*(# zMAGdN!}KGczl0tU_50mqF9pj|on@Y(%0yti-JIc3Ywz8h$6Xa-o;?r|#}S z%aX+3x(AHCS?`{1$&$9WYpb0dUB(~SDFO1@0qoC{@Esv}KQ@qx;?;?qXO8~ko{OXt zDNEs)2U?{gGF_CK)L)mHj`-?xx?hxLm-6VG79G#~umr*)s0xv)XjNm8hH}~l^}yX{ zZBl8xicf`}5Vbt4hk=C`3rCnz^IIDGeY7<@UA8*4@t~CG) z@@d2Wi?9|d`G>H+f$>}Rtq(9cH24cWt^2jVEDf!5zvQwC`>0Yu#fz66zAPO|{toGG zk8PCbaw8f&6e=+SUmABG)8OpwU->-1qs%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 From 811e4f872838647267e80a2f86bee0c47135869e Mon Sep 17 00:00:00 2001 From: Luke Milby Date: Sun, 15 Feb 2026 12:37:32 -0500 Subject: [PATCH 28/46] add when picoclaw responsed to discord message will show its typing (#236) --- pkg/channels/discord.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/channels/discord.go b/pkg/channels/discord.go index e65c99eec..cb8014086 100644 --- a/pkg/channels/discord.go +++ b/pkg/channels/discord.go @@ -140,6 +140,12 @@ func (c *DiscordChannel) handleMessage(s *discordgo.Session, m *discordgo.Messag return } + if err := c.session.ChannelTyping(m.ChannelID); err != nil { + logger.ErrorCF("discord", "Failed to send typing indicator", map[string]any{ + "error": err.Error(), + }) + } + // 检查白名单,避免为被拒绝的用户下载附件和转录 if !c.IsAllowed(m.Author.ID) { logger.DebugCF("discord", "Message rejected by allowlist", map[string]any{ From c6c82b3c441d07a3f7a32d0e04b452e7bbdd84c0 Mon Sep 17 00:00:00 2001 From: ian <141902143+yumosx@users.noreply.github.com> Date: Mon, 16 Feb 2026 02:12:50 +0800 Subject: [PATCH 29/46] feat(skills): add validation for skill info and test cases (#231) Add validation logic for SkillInfo to ensure name and description meet requirements Include test cases covering various validation scenarios Add testify dependency for testing assertions --- go.mod | 10 +++-- go.sum | 6 +++ pkg/skills/loader.go | 45 +++++++++++++++++++++++ pkg/skills/loader_test.go | 77 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 pkg/skills/loader_test.go diff --git a/go.mod b/go.mod index 98aecd6ab..1f88639c8 100644 --- a/go.mod +++ b/go.mod @@ -15,11 +15,16 @@ require ( github.com/open-dingtalk/dingtalk-stream-sdk-go v0.9.1 github.com/openai/openai-go/v3 v3.22.0 github.com/slack-go/slack v0.17.3 + github.com/stretchr/testify v1.11.1 github.com/tencent-connect/botgo v0.2.1 golang.org/x/oauth2 v0.35.0 ) - +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) require ( github.com/andybalholm/brotli v1.2.0 // indirect @@ -28,9 +33,9 @@ require ( 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/google/jsonschema-go v0.4.2 // indirect github.com/grbit/go-json v0.11.0 // indirect github.com/klauspost/compress v1.18.4 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect @@ -47,5 +52,4 @@ 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 6a565b93e..0e95bf5cd 100644 --- a/go.sum +++ b/go.sum @@ -58,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/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 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= @@ -78,9 +80,11 @@ github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzh github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/larksuite/oapi-sdk-go/v3 v3.5.3 h1:xvf8Dv29kBXC5/DNDCLhHkAFW8l/0LlQJimO5Zn+JUk= github.com/larksuite/oapi-sdk-go/v3 v3.5.3/go.mod h1:ZEplY+kwuIrj/nqw5uSCINNATcH3KdxSN7y+UxYY5fI= @@ -102,6 +106,7 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/slack-go/slack v0.17.3 h1:zV5qO3Q+WJAQ/XwbGfNFrRMaJ5T/naqaonyPV/1TP4g= github.com/slack-go/slack v0.17.3/go.mod h1:X+UqOufi3LYQHDnMG1vxf0J8asC6+WllXrVrhl8/Prk= @@ -242,6 +247,7 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= diff --git a/pkg/skills/loader.go b/pkg/skills/loader.go index 1f952c1f5..0c63ae067 100644 --- a/pkg/skills/loader.go +++ b/pkg/skills/loader.go @@ -2,13 +2,22 @@ package skills import ( "encoding/json" + "errors" "fmt" + "log/slog" "os" "path/filepath" "regexp" "strings" ) +var namePattern = regexp.MustCompile(`^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$`) + +const ( + MaxNameLength = 64 + MaxDescriptionLength = 1024 +) + type SkillMetadata struct { Name string `json:"name"` Description string `json:"description"` @@ -21,6 +30,27 @@ type SkillInfo struct { Description string `json:"description"` } +func (info SkillInfo) validate() error { + var errs error + if info.Name == "" { + errs = errors.Join(errs, errors.New("name is required")) + } else { + if len(info.Name) > MaxNameLength { + errs = errors.Join(errs, fmt.Errorf("name exceeds %d characters", MaxNameLength)) + } + if !namePattern.MatchString(info.Name) { + errs = errors.Join(errs, errors.New("name must be alphanumeric with hyphens")) + } + } + + if info.Description == "" { + errs = errors.Join(errs, errors.New("description is required")) + } else if len(info.Description) > MaxDescriptionLength { + errs = errors.Join(errs, fmt.Errorf("description exceeds %d character", MaxDescriptionLength)) + } + return errs +} + type SkillsLoader struct { workspace string workspaceSkills string // workspace skills (项目级别) @@ -54,6 +84,11 @@ func (sl *SkillsLoader) ListSkills() []SkillInfo { metadata := sl.getSkillMetadata(skillFile) if metadata != nil { info.Description = metadata.Description + info.Name = metadata.Name + } + if err := info.validate(); err != nil { + slog.Warn("invalid skill from workspace", "name", info.Name, "error", err) + continue } skills = append(skills, info) } @@ -89,6 +124,11 @@ func (sl *SkillsLoader) ListSkills() []SkillInfo { metadata := sl.getSkillMetadata(skillFile) if metadata != nil { info.Description = metadata.Description + info.Name = metadata.Name + } + if err := info.validate(); err != nil { + slog.Warn("invalid skill from global", "name", info.Name, "error", err) + continue } skills = append(skills, info) } @@ -123,6 +163,11 @@ func (sl *SkillsLoader) ListSkills() []SkillInfo { metadata := sl.getSkillMetadata(skillFile) if metadata != nil { info.Description = metadata.Description + info.Name = metadata.Name + } + if err := info.validate(); err != nil { + slog.Warn("invalid skill from builtin", "name", info.Name, "error", err) + continue } skills = append(skills, info) } diff --git a/pkg/skills/loader_test.go b/pkg/skills/loader_test.go new file mode 100644 index 000000000..e0e7109cf --- /dev/null +++ b/pkg/skills/loader_test.go @@ -0,0 +1,77 @@ +package skills + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSkillsInfoValidate(t *testing.T) { + testcases := []struct { + name string + skillName string + description string + wantErr bool + errContains []string + }{ + { + name: "valid-skill", + skillName: "valid-skill", + description: "a valid skill description", + wantErr: false, + }, + { + name: "empty-name", + skillName: "", + description: "description without name", + wantErr: true, + errContains: []string{"name is required"}, + }, + { + name: "empty-description", + skillName: "skill-without-description", + description: "", + wantErr: true, + errContains: []string{"description is required"}, + }, + { + name: "empty-both", + skillName: "", + description: "", + wantErr: true, + errContains: []string{"name is required", "description is required"}, + }, + { + name: "name-with-spaces", + skillName: "skill with spaces", + description: "invalid name with spaces", + wantErr: true, + errContains: []string{"name must be alphanumeric with hyphens"}, + }, + { + name: "name-with-underscore", + skillName: "skill_underscore", + description: "invalid name with underscore", + wantErr: true, + errContains: []string{"name must be alphanumeric with hyphens"}, + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + info := SkillInfo{ + Name: tc.skillName, + Description: tc.description, + } + err := info.validate() + if tc.wantErr { + assert.Error(t, err) + for _, msg := range tc.errContains { + assert.ErrorContains(t, err, msg) + } + } else { + assert.NoError(t, err) + } + }) + } +} From 1d748fb742a3d3536260639622e650eb1ebb3a25 Mon Sep 17 00:00:00 2001 From: mattn Date: Mon, 16 Feb 2026 03:20:20 +0900 Subject: [PATCH 30/46] Remove duplicate file extension in DownloadFile (#230) --- pkg/utils/media.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/utils/media.go b/pkg/utils/media.go index 6345da8fc..2b184f2ec 100644 --- a/pkg/utils/media.go +++ b/pkg/utils/media.go @@ -73,9 +73,8 @@ func DownloadFile(url, filename string, opts DownloadOptions) string { } // Generate unique filename with UUID prefix to prevent conflicts - ext := filepath.Ext(filename) safeName := SanitizeFilename(filename) - localPath := filepath.Join(mediaDir, uuid.New().String()[:8]+"_"+safeName+ext) + localPath := filepath.Join(mediaDir, uuid.New().String()[:8]+"_"+safeName) // Create HTTP request req, err := http.NewRequest("GET", url, nil) From 0d18210803bf907fedac839f0a074617438fe92f Mon Sep 17 00:00:00 2001 From: Guoguo <16666742+imguoguo@users.noreply.github.com> Date: Mon, 16 Feb 2026 10:35:31 +0800 Subject: [PATCH 31/46] ci: use goreleaser to release docker and binary (#180) Signed-off-by: Guoguo --- .github/workflows/docker-build.yml | 60 ++++++++++++++---------- .github/workflows/release.yml | 73 +++++++++++++++--------------- .goreleaser.yaml | 20 +++++++- Dockerfile.goreleaser | 10 ++++ 4 files changed, 102 insertions(+), 61 deletions(-) create mode 100644 Dockerfile.goreleaser diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 90ff635da..2d1aa9ffc 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -1,12 +1,18 @@ name: 🐳 Build & Push Docker Image on: - release: - types: [published] + workflow_call: + inputs: + tag: + description: "Release tag" + required: true + type: string env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository_owner }}/picoclaw + GHCR_REGISTRY: ghcr.io + GHCR_IMAGE_NAME: ${{ github.repository_owner }}/picoclaw + DOCKERHUB_REGISTRY: docker.io + DOCKERHUB_IMAGE_NAME: ${{ vars.DOCKERHUB_REPOSITORY }} jobs: build: @@ -20,6 +26,8 @@ jobs: # ── Checkout ────────────────────────────── - name: 📥 Checkout repository uses: actions/checkout@v4 + with: + ref: ${{ inputs.tag }} # ── Docker Buildx ───────────────────────── - name: 🔧 Set up Docker Buildx @@ -27,36 +35,42 @@ jobs: # ── Login to GHCR ───────────────────────── - name: 🔑 Login to GitHub Container Registry - if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: - registry: ${{ env.REGISTRY }} + registry: ${{ env.GHCR_REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - # ── Metadata (tags & labels) ────────────── - - name: 🏷️ Extract Docker metadata - id: meta - uses: docker/metadata-action@v5 + # ── Login to Docker Hub ──────────────────── + - name: 🔑 Login to Docker Hub + uses: docker/login-action@v3 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=pr - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=sha,prefix= - type=raw,value=latest,enable={{is_default_branch}} - type=raw,value={{date 'YYYYMMDD-HHmmss'}},enable={{is_default_branch}} + registry: ${{ env.DOCKERHUB_REGISTRY }} + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # ── Metadata (tags & labels) ────────────── + - name: 🏷️ Prepare image tags + id: tags + shell: bash + run: | + tag="${{ inputs.tag }}" + echo "ghcr_tag=${{ env.GHCR_REGISTRY }}/${{ env.GHCR_IMAGE_NAME }}:${tag}" >> "$GITHUB_OUTPUT" + echo "ghcr_latest=${{ env.GHCR_REGISTRY }}/${{ env.GHCR_IMAGE_NAME }}:latest" >> "$GITHUB_OUTPUT" + echo "dockerhub_tag=${{ env.DOCKERHUB_REGISTRY }}/${{ env.DOCKERHUB_IMAGE_NAME }}:${tag}" >> "$GITHUB_OUTPUT" + echo "dockerhub_latest=${{ env.DOCKERHUB_REGISTRY }}/${{ env.DOCKERHUB_IMAGE_NAME }}:latest" >> "$GITHUB_OUTPUT" # ── Build & Push ────────────────────────── - name: 🚀 Build and push Docker image uses: docker/build-push-action@v6 with: context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + push: true + tags: | + ${{ steps.tags.outputs.ghcr_tag }} + ${{ steps.tags.outputs.ghcr_latest }} + ${{ steps.tags.outputs.dockerhub_tag }} + ${{ steps.tags.outputs.dockerhub_latest }} cache-from: type=gha cache-to: type=gha,mode=max - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64,linux/arm64,linux/riscv64 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 59cc6caeb..f9987b35f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,14 +38,18 @@ jobs: git tag -a "${{ inputs.tag }}" -m "Release ${{ inputs.tag }}" git push origin "${{ inputs.tag }}" - build-binaries: - name: Build Release Binaries + release: + name: GoReleaser Release needs: create-tag runs-on: ubuntu-latest + permissions: + contents: write + packages: write steps: - name: Checkout tag uses: actions/checkout@v4 with: + fetch-depth: 0 ref: ${{ inputs.tag }} - name: Setup Go from go.mod @@ -53,47 +57,42 @@ jobs: with: go-version-file: go.mod - - name: Build all binaries - run: make build-all + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 - - name: Generate checksums - shell: bash - run: | - shasum -a 256 build/picoclaw-* > build/sha256sums.txt + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - - name: Upload release binaries artifact - uses: actions/upload-artifact@v4 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 with: - name: picoclaw-binaries - path: | - build/picoclaw-* - build/sha256sums.txt - if-no-files-found: error + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - create-release: - name: Create GitHub Release - needs: [create-tag, build-binaries] - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Download all artifacts - uses: actions/download-artifact@v4 + - name: Login to Docker Hub + uses: docker/login-action@v3 with: - path: release-artifacts + registry: docker.io + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Show downloaded files - run: ls -R release-artifacts - - - name: Create release - uses: softprops/action-gh-release@v2 + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 with: - tag_name: ${{ inputs.tag }} - name: ${{ inputs.tag }} - draft: ${{ inputs.draft }} - prerelease: ${{ inputs.prerelease }} - files: | - release-artifacts/**/* - generate_release_notes: true + distribution: goreleaser + version: ~> v2 + args: release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }} + DOCKERHUB_IMAGE_NAME: ${{ vars.DOCKERHUB_REPOSITORY }} + + - name: Apply release flags + shell: bash + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release edit "${{ inputs.tag }}" \ + --draft=${{ inputs.draft }} \ + --prerelease=${{ inputs.prerelease }} diff --git a/.goreleaser.yaml b/.goreleaser.yaml index a2c158331..9f4cedc8c 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -5,9 +5,11 @@ version: 2 before: hooks: - go mod tidy + - go generate ./cmd/picoclaw builds: - - env: + - id: picoclaw + env: - CGO_ENABLED=0 goos: - linux @@ -26,6 +28,22 @@ builds: - goos: windows goarch: arm +dockers_v2: + - id: picoclaw + dockerfile: Dockerfile.goreleaser + ids: + - picoclaw + images: + - "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/picoclaw" + - "docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}" + tags: + - "{{ .Tag }}" + - "latest" + platforms: + - linux/amd64 + - linux/arm64 + - linux/riscv64 + archives: - formats: [tar.gz] # this name template makes the OS and Arch compatible with the results of `uname`. diff --git a/Dockerfile.goreleaser b/Dockerfile.goreleaser new file mode 100644 index 000000000..0cdc8c6bd --- /dev/null +++ b/Dockerfile.goreleaser @@ -0,0 +1,10 @@ +FROM alpine:3.21 + +ARG TARGETPLATFORM + +RUN apk add --no-cache ca-certificates tzdata + +COPY $TARGETPLATFORM/picoclaw /usr/local/bin/picoclaw + +ENTRYPOINT ["picoclaw"] +CMD ["gateway"] From cd638fff6c946f6e92746e6e3922efe8e73fa5a2 Mon Sep 17 00:00:00 2001 From: trungtt6 <74585678+trungtt6@users.noreply.github.com> Date: Mon, 16 Feb 2026 11:28:38 +0800 Subject: [PATCH 32/46] Add local AI ollama for security purpose (#226) Co-authored-by: PhotoPortfolio Developer --- config/config.example.json | 4 ++++ pkg/config/config.go | 1 + pkg/providers/http_provider.go | 14 +++++++++++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/config/config.example.json b/config/config.example.json index aa75c8338..3c9158e9c 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -107,6 +107,10 @@ "moonshot": { "api_key": "sk-xxx", "api_base": "" + }, + "ollama": { + "api_key": "", + "api_base": "http://localhost:11434/v1" } }, "tools": { diff --git a/pkg/config/config.go b/pkg/config/config.go index d76ec8095..da33748d0 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -175,6 +175,7 @@ type ProvidersConfig struct { VLLM ProviderConfig `json:"vllm"` Gemini ProviderConfig `json:"gemini"` Nvidia ProviderConfig `json:"nvidia"` + Ollama ProviderConfig `json:"ollama"` Moonshot ProviderConfig `json:"moonshot"` ShengSuanYun ProviderConfig `json:"shengsuanyun"` DeepSeek ProviderConfig `json:"deepseek"` diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 17eb6214c..60294c451 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -53,10 +53,10 @@ func (p *HTTPProvider) Chat(ctx context.Context, messages []Message, tools []Too return nil, fmt.Errorf("API base not configured") } - // Strip provider prefix from model name (e.g., moonshot/kimi-k2.5 -> kimi-k2.5) + // Strip provider prefix from model name (e.g., moonshot/kimi-k2.5 -> kimi-k2.5, groq/openai/gpt-oss-120b -> openai/gpt-oss-120b, ollama/qwen2.5:14b -> qwen2.5:14b) if idx := strings.Index(model, "/"); idx != -1 { prefix := model[:idx] - if prefix == "moonshot" || prefix == "nvidia" { + if prefix == "moonshot" || prefix == "nvidia" || prefix == "groq" || prefix == "ollama" { model = model[idx+1:] } } @@ -400,7 +400,15 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { if apiBase == "" { apiBase = "https://integrate.api.nvidia.com/v1" } - + case (strings.Contains(lowerModel, "ollama") || strings.HasPrefix(model, "ollama/")) && cfg.Providers.Ollama.APIKey != "": + fmt.Println("Ollama provider selected based on model name prefix") + apiKey = cfg.Providers.Ollama.APIKey + apiBase = cfg.Providers.Ollama.APIBase + proxy = cfg.Providers.Ollama.Proxy + if apiBase == "" { + apiBase = "http://localhost:11434/v1" + } + fmt.Println("Ollama apiBase:", apiBase) case cfg.Providers.VLLM.APIBase != "": apiKey = cfg.Providers.VLLM.APIKey apiBase = cfg.Providers.VLLM.APIBase From a5503aea36a5c4c7b9d51e42a6cc984a69b3c5a6 Mon Sep 17 00:00:00 2001 From: Guoguo <16666742+imguoguo@users.noreply.github.com> Date: Mon, 16 Feb 2026 11:29:04 +0800 Subject: [PATCH 33/46] build: temporary disable UPX compression (#257) Signed-off-by: Guoguo --- .goreleaser.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 9f4cedc8c..368a0f06b 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -66,10 +66,10 @@ changelog: - "^docs:" - "^test:" -upx: - - enabled: true - compress: best - lzma: true +# upx: +# - enabled: true +# compress: best +# lzma: true release: footer: >- From e77b0a6755587d200db8980c6ee37b93be5bab62 Mon Sep 17 00:00:00 2001 From: Leandro Barbosa Date: Mon, 16 Feb 2026 00:40:17 -0300 Subject: [PATCH 34/46] feat: add Codex CLI provider for subprocess integration (#80) * feat: add Codex CLI provider for OpenAI subprocess integration Add CodexCliProvider that wraps `codex exec --json` as a subprocess, analogous to the existing ClaudeCliProvider pattern. This enables using OpenAI's Codex CLI tool as a local LLM backend. - CodexCliProvider: subprocess wrapper parsing JSONL event stream - Credential reader for ~/.codex/auth.json with token expiry detection - Factory integration: provider "codex-cli" and auth_method "codex-cli" - Fix tilde expansion in workspace path for CLI providers - 37 unit tests covering parsing, prompt building, credentials, and mocks * fix: add tool call extraction to Codex CLI provider - Extract shared tool call parsing into tool_call_extract.go (extractToolCallsFromText, stripToolCallsFromText, findMatchingBrace) - Both ClaudeCliProvider and CodexCliProvider now share the same tool call extraction logic for PicoClaw-specific tools - Fix cache token accounting: include cached_input_tokens in total - Add 2 new tests for tool call extraction from JSONL events - Update existing tests for corrected token calculations * fix(docker): update Go version to match go.mod requirement Dockerfile used golang:1.24-alpine but go.mod requires go >= 1.25.7. This caused Docker builds to fail on all branches with: "go: go.mod requires go >= 1.25.7 (running go 1.24.13)" Update to golang:1.25-alpine to match the project requirement. * fix: handle codex CLI stderr noise without losing valid stdout Codex writes diagnostic messages to stderr (e.g. rollout errors) which cause non-zero exit codes even when valid JSONL output exists on stdout. Parse stdout first before checking exit code to avoid false errors. * style: fix gofmt formatting and update web search API in tests - Remove trailing whitespace in web.go and base_test.go - Update config_test.go and web_test.go for WebSearchToolOptions API --- pkg/providers/claude_cli_provider.go | 62 +-- pkg/providers/codex_cli_credentials.go | 79 +++ pkg/providers/codex_cli_credentials_test.go | 181 ++++++ pkg/providers/codex_cli_provider.go | 251 +++++++++ pkg/providers/codex_cli_provider_test.go | 585 ++++++++++++++++++++ pkg/providers/http_provider.go | 11 +- pkg/providers/tool_call_extract.go | 72 +++ pkg/tools/web_test.go | 16 +- 8 files changed, 1192 insertions(+), 65 deletions(-) create mode 100644 pkg/providers/codex_cli_credentials.go create mode 100644 pkg/providers/codex_cli_credentials_test.go create mode 100644 pkg/providers/codex_cli_provider.go create mode 100644 pkg/providers/codex_cli_provider_test.go create mode 100644 pkg/providers/tool_call_extract.go diff --git a/pkg/providers/claude_cli_provider.go b/pkg/providers/claude_cli_provider.go index a91795715..58ba3647d 100644 --- a/pkg/providers/claude_cli_provider.go +++ b/pkg/providers/claude_cli_provider.go @@ -171,68 +171,14 @@ func (p *ClaudeCliProvider) parseClaudeCliResponse(output string) (*LLMResponse, }, nil } -// extractToolCalls parses tool call JSON from the response text. +// extractToolCalls delegates to the shared extractToolCallsFromText function. func (p *ClaudeCliProvider) extractToolCalls(text string) []ToolCall { - start := strings.Index(text, `{"tool_calls"`) - if start == -1 { - return nil - } - - end := findMatchingBrace(text, start) - if end == start { - return nil - } - - jsonStr := text[start:end] - - var wrapper struct { - ToolCalls []struct { - ID string `json:"id"` - Type string `json:"type"` - Function struct { - Name string `json:"name"` - Arguments string `json:"arguments"` - } `json:"function"` - } `json:"tool_calls"` - } - - if err := json.Unmarshal([]byte(jsonStr), &wrapper); err != nil { - return nil - } - - var result []ToolCall - for _, tc := range wrapper.ToolCalls { - var args map[string]interface{} - json.Unmarshal([]byte(tc.Function.Arguments), &args) - - result = append(result, ToolCall{ - ID: tc.ID, - Type: tc.Type, - Name: tc.Function.Name, - Arguments: args, - Function: &FunctionCall{ - Name: tc.Function.Name, - Arguments: tc.Function.Arguments, - }, - }) - } - - return result + return extractToolCallsFromText(text) } -// stripToolCallsJSON removes tool call JSON from response text. +// stripToolCallsJSON delegates to the shared stripToolCallsFromText function. func (p *ClaudeCliProvider) stripToolCallsJSON(text string) string { - start := strings.Index(text, `{"tool_calls"`) - if start == -1 { - return text - } - - end := findMatchingBrace(text, start) - if end == start { - return text - } - - return strings.TrimSpace(text[:start] + text[end:]) + return stripToolCallsFromText(text) } // findMatchingBrace finds the index after the closing brace matching the opening brace at pos. diff --git a/pkg/providers/codex_cli_credentials.go b/pkg/providers/codex_cli_credentials.go new file mode 100644 index 000000000..7ad39ce8e --- /dev/null +++ b/pkg/providers/codex_cli_credentials.go @@ -0,0 +1,79 @@ +package providers + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "time" +) + +// CodexCliAuth represents the ~/.codex/auth.json file structure. +type CodexCliAuth struct { + Tokens struct { + AccessToken string `json:"access_token"` + RefreshToken string `json:"refresh_token"` + AccountID string `json:"account_id"` + } `json:"tokens"` +} + +// ReadCodexCliCredentials reads OAuth tokens from the Codex CLI's auth.json file. +// Expiry is estimated as file modification time + 1 hour (same approach as moltbot). +func ReadCodexCliCredentials() (accessToken, accountID string, expiresAt time.Time, err error) { + authPath, err := resolveCodexAuthPath() + if err != nil { + return "", "", time.Time{}, err + } + + data, err := os.ReadFile(authPath) + if err != nil { + return "", "", time.Time{}, fmt.Errorf("reading %s: %w", authPath, err) + } + + var auth CodexCliAuth + if err := json.Unmarshal(data, &auth); err != nil { + return "", "", time.Time{}, fmt.Errorf("parsing %s: %w", authPath, err) + } + + if auth.Tokens.AccessToken == "" { + return "", "", time.Time{}, fmt.Errorf("no access_token in %s", authPath) + } + + stat, err := os.Stat(authPath) + if err != nil { + expiresAt = time.Now().Add(time.Hour) + } else { + expiresAt = stat.ModTime().Add(time.Hour) + } + + return auth.Tokens.AccessToken, auth.Tokens.AccountID, expiresAt, nil +} + +// CreateCodexCliTokenSource creates a token source that reads from ~/.codex/auth.json. +// This allows the existing CodexProvider to reuse Codex CLI credentials. +func CreateCodexCliTokenSource() func() (string, string, error) { + return func() (string, string, error) { + token, accountID, expiresAt, err := ReadCodexCliCredentials() + if err != nil { + return "", "", fmt.Errorf("reading codex cli credentials: %w", err) + } + + if time.Now().After(expiresAt) { + return "", "", fmt.Errorf("codex cli credentials expired (auth.json last modified > 1h ago). Run: codex login") + } + + return token, accountID, nil + } +} + +func resolveCodexAuthPath() (string, error) { + codexHome := os.Getenv("CODEX_HOME") + if codexHome == "" { + home, err := os.UserHomeDir() + if err != nil { + return "", fmt.Errorf("getting home dir: %w", err) + } + codexHome = filepath.Join(home, ".codex") + } + return filepath.Join(codexHome, "auth.json"), nil +} diff --git a/pkg/providers/codex_cli_credentials_test.go b/pkg/providers/codex_cli_credentials_test.go new file mode 100644 index 000000000..3267f2d16 --- /dev/null +++ b/pkg/providers/codex_cli_credentials_test.go @@ -0,0 +1,181 @@ +package providers + +import ( + "os" + "path/filepath" + "testing" + "time" +) + +func TestReadCodexCliCredentials_Valid(t *testing.T) { + tmpDir := t.TempDir() + authPath := filepath.Join(tmpDir, "auth.json") + + authJSON := `{ + "tokens": { + "access_token": "test-access-token", + "refresh_token": "test-refresh-token", + "account_id": "org-test123" + } + }` + if err := os.WriteFile(authPath, []byte(authJSON), 0600); err != nil { + t.Fatal(err) + } + + t.Setenv("CODEX_HOME", tmpDir) + + token, accountID, expiresAt, err := ReadCodexCliCredentials() + if err != nil { + t.Fatalf("ReadCodexCliCredentials() error: %v", err) + } + if token != "test-access-token" { + t.Errorf("token = %q, want %q", token, "test-access-token") + } + if accountID != "org-test123" { + t.Errorf("accountID = %q, want %q", accountID, "org-test123") + } + // Expiry should be within ~1 hour from now (file was just written) + if expiresAt.Before(time.Now()) { + t.Errorf("expiresAt = %v, should be in the future", expiresAt) + } + if expiresAt.After(time.Now().Add(2 * time.Hour)) { + t.Errorf("expiresAt = %v, should be within ~1 hour", expiresAt) + } +} + +func TestReadCodexCliCredentials_MissingFile(t *testing.T) { + tmpDir := t.TempDir() + t.Setenv("CODEX_HOME", tmpDir) + + _, _, _, err := ReadCodexCliCredentials() + if err == nil { + t.Fatal("expected error for missing auth.json") + } +} + +func TestReadCodexCliCredentials_EmptyToken(t *testing.T) { + tmpDir := t.TempDir() + authPath := filepath.Join(tmpDir, "auth.json") + + authJSON := `{"tokens": {"access_token": "", "refresh_token": "r", "account_id": "a"}}` + if err := os.WriteFile(authPath, []byte(authJSON), 0600); err != nil { + t.Fatal(err) + } + + t.Setenv("CODEX_HOME", tmpDir) + + _, _, _, err := ReadCodexCliCredentials() + if err == nil { + t.Fatal("expected error for empty access_token") + } +} + +func TestReadCodexCliCredentials_InvalidJSON(t *testing.T) { + tmpDir := t.TempDir() + authPath := filepath.Join(tmpDir, "auth.json") + + if err := os.WriteFile(authPath, []byte("not json"), 0600); err != nil { + t.Fatal(err) + } + + t.Setenv("CODEX_HOME", tmpDir) + + _, _, _, err := ReadCodexCliCredentials() + if err == nil { + t.Fatal("expected error for invalid JSON") + } +} + +func TestReadCodexCliCredentials_NoAccountID(t *testing.T) { + tmpDir := t.TempDir() + authPath := filepath.Join(tmpDir, "auth.json") + + authJSON := `{"tokens": {"access_token": "tok123", "refresh_token": "ref456"}}` + if err := os.WriteFile(authPath, []byte(authJSON), 0600); err != nil { + t.Fatal(err) + } + + t.Setenv("CODEX_HOME", tmpDir) + + token, accountID, _, err := ReadCodexCliCredentials() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if token != "tok123" { + t.Errorf("token = %q, want %q", token, "tok123") + } + if accountID != "" { + t.Errorf("accountID = %q, want empty", accountID) + } +} + +func TestReadCodexCliCredentials_CodexHomeEnv(t *testing.T) { + tmpDir := t.TempDir() + customDir := filepath.Join(tmpDir, "custom-codex") + if err := os.MkdirAll(customDir, 0755); err != nil { + t.Fatal(err) + } + + authJSON := `{"tokens": {"access_token": "custom-token", "refresh_token": "r"}}` + if err := os.WriteFile(filepath.Join(customDir, "auth.json"), []byte(authJSON), 0600); err != nil { + t.Fatal(err) + } + + t.Setenv("CODEX_HOME", customDir) + + token, _, _, err := ReadCodexCliCredentials() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if token != "custom-token" { + t.Errorf("token = %q, want %q", token, "custom-token") + } +} + +func TestCreateCodexCliTokenSource_Valid(t *testing.T) { + tmpDir := t.TempDir() + authPath := filepath.Join(tmpDir, "auth.json") + + authJSON := `{"tokens": {"access_token": "fresh-token", "refresh_token": "r", "account_id": "acc"}}` + if err := os.WriteFile(authPath, []byte(authJSON), 0600); err != nil { + t.Fatal(err) + } + + t.Setenv("CODEX_HOME", tmpDir) + + source := CreateCodexCliTokenSource() + token, accountID, err := source() + if err != nil { + t.Fatalf("token source error: %v", err) + } + if token != "fresh-token" { + t.Errorf("token = %q, want %q", token, "fresh-token") + } + if accountID != "acc" { + t.Errorf("accountID = %q, want %q", accountID, "acc") + } +} + +func TestCreateCodexCliTokenSource_Expired(t *testing.T) { + tmpDir := t.TempDir() + authPath := filepath.Join(tmpDir, "auth.json") + + authJSON := `{"tokens": {"access_token": "old-token", "refresh_token": "r"}}` + if err := os.WriteFile(authPath, []byte(authJSON), 0600); err != nil { + t.Fatal(err) + } + + // Set file modification time to 2 hours ago + oldTime := time.Now().Add(-2 * time.Hour) + if err := os.Chtimes(authPath, oldTime, oldTime); err != nil { + t.Fatal(err) + } + + t.Setenv("CODEX_HOME", tmpDir) + + source := CreateCodexCliTokenSource() + _, _, err := source() + if err == nil { + t.Fatal("expected error for expired credentials") + } +} diff --git a/pkg/providers/codex_cli_provider.go b/pkg/providers/codex_cli_provider.go new file mode 100644 index 000000000..8886406b4 --- /dev/null +++ b/pkg/providers/codex_cli_provider.go @@ -0,0 +1,251 @@ +package providers + +import ( + "bufio" + "bytes" + "context" + "encoding/json" + "fmt" + "os/exec" + "strings" +) + +// CodexCliProvider implements LLMProvider by wrapping the codex CLI as a subprocess. +type CodexCliProvider struct { + command string + workspace string +} + +// NewCodexCliProvider creates a new Codex CLI provider. +func NewCodexCliProvider(workspace string) *CodexCliProvider { + return &CodexCliProvider{ + command: "codex", + workspace: workspace, + } +} + +// Chat implements LLMProvider.Chat by executing the codex CLI in non-interactive mode. +func (p *CodexCliProvider) Chat(ctx context.Context, messages []Message, tools []ToolDefinition, model string, options map[string]interface{}) (*LLMResponse, error) { + if p.command == "" { + return nil, fmt.Errorf("codex command not configured") + } + + prompt := p.buildPrompt(messages, tools) + + args := []string{ + "exec", + "--json", + "--dangerously-bypass-approvals-and-sandbox", + "--skip-git-repo-check", + "--color", "never", + } + if model != "" && model != "codex-cli" { + args = append(args, "-m", model) + } + if p.workspace != "" { + args = append(args, "-C", p.workspace) + } + args = append(args, "-") // read prompt from stdin + + cmd := exec.CommandContext(ctx, p.command, args...) + cmd.Stdin = bytes.NewReader([]byte(prompt)) + + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + err := cmd.Run() + + // Parse JSONL from stdout even if exit code is non-zero, + // because codex writes diagnostic noise to stderr (e.g. rollout errors) + // but still produces valid JSONL output. + if stdoutStr := stdout.String(); stdoutStr != "" { + resp, parseErr := p.parseJSONLEvents(stdoutStr) + if parseErr == nil && resp != nil && (resp.Content != "" || len(resp.ToolCalls) > 0) { + return resp, nil + } + } + + if err != nil { + if ctx.Err() == context.Canceled { + return nil, ctx.Err() + } + if stderrStr := stderr.String(); stderrStr != "" { + return nil, fmt.Errorf("codex cli error: %s", stderrStr) + } + return nil, fmt.Errorf("codex cli error: %w", err) + } + + return p.parseJSONLEvents(stdout.String()) +} + +// GetDefaultModel returns the default model identifier. +func (p *CodexCliProvider) GetDefaultModel() string { + return "codex-cli" +} + +// buildPrompt converts messages to a prompt string for the Codex CLI. +// System messages are prepended as instructions since Codex CLI has no --system-prompt flag. +func (p *CodexCliProvider) buildPrompt(messages []Message, tools []ToolDefinition) string { + var systemParts []string + var conversationParts []string + + for _, msg := range messages { + switch msg.Role { + case "system": + systemParts = append(systemParts, msg.Content) + case "user": + conversationParts = append(conversationParts, msg.Content) + case "assistant": + conversationParts = append(conversationParts, "Assistant: "+msg.Content) + case "tool": + conversationParts = append(conversationParts, + fmt.Sprintf("[Tool Result for %s]: %s", msg.ToolCallID, msg.Content)) + } + } + + var sb strings.Builder + + if len(systemParts) > 0 { + sb.WriteString("## System Instructions\n\n") + sb.WriteString(strings.Join(systemParts, "\n\n")) + sb.WriteString("\n\n## Task\n\n") + } + + if len(tools) > 0 { + sb.WriteString(p.buildToolsPrompt(tools)) + sb.WriteString("\n\n") + } + + // Simplify single user message (no prefix) + if len(conversationParts) == 1 && len(systemParts) == 0 && len(tools) == 0 { + return conversationParts[0] + } + + sb.WriteString(strings.Join(conversationParts, "\n")) + return sb.String() +} + +// buildToolsPrompt creates a tool definitions section for the prompt. +func (p *CodexCliProvider) buildToolsPrompt(tools []ToolDefinition) string { + var sb strings.Builder + + sb.WriteString("## Available Tools\n\n") + sb.WriteString("When you need to use a tool, respond with ONLY a JSON object:\n\n") + sb.WriteString("```json\n") + sb.WriteString(`{"tool_calls":[{"id":"call_xxx","type":"function","function":{"name":"tool_name","arguments":"{...}"}}]}`) + sb.WriteString("\n```\n\n") + sb.WriteString("CRITICAL: The 'arguments' field MUST be a JSON-encoded STRING.\n\n") + sb.WriteString("### Tool Definitions:\n\n") + + for _, tool := range tools { + if tool.Type != "function" { + continue + } + sb.WriteString(fmt.Sprintf("#### %s\n", tool.Function.Name)) + if tool.Function.Description != "" { + sb.WriteString(fmt.Sprintf("Description: %s\n", tool.Function.Description)) + } + if len(tool.Function.Parameters) > 0 { + paramsJSON, _ := json.Marshal(tool.Function.Parameters) + sb.WriteString(fmt.Sprintf("Parameters:\n```json\n%s\n```\n", string(paramsJSON))) + } + sb.WriteString("\n") + } + + return sb.String() +} + +// codexEvent represents a single JSONL event from `codex exec --json`. +type codexEvent struct { + Type string `json:"type"` + ThreadID string `json:"thread_id,omitempty"` + Message string `json:"message,omitempty"` + Item *codexEventItem `json:"item,omitempty"` + Usage *codexUsage `json:"usage,omitempty"` + Error *codexEventErr `json:"error,omitempty"` +} + +type codexEventItem struct { + ID string `json:"id"` + Type string `json:"type"` + Text string `json:"text,omitempty"` + Command string `json:"command,omitempty"` + Status string `json:"status,omitempty"` + ExitCode *int `json:"exit_code,omitempty"` + Output string `json:"output,omitempty"` +} + +type codexUsage struct { + InputTokens int `json:"input_tokens"` + CachedInputTokens int `json:"cached_input_tokens"` + OutputTokens int `json:"output_tokens"` +} + +type codexEventErr struct { + Message string `json:"message"` +} + +// parseJSONLEvents processes the JSONL output from codex exec --json. +func (p *CodexCliProvider) parseJSONLEvents(output string) (*LLMResponse, error) { + var contentParts []string + var usage *UsageInfo + var lastError string + + scanner := bufio.NewScanner(strings.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + + var event codexEvent + if err := json.Unmarshal([]byte(line), &event); err != nil { + continue // skip malformed lines + } + + switch event.Type { + case "item.completed": + if event.Item != nil && event.Item.Type == "agent_message" && event.Item.Text != "" { + contentParts = append(contentParts, event.Item.Text) + } + case "turn.completed": + if event.Usage != nil { + promptTokens := event.Usage.InputTokens + event.Usage.CachedInputTokens + usage = &UsageInfo{ + PromptTokens: promptTokens, + CompletionTokens: event.Usage.OutputTokens, + TotalTokens: promptTokens + event.Usage.OutputTokens, + } + } + case "error": + lastError = event.Message + case "turn.failed": + if event.Error != nil { + lastError = event.Error.Message + } + } + } + + if lastError != "" && len(contentParts) == 0 { + return nil, fmt.Errorf("codex cli: %s", lastError) + } + + content := strings.Join(contentParts, "\n") + + // Extract tool calls from response text (same pattern as ClaudeCliProvider) + toolCalls := extractToolCallsFromText(content) + + finishReason := "stop" + if len(toolCalls) > 0 { + finishReason = "tool_calls" + content = stripToolCallsFromText(content) + } + + return &LLMResponse{ + Content: strings.TrimSpace(content), + ToolCalls: toolCalls, + FinishReason: finishReason, + Usage: usage, + }, nil +} diff --git a/pkg/providers/codex_cli_provider_test.go b/pkg/providers/codex_cli_provider_test.go new file mode 100644 index 000000000..7e4e1bc15 --- /dev/null +++ b/pkg/providers/codex_cli_provider_test.go @@ -0,0 +1,585 @@ +package providers + +import ( + "context" + "encoding/json" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +// --- JSONL Event Parsing Tests --- + +func TestParseJSONLEvents_AgentMessage(t *testing.T) { + p := &CodexCliProvider{} + events := `{"type":"thread.started","thread_id":"abc-123"} +{"type":"turn.started"} +{"type":"item.completed","item":{"id":"item_1","type":"agent_message","text":"Hello from Codex!"}} +{"type":"turn.completed","usage":{"input_tokens":100,"cached_input_tokens":50,"output_tokens":20}}` + + resp, err := p.parseJSONLEvents(events) + if err != nil { + t.Fatalf("parseJSONLEvents() error: %v", err) + } + if resp.Content != "Hello from Codex!" { + t.Errorf("Content = %q, want %q", resp.Content, "Hello from Codex!") + } + if resp.FinishReason != "stop" { + t.Errorf("FinishReason = %q, want %q", resp.FinishReason, "stop") + } + if resp.Usage == nil { + t.Fatal("Usage should not be nil") + } + if resp.Usage.PromptTokens != 150 { + t.Errorf("PromptTokens = %d, want 150", resp.Usage.PromptTokens) + } + if resp.Usage.CompletionTokens != 20 { + t.Errorf("CompletionTokens = %d, want 20", resp.Usage.CompletionTokens) + } + if resp.Usage.TotalTokens != 170 { + t.Errorf("TotalTokens = %d, want 170", resp.Usage.TotalTokens) + } + if len(resp.ToolCalls) != 0 { + t.Errorf("ToolCalls should be empty, got %d", len(resp.ToolCalls)) + } +} + +func TestParseJSONLEvents_ToolCallExtraction(t *testing.T) { + p := &CodexCliProvider{} + toolCallText := `Let me read that file. +{"tool_calls":[{"id":"call_1","type":"function","function":{"name":"read_file","arguments":"{\"path\":\"/tmp/test.txt\"}"}}]}` + // Build valid JSONL by marshaling the event + item := codexEvent{ + Type: "item.completed", + Item: &codexEventItem{ID: "item_1", Type: "agent_message", Text: toolCallText}, + } + itemJSON, _ := json.Marshal(item) + usageEvt := `{"type":"turn.completed","usage":{"input_tokens":50,"cached_input_tokens":0,"output_tokens":20}}` + events := `{"type":"turn.started"}` + "\n" + string(itemJSON) + "\n" + usageEvt + + resp, err := p.parseJSONLEvents(events) + if err != nil { + t.Fatalf("parseJSONLEvents() error: %v", err) + } + if resp.FinishReason != "tool_calls" { + t.Errorf("FinishReason = %q, want %q", resp.FinishReason, "tool_calls") + } + if len(resp.ToolCalls) != 1 { + t.Fatalf("ToolCalls count = %d, want 1", len(resp.ToolCalls)) + } + if resp.ToolCalls[0].Name != "read_file" { + t.Errorf("ToolCalls[0].Name = %q, want %q", resp.ToolCalls[0].Name, "read_file") + } + if resp.ToolCalls[0].ID != "call_1" { + t.Errorf("ToolCalls[0].ID = %q, want %q", resp.ToolCalls[0].ID, "call_1") + } + if resp.ToolCalls[0].Function.Arguments != `{"path":"/tmp/test.txt"}` { + t.Errorf("ToolCalls[0].Function.Arguments = %q", resp.ToolCalls[0].Function.Arguments) + } + // Content should have the tool call JSON stripped + if strings.Contains(resp.Content, "tool_calls") { + t.Errorf("Content should not contain tool_calls JSON, got: %q", resp.Content) + } +} + +func TestParseJSONLEvents_MultipleToolCalls(t *testing.T) { + p := &CodexCliProvider{} + toolCallText := `{"tool_calls":[{"id":"call_1","type":"function","function":{"name":"read_file","arguments":"{\"path\":\"a.txt\"}"}},{"id":"call_2","type":"function","function":{"name":"write_file","arguments":"{\"path\":\"b.txt\",\"content\":\"hello\"}"}}]}` + item := codexEvent{ + Type: "item.completed", + Item: &codexEventItem{ID: "item_1", Type: "agent_message", Text: toolCallText}, + } + itemJSON, _ := json.Marshal(item) + events := `{"type":"turn.started"}` + "\n" + string(itemJSON) + "\n" + `{"type":"turn.completed"}` + + resp, err := p.parseJSONLEvents(events) + if err != nil { + t.Fatalf("parseJSONLEvents() error: %v", err) + } + if len(resp.ToolCalls) != 2 { + t.Fatalf("ToolCalls count = %d, want 2", len(resp.ToolCalls)) + } + if resp.ToolCalls[0].Name != "read_file" { + t.Errorf("ToolCalls[0].Name = %q, want %q", resp.ToolCalls[0].Name, "read_file") + } + if resp.ToolCalls[1].Name != "write_file" { + t.Errorf("ToolCalls[1].Name = %q, want %q", resp.ToolCalls[1].Name, "write_file") + } + if resp.FinishReason != "tool_calls" { + t.Errorf("FinishReason = %q, want %q", resp.FinishReason, "tool_calls") + } +} + +func TestParseJSONLEvents_MultipleMessages(t *testing.T) { + p := &CodexCliProvider{} + events := `{"type":"turn.started"} +{"type":"item.completed","item":{"id":"item_1","type":"agent_message","text":"First part."}} +{"type":"item.completed","item":{"id":"item_2","type":"command_execution","command":"ls","status":"completed"}} +{"type":"item.completed","item":{"id":"item_3","type":"agent_message","text":"Second part."}} +{"type":"turn.completed"}` + + resp, err := p.parseJSONLEvents(events) + if err != nil { + t.Fatalf("parseJSONLEvents() error: %v", err) + } + if resp.Content != "First part.\nSecond part." { + t.Errorf("Content = %q, want %q", resp.Content, "First part.\nSecond part.") + } +} + +func TestParseJSONLEvents_ErrorEvent(t *testing.T) { + p := &CodexCliProvider{} + events := `{"type":"thread.started","thread_id":"abc"} +{"type":"turn.started"} +{"type":"error","message":"token expired"} +{"type":"turn.failed","error":{"message":"token expired"}}` + + _, err := p.parseJSONLEvents(events) + if err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "token expired") { + t.Errorf("error = %q, want to contain 'token expired'", err.Error()) + } +} + +func TestParseJSONLEvents_TurnFailed(t *testing.T) { + p := &CodexCliProvider{} + events := `{"type":"turn.started"} +{"type":"turn.failed","error":{"message":"rate limit exceeded"}}` + + _, err := p.parseJSONLEvents(events) + if err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "rate limit exceeded") { + t.Errorf("error = %q, want to contain 'rate limit exceeded'", err.Error()) + } +} + +func TestParseJSONLEvents_ErrorWithContent(t *testing.T) { + p := &CodexCliProvider{} + // If there's an error but also content, return the content (partial success) + events := `{"type":"turn.started"} +{"type":"item.completed","item":{"id":"item_1","type":"agent_message","text":"Partial result."}} +{"type":"error","message":"connection reset"} +{"type":"turn.failed","error":{"message":"connection reset"}}` + + resp, err := p.parseJSONLEvents(events) + if err != nil { + t.Fatalf("should not error when content exists: %v", err) + } + if resp.Content != "Partial result." { + t.Errorf("Content = %q, want %q", resp.Content, "Partial result.") + } +} + +func TestParseJSONLEvents_EmptyOutput(t *testing.T) { + p := &CodexCliProvider{} + resp, err := p.parseJSONLEvents("") + if err != nil { + t.Fatalf("empty output should not error: %v", err) + } + if resp.Content != "" { + t.Errorf("Content = %q, want empty", resp.Content) + } +} + +func TestParseJSONLEvents_MalformedLines(t *testing.T) { + p := &CodexCliProvider{} + events := `not json at all +{"type":"item.completed","item":{"id":"item_1","type":"agent_message","text":"Good line."}} +another bad line +{"type":"turn.completed","usage":{"input_tokens":10,"output_tokens":5}}` + + resp, err := p.parseJSONLEvents(events) + if err != nil { + t.Fatalf("should skip malformed lines: %v", err) + } + if resp.Content != "Good line." { + t.Errorf("Content = %q, want %q", resp.Content, "Good line.") + } + if resp.Usage == nil || resp.Usage.TotalTokens != 15 { + t.Errorf("Usage.TotalTokens = %v, want 15", resp.Usage) + } +} + +func TestParseJSONLEvents_CommandExecution(t *testing.T) { + p := &CodexCliProvider{} + events := `{"type":"turn.started"} +{"type":"item.started","item":{"id":"item_1","type":"command_execution","command":"bash -lc ls","status":"in_progress"}} +{"type":"item.completed","item":{"id":"item_1","type":"command_execution","command":"bash -lc ls","status":"completed","exit_code":0,"output":"file1.go\nfile2.go"}} +{"type":"item.completed","item":{"id":"item_2","type":"agent_message","text":"Found 2 files."}} +{"type":"turn.completed"}` + + resp, err := p.parseJSONLEvents(events) + if err != nil { + t.Fatalf("parseJSONLEvents() error: %v", err) + } + // command_execution items should be skipped; only agent_message text is returned + if resp.Content != "Found 2 files." { + t.Errorf("Content = %q, want %q", resp.Content, "Found 2 files.") + } +} + +func TestParseJSONLEvents_NoUsage(t *testing.T) { + p := &CodexCliProvider{} + events := `{"type":"turn.started"} +{"type":"item.completed","item":{"id":"item_1","type":"agent_message","text":"No usage info."}} +{"type":"turn.completed"}` + + resp, err := p.parseJSONLEvents(events) + if err != nil { + t.Fatalf("parseJSONLEvents() error: %v", err) + } + if resp.Usage != nil { + t.Errorf("Usage should be nil when turn.completed has no usage, got %+v", resp.Usage) + } +} + +// --- Prompt Building Tests --- + +func TestBuildPrompt_SystemAsInstructions(t *testing.T) { + p := &CodexCliProvider{} + messages := []Message{ + {Role: "system", Content: "You are helpful."}, + {Role: "user", Content: "Hi there"}, + } + + prompt := p.buildPrompt(messages, nil) + + if !strings.Contains(prompt, "## System Instructions") { + t.Error("prompt should contain '## System Instructions'") + } + if !strings.Contains(prompt, "You are helpful.") { + t.Error("prompt should contain system content") + } + if !strings.Contains(prompt, "## Task") { + t.Error("prompt should contain '## Task'") + } + if !strings.Contains(prompt, "Hi there") { + t.Error("prompt should contain user message") + } +} + +func TestBuildPrompt_NoSystem(t *testing.T) { + p := &CodexCliProvider{} + messages := []Message{ + {Role: "user", Content: "Just a question"}, + } + + prompt := p.buildPrompt(messages, nil) + + if strings.Contains(prompt, "## System Instructions") { + t.Error("prompt should not contain system instructions header") + } + if prompt != "Just a question" { + t.Errorf("prompt = %q, want %q", prompt, "Just a question") + } +} + +func TestBuildPrompt_WithTools(t *testing.T) { + p := &CodexCliProvider{} + messages := []Message{ + {Role: "user", Content: "Get weather"}, + } + tools := []ToolDefinition{ + { + Type: "function", + Function: ToolFunctionDefinition{ + Name: "get_weather", + Description: "Get current weather", + Parameters: map[string]interface{}{ + "type": "object", + "properties": map[string]interface{}{ + "city": map[string]interface{}{"type": "string"}, + }, + }, + }, + }, + } + + prompt := p.buildPrompt(messages, tools) + + if !strings.Contains(prompt, "## Available Tools") { + t.Error("prompt should contain tools section") + } + if !strings.Contains(prompt, "get_weather") { + t.Error("prompt should contain tool name") + } + if !strings.Contains(prompt, "Get current weather") { + t.Error("prompt should contain tool description") + } +} + +func TestBuildPrompt_MultipleMessages(t *testing.T) { + p := &CodexCliProvider{} + messages := []Message{ + {Role: "user", Content: "Hello"}, + {Role: "assistant", Content: "Hi! How can I help?"}, + {Role: "user", Content: "Tell me about Go"}, + } + + prompt := p.buildPrompt(messages, nil) + + if !strings.Contains(prompt, "Hello") { + t.Error("prompt should contain first user message") + } + if !strings.Contains(prompt, "Assistant: Hi! How can I help?") { + t.Error("prompt should contain assistant message with prefix") + } + if !strings.Contains(prompt, "Tell me about Go") { + t.Error("prompt should contain second user message") + } +} + +func TestBuildPrompt_ToolResults(t *testing.T) { + p := &CodexCliProvider{} + messages := []Message{ + {Role: "user", Content: "Weather?"}, + {Role: "tool", Content: `{"temp": 72}`, ToolCallID: "call_1"}, + } + + prompt := p.buildPrompt(messages, nil) + + if !strings.Contains(prompt, "[Tool Result for call_1]") { + t.Error("prompt should contain tool result") + } + if !strings.Contains(prompt, `{"temp": 72}`) { + t.Error("prompt should contain tool result content") + } +} + +func TestBuildPrompt_SystemAndTools(t *testing.T) { + p := &CodexCliProvider{} + messages := []Message{ + {Role: "system", Content: "Be concise."}, + {Role: "user", Content: "Do something"}, + } + tools := []ToolDefinition{ + { + Type: "function", + Function: ToolFunctionDefinition{ + Name: "my_tool", + Description: "A tool", + }, + }, + } + + prompt := p.buildPrompt(messages, tools) + + // System instructions should come first + sysIdx := strings.Index(prompt, "## System Instructions") + toolIdx := strings.Index(prompt, "## Available Tools") + taskIdx := strings.Index(prompt, "## Task") + + if sysIdx == -1 || toolIdx == -1 || taskIdx == -1 { + t.Fatal("prompt should contain all sections") + } + if sysIdx >= taskIdx { + t.Error("system instructions should come before task") + } + if taskIdx >= toolIdx { + t.Error("task section should come before tools in the output") + } +} + +// --- CLI Argument Tests --- + +func TestCodexCliProvider_GetDefaultModel(t *testing.T) { + p := NewCodexCliProvider("") + if got := p.GetDefaultModel(); got != "codex-cli" { + t.Errorf("GetDefaultModel() = %q, want %q", got, "codex-cli") + } +} + +// --- Mock CLI Integration Test --- + +func createMockCodexCLI(t *testing.T, events []string) string { + t.Helper() + tmpDir := t.TempDir() + scriptPath := filepath.Join(tmpDir, "codex") + + var sb strings.Builder + sb.WriteString("#!/bin/bash\n") + for _, event := range events { + sb.WriteString(fmt.Sprintf("echo '%s'\n", event)) + } + + if err := os.WriteFile(scriptPath, []byte(sb.String()), 0755); err != nil { + t.Fatal(err) + } + return scriptPath +} + +func TestCodexCliProvider_MockCLI_Success(t *testing.T) { + scriptPath := createMockCodexCLI(t, []string{ + `{"type":"thread.started","thread_id":"test-123"}`, + `{"type":"turn.started"}`, + `{"type":"item.completed","item":{"id":"item_1","type":"agent_message","text":"Mock response from Codex CLI"}}`, + `{"type":"turn.completed","usage":{"input_tokens":50,"cached_input_tokens":10,"output_tokens":15}}`, + }) + + p := &CodexCliProvider{ + command: scriptPath, + workspace: "", + } + + messages := []Message{{Role: "user", Content: "Hello"}} + resp, err := p.Chat(context.Background(), messages, nil, "", nil) + if err != nil { + t.Fatalf("Chat() error: %v", err) + } + if resp.Content != "Mock response from Codex CLI" { + t.Errorf("Content = %q, want %q", resp.Content, "Mock response from Codex CLI") + } + if resp.Usage == nil { + t.Fatal("Usage should not be nil") + } + if resp.Usage.PromptTokens != 60 { + t.Errorf("PromptTokens = %d, want 60", resp.Usage.PromptTokens) + } + if resp.Usage.CompletionTokens != 15 { + t.Errorf("CompletionTokens = %d, want 15", resp.Usage.CompletionTokens) + } +} + +func TestCodexCliProvider_MockCLI_Error(t *testing.T) { + scriptPath := createMockCodexCLI(t, []string{ + `{"type":"thread.started","thread_id":"test-err"}`, + `{"type":"turn.started"}`, + `{"type":"error","message":"auth token expired"}`, + `{"type":"turn.failed","error":{"message":"auth token expired"}}`, + }) + + p := &CodexCliProvider{ + command: scriptPath, + workspace: "", + } + + messages := []Message{{Role: "user", Content: "Hello"}} + _, err := p.Chat(context.Background(), messages, nil, "", nil) + if err == nil { + t.Fatal("expected error") + } + if !strings.Contains(err.Error(), "auth token expired") { + t.Errorf("error = %q, want to contain 'auth token expired'", err.Error()) + } +} + +func TestCodexCliProvider_MockCLI_WithModel(t *testing.T) { + // Mock script that captures args to verify model flag is passed + tmpDir := t.TempDir() + scriptPath := filepath.Join(tmpDir, "codex") + script := `#!/bin/bash +# Write args to a file for verification +echo "$@" > "` + filepath.Join(tmpDir, "args.txt") + `" +echo '{"type":"item.completed","item":{"id":"1","type":"agent_message","text":"ok"}}' +echo '{"type":"turn.completed"}'` + + if err := os.WriteFile(scriptPath, []byte(script), 0755); err != nil { + t.Fatal(err) + } + + p := &CodexCliProvider{ + command: scriptPath, + workspace: "/tmp/test-workspace", + } + + messages := []Message{{Role: "user", Content: "test"}} + _, err := p.Chat(context.Background(), messages, nil, "gpt-5.2-codex", nil) + if err != nil { + t.Fatalf("Chat() error: %v", err) + } + + // Verify the args + argsData, err := os.ReadFile(filepath.Join(tmpDir, "args.txt")) + if err != nil { + t.Fatalf("reading args: %v", err) + } + args := string(argsData) + + if !strings.Contains(args, "-m gpt-5.2-codex") { + t.Errorf("args should contain model flag, got: %s", args) + } + if !strings.Contains(args, "-C /tmp/test-workspace") { + t.Errorf("args should contain workspace flag, got: %s", args) + } + if !strings.Contains(args, "--json") { + t.Errorf("args should contain --json, got: %s", args) + } + if !strings.Contains(args, "--dangerously-bypass-approvals-and-sandbox") { + t.Errorf("args should contain bypass flag, got: %s", args) + } +} + +func TestCodexCliProvider_MockCLI_ContextCancel(t *testing.T) { + // Script that sleeps forever + tmpDir := t.TempDir() + scriptPath := filepath.Join(tmpDir, "codex") + script := "#!/bin/bash\nsleep 60" + + if err := os.WriteFile(scriptPath, []byte(script), 0755); err != nil { + t.Fatal(err) + } + + p := &CodexCliProvider{ + command: scriptPath, + workspace: "", + } + + ctx, cancel := context.WithCancel(context.Background()) + cancel() // cancel immediately + + messages := []Message{{Role: "user", Content: "test"}} + _, err := p.Chat(ctx, messages, nil, "", nil) + if err == nil { + t.Fatal("expected error on canceled context") + } +} + +func TestCodexCliProvider_EmptyCommand(t *testing.T) { + p := &CodexCliProvider{command: ""} + + messages := []Message{{Role: "user", Content: "test"}} + _, err := p.Chat(context.Background(), messages, nil, "", nil) + if err == nil { + t.Fatal("expected error for empty command") + } +} + +// --- Integration Test (requires real codex CLI with valid auth) --- + +func TestCodexCliProvider_Integration(t *testing.T) { + if os.Getenv("PICOCLAW_INTEGRATION_TESTS") == "" { + t.Skip("skipping integration test (set PICOCLAW_INTEGRATION_TESTS=1 to enable)") + } + + // Verify codex is available + codexPath, err := exec.LookPath("codex") + if err != nil { + t.Skip("codex CLI not found in PATH") + } + + p := &CodexCliProvider{ + command: codexPath, + workspace: "", + } + + messages := []Message{ + {Role: "user", Content: "Respond with just the word 'hello' and nothing else."}, + } + + resp, err := p.Chat(context.Background(), messages, nil, "", nil) + if err != nil { + t.Fatalf("Chat() error: %v", err) + } + + lower := strings.ToLower(strings.TrimSpace(resp.Content)) + if !strings.Contains(lower, "hello") { + t.Errorf("Content = %q, expected to contain 'hello'", resp.Content) + } +} diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go index 60294c451..4cf2c6db2 100644 --- a/pkg/providers/http_provider.go +++ b/pkg/providers/http_provider.go @@ -240,6 +240,9 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { } case "openai", "gpt": if cfg.Providers.OpenAI.APIKey != "" || cfg.Providers.OpenAI.AuthMethod != "" { + if cfg.Providers.OpenAI.AuthMethod == "codex-cli" { + return NewCodexProviderWithTokenSource("", "", CreateCodexCliTokenSource()), nil + } if cfg.Providers.OpenAI.AuthMethod == "oauth" || cfg.Providers.OpenAI.AuthMethod == "token" { return createCodexAuthProvider() } @@ -299,11 +302,17 @@ func CreateProvider(cfg *config.Config) (LLMProvider, error) { } } case "claude-cli", "claudecode", "claude-code": - workspace := cfg.Agents.Defaults.Workspace + workspace := cfg.WorkspacePath() if workspace == "" { workspace = "." } return NewClaudeCliProvider(workspace), nil + case "codex-cli", "codex-code": + workspace := cfg.WorkspacePath() + if workspace == "" { + workspace = "." + } + return NewCodexCliProvider(workspace), nil case "deepseek": if cfg.Providers.DeepSeek.APIKey != "" { apiKey = cfg.Providers.DeepSeek.APIKey diff --git a/pkg/providers/tool_call_extract.go b/pkg/providers/tool_call_extract.go new file mode 100644 index 000000000..97a219283 --- /dev/null +++ b/pkg/providers/tool_call_extract.go @@ -0,0 +1,72 @@ +package providers + +import ( + "encoding/json" + "strings" +) + +// extractToolCallsFromText parses tool call JSON from response text. +// Both ClaudeCliProvider and CodexCliProvider use this to extract +// tool calls that the model outputs in its response text. +func extractToolCallsFromText(text string) []ToolCall { + start := strings.Index(text, `{"tool_calls"`) + if start == -1 { + return nil + } + + end := findMatchingBrace(text, start) + if end == start { + return nil + } + + jsonStr := text[start:end] + + var wrapper struct { + ToolCalls []struct { + ID string `json:"id"` + Type string `json:"type"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } + + if err := json.Unmarshal([]byte(jsonStr), &wrapper); err != nil { + return nil + } + + var result []ToolCall + for _, tc := range wrapper.ToolCalls { + var args map[string]interface{} + json.Unmarshal([]byte(tc.Function.Arguments), &args) + + result = append(result, ToolCall{ + ID: tc.ID, + Type: tc.Type, + Name: tc.Function.Name, + Arguments: args, + Function: &FunctionCall{ + Name: tc.Function.Name, + Arguments: tc.Function.Arguments, + }, + }) + } + + return result +} + +// stripToolCallsFromText removes tool call JSON from response text. +func stripToolCallsFromText(text string) string { + start := strings.Index(text, `{"tool_calls"`) + if start == -1 { + return text + } + + end := findMatchingBrace(text, start) + if end == start { + return text + } + + return strings.TrimSpace(text[:start] + text[end:]) +} diff --git a/pkg/tools/web_test.go b/pkg/tools/web_test.go index 988eada16..a526ea34a 100644 --- a/pkg/tools/web_test.go +++ b/pkg/tools/web_test.go @@ -173,19 +173,23 @@ func TestWebTool_WebFetch_Truncation(t *testing.T) { } } -// TestWebTool_WebSearch_NoApiKey verifies that nil is returned when no provider is configured +// TestWebTool_WebSearch_NoApiKey verifies that no tool is created when API key is missing func TestWebTool_WebSearch_NoApiKey(t *testing.T) { - tool := NewWebSearchTool(WebSearchToolOptions{BraveAPIKey: "", BraveMaxResults: 5}) - - // Should return nil when no provider is enabled + tool := NewWebSearchTool(WebSearchToolOptions{BraveEnabled: true, BraveAPIKey: ""}) if tool != nil { - t.Errorf("Expected nil when no search provider is configured") + t.Errorf("Expected nil tool when Brave API key is empty") + } + + // Also nil when nothing is enabled + tool = NewWebSearchTool(WebSearchToolOptions{}) + if tool != nil { + t.Errorf("Expected nil tool when no provider is enabled") } } // TestWebTool_WebSearch_MissingQuery verifies error handling for missing query func TestWebTool_WebSearch_MissingQuery(t *testing.T) { - tool := NewWebSearchTool(WebSearchToolOptions{BraveAPIKey: "test-key", BraveMaxResults: 5, BraveEnabled: true}) + tool := NewWebSearchTool(WebSearchToolOptions{BraveEnabled: true, BraveAPIKey: "test-key", BraveMaxResults: 5}) ctx := context.Background() args := map[string]interface{}{} From 0cb9387cf8f1560fa9782921f8d13655103787aa Mon Sep 17 00:00:00 2001 From: Zenix Date: Mon, 16 Feb 2026 12:46:02 +0900 Subject: [PATCH 35/46] fix: codex agent 400 error (#102) --- pkg/auth/oauth.go | 70 +++++++-- pkg/auth/oauth_test.go | 97 +++++++++++++ pkg/providers/codex_provider.go | 132 +++++++++++++++-- pkg/providers/codex_provider_test.go | 209 ++++++++++++++++++++++++++- 4 files changed, 480 insertions(+), 28 deletions(-) diff --git a/pkg/auth/oauth.go b/pkg/auth/oauth.go index 1a6589641..dcd91bebd 100644 --- a/pkg/auth/oauth.go +++ b/pkg/auth/oauth.go @@ -281,7 +281,17 @@ func RefreshAccessToken(cred *AuthCredential, cfg OAuthProviderConfig) (*AuthCre return nil, fmt.Errorf("token refresh failed: %s", string(body)) } - return parseTokenResponse(body, cred.Provider) + refreshed, err := parseTokenResponse(body, cred.Provider) + if err != nil { + return nil, err + } + if refreshed.RefreshToken == "" { + refreshed.RefreshToken = cred.RefreshToken + } + if refreshed.AccountID == "" { + refreshed.AccountID = cred.AccountID + } + return refreshed, nil } func BuildAuthorizeURL(cfg OAuthProviderConfig, pkce PKCECodes, state, redirectURI string) string { @@ -300,6 +310,9 @@ func buildAuthorizeURL(cfg OAuthProviderConfig, pkce PKCECodes, state, redirectU "codex_cli_simplified_flow": {"true"}, "state": {state}, } + if strings.Contains(strings.ToLower(cfg.Issuer), "auth.openai.com") { + params.Set("originator", "picoclaw") + } if cfg.Originator != "" { params.Set("originator", cfg.Originator) } @@ -357,7 +370,9 @@ func parseTokenResponse(body []byte, provider string) (*AuthCredential, error) { AuthMethod: "oauth", } - if accountID := extractAccountID(tokenResp.AccessToken); accountID != "" { + if accountID := extractAccountID(tokenResp.IDToken); accountID != "" { + cred.AccountID = accountID + } else 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. @@ -367,12 +382,45 @@ func parseTokenResponse(body []byte, provider string) (*AuthCredential, error) { return cred, nil } -func extractAccountID(accessToken string) string { - parts := strings.Split(accessToken, ".") - if len(parts) < 2 { +func extractAccountID(token string) string { + claims, err := parseJWTClaims(token) + if err != nil { return "" } + if accountID, ok := claims["chatgpt_account_id"].(string); ok && accountID != "" { + return accountID + } + + if accountID, ok := claims["https://api.openai.com/auth.chatgpt_account_id"].(string); ok && accountID != "" { + return accountID + } + + if authClaim, ok := claims["https://api.openai.com/auth"].(map[string]interface{}); ok { + if accountID, ok := authClaim["chatgpt_account_id"].(string); ok && accountID != "" { + return accountID + } + } + + if orgs, ok := claims["organizations"].([]interface{}); ok { + for _, org := range orgs { + if orgMap, ok := org.(map[string]interface{}); ok { + if accountID, ok := orgMap["id"].(string); ok && accountID != "" { + return accountID + } + } + } + } + + return "" +} + +func parseJWTClaims(token string) (map[string]interface{}, error) { + parts := strings.Split(token, ".") + if len(parts) < 2 { + return nil, fmt.Errorf("token is not a JWT") + } + payload := parts[1] switch len(payload) % 4 { case 2: @@ -383,21 +431,15 @@ func extractAccountID(accessToken string) string { decoded, err := base64URLDecode(payload) if err != nil { - return "" + return nil, err } var claims map[string]interface{} if err := json.Unmarshal(decoded, &claims); err != nil { - return "" + return nil, err } - if authClaim, ok := claims["https://api.openai.com/auth"].(map[string]interface{}); ok { - if accountID, ok := authClaim["chatgpt_account_id"].(string); ok { - return accountID - } - } - - return "" + return claims, nil } func base64URLDecode(s string) ([]byte, error) { diff --git a/pkg/auth/oauth_test.go b/pkg/auth/oauth_test.go index 0d2ccc9a5..5deb17805 100644 --- a/pkg/auth/oauth_test.go +++ b/pkg/auth/oauth_test.go @@ -5,10 +5,23 @@ import ( "encoding/json" "net/http" "net/http/httptest" + "net/url" "strings" "testing" ) +func makeJWTForClaims(t *testing.T, claims map[string]interface{}) string { + t.Helper() + + header := base64.RawURLEncoding.EncodeToString([]byte(`{"alg":"none","typ":"JWT"}`)) + payloadJSON, err := json.Marshal(claims) + if err != nil { + t.Fatalf("marshal claims: %v", err) + } + payload := base64.RawURLEncoding.EncodeToString(payloadJSON) + return header + "." + payload + ".sig" +} + func TestBuildAuthorizeURL(t *testing.T) { cfg := OAuthProviderConfig{ Issuer: "https://auth.example.com", @@ -53,6 +66,28 @@ func TestBuildAuthorizeURL(t *testing.T) { } } +func TestBuildAuthorizeURLOpenAIExtras(t *testing.T) { + cfg := OpenAIOAuthConfig() + pkce := PKCECodes{CodeVerifier: "test-verifier", CodeChallenge: "test-challenge"} + + u := BuildAuthorizeURL(cfg, pkce, "test-state", "http://localhost:1455/auth/callback") + parsed, err := url.Parse(u) + if err != nil { + t.Fatalf("url.Parse() error: %v", err) + } + q := parsed.Query() + + if q.Get("id_token_add_organizations") != "true" { + t.Errorf("id_token_add_organizations = %q, want true", q.Get("id_token_add_organizations")) + } + if q.Get("codex_cli_simplified_flow") != "true" { + t.Errorf("codex_cli_simplified_flow = %q, want true", q.Get("codex_cli_simplified_flow")) + } + if q.Get("originator") != "codex_cli_rs" { + t.Errorf("originator = %q, want codex_cli_rs", q.Get("originator")) + } +} + func TestParseTokenResponse(t *testing.T) { resp := map[string]interface{}{ "access_token": "test-access-token", @@ -84,6 +119,37 @@ func TestParseTokenResponse(t *testing.T) { } } +func TestParseTokenResponseExtractsAccountIDFromIDToken(t *testing.T) { + idToken := makeJWTForClaims(t, map[string]interface{}{"chatgpt_account_id": "acc-id-from-id-token"}) + resp := map[string]interface{}{ + "access_token": "opaque-access-token", + "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-id-from-id-token" { + t.Errorf("AccountID = %q, want %q", cred.AccountID, "acc-id-from-id-token") + } +} + +func TestExtractAccountIDFromOrganizationsFallback(t *testing.T) { + token := makeJWTForClaims(t, map[string]interface{}{ + "organizations": []interface{}{ + map[string]interface{}{"id": "org_from_orgs"}, + }, + }) + + if got := extractAccountID(token); got != "org_from_orgs" { + t.Errorf("extractAccountID() = %q, want %q", got, "org_from_orgs") + } +} + func TestParseTokenResponseNoAccessToken(t *testing.T) { body := []byte(`{"refresh_token": "test"}`) _, err := parseTokenResponse(body, "openai") @@ -222,6 +288,37 @@ func TestRefreshAccessTokenNoRefreshToken(t *testing.T) { } } +func TestRefreshAccessTokenPreservesRefreshAndAccountID(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + resp := map[string]interface{}{ + "access_token": "new-access-token-only", + "expires_in": 3600, + } + json.NewEncoder(w).Encode(resp) + })) + defer server.Close() + + cfg := OAuthProviderConfig{Issuer: server.URL, ClientID: "test-client"} + cred := &AuthCredential{ + AccessToken: "old-access", + RefreshToken: "existing-refresh", + AccountID: "acc_existing", + Provider: "openai", + AuthMethod: "oauth", + } + + refreshed, err := RefreshAccessToken(cred, cfg) + if err != nil { + t.Fatalf("RefreshAccessToken() error: %v", err) + } + if refreshed.RefreshToken != "existing-refresh" { + t.Errorf("RefreshToken = %q, want %q", refreshed.RefreshToken, "existing-refresh") + } + if refreshed.AccountID != "acc_existing" { + t.Errorf("AccountID = %q, want %q", refreshed.AccountID, "acc_existing") + } +} + func TestOpenAIOAuthConfig(t *testing.T) { cfg := OpenAIOAuthConfig() if cfg.Issuer != "https://auth.openai.com" { diff --git a/pkg/providers/codex_provider.go b/pkg/providers/codex_provider.go index c0b10bd5b..6dff3a52e 100644 --- a/pkg/providers/codex_provider.go +++ b/pkg/providers/codex_provider.go @@ -3,6 +3,7 @@ package providers import ( "context" "encoding/json" + "errors" "fmt" "strings" @@ -10,8 +11,12 @@ import ( "github.com/openai/openai-go/v3/option" "github.com/openai/openai-go/v3/responses" "github.com/sipeed/picoclaw/pkg/auth" + "github.com/sipeed/picoclaw/pkg/logger" ) +const codexDefaultModel = "gpt-5.2" +const codexDefaultInstructions = "You are Codex, a coding assistant." + type CodexProvider struct { client *openai.Client accountID string @@ -24,6 +29,8 @@ func NewCodexProvider(token, accountID string) *CodexProvider { opts := []option.RequestOption{ option.WithBaseURL("https://chatgpt.com/backend-api/codex"), option.WithAPIKey(token), + option.WithHeader("originator", "codex_cli_rs"), + option.WithHeader("OpenAI-Beta", "responses=experimental"), } if accountID != "" { opts = append(opts, option.WithHeader("Chatgpt-Account-Id", accountID)) @@ -43,6 +50,15 @@ func NewCodexProviderWithTokenSource(token, accountID string, tokenSource func() func (p *CodexProvider) Chat(ctx context.Context, messages []Message, tools []ToolDefinition, model string, options map[string]interface{}) (*LLMResponse, error) { var opts []option.RequestOption + accountID := p.accountID + resolvedModel, fallbackReason := resolveCodexModel(model) + if fallbackReason != "" { + logger.WarnCF("provider.codex", "Requested model is not compatible with Codex backend, using fallback", map[string]interface{}{ + "requested_model": model, + "resolved_model": resolvedModel, + "reason": fallbackReason, + }) + } if p.tokenSource != nil { tok, accID, err := p.tokenSource() if err != nil { @@ -50,22 +66,120 @@ func (p *CodexProvider) Chat(ctx context.Context, messages []Message, tools []To } opts = append(opts, option.WithAPIKey(tok)) if accID != "" { - opts = append(opts, option.WithHeader("Chatgpt-Account-Id", accID)) + accountID = accID } } + if accountID != "" { + opts = append(opts, option.WithHeader("Chatgpt-Account-Id", accountID)) + } else { + logger.WarnCF("provider.codex", "No account id found for Codex request; backend may reject with 400", map[string]interface{}{ + "requested_model": model, + "resolved_model": resolvedModel, + }) + } - params := buildCodexParams(messages, tools, model, options) + params := buildCodexParams(messages, tools, resolvedModel, options) - resp, err := p.client.Responses.New(ctx, params, opts...) + stream := p.client.Responses.NewStreaming(ctx, params, opts...) + defer stream.Close() + + var resp *responses.Response + for stream.Next() { + evt := stream.Current() + if evt.Type == "response.completed" || evt.Type == "response.failed" || evt.Type == "response.incomplete" { + evtResp := evt.Response + if evtResp.ID != "" { + copy := evtResp + resp = © + } + } + } + err := stream.Err() if err != nil { + fields := map[string]interface{}{ + "requested_model": model, + "resolved_model": resolvedModel, + "messages_count": len(messages), + "tools_count": len(tools), + "account_id_present": accountID != "", + "error": err.Error(), + } + var apiErr *openai.Error + if errors.As(err, &apiErr) { + fields["status_code"] = apiErr.StatusCode + fields["api_type"] = apiErr.Type + fields["api_code"] = apiErr.Code + fields["api_param"] = apiErr.Param + fields["api_message"] = apiErr.Message + if apiErr.StatusCode == 400 { + fields["hint"] = "verify account id header and model compatibility for codex backend" + } + if apiErr.Response != nil { + fields["request_id"] = apiErr.Response.Header.Get("x-request-id") + } + } + logger.ErrorCF("provider.codex", "Codex API call failed", fields) return nil, fmt.Errorf("codex API call: %w", err) } + if resp == nil { + fields := map[string]interface{}{ + "requested_model": model, + "resolved_model": resolvedModel, + "messages_count": len(messages), + "tools_count": len(tools), + "account_id_present": accountID != "", + } + logger.ErrorCF("provider.codex", "Codex stream ended without completed response event", fields) + return nil, fmt.Errorf("codex API call: stream ended without completed response") + } return parseCodexResponse(resp), nil } func (p *CodexProvider) GetDefaultModel() string { - return "gpt-4o" + return codexDefaultModel +} + +func resolveCodexModel(model string) (string, string) { + m := strings.ToLower(strings.TrimSpace(model)) + if m == "" { + return codexDefaultModel, "empty model" + } + + if strings.HasPrefix(m, "openai/") { + m = strings.TrimPrefix(m, "openai/") + } else if strings.Contains(m, "/") { + return codexDefaultModel, "non-openai model namespace" + } + + unsupportedPrefixes := []string{ + "glm", + "claude", + "anthropic", + "gemini", + "google", + "moonshot", + "kimi", + "qwen", + "deepseek", + "llama", + "meta-llama", + "mistral", + "grok", + "xai", + "zhipu", + } + for _, prefix := range unsupportedPrefixes { + if strings.HasPrefix(m, prefix) { + return codexDefaultModel, "unsupported model prefix" + } + } + + if strings.HasPrefix(m, "gpt-") || strings.HasPrefix(m, "o3") || strings.HasPrefix(m, "o4") { + return m, "" + } + + return codexDefaultModel, "unsupported model family" } func buildCodexParams(messages []Message, tools []ToolDefinition, model string, options map[string]interface{}) responses.ResponseNewParams { @@ -135,7 +249,8 @@ func buildCodexParams(messages []Message, tools []ToolDefinition, model string, Input: responses.ResponseNewParamsInputUnion{ OfInputItemList: inputItems, }, - Store: openai.Opt(false), + Instructions: openai.Opt(instructions), + Store: openai.Opt(false), } if instructions != "" { @@ -149,10 +264,6 @@ func buildCodexParams(messages []Message, tools []ToolDefinition, model string, params.MaxOutputTokens = openai.Opt(int64(maxTokens)) } - if temp, ok := options["temperature"].(float64); ok { - params.Temperature = openai.Opt(temp) - } - if len(tools) > 0 { params.Tools = translateToolsForCodex(tools) } @@ -242,6 +353,9 @@ func createCodexTokenSource() func() (string, string, error) { if err != nil { return "", "", fmt.Errorf("refreshing token: %w", err) } + if refreshed.AccountID == "" { + refreshed.AccountID = cred.AccountID + } if err := auth.SetCredential("openai", refreshed); err != nil { return "", "", fmt.Errorf("saving refreshed token: %w", err) } diff --git a/pkg/providers/codex_provider_test.go b/pkg/providers/codex_provider_test.go index 1a5a8cafa..317b1a5de 100644 --- a/pkg/providers/codex_provider_test.go +++ b/pkg/providers/codex_provider_test.go @@ -2,6 +2,7 @@ package providers import ( "encoding/json" + "fmt" "net/http" "net/http/httptest" "testing" @@ -16,7 +17,8 @@ func TestBuildCodexParams_BasicMessage(t *testing.T) { {Role: "user", Content: "Hello"}, } params := buildCodexParams(messages, nil, "gpt-4o", map[string]interface{}{ - "max_tokens": 2048, + "max_tokens": 2048, + "temperature": 0.7, }) if params.Model != "gpt-4o" { t.Errorf("Model = %q, want %q", params.Model, "gpt-4o") @@ -203,6 +205,16 @@ func TestCodexProvider_ChatRoundTrip(t *testing.T) { return } + var reqBody map[string]interface{} + if err := json.NewDecoder(r.Body).Decode(&reqBody); err != nil { + http.Error(w, "invalid json", http.StatusBadRequest) + return + } + if reqBody["stream"] != true { + http.Error(w, "stream must be true", http.StatusBadRequest) + return + } + resp := map[string]interface{}{ "id": "resp_test", "object": "response", @@ -226,8 +238,7 @@ func TestCodexProvider_ChatRoundTrip(t *testing.T) { "output_tokens_details": map[string]interface{}{"reasoning_tokens": 0}, }, } - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(resp) + writeCompletedSSE(w, resp) })) defer server.Close() @@ -250,10 +261,185 @@ func TestCodexProvider_ChatRoundTrip(t *testing.T) { } } +func TestCodexProvider_ChatRoundTrip_TokenSourceFallbackAccountID(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/responses" { + http.Error(w, "not found: "+r.URL.Path, http.StatusNotFound) + return + } + if r.Header.Get("Authorization") != "Bearer refreshed-token" { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + if r.Header.Get("Chatgpt-Account-Id") != "acc-123" { + http.Error(w, "missing account id", http.StatusBadRequest) + return + } + + var reqBody map[string]interface{} + if err := json.NewDecoder(r.Body).Decode(&reqBody); err != nil { + http.Error(w, "invalid json", http.StatusBadRequest) + return + } + if _, ok := reqBody["instructions"]; !ok { + http.Error(w, "missing instructions", http.StatusBadRequest) + return + } + if reqBody["instructions"] == "" { + http.Error(w, "instructions must not be empty", http.StatusBadRequest) + return + } + if _, ok := reqBody["temperature"]; ok { + http.Error(w, "temperature is not supported", http.StatusBadRequest) + return + } + if reqBody["stream"] != true { + http.Error(w, "stream must be true", http.StatusBadRequest) + return + } + + resp := map[string]interface{}{ + "id": "resp_test", + "object": "response", + "status": "completed", + "output": []map[string]interface{}{ + { + "id": "msg_1", + "type": "message", + "role": "assistant", + "status": "completed", + "content": []map[string]interface{}{ + {"type": "output_text", "text": "Hi from Codex!"}, + }, + }, + }, + "usage": map[string]interface{}{ + "input_tokens": 8, + "output_tokens": 4, + "total_tokens": 12, + "input_tokens_details": map[string]interface{}{"cached_tokens": 0}, + "output_tokens_details": map[string]interface{}{"reasoning_tokens": 0}, + }, + } + writeCompletedSSE(w, resp) + })) + defer server.Close() + + provider := NewCodexProvider("stale-token", "acc-123") + provider.client = createOpenAITestClient(server.URL, "stale-token", "") + provider.tokenSource = func() (string, string, error) { + return "refreshed-token", "", nil + } + + messages := []Message{{Role: "user", Content: "Hello"}} + resp, err := provider.Chat(t.Context(), messages, nil, "gpt-4o", map[string]interface{}{"temperature": 0.7}) + if err != nil { + t.Fatalf("Chat() error: %v", err) + } + if resp.Content != "Hi from Codex!" { + t.Errorf("Content = %q, want %q", resp.Content, "Hi from Codex!") + } +} + +func TestCodexProvider_ChatRoundTrip_ModelFallbackFromUnsupported(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/responses" { + http.Error(w, "not found: "+r.URL.Path, http.StatusNotFound) + return + } + + var reqBody map[string]interface{} + if err := json.NewDecoder(r.Body).Decode(&reqBody); err != nil { + http.Error(w, "invalid json", http.StatusBadRequest) + return + } + if reqBody["model"] != codexDefaultModel { + http.Error(w, "unsupported model", http.StatusBadRequest) + return + } + if reqBody["stream"] != true { + http.Error(w, "stream must be true", http.StatusBadRequest) + return + } + if reqBody["instructions"] != codexDefaultInstructions { + http.Error(w, "missing default instructions", http.StatusBadRequest) + return + } + + resp := map[string]interface{}{ + "id": "resp_test", + "object": "response", + "status": "completed", + "output": []map[string]interface{}{ + { + "id": "msg_1", + "type": "message", + "role": "assistant", + "status": "completed", + "content": []map[string]interface{}{ + {"type": "output_text", "text": "Hi from Codex!"}, + }, + }, + }, + "usage": map[string]interface{}{ + "input_tokens": 8, + "output_tokens": 4, + "total_tokens": 12, + "input_tokens_details": map[string]interface{}{"cached_tokens": 0}, + "output_tokens_details": map[string]interface{}{"reasoning_tokens": 0}, + }, + } + writeCompletedSSE(w, resp) + })) + defer server.Close() + + provider := NewCodexProvider("test-token", "acc-123") + provider.client = createOpenAITestClient(server.URL, "test-token", "acc-123") + + messages := []Message{{Role: "user", Content: "Hello"}} + resp, err := provider.Chat(t.Context(), messages, nil, "gpt-5.2", nil) + if err != nil { + t.Fatalf("Chat() error: %v", err) + } + if resp.Content != "Hi from Codex!" { + t.Errorf("Content = %q, want %q", resp.Content, "Hi from Codex!") + } +} + func TestCodexProvider_GetDefaultModel(t *testing.T) { p := NewCodexProvider("test-token", "") - if got := p.GetDefaultModel(); got != "gpt-4o" { - t.Errorf("GetDefaultModel() = %q, want %q", got, "gpt-4o") + if got := p.GetDefaultModel(); got != codexDefaultModel { + t.Errorf("GetDefaultModel() = %q, want %q", got, codexDefaultModel) + } +} + +func TestResolveCodexModel(t *testing.T) { + tests := []struct { + name string + input string + wantModel string + wantFallback bool + }{ + {name: "empty", input: "", wantModel: codexDefaultModel, wantFallback: true}, + {name: "unsupported namespace", input: "anthropic/claude-3.5", wantModel: codexDefaultModel, wantFallback: true}, + {name: "non-openai prefixed", input: "glm-4.7", wantModel: codexDefaultModel, wantFallback: true}, + {name: "openai prefix", input: "openai/gpt-5.2", wantModel: "gpt-5.2", wantFallback: false}, + {name: "direct gpt", input: "gpt-4o", wantModel: "gpt-4o", wantFallback: false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotModel, reason := resolveCodexModel(tt.input) + if gotModel != tt.wantModel { + t.Fatalf("resolveCodexModel(%q) model = %q, want %q", tt.input, gotModel, tt.wantModel) + } + if tt.wantFallback && reason == "" { + t.Fatalf("resolveCodexModel(%q) expected fallback reason", tt.input) + } + if !tt.wantFallback && reason != "" { + t.Fatalf("resolveCodexModel(%q) unexpected fallback reason: %q", tt.input, reason) + } + }) } } @@ -268,3 +454,16 @@ func createOpenAITestClient(baseURL, token, accountID string) *openai.Client { c := openai.NewClient(opts...) return &c } + +func writeCompletedSSE(w http.ResponseWriter, response map[string]interface{}) { + event := map[string]interface{}{ + "type": "response.completed", + "sequence_number": 1, + "response": response, + } + b, _ := json.Marshal(event) + w.Header().Set("Content-Type", "text/event-stream") + fmt.Fprintf(w, "event: response.completed\n") + fmt.Fprintf(w, "data: %s\n\n", string(b)) + fmt.Fprintf(w, "data: [DONE]\n\n") +} From 341dbd30073270117a1f3fd1e019e519781613e3 Mon Sep 17 00:00:00 2001 From: fahadahmadansari111 <57217561+fahadahmadansari111@users.noreply.github.com> Date: Mon, 16 Feb 2026 09:23:11 +0530 Subject: [PATCH 36/46] Add health check endpoints (/health and /ready) for container orchestration liveness and readiness probes. (#104) * added health endpoint * formatted files --------- Co-authored-by: lxowalle <83055338+lxowalle@users.noreply.github.com> --- Dockerfile | 4 ++ cmd/picoclaw/main.go | 11 +++ pkg/health/server.go | 164 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 pkg/health/server.go diff --git a/Dockerfile b/Dockerfile index 433d962f2..dd98ec0bd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,6 +22,10 @@ FROM alpine:3.23 RUN apk add --no-cache ca-certificates tzdata curl +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -q --spider http://localhost:18790/health || exit 1 + # Copy binary COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index 2129662d7..cd3637a1b 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -13,6 +13,7 @@ import ( "fmt" "io" "io/fs" + "net/http" "os" "os/signal" "path/filepath" @@ -28,6 +29,7 @@ import ( "github.com/sipeed/picoclaw/pkg/config" "github.com/sipeed/picoclaw/pkg/cron" "github.com/sipeed/picoclaw/pkg/devices" + "github.com/sipeed/picoclaw/pkg/health" "github.com/sipeed/picoclaw/pkg/heartbeat" "github.com/sipeed/picoclaw/pkg/logger" "github.com/sipeed/picoclaw/pkg/migrate" @@ -658,6 +660,14 @@ func gatewayCmd() { fmt.Printf("Error starting channels: %v\n", err) } + healthServer := health.NewServer(cfg.Gateway.Host, cfg.Gateway.Port) + go func() { + if err := healthServer.Start(); err != nil && err != http.ErrServerClosed { + logger.ErrorCF("health", "Health server error", map[string]interface{}{"error": err.Error()}) + } + }() + fmt.Printf("✓ Health endpoints available at http://%s:%d/health and /ready\n", cfg.Gateway.Host, cfg.Gateway.Port) + go agentLoop.Run(ctx) sigChan := make(chan os.Signal, 1) @@ -666,6 +676,7 @@ func gatewayCmd() { fmt.Println("\nShutting down...") cancel() + healthServer.Stop(context.Background()) deviceService.Stop() heartbeatService.Stop() cronService.Stop() diff --git a/pkg/health/server.go b/pkg/health/server.go new file mode 100644 index 000000000..77b36034d --- /dev/null +++ b/pkg/health/server.go @@ -0,0 +1,164 @@ +package health + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "sync" + "time" +) + +type Server struct { + server *http.Server + mu sync.RWMutex + ready bool + checks map[string]Check + startTime time.Time +} + +type Check struct { + Name string `json:"name"` + Status string `json:"status"` + Message string `json:"message,omitempty"` + Timestamp time.Time `json:"timestamp"` +} + +type StatusResponse struct { + Status string `json:"status"` + Uptime string `json:"uptime"` + Checks map[string]Check `json:"checks,omitempty"` +} + +func NewServer(host string, port int) *Server { + mux := http.NewServeMux() + s := &Server{ + ready: false, + checks: make(map[string]Check), + startTime: time.Now(), + } + + mux.HandleFunc("/health", s.healthHandler) + mux.HandleFunc("/ready", s.readyHandler) + + addr := fmt.Sprintf("%s:%d", host, port) + s.server = &http.Server{ + Addr: addr, + Handler: mux, + ReadTimeout: 5 * time.Second, + WriteTimeout: 5 * time.Second, + } + + return s +} + +func (s *Server) Start() error { + s.mu.Lock() + s.ready = true + s.mu.Unlock() + return s.server.ListenAndServe() +} + +func (s *Server) StartContext(ctx context.Context) error { + s.mu.Lock() + s.ready = true + s.mu.Unlock() + + errCh := make(chan error, 1) + go func() { + errCh <- s.server.ListenAndServe() + }() + + select { + case err := <-errCh: + return err + case <-ctx.Done(): + return s.server.Shutdown(context.Background()) + } +} + +func (s *Server) Stop(ctx context.Context) error { + s.mu.Lock() + s.ready = false + s.mu.Unlock() + return s.server.Shutdown(ctx) +} + +func (s *Server) SetReady(ready bool) { + s.mu.Lock() + s.ready = ready + s.mu.Unlock() +} + +func (s *Server) RegisterCheck(name string, checkFn func() (bool, string)) { + s.mu.Lock() + defer s.mu.Unlock() + + status, msg := checkFn() + s.checks[name] = Check{ + Name: name, + Status: statusString(status), + Message: msg, + Timestamp: time.Now(), + } +} + +func (s *Server) healthHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + + uptime := time.Since(s.startTime) + resp := StatusResponse{ + Status: "ok", + Uptime: uptime.String(), + } + + json.NewEncoder(w).Encode(resp) +} + +func (s *Server) readyHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + + s.mu.RLock() + ready := s.ready + checks := make(map[string]Check) + for k, v := range s.checks { + checks[k] = v + } + s.mu.RUnlock() + + if !ready { + w.WriteHeader(http.StatusServiceUnavailable) + json.NewEncoder(w).Encode(StatusResponse{ + Status: "not ready", + Checks: checks, + }) + return + } + + for _, check := range checks { + if check.Status == "fail" { + w.WriteHeader(http.StatusServiceUnavailable) + json.NewEncoder(w).Encode(StatusResponse{ + Status: "not ready", + Checks: checks, + }) + return + } + } + + w.WriteHeader(http.StatusOK) + uptime := time.Since(s.startTime) + json.NewEncoder(w).Encode(StatusResponse{ + Status: "ready", + Uptime: uptime.String(), + Checks: checks, + }) +} + +func statusString(ok bool) string { + if ok { + return "ok" + } + return "fail" +} From 32cb8fdc124a0e892b6de7fd20e9e74d2e5c758f Mon Sep 17 00:00:00 2001 From: Huaaudio <161028864+Huaaudio@users.noreply.github.com> Date: Mon, 16 Feb 2026 06:39:26 +0100 Subject: [PATCH 37/46] Feat: Discord message length check and auto split (#143) * feat: discord message auto split * make fmt * chore: remove failing discord_test.go --------- Co-authored-by: Hua --- pkg/channels/discord.go | 146 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 144 insertions(+), 2 deletions(-) diff --git a/pkg/channels/discord.go b/pkg/channels/discord.go index cb8014086..00aa8ab4d 100644 --- a/pkg/channels/discord.go +++ b/pkg/channels/discord.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "os" + "strings" "time" "github.com/bwmarrin/discordgo" @@ -100,15 +101,156 @@ func (c *DiscordChannel) Send(ctx context.Context, msg bus.OutboundMessage) erro return fmt.Errorf("channel ID is empty") } - message := msg.Content + runes := []rune(msg.Content) + if len(runes) == 0 { + return nil + } + chunks := splitMessage(msg.Content, 1500) // Discord has a limit of 2000 characters per message, leave 500 for natural split e.g. code blocks + + for _, chunk := range chunks { + if err := c.sendChunk(ctx, channelID, chunk); err != nil { + return err + } + } + + return nil +} + +// splitMessage splits long messages into chunks, preserving code block integrity +// Uses natural boundaries (newlines, spaces) and extends messages slightly to avoid breaking code blocks +func splitMessage(content string, limit int) []string { + var messages []string + + for len(content) > 0 { + if len(content) <= limit { + messages = append(messages, content) + break + } + + msgEnd := limit + + // Find natural split point within the limit + msgEnd = findLastNewline(content[:limit], 200) + if msgEnd <= 0 { + msgEnd = findLastSpace(content[:limit], 100) + } + if msgEnd <= 0 { + msgEnd = limit + } + + // Check if this would end with an incomplete code block + candidate := content[:msgEnd] + unclosedIdx := findLastUnclosedCodeBlock(candidate) + + if unclosedIdx >= 0 { + // Message would end with incomplete code block + // Try to extend to include the closing ``` (with some buffer) + extendedLimit := limit + 500 // Allow 500 char buffer for code blocks + if len(content) > extendedLimit { + closingIdx := findNextClosingCodeBlock(content, msgEnd) + if closingIdx > 0 && closingIdx <= extendedLimit { + // Extend to include the closing ``` + msgEnd = closingIdx + } else { + // Can't find closing, split before the code block + msgEnd = findLastNewline(content[:unclosedIdx], 200) + if msgEnd <= 0 { + msgEnd = findLastSpace(content[:unclosedIdx], 100) + } + if msgEnd <= 0 { + msgEnd = unclosedIdx + } + } + } else { + // Remaining content fits within extended limit + msgEnd = len(content) + } + } + + if msgEnd <= 0 { + msgEnd = limit + } + + messages = append(messages, content[:msgEnd]) + content = strings.TrimSpace(content[msgEnd:]) + } + + return messages +} + +// findLastUnclosedCodeBlock finds the last opening ``` that doesn't have a closing ``` +// Returns the position of the opening ``` or -1 if all code blocks are complete +func findLastUnclosedCodeBlock(text string) int { + count := 0 + lastOpenIdx := -1 + + for i := 0; i < len(text); i++ { + if i+2 < len(text) && text[i] == '`' && text[i+1] == '`' && text[i+2] == '`' { + if count == 0 { + lastOpenIdx = i + } + count++ + i += 2 + } + } + + // If odd number of ``` markers, last one is unclosed + if count%2 == 1 { + return lastOpenIdx + } + return -1 +} + +// findNextClosingCodeBlock finds the next closing ``` starting from a position +// Returns the position after the closing ``` or -1 if not found +func findNextClosingCodeBlock(text string, startIdx int) int { + for i := startIdx; i < len(text); i++ { + if i+2 < len(text) && text[i] == '`' && text[i+1] == '`' && text[i+2] == '`' { + return i + 3 + } + } + return -1 +} + +// findLastNewline finds the last newline character within the last N characters +// Returns the position of the newline or -1 if not found +func findLastNewline(s string, searchWindow int) int { + searchStart := len(s) - searchWindow + if searchStart < 0 { + searchStart = 0 + } + for i := len(s) - 1; i >= searchStart; i-- { + if s[i] == '\n' { + return i + } + } + return -1 +} + +// findLastSpace finds the last space character within the last N characters +// Returns the position of the space or -1 if not found +func findLastSpace(s string, searchWindow int) int { + searchStart := len(s) - searchWindow + if searchStart < 0 { + searchStart = 0 + } + for i := len(s) - 1; i >= searchStart; i-- { + if s[i] == ' ' || s[i] == '\t' { + return i + } + } + return -1 +} + +func (c *DiscordChannel) sendChunk(ctx context.Context, channelID, content string) error { // 使用传入的 ctx 进行超时控制 sendCtx, cancel := context.WithTimeout(ctx, sendTimeout) defer cancel() done := make(chan error, 1) go func() { - _, err := c.session.ChannelMessageSend(channelID, message) + _, err := c.session.ChannelMessageSend(channelID, content) done <- err }() From 9d5728ec5b8d6c46e0ff7bdd65e8046a24620aaa Mon Sep 17 00:00:00 2001 From: Avisek Ray <153633053+biisal@users.noreply.github.com> Date: Mon, 16 Feb 2026 11:50:16 +0530 Subject: [PATCH 38/46] feat: implement structured Telegram command handling with a dedicated command service and `telegohandler` integration. (#164) --- pkg/channels/manager.go | 2 +- pkg/channels/telegram.go | 98 +++++++++++-------- pkg/channels/telegram_commands.go | 153 ++++++++++++++++++++++++++++++ 3 files changed, 212 insertions(+), 41 deletions(-) create mode 100644 pkg/channels/telegram_commands.go diff --git a/pkg/channels/manager.go b/pkg/channels/manager.go index 15f8c6037..7f6abc4cb 100644 --- a/pkg/channels/manager.go +++ b/pkg/channels/manager.go @@ -48,7 +48,7 @@ func (m *Manager) initChannels() error { if m.config.Channels.Telegram.Enabled && m.config.Channels.Telegram.Token != "" { logger.DebugC("channels", "Attempting to initialize Telegram channel") - telegram, err := NewTelegramChannel(m.config.Channels.Telegram, m.bus) + telegram, err := NewTelegramChannel(m.config, m.bus) if err != nil { logger.ErrorCF("channels", "Failed to initialize Telegram channel", map[string]interface{}{ "error": err.Error(), diff --git a/pkg/channels/telegram.go b/pkg/channels/telegram.go index b14b1632e..5601d508c 100644 --- a/pkg/channels/telegram.go +++ b/pkg/channels/telegram.go @@ -11,7 +11,10 @@ import ( "sync" "time" + th "github.com/mymmrac/telego/telegohandler" + "github.com/mymmrac/telego" + "github.com/mymmrac/telego/telegohandler" tu "github.com/mymmrac/telego/telegoutil" "github.com/sipeed/picoclaw/pkg/bus" @@ -24,7 +27,8 @@ import ( type TelegramChannel struct { *BaseChannel bot *telego.Bot - config config.TelegramConfig + commands TelegramCommander + config *config.Config chatIDs map[string]int64 transcriber *voice.GroqTranscriber placeholders sync.Map // chatID -> messageID @@ -41,13 +45,14 @@ func (c *thinkingCancel) Cancel() { } } -func NewTelegramChannel(cfg config.TelegramConfig, bus *bus.MessageBus) (*TelegramChannel, error) { +func NewTelegramChannel(cfg *config.Config, bus *bus.MessageBus) (*TelegramChannel, error) { var opts []telego.BotOption + telegramCfg := cfg.Channels.Telegram - if cfg.Proxy != "" { - proxyURL, parseErr := url.Parse(cfg.Proxy) + if telegramCfg.Proxy != "" { + proxyURL, parseErr := url.Parse(telegramCfg.Proxy) if parseErr != nil { - return nil, fmt.Errorf("invalid proxy URL %q: %w", cfg.Proxy, parseErr) + return nil, fmt.Errorf("invalid proxy URL %q: %w", telegramCfg.Proxy, parseErr) } opts = append(opts, telego.WithHTTPClient(&http.Client{ Transport: &http.Transport{ @@ -56,15 +61,16 @@ func NewTelegramChannel(cfg config.TelegramConfig, bus *bus.MessageBus) (*Telegr })) } - bot, err := telego.NewBot(cfg.Token, opts...) + bot, err := telego.NewBot(telegramCfg.Token, opts...) if err != nil { return nil, fmt.Errorf("failed to create telegram bot: %w", err) } - base := NewBaseChannel("telegram", cfg, bus, cfg.AllowFrom) + base := NewBaseChannel("telegram", telegramCfg, bus, telegramCfg.AllowFrom) return &TelegramChannel{ BaseChannel: base, + commands: NewTelegramCommands(bot, cfg), bot: bot, config: cfg, chatIDs: make(map[string]int64), @@ -88,31 +94,45 @@ func (c *TelegramChannel) Start(ctx context.Context) error { return fmt.Errorf("failed to start long polling: %w", err) } + bh, err := telegohandler.NewBotHandler(c.bot, updates) + if err != nil { + return fmt.Errorf("failed to create bot handler: %w", err) + } + + bh.HandleMessage(func(ctx *th.Context, message telego.Message) error { + c.commands.Help(ctx, message) + return nil + }, th.CommandEqual("help")) + bh.HandleMessage(func(ctx *th.Context, message telego.Message) error { + return c.commands.Start(ctx, message) + }, th.CommandEqual("start")) + + bh.HandleMessage(func(ctx *th.Context, message telego.Message) error { + return c.commands.Show(ctx, message) + }, th.CommandEqual("show")) + + bh.HandleMessage(func(ctx *th.Context, message telego.Message) error { + return c.commands.List(ctx, message) + }, th.CommandEqual("list")) + + bh.HandleMessage(func(ctx *th.Context, message telego.Message) error { + return c.handleMessage(ctx, &message) + }, th.AnyMessage()) + c.setRunning(true) logger.InfoCF("telegram", "Telegram bot connected", map[string]interface{}{ "username": c.bot.Username(), }) + go bh.Start() + go func() { - for { - select { - case <-ctx.Done(): - return - case update, ok := <-updates: - if !ok { - logger.InfoC("telegram", "Updates channel closed, reconnecting...") - return - } - if update.Message != nil { - c.handleMessage(ctx, update) - } - } - } + <-ctx.Done() + bh.Stop() }() return nil } - func (c *TelegramChannel) Stop(ctx context.Context) error { logger.InfoC("telegram", "Stopping Telegram bot...") c.setRunning(false) @@ -166,30 +186,27 @@ func (c *TelegramChannel) Send(ctx context.Context, msg bus.OutboundMessage) err return nil } -func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Update) { - message := update.Message +func (c *TelegramChannel) handleMessage(ctx context.Context, message *telego.Message) error { if message == nil { - return + return fmt.Errorf("message is nil") } user := message.From if user == nil { - return + return fmt.Errorf("message sender (user) is nil") } - userID := fmt.Sprintf("%d", user.ID) - senderID := userID + senderID := fmt.Sprintf("%d", user.ID) if user.Username != "" { - senderID = fmt.Sprintf("%s|%s", userID, user.Username) + senderID = fmt.Sprintf("%d|%s", user.ID, user.Username) } // 检查白名单,避免为被拒绝的用户下载附件 - if !c.IsAllowed(userID) && !c.IsAllowed(senderID) { + if !c.IsAllowed(senderID) { logger.DebugCF("telegram", "Message rejected by allowlist", map[string]interface{}{ - "user_id": userID, - "username": user.Username, + "user_id": senderID, }) - return + return nil } chatID := message.Chat.ID @@ -222,7 +239,7 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat content += message.Caption } - if message.Photo != nil && len(message.Photo) > 0 { + if len(message.Photo) > 0 { photo := message.Photo[len(message.Photo)-1] photoPath := c.downloadPhoto(ctx, photo.FileID) if photoPath != "" { @@ -231,7 +248,7 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat if content != "" { content += "\n" } - content += fmt.Sprintf("[image: photo]") + content += "[image: photo]" } } @@ -252,7 +269,7 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat "error": err.Error(), "path": voicePath, }) - transcribedText = fmt.Sprintf("[voice (transcription failed)]") + transcribedText = "[voice (transcription failed)]" } else { transcribedText = fmt.Sprintf("[voice transcription: %s]", result.Text) logger.InfoCF("telegram", "Voice transcribed successfully", map[string]interface{}{ @@ -260,7 +277,7 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat }) } } else { - transcribedText = fmt.Sprintf("[voice]") + transcribedText = "[voice]" } if content != "" { @@ -278,7 +295,7 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat if content != "" { content += "\n" } - content += fmt.Sprintf("[audio]") + content += "[audio]" } } @@ -290,7 +307,7 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat if content != "" { content += "\n" } - content += fmt.Sprintf("[file]") + content += "[file]" } } @@ -338,7 +355,8 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, update telego.Updat "is_group": fmt.Sprintf("%t", message.Chat.Type != "private"), } - c.HandleMessage(senderID, fmt.Sprintf("%d", chatID), content, mediaPaths, metadata) + c.HandleMessage(fmt.Sprintf("%d", user.ID), fmt.Sprintf("%d", chatID), content, mediaPaths, metadata) + return nil } func (c *TelegramChannel) downloadPhoto(ctx context.Context, fileID string) string { diff --git a/pkg/channels/telegram_commands.go b/pkg/channels/telegram_commands.go new file mode 100644 index 000000000..df245e156 --- /dev/null +++ b/pkg/channels/telegram_commands.go @@ -0,0 +1,153 @@ +package channels + +import ( + "context" + "fmt" + "strings" + + "github.com/mymmrac/telego" + "github.com/sipeed/picoclaw/pkg/config" +) + +type TelegramCommander interface { + Help(ctx context.Context, message telego.Message) error + Start(ctx context.Context, message telego.Message) error + Show(ctx context.Context, message telego.Message) error + List(ctx context.Context, message telego.Message) error +} + +type cmd struct { + bot *telego.Bot + config *config.Config +} + +func NewTelegramCommands(bot *telego.Bot, cfg *config.Config) TelegramCommander { + return &cmd{ + bot: bot, + config: cfg, + } +} + +func commandArgs(text string) string { + parts := strings.SplitN(text, " ", 2) + if len(parts) < 2 { + return "" + } + return strings.TrimSpace(parts[1]) +} +func (c *cmd) Help(ctx context.Context, message telego.Message) error { + msg := `/start - Start the bot +/help - Show this help message +/show [model|channel] - Show current configuration +/list [models|channels] - List available options + ` + _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ + ChatID: telego.ChatID{ID: message.Chat.ID}, + Text: msg, + ReplyParameters: &telego.ReplyParameters{ + MessageID: message.MessageID, + }, + }) + return err +} + +func (c *cmd) Start(ctx context.Context, message telego.Message) error { + _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ + ChatID: telego.ChatID{ID: message.Chat.ID}, + Text: "Hello! I am PicoClaw 🦞", + ReplyParameters: &telego.ReplyParameters{ + MessageID: message.MessageID, + }, + }) + return err +} + +func (c *cmd) Show(ctx context.Context, message telego.Message) error { + args := commandArgs(message.Text) + if args == "" { + _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ + ChatID: telego.ChatID{ID: message.Chat.ID}, + Text: "Usage: /show [model|channel]", + ReplyParameters: &telego.ReplyParameters{ + MessageID: message.MessageID, + }, + }) + return err + } + + var response string + switch args { + case "model": + response = fmt.Sprintf("Current Model: %s (Provider: %s)", + c.config.Agents.Defaults.Model, + c.config.Agents.Defaults.Provider) + case "channel": + response = "Current Channel: telegram" + default: + response = fmt.Sprintf("Unknown parameter: %s. Try 'model' or 'channel'.", args) + } + + _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ + ChatID: telego.ChatID{ID: message.Chat.ID}, + Text: response, + ReplyParameters: &telego.ReplyParameters{ + MessageID: message.MessageID, + }, + }) + return err +} +func (c *cmd) List(ctx context.Context, message telego.Message) error { + args := commandArgs(message.Text) + if args == "" { + _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ + ChatID: telego.ChatID{ID: message.Chat.ID}, + Text: "Usage: /list [models|channels]", + ReplyParameters: &telego.ReplyParameters{ + MessageID: message.MessageID, + }, + }) + return err + } + + var response string + switch args { + case "models": + provider := c.config.Agents.Defaults.Provider + if provider == "" { + provider = "configured default" + } + response = fmt.Sprintf("Configured Model: %s\nProvider: %s\n\nTo change models, update config.yaml", + c.config.Agents.Defaults.Model, provider) + + case "channels": + var enabled []string + if c.config.Channels.Telegram.Enabled { + enabled = append(enabled, "telegram") + } + if c.config.Channels.WhatsApp.Enabled { + enabled = append(enabled, "whatsapp") + } + if c.config.Channels.Feishu.Enabled { + enabled = append(enabled, "feishu") + } + if c.config.Channels.Discord.Enabled { + enabled = append(enabled, "discord") + } + if c.config.Channels.Slack.Enabled { + enabled = append(enabled, "slack") + } + response = fmt.Sprintf("Enabled Channels:\n- %s", strings.Join(enabled, "\n- ")) + + default: + response = fmt.Sprintf("Unknown parameter: %s. Try 'models' or 'channels'.", args) + } + + _, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{ + ChatID: telego.ChatID{ID: message.Chat.ID}, + Text: response, + ReplyParameters: &telego.ReplyParameters{ + MessageID: message.MessageID, + }, + }) + return err +} From a371d53438df27babf57af0b0870077026e0289d Mon Sep 17 00:00:00 2001 From: mattn Date: Mon, 16 Feb 2026 16:04:25 +0900 Subject: [PATCH 39/46] Prevent panic on publish after MessageBus is closed (#223) --- pkg/bus/bus.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/bus/bus.go b/pkg/bus/bus.go index 6283251a4..58c0a25d5 100644 --- a/pkg/bus/bus.go +++ b/pkg/bus/bus.go @@ -9,6 +9,7 @@ type MessageBus struct { inbound chan InboundMessage outbound chan OutboundMessage handlers map[string]MessageHandler + closed bool mu sync.RWMutex } @@ -21,6 +22,11 @@ func NewMessageBus() *MessageBus { } func (mb *MessageBus) PublishInbound(msg InboundMessage) { + mb.mu.RLock() + defer mb.mu.RUnlock() + if mb.closed { + return + } mb.inbound <- msg } @@ -34,6 +40,11 @@ func (mb *MessageBus) ConsumeInbound(ctx context.Context) (InboundMessage, bool) } func (mb *MessageBus) PublishOutbound(msg OutboundMessage) { + mb.mu.RLock() + defer mb.mu.RUnlock() + if mb.closed { + return + } mb.outbound <- msg } @@ -60,6 +71,12 @@ func (mb *MessageBus) GetHandler(channel string) (MessageHandler, bool) { } func (mb *MessageBus) Close() { + mb.mu.Lock() + defer mb.mu.Unlock() + if mb.closed { + return + } + mb.closed = true close(mb.inbound) close(mb.outbound) } From 159a95412202f075b36cdef785c9fe5638e7506c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?W=C3=81NG=20Xu=C4=9Bru=C3=AC?= Date: Mon, 16 Feb 2026 15:08:27 +0800 Subject: [PATCH 40/46] build: support building for linux/loong64 (#272) This platform has a growing desktop and embedded user base, and is fully supported by Go. The only necessary change is the mapping between `uname -m` output and GOARCH. Due to non-technical reasons [1], there is currently no Docker official image that provides linux/loong64 support, so Docker-based builds are not included in this commit for now. [1]: https://github.com/docker-library/official-images/issues/16404 --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 058fdb790..41e45fbfc 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,8 @@ ifeq ($(UNAME_S),Linux) ARCH=amd64 else ifeq ($(UNAME_M),aarch64) ARCH=arm64 + else ifeq ($(UNAME_M),loongarch64) + ARCH=loong64 else ifeq ($(UNAME_M),riscv64) ARCH=riscv64 else @@ -84,6 +86,7 @@ build-all: generate @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) + GOOS=linux GOARCH=loong64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-loong64 ./$(CMD_DIR) GOOS=linux GOARCH=riscv64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-riscv64 ./$(CMD_DIR) GOOS=darwin GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 ./$(CMD_DIR) GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR) From 17685da584c6e1dfe33519ba1a0e7de97bdd7a28 Mon Sep 17 00:00:00 2001 From: lxowalle <83055338+lxowalle@users.noreply.github.com> Date: Mon, 16 Feb 2026 15:48:02 +0800 Subject: [PATCH 41/46] feat: update the `make deps` logic to prevent the project from frequently updating dependency package versions (#277) --- Makefile | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 41e45fbfc..9786b30bb 100644 --- a/Makefile +++ b/Makefile @@ -39,8 +39,6 @@ ifeq ($(UNAME_S),Linux) ARCH=amd64 else ifeq ($(UNAME_M),aarch64) ARCH=arm64 - else ifeq ($(UNAME_M),loongarch64) - ARCH=loong64 else ifeq ($(UNAME_M),riscv64) ARCH=riscv64 else @@ -86,7 +84,6 @@ build-all: generate @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) - GOOS=linux GOARCH=loong64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-loong64 ./$(CMD_DIR) GOOS=linux GOARCH=riscv64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-riscv64 ./$(CMD_DIR) GOOS=darwin GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 ./$(CMD_DIR) GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR) @@ -122,7 +119,7 @@ clean: @rm -rf $(BUILD_DIR) @echo "Clean complete" -## fmt: Format Go code +## vet: Run go vet for static analysis vet: @$(GO) vet ./... @@ -134,11 +131,19 @@ test: fmt: @$(GO) fmt ./... -## deps: Update dependencies +## deps: Download dependencies deps: + @$(GO) mod download + @$(GO) mod verify + +## update-deps: Update dependencies +update-deps: @$(GO) get -u ./... @$(GO) mod tidy +## check: Run vet, fmt, and verify dependencies +check: deps fmt vet test + ## run: Build and run picoclaw run: build @$(BUILD_DIR)/$(BINARY_NAME) $(ARGS) From 5c321a90debbd8b711febd8685d38965905a355a Mon Sep 17 00:00:00 2001 From: is-Xiaoen <2768753269@qq.com> Date: Mon, 16 Feb 2026 16:06:39 +0800 Subject: [PATCH 42/46] fix: tighten file perms and enforce Slack ACL checks (#186) - write config and cron store with 0600 instead of 0644 - check allow list in Slack slash commands and app mentions - pass workspace restrict flag to cron exec tool Closes #179 --- cmd/picoclaw/main.go | 6 +++--- pkg/channels/slack.go | 14 ++++++++++++++ pkg/config/config.go | 2 +- pkg/config/config_test.go | 27 +++++++++++++++++++++++++++ pkg/cron/service.go | 2 +- pkg/cron/service_test.go | 38 ++++++++++++++++++++++++++++++++++++++ pkg/tools/cron.go | 4 ++-- 7 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 pkg/cron/service_test.go diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index cd3637a1b..a40b8d299 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -562,7 +562,7 @@ func gatewayCmd() { }) // Setup cron tool and service - cronService := setupCronTool(agentLoop, msgBus, cfg.WorkspacePath()) + cronService := setupCronTool(agentLoop, msgBus, cfg.WorkspacePath(), cfg.Agents.Defaults.RestrictToWorkspace) heartbeatService := heartbeat.NewHeartbeatService( cfg.WorkspacePath(), @@ -984,14 +984,14 @@ func getConfigPath() string { return filepath.Join(home, ".picoclaw", "config.json") } -func setupCronTool(agentLoop *agent.AgentLoop, msgBus *bus.MessageBus, workspace string) *cron.CronService { +func setupCronTool(agentLoop *agent.AgentLoop, msgBus *bus.MessageBus, workspace string, restrict bool) *cron.CronService { cronStorePath := filepath.Join(workspace, "cron", "jobs.json") // Create cron service cronService := cron.NewCronService(cronStorePath, nil) // Create and register CronTool - cronTool := tools.NewCronTool(cronService, agentLoop, msgBus, workspace) + cronTool := tools.NewCronTool(cronService, agentLoop, msgBus, workspace, restrict) agentLoop.RegisterTool(cronTool) // Set the onJob handler diff --git a/pkg/channels/slack.go b/pkg/channels/slack.go index d86d08a9d..5387e9213 100644 --- a/pkg/channels/slack.go +++ b/pkg/channels/slack.go @@ -296,6 +296,13 @@ func (c *SlackChannel) handleAppMention(ev *slackevents.AppMentionEvent) { return } + if !c.IsAllowed(ev.User) { + logger.DebugCF("slack", "Mention rejected by allowlist", map[string]interface{}{ + "user_id": ev.User, + }) + return + } + senderID := ev.User channelID := ev.Channel threadTS := ev.ThreadTimeStamp @@ -345,6 +352,13 @@ func (c *SlackChannel) handleSlashCommand(event socketmode.Event) { c.socketClient.Ack(*event.Request) } + if !c.IsAllowed(cmd.UserID) { + logger.DebugCF("slack", "Slash command rejected by allowlist", map[string]interface{}{ + "user_id": cmd.UserID, + }) + return + } + senderID := cmd.UserID channelID := cmd.ChannelID chatID := channelID diff --git a/pkg/config/config.go b/pkg/config/config.go index da33748d0..d189ff00b 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -370,7 +370,7 @@ func SaveConfig(path string, cfg *Config) error { return err } - return os.WriteFile(path, data, 0644) + return os.WriteFile(path, data, 0600) } func (c *Config) WorkspacePath() string { diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 14618b109..febfd0456 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -1,6 +1,9 @@ package config import ( + "os" + "path/filepath" + "runtime" "testing" ) @@ -147,6 +150,30 @@ func TestDefaultConfig_WebTools(t *testing.T) { } } +func TestSaveConfig_FilePermissions(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("file permission bits are not enforced on Windows") + } + + tmpDir := t.TempDir() + path := filepath.Join(tmpDir, "config.json") + + cfg := DefaultConfig() + if err := SaveConfig(path, cfg); err != nil { + t.Fatalf("SaveConfig failed: %v", err) + } + + info, err := os.Stat(path) + if err != nil { + t.Fatalf("Stat failed: %v", err) + } + + perm := info.Mode().Perm() + if perm != 0600 { + t.Errorf("config file has permission %04o, want 0600", perm) + } +} + // TestConfig_Complete verifies all config fields are set func TestConfig_Complete(t *testing.T) { cfg := DefaultConfig() diff --git a/pkg/cron/service.go b/pkg/cron/service.go index ddd680e74..9f62c743b 100644 --- a/pkg/cron/service.go +++ b/pkg/cron/service.go @@ -340,7 +340,7 @@ func (cs *CronService) saveStoreUnsafe() error { return err } - return os.WriteFile(cs.storePath, data, 0644) + return os.WriteFile(cs.storePath, data, 0600) } func (cs *CronService) AddJob(name string, schedule CronSchedule, message string, deliver bool, channel, to string) (*CronJob, error) { diff --git a/pkg/cron/service_test.go b/pkg/cron/service_test.go new file mode 100644 index 000000000..53d69f6a9 --- /dev/null +++ b/pkg/cron/service_test.go @@ -0,0 +1,38 @@ +package cron + +import ( + "os" + "path/filepath" + "runtime" + "testing" +) + +func TestSaveStore_FilePermissions(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("file permission bits are not enforced on Windows") + } + + tmpDir := t.TempDir() + storePath := filepath.Join(tmpDir, "cron", "jobs.json") + + cs := NewCronService(storePath, nil) + + _, err := cs.AddJob("test", CronSchedule{Kind: "every", EveryMS: int64Ptr(60000)}, "hello", false, "cli", "direct") + if err != nil { + t.Fatalf("AddJob failed: %v", err) + } + + info, err := os.Stat(storePath) + if err != nil { + t.Fatalf("Stat failed: %v", err) + } + + perm := info.Mode().Perm() + if perm != 0600 { + t.Errorf("cron store has permission %04o, want 0600", perm) + } +} + +func int64Ptr(v int64) *int64 { + return &v +} diff --git a/pkg/tools/cron.go b/pkg/tools/cron.go index 0ef745e2b..4b6f973d8 100644 --- a/pkg/tools/cron.go +++ b/pkg/tools/cron.go @@ -28,12 +28,12 @@ type CronTool struct { } // NewCronTool creates a new CronTool -func NewCronTool(cronService *cron.CronService, executor JobExecutor, msgBus *bus.MessageBus, workspace string) *CronTool { +func NewCronTool(cronService *cron.CronService, executor JobExecutor, msgBus *bus.MessageBus, workspace string, restrict bool) *CronTool { return &CronTool{ cronService: cronService, executor: executor, msgBus: msgBus, - execTool: NewExecTool(workspace, false), + execTool: NewExecTool(workspace, restrict), } } From e3f65fc3d62aa3a5577c0a59e6417d056ff14c02 Mon Sep 17 00:00:00 2001 From: Goksu Ceylan <79890826+GoCeylan@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:20:35 -0500 Subject: [PATCH 43/46] fix(security): block critical symlink workspace escape (#188) --- pkg/tools/filesystem.go | 45 ++++++++++++++++++++++++++++++++++-- pkg/tools/filesystem_test.go | 32 +++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/pkg/tools/filesystem.go b/pkg/tools/filesystem.go index 237687734..09063ea0a 100644 --- a/pkg/tools/filesystem.go +++ b/pkg/tools/filesystem.go @@ -29,13 +29,54 @@ func validatePath(path, workspace string, restrict bool) (string, error) { } } - if restrict && !strings.HasPrefix(absPath, absWorkspace) { - return "", fmt.Errorf("access denied: path is outside the workspace") + if restrict { + if !isWithinWorkspace(absPath, absWorkspace) { + return "", fmt.Errorf("access denied: path is outside the workspace") + } + + workspaceReal := absWorkspace + if resolved, err := filepath.EvalSymlinks(absWorkspace); err == nil { + workspaceReal = resolved + } + + if resolved, err := filepath.EvalSymlinks(absPath); err == nil { + if !isWithinWorkspace(resolved, workspaceReal) { + return "", fmt.Errorf("access denied: symlink resolves outside workspace") + } + } else if os.IsNotExist(err) { + if parentResolved, err := resolveExistingAncestor(filepath.Dir(absPath)); err == nil { + if !isWithinWorkspace(parentResolved, workspaceReal) { + return "", fmt.Errorf("access denied: symlink resolves outside workspace") + } + } else if !os.IsNotExist(err) { + return "", fmt.Errorf("failed to resolve path: %w", err) + } + } else { + return "", fmt.Errorf("failed to resolve path: %w", err) + } } return absPath, nil } +func resolveExistingAncestor(path string) (string, error) { + for current := filepath.Clean(path); ; current = filepath.Dir(current) { + if resolved, err := filepath.EvalSymlinks(current); err == nil { + return resolved, nil + } else if !os.IsNotExist(err) { + return "", err + } + if filepath.Dir(current) == current { + return "", os.ErrNotExist + } + } +} + +func isWithinWorkspace(candidate, workspace string) bool { + rel, err := filepath.Rel(filepath.Clean(workspace), filepath.Clean(candidate)) + return err == nil && rel != ".." && !strings.HasPrefix(rel, ".."+string(os.PathSeparator)) +} + type ReadFileTool struct { workspace string restrict bool diff --git a/pkg/tools/filesystem_test.go b/pkg/tools/filesystem_test.go index 2707f29b5..958036419 100644 --- a/pkg/tools/filesystem_test.go +++ b/pkg/tools/filesystem_test.go @@ -247,3 +247,35 @@ func TestFilesystemTool_ListDir_DefaultPath(t *testing.T) { t.Errorf("Expected success with default path '.', got IsError=true: %s", result.ForLLM) } } + +// Block paths that look inside workspace but point outside via symlink. +func TestFilesystemTool_ReadFile_RejectsSymlinkEscape(t *testing.T) { + + root := t.TempDir() + workspace := filepath.Join(root, "workspace") + if err := os.MkdirAll(workspace, 0755); err != nil { + t.Fatalf("failed to create workspace: %v", err) + } + + secret := filepath.Join(root, "secret.txt") + if err := os.WriteFile(secret, []byte("top secret"), 0644); err != nil { + t.Fatalf("failed to write secret file: %v", err) + } + + link := filepath.Join(workspace, "leak.txt") + if err := os.Symlink(secret, link); err != nil { + t.Skipf("symlink not supported in this environment: %v", err) + } + + tool := NewReadFileTool(workspace, true) + result := tool.Execute(context.Background(), map[string]interface{}{ + "path": link, + }) + + if !result.IsError { + t.Fatalf("expected symlink escape to be blocked") + } + if !strings.Contains(result.ForLLM, "symlink resolves outside workspace") { + t.Fatalf("expected symlink escape error, got: %s", result.ForLLM) + } +} From 8d757fbb6f03a3860c82c25572c61dcfd294bfac Mon Sep 17 00:00:00 2001 From: Tzufucius <952105672@qq.com> Date: Mon, 16 Feb 2026 16:30:54 +0800 Subject: [PATCH 44/46] Feat issue 183 (#189) * feat: add slash command support (e.g., /show model, /help) * style: fix code formatting * feat: implement robust context compression and error recovery with user notifications --- cmd/picoclaw/main.go | 3 + pkg/agent/loop.go | 314 ++++++++++++++++++++++++++++++++++++++--- pkg/agent/loop_test.go | 97 +++++++++++++ pkg/session/manager.go | 16 +++ 4 files changed, 414 insertions(+), 16 deletions(-) diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index a40b8d299..10b53948b 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -594,6 +594,9 @@ func gatewayCmd() { os.Exit(1) } + // Inject channel manager into agent loop for command handling + agentLoop.SetChannelManager(channelManager) + var transcriber *voice.GroqTranscriber if cfg.Providers.Groq.APIKey != "" { transcriber = voice.NewGroqTranscriber(cfg.Providers.Groq.APIKey) diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index f3dd94090..cd4276155 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -19,6 +19,7 @@ import ( "unicode/utf8" "github.com/sipeed/picoclaw/pkg/bus" + "github.com/sipeed/picoclaw/pkg/channels" "github.com/sipeed/picoclaw/pkg/config" "github.com/sipeed/picoclaw/pkg/constants" "github.com/sipeed/picoclaw/pkg/logger" @@ -42,6 +43,7 @@ type AgentLoop struct { tools *tools.ToolRegistry running atomic.Bool summarizing sync.Map // Tracks which sessions are currently being summarized + channelManager *channels.Manager } // processOptions configures how a message is processed @@ -199,6 +201,10 @@ func (al *AgentLoop) RegisterTool(tool tools.Tool) { al.tools.Register(tool) } +func (al *AgentLoop) SetChannelManager(cm *channels.Manager) { + al.channelManager = cm +} + // RecordLastChannel records the last active channel for this workspace. // This uses the atomic state save mechanism to prevent data loss on crash. func (al *AgentLoop) RecordLastChannel(channel string) error { @@ -263,6 +269,11 @@ func (al *AgentLoop) processMessage(ctx context.Context, msg bus.InboundMessage) return al.processSystemMessage(ctx, msg) } + // Check for commands + if response, handled := al.handleCommand(ctx, msg); handled { + return response, nil + } + // Process as user message return al.runAgentLoop(ctx, processOptions{ SessionKey: msg.SessionKey, @@ -383,7 +394,7 @@ func (al *AgentLoop) runAgentLoop(ctx context.Context, opts processOptions) (str // 7. Optional: summarization if opts.EnableSummary { - al.maybeSummarize(opts.SessionKey) + al.maybeSummarize(opts.SessionKey, opts.Channel, opts.ChatID) } // 8. Optional: send response via bus @@ -445,11 +456,131 @@ func (al *AgentLoop) runLLMIteration(ctx context.Context, messages []providers.M "tools_json": formatToolsForLog(providerToolDefs), }) - // Call LLM - response, err := al.provider.Chat(ctx, messages, providerToolDefs, al.model, map[string]interface{}{ - "max_tokens": 8192, - "temperature": 0.7, - }) + var response *providers.LLMResponse + var err error + + // Retry loop for context/token errors + maxRetries := 2 + for retry := 0; retry <= maxRetries; retry++ { + response, err = al.provider.Chat(ctx, messages, providerToolDefs, al.model, map[string]interface{}{ + "max_tokens": 8192, + "temperature": 0.7, + }) + + if err == nil { + break // Success + } + + errMsg := strings.ToLower(err.Error()) + // Check for context window errors (provider specific, but usually contain "token" or "invalid") + isContextError := strings.Contains(errMsg, "token") || + strings.Contains(errMsg, "context") || + strings.Contains(errMsg, "invalidparameter") || + strings.Contains(errMsg, "length") + + if isContextError && retry < maxRetries { + logger.WarnCF("agent", "Context window error detected, attempting compression", map[string]interface{}{ + "error": err.Error(), + "retry": retry, + }) + + // Notify user on first retry only + if retry == 0 && !constants.IsInternalChannel(opts.Channel) && opts.SendResponse { + al.bus.PublishOutbound(bus.OutboundMessage{ + Channel: opts.Channel, + ChatID: opts.ChatID, + Content: "⚠️ Context window exceeded. Compressing history and retrying...", + }) + } + + // Force compression + al.forceCompression(opts.SessionKey) + + // Rebuild messages with compressed history + // Note: We need to reload history from session manager because forceCompression changed it + newHistory := al.sessions.GetHistory(opts.SessionKey) + newSummary := al.sessions.GetSummary(opts.SessionKey) + + // Re-create messages for the next attempt + // We keep the current user message (opts.UserMessage) effectively + messages = al.contextBuilder.BuildMessages( + newHistory, + newSummary, + opts.UserMessage, + nil, + opts.Channel, + opts.ChatID, + ) + + // Important: If we are in the middle of a tool loop (iteration > 1), + // rebuilding messages from session history might duplicate the flow or miss context + // if intermediate steps weren't saved correctly. + // However, al.sessions.AddFullMessage is called after every tool execution, + // so GetHistory should reflect the current state including partial tool execution. + // But we need to ensure we don't duplicate the user message which is appended in BuildMessages. + // BuildMessages(history...) takes the stored history and appends the *current* user message. + // If iteration > 1, the "current user message" was already added to history in step 3 of runAgentLoop. + // So if we pass opts.UserMessage again, we might duplicate it? + // Actually, step 3 is: al.sessions.AddMessage(opts.SessionKey, "user", opts.UserMessage) + // So GetHistory ALREADY contains the user message! + + // CORRECTION: + // BuildMessages combines: [System] + [History] + [CurrentMessage] + // But Step 3 added CurrentMessage to History. + // So if we use GetHistory now, it has the user message. + // If we pass opts.UserMessage to BuildMessages, it adds it AGAIN. + + // For retry in the middle of a loop, we should rely on what's in the session. + // BUT checking BuildMessages implementation: + // It appends history... then appends currentMessage. + + // Logic fix for retry: + // If iteration == 1, opts.UserMessage corresponds to the user input. + // If iteration > 1, we are processing tool results. The "messages" passed to Chat + // already accumulated tool outputs. + // Rebuilding from session history is safest because it persists state. + // Start fresh with rebuilt history. + + // Special case: standard BuildMessages appends "currentMessage". + // If we are strictly retrying the *LLM call*, we want the exact same state as before but compressed. + // However, the "messages" argument passed to runLLMIteration is constructed by the caller. + // If we rebuild from Session, we need to know if "currentMessage" should be appended or is already in history. + + // In runAgentLoop: + // 3. sessions.AddMessage(userMsg) + // 4. runLLMIteration(..., UserMessage) + + // So History contains the user message. + // BuildMessages typically appends the user message as a *new* pending message. + // Wait, standard BuildMessages usage in runAgentLoop: + // messages := BuildMessages(history (has old), UserMessage) + // THEN AddMessage(UserMessage). + // So "history" passed to BuildMessages does NOT contain the current UserMessage yet. + + // But here, inside the loop, we have already saved it. + // So GetHistory() includes the current user message. + // If we call BuildMessages(GetHistory(), UserMessage), we get duplicates. + + // Hack/Fix: + // If we are retrying, we rebuild from Session History ONLY. + // We pass empty string as "currentMessage" to BuildMessages + // because the "current message" is already saved in history (step 3). + + messages = al.contextBuilder.BuildMessages( + newHistory, + newSummary, + "", // Empty because history already contains the relevant messages + nil, + opts.Channel, + opts.ChatID, + ) + + continue + } + + // Real error or success, break loop + break + } if err != nil { logger.ErrorCF("agent", "LLM call failed", @@ -457,7 +588,7 @@ func (al *AgentLoop) runLLMIteration(ctx context.Context, messages []providers.M "iteration": iteration, "error": err.Error(), }) - return "", iteration, fmt.Errorf("LLM call failed: %w", err) + return "", iteration, fmt.Errorf("LLM call failed after retries: %w", err) } // Check if no tool calls - we're done @@ -589,7 +720,7 @@ func (al *AgentLoop) updateToolContexts(channel, chatID string) { } // maybeSummarize triggers summarization if the session history exceeds thresholds. -func (al *AgentLoop) maybeSummarize(sessionKey string) { +func (al *AgentLoop) maybeSummarize(sessionKey, channel, chatID string) { newHistory := al.sessions.GetHistory(sessionKey) tokenEstimate := al.estimateTokens(newHistory) threshold := al.contextWindow * 75 / 100 @@ -598,12 +729,80 @@ func (al *AgentLoop) maybeSummarize(sessionKey string) { if _, loading := al.summarizing.LoadOrStore(sessionKey, true); !loading { go func() { defer al.summarizing.Delete(sessionKey) + // Notify user about optimization if not an internal channel + if !constants.IsInternalChannel(channel) { + al.bus.PublishOutbound(bus.OutboundMessage{ + Channel: channel, + ChatID: chatID, + Content: "⚠️ Memory threshold reached. Optimizing conversation history...", + }) + } al.summarizeSession(sessionKey) }() } } } +// forceCompression aggressively reduces context when the limit is hit. +// It drops the oldest 50% of messages (keeping system prompt and last user message). +func (al *AgentLoop) forceCompression(sessionKey string) { + history := al.sessions.GetHistory(sessionKey) + if len(history) <= 4 { + return + } + + // Keep system prompt (usually [0]) and the very last message (user's trigger) + // We want to drop the oldest half of the *conversation* + // Assuming [0] is system, [1:] is conversation + conversation := history[1 : len(history)-1] + if len(conversation) == 0 { + return + } + + // Helper to find the mid-point of the conversation + mid := len(conversation) / 2 + + // New history structure: + // 1. System Prompt + // 2. [Summary of dropped part] - synthesized + // 3. Second half of conversation + // 4. Last message + + // Simplified approach for emergency: Drop first half of conversation + // and rely on existing summary if present, or create a placeholder. + + droppedCount := mid + keptConversation := conversation[mid:] + + newHistory := make([]providers.Message, 0) + newHistory = append(newHistory, history[0]) // System prompt + + // Add a note about compression + compressionNote := fmt.Sprintf("[System: Emergency compression dropped %d oldest messages due to context limit]", droppedCount) + // If there was an existing summary, we might lose it if it was in the dropped part (which is just messages). + // The summary is stored separately in session.Summary, so it persists! + // We just need to ensure the user knows there's a gap. + + // We only modify the messages list here + newHistory = append(newHistory, providers.Message{ + Role: "system", + Content: compressionNote, + }) + + newHistory = append(newHistory, keptConversation...) + newHistory = append(newHistory, history[len(history)-1]) // Last message + + // Update session + al.sessions.SetHistory(sessionKey, newHistory) + al.sessions.Save(sessionKey) + + logger.WarnCF("agent", "Forced compression executed", map[string]interface{}{ + "session_key": sessionKey, + "dropped_msgs": droppedCount, + "new_count": len(newHistory), + }) +} + // GetStartupInfo returns information about loaded tools and skills for logging. func (al *AgentLoop) GetStartupInfo() map[string]interface{} { info := make(map[string]interface{}) @@ -631,7 +830,7 @@ func formatMessagesForLog(messages []providers.Message) string { result += "[\n" for i, msg := range messages { result += fmt.Sprintf(" [%d] Role: %s\n", i, msg.Role) - if msg.ToolCalls != nil && len(msg.ToolCalls) > 0 { + if len(msg.ToolCalls) > 0 { result += " ToolCalls:\n" for _, tc := range msg.ToolCalls { result += fmt.Sprintf(" - ID: %s, Type: %s, Name: %s\n", tc.ID, tc.Type, tc.Name) @@ -698,7 +897,7 @@ func (al *AgentLoop) summarizeSession(sessionKey string) { continue } // Estimate tokens for this message - msgTokens := len(m.Content) / 4 + msgTokens := len(m.Content) / 2 // Use safer estimate here too (2.5 -> 2 for integer division safety) if msgTokens > maxMessageTokens { omitted = true continue @@ -769,13 +968,96 @@ 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). +// Uses a safe heuristic of 2.5 characters per token to account for CJK and other +// overheads better than the previous 3 chars/token. func (al *AgentLoop) estimateTokens(messages []providers.Message) int { - total := 0 + totalChars := 0 for _, m := range messages { - total += utf8.RuneCountInString(m.Content) / 3 + totalChars += utf8.RuneCountInString(m.Content) } - return total + // 2.5 chars per token = totalChars * 2 / 5 + return totalChars * 2 / 5 +} + +func (al *AgentLoop) handleCommand(ctx context.Context, msg bus.InboundMessage) (string, bool) { + content := strings.TrimSpace(msg.Content) + if !strings.HasPrefix(content, "/") { + return "", false + } + + parts := strings.Fields(content) + if len(parts) == 0 { + return "", false + } + + cmd := parts[0] + args := parts[1:] + + switch cmd { + case "/show": + if len(args) < 1 { + return "Usage: /show [model|channel]", true + } + switch args[0] { + case "model": + return fmt.Sprintf("Current model: %s", al.model), true + case "channel": + return fmt.Sprintf("Current channel: %s", msg.Channel), true + default: + return fmt.Sprintf("Unknown show target: %s", args[0]), true + } + + case "/list": + if len(args) < 1 { + return "Usage: /list [models|channels]", true + } + switch args[0] { + case "models": + // TODO: Fetch available models dynamically if possible + return "Available models: glm-4.7, claude-3-5-sonnet, gpt-4o (configured in config.json/env)", true + case "channels": + if al.channelManager == nil { + return "Channel manager not initialized", true + } + channels := al.channelManager.GetEnabledChannels() + if len(channels) == 0 { + return "No channels enabled", true + } + return fmt.Sprintf("Enabled channels: %s", strings.Join(channels, ", ")), true + default: + return fmt.Sprintf("Unknown list target: %s", args[0]), true + } + + case "/switch": + if len(args) < 3 || args[1] != "to" { + return "Usage: /switch [model|channel] to ", true + } + target := args[0] + value := args[2] + + switch target { + case "model": + oldModel := al.model + al.model = value + return fmt.Sprintf("Switched model from %s to %s", oldModel, value), true + case "channel": + // This changes the 'default' channel for some operations, or effectively redirects output? + // For now, let's just validate if the channel exists + if al.channelManager == nil { + return "Channel manager not initialized", true + } + if _, exists := al.channelManager.GetChannel(value); !exists && value != "cli" { + return fmt.Sprintf("Channel '%s' not found or not enabled", value), true + } + + // If message came from CLI, maybe we want to redirect CLI output to this channel? + // That would require state persistence about "redirected channel" + // For now, just acknowledged. + return fmt.Sprintf("Switched target channel to %s (Note: this currently only validates existence)", value), true + default: + return fmt.Sprintf("Unknown switch target: %s", target), true + } + } + + return "", false } diff --git a/pkg/agent/loop_test.go b/pkg/agent/loop_test.go index c18220258..0bd38abf4 100644 --- a/pkg/agent/loop_test.go +++ b/pkg/agent/loop_test.go @@ -2,6 +2,7 @@ package agent import ( "context" + "fmt" "os" "path/filepath" "testing" @@ -527,3 +528,99 @@ func TestToolResult_UserFacingToolDoesSendMessage(t *testing.T) { t.Errorf("Expected 'Command output: hello world', got: %s", response) } } + +// failFirstMockProvider fails on the first N calls with a specific error +type failFirstMockProvider struct { + failures int + currentCall int + failError error + successResp string +} + +func (m *failFirstMockProvider) Chat(ctx context.Context, messages []providers.Message, tools []providers.ToolDefinition, model string, opts map[string]interface{}) (*providers.LLMResponse, error) { + m.currentCall++ + if m.currentCall <= m.failures { + return nil, m.failError + } + return &providers.LLMResponse{ + Content: m.successResp, + ToolCalls: []providers.ToolCall{}, + }, nil +} + +func (m *failFirstMockProvider) GetDefaultModel() string { + return "mock-fail-model" +} + +// TestAgentLoop_ContextExhaustionRetry verify that the agent retries on context errors +func TestAgentLoop_ContextExhaustionRetry(t *testing.T) { + tmpDir, err := os.MkdirTemp("", "agent-test-*") + if err != nil { + t.Fatalf("Failed to create temp dir: %v", err) + } + defer os.RemoveAll(tmpDir) + + cfg := &config.Config{ + Agents: config.AgentsConfig{ + Defaults: config.AgentDefaults{ + Workspace: tmpDir, + Model: "test-model", + MaxTokens: 4096, + MaxToolIterations: 10, + }, + }, + } + + msgBus := bus.NewMessageBus() + + // Create a provider that fails once with a context error + contextErr := fmt.Errorf("InvalidParameter: Total tokens of image and text exceed max message tokens") + provider := &failFirstMockProvider{ + failures: 1, + failError: contextErr, + successResp: "Recovered from context error", + } + + al := NewAgentLoop(cfg, msgBus, provider) + + // Inject some history to simulate a full context + sessionKey := "test-session-context" + // Create dummy history + history := []providers.Message{ + {Role: "system", Content: "System prompt"}, + {Role: "user", Content: "Old message 1"}, + {Role: "assistant", Content: "Old response 1"}, + {Role: "user", Content: "Old message 2"}, + {Role: "assistant", Content: "Old response 2"}, + {Role: "user", Content: "Trigger message"}, + } + al.sessions.SetHistory(sessionKey, history) + + // Call ProcessDirectWithChannel + // Note: ProcessDirectWithChannel calls processMessage which will execute runLLMIteration + response, err := al.ProcessDirectWithChannel(context.Background(), "Trigger message", sessionKey, "test", "test-chat") + + if err != nil { + t.Fatalf("Expected success after retry, got error: %v", err) + } + + if response != "Recovered from context error" { + t.Errorf("Expected 'Recovered from context error', got '%s'", response) + } + + // We expect 2 calls: 1st failed, 2nd succeeded + if provider.currentCall != 2 { + t.Errorf("Expected 2 calls (1 fail + 1 success), got %d", provider.currentCall) + } + + // Check final history length + finalHistory := al.sessions.GetHistory(sessionKey) + // We verify that the history has been modified (compressed) + // Original length: 6 + // Expected behavior: compression drops ~50% of history (mid slice) + // We can assert that the length is NOT what it would be without compression. + // Without compression: 6 + 1 (new user msg) + 1 (assistant msg) = 8 + if len(finalHistory) >= 8 { + t.Errorf("Expected history to be compressed (len < 8), got %d", len(finalHistory)) + } +} diff --git a/pkg/session/manager.go b/pkg/session/manager.go index 9981d4901..12bf33df0 100644 --- a/pkg/session/manager.go +++ b/pkg/session/manager.go @@ -264,3 +264,19 @@ func (sm *SessionManager) loadSessions() error { return nil } + +// SetHistory updates the messages of a session. +func (sm *SessionManager) SetHistory(key string, history []providers.Message) { + sm.mu.Lock() + defer sm.mu.Unlock() + + session, ok := sm.sessions[key] + if ok { + // Create a deep copy to strictly isolate internal state + // from the caller's slice. + msgs := make([]providers.Message, len(history)) + copy(msgs, history) + session.Messages = msgs + session.Updated = time.Now() + } +} From e7f15afdd4d1ffc0fc480f40ce0871b531025c44 Mon Sep 17 00:00:00 2001 From: Caize Wu Date: Mon, 16 Feb 2026 19:17:27 +0800 Subject: [PATCH 45/46] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 28 +++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 23 +++++++++++++++ .github/ISSUE_TEMPLATE/general-task---todo.md | 26 +++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/general-task---todo.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..4be385b22 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,28 @@ +--- +name: Bug report +about: Report a bug or unexpected behavior +title: "[BUG]" +labels: bug +assignees: '' + +--- + +## Quick Summary + +## Environment & Tools +- **PicoClaw Version:** (e.g., v0.1.2 or commit hash) +- **Go Version:** (e.g., go 1.22) +- **AI Model & Provider:** (e.g., GPT-4o via OpenAI / DeepSeek via SiliconFlow) +- **Operating System:** (e.g., Ubuntu 22.04 / macOS / Android Termux) +- **Channels:** (e.g., Discord, Telegram, Feishu, ...) + +## 📸 Steps to Reproduce +1. +2. +3. + +## ❌ Actual Behavior + +## ✅ Expected Behavior + +## 💬 Additional Context diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..d3df0e79c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,23 @@ +--- +name: Feature request +about: Suggest a new idea or improvement +title: "[Feature]" +labels: enhancement +assignees: '' + +--- + +## 🎯 The Goal / Use Case + +## 💡 Proposed Solution + +## 🛠 Potential Implementation (Optional) + +## 🚦 Impact & Roadmap Alignment +- [ ] This is a Core Feature +- [ ] This is a Nice-to-Have / Enhancement +- [ ] This aligns with the current Roadmap + +## 🔄 Alternatives Considered + +## 💬 Additional Context diff --git a/.github/ISSUE_TEMPLATE/general-task---todo.md b/.github/ISSUE_TEMPLATE/general-task---todo.md new file mode 100644 index 000000000..eab70c030 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/general-task---todo.md @@ -0,0 +1,26 @@ +--- +name: General Task / Todo +about: A specific piece of work like doc, refactoring, or maintenance. +title: "[Task]" +labels: '' +assignees: '' + +--- + +## 📝 Objective + +## 📋 To-Do List +- [ ] Step 1 +- [ ] Step 2 +- [ ] Step 3 + +## 🎯 Definition of Done (Acceptance Criteria) +- [ ] Documentation is updated in the README/docs folder. +- [ ] Code follows project linting standards. +- [ ] (If applicable) Basic tests pass. + +## 💡 Context / Motivation + +## 🔗 Related Issues / PRs +- Fixes # +- Relates to # From 13e4028d42aba6feceb9b6078cbaed9e83b80097 Mon Sep 17 00:00:00 2001 From: zepan Date: Mon, 16 Feb 2026 20:10:20 +0800 Subject: [PATCH 46/46] 1. update wechat group qrcode 2. publish roadmap --- README.md | 3 + README.zh.md | 2 + assets/wechat.png | Bin 143766 -> 145550 bytes doc/picoclaw_community_roadmap_260216.md | 112 +++++++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 doc/picoclaw_community_roadmap_260216.md diff --git a/README.md b/README.md index 091af2811..0a9dacce6 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,11 @@ > * **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. +> * **Note:** picoclaw has recently merged a lot of PRs, which may result in a larger memory footprint (10–20MB) in the latest versions. We plan to prioritize resource optimization as soon as the current feature set reaches a stable state. + ## 📢 News +2026-02-16 🎉 PicoClaw hit 12K stars in one week! Thank you all for your support! PicoClaw is growing faster than we ever imagined. Given the high volume of PRs, we urgently need community maintainers. Our volunteer roles and roadmap are officially posted [here](doc/picoclaw_community_roadmap_260216.md) —we can’t wait to have you on board! 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. diff --git a/README.zh.md b/README.zh.md index 5a1c3c50b..2ca2987bb 100644 --- a/README.zh.md +++ b/README.zh.md @@ -46,9 +46,11 @@ > * **官方域名:** 唯一的官方网站是 **[picoclaw.io](https://picoclaw.io)**,公司官网是 **[sipeed.com](https://sipeed.com)**。 > * **警惕:** 许多 `.ai/.org/.com/.net/...` 后缀的域名被第三方抢注,请勿轻信。 > * **注意:** picoclaw正在初期的快速功能开发阶段,可能有尚未修复的网络安全问题,在1.0正式版发布前,请不要将其部署到生产环境中 +> * **注意:** picoclaw最近合并了大量PRs,近期版本可能内存占用较大(10~20MB),我们将在功能较为收敛后进行资源占用优化. ## 📢 新闻 (News) +2026-02-16 🎉 PicoClaw 在一周内突破了12K star! 感谢大家的关注!PicoClaw 的成长速度超乎我们预期. 由于PR数量的快速膨胀,我们亟需社区开发者参与维护. 我们需要的志愿者角色和roadmap已经发布到了[这里](doc/picoclaw_community_roadmap_260216.md), 期待你的参与! 2026-02-13 🎉 **PicoClaw 在 4 天内突破 5000 Stars!** 感谢社区的支持!由于正值中国春节假期,PR 和 Issue 涌入较多,我们正在利用这段时间敲定 **项目路线图 (Roadmap)** 并组建 **开发者群组**,以便加速 PicoClaw 的开发。 🚀 **行动号召:** 请在 GitHub Discussions 中提交您的功能请求 (Feature Requests)。我们将在接下来的周会上进行审查和优先级排序。 diff --git a/assets/wechat.png b/assets/wechat.png index d62c8d09db29a2bf18e191f6f1df264e1d9c5331..6e6f5011533dd3acbd2d0ecaf2d6f562004880d2 100644 GIT binary patch literal 145550 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 SKV+vK)H)|gJ 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 z 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 literal 143766 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%0A+oB}cT_YjG9fPI42Y_jE47MQ;T;dv& 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 TVP}o%A2+w>JZEn=uNe6krd#FG diff --git a/doc/picoclaw_community_roadmap_260216.md b/doc/picoclaw_community_roadmap_260216.md new file mode 100644 index 000000000..cfcc30f17 --- /dev/null +++ b/doc/picoclaw_community_roadmap_260216.md @@ -0,0 +1,112 @@ +## 🚀 Join the PicoClaw Journey: Call for Community Volunteers & Roadmap Reveal + +**Hello, PicoClaw Community!** + +First, a massive thank you to everyone for your enthusiasm and PR contributions. It is because of you that PicoClaw continues to iterate and evolve so rapidly. Thanks to the simplicity and accessibility of the **Go language**, we’ve seen a non-stop stream of high-quality PRs! + +PicoClaw is growing much faster than we anticipated. As we are currently in the midst of the **Chinese New Year holiday**, we are looking to recruit community volunteers to help us maintain this incredible momentum. + +This document outlines the specific volunteer roles we need right now and provides a look at our upcoming **Roadmap**. + +### 🎁 Community Perks + +To show our appreciation, developers who officially join our community operations will receive: + +* **Exclusive AI Hardware:** Our upcoming, unreleased AI device. +* **Token Discounts:** Potential discounts on LLM tokens (currently in negotiations with major providers). + +### 🎥 Calling All Content Creators! + +Not a developer? You can still help! We welcome users to post **PicoClaw reviews or tutorials**. + +* **Twitter:** Use the tag **#picoclaw** and mention **@SipeedIO**. +* **Bilibili:** Mention **@Sipeed矽速科技** or send us a DM. +We will be rewarding high-quality content creators with the same perks as our community developers! + +--- + +## 🛠️ Urgent Volunteer Roles + +We are looking for experts in the following areas: + +1. **Issue/PR Reviewers** +* **The Mission:** With PRs and Issues exploding in volume, we need help with initial triage, evaluation, and merging. +* **Focus:** Preliminary merging and community health. Efficiency optimization and security audits will be handled by specialized roles. + + +2. **Resource Optimization Experts** +* **The Mission:** Rapid growth has introduced dependencies that are making PicoClaw a bit "heavy." We want to keep it lean. +* **Focus:** Analyzing resource growth between releases and trimming redundancy. +* **Priority:** **RAM usage optimization** > Binary size reduction. + + +3. **Security Audit & Bug Fixes** +* **The Mission:** Due to the "vibe coding" nature of our early stages, we need a thorough review of network security and AI permission management. +* **Focus:** Auditing the codebase for vulnerabilities and implementing robust fixes. + + +4. **Documentation & DX (Developer Experience)** +* **The Mission:** Our current README is a bit outdated. We need "step-by-step" guides that even beginners can follow. +* **Focus:** Creating clear, user-friendly documentation for both setup and development. + + +5. **AI-Powered CI/CD Optimization** +* **The Mission:** PicoClaw started as a "vibe coding" experiment; now we want to use AI to manage it. +* **Focus:** Automating builds with AI and exploring AI-driven issue resolution. + +**How to Apply:** > If you are interested in any of the roles above, please send an email to support@sipeed.com with the subject line: [Apply: PicoClaw Expert Volunteer] + Your Desired Role. +Please include a brief introduction and any relevant experience or portfolio links. We will review all applications and grant project permissions to selected contributors! + +--- + +## 📍 The Roadmap + +Interested in a specific feature? You can "claim" these tasks and start building: + +### +* **Provider:** + * **Provider Refactor:** Currently being handled by **@Daming** (ETA: 5 days) + * You can still submit code; Daming will merge it into the new implementation. +* **Channels:** + * Support for OneBot, additional platforms + * attachments (images, audio, video, files). +* **Skills:** + * Implementing `find_skill` to discover tools via [openclaw/skills](https://github.com/openclaw/skills) and other platforms. +* **Operations:** * MCP Support. + * Android operations (e.g., botdrop). + * Browser automation via CDP or ActionBook. + + +* **Multi-Agent Ecosystem:** + * **Basic Model-Agnet** S + * **Model Routing:** Small models for easy tasks, large models for hard ones (to save tokens). + * **Swarm Mode.** + * **AIEOS Integration.** + + +* **Branding:** + * **Logo**: We need a cute logo! We’re leaning toward a **Mantis Shrimp**—small, but packs a legendary punch! + + +We have officially created these tasks as GitHub Issues, all marked with the roadmap tag. +This list will be updated continuously as we progress. +If you would like to claim a task, please feel free to start a conversation by commenting directly on the corresponding issue! + +--- + +## 🤝 How to Join + +**Everything is open to your creativity!** If you have a wild idea, just PR it. + +1. **The Fast Track:** Once you have at least **one merged PR**, you are eligible to join our **Developer Discord** to help plan the future of PicoClaw. +2. **The Application Track:** If you haven’t submitted a PR yet but want to dive in, email **support@sipeed.com** with the subject: +> `[Apply Join PicoClaw Dev Group] + Your GitHub Account` +> Include the role you're interested in and any evidence of your development experience. + + + +### Looking Ahead + +Powered by PicoClaw, we are crafting a Swarm AI Assistant to transform your environment into a seamless network of personal stewards. By automating the friction of daily life, we empower you to transcend the ordinary and freely explore your creative potential. + +**Finally, Happy Chinese New Year to everyone!** May PicoClaw gallop forward in this **Year of the Horse!** 🐎