@syntero/orca-cli 1.0.0 → 1.1.0

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 (111) hide show
  1. package/dist/assistant.d.ts +17 -3
  2. package/dist/assistant.d.ts.map +1 -1
  3. package/dist/assistant.js +217 -22
  4. package/dist/assistant.js.map +1 -1
  5. package/dist/auth.d.ts +97 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +438 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/autocomplete.d.ts +24 -0
  10. package/dist/autocomplete.d.ts.map +1 -0
  11. package/dist/autocomplete.js +43 -0
  12. package/dist/autocomplete.js.map +1 -0
  13. package/dist/components/ChatApp.d.ts +32 -0
  14. package/dist/components/ChatApp.d.ts.map +1 -0
  15. package/dist/components/ChatApp.js +470 -0
  16. package/dist/components/ChatApp.js.map +1 -0
  17. package/dist/components/CommandPalette.d.ts +15 -0
  18. package/dist/components/CommandPalette.d.ts.map +1 -0
  19. package/dist/components/CommandPalette.js +22 -0
  20. package/dist/components/CommandPalette.js.map +1 -0
  21. package/dist/components/ConfigWizard.d.ts +25 -0
  22. package/dist/components/ConfigWizard.d.ts.map +1 -0
  23. package/dist/components/ConfigWizard.js +401 -0
  24. package/dist/components/ConfigWizard.js.map +1 -0
  25. package/dist/components/InputFooter.d.ts +33 -0
  26. package/dist/components/InputFooter.d.ts.map +1 -0
  27. package/dist/components/InputFooter.js +618 -0
  28. package/dist/components/InputFooter.js.map +1 -0
  29. package/dist/components/InputModal.d.ts +25 -0
  30. package/dist/components/InputModal.d.ts.map +1 -0
  31. package/dist/components/InputModal.js +529 -0
  32. package/dist/components/InputModal.js.map +1 -0
  33. package/dist/components/ModelMenu.d.ts +24 -0
  34. package/dist/components/ModelMenu.d.ts.map +1 -0
  35. package/dist/components/ModelMenu.js +175 -0
  36. package/dist/components/ModelMenu.js.map +1 -0
  37. package/dist/components/ProviderMenu.d.ts +20 -0
  38. package/dist/components/ProviderMenu.d.ts.map +1 -0
  39. package/dist/components/ProviderMenu.js +31 -0
  40. package/dist/components/ProviderMenu.js.map +1 -0
  41. package/dist/components/SyncMenu.d.ts +23 -0
  42. package/dist/components/SyncMenu.d.ts.map +1 -0
  43. package/dist/components/SyncMenu.js +135 -0
  44. package/dist/components/SyncMenu.js.map +1 -0
  45. package/dist/components/TokenInput.d.ts +15 -0
  46. package/dist/components/TokenInput.d.ts.map +1 -0
  47. package/dist/components/TokenInput.js +103 -0
  48. package/dist/components/TokenInput.js.map +1 -0
  49. package/dist/index.js +323 -173
  50. package/dist/index.js.map +1 -1
  51. package/dist/ink-input.d.ts +14 -0
  52. package/dist/ink-input.d.ts.map +1 -0
  53. package/dist/ink-input.js +92 -0
  54. package/dist/ink-input.js.map +1 -0
  55. package/dist/models.d.ts +115 -0
  56. package/dist/models.d.ts.map +1 -0
  57. package/dist/models.js +221 -0
  58. package/dist/models.js.map +1 -0
  59. package/dist/providers.d.ts +19 -4
  60. package/dist/providers.d.ts.map +1 -1
  61. package/dist/providers.js +80 -112
  62. package/dist/providers.js.map +1 -1
  63. package/dist/settings.d.ts +15 -0
  64. package/dist/settings.d.ts.map +1 -1
  65. package/dist/settings.js +56 -21
  66. package/dist/settings.js.map +1 -1
  67. package/dist/sync/docker.d.ts +68 -0
  68. package/dist/sync/docker.d.ts.map +1 -0
  69. package/dist/sync/docker.js +234 -0
  70. package/dist/sync/docker.js.map +1 -0
  71. package/dist/sync/download.d.ts +87 -0
  72. package/dist/sync/download.d.ts.map +1 -0
  73. package/dist/sync/download.js +291 -0
  74. package/dist/sync/download.js.map +1 -0
  75. package/dist/sync/hash.d.ts +60 -0
  76. package/dist/sync/hash.d.ts.map +1 -0
  77. package/dist/sync/hash.js +92 -0
  78. package/dist/sync/hash.js.map +1 -0
  79. package/dist/sync/index.d.ts +15 -0
  80. package/dist/sync/index.d.ts.map +1 -0
  81. package/dist/sync/index.js +21 -0
  82. package/dist/sync/index.js.map +1 -0
  83. package/dist/sync/manifest.d.ts +132 -0
  84. package/dist/sync/manifest.d.ts.map +1 -0
  85. package/dist/sync/manifest.js +260 -0
  86. package/dist/sync/manifest.js.map +1 -0
  87. package/dist/sync/progress.d.ts +164 -0
  88. package/dist/sync/progress.d.ts.map +1 -0
  89. package/dist/sync/progress.js +233 -0
  90. package/dist/sync/progress.js.map +1 -0
  91. package/dist/sync/services.d.ts +70 -0
  92. package/dist/sync/services.d.ts.map +1 -0
  93. package/dist/sync/services.js +134 -0
  94. package/dist/sync/services.js.map +1 -0
  95. package/dist/sync/sync-engine.d.ts +69 -0
  96. package/dist/sync/sync-engine.d.ts.map +1 -0
  97. package/dist/sync/sync-engine.js +533 -0
  98. package/dist/sync/sync-engine.js.map +1 -0
  99. package/dist/tokens.d.ts +70 -0
  100. package/dist/tokens.d.ts.map +1 -0
  101. package/dist/tokens.js +198 -0
  102. package/dist/tokens.js.map +1 -0
  103. package/dist/tools.d.ts +60 -0
  104. package/dist/tools.d.ts.map +1 -1
  105. package/dist/tools.js +34 -0
  106. package/dist/tools.js.map +1 -1
  107. package/dist/types/sync.d.ts +284 -0
  108. package/dist/types/sync.d.ts.map +1 -0
  109. package/dist/types/sync.js +5 -0
  110. package/dist/types/sync.js.map +1 -0
  111. package/package.json +10 -2
@@ -0,0 +1,14 @@
1
+ import { Settings } from './settings.js';
2
+ export interface PromptWithInkOptions {
3
+ label?: string;
4
+ settings?: Settings;
5
+ history?: string[];
6
+ }
7
+ /**
8
+ * Prompt user for input using an Ink-based multi-line input box.
9
+ *
10
+ * @param options - Options for the prompt
11
+ * @returns Promise that resolves with the user's input text
12
+ */
13
+ export declare function promptWithInk(options?: PromptWithInkOptions | string): Promise<string>;
14
+ //# sourceMappingURL=ink-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ink-input.d.ts","sourceRoot":"","sources":["../src/ink-input.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAoB,GAAG,MAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAqGnG"}
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from 'ink';
3
+ import { InputModal } from './components/InputModal.js';
4
+ import { Colors, color } from './utils.js';
5
+ /**
6
+ * Prompt user for input using an Ink-based multi-line input box.
7
+ *
8
+ * @param options - Options for the prompt
9
+ * @returns Promise that resolves with the user's input text
10
+ */
11
+ export async function promptWithInk(options = 'You') {
12
+ // Support old signature: promptWithInk(label: string)
13
+ const opts = typeof options === 'string' ? { label: options } : options;
14
+ const label = opts.label || 'You';
15
+ const settings = opts.settings;
16
+ const history = opts.history || [];
17
+ return new Promise((resolve, reject) => {
18
+ let instance = null;
19
+ let resolved = false;
20
+ const handleSubmit = (value) => {
21
+ if (resolved)
22
+ return;
23
+ resolved = true;
24
+ // Clear the terminal output and unmount the Ink app
25
+ if (instance) {
26
+ instance.clear();
27
+ instance.unmount();
28
+ }
29
+ // Restore stdin to canonical mode (Ink leaves it in raw mode)
30
+ // This is required for readline to work properly in subsequent commands
31
+ if (process.stdin.isTTY) {
32
+ process.stdin.setRawMode(false);
33
+ }
34
+ // Show a summary of what was entered (like the old implementation)
35
+ if (value) {
36
+ const firstLine = value.split('\n')[0];
37
+ const hasMoreLines = value.includes('\n');
38
+ console.log(`${color(label + ':', Colors.green)} ${firstLine}${hasMoreLines ? '...' : ''}`);
39
+ }
40
+ resolve(value);
41
+ };
42
+ const handleExit = () => {
43
+ if (resolved)
44
+ return;
45
+ resolved = true;
46
+ // Clear the terminal output and unmount
47
+ if (instance) {
48
+ instance.clear();
49
+ instance.unmount();
50
+ }
51
+ // Restore stdin to canonical mode
52
+ if (process.stdin.isTTY) {
53
+ process.stdin.setRawMode(false);
54
+ }
55
+ // Exit gracefully
56
+ console.log('\nGoodbye!');
57
+ process.exit(0);
58
+ };
59
+ try {
60
+ // Render the Ink component
61
+ instance = render(_jsx(InputModal, { label: label, onSubmit: handleSubmit, settings: settings, history: history }), {
62
+ exitOnCtrlC: false, // We handle Ctrl+C ourselves
63
+ });
64
+ // Handle process exit signals
65
+ const cleanup = () => {
66
+ if (!resolved) {
67
+ handleExit();
68
+ }
69
+ };
70
+ process.once('SIGINT', cleanup);
71
+ process.once('SIGTERM', cleanup);
72
+ // Wait for the instance to exit
73
+ instance.waitUntilExit().then(() => {
74
+ process.removeListener('SIGINT', cleanup);
75
+ process.removeListener('SIGTERM', cleanup);
76
+ // If not resolved yet (user pressed Ctrl+C in Ink), exit
77
+ if (!resolved) {
78
+ handleExit();
79
+ }
80
+ }).catch((err) => {
81
+ if (!resolved) {
82
+ resolved = true;
83
+ reject(err);
84
+ }
85
+ });
86
+ }
87
+ catch (err) {
88
+ reject(err);
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=ink-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ink-input.js","sourceRoot":"","sources":["../src/ink-input.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Model configuration with capabilities and attributes.
3
+ * TypeScript port of backend/mcp/config/model_config.py
4
+ */
5
+ /**
6
+ * Configuration for an AI model with its capabilities.
7
+ */
8
+ export interface ModelConfig {
9
+ /** Unique identifier for the model */
10
+ id: string;
11
+ /** API name for the model */
12
+ name: string;
13
+ /** Human-readable display name */
14
+ displayName: string;
15
+ /** Category: 'large' or 'small' */
16
+ category: 'large' | 'small';
17
+ /** Icon: 'brain', 'zap', or 'cloud' */
18
+ icon: 'brain' | 'zap' | 'cloud';
19
+ /** Whether the model supports thinking mode */
20
+ supportsThinking: boolean;
21
+ /** Maximum output tokens */
22
+ maxTokens: number;
23
+ /** Human-readable description */
24
+ description: string;
25
+ /** Provider: 'anthropic', 'openai', or 'azure' */
26
+ provider: 'anthropic' | 'openai' | 'azure';
27
+ /** Parameter name for max tokens ('max_tokens' or 'max_completion_tokens') */
28
+ maxTokensParam: 'max_tokens' | 'max_completion_tokens';
29
+ /** Whether the model supports custom temperature values */
30
+ supportsTemperature: boolean;
31
+ /** Context window size in tokens */
32
+ contextWindow: number;
33
+ }
34
+ /**
35
+ * Registry of available models and their configurations.
36
+ */
37
+ export declare class ModelRegistry {
38
+ /**
39
+ * All available models with their configurations.
40
+ * Exactly 6 models: 2 per provider (large + small).
41
+ */
42
+ static readonly ALL_MODELS: Record<string, ModelConfig>;
43
+ /**
44
+ * Get model configuration by ID.
45
+ * @param modelId - The model ID to look up
46
+ * @returns The model configuration, or undefined if not found
47
+ */
48
+ static getModel(modelId: string): ModelConfig | undefined;
49
+ /**
50
+ * Get all models for a specific provider.
51
+ * @param provider - The provider name ('anthropic', 'openai', 'azure')
52
+ * @returns Array of model configurations for that provider
53
+ */
54
+ static getModelsForProvider(provider: string): ModelConfig[];
55
+ /**
56
+ * Get all available models.
57
+ * @returns Array of all model configurations
58
+ */
59
+ static getAllModels(): ModelConfig[];
60
+ /**
61
+ * Get the max tokens parameter name for a model.
62
+ * @param modelId - The model ID
63
+ * @returns 'max_tokens' or 'max_completion_tokens'
64
+ */
65
+ static getMaxTokensParam(modelId: string): 'max_tokens' | 'max_completion_tokens';
66
+ /**
67
+ * Get the maximum output tokens for a model.
68
+ * @param modelId - The model ID
69
+ * @returns The max tokens value
70
+ */
71
+ static getMaxTokens(modelId: string): number;
72
+ /**
73
+ * Check if a model supports thinking mode.
74
+ * @param modelId - The model ID
75
+ * @returns True if the model supports thinking
76
+ */
77
+ static supportsThinking(modelId: string): boolean;
78
+ /**
79
+ * Check if a model supports custom temperature.
80
+ * @param modelId - The model ID
81
+ * @returns True if the model supports temperature
82
+ */
83
+ static supportsTemperature(modelId: string): boolean;
84
+ /**
85
+ * Get the default model for a provider.
86
+ * @param provider - The provider name
87
+ * @returns The default (large) model ID for that provider
88
+ */
89
+ static getDefaultModel(provider: string): string;
90
+ /**
91
+ * Get the context window size for a model.
92
+ * @param modelId - The model ID
93
+ * @returns The context window size in tokens
94
+ */
95
+ static getContextWindow(modelId: string): number;
96
+ /**
97
+ * Get the provider for a model ID.
98
+ * @param modelId - The model ID
99
+ * @returns The provider name, or 'anthropic' as fallback
100
+ */
101
+ static getProvider(modelId: string): string;
102
+ /**
103
+ * Check if a model ID is an Azure model.
104
+ * @param modelId - The model ID
105
+ * @returns True if it's an Azure model
106
+ */
107
+ static isAzureModel(modelId: string): boolean;
108
+ /**
109
+ * Get models as array of [id, description] tuples for compatibility.
110
+ * @param provider - The provider name
111
+ * @returns Array of [id, description] tuples
112
+ */
113
+ static getModelsAsTuples(provider: string): Array<[string, string]>;
114
+ }
115
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,uCAAuC;IACvC,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;IAChC,+CAA+C;IAC/C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC3C,8EAA8E;IAC9E,cAAc,EAAE,YAAY,GAAG,uBAAuB,CAAC;IACvD,2DAA2D;IAC3D,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAwFrD;IAEF;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIzD;;;;OAIG;IACH,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE;IAM5D;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,WAAW,EAAE;IAIpC;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,uBAAuB;IAKjF;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAK5C;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKjD;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKpD;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQhD;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAKhD;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAe3C;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAMpE"}
package/dist/models.js ADDED
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Model configuration with capabilities and attributes.
3
+ * TypeScript port of backend/mcp/config/model_config.py
4
+ */
5
+ /**
6
+ * Registry of available models and their configurations.
7
+ */
8
+ export class ModelRegistry {
9
+ /**
10
+ * All available models with their configurations.
11
+ * Exactly 6 models: 2 per provider (large + small).
12
+ */
13
+ static ALL_MODELS = {
14
+ // Anthropic Models
15
+ 'claude-opus-4-5': {
16
+ id: 'claude-opus-4-5',
17
+ name: 'claude-opus-4-5',
18
+ displayName: 'Claude Opus 4.5',
19
+ category: 'large',
20
+ icon: 'brain',
21
+ supportsThinking: true,
22
+ maxTokens: 16384,
23
+ description: 'Most capable Anthropic model with advanced reasoning',
24
+ provider: 'anthropic',
25
+ maxTokensParam: 'max_tokens',
26
+ supportsTemperature: true,
27
+ contextWindow: 200000,
28
+ },
29
+ 'claude-haiku-4-5-20251001': {
30
+ id: 'claude-haiku-4-5-20251001',
31
+ name: 'claude-haiku-4-5-20251001',
32
+ displayName: 'Claude Haiku 4.5',
33
+ category: 'small',
34
+ icon: 'zap',
35
+ supportsThinking: false,
36
+ maxTokens: 8192,
37
+ description: 'Fast and efficient Anthropic model',
38
+ provider: 'anthropic',
39
+ maxTokensParam: 'max_tokens',
40
+ supportsTemperature: true,
41
+ contextWindow: 200000,
42
+ },
43
+ // OpenAI Models
44
+ 'gpt-5.2': {
45
+ id: 'gpt-5.2',
46
+ name: 'gpt-5.2',
47
+ displayName: 'GPT-5.2',
48
+ category: 'large',
49
+ icon: 'brain',
50
+ supportsThinking: false,
51
+ maxTokens: 8192,
52
+ description: 'Most capable OpenAI model (requires verified org for streaming)',
53
+ provider: 'openai',
54
+ maxTokensParam: 'max_completion_tokens',
55
+ supportsTemperature: true,
56
+ contextWindow: 200000,
57
+ },
58
+ 'gpt-5-mini': {
59
+ id: 'gpt-5-mini',
60
+ name: 'gpt-5-mini',
61
+ displayName: 'GPT-5 Mini',
62
+ category: 'small',
63
+ icon: 'zap',
64
+ supportsThinking: false,
65
+ maxTokens: 4096,
66
+ description: 'Fast and efficient OpenAI model (requires verified org for streaming)',
67
+ provider: 'openai',
68
+ maxTokensParam: 'max_completion_tokens',
69
+ supportsTemperature: false,
70
+ contextWindow: 128000,
71
+ },
72
+ // Azure OpenAI Models (via AI Foundry)
73
+ 'azure-large': {
74
+ id: 'azure-large',
75
+ name: 'azure-large',
76
+ displayName: 'Azure OpenAI (Large)',
77
+ category: 'large',
78
+ icon: 'cloud',
79
+ supportsThinking: false,
80
+ maxTokens: 8192,
81
+ description: 'Azure AI Foundry - Large deployment',
82
+ provider: 'azure',
83
+ maxTokensParam: 'max_completion_tokens',
84
+ supportsTemperature: true,
85
+ contextWindow: 128000,
86
+ },
87
+ 'azure-small': {
88
+ id: 'azure-small',
89
+ name: 'azure-small',
90
+ displayName: 'Azure OpenAI (Small)',
91
+ category: 'small',
92
+ icon: 'cloud',
93
+ supportsThinking: false,
94
+ maxTokens: 4096,
95
+ description: 'Azure AI Foundry - Small deployment',
96
+ provider: 'azure',
97
+ maxTokensParam: 'max_completion_tokens',
98
+ supportsTemperature: true,
99
+ contextWindow: 128000,
100
+ },
101
+ };
102
+ /**
103
+ * Get model configuration by ID.
104
+ * @param modelId - The model ID to look up
105
+ * @returns The model configuration, or undefined if not found
106
+ */
107
+ static getModel(modelId) {
108
+ return this.ALL_MODELS[modelId];
109
+ }
110
+ /**
111
+ * Get all models for a specific provider.
112
+ * @param provider - The provider name ('anthropic', 'openai', 'azure')
113
+ * @returns Array of model configurations for that provider
114
+ */
115
+ static getModelsForProvider(provider) {
116
+ return Object.values(this.ALL_MODELS).filter((model) => model.provider === provider.toLowerCase());
117
+ }
118
+ /**
119
+ * Get all available models.
120
+ * @returns Array of all model configurations
121
+ */
122
+ static getAllModels() {
123
+ return Object.values(this.ALL_MODELS);
124
+ }
125
+ /**
126
+ * Get the max tokens parameter name for a model.
127
+ * @param modelId - The model ID
128
+ * @returns 'max_tokens' or 'max_completion_tokens'
129
+ */
130
+ static getMaxTokensParam(modelId) {
131
+ const model = this.getModel(modelId);
132
+ return model?.maxTokensParam ?? 'max_tokens';
133
+ }
134
+ /**
135
+ * Get the maximum output tokens for a model.
136
+ * @param modelId - The model ID
137
+ * @returns The max tokens value
138
+ */
139
+ static getMaxTokens(modelId) {
140
+ const model = this.getModel(modelId);
141
+ return model?.maxTokens ?? 8192;
142
+ }
143
+ /**
144
+ * Check if a model supports thinking mode.
145
+ * @param modelId - The model ID
146
+ * @returns True if the model supports thinking
147
+ */
148
+ static supportsThinking(modelId) {
149
+ const model = this.getModel(modelId);
150
+ return model?.supportsThinking ?? false;
151
+ }
152
+ /**
153
+ * Check if a model supports custom temperature.
154
+ * @param modelId - The model ID
155
+ * @returns True if the model supports temperature
156
+ */
157
+ static supportsTemperature(modelId) {
158
+ const model = this.getModel(modelId);
159
+ return model?.supportsTemperature ?? true;
160
+ }
161
+ /**
162
+ * Get the default model for a provider.
163
+ * @param provider - The provider name
164
+ * @returns The default (large) model ID for that provider
165
+ */
166
+ static getDefaultModel(provider) {
167
+ const providerLower = provider.toLowerCase();
168
+ const models = this.getModelsForProvider(providerLower);
169
+ // Prefer large model as default
170
+ const largeModel = models.find((m) => m.category === 'large');
171
+ return largeModel?.id ?? models[0]?.id ?? '';
172
+ }
173
+ /**
174
+ * Get the context window size for a model.
175
+ * @param modelId - The model ID
176
+ * @returns The context window size in tokens
177
+ */
178
+ static getContextWindow(modelId) {
179
+ const model = this.getModel(modelId);
180
+ return model?.contextWindow ?? 128000;
181
+ }
182
+ /**
183
+ * Get the provider for a model ID.
184
+ * @param modelId - The model ID
185
+ * @returns The provider name, or 'anthropic' as fallback
186
+ */
187
+ static getProvider(modelId) {
188
+ const model = this.getModel(modelId);
189
+ if (model) {
190
+ return model.provider;
191
+ }
192
+ // Fallback: detect provider from model ID pattern
193
+ if (modelId.startsWith('azure')) {
194
+ return 'azure';
195
+ }
196
+ if (modelId.startsWith('gpt')) {
197
+ return 'openai';
198
+ }
199
+ return 'anthropic';
200
+ }
201
+ /**
202
+ * Check if a model ID is an Azure model.
203
+ * @param modelId - The model ID
204
+ * @returns True if it's an Azure model
205
+ */
206
+ static isAzureModel(modelId) {
207
+ return modelId.startsWith('azure-');
208
+ }
209
+ /**
210
+ * Get models as array of [id, description] tuples for compatibility.
211
+ * @param provider - The provider name
212
+ * @returns Array of [id, description] tuples
213
+ */
214
+ static getModelsAsTuples(provider) {
215
+ return this.getModelsForProvider(provider).map((model) => [
216
+ model.id,
217
+ `${model.displayName} - ${model.description}`,
218
+ ]);
219
+ }
220
+ }
221
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,36 @@
1
1
  import Anthropic from '@anthropic-ai/sdk';
2
2
  import OpenAI, { AzureOpenAI } from 'openai';
3
3
  import { Settings } from './settings.js';
4
+ import type { LLMProviders } from './auth.js';
4
5
  export type LLMClient = Anthropic | OpenAI | AzureOpenAI;
5
6
  /**
6
7
  * Create the appropriate LLM client based on settings.
7
8
  */
8
9
  export declare function createLLMClient(settings: Settings): LLMClient;
9
10
  /**
10
- * Fetch available models from OpenAI API.
11
+ * Create a DIRECT LLM client using credentials from cloud config.
12
+ * Makes API calls directly to Anthropic/OpenAI/Azure, not through the backend.
13
+ *
14
+ * @param providerName - The provider to use ('anthropic', 'openai', 'azure')
15
+ * @param llmConfig - The full LLM providers config from cloud credentials
16
+ * @param useSmallModel - For Azure, whether to use the small deployment (default: false)
11
17
  */
12
- export declare function fetchOpenAIModels(apiKey: string): Promise<Array<[string, string]>>;
18
+ export declare function createClientFromCloudConfig(providerName: string, llmConfig: LLMProviders, useSmallModel?: boolean): LLMClient;
19
+ /**
20
+ * Get the model/deployment name for the selected cloud provider.
21
+ * Model selection is handled locally via settings, not from backend.
22
+ */
23
+ export declare function getCloudModel(providerName: string, _llmConfig: LLMProviders, // Unused - kept for API compatibility
24
+ useSmallModel?: boolean): string;
13
25
  /**
14
- * List available models for all providers.
26
+ * Fetch available models from OpenAI API.
27
+ * @deprecated Use ModelRegistry.getModelsAsTuples('openai') instead.
28
+ * This function is kept for backward compatibility but now returns the fixed registry list.
15
29
  */
16
- export declare function listAvailableModels(settings: Settings): Promise<string>;
30
+ export declare function fetchOpenAIModels(apiKey: string): Promise<Array<[string, string]>>;
17
31
  /**
18
32
  * Interactive model selection for a provider.
33
+ * Now uses ModelRegistry for all providers including Azure.
19
34
  */
20
35
  export declare function selectModel(provider: string, current: string, apiKey?: string): Promise<string>;
21
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAwC,MAAM,eAAe,CAAC;AAI/E,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAEzD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAgB7D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CA0CxF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC7E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAiFjB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/F"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAA0B,MAAM,eAAe,CAAC;AAGjE,OAAO,KAAK,EAAE,YAAY,EAAuD,MAAM,WAAW,CAAC;AAGnG,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAEzD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAgB7D;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,YAAY,EACvB,aAAa,GAAE,OAAe,GAC7B,SAAS,CA4BX;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,YAAY,EAAG,sCAAsC;AACjE,aAAa,GAAE,OAAe,GAC7B,MAAM,CAeR;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAGxF;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAuEjB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/F"}