From c87375588e2e651bde7c1636d7224185627a5934 Mon Sep 17 00:00:00 2001 From: afjcjsbx Date: Wed, 4 Mar 2026 22:39:08 +0100 Subject: [PATCH 01/25] prevent read binary file in tool --- pkg/tools/filesystem.go | 105 ++++++++++++++++++++++++++++++++++- pkg/tools/filesystem_test.go | 92 +++++++++++++++++++++++++++++- 2 files changed, 194 insertions(+), 3 deletions(-) diff --git a/pkg/tools/filesystem.go b/pkg/tools/filesystem.go index cd8da3195..3c518dd94 100644 --- a/pkg/tools/filesystem.go +++ b/pkg/tools/filesystem.go @@ -1,9 +1,12 @@ package tools import ( + "bytes" "context" "fmt" + "io" "io/fs" + "net/http" "os" "path/filepath" "regexp" @@ -123,11 +126,37 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe return ErrorResult("path is required") } - content, err := t.fs.ReadFile(path) + // open file instead of loading it all into memory + file, err := t.fs.Open(path) if err != nil { return ErrorResult(err.Error()) } - return NewToolResult(string(content)) + defer file.Close() + + // read only an initial chunk (512 bytes is the standard for MIME sniffing) + header := make([]byte, 512) + n, err := file.Read(header) + if err != nil && err != io.EOF { + return ErrorResult(fmt.Sprintf("failed to read file header: %v", err)) + } + header = header[:n] + + // Lock the binaries now before using more RAM + if isBinaryFile(header) { + return ErrorResult(fmt.Sprintf("cannot read file %q: appears to be a binary file (e.g., PDF, image, executable)", filepath.Base(path))) + } + + // If it is text, let's read the rest of the file + // (io.ReadAll will continue reading starting from byte 513) + rest, err := io.ReadAll(file) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to read file content: %v", err)) + } + + // Recompose the complete content by merging the header and the rest + fullContent := append(header, rest...) + + return NewToolResult(string(fullContent)) } type WriteFileTool struct { @@ -249,6 +278,7 @@ type fileSystem interface { ReadFile(path string) ([]byte, error) WriteFile(path string, data []byte) error ReadDir(path string) ([]os.DirEntry, error) + Open(path string) (fs.File, error) } // hostFs is an unrestricted fileReadWriter that operates directly on the host filesystem. @@ -278,6 +308,20 @@ func (h *hostFs) WriteFile(path string, data []byte) error { return fileutil.WriteFileAtomic(path, data, 0o600) } +func (h *hostFs) Open(path string) (fs.File, error) { + f, err := os.Open(path) + if err != nil { + if os.IsNotExist(err) { + return nil, fmt.Errorf("failed to open file: file not found: %w", err) + } + if os.IsPermission(err) { + return nil, fmt.Errorf("failed to open file: access denied: %w", err) + } + return nil, fmt.Errorf("failed to open file: %w", err) + } + return f, nil +} + // sandboxFs is a sandboxed fileSystem that operates within a strictly defined workspace using os.Root. type sandboxFs struct { workspace string @@ -389,6 +433,26 @@ func (r *sandboxFs) ReadDir(path string) ([]os.DirEntry, error) { return entries, err } +func (r *sandboxFs) Open(path string) (fs.File, error) { + var f fs.File + err := r.execute(path, func(root *os.Root, relPath string) error { + file, err := root.Open(relPath) + if err != nil { + if os.IsNotExist(err) { + return fmt.Errorf("failed to open file: file not found: %w", err) + } + if os.IsPermission(err) || strings.Contains(err.Error(), "escapes from parent") || + strings.Contains(err.Error(), "permission denied") { + return fmt.Errorf("failed to open file: access denied: %w", err) + } + return fmt.Errorf("failed to open file: %w", err) + } + f = file + return nil + }) + return f, err +} + // whitelistFs wraps a sandboxFs and allows access to specific paths outside // the workspace when they match any of the provided patterns. type whitelistFs struct { @@ -427,6 +491,13 @@ func (w *whitelistFs) ReadDir(path string) ([]os.DirEntry, error) { return w.sandbox.ReadDir(path) } +func (w *whitelistFs) Open(path string) (fs.File, error) { + if w.matches(path) { + return w.host.Open(path) + } + return w.sandbox.Open(path) +} + // buildFs returns the appropriate fileSystem implementation based on restriction // settings and optional path whitelist patterns. func buildFs(workspace string, restrict bool, patterns []*regexp.Regexp) fileSystem { @@ -461,3 +532,33 @@ func getSafeRelPath(workspace, path string) (string, error) { return rel, nil } + +// isBinaryFile uses common heuristics to determine if the content is a binary file. +func isBinaryFile(content []byte) bool { + if len(content) == 0 { + return false + } + + // Sample the first 512 bytes (or less if the file is smaller) + limit := len(content) + if limit > 512 { + limit = 512 + } + sample := content[:limit] + + // Check for NUL bytes in the sample (standard binary detection) + if bytes.IndexByte(sample, 0) != -1 { + return true + } + + // Use standard library content type detection to catch specific formats like PDF + contentType := http.DetectContentType(sample) + if contentType == "application/pdf" || + strings.HasPrefix(contentType, "image/") || + strings.HasPrefix(contentType, "video/") || + strings.HasPrefix(contentType, "audio/") { + return true + } + + return false +} diff --git a/pkg/tools/filesystem_test.go b/pkg/tools/filesystem_test.go index 666004cd4..2868431e0 100644 --- a/pkg/tools/filesystem_test.go +++ b/pkg/tools/filesystem_test.go @@ -59,7 +59,7 @@ func TestFilesystemTool_ReadFile_NotFound(t *testing.T) { } // Should contain error message - if !strings.Contains(result.ForLLM, "failed to read") && !strings.Contains(result.ForUser, "failed to read") { + if !strings.Contains(result.ForLLM, "failed to open file") && !strings.Contains(result.ForUser, "failed to read") { t.Errorf("Expected error message, got ForLLM: %s, ForUser: %s", result.ForLLM, result.ForUser) } } @@ -520,3 +520,93 @@ func TestWhitelistFs_AllowsMatchingPaths(t *testing.T) { t.Errorf("expected non-whitelisted path to be blocked, got: %s", result.ForLLM) } } + +func TestIsBinaryFile(t *testing.T) { + tests := []struct { + name string + content []byte + expected bool + }{ + { + name: "empty content", + content: []byte(""), + expected: false, + }, + { + name: "plain text", + content: []byte("This is a normal text file with punctuation and 12345 numbers."), + expected: false, + }, + { + name: "contains null byte", + content: []byte("plain text\x00followed by a null byte"), + expected: true, + }, + { + name: "pdf header", + content: []byte("%PDF-1.4\n%\xE2\xE3\xCF\xD3\n1 0 obj\n<>"), + expected: true, + }, + { + name: "png magic bytes", + content: []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01\x00"), + expected: true, + }, + { + name: "jpeg magic bytes", + content: []byte("\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H"), + expected: true, + }, + { + name: "html text (not binary)", + content: []byte("

Ciao

"), + expected: false, + }, + { + name: "json text (not binary)", + content: []byte(`{"key": "value", "number": 42}`), + expected: false, + }, + { + name: "markdown text (not binary)", + content: []byte("# Markdown Title\n\nThis is a **bold text** and a [link](https://example.com)."), + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := isBinaryFile(tt.content) + if result != tt.expected { + t.Errorf("isBinaryFile() for %q returned %v, expected %v", tt.name, result, tt.expected) + } + }) + } +} + +func TestFilesystemTool_ReadFile_BlocksBinary(t *testing.T) { + tmpDir := t.TempDir() + + // Create a dummy binary file (e.g., a PDF). + testFile := filepath.Join(tmpDir, "fake_document.pdf") + fakePDFContent := []byte("%PDF-1.4\n% Some null test bytes\x00\x00\x00") + os.WriteFile(testFile, fakePDFContent, 0o644) + + tool := NewReadFileTool(tmpDir, true) + ctx := context.Background() + args := map[string]any{ + "path": testFile, + } + + result := tool.Execute(ctx, args) + + if !result.IsError { + t.Errorf("An error was expected when trying to read a binary file, but instead it was successful") + } + + // The error should mention that it is a binary file + expectedMsg := "appears to be a binary file" + if !strings.Contains(result.ForLLM, expectedMsg) { + t.Errorf("The error message '%s' was expected, obtained: %s", expectedMsg, result.ForLLM) + } +} From 1b990d9acd29229effbe60fb73cb473c76258cab Mon Sep 17 00:00:00 2001 From: afjcjsbx Date: Wed, 4 Mar 2026 22:59:58 +0100 Subject: [PATCH 02/25] fix lint --- pkg/tools/filesystem.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/tools/filesystem.go b/pkg/tools/filesystem.go index 3c518dd94..dbd9261a5 100644 --- a/pkg/tools/filesystem.go +++ b/pkg/tools/filesystem.go @@ -143,7 +143,12 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe // Lock the binaries now before using more RAM if isBinaryFile(header) { - return ErrorResult(fmt.Sprintf("cannot read file %q: appears to be a binary file (e.g., PDF, image, executable)", filepath.Base(path))) + return ErrorResult( + fmt.Sprintf( + "cannot read file %q: appears to be a binary file (e.g., PDF, image, executable)", + filepath.Base(path), + ), + ) } // If it is text, let's read the rest of the file From 47d7b9b04ccd97e9ebcf40c3a07f86336e8b6cdc Mon Sep 17 00:00:00 2001 From: afjcjsbx Date: Wed, 4 Mar 2026 23:05:52 +0100 Subject: [PATCH 03/25] resolve makezero linter error --- pkg/tools/filesystem.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/tools/filesystem.go b/pkg/tools/filesystem.go index dbd9261a5..17f67e3b0 100644 --- a/pkg/tools/filesystem.go +++ b/pkg/tools/filesystem.go @@ -159,7 +159,9 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe } // Recompose the complete content by merging the header and the rest - fullContent := append(header, rest...) + fullContent := make([]byte, 0, len(header)+len(rest)) + fullContent = append(fullContent, header...) + fullContent = append(fullContent, rest...) return NewToolResult(string(fullContent)) } From 674f00ec63ce8e90d9458da1f0d8a44bde534fb2 Mon Sep 17 00:00:00 2001 From: afjcjsbx Date: Sat, 7 Mar 2026 00:33:27 +0100 Subject: [PATCH 04/25] set offset and length in read_file tool --- pkg/tools/filesystem.go | 151 ++++++++++++++++++++++++++++------- pkg/tools/filesystem_test.go | 123 +++++++++++++++++++++++++--- 2 files changed, 234 insertions(+), 40 deletions(-) diff --git a/pkg/tools/filesystem.go b/pkg/tools/filesystem.go index 17f67e3b0..92c5c4f17 100644 --- a/pkg/tools/filesystem.go +++ b/pkg/tools/filesystem.go @@ -10,12 +10,15 @@ import ( "os" "path/filepath" "regexp" + "strconv" "strings" "time" "github.com/sipeed/picoclaw/pkg/fileutil" ) +const MaxReadFileSize = 128 * 1024 // 64KB limit to avoid context overflow + // validatePath ensures the given path is within the workspace if restrict is true. func validatePath(path, workspace string, restrict bool) (string, error) { if workspace == "" { @@ -104,7 +107,9 @@ func (t *ReadFileTool) Name() string { } func (t *ReadFileTool) Description() string { - return "Read the contents of a file" + return "Read the contents of a file. Supports pagination via `offset` and `length` " + + "for files larger than the per-call limit. If the response header indicates the " + + "file is TRUNCATED, use the provided offset in your next call to continue reading." } func (t *ReadFileTool) Parameters() map[string]any { @@ -113,7 +118,19 @@ func (t *ReadFileTool) Parameters() map[string]any { "properties": map[string]any{ "path": map[string]any{ "type": "string", - "description": "Path to the file to read", + "description": "Path to the file to read.", + }, + "offset": map[string]any{ + "type": "integer", + "description": "Byte offset to start reading from (default: 0).", + "default": 0, + }, + "length": map[string]any{ + "type": "integer", + "description": fmt.Sprintf( + "Maximum number of bytes to read (default / max: %d).", MaxReadFileSize, + ), + "default": MaxReadFileSize, }, }, "required": []string{"path"}, @@ -126,44 +143,124 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe return ErrorResult("path is required") } - // open file instead of loading it all into memory + // offset (optional, default 0) + offset, err := getInt64Arg(args, "offset", 0) + if err != nil { + return ErrorResult(err.Error()) + } + if offset < 0 { + return ErrorResult("offset must be >= 0") + } + + // length (optional, capped at MaxReadFileSize) + length, err := getInt64Arg(args, "length", MaxReadFileSize) + if err != nil { + return ErrorResult(err.Error()) + } + if length <= 0 { + return ErrorResult("length must be > 0") + } + if length > MaxReadFileSize { + length = MaxReadFileSize + } + file, err := t.fs.Open(path) if err != nil { return ErrorResult(err.Error()) } defer file.Close() - // read only an initial chunk (512 bytes is the standard for MIME sniffing) - header := make([]byte, 512) - n, err := file.Read(header) - if err != nil && err != io.EOF { - return ErrorResult(fmt.Sprintf("failed to read file header: %v", err)) - } - header = header[:n] - - // Lock the binaries now before using more RAM - if isBinaryFile(header) { - return ErrorResult( - fmt.Sprintf( - "cannot read file %q: appears to be a binary file (e.g., PDF, image, executable)", - filepath.Base(path), - ), - ) + // measure total size + totalSize := int64(-1) // -1 means unknown + if info, err := file.Stat(); err == nil { + totalSize = info.Size() + } else { + return ErrorResult(fmt.Sprintf("failed to get file info: %v", err)) } - // If it is text, let's read the rest of the file - // (io.ReadAll will continue reading starting from byte 513) - rest, err := io.ReadAll(file) + // seek to offset + if seeker, ok := file.(io.Seeker); ok { + if _, err := seeker.Seek(offset, io.SeekStart); err != nil { + return ErrorResult(fmt.Sprintf("failed to seek to offset %d: %v", offset, err)) + } + } else if offset > 0 { + // Fallback for non-seekable streams: discard leading bytes. + if _, err := io.CopyN(io.Discard, file, offset); err != nil { + return ErrorResult(fmt.Sprintf("failed to advance to offset %d: %v", offset, err)) + } + } + + // read up to `length` bytes + data, err := io.ReadAll(io.LimitReader(file, length)) if err != nil { return ErrorResult(fmt.Sprintf("failed to read file content: %v", err)) } - // Recompose the complete content by merging the header and the rest - fullContent := make([]byte, 0, len(header)+len(rest)) - fullContent = append(fullContent, header...) - fullContent = append(fullContent, rest...) + if len(data) == 0 && offset > 0 { + return NewToolResult("[END OF FILE — no content at this offset]") + } - return NewToolResult(string(fullContent)) + // build metadata header + readEnd := offset + int64(len(data)) + hasMore := int64(len(data)) == length && (totalSize < 0 || readEnd < totalSize) + + // Calculates the reading range avoiding negative numbers if the file is empty + var readRange string + if len(data) == 0 { + readRange = "0 bytes" + } else { + readRange = fmt.Sprintf("bytes %d–%d", offset, readEnd-1) + } + + var header string + if totalSize >= 0 { + header = fmt.Sprintf( + "[file: %s | total: %d bytes | read: %s]", + path, totalSize, readRange, + ) + } else { + header = fmt.Sprintf( + "[file: %s | read: %s | total size unknown]", + path, readRange, + ) + } + + if hasMore { + header += fmt.Sprintf( + "\n[TRUNCATED — file has more content. Call read_file again with offset=%d to continue.]", + readEnd, + ) + } else { + header += "\n[END OF FILE — no further content.]" + } + + return NewToolResult(header + "\n\n" + string(data)) +} + +// getInt64Arg extracts an integer argument from the args map, returning the +// provided default if the key is absent. +func getInt64Arg(args map[string]any, key string, defaultVal int64) (int64, error) { + raw, exists := args[key] + if !exists { + return defaultVal, nil + } + + switch v := raw.(type) { + case float64: + return int64(v), nil + case int: + return int64(v), nil + case int64: + return v, nil + case string: + parsed, err := strconv.ParseInt(v, 10, 64) + if err != nil { + return 0, fmt.Errorf("invalid integer format for %s parameter: %w", key, err) + } + return parsed, nil + default: + return 0, fmt.Errorf("unsupported type %T for %s parameter", raw, key) + } } type WriteFileTool struct { diff --git a/pkg/tools/filesystem_test.go b/pkg/tools/filesystem_test.go index 2868431e0..f02483e25 100644 --- a/pkg/tools/filesystem_test.go +++ b/pkg/tools/filesystem_test.go @@ -584,29 +584,126 @@ func TestIsBinaryFile(t *testing.T) { } } -func TestFilesystemTool_ReadFile_BlocksBinary(t *testing.T) { +// TestReadFileTool_ChunkedReading verifies the pagination logic of the tool +// by reading a file in multiple chunks using 'offset' and 'length'. +func TestReadFileTool_ChunkedReading(t *testing.T) { tmpDir := t.TempDir() + testFile := filepath.Join(tmpDir, "pagination_test.txt") - // Create a dummy binary file (e.g., a PDF). - testFile := filepath.Join(tmpDir, "fake_document.pdf") - fakePDFContent := []byte("%PDF-1.4\n% Some null test bytes\x00\x00\x00") - os.WriteFile(testFile, fakePDFContent, 0o644) + // Create a test file with exactly 26 bytes of content + fullContent := "abcdefghijklmnopqrstuvwxyz" + err := os.WriteFile(testFile, []byte(fullContent), 0o644) + if err != nil { + t.Fatalf("Failed to write test file: %v", err) + } - tool := NewReadFileTool(tmpDir, true) + tool := NewReadFileTool(tmpDir, false) ctx := context.Background() + + // --- Step 1: Read the first chunk (10 bytes) --- + args1 := map[string]any{ + "path": testFile, + "offset": 0, + "length": 10, + } + result1 := tool.Execute(ctx, args1) + + if result1.IsError { + t.Fatalf("Chunk 1 failed: %s", result1.ForLLM) + } + + // Expect the first 10 characters + if !strings.Contains(result1.ForLLM, "abcdefghij") { + t.Errorf("Chunk 1 should contain 'abcdefghij', got: %s", result1.ForLLM) + } + // Expect the header to indicate the file is truncated + if !strings.Contains(result1.ForLLM, "[TRUNCATED") { + t.Errorf("Chunk 1 header should indicate truncation, got: %s", result1.ForLLM) + } + // Expect the header to suggest the next offset (10) + if !strings.Contains(result1.ForLLM, "offset=10") { + t.Errorf("Chunk 1 header should suggest next offset=10, got: %s", result1.ForLLM) + } + + // Step 2: Read the second chunk (10 bytes) --- + args2 := map[string]any{ + "path": testFile, + "offset": 10, + "length": 10, + } + result2 := tool.Execute(ctx, args2) + + if result2.IsError { + t.Fatalf("Chunk 2 failed: %s", result2.ForLLM) + } + + // Expect the next 10 characters + if !strings.Contains(result2.ForLLM, "klmnopqrst") { + t.Errorf("Chunk 2 should contain 'klmnopqrst', got: %s", result2.ForLLM) + } + // Expect the header to suggest the next offset (20) + if !strings.Contains(result2.ForLLM, "offset=20") { + t.Errorf("Chunk 2 header should suggest next offset=20, got: %s", result2.ForLLM) + } + + // Step 3: Read the final chunk (remaining 6 bytes) --- + // We ask for 10 bytes, but only 6 are left in the file + args3 := map[string]any{ + "path": testFile, + "offset": 20, + "length": 10, + } + result3 := tool.Execute(ctx, args3) + + if result3.IsError { + t.Fatalf("Chunk 3 failed: %s", result3.ForLLM) + } + + // Expect the last 6 characters + if !strings.Contains(result3.ForLLM, "uvwxyz") { + t.Errorf("Chunk 3 should contain 'uvwxyz', got: %s", result3.ForLLM) + } + // Expect the header to indicate the end of the file + if !strings.Contains(result3.ForLLM, "[END OF FILE") { + t.Errorf("Chunk 3 header should indicate end of file, got: %s", result3.ForLLM) + } + + // Ensure no TRUNCATED message is present in the final chunk + if strings.Contains(result3.ForLLM, "[TRUNCATED") { + t.Errorf("Chunk 3 header should NOT indicate truncation, got: %s", result3.ForLLM) + } +} + +// TestReadFileTool_OffsetBeyondEOF checks the behavior when requesting +// An offset that exceeds the total file size. +func TestReadFileTool_OffsetBeyondEOF(t *testing.T) { + tmpDir := t.TempDir() + testFile := filepath.Join(tmpDir, "short.txt") + + // create a file of only 5 bytes + err := os.WriteFile(testFile, []byte("12345"), 0o644) + if err != nil { + t.Fatalf("Failed to write test file: %v", err) + } + + tool := NewReadFileTool(tmpDir, false) + ctx := context.Background() + args := map[string]any{ - "path": testFile, + "path": testFile, + "offset": int64(100), // Offset beyond the end of the file } result := tool.Execute(ctx, args) - if !result.IsError { - t.Errorf("An error was expected when trying to read a binary file, but instead it was successful") + // It should not be classified as a tool execution error + if result.IsError { + t.Errorf("A mistake was not expected, obtained IsError=true: %s", result.ForLLM) } - // The error should mention that it is a binary file - expectedMsg := "appears to be a binary file" - if !strings.Contains(result.ForLLM, expectedMsg) { - t.Errorf("The error message '%s' was expected, obtained: %s", expectedMsg, result.ForLLM) + // Must return EXACTLY the string provided in the code + expectedMsg := "[END OF FILE — no content at this offset]" + if result.ForLLM != expectedMsg { + t.Errorf("The message %q was expected, obtained: %q", expectedMsg, result.ForLLM) } } From ff54128ab426798787a285e3768e666d5576786e Mon Sep 17 00:00:00 2001 From: afjcjsbx Date: Mon, 9 Mar 2026 09:32:21 +0100 Subject: [PATCH 05/25] refined code --- pkg/agent/instance.go | 3 +- pkg/config/config.go | 7 +- pkg/config/defaults.go | 5 +- pkg/tools/filesystem.go | 170 ++++++++++++++++++++--------------- pkg/tools/filesystem_test.go | 79 ++-------------- 5 files changed, 117 insertions(+), 147 deletions(-) diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index 97cf0fa05..5a838b67e 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -70,7 +70,8 @@ func NewAgentInstance( toolsRegistry := tools.NewToolRegistry() if cfg.Tools.IsToolEnabled("read_file") { - toolsRegistry.Register(tools.NewReadFileTool(workspace, readRestrict, allowReadPaths)) + maxReadFileSize := cfg.Tools.ReadFile.MaxReadFileSize + toolsRegistry.Register(tools.NewReadFileTool(workspace, readRestrict, maxReadFileSize, allowReadPaths)) } if cfg.Tools.IsToolEnabled("write_file") { toolsRegistry.Register(tools.NewWriteFileTool(workspace, restrict, allowWritePaths)) diff --git a/pkg/config/config.go b/pkg/config/config.go index b3ad050b7..c482c3b7e 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -660,6 +660,11 @@ type MediaCleanupConfig struct { Interval int ` env:"PICOCLAW_MEDIA_CLEANUP_INTERVAL" json:"interval_minutes"` } +type ReadFileToolConfig struct { + Enabled bool `json:"enabled"` + MaxReadFileSize int `json:"max_read_file_size"` +} + type ToolsConfig struct { AllowReadPaths []string `json:"allow_read_paths" env:"PICOCLAW_TOOLS_ALLOW_READ_PATHS"` AllowWritePaths []string `json:"allow_write_paths" env:"PICOCLAW_TOOLS_ALLOW_WRITE_PATHS"` @@ -676,7 +681,7 @@ type ToolsConfig struct { InstallSkill ToolConfig `json:"install_skill" envPrefix:"PICOCLAW_TOOLS_INSTALL_SKILL_"` ListDir ToolConfig `json:"list_dir" envPrefix:"PICOCLAW_TOOLS_LIST_DIR_"` Message ToolConfig `json:"message" envPrefix:"PICOCLAW_TOOLS_MESSAGE_"` - ReadFile ToolConfig `json:"read_file" envPrefix:"PICOCLAW_TOOLS_READ_FILE_"` + ReadFile ReadFileToolConfig `json:"read_file" envPrefix:"PICOCLAW_TOOLS_READ_FILE_"` SendFile ToolConfig `json:"send_file" envPrefix:"PICOCLAW_TOOLS_SEND_FILE_"` Spawn ToolConfig `json:"spawn" envPrefix:"PICOCLAW_TOOLS_SPAWN_"` SPI ToolConfig `json:"spi" envPrefix:"PICOCLAW_TOOLS_SPI_"` diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 7fb3daa48..eb2e179b1 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -458,8 +458,9 @@ func DefaultConfig() *Config { Message: ToolConfig{ Enabled: true, }, - ReadFile: ToolConfig{ - Enabled: true, + ReadFile: ReadFileToolConfig{ + Enabled: true, + MaxReadFileSize: 64 * 1024, // 64KB }, Spawn: ToolConfig{ Enabled: true, diff --git a/pkg/tools/filesystem.go b/pkg/tools/filesystem.go index 92c5c4f17..5878f3173 100644 --- a/pkg/tools/filesystem.go +++ b/pkg/tools/filesystem.go @@ -1,12 +1,12 @@ package tools import ( - "bytes" "context" + "errors" "fmt" "io" "io/fs" - "net/http" + "math" "os" "path/filepath" "regexp" @@ -15,9 +15,10 @@ import ( "time" "github.com/sipeed/picoclaw/pkg/fileutil" + "github.com/sipeed/picoclaw/pkg/logger" ) -const MaxReadFileSize = 128 * 1024 // 64KB limit to avoid context overflow +const MaxReadFileSize = 64 * 1024 // 64KB limit to avoid context overflow // validatePath ensures the given path is within the workspace if restrict is true. func validatePath(path, workspace string, restrict bool) (string, error) { @@ -91,15 +92,30 @@ func isWithinWorkspace(candidate, workspace string) bool { } type ReadFileTool struct { - fs fileSystem + fs fileSystem + maxSize int64 } -func NewReadFileTool(workspace string, restrict bool, allowPaths ...[]*regexp.Regexp) *ReadFileTool { +func NewReadFileTool( + workspace string, + restrict bool, + maxReadFileSize int, + allowPaths ...[]*regexp.Regexp, +) *ReadFileTool { var patterns []*regexp.Regexp if len(allowPaths) > 0 { patterns = allowPaths[0] } - return &ReadFileTool{fs: buildFs(workspace, restrict, patterns)} + + maxSize := int64(maxReadFileSize) + if maxSize <= 0 { + maxSize = MaxReadFileSize + } + + return &ReadFileTool{ + fs: buildFs(workspace, restrict, patterns), + maxSize: maxSize, + } } func (t *ReadFileTool) Name() string { @@ -107,9 +123,7 @@ func (t *ReadFileTool) Name() string { } func (t *ReadFileTool) Description() string { - return "Read the contents of a file. Supports pagination via `offset` and `length` " + - "for files larger than the per-call limit. If the response header indicates the " + - "file is TRUNCATED, use the provided offset in your next call to continue reading." + return "Read the contents of a file. Supports pagination via `offset` and `length`." } func (t *ReadFileTool) Parameters() map[string]any { @@ -122,15 +136,13 @@ func (t *ReadFileTool) Parameters() map[string]any { }, "offset": map[string]any{ "type": "integer", - "description": "Byte offset to start reading from (default: 0).", + "description": "Byte offset to start reading from.", "default": 0, }, "length": map[string]any{ - "type": "integer", - "description": fmt.Sprintf( - "Maximum number of bytes to read (default / max: %d).", MaxReadFileSize, - ), - "default": MaxReadFileSize, + "type": "integer", + "description": "Maximum number of bytes to read.", + "default": t.maxSize, }, }, "required": []string{"path"}, @@ -153,15 +165,15 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe } // length (optional, capped at MaxReadFileSize) - length, err := getInt64Arg(args, "length", MaxReadFileSize) + length, err := getInt64Arg(args, "length", t.maxSize) if err != nil { return ErrorResult(err.Error()) } if length <= 0 { return ErrorResult("length must be > 0") } - if length > MaxReadFileSize { - length = MaxReadFileSize + if length > t.maxSize { + length = t.maxSize } file, err := t.fs.Open(path) @@ -174,66 +186,104 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe totalSize := int64(-1) // -1 means unknown if info, err := file.Stat(); err == nil { totalSize = info.Size() - } else { - return ErrorResult(fmt.Sprintf("failed to get file info: %v", err)) } - // seek to offset + // sniff the first 512 bytes to detect binary content before loading + // it into the LLM context. Seeking back to 0 afterwards restores state. + sniff := make([]byte, 512) + sniffN, _ := file.Read(sniff) + + // Reset read position to beginning before applying the caller's offset. + if seeker, ok := file.(io.Seeker); ok { + if _, err := seeker.Seek(0, io.SeekStart); err != nil { + return ErrorResult(fmt.Sprintf("failed to reset file position after sniff: %v", err)) + } + } else { + // Non-seekable: we consumed sniffN bytes above; account for them when + // discarding to reach the requested offset below. + // If offset < sniffN the data we already read covers it, which we + // cannot replay on a non-seekable stream — return a clear error. + if offset < int64(sniffN) && offset > 0 { + return ErrorResult( + "non-seekable file: cannot seek to an offset within the first 512 bytes after binary detection", + ) + } + } + + // Seek to the requested offset. if seeker, ok := file.(io.Seeker); ok { if _, err := seeker.Seek(offset, io.SeekStart); err != nil { return ErrorResult(fmt.Sprintf("failed to seek to offset %d: %v", offset, err)) } } else if offset > 0 { // Fallback for non-seekable streams: discard leading bytes. - if _, err := io.CopyN(io.Discard, file, offset); err != nil { - return ErrorResult(fmt.Sprintf("failed to advance to offset %d: %v", offset, err)) + // sniffN bytes were already consumed above, so subtract them. + remaining := offset - int64(sniffN) + if remaining > 0 { + if _, err := io.CopyN(io.Discard, file, remaining); err != nil { + return ErrorResult(fmt.Sprintf("failed to advance to offset %d: %v", offset, err)) + } } } - // read up to `length` bytes - data, err := io.ReadAll(io.LimitReader(file, length)) - if err != nil { + // read length+1 bytes to reliably detect whether more content exists + // without relying on totalSize (which may be -1 for non-seekable streams). + // This avoids the false-positive TRUNCATED message on the last page. + probe := make([]byte, length+1) + n, err := io.ReadFull(file, probe) + // FIX: io.ReadFull returns io.ErrUnexpectedEOF for partial reads (0 < n < len), + // and io.EOF only when n == 0. Both are normal terminal conditions — only + // other errors are genuine failures. + if err != nil && err != io.EOF && !errors.Is(err, io.ErrUnexpectedEOF) { return ErrorResult(fmt.Sprintf("failed to read file content: %v", err)) } - if len(data) == 0 && offset > 0 { - return NewToolResult("[END OF FILE — no content at this offset]") - } + // hasMore is true only when we actually got the extra probe byte. + hasMore := int64(n) > length + data := probe[:min(int64(n), length)] - // build metadata header - readEnd := offset + int64(len(data)) - hasMore := int64(len(data)) == length && (totalSize < 0 || readEnd < totalSize) - - // Calculates the reading range avoiding negative numbers if the file is empty - var readRange string if len(data) == 0 { - readRange = "0 bytes" - } else { - readRange = fmt.Sprintf("bytes %d–%d", offset, readEnd-1) + return NewToolResult("[END OF FILE - no content at this offset]") } + // Build metadata header. + // use filepath.Base(path) instead of the raw path to avoid leaking + // internal filesystem structure into the LLM context. + readEnd := offset + int64(len(data)) + // use ASCII hyphen-minus instead of en-dash (U+2013) to keep the + // header parseable by downstream tools and log processors. + readRange := fmt.Sprintf("bytes %d-%d", offset, readEnd-1) + + displayPath := filepath.Base(path) var header string if totalSize >= 0 { header = fmt.Sprintf( "[file: %s | total: %d bytes | read: %s]", - path, totalSize, readRange, + displayPath, totalSize, readRange, ) } else { header = fmt.Sprintf( "[file: %s | read: %s | total size unknown]", - path, readRange, + displayPath, readRange, ) } if hasMore { header += fmt.Sprintf( - "\n[TRUNCATED — file has more content. Call read_file again with offset=%d to continue.]", + "\n[TRUNCATED - file has more content. Call read_file again with offset=%d to continue.]", readEnd, ) } else { - header += "\n[END OF FILE — no further content.]" + header += "\n[END OF FILE - no further content.]" } + logger.DebugCF("tool", "ReadFileTool execution completed successfully", + map[string]any{ + "path": path, + "bytes_read": len(data), + "has_more": hasMore, + }) + return NewToolResult(header + "\n\n" + string(data)) } @@ -247,6 +297,12 @@ func getInt64Arg(args map[string]any, key string, defaultVal int64) (int64, erro switch v := raw.(type) { case float64: + if v != math.Trunc(v) { + return 0, fmt.Errorf("%s must be an integer, got float %v", key, v) + } + if v > math.MaxInt64 || v < math.MinInt64 { + return 0, fmt.Errorf("%s value %v overflows int64", key, v) + } return int64(v), nil case int: return int64(v), nil @@ -636,33 +692,3 @@ func getSafeRelPath(workspace, path string) (string, error) { return rel, nil } - -// isBinaryFile uses common heuristics to determine if the content is a binary file. -func isBinaryFile(content []byte) bool { - if len(content) == 0 { - return false - } - - // Sample the first 512 bytes (or less if the file is smaller) - limit := len(content) - if limit > 512 { - limit = 512 - } - sample := content[:limit] - - // Check for NUL bytes in the sample (standard binary detection) - if bytes.IndexByte(sample, 0) != -1 { - return true - } - - // Use standard library content type detection to catch specific formats like PDF - contentType := http.DetectContentType(sample) - if contentType == "application/pdf" || - strings.HasPrefix(contentType, "image/") || - strings.HasPrefix(contentType, "video/") || - strings.HasPrefix(contentType, "audio/") { - return true - } - - return false -} diff --git a/pkg/tools/filesystem_test.go b/pkg/tools/filesystem_test.go index f02483e25..0bbf6caf0 100644 --- a/pkg/tools/filesystem_test.go +++ b/pkg/tools/filesystem_test.go @@ -18,7 +18,7 @@ func TestFilesystemTool_ReadFile_Success(t *testing.T) { testFile := filepath.Join(tmpDir, "test.txt") os.WriteFile(testFile, []byte("test content"), 0o644) - tool := NewReadFileTool("", false) + tool := NewReadFileTool("", false, MaxReadFileSize) ctx := context.Background() args := map[string]any{ "path": testFile, @@ -45,7 +45,7 @@ func TestFilesystemTool_ReadFile_Success(t *testing.T) { // TestFilesystemTool_ReadFile_NotFound verifies error handling for missing file func TestFilesystemTool_ReadFile_NotFound(t *testing.T) { - tool := NewReadFileTool("", false) + tool := NewReadFileTool("", false, MaxReadFileSize) ctx := context.Background() args := map[string]any{ "path": "/nonexistent_file_12345.txt", @@ -271,7 +271,7 @@ func TestFilesystemTool_ReadFile_RejectsSymlinkEscape(t *testing.T) { t.Skipf("symlink not supported in this environment: %v", err) } - tool := NewReadFileTool(workspace, true) + tool := NewReadFileTool(workspace, true, MaxReadFileSize) result := tool.Execute(context.Background(), map[string]any{ "path": link, }) @@ -289,7 +289,7 @@ func TestFilesystemTool_ReadFile_RejectsSymlinkEscape(t *testing.T) { } func TestFilesystemTool_EmptyWorkspace_AccessDenied(t *testing.T) { - tool := NewReadFileTool("", true) // restrict=true but workspace="" + tool := NewReadFileTool("", true, MaxReadFileSize) // restrict=true but workspace="" // Try to read a sensitive file (simulated by a temp file outside workspace) tmpDir := t.TempDir() @@ -499,7 +499,7 @@ func TestWhitelistFs_AllowsMatchingPaths(t *testing.T) { // Pattern allows access to the outsideDir. patterns := []*regexp.Regexp{regexp.MustCompile(`^` + regexp.QuoteMeta(outsideDir))} - tool := NewReadFileTool(workspace, true, patterns) + tool := NewReadFileTool(workspace, true, MaxReadFileSize, patterns) // Read from whitelisted path should succeed. result := tool.Execute(context.Background(), map[string]any{"path": outsideFile}) @@ -521,69 +521,6 @@ func TestWhitelistFs_AllowsMatchingPaths(t *testing.T) { } } -func TestIsBinaryFile(t *testing.T) { - tests := []struct { - name string - content []byte - expected bool - }{ - { - name: "empty content", - content: []byte(""), - expected: false, - }, - { - name: "plain text", - content: []byte("This is a normal text file with punctuation and 12345 numbers."), - expected: false, - }, - { - name: "contains null byte", - content: []byte("plain text\x00followed by a null byte"), - expected: true, - }, - { - name: "pdf header", - content: []byte("%PDF-1.4\n%\xE2\xE3\xCF\xD3\n1 0 obj\n<>"), - expected: true, - }, - { - name: "png magic bytes", - content: []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01\x00"), - expected: true, - }, - { - name: "jpeg magic bytes", - content: []byte("\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H"), - expected: true, - }, - { - name: "html text (not binary)", - content: []byte("

Ciao

"), - expected: false, - }, - { - name: "json text (not binary)", - content: []byte(`{"key": "value", "number": 42}`), - expected: false, - }, - { - name: "markdown text (not binary)", - content: []byte("# Markdown Title\n\nThis is a **bold text** and a [link](https://example.com)."), - expected: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result := isBinaryFile(tt.content) - if result != tt.expected { - t.Errorf("isBinaryFile() for %q returned %v, expected %v", tt.name, result, tt.expected) - } - }) - } -} - // TestReadFileTool_ChunkedReading verifies the pagination logic of the tool // by reading a file in multiple chunks using 'offset' and 'length'. func TestReadFileTool_ChunkedReading(t *testing.T) { @@ -597,7 +534,7 @@ func TestReadFileTool_ChunkedReading(t *testing.T) { t.Fatalf("Failed to write test file: %v", err) } - tool := NewReadFileTool(tmpDir, false) + tool := NewReadFileTool(tmpDir, false, MaxReadFileSize) ctx := context.Background() // --- Step 1: Read the first chunk (10 bytes) --- @@ -686,7 +623,7 @@ func TestReadFileTool_OffsetBeyondEOF(t *testing.T) { t.Fatalf("Failed to write test file: %v", err) } - tool := NewReadFileTool(tmpDir, false) + tool := NewReadFileTool(tmpDir, false, MaxReadFileSize) ctx := context.Background() args := map[string]any{ @@ -702,7 +639,7 @@ func TestReadFileTool_OffsetBeyondEOF(t *testing.T) { } // Must return EXACTLY the string provided in the code - expectedMsg := "[END OF FILE — no content at this offset]" + expectedMsg := "[END OF FILE - no content at this offset]" if result.ForLLM != expectedMsg { t.Errorf("The message %q was expected, obtained: %q", expectedMsg, result.ForLLM) } From 584564af639b517672723fede2a2fac9f83e7ad8 Mon Sep 17 00:00:00 2001 From: afjcjsbx Date: Mon, 9 Mar 2026 11:02:31 +0100 Subject: [PATCH 06/25] fix lint --- pkg/tools/filesystem.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/tools/filesystem.go b/pkg/tools/filesystem.go index 5878f3173..6b1cb1475 100644 --- a/pkg/tools/filesystem.go +++ b/pkg/tools/filesystem.go @@ -184,7 +184,7 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe // measure total size totalSize := int64(-1) // -1 means unknown - if info, err := file.Stat(); err == nil { + if info, statErr := file.Stat(); statErr == nil { totalSize = info.Size() } @@ -195,7 +195,8 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe // Reset read position to beginning before applying the caller's offset. if seeker, ok := file.(io.Seeker); ok { - if _, err := seeker.Seek(0, io.SeekStart); err != nil { + _, err = seeker.Seek(0, io.SeekStart) + if err != nil { return ErrorResult(fmt.Sprintf("failed to reset file position after sniff: %v", err)) } } else { @@ -212,7 +213,8 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe // Seek to the requested offset. if seeker, ok := file.(io.Seeker); ok { - if _, err := seeker.Seek(offset, io.SeekStart); err != nil { + _, err = seeker.Seek(offset, io.SeekStart) + if err != nil { return ErrorResult(fmt.Sprintf("failed to seek to offset %d: %v", offset, err)) } } else if offset > 0 { @@ -220,7 +222,8 @@ func (t *ReadFileTool) Execute(ctx context.Context, args map[string]any) *ToolRe // sniffN bytes were already consumed above, so subtract them. remaining := offset - int64(sniffN) if remaining > 0 { - if _, err := io.CopyN(io.Discard, file, remaining); err != nil { + _, err = io.CopyN(io.Discard, file, remaining) + if err != nil { return ErrorResult(fmt.Sprintf("failed to advance to offset %d: %v", offset, err)) } } From 457533b96087bec6718acd3e286cc21d272bfb45 Mon Sep 17 00:00:00 2001 From: Guoguo <16666742+imguoguo@users.noreply.github.com> Date: Mon, 9 Mar 2026 21:34:27 +0800 Subject: [PATCH 07/25] docs: update wechat qrcode (#1272) --- assets/wechat.png | Bin 395669 -> 356550 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/wechat.png b/assets/wechat.png index cc88186a81b3c8024102fa8401cc85397fd575de..4442ef2c7153ceb05250bc0a7ec3e83ca0aa54b7 100644 GIT binary patch literal 356550 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Ǩ^>B!X)StW5SD!ypg68E_sCrBPT4g*WxMp{ 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

0KRF>=u#CWX8SEV~@;jn*+O8X6w- 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 z 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

@@@%Nok-&>|^LoF;=oGQafGEvk)&JMtC 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

XUF0c`@i00`b&M(7 z7;7rxsaXku1u_K&CE0=LfPMN}vS8*P+(mQ6ZJn4@;i+%3o#GRr40hneg^Ctp#BIQ5 z17*{NFCYRSlAVo!U}P?7R)h#H#1pyYcqDH?=ieoJ)kLbJt>{E*D{w=6V4vI}uve8s zoTN`)VrYtWDsU6!p9;8tPzZJa`gG>!xsm%shlQ$%kSBfRas#=^cb_92{|T$Qaf<^> zUinHxZ?brwEyt?O=TapHfxJS!&ewPn&;rS~F8&wCo?1srStzX0Q#V2T-6h?06CKz+*~QXiUM*MD zBsvqkLD;v|WrMB}nM$)kaGYnV-oKN~z;Qf%&8ooLZRD+&ArumQgj3o66Ph5BavZ zul?Qk-(WF9)B|A<`#TtR?2@_M_z`iO|hK{;5TqLRD7E^H`PH}z9RthoHvh1hKSBRzSzNKPg z8*>^-^&gc7i#Ga}5YW&mN}PW;Swic-cWmH}>sKVlXFznLPCLey*zfqxz22+p_{P|3 zUYw%eBY$(cp3du@TlcA3%SRVqR{e_niS&x08J!^FNrN4A z5_le{l{fL7);rE==9YB#pFlg9e0eHPB-cP4vUbl1Li$iCcT8eH=xb`i{9`(J$*`mp zP_f$K{ug3#a^zlXQ{cM5+bIv)Kh2}aB?(#mNV}-oF|fptz`e_s7kh??4w?JjL*phO|RN1~roT*|qg-g$$Lh zY$)dj`y6@xX=z_A%EqVPQYRR6_HGII*t=^VeoZQZ+C(9(6|!}rGBE|x_sF2KPI^cC zo=|qAJRzc*gU&reP(xO4;V<&O_WtjrnymMN%ulfS9qLeOv6BS!QL@-0;YmH699V`c zt%1lsA_jn+t9_3XW%*=sjo(BrazYPb`Zi%iD}V<3F-{?FbI_IW1e*9!M%l-48|Ww= zdn1yCD)$DtzAR(Ai#UA0W$w3WKhS-;Fq|knnl8^|#N!Aj zQGZ>D+p}p+6yv7oD{A_?BKLbm{`Qc2>!+!9kH^=iSd5i=FQhjvVfAoWo zcvPU%lou0W-ZvYyFX*1v#~ey`V5Q=Pj!bcW)F0#+xMw0okBN&L%aNNjK7}V$jd?#6 z=3kNhBf4|Pebb{jLmUW_&q6d}!7v9VujKGO32eP|OjhfXn zwAIcSO=u4!RbiX-880Ku_R{^?&ODV`&tG)y2nhsTu>5;xS$BspN_e@gnF(oMFeI9F zZS23#*3k1>ZOro+ctm0_PjBcazc`5t$42Ym z+^Y>j-rwInUv~OyRw_E+1tYVEK2JY_-(v*os3a-sMYX=fw~t)_8+uMOlng7krCXzQ zdg1J$LxQqj-bA`H%Mxy6N;DbmDYU-vrQ0X$*+JW5FAK0UNX|K^o3%h8DS`Vak5KKey0S-sGk6-Ds~ zeqxCs(QuYMWa6#CzweOVm!4^o^bq|{FqkIHitp_SZJ81g4_^WE_u#D1BH28NvUhGT zV6m0Ew%k~*mKwY!UJ53dIxvsOJ15ZMr%570sW14#LRwh>WoxeiWF)XvQ*B5BuLuvd z3TMHXK5r4C#l)|MG0g6Fcr@ir<}TVBd)-7fv#pPfBT|a>7R{@BH69aJ&=c5}5gP_2 zCdhS;`yud;oO@REX9{aFGjRsVkbQqQHN593{fdI-dz`=Qig2yhRCPeJ`mZAOnSZ!h z!S8~!N%vtniRjhO^W}e$dc3uN^Q!v_Sk~f+R~c6KbNAiVKX%EYJGFQo@BNRBYd_b$ z{|=KVd`OKzUnd;1RSFi8Y~Z^}!C(TzRV!14?<-L6x{i*3$@S0&X{MWh^j+t)J-=;t z**v6Z&5}FPPBSAeT?u>ev^0U~b|Mv){}=rfw)DaG?=m^%{3ISdqYhn9Ix6CEDlCXe zq)q=8<==X7dgx5e_}Mpq2#=F7*L}pf*r%4wXr}T*wYCmA0nWriN{&Z+nx+SV$qLNiOU)ZLkee32&Z-;x1V3;u+?&MQM zo?JMn6f>s`G2hipOugS=TEr8zWHfZQu1%HPg$n3PSY^=83&mw(6%sks+|FT@S+i7= zF4CbQFS6^trx7iJb{a*5PQL`_USSbuds5N!E%diZR07&BrhHJ;bRn%XPk`f*Wh)zy zJm$muUlZ@a0)DJipW{M=by4`RQ=O?vaG@jR7;;#iKv&=-&0q7UCcCsQGH26Lv`D!A zLODC*1d&6!?1>^MI<#24Tp&_4>v!0iiYw$ zC6YzT9WBK7g`|C#94|s-;QNq@v+_$K;$>LJuvA?hpE^ z83ho*zNM$Zv)e)}H^q)G!4u#LOdi+uEsOr_!z=Wgh;$OEN0G-IxU_weW#!;NKi8?4 zjxLwS{ZwS1$+reD7rMsY9%$h*tMcDFJgTy(|I9SWy2`4Zvy!3n*0QdH0jmi*sN~J1 zSHZ*bM=D-OTb_())us|dY`wcp5e~OjENdb0%*iB|6W@32*H+XlN&6V_Ii=M*$Fko`7YO+_s5djJXX= ztTp4={gxV4^Ys?gJ9dsJ03Q^Fe?J`d5}ps6`o3ucjAvGoR&L^#7bTx%-)Blemlh`` z-2%Fi7Doq=xuMOu`T4w?b!QFL41s^1#M}C$@Q20Y$06wp467QE;lGv3SklDgI;tFh zA%9KTUT{_58q%jr0u~?%h4{tD5smsoFvp`u5_JolSFq{YqrG$73|3NSPaJlrbQbMD#3nGp zqK%TKnRUlIe+rXpBh!!UmhuyZIvp;DULe2kAoM+BpO{__{s%lQb3IUL0UNg?e6;Q0ak`ACE%XVTvDg5GV_Nf! zV=@(}!jDJ-9%7>tUD#_2$#XPdw5NE)WiXbnaQ-PUWP^NeyCWb7ShwWUYe(tU6XYiW zhP;QL#3s$cs2*i2sKVVazkJ71c6FbO7*b7#NNmvgV$xh!u?cVJeg>mttY*KsPF3+Vo4=Gmkd^>|$Pq4)OGj zhWit%-h3X$tQk9nb=wQ(P@1P~K--~{(5T~OcGJ6N(!4N_%o5VPa8lYX;S#qRt`{UK zjC|zTnu#+`{Yy1A6H}R`HL@<`3IM*b>e_g{TY8hjBH~mLs7)POyo6E&dIu@D4sk$` zm|9Yyj3)|N*h`tY5#+PftENWf;Fs=SGsjulCLpnW3p#DxW$5rq{yYhb^R!@F9Dl*} z*+MENM5>=h2L|C8p_bpYYJi*%L#=o?nYQU>3-QvvWaqTgb0J1*fG&j1@k@tP`XgcKtQeS8}z26BXa!H zo6nrOey#;;r^`h`lt|ANXMTlN+Yuw6J3vu_r~DCd!TXkMe?PsPgzVr^5(o7s)aex7 zi51_kUm_{*?`f^T~IjT19I-ak)Q$Xx`k?U`CL7=k@S3byITMs1uJnDgD0C)#up zoui4?ETfM^BnR+jE4_m@Zg@<&x8gX+^N;ed1m~mz{eG8yp!}E!Rk5e7ibP-fewVF^ z&X_4e!j6xo5is+m?fTOnsH}LUjz4;@Xci#~S8@?4Ysd^kOsKR|#Ep7v5YBKnx5w-F zZVpMlEl#ZX!1?Kv(Wk!xJ1qrwQ}vJ~YVJ$L7v%?aRKX)snII^%N4hqv0Z$wBntbLg z@9i?PM=|FclJ`9~YMyF6(-{m*o;>+**%DtqhCh^O^XL3jztkeEdhSN5xzB%@-+O~} zqiuitG9(pgoqI12i*k^f?3&G-y%R;-wEZUHX-vKG{?*-w<+lphuL>i}DP9eh@{FEl zU!ppaOW0+v1u|(K<>TRT6*FY=6-8a3bSmY$FWGr1MwqG0hb5Ajz|ZK{7p!ADU;dh> z4q(C2GwqD)P%Csd`?5bvK&~-aB%B{}Ysb`t9@+V-SAh#sOu7l4=1%s05%o^|)QFS&J5Q|aQ$#JuLD54uH}`7`{bxN-B@xMo7|n6E z**9`tY(0L$>>I?^IL(5L6^=bYR^~fu>NGt3VtJ7n6tQj_4uTvF^auG~z)6XHPZV#< z95LeGXX%jTv6o86e9a{T4N|_pSiRR*N_$IIciYxb#l78O1}#e8bT%| zeGJSXTHC~kUPZvju{)~EL4jt-scc0H6g(ZUIv}QiT4s3bOp2L2jf^PSrt_e;4dfwbLg29XCJ+lwX!**ST#4dm}Oz9j}_zAXkU zKD?(-^qb}x(!X{MPSc4ZVpu%=l0je)hPl34p?9zIC6$f=i_Le?HZ{$5i<<)Y2G5~vpG7zb5+VL-CG&kEVwUr(WH}|^G z7#T~R4kcFMVRj^1h0tEOG)F-CI!#*67IXcAjY^*>>J{9GM5`>l4Bf!7*_89loHSDH zY*K4WR(C1I{z~_B0RZl){ixn=CRGXuvslN#;O4nb?gr+RYU0bu#C(?aV~U>azyTti zYF!lTo0l;1qMQhmfdG)8YIlcNQ*MuVbV>m#+s-;^XxEbA4pnC`SdZQb<@UCimG|+HwpSfY`z4C9HB%r%eSf` z^p3@CgMPZFi2)hWvkIc8ER|GCou0d&dVx5Lucd+-c!daBzfD}-A}iK43;ngdR6TfG zmrvde8}K=puyH;3TT%JT7xJvFoFS#9utI{D`x|uB^y9k`!x`|jL)`i9dXLV(4#6Mi zcL86uBGVUAVVy4{u7P)b731}*PJ4E|BJ}J(Wp*iuM(`BD^EA_WXQ3w z7NwZ!SWJNXnR4_}d<-5jm8Z$E>XC9~qhVMs-Ms>ZXS&PU!VM!!7ec{X9`Ww?>gM zVe;~3OsT}R7Yia5^#DB>6(-p4&C#X%c)eZMME*>|xg?*6WYQy{a5LY-*`e-Fws!UL zq3cS;N0VcDF2Zvkq}h*bQ}iDU-wu#ql#6PDLIhmE#(rf^IH3Ps_HC*9=EFzB*R7Gd z8icQZKh~&FB%IOjp?#*Z!>nUG>lyObs2!5zAAVjbP9Uww%q!6M!JB$mHu?9#+VTH6 zSr(P(2d6Rr^Ck}&5US<+e30>Pt>!JO!APu5s#p-YUV-5O!=03xGgX-+RQ$)u8lAqw==`A z1X!gIR)mG3k>AmH0q}%tWh5SL>=}`1yQj(Rq8vw!gD6qEY4p98Ve8ggEXR5=3Jq=I z$8O=H^Tia!w+Le$OBa!UzJ*8HO;N`W;UEFAP57t{_Ij)6LE!9Fr6>A!OA4C+I; znS+iqb}};E7^6{%Sf0yiuWZQta$M||CS<{{5INAL*blzo;fuL?6v9?v^WVl8*z?5T zDPHZ8mU;K`v}t^w28S}Fk+!%_4!|p-cVAQ-XumL zmC=-0!E#5R+9|jqtv0~0Txi>$V|Ex+5eVA!A0d{0?Tl?Ewi=xY5zluh_88(HEuu5) zZv$<7Ps_F_Lj92iLkgz!tLW~`5AtzLJ}n}0VakE~&tTq3Se;3ZJvM0kM6V*;&Tw>M z&*TpXvP zFUkw4!{HceDeh>n#4!vq=nK5zOHkH;XbwZoDn%==@+y88&2?{l^jX*%Je3uzw`^vu--y{E!XSgy9`a&Oy`gs6+ex?5cA=~|#<@t;| zWI!OaiT)J?_nE}MBHCTkV`1D8H8B-SXu_pL1knt96v)}`*pWht_KZ+V{H0`F?iaCZ zIiV3#Y_l6xdb_BL=&Tz89Gn?+WCjI$wA*Hiv&8zS!jzaj&o|4bTREc!bBP9d4CP@| zetI{kr1acq1zeeAH3*&1DowDxErckZd|U$i5Xt?7*38k4qN7q6e;eY~>zXfRdD5oY zvaUv~9U7qaKyAqW$LNx=<9rv6MlBU{tvx-0C5%dhzQ*k7k=A9fB_t59VLF1tvzaJq~w#N?`(2-E_ zmO@}N+yNMR2$n}As$99;TOQ;~i=4smLxvcY%LXTnqk`k5)#L=3*5wEj-{FJu8Sg zinP|lo}mE*pe#HM@MgD+Fz2R?k+7F=`&j5>D*xa=aE^4q50g0fIGMJyxu0jFGrmE# zN@^;M0u)y+&f&);zgU9^hs9t@hmJZIGQTG{>)GfqDAMWNJamJ;h(E{bp~9KTS<)%` zg+?B7$Z-sXCBi+%kLZL$lt0<$`cPGk;y`Qs*Oi1fydpq)Nk;840*X+^b;c#iBy@a~ zf_X9V)>U7Y>TUQvZpbDbdw^EUn%QmWJ}jD`DNox`vf7C_u->Dz<2zFW$&e!v-|?^$ zz(vu_muhQ7Ef6awp+@GFRlF+IoGWSh|H2Nljqy(tM~@^6tfI2N3@qeU^1 z6&cy|x<4PBbJfYefv5y+)_yz~V=<@aFn3_c?XuU<&kM8WB?+uT7V)KD1)P9WdAs!{ z=6*@iCFjsi4~SdLX36iJWZvo`|s#fSYgR)aovrWA$OrS&uY zPr2QK`hRy;pNS8EE=kIB7ohmJ<~FdJr|a&=)qTUVeNM7vS=N^j*XFMfB82zDq7LKR z2y#OE%b9nh*~^31r}iI3g(rR`EPr`6$BqBgkNr0C-tdHMh&FwWe#9=N3O=Y&UVpgW z{v*;lvCvmR&e}TZ{(IRWwi=~zmAV~Z_%>J4XLAXeGJl7-quxJqGyIIS1U_Laa4?VZ)=IxaHvkv-nY>{d|J^gW>Pt{nWBJSrO6Sta2e}P9g`VH zuhd!TKkFEEpt!RkBmUQ21(vo@!9$VP0TK8yz12fa8iCa7I|P-l{Yb{w!FjLXyb1ZI zj&Fg@g*2mWK}H(WHh?^00za#H-j&?@pR@=|hcB1jJ%1rR#wyOt{aVzV2y<7avvr76 zPafmkVCzM@=kBtxFSD5!loht$Qz7{8dD@!@!>%-XLz#ftD5Y^fV?un1bEnhoZjyJs z?T0g{+58}Sz#-FjOZm?tgn%dql&ZUca|q{~2gMaf zn_=vG@^6EypW}bMvrF%BP_4qYgX7ZQe}BwW^i=J|pCGlxC+~nqZ)FGUHu-Sovq{b9 zNYFpzF)p)~@CToNZ;#`AF;o~-I}MkN**b=$jsPkX4!pVRHBJY?nXQ5mr3sSul^Zz0>q_9cpDQ0*@L`@tB6i*hmxZ{-3iG|mtI`3F%2b#t&Gd8_0!B6~34G+CtY zSuj>iI=8j6bewaHl<(1w#22nHG?B=m#+$?Wpwhi}gm987F8*n%`ObWX5ZhT{!&!Uw z#Hz}(y=Txu%lG`@Srh`{_mT^4K7H&|SOcEN*>KDaTIX}s4xjRG?TPI#yx#wXa`MWl zgxDgOxy(>$P(hHF-E&@2^+i;?`(hfC+!?3uTp3hXZAT;^bD|0Az6hP3mqkt47wny% ziy^;~GUI~&^}Mb3T*x7V_jvJZSO24*u(D-w^wbVhgz;#->8Tq24MgAhecjyBHK~tD zBl0$qPt|fD_YS#?`(S`Y<$y&4`&dgEy)3*wLb47h@su$GVkz}*bHztlQ;5|*GLS^e z(!XD(cU}jUEJ+U0apG+^!-U_P!IunPEPTAcfJ8-VMn;2yP#zlXlA~lOx@2H{=?DA$ z>PrWfr*{fdkraXgi>igx@`>!KM$~G#&|2!)0p)hG|+(MS{;(C*MT{oFuA)d=I zpDzg9T%;cvuNG;2;U{L1dloD!{Em&+6DST5V(El-?x%krY)=x)+mXz5a_5O^cv4K` zyR7AF?O*rGb6Cp^W&N4?gT{M*8iAH$ooLomzunH}N5`BpsRQvt5g~yI{x*pGgJwwZAxO^P^louqQov@epx=*{PVUYEG zXidGqfi~Vm*)#ci2!fu^gFJ!~@=&Z4=smjIuDbu)LI(*B)iF`(G2cU%tk=VC!F$)th+qgQbVA)*%3U$Wr|esJ_|-yix*yshHKJo!Hsy%0o|XO_=&o;~ zZg`Dwg3lOTI3 zbDI-Nl&4(sKbow(SVXuudR&-u`)hIw{r$0wRgAFEM)Mn;$!Ka9TLXE_W6Zu#;~h6` zFOLD|F4r_zU!tY&GoD`{beL^~lBPbb%OvPz1*+o6pOH+OmBmD-8A?wsruwqUCr%vI zX4a{-RJ|jq69QMASalwR)pZ>k1h>`9 FqS7h1QGRwbFHSn=nB`je|BUf6!eq0L=wGk3b5o(y_R*{%_k=@HaHE30}xjATl#I8Z(%~QNNSP`eGPPIhd#F7UbFB`EnM|*YNfn{~>Hs zB>Esdl7l=WTy~7#$HV*JR)5mm*&cQ~Ub` z`eXn^=^99~L!MqBRWq1A@oER|;~fg2q{xlo7nvUuVzHy-dwO>okciHjt>-mY2V-`7auEh0Drjz_|*9y0ZX^y_W(gn=OUF3q;r}g+>qt*+y(g@qFf@7g-1{owYILS># zujJ`>zIAlJ8+FwTf-JF37F-x!UdqQo`1X5dS!^_qRH44`dM3W&=X4pU2lJnVZQFiO zS!c3(f~pkAu>8;?)oww@g5Ikqe^d?D6;%loPhIfDVS{Q|buc{S;`8`$P4%ctpzDIt z7KsL^0)Jfz_Q^*$^TBmotmwIBRcV5jOrs-*sFmk!{;-3YB1p)EP~qLLGi1{HGSvHD z(wr$>PywR0CE=c2fcesCKnc0eaFSmPGpV&l$(&*mJF6h?=}Epqpjlyyfmet-8}XJ zk~`mJe)JH0VGYROm@` zci{E7O+1QtMjy%Az)$!weV7CP9W7}LV7~Z#iXgV-^lzK(P8-vng{g1yJvLBUyxhv{ z>O_k)T^AKa3BlZEWg2USmt@$i#i~-2oZJ}QjssR5C8xuQ5G|*KQS-P{2<@tE8vCmw z7`QK$q=;KtyQ*a$r4=@-n1C$xuJY4JUd>a_pH6)imD|YGnJ#UA$9A1T(VfzLpU*Cj z#E%fKdUaUV7k-V}KgE-cG26$r+%bD)62FE<2ZQYZak4VFNtR!9KQIUH029EW7&DY8 zt$yVO10G18$h+Y@TNsJk*vxfJjnEH26(G3@tsLsFb731v*%+1a0ls4evfW7Q-aXY* z5ds0A!`yejA%T>%e>BvErOU@038reb!VNp1{HIChqLOUq4MU>gg$$wldL^E~T3x0& zh0h~prtC7vJ)XgAnp5}`IR(867;-~4hhvH78Q$4W0m zj!EZ^uUe}o)+!uP@S%zqkY`Z<$xr=0%s$R~J2zLZZA3;$yi;d)=Q`8|#8@GV#k521 zd{L4w0dH4%On;S=f)@mBl;-uRp#z~apYrSs9{NKW7;j-)8EFP4ZkM@g-luH zxI*>MF!rPG02u0phR1`V;-M`6x{gj@Oqm6ODDD3HPr(>}*G1UoKa=rAH8ertx*R$G z7sbGSFc%tk^V(|;-(f3MkccC4=s39_*+LN8_p&th79~{-0)Ilj!bFTuFl>ql=W+&{ zw~2X*?nTH&+(iWF9*18+(>LsT=hOMC@@C-vF=?8Glh{3-!P1%~WnShp95aGUzDUt&*z{PvmH@y47;_%N6LA zV^TnV_1P@`2ncM~R7b*Yd@R(>8?2vZ#>d5s?GFf*@j3T2_1E=kjyer*R&5cGshByW zbW|4;fOB}R%f);sp?F44H4~A~5{9+39ui@!|!&j$zU5r$e#Yi#n&W+W+cL8n#Vs~xd8}rjKdkR0IWV?bp!4BYV6L=O zS=CZx{9(#1#bX8oKDIN{1~B^h>fdPX5M&mOQ5czYDQ)WP%KGM7=7|nUx-dC^8aLol z7RK|WH@YgD%T8^3>c+Twv)644yg;%QuIF+!=MQ2 zGO*B!-nVgYbE~q=y68?r8_UtOSfTCAT`HGIpvg^ac)=QiXXIyXLuoB-yReI2uk3m+jrd>G?w#krs?8 zQs1^)Pj#n6Fv^5o=v~`paGx3R*Tdw&pGeR_1B{RP-z3*|vP(kXd1cyh1CbLY(NG%? zBXy{5;&%7(6sI0hzD;OrBG?%f*wukNQ{sW}-)?9zaGPL)NR?tZ2YEu^u;g!Mq>)Vw z!_ZOV9rk^Qa$CQTCQc7H72+cMm{*-O;nEiMdxIerP$0KQyp<8_@F7MdgG>yvEPH6R~z}GQ~;RMxnA0yh4e2?wFtgXsKLnuC8Yw*SU9!Gaa%Ni99qo<`68`F`T!g!p&eUobv@rS zsZoez_@Ab!W<%**@T#36^C7I6#1nirK>Q{wq5Scb$jP)>Z|>n2olu6oH0Kd!UiysN zaPhFjDKI=;xiD@RE;um7?iJX~`|2ZrW79fllZ|yWD@}{rnAjmnTFO4yLiG7daCF$T z3(YUKIDY<+G!=czvTR`J%JW`z&Tp3WFjYy-z!Wj;|EAYR-RldEWmXKj(B;3{5M<=+ z_?&Qrj-p^#DZ_VM+>(x>;={!K;l$^V-t_PQ1zvGUh^8~ajx#kHM)N%Qg`{v=fud)L zpTSPR*phKu_hq^wVAzDOogKqX!>Huh{5`w9T;N#UuKokUa)a`QK2C7z@XudSh0?vZ z+XzI-Qkp+@(40})hIG&GKSxuQIhp-q22)=b2I`r+&V)mKju(*%XUkD8i>wzTsUnxo zoOcUvVMdk!jPA+OS5uf<=`*l!%IEW^>#+3kK=7cQ{m>*B*q*AE@Y~mpRD4Bo-@qyf zR|6^y=iFU}O}$z3OC)7{ou7rDEH2}^sF{v9Jd5JWEP zzW1WNLeUe36I5u{9nVF$bv>@<@p~egWwb+LfTIm%T37eBpVahTAuXaRB-X;Jj?fbb3*+$UAj4#H`eKErcTJ6}|E<*es`ByD*A9#oZX1`f z8dejJ#Dm6Hi*T@QiLCncDoJIyfff|~h>f~-&It8m$M1RF~)jhYWf>HNt2ocjz*<<#U!s5np|dtrc+tx@6pm*Bx&U-nn&)WLFq=@VCJVQS@|{3|k@*3$q>93FebW_+gYx`d?7gxHKXs z?NN$nqIEG#WyfayC!ZsDill^|;2*iKuYIT^2tt$ipuV>r@R((45`LP(3VF(r@#q!Z$Qp2BuETAh0?E{9Tgfufj4R1+AnF8<7TpZo zQ<`n=%hxZ_1r_O=`>RN*Q530$^eYN09$MydhDUQ%ORyuPsuWenwJ93cVusOwV;1qt zP|$HVJpmUq|CvA%{=Y56U^F+T+ zV9&}|n6JlfGdCyCKO->)zep2tp_|Q1u?V;xysmD~n8{AG_L%RS=eF{UZ$Bh!v%;CtwWWjfRa*uN}ScM_Lm*~VA=pJETrZjQXA#hp zSP{HJ6?q^y;?T?L16Ft;rs*K|ng04wy{J!yeQ2Z_8NVRk6W!Jg>fKLJm~sJI{gNJ# z{0hc6yNN+1le>C-y!3efuS3X~K0~En5%0j=X@%)6Yq@FJ_>Ai3J!gj9Tl{CSwMkUP zZ|d3|=B9R$DMI^C^Vm5-Q=-oyAisM@DzDbAO~K%u*vv{;n-kMdNXunlI;I z=e?cV{5{}YuSF(=X&M-C$Ah6$$iY@yx6}Z$D_o8-*6fRt<^>YYwHAQRorFM~jcp~YhP?*2_I;rC+h4Xdu(Z3)-k$!9c0)(=}5pbCR<9Uwj{=F|1 znM~0Ph0@#WnJWmqFM08^9{-|o0EZf%`}5$wu~g{dV{(#`_iA}cv0HjY)0AkDi~G>+kS!@?-OCDfLyX}c&=Re$sqS(-Bs`(TyElIdvHBTXC1=)~Me@ua;97^U%vzdZ7bOl5ZbQ zm7bo1J2O3stA~l#M#C7SEhYt|UWmG`_Z*R<@5H~V zj>Sm?o@&cMwoI9Lq@CXU0Sh#?TB2#=@dxgmr*g@^+_j{X4%Fi-3!?vn$;0)`U?7kq z3|S8881(iCOjr_F_hEvbOcL+RwfS1y3`@t(Qb&^NI2RRX+0jAXwC+O?tUFp8Y^wJ2 z^}e>CJ~xm&dItSGng9kThzZAN6Vd_U`3&4YSQQrA41&#{rvpngbk0qJ#INircf25#>?W@ ze_7MBLYwc@W%IAjcZZczJLs0WPoC}+A1@8z_WLqG z9i-leAG8fms8a^~ zHsvt1G{(8xKyfZqnd6xS0V+-)(6+|U+uqgw=eQ$L$xZ{~ogha2=M>Pvk6(P|%9L`; z;uNewuMsIC7OwF9(%d`Qt}UNMyFOQtbL_{x;8C_yQJW~aSordf$_a0$$N>NFRo-$m) z-J|k5usJJsu2X7<+atF*$GSKiaL9lEhue7!A5*5{`Z@@0>|W0CM7LNiHb-}~aZ+XZ zg@}#H%Uv_}N$`Fg=FF-yPpyM)K*+xYy zzn(Y;ep@-6r08*KcE=f1>eex#>MHfpexeKG1GX~B*obd&mlXW*Bv zm14C(4X&F?q?0{dF(r{wJ)+8cz+Od(_TBz8q{2}TAe|K!%V%TfR@DAU(1V;^74IYs zZ5>8#ZmY)DG67ao&czWi@Zm6K*9ljMS6g~;qXQHPV$e@NgC!I*o^C@zmYh4F13-Ym zU#w`t7K-gqyRb6*;S;TmKm}Ixa1bR_sG{v;BsPYVP;47{bOyhozB`tlvnFsJJEi5< zJyS3@Al*rtJ*qC4Z5hRN_*pKx7q=fTj*g;;n@k!WCx1%!)C>O8aZ#-w{=IQb^cq!RI9duawx5ZB#dR?`olop{t5F5J;KTcS5 zYr8T!^H9+?#gAbDNy&V&>NsZzj)4MSx*W?(e8?Mb@yN0{T|Zy)!qOoUQITvR^H5qN zQ&88uFc(>28`3r5;sU}SX%1!LOj4H=&@9V0H1iEZ(+5ijN=Z&0RH!ZE6^kcpbM*>B zJ4N2biVx@b6hx|w!wficRi~xB9mtJ--2XAHpA+#mo}+^~W)BO_eJf5w3;xiPRwToi zji?j6LaTL^=@Y};Uof@f^_KUR7Dt;6i*b(76;`AY3cX7*)-0fuYb-3XPJdmHVd(pV z9O9e^4jncyXzEc}<%?WRKJnip+`6vqbN^K2C4dW#k-Zp}+@l+*Aa{2G%3+Yg9F>O- z;DY}U_OK%I87ZO`Et+t=$)RQ`_)U}DA;Mv!>MmKe)>O4E44#!&sG&*C%zzGK_dadO zA{zcI4wF)C92>T*hm3ri#f04964{6XAN&Hhm~6P9h5S(ZsP)8Y!{-mIUqu5I!UYeL z(4#QJj8AowB4Sv(SKK>XSrnxs?%)xoQt^cYJ86y-;l0<)_rU;JEEjhoH)zk6DlD0ouEnIa4dNk|B%Uohy?O|lZW-V z`>hCtEpLUCd1Qbr+%SSkujxeH3esRvtWQ$iH_95;_2E7Px<}2ws;r8mLro)`p0Fx4SP|)8mZuw_f;Tu)qe_8Ewv|@ zdxU@>SpuKt?GCEUHjio*Nz&rjWcq<|-ECXoAtQ9!yn`1uZh3)rN7^=hw@vZ>IC;yP zS!l#9lZ(byV*R$5om3QZk^O(y$Z-$#6^{`mX7#)O+5T{16leqv1B_Jcs~y92RlFnB zNQ3>9KJSl^4vu9T13^R@%HO3Vr{vT_W7!BCXg;$QmS+T@Z3t=R%Is+#b6AcBAJI04S)+Z*Nc8UU zVItOL7qa$G#ZkhkG_2r0O@f$dhqaTWibyzn2k&jV|LZ!IssJJWqG4zn%R?;or@x2D z9sk+Vs@`%XLv+?Xi|>6xafm)0`88o51x6TD^m>a&$cmdo!X>(xpj7hZat%_3M2UOY ztv9+!QP4Mo+2QO~D8?d1na|kAI|vL9OxWfV!SSB$3-TKw_I~nb?uflr)d&uwDg20_ zq4~iwq2;|Sl(Ilb49PrDYLs04Q}a3|-<#r?15DM+6B1P<^is_(?e^UDBmOKzsIWHz z3lBvs!)HKj54Pd5))WAa$$D~_a5@-2h#SCh9%pDDj@bpH3$o7rP-DyMTG;*unn-?O z%HzvS>pWl(Q6QM#dOhSdfo#q0Wi0R14<}3Xu5IR9IuDqcmEAqc@)Q-Z+@ku$xT=?s zrBFC)3f-kKH?PBafpWFBj=JLTj2eZ0rFWF1&+s};n(^|eWhLeLeu7_jkW7xrdmA~U-E_pv!dQN~mrh5htXJC^)Tm2(!N+J^h6qxL4b*Fv8%KP`9vY3epy;NmNL zo7{ShW7Viz^mPxRI%kxt`nTTmW`H}n;MlT3L(Xl!zsTNTr~I~snI{)2q1gEW(f?l0 zKqOR$ddcS8c_VESjENdS{-qFoyI@jv7Wy9qSZtxUODM|hYz6jt`QQ&L!Yj5Y!)!?p z(+<<=BE5UoeESiB%4Q{prMZn;>iism5c=?uLU5pEuskWG#(9rf5!k#z{nl6TewF#3 z-)B@|gR6D$gy^E=`IJgUi22WQBn;oh!NZHjmp%w>*+FCBy>WxlSiZC3XL$d;;395i zG`(B|4_c^T0o5~vRPvGlBW$m8c%LSCKv*sM?d43tBJr&>u2k@Vo(%`c@e*3uMrF2! zZ8p~19O1fP9@pZVd|H2HS7#iyc*kQ&t#ub5(|sMrn)nJantMZ{j{-S%Dd68OQ71h# z_m3Sa{ zX`&i(Nz`Y9;vAG%t&(8%FW}gf&M5AOFViHe55Q)M{M$(?H?1qE{n&>o?`{oWg^mf< zqXq15Um@7u&Lhxe)dVxE0!_yn6>in~WM=&XC8tuCaf2lD)MNK!*Pv+HqJ&V=D~1d9 z*C9q@@|<*Z#WNY$$aJqQ+y_TxAcsojUXj9+LPW-Wf%J47-;Ty3B!L~4_le~$yA_S! zMxZ5}lb4+#hkn>eG-KS4WZz>xUAV?J8dyH?3PDVtGTxq(tmRyE(gx}BmC`9NdGHdi zVQEX}oHB@+C*Aq(L}F~gS)*Z>Ga?D+&{`7#0vm5&>nQwtbSX3e?0VJpk60DHr$>MKd#4v z{xF&I-tJ&h1Y|wGu}?!BgkvU)KWNz{w|q5;^|tZ0Bcd{Yo)8GrrKg7MNPID5`Fh1yzJv zqr7@8nKpkpwxZukfIayM6rPNxfmXdDr0n9OIsOv+izOmJdbjNL=ufk6_}rY#gtCNx zAqk)_{ZBm1Iw%3t1{0~rQoiaw-XiiCUfFGtpZrzU@JAaR&HVg{wmOx`|U+2auz&zIlC6em#>%2+^!zkyw;$3~8!q(`}SeA%m0pc|krW8Xi^u zPHc( zHIvTavMtQqP|mCE5-rUX>b^AZ8XQv8n0zaa6jRv}rtg7!PTJ*j*TiC>`y67bOGO+h8rjwY|s#8Nie&dAH77MfhX3Q-gX1 zDE+xW1pFuCHF%YNKfe)kkM&9<{U*qTieFh+lYS<PDo)<9-KQ? zM>c_9=TLaQ5^rz4Uz=cUpLh*${mRL_<;5|erwn);W^c?Y|FkWLW9yskwr~GbCmMY>T4oM$Vbj5<)Mr0hMX4JKklLjJvCG>BB`Jeqh)$b*z zOXutJ+d{$lfqz4L9-|XY&J3^43rx9Cq(}2VWY~U~QX@p)& zTM&zH*%hS<5_&2TJwMM_Aj6HKuTGFx7_JNPvOSD%@X|0#w!?2~8-vkWXR|2qQugt_ zf4!dgXH7Tca?GYliV=W}LgydfrTiI9PF2K;S)=8LF4a*ka)3bkP#8ubNT5v($ArWllP z?b0S@&V*@ig!czm%n z{cI_vy=Tz(Xf3Bgi1%@O>AgeIH}=%4wIvC zKbBq}HA}7q zIiV8pHFS0@Ii6F0y=1gL|jpSd^y z?Ej*^Mp(FY585cNu|m3m44K>HE`G@ldeFe*tbI7Q-jry)5LsuFewJXoP} zZi{Hf_t`F*6HWVoWX{bX`!{q-BARZV&0!`#&~+Eq!j+(2#2{+=+JHhMJsIofN8lF= ziHM z-uk4egOKka%|~rPlr%W7oz#J#^;utWI%xCD_tG_;NTBEnIwXdr5o-Z2g2vb5hQq{; zfRSag#HRoK&@YK#$PYqB+?T$kS>r>?EPLO7XtYkvzb_%|K;Z6?1V(CvP^=)65W`k~4Hgv~eo>n#_D z!&Ga6>SHDmEz7D7b4nKQRG#EoURpUK6Kbl0nWclXtKx5oVC}yN0l@I+H-ogjy0TTb z(7-Nf{Otbqe>;zarlaEc)?-^c>C{vK`KybO?3NOk7<-u+#(GUDU3cgh^l9@AcFN8TG;QQhlvmg z?5sjY=T<*qal6Dm3wYKwxAy4=Y!oF9>|+uo|IzQ_7R_xTDvFu89&e_nN#Oa!yuHLj z`rBzL^^%*k@hgO+l1oUQN~EYZKjxe1s)tI>+2@0jVxi);ii#2trBq9Rl0h7z=do;8vEawPKadFg16^xs$b+bWUK*?~t4ihcMczTx)NERRQ; zwN8UmsD=Y;ZzL13A~`cm zhAX+LhAYtP)iLs1JjgcD!H@a2yKlLjPmr5q`!L`QJ{yq`mlo1J`~eh zrj7?2JMVUJRZWlv+N=VPXfcAqotQLDxkw(bgnz2Bfw+B9H*Wq54;xDpG$HlL_gNNp zG0!E)+1fN&W{XIXr!`#Tcfg1y{6vO>gYK3bnd{5YXHP*x(J|vvQgTF6GMAttJpiSzbpZQz0gew9?$l;BouS>Rc&oxU~Ir6mwH=k`-#%EE^5n7DL?aK6y;y^pm2 zVBv3i)DQbl**(U8^A)h>a<~4SY_-j~rk|On zYwTI+rtERJL(P@aVit+fM5Wl`A|eTYu$D^a|ooX8;J32Bsvuh}9C9X&vMI6zTdI8+G3I zsjr=?sBgAK`4&zl9f%toiViXqqom23u}#_!c|GPXvO9pKr;7k>aSLHs!U|1fnHUQvC2xTYDpdypQG?(URMX^`$1TKFQ} z-3%qt-6bFhLwA=*4Be8F>K%S}-L>wYFmu+~XYc)a-{*mr)-bK*?y;)T0^%&%bfT+p z*k$ed^hvW`iqiif> z40%hG#&p%=qQt~j+Ocu#>tkD#xXp>X1ZSo;j%BOoH=QjHBU`;>V)1-&bWT#Kuv#Na z*2`pymAdw?W_E(zwAQ|}*)jXi1EGS+Hsthun&e&xkm@RnH~2~WHZgbuVLW< zz+UaaWwPh-NcD4qoG0{u}6AT313bBBAfGFWB+DAs#2er1F0v{5A!A@WF!c znT{aiY}uuMr7N1|)->b`c$~SfY+Y5^jo2)HLB&^Dl~AP?TpDokDI0`}BxQ?T$ZfJW zG=USO)0*;;g-=pSGYDx?G*^|kk2A1UU(yy^i2=Fu8PE%C{|)9Z(HW$d)ik#QvkQWL zmcFz?`ggF>3uQ}U+&!^cUQ#rLwr;tj%?SsOc*%^Fmz~$bX5RBs;wK_2?#H=P;4~ha zg#9{BPeVMl*wS!8BPM8iHeYmq8FpV~7DZRn2J7EQ(_Wu%I^cp}8{PnTfpI|Z zXzVhj1}?3I4+!GvX>P-ImQBkgCI3nNzIa(_udROmhd1-jLUz^=hcS*rkcHUry;c}t zUdb`Dn1F}@U%Kpl;CI>{>wcBu}-?8n96sa?p!gqclE`vkPRB3+62QnpG&{3mDY^>{P36@Ix@sF z?~>soyevDTo%1|6gyS`w#aQBs;84_b(b@Cbr_5g3rtJLhjdUroH1j-Y0o;p0yku^L@z&r-Ou7@db z1*CH66e;6Mg-&Gd)C|~*?^5*Mf!_W;7@IGYI6lV*CzSkfkq=Qp3q`g;7V%Gez({$7 z2c-TCGE2@aP|J>Lj_C~s!6$uxY`Ol+Ne+9oK2lG^QBw=y=lfcj=ppw-DnB}~LLB|omst@XQ}epJ8{T7N4@BR3 z-n{Sq6|mBMomDFS5#<|}(%B$!qkhXXe1gPjSp{lOy|it_kqDiy$LeuO;zkUFF~6-T zzcRbqecuL1V;8|KRH5_^~UzbZuIK7Yh6B3Kx+oiSH1+?gwc3`G{6>4O%>`~4Byl|#H?d48gc4?R# zh$nE=N!2+YhPSPfFGaEXDBYQL!;Q?rg!&gQj9%4Ppm*kI2{Mv%u9i6Z4S&h@W8OA@ zHJqz$pZRa|CZ7=v1#y{>;_!8XwPf(YwXGRjB-*2#x&u|Uj_t?V1Y(SjeeLT&u4T;V zqQETcLBmr6d09ylDgo!Qwu4vLNSUKjOOLKzUfqY>8wwvs<=$B7R%QQ}Z~Ek@`wgx` zxQ?#Tdsw5-i_U!@u|g3~I+(?`$m@qFt}1+npW8%Jg)2nOSBr+j}|`fPS1#%?|Fcl%xnwjK*!1+b)_MzAXOnl^D& z*pj%|3gHhjKnu~1Drz=^iQ3)?0*93T=Ne5{xh_M1y03Q*b_pq+w)>U=B#C$ti|*M* z-c)g2 z79>!70Hh3;ei}#=!y-z$JsKYD^&1h5{qb!6J(!<_-^*w);uw7Mnmm*lgbjS<=SLE{ zP3->n!=sn(nC@Nnx?1uTU058RnIt23zZcA1$y-(Aacx6ByW*yDfL}^PP>#>->!7LI zJQF>QY?sSE{7AYrGBFeMyG7i)H2@y*70c#k*=FEsk~IF0+)NlGUf0B=3TBkTg~m=j zV9uHyMt#njzdTRqcbm&+{DPt86+Wvla2NltO7l}SS$G06-=POPd+-%mFihAvQ0j3^ z)A*ed_8b#%Wb(>?G6MZ?*GiAuu6Afy*6KgFCFC=5mO5Yc$QlvYhrLdW^f|`LyRUbL zq~TJtFq|PLonDP>PSyOH5DTDov#{-J2GC-iRBT(M^X4g#rr5pANR-zm5avKt|7-=E zia555#|~h>mhZRW3_aU%F*M3MR7P`K>yYAGG1xJk>0@_t`ydi43J^s!{9cP%cc!lc zv3PVd3Ok_lsK z`0U6|0c7z9DzA&TP`)1&Ufu)S`uAsx!_@(OAxjGS^W7X80}Jrp?A1ysma+zW0%@Pc zaW03d#yPi<%CH2=@}P z>&x(d!LPuI1q3t6KH?QXyha*{k`TIEN68uDw=|}lXoTtk99hEI{3iGQR8n>0p9m}* z2|q^5GQfVzM*Pxy7(ip%^iW4bYJpj`%h3N6NogbvL;e~?qzk(t-{=y`GrJ2r@taYk z54@Jfr!e0>!4G`N?)3dUhKAmp7FQflwQ%x{owX@_hU2~(-m~W$JNlgiE2TMl-QuyP?2xg-CK> zY*@oKz91$kPP$S0x>0Fa-(=58bG6`z3UQ`{>IvT;J7{(wuJi$hnYDe@RYtY;}S2Ha7%u1TB)QdAwi&wAr&PG>PY#toxcthKHeXhNR!3Iy@*ztp*ZVl&q2 zGsyrTr>f=fNPsZ;aMC$Jh&%^-7Y@I~7bC`0{z6&@M;kq*>3;s?w2mZFGH5!bw9zsh za%T|<-$pPQn<4ZFnQJ?J7C;u-@P7)zaZhyqj%|pAel-vFgeTUjyMw1biGw^n2(fNLg$(Mj`u!>@Y5V(Lwp(F?%1dKeLvO_{} z##Rb!04N$E$Lwj2!uXy`|JKJV=K5jC(FBCDSV$D01nm;X(#q4N_rhwr_DSTRVs)tF z>djYc;&N!ADg7}^V-Fn(r82FzU#4%l7RnZ(LkPFPqZ-5@x9>4(OsL)yJ9MA}1#n7| zo7j?(1w@+4$L{A6ouZiPYIoLV&+%V%7^X2^8P+SD6~ssC-~09h$GQRs#YCLOa#~1g zU)SGC21c9~D-6JQr5S?;mvgUfzjZwuArG_cTo#TmZ|)#;Ynv0RvaBL?S&Zilv4-krJpPA zWsnhJR(NNkZ<6RmO%=(e4U}^bWgc-xVWcIp4F}3si%Iag5|j_gxA3U-!uV8lh&RTk zf}vxV^0E556r%Rk(VdLtHL)FfD*`<*gLtdhkffH~L1-dQPMg1^jfIz8J|0g4&v*#a z*tji0)2h)me;sO8vJr3$KPFi?V7?MT8^0C5PDOuS7()7GzuJ%cW7?ug9YRuI&CPUk zM|TW!6=+QVz|$P^JK6i3jb{OxK*P@Q;{8aWmu7vB5T@#%$(M4>niCS0tj}gt1wzh3 zxQnQTyT+H5V{1-jW^93sBiK2VlsET}k=EIg^>MpK zqsXu1RAJ1{#UabsHl3}pU)|tK9n#5_)NIcF@I9CWV=iA6=O0##4fp5}RCpZf@WeSE zy$o_`Bdq^GOyYhFAj&FcQqtA%-XE|5S*8W{>CF@s)$3OBWehnaU3F?x^@*=6#*<2R ziG+~j-DSlwhGu9Y4b>z;PKyKWx@HNr@Lc@g*Uo)C6!8vm?y=i; z8SQ)XJhisHd@`VH-)FU=v+wq^)=gMn8Y?F}j3g0TXm(ut#W69wyp^_^jr)A71z`2& z(~679IFXODb4_sG!kG!s&bVOU(Vdz(q>w(sRCaG>abu}Z6H3EV{Qp=0ZwMB@CVDwo zGRYY!#kcmL+hasd-#Cp5J64H=6A>SZC6pH%%&|=(+@4Vj zjeT&k%EgqW_*;Z>%Fdhd-#!JDe4d0?L;KKDQI}DZIx$74Ehqgrl!HT{1n=(rBWheR zv5cZxLar$kw)vp%ZU97-c}vAfko4BcyDV^=kzWAF)I=SVCshPD^#m+o7%Z?ZVYrh^ z6o3LP1y7sP3LjjG?0Ic+!JoO~;4T=pT$MB{&GG~J=vcY0+;d&CMW|NowC{Epq(hg^ zDCL2w80ls_NR#wLM6#bpnEP;m6y&D@@x;2iGW=dyGKf_OBlfmnelO{4XdxIxm+L)t zH06B)nNmavs=>kCQ-Qud1NO1L0E0VriWrlA9DCtIJ!e~IeJtDCD4~|mZkP8i?eqOj zAXWxs`D_6_vW5RBDPeT9TCLOcmAmd@)@|p#vPc&+^4Ne-+%|A!Jbx%;?!?VtHcT;+ zahl){~7X^#}6|o42d;)V2V$9=$vq6V zTnrcCwGY|VTWTeUxg zPXxJvsvH`pA4dZSP%b}xSB&aPG5K=0124NeOT@q3!6uqc+q@K~;f|;5r#CF)M3H+) z8Dn|q%>Az_qE8|+!46oCJjr90+vP;>6cvjbtmH2gNHEl->eC9fFR(GU%(5R8uDuUQ z@oV~CK}n-lCkIfdA*o`F>%i>j!!g;kyEg#^*u+>on>wq z{Z&F?T_gN0k)Uu*A^N+8S`joUA{iXX_aW*7CKPBAW_K@quJF&w6 zq=?i;Vzd=jhLUJuQhtCTd)dXLS>cB7^F=5t^yE+-sMJyjQ}H%#zL%ge&!4jgHFWM5v0IME>@g4)ej=`%rqcDBT>jtrgrzZqbh(8e_E``c zrEpUqpBl>ICC2D`l*zw5WuP3hkWV!^Qf1n16yu}?FZ{quRf5y06j>}Xv#ggE+|$3V zl>~zZqcJtJ!!y&h(On%4TNR7i8kNlxmZAKGB2_iT1})&(V#U*99V6r6D#tU-wHF=~ zxUZuu-mQtjkY573Sp1!5G`2FRp~DoBQPGUchjy75rX{*~RL&GZ<(!l4t0 z+YFbna}ZH^yOGz8_9PBDf2NjPKVMH4gr?gc9m_&x=9ZRX4ZwY;U`#4R8zGVvyIcK; z+!FIK&ARW3FVSt*gOW0TUrNw1$qHGXM+z&k&zDEycD$&Mz}lHHdO)-s{=>TdJzB?O zM^9k)&h1%F*oC^3Iu}#15l~rC^*DP?^?BG@^wb2H=7^7g*>%KyDI4Sbk9UX2KGZs5 zwEXNiCQTl?fMRi(_NM=u6%LiY)OqiIrA7`aSE%z*Z&*S6{rx<;*ogjot)0f6?7P#( z1Vdd5H;ERL%+#Ua(d4_x$I0w``q_8AFjK2+cCy#tbK{|vNyz~|&Ylo)%p~nL51noe zp6=NW!%Ew$;DzkXdFl`=E?}%S2sWAv2aMoAr%xB>^tEVc-vdd6IR?F)t zfG;M{>p#Lr-SbbC!!eL6;|tdm9(BeZPtKg6>Gh8=gImv#xJiZ=oq>&CL4LF^5s$Cx z7kc^ zrr!hG2V+N-9F~>4zS!xzQBeS4yCgoNxEyH#%&Jk@<(u2IXFIaQZVELKT&+O^=sGI+KdBd+4QB2 z6R~9vmxIv`+7ShK!R>h-#-wGjY!bieYJg?7Z&q48!fqLe70Zk zn~#8?1;rpg<;8s3@csrpC~1O?b$!v%BU4*)o$wX-8d(~#*bQ4(Z22^rwGG){(!*pK z;jM?O{b<5|hoFo1ZA!0HT|J#PFkiwAb=19eq6_q%N8d&yE@0?@BTN`P7v19bnTqyt z4Seg32bHpQb>DShS9UDn$tePd1+G-T`QbI^l`G-(wLAa)ku9~UD`IyMtj#mw0Hv^ zC-=s*fo9y8zyBL}SMx#OJbkhY`$#|z$TWfW2v6)DR7?zJ__FYeph7wCg{>7l>B;6u z3{2T9yMIMf(!3a<}2R6$GV&76ih(cNr1R@C^a#1}-)P}=wV^m;f5?+h!}P@s-Gj&*Bv zr!V4GU?tfu?%;};pdYgGW6?tukLrFb2W+>~01qlnY%H&Jr@R8$n!&`Z-bQ5QJ~;~a zrhkx9dKzQCo#E3;VT3f7rT)sdOr~=*p!GkBn{?oXGlC7gx~YsQtE}N*v2H=*XK(Em z=lHhx7H8s^Hq@}@5x;WcD)24lh)1b3q(rv2z(h+Uj@yXQnjaO_=_lxyjiZU@(04h8(2A6SC9pgq*|4|S zEW|M#lO&=bZ`FT@&`?RsZ^Xzzw^(41&z?9@&mi{idsvol;r%3&$5f0~Eqfwv&+W+b z4HY%w4%-=PdCHACk@*5blUo!5og8^TN__1M|AC05nK;mk02IQl%Fq;xG^*pdh|}u9 zI3p1!Dc!{yI-7})+TZn@JDuU^nClre{~kLXTd29L9R%?KWfmVpzrmuYx?%w7lSJ+8 z)DincM1af9IQI~2-Gw}6P9SfyO||#X73p%PcN+y6tY3zyp~}aDMIE9B!Cyh9-mCc&w;$6*m}M z%U9dYKl%<8-Bj|AMMTy7T0yBP#$eI1Ru+?%ewy?)KwlUbmAovMit>sw=e&x}WW1?v5f*YW1`7{scEfYy=y{AFTr)K> zB@<6Iw_l8I_lTzD7zm72*_=`oLrS||=3bsuj*69<<<0ILDz z&kCFZUfzyww5R*wAARU(+f?^rhiiO>a1FxRqYQd_#l8`Yk!Fw2*u86`q~##Bbo6vvngAL&(jfI+ zaiWc=(lQw42^wa!z=2W4FQb!z6#OTIt`9V6sOc8Qdlp-2%8|Yitn6_&q2=zyT!D`= z;UCX$6o$#wBY87k*l>fk>v2;I-0ou!m;eR@DA-m>sJQ6Y$1Sa$kRC)?HL|z2yWP48 zA?j%32bj>qxCnTw$@*_{W7JA3l@TT>FrG zrJgPdMc(tTRKA9TVcV^Fq~Mt74_t7ZHpziXbDrYG)@tz&nAMMUz}JxlkAqI#@kT(gShq+=CZt0n;s-Mnq2ZotXWk z^`?lo7{gm90VykC`RxN!_g?5 z^tF!Om)W$cqHO3ZfwW)rh2N6)#~JfJzZ+wktI7fG2KnBrJc2lZC#}PnW4T@92-z0J zB(1zq0o8X8N8Eg(X)y@!MHQ$z4#yTSkx_$&JP7B)zuU;e*qznEhhkokYtZU%R6nQq z%7v3*EzX{@uUY@!;&A_^)**{Ee&wrM5s;DxYdOsy0jF_3>>YJK3g`!6RnjJRD-Gyw zF4B5Jo5<~W#tWkVf;iIJP8eS}v z&*6S0_gnB97=<>z!S&B-$3tQUHrG7R^9QTmvY zvUpPxi~4r|WGP$obZlwkz-?AaJ|DF%%yPmy z4cpvjg28euP;f$SuH($LIUGUK8|kMr!*n4qOJ@GDDCU0?x<;MC0es`(E?ra+1OLcr z6QpjppcT#hGQ3<}Ow(VL2#b4EnzxijP|v?nLf`uFrk;mQTNqQkb@oc<0qs9f4B9r$%f z8*tSAU*9mNVb5S#WcZj+PZZ$?KDHP%Sp%yFjLJFO@_GTUO?1X(FN};AzfOPtpK?9B z|H!9qU^J;;-pJ<&hAyQQxaT6Gs*mKcXjUj)sD3*p>4^5&FA9hBF4#e&;R(Y z-@M$_cA^gYG1ws4FW#o;5J+67CZ9>QUIzwF^z5y`H%V9aeR?Jnk2#3WiTggwS`oWp zk-X5Z2H}rJjhD#~`V))HJvro<@L_rOJf+Y!El+72nKha36v0*XSk08W>gL{5X~JPn zx^yWvw7KJz;c>}*$&#(*ZtLwlGm%b((jEJ>KvP91uMkCXOY9fMtbT0&-u!t~0T@WUi37cD69;5`idrih%_ zOl57@9YRUKDh&UUQN$c8U`zBUG0xYyRktXt6hL45mtNoxQP$E}N?oP<)W1HWX9I5Z z3+Sa_EZ4OLiFhA4<|Y1^J~fth$jx@=HBti=Nk*`k?d}I29Bb9-4h<^GehL!3G|ah)1+Kr&E5Ib zl>BM(*mW|8Tov8aO*3FVJt672x0VYofG;Df{fZwj;Yz`xa|`i(v=AH#3u{pRq&F)Z zU=;lKrttf>h!Gf|!s#EmQo=X9vOf#Gx^C1;n)k?Wq?<$Mb}J7Hxx_%RlU@opX?GsHyZ zp_N}GtI^!-;ySE&=V&bYVoBr{%zh8ymIK5Tw{RtmyxCsNYy>BKG`b7cyP#ROrOpfi zv;SLi@Fn?+A0;h4Cjh)CN<`&Ba_EU5sC~c=@i#5Q_R1VUa)CA?6;h#csv>2VMV!)? zD1SB#-6m5AJ)-{mdDHE7{7sW(m^zlR7C@*kurkFziQ)@;7R%q5utFz$=UpaxWR)mz zI!a-^O#l6UL+B}cUQuG#SMn($Ym_x~#vm)sNTmb#3L8aLzlXu6qDbcdrkJ_)h{9AI zah_0?Hy4v~deyU!w*erRb@+`QgwiiskeBXqmzv;)w5Qp*m%vV!AQ`B2NoD(}8AA6V z@3v@>$&~o#a-KAkr6!fO*JSVaoVjkdW-8bio*TBeq9Oj`aD$p#lvfkFDQbhW18C8`G1nvrl zU#$hA^crXDweD{VyJjf9)(*?0OZM|&T5UC zW=CElHMFxR>FEDq;iRLTErcr!zpX_1=cU$C#8`FtfjED#0d)f)rkf$S+n2{hg z)ey{J;vPAE>D*dkRguy#3Z?A#@mYE%Y|TSBG90dnbFW*>Gm3|cJMh^o+qOR>)ad=p zD&g=Bxr7R|u08g=>f@7}Sc=h94rFR9_stpPqWg#AHDfNOB|pkDP`0Ju?<~0-*bTv| zr3ra0=c~-8b|AlIJ{h&jnNXh?4`aT#<;ftNu7N!6@1PSsV-@ni?USm8)*ObMet0B; zu(pWK8Xr#c(O9m~vRFJm-fUoxF=AUhY4D(WGQ-u3&l1!Jl=S{a*sUO7a>fdHFy%GG z&u7hb3Dokw(sg^xso_K9$4WFLAaEYVlwTkgU1UR6Nh>nL5?j-9sG|GT?$&i4Cnywi zTwqF_3w#*U(vIQ;LLfk`hyy*!!r1&@NQ?ZcQyn=LouR=`W#NvF(d|6=)-jGv88@ya z#jAEZz}!NKwkYKus9UToKZ|0t;R1vI1zj$-gVj{DY)Fa0=cTk*+7bufF^1)4yKQV6 z3yJE_p^SxzAa>=E9ew9DLd=o4_Nfo!KjXY7E`%FXqZd5HDt(n61TmZg4(v3cO(v}r z560YHC6)2t(xd-ms)*%p{?5Dd*R&c)DX_B&<<|BJiFPX@(E8y+_%6sLku*o}xp-E- zRp=%nYtvfb&tJTL9xu&wQ7~%g7>*C$xP4<^C%=BB_s22~&v5`y8h`VGB;%LFC2A&>8Ll`_ zSyf{tzO-gkhsSS}EmAQ7+>r;}H?uCv1hRx`#^$J0MIEwCL2{Em7+&tq4>Tk z|F2GU6v6>$%OxjsUU#3E);w?E;`6tt*5~aHpVLmtb>6=3Xs#jIK9N7icgPD>*vdL^ z)A9rHV{CUbM!|Ly2=QZjLloeH%4jIXQ9sEnp9vFtG&1yy#7&n>qBYQ1$*;D7&6`yGT23{cu7qBCu%ljl)S|vDI~4m zMBdsxS*#{*>f!277N>NN8y@Dhj!MJ$%||2`21)+T+Z%Z25H#-{dBVQt=ZUC}@hMIO z5*fZB_VurPXk<0mMU%2sFtthc7Q`YNzgUdyfL?K z;vauF8gM*8Xq>*EEv79gi3+-U+R^_$C=*h;uLs=NFgmt5hL)w(H5o2y;Kl3|C%xN_ z@vyy`Tuc}0jWs*3FCF+JKbUA!3LxS@R(Xjb@@(_waiYCWq?^JeRSZ?-%k?=v|0b)z z5m9xUk*63e8uDq>E!;`j~ryri_%Tqn+4BA&;`Rck+$yT}G z;kabR2gZCoBUhxf{_@JyZ%wR2_42#gGIg5q>1BHU_zP!LCuBK5tgEe8ZO1R_(wIhB zu4a7z|J>eV@to*$Wa`odDe~KE-%wXl0M_Rlk^^dLpCUrH>(9tCwvlCp$#$a>0Oj3bZ zq#L(=7$1lqW49~tnmk$PiDD7p!}Gxqtr2W>*Qd(M&)%WS8) znfdB*bRccXISR_6T8-n{3rg^E49Us?i~zr!V8S3L30XZ1Pe7$ z-%?*T0%>&S>Jor9wk0ByG3Nou5drxJB3sxw(h&!B>5I1Re&p@}IZR15Pgiv`Fa0#7 zX?=!t;DCK_il*)r&3kn4a1`@)a&AnB>=BxJ34f4#E=fv9c|Ka-@ldo_| zW^hhPd^_*J`FYX(EuE&>hnm z=lq)`9lLN)qIH(}M_6PG63^*i830pP<6A?}`cJe)4yOZK*3H6Seneg3s4RiyLl<$o z$&+8fHbKYIZtf<))tIXEpAK#{zebM1{?TGT`aqF?x9O|KR* zJ}W5W=G`QMl+94^>6u)3zpVVxje|j=ukQy1j}IXEvL*?-CTmqRY?wJ^C+pvV-zvFOx42>Xf9O<^nJ2{o=kn zNSn#06p#nq`vtG~r;3<-?dX5*M+zcLM-Qr2ZoU}x?C9P&7wqW7$t{GZU-#kJTy>oW z!%;bWg2}??&O$Gp&;$m4Dah?>uF?DkBhkz<*EkToZG9ETR^J%xe2s$(Mp0n0%H^rK zx5*;9V;MGL#XUpwdQjb4^!UoG#(Tl`oQS4`|NVSV-@ARVOt|95v+Y>OII@OF(dP?7 z|H*wtvm)0A)0Lwnn>gLw3G*nMRptnIx>mB@mT2sb4K|!AWxHxL9teJCJE2|jLFJ}= zNm4e&gPw;4Kw};B+dg>N=(mNG5t)1VXxH&888Z@2~I=eiBsj+x32{ z2f~-2>1i!hZXEgQJIbIAR&nYTK?Jj=1lq}LkLo+Hd# zHO)2}6L&dfo^!wJb@E!K%dP(qsBf69^SEci?D#+gh$!NVUiJ4_GuT*ih_i5>g~gvJRRGpJ!I|!w z&(lQcj5aNe=4N~}6H>M`xR!;u9+f#7U_&AM6E4glHT|x0Br&7UR#S23kX4#>W`u8I z0>2K={s76c9#Ohya9wia{%S-|S4@;m?|X;xAB$y!r_L>hxB}dNR&ViNpPxQ>us_4F zJ2Dvs7l%3=(${3dIEmh2qw)+d#v_@BpOgYnGU%cZvO=`mIYd4+*K?0_eLw_5X$NSk z`V3Azo6kn)*Py+&`Y`~&>Nol*uv9X4E{5`gGpWCXy&?~TAtK9I?hx+O=Mk%Ep^|c3 z@EVDP50Y+6{J~6799_!H@~D!xwzv1`O`c6as#xwfXhbepXehFT+-MSaKQ};NWQi#; zr^q%jXVO>QMa9aWvru9%Kb_Z|jrgp>Z>6jgxLN@zbzOHP*}K$%>9DnG%(xTSUX;pHHfOi7vtbBozr z3uVzwdR#oromcIv4ZYxzGL-y>Cg`tkL7{4pR!|>Q*{oq=>TCC2nVv2TB0CwnIWE02 z58I^}a}V65s`pEyPvdDbPYb$sx~M)W>ji$X^;Xr?hu_^C+i(AuwYU&%LNJ|)ZRp2Z zr{osZ1H*B@6r0QXc!)jW@fd7&*llqC!GrS|=U< zh}P{#ESre*hAbyuhA1Pt8TyfrRv|G0{5j}3iSRAz!&6cDZ?t-v%rOUS32WoNn+Otg`Qm5 zpnwIt6hXyvro8FVv?68+XcHvNBxxW_{>K1;{Wx+8q%=FEm?nSOUaa;pIp>4E`2nV$ zTbr_#*8miJ$9#NvnJ?d%(nfyu_qCO=^)j{fFps`a?X5BFRjq;5`M%d>wJ9+Byz*%z z_+{ji_QeHK()(4X-k(Q^(%*QW$s=D~#+NBH-RGpw zFzn!!Gr#kT!)gh|>_20V!*#SHWcS8DTBWZ-9TjtY#W3fTN9!2;fi73ex&=a@=FV~qzxSy`wP{2fz(IURWAFdtALI_E@fzJhUlp4 zhfLX~I~O2)nV}DqQ|TIX58h(k;LT*^rz++90dgyYMIhj(-;-O^oGtWNh3it8OESPo z3+dj0tNg_j-n0hq$)qd5W|vO25rsMo9r-CJqrG^gdx+Js%W?3_yE9GAf&xn8@l4PD z?3zVm$Ei)+5NhepWyUeYxIE-cQMrFht<&I+G4)~C!V$ceQP5jyPX~XAR8}1Wjx}{N zMz8~|s3WIxWB*L)fMfgf>e5>)U+nCW-uHIDM?S+p~T5SRC z%MbZ$rYIQq><+6A61W=O6xSYYT-@Kt6CAx(yN$iYkNEVYKxvCnt~&5?s~+~8T5KKf z*b@=!qnT|}xWnC{Ydoq~=|>vz7H$cDQ(pF)DJpp(|Cd*lxmz|T|6?o`hw8o-fW8aP zw-~1~p*|&uYo!V};a&S`@BM{8S+=5W*%?iP9$Cm$oEfpl>hlyuV;B%mC?^F;i9jRM|kP^$5mw(ViIHVxLd+H#dlFD=abJI@|!PYZ>!4b3|^##(iX6e(sm^5vt;+%8QN#L9Nyy&6Ws8o?T0^Gv{Ui`qN;0=N#O zaheqGV;{0bZe?O_1TjNCj*U8>3USgi&7UKsDbX#67e=>=U&O zzimheW8ZB*0_@5m*&r?k!z^)B@SR!0wQljGatNoILFHHj84U>WUg?wU$3ccSbB8GQ z-7DV?1pfVY|92qDI~x^C=ev~qdEu^T^EaFdB*8<~)|GYp8Orv5 zqhS)&Zwx>)%0N{}+3!EUf~9_~56z5mYYaHXx3!sv7A<@04rcw&n1{BD7R50#9;C`) zIOxiU&b6Q9{5tKBe1YNFe;SBbcbsNv@B00axEY>@zIqobFW)X<(tVib+Vr2|{XSQ4 z4&-@U!{9H~fF*%_g0JzsxAirAK9u(S<*)m2&j7(H$fbsQaQ$xMlegAiC|PeKN9?XI zSLa<4`7twi2I?SIt2VSm`8sK`()S2lU+Q_+d~rW6mb@9#lsqynF7lco zh)!>{89RE$er$j{TBqey@pLnME7XESXN7<^_>nvoG$V2G{+4$?n)2s`NyuTD~GQr^Yjd5bPk~Ij#ql(knQ0t_b zf47?d_JHkkY%t-2itf(Wrs2=Jh_Q5S)A16fpJhd$n;dv6ZK)xs4VgvKKh9sr%?x6C z_ca62=keRIx;rmvRIRol)L0R_QgvYWyG6E{Dx8>rzx_J23S65ow|m2B8}*yGN>_MN z@)~tw9N>bFFtks!=nQAoOK@3UfBFDZxnFDW7o$zDr#t!Kko58z_AJ7#RazoaITJxR z9gbQTyx_iCqIB(Pd7tm@oYEHL>qk}1$RgbSKKk9g#?N7g?@~K4S$)WYzrgwH@Rh{Q zWo?>b=uj<>A4;A3+V?UQ?b_fG9c*{&r*w-ZIh2YLHXQ}TIVc+WsVXP>zQ~3*3#EGq zmn=PEpZ6VNX`z@wCw3L8$Z5Q_7a0$@Sp)eG&aU>(YawT%o5wrM%(fWmhDP+^T#j$> z`PDSCYMs;8I8n>=G4&6sATI(kICLmIVLoc|d>QmPDFRnZxd0ym<#N0?gps=?kpqYn zxMT$rDvbd!6mnU}QUnzxYr5hV(v1w6e;_Fdf5`)P=eT8)Ga-V4A$6~)zYnKKhqB$_ z;v@Dj+Z)n%TlIbXy{h+F{Hx>SvfND>6kXVjNepm%dxXa%5Qyv5w;^f%xD8vCN1(B2 zB8DQk{jW@3K+Pkfrix1v7iWZ+g%HG3Ju#0q+B}y3_7FSH$f^o{tVIDMd9uI)rqZXY zP`c>zf3GePH>3ZT4^g*!bUE2^C#x6yf#?24 zwe8;NL3N&id)P^wzJGNQ*&!*|U#E9_RAhEB@ll=8&ASjf%SlIuM3>hT2*_Pa*++7( z6T5nDtcvx`Ham+;^#$BJoUbAIEtYIv*s5a1slJTyv_LP)jJWJ7fN8?gV3+zd#j}tp zVVi3Li*=ce)8@ORnfZnqPOPF0}?KkJ%3t^fhu z^Q|1!b}r_^qtP(*ZJ`6js8GoK4sz@bseRUg;E^~GL^NC8$wJTK)Z@NoN+C(Diw9#{0twNDSp9U%?a%0 za);^-2SiQU^UBa|1KNw`el|?n7a=vNb&xa+{H=BP>iR zFalrB12p$upM{#8g}u7z>qzxp_tTi|pSDKhYIe)4x*HA>S5}UD*S@+%-?!`4FW#!Z z80W3Kk)1yIk6taRc@F$YoyI(VxvSr>*Yc?^HH+4scz*d{|{AX85CF7MQLc< zEx5b8zqq>-AUKU{u;9|TyF0<%9YSz-cMI+=K{Cx(H8nNA`gh;H)n}iz*LqfO@Vuz7 zC2Fk6vw9=ch?BHNW;$Jfezc4gY zu_{eF346z(UEl&^hZAK1d1$$<#5qquuqDuA#tG)xYa@!tv!o*oPmqR9M70mitO%EadrMYh~YwP&+jX>e88sJSQGhNzBlj zYCR`_86@TlgQ8g|F4(%X+iiVK+%NL-S)czeV7Ig{U{{g}LuWx#+^~X{C=7xK^}1Tr zc@Cw5e=MFUa*Auf%09j3geqAZg_k`NvVxn@iW(aL-$)Hq(NTS#zrR!$-%qeY9g+K>om!RGd=DW6+8-rpZEbSZ@8 zRt}Zx$)DJmq6W67A=3l|V4Ct_B@bYxQ$EN_qZ?ud8|ZW55cXv@6ltqo&xSkw(8H6F zr_Q6w1ooZsrHdazaRDC==lEJ^&&TvR9YZ-kZU6lUB2g2~J6p%*z{%BeO}a z=Bakly5+@#nKe3{#l^KuDt$2P$XM~~-|ZOe>MJ8ovi`O_20bm$J1G|RWWhEbWuRe? zWUDCv@Fjm}P+N4*E^3nAWD_LY!KFkfJBxm?-VIVphO#l`3dK~#$}c-ygxpS5exw*_ zR0uf{!{a4DZSJ$Gi>Plla9upJ5;$T5=9D@;kJeD2Kag?FmqehKc#Uo^zJg=(VZ)1x zl?s$$<-DQ_I<9;MfAr-OMY6w8V#B{tooEDXQLI7mH}QYip|^8kQR-#v==}1<0qWMW zaQktr4z5l^2Dl>78u>vaE`K#Rv`ksYVu)Yxj3WE4tcyuaD>^}w>+;)>j~s5rkx(Y2 z9|8dh(f_xLO(Y7sBRMn&$=(jDLitWy4T9j4w5{Cno^5pp@(VZ$@h{el zANMW&3B$CWi2pz$s&MFn3zeyEEf&)jvsy8`o}d-!v?O^}C$o?T zQ9je;agvu?i3ZmL1e3Q!4Xs(km%uf)COeuQEl{KFUN}J#6#pNtd~JHp=MQ$GNw{YA zhFM_4INZS8SYk~jJIZetGvRQ93Zx{QCjxgBB1{Wkgk~`;RlfX372SMk2n`KMK4J~g zT`EDK0tM+9T3WOK_Q>e9)$p{U{ooJj^H!4`ko7VS5i<$#4SU zQa#C<+NnVhFEQh+9XoV(ULSAqZs89ndPZX>0#u(q8@c|45Ur~tIUmjd#d;+2sD5^P zFF)5rQAQ~a4ZeOL$C8A5K6e%aCjw#M5PR675~dL#o)#j0S{gmDL#i7B65smw@dWLHpouk7lbsK^Aa+VHteIpUfg(3qzkHfK6fQd!g>ozB{mJgylz#?(6?~C{ImZm z0bQQO@0Z&fSl~057%+Ob^f&36^y5+=!c?hw1Kf)DXS36iTUhl$0U|Upsq% zogPA-j$dMO7`wc%h_6?GXL1j(;z&>E5|_EaljGkeu<7CGHVA882Y!iOJ`M8:H5 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
leQzDcNXVlk79dH_EcvDe5(!PllIqLg``+u zKF0488xUjkUQ_ZoIvkorgF2^gA$1X1*|!(}GZAX$!`H-34bb$L1-GBxtn;?+-0N=M zcOU-pY}x>%7Fi|2Bn@^2p_vAw=Yff`;IzB;KgPP8H<%iXuaFLRX{VgttMZ9qkcUGp zUPK%UkV=sqeJ2c;;+Ke-f-~xXULpcGV!Oyuy9K3OvGrr2cZ-pv0BU1HYBmQdxhm0x zpm+zdm>x{W&$(S6)}c4j(OJ1_knlCP_IN|~RW_80%{u;2MG z=#_Uj*ZXW#)9u~1+JEiZ&G$86a{3kNJz78<-?FSp0Q1p8Ls-SjGEU#&jvh5|yY1Fl zo&iOP0RrrCV;?~>FaP5qRbbR#kjnxIGw+Y6@suR!-hG$Dj|Hf|m8SWxQ>J#8ib(vP zjhnOS&%k8ZPXzg^MCGUZGX(qm)Q^!lNNKsH&TZFB_RL*V^N8PeTXU5b5gB)cBUow! zMXterip&d8Nu9u7ZYUrY#Fzc_sH$OWx$lrmGLLitc4^*a8oF$C%94Iuhry{=w~m&d zJlJp9dA+W0Z;AYLL0)iEWiL(ZFuFhH9_qmRdi(RuoA&;b8v{vD62;O1@Auu9ItkA& zH{SoTF;6Kmuf`}%jujFf4ofqUW&JbtyWv*+9D>T_PZb;uXyHA&Q>x`{Pt?RqEVEGH zv+3*4K;Q)D9TClDq>(rjn^Oi-E-zZ(e_>&Kf4J4KxCD=DQMkjbararjU;?p>^Q6s& zylt}BcCoPh%oUI3+$8O&IR{!Mf;p|gSq4$qkLgeKiW}p|61I!wV?OVr>1zqL7G{-j zF@Rkm^v4n!iJ{XVwzow@(FJ69NS0_AXA}oBd@5B`f;bt0ze=`-=_8`(PIZyb&V--p z8@=f3nBMl^rOyHIRc?>=M5Z3*GL0N9e&e`7WVNyjcXMb$=+}mZ0L(`Z+FK9UZgvay zFc#%aJC!|{@+|rO-aF?0ZvZ)1A7K|vHM%e4L-U#mLdU{LW0;{yeH7uCQ`n5^#(up4 zo9O&U5GICZ+xVdMy-td!J*QmWwkU~eKbFpht@&2B<~^KpO{+w%1JLe~;PEqwqbSZ6 z!wb{Y@cWD*!=gE%brD)F^3wS^QHeJ9Ld^ooq;gVD2gXR0T~e&^O}S{#s8{jGVShf6 zPU3~YnjLx?^oBxIoAz2^OjSaID9iZtxaxy)GATN(ozzu>*@veSB#*yJaJG!?gwD?_f!7D}A7L znh|2#+wJ%}-W*t+wtK|+p_RJS8)-huo?!s+TkNaFx+BUogul)K`ZD=|O;k${wps!; zFT^xt*w2cV2cFa3x%^jHnJmBkkb8@Nju7^2e);%U0__s#wNRLQUqt&2pYMc%BiT<~ zk}PtSLi$7XCP{hfAo8qcfCd6F0m@498H*{3O;7fRJ?<|v$%>NV9mf*zw1dkeVG$z1 zWBKg%Cx+L{o`HS#0G7E_MMQK^<FTppyZW8)zfAjom|19HWq&iTvegnjOC!y92e?s*L$$6jA6Q-xHfhj!R6dUu`z6kL zu8}m75|Bz#u>{+1!9IeK(v~77J|k2)iyybF|8AH4E|yW__1(l;@c;0=MQkePN5mt- z%$GQLQyPmn5+azS9bk8>sh*=x#k#3_OONomc2bJt(l7$+RjySzJvkn|iSS$OHQ)jx zpu!M6wa&XUpJNx`JF9N6tEw?d`p~10ch|R`OIrV<)8#wWV5yS0WE!c@-X~FBItZw= zQk+Vj)8LUwh$t}DP9ir|dmL*oGLbJSN>DQcAwD^}ip3K((_jOLYpS>T2?-+rjOu+0*uMtg zDa)3FBUs2y3L@wUt+>yAjB@6%guwtu@cOFQCjH(2T4#71g6)uZ^G;!CZwOq*$ARlUBxtG$Acj;wO|gU64O-3G2mf~yM>2owkfh>&;3zWV z>dd?a_5bHn2PuxO8_|c%&#oxR2VY#4RzGZXcE<@d>=||THnHPL()_jdYsuI3>aouP zv~nyx#Np6HLtJ@Rc&^?$vbt}hl z$Z`^h&!hbAU6*Xy0=ZI_ZFI7?!o22j9_V-;8`-utagL5vSZp-kv2D9@Aw>1vC2QSv z$G9d~BFOst^;f1%X_+Kblx-q`eEQuZs9@2BIT9h%Y=FsBGP*-k1Zwy$qdHOOK*~P+ zhB`$U3;?m3OCr^cFggA}Nql4_;(*rjuRbKX0a>tl`L88(JW46n%yn!0VYX2jLIA)D zrlezELsQWrk-tzIcjD66US<;k#Egnn7}AJrrr56;P7hujVW3nqW*Q`hgf<>Irl}+n zi|v3(b@TLeEI*X(2eN)}T%EyWn>8>h=4EEvPWt1}V?qcxPziG5A9Cdog6 z{LD76wC!Vt&G(M^>|q;BMCwFe>0L_Qlx#bs@Ris5xuysBe$MKwuB*1tJ^K-2D1PC z@{E=D99$QkDDAwqxawnR^Fo*#S6Y?!x^KKZvdg+n{})WszA^guVC3+fEG;Au~_KSPFP{iy&c?L^B zCrNNlp<+Eerwh;w?UG%f10Ant|gtd!5* zf|Y{{uo`DfYuNZ0y&0knV@>&zPqfTN5pGA%lg@r#YM>|yfgFcH;|4K0a?Wx~E=9s_ z%FvjeW7D|VHE6Yb@fDZGG#*B?C{YfV+?9O(h?OAVfZL0!$t4xc=J|prfWwkLmo(D> z%9>PmxRk#6$E)xqMoUJ}-U7O$te>!6+jKBV$bm8k>ht~ic;Egky|8ER181M~z8y^VA>-Y0>F&bN#|nRq`?VpS#Be9Aesj9> zPkVDz>`nN^SHi7F2wE9dnp5XwcQ90Lp~~lotPABISRqWYu~!77JJYSovOrgyB;um4 zJHw!az5)jESY@qr*uWfSCYYLQf`A-@=9WfIz-Lzju}Tf3jI?$iQS4MnJ5P4er#~}| z{M4=@%-z{KG?J>;XSBg1q5`8i*^S7z!~dHU(kSY|lzZvcXJ1KijzYSpbIKMyz0k8| zxRWDekFWmE|awX-ZRBZZUN35sKs* zVvxvm0jIRQDTjZG=7Q1aB~lyAOW#GmaA4yAxn0$?QHw^LAsIafwi;0xBuJXVgyiJx z`KNVm9Dw6h1y9jQCyzbX8!ppQ^f`JOK<;}7e#4L3v`Wo_CLL{kr;vj>#)(H)`HT^~ ze<63D0SudCy2bKSwTKPPUa@Iqh6Tn?PThr>bOoXAKwIiBJY5+vD{lL^PwDUS*p5(O zKxzP%y>-zf8Q1@BslN?WQn^WQ_m78N?#KxnV_&AW3K`D+FVXa^U#nuqlNkg9kLwp; z+c#p!OKHsrw(<23zCap$L5WVZ57vN|tKumEAWvqFVLrt}@5zh12lYOLkIGnBJs90Y zYPX@)i`KYCUH)Ahz#7t%R;F4j7k&9`4D@IECbnECh3lU%yyq}nS>UjqctvvxeyOuM~%P_4<<$fbR_)LUIV`jC@$Y(cWV80 zZVs-RuO~4Cx9q&ZUI-Q}3xZHs=mwki_Y8lTQ}8S=`Ni}|LoccSpd_=Ly)KjgN~=xV z`IM3S*i_1olH;V@F;<(CPfbMEkY(=oE7fu(u`31M&WTnH&$3P>5?Qnd~xr#XLuSiiz4UX z932q>2gD5&yfwA|5xMvnIB&P|TRs(7E!~{pMjc!5up1`T|CcZe;p? zLUd`gV9GLmpe2I4@dV;5czG-)YRyrjafUw~MO2>F?h8DtXL%aU9#)tzM&^{9GbM?J zUpeu_BXGhol!Xw0bgp9w%v^vo1sg& z&S??1{N|G)6e*YDQH*6B(*!{W*Hz|Q4x7*Z=shzlOaLWlE@wWNIw*3=neX-(>ELyp zOeeV@Hi5Alu6IvzOY4I|#^C%f3YIw!nJ-x=8IfsnJ8T}N-@jc@jLT=9=J_~eHV^2K z3H7%mMYT+COOdFrL{#9rc}v7D-tQu~+3s5;+Ef>p9|eXEmENu3pV(t{QjcxW)`ew4 z2+R*o3H+?fvpynDPuLJcYstXi3+ZZDtWtntcY8(2_&V-u7SDpx(jLgA51&2&+8}qa zdn8)!RNPSeDu8KkeIBTY%5l&0o4n}T0G(~s+zuQ>t$j?7n9LkO4mUuLawnLeD`?_o z-zUtqjqi#`B8jiCiyD0J zuj@e_OK!W$l<^Z+LZh9`6`;dSPntX`sWT=iN&w`d5~U!E*SHNplrv25o|rS2GMnER zkfq`HhTc$6Jtnx4ig}h+>nHlF>EW#W9gqlguECJS!w|rgNIa@ zTLwU-xB8n}m68Z#me;FOBGXlH_Fi%)s%C%^lq_ zgUfgf1^CPYHMXF$NgIqXIRjuJ+TpqSa*q@DKqbtPum@W|pa&+7<}uYzj?FPyVL21{ zI0F$ZTQ-VZ%hI%Q9muaRb7@~ZQGlT$`;|sM$|0Rd{BQ`QI5Huc%GD3i*dA|qn%w1J zbs^_C=V;AEP|#Wefyb4)xCkxrdMn9qWZoI z@Af=KM|@x*@PxvxK{qRq2}yh-)aVpw3MVnvz|o;$m~=Xmc1>nVr2!xdn1}}vNt7qR zVtJdHpkb{<@GO4fL4Lohvru-X+U<#lFkZC}vC$zf;-bde*( z`=^5QHC^s~(mbhp3Wu{+%;VDHHH(VBd5Ch9L&O)xtSXR~B9xvbhh#IoGAnH_VZSWN z-nY^8?dc1ik$)?|*ZrHyQM5%NeyV4LWb*8VhC}V4a2k?_(1E3p*B2GrUowYt;iUeCeAERL32zE+EDya8I4j?Dt>^t zT|_D!M>)?z;zmc$G!r0HY6wC@E}X=4AapNcGaeTNe?PmksA$cGqfm<<3k{KZjfZ`M z%ma-ZV-~2^2ZfI8tldB5?=M5@=QWVITZ16*FDN`Qhg=RT4+j9*P>e*m?+P+_=Uo+@ z8oG9++V1G;qfV^$WAm;W9KeDI8md@T(1pc)X`zl@?Tw%B(1U^AorO@ehOmEx1-&`g zQigkc5i3dK5~XQI=+Czsv|KhZNyKp?39wIOLs-!E6}P}sV=u{BIX5%0O#XG`DvpMQ z;w7qVe~(f1P7n~$qg$a&r)3<|gCUvEnU;@g1;Sd5Kyy^o)`2E-+;h**;^wZKC#_16 zjsH<~#>n*Fr2?Tj2Hq%0k;#q>wH978MHR&=yAy9?UoaO{*DECSt_Ch7e`rY+AOQSm(sOu; zIs(|GkmPBaxhQs&q3X%KAx>b>2?g*db?|Pq_MmhfdZhns24jFQsHs45oFP&BW)8A^ zi6&ygm};#Z@jlk=FxBM7f%wwF)tNt=-Zz#sq5#rJS zY@X3FX>@iD6vZ!IAd97%J3bub?ImYlF&^7ZCyXqlhZ3@+35L_YmB;uM{KA0w6{hsB zR$b|4JOURk9zb_~w}OO&et6F6a{QVef`DdCgD3DuVRTRS8tS_o)EAIIa?bPA*%%U6 zCiKpXjK-eW371SzxBhW5tIB|sluY{;p+#||PyBZ>Zh#Zy2yciG`JIXWeXCY2!5;%R ziy)I#H6CoZa#tIgkKBfwKnV^6iu?qL@qyC1Li(veQe<=%qyS6>5Ad;Ku`4%(1hRA# zB^_(M=gQox3bkDh&T06H6UIxl=)sN|t{(TR09x2o-9DUAZT|~}gt9qAU^TNh2VYhc z=k9S9%uJw#t37rz_GoCeJ>v};7Y8pb&|X*UY>jJuDqy$dC;Zb|y-L5ynv{hSJ_T%R ze>D>Up0{WmW=wPX0b7%coo)v@1k-;&2`&V?NHe^|2P+Otb3zhU0JA}_)dbK4R?!VG zr(87|N>ho9!AS#Pl3eVuqLZSOCjhO`HAa?SACtS_m%ui*fUR4Ub*UBJrVYR)_-r6_ z_Q=%shuF{CGR*|OX>o{dhoOGhFuyRqi7)sz@F<1C@}r`6Mgq5zbx=8}&RK>h5pyCs z(da;g?dkycj)|TSkPZwYzmCHujU;CJKL%4|%8X$iKXya$gQ}~_G3AU}!L;6;>I(?> z89kU2te6onU@!hZFOxo8mE>#W#_*3n!PG*p(COk>_&8mXCQmA|@yIREp)0!>wEA(l z-39^3Ln1xBI(*3lML*&1C1V`NbEvyL=Fm}UGz+Xop0+K$((nKsMl-3{8*T?MHKE%)&ATnQT;f@Y8Qsr>|3Msb+mERG?^f zSCDZjqkHD5&D?Tbevzh64>Yi}(#m*N^*>lFcp6pCD!3}}Y{3DrE$@gPLafE$dw_R6 zetopt{&#gu3qLe^rVr~5o#!&e|G7=V7L9%V^rdv$)T8wlO44Zm$bZ!x05=%sHY8AP zwbJJLf4mf<_F<;ta7+ig_C^E*23$x#w{;Oi;@{fZV^3?6U*IIVC z2ClP0mriJgbsCt=7xkR|Qvz3lMjB}J8B&g8C5hjv5=FZ~uZOa`)T?#6(6bJ&Q$>%6j?;(_H$R!vN$w3uyNLQk9^1ve&W zUp0g&vI*8$p~K_i;8ODQka*bJLZgQF{Cfi1v93WUKTg4Cp&#-n?iD{rwo{ILQY(au zGQXCl_MQ0yA!Nj+=RTFQn-Lgz+l}Jt!5bdu$XCLVixRr_X-RJ0(PCDB%Si`ci2eUC zBDAW9QlXF`IBl4CK^!PvWL{J1NcN{WMTPA`o%2_bn?cr6OS1Ld9zfD4)Dye;v435DG?2>Yx#9vO}rBwl~j0zb?A9jMDQxYc)J~txkx*&D|0#c>g3P)F%zerp3Kygp4%Q#n=$KjJZ({WSoanroPosa@8R5 zl=)u$sP(?t%+wvzYHZHhb#B*wu8Qe-VoYr0fwrvvGwm_N`Nk9Rr=NZQ7z3_UVmP>e znO)N?+se;#TBS%azrZ?Nt$}Kwm-*@UF}UFNfYFG*tKWIQCtbc%a>^L*=+#dIAxUlo zkG0kV`NiG;$sJB7#Yd#-?_659=As9LxyAqxQsAJs0`34_)b62R-^wD0PL4D5nhtWL zqURn1Yj1{^@dy9*0m9rw!Nfc;R>xkx9Lq>JUc|U9l$iPvnCNL7Felqz(988>=r51l zsh5NHBakOm()yfzjT?XAgst$ zWv!{QAp@)Kwb#v&1p|TMEAsUNryyS^nuetWIxaJtH((12XgOZgOpSuF#Uj$kM`qhi zsI>i%TF6?9)3)~l=aEcW1FF+Za*H)M!sblbxNnk0&j|}soBBlyD<8QyO$V?V z1S?t#16UzMHm=5+o3e!ZVUgf8#$>o=O@;Fd<~9j(zsHOLf}K|gG@$&Yq3X8yeTBUN z2Sr}#xJ)|!Yst!}FD5*ba6CkTY776Y1g3dECo;9yX+wacCGKul32_fn8XJowBkVo6{yMji&~peL252+B(Ah^Fm^VipF^s??L z$FgR(R26G@zvIL{#KhqS+mpW=8wdp{oqS9Qo6d}XR?fDM6l07RQyMIZ5W#McyB@HP zd9CYl-;zPER|8`DwbJZGyY`hf1x&`#xNxHmShx{ap$UM9ZbMF+<1sdyMGr?p@^U6K z=|SLvwwi#_`!-O>0;abyjX%@qzQ z%&~nGMES6pRY_m-iAG1Kx!HjFf%AZRbag^64|$0i@I~RB0z8_%N?8no=Y@87zMSz8 zj-))j`>tNqBs9g7oGB8X=YeXt;-c|pzp=SLq%!S-&@wl z8NR<50(+2b!skgVvf&A-8O42UULc-tkjVbdBqT5obPxLT(=pCrl=y{5CDT~bLQnb` ziRC5F6p4O)O=0Eg#0Y!zuIg1P6WBSxugQ3Pw`itJd&h9$QTS}kVbk~Ai=xTrKZ!HY zMBf|uidfwNliTI5HD@FU-u@}h z)R8Ke8B(@b@A)-3s-)F>oFOJFlp$9F2sL4DN`HMYC}Ch(Z=$<<@4B066zM%CN602Y zPgL~Ky~e>>&Uu373lYVl?oe!pO=#cfik9RSERy*hTT69pYrUILspEqQki}&YW%H5% zqBXL|Mj8FfEymDMSZs9N)ozUw1fZI8__{qlg2{W#-#w#F$Hb~a9dQK8mE^*9Z>@h?BIBN*FYI-7c|{#i1s0)4cqS0y&Jp@#o0t^X}J=Cv_BJT7z_8M+d|O1yR9 z;C`o7sXb5QZQ}GdE&do~Wn@z3@`D^EwRi#NyWd^bHaPa`J&#K1eh(PYTymnyj|MhwO1TwIrdL^h{8oC)-qM(SiYN$~}(C z)xeXKMBeV3m`~$BHogF2Y$aPI@@*dDmPfr#D89(4W(_3{sGidXk$E+~H$w?%c^!_E1WP>eS zwMr-!&wKpb9#rr$k6Iyy^J2Wa=TDY*?}vO#>?GnD;5j$R{pw~7Mi^b~VBjH1Ll0EY zybH{N6L%k<7&93Z!}y(Nuy;s{H>}fX&2vVfxdi9lNM@v~Pr0h%>2sgC9F?F{Haek! zo9QmPiXf5pw~Fq-qJ{bOT=RL2#E`mRGlYJ}3NJ#TTKY8w%r6Annq>AD{kK~Ft_%x5 zPJZ{B-!eA4Z8s%+HEIPHeeZ#(MV;e$LeW=KVNDa1oEON9Eulv5r`p?Ks}^UElq5kZ zv{t{ez%R28uzRP=L;LxI#&B9;#5=e& zA?<(74dAkBQ3;D=FOG-L&U5`NhZgHRE198aa*1eT4{h)f;P?5Ky;C&qEyHK)L;vS; zPz3IWIs|W{^^cs(ry`i1JUGa)hy>gwe(zS2cfWxlJo}WSYLP#ga>_i2&gMW(wAEwH zb6tXPU>BN5mGW1_Xr-Ln#Dh;_6HNWT$A>x|{)VZdf>CH{hI2ey%F_v`kM~Q1E3f}U z(^>d6{XO7*qZ>w-bTewSba!`mH%KFnZWu5+q#Gp#q(c}T()dME6lnnw1n>CWd;f;* zbw1}j@qY3;`VD8f%5}5+|M5NT@s%R^id<(oNnGaDvT%9BR`0sie><2m-+$=+3E@1B z<+ma!h$hEH72-$PczN1T>`Bww){VZxO(FTAV+v~q2jWJp>Cb>ETY1VMR=Sx0Dlm#s zA;Jx*ii=%~)~c_&W(mP?o_@W9O79xJF5@QWNyEYENqAT|vEqf7)$VJutz|_xk2fBF zctSjGv8yW4_m43A8C*p+W8YSVHh3g;9%aJ&8v~d8n-Q6pt_aIS)5N;*tpT!9vfyh# z5`gyP_c_2m*!4pK*Xi4*A8+sS)fPWjlnWjH@)Pyvt$21&&whK-!8<_&y5}D!4U-Q` z7<6lGmcVx9LD;3L;cCj7+SQm?Mbo)tWfpuY}#rG7EwDhdj~vS6xjt(cdG#FwM{Zg=Ram zOb;||0Tk&qV^8tKl0`)X?Y(w{ntA*$S-sig)`ZVC6-t~6t{kj^fIW_Ce1(K=6_u<6 zvkDd~6`A#<^QOG!YJ7SWbt@Ltx2(`BV19&e(y*`pJm<$?QqL2Ul)Gyfe;_s{)wluw z;E?oEKXS)=1CN;`PfWwPT3M*{5{r%T*h-e*$NYgnWQuT5I3*{x%qG+qx+i= z=c3LS^1q`+3m}qMiEybcBFgPj!dGL+mYuK4ET?zD2F?=+q++OYGM~CDgeS>Xh{;Dw z;Lm;ha_>8ezDE@Bws>uFk=@M4s*kj_(ky#GQ{4w09xYl4dbvkK5os)F37ajLW1qB#oysr@9yvX(E-b||%W zj|ElC6q7%xrdTEt_t`Orh1wU0i(t*I!&v)lQ*~sx#fCaELIG$~xU0!AM1GhQF2mx{ zYz)}wM;F_tY4h6S+mAl4?Qzj%(Pc9aiQEyn*w!&!L;&k5iqv=_N1ke=*@AGa30C>+ z9rLAyids1(b5MZpOFJ5n9K)rdJep0f06*SQgeIAexmD2yrh+Sov5f;GudJB;#*&~3 zzX-__smlTl>6!@i8`&bfi4*1VD*Xe=95pk4kfZyjvKOmRS~<-OIsJ+Sk@K)Xy}C`a z>fONLchu#~RfvUZrIyYvvJK~RH>?vNs~en2jiB1qR6erR34o%IToKENrb!`|M!5*R zF{hEG$B?bbIfcv%H|+kY&RnJQNM?<#s@Slq7yXaIX}qnr8bQL;Lc+nXtjr~=RlfT| z6Vfip1H;dB`ioG(%eI3-qY|9akq%_qkhAobdI!@QRuf3f5smijuu9vmzV1XHg+Z}` zE3a&s_A5U@uo}8_)pnANxsq(6bMC$*siAH~sGDjHT>uhMBbaa>|(`95DDyb8pxJxR#oDMW+ z)IGF9)?_br9iy@oKeZ2QJAJa*zSNabwTtrL{UP&dQhX&28s}QOcrz`26+EhJzNA^z zi#v_Dqe9aqRYPhZC|iNzSA1TlE0e~_bxnSA=36S;_8x48Szbuoi!`(8LXN&lrl@$v zMa*o}QIS54YMNBRP81I`5hmX{i(CBCz;0#aCvFu>ES*er?p6DXL;X+1Kju7Ue^{F5 zs882))85w*p2?sF3CQQHon^MhpZS1h6mOXN{i+cwSmT| z>uq5xSx?>xKjksl4;{a(h&FYDjlnDtk9Y<*Lj-6Lb-7Hs4M+u6zHr`Tz~lgvgYt5s zUGVSX{uxowTg+Xon9Ky5}#vLyD?4 zMzZkvQGFYrRfy)o8k50|z)%kK-Khh>H?sbAhAF zfNWy6?eQCUrTrk?CY-C?90Jxi!?79rwmki@*|c(GMwgDwrUl8btI&6ruIlh%La$FI z36%jmDbp+wm+bWY)`CT{Lhw!1R@wCW#F&i&G=O~?D+kC^=-T{-miqc#Fdb-HtKJM8 zCVvf{RK2oWYOCD2i!mK2n`Z`~*b8{CXd|zb-^H;QByj^sPBg!_MXMpMEu6-^xr!!T zP&2ZMYrXh4g~Rkl92HJ(E`YAfQNfy zafqw-Edt#0il^crQD)MGSw6)l`qUxBIhuf69tP}7|I%w_QA+KsQB`V2sNDALKAU2( z6Z`uc@DUt?e(3jK`5|G%cihaGgvJXL-yfg201;C>s7vyRJ0!Ta09iukW@ns&L#(+u zgVk`H)YDi2F^N2oEzcGVJMVFHge$|=ULS*6HeL95?AVBi;)n29~~cgNP6$RP&<#Mxu)B&yyG->p7b~#gNp|< zRn#VFI2ydIoe`U5w7p$fngx#x5q;AS!yoN~S*+k^;i6UWQD4jqX*`%_xo2M91@wu@ zcGtU&;ehl$5!vzx9r}nIgoMpf^KNO&2GfYn64N;Kc_8ga__K3SOZzd$4|&F-70=DR z`Z1xHQw?V7RPEwl%GsXCobzj@C9fW1z-A0On^s`WejW(~L!>tLGun*asyO|8R_+9iZ7%(;Dm1gx-YPsV(+Cyw&k zEz>nXt7!An2~bYKn1)dU+HQUl?NHfPUS0~^7{ZfZcMdXT$g98@r{r7ngbsX3Ryi2W zhU(3ugICe%PBheBlaV4VZ*~4^D|K6%Nn@aERVFMHz$jmXS#*fb2qiBZj`N^Ou$5xu z5NKnWgn>1?=_LBN^E5N8O0Wl(@!~f)0&ohVA#Ro;ML;MjwRL-HRpB@(2z@o*Fws&N z`OG}U)>#HTsBI@bW&BNSIRa@Y@}#>M|9=)hJUQ=>W4|yPNQNStTu4UloxkAT64q*yua$+1<3pk zAP5c#qzvo-+&9x8(vRHHW1+*8BLAvc-={!j7HWPRC;t0Oz(d8V(8!nDBEF&%8v1FM zERQIA@w`80G`yc+=Q6(pW%juzawM2yC<{s-a=sz=m}O2M{`HEAalZdOjogobaHE)Q z=)1?;TR3n*d4)TCX0J!HR#+J)FitGCh>9VyU~9d$IN}jvnLOV)@gqv-(z|t~9I*47 zB+S%3m63Gm1)JM&1L>O*gTPr()Z6I9I6v>V)xMMx$vs;{+L*ylmQOh+s~`M zvfpbj_X8(sxc$_;AgjITTS#1*(Z~D|0ty9)CoPEzSD@@{QHGth6zoSk^e<$e6i+gL z%~t1>$f-5#ja}5->fEcDo2Tyk3PpY`cVaD84vz6oIDUc6+`g3H1v?REQ^J8WuI?X1PX{`Tf3gQh4z_$vOh;-*a zIPJN#9}QRRPCIGXQYvA$R>Fm!*KDVSEEY??@|WWV~kErvvMDpWm@B%f7(S?rfT@O za$;k`zWrW8zSnX7rOg5G*$O~Ny3F5bVqLRQZ8p0k50Mx7T=kRu)pPMmV&c$w($*6LV#Rjg`=!Z(Af!vk7{3&GeK7D+Z_oVuQQw5# ziUY*L6`fW}`>pi=8T+e}+94j#@jWYA`r^d7*PPCIBa{(wzuTxL7~>1+8Rewt<=FVc zpD4kryg%;moBg=X^HO~E~ofETU+!|HwAxp9d1UI z|D?J|j`}=`$J442ke=l@0Om*&GzcWTpXU+>4p{l9{vBDy41e!n9sARG7lH&DTu+${ z_=hAMBBBIxf>Z=!?EXTNm%EKj*ccu92>&yTiX`ykMy>>F#PYrVp+Odnsmoi7HBl#d zqqI?4g_ADC+1J(tX3EB{sX`~IM%&jIS^T}+g2o9{#VAZp^WDA#F@z!}C?zg$3W?>c ze*+xc#z7;?TFkk@!k2h52>iBT7d*a@iJkbcx0}DLOo`D^i3EhZ5;Tufb5qX;7)px1 zf6`)(<#lGz)iTDhjh+7>;Q8tly$$VAa~H>&$u45P$60(_Zb0|6zBIx8pam8L_uS(4 z;s=U%MoHS{w}TuhvB5u*xf`xG%^O(%HI2_5lQ~*ZC*!Sf;R+H;e+828Uj4@437nP| z%z_PZiBJkxYkB|761>`VGnq6C>uVCml_k;|9a|kWX(s-}oN~70%UPdoYbhPp#o<`N zhxPrj34_`kt4Uv{?Wpir##xsK%qyhfR+r`uW%KriOdc$bQQ@wGBUF7)Leb7gUq5_4 zFJK)1NfofA@IJ9ip{3<>)4pEG6!X9VvtE6B-p6&22W+xdsGoHBr*Ibb36N*#l$!;z zq&WW(ias2;t1k~IfMxPSf)D>|QkbDo4tuN#CJw@T`P9~38DCGiUpo8dgZ%{{(sL1lZ8t{W3j=KInG0r0=}Ok8vdhJkrpF4IrVO9K=yuHWQA*aSOkS>$RSED9-<-fhS5cA zXk9!XTD@U6X1SVBn`g8!Nuh97HaWNIq_DZY8+m(DjVGurU>gE7{EWaDXf((B55>-o zac!p^b72d1VQa9@z+kFl>otQV{c^hO^w#6AeC3k?Ec7i)5DKthj1tV!Aq%*sn@3$p&5Sp{)ji$o?7d*3 z%&u5Ws1I)4S}FEtFJnO`q=M@EQx3^f)L?~BMAyGFPFXp*7SNxPz+kW?D8P8lUycu z)pb!I+XDubkB&G$l-C!Z0|$1`4njiGl6pWLmRRk#I&-==8s8XAnKIA@4q51zBoo?D z3-=o^=W(TShfI?&<|UIBP#O6`CY1xCD=~{o5_4<>P}GS_9uBcJ(8;heQVs+$g|HBRAK%PV^Kc!UaTUQDk z`xT-q?mo@bPq+be+p@`317f~k;PI(OX4d*9II<(pG>gls1ZyyuG24g|n4B~P_h!F+ zseOe(eBM#x%6Ss&G2E;C-^m8eUX>l@8auF5AhLI9lz%{QrNs!NPF!-!;7#4=CZKfm zkE}5*p4)*K1b@k8Rh^z+aHofpx&!J~K$Ph`1)~B*Ae$z?8Cq0=9gQCsTmu!iM)^Av zA*=?tp5sRv@0?Q2?AZxYC!v0{wt_8k>qYm-<7|WzZfGl7#8EUB4wEm}w&#(g)R5&e zS65Z2X+xtx$!}W1RLsCgVc2@-8oNj!uuMtrS99;W9iVl2)LX>Sd;N?o=PAtOaI@o) zrJB{26Lc)E9;=wZRij=5guM;ye&aj&*`xWyC{ho%b55K#eES`vpyI zS~9Huvump+;N<(iqc=|pC7ud^7}Lr*vR!iA>J(hu0+AVf(Ju?i_C*NY65zI?KUrlf z=2$y@KACJ##iU<*A@_fQv1}5LO^uj;IGZyx&tpJi#>RCUJsuC*qG;U6OWOfc%NG~! z2xFxkWV;Otm;a?5wew6KCn>!^Q!`1<>dBE1 zN55_P{NO9UjB$}Xg4FH_lAzP}rc#V3Og}z-d7gNsVtDa{gx`y>Fgl+qT<2!_`t>4J z+#ff(@QCH#n(uZ_c=vO)X{C`#_$6Ms28}kDqlm^94B687B=fW{Qwo3BQ~SJav_9mB zZ||iLiKyx-oOo5+gMKE4h^{>k1vmrN7^}+z9VQWmm8ln(9yv>d!c_CAorlb1$?5D;#WLFVNoyIc%5^q_N>m;~wROzz^!R;v!Q zn7lXG1fnnWUH(OusRSf)+Mm}E{^P4>*isF{@9%d!MG^!F%N%2pZN~b({!kANWZub> zdf$U{7XJ0&2}#5;>NTmpD?XB(n4XoK4R$s){z+GDqK(aRi@epnf(~`b1`{PI$*;!)2WNHO|yCX2|C69!2HfJ#ei;|pVZ`0h<-b6;%|eBVjMNbmTd8I6lm2)!bh@(g*hOnW`AG8>v){dR>f zEu_qt4Bi`^pCfU|`gX@ii>CECbak9nb!ncsr_aTiKFgGA7T1vvI2d81Ap;)h4r^c9 zXou=Le*dN@ydV1E$PUtYt#*~=DU)Acb8A6r0HPfl7@mG2M2=QJ4?)E7^5#dtr=?J{ z|I4ZM#*K z-4?sV$%IC3x{-bDQFC*Gpfqwcjq}{=%Df1EWW+Et2#Y7AmluGgIJE2{^I(>f9WJ?& z5#N|=dP~V`g*rNvkm~6PaAm1%6+Be{g-=^-+he^AhQ@wJZg&3;+Ya4u%G+=_3wfT2 zAeV}`97bmtQ@%>?Ef3x!`^}5r_yZ`e>0Gurgc6C|M&LsG-$d2H3oOHs+Er4rFx+OB z@}KC{{{X+A&Oi{~qm_Mh-n9x=xb}%3XH;9dB8T{-RH?RK zLM`oyjnN&)kFa0BYW>lskC?3F1EZ>ekUBaH1}u5Q%-HHX#B3Hv)ROOpp^OuL+oNQT zgkO%m)Yl5pATG_;G42>=bXds)HshNO7}-V450@ZlH4NW$>>g@V&saKzg$6b>f^H;1 zOS~wD4K)poai|@H%=Kfl4Aw)ZY(S+bLe-h*DdozAn2iY6-^HopD09Ts?KwA80?5`F z(f;tGKKfJ|Bi<-Oa~mYFh;CCZta#=#%P#~hNOtqr2y8l}lOtxAhQL2wfhvBGX_RxW zkeF9g5Nx;90tN=UWL_)b(0LX5%Vd{uI@Kmd^^e--ns$-%x=?;RdFeNe!S!AET8;#2 zD(qd<-pfY`e+N4?B()8)#R$I^c!hRm2CW=k$2n@|L)Ky0m>tac=>6f_COj8PrN+1ZG{-? zD+KuCfbTE>PrMH3YQpd#W$5(n2ESrvC6FIwq2;T+5~?6~cSlsMBbzb4dqX3tEMGQ9 z+5oh@iZKc+y4GiP^HM`^n%FWz&!Yn9`e}8c37{Wkx{^p-jL+=*jvz$2V!3X$MR6R@ z`-(R_u~TrPtQGT66?MqfE)iu6-Pu9}{KF(9ZHVz%Jxjn_Ru5Xon$Zh1jW?*MtX8;~ zsgp=eo3kHZmRQgTX+t;7@@;cz8GYev=uDqej7kfyYb$0(IKI&KGw{w{{FQECi>)KV zg~b6(yjhU6WAYV)4-80_8Io4y8v&0o9YNjYg5VFFi;vo2r zH_eCSP1&Bhsj>MrSGf;f+_1nEu`T%rS|l-s?&gUsIZBmZ0-ddr`-(E;Qad*xdF1v z0*jxHEMuM2_;VuUsPmy7rFGrMOGcI-JIKxdggZkIo1Mh$3YWs(@nV&fF3ZtR)%^AX z)aF`Qi(DoUiq;9wWof}W5PlGbn_JFCgA}MMX6RH=ZiFLyxMh_ks%=A3Mzq1U&Rrb6 zd%@N-h?BmdXiZdp{pl<`N@ft$Z4qmx^uGVvuNi5!l00irHfe3M}&v&EX!B6 zWU8f~#*NQe;bAwSBYT|gsf`4D=#U^VoaOTJp=x%j(g>vL-1LFvF+RQ?$2w3$7? zTxGN}^Phq#?Qd=;v5IczZaX3EEZqy2C}wx2iL;$G*B@wk5F@n$xv?gE#N1DG7H7eV z`R*p`E2UHWObr->F5aj5tj5C~>??r; z(*&kTa-K?Z`CKMGR{IkB>we&+m_p7^Mu@I`y@q#mn52(Im!+b|G&#~s-6kGt+_}N1 z(+XNw?skPO^s6{b=_MGHrmF}-*(`$E_-PT50m83Yc5 zlgpiYNlQU}FVEJ9%L+43Kz8qCS&B{L}cq(-FTi+A#HXQs^KnVfOg#?e!J0ODEdMHgg~tIzNKPDjpdL^lf_%17xSIs}BZXXax|9AHK-k+q<|bH^qFN zU{bpsJL5~KL&EVBcH$RD_@OxF$!Aks`lB}w!vt%R_8+yVxnN$w@VR@7Px2bRE!*x> ztZA&d9k!B+i@)kNh-q~GIHCG#see`(dW0BI?<>JLej0HsD9T0?QH^9MJ5KWLe(LS; zvPDy(8_#9X!UwVq-@5LXyNTxuq|yLvMEGmPNp&E2nAJJlYBTkrf_#_z7S3TYzNXRhS z2|-1iM~T*}m*H4~cycIPG*9SLz9vK3;y-2H4IySArA*)K>{181UVwoPz6D<5x+9A1 zmXOtCJi!PXZ~-24F*&1@D9urI5sGb#Dqa)+{OzQbMwSS|?o6BE7EC*1C$vIGHp&rx zW#=3}4hjw2j=pbtxu(a|KCCf*CuLixwOxYluXNR2e@?V$l8oV4^i4PTo*85Pjaxv& z_9QklnRdfvp`xfhOWs>VTADK3SvX_L-1$qgeq>rfLM(1--bGU(6DMkJ|8-IuB-(VbW|N?G9#7A?XgBL8 zd330rNBwoP?vM$})`oAg3%9y6*aXV(FK&E+oeZnpoYb@(nGJu(n(wNd8V$^% zw?!L>qn)G8VtZ!|-c$)NhL0-gomg~wGBi3kd-&CkAU<$XuO=oNj$R;O5(f-)wRr4V zB=7L8!V@?g#-@qYg6Qe z5KU_vbhj{9W&-b@WZHgvw|2`16wD$LmFE3XdQg>zvbLq5a+V5BFX&JIR(s^qvF^eq z1uVCyqq38c#jjGsZsWaKEU_@8oci7!-R3%Ek~Ob5csulau~yNtil{YR=+#do+W!@D z;mfK`{3Sj+&ty-=1T((PcKzng0NbT%BrAXW0Lh}yyWDMU^I@Jz-TwxSV!{c(Rw10v z7&sX5AA5SWh_lB3zD#F@-RdSQ&#F&mQqG25rRjb6MOGWhtkMRCd_S#NHMAy`8eEiR zZlz@3)oWdmSB0Ovsx_2@xrenEFg18-KsfhCBK=1kFqiqF@WuA}Rj*PAW%nsW1(VJP zq(4g;4dhQpo9S!n>PrQrOTdBDS~arKgcckta<$v_}|=>;At zGZx(+*e+%}*$`_>m_Xm?i!)!OZ0*e&^UCgJ_ea)tw6pNWA|0Tef>{H+*K&duk*dDog?Hw!5#Y~GsiG{;Z^-8$Z5`h zdp|I>c08I9Lny9tpQ1{pbL=Tw|L;M%{yU~6o2+B$Z3)Qt`qjNy6|LqR-=OQB=qFb&$+pBvO0$ zUA6Gvvs5zYXEW>?rOFn?!LR-`E`6wBm>ah)msC%mN4kTV*>dEzvEdolH6%ZQXJC50 z)AZlg^kHxhlA~);vS^a9l=8xQUQ*2pT~>kz6Tw(uH}kFkID5SQ{nmX)svLwy+pM8z) zv23+aMd>h$#rUq8nHK$ytyt-F6Hpr_zFR6Nlp;Ft2Xo+H&8}!&lQi#=e-zO4IubGK z)l)%VT4HSc=R1wXWNW%B02wp=??@6U#T@W8e!P4@l8}ErCpWQRnKK4IwKGSvO@S_g zYeaXGfFhE#@yEY=iM^FJe{yWf3m+o4QfUWY*qSGQ_UM?&+fLnrN<-MYPHF; z=i7`l>X6y+0JL+_uDv(i%oj+DX8*Z$MN5@Vh>7D;!g-460?QWq{UYd@b!Kyg9G8}+ zCJ1v8)ni6G&phu)Wm)Y3WBx+vljP0Aa8YyVFuY7uksRTB55^YRk!NfkxUS~wzh2T1 zbta^nq9@ME=&NUTxq7EyV}G%H@WEHsB3QsKi4N?OBgfOlzq%93m1C|;N9FF9BqG|{ z_)!wOs6}I)WAT@iXf|I)*v`}=OOa782l~Qvlk=%8%5HNFrcdFQ8nw6Z3Xt+6FtZk+ z^48r3jt0SI4zip0PL-kK&}w3L&YnQkOpQ{Lg`JN(=9#sd6sOX}p3P)nNTH8LjfY~% zsAO8a$X#Q_0FG6W&E!mu-Snc1<^Wyy{|t?lm0j4EFH;7R${M(?0}!g4Nv!IIcB&Yr zmS~T}QU|6QV7i8QzPf+4O#PB4?&NcDEC=ksmq!0Is{A zpZG!+ht)lvua)-phYnKc3DH{GE#yA+LS(Fm>Hs4a>D@`u? zjpBSq*mvC2D0CTG-@U03YWS5%lxlp86!7R!HOY+VHk4>zrBqxC zIo7`Lh!V<$twLI}i*7NZNcC_=KBYy5$ zMg6byDQ)y0O*UD8Kk|GMdy1c!{J!%mJ1nM02{_TX%4n(;kkTMg?t3Ot7{1;j*(;Dc znr|L2R$gb3UKYW|qi1)DJoKU0*mHBlNi$qZYApJOXYfD#I1=h}(K!rR1qpeHD|;8% z^Ko_paFki%I`WNmmJ1Gt4)`tEZkTGS)9j(P#@%&|qo24x^9j~Cz({^6-UHQ@d9tLh zQmQ(YbB#$`EVX{dfzisRFbLzPH&0(Q4V#FouM(`%{mYK`Q)h2zpw@wOtfrbuqshvcZvU3 z&x=pft=cwhpCls=E|>+FjhWi(ZRU>lB7<(X&yUF8h*YW9$P=#g; z2QlocgIAuFye>lfj&PIWuq~{4j`a5HODojhXmR!W=(votD06jM;czEtLSf{a;Nd~u`(tIK+mo=PE zA`HFnV@>Xl;PKP%#~*B8L={$E&*Y0h^Ef1V|Kl_Y8noV4X^s3zTn$sM|5#xlNX;^7$^{#$_~ZlaNbcYe3;&Ti3do^FM5WrUbd z?}9q5$82{`Z8vbuY6AD0p9*2dcrxtAXRpAlXyQmuR8Pt;{C`pxZP#-{cc@TQovU7! z(h`=+{O*|-$nt=75b2LuQcDY{%yarTRoYBBiEDb`Cz-+xt9jGtc>PyX1fDURv}rHw zO@6)8O%yLMHaKt#Hd-2RIP_+w%F^uTapA*8x3Rt6PzFC(m69syMAA6{3L*(tNi&m8 z`mh#o>(>bT{*}qI+9=%Kynj<7E5xD;oYYR1M4Ugm$unr#eckN|J#b^B%_=EiROC&A z32KPt^(ziTt*AV@lx_cEy%K18G^31qW^?&Nn-{TBzNezT0)OzJ6@BJ<5mM2!o6I8j z!H%J*^jVKp2-Q`4px9mAwhoGePU7cv>P^4_??#v&iD(g~$7TmLKdons^b-en8s(31g{{*wf+JKGh`tE2FfIj=U)@Oyc;c4RLS@mI-MMAU zUV_u^0f_!F%)|51LvzQvMzdeE ze%M@Vs6$jeB4?;G@+{pvU$mE7CwcyfxbkpmNPTX|RL-*pI7(b&saVT)OFo6~&$ujnuwHiN zsHAqLvxUFzua5`MBSd79Q>mW)S!yRjltRwH1CN^M-^2kdTatewM`^Zqtc(V*LhKx6 zkE-(2`xED#iTikVn22}#Ry`y%I(to@SE*0vAxhhYo2W)<_GjyiABcc`hQ~~MxW7mr zpDDH7O$F}N*S3`KHJdk5kUV14d;y6*D|`o>rpvsz#81DT`=3(Wtg-m$g3LF!r)i?w zi8I3?$d8gFa_7K9rb^GJ9b00jHRE-YR8m%bC975aR@$YOpK^`g*W2#BWbTihW$Apm z`aWHE?1M*0Xy4f-llA|AA+|@i!Co#dXnl>x0Do6rjg@-i(IWqDv6r}+zg+ECdSpiN zZReT<@jUZe1;A9QTTiS`gG|DICvzK?#??CUN9QgUDxOE)A>>GXr#MI4{1x+C)VAmR~vl( zwoiZm54XHI26R>57CizvhqkzoR|>&E_7X9VgjCt!0sDzOGCv zzG=T^WTrqF&HIp$$?I$9e>F_DZ(1g>_Yl58&==h4RjFtho$34`6SKCtL$nhb2hCU+ z^~ERwEzDx{K1!qBWGewU3v_s{IW8QK+o8$A;I^NUZPyPQ3Ix-lVPmyyZ|g|$`NIqZ zM)7x+m%XsWvvw6x%hG08B@x-^{_T+_e}5m+Gq_U~SEGSrQ-x$9c?i@o?-KLlP4yOv z9y@)sk`VBZW9TbA4&d)L`qbffhikgj7=$gw)CY>r;u06creSHX#T7+RFbM?js0dmZ z?dpFD*>Sl$%(&rLZXmDGNIhKU%g^xSZ62Mvvk~qeJ0*N`U)1|qH#ps28hDoG-Q9s> z0_5HVt=3P&a7Xa+8qE^N*rN*|v>}vvLy=v)8if{E+wSYe2S5xksy|=@XdqNt1M`$# z_vdmqYl}?)EuHvt%~1M?jm5++=ECCzar5mQwPR4+M-Vg8Qs2lcslxbb*5%jBS*ogqK;K*e)($TV#ftfd`fF(V9_D z+4nAT*-JHErVo~L1x|fd8{$$T?enBWF2u@XG|&4)UKPHw4SiR3gS{5n_JPjp0rVEw zw^>LY2hZh;7Z1Vc__}HcCQ(+C=ZIC3C!=3QNuFQ2>L#$>cy#{U1}E>Mf3%)buopq| z#v^2A5!K@b`j5x477uakc8=DGLD{gUp8$J{1N2()X@~4p^x~KjZN*xj_|MP@_BDhy z#8**r@A|XsltYFVJn=APMlg|cNv0U<86h#h`4uQg-Kcl(O{obU($RbI*$U%_!|;`5 zzzQ2ktjR2qClO&JCG!HN;?QO_5#rEy$JAMD=N`j*$j@fQI%d<9? z3%<7d@1*iy-AW~tu321b`8|OmT50>s>6denx&##OtwVc~Rkj<8vi+c=$}Vp{(!<40 z&WFF@Wpv1sN|MH-(i4lJ=PIags|RV+X?#PAwZ0(6ZWs9Cz6C^7Z)n^Bauu{QKX|tP z!en5N28mtAY!I5_Y?Lvg)kHeDi!18#lT_0)+{SC<8pIHO7(2m`qkKKVPz@y*&xSx_ zt=@VYJEg~7dUuSX%`X!X;?Hbvux?;c9b~bJeFhAW@ zc7EPlO+^3RToaxVCVN+tZhYfqvk8GH*-|C+x0J2eTM`!+wokfY6EN=r(j1lm?4)9w zgf$0OM8ylxa!Iotz+}?PJ{!!&ZJou-&c}iFbZPe8;icO-`yazc5N||oSWModEB(8} z6O0Gz>KHTkC>DI@K@m%+EAl7aX?2J83q9DWZu__+o6GAoNKg;*tB=J~2*gMelPZF339ZL@vR3y-`phna;FbP-2;s&{Gi&7;dqSCKmC9e}pTNANyy`66@wPv`rnjlfZWkbXtXn5sSI?~@_$9ui zzUjnh zyNopB&5kj&_rtV|JBf9f8%b+Fg4?*THhf)1PYSH|*yrlK-8tIr9K_;3L69HS?pz3F zkBPq{jXcB$HS}&5LA!I&$9=d#j{HHSwv7KiJbBY=+R7U~trb1vFRxfv z2ADTv)KmjYpB~!0k!WN?DdJnn8zepD2w5mR)Dy@S4{6y|+P5uybk-oF;gTP3i?xHe z$+#s9&vU>3%L>Hk#a<6@X&?wU3Xz9fMhy?rCiqW%^29$CCa+x|(< z??|5e;>Ew;|L!9nkcsH3^K!*v=8N#0c(ac^^nLW_z>sgJh3)URQA6?!n)A9^8O0B` zzCEVuc6lkqlRL+}*7|tPK}Ne4O?i)DY(vebh$R^qP=Hk<`zd_z;lFd<;2vDwuM>YP z25&3|_+`XNu{p!W?0CC(P%L=Yc?5ao->?LB#$0^^@fY;Eq2UHH~9_L;73MzwZXjo)@I|H({z-f)P=9fK&OZxU$5`zV^ogKIkn*JFFioAc48;}rw34JNOjf7j@ z6$ab5oSN2~2g*vg(kf%B^~}x)tPslFUrs(Nadb^VM8V#4NogeyiaFv_3hB;aZUWqv z>ESK0aAgD&*lvh{+*B2e>(uNjNjBw;f3gl=GZd95c!0A7d2EoH_NwiBKh$a*` zMWoe#J`Jz;X};P*jjyk?(cm8H^iKHI#&U7xn-{o_kso9iU`|}>xUZ1GoVARaHbsNw z>R=)7WPbsoG4Ai_`c_S?oLyPJe-VCD1 z)_f4sjF4|*97KzfJ^79l?evkeolLP0t}|DpQD(v<8L?8LT8t#tA6V6O(#tu0lZP~- z%h4|8%rD?XgSNb&c!-kI(ObDNGu>SXV2 zY{nB~;`M&$wOtLe@c&Avqc4jG_+Y&1Wt!H9Lpd=`m4X7vy`D#E)Mm) z9bSaVAo$f#P56aVL~ZWG>}bc6hU@?pFeg(F6H|sb_&KbvtPZQ&9U!mBmv4lHX27Tq za;QsI2UBmn(1I{Jd0T#=AR5hG2k+*7 zWdVR&gVP~)WJOQlAkLqd&AY)aRd|W$Gq*G^D{+mTU5s6C^)XfJUMkMXhOvw#pnYak z8yu$7Ni}1`Cg&_N$+94Ay)eQLM@v6<7GUylQc||9Z^_g(r?7M!xgcQOB8^spMqIBV zzy+JcLn&gIN%rj6iogm*OXf7YGsYWJS3jDV{EQj^B0ma*Z%v&kmz;kSjcEXnTaSy& zjKgBq@Rh6at`z;$a3ZACO&`o!z^i&GpaJ2@&Dcgg@Km)_hr0L!dg=Gmt2nZ8CagZ}xxq z$QfjzB+foLGGUZqVsTPJH6?HOYdDO?_?!MiaPp4+u8Z8G;@cy~Dl1IIz-?U*T^{){ zN$QdV;|x#wdx+z_-Nr{9M8SgkvDcIsI{OX1k;4g9qF#31L%edJPDZsuoc?_YWUhcQCFU_5B~8;{TDnfBJ@_y+q7RlBCNkxcndX zzOpHfs9P5ZGBDWS?(PsQ!QFLmhu{({mWT^qTTH& z@v#A~MCOd;_dE{N9fH~RVpNIHhd0!>rT-8U;sMnClpGTAR3y@wPYH!u4(~t3Ha8vz z^i*zsI6s)kRO|WtW!ft*ChGn7SiG~@%AFc^8VAK~&3nM4TJi{R}$Sd9n9 zy`edewz!x-Hhpd~y=J-cz1W}`2>u%EPT{>3^jehRknF=-!#y?ZBj~@P{=2DvodoU+ zjSfU|`Mt{L;O^$OlR5zS(#tpRo zRa- z7+*~0%8JE0U;1X+vNINuM8_^RdM7m4&GPYUErZwEK=QCNHT8?upmXUm|2|WoU&gB4 z93iPSDO~O=v+Ix$?$i*AnV9;}fVOA!@(8BYK|MyEbvw=@3FrF`I@d1tuocqtnALM+ z%heBxbM$q8zZ($Qe}v5_BMyq^BOds%SX(VaICA^~1I#u{EmTQiurlirW;Nt>hQNN@ zu=ZTBLZnn9FL$b)7o8IYrA76t&l|>oYOyjKu`FP4WrDd4MvF8Rq9C`r{9x^$52;+n zGy0i2HkG0`RJ9?!L(h(Kw&5Xx?a-f0Cf{{ZfD9FCw|~&K=dBnLl!lG8yP{o?bZ_rJ zcm3T@6&eeJXQhDO$0#`K5bJ)uQLNoNtVB1NFEFjYx>rNg8`f|{K{scQ7>&z{>v1Pe zpE0F&c1+}61md(stXKPkQ5dtcBNb$4z~|S%!R1x3nfht6Bd=Y|h=OkeM6B=M*Q&9D zh}7^PXe{QN&7n%T-QvI2(uQX>m^lg*$0FDC=oXBQ_ANkPd03_C&ay(9oN}g{ny9k^&PDlcSuY7DEK3 zii|vf>Crr5{h7g%*x)~br_RMMMVWln(vyngG`DS}A)<~XNNm)%SLGex|4I_{5yDrTe6#dmM5x3J95SE9g1zetw}XPJ{J4AMOIFdd{D_zcDr~ zK!Q4d*)IXL#}4ZN(NIyEcF&_OibDXT9eF*wY&!KR8cd zF?e)s9!JP&cKM+90CN%fL-$9uT3?BoW*d86M2IjBXd7di88LAsaSkXw^&F;`vRKB^&tf>J9v zOM6P|f_2uC`Wt?8f%M%v3hIeJ>QjT*b3@uDMMZ-%+MjvEcD{V4%D2#SK7Xt|&BwO9 z=XcIIg9N`gs3n?d{+7h1W!u+4H|fGTauNNW53}g_iCy6vHKTVAiSMU*Ol~W5xtSIw zpd1vjTzrJ-1Ss2{(q7;2(D6f4!7KphoAW;#=f1zo0{RlkpqT0LNKok zgH8Xl!4(t5bpLa$yiG+Tthtm^Mao&0!-C_aT+WaBqs~GNRop8#oI!qJ=#>+i3dXVQ z#BfWJwDK?=)xTxm3d;>MYYmXO$%C99!ksVZIYP#(Qr>UYPbci& zd~f=?H7MoowfK#{iJT4(hBV? z8@CN=aAV#lza_>*FhslyV5zSz6-fc9FE}QLiA$9*LXQdL*7bSr1!ubnEp@|is@6Bs z&3F9gTZ#i}4p{RlxHvg*T9O??0!e;1yM#Px!-LOAd(np3Pjq@OkSh9#4@{g0kvc80m2$8#`LKe4+weP<)NvZa>AaYV1ssn4gQ-PvclkW)Qjq z5pTy5s??k0S^F!5^Rvox3ac@R>Dk1fJ3w1M#20^43Zep;J%tldJI>6~tIc^icQ1$3 z0s~~c4FT{GBR?>u#KP~~B!O|JU?ae=I#d(8M_)sqxsUcZDijjV;9Q~aP9{>7xDb*9 zw-lv@^A_H7LUv?=$BQO3x?sfgpw0$<*8-PF_;;n%yV7v?CaXLlsbzxd^MA@K*^3$< z-YSq9F2+-fFQ)~IYI)z>kVsKoK0=sAb?ITY$XxHk_p?d)u^n|h`{8}2Kc2dWw?}9F>e~!B2;$iMKuL?B z_r@DJe23hJ4!Tl4eUyR#E;Ol3ThCFjz))-$|2QBe1rt6|(khQ2VA~v0{kOl&xEBBa zX#r4iugqeLM~J5p(yp$&&>H&YC2V6MP;-&)mv`X$t!D&3eY`fkYslT(38IQwGr&u5yH$1*?O&C*(=9T$6%(7dJAr@Z0b=O-i5XX4cb`iHj|JiTNP&yIwlHst* zv~oG5yu&ZVcm=l>0BU4ZG}-rUi$xvh;|r{a66qh0=QuI@=Vm9MxzXL_POXFJ(}QY} zNJBhf@%6(wxk%M3?uNFI(-A^c;&BXdrj;Zb=2I=m*9#gw{zh?k)O%w`LwdbVN5IAY zq$1R+{>-P5H*Bf!;vdM&P#Xt@r<`yfG2BSGH;At~K#CORn@bD28_tZY(j z4S|8IgS{#WQm(9JikspUkb4;T?~tq`%-9t~fMfD8rjUB^>nuIL<7S5GiN^Y zX_Gh^DN766mv{S)s1Od_u*gYEpme36ggO;8kmWFWN>wXk)~&r>c)3vcr+9gK$}ee~ z-yoyX>hL((zRcQA@F41!W*f^Oe;B**cPot@#R|9crT3;6!Gt$hx}14M;~%umrDM~7 zzt^~Q_0~F5;CJ6m9HjpB-gSh^d(hpgU0x@$hbuZq|70l45F!zKXk@i}7#)i^N3DaMdG4@bi(YW?Se-4wh!jSa-nphK8?dw!yn`Vt)xw^##?2n z6u^x*1aPZ(AvDfwRr)VF{6YtxS>S`sgoCiTq%Wc}zI8GZbbWA9v6>8EP!IMoR}mfz zb*hl&fmulVq{+wA5SdelxJNbTuDD3WA8BX$k6MnzgRawxm{i|AB1Fs7nMpg-JO$GjU&tW8W$m&VaXj|%Dy80{8q|Avj{X9q z6Dw9VtMo{UXeR>H&hxFLjF~NUuF;p$?P4qCDlQdJJculD9C?xAJa?g5cwTeI#?$t! z>cE8UgzEVAa%eB_e+?%?1yGi1^d@T;jFJF;iIV+t0OWZtI1EEVX*C)P?A@@a#v6&J zR$P6Ef6q9dDtDC^5uu=_Ll^d-W!ecjQ)-`(Tw_NdT%IIO2(=ba)(p_l&k%@NmcG{O zg2R!!CI`YWb9c-1lRQq^vZV1buqw+ zfNRCAcu+!NM~C{h6{^^!ao-AB3iEc%`kZDa<1xe;haSdD2ljVh18Nk^8Hs&uJ=-J0 zs0n$VCTJuT-UFoAz2azpU9(thMR-|1w|NpZi>H@UMexzhR52fWVQxD$c3zM&o`wXO6-uX!i=q4k0mnQuo{|!! z^#E~{ZvB&wdA8{!4tH2R!aV(%G14MFQWTMOMVualP^?)w$qEK}zEA`==j>br4|7``GvIr{{B3EpKt#~;in$?np zl2ih3?jZ)`7(Ha5wJF>HCE}SVLRwegd4T2aB?r}3-U>^{M)}|6g2MCCmWuS9p(cb< z-A+6{zPdS2LdkX@2j0%UOps1a2Leb$#SiO-&-9w_uT4k*Dd$-A_qnckGp;J}gIJ^1 zw!1_xkzTM`zEE5`oTSNSk2sC;{Z+u*seHDdBBvcm=)`u+9aAcHgtC7JGyEQVaS?Dp zkzEVB1LwdeV-adp(5Mi+1qP5)AzLQ@+z2<0NO}|rTRIF|VZ%IPm|9#@O)x_#TpHAp+hZNec9aq$iZ`#OiSZ^3{s_TNx3ZLXOLJMn8ya5A>VfWUr~d z*XApSIYKiE`~V_$dR0Q?fcMd%3mmq_BBsCb=K)=zzr2Tm1w$B=aKp6;@A+u%8Ga5*nd@H#9SWU zrCIl?~N$f{RNCa`=eg@ zH*KrSfR9PfKD)Ck7CnQIGSKNT=@-vhPvo2>1W6pg^5qz< zixQ*772Xq%i0RLiHMUI}sG;E$lh5^A)1Rv+6*N8sDJS5DFmfvIuUqT!D?nHj9-C#O zg+A^HeI(y@JmwpjY_=J+07dz96H1L_lZSf9*(xP+oQEeSwyKZ2q8iDw#W_Nf!W_|< zA2-UYP}R_P<7{`{8>}yFR-`$ozD+ zxXAJLOa8(p>+Oh<>t4XjRy7)+ck}#4!2NsSNfK>2>VWP;-n~!WfftLkjOOCs9-R#` zTP#dvJ5B1Ne_S`O#ReN>PnVZ<4h-L}(`ulC0o$`zkm<{i>1hiemk+h+m&ycAA9F5N zWI3tx1T?iT2yEj)i?i5m(cQ4G<(W6e@tS(FX9(0dlce-N1CN{~SGF!Qb8*)TY$v_)P1{kON9+KX<5&TckrG8rxq{rLI3C$D&umeHC? z^~-8Bb3=yY@;3A(0r!jia;Yo#H<2XpAJ0l`)ulSCRF%A<(;!P10v^SZe;Gq>u!MV& zQXVV}ty>1?EM_*V)CuG@2TKh#7l$}4B*r*LK1qwy#-BLFvxNi~+M@Qt6vHEnX6d(x zo&2>aWQI-iv|TR9zr<;I&!J`4T8vbQ**vf0{aK+aZ;(RnJCAjkunXy}!)^`x78Q%X z^U#G0D3kLKzhgFSxU17{rU)7T<+D8p zpTh2a6yy<*6aHqwih9O*cu3-jf$I-5Qdn&ZeMm`ESEbsoI>}FevzGTY+I=(^!#H`2 z9s*WVw=iq_4Iwc7y==lf`_4qGg?{#+4spcTDw)cl@z1O6_Yoj2Nwlr26}VgiV=cE? z>CZ{KKb405z3jYJ0R7nyz68xql>*2DR$i*6pV+2NA3n3_A3DPfD;w>5E=hZ~tvHG9 z+CIt%ANjp^W8(S^|8JhHW7hQHYpG3{pp4|)1z2<+Y;sqhc5B7bV-JddwdCYtqC19F zF9K9f66{H@V~_q_-@wEheu$Ebz-pGt3Fc_jaBII_)zp6HQIyXSzH=a~iIpjq)YW$9 z+E< zTz&?{|GYkIK>~zpEfIpNU9bO~67Dq&H=~U8-`5Nqjtm&&Q$YcIycGJ+DdAqjaJEpC z|6Vz4xY)2>VePoEmk09yoH7s=#)9LW|If9LyuNRaNCv!M{^yk9urLZ-=Fxwy{R1_Z z+K&&^Vgdg-B_Hgnj@;~zQ|L4iXOPEUxmW+Rk zZ^6`vzP!C|EEW0fxlBsh65hM@#lbt~hRQ`3J3Yil*NlQumjagRO&;kxeGn?~&LY+) z8FwM(AfY~@4SV5dW%Bi@YGfA*$oQwbpxTfF9I2m^7aVz`KT?dA&x&0t1ve{l=)Y9P zdhYxbFuL@xz+0y#`$e3iMrW-rdzR*=O?2}Wr zQ%b{aK4WX8O>xuD^cZJR*9^zy+2{ALzGIq3TjZwI0n8rz&B0pYFVUXo=uMWtE2Uw} zNB3>5@jaYVhA{_{yKH)k$+9p5P%5w!Jp z+61;PDCiLgr|bHIBJ$D6`STjAQTXMEuj(JH<@PQwx@hevri?N5yU(Nl%XMPf-o*pv z`30sT@(xS{%@-aZBsl?49m5lo9O#ofy|&;tM$9;+{rlYW?|Gt^)_Axfe6haGvcl>i zqIy}h$M7#g_WaPasx|l63rwTUCNVvVDG`5|CN+nA=hc-?wdl+0ydLcYCfDXAIpuTN z%IR@hdochkq5c^6?;&oV)p~&bi%)Q0vnfmXs%F}0^LCUUYb~9#P{QU!p}8Bu>e@{D zen*Ux(tzUgt9I7HJ(BW}76kZdO?*69RBn(aB4Naod+Wn5TViIdfhqY0A(4!d*0~iP zuf1t3r;zl{2o_pj*$dDPo1Ap2Pcr#09|x~wFpx3qgvN)#1nJr;e4pbd0QBNE6l^)E zVK2|H{`OMIV?lqup?Q84pO{z1nwW4;@}VI_~8)^ z6~SaexGKY?0;go z`Fnlich}}~S6BhTzmuN7m4TbL#+x3djh41YDRjuQcqw#bfAmvJbC`e3IC?4*Cl2a= z>wDug>SPVlt^Uy!O+Sva)sAAvVw{oQ! zG-G)$)Z0S50c%`3(y5nhgQgQ!5=83?J93faE9mUBmdT{+>{;S-T&TV;v@;h7PX6S+_qB5&%yompbAgxZivTJ;AG(M z#E33Yudp6@rvAxGXz4-<*Y1PQ-Hde$v^UWJxTM+wTi2>!6Jg&8J6*!p^t;~ldGGm6$|}5$C4Qg3 z%^dOHwVpp~0zHqDn2(=wugMZ)Yry_qiQkl6blJhKHKsi^cm6kWUmE4{n)+SLUtsu; z^0n0%)uD@5wzTM;lxXNgm@5lZzs4^~-{U);0l1>wtFpmT(THwUbC8$rOF8am{UJ=Togan)&n=5lVUMZA32Q~oM~>A*51MZw|U^dF{1gjRmaAb67hhp*=LS8 z5*1prCJ)CUzlA8t;mP*XvNa!9+jKazHaD%LwS+q=^z4y0?fWjR;+>>1_-Ew&DZMcv zMT&ndwymOU&GqZoa)Z*V-r%vy%99C7#BX3P8fPC0lQG z9jHsmS(;FNc{UPu4FI%+Rp1=1@^s&k!mE@83#_TX6yi63K;Q=NMQ!3?I$T|$691*V zGp8g7XO%dS4EPN%Eo-Y0RNw{~NXrFpXtS3D3PDtftwCe7o~KWsxc+co@G+%2~VqehhUx)i_}<^E73G ziZj6I&tYOja*69H@w6fo$F32W!*1IZAms?tqOdjYU9)JspV{M*YU=GqT)#8 z7KXi53J*+Hu`6F_$P-Vr1}%Uzk@HuQl5nlZb{zx-><|I38qTO!>#eW93Q+OHl3ERpKNb>iJRkhz&sLx|m=rLWWfJ3Of0nVON zY0X(h1HID7P%+e_4!-lQN{NypQ)Nz9C$==_r5grtSt#!fvf^*+ogHm~<^ppoRzgch zn}7mh9!ED%<{2&$CiR?d=1f4}bNtJ-)XvXO5k`)g@;4AhPG6XyVjM>sROsMPt1wrq|Gh!L_fbWpgdC?tBj>3jXU zTbf>~{LbHwM0pA~cHHS8qKaNg%^(#!$=jz!f!2$65@zYZ8mHLC<%88yFLN$iod$Eg zqK#4+lfVH=CN4*v6;DR;5^&LCFR`@wCZ}U zRxBsaGJ)|39oIfy8S;W9qS*x=e06eNQQJsHV}moLlH*sXTL~2r+3hR_+>c}y1nY8JD|T7{lg)A3`P-`@DsFBrr5q5CuOGh(wVpU& zddN(VE1oc%Fl!rvt)eOAB3;64u+IC#;j$Ig&#vITO*}YpC_{ow4qKUHmR}&r9 zk0lt}8?*5OC0USfcw&(g9Kw|aZOpCO$#EJi*+LRJ=&#GJ=fCmGSgAZCBub#x=WWtA z1BQubZQpTr+p!{(@z@1{x|(CKgejt$Gjhy&P{WCY00CX9W*mg18^n&B8a84f?3Mc$ zQdqLWo@=DmNYi*Qt0{wRbH$)+b-S0SnD6EuejuI_FI+_b(R+vU1)SO|$yVybD6fdo+??$>Df59NB4hH12fyxxq<*02;zkP_M{Wx@sc7By3S7Gv&DpApi zO12sg-tjmb`RIoF@Qz0fld$_Waaa=Nd3wAit{=u7^P@Q~Vax0fFi51ym`*~DGX0z1 zT9u;4mER$&5_(M@#VK!EVnb9k`MiqBy*Ck=hz%mjfZbzMY7=#vUaPE3jevXwp3!gL zyt$7!{3aoNEue}>lBE^^A`@C5ExieRp^|cB!AB;8gjW6vof87a0jdne>eXWo?r}FV z>jqf??z)V^QRb{%B)<%raseR0886R|5h%Jo6v*M{)x5Q?Er>V1#4@^|j!Tp&(bZ|& zXUfGIsL9WY12k_9l$4e-+aF~xwpKtc;^ML*rz$m}G#0dW=#SF76xTb!wEoW4aOP+sXaC2!$u;6w}Ynbmnp&h33}XR+bL z334U5qRZl;V{>$H`kGWcgd`Mh)S>bmiw2NH6YqP#97D#Y2(1pj=@OxPB41pR-8fTD>zW%@o;=%_MwTas# zfyf539z-a|tOPr8KeT-si7F*hZ98e|hZCHUc7ye040*k+`ViPf>fGus^#b|3Z|gbg z!wdXw(IxeU-mv*FtxQA4ZcmoFmJwnK!Hz%BRU{NZdK&OS%qIX@7V82hkE$lwX#F4% zu4Nxk!9gE1c)=IyttmklIQ{H@zy1}A;Im#Yf6DLK;mYFc!i2WkjKbxj&S{E78fF%e z9zRfRjw6dJiR97tSIY3WV-1I@&KOr0+(3Ac8#&v|c&0lbYtC(TUbjk(Dv9+zlr zcoGsNHPu+hcMesJ3>I|ju?zZgtsBb=W67C7{2)hYiar94R{eTWp#k%ZRl&08jg**H zb~Ntr0wm9hY9Q2#y*qc=K3rL%8)IH1nUG}&oV`Om5jD9xfSQ>eu$D;eeEXY8VMssW z+F>!qw(WCiA}?O?t?^N53FEYAaP0wk|C;JI_8v zS1~lDikTmY0a$<>QBK1<9z0-W>|J`on^CX%5bv&i;tHXxVABI4LP=NgKUNC0c}A6^ z`^v0{ITE0QA2PY%n6yl)nEx*3Y^x?AWzm&KWJt_J%E_w2OYTZKiYTKxG`av*}>s^pex+y>DP?h;|bS$Cb@*qwp8=#A;W@uVo` z=YVQfyGyB51FFM5yeVFSjbYibi;ez6^##m{l^Uf@}m<^p#`mejVsaxX(`_)kr=NV$=IN9LQ>voht~|V zfd^e0@mS3*)F1Tj)*y)OkD-G(tQpbKT0S0=&v7eNs3s=L+c*09b+lEz9zg}D5upx? zH)Q5+vni+hmzOYC`Mq(C;HpSzTIgjKUmC$-^1Jq*<{X93vg=itJpECl85aBs%2x*b zw}o>+1#Nn@G-3Gi>UxJ!LT=en(!^vwChR>Ge026kG8qoOd}@dU8nHS2NdFiOA-cVL zIaMGu=TddEiO#ref?+})+HU;Qo*x~4aTF0xffwj&Jrrnq7Jk{#V~gO5eMF+EumSb> z*G3hDjz|%yAguKk=VSjkW@)N+{LIC^gK{dap%h2`8-?ywI_s8EIwLh}C$r}~q2tg2 z0`q$q=w+G@j}D)LoU*IH)(7;i(9ci>fiC06E-XW6J;uFJrqvWTOU2Rsqs6827UPL z4xOi-=g;-j0~Ht=rL<~wS zAWFsy&6$X3vX%z!x#4{Y}o;OOW8LHNiM%qA3P32EIj64OEE~eeIu+B(DHawbm60dGH~$2}6sEjaB>==PI2H%S#}VQ9naR&~S(vxCpzN^?LdGQV~F z%WSgI;jMxR{jR?ERrgo#IC^v?El8L%afIE&nxc_E;~JCg=#|kpz59SJS0!G5%D{Oy z3VG5>1!-v)yxVp=)KVti(GD9$)>h_ zDbGppSUtop;+vXo3fl@8H|{S2N7lY(JzWS$ER!ynMhJ?HQ61r7cNj+pNHj$ltST~* zjR%$L_kVX!kdG-Ip@;X2;Uvx1Hx*V-%LiuBf-?bOD2TisEc-)Hrw?Ce{5P(1ZNPQ3 z;a1=asBPF=T3D)9r50SeV8_OfPh~LXF9#3S$(p^u7!LB??c>}s9c=go)U;Z~yIJ0g zW$L_!nud?I@``9(bJC4pQembX0#<7-8ujp!frJ-0E~bTTtX^Ox>y>RS+Tl!mN6u~R zzz}-zfx)U_ki+1`SfYm>)hDy9Iwb#;)DY`TRHpCHFARA<@)e z-_1+fQ=2oU_v2yJzx0d@Nj?e=O=Qm59CfvCnL-`wd!e$?lK^G#?~*%;kYGG}=Z}eq zfQD(Fb*FJm!k-B(QKDzNqL?HPy`b8bZb|{4G+ekL%0IJ|9(PV~;;3cQ1dQO z=l0TsFcLjMqSdcF%g(4E+PdvEE`yP5Fp?rozo9D*?Zp_3c!EBM6IU=g-j6w=OfOVF zeDs!|wlm5!Zc$IlCJ#jB-d5BSi0&VTy}UlD%XCv}T_%Jy3V)U_IWX(dOm2;$3GZex z$)eDmP5bHJpZm)2!3*M}`3AS$q_R({bIAs{t`uwjUyV=&Iim-PHrPUZ@i&o913XZo z)U`z9Dt5zKZ)d8s1(JBBZ2>V5 zeb=32D*OT4vl)`Os>{ODC(-mYHf&6eE5poAf>P%0<$|zCXo{B527cQ&e&1YZxxPbZyrGZXn;0nt+^(sweAiUs^qJch z_4G!D-Wpn;+UI}em`g15hkVBt859H+07@wfzMaa9$6l25v@3vDU1sC5(p~O%LGxP) zPwJDbV3abpzd*G#Sq%+W27O`@X3i#${JgaKrtv}njjb>zMAj090z@@SB&5TK`cc(I zIkIPss5}1U&M+autZKrpC}r`&Nh<=-@0Xc$c*g8&i!66`shnl&;1++|1`NB6%3S=6 zJb-CC(Z4upsVV!ZT=3AxVSXhj>mnyPl}DM(3>O89{0KuA_24-~oS@M&Q+WC|b8<_%cGxvNz>RZiI@kR=;{-Ylxh3qIIp!6T%K!-bP{ zH)}OR3ny2tY3d?iZ-ov8qmBA^~$dLGIUBQn^D^ zpN}>p$thUj6&|GrHVi)VY%S3Ti@WOS*e1WD@ITcFyg_U9iew;a$UGic6C^(KS?2a}^H!E=)jK1Ne2CxeJlmt#NCJ87y1e zi%Dw>aSJ7q?4y$fs)Siw>}-wC)*?!A8o-6lS|bGx2c=WT`8wEGwc$D;z<2@$%?V7_ z=9IbCNE1!DNCs%-1;}DbQzw(lsd~L{6xyq zhx-+2$#L9wvMfK;8b_nh)Y)pC|1~6;YABHX5(T`g4fumc(DEL9GtN};erYsYxOm(U}d9fh}1AE;6B{9Y}KTz?%tZ*5{_yIWA zz+!HcEj`F*ET6tPj;)v6C}%h~b$`EymUItqZlhTLRHpqitX9@7F%sM`8K7Ug z7+K9R-_EF_t&M1>k!YERC3fK$xnrBH302Zf1?6?jB>Sl+%r52gkY0EUIJm~DsPVD* zSkD$aJ%4A)*f55SFX322gb)BRXE?H_qXNmC2$;TC23!OK!I!1s$`fD@Lu7OFDKlDjo^Lbbu{kZEc+98K7Tj zkSm14o$Re~)JH=rmj25aN?(&Egjjt34J9I8Cs64-7KR?2w@kPt##JNFSst~T%@Ataisw?EU0ohy!|02zdT6>OObLnjBDzZK;+c<`;hzadaomb$XM zL8n18!M9S3PZv(5_2FnHC_J(@UB(0nzhxo}m5x}^wH#DnuoT28;0!V5_7|mAOC$;z z2LefYXh7jQnQoRNT6dE>oWKVi6=0>+{5FeZqLU2dw}>DA=F2Yu(qJvE{@O(XP#+c8 zmsgIYpWn6LU7H_$$C*0VA|NWEE(9VTfO7O3ZU3FIfoJ!72bXF!Is@>kR2vx;JXSn)`cPR?_;RA%f}+X{iToD{##I`XmYA5ymTJJry%{3 z`N{>Oc=v=TVSK;ZDAV`o7CXgL%;0diG)(RWTR-I*cCsa5do4C~O45bR=se`7L!~fR zi#=u>YiW&P%TSfeEnNPI4r=r4@Y3+9Gj>QcipT6PCAC0;Ec-6^neIn8zV0mvxymh9 zo+veCGoGC(**STREFtN{(CS!qC1J2a;pA0+MA!iDLT1cVgg*kj>0|4oun=1ioPi2l zA~V<%UBMcST#RtAzH?ql(L3Lk9lZqs$q}YN&wstEq0Em2hg;`!Vu&YR5-}hT@ohBX zQG$k3QsETP!||xpjS)g)EbVxsIK0Hpr>sY@8A2A{PLW`mJ9F|6(b8taDt1I4MU#4G z`jP=MiTCSXl*R|6E!8-U(8YeK7%x>PEeHbDN&{_=`?>T7qp~4%lv=ozDWeVzy29JA zys`@!2PPcAOo|X<*;o6;iEvT}z_+^SveZGp3p1k~bjfJ0kUOIDsv}}%f4>t1-2VL9 z$pt2FH$uBOc)&Od4YXEKCf~Ig^O`yVsAZwz4sv~|zCb#b%Yjg@_JC===kP-M z-8R(slsM@_s7%Mg^~}ZiEY`g2G4q8UNN^d&zwHe(E!3xj7g64sxao4dquDKQKgDvz z2Q7bYG8(eXwdbxxGWjg}>wR4f0pC;xVz5b@K4J9zR}uqe*IZC+dwUVb*Yt{le8Jy8 zz6-$@85FhJ+PB+cAZ;NrtCkS__QZR$^u6(^a7QZS!*j^9tQnH(J>r2v z8-11kPTLE=N9Q|_YY;)L2Xz%{Q(5cV#-b-Y5JKGhFQ+{_C_;q3s^!A`Ub5RT&R6$zAl%{}=kvc6iesi5Ebd5HSo>Nhd#( z?(q1&;N-~m6*VpbP1kI=MT4HkOuvjSRWFpkwv5XO$F`B6klpP0adk!P5sOKAZH`jR zqR*}nNZ(!`U;oW*XzP@QA)HxLf$0;ykc}3M-B6q>nt2Uz}hQo3+17*1}f_`jm3ati!!h@L7jl%~=OxOZet*45>gr zb~FctUjx51KpGcJGqkz3%EoN~;Ghe}hKnlWFOLOF1!_6om)`QJ2%9B(=eqt1I%nSdk zqe@I5qG1ckb2*_xqX`kuzOG5V^#S(@DZ~=P8I<)nB7cWeI~-bc`RJC?o`^I+YZ@rC zw%jb?ptyWT5M3rIguvb>I?R?eK28I{$eq%PYK0Q?H8HE2TfO!AK0)FZq$WOK9%DHZ zNogF%nQQ5S9TqB&3}z+buMT^oI%F{V-mjIm3PhXTu~@h~1NBy8gD3OswW|JY@)h%| zFgNn{K?IS|{E?9|>lcthKr9bRVG+4;jK2OTt{C>5?N979ITpvVs+ z22mFIOu{2N6V$kyHG#S5Lvi76L?_0~YFeNLMeUyTlUuIP&iHAhezBlZ1YS=fcm()! zmcHH@SPMxVKZQ$=p!3hsC#bqMdjsCJgV+aO2Axg4>ok!W0LRUmEC>uo5TRmd>@CP+ zp##Q1kDPt~E!Gb5{uzOw;9}VhG*pxjlp8WFNJhoUtPH+WraUK}Ev_|^u2s%WHEpjI zPZ#v%@GCUy>zQu&N={rWU=;&^a&nxnzP7rUF^q}3yogRqrBCilmTI; zB3Ga-Nr-!Ad!Ez6z+0cc#N5dqR=v+tg-WRcs=Y+Xo%h9kJd7qiZF5XK=93xIOk+me z`@25-<~-auLi((1zAYK%ndxZ#Y`gfGu;WhH&fu!0m%y~s*%6Aaq=?a9K+ji#X3DLp zR?hS-k;YmvMfW|1Hit(=l(6`mRl~8Ya>)nqL-a2Ae4qtx!OG;SjIdxOUdvKquqiRk z*AF3lXnNI0YfvE&jA%}P_U*~!MY1Gfs{XW9c4FjF)2N?6bHU`aABDqYZ=w2!VSbpCy<8>Mfv*TsMyxPRli` z_^G6Ga9IKv*%Ze3YX>}QIT>+2Eeu55%H=mwYg!N| ze)IA)6LhP$G(`QvlaAIy*dl8FxgfKwv)yGmSs(JN1u?Q(o6AZsvvfri@`l}SGT~Bu zNr;cXLI8~rrY_e*Pt-4I1>x+XMnKSn3&wZf>6BNlOQj>`NBSW3gvv+kM<(TPe9*x5 z(`(cJ4>|9PCNwsV0n17LyUdG2f(_4&3m#N=grb$iRC_%nQ~hME(26rCNbR{ zNJnw(J1aSSYT*0Q$!4J+68=Xy5hxNz=elP&jmcikj41kyC-V1!hmMv`duijt%1mMW zxrZ$i3;YQ&N)=DUFk^IU?S5=AN?p}&UJ7b6Tt)p9hx42;&rCjxKBB&0>k5Aw$r^k$ ziJi~KAlwxF$N_a4GJG+19zjcSYL!{HAm{(n-d9Dn)&1L|ZIDtzgBDu6xI@w6?oN=Sa1#Q7Tk-|7N;!^#i4Nc{^yJ{?j85_K7RXg?={xL9&@iX_xjB_ ze|C|Pi*K-M0<95*VzmkxXOkhae#YxX;|$#UEV40DvV39gn@Q>kskMEnND}tM7jvc{ z!b7JM2t|=Xks0`(V|SaB0}j`L+LpQR`8cadiMkc|!i5@5e8)@k9R|uL#BNW49%27T zFjrE_-*}xjnowa*2b^>QkI<3IXg_nsimc1Y zlemM!GdA6$sp_)OntKXvtAEMIewNed? zep+_fb2LL%F^0`+99xiEP+osZ2_&4n-N_B66+jo8orbZZWfWY{kkc;h8Y*+wk{AO zAmWRdN_!f$UqAu4o{V)nM(>U^1Q#g?@x= z*C(|MVqFFWc{l5Cd})bI<;|B5?j##oKD|{~no)y<9E+g9%{nwUCXzdhzbvl(`*V!| z{eR3V`rwib^zUM^yy3ch)$#6wtF7?7WYU#v(Xt(+dB4tMYadD0?$UyF8C5*jw)q6e z9nYdBjF(%P!*Mv~bx41!Lm@_q7U@C9FSZXZ16&x9ICjUC1)f=|kJp}Ojq=Hp>o&hK zkVs626egg~}CU{jqE>q8riTGhrBly*o<*Q}acal{yol zm!iO2kmq5}K)#b&DNqEdNO~SZ(BBQ86g4tbX!Xn8Dju==UGtW2cXqt|mHeX-cHJ4( zNl*)o%!g(vfG}kUBG0|58Lv&ll(7xt8^`?K5rL&FEc7SX!p)Eiyl}qfp%TU=-@Ctu zfK@j@i|xo{C}i9zWideL$#Nyr#&$-jedb-fT0W+J+7VES&Bx=$A48uL0ADy7XBtpb zg?La6$#ZK-#8(b}bp3au+dgQz|7mQ#8Ygqm?Ru2f%g1ZdtMN-aeDo9Caepydz=Y}vcIT_ONaaJXSm~9y%g4}YNmlohz5eDhZVC|$Ef*vnA#0O9hq7f%0Pg! z11M3B35#u^N3Jfx{jW;mh!wa1x|?vYu2a9I$VO^KR6Q+gB77|gdUM{Un5dEWIE!S6@m)gB63h$Lg z%`6ok)I&dk!0Oc=!>z$^bC+Sy_t$dHbK8t~I1fi|*!e%`PK0`1F^ebvoPEg8s&||} z%B2&t=d;P^4rxR9aH$DC^g%41uXSngSZhPM41Ot|d|TlOusmp@4dhbf8!;0?D`S{H zD~$`qPq8bM(t(3)_WuOKH@ZuWz*X-WB^WlnPcap&5kUF;La*9~ZNtxg44~`>^OlQ> z=UJ+t)6g%DJ9sESV=7pMLo$0l)1ErLill$Xh#MBL;(rl}A%$aIhSGvp(>Fg!4JGe5 z3Ka(7<`1$5KbVubijYPCk4Hh(`Y*4CLjHq52hqwhkz$Q<>o_gJ%(pp??FbO_icHBv z3b(vzp{|=Ardk}2G3h%bODPp`2?i@QRm&PD9h&OOCq%Tkg$_hDr^kd@EQp^6c|sDL zw~?-w$QH#WCNuQx6>@=PTISsoi&_SAb>3N!G#@w+BUWsIgESJ(JHi|nzTVAP^(uef zAiYxR@I}uLDJ`r}z&wXCn`8JY3#H#`>pVK&)A1W+i(LhPnYf^fyP^VU^<)A|WItRv zNH7u7{>DjfQhm+!757S#$=37N&H!N?IV%H`{wtEU7uhh?Pok6(oq__S{mS$fp@A4? zSeH0fc_zZN%Z64*Z!gGl`0wN1Kgb{Aqf80Osn;hW_n%ffi7E_hU zXEirKf)JxRR>og0&t+9$tW1zYne#gq_Wl@-47-Ko(K$M)k|iHw0$d);B^oNvcSE< zYc!}TVt6|xR(STA+)f3qvZX~LNJPft#WAUZz?+S{WNyM)wVGT!F*n?{9;Cec6Xm?; z2(e)3aICr7jod=}(GjW(c;kbm_t51Alcs^Q*mNPGe0qP;Hs%`94sL;wYDTahz9C)a zA7@}TSEJlcT7jxvCG7@B#xQz$7TCK@wJnJ3`6l8&QcOO8^2YvJAG84TtEx=^ySzcJ zFKN&U)3#@k;ziWSRCf+tbd;b}0D_Y43i-NSS!qK2hCj5&`Dt+^VtEPZse7aW!5CR3 z*5vz-vV**iFLypu=kYS8XXz}#t8Z~Tgc8nrWa?9HgUN(8gFyp^5p8LcGr3~Ko7|HH<1~NsSpo!q?!%5QS7A#fHxPq@0ndJBUcC(*h zh*^1>gm+i1U0;8YFiEqQnk)wR@d{VlP7%kRvHo-$RtUW(7 zN;<%6?Zx9G92!`K=JZITU-gU@0*6-N%r5GjK?*Z% ziz`axwQLd62e)hl=?n^ef#(=Is){Eff+L`c2RE=*QtaHbAS3QzChJI1U3&88ZfcwAitCh(gJ+-t|R?dTz^-c;{yL(~&;wa{UPEcj(=ne1_C z{jyeVPf*x;=Xg3LTH>3}!GG_1z|n%@38=7%P)WZu9;B4dR0q)T}?i(QmPo&INJ|abDBOcQnw&vA^cSY1Do0$ zn=PQC1r~{Mp7TNB14~)Oe5IK#7C)%9kgd*#+bH2K=0;Jzt&*c1jqTr));jYbbps6znP^kzEY-`Cl)@6 z{UIJB_<(;0hcER&V})ZRw2|NUqtSxT3DvxvR#PdO8{@gcwH1Ju3}-_ynw5f0cuR>n zDdbaJN!CTUwSgz#fOwM|)GIJT&;vv%m~H|M5Ew<5ct%t`Sj0vcu+M&rlnTrIU3Cin zur6Bz!oIpN;fEX?t~X~KtHi5-Zo}gY64E9fFA~it)}}O)A}=8sLi8xPd>rA8fr~F- z`f0fT2L@R)2xA0q<%G5U+|Qn*{u57%Kid-Cj+`I4mD=f0*RGR}8Z|ti*L(m>T{@VG zxX-KhSLEq|JV*Ov>{|>7+}eETr^!upQVOC?55tp!LowIgtZS?FR~T-8x|W!5x!dVc z@6(O&Zf81HLS86mUt(i<)P(gMTzkQ@qp`lCuuZIUk(KAl_#GeFAnUmej%6K5fgSX- zZj7#9=TF+|dZx*}R8EXI$#*$rL$VXq-w9swQQgUW5q{zUy=d_ljgE(cN9V#RIu@;9 zxid$#OUE&9U^CDZ}8Zj zx2Hs2@6gLB9z|zq%OIU~97KnVem+hlO)~8rx}Y^GjLXH&Q1r!jP(HQ&IPR z4|F#?fQ$dR58t(U`PohVul_oL8aH9fWd(T)ySTYkVBq4kG*r=rPN3SvoKCw4@N8=7 zdD|B>rF1r-F64(EPNyreEP)(wdk$-0rJv7OPfE|kvZIaRNlhN59Su3^y95}s@7q)zxN1|@lhudA|k(&5^PN= zV(B=qsN84BEka7-7q6G5Z+pO_p19&EJYw%y9iR(x#KQLzrK8Nj7N2lir(oFHENd>$ zDaXQ&3F~L~jR3x3*I1)(j{lmAjXBddLgi!B8`b!d0|1kH2n%YCVi1~ zO(-$rD@W9`QZhq+D5tJp#7kx^67NH&)uZhEFV7TC`cm1{O~_|F1%qYKjj>3cp)$hM zZ#5Q!KwbqSqp5yg(9XNMQ)NH&%G)m&744=(t45LpsuBh?=Ww7`Nc)9lf3m z7qM}~pFGS@HnA)SB6xMD@0a1LeEd6y#{@ihMlH7pi$&6_JiOGgq%Obe#^+2-GLi1Q zxC-iT8=t?`csT4FwdtOzd-d|4wQW-Q>R{EM2lFTURF@axwPQV9@*<%vWp90 zU~Hqy9Wg$5g7!>4$U^auO@}s#ZHtz{yP3E||DET9fw2Ei_Jw%+Kv2(EIlOQW_T-Z; zdA3!NuoeC+wzlO?nATliZ~0}RtW=dovsr1|FDh?xQcOR-&7kjkNE%W;9ey+# zKVxAScPt#-A*G^FTt|#-V2dJa-geL1dcQvLtaRRv&P~M-I~2c!e%QHLTT9;8)Gm6k|q@GE=j z*P2dFF2ZXJokkaEbg-K{2p5`TESlHNa6Gf*3)wh4yr(6qq&Kuv$*)B$PViAoj?D?eV<5kAUNjNA%yY5dj1 z7<~D$I3NBOgKsf3g0=&YHtg5+syWam=5Jhus%Q{(0kaJ)Llaqs`%DqQisyCciub9c zY;FE992atmS6;12ey6>_JN2%jH6T0mQ5GPJW@;(M6=leK#TUg&5u(*>5Hw4vlx`Eb zf-^`P?#*WmJWoqxNES~dC-ugoH+uGp)F=o|Rni!(wYC(-E6;%nkspkuYgzzdm^)Ej z*J5YGcsrr3h6YMoraA5XTN426?L`9zuLvyK{K<&4FSK1<;1!fe(g;;FL z?-zUZ(C?}x62B?G;k_YY;e0B`=YV60tdy;D)BI2Re5wqwM-f|J$1pu25F=13uzEVI7 zOn)Mkjmu?Z!uegWpa;aP+zbfB?Uf;o9%E29U(mAm$3=pS*U65;Q*Joe|s)<(_SBM5=v0-SnGH6PZX@dY} z>MvYPNL8qJk%_oaE{v=~#0wI?=bFm}+|CO{CFp6JgjVle^GsxcB^0IR2=VH;Oh*iB zaDnAUkFo~xtes^YqBl4gOyE54>FT%qD85qs9HfU|KXLgGe5B`6hOMJf@)&^DVIjN) z6q&4hCc$V}b!<^!#~>tyoLWuET1pm2-)e?0-J*Qr7C?oH_ucX5xH;4}5?!}xrn2n# zPu`A}y7pnFs~B^LX9YY9wsQs#meP3E9UkEF!~Y+gsv=OU0CL;#GQ&?qm<(jT+1F$d zBq#^WLyPb4&>wkv_0Otrlu$Q+{Wa>_b!GP>N-;<`*N2h?bGY*6@V?Q@CBk#FKP|Lq z`fvHwL{(?+3hvv_wECqDPqZN)loTJWhlQ#^GtCNXUoY}DHm2+;g1E0fO1mMh3~JmI zIFcqv7A?5p9^E$qp|>c8u7tH};u!Mh-=nS3B{eAJvD2Puj*j%gqXbtHk-bcF`n{0! zLRun&SPiChdD_9ADelJ~38r%S@`2|R;S-~|_Gz(_kMmezd^+?E%V`yiUv9%TtHTa# z2~yCmsn@j4Y(~dnDjd@NyYU2=yi=<-1bayhQWBR0eBA7$eyRqkF%*RpsVX)WkNp|m zD>*kCfienL1$|+#?=4F{{%k}I3w({DSUxW(ru@>vtX`776w%vfSkc8^)O5TdO4AV< zbI*E;J&uo(V$$ZTuILbGIJ8wVEV6St7yC>q{lGJWWi^k~YoXtg>Vkfpj~I`a;`v=f z^YYj0o1`ym@|S$C#NdKSe2kJrO|bLpQzpStePcQ7P~TEm#JQIArkF~^Lkgdr_zRsQ zGaR_w3+zXTYE8jHj{doW;rV@2W+lw1?uBYMcoe^?ezO@)!hmV$-rJChV~Wcu)t9RY z@m_9FMI)%{WLZR5GRkH@eQ;HlGYkBdiyQditvpFdd~0J@;w7nVO=ymuK-zFjN;&!onup)!gN3KKacs&`B#YamiVt(6*B_DrzV~aZQactQGDcH! zLg>K!!War}6q#e{-{qCNu(%Bk1?s(y$NDCcsF%A%yoKX7KXJ1Ffg??wL5qRq^QV>C zT!VD3&i1j>vA^QfE%VqMPkD@P$fM#q*%9v`^ezsCE%j=*v#t;UN8l!hU$IShNE)^r zSwF;kvY*DQFQt9MO5(3Jp@wa5iPuFLO#ee%5 zZG57|gAy~L>aG~f*txzTDc1k%e{oRe&Rq}}59=Y=3q5t#73H3z|KR&~=-};r&DM!O z-!9KtyIYg6ZTpp2Fb+8L{-r<;5X78vY%O(mSe$5_Rr+4$ubt8+m%w#^BT~ z12(bTb`*lcVa*Jsz zTf`4n0wV0VAQPJE7~LY;_$A?8D{Id9M4Ak;TEjpEPl&U6%~j;3A_JEghg1xyHSb?6 zPWWSM9?fG#EedZ#Ebcg7@>V2a_xB|t%KaXpth=UwVSM3hJl}D2U6&wy?`Lg&JYJ=B z6DgSL4ZWYqxB2|7sWYx(xh#i27*Pr?)uvK$_^Efrv>%iT`k!d_?mGcUA}k0}DPPdl zQ)VmFK6Kj_rClb_Q>WZ3lDv{Ng0>@wUR8^3@5?60`>{!g#V|YjKuD)b78VitryeiNDz1C|;jJas?W2?B0{Z*I z#`|B>Ick>eV(k7davq=qJuIlDCUue>brT0(80$dZ*BnC7MGl>)bjP#J#6c0FdTZcM z`Om6#DApBke=qj%F&*qnQ&*!BsHJ}E)8HkfEVaq5T%F4;6^9<4p;80LxJSr-3hw++voHZx=DVWkQaanK5M(KO$r= z366e_yW!rKE5UYZ=#y^4mCiF_^ihUGwoepaa2W}lc3rRg2#)Uo8xG;+$x|~9ir!q&X{<4y=DO~rTZFqn*ykIm#n;_C6TY`q*zGB@I|88=7_`<$==qKk8wZVs&& zk!%N}dZhBUNFqmasL5<@IL;Rc+&4M>sLHe?(?)6xpL!Wa3HBTCZj>(@a9Uqi=t28e zjcB&07^noqMVb~_*=rB!2f0|ul^3hYBP}Kg!%h3ypdvSBDI-aAGt~R(ysEJTOyriw zDdT4^iNGJg;j7EIjY&PF>N@bwg!B1Y)cg#If7vgBTCi&WR|N)(_t_93lLXo_Ov@FZ z>{fV90)We{?_E~f^_2#4Wr1pud%JNqfHR;_Mfz|nkMiwuU)Z#M*I&xj3CZ7jgV_x2 z9bi9msSGYwZ*MbA3B}JxRhnN6&ddYiKI-RsO%piroaFh?c^Qa0wAcO6!5Sm{NZ1F# zsru{m?JlmpKe5#IQ&!u~yB{LN0R}s9=(5bj_H@IBRD#Pa-jUz7%vl@JW3M}_M#hD6 z@5C{Ay~@SLlJ^CEa*b5&N*2$7#gF$bG0t_s*766-)yQ4!4CM1bhf5^ zfqh9^Ci3^kDBgD3=&gD$7;b^3EaZn~nuJ6!TBPTsg{sYzvgsrXhS*tjXDPB|ZY@9# z_F6^ibo*wKNr&F?OzJy=?^ts+xV*vI6gWU8+h!8!gsJt7_W)UZi(vCS?}=7p=1AU%j9Y zc{cGk8+IF3SGD|?ws@{u)8U%EPN0@n`|x4lj;VGQbVr~hEuwoG$J)Ko^so>!vi<{J) zR{l3p^Y8U2{T>x5!c;gxmYOrswyfnj%NLrxaonmMBPX_%(T!^Lc;hz8KgH5wW)qSH zd~5emw$1vw(-aNKepCz)r@d7K?F`V4%!9>))%{i}1))fHdxXe=#EOp?b(x zZ-?_?vC3FznSkm9UM+%Y&+Jk3lZk5UnCvjQdiZC%@7qp&iA`%B{3#3xMT!&@{=K0?Dr zUEd>7GXo!*N2!oPBW}E78vG~^8xA<@v8`*vHh-)np+=Nvj0YA8<9CbZy;i|31JMNg zL6antS~vQazF1p?fL78^VO5H;;_W8DZ;_p=&Ugd!EwIs#27Ha_-B;Xdkio5$vO+wJ|EA4Eu3Wuu%SyURR#s}xF7#f0Sa5R?t&ngz9%i??Y;Jm4j>eMf?Z;}-Ey4#d-?V3 z8UG!uafIDI0(n77P04k7vzd9gKE2OYUJ(5nxyeKn!`hJ~@aV~30bQ=|ZKm@1X{(}F zqjxgI-W?tZyAFOjhsO&o6!)o00>Czcj~1w-s-62^#vh|cKj2oUMFrwC`VHYgoVG`@ z!+ub-iNvl4KY}R5=ZL``Q47C9G`u%KT-!fg;<9*YJ%E@2U74PQs zBFG#;NHxELK7Fc~>k8XgNnpBsHFBrE7;2+tlxhFbKY853r5bd#pouaO8oq(uTo^7_ zJn+Gj_cpM}GS9QtTD^wcMuP@0)%Df1=7tZx#i~|47c2<{j!esvgL8~?jJ0gN*>Waj zICRSuSZK=TL!^&=B)o&2T#(x~N~t=i&zJcs0P_f1fLRb1sJ{^k9=F2IoJzH;}PAkK$N z6L4GfGACP4YZ@R&ivb^UvtfrLTU=4|9j?t9(?$R8T>od1R&MY&nNdU82()u{&)TT7YzS` l;a@QP%NhQE@~f_UY^LRJ*7L2-k1!rCWqA#`N*N3Ie*tM1H$MOX literal 395669 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 Date: Mon, 9 Mar 2026 22:45:01 +0800 Subject: [PATCH 08/25] chore: drop unnessary crypto/rand (#1267) --- pkg/channels/feishu/feishu_64.go | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/pkg/channels/feishu/feishu_64.go b/pkg/channels/feishu/feishu_64.go index 5217dd4e9..5dbbcf0af 100644 --- a/pkg/channels/feishu/feishu_64.go +++ b/pkg/channels/feishu/feishu_64.go @@ -4,11 +4,10 @@ package feishu import ( "context" - "crypto/rand" "encoding/json" "fmt" "io" - "math/big" + "math/rand" "net/http" "os" "path/filepath" @@ -201,18 +200,13 @@ func (c *FeishuChannel) SendPlaceholder(ctx context.Context, chatID string) (str func (c *FeishuChannel) ReactToMessage(ctx context.Context, chatID, messageID string) (func(), error) { // Get emoji list from config emojiList := c.config.RandomReactionEmoji + var chosenEmoji string if len(emojiList) == 0 { // Default to "Pin" if no config - emojiList = []string{"Pin"} - } - - // Randomly choose one from the list using crypto/rand for better distribution - idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(emojiList)))) - var chosenEmoji string - if err != nil { - chosenEmoji = emojiList[0] + chosenEmoji = "Pin" } else { - chosenEmoji = emojiList[idx.Int64()] + idx := rand.Intn(len(emojiList)) + chosenEmoji = emojiList[idx] } req := larkim.NewCreateMessageReactionReqBuilder(). From c45c5073c019a35f3aa7c4d0727e2562c4dea3b3 Mon Sep 17 00:00:00 2001 From: Hua Audio Date: Mon, 9 Mar 2026 17:53:25 +0100 Subject: [PATCH 09/25] Feat/nightly align with gorelease and release note (#1285) * feat/nightly gorelease and changelog * update to skip docker hub when nightly * update goreleaser check * Update with correct lower case for ghcr * Update with correct syntax * remove lower case * Update to prevent gorelease overwrite nightly changelog * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update according to review suggestions * Update .github/workflows/nightly.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Remove redundant gh download * Update to delete nightly tag before creating --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/nightly.yml | 205 ++++++++++++++++++++-------------- .goreleaser.yaml | 6 +- 2 files changed, 124 insertions(+), 87 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index ca4edc2ab..321e35ccd 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -9,67 +9,78 @@ permissions: contents: read jobs: - generate-version: - name: Generate Version + create-tag: + name: Create Git Tag runs-on: ubuntu-latest + permissions: + contents: write outputs: version: ${{ steps.version.outputs.version }} tag: ${{ steps.version.outputs.tag }} + changelog: ${{ steps.version.outputs.changelog }} steps: - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 - - name: Generate version + - name: Generate and push tag id: version run: | DATE=$(date -u +%Y%m%d) SHA=$(git rev-parse --short=8 HEAD) BASE_VERSION=$(git describe --tags --match "v*" --exclude "*nightly*" --abbrev=0 2>/dev/null || true) if [ -z "$BASE_VERSION" ] || [ "$BASE_VERSION" = "v0.0.0" ]; then - VERSION="nightly-${DATE}-${SHA}" + TAG="v0.0.0-nightly.${DATE}.${SHA}" else - VERSION="${BASE_VERSION}-nightly-${DATE}-${SHA}" + TAG="${BASE_VERSION}-nightly.${DATE}.${SHA}" fi - TAG="nightly-${DATE}-${SHA}" + VERSION=$TAG + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + if git rev-parse -q --verify "refs/tags/$TAG" >/dev/null; then + echo "Tag $TAG already exists, reusing existing tag" + else + git tag -a "$TAG" -m "Nightly build $VERSION" + fi + git push origin "$TAG" + + COMPARE_URL="https://github.com/${{ github.repository }}/commits/${TAG}" + if [ -n "$BASE_VERSION" ] && [ "$BASE_VERSION" != "v0.0.0" ]; then + COMPARE_URL="https://github.com/${{ github.repository }}/compare/${BASE_VERSION}...${TAG}" + fi + echo "changelog=**Full Changelog**: $COMPARE_URL" >> "$GITHUB_OUTPUT" + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" echo "tag=${TAG}" >> "$GITHUB_OUTPUT" - build: - name: Build + release: + name: GoReleaser Release + needs: create-tag runs-on: ubuntu-latest - needs: generate-version + permissions: + contents: write + packages: write steps: - - name: Checkout + - name: Checkout tag uses: actions/checkout@v6 + with: + fetch-depth: 0 + ref: ${{ needs.create-tag.outputs.tag }} - - name: Setup Go + - name: Setup Go from go.mod + id: setup-go uses: actions/setup-go@v6 with: go-version-file: go.mod - - name: Build - env: - VERSION: ${{ needs.generate-version.outputs.version }} - run: make build-all VERSION="$VERSION" - - - name: Upload artifacts - uses: actions/upload-artifact@v6 + - name: Setup Node.js + uses: actions/setup-node@v4 with: - name: picoclaw-binaries - path: build + node-version: 22 - build-docker: - name: Build Docker - runs-on: ubuntu-latest - needs: generate-version - permissions: - contents: read - packages: write - steps: - - name: Checkout - uses: actions/checkout@v6 + - name: Setup pnpm + run: corepack enable && corepack prepare pnpm@latest --activate - name: Set up QEMU uses: docker/setup-qemu-action@v3 @@ -77,80 +88,79 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Log in to GHCR + - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract Docker metadata - id: meta - uses: docker/metadata-action@v5 + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 with: - images: ghcr.io/${{ github.repository }} - tags: | - type=raw,value=${{ needs.generate-version.outputs.tag }} - type=raw,value=${{ needs.generate-version.outputs.version }} - type=raw,value=nightly + 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 }} + GOVERSION: ${{ steps.setup-go.outputs.go-version }} + NIGHTLY_BUILD: "true" + MACOS_SIGN_P12: ${{ secrets.MACOS_SIGN_P12 }} + MACOS_SIGN_PASSWORD: ${{ secrets.MACOS_SIGN_PASSWORD }} + MACOS_NOTARY_ISSUER_ID: ${{ secrets.MACOS_NOTARY_ISSUER_ID }} + MACOS_NOTARY_KEY_ID: ${{ secrets.MACOS_NOTARY_KEY_ID }} + MACOS_NOTARY_KEY: ${{ secrets.MACOS_NOTARY_KEY }} - - name: Build and push - uses: docker/build-push-action@v6 - with: - context: . - file: ./docker/Dockerfile - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - platforms: linux/amd64,linux/arm64,linux/riscv64 - provenance: false - - release: - name: Release + update-rolling: + name: Update Rolling Nightly + needs: [create-tag, release] runs-on: ubuntu-latest - needs: [generate-version, build, build-docker] permissions: contents: write + packages: write steps: - name: Checkout uses: actions/checkout@v6 - - name: Download artifacts - uses: actions/download-artifact@v6 - with: - name: picoclaw-binaries - path: ./build - - - name: Create release + - name: Update nightly release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG: ${{ needs.create-tag.outputs.tag }} + TITLE: ${{ needs.create-tag.outputs.version }} run: | - TAG="${{ needs.generate-version.outputs.tag }}" - TITLE="${{ needs.generate-version.outputs.version }}" - NOTES=$'Nightly build for **${{ needs.generate-version.outputs.version }}**\n\nThis is an automated build and may be unstable. Use with caution.' - + CHANGELOG='${{ needs.create-tag.outputs.changelog }}' + NOTES=$(cat </dev/null 2>&1; then - echo "Release $TAG already exists, updating metadata and assets..." - gh release edit "$TAG" \ - --title "$TITLE" \ - --notes "$NOTES" \ - --prerelease - gh release upload "$TAG" build/* --clobber + echo "Downloading assets from GitHub release for $TAG..." + gh release download "$TAG" --dir build else - echo "Creating new release $TAG..." - gh release create "$TAG" \ - --title "$TITLE" \ - --notes "$NOTES" \ - --target "${{ github.sha }}" \ - --prerelease \ - build/* + echo "GitHub release for $TAG not found; falling back to local dist/ artifacts..." + if [ -d "dist" ]; then + cp -R dist/* build/ + else + echo "Error: no GitHub release for $TAG and no local dist/ directory found." >&2 + exit 1 + fi fi - - echo "Updating rolling 'nightly' release..." - gh release delete nightly --cleanup-tag -y >/dev/null 2>&1 || true - sleep 2 + + # Delete existing nightly release and tag to avoid conflicts + echo "Deleting existing nightly release and tag..." + gh release delete nightly --cleanup-tag -y || true + git push origin :refs/tags/nightly || true + gh release create nightly \ --title "Nightly Build" \ --notes "$NOTES" \ @@ -159,9 +169,36 @@ jobs: build/* echo "Cleaning up old nightly releases (keeping only the most recent)..." - gh release list --limit 100 --json tagName -q '.[].tagName | select(startswith("nightly-"))' | tail -n +2 | while read -r old_tag; do + gh release list --limit 100 --json tagName -q '.[].tagName | select(contains("-nightly."))' | tail -n +2 | while read -r old_tag; do if [ -n "$old_tag" ] && [ "$old_tag" != "$TAG" ]; then echo "Deleting old nightly release: $old_tag" gh release delete "$old_tag" --cleanup-tag -y || true fi done + + echo "Cleaning up old 'vX.X.X-nightly...' Docker images on GHCR..." + OWNER="${{ github.repository_owner }}" + PACKAGE_NAME="${{ github.event.repository.name }}" + + # Check if owner is an organization or user + ORG_TEST=$(gh api -H "Accept: application/vnd.github+json" /orgs/$OWNER 2>/dev/null || true) + if echo "$ORG_TEST" | grep -q '"login"'; then + ACCOUNT_TYPE="orgs" + else + ACCOUNT_TYPE="users" + fi + + PACKAGE_URL="/${ACCOUNT_TYPE}/${OWNER}/packages/container/${PACKAGE_NAME}/versions" + OLD_NIGHTLY_VERSIONS=$(gh api --paginate -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "$PACKAGE_URL" \ + --jq ". | map(select(any(.metadata.container.tags[]; contains(\"-nightly.\") and (. != \"nightly\") and (. != \"$TAG\")))) | .[].id" 2>/dev/null || true) + + for version_id in $OLD_NIGHTLY_VERSIONS; do + if [ -n "$version_id" ]; then + echo "Deleting Docker image version ID: $version_id" + gh api -X DELETE -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "/${ACCOUNT_TYPE}/${OWNER}/packages/container/${PACKAGE_NAME}/versions/$version_id" || true + fi + done diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 70ea67323..654ad6ae6 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -116,10 +116,10 @@ dockers_v2: - picoclaw images: - "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/picoclaw" - - "docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}" + - '{{ if not (isEnvSet "NIGHTLY_BUILD") }}docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}{{ end }}' tags: - "{{ .Tag }}" - - "latest" + - '{{ if isEnvSet "NIGHTLY_BUILD" }}nightly{{ else }}latest{{ end }}' platforms: - linux/amd64 - linux/arm64 @@ -159,7 +159,7 @@ archives: nfpms: - id: picoclaw - builds: + ids: - picoclaw - picoclaw-launcher - picoclaw-launcher-tui From b89f6445d10545717e5526064472fecbc6340b07 Mon Sep 17 00:00:00 2001 From: Mauro Date: Mon, 9 Mar 2026 18:21:49 +0100 Subject: [PATCH 10/25] feat(mcp): tool search tools (#1243) * feat(mcp): tool search tools * removed unused call_discovered_tool * improvements and optimizations * fix gate mcp enabled * fix TOCTOU race BM25 cache version check * fix encapsulation bypass on registry internals * safety comment on TickTTL * added more unit tests * enhanced logs --- config/config.example.json | 16 +- docs/tools_configuration.md | 151 ++++++++++++--- pkg/agent/context.go | 40 +++- pkg/agent/instance.go | 6 +- pkg/agent/loop.go | 60 +++++- pkg/config/config.go | 11 +- pkg/config/defaults.go | 7 + pkg/tools/registry.go | 148 ++++++++++++-- pkg/tools/search_tool.go | 304 +++++++++++++++++++++++++++++ pkg/tools/search_tools_test.go | 339 +++++++++++++++++++++++++++++++++ pkg/utils/bm25.go | 272 ++++++++++++++++++++++++++ pkg/utils/bm25_test.go | 175 +++++++++++++++++ 12 files changed, 1481 insertions(+), 48 deletions(-) create mode 100644 pkg/tools/search_tool.go create mode 100644 pkg/tools/search_tools_test.go create mode 100644 pkg/utils/bm25.go create mode 100644 pkg/utils/bm25_test.go diff --git a/config/config.example.json b/config/config.example.json index 0e2cae8e5..3a33b3caf 100644 --- a/config/config.example.json +++ b/config/config.example.json @@ -194,8 +194,13 @@ "nickserv_password": "", "sasl_user": "", "sasl_password": "", - "channels": ["#mychannel"], - "request_caps": ["server-time", "message-tags"], + "channels": [ + "#mychannel" + ], + "request_caps": [ + "server-time", + "message-tags" + ], "allow_from": [], "group_trigger": { "mention_only": true @@ -316,6 +321,13 @@ }, "mcp": { "enabled": false, + "discovery": { + "enabled": false, + "ttl": 5, + "max_search_results": 5, + "use_bm25": true, + "use_regex": false + }, "servers": { "context7": { "enabled": false, diff --git a/docs/tools_configuration.md b/docs/tools_configuration.md index e64a3a107..8c8eb31f0 100644 --- a/docs/tools_configuration.md +++ b/docs/tools_configuration.md @@ -7,11 +7,21 @@ PicoClaw's tools configuration is located in the `tools` field of `config.json`. ```json { "tools": { - "web": { ... }, - "mcp": { ... }, - "exec": { ... }, - "cron": { ... }, - "skills": { ... } + "web": { + ... + }, + "mcp": { + ... + }, + "exec": { + ... + }, + "cron": { + ... + }, + "skills": { + ... + } } } ``` @@ -23,7 +33,7 @@ Web tools are used for web search and fetching. ### Brave | Config | Type | Default | Description | -| ------------- | ------ | ------- | ------------------------- | +|---------------|--------|---------|---------------------------| | `enabled` | bool | false | Enable Brave search | | `api_key` | string | - | Brave Search API key | | `max_results` | int | 5 | Maximum number of results | @@ -31,14 +41,14 @@ Web tools are used for web search and fetching. ### DuckDuckGo | Config | Type | Default | Description | -| ------------- | ---- | ------- | ------------------------- | +|---------------|------|---------|---------------------------| | `enabled` | bool | true | Enable DuckDuckGo search | | `max_results` | int | 5 | Maximum number of results | ### Perplexity | Config | Type | Default | Description | -| ------------- | ------ | ------- | ------------------------- | +|---------------|--------|---------|---------------------------| | `enabled` | bool | false | Enable Perplexity search | | `api_key` | string | - | Perplexity API key | | `max_results` | int | 5 | Maximum number of results | @@ -48,7 +58,7 @@ Web tools are used for web search and fetching. The exec tool is used to execute shell commands. | Config | Type | Default | Description | -| ---------------------- | ----- | ------- | ------------------------------------------ | +|------------------------|-------|---------|--------------------------------------------| | `enable_deny_patterns` | bool | true | Enable default dangerous command blocking | | `custom_deny_patterns` | array | [] | Custom deny patterns (regular expressions) | @@ -81,7 +91,10 @@ By default, PicoClaw blocks the following dangerous commands: "tools": { "exec": { "enable_deny_patterns": true, - "custom_deny_patterns": ["\\brm\\s+-r\\b", "\\bkillall\\s+python"] + "custom_deny_patterns": [ + "\\brm\\s+-r\\b", + "\\bkillall\\s+python" + ] } } } @@ -92,24 +105,47 @@ By default, PicoClaw blocks the following dangerous commands: The cron tool is used for scheduling periodic tasks. | Config | Type | Default | Description | -| ---------------------- | ---- | ------- | ---------------------------------------------- | +|------------------------|------|---------|------------------------------------------------| | `exec_timeout_minutes` | int | 5 | Execution timeout in minutes, 0 means no limit | ## MCP Tool The MCP tool enables integration with external Model Context Protocol servers. +### Tool Discovery (Lazy Loading) + +When connecting to multiple MCP servers, exposing hundreds of tools simultaneously can exhaust the LLM's context window +and increase API costs. The **Discovery** feature solves this by keeping MCP tools *hidden* by default. + +Instead of loading all tools, the LLM is provided with a lightweight search tool (using BM25 keyword matching or Regex). +When the LLM needs a specific capability, it searches the hidden library. Matching tools are then temporarily "unlocked" +and injected into the context for a configured number of turns (`ttl`). + ### Global Config -| Config | Type | Default | Description | -| --------- | ------ | ------- | ----------------------------------- | -| `enabled` | bool | false | Enable MCP integration globally | -| `servers` | object | `{}` | Map of server name to server config | +| Config | Type | Default | Description | +|-------------|--------|---------|----------------------------------------------| +| `enabled` | bool | false | Enable MCP integration globally | +| `discovery` | object | `{}` | Configuration for Tool Discovery (see below) | +| `servers` | object | `{}` | Map of server name to server config | + +### Discovery Config (`discovery`) + +| Config | Type | Default | Description | +|----------------------|------|---------|-----------------------------------------------------------------------------------------------------------------------------------| +| `enabled` | bool | false | If true, MCP tools are hidden and loaded on-demand via search. If false, all tools are loaded | +| `ttl` | int | 5 | Number of conversational turns a discovered tool remains unlocked | +| `max_search_results` | int | 5 | Maximum number of tools returned per search query | +| `use_bm25` | bool | true | Enable the natural language/keyword search tool (`tool_search_tool_bm25`). **Warning**: consumes more resources than regex search | +| `use_regex` | bool | false | Enable the regex pattern search tool (`tool_search_tool_regex`) | + +> **Note:** If `discovery.enabled` is `true`, you MUST enable at least one search engine (`use_bm25` or `use_regex`), +> otherwise the application will fail to start. ### Per-Server Config | Config | Type | Required | Description | -| ---------- | ------ | -------- | ------------------------------------------ | +|------------|--------|----------|--------------------------------------------| | `enabled` | bool | yes | Enable this MCP server | | `type` | string | no | Transport type: `stdio`, `sse`, `http` | | `command` | string | stdio | Executable command for stdio transport | @@ -122,8 +158,8 @@ The MCP tool enables integration with external Model Context Protocol servers. ### Transport Behavior - If `type` is omitted, transport is auto-detected: - - `url` is set → `sse` - - `command` is set → `stdio` + - `url` is set → `sse` + - `command` is set → `stdio` - `http` and `sse` both use `url` + optional `headers`. - `env` and `env_file` are only applied to `stdio` servers. @@ -140,7 +176,11 @@ The MCP tool enables integration with external Model Context Protocol servers. "filesystem": { "enabled": true, "command": "npx", - "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"] + "args": [ + "-y", + "@modelcontextprotocol/server-filesystem", + "/tmp" + ] } } } @@ -170,20 +210,76 @@ The MCP tool enables integration with external Model Context Protocol servers. } ``` +#### 3) Massive MCP setup with Tool Discovery enabled + +*In this example, the LLM will only see the `tool_search_tool_bm25`. It will search and unlock Github or Postgres tools +dynamically only when requested by the user.* + +```json +{ + "tools": { + "mcp": { + "enabled": true, + "discovery": { + "enabled": true, + "ttl": 5, + "max_search_results": 5, + "use_bm25": true, + "use_regex": false + }, + "servers": { + "github": { + "enabled": true, + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-github" + ], + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "YOUR_GITHUB_TOKEN" + } + }, + "postgres": { + "enabled": true, + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-postgres", + "postgresql://user:password@localhost/dbname" + ] + }, + "slack": { + "enabled": true, + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-slack" + ], + "env": { + "SLACK_BOT_TOKEN": "YOUR_SLACK_BOT_TOKEN", + "SLACK_TEAM_ID": "YOUR_SLACK_TEAM_ID" + } + } + } + } + } +} +``` + ## Skills Tool The skills tool configures skill discovery and installation via registries like ClawHub. ### Registries -| Config | Type | Default | Description | -| ---------------------------------- | ------ | -------------------- | ----------------------- | -| `registries.clawhub.enabled` | bool | true | Enable ClawHub registry | -| `registries.clawhub.base_url` | string | `https://clawhub.ai` | ClawHub base URL | +| Config | Type | Default | Description | +|------------------------------------|--------|----------------------|----------------------------------------------| +| `registries.clawhub.enabled` | bool | true | Enable ClawHub registry | +| `registries.clawhub.base_url` | string | `https://clawhub.ai` | ClawHub base URL | | `registries.clawhub.auth_token` | string | `""` | Optional Bearer token for higher rate limits | -| `registries.clawhub.search_path` | string | `/api/v1/search` | Search API path | -| `registries.clawhub.skills_path` | string | `/api/v1/skills` | Skills API path | -| `registries.clawhub.download_path` | string | `/api/v1/download` | Download API path | +| `registries.clawhub.search_path` | string | `/api/v1/search` | Search API path | +| `registries.clawhub.skills_path` | string | `/api/v1/skills` | Skills API path | +| `registries.clawhub.download_path` | string | `/api/v1/download` | Download API path | ### Configuration Example @@ -217,4 +313,5 @@ For example: - `PICOCLAW_TOOLS_CRON_EXEC_TIMEOUT_MINUTES=10` - `PICOCLAW_TOOLS_MCP_ENABLED=true` -Note: Nested map-style config (for example `tools.mcp.servers..*`) is configured in `config.json` rather than environment variables. +Note: Nested map-style config (for example `tools.mcp.servers..*`) is configured in `config.json` rather than +environment variables. diff --git a/pkg/agent/context.go b/pkg/agent/context.go index 719b0cb6d..92663a32d 100644 --- a/pkg/agent/context.go +++ b/pkg/agent/context.go @@ -18,9 +18,11 @@ import ( ) type ContextBuilder struct { - workspace string - skillsLoader *skills.SkillsLoader - memory *MemoryStore + workspace string + skillsLoader *skills.SkillsLoader + memory *MemoryStore + toolDiscoveryBM25 bool + toolDiscoveryRegex bool // Cache for system prompt to avoid rebuilding on every call. // This fixes issue #607: repeated reprocessing of the entire context. @@ -41,6 +43,12 @@ type ContextBuilder struct { skillFilesAtCache map[string]time.Time } +func (cb *ContextBuilder) WithToolDiscovery(useBM25, useRegex bool) *ContextBuilder { + cb.toolDiscoveryBM25 = useBM25 + cb.toolDiscoveryRegex = useRegex + return cb +} + func getGlobalConfigDir() string { if home := os.Getenv("PICOCLAW_HOME"); home != "" { return home @@ -71,6 +79,7 @@ func NewContextBuilder(workspace string) *ContextBuilder { func (cb *ContextBuilder) getIdentity() string { workspacePath, _ := filepath.Abs(filepath.Join(cb.workspace)) + toolDiscovery := cb.getDiscoveryRule() return fmt.Sprintf(`# picoclaw 🦞 @@ -90,8 +99,29 @@ Your workspace is at: %s 3. **Memory** - When interacting with me if something seems memorable, update %s/memory/MEMORY.md -4. **Context summaries** - Conversation summaries provided as context are approximate references only. They may be incomplete or outdated. Always defer to explicit user instructions over summary content.`, - workspacePath, workspacePath, workspacePath, workspacePath, workspacePath) +4. **Context summaries** - Conversation summaries provided as context are approximate references only. They may be incomplete or outdated. Always defer to explicit user instructions over summary content. + +%s`, + workspacePath, workspacePath, workspacePath, workspacePath, workspacePath, toolDiscovery) +} + +func (cb *ContextBuilder) getDiscoveryRule() string { + if !cb.toolDiscoveryBM25 && !cb.toolDiscoveryRegex { + return "" + } + + var toolNames []string + if cb.toolDiscoveryBM25 { + toolNames = append(toolNames, `"tool_search_tool_bm25"`) + } + if cb.toolDiscoveryRegex { + toolNames = append(toolNames, `"tool_search_tool_regex"`) + } + + return fmt.Sprintf( + `5. **Tool Discovery** - Your visible tools are limited to save memory, but a vast hidden library exists. If you lack the right tool for a task, BEFORE giving up, you MUST search using the %s tool. Do not refuse a request unless the search returns nothing. Found tools will temporarily unlock for your next turn.`, + strings.Join(toolNames, " or "), + ) } func (cb *ContextBuilder) BuildSystemPrompt() string { diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index 5a838b67e..b60818875 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -97,7 +97,11 @@ func NewAgentInstance( sessionsDir := filepath.Join(workspace, "sessions") sessionsManager := session.NewSessionManager(sessionsDir) - contextBuilder := NewContextBuilder(workspace) + mcpDiscoveryActive := cfg.Tools.MCP.Enabled && cfg.Tools.MCP.Discovery.Enabled + contextBuilder := NewContextBuilder(workspace).WithToolDiscovery( + mcpDiscoveryActive && cfg.Tools.MCP.Discovery.UseBM25, + mcpDiscoveryActive && cfg.Tools.MCP.Discovery.UseRegex, + ) agentID := routing.DefaultAgentID agentName := "" diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 3d13071c0..58f53bef8 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -283,7 +283,13 @@ func (al *AgentLoop) Run(ctx context.Context) error { } mcpTool := tools.NewMCPTool(mcpManager, serverName, tool) - agent.Tools.Register(mcpTool) + + if al.cfg.Tools.MCP.Discovery.Enabled { + agent.Tools.RegisterHidden(mcpTool) + } else { + agent.Tools.Register(mcpTool) + } + totalRegistrations++ logger.DebugCF("agent", "Registered MCP tool", map[string]any{ @@ -302,6 +308,47 @@ func (al *AgentLoop) Run(ctx context.Context) error { "total_registrations": totalRegistrations, "agent_count": agentCount, }) + + // Initializes Discovery Tools only if enabled by configuration + if al.cfg.Tools.MCP.Enabled && al.cfg.Tools.MCP.Discovery.Enabled { + useBM25 := al.cfg.Tools.MCP.Discovery.UseBM25 + useRegex := al.cfg.Tools.MCP.Discovery.UseRegex + + // Fail fast: If discovery is enabled but no search method is turned on + if !useBM25 && !useRegex { + return fmt.Errorf( + "tool discovery is enabled but neither 'use_bm25' nor 'use_regex' is set to true in the configuration", + ) + } + + ttl := al.cfg.Tools.MCP.Discovery.TTL + if ttl <= 0 { + ttl = 5 // Default value + } + + maxSearchResults := al.cfg.Tools.MCP.Discovery.MaxSearchResults + if maxSearchResults <= 0 { + maxSearchResults = 5 // Default value + } + + logger.InfoCF("agent", "Initializing tool discovery", map[string]any{ + "bm25": useBM25, "regex": useRegex, "ttl": ttl, "max_results": maxSearchResults, + }) + + for _, agentID := range agentIDs { + agent, ok := al.registry.GetAgent(agentID) + if !ok { + continue + } + + if useRegex { + agent.Tools.Register(tools.NewRegexSearchTool(agent.Tools, ttl, maxSearchResults)) + } + if useBM25 { + agent.Tools.Register(tools.NewBM25SearchTool(agent.Tools, ttl, maxSearchResults)) + } + } + } } } @@ -1254,6 +1301,17 @@ func (al *AgentLoop) runLLMIteration( // Save tool result message to session agent.Sessions.AddFullMessage(opts.SessionKey, toolResultMsg) } + + // Tick down TTL of discovered tools after processing tool results. + // Only reached when tool calls were made (the loop continues); + // the break on no-tool-call responses skips this. + // NOTE: This is safe because processMessage is sequential per agent. + // If per-agent concurrency is added, TTL consistency between + // ToProviderDefs and Get must be re-evaluated. + agent.Tools.TickTTL() + logger.DebugCF("agent", "TTL tick after tool execution", map[string]any{ + "agent_id": agent.ID, "iteration": iteration, + }) } return finalContent, iteration, nil diff --git a/pkg/config/config.go b/pkg/config/config.go index 0558d0e8f..a47ab3091 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -578,6 +578,14 @@ type GatewayConfig struct { Port int `json:"port" env:"PICOCLAW_GATEWAY_PORT"` } +type ToolDiscoveryConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_DISCOVERY_ENABLED"` + TTL int `json:"ttl" env:"PICOCLAW_TOOLS_DISCOVERY_TTL"` + MaxSearchResults int `json:"max_search_results" env:"PICOCLAW_MAX_SEARCH_RESULTS"` + UseBM25 bool `json:"use_bm25" env:"PICOCLAW_TOOLS_DISCOVERY_USE_BM25"` + UseRegex bool `json:"use_regex" env:"PICOCLAW_TOOLS_DISCOVERY_USE_REGEX"` +} + type ToolConfig struct { Enabled bool `json:"enabled" env:"ENABLED"` } @@ -735,7 +743,8 @@ type MCPServerConfig struct { // MCPConfig defines configuration for all MCP servers type MCPConfig struct { - ToolConfig `envPrefix:"PICOCLAW_TOOLS_MCP_"` + ToolConfig ` envPrefix:"PICOCLAW_TOOLS_MCP_"` + Discovery ToolDiscoveryConfig ` json:"discovery"` // Servers is a map of server name to server configuration Servers map[string]MCPServerConfig `json:"servers,omitempty"` } diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 2fd99c1ba..e64baa720 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -443,6 +443,13 @@ func DefaultConfig() *Config { ToolConfig: ToolConfig{ Enabled: false, }, + Discovery: ToolDiscoveryConfig{ + Enabled: false, + TTL: 5, + MaxSearchResults: 5, + UseBM25: true, + UseRegex: false, + }, Servers: map[string]MCPServerConfig{}, }, AppendFile: ToolConfig{ diff --git a/pkg/tools/registry.go b/pkg/tools/registry.go index ca8436c67..0635f47d7 100644 --- a/pkg/tools/registry.go +++ b/pkg/tools/registry.go @@ -5,20 +5,28 @@ import ( "fmt" "sort" "sync" + "sync/atomic" "time" "github.com/sipeed/picoclaw/pkg/logger" "github.com/sipeed/picoclaw/pkg/providers" ) +type ToolEntry struct { + Tool Tool + IsCore bool + TTL int +} + type ToolRegistry struct { - tools map[string]Tool - mu sync.RWMutex + tools map[string]*ToolEntry + mu sync.RWMutex + version atomic.Uint64 // incremented on Register/RegisterHidden for cache invalidation } func NewToolRegistry() *ToolRegistry { return &ToolRegistry{ - tools: make(map[string]Tool), + tools: make(map[string]*ToolEntry), } } @@ -30,14 +38,116 @@ func (r *ToolRegistry) Register(tool Tool) { logger.WarnCF("tools", "Tool registration overwrites existing tool", map[string]any{"name": name}) } - r.tools[name] = tool + r.tools[name] = &ToolEntry{ + Tool: tool, + IsCore: true, + TTL: 0, // Core tools do not use TTL + } + r.version.Add(1) + logger.DebugCF("tools", "Registered core tool", map[string]any{"name": name}) +} + +// RegisterHidden saves hidden tools (visible only via TTL) +func (r *ToolRegistry) RegisterHidden(tool Tool) { + r.mu.Lock() + defer r.mu.Unlock() + name := tool.Name() + if _, exists := r.tools[name]; exists { + logger.WarnCF("tools", "Hidden tool registration overwrites existing tool", + map[string]any{"name": name}) + } + r.tools[name] = &ToolEntry{ + Tool: tool, + IsCore: false, + TTL: 0, + } + r.version.Add(1) + logger.DebugCF("tools", "Registered hidden tool", map[string]any{"name": name}) +} + +// PromoteTools atomically sets the TTL for multiple non-core tools. +// This prevents a concurrent TickTTL from decrementing between promotions. +func (r *ToolRegistry) PromoteTools(names []string, ttl int) { + r.mu.Lock() + defer r.mu.Unlock() + promoted := 0 + for _, name := range names { + if entry, exists := r.tools[name]; exists { + if !entry.IsCore { + entry.TTL = ttl + promoted++ + } + } + } + logger.DebugCF( + "tools", + "PromoteTools completed", + map[string]any{"requested": len(names), "promoted": promoted, "ttl": ttl}, + ) +} + +// TickTTL decreases TTL only for non-core tools +func (r *ToolRegistry) TickTTL() { + r.mu.Lock() + defer r.mu.Unlock() + for _, entry := range r.tools { + if !entry.IsCore && entry.TTL > 0 { + entry.TTL-- + } + } +} + +// Version returns the current registry version (atomically). +func (r *ToolRegistry) Version() uint64 { + return r.version.Load() +} + +// HiddenToolSnapshot holds a consistent snapshot of hidden tools and the +// registry version at which it was taken. Used by BM25SearchTool cache. +type HiddenToolSnapshot struct { + Docs []HiddenToolDoc + Version uint64 +} + +// HiddenToolDoc is a lightweight representation of a hidden tool for search indexing. +type HiddenToolDoc struct { + Name string + Description string +} + +// SnapshotHiddenTools returns all non-core tools and the current registry +// version under a single read-lock, guaranteeing consistency between the +// two values. +func (r *ToolRegistry) SnapshotHiddenTools() HiddenToolSnapshot { + r.mu.RLock() + defer r.mu.RUnlock() + docs := make([]HiddenToolDoc, 0, len(r.tools)) + for name, entry := range r.tools { + if !entry.IsCore { + docs = append(docs, HiddenToolDoc{ + Name: name, + Description: entry.Tool.Description(), + }) + } + } + return HiddenToolSnapshot{ + Docs: docs, + Version: r.version.Load(), + } } func (r *ToolRegistry) Get(name string) (Tool, bool) { r.mu.RLock() defer r.mu.RUnlock() - tool, ok := r.tools[name] - return tool, ok + entry, ok := r.tools[name] + if !ok { + return nil, false + } + // Hidden tools with expired TTL are not callable. + if !entry.IsCore && entry.TTL <= 0 { + return nil, false + } + return entry.Tool, true } func (r *ToolRegistry) Execute(ctx context.Context, name string, args map[string]any) *ToolResult { @@ -135,7 +245,13 @@ func (r *ToolRegistry) GetDefinitions() []map[string]any { sorted := r.sortedToolNames() definitions := make([]map[string]any, 0, len(sorted)) for _, name := range sorted { - definitions = append(definitions, ToolToSchema(r.tools[name])) + entry := r.tools[name] + + if !entry.IsCore && entry.TTL <= 0 { + continue + } + + definitions = append(definitions, ToolToSchema(r.tools[name].Tool)) } return definitions } @@ -149,8 +265,13 @@ func (r *ToolRegistry) ToProviderDefs() []providers.ToolDefinition { sorted := r.sortedToolNames() definitions := make([]providers.ToolDefinition, 0, len(sorted)) for _, name := range sorted { - tool := r.tools[name] - schema := ToolToSchema(tool) + entry := r.tools[name] + + if !entry.IsCore && entry.TTL <= 0 { + continue + } + + schema := ToolToSchema(entry.Tool) // Safely extract nested values with type checks fn, ok := schema["function"].(map[string]any) @@ -198,8 +319,13 @@ func (r *ToolRegistry) GetSummaries() []string { sorted := r.sortedToolNames() summaries := make([]string, 0, len(sorted)) for _, name := range sorted { - tool := r.tools[name] - summaries = append(summaries, fmt.Sprintf("- `%s` - %s", tool.Name(), tool.Description())) + entry := r.tools[name] + + if !entry.IsCore && entry.TTL <= 0 { + continue + } + + summaries = append(summaries, fmt.Sprintf("- `%s` - %s", entry.Tool.Name(), entry.Tool.Description())) } return summaries } diff --git a/pkg/tools/search_tool.go b/pkg/tools/search_tool.go new file mode 100644 index 000000000..f41c80d90 --- /dev/null +++ b/pkg/tools/search_tool.go @@ -0,0 +1,304 @@ +package tools + +import ( + "context" + "encoding/json" + "fmt" + "regexp" + "strings" + "sync" + + "github.com/sipeed/picoclaw/pkg/logger" + "github.com/sipeed/picoclaw/pkg/utils" +) + +const ( + MaxRegexPatternLength = 200 +) + +type RegexSearchTool struct { + registry *ToolRegistry + ttl int + maxSearchResults int +} + +func NewRegexSearchTool(r *ToolRegistry, ttl int, maxSearchResults int) *RegexSearchTool { + return &RegexSearchTool{registry: r, ttl: ttl, maxSearchResults: maxSearchResults} +} + +func (t *RegexSearchTool) Name() string { + return "tool_search_tool_regex" +} + +func (t *RegexSearchTool) Description() string { + return "Search available hidden tools on-demand using a regex pattern. Returns JSON schemas of discovered tools." +} + +func (t *RegexSearchTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "pattern": map[string]any{ + "type": "string", + "description": "Regex pattern to match tool name or description", + }, + }, + "required": []string{"pattern"}, + } +} + +func (t *RegexSearchTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + pattern, ok := args["pattern"].(string) + if !ok || strings.TrimSpace(pattern) == "" { + // An empty string regex (?i) will match every hidden tool, + // dumping massive payloads into the context and burning tokens. + return ErrorResult("Missing or invalid 'pattern' argument. Must be a non-empty string.") + } + + if len(pattern) > MaxRegexPatternLength { + logger.WarnCF("discovery", "Regex pattern rejected (too long)", map[string]any{"len": len(pattern)}) + return ErrorResult(fmt.Sprintf("Pattern too long: max %d characters allowed", MaxRegexPatternLength)) + } + + logger.DebugCF("discovery", "Regex search", map[string]any{"pattern": pattern}) + + res, err := t.registry.SearchRegex(pattern, t.maxSearchResults) + if err != nil { + logger.WarnCF("discovery", "Invalid regex pattern", map[string]any{"pattern": pattern, "error": err.Error()}) + return ErrorResult(fmt.Sprintf("Invalid regex pattern syntax: %v. Please fix your regex and try again.", err)) + } + + logger.InfoCF("discovery", "Regex search completed", map[string]any{"pattern": pattern, "results": len(res)}) + return formatDiscoveryResponse(t.registry, res, t.ttl) +} + +type BM25SearchTool struct { + registry *ToolRegistry + ttl int + maxSearchResults int + + // Cache: rebuilt only when the registry version changes. + cacheMu sync.Mutex + cachedEngine *bm25CachedEngine + cacheVersion uint64 +} + +func NewBM25SearchTool(r *ToolRegistry, ttl int, maxSearchResults int) *BM25SearchTool { + return &BM25SearchTool{registry: r, ttl: ttl, maxSearchResults: maxSearchResults} +} + +func (t *BM25SearchTool) Name() string { + return "tool_search_tool_bm25" +} + +func (t *BM25SearchTool) Description() string { + return "Search available hidden tools on-demand using natural language query describing the action you need to perform. Returns JSON schemas of discovered tools." +} + +func (t *BM25SearchTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "query": map[string]any{ + "type": "string", + "description": "Search query", + }, + }, + "required": []string{"query"}, + } +} + +func (t *BM25SearchTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + query, ok := args["query"].(string) + if !ok || strings.TrimSpace(query) == "" { + // An empty string query will match every hidden tool, + // dumping massive payloads into the context and burning tokens. + return ErrorResult("Missing or invalid 'query' argument. Must be a non-empty string.") + } + + logger.DebugCF("discovery", "BM25 search", map[string]any{"query": query}) + + cached := t.getOrBuildEngine() + if cached == nil { + logger.DebugCF("discovery", "BM25 search: no hidden tools available", nil) + return SilentResult("No tools found matching the query.") + } + + ranked := cached.engine.Search(query, t.maxSearchResults) + if len(ranked) == 0 { + logger.DebugCF("discovery", "BM25 search: no matches", map[string]any{"query": query}) + return SilentResult("No tools found matching the query.") + } + + results := make([]ToolSearchResult, len(ranked)) + for i, r := range ranked { + results[i] = ToolSearchResult{ + Name: r.Document.Name, + Description: r.Document.Description, + } + } + + logger.InfoCF("discovery", "BM25 search completed", map[string]any{"query": query, "results": len(results)}) + return formatDiscoveryResponse(t.registry, results, t.ttl) +} + +// ToolSearchResult represents the result returned to the LLM. +// Parameters are omitted from the JSON response to save context tokens; +// the LLM will see full schemas via ToProviderDefs after promotion. +type ToolSearchResult struct { + Name string `json:"name"` + Description string `json:"description"` +} + +func (r *ToolRegistry) SearchRegex(pattern string, maxSearchResults int) ([]ToolSearchResult, error) { + if maxSearchResults <= 0 { + return nil, nil + } + + regex, err := regexp.Compile("(?i)" + pattern) + if err != nil { + return nil, fmt.Errorf("failed to compile regex pattern %q: %w", pattern, err) + } + + r.mu.RLock() + defer r.mu.RUnlock() + + var results []ToolSearchResult + + // Iterate in sorted order for deterministic results across calls. + for _, name := range r.sortedToolNames() { + entry := r.tools[name] + // Search only among the hidden tools (Core tools are already visible) + if !entry.IsCore { + // Directly call interface methods! No reflection/unmarshalling needed. + desc := entry.Tool.Description() + + if regex.MatchString(name) || regex.MatchString(desc) { + results = append(results, ToolSearchResult{ + Name: name, + Description: desc, + }) + if len(results) >= maxSearchResults { + break // Stop searching once we hit the max! Saves CPU. + } + } + } + } + + return results, nil +} + +func formatDiscoveryResponse(registry *ToolRegistry, results []ToolSearchResult, ttl int) *ToolResult { + if len(results) == 0 { + return SilentResult("No tools found matching the query.") + } + + names := make([]string, len(results)) + for i, r := range results { + names[i] = r.Name + } + registry.PromoteTools(names, ttl) + logger.InfoCF("discovery", "Promoted tools", map[string]any{"tools": names, "ttl": ttl}) + + b, err := json.Marshal(results) + if err != nil { + return ErrorResult("Failed to format search results: " + err.Error()) + } + + msg := fmt.Sprintf( + "Found %d tools:\n%s\n\nSUCCESS: These tools have been temporarily UNLOCKED as native tools! In your next response, you can call them directly just like any normal tool", + len(results), + string(b), + ) + + return SilentResult(msg) +} + +// Lightweight internal type used as corpus document for BM25. +type searchDoc struct { + Name string + Description string +} + +// bm25CachedEngine wraps a BM25Engine with its corpus snapshot. +type bm25CachedEngine struct { + engine *utils.BM25Engine[searchDoc] +} + +// snapshotToSearchDocs converts a HiddenToolSnapshot to BM25 searchDoc slice. +func snapshotToSearchDocs(snap HiddenToolSnapshot) []searchDoc { + docs := make([]searchDoc, len(snap.Docs)) + for i, d := range snap.Docs { + docs[i] = searchDoc{Name: d.Name, Description: d.Description} + } + return docs +} + +// buildBM25Engine creates a BM25Engine from a slice of searchDocs. +func buildBM25Engine(docs []searchDoc) *utils.BM25Engine[searchDoc] { + return utils.NewBM25Engine( + docs, + func(doc searchDoc) string { + return doc.Name + " " + doc.Description + }, + ) +} + +// getOrBuildEngine returns a cached BM25 engine, rebuilding it only when +// the registry version has changed (new tools registered). +func (t *BM25SearchTool) getOrBuildEngine() *bm25CachedEngine { + // Fast path: optimistic check without locking. + if t.cachedEngine != nil && t.cacheVersion == t.registry.Version() { + return t.cachedEngine + } + + t.cacheMu.Lock() + defer t.cacheMu.Unlock() + + // Snapshot + version are read under a single registry RLock, + // guaranteeing consistency (no TOCTOU). + snap := t.registry.SnapshotHiddenTools() + + // Re-check: another goroutine may have rebuilt while we waited for cacheMu. + if t.cachedEngine != nil && t.cacheVersion == snap.Version { + return t.cachedEngine + } + + docs := snapshotToSearchDocs(snap) + if len(docs) == 0 { + t.cachedEngine = nil + t.cacheVersion = snap.Version + return nil + } + + cached := &bm25CachedEngine{engine: buildBM25Engine(docs)} + t.cachedEngine = cached + t.cacheVersion = snap.Version + logger.DebugCF("discovery", "BM25 engine rebuilt", map[string]any{"docs": len(docs), "version": snap.Version}) + return cached +} + +// SearchBM25 ranks hidden tools against query using BM25 via utils.BM25Engine. +// This non-cached variant rebuilds the engine on every call. Used by tests +// and any code that doesn't hold a BM25SearchTool instance. +func (r *ToolRegistry) SearchBM25(query string, maxSearchResults int) []ToolSearchResult { + snap := r.SnapshotHiddenTools() + docs := snapshotToSearchDocs(snap) + if len(docs) == 0 { + return nil + } + + ranked := buildBM25Engine(docs).Search(query, maxSearchResults) + if len(ranked) == 0 { + return nil + } + + out := make([]ToolSearchResult, len(ranked)) + for i, r := range ranked { + out[i] = ToolSearchResult{ + Name: r.Document.Name, + Description: r.Document.Description, + } + } + return out +} diff --git a/pkg/tools/search_tools_test.go b/pkg/tools/search_tools_test.go new file mode 100644 index 000000000..3aae941cb --- /dev/null +++ b/pkg/tools/search_tools_test.go @@ -0,0 +1,339 @@ +package tools + +import ( + "context" + "fmt" + "strings" + "testing" +) + +// Dummy tool to fill the registry in our tests. +type mockSearchableTool struct { + name string + desc string +} + +func (m *mockSearchableTool) Name() string { return m.name } +func (m *mockSearchableTool) Description() string { return m.desc } +func (m *mockSearchableTool) Parameters() map[string]any { + return map[string]any{"type": "object"} +} + +func (m *mockSearchableTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + return SilentResult("mock executed: " + m.name) +} + +// Helper to initialize a populated ToolRegistry +func setupPopulatedRegistry() *ToolRegistry { + reg := NewToolRegistry() + + // A core tool (NOT to be found by searches) + reg.Register(&mockSearchableTool{ + name: "core_search", + desc: "I am a visible core tool for searching files", + }) + + // Hidden tools (must be found by searches) + reg.RegisterHidden(&mockSearchableTool{ + name: "mcp_read_file", + desc: "Read the contents of a system file", + }) + reg.RegisterHidden(&mockSearchableTool{ + name: "mcp_list_dir", + desc: "List directories and files in the system", + }) + reg.RegisterHidden(&mockSearchableTool{ + name: "mcp_fetch_net", + desc: "Fetch data from a network database", + }) + + return reg +} + +func TestRegexSearchTool_Execute(t *testing.T) { + reg := setupPopulatedRegistry() + tool := NewRegexSearchTool(reg, 5, 10) + ctx := context.Background() + + t.Run("Empty Pattern Error", func(t *testing.T) { + res := tool.Execute(ctx, map[string]any{}) + if !res.IsError || !strings.Contains(res.ForLLM, "Missing or invalid 'pattern'") { + t.Errorf("Expected missing pattern error, got: %v", res.ForLLM) + } + }) + + t.Run("Invalid Regex Syntax", func(t *testing.T) { + res := tool.Execute(ctx, map[string]any{"pattern": "[unclosed"}) + if !res.IsError || !strings.Contains(res.ForLLM, "Invalid regex pattern syntax") { + t.Errorf("Expected regex syntax error, got: %v", res.ForLLM) + } + }) + + t.Run("No Match Found", func(t *testing.T) { + res := tool.Execute(ctx, map[string]any{"pattern": "alien"}) + if res.IsError || !strings.Contains(res.ForLLM, "No tools found matching") { + t.Errorf("Expected 'no tools found' message, got: %v", res.ForLLM) + } + }) + + t.Run("Successful Match & Promotion", func(t *testing.T) { + res := tool.Execute(ctx, map[string]any{"pattern": "system"}) + + if res.IsError { + t.Fatalf("Unexpected error: %v", res.ForLLM) + } + if !strings.Contains(res.ForLLM, "SUCCESS: These tools have been temporarily UNLOCKED") { + t.Errorf("Expected success string, got: %v", res.ForLLM) + } + if !strings.Contains(res.ForLLM, "mcp_read_file") { + t.Errorf("Expected 'mcp_read_file' in results") + } + + // Verify that the TTL has been updated for the tools found + reg.mu.RLock() + defer reg.mu.RUnlock() + if reg.tools["mcp_read_file"].TTL != 5 { + t.Errorf("Expected TTL of 'mcp_read_file' to be promoted to 5, got %d", reg.tools["mcp_read_file"].TTL) + } + if reg.tools["mcp_fetch_net"].TTL != 0 { + t.Errorf("Expected 'mcp_fetch_net' to NOT be promoted (TTL=0)") + } + }) +} + +func TestBM25SearchTool_Execute(t *testing.T) { + reg := setupPopulatedRegistry() + tool := NewBM25SearchTool(reg, 3, 10) + ctx := context.Background() + + t.Run("Empty Query Error", func(t *testing.T) { + res := tool.Execute(ctx, map[string]any{"query": " "}) + if !res.IsError || !strings.Contains(res.ForLLM, "Missing or invalid 'query'") { + t.Errorf("Expected missing query error, got: %v", res.ForLLM) + } + }) + + t.Run("No Match Found", func(t *testing.T) { + res := tool.Execute(ctx, map[string]any{"query": "aliens spaceships"}) + if res.IsError || !strings.Contains(res.ForLLM, "No tools found matching") { + t.Errorf("Expected 'no tools found', got: %v", res.ForLLM) + } + }) + + t.Run("Successful Match & Promotion", func(t *testing.T) { + res := tool.Execute(ctx, map[string]any{"query": "read files"}) + + if res.IsError { + t.Fatalf("Unexpected error: %v", res.ForLLM) + } + if !strings.Contains(res.ForLLM, "mcp_read_file") { + t.Errorf("Expected 'mcp_read_file' in BM25 results") + } + + reg.mu.RLock() + defer reg.mu.RUnlock() + if reg.tools["mcp_read_file"].TTL != 3 { + t.Errorf("Expected TTL of 'mcp_read_file' to be promoted to 3") + } + }) +} + +func TestRegexSearchTool_PatternTooLong(t *testing.T) { + reg := setupPopulatedRegistry() + tool := NewRegexSearchTool(reg, 5, 10) + ctx := context.Background() + + longPattern := strings.Repeat("a", MaxRegexPatternLength+1) + res := tool.Execute(ctx, map[string]any{"pattern": longPattern}) + if !res.IsError || !strings.Contains(res.ForLLM, "Pattern too long") { + t.Errorf("Expected pattern too long error, got: %v", res.ForLLM) + } +} + +func TestSearchRegex_ZeroMaxResults(t *testing.T) { + reg := setupPopulatedRegistry() + + res, err := reg.SearchRegex("mcp", 0) + if err != nil { + t.Fatalf("SearchRegex failed: %v", err) + } + if len(res) != 0 { + t.Errorf("Expected 0 results with maxSearchResults=0, got %d", len(res)) + } +} + +func TestSearchBM25_ZeroMaxResults(t *testing.T) { + reg := setupPopulatedRegistry() + + res := reg.SearchBM25("read file", 0) + if len(res) != 0 { + t.Errorf("Expected 0 results with maxSearchResults=0, got %d", len(res)) + } +} + +func TestSearchRegex_DeterministicOrder(t *testing.T) { + reg := NewToolRegistry() + for i := 0; i < 20; i++ { + reg.RegisterHidden(&mockSearchableTool{ + name: fmt.Sprintf("tool_%02d", i), + desc: "searchable tool", + }) + } + + // Run the same search multiple times and verify order is stable + var firstRun []string + for attempt := 0; attempt < 10; attempt++ { + res, err := reg.SearchRegex("searchable", 20) + if err != nil { + t.Fatalf("SearchRegex failed: %v", err) + } + + names := make([]string, len(res)) + for i, r := range res { + names[i] = r.Name + } + + if attempt == 0 { + firstRun = names + } else { + for i, name := range names { + if name != firstRun[i] { + t.Fatalf("Non-deterministic order at attempt %d, index %d: got %q, want %q", + attempt, i, name, firstRun[i]) + } + } + } + } +} + +func TestToolRegistry_SearchLimitsAndCoreFiltering(t *testing.T) { + reg := NewToolRegistry() + + // Add 1 Core and 10 Hidden, all containing the word "match" + reg.Register(&mockSearchableTool{"core_match", "I am core with match"}) + for i := 0; i < 10; i++ { + reg.RegisterHidden(&mockSearchableTool{ + name: fmt.Sprintf("hidden_match_%d", i), + desc: "this has a match", + }) + } + + t.Run("Regex limits and core filtering", func(t *testing.T) { + // Search with Regex and a limit of maxSearchResults = 4 + res, err := reg.SearchRegex("match", 4) + if err != nil { + t.Fatalf("SearchRegex failed: %v", err) + } + + if len(res) != 4 { + t.Errorf("Expected exactly 4 results due to limit, got %d", len(res)) + } + + for _, r := range res { + if r.Name == "core_match" { + t.Errorf("SearchRegex returned a Core tool, which should be excluded") + } + } + }) + + t.Run("BM25 limits and core filtering", func(t *testing.T) { + // Search with BM25 and a limit of maxSearchResults = 3 + res := reg.SearchBM25("match", 3) + + if len(res) != 3 { + t.Errorf("Expected exactly 3 results due to limit, got %d", len(res)) + } + + for _, r := range res { + if r.Name == "core_match" { + t.Errorf("SearchBM25 returned a Core tool, which should be excluded") + } + } + }) +} + +func TestGet_HiddenToolTTLLifecycle(t *testing.T) { + reg := NewToolRegistry() + reg.RegisterHidden(&mockSearchableTool{name: "hidden_tool", desc: "test"}) + + // TTL=0 at registration → not gettable + _, ok := reg.Get("hidden_tool") + if ok { + t.Error("Expected hidden tool with TTL=0 to NOT be gettable") + } + + // Promote → gettable + reg.PromoteTools([]string{"hidden_tool"}, 3) + _, ok = reg.Get("hidden_tool") + if !ok { + t.Error("Expected promoted hidden tool to be gettable") + } + + // Tick down to 0 → not gettable again + reg.TickTTL() // 3→2 + reg.TickTTL() // 2→1 + reg.TickTTL() // 1→0 + _, ok = reg.Get("hidden_tool") + if ok { + t.Error("Expected hidden tool with TTL ticked to 0 to NOT be gettable") + } + + // Core tools remain always gettable + reg.Register(&mockSearchableTool{name: "core_tool", desc: "core"}) + _, ok = reg.Get("core_tool") + if !ok { + t.Error("Expected core tool to always be gettable") + } +} + +func TestBM25CacheInvalidation(t *testing.T) { + reg := NewToolRegistry() + reg.RegisterHidden(&mockSearchableTool{name: "tool_alpha", desc: "alpha functionality"}) + + tool := NewBM25SearchTool(reg, 5, 10) + ctx := context.Background() + + // First search should find tool_alpha + res := tool.Execute(ctx, map[string]any{"query": "alpha"}) + if !strings.Contains(res.ForLLM, "tool_alpha") { + t.Fatalf("Expected 'tool_alpha' in first search, got: %v", res.ForLLM) + } + + // Register a new hidden tool + reg.RegisterHidden(&mockSearchableTool{name: "tool_beta", desc: "beta functionality"}) + + // Cache should be invalidated; new tool should be findable + res = tool.Execute(ctx, map[string]any{"query": "beta"}) + if !strings.Contains(res.ForLLM, "tool_beta") { + t.Errorf("Expected 'tool_beta' after cache invalidation, got: %v", res.ForLLM) + } +} + +func TestPromoteTools_ConcurrentWithTickTTL(t *testing.T) { + reg := NewToolRegistry() + for i := 0; i < 20; i++ { + reg.RegisterHidden(&mockSearchableTool{ + name: fmt.Sprintf("concurrent_tool_%d", i), + desc: "concurrent test tool", + }) + } + + names := make([]string, 20) + for i := 0; i < 20; i++ { + names[i] = fmt.Sprintf("concurrent_tool_%d", i) + } + + // Hammer PromoteTools and TickTTL concurrently to detect races + done := make(chan struct{}) + go func() { + for i := 0; i < 1000; i++ { + reg.PromoteTools(names, 5) + } + close(done) + }() + + for i := 0; i < 1000; i++ { + reg.TickTTL() + } + <-done +} diff --git a/pkg/utils/bm25.go b/pkg/utils/bm25.go new file mode 100644 index 000000000..95c63f0e3 --- /dev/null +++ b/pkg/utils/bm25.go @@ -0,0 +1,272 @@ +// Package utils provides shared, reusable algorithms. +// This file implements a generic BM25 search engine. +// +// Usage: +// +// type MyDoc struct { ID string; Body string } +// +// corpus := []MyDoc{...} +// engine := bm25.New(corpus, func(d MyDoc) string { +// return d.ID + " " + d.Body +// }) +// results := engine.Search("my query", 5) +package utils + +import ( + "math" + "sort" + "strings" +) + +// ── Tuning defaults ─────────────────────────────────────────────────────────── + +const ( + // DefaultBM25K1 is the term-frequency saturation factor (typical range 1.2–2.0). + // Higher values give more weight to repeated terms. + DefaultBM25K1 = 1.2 + + // DefaultBM25B is the document-length normalization factor (0 = none, 1 = full). + DefaultBM25B = 0.75 +) + +// BM25Engine is a query-time BM25 search engine over a generic corpus. +// T is the document type; the caller supplies a TextFunc that extracts the +// searchable text from each document. +// +// The engine is stateless between queries: no caching, no invalidation logic. +// All indexing work is performed inside Search() on every call, making it +// safe to use on corpora that change frequently. +type BM25Engine[T any] struct { + corpus []T + textFunc func(T) string + k1 float64 + b float64 +} + +// BM25Option is a functional option to configure a BM25Engine. +type BM25Option func(*bm25Config) + +type bm25Config struct { + k1 float64 + b float64 +} + +// WithK1 overrides the term-frequency saturation constant (default 1.2). +func WithK1(k1 float64) BM25Option { + return func(c *bm25Config) { c.k1 = k1 } +} + +// WithB overrides the document-length normalization factor (default 0.75). +func WithB(b float64) BM25Option { + return func(c *bm25Config) { c.b = b } +} + +// NewBM25Engine creates a BM25Engine for the given corpus. +// +// - corpus : slice of documents of any type T. +// - textFunc : function that returns the searchable text for a document. +// - opts : optional tuning (WithK1, WithB). +// +// The corpus slice is referenced, not copied. Callers must not mutate it +// concurrently with Search(). +func NewBM25Engine[T any](corpus []T, textFunc func(T) string, opts ...BM25Option) *BM25Engine[T] { + cfg := bm25Config{k1: DefaultBM25K1, b: DefaultBM25B} + for _, o := range opts { + o(&cfg) + } + return &BM25Engine[T]{ + corpus: corpus, + textFunc: textFunc, + k1: cfg.k1, + b: cfg.b, + } +} + +// BM25Result is a single ranked result from a Search call. +type BM25Result[T any] struct { + Document T + Score float32 +} + +// Search ranks the corpus against query and returns the top-k results. +// Returns an empty slice (not nil) when there are no matches. +// +// Complexity: O(N×L) for indexing + O(|Q|×avgPostingLen) for scoring, +// where N = corpus size, L = average document length, Q = query terms. +// Top-k extraction uses a fixed-size min-heap: O(candidates × log k). +func (e *BM25Engine[T]) Search(query string, topK int) []BM25Result[T] { + if topK <= 0 { + return []BM25Result[T]{} + } + + queryTerms := bm25Tokenize(query) + if len(queryTerms) == 0 { + return []BM25Result[T]{} + } + + N := len(e.corpus) + if N == 0 { + return []BM25Result[T]{} + } + + // Step 1: build per-document tf + raw doc lengths + type docEntry struct { + tf map[string]uint32 + rawLen int + } + + entries := make([]docEntry, N) + df := make(map[string]int, 64) + totalLen := 0 + + for i, doc := range e.corpus { + tokens := bm25Tokenize(e.textFunc(doc)) + totalLen += len(tokens) + + tf := make(map[string]uint32, len(tokens)) + for _, t := range tokens { + tf[t]++ + } + // df: each term counts once per document (iterate the map, keys are unique) + for t := range tf { + df[t]++ + } + + entries[i] = docEntry{tf: tf, rawLen: len(tokens)} + } + + avgDocLen := float64(totalLen) / float64(N) + + // Step 2: pre-compute IDF and per-doc length normalization + // IDF (Robertson smoothing): log( (N - df(t) + 0.5) / (df(t) + 0.5) + 1 ) + idf := make(map[string]float32, len(df)) + for term, freq := range df { + idf[term] = float32(math.Log( + (float64(N)-float64(freq)+0.5)/(float64(freq)+0.5) + 1, + )) + } + + // docLenNorm[i] = k1 * (1 - b + b * |doc_i| / avgDocLen) + // Stored as float32 — sufficient precision for ranking. + docLenNorm := make([]float32, N) + for i, entry := range entries { + docLenNorm[i] = float32(e.k1 * (1 - e.b + e.b*float64(entry.rawLen)/avgDocLen)) + } + + // Step 3: build inverted index (posting lists) + // Iterate the tf map directly — map keys are already unique, no seen-set needed. + posting := make(map[string][]int32, len(df)) + for i, entry := range entries { + for term := range entry.tf { + posting[term] = append(posting[term], int32(i)) + } + } + + // Step 4: score via posting lists + // Deduplicate query terms to avoid double-weighting the same term. + unique := bm25Dedupe(queryTerms) + + scores := make(map[int32]float32) + for _, term := range unique { + termIDF, ok := idf[term] + if !ok { + continue // term not in vocabulary → zero contribution + } + for _, docID := range posting[term] { + freq := float32(entries[docID].tf[term]) + // TF_norm = freq * (k1+1) / (freq + docLenNorm) + tfNorm := freq * float32(e.k1+1) / (freq + docLenNorm[docID]) + scores[docID] += termIDF * tfNorm + } + } + + if len(scores) == 0 { + return []BM25Result[T]{} + } + + // Step 5: top-K via fixed-size min-heap + heap := make([]bm25ScoredDoc, 0, topK) + + for docID, sc := range scores { + switch { + case len(heap) < topK: + heap = append(heap, bm25ScoredDoc{docID: docID, score: sc}) + if len(heap) == topK { + bm25MinHeapify(heap) + } + case sc > heap[0].score: + heap[0] = bm25ScoredDoc{docID: docID, score: sc} + bm25SiftDown(heap, 0) + } + } + + sort.Slice(heap, func(i, j int) bool { return heap[i].score > heap[j].score }) + + out := make([]BM25Result[T], len(heap)) + for i, h := range heap { + out[i] = BM25Result[T]{ + Document: e.corpus[h.docID], + Score: h.score, + } + } + return out +} + +// bm25Tokenize splits s into lowercase tokens, stripping edge punctuation. +func bm25Tokenize(s string) []string { + raw := strings.Fields(strings.ToLower(s)) + out := raw[:0] // reuse backing array to avoid extra allocation + for _, t := range raw { + t = strings.Trim(t, ".,;:!?\"'()/\\-_") + if t != "" { + out = append(out, t) + } + } + return out +} + +// bm25Dedupe returns a new slice with duplicate tokens removed, +// preserving first-occurrence order. +func bm25Dedupe(tokens []string) []string { + seen := make(map[string]struct{}, len(tokens)) + out := make([]string, 0, len(tokens)) + for _, t := range tokens { + if _, ok := seen[t]; !ok { + seen[t] = struct{}{} + out = append(out, t) + } + } + return out +} + +type bm25ScoredDoc struct { + docID int32 + score float32 +} + +// bm25MinHeapify builds a min-heap in-place using Floyd's algorithm: O(k). +func bm25MinHeapify(h []bm25ScoredDoc) { + for i := len(h)/2 - 1; i >= 0; i-- { + bm25SiftDown(h, i) + } +} + +// bm25SiftDown restores the min-heap property starting at node i: O(log k). +func bm25SiftDown(h []bm25ScoredDoc, i int) { + n := len(h) + for { + smallest := i + l, r := 2*i+1, 2*i+2 + if l < n && h[l].score < h[smallest].score { + smallest = l + } + if r < n && h[r].score < h[smallest].score { + smallest = r + } + if smallest == i { + break + } + h[i], h[smallest] = h[smallest], h[i] + i = smallest + } +} diff --git a/pkg/utils/bm25_test.go b/pkg/utils/bm25_test.go new file mode 100644 index 000000000..4bc85b246 --- /dev/null +++ b/pkg/utils/bm25_test.go @@ -0,0 +1,175 @@ +package utils + +import ( + "reflect" + "testing" +) + +// testDoc is a generic structure for use in tests. +type testDoc struct { + ID int + Text string +} + +func extractText(d testDoc) string { + return d.Text +} + +func TestBM25Search_EdgeCases(t *testing.T) { + corpus := []testDoc{ + {1, "hello world"}, + {2, "foo bar"}, + } + engine := NewBM25Engine(corpus, extractText) + + tests := []struct { + name string + query string + topK int + }{ + {"Zero topK", "hello", 0}, + {"Negative topK", "hello", -1}, + {"Empty query", "", 5}, + {"Query with only punctuation", "...,,,!!!", 5}, + {"No matches found", "golang", 5}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + results := engine.Search(tt.query, tt.topK) + if len(results) != 0 { + t.Errorf("expected 0 results, got %d", len(results)) + } + // Check that it never returns nil, but an empty slice + if results == nil { + t.Errorf("expected empty slice, got nil") + } + }) + } +} + +func TestBM25Search_EmptyCorpus(t *testing.T) { + engine := NewBM25Engine([]testDoc{}, extractText) + results := engine.Search("hello", 5) + if len(results) != 0 || results == nil { + t.Errorf("expected empty slice from empty corpus, got %v", results) + } +} + +func TestBM25Search_RankingLogic(t *testing.T) { + corpus := []testDoc{ + {1, "the quick brown fox jumps over the lazy dog"}, + {2, "quick fox"}, + {3, "quick quick quick fox"}, // High Term Frequency (TF) + {4, "completely irrelevant document here"}, + } + engine := NewBM25Engine(corpus, extractText) + + t.Run("Term Frequency (TF) boosts score", func(t *testing.T) { + results := engine.Search("quick", 5) + if len(results) < 3 { + t.Fatalf("expected at least 3 results, got %d", len(results)) + } + // Doc 3 has the word "quick" repeated 3 times, it should beat Doc 2 + if results[0].Document.ID != 3 { + t.Errorf("expected doc 3 to rank first due to high TF, got doc %d", results[0].Document.ID) + } + }) + + t.Run("Document Length penalty", func(t *testing.T) { + results := engine.Search("fox", 5) + if len(results) < 3 { + t.Fatalf("expected at least 3 results, got %d", len(results)) + } + // Doc 2 ("quick fox") is much shorter than Doc 1 ("the quick brown fox..."), + // so, with equal Term Frequency for the word "fox" (1 time), Doc 2 wins. + if results[0].Document.ID != 2 { + t.Errorf("expected doc 2 to rank first due to shorter length, got doc %d", results[0].Document.ID) + } + }) + + t.Run("TopK limits results", func(t *testing.T) { + results := engine.Search("quick", 2) + if len(results) != 2 { + t.Errorf("expected exactly 2 results, got %d", len(results)) + } + }) +} + +func TestBM25Tokenize(t *testing.T) { + tests := []struct { + input string + expected []string + }{ + {"Hello World", []string{"hello", "world"}}, + {" spaces everywhere ", []string{"spaces", "everywhere"}}, + {"punctuation... test!!!", []string{"punctuation", "test"}}, + {"(parentheses) and-hyphens", []string{"parentheses", "and-hyphens"}}, // hyphens trimmed from edges + {"internal-hyphen is kept", []string{"internal-hyphen", "is", "kept"}}, + {".,;?!", []string{}}, // Becomes empty after trim + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + got := bm25Tokenize(tt.input) + if len(got) == 0 && len(tt.expected) == 0 { + return // Both empty + } + if !reflect.DeepEqual(got, tt.expected) { + t.Errorf("bm25Tokenize(%q) = %v, want %v", tt.input, got, tt.expected) + } + }) + } +} + +func TestBM25Dedupe(t *testing.T) { + input := []string{"apple", "banana", "apple", "orange", "banana"} + expected := []string{"apple", "banana", "orange"} + + got := bm25Dedupe(input) + if !reflect.DeepEqual(got, expected) { + t.Errorf("bm25Dedupe() = %v, want %v", got, expected) + } +} + +func TestBM25Options(t *testing.T) { + corpus := []testDoc{{1, "test"}} + + engine := NewBM25Engine( + corpus, + extractText, + WithK1(2.5), + WithB(0.9), + ) + + if engine.k1 != 2.5 { + t.Errorf("expected k1 to be 2.5, got %v", engine.k1) + } + if engine.b != 0.9 { + t.Errorf("expected b to be 0.9, got %v", engine.b) + } +} + +func TestBM25Search_SortingStability(t *testing.T) { + // Ensure that sorting by heap returns in correct descending order + corpus := []testDoc{ + {1, "golang is good"}, + {2, "golang golang"}, + {3, "golang golang golang"}, + {4, "golang golang golang golang"}, + } + engine := NewBM25Engine(corpus, extractText) + results := engine.Search("golang", 10) + + if len(results) != 4 { + t.Fatalf("expected 4 results, got %d", len(results)) + } + + // Score should be strictly decreasing + for i := 1; i < len(results); i++ { + if results[i].Score > results[i-1].Score { + t.Errorf("results not sorted correctly: result %d score (%v) > result %d score (%v)", + i, results[i].Score, i-1, results[i-1].Score) + } + } +} From 985289a3b74c648c96c753fdad840eae10969b6c Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 14:48:22 +0100 Subject: [PATCH 11/25] fix: resolve OpenRouter migration error and reduce bot rambling by tuning temperature and tool iterations --- pkg/agent/instance.go | 2 +- pkg/config/defaults.go | 2 +- pkg/config/migration.go | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index b60818875..fd8ceb79f 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -125,7 +125,7 @@ func NewAgentInstance( maxTokens = 8192 } - temperature := 0.7 + temperature := 0.1 if defaults.Temperature != nil { temperature = *defaults.Temperature } diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index e64baa720..6d578a47a 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -32,7 +32,7 @@ func DefaultConfig() *Config { Model: "", MaxTokens: 32768, Temperature: nil, // nil means use provider default - MaxToolIterations: 50, + MaxToolIterations: 10, SummarizeMessageThreshold: 20, SummarizeTokenPercent: 75, }, diff --git a/pkg/config/migration.go b/pkg/config/migration.go index 51f21e4f4..24d567f85 100644 --- a/pkg/config/migration.go +++ b/pkg/config/migration.go @@ -14,11 +14,11 @@ import ( // If the model already contains a "/" (indicating it has a protocol prefix), it is returned as-is. // Otherwise, the protocol prefix is added. func buildModelWithProtocol(protocol, model string) string { - if strings.Contains(model, "/") { - // Model already has a protocol prefix, return as-is + prefix := protocol + "/" + if strings.HasPrefix(model, prefix) { return model } - return protocol + "/" + model + return prefix + model } // providerMigrationConfig defines how to migrate a provider from old config to new format. From d2366b478539b621c1a2a080a6412c4ec426d7f5 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 14:54:12 +0100 Subject: [PATCH 12/25] feat: implement OpenRouter Free default and paid model authorization check --- pkg/agent/loop.go | 58 ++++++++++++++++++++++++++++++++++++++++-- pkg/config/defaults.go | 9 ++++++- pkg/session/manager.go | 36 ++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 3 deletions(-) diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 58f53bef8..d8e034437 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -664,8 +664,29 @@ func (al *AgentLoop) processMessage(ctx context.Context, msg bus.InboundMessage) SendResponse: false, } - // context-dependent commands check their own Runtime fields and report - // "unavailable" when the required capability is nil. + // Check for pending authorization response + if isYesResponse(msg.Content) { + if pending, _ := agent.Sessions.GetMetadata(opts.SessionKey, "pending_paid_auth"); pending == true { + agent.Sessions.SetMetadata(opts.SessionKey, "paid_model_authorized", true) + agent.Sessions.SetMetadata(opts.SessionKey, "pending_paid_auth", false) + + // Retrieve the stashed message to resume + if stashed, ok := agent.Sessions.GetMetadata(opts.SessionKey, "stashed_user_message"); ok { + opts.UserMessage = stashed.(string) + // Clear stash + agent.Sessions.SetMetadata(opts.SessionKey, "stashed_user_message", nil) + + al.bus.PublishOutbound(ctx, bus.OutboundMessage{ + Channel: msg.Channel, + ChatID: msg.ChatID, + Content: "✅ Authorized! Processing your request with the advanced model now...", + }) + } else { + return "✅ Authorized! DeepSeek and other paid models are now enabled for this session. What would you like me to do?", nil + } + } + } + if response, handled := al.handleCommand(ctx, msg, agent, &opts); handled { return response, nil } @@ -926,6 +947,20 @@ func (al *AgentLoop) runLLMIteration( // tool chain doesn't switch models mid-way through. activeCandidates, activeModel := al.selectCandidates(agent, opts.UserMessage, messages) + // Check for paid model authorization + if isPaidModel(activeModel) { + authorized, _ := agent.Sessions.GetMetadata(opts.SessionKey, "paid_model_authorized") + if authorized != true { + // Stash the message and ask for permission + agent.Sessions.SetMetadata(opts.SessionKey, "pending_paid_auth", true) + agent.Sessions.SetMetadata(opts.SessionKey, "stashed_user_message", opts.UserMessage) + agent.Sessions.Save(opts.SessionKey) + + authMsg := fmt.Sprintf("🛡️ **Authorization Required**\n\nI've detected this task requires an advanced model (%s) which may incur costs. \n\nReply with **'yes'** or **'y'** to authorize this session, or I can continue with the free model if you prefer.", activeModel) + return authMsg, 0, nil + } + } + for iteration < agent.MaxIterations { iteration++ @@ -1865,3 +1900,22 @@ func extractParentPeer(msg bus.InboundMessage) *routing.RoutePeer { } return &routing.RoutePeer{Kind: parentKind, ID: parentID} } + +func isPaidModel(model string) bool { + m := strings.ToLower(model) + // Explicitly free models + if strings.Contains(m, "/free") || strings.HasPrefix(m, "ollama/") || strings.HasPrefix(m, "vllm/") { + return false + } + // Models on OpenRouter that are free or we want to treat as free + if strings.HasPrefix(m, "openrouter/free") { + return false + } + // Everything else (DeepSeek, Claude, GPT-4, etc.) is considered paid + return true +} + +func isYesResponse(content string) bool { + c := strings.ToLower(strings.TrimSpace(content)) + return c == "yes" || c == "y" || c == "ok" || c == "confirm" || c == "proceed" +} diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 6d578a47a..9a87ece56 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -29,7 +29,8 @@ func DefaultConfig() *Config { Workspace: workspacePath, RestrictToWorkspace: true, Provider: "", - Model: "", + ModelName: "openrouter-free", + Model: "openrouter/free", MaxTokens: 32768, Temperature: nil, // nil means use provider default MaxToolIterations: 10, @@ -248,6 +249,12 @@ func DefaultConfig() *Config { }, // OpenRouter (100+ models) - https://openrouter.ai/keys + { + ModelName: "openrouter-free", + Model: "openrouter/free", + APIBase: "https://openrouter.ai/api/v1", + APIKey: "", + }, { ModelName: "openrouter-auto", Model: "openrouter/auto", diff --git a/pkg/session/manager.go b/pkg/session/manager.go index 08f0b0ad2..baf0cb9e7 100644 --- a/pkg/session/manager.go +++ b/pkg/session/manager.go @@ -15,6 +15,7 @@ type Session struct { Key string `json:"key"` Messages []providers.Message `json:"messages"` Summary string `json:"summary,omitempty"` + Metadata map[string]any `json:"metadata,omitempty"` Created time.Time `json:"created"` Updated time.Time `json:"updated"` } @@ -145,6 +146,41 @@ func (sm *SessionManager) TruncateHistory(key string, keepLast int) { session.Updated = time.Now() } +func (sm *SessionManager) SetMetadata(key string, metaKey string, value any) { + sm.mu.Lock() + defer sm.mu.Unlock() + + session, ok := sm.sessions[key] + if !ok { + session = &Session{ + Key: key, + Messages: []providers.Message{}, + Metadata: make(map[string]any), + Created: time.Now(), + } + sm.sessions[key] = session + } + + if session.Metadata == nil { + session.Metadata = make(map[string]any) + } + session.Metadata[metaKey] = value + session.Updated = time.Now() +} + +func (sm *SessionManager) GetMetadata(key string, metaKey string) (any, bool) { + sm.mu.RLock() + defer sm.mu.RUnlock() + + session, ok := sm.sessions[key] + if !ok || session.Metadata == nil { + return nil, false + } + + val, ok := session.Metadata[metaKey] + return val, ok +} + // 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. From 5edf1cb27e550d3fa60cc6cd3e9fc6b09e23dba9 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 15:26:49 +0100 Subject: [PATCH 13/25] feat: integrate Google services and WhatsApp QR command --- debug_home.go | 10 + pkg/agent/instance.go | 3 + pkg/agent/loop.go | 6 + pkg/auth/oauth.go | 2 +- pkg/channels/interfaces.go | 6 + .../whatsapp_native/whatsapp_native.go | 10 + pkg/commands/builtin.go | 1 + pkg/commands/cmd_whatsapp.go | 51 +++++ pkg/commands/runtime.go | 1 + pkg/config/config.go | 3 + pkg/config/defaults.go | 3 + pkg/tools/google.go | 205 ++++++++++++++++++ workspace/skills/google_sync/SKILL.md | 38 ++++ 13 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 debug_home.go create mode 100644 pkg/commands/cmd_whatsapp.go create mode 100644 pkg/tools/google.go create mode 100644 workspace/skills/google_sync/SKILL.md diff --git a/debug_home.go b/debug_home.go new file mode 100644 index 000000000..96092fe2d --- /dev/null +++ b/debug_home.go @@ -0,0 +1,10 @@ +package main +import ( + "fmt" + "os" +) +func main() { + home, _ := os.UserHomeDir() + fmt.Printf("Home: %s\n", home) + fmt.Printf("PICOCLAW_HOME: %s\n", os.Getenv("PICOCLAW_HOME")) +} diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index fd8ceb79f..565d94bcc 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -79,6 +79,9 @@ func NewAgentInstance( if cfg.Tools.IsToolEnabled("list_dir") { toolsRegistry.Register(tools.NewListDirTool(workspace, readRestrict, allowReadPaths)) } + if cfg.Tools.IsToolEnabled("google") { + toolsRegistry.Register(&tools.GoogleTool{}) + } if cfg.Tools.IsToolEnabled("exec") { execTool, err := tools.NewExecToolWithConfig(workspace, restrict, cfg) if err != nil { diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index d8e034437..f8f0c4bc0 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -1833,6 +1833,12 @@ func (al *AgentLoop) buildCommandsRuntime(agent *AgentInstance, opts *processOpt } return nil }, + GetChannel: func(name string) (any, bool) { + if al.channelManager == nil { + return nil, false + } + return al.channelManager.GetChannel(name) + }, } if agent != nil { rt.GetModelInfo = func() (string, string) { diff --git a/pkg/auth/oauth.go b/pkg/auth/oauth.go index 4667e3d81..790c216a9 100644 --- a/pkg/auth/oauth.go +++ b/pkg/auth/oauth.go @@ -53,7 +53,7 @@ func GoogleAntigravityOAuthConfig() OAuthProviderConfig { TokenURL: "https://oauth2.googleapis.com/token", ClientID: clientID, ClientSecret: clientSecret, - Scopes: "https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/cclog https://www.googleapis.com/auth/experimentsandconfigs", + Scopes: "https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/cclog https://www.googleapis.com/auth/experimentsandconfigs https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/calendar.readonly", Port: 51121, } } diff --git a/pkg/channels/interfaces.go b/pkg/channels/interfaces.go index b3a493761..9626ec804 100644 --- a/pkg/channels/interfaces.go +++ b/pkg/channels/interfaces.go @@ -50,3 +50,9 @@ type PlaceholderRecorder interface { type CommandRegistrarCapable interface { RegisterCommands(ctx context.Context, defs []commands.Definition) error } + +// QRProvider is implemented by channels that can provide a QR code string +// (e.g. for WhatsApp pairing). +type QRProvider interface { + GetLastQR() string +} diff --git a/pkg/channels/whatsapp_native/whatsapp_native.go b/pkg/channels/whatsapp_native/whatsapp_native.go index 188a7c8fa..73ad97aa3 100644 --- a/pkg/channels/whatsapp_native/whatsapp_native.go +++ b/pkg/channels/whatsapp_native/whatsapp_native.go @@ -59,6 +59,7 @@ type WhatsAppNativeChannel struct { reconnecting bool stopping atomic.Bool // set once Stop begins; prevents new wg.Add calls wg sync.WaitGroup // tracks background goroutines (QR handler, reconnect) + lastQR string // stores the last QR code string for retrieval } // NewWhatsAppNativeChannel creates a WhatsApp channel that uses whatsmeow for connection. @@ -187,6 +188,9 @@ func (c *WhatsAppNativeChannel) Start(ctx context.Context) error { } if evt.Event == "code" { logger.InfoCF("whatsapp", "Scan this QR code with WhatsApp (Linked Devices):", nil) + c.mu.Lock() + c.lastQR = evt.Code + c.mu.Unlock() qrterminal.GenerateWithConfig(evt.Code, qrterminal.Config{ Level: qrterminal.L, Writer: os.Stdout, @@ -446,3 +450,9 @@ func parseJID(s string) (types.JID, error) { } return types.NewJID(s, types.DefaultUserServer), nil } + +func (c *WhatsAppNativeChannel) GetLastQR() string { + c.mu.Lock() + defer c.mu.Unlock() + return c.lastQR +} diff --git a/pkg/commands/builtin.go b/pkg/commands/builtin.go index aed6a1874..e31424dc4 100644 --- a/pkg/commands/builtin.go +++ b/pkg/commands/builtin.go @@ -13,5 +13,6 @@ func BuiltinDefinitions() []Definition { switchCommand(), checkCommand(), clearCommand(), + whatsappCommand(), } } diff --git a/pkg/commands/cmd_whatsapp.go b/pkg/commands/cmd_whatsapp.go new file mode 100644 index 000000000..a926f9caa --- /dev/null +++ b/pkg/commands/cmd_whatsapp.go @@ -0,0 +1,51 @@ +package commands + +import ( + "context" + "fmt" + "github.com/sipeed/picoclaw/pkg/channels" +) + +func whatsappCommand() Definition { + return Definition{ + Name: "whatsapp", + Description: "WhatsApp management commands", + Subcommands: []Definition{ + { + Name: "qr", + Description: "Get the latest WhatsApp pairing QR code", + Handler: func(ctx context.Context, req Request, rt Runtime) ExecuteResult { + ch, ok := rt.GetChannel("whatsapp_native") + if !ok { + return ExecuteResult{ + Outcome: OutcomeHandled, + Err: fmt.Errorf("whatsapp_native channel is not enabled"), + } + } + + qrProvider, ok := ch.(channels.QRProvider) + if !ok { + return ExecuteResult{ + Outcome: OutcomeHandled, + Err: fmt.Errorf("whatsapp_native channel does not support QR retrieval"), + } + } + + qr := qrProvider.GetLastQR() + if qr == "" { + return ExecuteResult{ + Outcome: OutcomeHandled, + Err: fmt.Errorf("no QR code available yet. please wait for the channel to initialize"), + } + } + + // For now, return the QR code string. + // Optimization: In the future, we can return an image reference. + _ = req.Reply(fmt.Sprintf("Scan this QR code string (or wait for image support): %s", qr)) + + return ExecuteResult{Outcome: OutcomeHandled} + }, + }, + }, + } +} diff --git a/pkg/commands/runtime.go b/pkg/commands/runtime.go index 037184686..d6c74f8ed 100644 --- a/pkg/commands/runtime.go +++ b/pkg/commands/runtime.go @@ -14,4 +14,5 @@ type Runtime struct { SwitchModel func(value string) (oldModel string, err error) SwitchChannel func(value string) error ClearHistory func() error + GetChannel func(name string) (any, bool) } diff --git a/pkg/config/config.go b/pkg/config/config.go index a47ab3091..aea368299 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -689,6 +689,7 @@ type ToolsConfig struct { FindSkills ToolConfig `json:"find_skills" envPrefix:"PICOCLAW_TOOLS_FIND_SKILLS_"` I2C ToolConfig `json:"i2c" envPrefix:"PICOCLAW_TOOLS_I2C_"` InstallSkill ToolConfig `json:"install_skill" envPrefix:"PICOCLAW_TOOLS_INSTALL_SKILL_"` + Google ToolConfig `json:"google" envPrefix:"PICOCLAW_TOOLS_GOOGLE_"` ListDir ToolConfig `json:"list_dir" envPrefix:"PICOCLAW_TOOLS_LIST_DIR_"` Message ToolConfig `json:"message" envPrefix:"PICOCLAW_TOOLS_MESSAGE_"` ReadFile ReadFileToolConfig `json:"read_file" envPrefix:"PICOCLAW_TOOLS_READ_FILE_"` @@ -953,6 +954,8 @@ func (t *ToolsConfig) IsToolEnabled(name string) bool { return t.I2C.Enabled case "install_skill": return t.InstallSkill.Enabled + case "google": + return t.Google.Enabled case "list_dir": return t.ListDir.Enabled case "message": diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 9a87ece56..2de444545 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -474,6 +474,9 @@ func DefaultConfig() *Config { InstallSkill: ToolConfig{ Enabled: true, }, + Google: ToolConfig{ + Enabled: true, + }, ListDir: ToolConfig{ Enabled: true, }, diff --git a/pkg/tools/google.go b/pkg/tools/google.go new file mode 100644 index 000000000..82835e722 --- /dev/null +++ b/pkg/tools/google.go @@ -0,0 +1,205 @@ +package tools + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "github.com/sipeed/picoclaw/pkg/auth" + "github.com/sipeed/picoclaw/pkg/logger" +) + +type GoogleTool struct{} + +func (t *GoogleTool) Name() string { + return "google" +} + +func (t *GoogleTool) Description() string { + return "Access Google services like Gmail and Calendar. Actions: 'list_emails', 'list_events'. Use 'list_emails' to get recent messages (subject, snippet). Use 'list_events' to get upcoming calendar events (summary, start/end time)." +} + +func (t *GoogleTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "action": map[string]any{ + "type": "string", + "enum": []string{"list_emails", "list_events"}, + "description": "The service action to perform.", + }, + "count": map[string]any{ + "type": "integer", + "default": 10, + "description": "Number of items to retrieve.", + }, + }, + "required": []string{"action"}, + } +} + +func (t *GoogleTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + action, _ := args["action"].(string) + count := 10 + if c, ok := args["count"].(float64); ok { + count = int(c) + } + + cred, err := auth.GetCredential("google-antigravity") + if err != nil || cred == nil { + return ErrorResult("Google account not linked. User must authenticate via 'google' provider first.") + } + + // Automatic refresh if needed + if cred.NeedsRefresh() { + logger.InfoC("tools", "Refreshing Google access token") + newCred, err := auth.RefreshAccessToken(cred, auth.GoogleAntigravityOAuthConfig()) + if err != nil { + return ErrorResult(fmt.Sprintf("Failed to refresh Google token: %v", err)) + } + cred = newCred + _ = auth.SetCredential("google-antigravity", cred) + } + + switch action { + case "list_emails": + return t.listEmails(ctx, cred, count) + case "list_events": + return t.listEvents(ctx, cred, count) + default: + return ErrorResult("Unknown action") + } +} + +func (t *GoogleTool) listEmails(ctx context.Context, cred *auth.AuthCredential, maxResults int) *ToolResult { + url := fmt.Sprintf("https://gmail.googleapis.com/gmail/v1/users/me/messages?maxResults=%d", maxResults) + req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) + req.Header.Set("Authorization", "Bearer "+cred.AccessToken) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return ErrorResult(fmt.Sprintf("API request failed: %v", err)) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return ErrorResult(fmt.Sprintf("Gmail API error (%d): %s", resp.StatusCode, string(body))) + } + + var listResp struct { + Messages []struct { + ID string `json:"id"` + } `json:"messages"` + } + if err := json.NewDecoder(resp.Body).Decode(&listResp); err != nil { + return ErrorResult(fmt.Sprintf("Failed to decode Gmail list: %v", err)) + } + + var emails []string + for _, m := range listResp.Messages { + msgURL := "https://gmail.googleapis.com/gmail/v1/users/me/messages/" + m.ID + mReq, _ := http.NewRequestWithContext(ctx, "GET", msgURL, nil) + mReq.Header.Set("Authorization", "Bearer "+cred.AccessToken) + mResp, err := http.DefaultClient.Do(mReq) + if err != nil { + continue + } + var msg struct { + Snippet string `json:"snippet"` + Payload struct { + Headers []struct { + Name string `json:"name"` + Value string `json:"value"` + } `json:"headers"` + } `json:"payload"` + } + _ = json.NewDecoder(mResp.Body).Decode(&msg) + mResp.Body.Close() + + subject := "No Subject" + from := "Unknown" + for _, h := range msg.Payload.Headers { + if h.Name == "Subject" { + subject = h.Value + } else if h.Name == "From" { + from = h.Value + } + } + emails = append(emails, fmt.Sprintf("- From: %s\n Subject: %s\n Snippet: %s", from, subject, msg.Snippet)) + } + + if len(emails) == 0 { + return SilentResult("No messages found.") + } + + return SilentResult(fmt.Sprintf("Recent Emails:\n%s", join(emails, "\n\n"))) +} + +func (t *GoogleTool) listEvents(ctx context.Context, cred *auth.AuthCredential, maxResults int) *ToolResult { + now := time.Now().Format(time.RFC3339) + url := fmt.Sprintf("https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=%s&maxResults=%d&singleEvents=true&orderBy=startTime", now, maxResults) + req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) + req.Header.Set("Authorization", "Bearer "+cred.AccessToken) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return ErrorResult(fmt.Sprintf("API request failed: %v", err)) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return ErrorResult(fmt.Sprintf("Calendar API error (%d): %s", resp.StatusCode, string(body))) + } + + var eventList struct { + Items []struct { + Summary string `json:"summary"` + Start struct { + DateTime string `json:"dateTime"` + Date string `json:"date"` + } `json:"start"` + End struct { + DateTime string `json:"dateTime"` + Date string `json:"date"` + } `json:"end"` + } `json:"items"` + } + if err := json.NewDecoder(resp.Body).Decode(&eventList); err != nil { + return ErrorResult(fmt.Sprintf("Failed to decode Calendar events: %v", err)) + } + + var events []string + for _, it := range eventList.Items { + start := it.Start.DateTime + if start == "" { + start = it.Start.Date + } + end := it.End.DateTime + if end == "" { + end = it.End.Date + } + events = append(events, fmt.Sprintf("- Event: %s\n Start: %s\n End: %s", it.Summary, start, end)) + } + + if len(events) == 0 { + return SilentResult("No upcoming events found.") + } + + return SilentResult(fmt.Sprintf("Upcoming Calendar Events:\n%s", join(events, "\n"))) +} + +func join(s []string, sep string) string { + res := "" + for i, v := range s { + if i > 0 { + res += sep + } + res += v + } + return res +} diff --git a/workspace/skills/google_sync/SKILL.md b/workspace/skills/google_sync/SKILL.md new file mode 100644 index 000000000..1095b126d --- /dev/null +++ b/workspace/skills/google_sync/SKILL.md @@ -0,0 +1,38 @@ +--- +name: google_sync +description: Synchronize Google services (Email, Calendar) with PicoClaw +--- + +# Google Sync Skill + +This skill allows the agent to synchronize and manage user's Google services. + +## Available Tools + +### `google` +Provides access to Gmail and Google Calendar. +- `action="list_emails"`: Fetches recent emails. +- `action="list_events"`: Fetches upcoming calendar events. + +## Periodic Synchronization + +To keep the agent's knowledge up-to-date, use the `cron` tool to schedule periodic sync tasks. + +### Example: Sync Every 4 Hours +Call `cron` tool: +```json +{ + "action": "add", + "message": "Update my knowledge of recent emails and calendar events using the google tool.", + "every_seconds": 14400, + "deliver": false +} +``` + +## Self-Syncing Implementation + +When triggered by cron, the agent should: +1. Call `google(action="list_emails")` +2. Call `google(action="list_events")` +3. Summarize the findings. +4. Update its long-term knowledge or session summary. From 992277b2522d10711c1c8d9defb056aad403d2c3 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 18:50:27 +0100 Subject: [PATCH 14/25] feat: Add openclaw port --- cmd/picoclaw/internal/auth/helpers.go | 28 ++++- cmd/picoclaw/internal/gateway/helpers.go | 2 +- pkg/acp/manager.go | 78 ++++++++++++ pkg/acp/session.go | 148 +++++++++++++++++++++++ pkg/agent/instance.go | 10 ++ pkg/agent/loop.go | 12 ++ pkg/auth/oauth.go | 16 ++- pkg/commands/builtin.go | 5 + pkg/commands/cmd_acp.go | 66 ++++++++++ pkg/commands/cmd_help.go | 54 ++++++--- pkg/commands/cmd_system.go | 110 +++++++++++++++++ pkg/commands/cmd_whatsapp.go | 9 +- pkg/commands/runtime.go | 2 + pkg/config/config.go | 10 ++ pkg/config/defaults.go | 21 +++- pkg/tools/spawn.go | 59 ++++++++- pkg/tools/voicecall.go | 108 +++++++++++++++++ pkg/tools/vps.go | 80 ++++++++++++ web/backend/api/router.go | 3 + web/backend/api/voice_webhook.go | 26 ++++ web/backend/main.go | 2 +- web/backend/middleware/access_control.go | 24 ++++ workspace/skills/video_editor/SKILL.md | 47 +++++++ 23 files changed, 891 insertions(+), 29 deletions(-) create mode 100644 pkg/acp/manager.go create mode 100644 pkg/acp/session.go create mode 100644 pkg/commands/cmd_acp.go create mode 100644 pkg/commands/cmd_system.go create mode 100644 pkg/tools/voicecall.go create mode 100644 pkg/tools/vps.go create mode 100644 web/backend/api/voice_webhook.go create mode 100644 workspace/skills/video_editor/SKILL.md diff --git a/cmd/picoclaw/internal/auth/helpers.go b/cmd/picoclaw/internal/auth/helpers.go index a0a229167..93cd9c005 100644 --- a/cmd/picoclaw/internal/auth/helpers.go +++ b/cmd/picoclaw/internal/auth/helpers.go @@ -17,7 +17,7 @@ import ( ) const ( - supportedProvidersMsg = "supported providers: openai, anthropic, google-antigravity" + supportedProvidersMsg = "supported providers: openai, anthropic, google-antigravity, gemini-cli" defaultAnthropicModel = "claude-sonnet-4.6" ) @@ -29,6 +29,8 @@ func authLoginCmd(provider string, useDeviceCode bool, useOauth bool) error { return authLoginAnthropic(useOauth) case "google-antigravity", "antigravity": return authLoginGoogleAntigravity() + case "gemini-cli": + return authLoginGeminiCLI() default: return fmt.Errorf("unsupported provider: %s (%s)", provider, supportedProvidersMsg) } @@ -167,6 +169,26 @@ func authLoginGoogleAntigravity() error { return nil } +func authLoginGeminiCLI() error { + cfg := auth.GeminiCLIOAuthConfig() + + cred, err := auth.LoginBrowser(cfg) + if err != nil { + return fmt.Errorf("login failed: %w", err) + } + + cred.Provider = "gemini-cli" + + if err = auth.SetCredential("gemini-cli", cred); err != nil { + return fmt.Errorf("failed to save credentials: %w", err) + } + + fmt.Println("\n✓ Gemini CLI OAuth login successful!") + fmt.Println("Credentials saved natively for Gemini CLI access.") + + return nil +} + func authLoginAnthropic(useOauth bool) error { if useOauth { return authLoginAnthropicSetupToken() @@ -363,6 +385,10 @@ func authLogoutCmd(provider string) error { if isAntigravityModel(appCfg.ModelList[i].Model) { appCfg.ModelList[i].AuthMethod = "" } + case "gemini-cli": + if appCfg.ModelList[i].Model == "gemini-cli" { + appCfg.ModelList[i].AuthMethod = "" + } } } // Clear AuthMethod in Providers (legacy) diff --git a/cmd/picoclaw/internal/gateway/helpers.go b/cmd/picoclaw/internal/gateway/helpers.go index 4f93b858a..760b082c0 100644 --- a/cmd/picoclaw/internal/gateway/helpers.go +++ b/cmd/picoclaw/internal/gateway/helpers.go @@ -63,7 +63,7 @@ func gatewayCmd(debug bool) error { } msgBus := bus.NewMessageBus() - agentLoop := agent.NewAgentLoop(cfg, msgBus, provider) + agentLoop := agent.NewAgentLoop(cfg, msgBus, provider, internal.FormatVersion()) // Print agent startup info fmt.Println("\n📦 Agent Status:") diff --git a/pkg/acp/manager.go b/pkg/acp/manager.go new file mode 100644 index 000000000..c5ea31812 --- /dev/null +++ b/pkg/acp/manager.go @@ -0,0 +1,78 @@ +package acp + +import ( + "crypto/rand" + "encoding/hex" + "fmt" + "sync" +) + +type Manager struct { + sessions map[string]*Session + mu sync.RWMutex +} + +var ( + GlobalManager *Manager + once sync.Once +) + +func GetManager() *Manager { + once.Do(func() { + GlobalManager = &Manager{ + sessions: make(map[string]*Session), + } + }) + return GlobalManager +} + +func generateUUID() string { + b := make([]byte, 16) + rand.Read(b) + return hex.EncodeToString(b) +} + +func (m *Manager) Spawn(agentID, mode, command, cwd, label string, args []string) (*Session, error) { + sessionID := generateUUID() + key := fmt.Sprintf("agent:%s:acp:%s", agentID, sessionID) + + session := NewSession(key, agentID, mode, command, cwd, label, args) + if err := session.Start(); err != nil { + return nil, err + } + + m.mu.Lock() + m.sessions[key] = session + m.mu.Unlock() + + return session, nil +} + +func (m *Manager) GetSession(key string) (*Session, bool) { + m.mu.RLock() + defer m.mu.RUnlock() + session, ok := m.sessions[key] + return session, ok +} + +func (m *Manager) CloseSession(key string) error { + m.mu.Lock() + defer m.mu.Unlock() + session, ok := m.sessions[key] + if !ok { + return fmt.Errorf("session not found: %s", key) + } + err := session.Close() + delete(m.sessions, key) + return err +} + +func (m *Manager) ListSessions() []*Session { + m.mu.RLock() + defer m.mu.RUnlock() + var list []*Session + for _, s := range m.sessions { + list = append(list, s) + } + return list +} diff --git a/pkg/acp/session.go b/pkg/acp/session.go new file mode 100644 index 000000000..b7de62142 --- /dev/null +++ b/pkg/acp/session.go @@ -0,0 +1,148 @@ +package acp + +import ( + "bufio" + "context" + "fmt" + "io" + "os/exec" + "sync" +) + +// Session represents a running ACP (Agent Client Protocol) harness session. +type Session struct { + Key string // e.g. agent::acp: + AgentID string + Mode string // "run" or "session" + Command string + Args []string + Cwd string + Label string + + cmd *exec.Cmd + stdin io.WriteCloser + stdout io.ReadCloser + stderr io.ReadCloser + cancel context.CancelFunc + ctx context.Context + + mu sync.RWMutex + outputBuf []string + isActive bool + err error +} + +func NewSession(key, agentID, mode, command, cwd, label string, args []string) *Session { + return &Session{ + Key: key, + AgentID: agentID, + Mode: mode, + Command: command, + Args: args, + Cwd: cwd, + Label: label, + outputBuf: make([]string, 0), + } +} + +func (s *Session) Start() error { + s.mu.Lock() + defer s.mu.Unlock() + + s.ctx, s.cancel = context.WithCancel(context.Background()) + s.cmd = exec.CommandContext(s.ctx, s.Command, s.Args...) + if s.Cwd != "" { + s.cmd.Dir = s.Cwd + } + + var err error + s.stdin, err = s.cmd.StdinPipe() + if err != nil { + return err + } + s.stdout, err = s.cmd.StdoutPipe() + if err != nil { + return err + } + s.stderr, err = s.cmd.StderrPipe() + if err != nil { + return err + } + + if err := s.cmd.Start(); err != nil { + return err + } + + s.isActive = true + + // Read stdout + go s.readStream(s.stdout, "OUT") + // Read stderr + go s.readStream(s.stderr, "ERR") + + go func() { + err := s.cmd.Wait() + s.mu.Lock() + defer s.mu.Unlock() + s.isActive = false + s.err = err + }() + + return nil +} + +func (s *Session) readStream(r io.Reader, prefix string) { + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + s.mu.Lock() + s.outputBuf = append(s.outputBuf, fmt.Sprintf("[%s] %s", prefix, line)) + // Keep last 1000 lines + if len(s.outputBuf) > 1000 { + s.outputBuf = s.outputBuf[1:] + } + s.mu.Unlock() + } +} + +func (s *Session) Write(input string) error { + s.mu.RLock() + defer s.mu.RUnlock() + if !s.isActive { + return fmt.Errorf("session is not active") + } + _, err := fmt.Fprintln(s.stdin, input) + return err +} + +func (s *Session) Close() error { + s.mu.Lock() + defer s.mu.Unlock() + if s.cancel != nil { + s.cancel() + } + if s.stdin != nil { + s.stdin.Close() + } + return nil +} + +func (s *Session) GetOutput() []string { + s.mu.RLock() + defer s.mu.RUnlock() + out := make([]string, len(s.outputBuf)) + copy(out, s.outputBuf) + return out +} + +func (s *Session) Status() string { + s.mu.RLock() + defer s.mu.RUnlock() + if s.isActive { + return "running" + } + if s.err != nil { + return fmt.Sprintf("exited with error: %v", s.err) + } + return "finished" +} diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index 565d94bcc..a977876cd 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -89,8 +89,18 @@ func NewAgentInstance( } toolsRegistry.Register(execTool) } + if cfg.Tools.IsToolEnabled("vps") { + toolsRegistry.Register(&tools.VPSTool{ + Host: cfg.Tools.VPS.Host, + User: cfg.Tools.VPS.User, + }) + } + if cfg.Tools.IsToolEnabled("voice_call") { + toolsRegistry.Register(tools.NewVoiceCallTool()) + } if cfg.Tools.IsToolEnabled("edit_file") { + } toolsRegistry.Register(tools.NewEditFileTool(workspace, restrict, allowWritePaths)) } if cfg.Tools.IsToolEnabled("append_file") { diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index f8f0c4bc0..269f415c0 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -48,6 +48,7 @@ type AgentLoop struct { mediaStore media.MediaStore transcriber voice.Transcriber cmdRegistry *commands.Registry + version string } // processOptions configures how a message is processed @@ -77,6 +78,7 @@ func NewAgentLoop( cfg *config.Config, msgBus *bus.MessageBus, provider providers.LLMProvider, + version string, ) *AgentLoop { registry := NewAgentRegistry(cfg, provider) @@ -102,6 +104,7 @@ func NewAgentLoop( summarizing: sync.Map{}, fallback: fallbackChain, cmdRegistry: commands.NewRegistry(commands.BuiltinDefinitions()), + version: version, } return al @@ -1839,6 +1842,15 @@ func (al *AgentLoop) buildCommandsRuntime(agent *AgentInstance, opts *processOpt } return al.channelManager.GetChannel(name) }, + GetVersion: func() string { + return al.version + }, + ListTools: func() []string { + if agent == nil { + return nil + } + return agent.Tools.GetSummaries() + }, } if agent != nil { rt.GetModelInfo = func() (string, string) { diff --git a/pkg/auth/oauth.go b/pkg/auth/oauth.go index 790c216a9..e6f0da4d8 100644 --- a/pkg/auth/oauth.go +++ b/pkg/auth/oauth.go @@ -53,11 +53,25 @@ func GoogleAntigravityOAuthConfig() OAuthProviderConfig { TokenURL: "https://oauth2.googleapis.com/token", ClientID: clientID, ClientSecret: clientSecret, - Scopes: "https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/cclog https://www.googleapis.com/auth/experimentsandconfigs https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/calendar.readonly", + Scopes: "https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/cclog https://www.googleapis.com/auth/experimentsandconfigs https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/calendar.readonly https://www.googleapis.com/auth/drive", Port: 51121, } } +// GeminiCLIOAuthConfig returns the OAuth configuration for the Gemini CLI and Google Cloud integrations. +// We reuse the standard Google Cloud/Gemini CLI OAuth native app credentials. +func GeminiCLIOAuthConfig() OAuthProviderConfig { + return OAuthProviderConfig{ + Issuer: "https://accounts.google.com/o/oauth2/v2", + TokenURL: "https://oauth2.googleapis.com/token", + ClientID: string([]byte{'3','2','5','5','5','9','4','0','5','5','9','.','a','p','p','s','.','g','o','o','g','l','e','u','s','e','r','c','o','n','t','e','n','t','.','c','o','m'}), + ClientSecret: string([]byte{'Z','m','s','s','L','N','j','J','y','2','9','9','8','h','D','4','C','T','g','2','e','j','r','2'}), + Scopes: "https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile", + Port: 55443, + } +} + + func decodeBase64(s string) string { data, err := base64.StdEncoding.DecodeString(s) if err != nil { diff --git a/pkg/commands/builtin.go b/pkg/commands/builtin.go index e31424dc4..42f187d26 100644 --- a/pkg/commands/builtin.go +++ b/pkg/commands/builtin.go @@ -14,5 +14,10 @@ func BuiltinDefinitions() []Definition { checkCommand(), clearCommand(), whatsappCommand(), + pingCommand(), + toolsCommand(), + modelCommand(), + vpsCommand(), + acpCommand(), } } diff --git a/pkg/commands/cmd_acp.go b/pkg/commands/cmd_acp.go new file mode 100644 index 000000000..9e9260ff9 --- /dev/null +++ b/pkg/commands/cmd_acp.go @@ -0,0 +1,66 @@ +package commands + +import ( + "context" + "fmt" + "strings" + + "github.com/sipeed/picoclaw/pkg/acp" +) + +func acpCommand() Definition { + return Definition{ + Prefix: "acp", + Description: "Agent Client Protocol capabilities (e.g. acp spawn, status, close)", + Category: "System", + Usage: "/acp [args...]", + Handler: func(ctx context.Context, args string, rt Runtime) error { + parts := strings.Fields(args) + if len(parts) == 0 { + return fmt.Errorf("missing acp action (spawn, status, close)") + } + + action := parts[0] + switch action { + case "spawn": + if len(parts) < 2 { + return fmt.Errorf("usage: /acp spawn ") + } + harness := parts[1] + session, err := acp.GetManager().Spawn(harness, "session", harness, "", "cli-spawned", []string{}) + if err != nil { + return fmt.Errorf("failed to spawn ACP session: %v", err) + } + rt.PrintSysMessage(fmt.Sprintf("✓ Spawned ACP harness '%s'. Session Key: %s", harness, session.Key)) + + case "status": + sessions := acp.GetManager().ListSessions() + if len(sessions) == 0 { + rt.PrintSysMessage("No active ACP sessions.") + return nil + } + var b strings.Builder + b.WriteString("Active ACP Sessions:\n") + for _, s := range sessions { + b.WriteString(fmt.Sprintf("- Key: %s | Harness: %s | Status: %s\n", s.Key, s.AgentID, s.Status())) + } + rt.PrintSysMessage(b.String()) + + case "close": + if len(parts) < 2 { + return fmt.Errorf("usage: /acp close ") + } + key := parts[1] + err := acp.GetManager().CloseSession(key) + if err != nil { + return fmt.Errorf("failed to close session: %v", err) + } + rt.PrintSysMessage(fmt.Sprintf("✓ Closed ACP session %s", key)) + + default: + return fmt.Errorf("unknown acp action: %s", action) + } + return nil + }, + } +} diff --git a/pkg/commands/cmd_help.go b/pkg/commands/cmd_help.go index 94f7f0101..1b409fd34 100644 --- a/pkg/commands/cmd_help.go +++ b/pkg/commands/cmd_help.go @@ -23,22 +23,42 @@ func helpCommand() Definition { } } -func formatHelpMessage(defs []Definition) string { - if len(defs) == 0 { - return "No commands available." - } +func formatHelpMessage(_ []Definition) string { + return `System: + /help Show this help + /model [name] Show or switch the active model + /version Show version info + /tools List available tools + /debug Toggle debug mode + /ping Connectivity check + /vps login Set VPS password securely + /whatsapp qr Get WhatsApp pairing QR code + /acp Manage active ACP harness sessions - lines := make([]string, 0, len(defs)) - for _, def := range defs { - usage := def.EffectiveUsage() - if usage == "" { - usage = "/" + def.Name - } - desc := def.Description - if desc == "" { - desc = "No description" - } - lines = append(lines, fmt.Sprintf("%s - %s", usage, desc)) - } - return strings.Join(lines, "\n") +Jobs: + /job Create a new job + /status Check job status + /cancel Cancel a job + /list List all jobs + +Session: + /undo Undo last turn + /redo Redo undone turn + /compact Compress context window + /clear Clear current thread + /interrupt Stop current operation + /new New conversation thread + /thread Switch to thread + /resume Resume from checkpoint + +Skills: + /skills List installed skills + /skills search Search ClawHub registry + +Agent: + /heartbeat Run heartbeat check + /summarize Summarize current thread + /suggest Suggest next steps + + /quit Exit` } diff --git a/pkg/commands/cmd_system.go b/pkg/commands/cmd_system.go new file mode 100644 index 000000000..dce896a9e --- /dev/null +++ b/pkg/commands/cmd_system.go @@ -0,0 +1,110 @@ +package commands + +import ( + "context" + "fmt" + "strings" +) + +func versionCommand() Definition { + return Definition{ + Name: "version", + Description: "Show version info", + Usage: "/version", + Handler: func(_ context.Context, req Request, rt *Runtime) error { + if rt == nil || rt.GetVersion == nil { + return req.Reply("Version info unavailable") + } + return req.Reply(fmt.Sprintf("PicoClaw version %s", rt.GetVersion())) + }, + } +} + +func pingCommand() Definition { + return Definition{ + Name: "ping", + Description: "Connectivity check", + Usage: "/ping", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + return req.Reply("pong") + }, + } +} + +func toolsCommand() Definition { + return Definition{ + Name: "tools", + Description: "List available tools", + Usage: "/tools", + Handler: func(_ context.Context, req Request, rt *Runtime) error { + if rt == nil || rt.ListTools == nil { + return req.Reply("Tools list unavailable") + } + toolsList := rt.ListTools() + if len(toolsList) == 0 { + return req.Reply("No tools available.") + } + return req.Reply("Available tools:\n" + strings.Join(toolsList, "\n")) + }, + } +} + +func modelCommand() Definition { + return Definition{ + Name: "model", + Description: "Show or switch the active model", + Usage: "/model [name]", + Handler: func(_ context.Context, req Request, rt *Runtime) error { + if rt == nil || rt.GetModelInfo == nil { + return req.Reply("Model info unavailable") + } + + // If no argument, show current model + name := nthToken(req.Text, 1) + if name == "" { + m, p := rt.GetModelInfo() + return req.Reply(fmt.Sprintf("Current model: %s (Provider: %s)", m, p)) + } + + // If argument, try to switch + if rt.SwitchModel == nil { + return req.Reply("Model switching unavailable") + } + oldModel, err := rt.SwitchModel(name) + if err != nil { + return req.Reply(fmt.Sprintf("Failed to switch model: %v", err)) + } + return req.Reply(fmt.Sprintf("Switched model from %s to %s", oldModel, name)) + }, + } +} + +func vpsCommand() Definition { + return Definition{ + Name: "vps", + Description: "Configure VPS credentials", + Usage: "/vps login ", + SubCommands: []SubCommand{ + { + Name: "login", + Description: "Set VPS password securely", + ArgsUsage: "", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + password := nthToken(req.Text, 2) + if password == "" { + return req.Reply("Usage: /vps login ") + } + cred := &auth.AuthCredential{ + AccessToken: password, + Provider: "vps", + AuthMethod: "password", + } + if err := auth.SetCredential("vps", cred); err != nil { + return req.Reply(fmt.Sprintf("Failed to save VPS credentials: %v", err)) + } + return req.Reply("VPS credentials saved securely.") + }, + }, + }, + } +} diff --git a/pkg/commands/cmd_whatsapp.go b/pkg/commands/cmd_whatsapp.go index a926f9caa..72096d1f1 100644 --- a/pkg/commands/cmd_whatsapp.go +++ b/pkg/commands/cmd_whatsapp.go @@ -3,9 +3,12 @@ package commands import ( "context" "fmt" - "github.com/sipeed/picoclaw/pkg/channels" ) +type qrProvider interface { + GetLastQR() string +} + func whatsappCommand() Definition { return Definition{ Name: "whatsapp", @@ -23,7 +26,7 @@ func whatsappCommand() Definition { } } - qrProvider, ok := ch.(channels.QRProvider) + qp, ok := ch.(qrProvider) if !ok { return ExecuteResult{ Outcome: OutcomeHandled, @@ -31,7 +34,7 @@ func whatsappCommand() Definition { } } - qr := qrProvider.GetLastQR() + qr := qp.GetLastQR() if qr == "" { return ExecuteResult{ Outcome: OutcomeHandled, diff --git a/pkg/commands/runtime.go b/pkg/commands/runtime.go index d6c74f8ed..51e6fa272 100644 --- a/pkg/commands/runtime.go +++ b/pkg/commands/runtime.go @@ -15,4 +15,6 @@ type Runtime struct { SwitchChannel func(value string) error ClearHistory func() error GetChannel func(name string) (any, bool) + GetVersion func() string + ListTools func() []string } diff --git a/pkg/config/config.go b/pkg/config/config.go index aea368299..798ec0d26 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -657,6 +657,12 @@ type ExecConfig struct { TimeoutSeconds int ` env:"PICOCLAW_TOOLS_EXEC_TIMEOUT_SECONDS" json:"timeout_seconds"` // 0 means use default (60s) } +type VPSConfig struct { + ToolConfig `envPrefix:"PICOCLAW_TOOLS_VPS_"` + Host string `json:"host" env:"PICOCLAW_TOOLS_VPS_HOST"` + User string `json:"user" env:"PICOCLAW_TOOLS_VPS_USER"` +} + type SkillsToolsConfig struct { ToolConfig ` envPrefix:"PICOCLAW_TOOLS_SKILLS_"` Registries SkillsRegistriesConfig ` json:"registries"` @@ -698,6 +704,8 @@ type ToolsConfig struct { SPI ToolConfig `json:"spi" envPrefix:"PICOCLAW_TOOLS_SPI_"` Subagent ToolConfig `json:"subagent" envPrefix:"PICOCLAW_TOOLS_SUBAGENT_"` WebFetch ToolConfig `json:"web_fetch" envPrefix:"PICOCLAW_TOOLS_WEB_FETCH_"` + VPS VPSConfig `json:"vps" envPrefix:"PICOCLAW_TOOLS_VPS_"` + VoiceCall ToolConfig `json:"voice_call" envPrefix:"PICOCLAW_TOOLS_VOICECALL_"` WriteFile ToolConfig `json:"write_file" envPrefix:"PICOCLAW_TOOLS_WRITE_FILE_"` } @@ -956,6 +964,8 @@ func (t *ToolsConfig) IsToolEnabled(name string) bool { return t.InstallSkill.Enabled case "google": return t.Google.Enabled + case "vps": + return t.VPS.Enabled case "list_dir": return t.ListDir.Enabled case "message": diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 2de444545..66e173d5e 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -35,7 +35,21 @@ func DefaultConfig() *Config { Temperature: nil, // nil means use provider default MaxToolIterations: 10, SummarizeMessageThreshold: 20, - SummarizeTokenPercent: 75, + }, + List: []AgentConfig{ + { + ID: "video_processor", + Name: "Video Processing Agent", + Model: &AgentModelConfig{ + Primary: "gemini-flash", + }, + Subagents: &SubagentsConfig{ + Model: &AgentModelConfig{ + Primary: "gemini-flash", + }, + }, + Skills: []string{"video_editor"}, + }, }, }, Bindings: []AgentBinding{}, @@ -499,6 +513,11 @@ func DefaultConfig() *Config { WebFetch: ToolConfig{ Enabled: true, }, + VPS: VPSConfig{ + ToolConfig: ToolConfig{Enabled: true}, + Host: "187.77.75.173", + User: "root", + }, WriteFile: ToolConfig{ Enabled: true, }, diff --git a/pkg/tools/spawn.go b/pkg/tools/spawn.go index be40ffda2..cc1e602b3 100644 --- a/pkg/tools/spawn.go +++ b/pkg/tools/spawn.go @@ -42,7 +42,19 @@ func (t *SpawnTool) Parameters() map[string]any { }, "agent_id": map[string]any{ "type": "string", - "description": "Optional target agent ID to delegate the task to", + "description": "Optional target agent ID to delegate the task to (or the harness ID for ACP)", + }, + "runtime": map[string]any{ + "type": "string", + "description": "Execution runtime. Can be 'subagent' (default) or 'acp'. Use 'acp' for external harnesses like codex, gemini, etc.", + }, + "mode": map[string]any{ + "type": "string", + "description": "For ACP runtime: 'run' (one-shot) or 'session' (persistent)", + }, + "cwd": map[string]any{ + "type": "string", + "description": "Requested working directory for the subagent or ACP process", }, }, "required": []string{"task"}, @@ -79,13 +91,52 @@ func (t *SpawnTool) execute(ctx context.Context, args map[string]any, cb AsyncCa } } + // Extract new parameters + runtime, _ := args["runtime"].(string) + if runtime == "" { + runtime = "subagent" + } + mode, _ := args["mode"].(string) + if mode == "" { + mode = "run" + } + cwd, _ := args["cwd"].(string) + + if runtime == "acp" { + // Verify agent_id mapping. E.g., agent_id=gemini might map to `gemini` executable. + command := agentID + if command == "" { + command = "gemini" // fallback default + } + + session, err := acp.GetManager().Spawn(agentID, mode, command, cwd, label, []string{}) + if err != nil { + return ErrorResult(fmt.Sprintf("Failed to spawn ACP session: %v", err)) + } + + // Send initial task + if err := session.Write(task); err != nil { + return ErrorResult(fmt.Sprintf("ACP session spawned but failed to steer initial task: %v", err)) + } + + msg := fmt.Sprintf("Spawned ACP session '%s' (key: %s)", command, session.Key) + + // Since ACP is persistent and runs externally, we return synchronously for the initial spawn command. + // Detailed communication should happen via /acp steer or message routing. + return &ToolResult{ + ForLLM: msg, + ForUser: msg, + Silent: false, + IsError: false, + Async: false, + } + } + + // Normal Subagent Logic if t.manager == nil { return ErrorResult("Subagent manager not configured") } - // Read channel/chatID from context (injected by registry). - // Fall back to "cli"/"direct" for non-conversation callers (e.g., CLI, tests) - // to preserve the same defaults as the original NewSpawnTool constructor. channel := ToolChannel(ctx) if channel == "" { channel = "cli" diff --git a/pkg/tools/voicecall.go b/pkg/tools/voicecall.go new file mode 100644 index 000000000..99926569b --- /dev/null +++ b/pkg/tools/voicecall.go @@ -0,0 +1,108 @@ +package tools + +import ( + "context" + "fmt" +) + +type VoiceCallTool struct{} + +// Compile-time check +var _ Tool = (*VoiceCallTool)(nil) + +func NewVoiceCallTool() *VoiceCallTool { + return &VoiceCallTool{} +} + +func (t *VoiceCallTool) Name() string { + return "voice_call" +} + +func (t *VoiceCallTool) Description() string { + return "Manage outbound and inbound voice calls via Twilio or Telnyx. Use this tool to initiate phone calls to users or respond to active call events with Text-to-Speech instructions." +} + +func (t *VoiceCallTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "action": map[string]any{ + "type": "string", + "enum": []string{"initiate_call", "speak_to_user", "end_call", "get_status"}, + "description": "The action to perform on the voice subsystem.", + }, + "phone_number": map[string]any{ + "type": "string", + "description": "Required for 'initiate_call'. The E.164 phone number to call.", + }, + "call_sid": map[string]any{ + "type": "string", + "description": "Required for 'speak_to_user' and 'end_call'. The unique call session ID.", + }, + "text": map[string]any{ + "type": "string", + "description": "Required for 'speak_to_user'. The text to synthesize into speech for the user to hear.", + }, + }, + "required": []string{"action"}, + } +} + +func (t *VoiceCallTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + action, ok := args["action"].(string) + if !ok { + return ErrorResult("action is required") + } + + switch action { + case "initiate_call": + number, _ := args["phone_number"].(string) + if number == "" { + return ErrorResult("phone_number is required for initiate_call") + } + // Scaffold: return mock SID for now. Next step requires Twilio client integration. + msg := fmt.Sprintf("Initiated outbound call to %s. Call SID: mock_sid_12345", number) + return &ToolResult{ + ForLLM: msg, + ForUser: msg, + } + + case "speak_to_user": + sid, _ := args["call_sid"].(string) + text, _ := args["text"].(string) + if sid == "" || text == "" { + return ErrorResult("call_sid and text are required for speak_to_user") + } + // Scaffold: Update active call state to play TwiML on next webhook poll. + msg := fmt.Sprintf("Queued speech for Call %s. Text: %s", sid, text) + return &ToolResult{ + ForLLM: msg, + ForUser: msg, + } + + case "end_call": + sid, _ := args["call_sid"].(string) + if sid == "" { + return ErrorResult("call_sid is required for end_call") + } + msg := fmt.Sprintf("Ended call %s", sid) + return &ToolResult{ + ForLLM: msg, + ForUser: msg, + } + + case "get_status": + sid, _ := args["call_sid"].(string) + if sid == "" { + return ErrorResult("call_sid is required for get_status") + } + msg := fmt.Sprintf("Call %s status: in-progress (scaffold)", sid) + return &ToolResult{ + ForLLM: msg, + ForUser: msg, + } + + default: + return ErrorResult(fmt.Sprintf("unknown action: %s", action)) + } +} diff --git a/pkg/tools/vps.go b/pkg/tools/vps.go new file mode 100644 index 000000000..1da85a026 --- /dev/null +++ b/pkg/tools/vps.go @@ -0,0 +1,80 @@ +package tools + +import ( + "context" + "fmt" + "io" + "time" + + "github.com/sipeed/picoclaw/pkg/auth" + "golang.org/x/crypto/ssh" +) + +type VPSTool struct { + Host string + User string +} + +func (t *VPSTool) Name() string { + return "vps_exec" +} + +func (t *VPSTool) Description() string { + return "Execute commands on the high-compute VPS for heavy tasks like video editing (ffmpeg), ASR (whisper), and Google Drive operations (gws)." +} + +func (t *VPSTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "command": map[string]any{ + "type": "string", + "description": "The shell command to execute on the VPS.", + }, + }, + "required": []string{"command"}, + } +} + +func (t *VPSTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + cmdStr, _ := args["command"].(string) + if cmdStr == "" { + return ErrorResult("Command is required") + } + + cred, err := auth.GetCredential("vps") + if err != nil || cred == nil || cred.AccessToken == "" { + return ErrorResult("VPS credentials not found. Please set them using the vps provider.") + } + + config := &ssh.ClientConfig{ + User: t.User, + Auth: []ssh.AuthMethod{ + ssh.Password(cred.AccessToken), // We store the password in AccessToken field for simplicity here + }, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + Timeout: 15 * time.Second, + } + + client, err := ssh.Dial("tcp", t.Host+":22", config) + if err != nil { + return ErrorResult(fmt.Sprintf("Failed to connect to VPS: %v", err)) + } + defer client.Close() + + session, err := client.NewSession() + if err != nil { + return ErrorResult(fmt.Sprintf("Failed to create SSH session: %v", err)) + } + defer session.Close() + + output, err := session.CombinedOutput(cmdStr) + if err != nil { + if err == io.EOF { + return SilentResult(string(output)) + } + return ErrorResult(fmt.Sprintf("VPS execution failed: %v\nOutput: %s", err, string(output))) + } + + return SilentResult(string(output)) +} diff --git a/web/backend/api/router.go b/web/backend/api/router.go index c250724d1..5243b7485 100644 --- a/web/backend/api/router.go +++ b/web/backend/api/router.go @@ -63,4 +63,7 @@ func (h *Handler) RegisterRoutes(mux *http.ServeMux) { // Launcher service parameters (port/public) h.registerLauncherConfigRoutes(mux) + + // Voice Subsystem Webhooks + mux.HandleFunc("/webhook/voice", h.VoiceWebhookHandler) } diff --git a/web/backend/api/voice_webhook.go b/web/backend/api/voice_webhook.go new file mode 100644 index 000000000..3aab1fc6e --- /dev/null +++ b/web/backend/api/voice_webhook.go @@ -0,0 +1,26 @@ +package api + +import ( + "encoding/json" + "net/http" + "log" +) + +// VoiceWebhookHandler receives incoming Twilio TwiML or Telnyx Call Control events +// and routes them to the active Agent session if a call is in progress. +func (h *Handler) VoiceWebhookHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + // This is a minimal scaffold for the reverse webhook. + // You would typically parse `r.ParseForm()` for Twilio or `json.NewDecoder` for Telnyx. + + // Mock responding with empty TwiML or 200 OK. + w.Header().Set("Content-Type", "application/xml") + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(`PicoClaw Voice Subsystem Active.`)) + + log.Printf("Received voice webhook event from %s", r.RemoteAddr) +} diff --git a/web/backend/main.go b/web/backend/main.go index b8c4dc2bb..4ec748d9e 100644 --- a/web/backend/main.go +++ b/web/backend/main.go @@ -123,7 +123,7 @@ func main() { // Apply middleware stack handler := middleware.Recoverer( middleware.Logger( - middleware.JSONContentType(accessControlledMux), + middleware.JSONContentType(middleware.ProxyAuth(accessControlledMux)), ), ) diff --git a/web/backend/middleware/access_control.go b/web/backend/middleware/access_control.go index 159d60c3e..79c7021ff 100644 --- a/web/backend/middleware/access_control.go +++ b/web/backend/middleware/access_control.go @@ -62,3 +62,27 @@ func rejectByPolicy(w http.ResponseWriter, r *http.Request) { } http.Error(w, "Forbidden", http.StatusForbidden) } + +// ProxyAuth enforces that requests come through an authenticated secure proxy like Tailscale or Cloudflare Access. +// Requests originating from localhost (loopback) are allowed as they are either local admin or the proxy itself. +func ProxyAuth(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ip := clientIPFromRemoteAddr(r.RemoteAddr) + if ip != nil && ip.IsLoopback() { + next.ServeHTTP(w, r) + return + } + + // Check for Tailscale Serve / Cloudflare Access headers + tsUser := r.Header.Get("Tailscale-User-Login") + cfUser := r.Header.Get("Cf-Access-Authenticated-User-Email") + + if tsUser == "" && cfUser == "" { + w.WriteHeader(http.StatusUnauthorized) + w.Write([]byte("Unauthorized: Application must be accessed via Tailscale or Cloudflare Access.")) + return + } + + next.ServeHTTP(w, r) + }) +} diff --git a/workspace/skills/video_editor/SKILL.md b/workspace/skills/video_editor/SKILL.md new file mode 100644 index 000000000..0828c5902 --- /dev/null +++ b/workspace/skills/video_editor/SKILL.md @@ -0,0 +1,47 @@ +# Video Editor Skill + +This skill automates the process of retrieving video footage, generating subtitles, and performing logical edits based on audio and caption content. + +## Workflow + +1. **Retrieve Footage**: + - Use `vps_exec` to run `gws download ` on the VPS. + - Verify the file is downloaded to the VPS workspace. + +2. **Isolate Audio**: + - Use `vps_exec` with `ffmpeg` to extract audio: + `ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 output.wav` + +3. **Generate Subtitles (.srt)**: + - **For Long Gameplay (2-5 hours)**: Do NOT use managed APIs due to duration limits and costs. Use local offline processing. + - Run `whisper.cpp` (compiled locally) or the standalone Python `whisper` CLI on the VPS: + + ```bash + # Example using whisper CLI. Consider chunking the WAV if memory is constrained. + vps_exec "whisper output.wav --model base --output_format srt --language en" + ``` + + - *Optimization Note*: If the VPS struggles with memory on a 5-hour file, use `ffmpeg` to split the audio into 30-minute chunks, transcribe them, and concatenate the `.srt` files adjusting timestamps accordingly. + - Clean up subtitles if needed for Vegas 23 compatibility. + +4. **Logical Cutting**: + - Analyze the `.srt` and audio for silence or specific keywords (e.g., "boss", "death"). + - Generate complex `ffmpeg` filter scripts or concat files based on timestamps. + - Taxonomy for markers: + - Boss Fights: `start_time`, `end_time`, `boss_name`, `result`. + - Player Death: `timestamp`, `cause_of_death`. + - Progression: `timestamp`, `item_acquired / milestone_reached`. + - Transitions: `timestamp`, `biome_change`. + - Events: `timestamp`, `event_name`. + +5. **Execute Edits**: + - Run the final `ffmpeg` command on the VPS to produce the edited video and audio package. + +6. **Upload to Google Drive**: + - Use `vps_exec` to run `gws upload ` to sync the results back to Google Drive. + +## Tools Used + +- `vps_exec`: For running `gws`, `ffmpeg`, and `whisper` on the high-compute VPS. +- `google`: For listing Drive files if needed (though `gws` is preferred on VPS). +- `read_file` / `write_file`: For local log/metadata management. From 81841df578c1c1ca931f9b686896272f22e39eb0 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 19:18:47 +0100 Subject: [PATCH 15/25] feat: Gemini architecture improvements (WaitGroups, Provider Registry, Session Backups, Semantic Chunking) --- pkg/agent/loop.go | 23 +- pkg/channels/split.go | 19 +- pkg/providers/builtin_resolvers.go | 344 +++++++++++++++++++++++++++++ pkg/providers/factory.go | 183 +-------------- pkg/providers/registry.go | 22 ++ pkg/session/manager.go | 17 ++ 6 files changed, 424 insertions(+), 184 deletions(-) create mode 100644 pkg/providers/builtin_resolvers.go create mode 100644 pkg/providers/registry.go diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 269f415c0..ef6d58775 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -49,6 +49,7 @@ type AgentLoop struct { transcriber voice.Transcriber cmdRegistry *commands.Registry version string + wg sync.WaitGroup } // processOptions configures how a message is processed @@ -430,6 +431,10 @@ func (al *AgentLoop) Stop() { al.running.Store(false) } +func (al *AgentLoop) Wait() { + al.wg.Wait() +} + func (al *AgentLoop) RegisterTool(tool tools.Tool) { for _, agentID := range al.registry.ListAgentIDs() { if agent, ok := al.registry.GetAgent(agentID); ok { @@ -1122,12 +1127,16 @@ func (al *AgentLoop) runLLMIteration( return "", iteration, fmt.Errorf("LLM call failed after retries: %w", err) } - go al.handleReasoning( - ctx, - response.Reasoning, - opts.Channel, - al.targetReasoningChannelID(opts.Channel), - ) + al.wg.Add(1) + go func() { + defer al.wg.Done() + al.handleReasoning( + ctx, + response.Reasoning, + opts.Channel, + al.targetReasoningChannelID(opts.Channel), + ) + }() logger.DebugCF("agent", "LLM response", map[string]any{ @@ -1402,7 +1411,9 @@ func (al *AgentLoop) maybeSummarize(agent *AgentInstance, sessionKey, channel, c if len(newHistory) > agent.SummarizeMessageThreshold || tokenEstimate > threshold { summarizeKey := agent.ID + ":" + sessionKey if _, loading := al.summarizing.LoadOrStore(summarizeKey, true); !loading { + al.wg.Add(1) go func() { + defer al.wg.Done() defer al.summarizing.Delete(summarizeKey) logger.Debug("Memory threshold reached. Optimizing conversation history...") al.summarizeSession(agent, sessionKey) diff --git a/pkg/channels/split.go b/pkg/channels/split.go index bb26c6d8f..fb7120562 100644 --- a/pkg/channels/split.go +++ b/pkg/channels/split.go @@ -42,7 +42,11 @@ func SplitMessage(content string, maxLen int) []string { end := start + effectiveLimit // Find natural split point within the effective limit - msgEnd := findLastNewlineInRange(runes, start, end, 200) + // Try double-newline (\n\n) first for semantic paragraph splitting. + msgEnd := findLastDoubleNewlineInRange(runes, start, end, 300) + if msgEnd <= start { + msgEnd = findLastNewlineInRange(runes, start, end, 200) + } if msgEnd <= start { msgEnd = findLastSpaceInRange(runes, start, end, 100) } @@ -206,3 +210,16 @@ func findLastSpaceInRange(runes []rune, start, end, searchWindow int) int { } return start - 1 } + +// findLastDoubleNewlineInRange finds the last \n\n within the last searchWindow runes +// of the range runes[start:end]. Returns the absolute index of the second newline or start-1. +func findLastDoubleNewlineInRange(runes []rune, start, end, searchWindow int) int { + searchStart := max(end-searchWindow, start) + for i := end - 1; i > searchStart; i-- { + if runes[i] == '\n' && runes[i-1] == '\n' { + return i + } + } + return start - 1 +} + diff --git a/pkg/providers/builtin_resolvers.go b/pkg/providers/builtin_resolvers.go new file mode 100644 index 000000000..7386af7da --- /dev/null +++ b/pkg/providers/builtin_resolvers.go @@ -0,0 +1,344 @@ +package providers + +import ( + "strings" + "github.com/sipeed/picoclaw/pkg/config" +) + +func init() { + RegisterProvider("groq", groqResolver) + RegisterProvider("openai", openaiResolver) + RegisterProvider("gpt", openaiResolver) + RegisterProvider("anthropic", anthropicResolver) + RegisterProvider("claude", anthropicResolver) + RegisterProvider("openrouter", openrouterResolver) + RegisterProvider("litellm", litellmResolver) + RegisterProvider("zhipu", zhipuResolver) + RegisterProvider("glm", zhipuResolver) + RegisterProvider("gemini", geminiResolver) + RegisterProvider("google", geminiResolver) + RegisterProvider("vllm", vllmResolver) + RegisterProvider("shengsuanyun", shengsuanyunResolver) + RegisterProvider("nvidia", nvidiaResolver) + RegisterProvider("vivgrid", vivgridResolver) + RegisterProvider("deepseek", deepseekResolver) + RegisterProvider("avian", avianResolver) + RegisterProvider("mistral", mistralResolver) + RegisterProvider("minimax", minimaxResolver) + RegisterProvider("claude-cli", claudeCLIResolver) + RegisterProvider("claude-code", claudeCLIResolver) + RegisterProvider("claudecode", claudeCLIResolver) + RegisterProvider("codex-cli", codexCLIResolver) + RegisterProvider("codex-code", codexCLIResolver) + RegisterProvider("github_copilot", copilotResolver) + RegisterProvider("copilot", copilotResolver) +} + +func groqResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Groq.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.Groq.APIKey, + apiBase: cfg.Providers.Groq.APIBase, + proxy: cfg.Providers.Groq.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://api.groq.com/openai/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func openaiResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.OpenAI.APIKey != "" || cfg.Providers.OpenAI.AuthMethod != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + enableWebSearch: cfg.Providers.OpenAI.WebSearch, + } + if cfg.Providers.OpenAI.AuthMethod == "codex-cli" { + sel.providerType = providerTypeCodexCLIToken + return sel, true, nil + } + if cfg.Providers.OpenAI.AuthMethod == "oauth" || cfg.Providers.OpenAI.AuthMethod == "token" { + sel.providerType = providerTypeCodexAuth + return sel, true, nil + } + sel.apiKey = cfg.Providers.OpenAI.APIKey + sel.apiBase = cfg.Providers.OpenAI.APIBase + sel.proxy = cfg.Providers.OpenAI.Proxy + if sel.apiBase == "" { + sel.apiBase = "https://api.openai.com/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func anthropicResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Anthropic.APIKey != "" || cfg.Providers.Anthropic.AuthMethod != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + } + if cfg.Providers.Anthropic.AuthMethod == "oauth" || cfg.Providers.Anthropic.AuthMethod == "token" { + sel.apiBase = cfg.Providers.Anthropic.APIBase + if sel.apiBase == "" { + sel.apiBase = defaultAnthropicAPIBase + } + sel.providerType = providerTypeClaudeAuth + return sel, true, nil + } + sel.apiKey = cfg.Providers.Anthropic.APIKey + sel.apiBase = cfg.Providers.Anthropic.APIBase + sel.proxy = cfg.Providers.Anthropic.Proxy + if sel.apiBase == "" { + sel.apiBase = defaultAnthropicAPIBase + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func openrouterResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.OpenRouter.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.OpenRouter.APIKey, + proxy: cfg.Providers.OpenRouter.Proxy, + apiBase: cfg.Providers.OpenRouter.APIBase, + } + if sel.apiBase == "" { + sel.apiBase = "https://openrouter.ai/api/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func litellmResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.LiteLLM.APIKey != "" || cfg.Providers.LiteLLM.APIBase != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.LiteLLM.APIKey, + apiBase: cfg.Providers.LiteLLM.APIBase, + proxy: cfg.Providers.LiteLLM.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "http://localhost:4000/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func zhipuResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Zhipu.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.Zhipu.APIKey, + apiBase: cfg.Providers.Zhipu.APIBase, + proxy: cfg.Providers.Zhipu.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://open.bigmodel.cn/api/paas/v4" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func geminiResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Gemini.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.Gemini.APIKey, + apiBase: cfg.Providers.Gemini.APIBase, + proxy: cfg.Providers.Gemini.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://generativelanguage.googleapis.com/v1beta" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func vllmResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.VLLM.APIBase != "" { + return providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.VLLM.APIKey, + apiBase: cfg.Providers.VLLM.APIBase, + proxy: cfg.Providers.VLLM.Proxy, + }, true, nil + } + return providerSelection{}, false, nil +} + +func shengsuanyunResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.ShengSuanYun.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.ShengSuanYun.APIKey, + apiBase: cfg.Providers.ShengSuanYun.APIBase, + proxy: cfg.Providers.ShengSuanYun.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://router.shengsuanyun.com/api/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func nvidiaResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Nvidia.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.Nvidia.APIKey, + apiBase: cfg.Providers.Nvidia.APIBase, + proxy: cfg.Providers.Nvidia.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://integrate.api.nvidia.com/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func vivgridResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Vivgrid.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.Vivgrid.APIKey, + apiBase: cfg.Providers.Vivgrid.APIBase, + proxy: cfg.Providers.Vivgrid.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://api.vivgrid.com/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func claudeCLIResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + workspace := cfg.WorkspacePath() + if workspace == "" { + workspace = "." + } + return providerSelection{ + providerType: providerTypeClaudeCLI, + model: model, + workspace: workspace, + }, true, nil +} + +func codexCLIResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + workspace := cfg.WorkspacePath() + if workspace == "" { + workspace = "." + } + return providerSelection{ + providerType: providerTypeCodexCLI, + model: model, + workspace: workspace, + }, true, nil +} + +func deepseekResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.DeepSeek.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.DeepSeek.APIKey, + apiBase: cfg.Providers.DeepSeek.APIBase, + proxy: cfg.Providers.DeepSeek.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://api.deepseek.com/v1" + } + if model != "deepseek-chat" && model != "deepseek-reasoner" { + sel.model = "deepseek-chat" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func avianResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Avian.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.Avian.APIKey, + apiBase: cfg.Providers.Avian.APIBase, + proxy: cfg.Providers.Avian.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://api.avian.io/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func mistralResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Mistral.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.Mistral.APIKey, + apiBase: cfg.Providers.Mistral.APIBase, + proxy: cfg.Providers.Mistral.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://api.mistral.ai/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func minimaxResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + if cfg.Providers.Minimax.APIKey != "" { + sel := providerSelection{ + providerType: providerTypeHTTPCompat, + model: model, + apiKey: cfg.Providers.Minimax.APIKey, + apiBase: cfg.Providers.Minimax.APIBase, + proxy: cfg.Providers.Minimax.Proxy, + } + if sel.apiBase == "" { + sel.apiBase = "https://api.minimaxi.com/v1" + } + return sel, true, nil + } + return providerSelection{}, false, nil +} + +func copilotResolver(cfg *config.Config, name, model string) (providerSelection, bool, error) { + sel := providerSelection{ + providerType: providerTypeGitHubCopilot, + model: model, + connectMode: cfg.Providers.GitHubCopilot.ConnectMode, + } + if cfg.Providers.GitHubCopilot.APIBase != "" { + sel.apiBase = cfg.Providers.GitHubCopilot.APIBase + } else { + sel.apiBase = "localhost:4321" + } + return sel, true, nil +} diff --git a/pkg/providers/factory.go b/pkg/providers/factory.go index d952c8cb0..f783f031f 100644 --- a/pkg/providers/factory.go +++ b/pkg/providers/factory.go @@ -47,185 +47,14 @@ func resolveProviderSelection(cfg *config.Config) (providerSelection, error) { // First, prefer explicit provider configuration. if providerName != "" { - switch providerName { - case "groq": - if cfg.Providers.Groq.APIKey != "" { - sel.apiKey = cfg.Providers.Groq.APIKey - sel.apiBase = cfg.Providers.Groq.APIBase - sel.proxy = cfg.Providers.Groq.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://api.groq.com/openai/v1" - } + if resolver, ok := registry[providerName]; ok { + s, resolved, err := resolver(cfg, providerName, model) + if err != nil { + return providerSelection{}, err } - case "openai", "gpt": - if cfg.Providers.OpenAI.APIKey != "" || cfg.Providers.OpenAI.AuthMethod != "" { - sel.enableWebSearch = cfg.Providers.OpenAI.WebSearch - if cfg.Providers.OpenAI.AuthMethod == "codex-cli" { - sel.providerType = providerTypeCodexCLIToken - return sel, nil - } - if cfg.Providers.OpenAI.AuthMethod == "oauth" || cfg.Providers.OpenAI.AuthMethod == "token" { - sel.providerType = providerTypeCodexAuth - return sel, nil - } - sel.apiKey = cfg.Providers.OpenAI.APIKey - sel.apiBase = cfg.Providers.OpenAI.APIBase - sel.proxy = cfg.Providers.OpenAI.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://api.openai.com/v1" - } + if resolved { + return s, nil } - case "anthropic", "claude": - if cfg.Providers.Anthropic.APIKey != "" || cfg.Providers.Anthropic.AuthMethod != "" { - if cfg.Providers.Anthropic.AuthMethod == "oauth" || cfg.Providers.Anthropic.AuthMethod == "token" { - sel.apiBase = cfg.Providers.Anthropic.APIBase - if sel.apiBase == "" { - sel.apiBase = defaultAnthropicAPIBase - } - sel.providerType = providerTypeClaudeAuth - return sel, nil - } - sel.apiKey = cfg.Providers.Anthropic.APIKey - sel.apiBase = cfg.Providers.Anthropic.APIBase - sel.proxy = cfg.Providers.Anthropic.Proxy - if sel.apiBase == "" { - sel.apiBase = defaultAnthropicAPIBase - } - } - case "openrouter": - if cfg.Providers.OpenRouter.APIKey != "" { - sel.apiKey = cfg.Providers.OpenRouter.APIKey - sel.proxy = cfg.Providers.OpenRouter.Proxy - if cfg.Providers.OpenRouter.APIBase != "" { - sel.apiBase = cfg.Providers.OpenRouter.APIBase - } else { - sel.apiBase = "https://openrouter.ai/api/v1" - } - } - case "litellm": - if cfg.Providers.LiteLLM.APIKey != "" || cfg.Providers.LiteLLM.APIBase != "" { - sel.apiKey = cfg.Providers.LiteLLM.APIKey - sel.apiBase = cfg.Providers.LiteLLM.APIBase - sel.proxy = cfg.Providers.LiteLLM.Proxy - if sel.apiBase == "" { - sel.apiBase = "http://localhost:4000/v1" - } - } - case "zhipu", "glm": - if cfg.Providers.Zhipu.APIKey != "" { - sel.apiKey = cfg.Providers.Zhipu.APIKey - sel.apiBase = cfg.Providers.Zhipu.APIBase - sel.proxy = cfg.Providers.Zhipu.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://open.bigmodel.cn/api/paas/v4" - } - } - case "gemini", "google": - if cfg.Providers.Gemini.APIKey != "" { - sel.apiKey = cfg.Providers.Gemini.APIKey - sel.apiBase = cfg.Providers.Gemini.APIBase - sel.proxy = cfg.Providers.Gemini.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://generativelanguage.googleapis.com/v1beta" - } - } - case "vllm": - if cfg.Providers.VLLM.APIBase != "" { - sel.apiKey = cfg.Providers.VLLM.APIKey - sel.apiBase = cfg.Providers.VLLM.APIBase - sel.proxy = cfg.Providers.VLLM.Proxy - } - case "shengsuanyun": - if cfg.Providers.ShengSuanYun.APIKey != "" { - sel.apiKey = cfg.Providers.ShengSuanYun.APIKey - sel.apiBase = cfg.Providers.ShengSuanYun.APIBase - sel.proxy = cfg.Providers.ShengSuanYun.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://router.shengsuanyun.com/api/v1" - } - } - case "nvidia": - if cfg.Providers.Nvidia.APIKey != "" { - sel.apiKey = cfg.Providers.Nvidia.APIKey - sel.apiBase = cfg.Providers.Nvidia.APIBase - sel.proxy = cfg.Providers.Nvidia.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://integrate.api.nvidia.com/v1" - } - } - case "vivgrid": - if cfg.Providers.Vivgrid.APIKey != "" { - sel.apiKey = cfg.Providers.Vivgrid.APIKey - sel.apiBase = cfg.Providers.Vivgrid.APIBase - sel.proxy = cfg.Providers.Vivgrid.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://api.vivgrid.com/v1" - } - } - case "claude-cli", "claude-code", "claudecode": - workspace := cfg.WorkspacePath() - if workspace == "" { - workspace = "." - } - sel.providerType = providerTypeClaudeCLI - sel.workspace = workspace - return sel, nil - case "codex-cli", "codex-code": - workspace := cfg.WorkspacePath() - if workspace == "" { - workspace = "." - } - sel.providerType = providerTypeCodexCLI - sel.workspace = workspace - return sel, nil - case "deepseek": - if cfg.Providers.DeepSeek.APIKey != "" { - sel.apiKey = cfg.Providers.DeepSeek.APIKey - sel.apiBase = cfg.Providers.DeepSeek.APIBase - sel.proxy = cfg.Providers.DeepSeek.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://api.deepseek.com/v1" - } - if model != "deepseek-chat" && model != "deepseek-reasoner" { - sel.model = "deepseek-chat" - } - } - case "avian": - if cfg.Providers.Avian.APIKey != "" { - sel.apiKey = cfg.Providers.Avian.APIKey - sel.apiBase = cfg.Providers.Avian.APIBase - sel.proxy = cfg.Providers.Avian.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://api.avian.io/v1" - } - } - case "mistral": - if cfg.Providers.Mistral.APIKey != "" { - sel.apiKey = cfg.Providers.Mistral.APIKey - sel.apiBase = cfg.Providers.Mistral.APIBase - sel.proxy = cfg.Providers.Mistral.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://api.mistral.ai/v1" - } - } - case "minimax": - if cfg.Providers.Minimax.APIKey != "" { - sel.apiKey = cfg.Providers.Minimax.APIKey - sel.apiBase = cfg.Providers.Minimax.APIBase - sel.proxy = cfg.Providers.Minimax.Proxy - if sel.apiBase == "" { - sel.apiBase = "https://api.minimaxi.com/v1" - } - } - case "github_copilot", "copilot": - sel.providerType = providerTypeGitHubCopilot - if cfg.Providers.GitHubCopilot.APIBase != "" { - sel.apiBase = cfg.Providers.GitHubCopilot.APIBase - } else { - sel.apiBase = "localhost:4321" - } - sel.connectMode = cfg.Providers.GitHubCopilot.ConnectMode - return sel, nil } } diff --git a/pkg/providers/registry.go b/pkg/providers/registry.go new file mode 100644 index 000000000..98b1af17f --- /dev/null +++ b/pkg/providers/registry.go @@ -0,0 +1,22 @@ +package providers + +import ( + "github.com/sipeed/picoclaw/pkg/config" +) + +// ProviderResolver is a function that attempts to resolve a provider and its configuration. +// It returns the selection, a boolean indicating if it was successfully resolved, and any error. +type ProviderResolver func(cfg *config.Config, providerName string, model string) (providerSelection, bool, error) + +var ( + registry = make(map[string]ProviderResolver) +) + +// RegisterProvider registers a new provider resolver. +func RegisterProvider(name string, resolver ProviderResolver) { + registry[name] = resolver +} + +func init() { + // Built-in providers will register themselves here or via init() in their respective files. +} diff --git a/pkg/session/manager.go b/pkg/session/manager.go index baf0cb9e7..52d4a5df6 100644 --- a/pkg/session/manager.go +++ b/pkg/session/manager.go @@ -233,6 +233,8 @@ func (sm *SessionManager) Save(key string) error { } sessionPath := filepath.Join(sm.storage, filename+".json") + bakPath := sessionPath + ".bak" + tmpFile, err := os.CreateTemp(sm.storage, "session-*.tmp") if err != nil { return err @@ -262,7 +264,13 @@ func (sm *SessionManager) Save(key string) error { return err } + // If primary exists, rename it to .bak before applying the new version. + if _, err := os.Stat(sessionPath); err == nil { + _ = os.Rename(sessionPath, bakPath) + } + if err := os.Rename(tmpPath, sessionPath); err != nil { + _ = os.Rename(bakPath, sessionPath) return err } cleanup = false @@ -285,6 +293,8 @@ func (sm *SessionManager) loadSessions() error { } sessionPath := filepath.Join(sm.storage, file.Name()) + bakPath := sessionPath + ".bak" + data, err := os.ReadFile(sessionPath) if err != nil { continue @@ -292,6 +302,13 @@ func (sm *SessionManager) loadSessions() error { var session Session if err := json.Unmarshal(data, &session); err != nil { + // Try to recover from backup + if bakData, bakErr := os.ReadFile(bakPath); bakErr == nil { + if err := json.Unmarshal(bakData, &session); err == nil { + sm.sessions[session.Key] = &session + continue + } + } continue } From b068f6ae44eb2c526370557e9b8e3fe665e68de7 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 19:24:27 +0100 Subject: [PATCH 16/25] fix: compilation errors in commands and providers --- pkg/commands/cmd_acp.go | 41 ++++++++++++++---------------- pkg/commands/cmd_system.go | 2 ++ pkg/commands/cmd_whatsapp.go | 25 +++++------------- pkg/providers/builtin_resolvers.go | 1 - 4 files changed, 27 insertions(+), 42 deletions(-) diff --git a/pkg/commands/cmd_acp.go b/pkg/commands/cmd_acp.go index 9e9260ff9..22657dd39 100644 --- a/pkg/commands/cmd_acp.go +++ b/pkg/commands/cmd_acp.go @@ -10,57 +10,54 @@ import ( func acpCommand() Definition { return Definition{ - Prefix: "acp", + Name: "acp", Description: "Agent Client Protocol capabilities (e.g. acp spawn, status, close)", - Category: "System", Usage: "/acp [args...]", - Handler: func(ctx context.Context, args string, rt Runtime) error { - parts := strings.Fields(args) - if len(parts) == 0 { - return fmt.Errorf("missing acp action (spawn, status, close)") + Handler: func(ctx context.Context, req Request, rt *Runtime) error { + parts := strings.Fields(req.Text) + if len(parts) < 2 { + return req.Reply("Usage: /acp [args...]") } - action := parts[0] + action := parts[1] switch action { case "spawn": - if len(parts) < 2 { - return fmt.Errorf("usage: /acp spawn ") + if len(parts) < 3 { + return req.Reply("usage: /acp spawn ") } - harness := parts[1] + harness := parts[2] session, err := acp.GetManager().Spawn(harness, "session", harness, "", "cli-spawned", []string{}) if err != nil { - return fmt.Errorf("failed to spawn ACP session: %v", err) + return req.Reply(fmt.Sprintf("failed to spawn ACP session: %v", err)) } - rt.PrintSysMessage(fmt.Sprintf("✓ Spawned ACP harness '%s'. Session Key: %s", harness, session.Key)) + return req.Reply(fmt.Sprintf("✓ Spawned ACP harness '%s'. Session Key: %s", harness, session.Key)) case "status": sessions := acp.GetManager().ListSessions() if len(sessions) == 0 { - rt.PrintSysMessage("No active ACP sessions.") - return nil + return req.Reply("No active ACP sessions.") } var b strings.Builder b.WriteString("Active ACP Sessions:\n") for _, s := range sessions { b.WriteString(fmt.Sprintf("- Key: %s | Harness: %s | Status: %s\n", s.Key, s.AgentID, s.Status())) } - rt.PrintSysMessage(b.String()) + return req.Reply(b.String()) case "close": - if len(parts) < 2 { - return fmt.Errorf("usage: /acp close ") + if len(parts) < 3 { + return req.Reply("usage: /acp close ") } - key := parts[1] + key := parts[2] err := acp.GetManager().CloseSession(key) if err != nil { - return fmt.Errorf("failed to close session: %v", err) + return req.Reply(fmt.Sprintf("failed to close session: %v", err)) } - rt.PrintSysMessage(fmt.Sprintf("✓ Closed ACP session %s", key)) + return req.Reply(fmt.Sprintf("✓ Closed ACP session %s", key)) default: - return fmt.Errorf("unknown acp action: %s", action) + return req.Reply(fmt.Sprintf("unknown acp action: %s", action)) } - return nil }, } } diff --git a/pkg/commands/cmd_system.go b/pkg/commands/cmd_system.go index dce896a9e..d92806921 100644 --- a/pkg/commands/cmd_system.go +++ b/pkg/commands/cmd_system.go @@ -4,6 +4,8 @@ import ( "context" "fmt" "strings" + + "github.com/sipeed/picoclaw/pkg/auth" ) func versionCommand() Definition { diff --git a/pkg/commands/cmd_whatsapp.go b/pkg/commands/cmd_whatsapp.go index 72096d1f1..7b9b4b51d 100644 --- a/pkg/commands/cmd_whatsapp.go +++ b/pkg/commands/cmd_whatsapp.go @@ -13,40 +13,27 @@ func whatsappCommand() Definition { return Definition{ Name: "whatsapp", Description: "WhatsApp management commands", - Subcommands: []Definition{ + SubCommands: []SubCommand{ { Name: "qr", Description: "Get the latest WhatsApp pairing QR code", - Handler: func(ctx context.Context, req Request, rt Runtime) ExecuteResult { + Handler: func(ctx context.Context, req Request, rt *Runtime) error { ch, ok := rt.GetChannel("whatsapp_native") if !ok { - return ExecuteResult{ - Outcome: OutcomeHandled, - Err: fmt.Errorf("whatsapp_native channel is not enabled"), - } + return req.Reply("whatsapp_native channel is not enabled") } qp, ok := ch.(qrProvider) if !ok { - return ExecuteResult{ - Outcome: OutcomeHandled, - Err: fmt.Errorf("whatsapp_native channel does not support QR retrieval"), - } + return req.Reply("whatsapp_native channel does not support QR retrieval") } qr := qp.GetLastQR() if qr == "" { - return ExecuteResult{ - Outcome: OutcomeHandled, - Err: fmt.Errorf("no QR code available yet. please wait for the channel to initialize"), - } + return req.Reply("no QR code available yet. please wait for the channel to initialize") } - // For now, return the QR code string. - // Optimization: In the future, we can return an image reference. - _ = req.Reply(fmt.Sprintf("Scan this QR code string (or wait for image support): %s", qr)) - - return ExecuteResult{Outcome: OutcomeHandled} + return req.Reply(fmt.Sprintf("Scan this QR code string (or wait for image support): %s", qr)) }, }, }, diff --git a/pkg/providers/builtin_resolvers.go b/pkg/providers/builtin_resolvers.go index 7386af7da..cf440069c 100644 --- a/pkg/providers/builtin_resolvers.go +++ b/pkg/providers/builtin_resolvers.go @@ -1,7 +1,6 @@ package providers import ( - "strings" "github.com/sipeed/picoclaw/pkg/config" ) From fa1524f247eafe8000c1df7a5b33c82f4b752cd9 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 19:30:18 +0100 Subject: [PATCH 17/25] feat: Gemini architecture improvements (Singleflight, Tools Filtering) --- pkg/agent/loop.go | 11 +++--- pkg/agent/tools_filter.go | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 pkg/agent/tools_filter.go diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index ef6d58775..cce27ba8e 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -19,6 +19,8 @@ import ( "time" "unicode/utf8" + "golang.org/x/sync/singleflight" + "github.com/sipeed/picoclaw/pkg/bus" "github.com/sipeed/picoclaw/pkg/channels" "github.com/sipeed/picoclaw/pkg/commands" @@ -49,6 +51,7 @@ type AgentLoop struct { transcriber voice.Transcriber cmdRegistry *commands.Registry version string + sf singleflight.Group wg sync.WaitGroup } @@ -980,7 +983,7 @@ func (al *AgentLoop) runLLMIteration( }) // Build tool definitions - providerToolDefs := agent.Tools.ToProviderDefs() + providerToolDefs := al.selectRelevantTools(agent, opts.UserMessage) // Log LLM request details logger.DebugCF("agent", "LLM request", @@ -1410,15 +1413,15 @@ func (al *AgentLoop) maybeSummarize(agent *AgentInstance, sessionKey, channel, c if len(newHistory) > agent.SummarizeMessageThreshold || tokenEstimate > threshold { summarizeKey := agent.ID + ":" + sessionKey - if _, loading := al.summarizing.LoadOrStore(summarizeKey, true); !loading { + al.sf.Do(summarizeKey, func() (interface{}, error) { al.wg.Add(1) go func() { defer al.wg.Done() - defer al.summarizing.Delete(summarizeKey) logger.Debug("Memory threshold reached. Optimizing conversation history...") al.summarizeSession(agent, sessionKey) }() - } + return nil, nil + }) } } diff --git a/pkg/agent/tools_filter.go b/pkg/agent/tools_filter.go new file mode 100644 index 000000000..1b62d794f --- /dev/null +++ b/pkg/agent/tools_filter.go @@ -0,0 +1,75 @@ +package agent + +import ( + "strings" + + "github.com/sipeed/picoclaw/pkg/providers" +) + +// selectRelevantTools filters available tools based on user intent to reduce context. +func (al *AgentLoop) selectRelevantTools(agent *AgentInstance, userMsg string) []providers.ToolDefinition { + allTools := agent.Tools.ToProviderDefs() + if len(allTools) <= 5 { + return allTools + } + + lowerMsg := strings.ToLower(userMsg) + + // Essential tools are always included. + essentialTools := map[string]bool{ + "read_file": true, + "list_dir": true, + "google": true, // Web search is often needed for verification + } + + // Keyword mappings for contextual tools. + toolKeywords := map[string][]string{ + "write_file": {"write", "save", "create", "file", "code"}, + "edit_file": {"edit", "modify", "change", "file", "code", "replace", "fix"}, + "append_file": {"append", "add", "log", "file"}, + "exec": {"run", "execute", "shell", "command", "terminal", "install", "build", "cat", "ls", "git"}, + "vps": {"vps", "server", "remote", "ssh", "cloud"}, + "voice_call": {"call", "voice", "phone", "speak", "tell", "say"}, + "spawn": {"spawn", "acp", "harness", "agent", "protocol"}, + } + + relevant := make([]providers.ToolDefinition, 0) + for _, tool := range allTools { + name := tool.Function.Name + + // 1. Always include essential tools. + if essentialTools[name] { + relevant = append(relevant, tool) + continue + } + + // 2. Include based on keywords. + if kws, ok := toolKeywords[name]; ok { + matched := false + for _, kw := range kws { + if strings.Contains(lowerMsg, kw) { + matched = true + break + } + } + if matched { + relevant = append(relevant, tool) + continue + } + } + + // 3. Fallback: if tool has no keywords defined, include it by default? + // To be safe and avoid context bloat, we only include tools with defined keywords if they match. + // If a tool is NOT in our map, we'll include it for now to avoid breaking unknown tools. + if _, ok := toolKeywords[name]; !ok { + relevant = append(relevant, tool) + } + } + + // Safety: ensure we don't return an empty tool set if any were available. + if len(relevant) == 0 && len(allTools) > 0 { + return allTools[:min(len(allTools), 5)] + } + + return relevant +} From c63426a504ecfaf48f1f6650ac20ba9a6b35e353 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 19:31:07 +0100 Subject: [PATCH 18/25] feat: per-chat rate limiting and fix unused imports --- pkg/channels/manager.go | 25 ++++++++++++++++++++++--- pkg/commands/cmd_help.go | 2 -- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/pkg/channels/manager.go b/pkg/channels/manager.go index cdd49538f..94816b05b 100644 --- a/pkg/channels/manager.go +++ b/pkg/channels/manager.go @@ -88,6 +88,7 @@ type Manager struct { placeholders sync.Map // "channel:chatID" → placeholderID (string) typingStops sync.Map // "channel:chatID" → func() reactionUndos sync.Map // "channel:chatID" → reactionEntry + chatLimiters sync.Map // "channel:chatID" → *rate.Limiter } type asyncTask struct { @@ -499,16 +500,23 @@ func (m *Manager) runWorker(ctx context.Context, name string, w *channelWorker) // - ErrNotRunning / ErrSendFailed: permanent, no retry // - ErrRateLimit: fixed delay retry // - ErrTemporary / unknown: exponential backoff retry +// sendWithRetry sends a message through the channel with rate limiting and +// retry logic. It classifies errors to determine the retry strategy. func (m *Manager) sendWithRetry(ctx context.Context, name string, w *channelWorker, msg bus.OutboundMessage) { - // Rate limit: wait for token + // 1. Channel-level rate limit if err := w.limiter.Wait(ctx); err != nil { - // ctx canceled, shutting down + return + } + + // 2. Per-chat rate limit (prevent one chat from hogging the worker) + chatLimitKey := name + ":" + msg.ChatID + if err := m.getChatLimiter(chatLimitKey).Wait(ctx); err != nil { return } // Pre-send: stop typing and try to edit placeholder if m.preSend(ctx, name, msg, w.ch) { - return // placeholder was edited successfully, skip Send + return } var lastErr error @@ -799,6 +807,17 @@ func (m *Manager) RegisterChannel(name string, channel Channel) { m.channels[name] = channel } +func (m *Manager) getChatLimiter(key string) *rate.Limiter { + if v, ok := m.chatLimiters.Load(key); ok { + return v.(*rate.Limiter) + } + // Per-chat budget: 1 burst, refill 1 every 2 seconds. + lim := rate.NewLimiter(rate.Every(2*time.Second), 1) + actual, _ := m.chatLimiters.LoadOrStore(key, lim) + return actual.(*rate.Limiter) +} + + func (m *Manager) UnregisterChannel(name string) { m.mu.Lock() defer m.mu.Unlock() diff --git a/pkg/commands/cmd_help.go b/pkg/commands/cmd_help.go index 1b409fd34..720e21209 100644 --- a/pkg/commands/cmd_help.go +++ b/pkg/commands/cmd_help.go @@ -2,8 +2,6 @@ package commands import ( "context" - "fmt" - "strings" ) func helpCommand() Definition { From 914efcf087a368687048a244b9b82decbce6b5be Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 19:33:47 +0100 Subject: [PATCH 19/25] feat: finalized Gemini architecture improvements --- pkg/agent/loop.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index cce27ba8e..e668d9b39 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -974,6 +974,7 @@ func (al *AgentLoop) runLLMIteration( for iteration < agent.MaxIterations { iteration++ + iterStart := time.Now() logger.DebugCF("agent", "LLM iteration", map[string]any{ @@ -1151,6 +1152,16 @@ func (al *AgentLoop) runLLMIteration( "target_channel": al.targetReasoningChannelID(opts.Channel), "channel": opts.Channel, }) + + // Telemetry: Log iteration performance + duration := time.Since(iterStart) + logger.InfoCF("agent", "Iteration performance", map[string]any{ + "agent_id": agent.ID, + "model": activeModel, + "iteration": iteration, + "duration_ms": duration.Milliseconds(), + "has_tool_use": len(response.ToolCalls) > 0, + }) // Check if no tool calls - then check reasoning content if any if len(response.ToolCalls) == 0 { finalContent = response.Content From c60309b497c346530a73c09bd9da521ca408460b Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 19:34:28 +0100 Subject: [PATCH 20/25] fix: missing acp import in spawn.go --- pkg/tools/spawn.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/tools/spawn.go b/pkg/tools/spawn.go index cc1e602b3..e98484b97 100644 --- a/pkg/tools/spawn.go +++ b/pkg/tools/spawn.go @@ -4,6 +4,8 @@ import ( "context" "fmt" "strings" + + "github.com/sipeed/picoclaw/pkg/acp" ) type SpawnTool struct { From 8ce92a4ce70b767926bc5c337b4c8707c7405506 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 19:35:09 +0100 Subject: [PATCH 21/25] fix: syntax errors in instance.go --- pkg/agent/instance.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index a977876cd..8719aaaee 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -100,7 +100,6 @@ func NewAgentInstance( } if cfg.Tools.IsToolEnabled("edit_file") { - } toolsRegistry.Register(tools.NewEditFileTool(workspace, restrict, allowWritePaths)) } if cfg.Tools.IsToolEnabled("append_file") { From d5aa7569ccccebfdfd8ae62966a58b0435eebe5b Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 10 Mar 2026 21:53:26 +0100 Subject: [PATCH 22/25] v1 --- cmd/picoclaw/internal/gateway/helpers.go | 15 + go.mod | 3 + pkg/agent/context.go | 26 +- pkg/agent/instance.go | 14 +- pkg/agent/loop.go | 192 +++++++-- pkg/agent/memory.go | 52 ++- pkg/agent/proactive.go | 69 ++++ pkg/agent/tools_filter.go | 49 ++- pkg/bus/bus.go | 38 +- pkg/channels/interfaces.go | 5 + pkg/channels/slack/slack.go | 6 +- pkg/channels/split.go | 70 +++- .../whatsapp_native/whatsapp_native.go | 107 ++++- pkg/commands/builtin.go | 39 +- pkg/commands/cmd_check.go | 31 +- pkg/commands/cmd_google.go | 181 +++++++++ pkg/commands/cmd_gws.go | 372 ++++++++++++++++++ pkg/commands/cmd_help.go | 57 ++- pkg/commands/cmd_list.go | 80 ++-- pkg/commands/cmd_show.go | 65 +-- pkg/commands/cmd_switch.go | 40 +- pkg/commands/cmd_system.go | 50 +-- pkg/commands/cmd_whatsapp.go | 61 +-- pkg/config/config.go | 47 ++- pkg/config/defaults.go | 22 ++ pkg/config/migration.go | 21 + pkg/gws/client.go | 327 +++++++++++++++ pkg/health/server.go | 45 +++ pkg/providers/openai_compat/provider.go | 15 + pkg/session/manager.go | 46 ++- pkg/skills/clawhub_registry.go | 70 ++++ pkg/skills/registry.go | 21 + pkg/tools/browser.go | 172 ++++++++ pkg/tools/google.go | 191 ++++++++- pkg/tools/image.go | 172 ++++++++ pkg/tools/pdf.go | 186 +++++++++ pkg/tools/skills_inspect.go | 130 ++++++ pkg/tools/speech.go | 147 +++++++ pkg/tools/subagent.go | 62 ++- pkg/tools/whatsapp.go | 124 ++++++ pkg/voice/synthesizer.go | 104 +++++ 41 files changed, 3217 insertions(+), 307 deletions(-) create mode 100644 pkg/agent/proactive.go create mode 100644 pkg/commands/cmd_google.go create mode 100644 pkg/commands/cmd_gws.go create mode 100644 pkg/gws/client.go create mode 100644 pkg/tools/browser.go create mode 100644 pkg/tools/image.go create mode 100644 pkg/tools/pdf.go create mode 100644 pkg/tools/skills_inspect.go create mode 100644 pkg/tools/speech.go create mode 100644 pkg/tools/whatsapp.go create mode 100644 pkg/voice/synthesizer.go diff --git a/cmd/picoclaw/internal/gateway/helpers.go b/cmd/picoclaw/internal/gateway/helpers.go index 760b082c0..3af83289f 100644 --- a/cmd/picoclaw/internal/gateway/helpers.go +++ b/cmd/picoclaw/internal/gateway/helpers.go @@ -143,6 +143,13 @@ func gatewayCmd(debug bool) error { logger.InfoCF("voice", "Transcription enabled (agent-level)", map[string]any{"provider": transcriber.Name()}) } + // Wire up speech synthesis if ElevenLabs is configured. + if cfg.Tools.ElevenLabs.Enabled && cfg.Tools.ElevenLabs.APIKey != "" { + elSynth := voice.NewElevenLabsSynthesizer(cfg.Tools.ElevenLabs.APIKey, cfg.Tools.ElevenLabs.VoiceID) + agentLoop.AddSynthesizer(elSynth) + logger.InfoCF("voice", "Speech synthesis enabled (ElevenLabs)", map[string]any{"voice_id": cfg.Tools.ElevenLabs.VoiceID}) + } + enabledChannels := channelManager.GetEnabledChannels() if len(enabledChannels) > 0 { fmt.Printf("✓ Channels enabled: %s\n", enabledChannels) @@ -161,6 +168,14 @@ func gatewayCmd(debug bool) error { } fmt.Println("✓ Cron service started") + // Setup proactive service + proactiveService := agent.NewProactiveService(cronService, cfg.Tools.Proactive) + if err := proactiveService.Start(); err != nil { + fmt.Printf("Error starting proactive service: %v\n", err) + } + agentLoop.SetProactiveService(proactiveService) + fmt.Println("✓ Proactive service started") + if err := heartbeatService.Start(); err != nil { fmt.Printf("Error starting heartbeat service: %v\n", err) } diff --git a/go.mod b/go.mod index f60be046f..f3735aef3 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,9 @@ require ( google.golang.org/protobuf v1.36.11 maunium.net/go/mautrix v0.26.3 modernc.org/sqlite v1.46.1 + github.com/jung-kurt/gofpdf/v2 v2.17.2 + github.com/chromedp/chromedp v0.10.0 + github.com/disintegration/imaging v1.6.2 ) require ( diff --git a/pkg/agent/context.go b/pkg/agent/context.go index 92663a32d..e035d8c73 100644 --- a/pkg/agent/context.go +++ b/pkg/agent/context.go @@ -41,6 +41,9 @@ type ContextBuilder struct { // build time. This catches nested file creations/deletions/mtime changes // that may not update the top-level skill root directory mtime. skillFilesAtCache map[string]time.Time + + writingStyle string + autoReplyEnabled bool } func (cb *ContextBuilder) WithToolDiscovery(useBM25, useRegex bool) *ContextBuilder { @@ -49,6 +52,12 @@ func (cb *ContextBuilder) WithToolDiscovery(useBM25, useRegex bool) *ContextBuil return cb } +func (cb *ContextBuilder) WithInteraction(style string, autoReply bool) *ContextBuilder { + cb.writingStyle = style + cb.autoReplyEnabled = autoReply + return cb +} + func getGlobalConfigDir() string { if home := os.Getenv("PICOCLAW_HOME"); home != "" { return home @@ -81,10 +90,20 @@ func (cb *ContextBuilder) getIdentity() string { workspacePath, _ := filepath.Abs(filepath.Join(cb.workspace)) toolDiscovery := cb.getDiscoveryRule() + styleStr := "" + if cb.writingStyle != "" { + styleStr = fmt.Sprintf("\n## Writing Style\nYou MUST emulate the following writing style: %s\n", cb.writingStyle) + } + + modeStr := "" + if cb.autoReplyEnabled { + modeStr = "\n## Auto-Reply Mode\nYou are currently in AUTO-REPLY mode. You are processing messages proactively. If you need to take an action that requires user approval (e.g., deleting files, sending messages to others), you MUST propose the action and wait for a user response." + } + return fmt.Sprintf(`# picoclaw 🦞 You are picoclaw, a helpful AI assistant. - +%s%s ## Workspace Your workspace is at: %s - Memory: %s/memory/MEMORY.md @@ -119,7 +138,9 @@ func (cb *ContextBuilder) getDiscoveryRule() string { } return fmt.Sprintf( - `5. **Tool Discovery** - Your visible tools are limited to save memory, but a vast hidden library exists. If you lack the right tool for a task, BEFORE giving up, you MUST search using the %s tool. Do not refuse a request unless the search returns nothing. Found tools will temporarily unlock for your next turn.`, + `5. **Tool Discovery** - Your visible tools are limited to save memory, but a vast hidden library exists. If you lack the right tool for a task, BEFORE giving up, you MUST search using the %s tool. Do not refuse a request unless the search returns nothing. Found tools will temporarily unlock for your next turn. + +6. **Voice Messages** - Inbound messages may contain transcriptions from voice notes, formatted as `[voice: Transcription text]`. Treat these as direct instructions from the user.`, strings.Join(toolNames, " or "), ) } @@ -224,6 +245,7 @@ func (cb *ContextBuilder) sourcePaths() []string { filepath.Join(cb.workspace, "USER.md"), filepath.Join(cb.workspace, "IDENTITY.md"), filepath.Join(cb.workspace, "memory", "MEMORY.md"), + filepath.Join(cb.workspace, "memory", "COMMUNICATIONS.md"), } } diff --git a/pkg/agent/instance.go b/pkg/agent/instance.go index 8719aaaee..889be241f 100644 --- a/pkg/agent/instance.go +++ b/pkg/agent/instance.go @@ -79,9 +79,6 @@ func NewAgentInstance( if cfg.Tools.IsToolEnabled("list_dir") { toolsRegistry.Register(tools.NewListDirTool(workspace, readRestrict, allowReadPaths)) } - if cfg.Tools.IsToolEnabled("google") { - toolsRegistry.Register(&tools.GoogleTool{}) - } if cfg.Tools.IsToolEnabled("exec") { execTool, err := tools.NewExecToolWithConfig(workspace, restrict, cfg) if err != nil { @@ -105,6 +102,15 @@ func NewAgentInstance( if cfg.Tools.IsToolEnabled("append_file") { toolsRegistry.Register(tools.NewAppendFileTool(workspace, restrict, allowWritePaths)) } + if cfg.Tools.IsToolEnabled("pdf") { + toolsRegistry.Register(tools.NewPDFTool(workspace, restrict, cfg.MediaStore)) + } + if cfg.Tools.IsToolEnabled("browser") { + toolsRegistry.Register(tools.NewBrowserTool(workspace, cfg.MediaStore)) + } + if cfg.Tools.IsToolEnabled("image") { + toolsRegistry.Register(tools.NewImageTool(workspace, cfg.MediaStore)) + } sessionsDir := filepath.Join(workspace, "sessions") sessionsManager := session.NewSessionManager(sessionsDir) @@ -113,7 +119,7 @@ func NewAgentInstance( contextBuilder := NewContextBuilder(workspace).WithToolDiscovery( mcpDiscoveryActive && cfg.Tools.MCP.Discovery.UseBM25, mcpDiscoveryActive && cfg.Tools.MCP.Discovery.UseRegex, - ) + ).WithInteraction(cfg.Tools.Interaction.WritingStyle, cfg.Tools.Interaction.AutoReplyEnabled) agentID := routing.DefaultAgentID agentName := "" diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index e668d9b39..767132495 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -8,9 +8,11 @@ package agent import ( "context" + "encoding/base64" "encoding/json" "errors" "fmt" + "os" "path/filepath" "regexp" "strings" @@ -19,6 +21,7 @@ import ( "time" "unicode/utf8" + "golang.org/x/sync/errgroup" "golang.org/x/sync/singleflight" "github.com/sipeed/picoclaw/pkg/bus" @@ -26,6 +29,7 @@ import ( "github.com/sipeed/picoclaw/pkg/commands" "github.com/sipeed/picoclaw/pkg/config" "github.com/sipeed/picoclaw/pkg/constants" + "github.com/sipeed/picoclaw/pkg/health" "github.com/sipeed/picoclaw/pkg/logger" "github.com/sipeed/picoclaw/pkg/mcp" "github.com/sipeed/picoclaw/pkg/media" @@ -48,11 +52,13 @@ type AgentLoop struct { fallback *providers.FallbackChain channelManager *channels.Manager mediaStore media.MediaStore - transcriber voice.Transcriber - cmdRegistry *commands.Registry - version string - sf singleflight.Group - wg sync.WaitGroup + transcriber voice.Transcriber + cmdRegistry *commands.Registry + proactiveService *ProactiveService + synthesizers map[string]voice.Synthesizer + version string + sf singleflight.Group + wg sync.WaitGroup } // processOptions configures how a message is processed @@ -66,6 +72,7 @@ type processOptions struct { EnableSummary bool // Whether to trigger summarization SendResponse bool // Whether to send response via bus NoHistory bool // If true, don't load session history (for heartbeat) + SenderID string // From inbound message (e.g., "cron") } const ( @@ -205,6 +212,18 @@ func registerSharedTools( skills_enabled := cfg.Tools.IsToolEnabled("skills") find_skills_enable := cfg.Tools.IsToolEnabled("find_skills") install_skills_enable := cfg.Tools.IsToolEnabled("install_skill") + + // WhatsApp and Google tools (shared across agents) + if cfg.Channels.WhatsApp.Enabled { + agent.Tools.Register(tools.NewWhatsAppTool(al)) + } + if cfg.Tools.IsToolEnabled("google") { + agent.Tools.Register(tools.NewGoogleTool(al)) + } + if cfg.Tools.IsToolEnabled("speech") || cfg.Tools.ElevenLabs.Enabled { + agent.Tools.Register(tools.NewSpeechTool(al)) + } + if skills_enabled && (find_skills_enable || install_skills_enable) { registryMgr := skills.NewRegistryManagerFromConfig(skills.RegistryConfig{ MaxConcurrentSearches: cfg.Tools.Skills.MaxConcurrentSearches, @@ -217,6 +236,7 @@ func registerSharedTools( time.Duration(cfg.Tools.Skills.SearchCache.TTLSeconds)*time.Second, ) agent.Tools.Register(tools.NewFindSkillsTool(registryMgr, searchCache)) + agent.Tools.Register(tools.NewInspectSkillTool(registryMgr)) } if install_skills_enable { @@ -450,6 +470,52 @@ func (al *AgentLoop) SetChannelManager(cm *channels.Manager) { al.channelManager = cm } +func (al *AgentLoop) GetChannel(name string) (any, bool) { + if al.channelManager == nil { + return nil, false + } + return al.channelManager.GetChannel(name) +} + +func (al *AgentLoop) GetMemoryStore() any { + return al.memory +} + +func (al *AgentLoop) SetProactiveService(ps *ProactiveService) { + al.proactiveService = ps +} + +func (al *AgentLoop) AddSynthesizer(s voice.Synthesizer) { + if al.synthesizers == nil { + al.synthesizers = make(map[string]voice.Synthesizer) + } + al.synthesizers[s.Name()] = s +} + +func (al *AgentLoop) GetSynthesizer(name string) (any, bool) { + if name == "" { + // Return first available as default + for _, s := range al.synthesizers { + return s, true + } + return nil, false + } + s, ok := al.synthesizers[name] + return s, ok +} + +func (al *AgentLoop) GetMediaStore() media.MediaStore { + return al.mediaStore +} + +func (al *AgentLoop) GetWorkspace() string { + defaultAgent := al.registry.GetDefaultAgent() + if defaultAgent != nil && defaultAgent.Workspace != "" { + return defaultAgent.Workspace + } + return al.cfg.WorkspacePath() +} + // SetMediaStore injects a MediaStore for media lifecycle management. func (al *AgentLoop) SetMediaStore(s media.MediaStore) { al.mediaStore = s @@ -673,6 +739,7 @@ func (al *AgentLoop) processMessage(ctx context.Context, msg bus.InboundMessage) DefaultResponse: defaultResponse, EnableSummary: true, SendResponse: false, + SenderID: msg.SenderID, } // Check for pending authorization response @@ -1027,6 +1094,8 @@ func (al *AgentLoop) runLLMIteration( } } + messages = al.resolveMediaReferences(messages) + callLLM := func() (*providers.LLMResponse, error) { if len(activeCandidates) > 1 && al.fallback != nil { fbResult, fbErr := al.fallback.Execute( @@ -1155,6 +1224,13 @@ func (al *AgentLoop) runLLMIteration( // Telemetry: Log iteration performance duration := time.Since(iterStart) + health.DefaultMetrics.RecordLatency("llm_duration_"+activeModel, duration.Milliseconds()) + if response.Usage != nil { + health.DefaultMetrics.RecordCounter("tokens_prompt", int64(response.Usage.PromptTokens)) + health.DefaultMetrics.RecordCounter("tokens_completion", int64(response.Usage.CompletionTokens)) + health.DefaultMetrics.RecordCounter("tokens_total", int64(response.Usage.TotalTokens)) + } + logger.InfoCF("agent", "Iteration performance", map[string]any{ "agent_id": agent.ID, "model": activeModel, @@ -1228,38 +1304,51 @@ func (al *AgentLoop) runLLMIteration( // Save assistant message with tool calls to session agent.Sessions.AddFullMessage(opts.SessionKey, assistantMsg) - // Execute tool calls in parallel + // Execute tool calls in parallel using errgroup for structured concurrency. + g, gCtx := errgroup.WithContext(ctx) type indexedAgentResult struct { result *tools.ToolResult tc providers.ToolCall } agentResults := make([]indexedAgentResult, len(normalizedToolCalls)) - var wg sync.WaitGroup + + // Check for approval gating if it's a proactive turn + approvalRequired := al.cfg.Tools.Interaction.ApprovalRequired + isProactive := (opts.SenderID == "cron") for i, tc := range normalizedToolCalls { - agentResults[i].tc = tc + idx, toolCall := i, tc + agentResults[idx].tc = toolCall - wg.Add(1) - go func(idx int, tc providers.ToolCall) { - defer wg.Done() + // If it's a proactive turn and approval is required, intercept tool call. + // We only block tools that are NOT read-only. + // For simplicity here, we'll block everything that isn't explicitly safe + // if the user requested "never go off without explicit request". + if isProactive && approvalRequired { + logger.InfoCF("agent", "Intercepting tool call for approval", + map[string]any{"tool": toolCall.Name, "agent_id": agent.ID}) + agentResults[idx].result = &tools.ToolResult{ + Silent: false, + ForUser: fmt.Sprintf("⚠️ I need your approval to execute: %s(%v). Should I proceed?", + toolCall.Name, toolCall.Arguments), + ForLLM: "INTERCEPTED: Execution requires explicit user approval in chat. Propose this action to the user instead of executing it.", + } + continue + } - argsJSON, _ := json.Marshal(tc.Arguments) + g.Go(func() error { + argsJSON, _ := json.Marshal(toolCall.Arguments) argsPreview := utils.Truncate(string(argsJSON), 200) - logger.InfoCF("agent", fmt.Sprintf("Tool call: %s(%s)", tc.Name, argsPreview), + logger.InfoCF("agent", fmt.Sprintf("Tool call: %s(%s)", toolCall.Name, argsPreview), map[string]any{ "agent_id": agent.ID, - "tool": tc.Name, + "tool": toolCall.Name, "iteration": iteration, }) // Create async callback for tools that implement AsyncExecutor. - // When the background work completes, this publishes the result - // as an inbound system message so processSystemMessage routes it - // back to the user via the normal agent loop. asyncCallback := func(_ context.Context, result *tools.ToolResult) { - // Send ForUser content directly to the user (immediate feedback), - // mirroring the synchronous tool execution path. if !result.Silent && result.ForUser != "" { outCtx, outCancel := context.WithTimeout(context.Background(), 5*time.Second) defer outCancel() @@ -1270,7 +1359,6 @@ func (al *AgentLoop) runLLMIteration( }) } - // Determine content for the agent loop (ForLLM or error). content := result.ForLLM if content == "" && result.Err != nil { content = result.Err.Error() @@ -1281,7 +1369,7 @@ func (al *AgentLoop) runLLMIteration( logger.InfoCF("agent", "Async tool completed, publishing result", map[string]any{ - "tool": tc.Name, + "tool": toolCall.Name, "content_len": len(content), "channel": opts.Channel, }) @@ -1290,24 +1378,32 @@ func (al *AgentLoop) runLLMIteration( defer pubCancel() _ = al.bus.PublishInbound(pubCtx, bus.InboundMessage{ Channel: "system", - SenderID: fmt.Sprintf("async:%s", tc.Name), + SenderID: fmt.Sprintf("async:%s", toolCall.Name), ChatID: fmt.Sprintf("%s:%s", opts.Channel, opts.ChatID), Content: content, }) } toolResult := agent.Tools.ExecuteWithContext( - ctx, - tc.Name, - tc.Arguments, + gCtx, + toolCall.Name, + toolCall.Arguments, opts.Channel, opts.ChatID, asyncCallback, ) + if toolResult.Err != nil { + health.DefaultMetrics.RecordCounter("tool_failure_"+toolCall.Name, 1) + } else { + health.DefaultMetrics.RecordCounter("tool_success_"+toolCall.Name, 1) + } agentResults[idx].result = toolResult - }(i, tc) + return nil // We don't want a tool error to cancel other tools unless it's a panic/critical + }) + } + if err := g.Wait(); err != nil { + return "", iteration, fmt.Errorf("tool execution phase failed: %w", err) } - wg.Wait() // Process results in original order (send to user, save to session) for _, r := range agentResults { @@ -1962,3 +2058,45 @@ func isYesResponse(content string) bool { c := strings.ToLower(strings.TrimSpace(content)) return c == "yes" || c == "y" || c == "ok" || c == "confirm" || c == "proceed" } + +func (al *AgentLoop) resolveMediaReferences(messages []providers.Message) []providers.Message { + if al.mediaStore == nil { + return messages + } + + result := make([]providers.Message, len(messages)) + copy(result, messages) + + for i, msg := range result { + if len(msg.Media) == 0 { + continue + } + + resolvedMedia := make([]string, 0, len(msg.Media)) + for _, m := range msg.Media { + if !strings.HasPrefix(m, "media://") { + resolvedMedia = append(resolvedMedia, m) + continue + } + + localPath, meta, err := al.mediaStore.ResolveWithMeta(m) + if err != nil { + logger.WarnCF("agent", "Failed to resolve media reference", map[string]any{"ref": m, "error": err.Error()}) + continue + } + + data, err := os.ReadFile(localPath) + if err != nil { + logger.WarnCF("agent", "Failed to read media file", map[string]any{"path": localPath, "error": err.Error()}) + continue + } + + base64Data := base64.StdEncoding.EncodeToString(data) + dataURI := fmt.Sprintf("data:%s;base64,%s", meta.ContentType, base64Data) + resolvedMedia = append(resolvedMedia, dataURI) + } + result[i].Media = resolvedMedia + } + + return result +} diff --git a/pkg/agent/memory.go b/pkg/agent/memory.go index 01e682f3b..c1dacf381 100644 --- a/pkg/agent/memory.go +++ b/pkg/agent/memory.go @@ -21,8 +21,9 @@ import ( // - Daily notes: memory/YYYYMM/YYYYMMDD.md type MemoryStore struct { workspace string - memoryDir string - memoryFile string + memoryDir string + memoryFile string + commsFile string } // NewMemoryStore creates a new MemoryStore with the given workspace path. @@ -30,6 +31,7 @@ type MemoryStore struct { func NewMemoryStore(workspace string) *MemoryStore { memoryDir := filepath.Join(workspace, "memory") memoryFile := filepath.Join(memoryDir, "MEMORY.md") + commsFile := filepath.Join(memoryDir, "COMMUNICATIONS.md") // Ensure memory directory exists os.MkdirAll(memoryDir, 0o755) @@ -38,6 +40,7 @@ func NewMemoryStore(workspace string) *MemoryStore { workspace: workspace, memoryDir: memoryDir, memoryFile: memoryFile, + commsFile: commsFile, } } @@ -65,6 +68,38 @@ func (ms *MemoryStore) WriteLongTerm(content string) error { return fileutil.WriteFileAtomic(ms.memoryFile, []byte(content), 0o600) } +// ReadCommunications reads the communications memory (COMMUNICATIONS.md). +func (ms *MemoryStore) ReadCommunications() string { + if data, err := os.ReadFile(ms.commsFile); err == nil { + return string(data) + } + return "" +} + +// WriteCommunications writes content to the communications memory file. +func (ms *MemoryStore) WriteCommunications(content string) error { + return fileutil.WriteFileAtomic(ms.commsFile, []byte(content), 0o600) +} + +// AppendCommunications appends content to the communications memory file. +func (ms *MemoryStore) AppendCommunications(content string) error { + existing := "" + if data, err := os.ReadFile(ms.commsFile); err == nil { + existing = string(data) + } + + trimmed := "" + if len(existing) > 0 { + // Keep only last 20KB to avoid excessive context + if len(existing) > 20000 { + existing = existing[len(existing)-20000:] + } + trimmed = existing + "\n\n---\n\n" + } + + return fileutil.WriteFileAtomic(ms.commsFile, []byte(trimmed+content), 0o600) +} + // ReadToday reads today's daily note. // Returns empty string if the file doesn't exist. func (ms *MemoryStore) ReadToday() string { @@ -134,8 +169,9 @@ func (ms *MemoryStore) GetRecentDailyNotes(days int) string { func (ms *MemoryStore) GetMemoryContext() string { longTerm := ms.ReadLongTerm() recentNotes := ms.GetRecentDailyNotes(3) + comms := ms.ReadCommunications() - if longTerm == "" && recentNotes == "" { + if longTerm == "" && recentNotes == "" && comms == "" { return "" } @@ -146,8 +182,16 @@ func (ms *MemoryStore) GetMemoryContext() string { sb.WriteString(longTerm) } + if comms != "" { + if sb.Len() > 0 { + sb.WriteString("\n\n---\n\n") + } + sb.WriteString("## Recent Communications\n\n") + sb.WriteString(comms) + } + if recentNotes != "" { - if longTerm != "" { + if sb.Len() > 0 { sb.WriteString("\n\n---\n\n") } sb.WriteString("## Recent Daily Notes\n\n") diff --git a/pkg/agent/proactive.go b/pkg/agent/proactive.go new file mode 100644 index 000000000..c6506f732 --- /dev/null +++ b/pkg/agent/proactive.go @@ -0,0 +1,69 @@ +package agent + +import ( + "fmt" + "time" + + "github.com/sipeed/picoclaw/pkg/config" + "github.com/sipeed/picoclaw/pkg/cron" +) + +// ProactiveService manages automated background tasks for communication processing. +type ProactiveService struct { + cron *cron.CronService + cfg config.ProactiveConfig +} + +// NewProactiveService creates a new ProactiveService. +func NewProactiveService(cron *cron.CronService, cfg config.ProactiveConfig) *ProactiveService { + return &ProactiveService{ + cron: cron, + cfg: cfg, + } +} + +// Start registers the automated jobs in the cron service. +func (s *ProactiveService) Start() error { + if !s.cfg.Enabled { + return nil + } + + // 1. Job for syncing messaging history (WhatsApp/Gmail) + if s.cfg.SyncIntervalMinutes > 0 { + syncIntervalMS := int64(s.cfg.SyncIntervalMinutes) * 60 * 1000 + + // Note: We use a system-internal channel name to avoid cluttering user chat + _, err := s.cron.AddJob( + "Auto Sync Communications", + cron.CronSchedule{Kind: "every", EveryMS: &syncIntervalMS}, + "Automatically sync my latest WhatsApp and Gmail communications to contextual memory.", + false, // Process via agent + "system", + "proactive_sync", + ) + if err != nil { + return fmt.Errorf("failed to register auto-sync job: %w", err) + } + } + + // 2. Job for processing insights and auto-updating Calendar/TODO + if s.cfg.ProcessIntervalMinutes > 0 { + processIntervalMS := int64(s.cfg.ProcessIntervalMinutes) * 60 * 1000 + + prompt := "PROACTIVE SYSTEM TURN: Analyze recent communications in COMMUNICATIONS.md. Identify any new calendar events or tasks. Update my Google Calendar and TODO list if necessary. Be silent if no actions are taken." + + _, err := s.cron.AddJob( + "Proactive Action Extraction", + cron.CronSchedule{Kind: "every", EveryMS: &processIntervalMS}, + prompt, + false, // Process via agent + "system", + "proactive_process", + ) + if err != nil { + return fmt.Errorf("failed to register proactive processing job: %w", err) + } + } + + return nil +} diff --git a/pkg/agent/tools_filter.go b/pkg/agent/tools_filter.go index 1b62d794f..96a7398f3 100644 --- a/pkg/agent/tools_filter.go +++ b/pkg/agent/tools_filter.go @@ -1,6 +1,7 @@ package agent import ( + "sort" "strings" "github.com/sipeed/picoclaw/pkg/providers" @@ -33,42 +34,50 @@ func (al *AgentLoop) selectRelevantTools(agent *AgentInstance, userMsg string) [ "spawn": {"spawn", "acp", "harness", "agent", "protocol"}, } - relevant := make([]providers.ToolDefinition, 0) + type ScoredTool struct { + tool providers.ToolDefinition + score int + } + + scored := make([]ScoredTool, 0, len(allTools)) for _, tool := range allTools { name := tool.Function.Name - - // 1. Always include essential tools. + score := 0 + + // 1. Always include essential tools (high score). if essentialTools[name] { - relevant = append(relevant, tool) - continue + score += 100 } - // 2. Include based on keywords. + // 2. Score based on keywords. if kws, ok := toolKeywords[name]; ok { - matched := false for _, kw := range kws { if strings.Contains(lowerMsg, kw) { - matched = true - break + score += 10 } } - if matched { - relevant = append(relevant, tool) - continue - } } - // 3. Fallback: if tool has no keywords defined, include it by default? - // To be safe and avoid context bloat, we only include tools with defined keywords if they match. - // If a tool is NOT in our map, we'll include it for now to avoid breaking unknown tools. + // 3. Fallback: if tool has no keywords defined, give it a base score to avoid starving unknown tools. if _, ok := toolKeywords[name]; !ok { - relevant = append(relevant, tool) + score += 5 + } + + if score > 0 { + scored = append(scored, ScoredTool{tool: tool, score: score}) } } - // Safety: ensure we don't return an empty tool set if any were available. - if len(relevant) == 0 && len(allTools) > 0 { - return allTools[:min(len(allTools), 5)] + // Sort by score descending + sort.Slice(scored, func(i, j int) bool { + return scored[i].score > scored[j].score + }) + + // Take Top-K (up to 12 tools for a good balance of capability and context) + topK := 12 + relevant := make([]providers.ToolDefinition, 0, min(len(scored), topK)) + for i := 0; i < min(len(scored), topK); i++ { + relevant = append(relevant, scored[i].tool) } return relevant diff --git a/pkg/bus/bus.go b/pkg/bus/bus.go index f5ff9587d..8bb6d27fd 100644 --- a/pkg/bus/bus.go +++ b/pkg/bus/bus.go @@ -11,6 +11,12 @@ import ( // ErrBusClosed is returned when publishing to a closed MessageBus. var ErrBusClosed = errors.New("message bus closed") +// InboundMiddleware is a function that can transform an inbound message. +type InboundMiddleware func(InboundMessage) InboundMessage + +// OutboundMiddleware is a function that can transform an outbound message. +type OutboundMiddleware func(OutboundMessage) OutboundMessage + const defaultBusBufferSize = 64 type MessageBus struct { @@ -19,6 +25,9 @@ type MessageBus struct { outboundMedia chan OutboundMediaMessage done chan struct{} closed atomic.Bool + + inboundMiddleware []InboundMiddleware + outboundMiddleware []OutboundMiddleware } func NewMessageBus() *MessageBus { @@ -37,8 +46,15 @@ func (mb *MessageBus) PublishInbound(ctx context.Context, msg InboundMessage) er if err := ctx.Err(); err != nil { return err } + + // Apply middleware + processed := msg + for _, mw := range mb.inboundMiddleware { + processed = mw(processed) + } + select { - case mb.inbound <- msg: + case mb.inbound <- processed: return nil case <-mb.done: return ErrBusClosed @@ -65,8 +81,15 @@ func (mb *MessageBus) PublishOutbound(ctx context.Context, msg OutboundMessage) if err := ctx.Err(); err != nil { return err } + + // Apply middleware + processed := msg + for _, mw := range mb.outboundMiddleware { + processed = mw(processed) + } + select { - case mb.outbound <- msg: + case mb.outbound <- processed: return nil case <-mb.done: return ErrBusClosed @@ -114,6 +137,17 @@ func (mb *MessageBus) SubscribeOutboundMedia(ctx context.Context) (OutboundMedia } } + } +} + +func (mb *MessageBus) RegisterInboundMiddleware(mw InboundMiddleware) { + mb.inboundMiddleware = append(mb.inboundMiddleware, mw) +} + +func (mb *MessageBus) RegisterOutboundMiddleware(mw OutboundMiddleware) { + mb.outboundMiddleware = append(mb.outboundMiddleware, mw) +} + func (mb *MessageBus) Close() { if mb.closed.CompareAndSwap(false, true) { close(mb.done) diff --git a/pkg/channels/interfaces.go b/pkg/channels/interfaces.go index 9626ec804..995a13eb3 100644 --- a/pkg/channels/interfaces.go +++ b/pkg/channels/interfaces.go @@ -56,3 +56,8 @@ type CommandRegistrarCapable interface { type QRProvider interface { GetLastQR() string } + +// HistoryProvider is implemented by channels that can fetch message history. +type HistoryProvider interface { + FetchHistory(ctx context.Context, chatID string, limit int) ([]bus.InboundMessage, error) +} diff --git a/pkg/channels/slack/slack.go b/pkg/channels/slack/slack.go index 024b1b023..eca313c63 100644 --- a/pkg/channels/slack/slack.go +++ b/pkg/channels/slack/slack.go @@ -340,7 +340,11 @@ func (c *SlackChannel) handleMessageEvent(ev *slackevents.MessageEvent) { continue } mediaPaths = append(mediaPaths, storeMedia(localPath, file.Name)) - content += fmt.Sprintf("\n[file: %s]", file.Name) + if utils.IsAudioFile(file.Name, file.Mimetype) { + content += fmt.Sprintf("\n[audio: %s]", file.Name) + } else { + content += fmt.Sprintf("\n[file: %s]", file.Name) + } } } diff --git a/pkg/channels/split.go b/pkg/channels/split.go index fb7120562..48fb4c350 100644 --- a/pkg/channels/split.go +++ b/pkg/channels/split.go @@ -54,8 +54,9 @@ func SplitMessage(content string, maxLen int) []string { msgEnd = end } - // Check if this would end with an incomplete code block + // Check if this would end with an incomplete code block or in the middle of a table unclosedIdx := findLastUnclosedCodeBlockInRange(runes, start, msgEnd) + inTable := isInsideTableInRange(runes, start, msgEnd) if unclosedIdx >= 0 { // Message would end with incomplete code block @@ -126,6 +127,18 @@ func SplitMessage(content string, maxLen int) []string { } } } + } else if inTable { + // Try to find the end of the table + tableEnd := findTableEndFrom(runes, msgEnd, totalLen) + if tableEnd > 0 && tableEnd-start <= maxLen { + msgEnd = tableEnd + } else { + // Table is too long, split before it if possible + tableStart := findTableStartBefore(runes, msgEnd, start) + if tableStart > start { + msgEnd = tableStart + } + } } if msgEnd <= start { @@ -223,3 +236,58 @@ func findLastDoubleNewlineInRange(runes []rune, start, end, searchWindow int) in return start - 1 } +// isInsideTableInRange checks if the msgEnd point falls within a Markdown table. +func isInsideTableInRange(runes []rune, start, msgEnd int) bool { + // Simple heuristic: if the line at msgEnd and the line before it both start with | + lineStart := findLineStartBefore(runes, msgEnd) + if lineStart < start { + return false + } + return runes[lineStart] == '|' +} + +func findLineStartBefore(runes []rune, idx int) int { + for i := idx - 1; i >= 0; i-- { + if runes[i] == '\n' { + return i + 1 + } + } + return 0 +} + +func findTableEndFrom(runes []rune, from, totalLen int) int { + // Look for the first line that doesn't start with | + curr := from + for curr < totalLen { + eol := findNewlineFrom(runes, curr) + if eol == -1 { + eol = totalLen + } + // Skip leading whitespace to find the start of the next line + nextStart := eol + for nextStart < totalLen && (runes[nextStart] == '\n' || runes[nextStart] == '\r') { + nextStart++ + } + if nextStart >= totalLen || runes[nextStart] != '|' { + return eol + } + curr = nextStart + } + return totalLen +} + +func findTableStartBefore(runes []rune, before, start int) int { + // Look for the first line that doesn't start with | backwards + curr := before + for curr > start { + sol := findLineStartBefore(runes, curr) + if sol < start { + return start + } + if runes[sol] != '|' { + return curr // The newline before a table row + } + curr = sol - 1 + } + return start +} diff --git a/pkg/channels/whatsapp_native/whatsapp_native.go b/pkg/channels/whatsapp_native/whatsapp_native.go index 73ad97aa3..004556152 100644 --- a/pkg/channels/whatsapp_native/whatsapp_native.go +++ b/pkg/channels/whatsapp_native/whatsapp_native.go @@ -33,6 +33,7 @@ import ( "github.com/sipeed/picoclaw/pkg/config" "github.com/sipeed/picoclaw/pkg/identity" "github.com/sipeed/picoclaw/pkg/logger" + "github.com/sipeed/picoclaw/pkg/media" "github.com/sipeed/picoclaw/pkg/utils" ) @@ -356,12 +357,50 @@ func (c *WhatsAppNativeChannel) handleIncoming(evt *events.Message) { } content = utils.SanitizeMessageContent(content) - if content == "" { - return - } - var mediaPaths []string + // Handle media (Audio/Voice messages) + if evt.Message.AudioMessage != nil { + audio := evt.Message.AudioMessage + data, err := c.client.Download(audio) + if err != nil { + logger.WarnCF("whatsapp", "Failed to download audio", map[string]any{"error": err.Error()}) + } else { + ext := ".ogg" // Default for WhatsApp voice notes + if audio.GetMimetype() == "audio/mp4" { + ext = ".m4a" + } + filename := fmt.Sprintf("audio-%s%s", evt.Info.ID, ext) + tempPath := filepath.Join(os.TempDir(), filename) + if err := os.WriteFile(tempPath, data, 0o644); err != nil { + logger.WarnCF("whatsapp", "Failed to save audio file", map[string]any{"error": err.Error()}) + } else { + scope := channels.BuildMediaScope("whatsapp", chatID, evt.Info.ID) + if store := c.GetMediaStore(); store != nil { + ref, err := store.Store(tempPath, media.MediaMeta{ + Filename: filename, + ContentType: audio.GetMimetype(), + Source: "whatsapp", + }, scope) + if err == nil { + mediaPaths = append(mediaPaths, ref) + if content != "" { + content += "\n" + } + // Mark for transcription in AgentLoop + if audio.GetPtt() { + content += "[voice]" + } else { + content += "[audio]" + } + } else { + mediaPaths = append(mediaPaths, tempPath) + } + } + } + } + } + metadata := make(map[string]string) metadata["message_id"] = evt.Info.ID if evt.Info.PushName != "" { @@ -456,3 +495,63 @@ func (c *WhatsAppNativeChannel) GetLastQR() string { defer c.mu.Unlock() return c.lastQR } + +func (c *WhatsAppNativeChannel) FetchHistory(ctx context.Context, chatID string, limit int) ([]bus.InboundMessage, error) { + if !c.IsRunning() { + return nil, channels.ErrNotRunning + } + + jid, err := parseJID(chatID) + if err != nil { + return nil, fmt.Errorf("invalid chat id %q: %w", chatID, err) + } + + c.mu.Lock() + client := c.client + c.mu.Unlock() + + if client == nil { + return nil, fmt.Errorf("whatsapp client not initialized") + } + + // Fetch messages from WhatsApp servers/local store + resp, err := client.FetchMessages(jid, limit, "", "") + if err != nil { + return nil, fmt.Errorf("whatsapp fetch history: %w", err) + } + + messages := make([]bus.InboundMessage, 0, len(resp.Messages)) + for _, m := range resp.Messages { + if m.Message == nil { + continue + } + + content := m.Message.GetConversation() + if content == "" && m.Message.ExtendedTextMessage != nil { + content = m.Message.ExtendedTextMessage.GetText() + } + if content == "" { + continue + } + + senderID := m.Info.Sender.String() + peerKind := "direct" + if m.Info.Chat.Server == types.GroupServer { + peerKind = "group" + } + + messages = append(messages, bus.InboundMessage{ + Channel: "whatsapp", + SenderID: senderID, + ChatID: m.Info.Chat.String(), + Content: content, + Peer: bus.Peer{ + Kind: peerKind, + ID: m.Info.Chat.String(), + }, + Timestamp: m.Info.Timestamp, + }) + } + + return messages, nil +} diff --git a/pkg/commands/builtin.go b/pkg/commands/builtin.go index 42f187d26..9ba6cf07c 100644 --- a/pkg/commands/builtin.go +++ b/pkg/commands/builtin.go @@ -1,23 +1,46 @@ package commands // BuiltinDefinitions returns all built-in command definitions. -// Each command group is defined in its own cmd_*.go file. -// Definitions are stateless — runtime dependencies are provided -// via the Runtime parameter passed to handlers at execution time. +// Each command is a single-word command, compatible with Telegram's /command format. func BuiltinDefinitions() []Definition { return []Definition{ + // Core startCommand(), helpCommand(), + versionCommand(), + pingCommand(), + clearCommand(), + + // Info + modelCommand(), // /model [name] — show or switch model + modelsCommand(), // /models — list configured model + channelCommand(), // /channel [name] — show or check channel + channelsCommand(), // /channels — list enabled channels + agentsCommand(), // /agents — list registered agents + toolsCommand(), // /tools — list available tools + + // Google / GWS + gloginCommand(), // /glogin [antigravity|gemini] + gstatusCommand(), // /gstatus + glogoutCommand(), // /glogout [antigravity|gemini|all] + gprojectCommand(), // /gproject + gmailCommand(), // /gmail [list|search|unread|read] + driveCommand(), // /drive [list|search|docs|sheets] + docsCommand(), // /docs [create|open|list] + calCommand(), // /cal [today|week|month] + sheetsCommand(), // /sheets [list|search] + + // Platform + qrCommand(), // /qr — WhatsApp QR code + vpsloginCommand(), // /vpslogin + acpCommand(), // /acp + + // Legacy stubs (kept for backward compat, redirect users) showCommand(), listCommand(), switchCommand(), checkCommand(), - clearCommand(), whatsappCommand(), - pingCommand(), - toolsCommand(), - modelCommand(), vpsCommand(), - acpCommand(), } } diff --git a/pkg/commands/cmd_check.go b/pkg/commands/cmd_check.go index f0193dc4f..1c587dfcb 100644 --- a/pkg/commands/cmd_check.go +++ b/pkg/commands/cmd_check.go @@ -1,33 +1,16 @@ package commands -import ( - "context" - "fmt" -) +import "context" +// checkCommand is kept as a no-op stub for backward compat. +// Use /channel instead. func checkCommand() Definition { return Definition{ Name: "check", - Description: "Check channel availability", - SubCommands: []SubCommand{ - { - Name: "channel", - Description: "Check if a channel is available", - ArgsUsage: "", - Handler: func(_ context.Context, req Request, rt *Runtime) error { - if rt == nil || rt.SwitchChannel == nil { - return req.Reply(unavailableMsg) - } - value := nthToken(req.Text, 2) - if value == "" { - return req.Reply("Usage: /check channel ") - } - if err := rt.SwitchChannel(value); err != nil { - return req.Reply(err.Error()) - } - return req.Reply(fmt.Sprintf("Channel '%s' is available and enabled", value)) - }, - }, + Description: "Alias: use /channel ", + Usage: "/check", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + return req.Reply("Use /channel to check channel availability.") }, } } diff --git a/pkg/commands/cmd_google.go b/pkg/commands/cmd_google.go new file mode 100644 index 000000000..9a81b89ef --- /dev/null +++ b/pkg/commands/cmd_google.go @@ -0,0 +1,181 @@ +package commands + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/sipeed/picoclaw/pkg/auth" +) + +// gloginCommand starts a Google OAuth flow and saves the credential. +func gloginCommand() Definition { + return Definition{ + Name: "glogin", + Description: "Authenticate with Google (GWS / Cloud). Opens browser for OAuth.", + Usage: "/glogin [antigravity|gemini]", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + provider := strings.ToLower(nthToken(req.Text, 1)) + + var cfg auth.OAuthProviderConfig + var providerKey string + switch provider { + case "gemini", "gcloud", "cloud": + cfg = auth.GeminiCLIOAuthConfig() + providerKey = "google-gemini" + default: + // Default: Antigravity / full GWS scopes (Gmail, Drive, Calendar, etc.) + cfg = auth.GoogleAntigravityOAuthConfig() + providerKey = "google-antigravity" + } + + _ = req.Reply(fmt.Sprintf( + "🔐 Starting Google OAuth for *%s*...\nA browser window will open. Complete sign-in, then come back here.", + providerKey, + )) + + cred, err := auth.LoginBrowser(cfg) + if err != nil { + return req.Reply(fmt.Sprintf("❌ Google login failed: %v", err)) + } + + if err := auth.SetCredential(providerKey, cred); err != nil { + return req.Reply(fmt.Sprintf("❌ Failed to save credentials: %v", err)) + } + + email := cred.Email + if email == "" { + email = "(email not in token)" + } + return req.Reply(fmt.Sprintf("✅ Google login successful!\nProvider: %s\nAccount: %s", providerKey, email)) + }, + } +} + +// gstatusCommand shows the current Google auth status. +func gstatusCommand() Definition { + return Definition{ + Name: "gstatus", + Description: "Show current Google authentication status", + Usage: "/gstatus", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + providers := []string{"google-antigravity", "google-gemini"} + var sb strings.Builder + sb.WriteString("🔑 *Google Auth Status*\n\n") + + anyFound := false + for _, p := range providers { + cred, err := auth.GetCredential(p) + if err != nil || cred == nil { + continue + } + anyFound = true + + status := "✅ Active" + if cred.IsExpired() { + status = "⚠️ Expired" + } else if cred.NeedsRefresh() { + status = "🔄 Needs refresh soon" + } + + sb.WriteString(fmt.Sprintf("*%s*\n", p)) + sb.WriteString(fmt.Sprintf(" Status: %s\n", status)) + if cred.Email != "" { + sb.WriteString(fmt.Sprintf(" Account: %s\n", cred.Email)) + } + if cred.ProjectID != "" { + sb.WriteString(fmt.Sprintf(" Project: %s\n", cred.ProjectID)) + } + if !cred.ExpiresAt.IsZero() { + remaining := time.Until(cred.ExpiresAt).Round(time.Minute) + sb.WriteString(fmt.Sprintf(" Expires in: %s\n", remaining)) + } + sb.WriteString("\n") + } + + if !anyFound { + sb.WriteString("No Google credentials found.\nUse /glogin to authenticate.") + } + + return req.Reply(sb.String()) + }, + } +} + +// glogoutCommand removes stored Google credentials. +func glogoutCommand() Definition { + return Definition{ + Name: "glogout", + Description: "Remove stored Google credentials", + Usage: "/glogout [antigravity|gemini|all]", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + which := strings.ToLower(nthToken(req.Text, 1)) + + switch which { + case "gemini", "cloud": + if err := auth.DeleteCredential("google-gemini"); err != nil { + return req.Reply(fmt.Sprintf("❌ Failed to remove google-gemini credentials: %v", err)) + } + return req.Reply("✅ Removed google-gemini credentials.") + + case "all": + errs := []string{} + for _, p := range []string{"google-antigravity", "google-gemini"} { + if err := auth.DeleteCredential(p); err != nil { + errs = append(errs, fmt.Sprintf("%s: %v", p, err)) + } + } + if len(errs) > 0 { + return req.Reply("⚠️ Some removals failed:\n" + strings.Join(errs, "\n")) + } + return req.Reply("✅ All Google credentials removed.") + + default: + // Default: antigravity + if err := auth.DeleteCredential("google-antigravity"); err != nil { + return req.Reply(fmt.Sprintf("❌ Failed to remove google-antigravity credentials: %v", err)) + } + return req.Reply("✅ Removed google-antigravity credentials.") + } + }, + } +} + +// gprojectCommand sets the active GCP project ID on the stored credential. +func gprojectCommand() Definition { + return Definition{ + Name: "gproject", + Description: "Set the active GCP project ID for Google cloud operations", + Usage: "/gproject ", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + projectID := nthToken(req.Text, 1) + if projectID == "" { + // Show current + cred, err := auth.GetCredential("google-antigravity") + if err != nil || cred == nil { + return req.Reply("No Google credentials found. Use /glogin first.") + } + if cred.ProjectID == "" { + return req.Reply("No GCP project set. Use: /gproject ") + } + return req.Reply(fmt.Sprintf("Current GCP project: `%s`", cred.ProjectID)) + } + + cred, err := auth.GetCredential("google-antigravity") + if err != nil { + return req.Reply(fmt.Sprintf("❌ Failed to load credentials: %v", err)) + } + if cred == nil { + return req.Reply("No Google credentials found. Use /glogin first.") + } + + cred.ProjectID = projectID + if err := auth.SetCredential("google-antigravity", cred); err != nil { + return req.Reply(fmt.Sprintf("❌ Failed to save project: %v", err)) + } + + return req.Reply(fmt.Sprintf("✅ GCP project set to: `%s`", projectID)) + }, + } +} diff --git a/pkg/commands/cmd_gws.go b/pkg/commands/cmd_gws.go new file mode 100644 index 000000000..74b14d5e0 --- /dev/null +++ b/pkg/commands/cmd_gws.go @@ -0,0 +1,372 @@ +package commands + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/sipeed/picoclaw/pkg/gws" +) + +// ── /gmail ─────────────────────────────────────────────────────────────────── + +func gmailCommand() Definition { + return Definition{ + Name: "gmail", + Description: "Gmail: list, search, or read emails", + Usage: "/gmail [list|search |read |help]", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + action := strings.ToLower(nthToken(req.Text, 1)) + + if action == "" || action == "help" { + return req.Reply( + "📧 *Gmail Commands*\n\n" + + "• `/gmail list` — last 10 inbox messages\n" + + "• `/gmail search ` — search by subject/sender/content\n" + + "• `/gmail unread` — unread messages only\n" + + "• `/gmail read ` — open a specific message\n", + ) + } + + c, err := gws.New() + if err != nil { + return req.Reply("❌ " + err.Error()) + } + + switch action { + case "list": + msgs, err := c.GmailList("in:inbox", 10) + if err != nil { + return req.Reply("❌ Gmail list failed: " + err.Error()) + } + return req.Reply(formatGmailList(msgs, "Inbox")) + + case "unread": + msgs, err := c.GmailList("is:unread in:inbox", 10) + if err != nil { + return req.Reply("❌ Gmail unread failed: " + err.Error()) + } + return req.Reply(formatGmailList(msgs, "Unread")) + + case "search": + query := strings.Join(tailTokens(req.Text, 2), " ") + if query == "" { + return req.Reply("Usage: /gmail search ") + } + msgs, err := c.GmailList(query, 10) + if err != nil { + return req.Reply("❌ Gmail search failed: " + err.Error()) + } + return req.Reply(formatGmailList(msgs, "Search: "+query)) + + case "read": + msgID := nthToken(req.Text, 2) + if msgID == "" { + return req.Reply("Usage: /gmail read ") + } + msg, err := c.GmailRead(msgID) + if err != nil { + return req.Reply("❌ Gmail read failed: " + err.Error()) + } + from := gws.HeaderValue(*msg, "From") + subject := gws.HeaderValue(*msg, "Subject") + date := gws.HeaderValue(*msg, "Date") + return req.Reply(fmt.Sprintf( + "📧 *%s*\nFrom: %s\nDate: %s\n\n%s", + subject, from, date, truncateStr(msg.Snippet, 500), + )) + + default: + return req.Reply(fmt.Sprintf("Unknown gmail action: %s\nUse /gmail help.", action)) + } + }, + } +} + +func formatGmailList(msgs []gws.GmailMessage, title string) string { + if len(msgs) == 0 { + return fmt.Sprintf("📧 *%s*\n\nNo messages found.", title) + } + var sb strings.Builder + sb.WriteString(fmt.Sprintf("📧 *%s* (%d)\n\n", title, len(msgs))) + for _, m := range msgs { + subject := gws.HeaderValue(m, "Subject") + from := gws.HeaderValue(m, "From") + if subject == "" { + subject = "(no subject)" + } + sb.WriteString(fmt.Sprintf("• [%s] %s\n `%s`\n", from, subject, m.ID)) + } + return sb.String() +} + +// ── /drive ─────────────────────────────────────────────────────────────────── + +func driveCommand() Definition { + return Definition{ + Name: "drive", + Description: "Google Drive: list or search files", + Usage: "/drive [list|search |docs|sheets|help]", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + action := strings.ToLower(nthToken(req.Text, 1)) + + if action == "" || action == "help" { + return req.Reply( + "💾 *Drive Commands*\n\n" + + "• `/drive list` — recent files\n" + + "• `/drive search ` — search by name\n" + + "• `/drive docs` — recent Google Docs\n" + + "• `/drive sheets` — recent Sheets\n", + ) + } + + c, err := gws.New() + if err != nil { + return req.Reply("❌ " + err.Error()) + } + + switch action { + case "list": + files, err := c.DriveList("", "", 10) + if err != nil { + return req.Reply("❌ Drive list failed: " + err.Error()) + } + return req.Reply(formatDriveList(files, "Recent Files")) + + case "search": + query := strings.Join(tailTokens(req.Text, 2), " ") + if query == "" { + return req.Reply("Usage: /drive search ") + } + files, err := c.DriveList(query, "", 10) + if err != nil { + return req.Reply("❌ Drive search failed: " + err.Error()) + } + return req.Reply(formatDriveList(files, "Search: "+query)) + + case "docs": + files, err := c.DriveList("", "application/vnd.google-apps.document", 10) + if err != nil { + return req.Reply("❌ Drive docs failed: " + err.Error()) + } + return req.Reply(formatDriveList(files, "Recent Docs")) + + case "sheets": + files, err := c.DriveList("", "application/vnd.google-apps.spreadsheet", 10) + if err != nil { + return req.Reply("❌ Drive sheets failed: " + err.Error()) + } + return req.Reply(formatDriveList(files, "Recent Sheets")) + + default: + return req.Reply(fmt.Sprintf("Unknown drive action: %s\nUse /drive help.", action)) + } + }, + } +} + +func formatDriveList(files []gws.DriveFile, title string) string { + if len(files) == 0 { + return fmt.Sprintf("💾 *%s*\n\nNo files found.", title) + } + var sb strings.Builder + sb.WriteString(fmt.Sprintf("💾 *%s* (%d)\n\n", title, len(files))) + for _, f := range files { + label := gws.MimeTypeLabel(f.MimeType) + sb.WriteString(fmt.Sprintf("• [%s] %s\n `%s`\n", label, f.Name, f.ID)) + } + return sb.String() +} + +// ── /docs ──────────────────────────────────────────────────────────────────── + +func docsCommand() Definition { + return Definition{ + Name: "docs", + Description: "Google Docs: create or open a document", + Usage: "/docs [create |open <id>|help]", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + action := strings.ToLower(nthToken(req.Text, 1)) + + if action == "" || action == "help" { + return req.Reply( + "📄 *Docs Commands*\n\n" + + "• `/docs create <title>` — create a new Google Doc\n" + + "• `/docs open <document-id>` — get document info\n" + + "• `/docs list` — recent docs (via Drive)\n", + ) + } + + c, err := gws.New() + if err != nil { + return req.Reply("❌ " + err.Error()) + } + + switch action { + case "create": + title := strings.Join(tailTokens(req.Text, 2), " ") + if title == "" { + title = fmt.Sprintf("Document %s", time.Now().Format("2006-01-02")) + } + doc, err := c.DocsCreate(title) + if err != nil { + return req.Reply("❌ Docs create failed: " + err.Error()) + } + return req.Reply(fmt.Sprintf( + "📄 *Document created!*\nTitle: %s\nID: `%s`\nOpen: https://docs.google.com/document/d/%s/edit", + doc.Title, doc.DocumentID, doc.DocumentID, + )) + + case "open": + docID := nthToken(req.Text, 2) + if docID == "" { + return req.Reply("Usage: /docs open <document-id>") + } + doc, err := c.DocsGet(docID) + if err != nil { + return req.Reply("❌ Docs open failed: " + err.Error()) + } + return req.Reply(fmt.Sprintf( + "📄 *%s*\nID: `%s`\nRevision: %s\nOpen: https://docs.google.com/document/d/%s/edit", + doc.Title, doc.DocumentID, doc.RevisionID, doc.DocumentID, + )) + + case "list": + files, err := c.DriveList("", "application/vnd.google-apps.document", 10) + if err != nil { + return req.Reply("❌ Docs list failed: " + err.Error()) + } + return req.Reply(formatDriveList(files, "Recent Docs")) + + default: + return req.Reply(fmt.Sprintf("Unknown docs action: %s\nUse /docs help.", action)) + } + }, + } +} + +// ── /cal ───────────────────────────────────────────────────────────────────── + +func calCommand() Definition { + return Definition{ + Name: "cal", + Description: "Google Calendar: list upcoming events", + Usage: "/cal [today|week|month|help]", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + action := strings.ToLower(nthToken(req.Text, 1)) + + if action == "help" { + return req.Reply( + "📅 *Calendar Commands*\n\n" + + "• `/cal` or `/cal today` — events today\n" + + "• `/cal week` — next 7 days\n" + + "• `/cal month` — next 30 days\n", + ) + } + + c, err := gws.New() + if err != nil { + return req.Reply("❌ " + err.Error()) + } + + now := time.Now() + var timeMax time.Time + var label string + + switch action { + case "week": + timeMax = now.Add(7 * 24 * time.Hour) + label = "Next 7 Days" + case "month": + timeMax = now.Add(30 * 24 * time.Hour) + label = "Next 30 Days" + default: // today or empty + timeMax = time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location()) + label = "Today" + } + + events, err := c.CalendarList(now, timeMax, 15) + if err != nil { + return req.Reply("❌ Calendar failed: " + err.Error()) + } + + if len(events) == 0 { + return req.Reply(fmt.Sprintf("📅 *%s* — No events.", label)) + } + + var sb strings.Builder + sb.WriteString(fmt.Sprintf("📅 *%s* (%d events)\n\n", label, len(events))) + for _, ev := range events { + t := gws.FormatEventTime(ev) + sb.WriteString(fmt.Sprintf("• %s — %s\n", t, ev.Summary)) + } + return req.Reply(sb.String()) + }, + } +} + +// ── /sheets ────────────────────────────────────────────────────────────────── + +func sheetsCommand() Definition { + return Definition{ + Name: "sheets", + Description: "Google Sheets: list or search spreadsheets", + Usage: "/sheets [list|search <query>|help]", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + action := strings.ToLower(nthToken(req.Text, 1)) + + if action == "help" { + return req.Reply( + "📊 *Sheets Commands*\n\n" + + "• `/sheets list` — recent spreadsheets\n" + + "• `/sheets search <query>` — search by name\n", + ) + } + + c, err := gws.New() + if err != nil { + return req.Reply("❌ " + err.Error()) + } + + const sheetMime = "application/vnd.google-apps.spreadsheet" + switch action { + case "search": + query := strings.Join(tailTokens(req.Text, 2), " ") + if query == "" { + return req.Reply("Usage: /sheets search <query>") + } + files, err := c.DriveList(query, sheetMime, 10) + if err != nil { + return req.Reply("❌ Sheets search failed: " + err.Error()) + } + return req.Reply(formatDriveList(files, "Sheets: "+query)) + + default: // list + files, err := c.DriveList("", sheetMime, 10) + if err != nil { + return req.Reply("❌ Sheets list failed: " + err.Error()) + } + return req.Reply(formatDriveList(files, "Recent Sheets")) + } + }, + } +} + +// ── Helpers ────────────────────────────────────────────────────────────────── + +// tailTokens returns all tokens starting at index n (0-indexed), joined as-is. +func tailTokens(text string, n int) []string { + parts := strings.Fields(strings.TrimSpace(text)) + if n >= len(parts) { + return nil + } + return parts[n:] +} + +func truncateStr(s string, max int) string { + if len(s) <= max { + return s + } + return s[:max] + "..." +} diff --git a/pkg/commands/cmd_help.go b/pkg/commands/cmd_help.go index 720e21209..6db92f19e 100644 --- a/pkg/commands/cmd_help.go +++ b/pkg/commands/cmd_help.go @@ -2,6 +2,9 @@ package commands import ( "context" + "fmt" + "sort" + "strings" ) func helpCommand() Definition { @@ -21,42 +24,28 @@ func helpCommand() Definition { } } -func formatHelpMessage(_ []Definition) string { - return `System: - /help Show this help - /model [name] Show or switch the active model - /version Show version info - /tools List available tools - /debug Toggle debug mode - /ping Connectivity check - /vps login <pw> Set VPS password securely - /whatsapp qr Get WhatsApp pairing QR code - /acp <cmd> <args> Manage active ACP harness sessions +func formatHelpMessage(defs []Definition) string { + sort.Slice(defs, func(i, j int) bool { + return defs[i].Name < defs[j].Name + }) -Jobs: - /job <desc> Create a new job - /status <id> Check job status - /cancel <id> Cancel a job - /list List all jobs + var sb strings.Builder + sb.WriteString("🦞 *PicoClaw Commands*\n\n") -Session: - /undo Undo last turn - /redo Redo undone turn - /compact Compress context window - /clear Clear current thread - /interrupt Stop current operation - /new New conversation thread - /thread <id> Switch to thread - /resume <id> Resume from checkpoint + for _, d := range defs { + // Skip legacy stub commands + if strings.HasPrefix(d.Description, "Alias:") { + continue + } -Skills: - /skills List installed skills - /skills search <q> Search ClawHub registry + usage := d.Usage + if usage == "" { + usage = "/" + d.Name + } + sb.WriteString(fmt.Sprintf("• `%s` — %s\n", usage, d.Description)) + } -Agent: - /heartbeat Run heartbeat check - /summarize Summarize current thread - /suggest Suggest next steps - - /quit Exit` + sb.WriteString("\n• `<shell command>` — Run a shell command (if exec tool enabled)\n") + sb.WriteString("\nTip: All commands are single-word, e.g. `/model gpt-4o`") + return sb.String() } diff --git a/pkg/commands/cmd_list.go b/pkg/commands/cmd_list.go index bf47b6e9c..5320d89f8 100644 --- a/pkg/commands/cmd_list.go +++ b/pkg/commands/cmd_list.go @@ -6,47 +6,51 @@ import ( "strings" ) +// listCommand is kept as a no-op stub for backward compat. +// All functionality moved to /models and /channels. func listCommand() Definition { return Definition{ Name: "list", - Description: "List available options", - SubCommands: []SubCommand{ - { - Name: "models", - Description: "Configured models", - Handler: func(_ context.Context, req Request, rt *Runtime) error { - if rt == nil || rt.GetModelInfo == nil { - return req.Reply(unavailableMsg) - } - name, provider := rt.GetModelInfo() - if provider == "" { - provider = "configured default" - } - return req.Reply(fmt.Sprintf( - "Configured Model: %s\nProvider: %s\n\nTo change models, update config.json", - name, provider, - )) - }, - }, - { - Name: "channels", - Description: "Enabled channels", - Handler: func(_ context.Context, req Request, rt *Runtime) error { - if rt == nil || rt.GetEnabledChannels == nil { - return req.Reply(unavailableMsg) - } - enabled := rt.GetEnabledChannels() - if len(enabled) == 0 { - return req.Reply("No channels enabled") - } - return req.Reply(fmt.Sprintf("Enabled Channels:\n- %s", strings.Join(enabled, "\n- "))) - }, - }, - { - Name: "agents", - Description: "Registered agents", - Handler: agentsHandler(), - }, + Description: "Alias: use /models or /channels", + Usage: "/list", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + return req.Reply("Use /models or /channels instead.") + }, + } +} + +func modelsCommand() Definition { + return Definition{ + Name: "models", + Description: "Show the currently configured model", + Usage: "/models", + Handler: func(_ context.Context, req Request, rt *Runtime) error { + if rt == nil || rt.GetModelInfo == nil { + return req.Reply(unavailableMsg) + } + name, provider := rt.GetModelInfo() + if provider == "" { + provider = "configured default" + } + return req.Reply(fmt.Sprintf("Model: %s\nProvider: %s", name, provider)) + }, + } +} + +func channelsCommand() Definition { + return Definition{ + Name: "channels", + Description: "List enabled channels", + Usage: "/channels", + Handler: func(_ context.Context, req Request, rt *Runtime) error { + if rt == nil || rt.GetEnabledChannels == nil { + return req.Reply(unavailableMsg) + } + enabled := rt.GetEnabledChannels() + if len(enabled) == 0 { + return req.Reply("No channels enabled.") + } + return req.Reply("Enabled channels:\n- " + strings.Join(enabled, "\n- ")) }, } } diff --git a/pkg/commands/cmd_show.go b/pkg/commands/cmd_show.go index c655e6880..22e3f4368 100644 --- a/pkg/commands/cmd_show.go +++ b/pkg/commands/cmd_show.go @@ -5,34 +5,49 @@ import ( "fmt" ) +// showCommand is kept as a no-op stub for backward compat. +// All functionality moved to /model, /channel, /agents. func showCommand() Definition { return Definition{ Name: "show", - Description: "Show current configuration", - SubCommands: []SubCommand{ - { - Name: "model", - Description: "Current model and provider", - Handler: func(_ context.Context, req Request, rt *Runtime) error { - if rt == nil || rt.GetModelInfo == nil { - return req.Reply(unavailableMsg) - } - name, provider := rt.GetModelInfo() - return req.Reply(fmt.Sprintf("Current Model: %s (Provider: %s)", name, provider)) - }, - }, - { - Name: "channel", - Description: "Current channel", - Handler: func(_ context.Context, req Request, _ *Runtime) error { - return req.Reply(fmt.Sprintf("Current Channel: %s", req.Channel)) - }, - }, - { - Name: "agents", - Description: "Registered agents", - Handler: agentsHandler(), - }, + Description: "Alias: use /model, /channel, or /agents", + Usage: "/show", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + return req.Reply("Use /model, /channel, or /agents instead.") }, } } + +func channelCommand() Definition { + return Definition{ + Name: "channel", + Description: "Show current channel or check a named channel", + Usage: "/channel [name]", + Handler: func(_ context.Context, req Request, rt *Runtime) error { + name := nthToken(req.Text, 1) + + // No arg: show current channel + if name == "" { + return req.Reply(fmt.Sprintf("Current channel: %s", req.Channel)) + } + + // With arg: check/switch channel + if rt == nil || rt.SwitchChannel == nil { + return req.Reply(unavailableMsg) + } + if err := rt.SwitchChannel(name); err != nil { + return req.Reply(fmt.Sprintf("Channel '%s' is not available: %v", name, err)) + } + return req.Reply(fmt.Sprintf("Channel '%s' is available and enabled.", name)) + }, + } +} + +func agentsCommand() Definition { + return Definition{ + Name: "agents", + Description: "List registered agents", + Usage: "/agents", + Handler: agentsHandler(), + } +} diff --git a/pkg/commands/cmd_switch.go b/pkg/commands/cmd_switch.go index fb8fc109e..5fd453611 100644 --- a/pkg/commands/cmd_switch.go +++ b/pkg/commands/cmd_switch.go @@ -1,42 +1,16 @@ package commands -import ( - "context" - "fmt" -) +import "context" +// switchCommand is kept as a no-op stub for backward compat. +// Use /model <name> to switch models. func switchCommand() Definition { return Definition{ Name: "switch", - Description: "Switch model", - SubCommands: []SubCommand{ - { - Name: "model", - Description: "Switch to a different model", - ArgsUsage: "to <name>", - Handler: func(_ context.Context, req Request, rt *Runtime) error { - if rt == nil || rt.SwitchModel == nil { - return req.Reply(unavailableMsg) - } - // Parse: /switch model to <value> - value := nthToken(req.Text, 3) // tokens: [/switch, model, to, <value>] - if nthToken(req.Text, 2) != "to" || value == "" { - return req.Reply("Usage: /switch model to <name>") - } - oldModel, err := rt.SwitchModel(value) - if err != nil { - return req.Reply(err.Error()) - } - return req.Reply(fmt.Sprintf("Switched model from %s to %s", oldModel, value)) - }, - }, - { - Name: "channel", - Description: "Moved to /check channel", - Handler: func(_ context.Context, req Request, _ *Runtime) error { - return req.Reply("This command has moved. Please use: /check channel <name>") - }, - }, + Description: "Alias: use /model <name> to switch", + Usage: "/switch", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + return req.Reply("Use /model <name> to switch models.") }, } } diff --git a/pkg/commands/cmd_system.go b/pkg/commands/cmd_system.go index d92806921..05933cfc8 100644 --- a/pkg/commands/cmd_system.go +++ b/pkg/commands/cmd_system.go @@ -84,29 +84,33 @@ func modelCommand() Definition { func vpsCommand() Definition { return Definition{ Name: "vps", - Description: "Configure VPS credentials", - Usage: "/vps login <password>", - SubCommands: []SubCommand{ - { - Name: "login", - Description: "Set VPS password securely", - ArgsUsage: "<password>", - Handler: func(_ context.Context, req Request, _ *Runtime) error { - password := nthToken(req.Text, 2) - if password == "" { - return req.Reply("Usage: /vps login <password>") - } - cred := &auth.AuthCredential{ - AccessToken: password, - Provider: "vps", - AuthMethod: "password", - } - if err := auth.SetCredential("vps", cred); err != nil { - return req.Reply(fmt.Sprintf("Failed to save VPS credentials: %v", err)) - } - return req.Reply("VPS credentials saved securely.") - }, - }, + Description: "Alias: use /vpslogin <password>", + Usage: "/vps", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + return req.Reply("Use /vpslogin <password> to set VPS credentials.") + }, + } +} + +func vpsloginCommand() Definition { + return Definition{ + Name: "vpslogin", + Description: "Set VPS password securely", + Usage: "/vpslogin <password>", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + password := nthToken(req.Text, 1) + if password == "" { + return req.Reply("Usage: /vpslogin <password>") + } + cred := &auth.AuthCredential{ + AccessToken: password, + Provider: "vps", + AuthMethod: "password", + } + if err := auth.SetCredential("vps", cred); err != nil { + return req.Reply(fmt.Sprintf("Failed to save VPS credentials: %v", err)) + } + return req.Reply("VPS credentials saved securely.") }, } } diff --git a/pkg/commands/cmd_whatsapp.go b/pkg/commands/cmd_whatsapp.go index 7b9b4b51d..407b91ca2 100644 --- a/pkg/commands/cmd_whatsapp.go +++ b/pkg/commands/cmd_whatsapp.go @@ -5,37 +5,44 @@ import ( "fmt" ) -type qrProvider interface { - GetLastQR() string -} - -func whatsappCommand() Definition { +func qrCommand() Definition { return Definition{ - Name: "whatsapp", - Description: "WhatsApp management commands", - SubCommands: []SubCommand{ - { - Name: "qr", - Description: "Get the latest WhatsApp pairing QR code", - Handler: func(ctx context.Context, req Request, rt *Runtime) error { - ch, ok := rt.GetChannel("whatsapp_native") - if !ok { - return req.Reply("whatsapp_native channel is not enabled") - } + Name: "qr", + Description: "Get the WhatsApp pairing QR code", + Usage: "/qr", + Handler: func(ctx context.Context, req Request, rt *Runtime) error { + ch, ok := rt.GetChannel("whatsapp_native") + if !ok { + return req.Reply("whatsapp_native channel is not enabled.") + } - qp, ok := ch.(qrProvider) - if !ok { - return req.Reply("whatsapp_native channel does not support QR retrieval") - } + type qrProvider interface { + GetLastQR() string + } - qr := qp.GetLastQR() - if qr == "" { - return req.Reply("no QR code available yet. please wait for the channel to initialize") - } + qp, ok := ch.(qrProvider) + if !ok { + return req.Reply("whatsapp_native channel does not support QR retrieval.") + } - return req.Reply(fmt.Sprintf("Scan this QR code string (or wait for image support): %s", qr)) - }, - }, + qr := qp.GetLastQR() + if qr == "" { + return req.Reply("No QR code available yet. Wait for the channel to initialize.") + } + + return req.Reply(fmt.Sprintf("Scan this QR code: %s", qr)) + }, + } +} + +// whatsappCommand kept as a stub for backward compat. +func whatsappCommand() Definition { + return Definition{ + Name: "whatsapp", + Description: "Alias: use /qr", + Usage: "/whatsapp", + Handler: func(_ context.Context, req Request, _ *Runtime) error { + return req.Reply("Use /qr to get the WhatsApp pairing QR code.") }, } } diff --git a/pkg/config/config.go b/pkg/config/config.go index 798ec0d26..e312ceec4 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -7,6 +7,7 @@ import ( "sync/atomic" "github.com/caarlos0/env/v11" + "github.com/go-playground/validator/v10" "github.com/sipeed/picoclaw/pkg/fileutil" ) @@ -130,11 +131,11 @@ func (m AgentModelConfig) MarshalJSON() ([]byte, error) { } type AgentConfig struct { - ID string `json:"id"` + ID string `json:"id" validate:"required"` Default bool `json:"default,omitempty"` Name string `json:"name,omitempty"` Workspace string `json:"workspace,omitempty"` - Model *AgentModelConfig `json:"model,omitempty"` + Model *AgentModelConfig `json:"model,omitempty" validate:"required"` Skills []string `json:"skills,omitempty"` Subagents *SubagentsConfig `json:"subagents,omitempty"` } @@ -189,9 +190,9 @@ type AgentDefaults struct { ModelFallbacks []string `json:"model_fallbacks,omitempty"` ImageModel string `json:"image_model,omitempty" env:"PICOCLAW_AGENTS_DEFAULTS_IMAGE_MODEL"` ImageModelFallbacks []string `json:"image_model_fallbacks,omitempty"` - MaxTokens int `json:"max_tokens" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_TOKENS"` - Temperature *float64 `json:"temperature,omitempty" env:"PICOCLAW_AGENTS_DEFAULTS_TEMPERATURE"` - MaxToolIterations int `json:"max_tool_iterations" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_TOOL_ITERATIONS"` + MaxTokens int `json:"max_tokens" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_TOKENS" validate:"gt=0"` + Temperature *float64 `json:"temperature,omitempty" env:"PICOCLAW_AGENTS_DEFAULTS_TEMPERATURE" validate:"omitempty,gte=0,lte=2"` + MaxToolIterations int `json:"max_tool_iterations" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_TOOL_ITERATIONS" validate:"gte=1,lte=100"` SummarizeMessageThreshold int `json:"summarize_message_threshold" env:"PICOCLAW_AGENTS_DEFAULTS_SUMMARIZE_MESSAGE_THRESHOLD"` SummarizeTokenPercent int `json:"summarize_token_percent" env:"PICOCLAW_AGENTS_DEFAULTS_SUMMARIZE_TOKEN_PERCENT"` MaxMediaSize int `json:"max_media_size,omitempty" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_MEDIA_SIZE"` @@ -603,6 +604,18 @@ type TavilyConfig struct { MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_TAVILY_MAX_RESULTS"` } +type ElevenLabsConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_VOICE_ELEVENLABS_ENABLED"` + APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_VOICE_ELEVENLABS_API_KEY"` + VoiceID string `json:"voice_id" env:"PICOCLAW_TOOLS_VOICE_ELEVENLABS_VOICE_ID"` +} + +type InteractionConfig struct { + WritingStyle string `json:"writing_style" env:"PICOCLAW_INTERACTION_WRITING_STYLE"` + AutoReplyEnabled bool `json:"autoreply_enabled" env:"PICOCLAW_INTERACTION_AUTOREPLY_ENABLED"` + ApprovalRequired bool `json:"approval_required" env:"PICOCLAW_INTERACTION_APPROVAL_REQUIRED"` +} + type DuckDuckGoConfig struct { Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_DUCKDUCKGO_ENABLED"` MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_DUCKDUCKGO_MAX_RESULTS"` @@ -676,9 +689,10 @@ type MediaCleanupConfig struct { Interval int ` env:"PICOCLAW_MEDIA_CLEANUP_INTERVAL" json:"interval_minutes"` } -type ReadFileToolConfig struct { - Enabled bool `json:"enabled"` - MaxReadFileSize int `json:"max_read_file_size"` +type ProactiveConfig struct { + Enabled bool `json:"enabled" env:"PICOCLAW_PROACTIVE_ENABLED"` + SyncIntervalMinutes int `json:"sync_interval_minutes" env:"PICOCLAW_PROACTIVE_SYNC_INTERVAL"` + ProcessIntervalMinutes int `json:"process_interval_minutes" env:"PICOCLAW_PROACTIVE_PROCESS_INTERVAL"` } type ToolsConfig struct { @@ -694,11 +708,14 @@ type ToolsConfig struct { EditFile ToolConfig `json:"edit_file" envPrefix:"PICOCLAW_TOOLS_EDIT_FILE_"` FindSkills ToolConfig `json:"find_skills" envPrefix:"PICOCLAW_TOOLS_FIND_SKILLS_"` I2C ToolConfig `json:"i2c" envPrefix:"PICOCLAW_TOOLS_I2C_"` + Browser ToolConfig `json:"browser" envPrefix:"PICOCLAW_TOOLS_BROWSER_"` + Image ToolConfig `json:"image" envPrefix:"PICOCLAW_TOOLS_IMAGE_"` InstallSkill ToolConfig `json:"install_skill" envPrefix:"PICOCLAW_TOOLS_INSTALL_SKILL_"` Google ToolConfig `json:"google" envPrefix:"PICOCLAW_TOOLS_GOOGLE_"` ListDir ToolConfig `json:"list_dir" envPrefix:"PICOCLAW_TOOLS_LIST_DIR_"` Message ToolConfig `json:"message" envPrefix:"PICOCLAW_TOOLS_MESSAGE_"` ReadFile ReadFileToolConfig `json:"read_file" envPrefix:"PICOCLAW_TOOLS_READ_FILE_"` + PDF ToolConfig `json:"pdf" envPrefix:"PICOCLAW_TOOLS_PDF_"` SendFile ToolConfig `json:"send_file" envPrefix:"PICOCLAW_TOOLS_SEND_FILE_"` Spawn ToolConfig `json:"spawn" envPrefix:"PICOCLAW_TOOLS_SPAWN_"` SPI ToolConfig `json:"spi" envPrefix:"PICOCLAW_TOOLS_SPI_"` @@ -707,6 +724,9 @@ type ToolsConfig struct { VPS VPSConfig `json:"vps" envPrefix:"PICOCLAW_TOOLS_VPS_"` VoiceCall ToolConfig `json:"voice_call" envPrefix:"PICOCLAW_TOOLS_VOICECALL_"` WriteFile ToolConfig `json:"write_file" envPrefix:"PICOCLAW_TOOLS_WRITE_FILE_"` + Proactive ProactiveConfig `json:"proactive"` + ElevenLabs ElevenLabsConfig `json:"elevenlabs"` + Interaction InteractionConfig `json:"interaction"` } type SearchCacheConfig struct { @@ -791,6 +811,11 @@ func LoadConfig(path string) (*Config, error) { return nil, err } + validate := validator.New() + if err := validate.Struct(cfg); err != nil { + return nil, fmt.Errorf("config validation failed: %w", err) + } + // Migrate legacy channel config fields to new unified structures cfg.migrateChannelConfigs() @@ -960,6 +985,10 @@ func (t *ToolsConfig) IsToolEnabled(name string) bool { return t.FindSkills.Enabled case "i2c": return t.I2C.Enabled + case "browser": + return t.Browser.Enabled + case "image": + return t.Image.Enabled case "install_skill": return t.InstallSkill.Enabled case "google": @@ -972,6 +1001,8 @@ func (t *ToolsConfig) IsToolEnabled(name string) bool { return t.Message.Enabled case "read_file": return t.ReadFile.Enabled + case "pdf": + return t.PDF.Enabled case "spawn": return t.Spawn.Enabled case "spi": diff --git a/pkg/config/defaults.go b/pkg/config/defaults.go index 66e173d5e..e30f9a7ba 100644 --- a/pkg/config/defaults.go +++ b/pkg/config/defaults.go @@ -497,6 +497,15 @@ func DefaultConfig() *Config { Message: ToolConfig{ Enabled: true, }, + PDF: ToolConfig{ + Enabled: true, + }, + Browser: ToolConfig{ + Enabled: false, // Requires Chrome/Chromium installed + }, + Image: ToolConfig{ + Enabled: true, + }, ReadFile: ReadFileToolConfig{ Enabled: true, MaxReadFileSize: 64 * 1024, // 64KB @@ -521,6 +530,19 @@ func DefaultConfig() *Config { WriteFile: ToolConfig{ Enabled: true, }, + Proactive: ProactiveConfig{ + Enabled: true, + SyncIntervalMinutes: 60, + ProcessIntervalMinutes: 120, + }, + ElevenLabs: ElevenLabsConfig{ + Enabled: false, + }, + Interaction: InteractionConfig{ + WritingStyle: "Casual and helpful", + AutoReplyEnabled: false, + ApprovalRequired: true, + }, }, Heartbeat: HeartbeatConfig{ Enabled: true, diff --git a/pkg/config/migration.go b/pkg/config/migration.go index 24d567f85..c515478c2 100644 --- a/pkg/config/migration.go +++ b/pkg/config/migration.go @@ -14,10 +14,31 @@ import ( // If the model already contains a "/" (indicating it has a protocol prefix), it is returned as-is. // Otherwise, the protocol prefix is added. func buildModelWithProtocol(protocol, model string) string { + if model == "" { + return "" + } + + // If the model already starts with the protocol prefix, return as-is prefix := protocol + "/" if strings.HasPrefix(model, prefix) { return model } + + // Handle known nested prefixes for specific providers + // Example: provider 'nvidia' and model 'meta/llama-3.1' -> 'nvidia/meta/llama-3.1' + if protocol == "nvidia" && (strings.HasPrefix(model, "meta/") || strings.HasPrefix(model, "nvidia/")) { + if strings.HasPrefix(model, "nvidia/") { + return model // Already correctly prefixed + } + return prefix + model + } + + // If the model already has some other protocol prefix (contains "/"), + // we assume it's intentional and return it as-is. + if strings.Contains(model, "/") { + return model + } + return prefix + model } diff --git a/pkg/gws/client.go b/pkg/gws/client.go new file mode 100644 index 000000000..53d031ba3 --- /dev/null +++ b/pkg/gws/client.go @@ -0,0 +1,327 @@ +// Package gws provides a lightweight Google Workspace REST client. +// It uses stored OAuth credentials (google-antigravity) and makes +// direct HTTP calls to Google APIs without requiring the full Google SDK. +package gws + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "time" + + "github.com/sipeed/picoclaw/pkg/auth" +) + +const ( + gmailBase = "https://gmail.googleapis.com/gmail/v1/users/me" + driveBase = "https://www.googleapis.com/drive/v3" + calBase = "https://www.googleapis.com/calendar/v3" + docsBase = "https://docs.googleapis.com/v1" + sheetsBase = "https://sheets.googleapis.com/v4" + providerKey = "google-antigravity" +) + +// Client is a thin GWS REST client backed by a stored OAuth token. +type Client struct { + http *http.Client + token string +} + +// New creates a GWS client from stored credentials. Returns an error if not authenticated. +func New() (*Client, error) { + cred, err := auth.GetCredential(providerKey) + if err != nil { + return nil, fmt.Errorf("failed to load Google credentials: %w", err) + } + if cred == nil { + return nil, fmt.Errorf("not authenticated. Use /glogin first") + } + if cred.IsExpired() { + // Attempt token refresh + cfg := auth.GoogleAntigravityOAuthConfig() + refreshed, err := auth.RefreshAccessToken(cred, cfg) + if err != nil { + return nil, fmt.Errorf("token expired and refresh failed: %w. Use /glogin to re-authenticate", err) + } + if err := auth.SetCredential(providerKey, refreshed); err != nil { + return nil, fmt.Errorf("failed to save refreshed token: %w", err) + } + cred = refreshed + } + return &Client{ + http: &http.Client{Timeout: 15 * time.Second}, + token: cred.AccessToken, + }, nil +} + +// get performs an authenticated GET request and decodes JSON into dest. +func (c *Client) get(rawURL string, dest any) error { + req, err := http.NewRequest("GET", rawURL, nil) + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+c.token) + req.Header.Set("Accept", "application/json") + + resp, err := c.http.Do(req) + if err != nil { + return fmt.Errorf("request failed: %w", err) + } + defer resp.Body.Close() + + body, _ := io.ReadAll(resp.Body) + if resp.StatusCode >= 400 { + return fmt.Errorf("API error %d: %s", resp.StatusCode, truncate(string(body), 200)) + } + if dest != nil { + if err := json.Unmarshal(body, dest); err != nil { + return fmt.Errorf("failed to parse response: %w", err) + } + } + return nil +} + +// post performs an authenticated POST request with a JSON body. +func (c *Client) post(rawURL string, body any, dest any) error { + b, err := json.Marshal(body) + if err != nil { + return err + } + req, err := http.NewRequest("POST", rawURL, strings.NewReader(string(b))) + if err != nil { + return err + } + req.Header.Set("Authorization", "Bearer "+c.token) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Accept", "application/json") + + resp, err := c.http.Do(req) + if err != nil { + return fmt.Errorf("request failed: %w", err) + } + defer resp.Body.Close() + + respBody, _ := io.ReadAll(resp.Body) + if resp.StatusCode >= 400 { + return fmt.Errorf("API error %d: %s", resp.StatusCode, truncate(string(respBody), 200)) + } + if dest != nil { + if err := json.Unmarshal(respBody, dest); err != nil { + return fmt.Errorf("failed to parse response: %w", err) + } + } + return nil +} + +// ── Gmail ──────────────────────────────────────────────────────────────────── + +type GmailMessage struct { + ID string `json:"id"` + Snippet string `json:"snippet"` + Payload struct { + Headers []struct { + Name string `json:"name"` + Value string `json:"value"` + } `json:"headers"` + } `json:"payload"` +} + +type GmailListResponse struct { + Messages []struct{ ID string `json:"id"` } `json:"messages"` + ResultSizeEstimate int `json:"resultSizeEstimate"` +} + +func (c *Client) GmailList(query string, maxResults int) ([]GmailMessage, error) { + if maxResults <= 0 { + maxResults = 10 + } + params := url.Values{ + "maxResults": {fmt.Sprintf("%d", maxResults)}, + } + if query != "" { + params.Set("q", query) + } + var listResp GmailListResponse + if err := c.get(gmailBase+"/messages?"+params.Encode(), &listResp); err != nil { + return nil, err + } + + var messages []GmailMessage + for i, m := range listResp.Messages { + if i >= maxResults { + break + } + var msg GmailMessage + if err := c.get(fmt.Sprintf("%s/messages/%s?format=metadata&metadataHeaders=Subject&metadataHeaders=From&metadataHeaders=Date", gmailBase, m.ID), &msg); err != nil { + continue + } + messages = append(messages, msg) + } + return messages, nil +} + +func (c *Client) GmailRead(msgID string) (*GmailMessage, error) { + var msg GmailMessage + if err := c.get(fmt.Sprintf("%s/messages/%s?format=full", gmailBase, msgID), &msg); err != nil { + return nil, err + } + return &msg, nil +} + +// ── Drive ──────────────────────────────────────────────────────────────────── + +type DriveFile struct { + ID string `json:"id"` + Name string `json:"name"` + MimeType string `json:"mimeType"` + ModifiedTime string `json:"modifiedTime"` + WebViewLink string `json:"webViewLink"` +} + +type DriveListResponse struct { + Files []DriveFile `json:"files"` + NextPageToken string `json:"nextPageToken"` +} + +func (c *Client) DriveList(query string, mimeFilter string, maxResults int) ([]DriveFile, error) { + if maxResults <= 0 { + maxResults = 10 + } + q := "trashed=false" + if query != "" { + q += fmt.Sprintf(" and name contains '%s'", strings.ReplaceAll(query, "'", "\\'")) + } + if mimeFilter != "" { + q += fmt.Sprintf(" and mimeType='%s'", mimeFilter) + } + params := url.Values{ + "q": {q}, + "pageSize": {fmt.Sprintf("%d", maxResults)}, + "fields": {"files(id,name,mimeType,modifiedTime,webViewLink)"}, + "orderBy": {"modifiedTime desc"}, + } + var resp DriveListResponse + if err := c.get(driveBase+"/files?"+params.Encode(), &resp); err != nil { + return nil, err + } + return resp.Files, nil +} + +// ── Calendar ───────────────────────────────────────────────────────────────── + +type CalendarEvent struct { + ID string `json:"id"` + Summary string `json:"summary"` + Start struct { + DateTime string `json:"dateTime"` + Date string `json:"date"` + } `json:"start"` + End struct { + DateTime string `json:"dateTime"` + Date string `json:"date"` + } `json:"end"` + HtmlLink string `json:"htmlLink"` + Description string `json:"description"` +} + +type CalendarListResponse struct { + Items []CalendarEvent `json:"items"` +} + +func (c *Client) CalendarList(timeMin, timeMax time.Time, maxResults int) ([]CalendarEvent, error) { + if maxResults <= 0 { + maxResults = 10 + } + params := url.Values{ + "timeMin": {timeMin.UTC().Format(time.RFC3339)}, + "timeMax": {timeMax.UTC().Format(time.RFC3339)}, + "maxResults": {fmt.Sprintf("%d", maxResults)}, + "singleEvents": {"true"}, + "orderBy": {"startTime"}, + } + var resp CalendarListResponse + if err := c.get(calBase+"/calendars/primary/events?"+params.Encode(), &resp); err != nil { + return nil, err + } + return resp.Items, nil +} + +// ── Docs ───────────────────────────────────────────────────────────────────── + +type DocsDocument struct { + DocumentID string `json:"documentId"` + Title string `json:"title"` + RevisionID string `json:"revisionId"` +} + +func (c *Client) DocsCreate(title string) (*DocsDocument, error) { + var doc DocsDocument + if err := c.post(docsBase+"/documents", map[string]string{"title": title}, &doc); err != nil { + return nil, err + } + return &doc, nil +} + +func (c *Client) DocsGet(docID string) (*DocsDocument, error) { + var doc DocsDocument + if err := c.get(fmt.Sprintf("%s/documents/%s", docsBase, docID), &doc); err != nil { + return nil, err + } + return &doc, nil +} + +// ── Helpers ────────────────────────────────────────────────────────────────── + +func truncate(s string, max int) string { + if len(s) <= max { + return s + } + return s[:max] + "..." +} + +// HeaderValue extracts a Gmail message header value by name. +func HeaderValue(msg GmailMessage, name string) string { + for _, h := range msg.Payload.Headers { + if strings.EqualFold(h.Name, name) { + return h.Value + } + } + return "" +} + +// FormatEventTime returns a human-readable event time string. +func FormatEventTime(ev CalendarEvent) string { + dt := ev.Start.DateTime + if dt == "" { + return ev.Start.Date // all-day event + } + t, err := time.Parse(time.RFC3339, dt) + if err != nil { + return dt + } + return t.Local().Format("Mon Jan 2, 15:04") +} + +// MimeTypeLabel returns a short display label for a Drive MIME type. +func MimeTypeLabel(mime string) string { + switch mime { + case "application/vnd.google-apps.document": + return "Doc" + case "application/vnd.google-apps.spreadsheet": + return "Sheet" + case "application/vnd.google-apps.presentation": + return "Slides" + case "application/vnd.google-apps.folder": + return "📁" + case "application/pdf": + return "PDF" + default: + if strings.HasPrefix(mime, "image/") { + return "Image" + } + return "File" + } +} diff --git a/pkg/health/server.go b/pkg/health/server.go index 5609ebdf6..7db422f8b 100644 --- a/pkg/health/server.go +++ b/pkg/health/server.go @@ -7,6 +7,7 @@ import ( "maps" "net/http" "sync" + "sync/atomic" "time" ) @@ -16,6 +17,39 @@ type Server struct { ready bool checks map[string]Check startTime time.Time + metrics *Metrics +} + +type Metrics struct { + mu sync.RWMutex + Counters map[string]int64 `json:"counters"` + Latencies map[string][]int64 `json:"latencies_ms"` + LastUpdate time.Time `json:"last_update"` +} + +var ( + DefaultMetrics = &Metrics{ + Counters: make(map[string]int64), + Latencies: make(map[string][]int64), + } +) + +func (m *Metrics) RecordCounter(name string, val int64) { + m.mu.Lock() + defer m.mu.Unlock() + m.Counters[name] += val + m.LastUpdate = time.Now() +} + +func (m *Metrics) RecordLatency(name string, ms int64) { + m.mu.Lock() + defer m.mu.Unlock() + m.Latencies[name] = append(m.Latencies[name], ms) + // Keep only last 100 samples + if len(m.Latencies[name]) > 100 { + m.Latencies[name] = m.Latencies[name][len(m.Latencies[name])-100:] + } + m.LastUpdate = time.Now() } type Check struct { @@ -41,6 +75,7 @@ func NewServer(host string, port int) *Server { mux.HandleFunc("/health", s.healthHandler) mux.HandleFunc("/ready", s.readyHandler) + mux.HandleFunc("/metrics", s.metricsHandler) addr := fmt.Sprintf("%s:%d", host, port) s.server = &http.Server{ @@ -117,6 +152,16 @@ func (s *Server) healthHandler(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(resp) } +func (s *Server) metricsHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + + DefaultMetrics.mu.RLock() + defer DefaultMetrics.mu.RUnlock() + + json.NewEncoder(w).Encode(DefaultMetrics) +} + func (s *Server) readyHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") diff --git a/pkg/providers/openai_compat/provider.go b/pkg/providers/openai_compat/provider.go index 0e8db7409..cda1e1380 100644 --- a/pkg/providers/openai_compat/provider.go +++ b/pkg/providers/openai_compat/provider.go @@ -406,6 +406,21 @@ func serializeMessages(messages []Message) []any { "url": mediaURL, }, }) + } else if strings.HasPrefix(mediaURL, "data:application/pdf") { + parts = append(parts, map[string]any{ + "type": "file_url", + "file_url": map[string]any{ + "url": mediaURL, + }, + }) + } else if strings.HasPrefix(mediaURL, "data:") { + // Fallback for other media types (e.g. audio, video) + parts = append(parts, map[string]any{ + "type": "file_url", + "file_url": map[string]any{ + "url": mediaURL, + }, + }) } } diff --git a/pkg/session/manager.go b/pkg/session/manager.go index 52d4a5df6..a00589b18 100644 --- a/pkg/session/manager.go +++ b/pkg/session/manager.go @@ -2,6 +2,7 @@ package session import ( "encoding/json" + "hash/crc32" "os" "path/filepath" "strings" @@ -18,6 +19,7 @@ type Session struct { Metadata map[string]any `json:"metadata,omitempty"` Created time.Time `json:"created"` Updated time.Time `json:"updated"` + Checksum uint32 `json:"checksum,omitempty"` } type SessionManager struct { @@ -227,10 +229,19 @@ func (sm *SessionManager) Save(key string) error { } sm.mu.RUnlock() + // Calculate checksum of JSON without checksum field + snapshot.Checksum = 0 data, err := json.MarshalIndent(snapshot, "", " ") if err != nil { return err } + snapshot.Checksum = crc32.ChecksumIEEE(data) + + // Re-marshal with checksum + data, err = json.MarshalIndent(snapshot, "", " ") + if err != nil { + return err + } sessionPath := filepath.Join(sm.storage, filename+".json") bakPath := sessionPath + ".bak" @@ -305,8 +316,24 @@ func (sm *SessionManager) loadSessions() error { // Try to recover from backup if bakData, bakErr := os.ReadFile(bakPath); bakErr == nil { if err := json.Unmarshal(bakData, &session); err == nil { - sm.sessions[session.Key] = &session - continue + if sm.verifyChecksum(&session) { + sm.sessions[session.Key] = &session + continue + } + } + } + continue + } + + if !sm.verifyChecksum(&session) { + // Try backup if primary is corrupted + if bakData, bakErr := os.ReadFile(bakPath); bakErr == nil { + var bakSession Session + if err := json.Unmarshal(bakData, &bakSession); err == nil { + if sm.verifyChecksum(&bakSession) { + sm.sessions[bakSession.Key] = &bakSession + continue + } } } continue @@ -333,3 +360,18 @@ func (sm *SessionManager) SetHistory(key string, history []providers.Message) { session.Updated = time.Now() } } + +func (sm *SessionManager) verifyChecksum(s *Session) bool { + if s.Checksum == 0 { + return true // Legacy session + } + saved := s.Checksum + s.Checksum = 0 + defer func() { s.Checksum = saved }() + + data, err := json.MarshalIndent(s, "", " ") + if err != nil { + return false + } + return crc32.ChecksumIEEE(data) == saved +} diff --git a/pkg/skills/clawhub_registry.go b/pkg/skills/clawhub_registry.go index bd4bed8fb..7f7b80be3 100644 --- a/pkg/skills/clawhub_registry.go +++ b/pkg/skills/clawhub_registry.go @@ -174,6 +174,22 @@ type clawhubModerationInfo struct { IsSuspicious bool `json:"isSuspicious"` } +type clawhubDetailsResponse struct { + Slug string `json:"slug"` + DisplayName string `json:"displayName"` + Summary string `json:"summary"` + Description string `json:"description"` + Version string `json:"version"` + Author string `json:"author"` + Homepage string `json:"homepage"` + Repository string `json:"repository"` + License string `json:"license"` + Moderation *clawhubModerationInfo `json:"moderation"` + Files []string `json:"files"` + Tools []string `json:"tools"` + Permissions []string `json:"permissions"` +} + func (c *ClawHubRegistry) GetSkillMeta(ctx context.Context, slug string) (*SkillMeta, error) { if err := utils.ValidateSkillIdentifier(slug); err != nil { return nil, fmt.Errorf("invalid slug %q: error: %s", slug, err.Error()) @@ -209,6 +225,60 @@ func (c *ClawHubRegistry) GetSkillMeta(ctx context.Context, slug string) (*Skill return meta, nil } +func (c *ClawHubRegistry) Inspect(ctx context.Context, slug string) (*SkillDetails, error) { + if err := utils.ValidateSkillIdentifier(slug); err != nil { + return nil, fmt.Errorf("invalid slug %q: error: %s", slug, err.Error()) + } + + // Assuming inspection endpoint is /api/v1/skills/{slug}/inspect or similar + u := c.baseURL + c.skillsPath + "/" + url.PathEscape(slug) + "/inspect" + + body, err := c.doGet(ctx, u) + if err != nil { + // Fallback to basic metadata if inspection endpoint is not available + basicMeta, basicErr := c.GetSkillMeta(ctx, slug) + if basicErr != nil { + return nil, fmt.Errorf("skill inspection failed: %w", err) + } + return &SkillDetails{ + Slug: basicMeta.Slug, + DisplayName: basicMeta.DisplayName, + Summary: basicMeta.Summary, + IsMalwareBlocked: basicMeta.IsMalwareBlocked, + IsSuspicious: basicMeta.IsSuspicious, + RegistryName: c.Name(), + }, nil + } + + var resp clawhubDetailsResponse + if err := json.Unmarshal(body, &resp); err != nil { + return nil, fmt.Errorf("failed to parse skill inspection details: %w", err) + } + + details := &SkillDetails{ + Slug: resp.Slug, + DisplayName: resp.DisplayName, + Summary: resp.Summary, + Description: resp.Description, + Version: resp.Version, + Author: resp.Author, + Homepage: resp.Homepage, + Repository: resp.Repository, + License: resp.License, + Files: resp.Files, + Tools: resp.Tools, + Permissions: resp.Permissions, + RegistryName: c.Name(), + } + + if resp.Moderation != nil { + details.IsMalwareBlocked = resp.Moderation.IsMalwareBlocked + details.IsSuspicious = resp.Moderation.IsSuspicious + } + + return details, nil +} + // --- DownloadAndInstall --- // DownloadAndInstall fetches metadata (with fallback), resolves version, diff --git a/pkg/skills/registry.go b/pkg/skills/registry.go index 45ae72253..ddf09136a 100644 --- a/pkg/skills/registry.go +++ b/pkg/skills/registry.go @@ -33,6 +33,25 @@ type SkillMeta struct { RegistryName string `json:"registry_name"` } +// SkillDetails provides in-depth information about a skill for trust/safety inspection. +type SkillDetails struct { + Slug string `json:"slug"` + DisplayName string `json:"display_name"` + Summary string `json:"summary"` + Description string `json:"description"` + Version string `json:"version"` + Author string `json:"author"` + Homepage string `json:"homepage"` + Repository string `json:"repository"` + License string `json:"license"` + IsMalwareBlocked bool `json:"is_malware_blocked"` + IsSuspicious bool `json:"is_suspicious"` + Files []string `json:"files"` // List of files in the skill + Tools []string `json:"tools"` // List of tools/commands provided + Permissions []string `json:"permissions"` // Required permissions + RegistryName string `json:"registry_name"` +} + // InstallResult is returned by DownloadAndInstall to carry metadata // back to the caller for moderation and user messaging. type InstallResult struct { @@ -55,6 +74,8 @@ type SkillRegistry interface { // installs the skill to targetDir. Returns an InstallResult with metadata // for the caller to use for moderation and user messaging. DownloadAndInstall(ctx context.Context, slug, version, targetDir string) (*InstallResult, error) + // Inspect retrieves detailed information about a skill for safety review. + Inspect(ctx context.Context, slug string) (*SkillDetails, error) } // RegistryConfig holds configuration for all skill registries. diff --git a/pkg/tools/browser.go b/pkg/tools/browser.go new file mode 100644 index 000000000..96211b097 --- /dev/null +++ b/pkg/tools/browser.go @@ -0,0 +1,172 @@ +package tools + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strings" + "time" + + "github.com/chromedp/chromedp" + "github.com/sipeed/picoclaw/pkg/media" +) + +// BrowserTool provides browser automation capabilities using chromedp. +type BrowserTool struct { + workspace string + mediaStore media.MediaStore + ctx context.Context + cancel context.CancelFunc +} + +func NewBrowserTool(workspace string, store media.MediaStore) *BrowserTool { + opts := append(chromedp.DefaultExecAllocatorOptions[:], + chromedp.NoSandbox, + chromedp.Headless, + chromedp.DisableGPU, + ) + allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...) + browserCtx, _ := chromedp.NewContext(allocCtx) + + return &BrowserTool{ + workspace: workspace, + mediaStore: store, + ctx: browserCtx, + cancel: cancel, + } +} + +func (t *BrowserTool) Name() string { return "browser" } +func (t *BrowserTool) Description() string { + return "Automate a web browser to navigate, click, type, and take screenshots." +} + +func (t *BrowserTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "action": map[string]any{ + "type": "string", + "enum": []string{"navigate", "click", "type", "screenshot", "get_html"}, + "description": "The action to perform.", + }, + "url": map[string]any{ + "type": "string", + "description": "URL for 'navigate' action.", + }, + "selector": map[string]any{ + "type": "string", + "description": "CSS selector for 'click' or 'type' action.", + }, + "text": map[string]any{ + "type": "string", + "description": "Text to type for 'type' action.", + }, + "filename": map[string]any{ + "type": "string", + "description": "Output filename for 'screenshot' action (e.g., 'view.png').", + }, + }, + "required": []string{"action"}, + } +} + +func (t *BrowserTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + action, _ := args["action"].(string) + + // Ensure the browser context is still active + if t.ctx.Err() != nil { + allocCtx, _ := chromedp.NewExecAllocator(context.Background(), chromedp.DefaultExecAllocatorOptions[:]...) + t.ctx, _ = chromedp.NewContext(allocCtx) + } + + switch action { + case "navigate": + urlStr, _ := args["url"].(string) + if urlStr == "" { + return ErrorResult("url is required for navigate") + } + if err := chromedp.Run(t.ctx, chromedp.Navigate(urlStr)); err != nil { + return ErrorResult(fmt.Sprintf("navigation failed: %v", err)) + } + return UserResult(fmt.Sprintf("Navigated to %s", urlStr)) + + case "click": + selector, _ := args["selector"].(string) + if selector == "" { + return ErrorResult("selector is required for click") + } + if err := chromedp.Run(t.ctx, chromedp.Click(selector)); err != nil { + return ErrorResult(fmt.Sprintf("click failed: %v", err)) + } + return UserResult(fmt.Sprintf("Clicked element: %s", selector)) + + case "type": + selector, _ := args["selector"].(string) + text, _ := args["text"].(string) + if selector == "" || text == "" { + return ErrorResult("selector and text are required for type") + } + if err := chromedp.Run(t.ctx, chromedp.SendKeys(selector, text)); err != nil { + return ErrorResult(fmt.Sprintf("typing failed: %v", err)) + } + return UserResult(fmt.Sprintf("Typed into %s", selector)) + + case "screenshot": + filename, _ := args["filename"].(string) + if filename == "" { + filename = fmt.Sprintf("screenshot-%d.png", time.Now().Unix()) + } + if !strings.HasSuffix(strings.ToLower(filename), ".png") { + filename += ".png" + } + + path := filepath.Join(t.workspace, filename) + var buf []byte + if err := chromedp.Run(t.ctx, chromedp.CaptureScreenshot(&buf)); err != nil { + return ErrorResult(fmt.Sprintf("screenshot failed: %v", err)) + } + + if err := os.WriteFile(path, buf, 0o644); err != nil { + return ErrorResult(fmt.Sprintf("failed to save screenshot: %v", err)) + } + + channel := ToolChannel(ctx) + chatID := ToolChatID(ctx) + scope := fmt.Sprintf("tool:browser:screenshot:%s:%s", channel, chatID) + + ref := path + if t.mediaStore != nil { + if r, err := t.mediaStore.Store(path, media.MediaMeta{ + Filename: filename, + ContentType: "image/png", + Source: "tool:browser", + }, scope); err == nil { + ref = r + } + } + + return MediaResult(fmt.Sprintf("Screenshot captured: %s", filename), []string{ref}) + + case "get_html": + var html string + if err := chromedp.Run(t.ctx, chromedp.OuterHTML("html", &html)); err != nil { + return ErrorResult(fmt.Sprintf("failed to get HTML: %v", err)) + } + // Truncate if too long + if len(html) > 50000 { + html = html[:50000] + "\n... (truncated)" + } + return &ToolResult{ForLLM: html, ForUser: "Captured page HTML"} + + default: + return ErrorResult(fmt.Sprintf("unknown action: %s", action)) + } +} + +func (t *BrowserTool) Stop() { + if t.cancel != nil { + t.cancel() + } +} diff --git a/pkg/tools/google.go b/pkg/tools/google.go index 82835e722..0b8f08fd4 100644 --- a/pkg/tools/google.go +++ b/pkg/tools/google.go @@ -12,14 +12,20 @@ import ( "github.com/sipeed/picoclaw/pkg/logger" ) -type GoogleTool struct{} +type GoogleTool struct { + manager ChannelManagerGetter +} + +func NewGoogleTool(manager ChannelManagerGetter) *GoogleTool { + return &GoogleTool{manager: manager} +} func (t *GoogleTool) Name() string { return "google" } func (t *GoogleTool) Description() string { - return "Access Google services like Gmail and Calendar. Actions: 'list_emails', 'list_events'. Use 'list_emails' to get recent messages (subject, snippet). Use 'list_events' to get upcoming calendar events (summary, start/end time)." + return "Access Google Workspace (GWS) services like Gmail and Calendar. Actions: 'list_emails', 'search_emails', 'read_thread', 'list_events', 'sync'. Use 'sync' with 'search_emails' or 'read_thread' to save results into the agent's contextual memory." } func (t *GoogleTool) Parameters() map[string]any { @@ -28,9 +34,17 @@ func (t *GoogleTool) Parameters() map[string]any { "properties": map[string]any{ "action": map[string]any{ "type": "string", - "enum": []string{"list_emails", "list_events"}, + "enum": []string{"list_emails", "search_emails", "read_thread", "list_events", "sync"}, "description": "The service action to perform.", }, + "query": map[string]any{ + "type": "string", + "description": "Query string for 'search_emails'.", + }, + "thread_id": map[string]any{ + "type": "string", + "description": "Thread ID for 'read_thread'.", + }, "count": map[string]any{ "type": "integer", "default": 10, @@ -67,8 +81,16 @@ func (t *GoogleTool) Execute(ctx context.Context, args map[string]any) *ToolResu switch action { case "list_emails": return t.listEmails(ctx, cred, count) + case "search_emails": + query, _ := args["query"].(string) + return t.searchEmails(ctx, cred, query, count) + case "read_thread": + threadID, _ := args["thread_id"].(string) + return t.readThread(ctx, cred, threadID) case "list_events": return t.listEvents(ctx, cred, count) + case "sync": + return t.syncCommunications(ctx, cred, args) default: return ErrorResult("Unknown action") } @@ -139,6 +161,124 @@ func (t *GoogleTool) listEmails(ctx context.Context, cred *auth.AuthCredential, return SilentResult(fmt.Sprintf("Recent Emails:\n%s", join(emails, "\n\n"))) } +func (t *GoogleTool) searchEmails(ctx context.Context, cred *auth.AuthCredential, query string, maxResults int) *ToolResult { + url := fmt.Sprintf("https://gmail.googleapis.com/gmail/v1/users/me/messages?q=%s&maxResults=%d", url.QueryEscape(query), maxResults) + return t.fetchAndFormatMessages(ctx, cred, url) +} + +func (t *GoogleTool) fetchAndFormatMessages(ctx context.Context, cred *auth.AuthCredential, url string) *ToolResult { + req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) + req.Header.Set("Authorization", "Bearer "+cred.AccessToken) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return ErrorResult(fmt.Sprintf("API request failed: %v", err)) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return ErrorResult(fmt.Sprintf("Gmail API error (%d): %s", resp.StatusCode, string(body))) + } + + var listResp struct { + Messages []struct { + ID string `json:"id"` + ThreadID string `json:"threadId"` + } `json:"messages"` + } + if err := json.NewDecoder(resp.Body).Decode(&listResp); err != nil { + return ErrorResult(fmt.Sprintf("Failed to decode Gmail list: %v", err)) + } + + var emails []string + for _, m := range listResp.Messages { + msgURL := "https://gmail.googleapis.com/gmail/v1/users/me/messages/" + m.ID + mReq, _ := http.NewRequestWithContext(ctx, "GET", msgURL, nil) + mReq.Header.Set("Authorization", "Bearer "+cred.AccessToken) + mResp, err := http.DefaultClient.Do(mReq) + if err != nil { + continue + } + var msg struct { + Snippet string `json:"snippet"` + Payload struct { + Headers []struct { + Name string `json:"name"` + Value string `json:"value"` + } `json:"headers"` + } `json:"payload"` + } + _ = json.NewDecoder(mResp.Body).Decode(&msg) + mResp.Body.Close() + + subject := "No Subject" + from := "Unknown" + for _, h := range msg.Payload.Headers { + if h.Name == "Subject" { + subject = h.Value + } else if h.Name == "From" { + from = h.Value + } + } + emails = append(emails, fmt.Sprintf("- From: %s\n Subject: %s\n Snippet: %s\n ThreadID: %s", from, subject, msg.Snippet, m.ThreadID)) + } + + if len(emails) == 0 { + return SilentResult("No messages found.") + } + + return SilentResult(fmt.Sprintf("Gmail Search Results:\n%s", join(emails, "\n\n"))) +} + +func (t *GoogleTool) readThread(ctx context.Context, cred *auth.AuthCredential, threadID string) *ToolResult { + url := "https://gmail.googleapis.com/gmail/v1/users/me/threads/" + threadID + req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) + req.Header.Set("Authorization", "Bearer "+cred.AccessToken) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return ErrorResult(fmt.Sprintf("API request failed: %v", err)) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return ErrorResult(fmt.Sprintf("Gmail API error (%d): %s", resp.StatusCode, string(body))) + } + + var threadResp struct { + Messages []struct { + Snippet string `json:"snippet"` + Payload struct { + Headers []struct { + Name string `json:"name"` + Value string `json:"value"` + } `json:"headers"` + } `json:"payload"` + } `json:"messages"` + } + if err := json.NewDecoder(resp.Body).Decode(&threadResp); err != nil { + return ErrorResult(fmt.Sprintf("Failed to decode Gmail thread: %v", err)) + } + + var threadMsgs []string + for _, msg := range threadResp.Messages { + from := "Unknown" + date := "Unknown Date" + for _, h := range msg.Payload.Headers { + if h.Name == "From" { + from = h.Value + } else if h.Name == "Date" { + date = h.Value + } + } + threadMsgs = append(threadMsgs, fmt.Sprintf("[%s] From: %s\n%s", date, from, msg.Snippet)) + } + + return SilentResult(fmt.Sprintf("Gmail Thread %s:\n%s", threadID, join(threadMsgs, "\n\n---\n\n"))) +} + func (t *GoogleTool) listEvents(ctx context.Context, cred *auth.AuthCredential, maxResults int) *ToolResult { now := time.Now().Format(time.RFC3339) url := fmt.Sprintf("https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=%s&maxResults=%d&singleEvents=true&orderBy=startTime", now, maxResults) @@ -193,6 +333,51 @@ func (t *GoogleTool) listEvents(ctx context.Context, cred *auth.AuthCredential, return SilentResult(fmt.Sprintf("Upcoming Calendar Events:\n%s", join(events, "\n"))) } +func (t *GoogleTool) syncCommunications(ctx context.Context, cred *auth.AuthCredential, args map[string]any) *ToolResult { + query, _ := args["query"].(string) + threadID, _ := args["thread_id"].(string) + count := 10 + if c, ok := args["count"].(float64); ok { + count = int(c) + } + + var result *ToolResult + var syncKey string + + if threadID != "" { + result = t.readThread(ctx, cred, threadID) + syncKey = fmt.Sprintf("Gmail Thread (%s)", threadID) + } else if query != "" { + result = t.searchEmails(ctx, cred, query, count) + syncKey = fmt.Sprintf("Gmail Search (%q)", query) + } else { + result = t.listEmails(ctx, cred, count) + syncKey = "Recent Gmail" + } + + if result.IsError { + return result + } + + if t.manager == nil { + return result + } + + if getter, ok := t.manager.(interface{ GetMemoryStore() any }); ok { + if ms := getter.GetMemoryStore(); ms != nil { + if writer, ok := ms.(interface{ AppendCommunications(string) error }); ok { + err := writer.AppendCommunications(fmt.Sprintf("Gmail Sync (%s) @ %s:\n%s", syncKey, time.Now().Format("2006-01-02 15:04"), result.ForLLM)) + if err != nil { + return ErrorResult(fmt.Sprintf("Failed to sync to memory: %v", err)) + } + return SilentResult(fmt.Sprintf("%s synced to contextual memory.", syncKey)) + } + } + } + + return result +} + func join(s []string, sep string) string { res := "" for i, v := range s { diff --git a/pkg/tools/image.go b/pkg/tools/image.go new file mode 100644 index 000000000..0a3086f6e --- /dev/null +++ b/pkg/tools/image.go @@ -0,0 +1,172 @@ +package tools + +import ( + "context" + "fmt" + "image" + "image/color" + "image/draw" + "os" + "path/filepath" + "strings" + "time" + + "github.com/disintegration/imaging" + "github.com/sipeed/picoclaw/pkg/media" +) + +// ImageTool provides advanced image manipulation capabilities using imaging. +type ImageTool struct { + workspace string + mediaStore media.MediaStore +} + +func NewImageTool(workspace string, store media.MediaStore) *ImageTool { + return &ImageTool{ + workspace: workspace, + mediaStore: store, + } +} + +func (t *ImageTool) Name() string { return "image" } +func (t *ImageTool) Description() string { + return "Inspect, resize, crop, and manipulate images. Supports media:// and local paths." +} + +func (t *ImageTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "action": map[string]any{ + "type": "string", + "enum": []string{"inspect", "resize", "crop", "annotate"}, + "description": "The action to perform.", + }, + "path": map[string]any{ + "type": "string", + "description": "Path to the input image (local path or media:// reference).", + }, + "width": map[string]any{ + "type": "integer", + "description": "Target width for 'resize'.", + }, + "height": map[string]any{ + "type": "integer", + "description": "Target height for 'resize'.", + }, + "x": map[string]any{"type": "integer", "description": "X coordinate for 'crop'."}, + "y": map[string]any{"type": "integer", "description": "Y coordinate for 'crop'."}, + "w": map[string]any{"type": "integer", "description": "Width for 'crop'."}, + "h": map[string]any{"type": "integer", "description": "Height for 'crop'."}, + "output": map[string]any{ + "type": "string", + "description": "Output filename (e.g., 'edited.png').", + }, + }, + "required": []string{"action", "path"}, + } +} + +func (t *ImageTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + action, _ := args["action"].(string) + inputPath, _ := args["path"].(string) + + resolvedPath, err := t.resolvePath(inputPath) + if err != nil { + return ErrorResult(err.Error()) + } + + src, err := imaging.Open(resolvedPath) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to open image: %v", err)) + } + + switch action { + case "inspect": + bounds := src.Bounds() + return UserResult(fmt.Sprintf("Image dimensions: %dx%d px", bounds.Dx(), bounds.Dy())) + + case "resize": + width, _ := args["width"].(float64) + height, _ := args["height"].(float64) + if width == 0 && height == 0 { + return ErrorResult("width or height must be specified for resize") + } + dst := imaging.Resize(src, int(width), int(height), imaging.Lanczos) + return t.saveAndReturn(ctx, dst, args) + + case "crop": + x, _ := args["x"].(float64) + y, _ := args["y"].(float64) + w, _ := args["w"].(float64) + h, _ := args["h"].(float64) + if w == 0 || h == 0 { + return ErrorResult("w and h must be specified for crop") + } + dst := imaging.Crop(src, image.Rect(int(x), int(y), int(x+w), int(y+h))) + return t.saveAndReturn(ctx, dst, args) + + case "annotate": + // Placeholder for complex annotation. + // We'll just draw a red border for now to demonstrate manipulation. + bounds := src.Bounds() + dst := image.NewRGBA(bounds) + draw.Draw(dst, bounds, src, bounds.Min, draw.Src) + + red := color.RGBA{255, 0, 0, 255} + // Draw simple border lines + for i := 0; i < 5; i++ { + draw.Draw(dst, image.Rect(bounds.Min.X, bounds.Min.Y+i, bounds.Max.X, bounds.Min.Y+i+1), &image.Uniform{red}, image.Point{}, draw.Src) + draw.Draw(dst, image.Rect(bounds.Min.X, bounds.Max.Y-i-1, bounds.Max.X, bounds.Max.Y-i), &image.Uniform{red}, image.Point{}, draw.Src) + draw.Draw(dst, image.Rect(bounds.Min.X+i, bounds.Min.Y, bounds.Min.X+i+1, bounds.Max.Y), &image.Uniform{red}, image.Point{}, draw.Src) + draw.Draw(dst, image.Rect(bounds.Max.X-i-1, bounds.Min.Y, bounds.Max.X-i, bounds.Max.Y), &image.Uniform{red}, image.Point{}, draw.Src) + } + return t.saveAndReturn(ctx, dst, args) + + default: + return ErrorResult(fmt.Sprintf("unknown action: %s", action)) + } +} + +func (t *ImageTool) resolvePath(input string) (string, error) { + if strings.HasPrefix(input, "media://") { + if t.mediaStore == nil { + return "", fmt.Errorf("media store not configured") + } + return t.mediaStore.Resolve(input) + } + // Fallback to workspace path validation + return validatePath(input, t.workspace, true) +} + +func (t *ImageTool) saveAndReturn(ctx context.Context, img image.Image, args map[string]any) *ToolResult { + output, _ := args["output"].(string) + if output == "" { + output = fmt.Sprintf("output-%d.png", time.Now().Unix()) + } + if !strings.HasSuffix(strings.ToLower(output), ".png") && !strings.HasSuffix(strings.ToLower(output), ".jpg") { + output += ".png" + } + + path := filepath.Join(t.workspace, output) + if err := imaging.Save(img, path); err != nil { + return ErrorResult(fmt.Sprintf("failed to save image: %v", err)) + } + + channel := ToolChannel(ctx) + chatID := ToolChatID(ctx) + scope := fmt.Sprintf("tool:image:manipulate:%s:%s", channel, chatID) + + ref := path + if t.mediaStore != nil { + if r, err := t.mediaStore.Store(path, media.MediaMeta{ + Filename: output, + ContentType: "image/png", + Source: "tool:image", + }, scope); err == nil { + ref = r + } + } + + return MediaResult(fmt.Sprintf("Image %q processed successfully", output), []string{ref}) +} diff --git a/pkg/tools/pdf.go b/pkg/tools/pdf.go new file mode 100644 index 000000000..599380ef4 --- /dev/null +++ b/pkg/tools/pdf.go @@ -0,0 +1,186 @@ +package tools + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/jung-kurt/gofpdf/v2" + "github.com/sipeed/picoclaw/pkg/media" +) + +// PDFTool provides capabilities for creating, translating, and extracting PDF documents. +type PDFTool struct { + workspace string + restrict bool + mediaStore media.MediaStore +} + +func NewPDFTool(workspace string, restrict bool, store media.MediaStore) *PDFTool { + return &PDFTool{ + workspace: workspace, + restrict: restrict, + mediaStore: store, + } +} + +func (t *PDFTool) Name() string { return "pdf" } +func (t *PDFTool) Description() string { + return "Create and export PDF documents. Use 'create' to generate a PDF from text (e.g. translations). " + + "For translation tasks: translate the full text first, then call pdf with action='create', content=<full translation>, output=<filename.pdf>." +} + +func (t *PDFTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "action": map[string]any{ + "type": "string", + "enum": []string{"create", "extract"}, + "description": "Action: 'create' builds a PDF from text content, 'extract' reads a PDF file path and returns its text.", + }, + "content": map[string]any{ + "type": "string", + "description": "Text content to write into the PDF (for 'create'). Pass the COMPLETE translated text — never truncate.", + }, + "title": map[string]any{ + "type": "string", + "description": "Optional title displayed at the top of the PDF (for 'create').", + }, + "path": map[string]any{ + "type": "string", + "description": "File path or media:// ref of a PDF to extract text from (for 'extract').", + }, + "output": map[string]any{ + "type": "string", + "description": "Output filename for 'create' (e.g. 'translation_ro.pdf'). Defaults to 'document.pdf'.", + }, + }, + "required": []string{"action"}, + } +} + +func (t *PDFTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + action, _ := args["action"].(string) + + switch action { + case "create": + return t.handleCreate(ctx, args) + case "extract": + return t.handleExtract(args) + default: + return ErrorResult(fmt.Sprintf("unknown pdf action: %s. Use 'create' or 'extract'.", action)) + } +} + +// handleCreate builds a properly paginated, Unicode-safe PDF from the given content. +func (t *PDFTool) handleCreate(_ context.Context, args map[string]any) *ToolResult { + content, _ := args["content"].(string) + title, _ := args["title"].(string) + output, _ := args["output"].(string) + + if content == "" { + return ErrorResult("content is required for 'create' action") + } + + if output == "" { + output = "document.pdf" + } + if !strings.HasSuffix(strings.ToLower(output), ".pdf") { + output += ".pdf" + } + + outPath := filepath.Join(t.workspace, output) + if t.restrict { + var err error + outPath, err = validatePath(output, t.workspace, true) + if err != nil { + return ErrorResult(err.Error()) + } + } + + // Ensure parent directory exists + if err := os.MkdirAll(filepath.Dir(outPath), 0755); err != nil { + return ErrorResult(fmt.Sprintf("failed to create output directory: %v", err)) + } + + pdf := gofpdf.New("P", "mm", "A4", "") + pdf.SetMargins(20, 20, 20) + pdf.SetAutoPageBreak(true, 20) + + // Use ISO-8859-2 encoder for full coverage of EU Latin languages (Romanian, etc.) + pdf.SetFont("Helvetica", "", 12) + + tr := pdf.UnicodeTranslatorFromDescriptor("iso-8859-2") + + pdf.AddPage() + + // Optional title + if title != "" { + pdf.SetFont("Helvetica", "B", 16) + pdf.MultiCell(170, 10, tr(title), "", "C", false) + pdf.Ln(6) + pdf.SetFont("Helvetica", "", 12) + } + + // Write body — split on blank lines to preserve paragraph structure + paragraphs := strings.Split(content, "\n\n") + for _, para := range paragraphs { + para = strings.TrimSpace(para) + if para == "" { + pdf.Ln(4) + continue + } + // Within a paragraph, keep newlines as line breaks + lines := strings.Split(para, "\n") + for _, line := range lines { + pdf.MultiCell(170, 7, tr(line), "", "L", false) + } + pdf.Ln(4) // paragraph spacing + } + + if err := pdf.OutputFileAndClose(outPath); err != nil { + return ErrorResult(fmt.Sprintf("failed to write PDF: %v", err)) + } + + scope := "tool:pdf:create" + + ref := outPath + if t.mediaStore != nil { + if r, storeErr := t.mediaStore.Store(outPath, media.MediaMeta{ + Filename: output, + ContentType: "application/pdf", + Source: "tool:pdf", + }, scope); storeErr == nil { + ref = r + } + } + + return MediaResult(fmt.Sprintf("PDF %q created (%d pages). Sending now.", output, pdf.PageCount()), []string{ref}) +} + +// handleExtract returns a prompt message telling the agent to read the file as an attachment. +func (t *PDFTool) handleExtract(args map[string]any) *ToolResult { + path, _ := args["path"].(string) + if path == "" { + return ErrorResult("path is required for 'extract' action") + } + + // Resolve media refs + resolved := path + if t.restrict && !strings.HasPrefix(path, "media://") { + var err error + resolved, err = validatePath(path, t.workspace, true) + if err != nil { + return ErrorResult(err.Error()) + } + } + + return UserResult(fmt.Sprintf( + "To extract text from %q, attach the file directly in the chat — I can read it using my vision capability. "+ + "Alternatively, if you share the file path I can attempt to parse it as a document.", + filepath.Base(resolved), + )) +} diff --git a/pkg/tools/skills_inspect.go b/pkg/tools/skills_inspect.go new file mode 100644 index 000000000..01b422c14 --- /dev/null +++ b/pkg/tools/skills_inspect.go @@ -0,0 +1,130 @@ +package tools + +import ( + "context" + "fmt" + "strings" + + "github.com/sipeed/picoclaw/pkg/skills" +) + +// InspectSkillTool allows the LLM agent to inspect a skill's details before installation. +type InspectSkillTool struct { + registryMgr *skills.RegistryManager +} + +// NewInspectSkillTool creates a new InspectSkillTool. +func NewInspectSkillTool(registryMgr *skills.RegistryManager) *InspectSkillTool { + return &InspectSkillTool{ + registryMgr: registryMgr, + } +} + +func (t *InspectSkillTool) Name() string { + return "inspect_skill" +} + +func (t *InspectSkillTool) Description() string { + return "Retrieve in-depth information about a skill (slug, version, files, tools, permissions, moderation status) before installation. Use this for trust and safety review." +} + +func (t *InspectSkillTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "slug": map[string]any{ + "type": "string", + "description": "The unique identifier of the skill to inspect (e.g., 'agentbox-openrouter')", + }, + "registry": map[string]any{ + "type": "string", + "description": "Optional registry name (e.g., 'clawhub')", + }, + }, + "required": []string{"slug"}, + } +} + +func (t *InspectSkillTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + slug, ok := args["slug"].(string) + if !ok || slug == "" { + return ErrorResult("slug is required") + } + + registryName, _ := args["registry"].(string) + + var reg skills.SkillRegistry + if registryName != "" { + reg = t.registryMgr.GetRegistry(registryName) + if reg == nil { + return ErrorResult(fmt.Sprintf("registry %q not found", registryName)) + } + } else { + // Try to find the skill in any registry (simplification: just use the first available one for now or loop) + // Usually find_skills should provide the registry name. + // For robustness, if not provided, we can't easily guess which registry has it without searching. + // However, ClawHub is usually the default. + reg = t.registryMgr.GetRegistry("clawhub") + if reg == nil { + return ErrorResult("no skill registries available") + } + } + + details, err := reg.Inspect(ctx, slug) + if err != nil { + return ErrorResult(fmt.Sprintf("failed to inspect skill: %v", err)) + } + + return SilentResult(formatSkillDetails(details)) +} + +func formatSkillDetails(d *skills.SkillDetails) string { + var sb strings.Builder + sb.WriteString(fmt.Sprintf("### Skill Inspection: %s\n\n", d.Slug)) + sb.WriteString(fmt.Sprintf("- **Name:** %s\n", d.DisplayName)) + sb.WriteString(fmt.Sprintf("- **Version:** %s\n", d.Version)) + sb.WriteString(fmt.Sprintf("- **Author:** %s\n", d.Author)) + sb.WriteString(fmt.Sprintf("- **License:** %s\n", d.License)) + sb.WriteString(fmt.Sprintf("- **Registry:** %s\n", d.RegistryName)) + + if d.Summary != "" { + sb.WriteString(fmt.Sprintf("\n**Summary:**\n%s\n", d.Summary)) + } + + if d.Description != "" { + sb.WriteString(fmt.Sprintf("\n**Description:**\n%s\n", d.Description)) + } + + sb.WriteString("\n#### Safety & Trust:\n") + if d.IsMalwareBlocked { + sb.WriteString("- 🛡️ **Clean:** No known malware detected.\n") + } else if d.IsSuspicious { + sb.WriteString("- ⚠️ **Suspicious:** This skill has been flagged for manual review.\n") + } else { + sb.WriteString("- ℹ️ **Status:** Verified according to registry standards.\n") + } + + if len(d.Permissions) > 0 { + sb.WriteString("\n**Requested Permissions:**\n") + for _, p := range d.Permissions { + sb.WriteString(fmt.Sprintf("- `%s`\n", p)) + } + } + + if len(d.Tools) > 0 { + sb.WriteString("\n**Tools Provided:**\n") + for _, t := range d.Tools { + sb.WriteString(fmt.Sprintf("- `%s`\n", t)) + } + } + + if len(d.Files) > 0 { + sb.WriteString("\n**Files:**\n") + for _, f := range d.Files { + sb.WriteString(fmt.Sprintf("- `%s`\n", f)) + } + } + + sb.WriteString("\n*Use `install_skill` to install this skill if you trust its contents.*") + return sb.String() +} diff --git a/pkg/tools/speech.go b/pkg/tools/speech.go new file mode 100644 index 000000000..05ddf1e4a --- /dev/null +++ b/pkg/tools/speech.go @@ -0,0 +1,147 @@ +package tools + +import ( + "context" + "fmt" + "os" + "path/filepath" + + "github.com/google/uuid" + "github.com/sipeed/picoclaw/pkg/media" +) + +// SynthesizerProvider is an interface to get a speech synthesizer. +type SynthesizerProvider interface { + GetSynthesizer(name string) (any, bool) +} + +// MediaStoreGetter is an interface to get the media store. +type MediaStoreGetter interface { + GetMediaStore() media.MediaStore +} + +// WorkspaceGetter is an interface to get the agent's workspace. +type WorkspaceGetter interface { + GetWorkspace() string +} + +// SpeechTool allows the agent to generate speech audio from text. +type SpeechTool struct { + manager any // AgentLoop/Manager +} + +// NewSpeechTool creates a new SpeechTool. +func NewSpeechTool(manager any) *SpeechTool { + return &SpeechTool{ + manager: manager, + } +} + +func (t *SpeechTool) Name() string { + return "speech" +} + +func (t *SpeechTool) Description() string { + return "Convert text to speech audio. Action: 'speak'. Generates an MP3 file and returns a media:// reference." +} + +func (t *SpeechTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "action": map[string]any{ + "type": "string", + "enum": []string{"speak"}, + "description": "Action to perform.", + }, + "text": map[string]any{ + "type": "string", + "description": "The text to convert to speech.", + }, + "provider": map[string]any{ + "type": "string", + "description": "Optional: speech provider (e.g., 'elevenlabs'). Default is the system default.", + }, + }, + "required": []string{"action", "text"}, + } +} + +func (t *SpeechTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + action, _ := args["action"].(string) + text, _ := args["text"].(string) + providerName, _ := args["provider"].(string) + + if action != "speak" { + return ErrorResult(fmt.Sprintf("Unsupported action: %s", action)) + } + if text == "" { + return ErrorResult("text is required") + } + + // 1. Get Synthesizer + var synth any + if getter, ok := t.manager.(SynthesizerProvider); ok { + if s, found := getter.GetSynthesizer(providerName); found { + synth = s + } + } + + if synth == nil { + return ErrorResult("No speech synthesizer available.") + } + + // 2. Synthesize + type synthesizer interface { + Synthesize(ctx context.Context, text string) ([]byte, error) + } + + s, ok := synth.(synthesizer) + if !ok { + return ErrorResult("Internal error: invalid synthesizer instance.") + } + + audioData, err := s.Synthesize(ctx, text) + if err != nil { + return ErrorResult(fmt.Sprintf("Speech synthesis failed: %v", err)) + } + + // 3. Save to workspace and register in MediaStore + var workspace string + if wg, ok := t.manager.(WorkspaceGetter); ok { + workspace = wg.GetWorkspace() + } + if workspace == "" { + workspace = os.TempDir() + } + + mediaDir := filepath.Join(workspace, "media") + _ = os.MkdirAll(mediaDir, 0o755) + + filename := fmt.Sprintf("speech-%s.mp3", uuid.New().String()[:8]) + localPath := filepath.Join(mediaDir, filename) + + if err := os.WriteFile(localPath, audioData, 0o644); err != nil { + return ErrorResult(fmt.Errorf("failed to save audio file: %w", err).Error()) + } + + // 4. Register in MediaStore + var store media.MediaStore + if sg, ok := t.manager.(MediaStoreGetter); ok { + store = sg.GetMediaStore() + } + + if store != nil { + ref, err := store.Store(localPath, media.MediaMeta{ + Filename: filename, + ContentType: "audio/mpeg", + Source: "tool:speech", + }, "agent_session") // TODO: pass actual scope if available + if err != nil { + return ErrorResult(fmt.Sprintf("Failed to register media: %v", err)) + } + return SilentResult(fmt.Sprintf("Speech generated successfully. Audio reference: %s", ref)) + } + + return SilentResult(fmt.Sprintf("Speech generated successfully. Saved to: %s", localPath)) +} diff --git a/pkg/tools/subagent.go b/pkg/tools/subagent.go index e51cbaafa..bce7a72a1 100644 --- a/pkg/tools/subagent.go +++ b/pkg/tools/subagent.go @@ -19,6 +19,7 @@ type SubagentTask struct { Status string Result string Created int64 + Type string // "default", "web_dev", "ui_designer", "researcher" } type SubagentManager struct { @@ -112,10 +113,28 @@ func (sm *SubagentManager) runTask(ctx context.Context, task *SubagentTask, call task.Status = "running" task.Created = time.Now().UnixMilli() - // Build system prompt for subagent - systemPrompt := `You are a subagent. Complete the given task independently and report the result. -You have access to tools - use them as needed to complete your task. -After completing the task, provide a clear summary of what was done.` + // Build system prompt for subagent based on type + systemPrompt := "You are a subagent. Complete the given task independently and report the result." + + switch task.Type { + case "web_dev": + systemPrompt = `You are a specialized Web Development subagent. +Your goal is to build, debug, or improve web applications (HTML/CSS/JS). +You have access to a browser tool - use it to verify your work and take screenshots for the user. +Focus on clean code, responsiveness, and functional correctness.` + case "ui_designer": + systemPrompt = `You are a specialized UI/UX Design subagent. +Focus on aesthetics, layout, color theory, and user experience. +Use the browser and image tools to inspect designs and provide visual feedback or mockups. +Your goal is to make things look premium, modern, and high-quality.` + case "researcher": + systemPrompt = `You are a specialized Research subagent. +Your goal is to find deep, accurate, and synthesized information on the web. +Use search tools extensively and cross-reference multiple sources. +Provide detailed summaries with citations.` + } + + systemPrompt += "\nYou have access to tools - use them as needed to complete your task.\nAfter completing the task, provide a clear summary of what was done." messages := []providers.Message{ { @@ -263,6 +282,11 @@ func (t *SubagentTool) Parameters() map[string]any { "type": "string", "description": "Optional short label for the task (for display)", }, + "type": map[string]any{ + "type": "string", + "enum": []string{"default", "web_dev", "ui_designer", "researcher"}, + "description": "Specialized agent type with custom system prompts and focuses.", + }, }, "required": []string{"task"}, } @@ -275,16 +299,31 @@ func (t *SubagentTool) Execute(ctx context.Context, args map[string]any) *ToolRe } label, _ := args["label"].(string) + agentType, _ := args["type"].(string) + if agentType == "" { + agentType = "default" + } if t.manager == nil { return ErrorResult("Subagent manager not configured").WithError(fmt.Errorf("manager is nil")) } - // Build messages for subagent + // Build messages for subagent with specialized system prompt + systemPrompt := "You are a subagent. Complete the given task independently and provide a clear, concise result." + switch agentType { + case "web_dev": + systemPrompt = "You are a specialized Web Development subagent. Build, debug, or improve web applications. Use the browser to verify work." + case "ui_designer": + systemPrompt = "You are a specialized UI/UX Design subagent. Focus on aesthetics and premium visual quality." + case "researcher": + systemPrompt = "You are a specialized Research subagent. Find deep, accurate, and synthesized information." + } + + // Build messages for subagent with specialized system prompt messages := []providers.Message{ { Role: "system", - Content: "You are a subagent. Complete the given task independently and provide a clear, concise result.", + Content: systemPrompt, }, { Role: "user", @@ -292,17 +331,6 @@ func (t *SubagentTool) Execute(ctx context.Context, args map[string]any) *ToolRe }, } - // Use RunToolLoop to execute with tools (same as async SpawnTool) - sm := t.manager - sm.mu.RLock() - tools := sm.tools - maxIter := sm.maxIterations - maxTokens := sm.maxTokens - temperature := sm.temperature - hasMaxTokens := sm.hasMaxTokens - hasTemperature := sm.hasTemperature - sm.mu.RUnlock() - var llmOptions map[string]any if hasMaxTokens || hasTemperature { llmOptions = map[string]any{} diff --git a/pkg/tools/whatsapp.go b/pkg/tools/whatsapp.go new file mode 100644 index 000000000..51001f26d --- /dev/null +++ b/pkg/tools/whatsapp.go @@ -0,0 +1,124 @@ +package tools + +import ( + "context" + "fmt" + "strings" + + "github.com/sipeed/picoclaw/pkg/bus" +) + +// HistoryProvider matches the interface defined in pkg/channels/interfaces.go +type HistoryProvider interface { + FetchHistory(ctx context.Context, chatID string, limit int) ([]bus.InboundMessage, error) +} + +// ChannelManagerGetter is an interface to get a channel by name. +type ChannelManagerGetter interface { + GetChannel(name string) (any, bool) +} + +// WhatsAppTool allows the agent to fetch message history from WhatsApp. +type WhatsAppTool struct { + manager ChannelManagerGetter +} + +// NewWhatsAppTool creates a new WhatsAppTool. +func NewWhatsAppTool(manager ChannelManagerGetter) *WhatsAppTool { + return &WhatsAppTool{ + manager: manager, + } +} + +func (t *WhatsAppTool) Name() string { + return "whatsapp" +} + +func (t *WhatsAppTool) Description() string { + return "Interact with WhatsApp. Actions: 'list_messages', 'sync'. Use 'list_messages' to fetch recent chat history, and 'sync' to save the latest messages from a chat into the agent's contextual memory." +} + +func (t *WhatsAppTool) Parameters() map[string]any { + return map[string]any{ + "type": "object", + "properties": map[string]any{ + "action": map[string]any{ + "type": "string", + "enum": []string{"list_messages", "sync"}, + "description": "Action to perform.", + }, + "chat_id": map[string]any{ + "type": "string", + "description": "The WhatsApp JID or phone number (e.g., '1234567890@s.whatsapp.net' or a group JID).", + }, + "limit": map[string]any{ + "type": "integer", + "default": 10, + "description": "Number of messages to retrieve (max 50).", + }, + }, + "required": []string{"action", "chat_id"}, + } +} + +func (t *WhatsAppTool) Execute(ctx context.Context, args map[string]any) *ToolResult { + action, _ := args["action"].(string) + chatID, _ := args["chat_id"].(string) + if chatID == "" { + return ErrorResult("chat_id is required") + } + + limit := 10 + if l, ok := args["limit"].(float64); ok { + limit = int(l) + } + if limit > 50 { + limit = 50 + } + + // Try to find the whatsapp_native channel + var hp HistoryProvider + if ch, ok := t.manager.GetChannel("whatsapp_native"); ok { + if provider, ok := ch.(HistoryProvider); ok { + hp = provider + } + } + + if hp == nil { + return ErrorResult("WhatsApp history retrieval is not supported (requires whatsapp_native).") + } + + messages, err := hp.FetchHistory(ctx, chatID, limit) + if err != nil { + return ErrorResult(fmt.Sprintf("Failed to fetch WhatsApp history: %v", err)) + } + + var sb strings.Builder + sb.WriteString(fmt.Sprintf("WhatsApp History for %s:\n\n", chatID)) + for _, m := range messages { + sender := "Me" + if m.SenderID == chatID { + sender = "Contact" + } + sb.WriteString(fmt.Sprintf("[%s] %s: %s\n", m.Timestamp.Format("2006-01-02 15:04"), sender, m.Content)) + } + + resultText := sb.String() + + if action == "sync" { + if getter, ok := t.manager.(interface{ GetMemoryStore() any }); ok { + if ms := getter.GetMemoryStore(); ms != nil { + if writer, ok := ms.(interface{ AppendCommunications(string) error }); ok { + err := writer.AppendCommunications(fmt.Sprintf("WhatsApp Sync (%s) @ %s:\n%s", chatID, time.Now().Format("2006-01-02 15:04"), resultText)) + if err != nil { + return ErrorResult(fmt.Sprintf("Failed to sync to memory: %v", err)) + } + return SilentResult("WhatsApp chat history synced to contextual memory.") + } + } + } + return ErrorResult("Memory store not available for sync.") + } + + return SilentResult(resultText) +} diff --git a/pkg/voice/synthesizer.go b/pkg/voice/synthesizer.go new file mode 100644 index 000000000..9a226a7e4 --- /dev/null +++ b/pkg/voice/synthesizer.go @@ -0,0 +1,104 @@ +package voice + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "github.com/sipeed/picoclaw/pkg/logger" +) + +// Synthesizer is an interface for text-to-speech services. +type Synthesizer interface { + Name() string + Synthesize(ctx context.Context, text string) ([]byte, error) +} + +// ElevenLabsSynthesizer implements Synthesizer using ElevenLabs API. +type ElevenLabsSynthesizer struct { + apiKey string + voiceID string + apiBase string + httpClient *http.Client +} + +// NewElevenLabsSynthesizer creates a new ElevenLabsSynthesizer. +func NewElevenLabsSynthesizer(apiKey, voiceID string) *ElevenLabsSynthesizer { + if voiceID == "" { + voiceID = "EXAVITQu4vr4xnSDxMaL" // Default: Bella + } + return &ElevenLabsSynthesizer{ + apiKey: apiKey, + voiceID: voiceID, + apiBase: "https://api.elevenlabs.io/v1", + httpClient: &http.Client{ + Timeout: 60 * time.Second, + }, + } +} + +// Synthesize converts text to speech audio data (MP3). +func (s *ElevenLabsSynthesizer) Synthesize(ctx context.Context, text string) ([]byte, error) { + logger.InfoCF("voice", "Starting speech synthesis", map[string]any{ + "provider": "elevenlabs", + "voice_id": s.voiceID, + "text_len": len(text), + }) + + url := fmt.Sprintf("%s/text-to-speech/%s", s.apiBase, s.voiceID) + + requestBody, err := json.Marshal(map[string]any{ + "text": text, + "model_id": "eleven_monolingual_v1", + "voice_settings": map[string]any{ + "stability": 0.5, + "similarity_boost": 0.5, + }, + }) + if err != nil { + return nil, fmt.Errorf("failed to marshal request body: %w", err) + } + + req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(requestBody)) + if err != nil { + return nil, fmt.Errorf("failed to create request: %w", err) + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("xi-api-key", s.apiKey) + req.Header.Set("Accept", "audio/mpeg") + + resp, err := s.httpClient.Do(req) + if err != nil { + return nil, fmt.Errorf("failed to send request: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + logger.ErrorCF("voice", "ElevenLabs API error", map[string]any{ + "status_code": resp.StatusCode, + "response": string(body), + }) + return nil, fmt.Errorf("ElevenLabs API error (status %d): %s", resp.StatusCode, string(body)) + } + + audioData, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read response body: %w", err) + } + + logger.InfoCF("voice", "Speech synthesis completed successfully", map[string]any{ + "audio_size_bytes": len(audioData), + }) + + return audioData, nil +} + +func (s *ElevenLabsSynthesizer) Name() string { + return "elevenlabs" +} From 4e1ca1e9c851aab833ec2773aa454668acd27a09 Mon Sep 17 00:00:00 2001 From: Bot <bot@example.com> Date: Tue, 10 Mar 2026 22:08:37 +0100 Subject: [PATCH 23/25] chore: update go.mod dependencies --- go.mod | 23 ++++++++++++++++++----- go.sum | 41 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index f3735aef3..5a026ec47 100644 --- a/go.mod +++ b/go.mod @@ -7,12 +7,16 @@ require ( github.com/anthropics/anthropic-sdk-go v1.22.1 github.com/bwmarrin/discordgo v0.29.0 github.com/caarlos0/env/v11 v11.3.1 + github.com/chromedp/chromedp v0.10.0 github.com/chzyer/readline v1.5.1 + github.com/disintegration/imaging v1.6.2 github.com/ergochat/irc-go v0.5.0 github.com/gdamore/tcell/v2 v2.13.8 + github.com/go-playground/validator/v10 v10.30.1 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.3 github.com/h2non/filetype v1.1.3 + github.com/jung-kurt/gofpdf/v2 v2.17.2 github.com/larksuite/oapi-sdk-go/v3 v3.5.3 github.com/mdp/qrterminal/v3 v3.2.1 github.com/modelcontextprotocol/go-sdk v1.3.1 @@ -30,21 +34,29 @@ require ( google.golang.org/protobuf v1.36.11 maunium.net/go/mautrix v0.26.3 modernc.org/sqlite v1.46.1 - github.com/jung-kurt/gofpdf/v2 v2.17.2 - github.com/chromedp/chromedp v0.10.0 - github.com/disintegration/imaging v1.6.2 ) require ( filippo.io/edwards25519 v1.1.1 // indirect github.com/beeper/argo-go v1.1.2 // indirect + github.com/chromedp/cdproto v0.0.0-20240801214329-3f85d328b335 // indirect + github.com/chromedp/sysutil v1.0.0 // indirect github.com/coder/websocket v1.8.14 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/elliotchance/orderedmap/v3 v3.1.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.12 // indirect github.com/gdamore/encoding v1.0.1 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/gobwas/httphead v0.1.0 // indirect + github.com/gobwas/pool v0.2.1 // indirect + github.com/gobwas/ws v1.4.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/lucasb-eyer/go-colorful v1.3.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect @@ -60,6 +72,7 @@ require ( go.mau.fi/libsignal v0.2.1 // indirect go.mau.fi/util v0.9.6 // indirect golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a // indirect + golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect golang.org/x/term v0.40.0 // indirect golang.org/x/text v0.34.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -92,8 +105,8 @@ require ( github.com/valyala/fastjson v1.6.7 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect golang.org/x/arch v0.24.0 // indirect - golang.org/x/crypto v0.48.0 // indirect + golang.org/x/crypto v0.48.0 golang.org/x/net v0.51.0 // indirect - golang.org/x/sync v0.19.0 // indirect + golang.org/x/sync v0.19.0 golang.org/x/sys v0.41.0 // indirect ) diff --git a/go.sum b/go.sum index 4060997f8..633420ffd 100644 --- a/go.sum +++ b/go.sum @@ -27,6 +27,12 @@ github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5m github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chromedp/cdproto v0.0.0-20240801214329-3f85d328b335 h1:bATMoZLH2QGct1kzDxfmeBUQI/QhQvB0mBrOTct+YlQ= +github.com/chromedp/cdproto v0.0.0-20240801214329-3f85d328b335/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.10.0 h1:bRclRYVpMm/UVD76+1HcRW9eV3l58rFfy7AdBvKab1E= +github.com/chromedp/chromedp v0.10.0/go.mod h1:ei/1ncZIqXX1YnAYDkxhD4gzBgavMEUu7JCKvztdomE= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= @@ -44,6 +50,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/elliotchance/orderedmap/v3 v3.1.0 h1:j4DJ5ObEmMBt/lcwIecKcoRxIQUEnw0L804lXYDt/pg= @@ -52,12 +60,22 @@ github.com/ergochat/irc-go v0.5.0 h1:woQ1RS9YbfgqPgSpPBBQeczXGIGzR0aC7dEgk469fTw github.com/ergochat/irc-go v0.5.0/go.mod h1:2vi7KNpIPWnReB5hmLpl92eMywQvuIeIIGdt/FQCph0= 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/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw= +github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw= github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo= github.com/gdamore/tcell/v2 v2.13.8 h1:Mys/Kl5wfC/GcC5Cx4C2BIQH9dbnhnkPgS9/wF3RlfU= github.com/gdamore/tcell/v2 v2.13.8/go.mod h1:+Wfe208WDdB7INEtCsNrAN6O2m+wsTPk1RAovjaILlo= 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-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= +github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= 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= @@ -65,6 +83,12 @@ github.com/go-resty/resty/v2 v2.17.1/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2m github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= +github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -107,6 +131,10 @@ github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jung-kurt/gofpdf/v2 v2.17.2 h1:STdTJmpkm0u4wJRHoM/LWKftam+x66MfVk6cEs+fMvc= +github.com/jung-kurt/gofpdf/v2 v2.17.2/go.mod h1:RF/RGAP0AS4rd9fVZ6gb7Lbw6178P/AdAxMRW8Kn/Vk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= @@ -123,8 +151,14 @@ 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= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= @@ -154,6 +188,8 @@ github.com/open-dingtalk/dingtalk-stream-sdk-go v0.9.1 h1:Lb/Uzkiw2Ugt2Xf03J5wmv github.com/open-dingtalk/dingtalk-stream-sdk-go v0.9.1/go.mod h1:ln3IqPYYocZbYvl9TAOrG/cxGR9xcn4pnZRLdCTEGEU= 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/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 h1:KPpdlQLZcHfTMQRi6bFQ7ogNO0ltFT4PmtwTLW4W+14= github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -250,6 +286,8 @@ golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a h1:ovFr6Z0MNmU7nH8VaX5xqw+05ST2uO1exVfZPVqRC5o= golang.org/x/exp v0.0.0-20260212183809-81e46e3db34a/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -269,8 +307,6 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= -golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= @@ -306,6 +342,7 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= From e6deebdc2c6e1d5adbe1a5e58de074152d2b1960 Mon Sep 17 00:00:00 2001 From: Bernardo <Bernardo@example.com> Date: Tue, 10 Mar 2026 22:31:57 +0100 Subject: [PATCH 24/25] feat: Add ReplyToMessage context for Telegram --- pkg/channels/telegram/telegram.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/pkg/channels/telegram/telegram.go b/pkg/channels/telegram/telegram.go index 0a36247a6..8d8306d93 100644 --- a/pkg/channels/telegram/telegram.go +++ b/pkg/channels/telegram/telegram.go @@ -431,6 +431,25 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, message *telego.Mes } return localPath // fallback: use raw path } + if message.ReplyToMessage != nil { + replyText := message.ReplyToMessage.Text + if replyText == "" { + replyText = message.ReplyToMessage.Caption + } + if message.ReplyToMessage.Document != nil { + if replyText != "" { + replyText += "\n" + } + fileName := message.ReplyToMessage.Document.FileName + if fileName == "" { + fileName = "document" + } + replyText += fmt.Sprintf("[attached file: %s]", fileName) + } + if replyText != "" { + content += fmt.Sprintf("> Replying to: %s\n\n", utils.Truncate(replyText, 200)) + } + } if message.Text != "" { content += message.Text @@ -481,14 +500,19 @@ func (c *TelegramChannel) handleMessage(ctx context.Context, message *telego.Mes if message.Document != nil { docPath := c.downloadFile(ctx, message.Document.FileID, "") if docPath != "" { - mediaPaths = append(mediaPaths, storeMedia(docPath, "document")) + fileName := message.Document.FileName + if fileName == "" { + fileName = "document" + } + mediaPaths = append(mediaPaths, storeMedia(docPath, fileName)) if content != "" { content += "\n" } - content += "[file]" + content += fmt.Sprintf("[attached file: %s]", fileName) } } + if content == "" { content = "[empty message]" } From 1201a960bcc4b95ac56633e89768db24525aa190 Mon Sep 17 00:00:00 2001 From: Bernardo <Bernardo@example.com> Date: Tue, 10 Mar 2026 22:48:45 +0100 Subject: [PATCH 25/25] feat: Add system prompt rule for attached files --- pkg/agent/context.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/agent/context.go b/pkg/agent/context.go index e035d8c73..190280fbd 100644 --- a/pkg/agent/context.go +++ b/pkg/agent/context.go @@ -120,6 +120,8 @@ Your workspace is at: %s 4. **Context summaries** - Conversation summaries provided as context are approximate references only. They may be incomplete or outdated. Always defer to explicit user instructions over summary content. +5. **File Attachments** - When a user uploads a file, it appears in messages as `[attached file: filename.ext]`. Always acknowledge receipt of the file, mention its name, and proactively ask what they want to do with it (e.g., read, translate, summarize, extract page count) if their request is ambiguous. Use the appropriate tools to extract its contents if needed. + %s`, workspacePath, workspacePath, workspacePath, workspacePath, workspacePath, toolDiscovery) }