workspace.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // Package workspace defines the Workspace interface used by all
  2. // frontends (TUI, CLI) to interact with a running workspace. Two
  3. // implementations exist: one wrapping a local app.App instance and one
  4. // wrapping the HTTP client SDK.
  5. package workspace
  6. import (
  7. "context"
  8. "time"
  9. tea "charm.land/bubbletea/v2"
  10. "charm.land/catwalk/pkg/catwalk"
  11. mcptools "github.com/charmbracelet/crush/internal/agent/tools/mcp"
  12. "github.com/charmbracelet/crush/internal/config"
  13. "github.com/charmbracelet/crush/internal/history"
  14. "github.com/charmbracelet/crush/internal/lsp"
  15. "github.com/charmbracelet/crush/internal/message"
  16. "github.com/charmbracelet/crush/internal/oauth"
  17. "github.com/charmbracelet/crush/internal/permission"
  18. "github.com/charmbracelet/crush/internal/session"
  19. )
  20. // LSPClientInfo holds information about an LSP client's state. This is
  21. // the frontend-facing type; implementations translate from the
  22. // underlying app or proto representation.
  23. type LSPClientInfo struct {
  24. Name string
  25. State lsp.ServerState
  26. Error error
  27. DiagnosticCount int
  28. ConnectedAt time.Time
  29. }
  30. // LSPEventType represents the type of LSP event.
  31. type LSPEventType string
  32. const (
  33. LSPEventStateChanged LSPEventType = "state_changed"
  34. LSPEventDiagnosticsChanged LSPEventType = "diagnostics_changed"
  35. )
  36. // LSPEvent represents an LSP event forwarded to the TUI.
  37. type LSPEvent struct {
  38. Type LSPEventType
  39. Name string
  40. State lsp.ServerState
  41. Error error
  42. DiagnosticCount int
  43. }
  44. // AgentModel holds the model information exposed to the UI.
  45. type AgentModel struct {
  46. CatwalkCfg catwalk.Model
  47. ModelCfg config.SelectedModel
  48. }
  49. // Workspace is the main abstraction consumed by the TUI and CLI. It
  50. // groups every operation a frontend needs to perform against a running
  51. // workspace, regardless of whether the workspace is in-process or
  52. // remote.
  53. type Workspace interface {
  54. // Sessions
  55. CreateSession(ctx context.Context, title string) (session.Session, error)
  56. GetSession(ctx context.Context, sessionID string) (session.Session, error)
  57. ListSessions(ctx context.Context) ([]session.Session, error)
  58. SaveSession(ctx context.Context, sess session.Session) (session.Session, error)
  59. DeleteSession(ctx context.Context, sessionID string) error
  60. CreateAgentToolSessionID(messageID, toolCallID string) string
  61. ParseAgentToolSessionID(sessionID string) (messageID string, toolCallID string, ok bool)
  62. // Messages
  63. ListMessages(ctx context.Context, sessionID string) ([]message.Message, error)
  64. ListUserMessages(ctx context.Context, sessionID string) ([]message.Message, error)
  65. ListAllUserMessages(ctx context.Context) ([]message.Message, error)
  66. // Agent
  67. AgentRun(ctx context.Context, sessionID, prompt string, attachments ...message.Attachment) error
  68. AgentCancel(sessionID string)
  69. AgentIsBusy() bool
  70. AgentIsSessionBusy(sessionID string) bool
  71. AgentModel() AgentModel
  72. AgentIsReady() bool
  73. AgentQueuedPrompts(sessionID string) int
  74. AgentQueuedPromptsList(sessionID string) []string
  75. AgentClearQueue(sessionID string)
  76. AgentSummarize(ctx context.Context, sessionID string) error
  77. UpdateAgentModel(ctx context.Context) error
  78. InitCoderAgent(ctx context.Context) error
  79. GetDefaultSmallModel(providerID string) config.SelectedModel
  80. // Permissions
  81. PermissionGrant(perm permission.PermissionRequest)
  82. PermissionGrantPersistent(perm permission.PermissionRequest)
  83. PermissionDeny(perm permission.PermissionRequest)
  84. PermissionSkipRequests() bool
  85. PermissionSetSkipRequests(skip bool)
  86. // FileTracker
  87. FileTrackerRecordRead(ctx context.Context, sessionID, path string)
  88. FileTrackerLastReadTime(ctx context.Context, sessionID, path string) time.Time
  89. FileTrackerListReadFiles(ctx context.Context, sessionID string) ([]string, error)
  90. // History
  91. ListSessionHistory(ctx context.Context, sessionID string) ([]history.File, error)
  92. // LSP
  93. LSPStart(ctx context.Context, path string)
  94. LSPStopAll(ctx context.Context)
  95. LSPGetStates() map[string]LSPClientInfo
  96. LSPGetDiagnosticCounts(name string) lsp.DiagnosticCounts
  97. // Config (read-only data)
  98. Config() *config.Config
  99. WorkingDir() string
  100. Resolver() config.VariableResolver
  101. // Config mutations (proxied to server in client mode)
  102. UpdatePreferredModel(scope config.Scope, modelType config.SelectedModelType, model config.SelectedModel) error
  103. SetCompactMode(scope config.Scope, enabled bool) error
  104. SetProviderAPIKey(scope config.Scope, providerID string, apiKey any) error
  105. SetConfigField(scope config.Scope, key string, value any) error
  106. RemoveConfigField(scope config.Scope, key string) error
  107. ImportCopilot() (*oauth.Token, bool)
  108. RefreshOAuthToken(ctx context.Context, scope config.Scope, providerID string) error
  109. // Project lifecycle
  110. ProjectNeedsInitialization() (bool, error)
  111. MarkProjectInitialized() error
  112. InitializePrompt() (string, error)
  113. // MCP operations (server-side in client mode)
  114. MCPGetStates() map[string]mcptools.ClientInfo
  115. MCPRefreshPrompts(ctx context.Context, name string)
  116. MCPRefreshResources(ctx context.Context, name string)
  117. RefreshMCPTools(ctx context.Context, name string)
  118. ReadMCPResource(ctx context.Context, name, uri string) ([]MCPResourceContents, error)
  119. GetMCPPrompt(clientID, promptID string, args map[string]string) (string, error)
  120. EnableDockerMCP(ctx context.Context) error
  121. DisableDockerMCP() error
  122. // Events
  123. Subscribe(program *tea.Program)
  124. Shutdown()
  125. }
  126. // MCPResourceContents holds the contents of an MCP resource.
  127. type MCPResourceContents struct {
  128. URI string `json:"uri"`
  129. MIMEType string `json:"mime_type,omitempty"`
  130. Text string `json:"text,omitempty"`
  131. Blob []byte `json:"blob,omitempty"`
  132. }