Merge upstream/main (c0bb8d6) into fork. Key upstream changes:
- SSE streaming support (Telegram sendMessageDraft, channel StreamDelegate)
- Pico client outbound WebSocket channel
- Smarter heartbeat task detection (heartbeatHasUserTasks)
- Separate tool-limit vs empty-response messages
- TUI launcher refactoring with cyberpunk theme
- Android fallback DNS resolver
- Improved docs translations
Conflict resolution:
- Kept fork's channel-based StreamingProvider interface and ChatStream API
- Kept fork's buildHTTPRequest (superset of upstream's buildRequestBody)
- Merged upstream's streamActive tracking alongside fork's draft-based streaming
- Added upstream's parser_markdown_to_html.go for new Telegram streaming
- Resolved duplicate declarations (MessageDeleter, escapeHTML, DeleteMessage)
- Adopted upstream's resolveScopeKey prefix-gated behavior
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
// PicoClaw - Ultra-lightweight personal AI agent
|
|
// License: MIT
|
|
//
|
|
// Copyright (c) 2026 PicoClaw contributors
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
|
|
tuicfg "github.com/sipeed/picoclaw/cmd/picoclaw-launcher-tui/config"
|
|
"github.com/sipeed/picoclaw/cmd/picoclaw-launcher-tui/ui"
|
|
)
|
|
|
|
func main() {
|
|
configPath := tuicfg.DefaultConfigPath()
|
|
if len(os.Args) > 1 {
|
|
configPath = os.Args[1]
|
|
}
|
|
|
|
configDir := filepath.Dir(configPath)
|
|
if _, err := os.Stat(configDir); os.IsNotExist(err) {
|
|
cmd := exec.Command("picoclaw", "onboard")
|
|
cmd.Stdin = os.Stdin
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
_ = cmd.Run()
|
|
}
|
|
|
|
cfg, err := tuicfg.Load(configPath)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "picoclaw-launcher-tui: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
app := ui.New(cfg, configPath)
|
|
// Bind model selection hook to sync to main config
|
|
app.OnModelSelected = func(scheme tuicfg.Scheme, user tuicfg.User, modelID string) {
|
|
_ = tuicfg.SyncSelectedModelToMainConfig(scheme, user, modelID)
|
|
}
|
|
if err := app.Run(); err != nil {
|
|
fmt.Fprintf(os.Stderr, "picoclaw-launcher-tui: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|