@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.
Files changed (85) hide show
  1. package/.npmrc.tmp +2 -0
  2. package/README.md +72 -0
  3. package/cmd/cline/main.go +348 -0
  4. package/cmd/cline-host/main.go +71 -0
  5. package/e2e/default_update_test.go +154 -0
  6. package/e2e/helpers_test.go +378 -0
  7. package/e2e/main_test.go +47 -0
  8. package/e2e/mixed_stress_test.go +120 -0
  9. package/e2e/sqlite_helper.go +161 -0
  10. package/e2e/start_list_test.go +178 -0
  11. package/go.mod +64 -0
  12. package/go.sum +162 -0
  13. package/man/cline.1 +331 -0
  14. package/man/cline.1.md +332 -0
  15. package/package.json +54 -0
  16. package/pkg/cli/auth/auth_cline_provider.go +285 -0
  17. package/pkg/cli/auth/auth_menu.go +323 -0
  18. package/pkg/cli/auth/auth_subscription.go +130 -0
  19. package/pkg/cli/auth/byo_quick_setup.go +247 -0
  20. package/pkg/cli/auth/models_cline.go +141 -0
  21. package/pkg/cli/auth/models_list_fetch.go +156 -0
  22. package/pkg/cli/auth/models_list_static.go +69 -0
  23. package/pkg/cli/auth/providers_byo.go +184 -0
  24. package/pkg/cli/auth/providers_list.go +517 -0
  25. package/pkg/cli/auth/update_api_configurations.go +647 -0
  26. package/pkg/cli/auth/wizard_byo.go +764 -0
  27. package/pkg/cli/auth/wizard_byo_bedrock.go +193 -0
  28. package/pkg/cli/auth/wizard_byo_oca.go +366 -0
  29. package/pkg/cli/auth.go +43 -0
  30. package/pkg/cli/clerror/cline_error.go +187 -0
  31. package/pkg/cli/config/manager.go +208 -0
  32. package/pkg/cli/config/settings_renderer.go +198 -0
  33. package/pkg/cli/config.go +152 -0
  34. package/pkg/cli/display/ansi.go +27 -0
  35. package/pkg/cli/display/banner.go +211 -0
  36. package/pkg/cli/display/deduplicator.go +95 -0
  37. package/pkg/cli/display/markdown_renderer.go +139 -0
  38. package/pkg/cli/display/renderer.go +304 -0
  39. package/pkg/cli/display/segment_streamer.go +212 -0
  40. package/pkg/cli/display/streaming.go +134 -0
  41. package/pkg/cli/display/system_renderer.go +269 -0
  42. package/pkg/cli/display/tool_renderer.go +455 -0
  43. package/pkg/cli/display/tool_result_parser.go +371 -0
  44. package/pkg/cli/display/typewriter.go +210 -0
  45. package/pkg/cli/doctor.go +65 -0
  46. package/pkg/cli/global/cline-clients.go +501 -0
  47. package/pkg/cli/global/global.go +113 -0
  48. package/pkg/cli/global/registry.go +304 -0
  49. package/pkg/cli/handlers/ask_handlers.go +339 -0
  50. package/pkg/cli/handlers/handler.go +130 -0
  51. package/pkg/cli/handlers/say_handlers.go +521 -0
  52. package/pkg/cli/instances.go +506 -0
  53. package/pkg/cli/logs.go +382 -0
  54. package/pkg/cli/output/coordinator.go +167 -0
  55. package/pkg/cli/output/input_model.go +497 -0
  56. package/pkg/cli/sqlite/locks.go +366 -0
  57. package/pkg/cli/task/history_handler.go +72 -0
  58. package/pkg/cli/task/input_handler.go +577 -0
  59. package/pkg/cli/task/manager.go +1283 -0
  60. package/pkg/cli/task/settings_parser.go +754 -0
  61. package/pkg/cli/task/stream_coordinator.go +60 -0
  62. package/pkg/cli/task.go +675 -0
  63. package/pkg/cli/terminal/keyboard.go +695 -0
  64. package/pkg/cli/tui/HELP_WANTED.md +1 -0
  65. package/pkg/cli/types/history.go +17 -0
  66. package/pkg/cli/types/messages.go +329 -0
  67. package/pkg/cli/types/state.go +59 -0
  68. package/pkg/cli/updater/updater.go +409 -0
  69. package/pkg/cli/version.go +43 -0
  70. package/pkg/common/constants.go +6 -0
  71. package/pkg/common/schema.go +54 -0
  72. package/pkg/common/types.go +54 -0
  73. package/pkg/common/utils.go +185 -0
  74. package/pkg/generated/field_overrides.go +39 -0
  75. package/pkg/generated/providers.go +1584 -0
  76. package/pkg/hostbridge/diff.go +351 -0
  77. package/pkg/hostbridge/disabled/watch.go +39 -0
  78. package/pkg/hostbridge/disabled/window.go +63 -0
  79. package/pkg/hostbridge/disabled/workspace.go +66 -0
  80. package/pkg/hostbridge/env.go +166 -0
  81. package/pkg/hostbridge/grpc_server.go +113 -0
  82. package/pkg/hostbridge/simple.go +43 -0
  83. package/pkg/hostbridge/simple_workspace.go +85 -0
  84. package/pkg/hostbridge/window.go +129 -0
  85. 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
+ }