@caretive/caret-cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmrc.tmp +2 -0
- package/README.md +72 -0
- package/cmd/cline/main.go +348 -0
- package/cmd/cline-host/main.go +71 -0
- package/e2e/default_update_test.go +154 -0
- package/e2e/helpers_test.go +378 -0
- package/e2e/main_test.go +47 -0
- package/e2e/mixed_stress_test.go +120 -0
- package/e2e/sqlite_helper.go +161 -0
- package/e2e/start_list_test.go +178 -0
- package/go.mod +64 -0
- package/go.sum +162 -0
- package/man/cline.1 +331 -0
- package/man/cline.1.md +332 -0
- package/package.json +54 -0
- package/pkg/cli/auth/auth_cline_provider.go +285 -0
- package/pkg/cli/auth/auth_menu.go +323 -0
- package/pkg/cli/auth/auth_subscription.go +130 -0
- package/pkg/cli/auth/byo_quick_setup.go +247 -0
- package/pkg/cli/auth/models_cline.go +141 -0
- package/pkg/cli/auth/models_list_fetch.go +156 -0
- package/pkg/cli/auth/models_list_static.go +69 -0
- package/pkg/cli/auth/providers_byo.go +184 -0
- package/pkg/cli/auth/providers_list.go +517 -0
- package/pkg/cli/auth/update_api_configurations.go +647 -0
- package/pkg/cli/auth/wizard_byo.go +764 -0
- package/pkg/cli/auth/wizard_byo_bedrock.go +193 -0
- package/pkg/cli/auth/wizard_byo_oca.go +366 -0
- package/pkg/cli/auth.go +43 -0
- package/pkg/cli/clerror/cline_error.go +187 -0
- package/pkg/cli/config/manager.go +208 -0
- package/pkg/cli/config/settings_renderer.go +198 -0
- package/pkg/cli/config.go +152 -0
- package/pkg/cli/display/ansi.go +27 -0
- package/pkg/cli/display/banner.go +211 -0
- package/pkg/cli/display/deduplicator.go +95 -0
- package/pkg/cli/display/markdown_renderer.go +139 -0
- package/pkg/cli/display/renderer.go +304 -0
- package/pkg/cli/display/segment_streamer.go +212 -0
- package/pkg/cli/display/streaming.go +134 -0
- package/pkg/cli/display/system_renderer.go +269 -0
- package/pkg/cli/display/tool_renderer.go +455 -0
- package/pkg/cli/display/tool_result_parser.go +371 -0
- package/pkg/cli/display/typewriter.go +210 -0
- package/pkg/cli/doctor.go +65 -0
- package/pkg/cli/global/cline-clients.go +501 -0
- package/pkg/cli/global/global.go +113 -0
- package/pkg/cli/global/registry.go +304 -0
- package/pkg/cli/handlers/ask_handlers.go +339 -0
- package/pkg/cli/handlers/handler.go +130 -0
- package/pkg/cli/handlers/say_handlers.go +521 -0
- package/pkg/cli/instances.go +506 -0
- package/pkg/cli/logs.go +382 -0
- package/pkg/cli/output/coordinator.go +167 -0
- package/pkg/cli/output/input_model.go +497 -0
- package/pkg/cli/sqlite/locks.go +366 -0
- package/pkg/cli/task/history_handler.go +72 -0
- package/pkg/cli/task/input_handler.go +577 -0
- package/pkg/cli/task/manager.go +1283 -0
- package/pkg/cli/task/settings_parser.go +754 -0
- package/pkg/cli/task/stream_coordinator.go +60 -0
- package/pkg/cli/task.go +675 -0
- package/pkg/cli/terminal/keyboard.go +695 -0
- package/pkg/cli/tui/HELP_WANTED.md +1 -0
- package/pkg/cli/types/history.go +17 -0
- package/pkg/cli/types/messages.go +329 -0
- package/pkg/cli/types/state.go +59 -0
- package/pkg/cli/updater/updater.go +409 -0
- package/pkg/cli/version.go +43 -0
- package/pkg/common/constants.go +6 -0
- package/pkg/common/schema.go +54 -0
- package/pkg/common/types.go +54 -0
- package/pkg/common/utils.go +185 -0
- package/pkg/generated/field_overrides.go +39 -0
- package/pkg/generated/providers.go +1584 -0
- package/pkg/hostbridge/diff.go +351 -0
- package/pkg/hostbridge/disabled/watch.go +39 -0
- package/pkg/hostbridge/disabled/window.go +63 -0
- package/pkg/hostbridge/disabled/workspace.go +66 -0
- package/pkg/hostbridge/env.go +166 -0
- package/pkg/hostbridge/grpc_server.go +113 -0
- package/pkg/hostbridge/simple.go +43 -0
- package/pkg/hostbridge/simple_workspace.go +85 -0
- package/pkg/hostbridge/window.go +129 -0
- package/scripts/publish-caret-cli.sh +39 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
package auth
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"sort"
|
|
6
|
+
|
|
7
|
+
"github.com/cline/cli/pkg/generated"
|
|
8
|
+
"github.com/cline/grpc-go/cline"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// SupportsStaticModelList returns true if the provider has a predefined static model list
|
|
12
|
+
func SupportsStaticModelList(provider cline.ApiProvider) bool {
|
|
13
|
+
providerID := GetProviderIDForEnum(provider)
|
|
14
|
+
if providerID == "" {
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Check if this provider has static models defined
|
|
19
|
+
def, err := generated.GetProviderDefinition(providerID)
|
|
20
|
+
if err != nil {
|
|
21
|
+
return false
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Return true if provider has models and isn't dynamic-only
|
|
25
|
+
// (Dynamic providers like OpenRouter/OpenAI/Ollama fetch from API)
|
|
26
|
+
return len(def.Models) > 0 && !def.HasDynamicModels
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// FetchStaticModels retrieves the static model list for a provider from generated definitions
|
|
30
|
+
// Returns a sorted list of model IDs and a map of model IDs to their info
|
|
31
|
+
func FetchStaticModels(provider cline.ApiProvider) ([]string, map[string]generated.ModelInfo, error) {
|
|
32
|
+
providerID := GetProviderIDForEnum(provider)
|
|
33
|
+
if providerID == "" {
|
|
34
|
+
return nil, nil, fmt.Errorf("unknown provider enum: %v", provider)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
def, err := generated.GetProviderDefinition(providerID)
|
|
38
|
+
if err != nil {
|
|
39
|
+
return nil, nil, fmt.Errorf("failed to get provider definition: %w", err)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if len(def.Models) == 0 {
|
|
43
|
+
return nil, nil, fmt.Errorf("no models defined for provider %s", providerID)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Extract model IDs and sort them
|
|
47
|
+
modelIDs := make([]string, 0, len(def.Models))
|
|
48
|
+
for modelID := range def.Models {
|
|
49
|
+
modelIDs = append(modelIDs, modelID)
|
|
50
|
+
}
|
|
51
|
+
sort.Strings(modelIDs)
|
|
52
|
+
|
|
53
|
+
return modelIDs, def.Models, nil
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// GetDefaultModelForProvider returns the default model ID for a provider if one is defined
|
|
57
|
+
func GetDefaultModelForProvider(provider cline.ApiProvider) string {
|
|
58
|
+
providerID := GetProviderIDForEnum(provider)
|
|
59
|
+
if providerID == "" {
|
|
60
|
+
return ""
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
def, err := generated.GetProviderDefinition(providerID)
|
|
64
|
+
if err != nil {
|
|
65
|
+
return ""
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return def.DefaultModelID
|
|
69
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
package auth
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
|
|
6
|
+
"github.com/charmbracelet/huh"
|
|
7
|
+
"github.com/cline/grpc-go/cline"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// BYOProviderOption represents a selectable BYO (bring-your-own) provider option
|
|
11
|
+
type BYOProviderOption struct {
|
|
12
|
+
Name string
|
|
13
|
+
Provider cline.ApiProvider
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// GetBYOProviderList returns the list of supported BYO providers for CLI configuration.
|
|
17
|
+
// This list excludes Cline provider which is handled separately.
|
|
18
|
+
func GetBYOProviderList() []BYOProviderOption {
|
|
19
|
+
return []BYOProviderOption{
|
|
20
|
+
{Name: "Anthropic", Provider: cline.ApiProvider_ANTHROPIC},
|
|
21
|
+
{Name: "OpenAI Compatible", Provider: cline.ApiProvider_OPENAI},
|
|
22
|
+
{Name: "OpenAI (Official)", Provider: cline.ApiProvider_OPENAI_NATIVE},
|
|
23
|
+
{Name: "OpenRouter", Provider: cline.ApiProvider_OPENROUTER},
|
|
24
|
+
{Name: "X AI (Grok)", Provider: cline.ApiProvider_XAI},
|
|
25
|
+
{Name: "AWS Bedrock", Provider: cline.ApiProvider_BEDROCK},
|
|
26
|
+
{Name: "Google Gemini", Provider: cline.ApiProvider_GEMINI},
|
|
27
|
+
{Name: "Ollama", Provider: cline.ApiProvider_OLLAMA},
|
|
28
|
+
{Name: "Cerebras", Provider: cline.ApiProvider_CEREBRAS},
|
|
29
|
+
{Name: "NousResearch", Provider: cline.ApiProvider_NOUSRESEARCH},
|
|
30
|
+
{Name: "Oracle Code Assist", Provider: cline.ApiProvider_OCA},
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// SelectBYOProvider displays a menu for selecting a BYO provider.
|
|
35
|
+
func SelectBYOProvider() (cline.ApiProvider, error) {
|
|
36
|
+
providers := GetBYOProviderList()
|
|
37
|
+
var selectedIndex int
|
|
38
|
+
|
|
39
|
+
options := make([]huh.Option[int], len(providers)+1)
|
|
40
|
+
for i, provider := range providers {
|
|
41
|
+
options[i] = huh.NewOption(provider.Name, i)
|
|
42
|
+
}
|
|
43
|
+
options[len(providers)] = huh.NewOption("(Cancel)", -1)
|
|
44
|
+
|
|
45
|
+
form := huh.NewForm(
|
|
46
|
+
huh.NewGroup(
|
|
47
|
+
huh.NewSelect[int]().
|
|
48
|
+
Title("Select an API provider").
|
|
49
|
+
Options(options...).
|
|
50
|
+
Value(&selectedIndex),
|
|
51
|
+
),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
if err := form.Run(); err != nil {
|
|
55
|
+
return 0, fmt.Errorf("failed to select provider: %w", err)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if selectedIndex == -1 {
|
|
59
|
+
return 0, fmt.Errorf("provider selection cancelled")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return providers[selectedIndex].Provider, nil
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// SupportsBYOModelFetching returns true if the provider supports fetching models dynamically
|
|
66
|
+
// from a remote API, or if it has a static list of predefined models.
|
|
67
|
+
// This is used to determine whether to show a model list before prompting for manual entry.
|
|
68
|
+
func SupportsBYOModelFetching(provider cline.ApiProvider) bool {
|
|
69
|
+
switch provider {
|
|
70
|
+
case cline.ApiProvider_OPENROUTER:
|
|
71
|
+
return true
|
|
72
|
+
case cline.ApiProvider_OPENAI:
|
|
73
|
+
return true
|
|
74
|
+
case cline.ApiProvider_OLLAMA:
|
|
75
|
+
return true
|
|
76
|
+
case cline.ApiProvider_OCA:
|
|
77
|
+
return true
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return SupportsStaticModelList(provider)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// GetBYOProviderPlaceholder returns a placeholder model ID for manual entry based on provider.
|
|
84
|
+
func GetBYOProviderPlaceholder(provider cline.ApiProvider) string {
|
|
85
|
+
switch provider {
|
|
86
|
+
case cline.ApiProvider_ANTHROPIC:
|
|
87
|
+
return "e.g., claude-sonnet-4-5-20250929"
|
|
88
|
+
case cline.ApiProvider_OPENAI:
|
|
89
|
+
return "e.g., openai/gpt-oss-120b"
|
|
90
|
+
case cline.ApiProvider_OPENAI_NATIVE:
|
|
91
|
+
return "e.g., gpt-5-2025-08-07"
|
|
92
|
+
case cline.ApiProvider_OPENROUTER:
|
|
93
|
+
return "e.g., google/gemini-2.0-flash-exp:free"
|
|
94
|
+
case cline.ApiProvider_XAI:
|
|
95
|
+
return "e.g., grok-code-fast-1"
|
|
96
|
+
case cline.ApiProvider_BEDROCK:
|
|
97
|
+
return "e.g., anthropic.claude-sonnet-4-5-20250929-v1:0"
|
|
98
|
+
case cline.ApiProvider_GEMINI:
|
|
99
|
+
return "e.g., gemini-2.5-pro"
|
|
100
|
+
case cline.ApiProvider_OLLAMA:
|
|
101
|
+
return "e.g., qwen3-coder:30b"
|
|
102
|
+
case cline.ApiProvider_CEREBRAS:
|
|
103
|
+
return "e.g., gpt-oss-120b"
|
|
104
|
+
case cline.ApiProvider_NOUSRESEARCH:
|
|
105
|
+
return "e.g., Hermes-4-405B"
|
|
106
|
+
case cline.ApiProvider_OCA:
|
|
107
|
+
return "e.g., oca/llama4"
|
|
108
|
+
default:
|
|
109
|
+
return "Enter model ID"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// GetBYOAPIKeyFieldConfig returns field configuration for API key input based on provider.
|
|
114
|
+
type APIKeyFieldConfig struct {
|
|
115
|
+
Title string
|
|
116
|
+
EchoMode huh.EchoMode
|
|
117
|
+
IsRequired bool
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// GetBYOAPIKeyFieldConfig returns the configuration for the API key field based on provider.
|
|
121
|
+
func GetBYOAPIKeyFieldConfig(provider cline.ApiProvider) APIKeyFieldConfig {
|
|
122
|
+
if provider == cline.ApiProvider_OLLAMA {
|
|
123
|
+
return APIKeyFieldConfig{
|
|
124
|
+
Title: "Base URL (optional, press Enter for default)",
|
|
125
|
+
EchoMode: huh.EchoModeNormal,
|
|
126
|
+
IsRequired: false,
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return APIKeyFieldConfig{
|
|
131
|
+
Title: "API Key",
|
|
132
|
+
EchoMode: huh.EchoModePassword,
|
|
133
|
+
IsRequired: true,
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// PromptForAPIKey prompts the user to enter an API key (or base URL for Ollama).
|
|
138
|
+
// For OpenAI (Compatible) provider, also prompts for an optional base URL.
|
|
139
|
+
func PromptForAPIKey(provider cline.ApiProvider) (string, string, error) {
|
|
140
|
+
var apiKey string
|
|
141
|
+
config := GetBYOAPIKeyFieldConfig(provider)
|
|
142
|
+
|
|
143
|
+
apiKeyField := huh.NewInput().
|
|
144
|
+
Title(config.Title).
|
|
145
|
+
EchoMode(config.EchoMode).
|
|
146
|
+
Value(&apiKey)
|
|
147
|
+
|
|
148
|
+
if config.IsRequired {
|
|
149
|
+
apiKeyField = apiKeyField.Validate(func(s string) error {
|
|
150
|
+
if s == "" {
|
|
151
|
+
return fmt.Errorf("API key cannot be empty")
|
|
152
|
+
}
|
|
153
|
+
return nil
|
|
154
|
+
})
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
form := huh.NewForm(huh.NewGroup(apiKeyField))
|
|
158
|
+
|
|
159
|
+
if err := form.Run(); err != nil {
|
|
160
|
+
return "", "", fmt.Errorf("failed to get API key: %w", err)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// For OpenAI (Compatible) provider, prompt for base URL
|
|
164
|
+
if provider == cline.ApiProvider_OPENAI {
|
|
165
|
+
var baseURL string
|
|
166
|
+
baseURLForm := huh.NewForm(
|
|
167
|
+
huh.NewGroup(
|
|
168
|
+
huh.NewInput().
|
|
169
|
+
Title("Base URL (optional, for OpenAI-compatible providers)").
|
|
170
|
+
Placeholder("e.g., https://api.example.com/v1").
|
|
171
|
+
Value(&baseURL).
|
|
172
|
+
Description("Press Enter to skip if using standard OpenAI API"),
|
|
173
|
+
),
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
if err := baseURLForm.Run(); err != nil {
|
|
177
|
+
return "", "", fmt.Errorf("failed to get base URL: %w", err)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return apiKey, baseURL, nil
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return apiKey, "", nil
|
|
184
|
+
}
|