summaryrefslogtreecommitdiffhomepage
path: root/internal/app/app_new.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/app_new.go')
-rw-r--r--internal/app/app_new.go203
1 files changed, 0 insertions, 203 deletions
diff --git a/internal/app/app_new.go b/internal/app/app_new.go
deleted file mode 100644
index 1568b4d57..000000000
--- a/internal/app/app_new.go
+++ /dev/null
@@ -1,203 +0,0 @@
-package app
-
-import (
- "context"
- "encoding/json"
- "fmt"
- "sync"
-
- "log/slog"
-
- "github.com/sst/opencode/pkg/client"
-)
-
-// AppNew is the new app structure that uses the TypeScript backend
-type AppNew struct {
- Client *client.Client
- CurrentSession *client.SessionInfo
-
- // Event handling
- eventCtx context.Context
- eventCancel context.CancelFunc
- eventChan <-chan any
-
- // UI state
- filepickerOpen bool
- completionDialogOpen bool
-
- // Mutex for thread-safe operations
- mu sync.RWMutex
-}
-
-// NewApp creates a new app instance connected to the TypeScript backend
-func NewApp(ctx context.Context) (*AppNew, error) {
- httpClient, err := client.NewClient("http://localhost:16713")
- if err != nil {
- slog.Error("Failed to create client", "error", err)
- return nil, err
- }
-
- app := &AppNew{
- Client: httpClient,
- }
-
- // Start event listener
- if err := app.startEventListener(ctx); err != nil {
- return nil, err
- }
-
- return app, nil
-}
-
-// startEventListener connects to the SSE endpoint and processes events
-func (a *AppNew) startEventListener(ctx context.Context) error {
- a.eventCtx, a.eventCancel = context.WithCancel(ctx)
-
- eventChan, err := a.Client.Event(a.eventCtx)
- if err != nil {
- return err
- }
-
- a.eventChan = eventChan
-
- // Start processing events in background
- go a.processEvents()
-
- return nil
-}
-
-// processEvents handles incoming SSE events
-func (a *AppNew) processEvents() {
- for event := range a.eventChan {
- switch e := event.(type) {
- case *client.EventStorageWrite:
- // Handle storage write events
- slog.Debug("Storage write event", "key", e.Key)
- // TODO: Update local state based on storage events
- default:
- slog.Debug("Unknown event type", "event", e)
- }
- }
-}
-
-// CreateSession creates a new session via the API
-func (a *AppNew) CreateSession(ctx context.Context) error {
- resp, err := a.Client.PostSessionCreate(ctx)
- if err != nil {
- return err
- }
- defer resp.Body.Close()
-
- if resp.StatusCode != 200 {
- return fmt.Errorf("failed to create session: %d", resp.StatusCode)
- }
-
- var session client.SessionInfo
- if err := json.NewDecoder(resp.Body).Decode(&session); err != nil {
- return err
- }
-
- a.mu.Lock()
- a.CurrentSession = &session
- a.mu.Unlock()
-
- return nil
-}
-
-// SendMessage sends a message to the current session
-func (a *AppNew) SendMessage(ctx context.Context, text string) error {
- if a.CurrentSession == nil {
- if err := a.CreateSession(ctx); err != nil {
- return err
- }
- }
-
- a.mu.RLock()
- sessionID := a.CurrentSession.Id
- a.mu.RUnlock()
-
- parts := interface{}([]map[string]interface{}{
- {
- "type": "text",
- "text": text,
- },
- })
-
- resp, err := a.Client.PostSessionChat(ctx, client.PostSessionChatJSONRequestBody{
- SessionID: sessionID,
- Parts: &parts,
- })
- if err != nil {
- return err
- }
- defer resp.Body.Close()
-
- // The response will be streamed via SSE
- return nil
-}
-
-// GetSessions retrieves all sessions
-func (a *AppNew) GetSessions(ctx context.Context) ([]client.SessionInfo, error) {
- resp, err := a.Client.PostSessionList(ctx)
- if err != nil {
- return nil, err
- }
- defer resp.Body.Close()
-
- var sessions []client.SessionInfo
- if err := json.NewDecoder(resp.Body).Decode(&sessions); err != nil {
- return nil, err
- }
-
- return sessions, nil
-}
-
-// GetMessages retrieves messages for a session
-func (a *AppNew) GetMessages(ctx context.Context, sessionID string) (interface{}, error) {
- resp, err := a.Client.PostSessionMessages(ctx, client.PostSessionMessagesJSONRequestBody{
- SessionID: sessionID,
- })
- if err != nil {
- return nil, err
- }
- defer resp.Body.Close()
-
- var messages interface{}
- if err := json.NewDecoder(resp.Body).Decode(&messages); err != nil {
- return nil, err
- }
-
- return messages, nil
-}
-
-// Close shuts down the app and its connections
-func (a *AppNew) Close() {
- if a.eventCancel != nil {
- a.eventCancel()
- }
-}
-
-// UI state methods
-func (a *AppNew) SetFilepickerOpen(open bool) {
- a.mu.Lock()
- defer a.mu.Unlock()
- a.filepickerOpen = open
-}
-
-func (a *AppNew) IsFilepickerOpen() bool {
- a.mu.RLock()
- defer a.mu.RUnlock()
- return a.filepickerOpen
-}
-
-func (a *AppNew) SetCompletionDialogOpen(open bool) {
- a.mu.Lock()
- defer a.mu.Unlock()
- a.completionDialogOpen = open
-}
-
-func (a *AppNew) IsCompletionDialogOpen() bool {
- a.mu.RLock()
- defer a.mu.RUnlock()
- return a.completionDialogOpen
-} \ No newline at end of file