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
package/dist/repl.js ADDED
@@ -0,0 +1,387 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readInput } from "./autocomplete.js";
3
+ import { buildRegistry } from "./commands/index.js";
4
+ import { buildProvider, getProviderNames, getProviderLabel, getDefaultModel } from "./provider/registry.js";
5
+ import { getModelCache } from "./modelCache.js";
6
+ import { getEnabledTools } from "./tools/registry.js";
7
+ import { loadSkills } from "./skills/loader.js";
8
+ import { matchSkills, buildSkillInstructions } from "./skills/matcher.js";
9
+ import { resetFixState, shouldRetry, buildAutoFixPrompt, getFixStatus } from "./loop/autoFix.js";
10
+ import * as db from "./database.js";
11
+ import { printWelcome, printAction, printError, printWarning, printInfo, printProgress, printCommand, printToolCall, printToolResult, printContent, printDone, printBox, printStatusBar, printStatusFooter, printKV, printMeta, getPromptLabel, startSpinner, stopSpinner, isSpinnerRunning, } from "./ui.js";
12
+ const VERSION = "2.0.0";
13
+ const COMMAND_LIST = [
14
+ { name: "/help", description: "Show all commands" },
15
+ { name: "/exit", description: "Exit vegas" },
16
+ { name: "/apikey", description: "Set API key for a provider" },
17
+ { name: "/provider", description: "Show or switch provider" },
18
+ { name: "/providers", description: "List all providers and their status" },
19
+ { name: "/model", description: "Show or switch model" },
20
+ { name: "/models", description: "Fetch and list available models" },
21
+ { name: "/config", description: "Show or set config values" },
22
+ { name: "/clear", description: "Clear chat history" },
23
+ { name: "/tools", description: "List available tools and their status" },
24
+ { name: "/skills", description: "Manage skills (list/add/remove/refresh)" },
25
+ { name: "/save", description: "Save session to JSON file" },
26
+ { name: "/load", description: "Load session from JSON file" },
27
+ { name: "/sessions", description: "List all SQLite sessions" },
28
+ { name: "/session", description: "Manage sessions" },
29
+ { name: "/history", description: "Show last N chat messages" },
30
+ { name: "/retry", description: "Retry last request" },
31
+ { name: "/remember", description: "Save to long-term memory" },
32
+ { name: "/recall", description: "Recall from memory" },
33
+ { name: "/forget", description: "Delete a memory" },
34
+ { name: "/memories", description: "List all memories" },
35
+ { name: "/analyze", description: "Analyze project structure" },
36
+ { name: "/test", description: "Run tests with auto-fix" },
37
+ { name: "/lint", description: "Run linter with auto-fix" },
38
+ { name: "/refactor", description: "Analyze code quality & suggest refactors" },
39
+ { name: "/fix", description: "Run lint + test in sequence" },
40
+ { name: "/version", description: "Show vegas version" },
41
+ ];
42
+ export class REPL {
43
+ config;
44
+ commands;
45
+ history = [];
46
+ activeSkills = [];
47
+ sessionId;
48
+ modelCache = null;
49
+ constructor(config) {
50
+ this.config = config;
51
+ this.sessionId = this.initSession();
52
+ this.commands = buildRegistry(config, () => this.history, (msgs) => { this.history = msgs; }, () => this.sessionId, (id) => { this.sessionId = id; });
53
+ }
54
+ initSession() {
55
+ if (db.isAvailable()) {
56
+ const sessions = db.listSessions();
57
+ if (sessions.length > 0) {
58
+ const last = sessions[0];
59
+ const msgs = db.loadMessages(last.id);
60
+ this.history = msgs;
61
+ return last.id;
62
+ }
63
+ const id = randomUUID();
64
+ db.createSession(id, `Session ${new Date().toLocaleDateString()}`);
65
+ return id;
66
+ }
67
+ return randomUUID();
68
+ }
69
+ persistHistory() {
70
+ if (db.isAvailable()) {
71
+ db.clearSessionMessages(this.sessionId);
72
+ db.saveMessages(this.sessionId, this.history);
73
+ }
74
+ }
75
+ checkFirstRun() {
76
+ const apiKeys = this.config.get().apiKeys;
77
+ return Object.keys(apiKeys).length === 0;
78
+ }
79
+ ctx() {
80
+ const prov = this.config.getProvider();
81
+ const model = this.config.getModel();
82
+ const hasKey = !!this.config.getApiKey(prov);
83
+ const msgCount = this.history.filter(m => m.role === "user").length;
84
+ return { prov, model, hasKey, msgCount };
85
+ }
86
+ showFooter() {
87
+ const { prov, model, hasKey, msgCount } = this.ctx();
88
+ printStatusFooter(prov, model, hasKey, msgCount, db.isAvailable() ? this.sessionId : undefined);
89
+ }
90
+ getCompletions(input) {
91
+ const cmd = input.split(/\s+/)[0]?.toLowerCase();
92
+ const args = input.split(/\s+/).slice(1).join(" ");
93
+ if (cmd === "/model" || cmd === "/m") {
94
+ if (args.length > 0)
95
+ return [];
96
+ const prov = this.config.getProvider();
97
+ const cached = getModelCache(prov);
98
+ if (cached.length > 0) {
99
+ const def = getDefaultModel(prov);
100
+ return cached.map((m) => ({
101
+ name: m,
102
+ description: m === def ? `default for ${getProviderLabel(prov)}` : getProviderLabel(prov),
103
+ }));
104
+ }
105
+ const def = getDefaultModel(prov);
106
+ return [
107
+ { name: def, description: `default for ${getProviderLabel(prov)}` },
108
+ { name: "?", description: "run /models to see all" },
109
+ ];
110
+ }
111
+ if (cmd === "/apikey" || cmd === "/key" || cmd === "/api-key") {
112
+ if (args.length > 0)
113
+ return [];
114
+ return getProviderNames().map((p) => ({ name: p, description: getProviderLabel(p) }));
115
+ }
116
+ if (cmd === "/provider" || cmd === "/prov") {
117
+ if (args.length > 0)
118
+ return [];
119
+ return getProviderNames().map((p) => ({ name: p, description: getProviderLabel(p) }));
120
+ }
121
+ return COMMAND_LIST;
122
+ }
123
+ async run() {
124
+ const sessionLabel = db.isAvailable() ? this.sessionId : undefined;
125
+ printWelcome(VERSION, sessionLabel);
126
+ const isFirstRun = this.checkFirstRun();
127
+ if (isFirstRun) {
128
+ printBox("First Run", [
129
+ "Set an API key to get started:",
130
+ " /apikey <provider> <key>",
131
+ " Example: /apikey openai sk-...",
132
+ ], "warning");
133
+ }
134
+ if (this.history.length > 0 && !isFirstRun) {
135
+ const userCount = this.history.filter(m => m.role === "user").length;
136
+ printInfo(`Restored session with ${userCount} previous message(s)`);
137
+ }
138
+ // Initial status bar
139
+ const { prov, model, hasKey, msgCount } = this.ctx();
140
+ printStatusBar(prov, model, msgCount, db.isAvailable() ? this.sessionId : undefined, hasKey);
141
+ while (true) {
142
+ const line = await readInput(getPromptLabel(), (input) => this.getCompletions(input));
143
+ const input = line.trim();
144
+ if (!input) {
145
+ this.showFooter();
146
+ continue;
147
+ }
148
+ try {
149
+ if (input.startsWith("/")) {
150
+ await this.handleCommand(input);
151
+ }
152
+ else {
153
+ this.history.push({ role: "user", content: input });
154
+ await this.handleChat();
155
+ }
156
+ }
157
+ catch (err) {
158
+ const msg = String(err).split("\n")[0];
159
+ printError(msg);
160
+ if (String(err).includes("fetch") || String(err).includes("ECONNREFUSED")) {
161
+ printCommand("Make sure the server is running");
162
+ }
163
+ }
164
+ this.showFooter();
165
+ }
166
+ }
167
+ async handleCommand(input) {
168
+ const parts = input.split(/\s+/);
169
+ const cmdName = parts[0].toLowerCase().slice(1);
170
+ const args = parts.slice(1);
171
+ if (cmdName === "retry") {
172
+ await this.handleRetry();
173
+ return;
174
+ }
175
+ const cmd = this.commands.get(cmdName);
176
+ if (!cmd) {
177
+ printWarning(`Unknown: /${cmdName}. Type /help for commands`);
178
+ return;
179
+ }
180
+ const result = await cmd.execute(args);
181
+ if (result !== null) {
182
+ printContent(result);
183
+ }
184
+ }
185
+ async handleRetry() {
186
+ resetFixState();
187
+ const lastUserMsg = this.history.filter(m => m.role === "user").pop();
188
+ if (!lastUserMsg) {
189
+ printWarning("Nothing to retry");
190
+ return;
191
+ }
192
+ const userIdx = this.history.lastIndexOf(lastUserMsg);
193
+ this.history = this.history.slice(0, userIdx + 1);
194
+ printProgress("Retrying...");
195
+ await this.handleChat();
196
+ }
197
+ async handleChat() {
198
+ const provider = buildProvider(this.config);
199
+ if (!provider) {
200
+ const prov = this.config.getProvider();
201
+ const model = this.config.getModel();
202
+ const hasKey = this.config.getApiKey(prov);
203
+ printAction("Provider check");
204
+ printKV("Provider", `${getProviderLabel(prov)} (${prov})`);
205
+ printKV("Model", model);
206
+ if (!hasKey && prov !== "9router" && prov !== "ollama") {
207
+ printWarning("No API key");
208
+ printCommand(`/apikey ${prov} <key>`);
209
+ }
210
+ this.history.pop();
211
+ return;
212
+ }
213
+ resetFixState();
214
+ const lastUserMsg = this.history.filter(m => m.role === "user").pop()?.content || "";
215
+ this.activeSkills = matchSkills(lastUserMsg, loadSkills());
216
+ const tools = getEnabledTools(this.config);
217
+ const systemMsg = this.buildSystemPrompt(tools, this.activeSkills);
218
+ const messages = [systemMsg, ...this.history];
219
+ if (this.activeSkills.length > 0) {
220
+ printInfo(`Skills: ${this.activeSkills.map(s => s.name).join(", ")}`);
221
+ }
222
+ startSpinner("Thinking...");
223
+ try {
224
+ const response = await provider.chat(messages, tools);
225
+ await this.processLLMResponse(provider, response, messages, tools, 0);
226
+ }
227
+ catch (err) {
228
+ if (isSpinnerRunning())
229
+ stopSpinner("", undefined);
230
+ const msg = String(err);
231
+ printError(msg);
232
+ if (msg.includes("model_not_found") || msg.includes("model not found")) {
233
+ printCommand("Try /models then /model <name>");
234
+ }
235
+ if (msg.includes("401") || msg.includes("unauthorized") || msg.includes("No active credentials")) {
236
+ printCommand("Set key: /apikey " + this.config.getProvider() + " <key>");
237
+ }
238
+ this.history.pop();
239
+ }
240
+ finally {
241
+ if (isSpinnerRunning()) {
242
+ stopSpinner("", undefined);
243
+ }
244
+ }
245
+ this.persistHistory();
246
+ }
247
+ buildSystemPrompt(tools, matchedSkills = [], errorContext) {
248
+ const toolList = tools.map(t => ` - ${t.name}: ${t.description}`).join("\n");
249
+ let content = `You are vegas, an AI CLI agent. You have access to the following tools:\n\n${toolList}\n\nUse tools when needed to complete tasks. Think step by step. Execute commands, read/write files, and help the user with coding and system tasks.\n\nWhen a command returns an error, analyze the error and try a different approach to fix it. Check if files exist, install missing dependencies, fix syntax errors, or try alternative commands. You have up to 5 retry attempts.\n\nAnswer concisely and be helpful.`;
250
+ if (matchedSkills.length > 0) {
251
+ content = buildSkillInstructions(matchedSkills, content);
252
+ }
253
+ if (errorContext) {
254
+ content += `\n\nNote from previous attempt:\n${errorContext}`;
255
+ }
256
+ return { role: "system", content };
257
+ }
258
+ async processLLMResponse(provider, response, messages, tools, depth) {
259
+ const MAX_DEPTH = 25;
260
+ if (depth >= MAX_DEPTH) {
261
+ if (isSpinnerRunning())
262
+ stopSpinner("", undefined);
263
+ printWarning(`Max depth (${MAX_DEPTH})`);
264
+ return;
265
+ }
266
+ if (response.tool_calls && response.tool_calls.length > 0) {
267
+ this.history.push({
268
+ role: "assistant",
269
+ content: response.content || "",
270
+ tool_calls: response.tool_calls,
271
+ });
272
+ if (isSpinnerRunning())
273
+ stopSpinner("", undefined);
274
+ let hasError = false;
275
+ let lastErrorText = "";
276
+ const t0 = performance.now();
277
+ const totalCalls = response.tool_calls.length;
278
+ let callIndex = 0;
279
+ for (const tc of response.tool_calls) {
280
+ callIndex++;
281
+ const tool = tools.find(t => t.name === tc.function.name);
282
+ if (!tool) {
283
+ printWarning(`Unknown tool: ${tc.function.name}`);
284
+ this.history.push({
285
+ role: "tool",
286
+ tool_call_id: tc.id,
287
+ name: tc.function.name,
288
+ content: `Error: unknown tool "${tc.function.name}"`,
289
+ });
290
+ continue;
291
+ }
292
+ let args;
293
+ try {
294
+ args = JSON.parse(tc.function.arguments);
295
+ }
296
+ catch {
297
+ args = { raw: tc.function.arguments };
298
+ }
299
+ printToolCall(tc.function.name, args);
300
+ startSpinner(`Running ${tc.function.name}...`);
301
+ const tStart = performance.now();
302
+ const result = await tool.execute(args);
303
+ const tEnd = performance.now();
304
+ const elapsed = ((tEnd - tStart) / 1000).toFixed(3);
305
+ const resultText = result.content.map(c => c.text).join("\n");
306
+ stopSpinner("", undefined);
307
+ if (result.isError) {
308
+ hasError = true;
309
+ lastErrorText = resultText;
310
+ const errPreview = resultText.substring(0, 250);
311
+ const errLines = errPreview.split("\n").slice(0, 3);
312
+ printToolResult(tc.function.name, `${elapsed}s`, false, errLines.join("\n"));
313
+ if (resultText.length > 250) {
314
+ printMeta("(...truncated)");
315
+ }
316
+ }
317
+ else {
318
+ printToolResult(tc.function.name, `${elapsed}s`, true);
319
+ }
320
+ this.history.push({
321
+ role: "tool",
322
+ tool_call_id: tc.id,
323
+ name: tc.function.name,
324
+ content: resultText,
325
+ });
326
+ }
327
+ const t1 = performance.now();
328
+ const totalElapsed = ((t1 - t0) / 1000).toFixed(3);
329
+ let errorContext;
330
+ if (hasError && shouldRetry(lastErrorText)) {
331
+ const fixStatus = getFixStatus();
332
+ errorContext = buildAutoFixPrompt(lastErrorText, fixStatus.retryCount);
333
+ }
334
+ // Print summary before next step
335
+ if (totalCalls > 1) {
336
+ const summary = hasError ? "completed with errors" : "done";
337
+ printDone(`${totalElapsed}s · ${totalCalls} call${totalCalls > 1 ? "s" : ""} · ${summary}`);
338
+ }
339
+ const updatedMessages = [
340
+ this.buildSystemPrompt(tools, this.activeSkills, errorContext),
341
+ ...this.history,
342
+ ];
343
+ const stepLabel = errorContext
344
+ ? `Auto-fixing (${getFixStatus().retryCount}/${getFixStatus().maxRetries})...`
345
+ : `Step ${depth + 2}...`;
346
+ startSpinner(stepLabel);
347
+ try {
348
+ const nextResponse = await provider.chat(updatedMessages, tools);
349
+ await this.processLLMResponse(provider, nextResponse, updatedMessages, tools, depth + 1);
350
+ }
351
+ catch (err) {
352
+ if (isSpinnerRunning())
353
+ stopSpinner("", undefined);
354
+ printError(String(err));
355
+ }
356
+ }
357
+ else {
358
+ if (isSpinnerRunning())
359
+ stopSpinner("", undefined);
360
+ // Print final response content
361
+ if (response.content && response.content.trim()) {
362
+ for (const line of response.content.trim().split("\n")) {
363
+ console.log(` ${line}`);
364
+ }
365
+ // Show completion indicator after text
366
+ if (depth > 0)
367
+ printDone("");
368
+ }
369
+ else {
370
+ // Empty response
371
+ if (depth > 0) {
372
+ // After tool calls, empty final response = success
373
+ printDone("");
374
+ }
375
+ else {
376
+ // Direct request with no tools and no text
377
+ printWarning("Model returned empty response");
378
+ }
379
+ }
380
+ this.history.push({
381
+ role: "assistant",
382
+ content: response.content || "",
383
+ });
384
+ }
385
+ }
386
+ }
387
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface Skill {
2
+ name: string;
3
+ description: string;
4
+ trigger: string[];
5
+ content: string;
6
+ filePath: string;
7
+ }
8
+ export declare function getSkillsDir(): string;
9
+ export declare function ensureSkillsDir(): void;
10
+ export declare function loadSkills(): Skill[];
11
+ export declare function loadSkill(name: string): Skill | null;
12
+ export declare function addSkill(name: string, content: string, description?: string): Skill;
13
+ export declare function removeSkill(name: string): boolean;
14
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED,wBAAgB,UAAU,IAAI,KAAK,EAAE,CAsBpC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAKpD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAcnF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CASjD"}
@@ -0,0 +1,109 @@
1
+ import { readFileSync, readdirSync, existsSync, mkdirSync, writeFileSync, unlinkSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const SKILLS_DIR = join(homedir(), ".vegas", "skills");
5
+ export function getSkillsDir() {
6
+ return SKILLS_DIR;
7
+ }
8
+ export function ensureSkillsDir() {
9
+ if (!existsSync(SKILLS_DIR)) {
10
+ mkdirSync(SKILLS_DIR, { recursive: true });
11
+ }
12
+ }
13
+ export function loadSkills() {
14
+ ensureSkillsDir();
15
+ try {
16
+ const entries = readdirSync(SKILLS_DIR);
17
+ const mdFiles = entries.filter(e => e.endsWith(".md"));
18
+ const skills = [];
19
+ for (const file of mdFiles) {
20
+ try {
21
+ const fullPath = join(SKILLS_DIR, file);
22
+ const skill = parseSkillFile(fullPath);
23
+ if (skill)
24
+ skills.push(skill);
25
+ }
26
+ catch {
27
+ // skip invalid files
28
+ }
29
+ }
30
+ return skills;
31
+ }
32
+ catch {
33
+ return [];
34
+ }
35
+ }
36
+ export function loadSkill(name) {
37
+ ensureSkillsDir();
38
+ const fullPath = join(SKILLS_DIR, `${name}.md`);
39
+ if (!existsSync(fullPath))
40
+ return null;
41
+ return parseSkillFile(fullPath);
42
+ }
43
+ export function addSkill(name, content, description) {
44
+ ensureSkillsDir();
45
+ const filePath = join(SKILLS_DIR, `${name}.md`);
46
+ const hasFrontmatter = content.trimStart().startsWith("---");
47
+ let finalContent = content;
48
+ if (!hasFrontmatter) {
49
+ finalContent = `---\nname: ${name}\ndescription: ${description || `${name} skill`}\ntrigger: ${name}\n---\n\n${content}`;
50
+ }
51
+ writeFileSync(filePath, finalContent, "utf-8");
52
+ const skill = parseSkillFile(filePath);
53
+ return skill || { name, description: description || "", trigger: [name], content, filePath };
54
+ }
55
+ export function removeSkill(name) {
56
+ const filePath = join(SKILLS_DIR, `${name}.md`);
57
+ if (!existsSync(filePath))
58
+ return false;
59
+ try {
60
+ unlinkSync(filePath);
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ function parseSkillFile(filePath) {
68
+ const raw = readFileSync(filePath, "utf-8");
69
+ const trimmed = raw.trim();
70
+ if (!trimmed.startsWith("---")) {
71
+ const name = filePath.split(/[\\/]/).pop()?.replace(".md", "") || "unknown";
72
+ return { name, description: "", trigger: [name], content: trimmed, filePath };
73
+ }
74
+ const endIndex = trimmed.indexOf("---", 3);
75
+ if (endIndex === -1)
76
+ return null;
77
+ const frontmatterRaw = trimmed.slice(3, endIndex).trim();
78
+ const content = trimmed.slice(endIndex + 3).trim();
79
+ const frontmatter = parseFrontmatter(frontmatterRaw);
80
+ const name = frontmatter.name || filePath.split(/[\\/]/).pop()?.replace(".md", "") || "unknown";
81
+ const description = frontmatter.description || "";
82
+ const triggerRaw = frontmatter.trigger || name;
83
+ const trigger = triggerRaw.split(",").map((s) => s.trim().toLowerCase()).filter(Boolean);
84
+ return { name, description, trigger, content, filePath };
85
+ }
86
+ function parseFrontmatter(raw) {
87
+ const result = {};
88
+ const lines = raw.split("\n");
89
+ let currentKey = "";
90
+ let currentValue = [];
91
+ for (const line of lines) {
92
+ const match = line.match(/^(\w+):\s*(.*)/);
93
+ if (match) {
94
+ if (currentKey) {
95
+ result[currentKey] = currentValue.join("\n").trim();
96
+ }
97
+ currentKey = match[1];
98
+ currentValue = [match[2]];
99
+ }
100
+ else if (currentKey) {
101
+ currentValue.push(line);
102
+ }
103
+ }
104
+ if (currentKey) {
105
+ result[currentKey] = currentValue.join("\n").trim();
106
+ }
107
+ return result;
108
+ }
109
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Skill } from "./loader.js";
2
+ /**
3
+ * Match user input against skill trigger keywords.
4
+ * Returns array of matched skills sorted by relevance (most keywords matched first).
5
+ */
6
+ export declare function matchSkills(input: string, skills: Skill[]): Skill[];
7
+ /**
8
+ * Extract skill instructions to prepend to the system prompt.
9
+ */
10
+ export declare function buildSkillInstructions(matchedSkills: Skill[], existingSystemPrompt: string): string;
11
+ //# sourceMappingURL=matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/skills/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAanE;AA0BD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAWnG"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Match user input against skill trigger keywords.
3
+ * Returns array of matched skills sorted by relevance (most keywords matched first).
4
+ */
5
+ export function matchSkills(input, skills) {
6
+ const lowerInput = input.toLowerCase();
7
+ const inputWords = lowerInput.split(/\s+/);
8
+ const scored = skills
9
+ .map(skill => {
10
+ const score = calculateMatchScore(lowerInput, inputWords, skill);
11
+ return { skill, score };
12
+ })
13
+ .filter(s => s.score > 0)
14
+ .sort((a, b) => b.score - a.score);
15
+ return scored.map(s => s.skill);
16
+ }
17
+ function calculateMatchScore(input, inputWords, skill) {
18
+ let score = 0;
19
+ for (const keyword of skill.trigger) {
20
+ const kw = keyword.toLowerCase();
21
+ // Exact keyword match in input
22
+ if (input.includes(kw)) {
23
+ score += 10;
24
+ }
25
+ // Match individual words
26
+ for (const word of inputWords) {
27
+ if (word === kw) {
28
+ score += 5;
29
+ }
30
+ else if (word.startsWith(kw) || kw.startsWith(word)) {
31
+ score += 2;
32
+ }
33
+ }
34
+ }
35
+ return score;
36
+ }
37
+ /**
38
+ * Extract skill instructions to prepend to the system prompt.
39
+ */
40
+ export function buildSkillInstructions(matchedSkills, existingSystemPrompt) {
41
+ if (matchedSkills.length === 0)
42
+ return existingSystemPrompt;
43
+ const skillBlocks = matchedSkills
44
+ .map(s => {
45
+ const header = `[Skill: ${s.name} — ${s.description}]`;
46
+ return `${header}\n${s.content}`;
47
+ })
48
+ .join("\n\n");
49
+ return `${existingSystemPrompt}\n\n---\nActive Skills:\n${skillBlocks}\n---`;
50
+ }
51
+ //# sourceMappingURL=matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/skills/matcher.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAAe;IACxD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,MAAM;SAClB,GAAG,CAAC,KAAK,CAAC,EAAE;QACX,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;SACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,UAAoB,EAAE,KAAY;IAC5E,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAEjC,+BAA+B;QAC/B,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;QAED,yBAAyB;QACzB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,aAAsB,EAAE,oBAA4B;IACzF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,oBAAoB,CAAC;IAE5D,MAAM,WAAW,GAAG,aAAa;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,GAAG,CAAC;QACvD,OAAO,GAAG,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO,GAAG,oBAAoB,4BAA4B,WAAW,OAAO,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const bashTool: ToolDefinition;
3
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAE9D,eAAO,MAAM,QAAQ,EAAE,cAwDtB,CAAC"}