@autonsh/cli 0.17.2 → 0.19.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 (136) hide show
  1. package/dist/chat.d.ts +1 -1
  2. package/dist/chat.js +166 -120
  3. package/dist/chat.js.map +1 -1
  4. package/dist/completion.d.ts +2 -0
  5. package/dist/completion.js +379 -0
  6. package/dist/completion.js.map +1 -0
  7. package/dist/config-validation.d.ts +10 -0
  8. package/dist/config-validation.js +101 -0
  9. package/dist/config-validation.js.map +1 -0
  10. package/dist/config.d.ts +9 -3
  11. package/dist/config.js +23 -11
  12. package/dist/config.js.map +1 -1
  13. package/dist/doctor.d.ts +18 -0
  14. package/dist/doctor.js +409 -0
  15. package/dist/doctor.js.map +1 -0
  16. package/dist/errors.d.ts +22 -0
  17. package/dist/errors.js +60 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.js +304 -119
  20. package/dist/index.js.map +1 -1
  21. package/dist/input.d.ts +43 -0
  22. package/dist/input.js +288 -0
  23. package/dist/input.js.map +1 -0
  24. package/dist/llm/factory.d.ts +5 -0
  25. package/dist/llm/factory.js +54 -0
  26. package/dist/llm/factory.js.map +1 -0
  27. package/dist/llm/index.d.ts +9 -0
  28. package/dist/llm/index.js +11 -0
  29. package/dist/llm/index.js.map +1 -0
  30. package/dist/llm/provider.d.ts +27 -0
  31. package/dist/llm/provider.js +98 -0
  32. package/dist/llm/provider.js.map +1 -0
  33. package/dist/llm/providers/anthropic.d.ts +23 -0
  34. package/dist/llm/providers/anthropic.js +198 -0
  35. package/dist/llm/providers/anthropic.js.map +1 -0
  36. package/dist/llm/providers/google.d.ts +31 -0
  37. package/dist/llm/providers/google.js +190 -0
  38. package/dist/llm/providers/google.js.map +1 -0
  39. package/dist/llm/providers/ollama.d.ts +21 -0
  40. package/dist/llm/providers/ollama.js +157 -0
  41. package/dist/llm/providers/ollama.js.map +1 -0
  42. package/dist/llm/providers/openai-compatible.d.ts +22 -0
  43. package/dist/llm/providers/openai-compatible.js +175 -0
  44. package/dist/llm/providers/openai-compatible.js.map +1 -0
  45. package/dist/llm/providers/openai.d.ts +20 -0
  46. package/dist/llm/providers/openai.js +167 -0
  47. package/dist/llm/providers/openai.js.map +1 -0
  48. package/dist/llm/registry.d.ts +19 -0
  49. package/dist/llm/registry.js +421 -0
  50. package/dist/llm/registry.js.map +1 -0
  51. package/dist/llm/types.d.ts +174 -0
  52. package/dist/llm/types.js +3 -0
  53. package/dist/llm/types.js.map +1 -0
  54. package/dist/login.d.ts +1 -1
  55. package/dist/login.js +14 -14
  56. package/dist/login.js.map +1 -1
  57. package/dist/mcp/client.d.ts +36 -0
  58. package/dist/mcp/client.js +199 -0
  59. package/dist/mcp/client.js.map +1 -0
  60. package/dist/mcp/config.d.ts +10 -0
  61. package/dist/mcp/config.js +43 -0
  62. package/dist/mcp/config.js.map +1 -0
  63. package/dist/mcp/index.d.ts +4 -0
  64. package/dist/mcp/index.js +6 -0
  65. package/dist/mcp/index.js.map +1 -0
  66. package/dist/mcp/types.d.ts +104 -0
  67. package/dist/mcp/types.js +3 -0
  68. package/dist/mcp/types.js.map +1 -0
  69. package/dist/model.d.ts +3 -14
  70. package/dist/model.js +131 -91
  71. package/dist/model.js.map +1 -1
  72. package/dist/ollama.d.ts +10 -0
  73. package/dist/ollama.js +11 -0
  74. package/dist/ollama.js.map +1 -0
  75. package/dist/prompts.d.ts +34 -8
  76. package/dist/prompts.js +186 -8
  77. package/dist/prompts.js.map +1 -1
  78. package/dist/repomap.d.ts +37 -0
  79. package/dist/repomap.js +431 -0
  80. package/dist/repomap.js.map +1 -0
  81. package/dist/skills/index.d.ts +3 -0
  82. package/dist/skills/index.js +5 -0
  83. package/dist/skills/index.js.map +1 -0
  84. package/dist/skills/registry.d.ts +16 -0
  85. package/dist/skills/registry.js +128 -0
  86. package/dist/skills/registry.js.map +1 -0
  87. package/dist/skills/types.d.ts +48 -0
  88. package/dist/skills/types.js +3 -0
  89. package/dist/skills/types.js.map +1 -0
  90. package/dist/statusline.d.ts +21 -0
  91. package/dist/statusline.js +68 -0
  92. package/dist/statusline.js.map +1 -0
  93. package/dist/streaming.d.ts +25 -0
  94. package/dist/streaming.js +91 -0
  95. package/dist/streaming.js.map +1 -0
  96. package/dist/task.d.ts +9 -1
  97. package/dist/task.js +21 -0
  98. package/dist/task.js.map +1 -1
  99. package/dist/template-engine.d.ts +19 -0
  100. package/dist/template-engine.js +187 -0
  101. package/dist/template-engine.js.map +1 -0
  102. package/dist/template-registry.d.ts +36 -0
  103. package/dist/template-registry.js +294 -0
  104. package/dist/template-registry.js.map +1 -0
  105. package/dist/theme.d.ts +52 -0
  106. package/dist/theme.js +92 -0
  107. package/dist/theme.js.map +1 -0
  108. package/dist/tools/builtin.d.ts +11 -0
  109. package/dist/tools/builtin.js +491 -0
  110. package/dist/tools/builtin.js.map +1 -0
  111. package/dist/tools/index.d.ts +3 -0
  112. package/dist/tools/index.js +5 -0
  113. package/dist/tools/index.js.map +1 -0
  114. package/dist/tools/types.d.ts +186 -0
  115. package/dist/tools/types.js +29 -0
  116. package/dist/tools/types.js.map +1 -0
  117. package/dist/ui.js +34 -30
  118. package/dist/ui.js.map +1 -1
  119. package/dist/verbose.d.ts +20 -0
  120. package/dist/verbose.js +75 -0
  121. package/dist/verbose.js.map +1 -0
  122. package/package.json +12 -2
  123. package/templates/api-json/task.yaml +0 -2
  124. package/templates/coding/agent.md +39 -0
  125. package/templates/coding/agent.ts +83 -0
  126. package/templates/coding/task.yaml +36 -0
  127. package/templates/cron-digester/task.yaml +0 -2
  128. package/templates/harness/agent.md +43 -0
  129. package/templates/harness/harness.ts +145 -0
  130. package/templates/harness/task.yaml +4 -0
  131. package/templates/multi-agent/agent.ts +7 -8
  132. package/templates/multi-agent/task.yaml +1 -3
  133. package/templates/research/task.yaml +4 -0
  134. package/templates/support/task.yaml +0 -2
  135. package/templates/webhook-echo/task.yaml +0 -2
  136. package/templates/with-approval/task.yaml +0 -2
package/dist/input.js ADDED
@@ -0,0 +1,288 @@
1
+ // input.ts — Input bar with cursor positioning, command autocomplete, history.
2
+ // Extracted from claude-code-kit/claude-tui patterns, adapted for auton style.
3
+ import { createInterface } from "node:readline";
4
+ import pc from "picocolors";
5
+ // --- Cores: vermelho sangue, preto, branco, cinza ---
6
+ const RED = pc.red;
7
+ const GRAY = pc.gray;
8
+ const WHITE = pc.white;
9
+ const DIM = pc.dim;
10
+ const BOLD = pc.bold;
11
+ export class InputBar {
12
+ rl;
13
+ value = "";
14
+ cursor = 0;
15
+ historyIndex = -1;
16
+ history;
17
+ commands;
18
+ suggestionIndex = 0;
19
+ showSuggestions = false;
20
+ submitting = false;
21
+ onSubmit;
22
+ onExit;
23
+ prefix;
24
+ placeholder;
25
+ constructor(options) {
26
+ this.history = options.history ?? [];
27
+ this.commands = options.commands ?? [];
28
+ this.onSubmit = options.onSubmit;
29
+ this.onExit = options.onExit;
30
+ this.prefix = options.prefix ?? RED("❯");
31
+ this.placeholder = options.placeholder ?? "";
32
+ this.rl = createInterface({
33
+ input: process.stdin,
34
+ output: process.stdout,
35
+ terminal: true,
36
+ });
37
+ this.setupRawMode();
38
+ }
39
+ setupRawMode() {
40
+ if (process.stdin.isTTY) {
41
+ process.stdin.setRawMode(true);
42
+ }
43
+ process.stdin.on("data", (data) => {
44
+ this.handleInput(data);
45
+ });
46
+ }
47
+ handleInput(data) {
48
+ if (this.submitting)
49
+ return;
50
+ const key = data.toString();
51
+ const code = data[0];
52
+ // Ctrl+C
53
+ if (code === 3) {
54
+ if (this.onExit) {
55
+ this.onExit();
56
+ }
57
+ else {
58
+ process.exit(0);
59
+ }
60
+ return;
61
+ }
62
+ // Ctrl+D
63
+ if (code === 4) {
64
+ if (this.onExit) {
65
+ this.onExit();
66
+ }
67
+ else {
68
+ process.exit(0);
69
+ }
70
+ return;
71
+ }
72
+ // Enter
73
+ if (code === 13) {
74
+ this.handleSubmit();
75
+ return;
76
+ }
77
+ // Backspace
78
+ if (code === 127 || code === 8) {
79
+ this.handleBackspace();
80
+ return;
81
+ }
82
+ // Arrow keys (escape sequences)
83
+ if (data.length === 3 && data[0] === 27 && data[1] === 91) {
84
+ const arrow = data[2];
85
+ if (arrow === 65)
86
+ this.handleArrowUp(); // Up
87
+ if (arrow === 66)
88
+ this.handleArrowDown(); // Down
89
+ if (arrow === 67)
90
+ this.handleArrowRight(); // Right
91
+ if (arrow === 68)
92
+ this.handleArrowLeft(); // Left
93
+ return;
94
+ }
95
+ // Home (escape sequence)
96
+ if (data.length === 3 && data[0] === 27 && data[1] === 91 && data[2] === 72) {
97
+ this.cursor = 0;
98
+ this.render();
99
+ return;
100
+ }
101
+ // End (escape sequence)
102
+ if (data.length === 3 && data[0] === 27 && data[1] === 91 && data[2] === 70) {
103
+ this.cursor = this.value.length;
104
+ this.render();
105
+ return;
106
+ }
107
+ // Tab - autocomplete
108
+ if (code === 9) {
109
+ this.handleTab();
110
+ return;
111
+ }
112
+ // Escape
113
+ if (code === 27) {
114
+ if (this.showSuggestions) {
115
+ this.showSuggestions = false;
116
+ this.render();
117
+ }
118
+ return;
119
+ }
120
+ // Printable characters
121
+ if (code !== undefined && code >= 32 && code < 127) {
122
+ this.handleChar(key);
123
+ }
124
+ }
125
+ handleChar(char) {
126
+ this.value = this.value.slice(0, this.cursor) + char + this.value.slice(this.cursor);
127
+ this.cursor += char.length;
128
+ this.historyIndex = -1;
129
+ this.showSuggestions = this.value.startsWith("/");
130
+ this.suggestionIndex = 0;
131
+ this.render();
132
+ }
133
+ handleBackspace() {
134
+ if (this.cursor > 0) {
135
+ this.value = this.value.slice(0, this.cursor - 1) + this.value.slice(this.cursor);
136
+ this.cursor--;
137
+ this.render();
138
+ }
139
+ }
140
+ handleArrowUp() {
141
+ if (this.showSuggestions) {
142
+ // Navigate suggestions
143
+ if (this.suggestionIndex > 0) {
144
+ this.suggestionIndex--;
145
+ this.render();
146
+ }
147
+ return;
148
+ }
149
+ // Navigate history
150
+ if (this.history.length > 0 && this.historyIndex + 1 < this.history.length) {
151
+ this.historyIndex++;
152
+ this.value = this.history[this.historyIndex];
153
+ this.cursor = this.value.length;
154
+ this.render();
155
+ }
156
+ }
157
+ handleArrowDown() {
158
+ if (this.showSuggestions) {
159
+ // Navigate suggestions
160
+ const suggestions = this.getSuggestions();
161
+ if (this.suggestionIndex < suggestions.length - 1) {
162
+ this.suggestionIndex++;
163
+ this.render();
164
+ }
165
+ return;
166
+ }
167
+ // Navigate history
168
+ if (this.historyIndex > 0) {
169
+ this.historyIndex--;
170
+ this.value = this.history[this.historyIndex];
171
+ this.cursor = this.value.length;
172
+ }
173
+ else if (this.historyIndex === 0) {
174
+ this.historyIndex = -1;
175
+ this.value = "";
176
+ this.cursor = 0;
177
+ }
178
+ this.render();
179
+ }
180
+ handleArrowLeft() {
181
+ if (this.cursor > 0) {
182
+ this.cursor--;
183
+ this.render();
184
+ }
185
+ }
186
+ handleArrowRight() {
187
+ if (this.cursor < this.value.length) {
188
+ this.cursor++;
189
+ this.render();
190
+ }
191
+ }
192
+ handleTab() {
193
+ if (!this.showSuggestions)
194
+ return;
195
+ const suggestions = this.getSuggestions();
196
+ if (suggestions.length > 0) {
197
+ const cmd = suggestions[this.suggestionIndex];
198
+ this.value = `/${cmd.name} `;
199
+ this.cursor = this.value.length;
200
+ this.showSuggestions = false;
201
+ this.render();
202
+ }
203
+ }
204
+ handleSubmit() {
205
+ if (this.value.trim() === "")
206
+ return;
207
+ // Check for commands
208
+ if (this.value.startsWith("/")) {
209
+ const spaceIndex = this.value.indexOf(" ");
210
+ const cmdName = spaceIndex >= 0
211
+ ? this.value.slice(1, spaceIndex)
212
+ : this.value.slice(1);
213
+ const cmdArgs = spaceIndex >= 0
214
+ ? this.value.slice(spaceIndex + 1).trim()
215
+ : "";
216
+ const cmd = this.commands.find((c) => c.name === cmdName);
217
+ if (cmd) {
218
+ this.value = "";
219
+ this.cursor = 0;
220
+ this.showSuggestions = false;
221
+ this.render();
222
+ cmd.onExecute(cmdArgs);
223
+ return;
224
+ }
225
+ }
226
+ this.submitting = true;
227
+ this.history.unshift(this.value);
228
+ if (this.history.length > 50)
229
+ this.history.pop();
230
+ const value = this.value;
231
+ this.value = "";
232
+ this.cursor = 0;
233
+ this.showSuggestions = false;
234
+ this.render();
235
+ this.onSubmit(value);
236
+ this.submitting = false;
237
+ }
238
+ getSuggestions() {
239
+ if (!this.value.startsWith("/"))
240
+ return [];
241
+ const query = this.value.slice(1).toLowerCase();
242
+ return this.commands.filter((cmd) => cmd.name.toLowerCase().includes(query));
243
+ }
244
+ render() {
245
+ // Clear current line
246
+ process.stdout.write("\r\x1B[K");
247
+ // Render prompt
248
+ const prefix = `${this.prefix} `;
249
+ process.stdout.write(prefix);
250
+ // Render value with cursor
251
+ if (this.value.length === 0 && this.placeholder) {
252
+ process.stdout.write(`${DIM(this.placeholder)}`);
253
+ }
254
+ else {
255
+ const before = this.value.slice(0, this.cursor);
256
+ const at = this.cursor < this.value.length ? this.value[this.cursor] : " ";
257
+ const after = this.cursor < this.value.length ? this.value.slice(this.cursor + 1) : "";
258
+ process.stdout.write(before);
259
+ process.stdout.write(`${pc.inverse(at)}`);
260
+ process.stdout.write(after);
261
+ }
262
+ // Render suggestions
263
+ if (this.showSuggestions) {
264
+ const suggestions = this.getSuggestions();
265
+ if (suggestions.length > 0) {
266
+ process.stdout.write("\n");
267
+ for (let i = 0; i < suggestions.length; i++) {
268
+ const cmd = suggestions[i];
269
+ const isFocused = i === this.suggestionIndex;
270
+ const marker = isFocused ? RED("❯") : " ";
271
+ const name = isFocused ? RED(BOLD(`/${cmd.name}`)) : GRAY(`/${cmd.name}`);
272
+ const desc = DIM(` ${cmd.description}`);
273
+ process.stdout.write(`${marker} ${name}${desc}\n`);
274
+ }
275
+ }
276
+ }
277
+ }
278
+ prompt() {
279
+ this.render();
280
+ }
281
+ destroy() {
282
+ this.rl.close();
283
+ if (process.stdin.isTTY) {
284
+ process.stdin.setRawMode(false);
285
+ }
286
+ }
287
+ }
288
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Provider, ProviderConfig, ProviderKind, ProviderImplementation } from "./types.js";
2
+ export type { Provider, ProviderConfig, ProviderKind };
3
+ export declare function createProvider(config: ProviderConfig): ProviderImplementation;
4
+ export declare function providerKindFromString(kind: string): ProviderKind;
5
+ export declare function detectProviderKind(model: string): ProviderKind;
@@ -0,0 +1,54 @@
1
+ // factory.ts — Provider factory. Based on opencode/packages/llm/src/providers/index.ts + zero/internal/providers/factory.go
2
+ import { createOpenAIProvider } from "./providers/openai.js";
3
+ import { createAnthropicProvider } from "./providers/anthropic.js";
4
+ import { createGoogleProvider } from "./providers/google.js";
5
+ import { createOpenAICompatibleProvider } from "./providers/openai-compatible.js";
6
+ import { createOllamaProvider } from "./providers/ollama.js";
7
+ export function createProvider(config) {
8
+ switch (config.kind) {
9
+ case "openai":
10
+ return createOpenAIProvider(config);
11
+ case "anthropic":
12
+ return createAnthropicProvider(config);
13
+ case "google":
14
+ return createGoogleProvider(config);
15
+ case "openai-compatible":
16
+ return createOpenAICompatibleProvider(config);
17
+ case "ollama":
18
+ return createOllamaProvider(config);
19
+ default:
20
+ throw new Error(`Unknown provider kind: ${config.kind}`);
21
+ }
22
+ }
23
+ export function providerKindFromString(kind) {
24
+ switch (kind.toLowerCase()) {
25
+ case "openai":
26
+ case "openai-compat":
27
+ case "openai-compatible":
28
+ return "openai-compatible";
29
+ case "anthropic":
30
+ case "anthropic-compat":
31
+ case "anthropic-compatible":
32
+ return "anthropic";
33
+ case "google":
34
+ case "gemini":
35
+ return "google";
36
+ case "ollama":
37
+ return "ollama";
38
+ default:
39
+ return "openai-compatible";
40
+ }
41
+ }
42
+ export function detectProviderKind(model) {
43
+ const lower = model.toLowerCase();
44
+ if (lower.startsWith("gpt-") || lower.startsWith("o1-") || lower.startsWith("o3-"))
45
+ return "openai";
46
+ if (lower.startsWith("claude-"))
47
+ return "anthropic";
48
+ if (lower.startsWith("gemini-") || lower.startsWith("google-"))
49
+ return "google";
50
+ if (lower.includes("ollama") || lower.startsWith("ollama:"))
51
+ return "ollama";
52
+ return "openai-compatible";
53
+ }
54
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAG5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAI7D,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,WAAW;YACd,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;QACzC,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,mBAAmB;YACtB,OAAO,8BAA8B,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,eAAe,CAAC;QACrB,KAAK,mBAAmB;YACtB,OAAO,mBAAmB,CAAC;QAC7B,KAAK,WAAW,CAAC;QACjB,KAAK,kBAAkB,CAAC;QACxB,KAAK,sBAAsB;YACzB,OAAO,WAAW,CAAC;QACrB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,mBAAmB,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpG,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,WAAW,CAAC;IACpD,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChF,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7E,OAAO,mBAAmB,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from "./types.js";
2
+ export * from "./provider.js";
3
+ export * from "./factory.js";
4
+ export * from "./registry.js";
5
+ export { createOpenAIProvider } from "./providers/openai.js";
6
+ export { createAnthropicProvider } from "./providers/anthropic.js";
7
+ export { createGoogleProvider } from "./providers/google.js";
8
+ export { createOpenAICompatibleProvider } from "./providers/openai-compatible.js";
9
+ export { createOllamaProvider } from "./providers/ollama.js";
@@ -0,0 +1,11 @@
1
+ // index.ts — LLM package exports
2
+ export * from "./types.js";
3
+ export * from "./provider.js";
4
+ export * from "./factory.js";
5
+ export * from "./registry.js";
6
+ export { createOpenAIProvider } from "./providers/openai.js";
7
+ export { createAnthropicProvider } from "./providers/anthropic.js";
8
+ export { createGoogleProvider } from "./providers/google.js";
9
+ export { createOpenAICompatibleProvider } from "./providers/openai-compatible.js";
10
+ export { createOllamaProvider } from "./providers/ollama.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ProviderConfig, ProviderImplementation, LLMRequest, LLMResponse, StreamChunk, ValidationResult, ReasoningEffort, ProviderKind } from "./types.js";
2
+ export declare abstract class BaseProvider implements ProviderImplementation {
3
+ readonly id: string;
4
+ readonly kind: ProviderKind;
5
+ readonly model: string;
6
+ readonly maxTokens?: number;
7
+ protected apiKey?: string;
8
+ protected baseUrl: string;
9
+ protected customHeaders: Record<string, string>;
10
+ protected oauthResolver?: ProviderConfig["oauthResolver"];
11
+ protected oauthLoginKey?: string;
12
+ protected parseThinkTags: boolean;
13
+ constructor(config: ProviderConfig);
14
+ protected abstract defaultBaseUrl(): string;
15
+ protected abstract chatCompletionsEndpoint(): string;
16
+ protected abstract modelsEndpoint(): string;
17
+ generate(request: LLMRequest): Promise<LLMResponse>;
18
+ stream(request: LLMRequest): AsyncGenerator<StreamChunk>;
19
+ listModels(): Promise<string[]>;
20
+ validateConfig(): Promise<ValidationResult>;
21
+ protected abstract buildRequestBody(request: LLMRequest, stream: boolean): object;
22
+ protected abstract parseResponse(data: unknown): LLMResponse;
23
+ protected abstract parseStreamChunk(data: unknown): StreamChunk[];
24
+ protected authenticatedFetch(url: string, init?: RequestInit): Promise<Response>;
25
+ protected buildHeaders(): Promise<Headers>;
26
+ protected mapReasoningEffort(effort?: ReasoningEffort): string | undefined;
27
+ }
@@ -0,0 +1,98 @@
1
+ // provider.ts — Simplified provider interface and factory
2
+ export class BaseProvider {
3
+ id;
4
+ kind;
5
+ model;
6
+ maxTokens;
7
+ apiKey;
8
+ baseUrl;
9
+ customHeaders;
10
+ oauthResolver;
11
+ oauthLoginKey;
12
+ parseThinkTags;
13
+ constructor(config) {
14
+ this.id = config.id;
15
+ this.kind = config.kind;
16
+ this.model = config.defaultModel ?? "";
17
+ this.maxTokens = config.maxTokens;
18
+ this.apiKey = config.apiKey;
19
+ this.baseUrl = config.baseUrl ?? this.defaultBaseUrl();
20
+ this.customHeaders = config.customHeaders ?? {};
21
+ this.oauthResolver = config.oauthResolver;
22
+ this.oauthLoginKey = config.oauthLoginKey;
23
+ this.parseThinkTags = config.parseThinkTags ?? false;
24
+ }
25
+ async generate(request) {
26
+ const body = this.buildRequestBody(request, false);
27
+ const res = await this.authenticatedFetch(this.chatCompletionsEndpoint(), {
28
+ method: "POST",
29
+ body: JSON.stringify(body),
30
+ });
31
+ if (!res.ok)
32
+ throw new Error(`${this.kind} API error ${res.status}: ${await res.text()}`);
33
+ return this.parseResponse(await res.json());
34
+ }
35
+ async *stream(request) {
36
+ const body = this.buildRequestBody(request, true);
37
+ const res = await this.authenticatedFetch(this.chatCompletionsEndpoint(), {
38
+ method: "POST",
39
+ body: JSON.stringify(body),
40
+ });
41
+ if (!res.ok)
42
+ throw new Error(`${this.kind} API error ${res.status}: ${await res.text()}`);
43
+ const reader = res.body.getReader();
44
+ try {
45
+ while (true) {
46
+ const { done, value } = await reader.read();
47
+ if (done)
48
+ break;
49
+ for (const chunk of this.parseStreamChunk(value))
50
+ yield chunk;
51
+ }
52
+ }
53
+ finally {
54
+ reader.releaseLock();
55
+ }
56
+ }
57
+ async listModels() {
58
+ const res = await this.authenticatedFetch(this.modelsEndpoint());
59
+ if (!res.ok)
60
+ return [];
61
+ const data = (await res.json().catch(() => ({ data: [] })));
62
+ return (data.data ?? []).map((m) => m.id);
63
+ }
64
+ async validateConfig() {
65
+ try {
66
+ const models = await this.listModels();
67
+ return { ok: models.length > 0, message: `${models.length} models available` };
68
+ }
69
+ catch (e) {
70
+ return { ok: false, message: String(e) };
71
+ }
72
+ }
73
+ async authenticatedFetch(url, init = {}) {
74
+ const headers = await this.buildHeaders();
75
+ return fetch(url, { ...init, headers });
76
+ }
77
+ async buildHeaders() {
78
+ const headers = new Headers({ "Content-Type": "application/json" });
79
+ for (const [k, v] of Object.entries(this.customHeaders))
80
+ headers.set(k, v);
81
+ if (this.oauthResolver && this.oauthLoginKey) {
82
+ const resolved = await this.oauthResolver();
83
+ if (resolved?.token) {
84
+ headers.set("Authorization", `Bearer ${resolved.token}`);
85
+ return headers;
86
+ }
87
+ }
88
+ if (this.apiKey)
89
+ headers.set("Authorization", `Bearer ${this.apiKey}`);
90
+ return headers;
91
+ }
92
+ mapReasoningEffort(effort) {
93
+ if (!effort || effort === "none")
94
+ return undefined;
95
+ return effort;
96
+ }
97
+ }
98
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { BaseProvider } from "../provider.js";
2
+ import type { ProviderConfig, LLMRequest, LLMResponse, StreamChunk, Usage } from "../types.js";
3
+ export declare class AnthropicProvider extends BaseProvider {
4
+ protected defaultBaseUrl(): string;
5
+ protected chatCompletionsEndpoint(): string;
6
+ protected modelsEndpoint(): string;
7
+ protected buildHeaders(): Promise<Headers>;
8
+ protected buildRequestBody(request: LLMRequest, stream: boolean): object;
9
+ protected mapToolChoice(choice: LLMRequest["toolChoice"]): object;
10
+ protected reasoningBudget(effort: string): number;
11
+ protected parseResponse(data: unknown): LLMResponse;
12
+ protected parseStreamChunk(data: unknown): StreamChunk[];
13
+ protected buildMessages(request: LLMRequest): object[];
14
+ protected mapMessage(msg: {
15
+ role: string;
16
+ content: string | object[];
17
+ }): object;
18
+ protected mapTools(request: LLMRequest): object[] | undefined;
19
+ protected mapUsage(data: unknown): Usage;
20
+ protected mapStopReason(data: unknown): LLMResponse["stopReason"];
21
+ private estimateCost;
22
+ }
23
+ export declare function createAnthropicProvider(config: ProviderConfig): AnthropicProvider;