@didim365/agent-cli 0.1.2 → 0.1.4

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 (58) hide show
  1. package/dist/package.json +6 -3
  2. package/dist/src/config/settingsSchema.d.ts +85 -0
  3. package/dist/src/config/settingsSchema.js +85 -0
  4. package/dist/src/config/settingsSchema.js.map +1 -1
  5. package/dist/src/core/initializer.js +42 -3
  6. package/dist/src/core/initializer.js.map +1 -1
  7. package/dist/src/gemini.d.ts +6 -0
  8. package/dist/src/gemini.js +79 -5
  9. package/dist/src/gemini.js.map +1 -1
  10. package/dist/src/generated/git-commit.d.ts +1 -1
  11. package/dist/src/generated/git-commit.js +1 -1
  12. package/dist/src/test-utils/render.js +9 -0
  13. package/dist/src/test-utils/render.js.map +1 -1
  14. package/dist/src/ui/AppContainer.js +182 -9
  15. package/dist/src/ui/AppContainer.js.map +1 -1
  16. package/dist/src/ui/auth/ApiAuthDialog.d.ts +3 -1
  17. package/dist/src/ui/auth/ApiAuthDialog.js +7 -5
  18. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  19. package/dist/src/ui/auth/AuthDialog.d.ts +3 -1
  20. package/dist/src/ui/auth/AuthDialog.js +6 -6
  21. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  22. package/dist/src/ui/auth/ProviderSelectDialog.d.ts +15 -0
  23. package/dist/src/ui/auth/ProviderSelectDialog.js +39 -0
  24. package/dist/src/ui/auth/ProviderSelectDialog.js.map +1 -0
  25. package/dist/src/ui/auth/SlmConfigDialog.d.ts +21 -0
  26. package/dist/src/ui/auth/SlmConfigDialog.js +170 -0
  27. package/dist/src/ui/auth/SlmConfigDialog.js.map +1 -0
  28. package/dist/src/ui/auth/VertexConfigDialog.d.ts +18 -0
  29. package/dist/src/ui/auth/VertexConfigDialog.js +97 -0
  30. package/dist/src/ui/auth/VertexConfigDialog.js.map +1 -0
  31. package/dist/src/ui/auth/providerMetadata.d.ts +38 -0
  32. package/dist/src/ui/auth/providerMetadata.js +71 -0
  33. package/dist/src/ui/auth/providerMetadata.js.map +1 -0
  34. package/dist/src/ui/auth/useAuth.d.ts +3 -0
  35. package/dist/src/ui/auth/useAuth.js +243 -39
  36. package/dist/src/ui/auth/useAuth.js.map +1 -1
  37. package/dist/src/ui/commands/authCommand.js +18 -1
  38. package/dist/src/ui/commands/authCommand.js.map +1 -1
  39. package/dist/src/ui/commands/initCommand.js +1 -1
  40. package/dist/src/ui/commands/initCommand.js.map +1 -1
  41. package/dist/src/ui/commands/rewindCommand.js.map +1 -1
  42. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  43. package/dist/src/ui/components/DialogManager.js +27 -2
  44. package/dist/src/ui/components/DialogManager.js.map +1 -1
  45. package/dist/src/ui/components/InputPrompt.js +1 -1
  46. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  47. package/dist/src/ui/contexts/UIActionsContext.d.ts +14 -0
  48. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  49. package/dist/src/ui/contexts/UIStateContext.d.ts +4 -0
  50. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  51. package/dist/src/ui/hooks/useRewind.js.map +1 -1
  52. package/dist/src/ui/types.d.ts +4 -1
  53. package/dist/src/ui/types.js +6 -0
  54. package/dist/src/ui/types.js.map +1 -1
  55. package/dist/src/ui/utils/mouse.js +1 -1
  56. package/dist/src/ui/utils/mouse.js.map +1 -1
  57. package/dist/src/ui/utils/rewindFileOps.js.map +1 -1
  58. package/package.json +2 -2
@@ -0,0 +1,170 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useCallback } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { theme } from '../semantic-colors.js';
5
+ import { TextInput } from '../components/shared/TextInput.js';
6
+ import { useTextBuffer } from '../components/shared/text-buffer.js';
7
+ import { useUIState } from '../contexts/UIStateContext.js';
8
+ import { useKeypress } from '../hooks/useKeypress.js';
9
+ const STEPS = ['endpoint', 'credentials', 'advanced'];
10
+ function isValidUrl(url) {
11
+ return /^https?:\/\/.+/.test(url.trim());
12
+ }
13
+ export function SlmConfigDialog({ onComplete, onCancel, defaultConfig, }) {
14
+ const { terminalWidth } = useUIState();
15
+ const viewportWidth = terminalWidth - 8;
16
+ const [currentStep, setCurrentStep] = useState('endpoint');
17
+ const [validationError, setValidationError] = useState(null);
18
+ // Focus management: which field is focused in multi-field steps (Tab to switch)
19
+ // 'primary' = first field (API Key / Header Name), 'secondary' = second field (Model / Custom Headers)
20
+ const [focusedField, setFocusedField] = useState('primary');
21
+ // Accumulated config across steps
22
+ const [baseUrl, setBaseUrl] = useState(defaultConfig?.baseUrl ?? '');
23
+ const [apiKey, setApiKey] = useState(defaultConfig?.apiKey ?? '');
24
+ const [model, setModel] = useState(defaultConfig?.model ?? '');
25
+ const [apiKeyHeaderName, setApiKeyHeaderName] = useState(defaultConfig?.apiKeyHeaderName ?? '');
26
+ const [customHeaders, setCustomHeaders] = useState(defaultConfig?.customHeaders ?? '');
27
+ const stepIndex = STEPS.indexOf(currentStep);
28
+ const stepLabel = `Step ${stepIndex + 1} of ${STEPS.length}`;
29
+ // Text buffer for current input field
30
+ const getInitialText = useCallback(() => {
31
+ switch (currentStep) {
32
+ case 'endpoint':
33
+ return baseUrl;
34
+ case 'credentials':
35
+ return apiKey;
36
+ case 'advanced':
37
+ return apiKeyHeaderName;
38
+ default:
39
+ return '';
40
+ }
41
+ }, [currentStep, baseUrl, apiKey, apiKeyHeaderName]);
42
+ const buffer = useTextBuffer({
43
+ initialText: getInitialText(),
44
+ initialCursorOffset: getInitialText().length,
45
+ viewport: {
46
+ width: viewportWidth,
47
+ height: 4,
48
+ },
49
+ isValidPath: () => false,
50
+ singleLine: true,
51
+ });
52
+ // Secondary buffer for model input (step 2 has two fields)
53
+ const modelBuffer = useTextBuffer({
54
+ initialText: model,
55
+ initialCursorOffset: model.length,
56
+ viewport: {
57
+ width: viewportWidth,
58
+ height: 4,
59
+ },
60
+ isValidPath: () => false,
61
+ singleLine: true,
62
+ });
63
+ // Secondary buffer for custom headers (step 3 has two fields)
64
+ const headersBuffer = useTextBuffer({
65
+ initialText: customHeaders,
66
+ initialCursorOffset: customHeaders.length,
67
+ viewport: {
68
+ width: viewportWidth,
69
+ height: 4,
70
+ },
71
+ isValidPath: () => false,
72
+ singleLine: true,
73
+ });
74
+ const handleEndpointSubmit = useCallback((value) => {
75
+ if (!isValidUrl(value)) {
76
+ setValidationError('URL must start with http:// or https:// (e.g., http://localhost:11434/v1)');
77
+ return;
78
+ }
79
+ setValidationError(null);
80
+ setBaseUrl(value);
81
+ setCurrentStep('credentials');
82
+ setFocusedField('primary');
83
+ buffer.setText('');
84
+ }, [buffer]);
85
+ const handleCredentialsSubmit = useCallback((value) => {
86
+ setApiKey(value);
87
+ setModel(modelBuffer.text);
88
+ setValidationError(null);
89
+ setCurrentStep('advanced');
90
+ setFocusedField('primary');
91
+ buffer.setText('');
92
+ }, [buffer, modelBuffer.text]);
93
+ const handleAdvancedSubmit = useCallback((value) => {
94
+ setApiKeyHeaderName(value);
95
+ const headers = headersBuffer.text;
96
+ setCustomHeaders(headers);
97
+ // Validate custom headers JSON if provided
98
+ if (headers.trim()) {
99
+ try {
100
+ JSON.parse(headers);
101
+ }
102
+ catch {
103
+ setValidationError('Custom headers must be valid JSON (e.g., {"X-Custom": "value"})');
104
+ return;
105
+ }
106
+ }
107
+ setValidationError(null);
108
+ const config = {
109
+ baseUrl,
110
+ ...(value.trim() && { apiKeyHeaderName: value.trim() }),
111
+ ...(headers.trim() && { customHeaders: headers.trim() }),
112
+ ...(apiKey.trim() && { apiKey: apiKey.trim() }),
113
+ ...(model.trim() && { model: model.trim() }),
114
+ };
115
+ onComplete(config);
116
+ }, [headersBuffer.text, baseUrl, apiKey, model, onComplete]);
117
+ const handleSubmit = useCallback((value) => {
118
+ switch (currentStep) {
119
+ case 'endpoint':
120
+ handleEndpointSubmit(value);
121
+ break;
122
+ case 'credentials':
123
+ handleCredentialsSubmit(value);
124
+ break;
125
+ case 'advanced':
126
+ handleAdvancedSubmit(value);
127
+ break;
128
+ default:
129
+ break;
130
+ }
131
+ }, [
132
+ currentStep,
133
+ handleEndpointSubmit,
134
+ handleCredentialsSubmit,
135
+ handleAdvancedSubmit,
136
+ ]);
137
+ const handleCancel = useCallback(() => {
138
+ if (currentStep === 'endpoint') {
139
+ onCancel();
140
+ }
141
+ else {
142
+ // Go back to previous step
143
+ const prevIndex = stepIndex - 1;
144
+ if (prevIndex >= 0) {
145
+ setCurrentStep(STEPS[prevIndex]);
146
+ setValidationError(null);
147
+ }
148
+ }
149
+ }, [currentStep, stepIndex, onCancel]);
150
+ useKeypress((key) => {
151
+ if (key.name === 'escape') {
152
+ handleCancel();
153
+ }
154
+ // Tab switches focus between primary/secondary fields in multi-field steps
155
+ if (key.name === 'tab' &&
156
+ (currentStep === 'credentials' || currentStep === 'advanced')) {
157
+ setFocusedField((prev) => prev === 'primary' ? 'secondary' : 'primary');
158
+ }
159
+ }, { isActive: true });
160
+ return (_jsxs(Box, { borderStyle: "round", borderColor: theme.border.focused, flexDirection: "column", padding: 1, width: "100%", children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "sLM Configuration" }), _jsx(Text, { color: theme.text.secondary, children: stepLabel })] }), currentStep === 'endpoint' && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "API Endpoint URL" }), _jsx(Text, { color: theme.text.secondary, children: "Enter the base URL for your OpenAI-compatible API endpoint." }), _jsx(Box, { marginTop: 1, flexDirection: "row", children: _jsx(Box, { borderStyle: "round", borderColor: theme.border.default, paddingX: 1, flexGrow: 1, children: _jsx(TextInput, { buffer: buffer, onSubmit: handleSubmit, onCancel: handleCancel, placeholder: "http://localhost:11434/v1" }) }) })] })), currentStep === 'credentials' && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "API Key (optional)" }), _jsx(Text, { color: theme.text.secondary, children: "Enter an API key if your endpoint requires authentication. Leave empty to skip." }), _jsx(Box, { marginTop: 1, flexDirection: "row", children: _jsx(Box, { borderStyle: "round", borderColor: focusedField === 'primary'
161
+ ? theme.border.focused
162
+ : theme.border.default, paddingX: 1, flexGrow: 1, children: _jsx(TextInput, { buffer: buffer, onSubmit: handleSubmit, onCancel: handleCancel, placeholder: "(optional) API key", focus: focusedField === 'primary' }) }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "Model Name (optional)" }), _jsx(Text, { color: theme.text.secondary, children: "Specify the model name. Leave empty for provider default." }), _jsx(Box, { marginTop: 1, flexDirection: "row", children: _jsx(Box, { borderStyle: "round", borderColor: focusedField === 'secondary'
163
+ ? theme.border.focused
164
+ : theme.border.default, paddingX: 1, flexGrow: 1, children: _jsx(TextInput, { buffer: modelBuffer, onSubmit: () => handleSubmit(buffer.text), onCancel: handleCancel, placeholder: "(optional) e.g., llama3, mistral", focus: focusedField === 'secondary' }) }) })] })] })), currentStep === 'advanced' && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "API Key Header Name (optional)" }), _jsx(Text, { color: theme.text.secondary, children: "Custom HTTP header name for the API key (default: Authorization)." }), _jsx(Box, { marginTop: 1, flexDirection: "row", children: _jsx(Box, { borderStyle: "round", borderColor: focusedField === 'primary'
165
+ ? theme.border.focused
166
+ : theme.border.default, paddingX: 1, flexGrow: 1, children: _jsx(TextInput, { buffer: buffer, onSubmit: handleSubmit, onCancel: handleCancel, placeholder: "(optional) e.g., X-API-Key", focus: focusedField === 'primary' }) }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "Custom Headers (optional)" }), _jsxs(Text, { color: theme.text.secondary, children: ["Additional HTTP headers as JSON (e.g., ", `{"X-Custom": "value"}`, ")."] }), _jsx(Box, { marginTop: 1, flexDirection: "row", children: _jsx(Box, { borderStyle: "round", borderColor: focusedField === 'secondary'
167
+ ? theme.border.focused
168
+ : theme.border.default, paddingX: 1, flexGrow: 1, children: _jsx(TextInput, { buffer: headersBuffer, onSubmit: () => handleSubmit(buffer.text), onCancel: handleCancel, placeholder: '(optional) {"key": "value"}', focus: focusedField === 'secondary' }) }) })] })] })), validationError && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.status.error, children: validationError }) })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.text.secondary, children: ["(Press Enter to ", currentStep === 'advanced' ? 'complete' : 'continue', ", Esc to ", currentStep === 'endpoint' ? 'cancel' : 'go back', currentStep !== 'endpoint' ? ', Tab to switch fields' : '', ")"] }) })] }));
169
+ }
170
+ //# sourceMappingURL=SlmConfigDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlmConfigDialog.js","sourceRoot":"","sources":["../../../../src/ui/auth/SlmConfigDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type React from 'react';
7
+ /** Vertex AI configuration matching settingsSchema.vertexConfig */
8
+ export interface VertexConfig {
9
+ project: string;
10
+ location: string;
11
+ }
12
+ interface VertexConfigDialogProps {
13
+ onComplete: (config: VertexConfig) => void;
14
+ onCancel: () => void;
15
+ defaultConfig?: Partial<VertexConfig>;
16
+ }
17
+ export declare function VertexConfigDialog({ onComplete, onCancel, defaultConfig, }: VertexConfigDialogProps): React.JSX.Element;
18
+ export {};
@@ -0,0 +1,97 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useCallback } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { theme } from '../semantic-colors.js';
5
+ import { TextInput } from '../components/shared/TextInput.js';
6
+ import { useTextBuffer } from '../components/shared/text-buffer.js';
7
+ import { useUIState } from '../contexts/UIStateContext.js';
8
+ import { useKeypress } from '../hooks/useKeypress.js';
9
+ const STEPS = ['project', 'location'];
10
+ const DEFAULT_LOCATION = 'us-central1';
11
+ export function VertexConfigDialog({ onComplete, onCancel, defaultConfig, }) {
12
+ const { terminalWidth } = useUIState();
13
+ const viewportWidth = terminalWidth - 8;
14
+ const [currentStep, setCurrentStep] = useState('project');
15
+ const [validationError, setValidationError] = useState(null);
16
+ // Accumulated config across steps
17
+ const [project, setProject] = useState(defaultConfig?.project ?? '');
18
+ const stepIndex = STEPS.indexOf(currentStep);
19
+ const stepLabel = `Step ${stepIndex + 1} of ${STEPS.length}`;
20
+ // Text buffer for current input field
21
+ const getInitialText = useCallback(() => {
22
+ switch (currentStep) {
23
+ case 'project':
24
+ return project;
25
+ case 'location':
26
+ return defaultConfig?.location ?? DEFAULT_LOCATION;
27
+ default:
28
+ return '';
29
+ }
30
+ }, [currentStep, project, defaultConfig?.location]);
31
+ const buffer = useTextBuffer({
32
+ initialText: getInitialText(),
33
+ initialCursorOffset: getInitialText().length,
34
+ viewport: {
35
+ width: viewportWidth,
36
+ height: 4,
37
+ },
38
+ isValidPath: () => false,
39
+ singleLine: true,
40
+ });
41
+ const handleProjectSubmit = useCallback((value) => {
42
+ const trimmed = value.trim();
43
+ if (!trimmed) {
44
+ setValidationError('Project ID is required.');
45
+ return;
46
+ }
47
+ setValidationError(null);
48
+ setProject(trimmed);
49
+ setCurrentStep('location');
50
+ buffer.setText(defaultConfig?.location ?? DEFAULT_LOCATION);
51
+ }, [buffer, defaultConfig?.location]);
52
+ const handleLocationSubmit = useCallback((value) => {
53
+ const trimmed = value.trim();
54
+ if (!trimmed) {
55
+ setValidationError('Location is required.');
56
+ return;
57
+ }
58
+ setValidationError(null);
59
+ onComplete({
60
+ project,
61
+ location: trimmed,
62
+ });
63
+ }, [project, onComplete]);
64
+ const handleSubmit = useCallback((value) => {
65
+ switch (currentStep) {
66
+ case 'project':
67
+ handleProjectSubmit(value);
68
+ break;
69
+ case 'location':
70
+ handleLocationSubmit(value);
71
+ break;
72
+ default:
73
+ break;
74
+ }
75
+ }, [currentStep, handleProjectSubmit, handleLocationSubmit]);
76
+ const handleCancel = useCallback(() => {
77
+ if (currentStep === 'project') {
78
+ onCancel();
79
+ }
80
+ else {
81
+ // Go back to previous step and restore buffer to saved project value
82
+ const prevIndex = stepIndex - 1;
83
+ if (prevIndex >= 0) {
84
+ setCurrentStep(STEPS[prevIndex]);
85
+ setValidationError(null);
86
+ buffer.setText(project);
87
+ }
88
+ }
89
+ }, [currentStep, stepIndex, onCancel, buffer, project]);
90
+ useKeypress((key) => {
91
+ if (key.name === 'escape') {
92
+ handleCancel();
93
+ }
94
+ }, { isActive: true });
95
+ return (_jsxs(Box, { borderStyle: "round", borderColor: theme.border.focused, flexDirection: "column", padding: 1, width: "100%", children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "Vertex AI Configuration" }), _jsx(Text, { color: theme.text.secondary, children: stepLabel })] }), currentStep === 'project' && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "Google Cloud Project ID" }), _jsx(Text, { color: theme.text.secondary, children: "Enter the Google Cloud project ID to use with Vertex AI." }), _jsx(Box, { marginTop: 1, flexDirection: "row", children: _jsx(Box, { borderStyle: "round", borderColor: theme.border.default, width: "100%", children: _jsx(TextInput, { buffer: buffer, onSubmit: handleSubmit, focus: true }) }) }), validationError && (_jsx(Text, { color: theme.status.error, children: validationError })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.text.secondary, children: "Press Enter to continue, Esc to go back" }) })] })), currentStep === 'location' && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: "Google Cloud Location" }), _jsx(Text, { color: theme.text.secondary, children: "Enter the Google Cloud region (e.g., us-central1, europe-west1)." }), _jsx(Box, { marginTop: 1, flexDirection: "row", children: _jsx(Box, { borderStyle: "round", borderColor: theme.border.default, width: "100%", children: _jsx(TextInput, { buffer: buffer, onSubmit: handleSubmit, focus: true }) }) }), validationError && (_jsx(Text, { color: theme.status.error, children: validationError })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.text.secondary, children: "Press Enter to save, Esc to go back" }) })] }))] }));
96
+ }
97
+ //# sourceMappingURL=VertexConfigDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VertexConfigDialog.js","sourceRoot":"","sources":["../../../../src/ui/auth/VertexConfigDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Display information for a LLM provider in the auth UI.
8
+ */
9
+ export interface ProviderDisplayInfo {
10
+ /** Internal provider type key */
11
+ providerType: string;
12
+ /** Display label shown in UI */
13
+ label: string;
14
+ /** Short description shown next to label */
15
+ description: string;
16
+ /** Environment variable name for the API key */
17
+ envVarName: string;
18
+ /** URL where users can obtain an API key */
19
+ apiKeyUrl: string;
20
+ /** Keychain entry name for storing the API key */
21
+ keychainEntry: string;
22
+ }
23
+ /**
24
+ * Mapping from UI-facing provider key to display metadata.
25
+ * 'vertex-ai' is presented as a separate choice even though it internally maps to ProviderType.Gemini.
26
+ * 'slm' maps to ProviderType.OpenAICompatible.
27
+ */
28
+ export declare const PROVIDER_DISPLAY_MAP: Record<string, ProviderDisplayInfo>;
29
+ /**
30
+ * Provider keys shown in Step 1 provider selection.
31
+ * Didim provider is hidden from user selection (activated via DIDIM_API_KEY env var only).
32
+ * Didim provider is hidden (activated via DIDIM_API_KEY env var only).
33
+ */
34
+ export declare const PROVIDER_SELECT_ITEMS: readonly ["gemini", "claude", "openai", "vertex-ai", "slm"];
35
+ /**
36
+ * Get provider display info, falling back to Gemini defaults.
37
+ */
38
+ export declare function getProviderDisplayInfo(provider: string | undefined): ProviderDisplayInfo;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Mapping from UI-facing provider key to display metadata.
8
+ * 'vertex-ai' is presented as a separate choice even though it internally maps to ProviderType.Gemini.
9
+ * 'slm' maps to ProviderType.OpenAICompatible.
10
+ */
11
+ export const PROVIDER_DISPLAY_MAP = {
12
+ gemini: {
13
+ providerType: 'gemini',
14
+ label: 'Gemini',
15
+ description: 'Google AI',
16
+ envVarName: 'GEMINI_API_KEY',
17
+ apiKeyUrl: 'https://aistudio.google.com/app/apikey',
18
+ keychainEntry: 'default-api-key',
19
+ },
20
+ claude: {
21
+ providerType: 'claude',
22
+ label: 'Claude',
23
+ description: 'Anthropic',
24
+ envVarName: 'ANTHROPIC_API_KEY',
25
+ apiKeyUrl: 'https://console.anthropic.com/settings/keys',
26
+ keychainEntry: 'claude-api-key',
27
+ },
28
+ openai: {
29
+ providerType: 'openai',
30
+ label: 'OpenAI',
31
+ description: 'OpenAI',
32
+ envVarName: 'OPENAI_API_KEY',
33
+ apiKeyUrl: 'https://platform.openai.com/api-keys',
34
+ keychainEntry: 'openai-api-key',
35
+ },
36
+ 'vertex-ai': {
37
+ providerType: 'gemini',
38
+ label: 'Vertex AI',
39
+ description: 'Google Cloud',
40
+ envVarName: 'GOOGLE_API_KEY',
41
+ apiKeyUrl: 'https://console.cloud.google.com/apis/credentials',
42
+ keychainEntry: 'default-api-key',
43
+ },
44
+ slm: {
45
+ providerType: 'openai-compatible',
46
+ label: 'sLM',
47
+ description: 'Self-hosted / Local LLM',
48
+ envVarName: 'LLM_API_KEY',
49
+ apiKeyUrl: '',
50
+ keychainEntry: 'slm-api-key',
51
+ },
52
+ };
53
+ /**
54
+ * Provider keys shown in Step 1 provider selection.
55
+ * Didim provider is hidden from user selection (activated via DIDIM_API_KEY env var only).
56
+ * Didim provider is hidden (activated via DIDIM_API_KEY env var only).
57
+ */
58
+ export const PROVIDER_SELECT_ITEMS = [
59
+ 'gemini',
60
+ 'claude',
61
+ 'openai',
62
+ 'vertex-ai',
63
+ 'slm',
64
+ ];
65
+ /**
66
+ * Get provider display info, falling back to Gemini defaults.
67
+ */
68
+ export function getProviderDisplayInfo(provider) {
69
+ return (PROVIDER_DISPLAY_MAP[provider ?? 'gemini'] ?? PROVIDER_DISPLAY_MAP['gemini']);
70
+ }
71
+ //# sourceMappingURL=providerMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerMetadata.js","sourceRoot":"","sources":["../../../../src/ui/auth/providerMetadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAwC;IACvE,MAAM,EAAE;QACN,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,WAAW;QACxB,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,wCAAwC;QACnD,aAAa,EAAE,iBAAiB;KACjC;IACD,MAAM,EAAE;QACN,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,WAAW;QACxB,UAAU,EAAE,mBAAmB;QAC/B,SAAS,EAAE,6CAA6C;QACxD,aAAa,EAAE,gBAAgB;KAChC;IACD,MAAM,EAAE;QACN,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,QAAQ;QACrB,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,sCAAsC;QACjD,aAAa,EAAE,gBAAgB;KAChC;IACD,WAAW,EAAE;QACX,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,cAAc;QAC3B,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,mDAAmD;QAC9D,aAAa,EAAE,iBAAiB;KACjC;IACD,GAAG,EAAE;QACH,YAAY,EAAE,mBAAmB;QACjC,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,yBAAyB;QACtC,UAAU,EAAE,aAAa;QACzB,SAAS,EAAE,EAAE;QACb,aAAa,EAAE,aAAa;KAC7B;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,KAAK;CACG,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAA4B;IAE5B,OAAO,CACL,oBAAoB,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAC7E,CAAC;AACJ,CAAC"}
@@ -14,4 +14,7 @@ export declare const useAuthCommand: (settings: LoadedSettings, config: Config,
14
14
  onAuthError: (error: string | null) => void;
15
15
  apiKeyDefaultValue: string | undefined;
16
16
  reloadApiKey: () => Promise<string>;
17
+ reloadProviderApiKey: (provider: string) => Promise<string>;
18
+ selectedProvider: string | undefined;
19
+ setSelectedProvider: import("react").Dispatch<import("react").SetStateAction<string | undefined>>;
17
20
  };