@teleforge-ai/anya 0.5.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 (200) hide show
  1. package/README.md +69 -0
  2. package/assets/anya.jpg +0 -0
  3. package/assets/anya.png +0 -0
  4. package/dist/chat/session.d.ts +15 -0
  5. package/dist/chat/session.d.ts.map +1 -0
  6. package/dist/chat/session.js +59 -0
  7. package/dist/chat/session.js.map +1 -0
  8. package/dist/chat/stream.d.ts +13 -0
  9. package/dist/chat/stream.d.ts.map +1 -0
  10. package/dist/chat/stream.js +86 -0
  11. package/dist/chat/stream.js.map +1 -0
  12. package/dist/commands/providerFactory.d.ts +12 -0
  13. package/dist/commands/providerFactory.d.ts.map +1 -0
  14. package/dist/commands/providerFactory.js +73 -0
  15. package/dist/commands/providerFactory.js.map +1 -0
  16. package/dist/config/encryption.d.ts +3 -0
  17. package/dist/config/encryption.d.ts.map +1 -0
  18. package/dist/config/encryption.js +47 -0
  19. package/dist/config/encryption.js.map +1 -0
  20. package/dist/config/schema.d.ts +94 -0
  21. package/dist/config/schema.d.ts.map +1 -0
  22. package/dist/config/schema.js +28 -0
  23. package/dist/config/schema.js.map +1 -0
  24. package/dist/config/store.d.ts +40 -0
  25. package/dist/config/store.d.ts.map +1 -0
  26. package/dist/config/store.js +195 -0
  27. package/dist/config/store.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +97 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/providers/anthropic.d.ts +10 -0
  33. package/dist/providers/anthropic.d.ts.map +1 -0
  34. package/dist/providers/anthropic.js +128 -0
  35. package/dist/providers/anthropic.js.map +1 -0
  36. package/dist/providers/base.d.ts +39 -0
  37. package/dist/providers/base.d.ts.map +1 -0
  38. package/dist/providers/base.js +28 -0
  39. package/dist/providers/base.js.map +1 -0
  40. package/dist/providers/custom.d.ts +11 -0
  41. package/dist/providers/custom.d.ts.map +1 -0
  42. package/dist/providers/custom.js +90 -0
  43. package/dist/providers/custom.js.map +1 -0
  44. package/dist/providers/deepseek.d.ts +10 -0
  45. package/dist/providers/deepseek.d.ts.map +1 -0
  46. package/dist/providers/deepseek.js +88 -0
  47. package/dist/providers/deepseek.js.map +1 -0
  48. package/dist/providers/google.d.ts +10 -0
  49. package/dist/providers/google.d.ts.map +1 -0
  50. package/dist/providers/google.js +131 -0
  51. package/dist/providers/google.js.map +1 -0
  52. package/dist/providers/groq.d.ts +10 -0
  53. package/dist/providers/groq.d.ts.map +1 -0
  54. package/dist/providers/groq.js +88 -0
  55. package/dist/providers/groq.js.map +1 -0
  56. package/dist/providers/index.d.ts +10 -0
  57. package/dist/providers/index.d.ts.map +1 -0
  58. package/dist/providers/index.js +39 -0
  59. package/dist/providers/index.js.map +1 -0
  60. package/dist/providers/mistral.d.ts +10 -0
  61. package/dist/providers/mistral.d.ts.map +1 -0
  62. package/dist/providers/mistral.js +88 -0
  63. package/dist/providers/mistral.js.map +1 -0
  64. package/dist/providers/ollama.d.ts +11 -0
  65. package/dist/providers/ollama.d.ts.map +1 -0
  66. package/dist/providers/ollama.js +82 -0
  67. package/dist/providers/ollama.js.map +1 -0
  68. package/dist/providers/openai.d.ts +10 -0
  69. package/dist/providers/openai.d.ts.map +1 -0
  70. package/dist/providers/openai.js +127 -0
  71. package/dist/providers/openai.js.map +1 -0
  72. package/dist/providers/opencode.d.ts +11 -0
  73. package/dist/providers/opencode.d.ts.map +1 -0
  74. package/dist/providers/opencode.js +99 -0
  75. package/dist/providers/opencode.js.map +1 -0
  76. package/dist/providers/openrouter.d.ts +10 -0
  77. package/dist/providers/openrouter.d.ts.map +1 -0
  78. package/dist/providers/openrouter.js +119 -0
  79. package/dist/providers/openrouter.js.map +1 -0
  80. package/dist/providers/together.d.ts +10 -0
  81. package/dist/providers/together.d.ts.map +1 -0
  82. package/dist/providers/together.js +88 -0
  83. package/dist/providers/together.js.map +1 -0
  84. package/dist/providers/xai.d.ts +10 -0
  85. package/dist/providers/xai.d.ts.map +1 -0
  86. package/dist/providers/xai.js +88 -0
  87. package/dist/providers/xai.js.map +1 -0
  88. package/dist/tui/ansi.d.ts +49 -0
  89. package/dist/tui/ansi.d.ts.map +1 -0
  90. package/dist/tui/ansi.js +208 -0
  91. package/dist/tui/ansi.js.map +1 -0
  92. package/dist/tui/components/anyaArt.d.ts +2 -0
  93. package/dist/tui/components/anyaArt.d.ts.map +1 -0
  94. package/dist/tui/components/anyaArt.js +20 -0
  95. package/dist/tui/components/anyaArt.js.map +1 -0
  96. package/dist/tui/components/dialog.d.ts +15 -0
  97. package/dist/tui/components/dialog.d.ts.map +1 -0
  98. package/dist/tui/components/dialog.js +115 -0
  99. package/dist/tui/components/dialog.js.map +1 -0
  100. package/dist/tui/components/messages.d.ts +10 -0
  101. package/dist/tui/components/messages.d.ts.map +1 -0
  102. package/dist/tui/components/messages.js +100 -0
  103. package/dist/tui/components/messages.js.map +1 -0
  104. package/dist/tui/render.d.ts +3 -0
  105. package/dist/tui/render.d.ts.map +1 -0
  106. package/dist/tui/render.js +137 -0
  107. package/dist/tui/render.js.map +1 -0
  108. package/dist/tui/screen.d.ts +19 -0
  109. package/dist/tui/screen.d.ts.map +1 -0
  110. package/dist/tui/screen.js +98 -0
  111. package/dist/tui/screen.js.map +1 -0
  112. package/dist/tui/state.d.ts +41 -0
  113. package/dist/tui/state.d.ts.map +1 -0
  114. package/dist/tui/state.js +306 -0
  115. package/dist/tui/state.js.map +1 -0
  116. package/dist/ui/App.d.ts +3 -0
  117. package/dist/ui/App.d.ts.map +1 -0
  118. package/dist/ui/App.js +207 -0
  119. package/dist/ui/App.js.map +1 -0
  120. package/dist/ui/components/CommandPalette.d.ts +8 -0
  121. package/dist/ui/components/CommandPalette.d.ts.map +1 -0
  122. package/dist/ui/components/CommandPalette.js +63 -0
  123. package/dist/ui/components/CommandPalette.js.map +1 -0
  124. package/dist/ui/components/HomeScreen.d.ts +8 -0
  125. package/dist/ui/components/HomeScreen.d.ts.map +1 -0
  126. package/dist/ui/components/HomeScreen.js +29 -0
  127. package/dist/ui/components/HomeScreen.js.map +1 -0
  128. package/dist/ui/components/ImageRenderer.d.ts +8 -0
  129. package/dist/ui/components/ImageRenderer.d.ts.map +1 -0
  130. package/dist/ui/components/ImageRenderer.js +42 -0
  131. package/dist/ui/components/ImageRenderer.js.map +1 -0
  132. package/dist/ui/components/InputBox.d.ts +12 -0
  133. package/dist/ui/components/InputBox.d.ts.map +1 -0
  134. package/dist/ui/components/InputBox.js +96 -0
  135. package/dist/ui/components/InputBox.js.map +1 -0
  136. package/dist/ui/components/MessageList.d.ts +13 -0
  137. package/dist/ui/components/MessageList.d.ts.map +1 -0
  138. package/dist/ui/components/MessageList.js +10 -0
  139. package/dist/ui/components/MessageList.js.map +1 -0
  140. package/dist/ui/components/ModelSelector.d.ts +9 -0
  141. package/dist/ui/components/ModelSelector.d.ts.map +1 -0
  142. package/dist/ui/components/ModelSelector.js +77 -0
  143. package/dist/ui/components/ModelSelector.js.map +1 -0
  144. package/dist/ui/components/ProviderForm.d.ts +8 -0
  145. package/dist/ui/components/ProviderForm.d.ts.map +1 -0
  146. package/dist/ui/components/ProviderForm.js +88 -0
  147. package/dist/ui/components/ProviderForm.js.map +1 -0
  148. package/dist/ui/components/SettingsPanel.d.ts +7 -0
  149. package/dist/ui/components/SettingsPanel.d.ts.map +1 -0
  150. package/dist/ui/components/SettingsPanel.js +87 -0
  151. package/dist/ui/components/SettingsPanel.js.map +1 -0
  152. package/dist/ui/components/StatusBar.d.ts +8 -0
  153. package/dist/ui/components/StatusBar.d.ts.map +1 -0
  154. package/dist/ui/components/StatusBar.js +15 -0
  155. package/dist/ui/components/StatusBar.js.map +1 -0
  156. package/dist/ui/components/StatusDashboard.d.ts +7 -0
  157. package/dist/ui/components/StatusDashboard.d.ts.map +1 -0
  158. package/dist/ui/components/StatusDashboard.js +29 -0
  159. package/dist/ui/components/StatusDashboard.js.map +1 -0
  160. package/dist/ui/components/TitleBar.d.ts +8 -0
  161. package/dist/ui/components/TitleBar.d.ts.map +1 -0
  162. package/dist/ui/components/TitleBar.js +7 -0
  163. package/dist/ui/components/TitleBar.js.map +1 -0
  164. package/dist/ui/hooks/useConfig.d.ts +28 -0
  165. package/dist/ui/hooks/useConfig.d.ts.map +1 -0
  166. package/dist/ui/hooks/useConfig.js +20 -0
  167. package/dist/ui/hooks/useConfig.js.map +1 -0
  168. package/dist/ui/hooks/useModels.d.ts +10 -0
  169. package/dist/ui/hooks/useModels.d.ts.map +1 -0
  170. package/dist/ui/hooks/useModels.js +30 -0
  171. package/dist/ui/hooks/useModels.js.map +1 -0
  172. package/dist/ui/hooks/useProviders.d.ts +18 -0
  173. package/dist/ui/hooks/useProviders.d.ts.map +1 -0
  174. package/dist/ui/hooks/useProviders.js +56 -0
  175. package/dist/ui/hooks/useProviders.js.map +1 -0
  176. package/dist/ui/theme.d.ts +22 -0
  177. package/dist/ui/theme.d.ts.map +1 -0
  178. package/dist/ui/theme.js +99 -0
  179. package/dist/ui/theme.js.map +1 -0
  180. package/dist/utils/fuzzysearch.d.ts +8 -0
  181. package/dist/utils/fuzzysearch.d.ts.map +1 -0
  182. package/dist/utils/fuzzysearch.js +19 -0
  183. package/dist/utils/fuzzysearch.js.map +1 -0
  184. package/dist/utils/image.d.ts +8 -0
  185. package/dist/utils/image.d.ts.map +1 -0
  186. package/dist/utils/image.js +63 -0
  187. package/dist/utils/image.js.map +1 -0
  188. package/dist/utils/json.d.ts +2 -0
  189. package/dist/utils/json.d.ts.map +1 -0
  190. package/dist/utils/json.js +9 -0
  191. package/dist/utils/json.js.map +1 -0
  192. package/dist/utils/logger.d.ts +19 -0
  193. package/dist/utils/logger.d.ts.map +1 -0
  194. package/dist/utils/logger.js +23 -0
  195. package/dist/utils/logger.js.map +1 -0
  196. package/dist/utils/terminal.d.ts +11 -0
  197. package/dist/utils/terminal.d.ts.map +1 -0
  198. package/dist/utils/terminal.js +38 -0
  199. package/dist/utils/terminal.js.map +1 -0
  200. package/package.json +58 -0
@@ -0,0 +1,90 @@
1
+ import { AIProvider, ALL_PROVIDERS } from './base.js';
2
+ export class CustomProvider extends AIProvider {
3
+ constructor(apiKey, model, baseUrl) {
4
+ super(apiKey, model);
5
+ this.baseUrl = baseUrl || process.env.CUSTOM_API_URL || 'http://localhost:8080/v1';
6
+ }
7
+ get info() {
8
+ return ALL_PROVIDERS.find((p) => p.id === 'custom');
9
+ }
10
+ async validateApiKey() {
11
+ try {
12
+ const res = await fetch(`${this.baseUrl}/models`, {
13
+ headers: { Authorization: `Bearer ${this.apiKey}` },
14
+ signal: AbortSignal.timeout(5000)
15
+ });
16
+ return res.ok;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ async fetchModels() {
23
+ try {
24
+ const res = await fetch(`${this.baseUrl}/models`, {
25
+ headers: { Authorization: `Bearer ${this.apiKey}` },
26
+ signal: AbortSignal.timeout(5000)
27
+ });
28
+ if (!res.ok)
29
+ return [];
30
+ const data = await res.json();
31
+ return (data.data || []).map((m) => ({
32
+ id: m.id, name: m.id, provider: 'custom'
33
+ }));
34
+ }
35
+ catch {
36
+ return [];
37
+ }
38
+ }
39
+ async sendMessage(messages) {
40
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
41
+ method: 'POST',
42
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.apiKey}` },
43
+ body: JSON.stringify({ model: this.model, messages, stream: false })
44
+ });
45
+ if (!res.ok)
46
+ throw new Error(`Custom API: HTTP ${res.status}`);
47
+ const data = await res.json();
48
+ return data.choices?.[0]?.message?.content || '';
49
+ }
50
+ async *streamMessage(messages) {
51
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
52
+ method: 'POST',
53
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.apiKey}` },
54
+ body: JSON.stringify({ model: this.model, messages, stream: true })
55
+ });
56
+ if (!res.ok)
57
+ throw new Error(`Custom API: HTTP ${res.status}`);
58
+ const reader = res.body?.getReader();
59
+ if (!reader)
60
+ throw new Error('Custom API: No response body');
61
+ const decoder = new TextDecoder();
62
+ let buffer = '';
63
+ while (true) {
64
+ const { done, value } = await reader.read();
65
+ if (done)
66
+ break;
67
+ buffer += decoder.decode(value, { stream: true });
68
+ const lines = buffer.split('\n');
69
+ buffer = lines.pop() || '';
70
+ for (const line of lines) {
71
+ if (line.startsWith('data: ')) {
72
+ const data = line.slice(6).trim();
73
+ if (data === '[DONE]') {
74
+ yield { text: '', done: true };
75
+ return;
76
+ }
77
+ try {
78
+ const parsed = JSON.parse(data);
79
+ const content = parsed.choices?.[0]?.delta?.content;
80
+ if (content)
81
+ yield { text: content, done: false };
82
+ }
83
+ catch { }
84
+ }
85
+ }
86
+ }
87
+ yield { text: '', done: true };
88
+ }
89
+ }
90
+ //# sourceMappingURL=custom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/providers/custom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AIProvider, Message, StreamChunk, ModelInfo, ProviderInfo } from './base.js';
2
+ export declare class DeepSeekProvider extends AIProvider {
3
+ private baseUrl;
4
+ get info(): ProviderInfo;
5
+ validateApiKey(): Promise<boolean>;
6
+ fetchModels(): Promise<ModelInfo[]>;
7
+ sendMessage(messages: Message[]): Promise<string>;
8
+ streamMessage(messages: Message[]): AsyncGenerator<StreamChunk>;
9
+ }
10
+ //# sourceMappingURL=deepseek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../src/providers/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,YAAY,EAAE,MAAM,WAAW,CAAA;AAEpG,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,OAAO,CAAC,OAAO,CAAgC;IAE/C,IAAI,IAAI,IAAI,YAAY,CAEvB;IAEK,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IASlC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAanC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAWhD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC;CA+BvE"}
@@ -0,0 +1,88 @@
1
+ import { AIProvider, ALL_PROVIDERS } from './base.js';
2
+ export class DeepSeekProvider extends AIProvider {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.baseUrl = 'https://api.deepseek.com/v1';
6
+ }
7
+ get info() {
8
+ return ALL_PROVIDERS.find((p) => p.id === 'deepseek');
9
+ }
10
+ async validateApiKey() {
11
+ try {
12
+ const res = await fetch(`${this.baseUrl}/models`, {
13
+ headers: { Authorization: `Bearer ${this.apiKey}` }
14
+ });
15
+ return res.ok;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ async fetchModels() {
22
+ try {
23
+ const res = await fetch(`${this.baseUrl}/models`, {
24
+ headers: { Authorization: `Bearer ${this.apiKey}` }
25
+ });
26
+ if (!res.ok)
27
+ return [];
28
+ const data = await res.json();
29
+ return (data.data || []).map((m) => ({
30
+ id: m.id, name: m.id, provider: 'deepseek', contextLength: m.context_length || 128000
31
+ }));
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ async sendMessage(messages) {
38
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
39
+ method: 'POST',
40
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.apiKey}` },
41
+ body: JSON.stringify({ model: this.model, messages, stream: false })
42
+ });
43
+ if (!res.ok)
44
+ throw new Error(`DeepSeek: HTTP ${res.status}`);
45
+ const data = await res.json();
46
+ return data.choices?.[0]?.message?.content || '';
47
+ }
48
+ async *streamMessage(messages) {
49
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
50
+ method: 'POST',
51
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.apiKey}` },
52
+ body: JSON.stringify({ model: this.model, messages, stream: true, stream_options: { include_usage: false } })
53
+ });
54
+ if (!res.ok)
55
+ throw new Error(`DeepSeek: HTTP ${res.status}`);
56
+ const reader = res.body?.getReader();
57
+ if (!reader)
58
+ throw new Error('DeepSeek: No response body');
59
+ const decoder = new TextDecoder();
60
+ let buffer = '';
61
+ while (true) {
62
+ const { done, value } = await reader.read();
63
+ if (done)
64
+ break;
65
+ buffer += decoder.decode(value, { stream: true });
66
+ const lines = buffer.split('\n');
67
+ buffer = lines.pop() || '';
68
+ for (const line of lines) {
69
+ if (line.startsWith('data: ')) {
70
+ const data = line.slice(6).trim();
71
+ if (data === '[DONE]') {
72
+ yield { text: '', done: true };
73
+ return;
74
+ }
75
+ try {
76
+ const parsed = JSON.parse(data);
77
+ const content = parsed.choices?.[0]?.delta?.content;
78
+ if (content)
79
+ yield { text: content, done: false };
80
+ }
81
+ catch { }
82
+ }
83
+ }
84
+ }
85
+ yield { text: '', done: true };
86
+ }
87
+ }
88
+ //# sourceMappingURL=deepseek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/providers/deepseek.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AIProvider, Message, StreamChunk, ModelInfo, ProviderInfo } from './base.js';
2
+ export declare class GoogleProvider extends AIProvider {
3
+ private baseUrl;
4
+ get info(): ProviderInfo;
5
+ validateApiKey(): Promise<boolean>;
6
+ fetchModels(): Promise<ModelInfo[]>;
7
+ sendMessage(messages: Message[]): Promise<string>;
8
+ streamMessage(messages: Message[]): AsyncGenerator<StreamChunk>;
9
+ }
10
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAa,YAAY,EAAE,MAAM,WAAW,CAAA;AAEhG,qBAAa,cAAe,SAAQ,UAAU;IAC5C,OAAO,CAAC,OAAO,CAAqD;IAEpE,IAAI,IAAI,IAAI,YAAY,CAEvB;IAEK,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAWlC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBnC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuChD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC;CAmEvE"}
@@ -0,0 +1,131 @@
1
+ import { AIProvider, PROVIDERS } from './base.js';
2
+ export class GoogleProvider extends AIProvider {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.baseUrl = 'https://generativelanguage.googleapis.com/v1beta';
6
+ }
7
+ get info() {
8
+ return PROVIDERS.find((p) => p.id === 'google');
9
+ }
10
+ async validateApiKey() {
11
+ try {
12
+ const res = await fetch(`${this.baseUrl}/models/gemini-2.5-flash?key=${this.apiKey}`);
13
+ return res.ok;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ async fetchModels() {
20
+ try {
21
+ const res = await fetch(`${this.baseUrl}/models?key=${this.apiKey}`);
22
+ if (!res.ok)
23
+ throw new Error(`Google: HTTP ${res.status}`);
24
+ const data = await res.json();
25
+ return (data.models || [])
26
+ .filter((m) => m.name.includes('gemini'))
27
+ .map((m) => ({
28
+ id: m.name.replace('models/', ''),
29
+ name: m.displayName || m.name.replace('models/', ''),
30
+ provider: 'google',
31
+ contextLength: m.inputTokenLimit || m.outputTokenLimit
32
+ }));
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ }
38
+ async sendMessage(messages) {
39
+ const sysPrompt = messages.find((m) => m.role === 'system')?.content;
40
+ const chatMessages = messages.filter((m) => m.role !== 'system');
41
+ const body = {
42
+ contents: chatMessages.map(m => ({
43
+ role: m.role === 'assistant' ? 'model' : 'user',
44
+ parts: [{ text: m.content }]
45
+ })),
46
+ generationConfig: {
47
+ temperature: 0.7,
48
+ maxOutputTokens: 4096
49
+ }
50
+ };
51
+ if (sysPrompt) {
52
+ body.systemInstruction = { parts: [{ text: sysPrompt }] };
53
+ }
54
+ const res = await fetch(`${this.baseUrl}/models/${this.model}:generateContent?key=${this.apiKey}`, {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify(body)
58
+ });
59
+ if (!res.ok) {
60
+ const bodyText = await res.text();
61
+ if (res.status === 403)
62
+ throw new Error('Google: Invalid API key');
63
+ if (res.status === 429)
64
+ throw new Error('Google: Rate limited. Try again later.');
65
+ throw new Error(`Google: HTTP ${res.status} - ${bodyText}`);
66
+ }
67
+ const data = await res.json();
68
+ return data.candidates?.[0]?.content?.parts?.[0]?.text || '';
69
+ }
70
+ async *streamMessage(messages) {
71
+ const sysPrompt = messages.find((m) => m.role === 'system')?.content;
72
+ const chatMessages = messages.filter((m) => m.role !== 'system');
73
+ const body = {
74
+ contents: chatMessages.map(m => ({
75
+ role: m.role === 'assistant' ? 'model' : 'user',
76
+ parts: [{ text: m.content }]
77
+ })),
78
+ generationConfig: {
79
+ temperature: 0.7,
80
+ maxOutputTokens: 4096
81
+ }
82
+ };
83
+ if (sysPrompt) {
84
+ body.systemInstruction = { parts: [{ text: sysPrompt }] };
85
+ }
86
+ const res = await fetch(`${this.baseUrl}/models/${this.model}:streamGenerateContent?alt=sse&key=${this.apiKey}`, {
87
+ method: 'POST',
88
+ headers: { 'Content-Type': 'application/json' },
89
+ body: JSON.stringify(body)
90
+ });
91
+ if (!res.ok) {
92
+ const bodyText = await res.text();
93
+ if (res.status === 403)
94
+ throw new Error('Google: Invalid API key');
95
+ if (res.status === 429)
96
+ throw new Error('Google: Rate limited. Try again later.');
97
+ throw new Error(`Google: HTTP ${res.status}`);
98
+ }
99
+ const reader = res.body?.getReader();
100
+ if (!reader)
101
+ throw new Error('Google: No response body');
102
+ const decoder = new TextDecoder();
103
+ let buffer = '';
104
+ while (true) {
105
+ const { done, value } = await reader.read();
106
+ if (done)
107
+ break;
108
+ buffer += decoder.decode(value, { stream: true });
109
+ const lines = buffer.split('\n');
110
+ buffer = lines.pop() || '';
111
+ for (const line of lines) {
112
+ if (line.startsWith('data: ')) {
113
+ const data = line.slice(6).trim();
114
+ if (!data)
115
+ continue;
116
+ try {
117
+ const parsed = JSON.parse(data);
118
+ const text = parsed.candidates?.[0]?.content?.parts?.[0]?.text;
119
+ if (text) {
120
+ yield { text, done: false };
121
+ }
122
+ }
123
+ catch {
124
+ }
125
+ }
126
+ }
127
+ }
128
+ yield { text: '', done: true };
129
+ }
130
+ }
131
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AIProvider, Message, StreamChunk, ModelInfo, ProviderInfo } from './base.js';
2
+ export declare class GroqProvider extends AIProvider {
3
+ private baseUrl;
4
+ get info(): ProviderInfo;
5
+ validateApiKey(): Promise<boolean>;
6
+ fetchModels(): Promise<ModelInfo[]>;
7
+ sendMessage(messages: Message[]): Promise<string>;
8
+ streamMessage(messages: Message[]): AsyncGenerator<StreamChunk>;
9
+ }
10
+ //# sourceMappingURL=groq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groq.d.ts","sourceRoot":"","sources":["../../src/providers/groq.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,YAAY,EAAE,MAAM,WAAW,CAAA;AAEpG,qBAAa,YAAa,SAAQ,UAAU;IAC1C,OAAO,CAAC,OAAO,CAAmC;IAElD,IAAI,IAAI,IAAI,YAAY,CAEvB;IAEK,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IASlC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAanC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAWhD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC;CA+BvE"}
@@ -0,0 +1,88 @@
1
+ import { AIProvider, ALL_PROVIDERS } from './base.js';
2
+ export class GroqProvider extends AIProvider {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.baseUrl = 'https://api.groq.com/openai/v1';
6
+ }
7
+ get info() {
8
+ return ALL_PROVIDERS.find((p) => p.id === 'groq');
9
+ }
10
+ async validateApiKey() {
11
+ try {
12
+ const res = await fetch(`${this.baseUrl}/models`, {
13
+ headers: { Authorization: `Bearer ${this.apiKey}` }
14
+ });
15
+ return res.ok;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ async fetchModels() {
22
+ try {
23
+ const res = await fetch(`${this.baseUrl}/models`, {
24
+ headers: { Authorization: `Bearer ${this.apiKey}` }
25
+ });
26
+ if (!res.ok)
27
+ return [];
28
+ const data = await res.json();
29
+ return (data.data || []).map((m) => ({
30
+ id: m.id, name: m.id, provider: 'groq', contextLength: m.context_length
31
+ }));
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ async sendMessage(messages) {
38
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
39
+ method: 'POST',
40
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.apiKey}` },
41
+ body: JSON.stringify({ model: this.model, messages, stream: false })
42
+ });
43
+ if (!res.ok)
44
+ throw new Error(`Groq: HTTP ${res.status}`);
45
+ const data = await res.json();
46
+ return data.choices?.[0]?.message?.content || '';
47
+ }
48
+ async *streamMessage(messages) {
49
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
50
+ method: 'POST',
51
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.apiKey}` },
52
+ body: JSON.stringify({ model: this.model, messages, stream: true })
53
+ });
54
+ if (!res.ok)
55
+ throw new Error(`Groq: HTTP ${res.status}`);
56
+ const reader = res.body?.getReader();
57
+ if (!reader)
58
+ throw new Error('Groq: No response body');
59
+ const decoder = new TextDecoder();
60
+ let buffer = '';
61
+ while (true) {
62
+ const { done, value } = await reader.read();
63
+ if (done)
64
+ break;
65
+ buffer += decoder.decode(value, { stream: true });
66
+ const lines = buffer.split('\n');
67
+ buffer = lines.pop() || '';
68
+ for (const line of lines) {
69
+ if (line.startsWith('data: ')) {
70
+ const data = line.slice(6).trim();
71
+ if (data === '[DONE]') {
72
+ yield { text: '', done: true };
73
+ return;
74
+ }
75
+ try {
76
+ const parsed = JSON.parse(data);
77
+ const content = parsed.choices?.[0]?.delta?.content;
78
+ if (content)
79
+ yield { text: content, done: false };
80
+ }
81
+ catch { }
82
+ }
83
+ }
84
+ }
85
+ yield { text: '', done: true };
86
+ }
87
+ }
88
+ //# sourceMappingURL=groq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groq.js","sourceRoot":"","sources":["../../src/providers/groq.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ProviderInfo } from './base.js';
2
+ export declare const ALL_PROVIDERS: ProviderInfo[];
3
+ export declare const CONNECT_PROVIDERS: {
4
+ id: any;
5
+ name: any;
6
+ desc: string;
7
+ env: string;
8
+ needsKey: boolean;
9
+ }[];
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,eAAO,MAAM,aAAa,EAAE,YAAY,EAavC,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;GAM3B,CAAA"}
@@ -0,0 +1,39 @@
1
+ export const ALL_PROVIDERS = [
2
+ { id: 'openai', name: 'OpenAI', models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o3-mini'], defaultModel: 'gpt-4o' },
3
+ { id: 'anthropic', name: 'Anthropic', models: ['claude-sonnet-4-20250514', 'claude-opus-4-20250514', 'claude-haiku-3-5'], defaultModel: 'claude-sonnet-4-20250514' },
4
+ { id: 'google', name: 'Google Gemini', models: ['gemini-2.5-flash', 'gemini-2.5-pro'], defaultModel: 'gemini-2.5-flash' },
5
+ { id: 'openrouter', name: 'OpenRouter', models: [], defaultModel: 'openai/gpt-4o' },
6
+ { id: 'deepseek', name: 'DeepSeek', models: ['deepseek-chat', 'deepseek-reasoner'], defaultModel: 'deepseek-chat' },
7
+ { id: 'mistral', name: 'Mistral AI', models: ['mistral-large-latest', 'mistral-small-latest', 'codestral-latest'], defaultModel: 'mistral-large-latest' },
8
+ { id: 'groq', name: 'Groq', models: ['llama-3.3-70b-versatile', 'llama-3.1-8b-instant', 'mixtral-8x7b-32768', 'deepseek-r1-distill-llama-70b'], defaultModel: 'llama-3.3-70b-versatile' },
9
+ { id: 'xai', name: 'xAI', models: ['grok-2', 'grok-2-mini'], defaultModel: 'grok-2' },
10
+ { id: 'together', name: 'Together AI', models: ['meta-llama/Llama-3.3-70B-Instruct-Turbo', 'mistralai/Mixtral-8x22B-Instruct-v0.1'], defaultModel: 'meta-llama/Llama-3.3-70B-Instruct-Turbo' },
11
+ { id: 'ollama', name: 'Ollama', models: ['llama3.2', 'mistral', 'codellama'], defaultModel: 'llama3.2' },
12
+ { id: 'opencode', name: 'OpenCode (local)', models: [], defaultModel: '' },
13
+ { id: 'custom', name: 'Custom OpenAI Compatible', models: [], defaultModel: 'gpt-4o' },
14
+ ];
15
+ export const CONNECT_PROVIDERS = ALL_PROVIDERS.map((p) => ({
16
+ id: p.id,
17
+ name: p.name,
18
+ desc: p.models.length > 0 ? p.models.slice(0, 3).join(', ') + (p.models.length > 3 ? '...' : '') : 'Flexible model selection',
19
+ env: envVarFor(p.id),
20
+ needsKey: p.id !== 'opencode' && p.id !== 'ollama',
21
+ }));
22
+ function envVarFor(providerId) {
23
+ const map = {
24
+ openai: 'OPENAI_API_KEY',
25
+ anthropic: 'ANTHROPIC_API_KEY',
26
+ google: 'GEMINI_API_KEY',
27
+ openrouter: 'OPENROUTER_API_KEY',
28
+ deepseek: 'DEEPSEEK_API_KEY',
29
+ mistral: 'MISTRAL_API_KEY',
30
+ groq: 'GROQ_API_KEY',
31
+ xai: 'XAI_API_KEY',
32
+ together: 'TOGETHER_API_KEY',
33
+ ollama: 'OLLAMA_HOST',
34
+ opencode: '',
35
+ custom: 'CUSTOM_API_KEY',
36
+ };
37
+ return map[providerId] || `${providerId.toUpperCase()}_API_KEY`;
38
+ }
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AIProvider, Message, StreamChunk, ModelInfo, ProviderInfo } from './base.js';
2
+ export declare class MistralProvider extends AIProvider {
3
+ private baseUrl;
4
+ get info(): ProviderInfo;
5
+ validateApiKey(): Promise<boolean>;
6
+ fetchModels(): Promise<ModelInfo[]>;
7
+ sendMessage(messages: Message[]): Promise<string>;
8
+ streamMessage(messages: Message[]): AsyncGenerator<StreamChunk>;
9
+ }
10
+ //# sourceMappingURL=mistral.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral.d.ts","sourceRoot":"","sources":["../../src/providers/mistral.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,YAAY,EAAE,MAAM,WAAW,CAAA;AAEpG,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,OAAO,CAAC,OAAO,CAA8B;IAE7C,IAAI,IAAI,IAAI,YAAY,CAEvB;IAEK,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IASlC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAanC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAWhD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC;CA+BvE"}
@@ -0,0 +1,88 @@
1
+ import { AIProvider, ALL_PROVIDERS } from './base.js';
2
+ export class MistralProvider extends AIProvider {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.baseUrl = 'https://api.mistral.ai/v1';
6
+ }
7
+ get info() {
8
+ return ALL_PROVIDERS.find((p) => p.id === 'mistral');
9
+ }
10
+ async validateApiKey() {
11
+ try {
12
+ const res = await fetch(`${this.baseUrl}/models`, {
13
+ headers: { Authorization: `Bearer ${this.apiKey}` }
14
+ });
15
+ return res.ok;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ async fetchModels() {
22
+ try {
23
+ const res = await fetch(`${this.baseUrl}/models`, {
24
+ headers: { Authorization: `Bearer ${this.apiKey}` }
25
+ });
26
+ if (!res.ok)
27
+ return [];
28
+ const data = await res.json();
29
+ return (data.data || []).map((m) => ({
30
+ id: m.id, name: m.id, provider: 'mistral', contextLength: m.max_context_length
31
+ }));
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ async sendMessage(messages) {
38
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
39
+ method: 'POST',
40
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.apiKey}` },
41
+ body: JSON.stringify({ model: this.model, messages, stream: false })
42
+ });
43
+ if (!res.ok)
44
+ throw new Error(`Mistral: HTTP ${res.status}`);
45
+ const data = await res.json();
46
+ return data.choices?.[0]?.message?.content || '';
47
+ }
48
+ async *streamMessage(messages) {
49
+ const res = await fetch(`${this.baseUrl}/chat/completions`, {
50
+ method: 'POST',
51
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${this.apiKey}` },
52
+ body: JSON.stringify({ model: this.model, messages, stream: true })
53
+ });
54
+ if (!res.ok)
55
+ throw new Error(`Mistral: HTTP ${res.status}`);
56
+ const reader = res.body?.getReader();
57
+ if (!reader)
58
+ throw new Error('Mistral: No response body');
59
+ const decoder = new TextDecoder();
60
+ let buffer = '';
61
+ while (true) {
62
+ const { done, value } = await reader.read();
63
+ if (done)
64
+ break;
65
+ buffer += decoder.decode(value, { stream: true });
66
+ const lines = buffer.split('\n');
67
+ buffer = lines.pop() || '';
68
+ for (const line of lines) {
69
+ if (line.startsWith('data: ')) {
70
+ const data = line.slice(6).trim();
71
+ if (data === '[DONE]') {
72
+ yield { text: '', done: true };
73
+ return;
74
+ }
75
+ try {
76
+ const parsed = JSON.parse(data);
77
+ const content = parsed.choices?.[0]?.delta?.content;
78
+ if (content)
79
+ yield { text: content, done: false };
80
+ }
81
+ catch { }
82
+ }
83
+ }
84
+ }
85
+ yield { text: '', done: true };
86
+ }
87
+ }
88
+ //# sourceMappingURL=mistral.js.map