4runr-os 1.0.6 → 1.0.10

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.
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Local Model Setup - Integrated Installation
3
+ * Automatically installs Ollama and downloads models when needed
4
+ * Makes it feel like one unified system
5
+ */
6
+ import * as os from 'os';
7
+ import { exec } from 'child_process';
8
+ import { promisify } from 'util';
9
+ const execAsync = promisify(exec);
10
+ /**
11
+ * Check if Ollama is installed and running
12
+ */
13
+ export async function checkOllamaInstallation() {
14
+ try {
15
+ // Check if ollama command exists
16
+ const { stdout } = await execAsync('ollama --version');
17
+ const ollamaPath = stdout.trim();
18
+ // Check if Ollama server is running
19
+ try {
20
+ const response = await fetch('http://localhost:11434/api/tags');
21
+ if (response.ok) {
22
+ const data = await response.json();
23
+ const models = (data.models || []).map((m) => m.name);
24
+ return {
25
+ success: true,
26
+ message: 'Ollama is installed and running',
27
+ ollamaInstalled: true,
28
+ ollamaPath,
29
+ modelsAvailable: models,
30
+ };
31
+ }
32
+ }
33
+ catch (e) {
34
+ // Server not running, but Ollama is installed
35
+ return {
36
+ success: false,
37
+ message: 'Ollama is installed but server is not running',
38
+ ollamaInstalled: true,
39
+ ollamaPath,
40
+ };
41
+ }
42
+ }
43
+ catch (error) {
44
+ return {
45
+ success: false,
46
+ message: 'Ollama is not installed',
47
+ ollamaInstalled: false,
48
+ };
49
+ }
50
+ return {
51
+ success: false,
52
+ message: 'Ollama status unknown',
53
+ ollamaInstalled: false,
54
+ };
55
+ }
56
+ /**
57
+ * Install Ollama automatically
58
+ * For Windows: Opens download page and provides instructions
59
+ * For Mac/Linux: Uses package managers
60
+ */
61
+ export async function installOllama() {
62
+ const platform = os.platform();
63
+ if (platform === 'win32') {
64
+ // Windows - open download page and provide instructions
65
+ try {
66
+ // Try to open the download page
67
+ const { exec } = await import('child_process');
68
+ exec('start https://ollama.com/download/windows');
69
+ return {
70
+ success: false, // Not fully automatic on Windows
71
+ message: 'Please download and install Ollama from the opened page, then restart this terminal.',
72
+ };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ success: false,
77
+ message: 'Please download Ollama from https://ollama.ai/download and install it, then restart this terminal.',
78
+ };
79
+ }
80
+ }
81
+ else if (platform === 'darwin') {
82
+ // macOS - use Homebrew or direct download
83
+ try {
84
+ // Try Homebrew first
85
+ await execAsync('brew install ollama');
86
+ return {
87
+ success: true,
88
+ message: 'Ollama installed via Homebrew',
89
+ };
90
+ }
91
+ catch (e) {
92
+ return {
93
+ success: false,
94
+ message: 'Please install Ollama manually: brew install ollama or download from https://ollama.ai',
95
+ };
96
+ }
97
+ }
98
+ else {
99
+ // Linux
100
+ try {
101
+ await execAsync('curl -fsSL https://ollama.com/install.sh | sh');
102
+ return {
103
+ success: true,
104
+ message: 'Ollama installed successfully',
105
+ };
106
+ }
107
+ catch (error) {
108
+ return {
109
+ success: false,
110
+ message: `Installation failed: ${error.message}. Please install manually from https://ollama.ai`,
111
+ };
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Start Ollama server if not running
117
+ */
118
+ export async function startOllamaServer() {
119
+ try {
120
+ // Check if already running
121
+ const response = await fetch('http://localhost:11434/api/tags');
122
+ if (response.ok) {
123
+ return {
124
+ success: true,
125
+ message: 'Ollama server is already running',
126
+ };
127
+ }
128
+ }
129
+ catch (e) {
130
+ // Server not running, start it
131
+ }
132
+ try {
133
+ const platform = os.platform();
134
+ if (platform === 'win32') {
135
+ // On Windows, Ollama runs as a service, so we just need to start it
136
+ await execAsync('ollama serve', { timeout: 5000 });
137
+ }
138
+ else {
139
+ // On Unix, start in background
140
+ await execAsync('ollama serve &');
141
+ }
142
+ // Wait for server to start
143
+ for (let i = 0; i < 10; i++) {
144
+ await new Promise(resolve => setTimeout(resolve, 1000));
145
+ try {
146
+ const response = await fetch('http://localhost:11434/api/tags');
147
+ if (response.ok) {
148
+ return {
149
+ success: true,
150
+ message: 'Ollama server started successfully',
151
+ };
152
+ }
153
+ }
154
+ catch (e) {
155
+ // Keep waiting
156
+ }
157
+ }
158
+ return {
159
+ success: false,
160
+ message: 'Ollama server failed to start. Please start it manually: ollama serve',
161
+ };
162
+ }
163
+ catch (error) {
164
+ return {
165
+ success: false,
166
+ message: `Failed to start Ollama server: ${error.message}`,
167
+ };
168
+ }
169
+ }
170
+ /**
171
+ * Download a model using Ollama API
172
+ */
173
+ export async function downloadModel(modelName) {
174
+ try {
175
+ // Verify Ollama is running
176
+ const check = await checkOllamaInstallation();
177
+ if (!check.ollamaInstalled) {
178
+ return {
179
+ success: false,
180
+ message: 'Ollama is not installed. Please install it first.',
181
+ };
182
+ }
183
+ // Start server if not running
184
+ await startOllamaServer();
185
+ // Use Ollama's pull command (this handles downloading)
186
+ console.log(`Downloading model: ${modelName}...`);
187
+ console.log('This may take several minutes depending on model size...');
188
+ // Use ollama pull command
189
+ const { stdout, stderr } = await execAsync(`ollama pull ${modelName}`, {
190
+ maxBuffer: 10 * 1024 * 1024, // 10MB buffer for output
191
+ });
192
+ // Verify model was downloaded
193
+ const verifyResponse = await fetch('http://localhost:11434/api/tags');
194
+ if (verifyResponse.ok) {
195
+ const data = await verifyResponse.json();
196
+ const models = (data.models || []).map((m) => m.name);
197
+ if (models.includes(modelName)) {
198
+ return {
199
+ success: true,
200
+ message: `Model '${modelName}' downloaded successfully`,
201
+ };
202
+ }
203
+ }
204
+ return {
205
+ success: false,
206
+ message: `Model download completed but verification failed. Check: ollama list`,
207
+ };
208
+ }
209
+ catch (error) {
210
+ return {
211
+ success: false,
212
+ message: `Failed to download model: ${error.message}`,
213
+ };
214
+ }
215
+ }
216
+ /**
217
+ * Verify execution is truly local (proof it's not going through gateway)
218
+ */
219
+ export async function verifyLocalExecution() {
220
+ const startTime = Date.now();
221
+ try {
222
+ // Make a test call to local Ollama
223
+ const response = await fetch('http://localhost:11434/api/generate', {
224
+ method: 'POST',
225
+ headers: { 'Content-Type': 'application/json' },
226
+ body: JSON.stringify({
227
+ model: 'llama2',
228
+ prompt: 'test',
229
+ stream: false,
230
+ }),
231
+ });
232
+ const responseTime = Date.now() - startTime;
233
+ const isLocal = response.ok && responseTime < 5000; // Local should be fast
234
+ return {
235
+ isLocal,
236
+ proof: {
237
+ networkCheck: true, // We're calling localhost, not external
238
+ executionPath: 'localhost:11434 (direct)',
239
+ responseTime,
240
+ },
241
+ };
242
+ }
243
+ catch (error) {
244
+ return {
245
+ isLocal: false,
246
+ proof: {
247
+ networkCheck: false,
248
+ executionPath: 'unknown',
249
+ responseTime: Date.now() - startTime,
250
+ },
251
+ };
252
+ }
253
+ }
254
+ //# sourceMappingURL=local-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-setup.js","sourceRoot":"","sources":["../src/local-setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAUlC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAEjC,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAChE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC3D,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,iCAAiC;oBAC1C,eAAe,EAAE,IAAI;oBACrB,UAAU;oBACV,eAAe,EAAE,MAAM;iBACxB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,8CAA8C;YAC9C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,+CAA+C;gBACxD,eAAe,EAAE,IAAI;gBACrB,UAAU;aACX,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,yBAAyB;YAClC,eAAe,EAAE,KAAK;SACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,uBAAuB;QAChC,eAAe,EAAE,KAAK;KACvB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE/B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,wDAAwD;QACxD,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC/C,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAElD,OAAO;gBACL,OAAO,EAAE,KAAK,EAAE,iCAAiC;gBACjD,OAAO,EAAE,sFAAsF;aAChG,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,oGAAoG;aAC9G,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,0CAA0C;QAC1C,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,SAAS,CAAC,qBAAqB,CAAC,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,+BAA+B;aACzC,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wFAAwF;aAClG,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ;QACR,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,+CAA+C,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,+BAA+B;aACzC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,wBAAwB,KAAK,CAAC,OAAO,kDAAkD;aACjG,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAChE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,kCAAkC;aAC5C,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,+BAA+B;IACjC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAE/B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,oEAAoE;YACpE,MAAM,SAAS,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,+BAA+B;YAC/B,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,2BAA2B;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAChE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,oCAAoC;qBAC9C,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,eAAe;YACjB,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,uEAAuE;SACjF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,kCAAkC,KAAK,CAAC,OAAO,EAAE;SAC3D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,KAAK,GAAG,MAAM,uBAAuB,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,mDAAmD;aAC7D,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,MAAM,iBAAiB,EAAE,CAAC;QAE1B,uDAAuD;QACvD,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAExE,0BAA0B;QAC1B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,eAAe,SAAS,EAAE,EAAE;YACrE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,yBAAyB;SACvD,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACtE,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,GAAQ,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3D,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,UAAU,SAAS,2BAA2B;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,sEAAsE;SAChF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,6BAA6B,KAAK,CAAC,OAAO,EAAE;SACtD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IAQxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,KAAK;aACd,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,uBAAuB;QAE3E,OAAO;YACL,OAAO;YACP,KAAK,EAAE;gBACL,YAAY,EAAE,IAAI,EAAE,wCAAwC;gBAC5D,aAAa,EAAE,0BAA0B;gBACzC,YAAY;aACb;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,YAAY,EAAE,KAAK;gBACnB,aAAa,EAAE,SAAS;gBACxB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACrC;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "4runr-os",
3
- "version": "1.0.6",
3
+ "version": "1.0.10",
4
4
  "type": "module",
5
5
  "description": "4Runr AI Agent OS - Interactive terminal for managing AI agents",
6
6
  "main": "dist/index.js",