cloudaxe-opencode/packages/tui/cmd/opencode/main.go

96 lines
2 KiB
Go
Raw Normal View History

2025-06-03 17:44:46 +00:00
package main
import (
"context"
2025-06-16 16:53:06 +00:00
"encoding/json"
2025-06-03 17:44:46 +00:00
"log/slog"
"os"
"path/filepath"
2025-06-05 20:44:20 +00:00
"strings"
2025-06-03 17:44:46 +00:00
2025-06-12 10:35:40 +00:00
tea "github.com/charmbracelet/bubbletea/v2"
2025-06-04 14:20:42 +00:00
"github.com/sst/opencode/internal/app"
2025-06-03 17:44:46 +00:00
"github.com/sst/opencode/internal/tui"
"github.com/sst/opencode/pkg/client"
)
2025-06-07 03:26:11 +00:00
var Version = "dev"
2025-06-03 17:44:46 +00:00
func main() {
2025-06-16 16:53:06 +00:00
version := Version
if version != "dev" && !strings.HasPrefix(Version, "v") {
version = "v" + Version
}
2025-06-03 20:35:37 +00:00
url := os.Getenv("OPENCODE_SERVER")
2025-06-16 16:53:06 +00:00
appInfoStr := os.Getenv("OPENCODE_APP_INFO")
var appInfo client.AppInfo
json.Unmarshal([]byte(appInfoStr), &appInfo)
logfile := filepath.Join(appInfo.Path.Data, "log", "tui.log")
if _, err := os.Stat(filepath.Dir(logfile)); os.IsNotExist(err) {
err := os.MkdirAll(filepath.Dir(logfile), 0755)
if err != nil {
slog.Error("Failed to create log directory", "error", err)
os.Exit(1)
}
}
file, err := os.Create(logfile)
if err != nil {
slog.Error("Failed to create log file", "error", err)
os.Exit(1)
}
defer file.Close()
logger := slog.New(slog.NewTextHandler(file, &slog.HandlerOptions{Level: slog.LevelDebug}))
slog.SetDefault(logger)
2025-06-03 17:44:46 +00:00
httpClient, err := client.NewClientWithResponses(url)
if err != nil {
slog.Error("Failed to create client", "error", err)
os.Exit(1)
}
// Create main context for the application
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
2025-06-16 16:53:06 +00:00
app_, err := app.New(ctx, version, appInfo, httpClient)
2025-06-03 17:44:46 +00:00
if err != nil {
2025-06-05 18:59:07 +00:00
panic(err)
2025-06-03 17:44:46 +00:00
}
program := tea.NewProgram(
2025-06-04 14:20:42 +00:00
tui.NewModel(app_),
2025-06-03 17:44:46 +00:00
tea.WithAltScreen(),
2025-06-16 15:45:13 +00:00
tea.WithKeyboardEnhancements(),
tea.WithMouseCellMotion(),
2025-06-03 17:44:46 +00:00
)
eventClient, err := client.NewClient(url)
if err != nil {
slog.Error("Failed to create event client", "error", err)
os.Exit(1)
}
evts, err := eventClient.Event(ctx)
if err != nil {
slog.Error("Failed to subscribe to events", "error", err)
os.Exit(1)
}
go func() {
for item := range evts {
program.Send(item)
}
}()
// Run the TUI
result, err := program.Run()
if err != nil {
slog.Error("TUI error", "error", err)
}
slog.Info("TUI exited", "result", result)
}