| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- // Package workspace defines the Workspace interface used by all
- // frontends (TUI, CLI) to interact with a running workspace. Two
- // implementations exist: one wrapping a local app.App instance and one
- // wrapping the HTTP client SDK.
- package workspace
- import (
- "context"
- "time"
- tea "charm.land/bubbletea/v2"
- "charm.land/catwalk/pkg/catwalk"
- mcptools "github.com/charmbracelet/crush/internal/agent/tools/mcp"
- "github.com/charmbracelet/crush/internal/config"
- "github.com/charmbracelet/crush/internal/history"
- "github.com/charmbracelet/crush/internal/lsp"
- "github.com/charmbracelet/crush/internal/message"
- "github.com/charmbracelet/crush/internal/oauth"
- "github.com/charmbracelet/crush/internal/permission"
- "github.com/charmbracelet/crush/internal/session"
- )
- // LSPClientInfo holds information about an LSP client's state. This is
- // the frontend-facing type; implementations translate from the
- // underlying app or proto representation.
- type LSPClientInfo struct {
- Name string
- State lsp.ServerState
- Error error
- DiagnosticCount int
- ConnectedAt time.Time
- }
- // LSPEventType represents the type of LSP event.
- type LSPEventType string
- const (
- LSPEventStateChanged LSPEventType = "state_changed"
- LSPEventDiagnosticsChanged LSPEventType = "diagnostics_changed"
- )
- // LSPEvent represents an LSP event forwarded to the TUI.
- type LSPEvent struct {
- Type LSPEventType
- Name string
- State lsp.ServerState
- Error error
- DiagnosticCount int
- }
- // AgentModel holds the model information exposed to the UI.
- type AgentModel struct {
- CatwalkCfg catwalk.Model
- ModelCfg config.SelectedModel
- }
- // Workspace is the main abstraction consumed by the TUI and CLI. It
- // groups every operation a frontend needs to perform against a running
- // workspace, regardless of whether the workspace is in-process or
- // remote.
- type Workspace interface {
- // Sessions
- CreateSession(ctx context.Context, title string) (session.Session, error)
- GetSession(ctx context.Context, sessionID string) (session.Session, error)
- ListSessions(ctx context.Context) ([]session.Session, error)
- SaveSession(ctx context.Context, sess session.Session) (session.Session, error)
- DeleteSession(ctx context.Context, sessionID string) error
- CreateAgentToolSessionID(messageID, toolCallID string) string
- ParseAgentToolSessionID(sessionID string) (messageID string, toolCallID string, ok bool)
- // Messages
- ListMessages(ctx context.Context, sessionID string) ([]message.Message, error)
- ListUserMessages(ctx context.Context, sessionID string) ([]message.Message, error)
- ListAllUserMessages(ctx context.Context) ([]message.Message, error)
- // Agent
- AgentRun(ctx context.Context, sessionID, prompt string, attachments ...message.Attachment) error
- AgentCancel(sessionID string)
- AgentIsBusy() bool
- AgentIsSessionBusy(sessionID string) bool
- AgentModel() AgentModel
- AgentIsReady() bool
- AgentQueuedPrompts(sessionID string) int
- AgentQueuedPromptsList(sessionID string) []string
- AgentClearQueue(sessionID string)
- AgentSummarize(ctx context.Context, sessionID string) error
- UpdateAgentModel(ctx context.Context) error
- InitCoderAgent(ctx context.Context) error
- GetDefaultSmallModel(providerID string) config.SelectedModel
- // Permissions
- PermissionGrant(perm permission.PermissionRequest)
- PermissionGrantPersistent(perm permission.PermissionRequest)
- PermissionDeny(perm permission.PermissionRequest)
- PermissionSkipRequests() bool
- PermissionSetSkipRequests(skip bool)
- // FileTracker
- FileTrackerRecordRead(ctx context.Context, sessionID, path string)
- FileTrackerLastReadTime(ctx context.Context, sessionID, path string) time.Time
- FileTrackerListReadFiles(ctx context.Context, sessionID string) ([]string, error)
- // History
- ListSessionHistory(ctx context.Context, sessionID string) ([]history.File, error)
- // LSP
- LSPStart(ctx context.Context, path string)
- LSPStopAll(ctx context.Context)
- LSPGetStates() map[string]LSPClientInfo
- LSPGetDiagnosticCounts(name string) lsp.DiagnosticCounts
- // Config (read-only data)
- Config() *config.Config
- WorkingDir() string
- Resolver() config.VariableResolver
- // Config mutations (proxied to server in client mode)
- UpdatePreferredModel(scope config.Scope, modelType config.SelectedModelType, model config.SelectedModel) error
- SetCompactMode(scope config.Scope, enabled bool) error
- SetProviderAPIKey(scope config.Scope, providerID string, apiKey any) error
- SetConfigField(scope config.Scope, key string, value any) error
- RemoveConfigField(scope config.Scope, key string) error
- ImportCopilot() (*oauth.Token, bool)
- RefreshOAuthToken(ctx context.Context, scope config.Scope, providerID string) error
- // Project lifecycle
- ProjectNeedsInitialization() (bool, error)
- MarkProjectInitialized() error
- InitializePrompt() (string, error)
- // MCP operations (server-side in client mode)
- MCPGetStates() map[string]mcptools.ClientInfo
- MCPRefreshPrompts(ctx context.Context, name string)
- MCPRefreshResources(ctx context.Context, name string)
- RefreshMCPTools(ctx context.Context, name string)
- ReadMCPResource(ctx context.Context, name, uri string) ([]MCPResourceContents, error)
- GetMCPPrompt(clientID, promptID string, args map[string]string) (string, error)
- EnableDockerMCP(ctx context.Context) error
- DisableDockerMCP() error
- // Events
- Subscribe(program *tea.Program)
- Shutdown()
- }
- // MCPResourceContents holds the contents of an MCP resource.
- type MCPResourceContents struct {
- URI string `json:"uri"`
- MIMEType string `json:"mime_type,omitempty"`
- Text string `json:"text,omitempty"`
- Blob []byte `json:"blob,omitempty"`
- }
|