mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-21 17:54:23 +01:00
wip: refactoring tui
This commit is contained in:
65
cmd/root.go
65
cmd/root.go
@@ -15,9 +15,6 @@ import (
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/sst/opencode/internal/app"
|
||||
"github.com/sst/opencode/internal/config"
|
||||
"github.com/sst/opencode/internal/db"
|
||||
"github.com/sst/opencode/internal/format"
|
||||
"github.com/sst/opencode/internal/llm/agent"
|
||||
"github.com/sst/opencode/internal/logging"
|
||||
"github.com/sst/opencode/internal/lsp/discovery"
|
||||
"github.com/sst/opencode/internal/pubsub"
|
||||
@@ -90,52 +87,17 @@ to assist developers in writing, debugging, and understanding code directly from
|
||||
return err
|
||||
}
|
||||
|
||||
// Check if we're in non-interactive mode
|
||||
prompt, _ := cmd.Flags().GetString("prompt")
|
||||
|
||||
// Check for piped input if no prompt was provided via flag
|
||||
if prompt == "" {
|
||||
pipedInput, hasPipedInput := checkStdinPipe()
|
||||
if hasPipedInput {
|
||||
prompt = pipedInput
|
||||
}
|
||||
}
|
||||
|
||||
// If we have a prompt (either from flag or piped input), run in non-interactive mode
|
||||
if prompt != "" {
|
||||
outputFormatStr, _ := cmd.Flags().GetString("output-format")
|
||||
outputFormat := format.OutputFormat(outputFormatStr)
|
||||
if !outputFormat.IsValid() {
|
||||
return fmt.Errorf("invalid output format: %s", outputFormatStr)
|
||||
}
|
||||
|
||||
quiet, _ := cmd.Flags().GetBool("quiet")
|
||||
verbose, _ := cmd.Flags().GetBool("verbose")
|
||||
|
||||
// Get tool restriction flags
|
||||
allowedTools, _ := cmd.Flags().GetStringSlice("allowedTools")
|
||||
excludedTools, _ := cmd.Flags().GetStringSlice("excludedTools")
|
||||
|
||||
return handleNonInteractiveMode(cmd.Context(), prompt, outputFormat, quiet, verbose, allowedTools, excludedTools)
|
||||
}
|
||||
|
||||
// Run LSP auto-discovery
|
||||
if err := discovery.IntegrateLSPServers(cwd); err != nil {
|
||||
slog.Warn("Failed to auto-discover LSP servers", "error", err)
|
||||
// Continue anyway, this is not a fatal error
|
||||
}
|
||||
|
||||
// Connect DB, this will also run migrations
|
||||
conn, err := db.Connect()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Create main context for the application
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
app, err := app.New(ctx, conn)
|
||||
app, err := app.New(ctx)
|
||||
if err != nil {
|
||||
slog.Error("Failed to create app", "error", err)
|
||||
return err
|
||||
@@ -149,9 +111,6 @@ to assist developers in writing, debugging, and understanding code directly from
|
||||
tea.WithAltScreen(),
|
||||
)
|
||||
|
||||
// Initialize MCP tools in the background
|
||||
initMCPTools(ctx, app)
|
||||
|
||||
// Setup the subscriptions, this will send services events to the TUI
|
||||
ch, cancelSubs := setupSubscriptions(app, ctx)
|
||||
|
||||
@@ -234,20 +193,6 @@ func attemptTUIRecovery(program *tea.Program) {
|
||||
program.Quit()
|
||||
}
|
||||
|
||||
func initMCPTools(ctx context.Context, app *app.App) {
|
||||
go func() {
|
||||
defer logging.RecoverPanic("MCP-goroutine", nil)
|
||||
|
||||
// Create a context with timeout for the initial MCP tools fetch
|
||||
ctxWithTimeout, cancel := context.WithTimeout(ctx, 30*time.Second)
|
||||
defer cancel()
|
||||
|
||||
// Set this up once with proper error handling
|
||||
agent.GetMcpTools(ctxWithTimeout, app.Permissions)
|
||||
slog.Info("MCP message handling goroutine exiting")
|
||||
}()
|
||||
}
|
||||
|
||||
func setupSubscriber[T any](
|
||||
ctx context.Context,
|
||||
wg *sync.WaitGroup,
|
||||
@@ -298,10 +243,10 @@ func setupSubscriptions(app *app.App, parentCtx context.Context) (chan tea.Msg,
|
||||
wg := sync.WaitGroup{}
|
||||
ctx, cancel := context.WithCancel(parentCtx) // Inherit from parent context
|
||||
|
||||
setupSubscriber(ctx, &wg, "logging", app.Logs.Subscribe, ch)
|
||||
setupSubscriber(ctx, &wg, "sessions", app.Sessions.Subscribe, ch)
|
||||
setupSubscriber(ctx, &wg, "messages", app.Messages.Subscribe, ch)
|
||||
setupSubscriber(ctx, &wg, "permissions", app.Permissions.Subscribe, ch)
|
||||
// setupSubscriber(ctx, &wg, "logging", app.Logs.Subscribe, ch)
|
||||
// setupSubscriber(ctx, &wg, "sessions", app.Sessions.Subscribe, ch)
|
||||
// setupSubscriber(ctx, &wg, "messages", app.Messages.Subscribe, ch)
|
||||
// setupSubscriber(ctx, &wg, "permissions", app.Permissions.Subscribe, ch)
|
||||
setupSubscriber(ctx, &wg, "status", app.Status.Subscribe, ch)
|
||||
|
||||
cleanupFunc := func() {
|
||||
|
||||
Reference in New Issue
Block a user