vegas-chat 2.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 (178) hide show
  1. package/LICENSE +21 -0
  2. package/dist/autocomplete.d.ts +11 -0
  3. package/dist/autocomplete.d.ts.map +1 -0
  4. package/dist/autocomplete.js +215 -0
  5. package/dist/autocomplete.js.map +1 -0
  6. package/dist/coding/analyzer.d.ts +14 -0
  7. package/dist/coding/analyzer.d.ts.map +1 -0
  8. package/dist/coding/analyzer.js +245 -0
  9. package/dist/coding/analyzer.js.map +1 -0
  10. package/dist/coding/linter.d.ts +15 -0
  11. package/dist/coding/linter.d.ts.map +1 -0
  12. package/dist/coding/linter.js +118 -0
  13. package/dist/coding/linter.js.map +1 -0
  14. package/dist/coding/refactor.d.ts +14 -0
  15. package/dist/coding/refactor.d.ts.map +1 -0
  16. package/dist/coding/refactor.js +158 -0
  17. package/dist/coding/refactor.js.map +1 -0
  18. package/dist/coding/tester.d.ts +16 -0
  19. package/dist/coding/tester.d.ts.map +1 -0
  20. package/dist/coding/tester.js +118 -0
  21. package/dist/coding/tester.js.map +1 -0
  22. package/dist/commands/apikey.d.ts +4 -0
  23. package/dist/commands/apikey.d.ts.map +1 -0
  24. package/dist/commands/apikey.js +48 -0
  25. package/dist/commands/apikey.js.map +1 -0
  26. package/dist/commands/clear.d.ts +3 -0
  27. package/dist/commands/clear.d.ts.map +1 -0
  28. package/dist/commands/clear.js +11 -0
  29. package/dist/commands/clear.js.map +1 -0
  30. package/dist/commands/coding.d.ts +3 -0
  31. package/dist/commands/coding.d.ts.map +1 -0
  32. package/dist/commands/coding.js +106 -0
  33. package/dist/commands/coding.js.map +1 -0
  34. package/dist/commands/config.d.ts +4 -0
  35. package/dist/commands/config.d.ts.map +1 -0
  36. package/dist/commands/config.js +56 -0
  37. package/dist/commands/config.js.map +1 -0
  38. package/dist/commands/exit.d.ts +3 -0
  39. package/dist/commands/exit.d.ts.map +1 -0
  40. package/dist/commands/exit.js +10 -0
  41. package/dist/commands/exit.js.map +1 -0
  42. package/dist/commands/help.d.ts +3 -0
  43. package/dist/commands/help.d.ts.map +1 -0
  44. package/dist/commands/help.js +46 -0
  45. package/dist/commands/help.js.map +1 -0
  46. package/dist/commands/index.d.ts +4 -0
  47. package/dist/commands/index.d.ts.map +1 -0
  48. package/dist/commands/index.js +52 -0
  49. package/dist/commands/index.js.map +1 -0
  50. package/dist/commands/model.d.ts +4 -0
  51. package/dist/commands/model.d.ts.map +1 -0
  52. package/dist/commands/model.js +36 -0
  53. package/dist/commands/model.js.map +1 -0
  54. package/dist/commands/models.d.ts +4 -0
  55. package/dist/commands/models.d.ts.map +1 -0
  56. package/dist/commands/models.js +123 -0
  57. package/dist/commands/models.js.map +1 -0
  58. package/dist/commands/provider.d.ts +4 -0
  59. package/dist/commands/provider.d.ts.map +1 -0
  60. package/dist/commands/provider.js +118 -0
  61. package/dist/commands/provider.js.map +1 -0
  62. package/dist/commands/session.d.ts +5 -0
  63. package/dist/commands/session.d.ts.map +1 -0
  64. package/dist/commands/session.js +255 -0
  65. package/dist/commands/session.js.map +1 -0
  66. package/dist/commands/skills.d.ts +3 -0
  67. package/dist/commands/skills.d.ts.map +1 -0
  68. package/dist/commands/skills.js +69 -0
  69. package/dist/commands/skills.js.map +1 -0
  70. package/dist/commands/tools.d.ts +4 -0
  71. package/dist/commands/tools.d.ts.map +1 -0
  72. package/dist/commands/tools.js +59 -0
  73. package/dist/commands/tools.js.map +1 -0
  74. package/dist/commands/version.d.ts +4 -0
  75. package/dist/commands/version.d.ts.map +1 -0
  76. package/dist/commands/version.js +17 -0
  77. package/dist/commands/version.js.map +1 -0
  78. package/dist/config.d.ts +21 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.js +110 -0
  81. package/dist/config.js.map +1 -0
  82. package/dist/database.d.ts +59 -0
  83. package/dist/database.d.ts.map +1 -0
  84. package/dist/database.js +212 -0
  85. package/dist/database.js.map +1 -0
  86. package/dist/index.d.ts +3 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +19 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/loop/autoFix.d.ts +12 -0
  91. package/dist/loop/autoFix.d.ts.map +1 -0
  92. package/dist/loop/autoFix.js +42 -0
  93. package/dist/loop/autoFix.js.map +1 -0
  94. package/dist/modelCache.d.ts +3 -0
  95. package/dist/modelCache.d.ts.map +1 -0
  96. package/dist/modelCache.js +10 -0
  97. package/dist/modelCache.js.map +1 -0
  98. package/dist/provider/anthropic.d.ts +10 -0
  99. package/dist/provider/anthropic.d.ts.map +1 -0
  100. package/dist/provider/anthropic.js +106 -0
  101. package/dist/provider/anthropic.js.map +1 -0
  102. package/dist/provider/google.d.ts +11 -0
  103. package/dist/provider/google.d.ts.map +1 -0
  104. package/dist/provider/google.js +113 -0
  105. package/dist/provider/google.js.map +1 -0
  106. package/dist/provider/interface.d.ts +3 -0
  107. package/dist/provider/interface.d.ts.map +1 -0
  108. package/dist/provider/interface.js +2 -0
  109. package/dist/provider/interface.js.map +1 -0
  110. package/dist/provider/openai-compatible.d.ts +10 -0
  111. package/dist/provider/openai-compatible.d.ts.map +1 -0
  112. package/dist/provider/openai-compatible.js +90 -0
  113. package/dist/provider/openai-compatible.js.map +1 -0
  114. package/dist/provider/registry.d.ts +9 -0
  115. package/dist/provider/registry.d.ts.map +1 -0
  116. package/dist/provider/registry.js +118 -0
  117. package/dist/provider/registry.js.map +1 -0
  118. package/dist/provider/zen.d.ts +11 -0
  119. package/dist/provider/zen.d.ts.map +1 -0
  120. package/dist/provider/zen.js +120 -0
  121. package/dist/provider/zen.js.map +1 -0
  122. package/dist/repl.d.ts +23 -0
  123. package/dist/repl.d.ts.map +1 -0
  124. package/dist/repl.js +387 -0
  125. package/dist/repl.js.map +1 -0
  126. package/dist/skills/loader.d.ts +14 -0
  127. package/dist/skills/loader.d.ts.map +1 -0
  128. package/dist/skills/loader.js +109 -0
  129. package/dist/skills/loader.js.map +1 -0
  130. package/dist/skills/matcher.d.ts +11 -0
  131. package/dist/skills/matcher.d.ts.map +1 -0
  132. package/dist/skills/matcher.js +51 -0
  133. package/dist/skills/matcher.js.map +1 -0
  134. package/dist/tools/bash.d.ts +3 -0
  135. package/dist/tools/bash.d.ts.map +1 -0
  136. package/dist/tools/bash.js +59 -0
  137. package/dist/tools/bash.js.map +1 -0
  138. package/dist/tools/edit.d.ts +3 -0
  139. package/dist/tools/edit.d.ts.map +1 -0
  140. package/dist/tools/edit.js +75 -0
  141. package/dist/tools/edit.js.map +1 -0
  142. package/dist/tools/glob.d.ts +3 -0
  143. package/dist/tools/glob.d.ts.map +1 -0
  144. package/dist/tools/glob.js +93 -0
  145. package/dist/tools/glob.js.map +1 -0
  146. package/dist/tools/grep.d.ts +3 -0
  147. package/dist/tools/grep.d.ts.map +1 -0
  148. package/dist/tools/grep.js +119 -0
  149. package/dist/tools/grep.js.map +1 -0
  150. package/dist/tools/read.d.ts +3 -0
  151. package/dist/tools/read.d.ts.map +1 -0
  152. package/dist/tools/read.js +52 -0
  153. package/dist/tools/read.js.map +1 -0
  154. package/dist/tools/registry.d.ts +6 -0
  155. package/dist/tools/registry.d.ts.map +1 -0
  156. package/dist/tools/registry.js +48 -0
  157. package/dist/tools/registry.js.map +1 -0
  158. package/dist/tools/webFetch.d.ts +3 -0
  159. package/dist/tools/webFetch.d.ts.map +1 -0
  160. package/dist/tools/webFetch.js +57 -0
  161. package/dist/tools/webFetch.js.map +1 -0
  162. package/dist/tools/webSearch.d.ts +5 -0
  163. package/dist/tools/webSearch.d.ts.map +1 -0
  164. package/dist/tools/webSearch.js +107 -0
  165. package/dist/tools/webSearch.js.map +1 -0
  166. package/dist/tools/write.d.ts +3 -0
  167. package/dist/tools/write.d.ts.map +1 -0
  168. package/dist/tools/write.js +41 -0
  169. package/dist/tools/write.js.map +1 -0
  170. package/dist/types.d.ts +74 -0
  171. package/dist/types.d.ts.map +1 -0
  172. package/dist/types.js +2 -0
  173. package/dist/types.js.map +1 -0
  174. package/dist/ui.d.ts +179 -0
  175. package/dist/ui.d.ts.map +1 -0
  176. package/dist/ui.js +481 -0
  177. package/dist/ui.js.map +1 -0
  178. package/package.json +52 -0
@@ -0,0 +1,11 @@
1
+ import type { LLMProvider, LLMMessage, LLMResponse, ToolDefinition } from "../types.js";
2
+ export declare class GoogleProvider implements LLMProvider {
3
+ name: string;
4
+ private apiKey;
5
+ private model;
6
+ constructor(apiKey: string, model: string);
7
+ chat(messages: LLMMessage[], tools: ToolDefinition[]): Promise<LLMResponse>;
8
+ private extractSystem;
9
+ private convertMessages;
10
+ }
11
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/provider/google.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAY,MAAM,aAAa,CAAC;AA2BlG,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKnC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAoEjF,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;CAwCxB"}
@@ -0,0 +1,113 @@
1
+ export class GoogleProvider {
2
+ name = "google";
3
+ apiKey;
4
+ model;
5
+ constructor(apiKey, model) {
6
+ this.apiKey = apiKey;
7
+ this.model = model;
8
+ }
9
+ async chat(messages, tools) {
10
+ const url = `https://generativelanguage.googleapis.com/v1beta/models/${this.model}:generateContent?key=${this.apiKey}`;
11
+ const body = {
12
+ contents: this.convertMessages(messages),
13
+ systemInstruction: this.extractSystem(messages),
14
+ };
15
+ if (tools.length > 0) {
16
+ body.tools = [
17
+ {
18
+ functionDeclarations: tools.map(t => ({
19
+ name: t.name,
20
+ description: t.description,
21
+ parameters: t.parameters,
22
+ })),
23
+ },
24
+ ];
25
+ }
26
+ const res = await fetch(url, {
27
+ method: "POST",
28
+ headers: { "Content-Type": "application/json" },
29
+ body: JSON.stringify(body),
30
+ });
31
+ if (!res.ok) {
32
+ const err = await res.text();
33
+ throw new Error(`[Google] ${res.status}: ${err}`);
34
+ }
35
+ const data = (await res.json());
36
+ if (!data.candidates || data.candidates.length === 0) {
37
+ throw new Error("[Google] No candidates returned");
38
+ }
39
+ const candidate = data.candidates[0];
40
+ let content = "";
41
+ const toolCalls = [];
42
+ for (const part of candidate.content?.parts || []) {
43
+ if (part.text) {
44
+ content += part.text;
45
+ }
46
+ if (part.functionCall) {
47
+ toolCalls.push({
48
+ id: `fc-${part.functionCall.name}`,
49
+ type: "function",
50
+ function: {
51
+ name: part.functionCall.name,
52
+ arguments: JSON.stringify(part.functionCall.args || {}),
53
+ },
54
+ });
55
+ }
56
+ }
57
+ return {
58
+ content,
59
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
60
+ model: this.model,
61
+ usage: data.usageMetadata
62
+ ? { input: data.usageMetadata.promptTokenCount, output: data.usageMetadata.candidatesTokenCount }
63
+ : undefined,
64
+ };
65
+ }
66
+ extractSystem(messages) {
67
+ const sys = messages.filter(m => m.role === "system");
68
+ if (sys.length === 0)
69
+ return undefined;
70
+ return { parts: sys.map(m => ({ text: m.content })) };
71
+ }
72
+ convertMessages(messages) {
73
+ const result = [];
74
+ const filtered = messages.filter(m => m.role !== "system");
75
+ for (const msg of filtered) {
76
+ if (msg.role === "tool") {
77
+ result.push({
78
+ role: "function",
79
+ parts: [
80
+ {
81
+ functionResponse: {
82
+ name: msg.name || "unknown",
83
+ response: { content: msg.content },
84
+ },
85
+ },
86
+ ],
87
+ });
88
+ }
89
+ else if (msg.role === "assistant") {
90
+ const parts = [];
91
+ if (msg.content) {
92
+ parts.push({ text: msg.content });
93
+ }
94
+ if (msg.tool_calls) {
95
+ for (const tc of msg.tool_calls) {
96
+ parts.push({
97
+ functionCall: {
98
+ name: tc.function.name,
99
+ args: JSON.parse(tc.function.arguments),
100
+ },
101
+ });
102
+ }
103
+ }
104
+ result.push({ role: "model", parts });
105
+ }
106
+ else {
107
+ result.push({ role: "user", parts: [{ text: msg.content }] });
108
+ }
109
+ }
110
+ return result;
111
+ }
112
+ }
113
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/provider/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LLMProvider, LLMMessage, LLMResponse, ToolDefinition } from "../types.js";
2
+ export type { LLMProvider, LLMMessage, LLMResponse, ToolDefinition };
3
+ //# sourceMappingURL=interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/provider/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExF,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/provider/interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { LLMProvider, LLMMessage, LLMResponse, ToolDefinition } from "../types.js";
2
+ export declare class OpenAICompatibleProvider implements LLMProvider {
3
+ name: string;
4
+ private baseUrl;
5
+ private apiKey;
6
+ private model;
7
+ constructor(name: string, baseUrl: string, apiKey: string, model: string);
8
+ chat(messages: LLMMessage[], tools: ToolDefinition[]): Promise<LLMResponse>;
9
+ }
10
+ //# sourceMappingURL=openai-compatible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../src/provider/openai-compatible.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAY,MAAM,aAAa,CAAC;AAsBlG,qBAAa,wBAAyB,YAAW,WAAW;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAOlE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAmFlF"}
@@ -0,0 +1,90 @@
1
+ export class OpenAICompatibleProvider {
2
+ name;
3
+ baseUrl;
4
+ apiKey;
5
+ model;
6
+ constructor(name, baseUrl, apiKey, model) {
7
+ this.name = name;
8
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
9
+ this.apiKey = apiKey;
10
+ this.model = model;
11
+ }
12
+ async chat(messages, tools) {
13
+ const url = `${this.baseUrl}/chat/completions`;
14
+ const body = {
15
+ model: this.model,
16
+ messages: messages.map(m => {
17
+ const msg = { role: m.role, content: m.content };
18
+ if (m.tool_calls)
19
+ msg.tool_calls = m.tool_calls;
20
+ if (m.tool_call_id)
21
+ msg.tool_call_id = m.tool_call_id;
22
+ if (m.name)
23
+ msg.name = m.name;
24
+ return msg;
25
+ }),
26
+ };
27
+ if (tools.length > 0) {
28
+ body.tools = tools.map(t => ({
29
+ type: "function",
30
+ function: {
31
+ name: t.name,
32
+ description: t.description,
33
+ parameters: t.parameters,
34
+ },
35
+ }));
36
+ body.tool_choice = "auto";
37
+ }
38
+ const headers = {
39
+ "Content-Type": "application/json",
40
+ };
41
+ if (this.apiKey) {
42
+ headers["Authorization"] = `Bearer ${this.apiKey}`;
43
+ }
44
+ const res = await fetch(url, {
45
+ method: "POST",
46
+ headers,
47
+ body: JSON.stringify(body),
48
+ });
49
+ if (!res.ok) {
50
+ const err = await res.text();
51
+ throw new Error(`[${this.name}] ${res.status}: ${err.slice(0, 500)}`);
52
+ }
53
+ const buf = await res.arrayBuffer();
54
+ let raw = new TextDecoder("utf-8", { fatal: false }).decode(buf);
55
+ const lastBrace = raw.lastIndexOf("}");
56
+ if (lastBrace > 0)
57
+ raw = raw.slice(0, lastBrace + 1);
58
+ let data;
59
+ try {
60
+ data = JSON.parse(raw);
61
+ }
62
+ catch {
63
+ const preview = raw.length > 500 ? raw.slice(0, 500) + "..." : raw;
64
+ throw new Error(`[${this.name}] Invalid JSON (${buf.byteLength} bytes)\n` +
65
+ `First 500 chars:\n${preview}\n` +
66
+ `Last 10 chars (hex): ${raw.slice(-10).split("").map(c => c.charCodeAt(0).toString(16)).join(" ")}`);
67
+ }
68
+ const choice = data.choices[0];
69
+ if (!choice) {
70
+ throw new Error(`[${this.name}] No choices returned`);
71
+ }
72
+ const toolCalls = choice.message.tool_calls?.map(tc => ({
73
+ id: tc.id,
74
+ type: "function",
75
+ function: {
76
+ name: tc.function.name,
77
+ arguments: tc.function.arguments,
78
+ },
79
+ }));
80
+ return {
81
+ content: choice.message.content ?? "",
82
+ tool_calls: toolCalls,
83
+ model: data.model,
84
+ usage: data.usage
85
+ ? { input: data.usage.prompt_tokens, output: data.usage.completion_tokens }
86
+ : undefined,
87
+ };
88
+ }
89
+ }
90
+ //# sourceMappingURL=openai-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../src/provider/openai-compatible.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { LLMProvider } from "../types.js";
2
+ import { ConfigManager } from "../config.js";
3
+ export declare function getProviderNames(): string[];
4
+ export declare function getProviderLabel(name: string): string;
5
+ export declare function buildProvider(config: ConfigManager): LLMProvider | null;
6
+ export declare function fetchAvailableModels(providerName: string, baseUrl: string, apiKey: string): Promise<string[]>;
7
+ export declare function getDefaultModel(provider: string): string;
8
+ export declare function hasApiKey(provider: string, config: ConfigManager): boolean;
9
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/provider/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA6B7C,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,IAAI,CAsCvE;AAED,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAG1E"}
@@ -0,0 +1,118 @@
1
+ import { OpenAICompatibleProvider } from "./openai-compatible.js";
2
+ import { AnthropicProvider } from "./anthropic.js";
3
+ import { GoogleProvider } from "./google.js";
4
+ import { OpenCodeZenProvider } from "./zen.js";
5
+ const PROVIDER_DEFAULTS = {
6
+ openai: { baseUrl: "https://api.openai.com/v1", defaultModel: "gpt-4o" },
7
+ groq: { baseUrl: "https://api.groq.com/openai/v1", defaultModel: "llama-3.3-70b-versatile" },
8
+ deepseek: { baseUrl: "https://api.deepseek.com/v1", defaultModel: "deepseek-chat" },
9
+ openrouter: { baseUrl: "https://openrouter.ai/api/v1", defaultModel: "auto" },
10
+ "9router": { baseUrl: "http://localhost:20128/v1", defaultModel: "oc/deepseek-v4-flash-free" },
11
+ together: { baseUrl: "https://api.together.xyz/v1", defaultModel: "mistralai/Mixtral-8x22B-Instruct-v0.1" },
12
+ xai: { baseUrl: "https://api.x.ai/v1", defaultModel: "grok-2" },
13
+ mistral: { baseUrl: "https://api.mistral.ai/v1", defaultModel: "mistral-large-latest" },
14
+ ollama: { baseUrl: "http://localhost:11434/v1", defaultModel: "llama3" },
15
+ };
16
+ const PROVIDER_NAMES = {
17
+ openai: "OpenAI",
18
+ anthropic: "Anthropic",
19
+ google: "Google Gemini",
20
+ groq: "Groq",
21
+ deepseek: "DeepSeek",
22
+ openrouter: "OpenRouter",
23
+ "9router": "9Router",
24
+ together: "Together AI",
25
+ xai: "xAI (Grok)",
26
+ mistral: "Mistral AI",
27
+ ollama: "Ollama",
28
+ zen: "OpenCode Zen",
29
+ };
30
+ export function getProviderNames() {
31
+ return Object.keys(PROVIDER_NAMES);
32
+ }
33
+ export function getProviderLabel(name) {
34
+ return PROVIDER_NAMES[name] || name;
35
+ }
36
+ export function buildProvider(config) {
37
+ const providerName = config.getProvider();
38
+ const apiKey = config.getApiKey(providerName) || "";
39
+ const model = config.getModel();
40
+ if (!apiKey && !["9router", "ollama"].includes(providerName)) {
41
+ return null;
42
+ }
43
+ const custom = config.get().customProviders[providerName];
44
+ if (custom) {
45
+ if (custom.type === "anthropic") {
46
+ return new AnthropicProvider(custom.apiKey || apiKey, model);
47
+ }
48
+ return new OpenAICompatibleProvider(providerName, custom.baseUrl, custom.apiKey || apiKey, model);
49
+ }
50
+ switch (providerName) {
51
+ case "anthropic": {
52
+ if (!apiKey)
53
+ return null;
54
+ return new AnthropicProvider(apiKey, model || "claude-sonnet-4-20250514");
55
+ }
56
+ case "google": {
57
+ if (!apiKey)
58
+ return null;
59
+ return new GoogleProvider(apiKey, model || "gemini-2.0-flash");
60
+ }
61
+ case "zen": {
62
+ if (!apiKey)
63
+ return null;
64
+ return new OpenCodeZenProvider(apiKey, model || "gpt-4o");
65
+ }
66
+ default: {
67
+ const defaults = PROVIDER_DEFAULTS[providerName];
68
+ if (defaults) {
69
+ return new OpenAICompatibleProvider(providerName, defaults.baseUrl, apiKey, model || defaults.defaultModel);
70
+ }
71
+ return null;
72
+ }
73
+ }
74
+ }
75
+ export async function fetchAvailableModels(providerName, baseUrl, apiKey) {
76
+ try {
77
+ const url = `${baseUrl.replace(/\/+$/, "")}/models`;
78
+ const headers = {};
79
+ if (providerName === "anthropic") {
80
+ headers["x-api-key"] = apiKey;
81
+ headers["anthropic-version"] = "2023-06-01";
82
+ }
83
+ else {
84
+ headers["Authorization"] = `Bearer ${apiKey}`;
85
+ }
86
+ const res = await fetch(url, { headers });
87
+ if (!res.ok)
88
+ return [];
89
+ const data = (await res.json());
90
+ return data.data?.map(m => m.id) || [];
91
+ }
92
+ catch {
93
+ return [];
94
+ }
95
+ }
96
+ export function getDefaultModel(provider) {
97
+ const modelMap = {
98
+ openai: "gpt-4o",
99
+ anthropic: "claude-sonnet-4-20250514",
100
+ google: "gemini-2.0-flash",
101
+ groq: "llama-3.3-70b-versatile",
102
+ deepseek: "deepseek-chat",
103
+ openrouter: "auto",
104
+ "9router": "oc/deepseek-v4-flash-free",
105
+ together: "mistralai/Mixtral-8x22B-Instruct-v0.1",
106
+ xai: "grok-2",
107
+ mistral: "mistral-large-latest",
108
+ ollama: "llama3",
109
+ zen: "gpt-4o",
110
+ };
111
+ return modelMap[provider] || "gpt-4o";
112
+ }
113
+ export function hasApiKey(provider, config) {
114
+ if (provider === "9router" || provider === "ollama")
115
+ return true;
116
+ return !!config.getApiKey(provider);
117
+ }
118
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/provider/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LLMProvider, LLMMessage, LLMResponse, ToolDefinition } from "../types.js";
2
+ export declare class OpenCodeZenProvider implements LLMProvider {
3
+ name: string;
4
+ private apiKey;
5
+ private model;
6
+ constructor(apiKey: string, model: string);
7
+ chat(messages: LLMMessage[], tools: ToolDefinition[]): Promise<LLMResponse>;
8
+ private googleChat;
9
+ private convertGoogleMessages;
10
+ }
11
+ //# sourceMappingURL=zen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zen.d.ts","sourceRoot":"","sources":["../../src/provider/zen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAY,MAAM,aAAa,CAAC;AAUlG,qBAAa,mBAAoB,YAAW,WAAW;IACrD,IAAI,SAAS;IACb,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKnC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;YAwBnE,UAAU;IAwExB,OAAO,CAAC,qBAAqB;CA+B9B"}
@@ -0,0 +1,120 @@
1
+ import { OpenAICompatibleProvider } from "./openai-compatible.js";
2
+ import { AnthropicProvider } from "./anthropic.js";
3
+ const ZEN_BASE = "https://opencode.ai/zen/v1";
4
+ const CLAUDE_PREFIXES = ["claude", "opencode/claude"];
5
+ const GEMINI_PREFIXES = ["gemini", "opencode/gemini"];
6
+ const GPT_PREFIXES = ["gpt", "opencode/gpt", "o1", "o3"];
7
+ export class OpenCodeZenProvider {
8
+ name = "zen";
9
+ apiKey;
10
+ model;
11
+ constructor(apiKey, model) {
12
+ this.apiKey = apiKey;
13
+ this.model = model;
14
+ }
15
+ async chat(messages, tools) {
16
+ const modelId = this.model.replace(/^opencode\//, "");
17
+ if (CLAUDE_PREFIXES.some(p => modelId.startsWith(p))) {
18
+ const provider = new AnthropicProvider(this.apiKey, modelId);
19
+ provider.name = "zen (claude)";
20
+ const anthropicFetch = provider.chat.bind(provider);
21
+ return await anthropicFetch(messages, tools);
22
+ }
23
+ if (GEMINI_PREFIXES.some(p => modelId.startsWith(p))) {
24
+ const url = `https://generativelanguage.googleapis.com/v1beta/models/${modelId}:generateContent?key=${this.apiKey}`;
25
+ return await this.googleChat(url, messages, tools);
26
+ }
27
+ const oaiProvider = new OpenAICompatibleProvider("zen", ZEN_BASE, this.apiKey, modelId);
28
+ return await oaiProvider.chat(messages, tools);
29
+ }
30
+ async googleChat(url, messages, tools) {
31
+ const systemMessages = messages.filter(m => m.role === "system");
32
+ const nonSystem = messages.filter(m => m.role !== "system");
33
+ const body = {
34
+ contents: this.convertGoogleMessages(nonSystem),
35
+ };
36
+ if (systemMessages.length > 0) {
37
+ body.systemInstruction = {
38
+ parts: systemMessages.map(m => ({ text: m.content })),
39
+ };
40
+ }
41
+ if (tools.length > 0) {
42
+ body.tools = [
43
+ {
44
+ functionDeclarations: tools.map(t => ({
45
+ name: t.name,
46
+ description: t.description,
47
+ parameters: t.parameters,
48
+ })),
49
+ },
50
+ ];
51
+ }
52
+ const res = await fetch(url, {
53
+ method: "POST",
54
+ headers: { "Content-Type": "application/json" },
55
+ body: JSON.stringify(body),
56
+ });
57
+ if (!res.ok) {
58
+ const err = await res.text();
59
+ throw new Error(`[Zen/Gemini] ${res.status}: ${err}`);
60
+ }
61
+ const data = (await res.json());
62
+ if (!data.candidates || data.candidates.length === 0) {
63
+ throw new Error("[Zen/Gemini] No candidates");
64
+ }
65
+ let content = "";
66
+ const toolCalls = [];
67
+ const parts = data.candidates[0].content?.parts || [];
68
+ for (const part of parts) {
69
+ if (part.text)
70
+ content += part.text;
71
+ if (part.functionCall) {
72
+ toolCalls.push({
73
+ id: `fc-${Date.now()}`,
74
+ type: "function",
75
+ function: {
76
+ name: part.functionCall.name,
77
+ arguments: JSON.stringify(part.functionCall.args || {}),
78
+ },
79
+ });
80
+ }
81
+ }
82
+ return { content, tool_calls: toolCalls.length > 0 ? toolCalls : undefined, model: this.model };
83
+ }
84
+ convertGoogleMessages(messages) {
85
+ const result = [];
86
+ for (const msg of messages) {
87
+ if (msg.role === "system")
88
+ continue;
89
+ if (msg.role === "tool") {
90
+ result.push({
91
+ role: "function",
92
+ parts: [{
93
+ functionResponse: {
94
+ name: msg.name || "unknown",
95
+ response: { content: msg.content },
96
+ },
97
+ }],
98
+ });
99
+ }
100
+ else if (msg.role === "assistant") {
101
+ const parts = [];
102
+ if (msg.content)
103
+ parts.push({ text: msg.content });
104
+ if (msg.tool_calls) {
105
+ for (const tc of msg.tool_calls) {
106
+ parts.push({
107
+ functionCall: { name: tc.function.name, args: JSON.parse(tc.function.arguments) },
108
+ });
109
+ }
110
+ }
111
+ result.push({ role: "model", parts });
112
+ }
113
+ else {
114
+ result.push({ role: "user", parts: [{ text: msg.content }] });
115
+ }
116
+ }
117
+ return result;
118
+ }
119
+ }
120
+ //# sourceMappingURL=zen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zen.js","sourceRoot":"","sources":["../../src/provider/zen.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAE9C,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AACtD,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AACtD,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEzD,MAAM,OAAO,mBAAmB;IAC9B,IAAI,GAAG,KAAK,CAAC;IACL,MAAM,CAAS;IACf,KAAK,CAAS;IAEtB,YAAY,MAAc,EAAE,KAAa;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,KAAuB;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAEtD,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5D,QAAwC,CAAC,IAAI,GAAG,cAAc,CAAC;YAChE,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpD,OAAO,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,2DAA2D,OAAO,wBAAwB,IAAI,CAAC,MAAM,EAAE,CAAC;YACpH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,wBAAwB,CAC9C,KAAK,EACL,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,OAAO,CACR,CAAC;QACF,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,GAAW,EACX,QAAsB,EACtB,KAAuB;QAEvB,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAE5D,MAAM,IAAI,GAA4B;YACpC,QAAQ,EAAE,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;SAChD,CAAC;QAEF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,iBAAiB,GAAG;gBACvB,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aACtD,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG;gBACX;oBACE,oBAAoB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACpC,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;qBACzB,CAAC,CAAC;iBACJ;aACF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QAEtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC;YACpC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,SAAS,CAAC,IAAI,CAAC;oBACb,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE;oBACtB,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE;wBACR,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;wBAC5B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;qBACxD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAClG,CAAC;IAEO,qBAAqB,CAAC,QAAsB;QAClD,MAAM,MAAM,GAA8B,EAAE,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACpC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,UAAU;oBAChB,KAAK,EAAE,CAAC;4BACN,gBAAgB,EAAE;gCAChB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS;gCAC3B,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;6BACnC;yBACF,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,MAAM,KAAK,GAA8B,EAAE,CAAC;gBAC5C,IAAI,GAAG,CAAC,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;oBACnB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;wBAChC,KAAK,CAAC,IAAI,CAAC;4BACT,YAAY,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;yBAClF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
package/dist/repl.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { ConfigManager } from "./config.js";
2
+ export declare class REPL {
3
+ private config;
4
+ private commands;
5
+ private history;
6
+ private activeSkills;
7
+ private sessionId;
8
+ private modelCache;
9
+ constructor(config: ConfigManager);
10
+ private initSession;
11
+ private persistHistory;
12
+ checkFirstRun(): boolean;
13
+ private ctx;
14
+ private showFooter;
15
+ private getCompletions;
16
+ run(): Promise<void>;
17
+ private handleCommand;
18
+ private handleRetry;
19
+ private handleChat;
20
+ private buildSystemPrompt;
21
+ private processLLMResponse;
22
+ }
23
+ //# sourceMappingURL=repl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA0E5C,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAuD;gBAE7D,MAAM,EAAE,aAAa;IAYjC,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,cAAc;IAOtB,aAAa,IAAI,OAAO;IAKxB,OAAO,CAAC,GAAG;IAQX,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,cAAc;IAmChB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAoDZ,aAAa;YAsBb,WAAW;YAaX,UAAU;IAuDxB,OAAO,CAAC,iBAAiB;YAiBX,kBAAkB;CA+IjC"}