From a36472b55f06248e7dca48507df5bdae7a5d4800 Mon Sep 17 00:00:00 2001 From: taonyx Date: Wed, 29 Apr 2026 17:52:47 +0800 Subject: [PATCH] Add CLI support for custom OpenAI-compatible endpoints and remove TUI (#2710) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(model): add `picoclaw model add` for custom OpenAI-compatible endpoints Onboards a model from a user-supplied API base + key by hitting GET /models, prompting the user to pick one, and writing the entry into model_list[] (with api_keys) plus setting it as the default model. This was previously only available in the TUI launcher (issue #2208) and is now accessible from the CLI: picoclaw model add -b URL -k KEY [-m MODEL] [-n ALIAS] * chore: remove deprecated picoclaw-launcher-tui Per RFC #2208, the TUI launcher is deprecated in favor of the CLI; its "online model picker" feature has been ported to `picoclaw model add` in the previous commit. This drops the binary and all build/release/docs references: - delete cmd/picoclaw-launcher-tui/ and assets/launcher-tui.jpg - Makefile: remove the `build-launcher-tui` target - .goreleaser.yaml: drop the build entry plus the `picoclaw-launcher-tui` ids from the launcher docker image, macOS notarize list, and nfpms contents - docker/Dockerfile.goreleaser.launcher: drop the COPY for the TUI binary - READMEs (root + 8 locales): remove the "TUI Launcher" section and screenshot link - docs/guides/docker.*: update the "launcher image includes …" sentence to reflect the two remaining binaries `make build` still succeeds; `go build ./web/backend` (the launcher target) still succeeds. `picoclaw-launcher` (web console) is unaffected. --- .goreleaser.yaml | 46 --- Makefile | 14 - README.md | 18 -- assets/launcher-tui.jpg | Bin 277431 -> 0 bytes cmd/picoclaw-launcher-tui/README.md | 69 ----- cmd/picoclaw-launcher-tui/config/config.go | 236 --------------- cmd/picoclaw-launcher-tui/main.go | 48 --- cmd/picoclaw-launcher-tui/ui/app.go | 325 --------------------- cmd/picoclaw-launcher-tui/ui/channels.go | 202 ------------- cmd/picoclaw-launcher-tui/ui/gateway.go | 229 --------------- cmd/picoclaw-launcher-tui/ui/home.go | 70 ----- cmd/picoclaw-launcher-tui/ui/models.go | 200 ------------- cmd/picoclaw-launcher-tui/ui/schemes.go | 252 ---------------- cmd/picoclaw-launcher-tui/ui/users.go | 261 ----------------- cmd/picoclaw/internal/model/add.go | 200 +++++++++++++ cmd/picoclaw/internal/model/add_test.go | 257 ++++++++++++++++ cmd/picoclaw/internal/model/command.go | 11 + cmd/picoclaw/internal/model/online.go | 77 +++++ docker/Dockerfile.goreleaser.launcher | 1 - docs/guides/docker.fr.md | 2 +- docs/guides/docker.ja.md | 2 +- docs/guides/docker.md | 2 +- docs/guides/docker.ms.md | 2 +- docs/guides/docker.pt-br.md | 2 +- docs/guides/docker.vi.md | 2 +- docs/guides/docker.zh.md | 2 +- docs/project/README.fr.md | 18 -- docs/project/README.id.md | 18 -- docs/project/README.it.md | 18 -- docs/project/README.ja.md | 18 -- docs/project/README.ko.md | 18 -- docs/project/README.ms.md | 18 -- docs/project/README.pt-br.md | 18 -- docs/project/README.vi.md | 18 -- docs/project/README.zh.md | 18 -- go.mod | 6 +- go.sum | 8 - 37 files changed, 553 insertions(+), 2153 deletions(-) delete mode 100644 assets/launcher-tui.jpg delete mode 100644 cmd/picoclaw-launcher-tui/README.md delete mode 100644 cmd/picoclaw-launcher-tui/config/config.go delete mode 100644 cmd/picoclaw-launcher-tui/main.go delete mode 100644 cmd/picoclaw-launcher-tui/ui/app.go delete mode 100644 cmd/picoclaw-launcher-tui/ui/channels.go delete mode 100644 cmd/picoclaw-launcher-tui/ui/gateway.go delete mode 100644 cmd/picoclaw-launcher-tui/ui/home.go delete mode 100644 cmd/picoclaw-launcher-tui/ui/models.go delete mode 100644 cmd/picoclaw-launcher-tui/ui/schemes.go delete mode 100644 cmd/picoclaw-launcher-tui/ui/users.go create mode 100644 cmd/picoclaw/internal/model/add.go create mode 100644 cmd/picoclaw/internal/model/add_test.go create mode 100644 cmd/picoclaw/internal/model/online.go diff --git a/.goreleaser.yaml b/.goreleaser.yaml index b330c60f5..3e747bc35 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -100,49 +100,6 @@ builds: - goos: netbsd goarch: arm - - id: picoclaw-launcher-tui - binary: picoclaw-launcher-tui - env: - - CGO_ENABLED=0 - tags: - - goolm - - stdjson - ldflags: - - -s -w - - -X github.com/sipeed/picoclaw/pkg/config.Version={{ .Version }} - - -X github.com/sipeed/picoclaw/pkg/config.GitCommit={{ .ShortCommit }} - - -X github.com/sipeed/picoclaw/pkg/config.BuildTime={{ .Date }} - - -X github.com/sipeed/picoclaw/pkg/config.GoVersion={{ with index .Env "GOVERSION" }}{{ . }}{{ else }}unknown{{ end }} - goos: - - linux - - windows - - darwin - - freebsd - - netbsd - goarch: - - amd64 - - arm64 - - riscv64 - - loong64 - - arm - - s390x - - mipsle - goarm: - - "6" - - "7" - gomips: - - softfloat - main: ./cmd/picoclaw-launcher-tui - ignore: - - goos: windows - goarch: arm - - goos: netbsd - goarch: s390x - - goos: netbsd - goarch: mips64 - - goos: netbsd - goarch: arm - dockers_v2: - id: picoclaw dockerfile: docker/Dockerfile.goreleaser @@ -166,7 +123,6 @@ dockers_v2: ids: - picoclaw - picoclaw-launcher - - picoclaw-launcher-tui images: - "ghcr.io/{{ .Env.REPO_OWNER }}/picoclaw" - '{{ with .Env.DOCKERHUB_IMAGE_NAME }}docker.io/{{ . }}{{ end }}' @@ -184,7 +140,6 @@ notarize: ids: - picoclaw - picoclaw-launcher - - picoclaw-launcher-tui sign: certificate: "{{.Env.MACOS_SIGN_P12}}" password: "{{.Env.MACOS_SIGN_PASSWORD}}" @@ -215,7 +170,6 @@ nfpms: ids: - picoclaw - picoclaw-launcher - - picoclaw-launcher-tui package_name: picoclaw file_name_template: >- {{ .PackageName }}_ diff --git a/Makefile b/Makefile index 0f6a036f4..3fa41bc24 100644 --- a/Makefile +++ b/Makefile @@ -236,20 +236,6 @@ endif build-launcher-frontend: @$(MAKE) -C web build-frontend -## build-launcher-tui: Build the picoclaw-launcher TUI binary -build-launcher-tui: - @echo "Building picoclaw-launcher-tui for $(PLATFORM)/$(ARCH)..." -ifeq ($(OS),Windows_NT) - @$(POWERSHELL) "New-Item -ItemType Directory -Force -Path '$(BUILD_DIR)' | Out-Null" - @$(GO) build $(GOFLAGS) -o $(BUILD_DIR)/picoclaw-launcher-tui-$(PLATFORM)-$(ARCH)$(EXT) ./cmd/picoclaw-launcher-tui - @$(POWERSHELL) "Copy-Item -LiteralPath '$(BUILD_DIR)/picoclaw-launcher-tui-$(PLATFORM)-$(ARCH)$(EXT)' -Destination '$(BUILD_DIR)/picoclaw-launcher-tui$(EXT)' -Force" -else - @mkdir -p $(BUILD_DIR) - @$(GO) build $(GOFLAGS) -o $(BUILD_DIR)/picoclaw-launcher-tui-$(PLATFORM)-$(ARCH) ./cmd/picoclaw-launcher-tui - @ln -sf picoclaw-launcher-tui-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/picoclaw-launcher-tui -endif - @echo "Build complete: $(BUILD_DIR)/picoclaw-launcher-tui$(EXT)" - ## build-whatsapp-native: Build with WhatsApp native (whatsmeow) support; larger binary build-whatsapp-native: generate ## @echo "Building $(BINARY_NAME) with WhatsApp native for $(PLATFORM)/$(ARCH)..." diff --git a/README.md b/README.md index 73cc877fa..30ac67d8f 100644 --- a/README.md +++ b/README.md @@ -291,24 +291,6 @@ After this one-time step, `picoclaw-launcher` will open normally on subsequent l -### 💻 TUI Launcher (Recommended for Headless / SSH) - -The TUI (Terminal UI) Launcher provides a full-featured terminal interface for configuration and management. Ideal for servers, Raspberry Pi, and other headless environments. - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**Getting started:** - -Use the TUI menus to: **1)** Configure a Provider -> **2)** Configure a Channel -> **3)** Start the Gateway -> **4)** Chat! - -For detailed TUI documentation, see [docs.picoclaw.io](https://docs.picoclaw.io). - ### 📱 Android diff --git a/assets/launcher-tui.jpg b/assets/launcher-tui.jpg deleted file mode 100644 index 659c97794fe251de00d076833665704c0a1a5110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277431 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


OF(k~z$vpn%D58mJYyIcIzfxRH2C#{2hKa5&Ul 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

uWp!=y9&Q*y- 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 -# with symlink build/picoclaw-launcher-tui - -# Or build directly from this directory -go build -o picoclaw-launcher-tui . -``` - -### Key Features - -* 🖥️ Terminal-native interface - works over SSH, on headless servers, and in low-resource environments -* ⚙️ AI model scheme and API key management -* 📱 Communication channel configuration editor (Telegram/Discord/WeChat etc.) -* 🔄 PicoClaw gateway daemon management (start/stop/status monitoring) -* 💬 One-click launch of interactive AI chat session -* 🎯 Keyboard-first design with intuitive shortcuts - -### Other Commands - -```bash -# Run with custom config file path -go run . /path/to/custom/config.json -``` diff --git a/cmd/picoclaw-launcher-tui/config/config.go b/cmd/picoclaw-launcher-tui/config/config.go deleted file mode 100644 index 227b9fa3d..000000000 --- a/cmd/picoclaw-launcher-tui/config/config.go +++ /dev/null @@ -1,236 +0,0 @@ -// PicoClaw - Ultra-lightweight personal AI agent -// License: MIT -// -// Copyright (c) 2026 PicoClaw contributors - -// Package config provides types and I/O for ~/.picoclaw/tui.toml. -package config - -import ( - "bytes" - "encoding/json" - "fmt" - "os" - "path/filepath" - - "github.com/BurntSushi/toml" - - "github.com/sipeed/picoclaw/pkg/fileutil" -) - -// DefaultConfigPath returns the default path to the tui.toml config file. -func DefaultConfigPath() string { - home, err := os.UserHomeDir() - if err != nil { - home = "." - } - return filepath.Join(home, ".picoclaw", "tui.toml") -} - -// TUIConfig is the top-level structure of ~/.picoclaw/tui.toml. -type TUIConfig struct { - Version string `toml:"version"` - Model Model `toml:"model"` - Provider Provider `toml:"provider"` -} - -type Model struct { - Type string `toml:"type"` // "provider" (default) | "manual" -} - -type Provider struct { - Schemes []Scheme `toml:"schemes"` - Users []User `toml:"users"` - Current ProviderCurrent `toml:"current"` -} - -type Scheme struct { - Name string `toml:"name"` // unique key - BaseURL string `toml:"baseURL"` // required - Type string `toml:"type"` // "openai-compatible" (default) | "anthropic" -} - -type User struct { - Name string `toml:"name"` - Scheme string `toml:"scheme"` // references Scheme.Name; (Name+Scheme) is unique - Type string `toml:"type"` // "key" (default) | "OAuth" - Key string `toml:"key"` -} - -type ProviderCurrent struct { - Scheme string `toml:"scheme"` // references Scheme.Name - User string `toml:"user"` // references User.Name where User.Scheme == Scheme - Model string `toml:"model"` // from GET /models -} - -// DefaultConfig returns a minimal valid TUIConfig. -func DefaultConfig() *TUIConfig { - return &TUIConfig{ - Version: "1.0", - Model: Model{Type: "provider"}, - Provider: Provider{ - Schemes: []Scheme{}, - Users: []User{}, - Current: ProviderCurrent{}, - }, - } -} - -// Load reads the TUI config from path. Returns a default config if the file does not exist. -func Load(path string) (*TUIConfig, error) { - data, err := os.ReadFile(path) - if os.IsNotExist(err) { - return DefaultConfig(), nil - } - if err != nil { - return nil, fmt.Errorf("failed to read config file %q: %w", path, err) - } - - cfg := DefaultConfig() - if _, err := toml.Decode(string(data), cfg); err != nil { - return nil, fmt.Errorf("failed to parse config file %q: %w", path, err) - } - - applyDefaults(cfg) - return cfg, nil -} - -// Save writes cfg to path atomically (safe for flash / SD storage). -func Save(path string, cfg *TUIConfig) error { - if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { - return fmt.Errorf("failed to create config directory: %w", err) - } - var buf bytes.Buffer - enc := toml.NewEncoder(&buf) - if err := enc.Encode(cfg); err != nil { - return fmt.Errorf("failed to encode config: %w", err) - } - if err := fileutil.WriteFileAtomic(path, buf.Bytes(), 0o600); err != nil { - return fmt.Errorf("failed to write config file %q: %w", path, err) - } - return nil -} - -func applyDefaults(cfg *TUIConfig) { - if cfg.Version == "" { - cfg.Version = "1.0" - } - if cfg.Model.Type == "" { - cfg.Model.Type = "provider" - } - for i := range cfg.Provider.Schemes { - if cfg.Provider.Schemes[i].Type == "" { - cfg.Provider.Schemes[i].Type = "openai-compatible" - } - } - for i := range cfg.Provider.Users { - if cfg.Provider.Users[i].Type == "" { - cfg.Provider.Users[i].Type = "key" - } - } -} - -// SchemeByName returns the first Scheme whose Name matches, or nil. -func (p *Provider) SchemeByName(name string) *Scheme { - for i := range p.Schemes { - if p.Schemes[i].Name == name { - return &p.Schemes[i] - } - } - return nil -} - -// UsersForScheme returns all users whose Scheme field matches schemeName. -func (p *Provider) UsersForScheme(schemeName string) []User { - var out []User - for _, u := range p.Users { - if u.Scheme == schemeName { - out = append(out, u) - } - } - return out -} - -// SyncSelectedModelToMainConfig syncs the currently selected model to ~/.picoclaw/config.json -// Adds/replaces a "tui-prefer" model entry and sets it as the default model. -// Preserves all other existing fields in the config file unchanged. -func SyncSelectedModelToMainConfig(scheme Scheme, user User, modelID string) error { - home, err := os.UserHomeDir() - if err != nil { - home = "." - } - mainConfigPath := filepath.Join(home, ".picoclaw", "config.json") - - var cfg map[string]any - if data, readErr := os.ReadFile(mainConfigPath); readErr == nil { - if unmarshalErr := json.Unmarshal(data, &cfg); unmarshalErr != nil { - cfg = make(map[string]any) - } - } else { - cfg = make(map[string]any) - } - - if _, ok := cfg["agents"]; !ok { - cfg["agents"] = make(map[string]any) - } - agents, ok := cfg["agents"].(map[string]any) - if ok { - if _, ok := agents["defaults"]; !ok { - agents["defaults"] = make(map[string]any) - } - defaults, ok := agents["defaults"].(map[string]any) - if ok { - defaults["model"] = "tui-prefer" - } - } - - tuiModel := map[string]any{ - "model_name": "tui-prefer", - "model": modelID, - "api_key": user.Key, - "api_base": scheme.BaseURL, - } - - modelList := []any{} - if ml, ok := cfg["model_list"].([]any); ok { - modelList = ml - } - - found := false - for i, m := range modelList { - if entry, ok := m.(map[string]any); ok { - if name, ok := entry["model_name"].(string); ok && name == "tui-prefer" { - modelList[i] = tuiModel - found = true - break - } - } - } - if !found { - modelList = append(modelList, tuiModel) - } - cfg["model_list"] = modelList - - data, err := json.MarshalIndent(cfg, "", " ") - if err != nil { - return err - } - - if err := os.MkdirAll(filepath.Dir(mainConfigPath), 0o700); err != nil { - return err - } - - return os.WriteFile(mainConfigPath, data, 0o600) -} - -func (cfg *TUIConfig) CurrentModelLabel() string { - cur := cfg.Provider.Current - if cur.Model == "" { - return "(not configured)" - } - label := cur.Scheme - if label != "" { - label += " / " - } - return label + cur.Model -} diff --git a/cmd/picoclaw-launcher-tui/main.go b/cmd/picoclaw-launcher-tui/main.go deleted file mode 100644 index 3cb7110c1..000000000 --- a/cmd/picoclaw-launcher-tui/main.go +++ /dev/null @@ -1,48 +0,0 @@ -// 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) - } -} diff --git a/cmd/picoclaw-launcher-tui/ui/app.go b/cmd/picoclaw-launcher-tui/ui/app.go deleted file mode 100644 index a65693b01..000000000 --- a/cmd/picoclaw-launcher-tui/ui/app.go +++ /dev/null @@ -1,325 +0,0 @@ -// PicoClaw - Ultra-lightweight personal AI agent -// License: MIT -// -// Copyright (c) 2026 PicoClaw contributors - -package ui - -import ( - "fmt" - "sync" - - "github.com/gdamore/tcell/v2" - "github.com/rivo/tview" - - tuicfg "github.com/sipeed/picoclaw/cmd/picoclaw-launcher-tui/config" -) - -// App is the root TUI application. -type App struct { - tapp *tview.Application - pages *tview.Pages - pageStack []string - cfg *tuicfg.TUIConfig - configPath string - pageRefreshFns map[string]func() - headerModelTV *tview.TextView - modalOpen map[string]bool - - // OnModelSelected is called when a model is selected in the UI. - // Can be nil to disable. - OnModelSelected func(scheme tuicfg.Scheme, user tuicfg.User, modelID string) - - modelCache map[string][]modelEntry - modelCacheMu sync.RWMutex - refreshMu sync.Mutex -} - -// cacheKey returns the map key for a (scheme, user) pair. -func cacheKey(schemeName, userName string) string { - return fmt.Sprintf("%s/%s", schemeName, userName) -} - -// cachedModels returns a defensive copy of the cached model list for a user (may be nil). -func (a *App) cachedModels(schemeName, userName string) []modelEntry { - a.modelCacheMu.RLock() - defer a.modelCacheMu.RUnlock() - entries := a.modelCache[cacheKey(schemeName, userName)] - return append([]modelEntry(nil), entries...) -} - -// refreshModelCache fetches models for every user in the config concurrently. -// Serialized by refreshMu so concurrent calls don't race on the cache map. -// When all fetches complete it calls onDone via QueueUpdateDraw. -func (a *App) refreshModelCache(onDone func()) { - go func() { - a.refreshMu.Lock() - defer a.refreshMu.Unlock() - - users := a.cfg.Provider.Users - schemes := a.cfg.Provider.Schemes - - schemeURL := make(map[string]string, len(schemes)) - for _, s := range schemes { - schemeURL[s.Name] = s.BaseURL - } - - var wg sync.WaitGroup - for _, u := range users { - baseURL, ok := schemeURL[u.Scheme] - if !ok || baseURL == "" { - continue - } - if u.Key == "" { - a.modelCacheMu.Lock() - if a.modelCache == nil { - a.modelCache = make(map[string][]modelEntry) - } - a.modelCache[cacheKey(u.Scheme, u.Name)] = nil - a.modelCacheMu.Unlock() - continue - } - wg.Add(1) - bURL := baseURL - go func() { - defer wg.Done() - entries, err := fetchModels(bURL, u.Key) - a.modelCacheMu.Lock() - if a.modelCache == nil { - a.modelCache = make(map[string][]modelEntry) - } - if err != nil || len(entries) == 0 { - a.modelCache[cacheKey(u.Scheme, u.Name)] = nil - } else { - a.modelCache[cacheKey(u.Scheme, u.Name)] = entries - } - a.modelCacheMu.Unlock() - }() - } - wg.Wait() - - if onDone != nil { - a.tapp.QueueUpdateDraw(onDone) - } - }() -} - -// New creates and wires up the TUI application. -func New(cfg *tuicfg.TUIConfig, configPath string) *App { - // Cyberpunk Theme Colors - // Dark background - tview.Styles.PrimitiveBackgroundColor = tcell.NewHexColor(0x050510) // Deep Void - tview.Styles.ContrastBackgroundColor = tcell.NewHexColor(0x1a1a2e) // Dark Indigo - tview.Styles.MoreContrastBackgroundColor = tcell.NewHexColor(0x2a2a40) - - // Borders and Titles - tview.Styles.BorderColor = tcell.NewHexColor(0x00f0ff) // Neon Cyan - tview.Styles.TitleColor = tcell.NewHexColor(0x00f0ff) // Neon Cyan - tview.Styles.GraphicsColor = tcell.NewHexColor(0xff00ff) // Neon Magenta - - // Text - tview.Styles.PrimaryTextColor = tcell.NewHexColor(0xe0e0e0) // Off-white - tview.Styles.SecondaryTextColor = tcell.NewHexColor(0x00f0ff) // Neon Cyan - tview.Styles.TertiaryTextColor = tcell.NewHexColor(0x39ff14) // Neon Lime - tview.Styles.InverseTextColor = tcell.NewHexColor(0x000000) // Black - tview.Styles.ContrastSecondaryTextColor = tcell.NewHexColor(0xff00ff) // Neon Magenta - - a := &App{ - tapp: tview.NewApplication(), - pages: tview.NewPages(), - pageStack: []string{}, - cfg: cfg, - configPath: configPath, - pageRefreshFns: make(map[string]func()), - modalOpen: make(map[string]bool), - } - - a.tapp.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { - if event.Key() == tcell.KeyEscape { - if len(a.modalOpen) > 0 { - return event - } - return a.goBack() - } - return event - }) - - a.buildPages() - return a -} - -// Run starts the TUI event loop. -func (a *App) Run() error { - return a.tapp.SetRoot(a.pages, true).EnableMouse(true).Run() -} - -func (a *App) buildPages() { - a.pages.AddPage("home", a.newHomePage(), true, true) - a.pageStack = []string{"home"} -} - -func (a *App) navigateTo(name string, page tview.Primitive) { - a.pages.RemovePage(name) - a.pages.AddPage(name, page, true, false) - a.pageStack = append(a.pageStack, name) - a.pages.SwitchToPage(name) -} - -func (a *App) goBack() *tcell.EventKey { - if len(a.pageStack) <= 1 { - return nil - } - popped := a.pageStack[len(a.pageStack)-1] - a.pageStack = a.pageStack[:len(a.pageStack)-1] - a.pages.RemovePage(popped) - prev := a.pageStack[len(a.pageStack)-1] - if fn, ok := a.pageRefreshFns[prev]; ok { - fn() - } - if prev == "home" && a.headerModelTV != nil { - a.headerModelTV.SetText(a.cfg.CurrentModelLabel() + " ") - } - a.pages.SwitchToPage(prev) - return nil -} - -func (a *App) showModal(name string, primitive tview.Primitive) { - a.modalOpen[name] = true - a.pages.AddPage(name, primitive, true, true) -} - -func (a *App) hideModal(name string) { - delete(a.modalOpen, name) - a.pages.HidePage(name) - a.pages.RemovePage(name) -} - -func (a *App) save() { - if err := tuicfg.Save(a.configPath, a.cfg); err != nil { - a.showError("save failed: " + err.Error()) - } -} - -func (a *App) showError(msg string) { - modal := tview.NewModal(). - SetText(" [red::b]ERROR[-::-]\n\n" + msg). - AddButtons([]string{"OK"}). - SetDoneFunc(func(_ int, _ string) { - a.hideModal("error") - }) - // Cyberpunk Modal Style - modal.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) // Deep Indigo - modal.SetTextColor(tcell.NewHexColor(0xffffff)) // White - modal.SetButtonBackgroundColor(tcell.NewHexColor(0xff2a2a)) // Neon Red - modal.SetButtonTextColor(tcell.NewHexColor(0xffffff)) // White - a.showModal("error", modal) -} - -func (a *App) confirmDelete(label string, onConfirm func()) { - modal := tview.NewModal(). - SetText(" [red::b]DELETE WARNING[-::-]\n\nDelete " + label + "?\n[gray]This action cannot be undone.[-]"). - AddButtons([]string{"Delete", "Cancel"}). - SetDoneFunc(func(_ int, buttonLabel string) { - a.hideModal("confirm-delete") - if buttonLabel == "Delete" { - onConfirm() - } - }) - // Cyberpunk Modal Style - modal.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) // Deep Indigo - modal.SetTextColor(tcell.NewHexColor(0xffffff)) // White - modal.SetButtonBackgroundColor(tcell.NewHexColor(0xff2a2a)) // Neon Red for danger - modal.SetButtonTextColor(tcell.NewHexColor(0xffffff)) // White - a.showModal("confirm-delete", modal) -} - -func centeredForm(form *tview.Form, widthPct, height int) tview.Primitive { - return tview.NewFlex(). - AddItem(tview.NewBox(), 0, 1, false). - AddItem(tview.NewFlex().SetDirection(tview.FlexRow). - AddItem(tview.NewBox(), 0, 1, false). - AddItem(form, height, 1, true). - AddItem(tview.NewBox(), 0, 1, false), 0, widthPct, true). - AddItem(tview.NewBox(), 0, 1, false) -} - -func hintBar(text string) *tview.TextView { - tv := tview.NewTextView(). - SetText(text). - SetDynamicColors(true). - SetTextAlign(tview.AlignCenter). - SetTextColor(tcell.NewHexColor(0x00f0ff)) // Neon Cyan - tv.SetBackgroundColor(tcell.NewHexColor(0x2a2a40)) // Darker Indigo - return tv -} - -func (a *App) buildShell(pageID string, content tview.Primitive, hint string) tview.Primitive { - var modelTV *tview.TextView - if pageID == "home" { - if a.headerModelTV == nil { - a.headerModelTV = tview.NewTextView() - a.headerModelTV.SetTextAlign(tview.AlignRight). - SetTextColor(tcell.NewHexColor(0x39ff14)). // Neon Lime - SetDynamicColors(true). - SetBackgroundColor(tcell.NewHexColor(0x050510)) - } - modelTV = a.headerModelTV - modelTV.SetText("MODEL: " + a.cfg.CurrentModelLabel() + " ") - } else { - modelTV = tview.NewTextView() - modelTV.SetBackgroundColor(tcell.NewHexColor(0x050510)) - } - - headerLeft := tview.NewTextView(). - SetText(" [#ff00ff::b]///[#00f0ff] PICOCLAW LAUNCHER [#ff00ff]///"). - SetDynamicColors(true). - SetBackgroundColor(tcell.NewHexColor(0x050510)) - - header := tview.NewFlex(). - AddItem(headerLeft, 0, 1, false). - AddItem(modelTV, 0, 1, false) - - sidebar := tview.NewTextView(). - SetDynamicColors(true). - SetWrap(false) - sidebar.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) // Deep Indigo - - // Cyberpunk Sidebar Styling - activePrefix := "[#39ff14::b]>> " // Neon Lime arrow - activeSuffix := "[-]" - inactivePrefix := "[#808080] " - inactiveSuffix := "[-]" - - sbText := "\n\n" // Top padding - - menuItem := func(id, label string) string { - if pageID == id { - return activePrefix + label + activeSuffix + "\n\n" - } - return inactivePrefix + label + inactiveSuffix + "\n\n" - } - - sbText += menuItem("home", "HOME") - sbText += menuItem("schemes", "SCHEMES") - sbText += menuItem("users", "USERS") - sbText += menuItem("models", "MODELS") - sbText += menuItem("channels", "CHANNELS") - sbText += menuItem("gateway", "GATEWAY") - - sidebar.SetText(sbText) - - footer := hintBar(hint) - - grid := tview.NewGrid(). - SetRows(1, 0, 1). - SetColumns(20, 0). // Slightly wider sidebar - AddItem(header, 0, 0, 1, 2, 0, 0, false). - AddItem(sidebar, 1, 0, 1, 1, 0, 0, false). - AddItem(content, 1, 1, 1, 1, 0, 0, true). - AddItem(footer, 2, 0, 1, 2, 0, 0, false) - - // Add a border around the content area if possible, or ensure content has its own border - // grid.SetBorders(false) // Grid borders usually look bad, handled by components - - return grid -} diff --git a/cmd/picoclaw-launcher-tui/ui/channels.go b/cmd/picoclaw-launcher-tui/ui/channels.go deleted file mode 100644 index c976f1fcd..000000000 --- a/cmd/picoclaw-launcher-tui/ui/channels.go +++ /dev/null @@ -1,202 +0,0 @@ -// PicoClaw - Ultra-lightweight personal AI agent -// License: MIT -// -// Copyright (c) 2026 PicoClaw contributors - -package ui - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "reflect" - "strconv" - - "github.com/gdamore/tcell/v2" - "github.com/rivo/tview" -) - -func (a *App) newChannelsPage() tview.Primitive { - list := tview.NewList() - list.SetBorder(true). - SetTitle(" [#00f0ff::b] COMMUNICATION CHANNELS "). - SetTitleColor(tcell.NewHexColor(0x00f0ff)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - list.SetMainTextColor(tcell.NewHexColor(0xe0e0e0)) - list.SetSecondaryTextColor(tcell.NewHexColor(0x808080)) - list.SetSelectedStyle( - tcell.StyleDefault.Background(tcell.NewHexColor(0xff00ff)).Foreground(tcell.NewHexColor(0x050510)), - ) - list.SetHighlightFullLine(true) - list.SetBackgroundColor(tcell.NewHexColor(0x050510)) - - rebuild := func() { - sel := list.GetCurrentItem() - list.Clear() - - home, err := os.UserHomeDir() - if err != nil { - home = "." - } - configPath := filepath.Join(home, ".picoclaw", "config.json") - - var cfg map[string]any - if data, err := os.ReadFile(configPath); err == nil { - _ = json.Unmarshal(data, &cfg) - } - - if chRaw, ok := cfg["channels"].(map[string]any); ok { - for name, ch := range chRaw { - chMap, ok := ch.(map[string]any) - enabled := "disabled" - if ok { - if e, ok := chMap["enabled"].(bool); ok && e { - enabled = "enabled" - } - } - list.AddItem(name, fmt.Sprintf("Status: %s", enabled), 0, func() { - a.showChannelEditForm(configPath, name, chMap) - }) - } - } - - if sel >= 0 && sel < list.GetItemCount() { - list.SetCurrentItem(sel) - } - } - rebuild() - - a.pageRefreshFns["channels"] = rebuild - - list.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { - if event.Key() == tcell.KeyEscape { - return a.goBack() - } - return event - }) - - return a.buildShell("channels", list, " [#ff00ff]Enter:[-] edit [#ff2a2a]ESC:[-] back ") -} - -func (a *App) showChannelEditForm(configPath, channelName string, existing map[string]any) { - form := tview.NewForm() - form.SetBorder(true). - SetTitle(" [::b]EDIT CHANNEL "). - SetTitleColor(tcell.NewHexColor(0x39ff14)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - form.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) - form.SetFieldBackgroundColor(tcell.NewHexColor(0x050510)) - form.SetFieldTextColor(tcell.NewHexColor(0x00f0ff)) - form.SetLabelColor(tcell.NewHexColor(0xe0e0e0)) - form.SetButtonBackgroundColor(tcell.NewHexColor(0xff00ff)) - form.SetButtonTextColor(tcell.NewHexColor(0xffffff)) - - fields := make(map[string]*tview.InputField) - var nameField *tview.InputField - - if channelName == "" { - nameField = tview.NewInputField(). - SetLabel("Channel Name"). - SetText(""). - SetFieldWidth(28) - form.AddFormItem(nameField) - } - - for k, v := range existing { - if reflect.ValueOf(v).Kind() == reflect.Map || reflect.ValueOf(v).Kind() == reflect.Slice { - continue - } - valStr := fmt.Sprintf("%v", v) - field := tview.NewInputField(). - SetLabel(k). - SetText(valStr). - SetFieldWidth(28) - form.AddFormItem(field) - fields[k] = field - } - - form.AddButton("SAVE", func() { - var cfg map[string]any - if data, err := os.ReadFile(configPath); err == nil { - if err := json.Unmarshal(data, &cfg); err != nil { - cfg = make(map[string]any) - } - } else { - cfg = make(map[string]any) - } - - if _, ok := cfg["channels"]; !ok { - cfg["channels"] = make(map[string]any) - } - channels, ok := cfg["channels"].(map[string]any) - if !ok { - channels = make(map[string]any) - cfg["channels"] = channels - } - - finalName := channelName - if channelName == "" { - if nameField == nil || nameField.GetText() == "" { - a.showError("Channel name is required") - return - } - finalName = nameField.GetText() - } - - updated := make(map[string]any) - if existing != nil { - for k, v := range existing { - updated[k] = v - } - } - for k, field := range fields { - val := field.GetText() - if val == "true" { - updated[k] = true - } else if val == "false" { - updated[k] = false - } else if num, err := strconv.Atoi(val); err == nil { - updated[k] = num - } else { - updated[k] = val - } - } - - if channelName != "" && finalName != channelName { - delete(channels, channelName) - } - channels[finalName] = updated - - data, err := json.MarshalIndent(cfg, "", " ") - if err != nil { - a.showError(fmt.Sprintf("Failed to save config: %v", err)) - return - } - if err := os.MkdirAll(filepath.Dir(configPath), 0o700); err != nil { - a.showError(fmt.Sprintf("Failed to create config directory: %v", err)) - return - } - if err := os.WriteFile(configPath, data, 0o600); err != nil { - a.showError(fmt.Sprintf("Failed to write config: %v", err)) - return - } - - a.hideModal("channel-edit") - a.goBack() - }) - - form.AddButton("CANCEL", func() { - a.hideModal("channel-edit") - }) - - form.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { - if event.Key() == tcell.KeyEscape { - a.hideModal("channel-edit") - return nil - } - return event - }) - - a.showModal("channel-edit", centeredForm(form, 4, 20)) -} diff --git a/cmd/picoclaw-launcher-tui/ui/gateway.go b/cmd/picoclaw-launcher-tui/ui/gateway.go deleted file mode 100644 index 781204bf2..000000000 --- a/cmd/picoclaw-launcher-tui/ui/gateway.go +++ /dev/null @@ -1,229 +0,0 @@ -// PicoClaw - Ultra-lightweight personal AI agent -// License: MIT -// -// Copyright (c) 2026 PicoClaw contributors - -package ui - -import ( - "fmt" - "os/exec" - "runtime" - "strconv" - "strings" - "time" - - "github.com/gdamore/tcell/v2" - "github.com/rivo/tview" - - "github.com/sipeed/picoclaw/pkg/config" - ppid "github.com/sipeed/picoclaw/pkg/pid" -) - -type gatewayStatus struct { - running bool - pid int - version string -} - -func picoHome() string { - return config.GetHome() -} - -func getGatewayStatus() gatewayStatus { - data := ppid.ReadPidFileWithCheck(picoHome()) - if data == nil { - return gatewayStatus{running: false} - } - return gatewayStatus{ - running: true, - pid: data.PID, - version: data.Version, - } -} - -func startGateway() error { - status := getGatewayStatus() - if status.running { - return fmt.Errorf("gateway is already running (PID: %d)", status.pid) - } - - var cmd *exec.Cmd - - if runtime.GOOS == "windows" { - cmd = exec.Command("cmd", "/C", "start /B picoclaw gateway > NUL 2>&1") - } else { - cmd = exec.Command("sh", "-c", "nohup picoclaw gateway > /dev/null 2>&1 &") - } - - err := cmd.Start() - if err != nil { - return err - } - - time.Sleep(1 * time.Second) - - if runtime.GOOS == "windows" { - cmd := exec.Command( - "wmic", - "process", - "where", - "name='picoclaw.exe' and commandline like '%gateway%'", - "get", - "processid", - ) - output, err := cmd.Output() - if err != nil { - return fmt.Errorf("failed to get gateway PID: %w", err) - } - lines := strings.Split(string(output), "\n") - for _, line := range lines[1:] { - line = strings.TrimSpace(line) - if line == "" { - continue - } - _, err := strconv.Atoi(line) - if err == nil { - break - } - } - } - - status = getGatewayStatus() - if !status.running { - return fmt.Errorf("failed to start gateway") - } - return nil -} - -func stopGateway() error { - status := getGatewayStatus() - if !status.running { - return fmt.Errorf("gateway is not running") - } - - var err error - if runtime.GOOS == "windows" { - err = exec.Command("taskkill", "/F", "/PID", strconv.Itoa(status.pid)).Run() - } else { - err = exec.Command("kill", strconv.Itoa(status.pid)).Run() - } - if err != nil { - return err - } - - // Wait for process to stop (ReadPidFileWithCheck cleans up stale pid file) - for i := 0; i < 5; i++ { - if !getGatewayStatus().running { - break - } - time.Sleep(200 * time.Millisecond) - } - - return nil -} - -func (a *App) newGatewayPage() tview.Primitive { - flex := tview.NewFlex().SetDirection(tview.FlexRow) - flex.SetBorder(true). - SetTitle(" [#00f0ff::b] GATEWAY MANAGEMENT "). - SetTitleColor(tcell.NewHexColor(0x00f0ff)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - flex.SetBackgroundColor(tcell.NewHexColor(0x050510)) - - statusTV := tview.NewTextView(). - SetDynamicColors(true). - SetTextAlign(tview.AlignCenter). - SetText("Checking status...") - statusTV.SetBackgroundColor(tcell.NewHexColor(0x050510)) - - var updateStatus func() - - // 使用List作为按钮,保证显示和交互正常 - buttons := tview.NewList() - buttons.SetBackgroundColor(tcell.NewHexColor(0x050510)) - buttons.SetMainTextColor(tcell.ColorWhite) - buttons.SetSelectedBackgroundColor(tcell.NewHexColor(0xff00ff)) - buttons.SetSelectedTextColor(tcell.ColorBlack) - - buttons.AddItem(" [lime]START[white] ", "", 0, func() { - if !getGatewayStatus().running { - err := startGateway() - if err != nil { - a.showError(err.Error()) - } - updateStatus() - } - }) - buttons.AddItem(" [red]STOP[white] ", "", 0, func() { - if getGatewayStatus().running { - err := stopGateway() - if err != nil { - a.showError(err.Error()) - } - updateStatus() - } - }) - - buttonFlex := tview.NewFlex().SetDirection(tview.FlexColumn) - buttonFlex. - AddItem(tview.NewBox(), 0, 1, false). - AddItem(buttons, 20, 1, true). - AddItem(tview.NewBox(), 0, 1, false) - - flex. - AddItem(tview.NewBox(), 0, 1, false). - AddItem(statusTV, 3, 1, false). - AddItem(tview.NewBox(), 0, 1, false). - AddItem(buttonFlex, 4, 1, true). - AddItem(tview.NewBox(), 0, 1, false) - - updateStatus = func() { - status := getGatewayStatus() - if status.running { - versionInfo := "" - if status.version != "" { - versionInfo = fmt.Sprintf("\nVersion: %s", status.version) - } - statusTV.SetText(fmt.Sprintf("[#39ff14::b]GATEWAY RUNNING[-]\n\nPID: %d%s", status.pid, versionInfo)) - buttons.SetItemText(0, " [gray]START[white] ", "") - buttons.SetItemText(1, " [red]STOP[white] ", "") - } else { - statusTV.SetText("[#ff2a2a::b]GATEWAY STOPPED[-]\n\nPID: N/A") - buttons.SetItemText(0, " [lime]START[white] ", "") - buttons.SetItemText(1, " [gray]STOP[white] ", "") - } - } - - updateStatus() - - done := make(chan struct{}) - go func() { - ticker := time.NewTicker(2 * time.Second) - defer ticker.Stop() - for { - select { - case <-ticker.C: - a.tapp.QueueUpdateDraw(updateStatus) - case <-done: - return - } - } - }() - - originalInputCapture := flex.GetInputCapture() - flex.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { - if event.Key() == tcell.KeyEscape { - close(done) - return a.goBack() - } - if originalInputCapture != nil { - return originalInputCapture(event) - } - return event - }) - - a.pageRefreshFns["gateway"] = updateStatus - - return a.buildShell("gateway", flex, " [#39ff14]Enter:[-] select [#ff2a2a]ESC:[-] back ") -} diff --git a/cmd/picoclaw-launcher-tui/ui/home.go b/cmd/picoclaw-launcher-tui/ui/home.go deleted file mode 100644 index 74a7769cf..000000000 --- a/cmd/picoclaw-launcher-tui/ui/home.go +++ /dev/null @@ -1,70 +0,0 @@ -// PicoClaw - Ultra-lightweight personal AI agent -// License: MIT -// -// Copyright (c) 2026 PicoClaw contributors - -package ui - -import ( - "os" - "os/exec" - - "github.com/gdamore/tcell/v2" - "github.com/rivo/tview" -) - -func (a *App) newHomePage() tview.Primitive { - list := tview.NewList() - list.SetBorder(true). - SetTitle(" [#00f0ff::b] ACTIVE CONFIGURATION "). - SetTitleColor(tcell.NewHexColor(0x00f0ff)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - list.SetMainTextColor(tcell.NewHexColor(0xe0e0e0)) - list.SetSecondaryTextColor(tcell.NewHexColor(0x808080)) - list.SetSelectedStyle( - tcell.StyleDefault.Background(tcell.NewHexColor(0x39ff14)).Foreground(tcell.NewHexColor(0x050510)), - ) - list.SetHighlightFullLine(true) - list.SetBackgroundColor(tcell.NewHexColor(0x050510)) - - rebuildList := func() { - sel := list.GetCurrentItem() - list.Clear() - list.AddItem("MODEL: "+a.cfg.CurrentModelLabel(), "Select to configure AI model", 'm', func() { - a.navigateTo("schemes", a.newSchemesPage()) - }) - list.AddItem( - "CHANNELS: Configure communication channels", - "Manage Telegram/Discord/WeChat channels", - 'n', - func() { - a.navigateTo("channels", a.newChannelsPage()) - }, - ) - list.AddItem("GATEWAY MANAGEMENT", "Manage PicoClaw gateway daemon", 'g', func() { - a.navigateTo("gateway", a.newGatewayPage()) - }) - list.AddItem("CHAT: Start AI agent chat", "Launch interactive chat session", 'c', func() { - a.tapp.Suspend(func() { - cmd := exec.Command("picoclaw", "agent") - cmd.Stdin = os.Stdin - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - _ = cmd.Run() - }) - }) - list.AddItem("QUIT SYSTEM", "Exit PicoClaw Launcher", 'q', func() { a.tapp.Stop() }) - if sel >= 0 && sel < list.GetItemCount() { - list.SetCurrentItem(sel) - } - } - rebuildList() - - a.pageRefreshFns["home"] = rebuildList - - return a.buildShell( - "home", - list, - " [#00f0ff]m:[-] model [#00f0ff]n:[-] channels [#00f0ff]g:[-] gateway [#00f0ff]c:[-] chat [#ff2a2a]q:[-] quit ", - ) -} diff --git a/cmd/picoclaw-launcher-tui/ui/models.go b/cmd/picoclaw-launcher-tui/ui/models.go deleted file mode 100644 index 20e5f0182..000000000 --- a/cmd/picoclaw-launcher-tui/ui/models.go +++ /dev/null @@ -1,200 +0,0 @@ -// PicoClaw - Ultra-lightweight personal AI agent -// License: MIT -// -// Copyright (c) 2026 PicoClaw contributors - -package ui - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "time" - - "github.com/gdamore/tcell/v2" - "github.com/rivo/tview" - - tuicfg "github.com/sipeed/picoclaw/cmd/picoclaw-launcher-tui/config" -) - -type modelsAPIResponse struct { - Data []modelEntry `json:"data"` -} - -type modelEntry struct { - ID string `json:"id"` - Name string `json:"name"` - Description string `json:"description"` -} - -func (a *App) newModelsPage(schemeName, userName, baseURL string) tview.Primitive { - table := tview.NewTable(). - SetBorders(false). - SetSelectable(true, false). - SetFixed(0, 0) - table.SetBorder(true). - SetTitle(fmt.Sprintf(" [#00f0ff::b] MODELS · %s / %s ", schemeName, userName)). - SetTitleColor(tcell.NewHexColor(0x00f0ff)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - table.SetSelectedStyle( - tcell.StyleDefault.Background(tcell.NewHexColor(0xff00ff)).Foreground(tcell.NewHexColor(0xffffff)), - ) - table.SetBackgroundColor(tcell.NewHexColor(0x050510)) - - var modelIDs []string - - status := tview.NewTextView(). - SetTextAlign(tview.AlignCenter). - SetDynamicColors(true). - SetText("[#ffff00]FETCHING MODELS...[-]") - status.SetBackgroundColor(tcell.NewHexColor(0x050510)) - - flex := tview.NewFlex(). - SetDirection(tview.FlexRow). - AddItem(status, 1, 0, false). - AddItem(table, 0, 1, false) - - apiKey := a.resolveKey(schemeName, userName) - - go func() { - var entries []modelEntry - var err error - if apiKey == "" { - err = fmt.Errorf("key is required") - } else { - entries, err = fetchModels(baseURL, apiKey) - } - - a.modelCacheMu.Lock() - if a.modelCache == nil { - a.modelCache = make(map[string][]modelEntry) - } - if err == nil && len(entries) > 0 { - a.modelCache[cacheKey(schemeName, userName)] = entries - } else { - a.modelCache[cacheKey(schemeName, userName)] = nil - } - a.modelCacheMu.Unlock() - - a.tapp.QueueUpdateDraw(func() { - if err != nil { - status.SetText(fmt.Sprintf("[#ff2a2a]ERROR: %s[-]", err.Error())) - table.SetCell(0, 0, tview.NewTableCell(" (failed to load models)")) - a.tapp.SetFocus(table) - return - } - if len(entries) == 0 { - status.SetText("[#ff2a2a]NO MODELS RETURNED[-]") - table.SetCell(0, 0, tview.NewTableCell(" (no models available)")) - a.tapp.SetFocus(table) - return - } - - status.SetText(fmt.Sprintf("[#39ff14]%d MODEL(S) LOADED[-]", len(entries))) - for i, m := range entries { - modelIDs = append(modelIDs, m.ID) - table.SetCell(i, 0, - tview.NewTableCell(fmt.Sprintf("%3d", i+1)). - SetAlign(tview.AlignRight). - SetTextColor(tcell.NewHexColor(0x808080)). - SetSelectable(false), - ) - table.SetCell(i, 1, - tview.NewTableCell(" "+m.ID). - SetAlign(tview.AlignLeft). - SetExpansion(1). - SetTextColor(tcell.NewHexColor(0xe0e0e0)), - ) - } - a.tapp.SetFocus(table) - }) - }() - - table.SetSelectedFunc(func(row, _ int) { - if row < 0 || row >= len(modelIDs) { - return - } - a.cfg.Provider.Current = tuicfg.ProviderCurrent{ - Scheme: schemeName, - User: userName, - Model: modelIDs[row], - } - a.save() - - // Trigger model selected callback if set - if a.OnModelSelected != nil && a.cfg.Model.Type == "provider" { - scheme := a.cfg.Provider.SchemeByName(schemeName) - if scheme == nil { - a.goBack() - return - } - var user tuicfg.User - for _, u := range a.cfg.Provider.Users { - if u.Scheme == schemeName && u.Name == userName { - user = u - break - } - } - a.OnModelSelected(*scheme, user, modelIDs[row]) - } - - a.goBack() - }) - - return a.buildShell("models", flex, " [#39ff14]Enter:[-] select [#ff00ff]ESC:[-] back ") -} - -func (a *App) resolveKey(schemeName, userName string) string { - for _, u := range a.cfg.Provider.Users { - if u.Scheme == schemeName && u.Name == userName { - return u.Key - } - } - return "" -} - -func fetchModels(baseURL, apiKey string) ([]modelEntry, error) { - url := strings.TrimRight(baseURL, "/") + "/models" - - client := &http.Client{Timeout: 15 * time.Second} - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - return nil, fmt.Errorf("build request: %w", err) - } - if apiKey != "" { - req.Header.Set("Authorization", "Bearer "+apiKey) - } - - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("request failed: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(io.LimitReader(resp.Body, 512)) - return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, strings.TrimSpace(string(body))) - } - - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("read response: %w", err) - } - - var result modelsAPIResponse - if err := json.Unmarshal(body, &result); err == nil && len(result.Data) > 0 { - return result.Data, nil - } - - var arr []modelEntry - if err := json.Unmarshal(body, &arr); err == nil { - return arr, nil - } - - return nil, fmt.Errorf( - "decode response: unrecognized shape: %s", - strings.TrimSpace(string(body[:min(len(body), 256)])), - ) -} diff --git a/cmd/picoclaw-launcher-tui/ui/schemes.go b/cmd/picoclaw-launcher-tui/ui/schemes.go deleted file mode 100644 index e38d7fa86..000000000 --- a/cmd/picoclaw-launcher-tui/ui/schemes.go +++ /dev/null @@ -1,252 +0,0 @@ -// PicoClaw - Ultra-lightweight personal AI agent -// License: MIT -// -// Copyright (c) 2026 PicoClaw contributors - -package ui - -import ( - "fmt" - - "github.com/gdamore/tcell/v2" - "github.com/rivo/tview" - - tuicfg "github.com/sipeed/picoclaw/cmd/picoclaw-launcher-tui/config" -) - -func (a *App) newSchemesPage() tview.Primitive { - table := tview.NewTable(). - SetBorders(false). - SetSelectable(true, false) - table.SetBorder(true). - SetTitle(" [#00f0ff::b] PROVIDER SCHEMES "). - SetTitleColor(tcell.NewHexColor(0x00f0ff)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - table.SetSelectedStyle( - tcell.StyleDefault.Background(tcell.NewHexColor(0xff00ff)).Foreground(tcell.NewHexColor(0xffffff)), - ) - table.SetBackgroundColor(tcell.NewHexColor(0x050510)) - - rowToIdx := func(row int) int { return row / 2 } - - selectedSchemeName := func() string { - row, _ := table.GetSelection() - idx := rowToIdx(row) - schemes := a.cfg.Provider.Schemes - if idx >= 0 && idx < len(schemes) { - return schemes[idx].Name - } - return "" - } - - rebuild := func() { - selName := selectedSchemeName() - table.Clear() - schemes := a.cfg.Provider.Schemes - for i, s := range schemes { - nameRow := i * 2 - detailRow := nameRow + 1 - - table.SetCell(nameRow, 0, - tview.NewTableCell(" "+s.Name). - SetTextColor(tcell.NewHexColor(0xe0e0e0)). - SetExpansion(1). - SetSelectable(true), - ) - - users := a.cfg.Provider.UsersForScheme(s.Name) - n := len(users) - m := 0 - for _, u := range users { - if models := a.cachedModels(s.Name, u.Name); len(models) > 0 { - m++ - } - } - table.SetCell(detailRow, 0, - tview.NewTableCell(fmt.Sprintf(" [#808080](%d/%d) %s", m, n, s.BaseURL)). - SetTextColor(tcell.NewHexColor(0x808080)). - SetExpansion(1). - SetSelectable(false), - ) - table.SetCell(detailRow, 1, - tview.NewTableCell("[#00f0ff]"+s.Type+" "). - SetAlign(tview.AlignRight). - SetSelectable(false), - ) - } - if selName != "" { - for i, s := range schemes { - if s.Name == selName { - table.Select(i*2, 0) - return - } - } - } - if table.GetRowCount() > 0 { - table.Select(0, 0) - } - } - rebuild() - - a.refreshModelCache(rebuild) - a.pageRefreshFns["schemes"] = func() { a.refreshModelCache(rebuild) } - - table.SetSelectedFunc(func(row, _ int) { - idx := rowToIdx(row) - schemes := a.cfg.Provider.Schemes - if idx < 0 || idx >= len(schemes) { - return - } - name := schemes[idx].Name - a.navigateTo("users", a.newUsersPage(name)) - }) - - table.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { - row, _ := table.GetSelection() - idx := rowToIdx(row) - schemes := a.cfg.Provider.Schemes - switch event.Rune() { - case 'a': - a.showSchemeForm(nil, func(s tuicfg.Scheme) { - a.cfg.Provider.Schemes = append(a.cfg.Provider.Schemes, s) - a.save() - a.refreshModelCache(rebuild) - }) - return nil - case 'e': - if idx < 0 || idx >= len(schemes) { - return nil - } - origName := schemes[idx].Name - orig := schemes[idx] - a.showSchemeForm(&orig, func(s tuicfg.Scheme) { - current := a.cfg.Provider.Schemes - for i, sc := range current { - if sc.Name == origName { - a.cfg.Provider.Schemes[i] = s - break - } - } - a.save() - a.refreshModelCache(func() { - rebuild() - for i, sc := range a.cfg.Provider.Schemes { - if sc.Name == s.Name { - table.Select(i*2, 0) - break - } - } - }) - }) - return nil - case 'd': - if idx < 0 || idx >= len(schemes) { - return nil - } - name := schemes[idx].Name - a.confirmDelete(fmt.Sprintf("scheme %q", name), func() { - current := a.cfg.Provider.Schemes - newSchemes := make([]tuicfg.Scheme, 0, len(current)) - for _, sc := range current { - if sc.Name != name { - newSchemes = append(newSchemes, sc) - } - } - a.cfg.Provider.Schemes = newSchemes - - existing := a.cfg.Provider.Users - filtered := make([]tuicfg.User, 0, len(existing)) - for _, u := range existing { - if u.Scheme != name { - filtered = append(filtered, u) - } - } - a.cfg.Provider.Users = filtered - - a.save() - a.refreshModelCache(rebuild) - }) - return nil - } - return event - }) - - return a.buildShell( - "schemes", - table, - " [#00f0ff]a:[-] add [#00f0ff]e:[-] edit [#ff2a2a]d:[-] delete [#39ff14]Enter:[-] open [#ff00ff]ESC:[-] back ", - ) -} - -func (a *App) showSchemeForm(existing *tuicfg.Scheme, onSave func(tuicfg.Scheme)) { - name := "" - baseURL := "" - schemeType := "openai-compatible" - title := " ADD SCHEME " - - if existing != nil { - name = existing.Name - baseURL = existing.BaseURL - schemeType = existing.Type - title = " EDIT SCHEME " - } - - typeOptions := []string{"openai-compatible", "anthropic"} - typeIdx := 0 - for i, t := range typeOptions { - if t == schemeType { - typeIdx = i - break - } - } - - form := tview.NewForm() - - form. - AddInputField("Name", name, 20, nil, func(text string) { name = text }). - AddInputField("Base URL", baseURL, 28, nil, func(text string) { baseURL = text }). - AddDropDown("Type", typeOptions, typeIdx, func(option string, _ int) { schemeType = option }). - AddButton("SAVE", func() { - if name == "" { - a.showError("Name is required") - return - } - if baseURL == "" { - a.showError("Base URL is required") - return - } - if existing == nil { - for _, s := range a.cfg.Provider.Schemes { - if s.Name == name { - a.showError(fmt.Sprintf("Scheme name %q already exists", name)) - return - } - } - } - a.hideModal("scheme-form") - onSave(tuicfg.Scheme{Name: name, BaseURL: baseURL, Type: schemeType}) - }). - AddButton("CANCEL", func() { - a.hideModal("scheme-form") - }) - - form.SetBorder(true). - SetTitle(" [::b]" + title + " "). - SetTitleColor(tcell.NewHexColor(0x39ff14)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - form.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) - form.SetFieldBackgroundColor(tcell.NewHexColor(0x050510)) - form.SetFieldTextColor(tcell.NewHexColor(0x00f0ff)) - form.SetLabelColor(tcell.NewHexColor(0xe0e0e0)) - form.SetButtonBackgroundColor(tcell.NewHexColor(0xff00ff)) - form.SetButtonTextColor(tcell.NewHexColor(0xffffff)) - form.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { - if event.Key() == tcell.KeyEscape { - a.hideModal("scheme-form") - return nil - } - return event - }) - - a.showModal("scheme-form", centeredForm(form, 4, 12)) -} diff --git a/cmd/picoclaw-launcher-tui/ui/users.go b/cmd/picoclaw-launcher-tui/ui/users.go deleted file mode 100644 index b00fc8982..000000000 --- a/cmd/picoclaw-launcher-tui/ui/users.go +++ /dev/null @@ -1,261 +0,0 @@ -// PicoClaw - Ultra-lightweight personal AI agent -// License: MIT -// -// Copyright (c) 2026 PicoClaw contributors - -package ui - -import ( - "fmt" - - "github.com/gdamore/tcell/v2" - "github.com/rivo/tview" - - tuicfg "github.com/sipeed/picoclaw/cmd/picoclaw-launcher-tui/config" -) - -func (a *App) newUsersPage(schemeName string) tview.Primitive { - table := tview.NewTable(). - SetBorders(false). - SetSelectable(true, false) - table.SetBorder(true). - SetTitle(fmt.Sprintf(" [#00f0ff::b] USERS · %s ", schemeName)). - SetTitleColor(tcell.NewHexColor(0x00f0ff)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - table.SetSelectedStyle( - tcell.StyleDefault.Background(tcell.NewHexColor(0xff00ff)).Foreground(tcell.NewHexColor(0xffffff)), - ) - table.SetBackgroundColor(tcell.NewHexColor(0x050510)) - - visibleUsers := func() []tuicfg.User { - var out []tuicfg.User - for _, u := range a.cfg.Provider.Users { - if u.Scheme == schemeName { - out = append(out, u) - } - } - return out - } - - findUserGlobalIdx := func(userName string) int { - for i, u := range a.cfg.Provider.Users { - if u.Scheme == schemeName && u.Name == userName { - return i - } - } - return -1 - } - - rowToVisIdx := func(row int) int { return row / 2 } - - selectedUserName := func() string { - row, _ := table.GetSelection() - users := visibleUsers() - visIdx := rowToVisIdx(row) - if visIdx >= 0 && visIdx < len(users) { - return users[visIdx].Name - } - return "" - } - - rebuild := func() { - selName := selectedUserName() - table.Clear() - users := visibleUsers() - for i, u := range users { - nameRow := i * 2 - detailRow := nameRow + 1 - - table.SetCell(nameRow, 0, - tview.NewTableCell(" "+u.Name). - SetTextColor(tcell.NewHexColor(0xe0e0e0)). - SetExpansion(1). - SetSelectable(true), - ) - table.SetCell(nameRow, 1, - tview.NewTableCell(""). - SetSelectable(false), - ) - - models := a.cachedModels(schemeName, u.Name) - var detailText string - if len(models) > 0 { - detailText = fmt.Sprintf(" [#39ff14]%d models available[-]", len(models)) - } else { - detailText = " [#ff2a2a]Inactive / No Access[-]" - } - table.SetCell(detailRow, 0, - tview.NewTableCell(detailText). - SetTextColor(tcell.NewHexColor(0x808080)). - SetExpansion(1). - SetSelectable(false), - ) - table.SetCell(detailRow, 1, - tview.NewTableCell("[#00f0ff]"+u.Type+" "). - SetAlign(tview.AlignRight). - SetSelectable(false), - ) - } - if selName != "" { - for i, u := range users { - if u.Name == selName { - table.Select(i*2, 0) - return - } - } - } - if table.GetRowCount() > 0 { - table.Select(0, 0) - } - } - rebuild() - - a.refreshModelCache(rebuild) - a.pageRefreshFns["users"] = func() { a.refreshModelCache(rebuild) } - - table.SetSelectedFunc(func(row, _ int) { - visIdx := rowToVisIdx(row) - users := visibleUsers() - if visIdx < 0 || visIdx >= len(users) { - return - } - uName := users[visIdx].Name - scheme := a.cfg.Provider.SchemeByName(schemeName) - if scheme == nil { - a.showError(fmt.Sprintf("Scheme %q not found", schemeName)) - return - } - a.navigateTo("models", a.newModelsPage(schemeName, uName, scheme.BaseURL)) - }) - - table.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { - row, _ := table.GetSelection() - visIdx := rowToVisIdx(row) - users := visibleUsers() - switch event.Rune() { - case 'a': - a.showUserForm(schemeName, nil, func(u tuicfg.User) { - a.cfg.Provider.Users = append(a.cfg.Provider.Users, u) - a.save() - a.refreshModelCache(rebuild) - }) - return nil - case 'e': - if visIdx < 0 || visIdx >= len(users) { - return nil - } - origName := users[visIdx].Name - orig := a.cfg.Provider.Users[findUserGlobalIdx(origName)] - a.showUserForm(schemeName, &orig, func(u tuicfg.User) { - cfgIdx := findUserGlobalIdx(origName) - if cfgIdx < 0 { - a.showError(fmt.Sprintf("User %q no longer exists", origName)) - return - } - a.cfg.Provider.Users[cfgIdx] = u - a.save() - a.refreshModelCache(func() { - rebuild() - for i, usr := range visibleUsers() { - if usr.Name == u.Name { - table.Select(i*2, 0) - break - } - } - }) - }) - return nil - case 'd': - if visIdx < 0 || visIdx >= len(users) { - return nil - } - uName := users[visIdx].Name - a.confirmDelete(fmt.Sprintf("user %q", uName), func() { - cfgIdx := findUserGlobalIdx(uName) - if cfgIdx < 0 { - return - } - all := a.cfg.Provider.Users - a.cfg.Provider.Users = append(all[:cfgIdx], all[cfgIdx+1:]...) - a.save() - a.refreshModelCache(rebuild) - }) - return nil - } - return event - }) - - return a.buildShell( - "users", - table, - " [#00f0ff]a:[-] add [#00f0ff]e:[-] edit [#ff2a2a]d:[-] delete [#39ff14]Enter:[-] models [#ff00ff]ESC:[-] back ", - ) -} - -func (a *App) showUserForm(schemeName string, existing *tuicfg.User, onSave func(tuicfg.User)) { - name := "" - userType := "key" - key := "" - title := " ADD USER " - - if existing != nil { - name = existing.Name - userType = existing.Type - key = existing.Key - title = " EDIT USER " - } - - typeOptions := []string{"key", "OAuth"} - typeIdx := 0 - for i, t := range typeOptions { - if t == userType { - typeIdx = i - break - } - } - - form := tview.NewForm() - form. - AddInputField("Name", name, 20, nil, func(text string) { name = text }). - AddDropDown("Type", typeOptions, typeIdx, func(option string, _ int) { userType = option }). - AddPasswordField("Key", key, 28, '*', func(text string) { key = text }). - AddButton("SAVE", func() { - if name == "" { - a.showError("Name is required") - return - } - if existing == nil { - for _, u := range a.cfg.Provider.Users { - if u.Scheme == schemeName && u.Name == name { - a.showError(fmt.Sprintf("User name %q already exists for this scheme", name)) - return - } - } - } - a.hideModal("user-form") - onSave(tuicfg.User{Name: name, Scheme: schemeName, Type: userType, Key: key}) - }). - AddButton("CANCEL", func() { - a.hideModal("user-form") - }) - - form.SetBorder(true). - SetTitle(" [::b]" + title + " "). - SetTitleColor(tcell.NewHexColor(0x39ff14)). - SetBorderColor(tcell.NewHexColor(0x00f0ff)) - form.SetBackgroundColor(tcell.NewHexColor(0x1a1a2e)) - form.SetFieldBackgroundColor(tcell.NewHexColor(0x050510)) - form.SetFieldTextColor(tcell.NewHexColor(0x00f0ff)) - form.SetLabelColor(tcell.NewHexColor(0xe0e0e0)) - form.SetButtonBackgroundColor(tcell.NewHexColor(0xff00ff)) - form.SetButtonTextColor(tcell.NewHexColor(0xffffff)) - form.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { - if event.Key() == tcell.KeyEscape { - a.hideModal("user-form") - return nil - } - return event - }) - - a.showModal("user-form", centeredForm(form, 4, 13)) -} diff --git a/cmd/picoclaw/internal/model/add.go b/cmd/picoclaw/internal/model/add.go new file mode 100644 index 000000000..b3ebba340 --- /dev/null +++ b/cmd/picoclaw/internal/model/add.go @@ -0,0 +1,200 @@ +package model + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/sipeed/picoclaw/cmd/picoclaw/internal" + "github.com/sipeed/picoclaw/pkg/config" +) + +const defaultAliasName = "custom-prefer" + +func newAddCommand() *cobra.Command { + var ( + apiBase string + apiKey string + modelID string + alias string + modelType string + ) + + cmd := &cobra.Command{ + Use: "add", + Short: "Add a model from an OpenAI-compatible endpoint", + Long: `Add a model entry by querying an OpenAI-compatible endpoint exposing +GET /models, then setting it as the default model. + +If --model is omitted, the available models are listed and you can pick one +interactively. If --model is provided, the entry is written without contacting +the server. + +Sample interactive session (key shown masked): + + $ picoclaw model add \ + -b https://ark.cn-beijing.volces.com/api/v3 \ + -k 7dff****-****-****-****-********e829 + + 115 model(s) available: + 1) doubao-lite-128k-240428 (doubao-lite-128k) + 2) doubao-pro-128k-240515 (doubao-pro-128k) + ... + 48) deepseek-r1-250120 (deepseek-r1) + 78) kimi-k2-250711 (kimi-k2) + ... + 115) doubao-seed3d-2-0-260328 (doubao-seed3d-2-0) + Pick a model (number or id): 48 + ✓ Saved model 'custom-prefer' (deepseek-r1-250120) and set as default.`, + Example: ` picoclaw model add --api-base https://api.openai.com/v1 --api-key sk-... + picoclaw model add -b http://localhost:8000/v1 -k dummy -m my-model -n local`, + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + return runAdd(addOptions{ + apiBase: strings.TrimSpace(apiBase), + apiKey: strings.TrimSpace(apiKey), + modelID: strings.TrimSpace(modelID), + alias: strings.TrimSpace(alias), + modelType: strings.TrimSpace(modelType), + stdin: cmd.InOrStdin(), + stdout: cmd.OutOrStdout(), + }) + }, + } + + cmd.Flags().StringVarP(&apiBase, "api-base", "b", "", + "API base URL (required), e.g. https://api.openai.com/v1") + cmd.Flags().StringVarP(&apiKey, "api-key", "k", "", "API key (required)") + cmd.Flags().StringVarP(&modelID, "model", "m", "", + "Model id; when set, skips the interactive picker and the network call") + cmd.Flags().StringVarP(&alias, "name", "n", defaultAliasName, + "Local alias written to model_list and used as the default model name") + cmd.Flags().StringVar(&modelType, "type", "openai-compatible", + "Endpoint type (only 'openai-compatible' is supported today)") + _ = cmd.MarkFlagRequired("api-base") + _ = cmd.MarkFlagRequired("api-key") + + return cmd +} + +type addOptions struct { + apiBase string + apiKey string + modelID string + alias string + modelType string + stdin io.Reader + stdout io.Writer +} + +func runAdd(opt addOptions) error { + if opt.modelType != "" && opt.modelType != "openai-compatible" { + return fmt.Errorf("unsupported --type %q (only 'openai-compatible' is supported)", opt.modelType) + } + if opt.alias == "" { + opt.alias = defaultAliasName + } + + selected := opt.modelID + if selected == "" { + entries, err := fetchOpenAIModels(opt.apiBase, opt.apiKey) + if err != nil { + return fmt.Errorf("fetch models: %w", err) + } + if len(entries) == 0 { + return fmt.Errorf("no models returned by %s", opt.apiBase) + } + selected, err = pickModel(opt.stdin, opt.stdout, entries) + if err != nil { + return err + } + } + + return upsertModelDefault(opt.apiBase, opt.apiKey, opt.alias, selected, opt.stdout) +} + +func pickModel(stdin io.Reader, stdout io.Writer, entries []modelEntry) (string, error) { + fmt.Fprintf(stdout, "\n%d model(s) available:\n", len(entries)) + for i, m := range entries { + line := m.ID + if m.Name != "" && m.Name != m.ID { + line = fmt.Sprintf("%s (%s)", m.ID, m.Name) + } + fmt.Fprintf(stdout, " %3d) %s\n", i+1, line) + } + + scanner := bufio.NewScanner(stdin) + for { + fmt.Fprint(stdout, "Pick a model (number or id): ") + if !scanner.Scan() { + if err := scanner.Err(); err != nil { + return "", fmt.Errorf("read input: %w", err) + } + return "", fmt.Errorf("no selection provided") + } + text := strings.TrimSpace(scanner.Text()) + if text == "" { + continue + } + if idx, err := strconv.Atoi(text); err == nil { + if idx < 1 || idx > len(entries) { + fmt.Fprintf(stdout, "Out of range. Enter 1-%d.\n", len(entries)) + continue + } + return entries[idx-1].ID, nil + } + for _, m := range entries { + if m.ID == text { + return m.ID, nil + } + } + fmt.Fprintln(stdout, "Not a valid number or model id; try again.") + } +} + +func upsertModelDefault(apiBase, apiKey, alias, modelID string, stdout io.Writer) error { + configPath := internal.GetConfigPath() + cfg, err := config.LoadConfig(configPath) + if err != nil { + return fmt.Errorf("failed to load config: %w", err) + } + + secureKeys := config.SimpleSecureStrings(apiKey) + + found := false + for _, m := range cfg.ModelList { + if m == nil { + continue + } + if m.ModelName == alias { + m.Model = modelID + m.APIBase = apiBase + m.APIKeys = secureKeys + m.Enabled = true + found = true + break + } + } + if !found { + cfg.ModelList = append(cfg.ModelList, &config.ModelConfig{ + ModelName: alias, + Model: modelID, + APIBase: apiBase, + APIKeys: secureKeys, + Enabled: true, + }) + } + + cfg.Agents.Defaults.ModelName = alias + + if err := config.SaveConfig(configPath, cfg); err != nil { + return fmt.Errorf("failed to save config: %w", err) + } + + fmt.Fprintf(stdout, "✓ Saved model '%s' (%s) and set as default.\n", alias, modelID) + return nil +} diff --git a/cmd/picoclaw/internal/model/add_test.go b/cmd/picoclaw/internal/model/add_test.go new file mode 100644 index 000000000..5da4d5e7f --- /dev/null +++ b/cmd/picoclaw/internal/model/add_test.go @@ -0,0 +1,257 @@ +package model + +import ( + "bytes" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/sipeed/picoclaw/pkg/config" +) + +func TestFetchOpenAIModels_DataEnvelope(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, "/models", r.URL.Path) + assert.Equal(t, "Bearer secret", r.Header.Get("Authorization")) + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"data":[{"id":"gpt-foo","name":"Foo"},{"id":"gpt-bar"}]}`)) + })) + defer srv.Close() + + entries, err := fetchOpenAIModels(srv.URL, "secret") + require.NoError(t, err) + require.Len(t, entries, 2) + assert.Equal(t, "gpt-foo", entries[0].ID) + assert.Equal(t, "Foo", entries[0].Name) + assert.Equal(t, "gpt-bar", entries[1].ID) +} + +func TestFetchOpenAIModels_BareArray(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`[{"id":"a"},{"id":"b"}]`)) + })) + defer srv.Close() + + entries, err := fetchOpenAIModels(srv.URL, "secret") + require.NoError(t, err) + require.Len(t, entries, 2) + assert.Equal(t, "a", entries[0].ID) + assert.Equal(t, "b", entries[1].ID) +} + +func TestFetchOpenAIModels_TrimsTrailingSlash(t *testing.T) { + var gotPath string + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gotPath = r.URL.Path + _, _ = w.Write([]byte(`{"data":[{"id":"x"}]}`)) + })) + defer srv.Close() + + _, err := fetchOpenAIModels(srv.URL+"/", "k") + require.NoError(t, err) + assert.Equal(t, "/models", gotPath) +} + +func TestFetchOpenAIModels_HTTPError(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, "nope", http.StatusUnauthorized) + })) + defer srv.Close() + + _, err := fetchOpenAIModels(srv.URL, "bad") + require.Error(t, err) + assert.Contains(t, err.Error(), "HTTP 401") +} + +func TestFetchOpenAIModels_EmptyDataEnvelope(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + _, _ = w.Write([]byte(`{"data":[]}`)) + })) + defer srv.Close() + + entries, err := fetchOpenAIModels(srv.URL, "k") + require.NoError(t, err) + assert.Empty(t, entries) +} + +func TestFetchOpenAIModels_EmptyBareArray(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + _, _ = w.Write([]byte(`[]`)) + })) + defer srv.Close() + + entries, err := fetchOpenAIModels(srv.URL, "k") + require.NoError(t, err) + assert.Empty(t, entries) +} + +func TestFetchOpenAIModels_UnrecognizedShape(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + _, _ = w.Write([]byte(`{"models":"not-supported"}`)) + })) + defer srv.Close() + + _, err := fetchOpenAIModels(srv.URL, "k") + require.Error(t, err) + assert.Contains(t, err.Error(), "unrecognized shape") +} + +func TestFetchOpenAIModels_RequiresInputs(t *testing.T) { + _, err := fetchOpenAIModels("", "k") + require.Error(t, err) + assert.Contains(t, err.Error(), "api base") + + _, err = fetchOpenAIModels("https://example.com", "") + require.Error(t, err) + assert.Contains(t, err.Error(), "api key") +} + +func TestPickModel_ByIndex(t *testing.T) { + entries := []modelEntry{{ID: "a"}, {ID: "b"}, {ID: "c"}} + out := &bytes.Buffer{} + got, err := pickModel(strings.NewReader("2\n"), out, entries) + require.NoError(t, err) + assert.Equal(t, "b", got) + assert.Contains(t, out.String(), "3 model(s) available") +} + +func TestPickModel_ByID(t *testing.T) { + entries := []modelEntry{{ID: "alpha"}, {ID: "beta"}} + out := &bytes.Buffer{} + got, err := pickModel(strings.NewReader("beta\n"), out, entries) + require.NoError(t, err) + assert.Equal(t, "beta", got) +} + +func TestPickModel_RetriesOnInvalid(t *testing.T) { + entries := []modelEntry{{ID: "x"}} + out := &bytes.Buffer{} + got, err := pickModel(strings.NewReader("\n9\nnot-a-model\nx\n"), out, entries) + require.NoError(t, err) + assert.Equal(t, "x", got) + rendered := out.String() + assert.Contains(t, rendered, "Out of range") + assert.Contains(t, rendered, "Not a valid number") +} + +func TestRunAdd_WithExplicitModel_NoNetwork(t *testing.T) { + initTest(t) + + out := &bytes.Buffer{} + err := runAdd(addOptions{ + apiBase: "https://invalid.invalid/v1", + apiKey: "k", + modelID: "explicit-model", + alias: "myalias", + modelType: "openai-compatible", + stdout: out, + }) + require.NoError(t, err) + assert.Contains(t, out.String(), "Saved model 'myalias' (explicit-model)") + + cfg, err := config.LoadConfig(configPath) + require.NoError(t, err) + assert.Equal(t, "myalias", cfg.Agents.Defaults.GetModelName()) + added := findModelByName(cfg, "myalias") + require.NotNil(t, added, "expected model 'myalias' in model_list") + assert.Equal(t, "explicit-model", added.Model) + assert.Equal(t, "https://invalid.invalid/v1", added.APIBase) + assert.True(t, added.Enabled) + require.Len(t, added.APIKeys, 1) + assert.Equal(t, "k", added.APIKeys[0].String()) +} + +func findModelByName(cfg *config.Config, name string) *config.ModelConfig { + for _, m := range cfg.ModelList { + if m != nil && m.ModelName == name { + return m + } + } + return nil +} + +func TestRunAdd_FetchAndPick(t *testing.T) { + initTest(t) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, "Bearer my-key", r.Header.Get("Authorization")) + _, _ = w.Write([]byte(`{"data":[{"id":"m1"},{"id":"m2"}]}`)) + })) + defer srv.Close() + + out := &bytes.Buffer{} + err := runAdd(addOptions{ + apiBase: srv.URL, + apiKey: "my-key", + alias: defaultAliasName, + modelType: "openai-compatible", + stdin: strings.NewReader("2\n"), + stdout: out, + }) + require.NoError(t, err) + + cfg, err := config.LoadConfig(configPath) + require.NoError(t, err) + assert.Equal(t, defaultAliasName, cfg.Agents.Defaults.GetModelName()) + added := findModelByName(cfg, defaultAliasName) + require.NotNil(t, added) + assert.Equal(t, "m2", added.Model) +} + +func TestRunAdd_UpsertsExistingAlias(t *testing.T) { + initTest(t) + + first := &bytes.Buffer{} + require.NoError(t, runAdd(addOptions{ + apiBase: "https://a.example/v1", + apiKey: "k1", + modelID: "m1", + alias: "shared", + stdout: first, + })) + + second := &bytes.Buffer{} + require.NoError(t, runAdd(addOptions{ + apiBase: "https://b.example/v1", + apiKey: "k2", + modelID: "m2", + alias: "shared", + stdout: second, + })) + + cfg, err := config.LoadConfig(configPath) + require.NoError(t, err) + matches := 0 + for _, m := range cfg.ModelList { + if m != nil && m.ModelName == "shared" { + matches++ + } + } + assert.Equal(t, 1, matches, "alias should be updated, not duplicated") + + updated := findModelByName(cfg, "shared") + require.NotNil(t, updated) + assert.Equal(t, "m2", updated.Model) + assert.Equal(t, "https://b.example/v1", updated.APIBase) + assert.Equal(t, "k2", updated.APIKeys[0].String()) +} + +func TestRunAdd_RejectsUnsupportedType(t *testing.T) { + initTest(t) + + err := runAdd(addOptions{ + apiBase: "https://x/v1", + apiKey: "k", + modelID: "m", + alias: "a", + modelType: "anthropic", + stdout: &bytes.Buffer{}, + }) + require.Error(t, err) + assert.Contains(t, err.Error(), "unsupported --type") +} diff --git a/cmd/picoclaw/internal/model/command.go b/cmd/picoclaw/internal/model/command.go index 330734b82..c412993a0 100644 --- a/cmd/picoclaw/internal/model/command.go +++ b/cmd/picoclaw/internal/model/command.go @@ -21,11 +21,17 @@ func NewModelCommand() *cobra.Command { If no argument is provided, shows the current default model. If a model name is provided, sets it as the default model. +To onboard a model from a custom OpenAI-compatible endpoint (fetch the +available list online and pick one), use the 'add' subcommand: + + picoclaw model add --help + Examples: picoclaw model # Show current default model picoclaw model gpt-5.2 # Set gpt-5.2 as default picoclaw model claude-sonnet-4.6 # Set claude-sonnet-4.6 as default picoclaw model local-model # Set local VLLM server as default + picoclaw model add -b URL -k KEY # Add a model from a custom endpoint Note: 'local-model' is a special value for using a local VLLM server (running at localhost:8000 by default) which does not require an API key.`, @@ -51,6 +57,8 @@ Note: 'local-model' is a special value for using a local VLLM server }, } + cmd.AddCommand(newAddCommand()) + return cmd } @@ -66,6 +74,9 @@ func showCurrentModel(cfg *config.Config) { fmt.Println("\nAvailable models in your config:") listAvailableModels(cfg) } + + fmt.Println("\nTip: 'picoclaw model add -b URL -k KEY' adds a model from a custom") + fmt.Println(" OpenAI-compatible endpoint (see 'picoclaw model add --help').") } func listAvailableModels(cfg *config.Config) { diff --git a/cmd/picoclaw/internal/model/online.go b/cmd/picoclaw/internal/model/online.go new file mode 100644 index 000000000..9b8f7811d --- /dev/null +++ b/cmd/picoclaw/internal/model/online.go @@ -0,0 +1,77 @@ +package model + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + "time" +) + +type modelEntry struct { + ID string `json:"id"` + Name string `json:"name"` + Description string `json:"description"` +} + +type modelsAPIResponse struct { + Data []modelEntry `json:"data"` +} + +// fetchOpenAIModels GETs /models with Bearer auth and accepts both the +// {data:[…]} envelope and a bare array shape used by various OpenAI-compatible servers. +func fetchOpenAIModels(baseURL, apiKey string) ([]modelEntry, error) { + if strings.TrimSpace(baseURL) == "" { + return nil, fmt.Errorf("api base is required") + } + if strings.TrimSpace(apiKey) == "" { + return nil, fmt.Errorf("api key is required") + } + + url := strings.TrimRight(baseURL, "/") + "/models" + + client := &http.Client{Timeout: 15 * time.Second} + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return nil, fmt.Errorf("build request: %w", err) + } + req.Header.Set("Authorization", "Bearer "+apiKey) + + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("request failed: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(io.LimitReader(resp.Body, 512)) + return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, strings.TrimSpace(string(body))) + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("read response: %w", err) + } + + // {"data": [...]} envelope. Distinguish "envelope shape with empty list" + // from "object without a data key" via Data being non-nil after unmarshal: + // json.Unmarshal sets Data to []modelEntry{} for `{"data":[]}` but leaves + // it as nil when "data" is absent or null. + var envelope modelsAPIResponse + if err := json.Unmarshal(body, &envelope); err == nil && envelope.Data != nil { + return envelope.Data, nil + } + + // Bare-array shape, including `[]`. + var arr []modelEntry + if err := json.Unmarshal(body, &arr); err == nil { + return arr, nil + } + + preview := body + if len(preview) > 256 { + preview = preview[:256] + } + return nil, fmt.Errorf("decode response: unrecognized shape: %s", strings.TrimSpace(string(preview))) +} diff --git a/docker/Dockerfile.goreleaser.launcher b/docker/Dockerfile.goreleaser.launcher index 0a20a90b3..97944afc1 100644 --- a/docker/Dockerfile.goreleaser.launcher +++ b/docker/Dockerfile.goreleaser.launcher @@ -6,7 +6,6 @@ RUN apk add --no-cache ca-certificates tzdata COPY $TARGETPLATFORM/picoclaw /usr/local/bin/picoclaw COPY $TARGETPLATFORM/picoclaw-launcher /usr/local/bin/picoclaw-launcher -COPY $TARGETPLATFORM/picoclaw-launcher-tui /usr/local/bin/picoclaw-launcher-tui ENTRYPOINT ["picoclaw-launcher"] CMD ["-console", "-public", "-no-browser"] diff --git a/docs/guides/docker.fr.md b/docs/guides/docker.fr.md index ed0d14cf3..e174298ac 100644 --- a/docs/guides/docker.fr.md +++ b/docs/guides/docker.fr.md @@ -36,7 +36,7 @@ docker compose -f docker/docker-compose.yml --profile gateway down ### Mode Launcher (Console Web) -L'image `launcher` inclut les trois binaires (`picoclaw`, `picoclaw-launcher`, `picoclaw-launcher-tui`) et démarre la console web par défaut, qui fournit une interface navigateur pour la configuration et le chat. +L'image `launcher` inclut les deux binaires (`picoclaw`, `picoclaw-launcher`) et démarre la console web par défaut, qui fournit une interface navigateur pour la configuration et le chat. ```bash docker compose -f docker/docker-compose.yml --profile launcher up -d diff --git a/docs/guides/docker.ja.md b/docs/guides/docker.ja.md index 8fa5ae60c..19199aaac 100644 --- a/docs/guides/docker.ja.md +++ b/docs/guides/docker.ja.md @@ -36,7 +36,7 @@ docker compose -f docker/docker-compose.yml --profile gateway down ### Launcher モード (Web コンソール) -`launcher` イメージには 3 つのバイナリ(`picoclaw`、`picoclaw-launcher`、`picoclaw-launcher-tui`)がすべて含まれており、デフォルトで Web コンソールを起動します。ブラウザベースの設定・チャット画面を提供します。 +`launcher` イメージには 2 つのバイナリ(`picoclaw`、`picoclaw-launcher`)が含まれており、デフォルトで Web コンソールを起動します。ブラウザベースの設定・チャット画面を提供します。 ```bash docker compose -f docker/docker-compose.yml --profile launcher up -d diff --git a/docs/guides/docker.md b/docs/guides/docker.md index e017538f7..e2e472fbf 100644 --- a/docs/guides/docker.md +++ b/docs/guides/docker.md @@ -39,7 +39,7 @@ docker compose -f docker/docker-compose.yml --profile gateway down ### Launcher Mode (Web Console) -The `launcher` image includes all three binaries (`picoclaw`, `picoclaw-launcher`, `picoclaw-launcher-tui`) and starts the web console by default, which provides a browser-based UI for configuration and chat. +The `launcher` image includes both binaries (`picoclaw`, `picoclaw-launcher`) and starts the web console by default, which provides a browser-based UI for configuration and chat. ```bash docker compose -f docker/docker-compose.yml --profile launcher up -d diff --git a/docs/guides/docker.ms.md b/docs/guides/docker.ms.md index 7adab6759..5a426cb99 100644 --- a/docs/guides/docker.ms.md +++ b/docs/guides/docker.ms.md @@ -35,7 +35,7 @@ docker compose -f docker/docker-compose.yml --profile gateway down ### Mod Launcher (Konsol Web) -Imej `launcher` merangkumi ketiga-tiga binari (`picoclaw`, `picoclaw-launcher`, `picoclaw-launcher-tui`) dan memulakan konsol web secara lalai, yang menyediakan UI berasaskan pelayar untuk konfigurasi dan sembang. +Imej `launcher` merangkumi kedua-dua binari (`picoclaw`, `picoclaw-launcher`) dan memulakan konsol web secara lalai, yang menyediakan UI berasaskan pelayar untuk konfigurasi dan sembang. ```bash docker compose -f docker/docker-compose.yml --profile launcher up -d diff --git a/docs/guides/docker.pt-br.md b/docs/guides/docker.pt-br.md index d7d55e753..ab71af8e6 100644 --- a/docs/guides/docker.pt-br.md +++ b/docs/guides/docker.pt-br.md @@ -36,7 +36,7 @@ docker compose -f docker/docker-compose.yml --profile gateway down ### Modo Launcher (Console Web) -A imagem `launcher` inclui os três binários (`picoclaw`, `picoclaw-launcher`, `picoclaw-launcher-tui`) e inicia o console web por padrão, que fornece uma interface baseada em navegador para configuração e chat. +A imagem `launcher` inclui ambos os binários (`picoclaw`, `picoclaw-launcher`) e inicia o console web por padrão, que fornece uma interface baseada em navegador para configuração e chat. ```bash docker compose -f docker/docker-compose.yml --profile launcher up -d diff --git a/docs/guides/docker.vi.md b/docs/guides/docker.vi.md index 05f1b3d68..e91450bb0 100644 --- a/docs/guides/docker.vi.md +++ b/docs/guides/docker.vi.md @@ -36,7 +36,7 @@ docker compose -f docker/docker-compose.yml --profile gateway down ### Chế Độ Launcher (Web Console) -Image `launcher` bao gồm cả ba binary (`picoclaw`, `picoclaw-launcher`, `picoclaw-launcher-tui`) và khởi động web console mặc định, cung cấp giao diện trình duyệt để cấu hình và chat. +Image `launcher` bao gồm cả hai binary (`picoclaw`, `picoclaw-launcher`) và khởi động web console mặc định, cung cấp giao diện trình duyệt để cấu hình và chat. ```bash docker compose -f docker/docker-compose.yml --profile launcher up -d diff --git a/docs/guides/docker.zh.md b/docs/guides/docker.zh.md index bed445751..855375d9c 100644 --- a/docs/guides/docker.zh.md +++ b/docs/guides/docker.zh.md @@ -36,7 +36,7 @@ docker compose -f docker/docker-compose.yml --profile gateway down ### Launcher 模式 (Web 控制台) -`launcher` 镜像包含所有三个二进制文件(`picoclaw`、`picoclaw-launcher`、`picoclaw-launcher-tui`),默认启动 Web 控制台,提供基于浏览器的配置和聊天界面。 +`launcher` 镜像包含两个二进制文件(`picoclaw`、`picoclaw-launcher`),默认启动 Web 控制台,提供基于浏览器的配置和聊天界面。 ```bash docker compose -f docker/docker-compose.yml --profile launcher up -d diff --git a/docs/project/README.fr.md b/docs/project/README.fr.md index 1e2f59bee..b02067d2a 100644 --- a/docs/project/README.fr.md +++ b/docs/project/README.fr.md @@ -292,24 +292,6 @@ Après cette étape unique, `picoclaw-launcher` s'ouvrira normalement lors des l -### 💻 TUI Launcher (Recommandé pour les environnements sans interface / SSH) - -Le TUI (Terminal UI) Launcher fournit une interface terminal complète pour la configuration et la gestion. Idéal pour les serveurs, Raspberry Pi et autres environnements sans interface graphique. - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**Pour commencer :** - -Utilisez les menus TUI pour : **1)** Configurer un Provider -> **2)** Configurer un Channel -> **3)** Démarrer le Gateway -> **4)** Chattez ! - -Pour la documentation détaillée du TUI, voir [docs.picoclaw.io](https://docs.picoclaw.io). - ### 📱 Android diff --git a/docs/project/README.id.md b/docs/project/README.id.md index 244e6e49a..49c64e74c 100644 --- a/docs/project/README.id.md +++ b/docs/project/README.id.md @@ -289,24 +289,6 @@ Setelah langkah satu kali ini, `picoclaw-launcher` akan terbuka secara normal pa -### 💻 TUI Launcher (Direkomendasikan untuk Headless / SSH) - -TUI (Terminal UI) Launcher menyediakan antarmuka terminal lengkap untuk konfigurasi dan manajemen. Ideal untuk server, Raspberry Pi, dan lingkungan headless lainnya. - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**Memulai:** - -Gunakan menu TUI untuk: **1)** Konfigurasi Provider -> **2)** Konfigurasi Channel -> **3)** Mulai Gateway -> **4)** Chat! - -Untuk dokumentasi TUI lengkap, lihat [docs.picoclaw.io](https://docs.picoclaw.io). - ### 📱 Android Berikan kehidupan kedua untuk ponsel lama Anda! Ubah menjadi Asisten AI pintar dengan PicoClaw. diff --git a/docs/project/README.it.md b/docs/project/README.it.md index b3db6fece..0cf6cf8db 100644 --- a/docs/project/README.it.md +++ b/docs/project/README.it.md @@ -289,24 +289,6 @@ Dopo questo passaggio una tantum, `picoclaw-launcher` si aprirà normalmente ai -### 💻 TUI Launcher (Consigliato per Headless / SSH) - -Il TUI (Terminal UI) Launcher fornisce un'interfaccia terminale completa per la configurazione e la gestione. Ideale per server, Raspberry Pi e altri ambienti headless. - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**Per iniziare:** - -Usa i menu TUI per: **1)** Configurare un Provider -> **2)** Configurare un Channel -> **3)** Avviare il Gateway -> **4)** Chattare! - -Per la documentazione dettagliata del TUI, vedi [docs.picoclaw.io](https://docs.picoclaw.io). - ### 📱 Android Dai una seconda vita al tuo telefono di dieci anni fa! Trasformalo in un assistente IA intelligente con PicoClaw. diff --git a/docs/project/README.ja.md b/docs/project/README.ja.md index 66d06ba5e..6e3060688 100644 --- a/docs/project/README.ja.md +++ b/docs/project/README.ja.md @@ -289,24 +289,6 @@ docker compose -f docker/docker-compose.yml --profile launcher up -d -### 💻 TUI Launcher(ヘッドレス / SSH 向け推奨) - -TUI(Terminal UI)Launcher は設定と管理のためのフル機能ターミナルインターフェースを提供します。サーバー、Raspberry Pi、その他のヘッドレス環境に最適です。 - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**始め方:** - -TUI メニューを使って:**1)** Provider を設定 → **2)** Channel を設定 → **3)** Gateway を起動 → **4)** チャット! - -TUI の詳細なドキュメントは [docs.picoclaw.io](https://docs.picoclaw.io) を参照してください。 - ### 📱 Android diff --git a/docs/project/README.ko.md b/docs/project/README.ko.md index cfc985688..dfefa67fe 100644 --- a/docs/project/README.ko.md +++ b/docs/project/README.ko.md @@ -289,24 +289,6 @@ macOS에서는 인터넷에서 다운로드한 앱이고 Mac App Store 공증을 -### 💻 TUI Launcher (헤드리스 / SSH 권장) - -TUI(Terminal UI) Launcher는 설정과 관리를 위한 모든 기능을 갖춘 터미널 인터페이스를 제공합니다. 서버, Raspberry Pi, 기타 헤드리스 환경에 적합합니다. - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**시작 방법:** - -TUI 메뉴를 사용해 다음 순서로 진행하세요. **1)** 프로바이더 설정 -> **2)** 채널 설정 -> **3)** 게이트웨이 시작 -> **4)** 채팅! - -자세한 TUI 문서는 [docs.picoclaw.io](https://docs.picoclaw.io)를 참고하세요. - ### 📱 Android 오래된 스마트폰에 새 생명을 불어넣어 보세요! PicoClaw를 설치하면 스마트 AI 어시스턴트로 바꿀 수 있습니다. diff --git a/docs/project/README.ms.md b/docs/project/README.ms.md index f8c9e95e7..73c428f11 100644 --- a/docs/project/README.ms.md +++ b/docs/project/README.ms.md @@ -286,24 +286,6 @@ Selepas langkah sekali ini, `picoclaw-launcher` akan dibuka secara normal pada p -### 💻 Pelancar TUI (Disyorkan untuk Headless / SSH) - -Pelancar TUI menyediakan antara muka terminal lengkap untuk konfigurasi dan pengurusan. Sesuai untuk pelayan, Raspberry Pi, dan persekitaran tanpa kepala lain. - -```bash -picoclaw-launcher-tui -``` - -

-Pelancar TUI -

- -**Memulakan:** - -Gunakan menu TUI untuk: **1)** Konfigurasikan Penyedia -> **2)** Konfigurasikan Saluran -> **3)** Mulakan Gateway -> **4)** Sembang! - -Untuk dokumentasi TUI terperinci, lihat [docs.picoclaw.io](https://docs.picoclaw.io). - ### 📱 Android Berikan telefon lama anda kehidupan baru! Jadikannya Pembantu AI pintar dengan PicoClaw. diff --git a/docs/project/README.pt-br.md b/docs/project/README.pt-br.md index 56d4ddd63..74cb967de 100644 --- a/docs/project/README.pt-br.md +++ b/docs/project/README.pt-br.md @@ -289,24 +289,6 @@ Após esta etapa única, o `picoclaw-launcher` abrirá normalmente nos lançamen -### 💻 TUI Launcher (Recomendado para Headless / SSH) - -O TUI (Terminal UI) Launcher fornece uma interface de terminal completa para configuração e gerenciamento. Ideal para servidores, Raspberry Pi e outros ambientes headless. - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**Primeiros passos:** - -Use os menus do TUI para: **1)** Configurar um Provider -> **2)** Configurar um Channel -> **3)** Iniciar o Gateway -> **4)** Conversar! - -Para documentação detalhada do TUI, veja [docs.picoclaw.io](https://docs.picoclaw.io). - ### 📱 Android diff --git a/docs/project/README.vi.md b/docs/project/README.vi.md index 52a56796b..743069021 100644 --- a/docs/project/README.vi.md +++ b/docs/project/README.vi.md @@ -289,24 +289,6 @@ Sau bước này, `picoclaw-launcher` sẽ mở bình thường trong các lần -### 💻 TUI Launcher (Khuyến nghị cho Headless / SSH) - -TUI (Terminal UI) Launcher cung cấp giao diện terminal đầy đủ tính năng để cấu hình và quản lý. Lý tưởng cho máy chủ, Raspberry Pi và các môi trường headless khác. - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**Bắt đầu:** - -Sử dụng menu TUI để: **1)** Cấu hình Provider -> **2)** Cấu hình Channel -> **3)** Khởi động Gateway -> **4)** Trò chuyện! - -Để biết tài liệu TUI chi tiết, xem [docs.picoclaw.io](https://docs.picoclaw.io). - ### 📱 Android diff --git a/docs/project/README.zh.md b/docs/project/README.zh.md index a4fc892bd..253bb84ed 100644 --- a/docs/project/README.zh.md +++ b/docs/project/README.zh.md @@ -289,24 +289,6 @@ macOS 可能会在首次启动时拦截 `picoclaw-launcher`,因为它从互联 -### 💻 TUI Launcher(推荐无头环境 / SSH) - -TUI(终端 UI)Launcher 提供功能完整的终端配置与管理界面,适合服务器、树莓派等无显示器环境。 - -```bash -picoclaw-launcher-tui -``` - -

-TUI Launcher -

- -**开始使用:** - -通过 TUI 菜单:**1)** 配置 Provider -> **2)** 配置 Channel -> **3)** 启动 Gateway -> **4)** 开始聊天! - -详细 TUI 文档请参阅 [docs.picoclaw.io](https://docs.picoclaw.io)。 - ### 📱 Android diff --git a/go.mod b/go.mod index 4afbe9d85..c7e77c0f9 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.25.9 require ( fyne.io/systray v1.12.0 - github.com/BurntSushi/toml v1.6.0 github.com/SevereCloud/vksdk/v3 v3.3.1 github.com/adhocore/gronx v1.19.6 github.com/anthropics/anthropic-sdk-go v1.26.0 @@ -18,7 +17,6 @@ require ( github.com/creack/pty v1.1.24 github.com/ergochat/irc-go v0.6.0 github.com/ergochat/readline v0.1.3 - github.com/gdamore/tcell/v2 v2.13.8 github.com/gomarkdown/markdown v0.0.0-20260411013819-759bbc3e3207 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.3 @@ -33,7 +31,6 @@ require ( github.com/openai/openai-go/v3 v3.22.0 github.com/pion/rtp v1.10.1 github.com/pion/webrtc/v3 v3.3.6 - github.com/rivo/tview v0.42.0 github.com/rs/zerolog v1.35.1 github.com/slack-go/slack v0.17.3 github.com/spf13/cobra v1.10.2 @@ -79,7 +76,6 @@ require ( 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/gdamore/encoding v1.0.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect @@ -122,7 +118,7 @@ require ( github.com/github/copilot-sdk/go v0.2.0 github.com/go-resty/resty/v2 v2.17.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/jsonschema-go v0.4.2 // indirect + github.com/google/jsonschema-go v0.4.2 github.com/grbit/go-json v0.11.0 // indirect github.com/klauspost/compress v1.18.4 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect diff --git a/go.sum b/go.sum index 19547816d..5cd39ec8d 100644 --- a/go.sum +++ b/go.sum @@ -5,8 +5,6 @@ filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= fyne.io/systray v1.12.0 h1:CA1Kk0e2zwFlxtc02L3QFSiIbxJ/P0n582YrZHT7aTM= fyne.io/systray v1.12.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= -github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= -github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/SevereCloud/vksdk/v3 v3.3.1 h1:O86zsp5LQnHE+O5acvuXM/s6S1LyxzVTkF6+Lup0Jyg= @@ -105,10 +103,6 @@ github.com/ergochat/readline v0.1.3 h1:/DytGTmwdUJcLAe3k3VJgowh5vNnsdifYT6uVaf4p github.com/ergochat/readline v0.1.3/go.mod h1:o3ux9QLHLm77bq7hDB21UTm6HlV2++IPDMfIfKDuOgY= 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/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.2.0 h1:RnrIIirmtp4wGgqSQFJ2k9phbeveIxOtYZqDogoNEa0= github.com/github/copilot-sdk/go v0.2.0/go.mod h1:uGWkjVYcp2DV9DgtqYihh5tEoJjNqxIFaUNnrwY4FxM= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -232,8 +226,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/tview v0.42.0 h1:b/ftp+RxtDsHSaynXTbJb+/n/BxDEi+W3UfF5jILK6c= -github.com/rivo/tview v0.42.0/go.mod h1:cSfIYfhpSGCjp3r/ECJb+GKS7cGJnqV8vfjQPwoXyfY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=