centaurus-cli 2.9.2 → 2.9.4
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.
- package/dist/cli-adapter.d.ts +78 -11
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +851 -215
- package/dist/cli-adapter.js.map +1 -1
- package/dist/commands/CommandParser.d.ts +1 -1
- package/dist/commands/CommandParser.d.ts.map +1 -1
- package/dist/commands/CommandParser.js +113 -0
- package/dist/commands/CommandParser.js.map +1 -1
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +2 -0
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.d.ts +5 -0
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +63 -1
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/config/types.d.ts +2 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +1 -0
- package/dist/config/types.js.map +1 -1
- package/dist/context/context-manager.d.ts +1 -1
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +3 -1
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/handlers/docker-handler.d.ts +9 -0
- package/dist/context/handlers/docker-handler.d.ts.map +1 -1
- package/dist/context/handlers/docker-handler.js +99 -10
- package/dist/context/handlers/docker-handler.js.map +1 -1
- package/dist/context/handlers/ssh-handler.d.ts +20 -0
- package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
- package/dist/context/handlers/ssh-handler.js +129 -1
- package/dist/context/handlers/ssh-handler.js.map +1 -1
- package/dist/context/subshell-handler.d.ts +15 -0
- package/dist/context/subshell-handler.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/services/ai-autocomplete-agent.d.ts +39 -0
- package/dist/services/ai-autocomplete-agent.d.ts.map +1 -0
- package/dist/services/ai-autocomplete-agent.js +189 -0
- package/dist/services/ai-autocomplete-agent.js.map +1 -0
- package/dist/services/ai-service-client.d.ts +25 -0
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js +195 -12
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.js +1 -1
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/auth-handler.js +1 -1
- package/dist/services/auth-handler.js.map +1 -1
- package/dist/services/local-chat-storage.d.ts +21 -0
- package/dist/services/local-chat-storage.d.ts.map +1 -1
- package/dist/services/local-chat-storage.js +138 -43
- package/dist/services/local-chat-storage.js.map +1 -1
- package/dist/services/ollama-service.d.ts +197 -0
- package/dist/services/ollama-service.d.ts.map +1 -0
- package/dist/services/ollama-service.js +324 -0
- package/dist/services/ollama-service.js.map +1 -0
- package/dist/services/warpify-detector.d.ts +43 -0
- package/dist/services/warpify-detector.d.ts.map +1 -0
- package/dist/services/warpify-detector.js +203 -0
- package/dist/services/warpify-detector.js.map +1 -0
- package/dist/services/workflow-storage.d.ts +72 -0
- package/dist/services/workflow-storage.d.ts.map +1 -0
- package/dist/services/workflow-storage.js +239 -0
- package/dist/services/workflow-storage.js.map +1 -0
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +14 -0
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/enter-remote-session.d.ts +13 -0
- package/dist/tools/enter-remote-session.d.ts.map +1 -0
- package/dist/tools/enter-remote-session.js +226 -0
- package/dist/tools/enter-remote-session.js.map +1 -0
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +9 -2
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/grep-search.d.ts +104 -31
- package/dist/tools/grep-search.d.ts.map +1 -1
- package/dist/tools/grep-search.js +699 -430
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/workflow-tool.d.ts +11 -0
- package/dist/tools/workflow-tool.d.ts.map +1 -0
- package/dist/tools/workflow-tool.js +87 -0
- package/dist/tools/workflow-tool.js.map +1 -0
- package/dist/types/workflow.d.ts +110 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +8 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/ui/components/App.d.ts +12 -3
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +162 -6
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/Breadcrumbs.d.ts +4 -3
- package/dist/ui/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/ui/components/Breadcrumbs.js +60 -54
- package/dist/ui/components/Breadcrumbs.js.map +1 -1
- package/dist/ui/components/ConnectionStatusMessage.js +2 -2
- package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +3 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +488 -20
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.d.ts +2 -0
- package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/components/InteractiveShell.js +13 -3
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/MultiLineInput.d.ts.map +1 -1
- package/dist/ui/components/MultiLineInput.js +68 -2
- package/dist/ui/components/MultiLineInput.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +169 -26
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/WorkflowCreatorScreen.d.ts +25 -0
- package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +1 -0
- package/dist/ui/components/WorkflowCreatorScreen.js +164 -0
- package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -0
- package/dist/utils/command-history.d.ts +12 -2
- package/dist/utils/command-history.d.ts.map +1 -1
- package/dist/utils/command-history.js +57 -13
- package/dist/utils/command-history.js.map +1 -1
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +3 -2
- package/dist/utils/input-classifier.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Service
|
|
3
|
+
* Client for interacting with the local Ollama API
|
|
4
|
+
*
|
|
5
|
+
* Ollama exposes a REST API at http://localhost:11434 by default.
|
|
6
|
+
* This service provides methods for:
|
|
7
|
+
* - Checking if Ollama is running
|
|
8
|
+
* - Fetching available local models
|
|
9
|
+
* - Sending chat messages to local models
|
|
10
|
+
*/
|
|
11
|
+
import { logError } from '../utils/logger.js';
|
|
12
|
+
import { quickLog } from '../utils/conversation-logger.js';
|
|
13
|
+
// Ollama API base URL (configurable via environment variable)
|
|
14
|
+
const OLLAMA_BASE_URL = process.env.OLLAMA_HOST || 'http://localhost:11434';
|
|
15
|
+
// Timeout for Ollama API requests (5 seconds)
|
|
16
|
+
const REQUEST_TIMEOUT = 5000;
|
|
17
|
+
/**
|
|
18
|
+
* Model families that support tool calling
|
|
19
|
+
* Based on https://ollama.com/search?c=tools
|
|
20
|
+
*/
|
|
21
|
+
export const TOOL_CAPABLE_MODEL_FAMILIES = [
|
|
22
|
+
'llama3.1', 'llama3.2', 'llama3.3',
|
|
23
|
+
'mistral-nemo', 'mistral-small',
|
|
24
|
+
'command-r', 'command-r-plus',
|
|
25
|
+
'firefunction',
|
|
26
|
+
'qwen2.5', 'qwen2.5-coder',
|
|
27
|
+
'granite3-dense', 'granite3.1-dense',
|
|
28
|
+
'nemotron',
|
|
29
|
+
'hermes3',
|
|
30
|
+
'athene-v2',
|
|
31
|
+
'gpt-oss',
|
|
32
|
+
'exaone3.5',
|
|
33
|
+
'deepseek-r1',
|
|
34
|
+
'qwen3-coder',
|
|
35
|
+
'qwen-coder',
|
|
36
|
+
'deepseek-v3',
|
|
37
|
+
'deepseek-v2',
|
|
38
|
+
'deepseek',
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Ollama Service Class
|
|
42
|
+
* Provides methods for interacting with the local Ollama API
|
|
43
|
+
*/
|
|
44
|
+
class OllamaService {
|
|
45
|
+
baseUrl;
|
|
46
|
+
constructor(baseUrl = OLLAMA_BASE_URL) {
|
|
47
|
+
this.baseUrl = baseUrl;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if Ollama is running and accessible
|
|
51
|
+
* @returns OllamaStatus indicating if Ollama is available
|
|
52
|
+
*/
|
|
53
|
+
async isOllamaRunning() {
|
|
54
|
+
try {
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
|
|
57
|
+
// Ollama has a simple root endpoint that returns version info
|
|
58
|
+
const response = await fetch(`${this.baseUrl}/api/version`, {
|
|
59
|
+
method: 'GET',
|
|
60
|
+
signal: controller.signal,
|
|
61
|
+
});
|
|
62
|
+
clearTimeout(timeoutId);
|
|
63
|
+
if (response.ok) {
|
|
64
|
+
const data = await response.json();
|
|
65
|
+
return {
|
|
66
|
+
available: true,
|
|
67
|
+
version: data.version || 'unknown',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
available: false,
|
|
72
|
+
error: `Ollama returned status ${response.status}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
quickLog(`[${new Date().toISOString()}] [OllamaService] isOllamaRunning error: ${error.message}\n`);
|
|
77
|
+
if (error.name === 'AbortError') {
|
|
78
|
+
return {
|
|
79
|
+
available: false,
|
|
80
|
+
error: 'Connection timed out. Ollama may not be running.',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (error.code === 'ECONNREFUSED') {
|
|
84
|
+
return {
|
|
85
|
+
available: false,
|
|
86
|
+
error: 'Connection refused. Ollama is not running or not installed.',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
available: false,
|
|
91
|
+
error: error.message || 'Unknown error connecting to Ollama',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get list of locally available models from Ollama
|
|
97
|
+
* @returns Array of OllamaModel objects
|
|
98
|
+
* @throws Error if Ollama is not available or request fails
|
|
99
|
+
*/
|
|
100
|
+
async getLocalModels() {
|
|
101
|
+
try {
|
|
102
|
+
const controller = new AbortController();
|
|
103
|
+
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
|
|
104
|
+
const response = await fetch(`${this.baseUrl}/api/tags`, {
|
|
105
|
+
method: 'GET',
|
|
106
|
+
signal: controller.signal,
|
|
107
|
+
});
|
|
108
|
+
clearTimeout(timeoutId);
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
throw new Error(`Ollama API returned status ${response.status}`);
|
|
111
|
+
}
|
|
112
|
+
const data = await response.json();
|
|
113
|
+
quickLog(`[${new Date().toISOString()}] [OllamaService] getLocalModels: Found ${data.models?.length || 0} models\n`);
|
|
114
|
+
return data.models || [];
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
quickLog(`[${new Date().toISOString()}] [OllamaService] getLocalModels error: ${error.message}\n`);
|
|
118
|
+
if (error.name === 'AbortError') {
|
|
119
|
+
throw new Error('Connection to Ollama timed out. Please ensure Ollama is running.');
|
|
120
|
+
}
|
|
121
|
+
if (error.code === 'ECONNREFUSED') {
|
|
122
|
+
throw new Error('Cannot connect to Ollama. Please ensure Ollama is installed and running.\n\nInstall from: https://ollama.ai');
|
|
123
|
+
}
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Send a chat message to an Ollama model (non-streaming)
|
|
129
|
+
* @param model Model name to use (e.g., "llama3:latest")
|
|
130
|
+
* @param messages Array of chat messages
|
|
131
|
+
* @param tools Optional array of tool definitions
|
|
132
|
+
* @param options Optional generation parameters
|
|
133
|
+
* @returns OllamaChatResponse with the model's reply
|
|
134
|
+
*/
|
|
135
|
+
async sendChatMessage(model, messages, tools, options) {
|
|
136
|
+
try {
|
|
137
|
+
const request = {
|
|
138
|
+
model,
|
|
139
|
+
messages,
|
|
140
|
+
stream: false,
|
|
141
|
+
tools: tools && tools.length > 0 ? tools : undefined,
|
|
142
|
+
options,
|
|
143
|
+
};
|
|
144
|
+
quickLog(`[${new Date().toISOString()}] [OllamaService] sendChatMessage: model=${model}, messages=${messages.length}, tools=${tools?.length || 0}\n`);
|
|
145
|
+
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
headers: {
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
},
|
|
150
|
+
body: JSON.stringify(request),
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
const errorText = await response.text();
|
|
154
|
+
throw new Error(`Ollama API error: ${response.status} - ${errorText}`);
|
|
155
|
+
}
|
|
156
|
+
const data = await response.json();
|
|
157
|
+
// Log if tool calls were returned
|
|
158
|
+
if (data.message?.tool_calls?.length) {
|
|
159
|
+
quickLog(`[${new Date().toISOString()}] [OllamaService] Response contains ${data.message.tool_calls.length} tool calls\n`);
|
|
160
|
+
}
|
|
161
|
+
return data;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
logError(`Ollama sendChatMessage error: ${error.message}`);
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Check if a model name indicates it supports tool calling
|
|
170
|
+
* @param modelName The model name (e.g., "llama3.2:latest")
|
|
171
|
+
* @returns True if the model likely supports tools
|
|
172
|
+
*/
|
|
173
|
+
static modelSupportsTools(modelName) {
|
|
174
|
+
const lowerName = modelName.toLowerCase();
|
|
175
|
+
// Check against known tool-capable model families
|
|
176
|
+
return TOOL_CAPABLE_MODEL_FAMILIES.some(family => lowerName.startsWith(family) || lowerName.includes(`:${family}`));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Send a streaming chat message to an Ollama model
|
|
180
|
+
* @param model Model name to use
|
|
181
|
+
* @param messages Array of chat messages
|
|
182
|
+
* @param onChunk Callback for each streaming chunk
|
|
183
|
+
* @param options Optional generation parameters
|
|
184
|
+
* @returns Final complete response after stream ends
|
|
185
|
+
*/
|
|
186
|
+
async sendChatMessageStreaming(model, messages, onChunk, options) {
|
|
187
|
+
try {
|
|
188
|
+
const request = {
|
|
189
|
+
model,
|
|
190
|
+
messages,
|
|
191
|
+
stream: true,
|
|
192
|
+
options,
|
|
193
|
+
};
|
|
194
|
+
quickLog(`[${new Date().toISOString()}] [OllamaService] Starting streaming chat with model: ${model}\n`);
|
|
195
|
+
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
196
|
+
method: 'POST',
|
|
197
|
+
headers: {
|
|
198
|
+
'Content-Type': 'application/json',
|
|
199
|
+
},
|
|
200
|
+
body: JSON.stringify(request),
|
|
201
|
+
});
|
|
202
|
+
if (!response.ok) {
|
|
203
|
+
const errorText = await response.text();
|
|
204
|
+
throw new Error(`Ollama API error: ${response.status} - ${errorText}`);
|
|
205
|
+
}
|
|
206
|
+
if (!response.body) {
|
|
207
|
+
throw new Error('No response body from Ollama');
|
|
208
|
+
}
|
|
209
|
+
const reader = response.body.getReader();
|
|
210
|
+
const decoder = new TextDecoder();
|
|
211
|
+
let fullContent = '';
|
|
212
|
+
let lastChunk = null;
|
|
213
|
+
while (true) {
|
|
214
|
+
const { done, value } = await reader.read();
|
|
215
|
+
if (done)
|
|
216
|
+
break;
|
|
217
|
+
const text = decoder.decode(value, { stream: true });
|
|
218
|
+
const lines = text.split('\n').filter(line => line.trim());
|
|
219
|
+
for (const line of lines) {
|
|
220
|
+
try {
|
|
221
|
+
const chunk = JSON.parse(line);
|
|
222
|
+
fullContent += chunk.message?.content || '';
|
|
223
|
+
lastChunk = chunk;
|
|
224
|
+
// Invoke callback with each chunk
|
|
225
|
+
onChunk(chunk);
|
|
226
|
+
if (chunk.done) {
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (parseError) {
|
|
231
|
+
// Skip malformed JSON lines
|
|
232
|
+
quickLog(`[${new Date().toISOString()}] [OllamaService] Skipping malformed chunk: ${line}\n`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Return a complete response object
|
|
237
|
+
const finalResponse = {
|
|
238
|
+
model,
|
|
239
|
+
created_at: lastChunk?.created_at || new Date().toISOString(),
|
|
240
|
+
message: {
|
|
241
|
+
role: 'assistant',
|
|
242
|
+
content: fullContent,
|
|
243
|
+
},
|
|
244
|
+
done: true,
|
|
245
|
+
total_duration: lastChunk?.total_duration || 0,
|
|
246
|
+
load_duration: lastChunk?.load_duration || 0,
|
|
247
|
+
prompt_eval_count: lastChunk?.prompt_eval_count || 0,
|
|
248
|
+
prompt_eval_duration: lastChunk?.prompt_eval_duration || 0,
|
|
249
|
+
eval_count: lastChunk?.eval_count || 0,
|
|
250
|
+
eval_duration: lastChunk?.eval_duration || 0,
|
|
251
|
+
};
|
|
252
|
+
quickLog(`[${new Date().toISOString()}] [OllamaService] Streaming complete. Total content length: ${fullContent.length}\n`);
|
|
253
|
+
return finalResponse;
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
logError(`Ollama streaming error: ${error.message}`);
|
|
257
|
+
throw error;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Format model size for display (bytes to human-readable)
|
|
262
|
+
* @param bytes Size in bytes
|
|
263
|
+
* @returns Human-readable size string
|
|
264
|
+
*/
|
|
265
|
+
static formatModelSize(bytes) {
|
|
266
|
+
if (bytes < 1024)
|
|
267
|
+
return `${bytes} B`;
|
|
268
|
+
if (bytes < 1024 * 1024)
|
|
269
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
270
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
271
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
272
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get a user-friendly error message for common Ollama issues
|
|
276
|
+
* @param error The error that occurred
|
|
277
|
+
* @returns User-friendly error message with helpful instructions
|
|
278
|
+
*/
|
|
279
|
+
static getHelpfulErrorMessage(error) {
|
|
280
|
+
const message = error.message.toLowerCase();
|
|
281
|
+
if (message.includes('econnrefused') || message.includes('connection refused')) {
|
|
282
|
+
return `❌ Cannot connect to Ollama
|
|
283
|
+
|
|
284
|
+
Ollama is not running or not installed on this machine.
|
|
285
|
+
|
|
286
|
+
To fix this:
|
|
287
|
+
1. Install Ollama from: https://ollama.ai
|
|
288
|
+
2. Start Ollama by running: ollama serve
|
|
289
|
+
3. Pull a model: ollama pull llama3
|
|
290
|
+
|
|
291
|
+
Then try again with /models local`;
|
|
292
|
+
}
|
|
293
|
+
if (message.includes('timeout') || message.includes('timed out')) {
|
|
294
|
+
return `❌ Connection to Ollama timed out
|
|
295
|
+
|
|
296
|
+
Ollama may be starting up or under heavy load.
|
|
297
|
+
|
|
298
|
+
Please ensure Ollama is running:
|
|
299
|
+
• Check if 'ollama serve' is running
|
|
300
|
+
• Try again in a few seconds`;
|
|
301
|
+
}
|
|
302
|
+
if (message.includes('model') && message.includes('not found')) {
|
|
303
|
+
return `❌ Model not found
|
|
304
|
+
|
|
305
|
+
The requested model is not available locally.
|
|
306
|
+
|
|
307
|
+
To download models, run:
|
|
308
|
+
• ollama pull llama3
|
|
309
|
+
• ollama pull codellama
|
|
310
|
+
• ollama pull mistral
|
|
311
|
+
|
|
312
|
+
Then try again.`;
|
|
313
|
+
}
|
|
314
|
+
return `❌ Ollama error: ${error.message}
|
|
315
|
+
|
|
316
|
+
Please ensure Ollama is installed and running.
|
|
317
|
+
Install from: https://ollama.ai`;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Export singleton instance
|
|
321
|
+
export const ollamaService = new OllamaService();
|
|
322
|
+
// Export class for testing with different URLs
|
|
323
|
+
export { OllamaService };
|
|
324
|
+
//# sourceMappingURL=ollama-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-service.js","sourceRoot":"","sources":["../../src/services/ollama-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warpify Detector Service
|
|
3
|
+
*
|
|
4
|
+
* Detects if the current PTY session has an active warpifiable remote session
|
|
5
|
+
* (SSH, WSL, Docker) by analyzing:
|
|
6
|
+
* 1. The command that started the shell (most reliable)
|
|
7
|
+
* 2. Terminal output patterns (fallback)
|
|
8
|
+
*/
|
|
9
|
+
export type WarpifySessionType = 'ssh' | 'wsl' | 'docker' | 'none';
|
|
10
|
+
export interface WarpifySession {
|
|
11
|
+
type: WarpifySessionType;
|
|
12
|
+
connectionString?: string;
|
|
13
|
+
detectedFrom: 'command' | 'prompt' | 'env' | 'none';
|
|
14
|
+
confidence: 'high' | 'medium' | 'low';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Detect warpifiable session - PRIMARY METHOD
|
|
18
|
+
* Uses the command that started the shell for reliable detection
|
|
19
|
+
*
|
|
20
|
+
* @param command - The command that started the shell session (e.g., "ssh rohan@localhost")
|
|
21
|
+
* @param output - Optional PTY output for fallback detection
|
|
22
|
+
*/
|
|
23
|
+
export declare function detectWarpifySession(command: string, output?: string): WarpifySession;
|
|
24
|
+
/**
|
|
25
|
+
* Get a human-readable description of the detected session
|
|
26
|
+
*/
|
|
27
|
+
export declare function getSessionDescription(session: WarpifySession): string;
|
|
28
|
+
/**
|
|
29
|
+
* WarpifyDetector class for stateful detection
|
|
30
|
+
*/
|
|
31
|
+
export declare class WarpifyDetector {
|
|
32
|
+
private lastDetection;
|
|
33
|
+
/**
|
|
34
|
+
* Detect warpifiable session
|
|
35
|
+
* @param command - The shell command that started the session
|
|
36
|
+
* @param output - Optional PTY output for fallback detection
|
|
37
|
+
*/
|
|
38
|
+
detect(command: string, output?: string): WarpifySession;
|
|
39
|
+
getLastDetection(): WarpifySession | null;
|
|
40
|
+
reset(): void;
|
|
41
|
+
}
|
|
42
|
+
export declare const warpifyDetector: WarpifyDetector;
|
|
43
|
+
//# sourceMappingURL=warpify-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warpify-detector.d.ts","sourceRoot":"","sources":["../../src/services/warpify-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,kBAAkB,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACpD,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACzC;AA8BD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAoBrF;AAgHD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAiBrE;AAED;;GAEG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,aAAa,CAA+B;IAEpD;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc;IAMxD,gBAAgB,IAAI,cAAc,GAAG,IAAI;IAIzC,KAAK,IAAI,IAAI;CAGhB;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warpify Detector Service
|
|
3
|
+
*
|
|
4
|
+
* Detects if the current PTY session has an active warpifiable remote session
|
|
5
|
+
* (SSH, WSL, Docker) by analyzing:
|
|
6
|
+
* 1. The command that started the shell (most reliable)
|
|
7
|
+
* 2. Terminal output patterns (fallback)
|
|
8
|
+
*/
|
|
9
|
+
import stripAnsi from 'strip-ansi';
|
|
10
|
+
/**
|
|
11
|
+
* SSH command patterns - detect based on the shell command
|
|
12
|
+
*/
|
|
13
|
+
const SSH_COMMAND_PATTERNS = [
|
|
14
|
+
// ssh user@host, ssh -p port user@host, ssh -i key user@host
|
|
15
|
+
/^ssh\s+(?:(?:-\w+\s+\S+\s+)*)?(?:(\S+)@)?(\S+)/i,
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* WSL command patterns
|
|
19
|
+
*/
|
|
20
|
+
const WSL_COMMAND_PATTERNS = [
|
|
21
|
+
// wsl, wsl -d distro, wsl --distribution distro
|
|
22
|
+
/^wsl(?:\s+(?:-d|--distribution)\s+(\S+))?/i,
|
|
23
|
+
// bash (when on Windows, often means WSL)
|
|
24
|
+
/^bash$/i,
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Docker command patterns
|
|
28
|
+
*/
|
|
29
|
+
const DOCKER_COMMAND_PATTERNS = [
|
|
30
|
+
// docker exec -it container bash
|
|
31
|
+
/^docker\s+exec\s+(?:(?:-\w+\s+)*)?(\S+)/i,
|
|
32
|
+
// docker run -it image bash
|
|
33
|
+
/^docker\s+run\s+(?:(?:-\w+(?:\s+\S+)?\s+)*)?(\S+)/i,
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Detect warpifiable session - PRIMARY METHOD
|
|
37
|
+
* Uses the command that started the shell for reliable detection
|
|
38
|
+
*
|
|
39
|
+
* @param command - The command that started the shell session (e.g., "ssh rohan@localhost")
|
|
40
|
+
* @param output - Optional PTY output for fallback detection
|
|
41
|
+
*/
|
|
42
|
+
export function detectWarpifySession(command, output) {
|
|
43
|
+
// First, try command-based detection (most reliable)
|
|
44
|
+
const commandSession = detectFromCommand(command);
|
|
45
|
+
if (commandSession.type !== 'none') {
|
|
46
|
+
return commandSession;
|
|
47
|
+
}
|
|
48
|
+
// Fallback: try output-based detection
|
|
49
|
+
if (output) {
|
|
50
|
+
const outputSession = detectFromOutput(output);
|
|
51
|
+
if (outputSession.type !== 'none') {
|
|
52
|
+
return outputSession;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
type: 'none',
|
|
57
|
+
detectedFrom: 'none',
|
|
58
|
+
confidence: 'high',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detect session type from the shell command
|
|
63
|
+
*/
|
|
64
|
+
function detectFromCommand(command) {
|
|
65
|
+
if (!command) {
|
|
66
|
+
return { type: 'none', detectedFrom: 'none', confidence: 'high' };
|
|
67
|
+
}
|
|
68
|
+
const trimmedCommand = command.trim();
|
|
69
|
+
// Check for SSH command
|
|
70
|
+
for (const pattern of SSH_COMMAND_PATTERNS) {
|
|
71
|
+
const match = trimmedCommand.match(pattern);
|
|
72
|
+
if (match) {
|
|
73
|
+
const user = match[1] || 'user';
|
|
74
|
+
const host = match[2] || 'remote';
|
|
75
|
+
return {
|
|
76
|
+
type: 'ssh',
|
|
77
|
+
connectionString: `${user}@${host}`,
|
|
78
|
+
detectedFrom: 'command',
|
|
79
|
+
confidence: 'high',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Check for WSL command
|
|
84
|
+
for (const pattern of WSL_COMMAND_PATTERNS) {
|
|
85
|
+
const match = trimmedCommand.match(pattern);
|
|
86
|
+
if (match) {
|
|
87
|
+
const distro = match[1] || 'Ubuntu';
|
|
88
|
+
return {
|
|
89
|
+
type: 'wsl',
|
|
90
|
+
connectionString: distro,
|
|
91
|
+
detectedFrom: 'command',
|
|
92
|
+
confidence: 'high',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Check for Docker command
|
|
97
|
+
for (const pattern of DOCKER_COMMAND_PATTERNS) {
|
|
98
|
+
const match = trimmedCommand.match(pattern);
|
|
99
|
+
if (match) {
|
|
100
|
+
const container = match[1]?.substring(0, 12) || 'container';
|
|
101
|
+
return {
|
|
102
|
+
type: 'docker',
|
|
103
|
+
connectionString: container,
|
|
104
|
+
detectedFrom: 'command',
|
|
105
|
+
confidence: 'high',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { type: 'none', detectedFrom: 'none', confidence: 'high' };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detect session from PTY output (fallback method)
|
|
113
|
+
* Used when the command was not an obvious SSH/WSL/Docker command
|
|
114
|
+
*/
|
|
115
|
+
function detectFromOutput(output) {
|
|
116
|
+
// Strip ANSI codes for reliable pattern matching
|
|
117
|
+
const cleanOutput = stripAnsi(output);
|
|
118
|
+
const recentOutput = getRecentLines(cleanOutput, 30);
|
|
119
|
+
// Check for SSH environment variables (very reliable)
|
|
120
|
+
if (/SSH_CLIENT=|SSH_CONNECTION=|SSH_TTY=/.test(recentOutput)) {
|
|
121
|
+
// Try to extract connection info from prompt
|
|
122
|
+
const promptMatch = recentOutput.match(/([a-zA-Z0-9_-]+)@([a-zA-Z0-9._-]+)/);
|
|
123
|
+
return {
|
|
124
|
+
type: 'ssh',
|
|
125
|
+
connectionString: promptMatch ? `${promptMatch[1]}@${promptMatch[2]}` : undefined,
|
|
126
|
+
detectedFrom: 'env',
|
|
127
|
+
confidence: 'high',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Check for WSL indicators
|
|
131
|
+
if (/\/mnt\/[a-z]\//.test(recentOutput) || /microsoft-standard-WSL/i.test(recentOutput)) {
|
|
132
|
+
const promptMatch = recentOutput.match(/([a-zA-Z0-9_-]+)@([a-zA-Z0-9._-]+)/);
|
|
133
|
+
return {
|
|
134
|
+
type: 'wsl',
|
|
135
|
+
connectionString: promptMatch?.[2] || 'WSL',
|
|
136
|
+
detectedFrom: 'prompt',
|
|
137
|
+
confidence: 'high',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Check for Docker indicators
|
|
141
|
+
if (/docker|container/i.test(recentOutput) || /^[a-f0-9]{12}:/.test(recentOutput)) {
|
|
142
|
+
const containerMatch = recentOutput.match(/@([a-f0-9]{12})/);
|
|
143
|
+
return {
|
|
144
|
+
type: 'docker',
|
|
145
|
+
connectionString: containerMatch?.[1] || 'container',
|
|
146
|
+
detectedFrom: 'prompt',
|
|
147
|
+
confidence: 'medium',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return { type: 'none', detectedFrom: 'none', confidence: 'high' };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the last N lines of output
|
|
154
|
+
*/
|
|
155
|
+
function getRecentLines(output, n) {
|
|
156
|
+
const lines = output.split('\n');
|
|
157
|
+
return lines.slice(-n).join('\n');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get a human-readable description of the detected session
|
|
161
|
+
*/
|
|
162
|
+
export function getSessionDescription(session) {
|
|
163
|
+
switch (session.type) {
|
|
164
|
+
case 'ssh':
|
|
165
|
+
return session.connectionString
|
|
166
|
+
? `SSH session: ${session.connectionString}`
|
|
167
|
+
: 'SSH session detected';
|
|
168
|
+
case 'wsl':
|
|
169
|
+
return session.connectionString
|
|
170
|
+
? `WSL: ${session.connectionString}`
|
|
171
|
+
: 'WSL session detected';
|
|
172
|
+
case 'docker':
|
|
173
|
+
return session.connectionString
|
|
174
|
+
? `Docker container: ${session.connectionString}`
|
|
175
|
+
: 'Docker session detected';
|
|
176
|
+
default:
|
|
177
|
+
return 'No remote session detected';
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* WarpifyDetector class for stateful detection
|
|
182
|
+
*/
|
|
183
|
+
export class WarpifyDetector {
|
|
184
|
+
lastDetection = null;
|
|
185
|
+
/**
|
|
186
|
+
* Detect warpifiable session
|
|
187
|
+
* @param command - The shell command that started the session
|
|
188
|
+
* @param output - Optional PTY output for fallback detection
|
|
189
|
+
*/
|
|
190
|
+
detect(command, output) {
|
|
191
|
+
const session = detectWarpifySession(command, output);
|
|
192
|
+
this.lastDetection = session;
|
|
193
|
+
return session;
|
|
194
|
+
}
|
|
195
|
+
getLastDetection() {
|
|
196
|
+
return this.lastDetection;
|
|
197
|
+
}
|
|
198
|
+
reset() {
|
|
199
|
+
this.lastDetection = null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
export const warpifyDetector = new WarpifyDetector();
|
|
203
|
+
//# sourceMappingURL=warpify-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warpify-detector.js","sourceRoot":"","sources":["../../src/services/warpify-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Storage Service
|
|
3
|
+
*
|
|
4
|
+
* Handles saving, loading, listing, and deleting workflows.
|
|
5
|
+
* Workflows are stored as JSON files in ~/.centaurus/workflows/
|
|
6
|
+
*/
|
|
7
|
+
import { Workflow, WorkflowMeta, WorkflowStep } from '../types/workflow.js';
|
|
8
|
+
/**
|
|
9
|
+
* Workflow Storage Service
|
|
10
|
+
*/
|
|
11
|
+
export declare class WorkflowStorageService {
|
|
12
|
+
private static instance;
|
|
13
|
+
private constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Get the singleton instance
|
|
16
|
+
*/
|
|
17
|
+
static getInstance(): WorkflowStorageService;
|
|
18
|
+
/**
|
|
19
|
+
* Create a new workflow from steps
|
|
20
|
+
*/
|
|
21
|
+
createWorkflow(name: string, steps: Array<{
|
|
22
|
+
type: 'command' | 'instruction';
|
|
23
|
+
content: string;
|
|
24
|
+
}>, description?: string): Workflow;
|
|
25
|
+
/**
|
|
26
|
+
* Save a workflow to disk
|
|
27
|
+
*/
|
|
28
|
+
save(workflow: Workflow): {
|
|
29
|
+
success: boolean;
|
|
30
|
+
error?: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Load a workflow by name
|
|
34
|
+
*/
|
|
35
|
+
load(name: string): Workflow | null;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a workflow exists
|
|
38
|
+
*/
|
|
39
|
+
exists(name: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* List all workflows (metadata only)
|
|
42
|
+
*/
|
|
43
|
+
list(): WorkflowMeta[];
|
|
44
|
+
/**
|
|
45
|
+
* Delete a workflow by name
|
|
46
|
+
*/
|
|
47
|
+
delete(name: string): {
|
|
48
|
+
success: boolean;
|
|
49
|
+
error?: string;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Rename a workflow
|
|
53
|
+
*/
|
|
54
|
+
rename(oldName: string, newName: string): {
|
|
55
|
+
success: boolean;
|
|
56
|
+
error?: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Format a workflow for display
|
|
60
|
+
*/
|
|
61
|
+
formatWorkflowForDisplay(workflow: Workflow): string;
|
|
62
|
+
/**
|
|
63
|
+
* Format a workflow step for prompting the AI
|
|
64
|
+
*/
|
|
65
|
+
formatStepForAI(step: WorkflowStep, stepNumber: number, totalSteps: number): string;
|
|
66
|
+
/**
|
|
67
|
+
* Format the entire workflow for the initial AI prompt
|
|
68
|
+
*/
|
|
69
|
+
formatWorkflowForAI(workflow: Workflow): string;
|
|
70
|
+
}
|
|
71
|
+
export declare const workflowStorage: WorkflowStorageService;
|
|
72
|
+
//# sourceMappingURL=workflow-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-storage.d.ts","sourceRoot":"","sources":["../../src/services/workflow-storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAuC5E;;GAEG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAyB;IAEhD,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAO5C;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,SAAS,GAAG,aAAa,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ;IAkBhI;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAkB9D;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAanC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B;;OAEG;IACH,IAAI,IAAI,YAAY,EAAE;IAiCtB;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAa1D;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IA4B9E;;OAEG;IACH,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAiBpD;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAKnF;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;CAelD;AAGD,eAAO,MAAM,eAAe,wBAAuC,CAAC"}
|