@openinference/cli 1.1.1 → 1.3.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 (47) hide show
  1. package/README.md +1 -0
  2. package/data/models.json +4 -2
  3. package/dist/config.d.ts +6 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +51 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/data/models.json +4 -2
  8. package/dist/hardware.d.ts +4 -0
  9. package/dist/hardware.d.ts.map +1 -1
  10. package/dist/hardware.js +19 -7
  11. package/dist/hardware.js.map +1 -1
  12. package/dist/index.js +20 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/linereader.d.ts +73 -0
  15. package/dist/linereader.d.ts.map +1 -0
  16. package/dist/linereader.js +375 -0
  17. package/dist/linereader.js.map +1 -0
  18. package/dist/manage.d.ts +5 -0
  19. package/dist/manage.d.ts.map +1 -1
  20. package/dist/manage.js +77 -0
  21. package/dist/manage.js.map +1 -1
  22. package/dist/ollama.d.ts +10 -0
  23. package/dist/ollama.d.ts.map +1 -1
  24. package/dist/ollama.js +56 -4
  25. package/dist/ollama.js.map +1 -1
  26. package/dist/prompt.d.ts +18 -6
  27. package/dist/prompt.d.ts.map +1 -1
  28. package/dist/prompt.js +136 -52
  29. package/dist/prompt.js.map +1 -1
  30. package/dist/recommend-run.d.ts.map +1 -1
  31. package/dist/recommend-run.js +8 -3
  32. package/dist/recommend-run.js.map +1 -1
  33. package/dist/recommend.d.ts +5 -3
  34. package/dist/recommend.d.ts.map +1 -1
  35. package/dist/recommend.js +12 -7
  36. package/dist/recommend.js.map +1 -1
  37. package/dist/setup.d.ts +4 -1
  38. package/dist/setup.d.ts.map +1 -1
  39. package/dist/setup.js +98 -36
  40. package/dist/setup.js.map +1 -1
  41. package/dist/shell.d.ts.map +1 -1
  42. package/dist/shell.js +143 -41
  43. package/dist/shell.js.map +1 -1
  44. package/dist/use-cases.d.ts.map +1 -1
  45. package/dist/use-cases.js +5 -22
  46. package/dist/use-cases.js.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,375 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LineReader = void 0;
7
+ exports.select = select;
8
+ const node_readline_1 = __importDefault(require("node:readline"));
9
+ const DIM = '\x1b[2m';
10
+ const RESET = '\x1b[0m';
11
+ const TEAL = '\x1b[38;5;43m';
12
+ /** Truncate a plain (ANSI-free) string so it never wraps the terminal. */
13
+ function clamp(s, max) {
14
+ if (max <= 1)
15
+ return '';
16
+ return s.length > max ? s.slice(0, max - 1) + '…' : s;
17
+ }
18
+ /** Lay out a list row "<indent><marker> <label> <hint>" within `cols`. */
19
+ function listRow(marker, label, hint, cols, on) {
20
+ const avail = Math.max(12, cols - 6); // 3 indent + marker + 2 spacing
21
+ let lab = clamp(label, avail);
22
+ let h = '';
23
+ const rest = avail - lab.length - 2;
24
+ if (hint && rest > 1)
25
+ h = clamp(hint, rest);
26
+ const mark = on ? `${TEAL}${marker}${RESET}` : ' ';
27
+ const labCol = on ? `${TEAL}${lab}${RESET}` : `${DIM}${lab}${RESET}`;
28
+ const hintCol = h ? ` ${DIM}${h}${RESET}` : '';
29
+ return ` ${mark} ${labCol}${hintCol}`;
30
+ }
31
+ /**
32
+ * A minimal line editor with a live drop-down suggestion menu (Claude-Code
33
+ * style). Supports inline editing (←/→/Home/End/Backspace), history (↑/↓ when
34
+ * the menu is closed), and Tab/Enter to accept a suggestion.
35
+ *
36
+ * Falls back to plain readline when stdin is not a TTY or OI_SIMPLE is set.
37
+ */
38
+ class LineReader {
39
+ cfg;
40
+ buf = '';
41
+ cursor = 0;
42
+ menu = [];
43
+ sel = 0;
44
+ histIdx;
45
+ prevTop = 0; // rows from top of block to terminal cursor at last render
46
+ onKey;
47
+ resolve;
48
+ constructor(cfg) {
49
+ this.cfg = cfg;
50
+ this.histIdx = cfg.history.length;
51
+ }
52
+ get cols() {
53
+ return process.stdout.columns || 80;
54
+ }
55
+ get maxRows() {
56
+ return this.cfg.maxRows ?? 8;
57
+ }
58
+ question() {
59
+ const stdin = process.stdin;
60
+ const simple = process.env.OI_SIMPLE === '1' || !stdin.isTTY;
61
+ if (simple)
62
+ return this.questionSimple();
63
+ return new Promise((resolve) => {
64
+ this.resolve = resolve;
65
+ this.buf = '';
66
+ this.cursor = 0;
67
+ this.histIdx = this.cfg.history.length;
68
+ this.menu = this.cfg.suggest('');
69
+ this.sel = 0;
70
+ this.prevTop = 0;
71
+ node_readline_1.default.emitKeypressEvents(stdin);
72
+ stdin.setRawMode(true);
73
+ stdin.resume();
74
+ this.onKey = (str, key) => this.handleKey(str, key);
75
+ stdin.on('keypress', this.onKey);
76
+ this.render(true);
77
+ });
78
+ }
79
+ /** Fallback: plain readline question (pipes, non-TTY, OI_SIMPLE). */
80
+ questionSimple() {
81
+ return new Promise((resolve) => {
82
+ const rl = node_readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
83
+ rl.question(this.cfg.prompt, (answer) => {
84
+ rl.close();
85
+ resolve(answer);
86
+ });
87
+ });
88
+ }
89
+ cleanup() {
90
+ const stdin = process.stdin;
91
+ if (this.onKey)
92
+ stdin.removeListener('keypress', this.onKey);
93
+ this.onKey = undefined;
94
+ if (stdin.isTTY)
95
+ stdin.setRawMode(false);
96
+ stdin.pause();
97
+ }
98
+ commit() {
99
+ // Erase the input box + menu, echo the entered line, then drop to a fresh line.
100
+ const out = process.stdout;
101
+ if (this.prevTop > 0)
102
+ node_readline_1.default.moveCursor(out, 0, -this.prevTop);
103
+ node_readline_1.default.cursorTo(out, 0);
104
+ node_readline_1.default.clearScreenDown(out);
105
+ out.write(` ${TEAL}›${RESET} ${this.buf}\n`);
106
+ const value = this.buf;
107
+ this.cleanup();
108
+ this.resolve?.(value);
109
+ }
110
+ handleKey(str, key) {
111
+ if (!key)
112
+ return;
113
+ if (key.ctrl && key.name === 'c') {
114
+ process.stdout.write('\n');
115
+ this.cleanup();
116
+ this.resolve?.(null);
117
+ return;
118
+ }
119
+ if (key.ctrl && key.name === 'd' && this.buf === '') {
120
+ process.stdout.write('\n');
121
+ this.cleanup();
122
+ this.resolve?.(null);
123
+ return;
124
+ }
125
+ const menuOpen = this.menu.length > 0;
126
+ switch (key.name) {
127
+ case 'return':
128
+ case 'enter':
129
+ if (menuOpen) {
130
+ const pick = this.menu[this.sel];
131
+ if (pick) {
132
+ this.buf = pick.value;
133
+ this.cursor = this.buf.length;
134
+ if (pick.submit) {
135
+ this.commit();
136
+ return;
137
+ }
138
+ this.refreshMenu();
139
+ break;
140
+ }
141
+ }
142
+ this.commit();
143
+ return;
144
+ case 'tab':
145
+ if (menuOpen)
146
+ this.accept();
147
+ break;
148
+ case 'escape':
149
+ this.menu = [];
150
+ break;
151
+ case 'up':
152
+ if (menuOpen)
153
+ this.sel = (this.sel - 1 + this.menu.length) % this.menu.length;
154
+ else
155
+ this.historyPrev();
156
+ break;
157
+ case 'down':
158
+ if (menuOpen)
159
+ this.sel = (this.sel + 1) % this.menu.length;
160
+ else
161
+ this.historyNext();
162
+ break;
163
+ case 'left':
164
+ if (this.cursor > 0)
165
+ this.cursor--;
166
+ break;
167
+ case 'right':
168
+ if (this.cursor < this.buf.length)
169
+ this.cursor++;
170
+ break;
171
+ case 'home':
172
+ this.cursor = 0;
173
+ break;
174
+ case 'end':
175
+ this.cursor = this.buf.length;
176
+ break;
177
+ case 'backspace':
178
+ if (this.cursor > 0) {
179
+ this.buf = this.buf.slice(0, this.cursor - 1) + this.buf.slice(this.cursor);
180
+ this.cursor--;
181
+ this.refreshMenu();
182
+ }
183
+ break;
184
+ case 'delete':
185
+ if (this.cursor < this.buf.length) {
186
+ this.buf = this.buf.slice(0, this.cursor) + this.buf.slice(this.cursor + 1);
187
+ this.refreshMenu();
188
+ }
189
+ break;
190
+ default:
191
+ // Printable input (including pasted chunks). Ignore control sequences.
192
+ if (str && !key.ctrl && !key.meta) {
193
+ const clean = str.replace(/[\x00-\x1f\x7f]/g, '');
194
+ if (clean) {
195
+ this.buf = this.buf.slice(0, this.cursor) + clean + this.buf.slice(this.cursor);
196
+ this.cursor += clean.length;
197
+ this.refreshMenu();
198
+ }
199
+ }
200
+ break;
201
+ }
202
+ this.render();
203
+ }
204
+ refreshMenu() {
205
+ this.menu = this.cfg.suggest(this.buf);
206
+ if (this.sel >= this.menu.length)
207
+ this.sel = 0;
208
+ }
209
+ accept() {
210
+ const pick = this.menu[this.sel];
211
+ if (!pick)
212
+ return;
213
+ this.buf = pick.value;
214
+ this.cursor = this.buf.length;
215
+ this.refreshMenu();
216
+ }
217
+ historyPrev() {
218
+ const h = this.cfg.history;
219
+ if (this.histIdx > 0) {
220
+ this.histIdx--;
221
+ this.buf = h[this.histIdx] ?? '';
222
+ this.cursor = this.buf.length;
223
+ this.menu = [];
224
+ }
225
+ }
226
+ historyNext() {
227
+ const h = this.cfg.history;
228
+ if (this.histIdx < h.length) {
229
+ this.histIdx++;
230
+ this.buf = this.histIdx === h.length ? '' : h[this.histIdx] ?? '';
231
+ this.cursor = this.buf.length;
232
+ this.menu = [];
233
+ }
234
+ }
235
+ renderItem(s, i) {
236
+ return listRow('❯', s.label, s.hint, this.cols, i === this.sel);
237
+ }
238
+ /** Box width + the horizontally-scrolled slice of the buffer that is visible. */
239
+ window() {
240
+ const margin = 1; // leading space before the box
241
+ const boxW = Math.max(20, Math.min(this.cols - 2 - margin, 100));
242
+ const prefixW = 3; // " › "
243
+ const avail = boxW - prefixW;
244
+ let off = 0;
245
+ if (this.buf.length > avail) {
246
+ if (this.cursor > avail - 1)
247
+ off = this.cursor - (avail - 1);
248
+ off = Math.min(off, this.buf.length - avail);
249
+ off = Math.max(0, off);
250
+ }
251
+ const text = this.buf.slice(off, off + avail);
252
+ const cursorCol = margin + 1 /* │ */ + prefixW + (this.cursor - off);
253
+ return { boxW, text, cursorCol };
254
+ }
255
+ render(first = false) {
256
+ const out = process.stdout;
257
+ if (!first && this.prevTop > 0)
258
+ node_readline_1.default.moveCursor(out, 0, -this.prevTop);
259
+ node_readline_1.default.cursorTo(out, 0);
260
+ node_readline_1.default.clearScreenDown(out);
261
+ const { boxW, text, cursorCol } = this.window();
262
+ const m = ' '; // margin
263
+ const pad = ' '.repeat(Math.max(0, boxW - 3 - text.length));
264
+ const top = `${m}${DIM}╭${'─'.repeat(boxW)}╮${RESET}`;
265
+ const input = `${m}${DIM}│${RESET} ${TEAL}›${RESET} ${text}${pad}${DIM}│${RESET}`;
266
+ const bottom = `${m}${DIM}╰${'─'.repeat(boxW)}╯${RESET}`;
267
+ out.write(top + '\n');
268
+ out.write(input + '\n');
269
+ out.write(bottom);
270
+ const menu = this.menu.slice(0, this.maxRows);
271
+ if (menu.length) {
272
+ out.write('\n');
273
+ menu.forEach((s, i) => out.write(this.renderItem(s, i) + (i < menu.length - 1 ? '\n' : '')));
274
+ }
275
+ // Move from the last drawn row back up to the input row (row index 1).
276
+ const rowsBelowInput = 1 + menu.length;
277
+ node_readline_1.default.moveCursor(out, 0, -rowsBelowInput);
278
+ node_readline_1.default.cursorTo(out, cursorCol);
279
+ this.prevTop = 1;
280
+ }
281
+ }
282
+ exports.LineReader = LineReader;
283
+ /**
284
+ * Arrow-key list selector (↑/↓ to move, Enter to choose, 1-9 as shortcuts,
285
+ * Ctrl+C to cancel). Falls back to a numbered prompt when stdin is not a TTY
286
+ * or OI_SIMPLE is set. Returns the chosen value, or null if cancelled.
287
+ */
288
+ function select(cfg) {
289
+ const { title, choices } = cfg;
290
+ if (choices.length === 0)
291
+ return Promise.resolve(null);
292
+ const stdin = process.stdin;
293
+ const simple = process.env.OI_SIMPLE === '1' || !stdin.isTTY;
294
+ if (simple)
295
+ return selectSimple(cfg);
296
+ return new Promise((resolve) => {
297
+ const out = process.stdout;
298
+ let sel = 0;
299
+ const block = 1 + choices.length; // rows from title row to footer row
300
+ const render = (first = false) => {
301
+ const cols = out.columns || 80;
302
+ if (!first)
303
+ node_readline_1.default.moveCursor(out, 0, -block);
304
+ node_readline_1.default.cursorTo(out, 0);
305
+ node_readline_1.default.clearScreenDown(out);
306
+ out.write(clamp(title, cols - 1) + '\n');
307
+ choices.forEach((c, i) => out.write(listRow('❯', c.label, c.hint, cols, i === sel) + '\n'));
308
+ out.write(` ${DIM}${clamp(cfg.hint ?? '↑↓ to move · Enter to select', cols - 4)}${RESET}`);
309
+ };
310
+ const cleanup = () => {
311
+ stdin.removeListener('keypress', onKey);
312
+ if (stdin.isTTY)
313
+ stdin.setRawMode(false);
314
+ out.write('\x1b[?25h'); // show cursor
315
+ stdin.pause();
316
+ };
317
+ const finish = (value) => {
318
+ node_readline_1.default.moveCursor(out, 0, -block);
319
+ node_readline_1.default.cursorTo(out, 0);
320
+ node_readline_1.default.clearScreenDown(out);
321
+ if (value !== null) {
322
+ const chosen = choices.find((c) => c.value === value);
323
+ out.write(`${title} ${TEAL}${chosen?.label ?? ''}${RESET}\n`);
324
+ }
325
+ cleanup();
326
+ resolve(value);
327
+ };
328
+ const onKey = (str, key) => {
329
+ if (!key)
330
+ return;
331
+ if (key.ctrl && key.name === 'c')
332
+ return finish(null);
333
+ switch (key.name) {
334
+ case 'up':
335
+ sel = (sel - 1 + choices.length) % choices.length;
336
+ break;
337
+ case 'down':
338
+ sel = (sel + 1) % choices.length;
339
+ break;
340
+ case 'return':
341
+ case 'enter':
342
+ return finish(choices[sel].value);
343
+ default:
344
+ if (str && /^[1-9]$/.test(str)) {
345
+ const n = parseInt(str, 10);
346
+ if (n <= choices.length)
347
+ return finish(choices[n - 1].value);
348
+ }
349
+ }
350
+ render();
351
+ };
352
+ node_readline_1.default.emitKeypressEvents(stdin);
353
+ stdin.setRawMode(true);
354
+ stdin.resume();
355
+ out.write('\x1b[?25l'); // hide cursor
356
+ stdin.on('keypress', onKey);
357
+ render(true);
358
+ });
359
+ }
360
+ function selectSimple(cfg) {
361
+ console.log(cfg.title + '\n');
362
+ cfg.choices.forEach((c, i) => console.log(` ${i + 1}. ${c.label}${c.hint ? ' ' + c.hint : ''}`));
363
+ const rl = node_readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
364
+ return new Promise((resolve) => {
365
+ rl.question(`\n Choose (1-${cfg.choices.length}) [1]: `, (ans) => {
366
+ rl.close();
367
+ const n = parseInt(ans.trim() || '1', 10);
368
+ if (!Number.isNaN(n) && n >= 1 && n <= cfg.choices.length)
369
+ resolve(cfg.choices[n - 1].value);
370
+ else
371
+ resolve(cfg.choices[0].value);
372
+ });
373
+ });
374
+ }
375
+ //# sourceMappingURL=linereader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linereader.js","sourceRoot":"","sources":["../src/linereader.ts"],"names":[],"mappings":"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"}
package/dist/manage.d.ts CHANGED
@@ -7,5 +7,10 @@ export declare function runPull(modelId: string, opts: {
7
7
  docker?: boolean;
8
8
  setDefault?: boolean;
9
9
  }): Promise<void>;
10
+ export declare function runRemove(modelId: string, opts: {
11
+ ollamaUrl?: string;
12
+ docker?: boolean;
13
+ yes?: boolean;
14
+ }): Promise<void>;
10
15
  export declare function runStorage(): Promise<void>;
11
16
  //# sourceMappingURL=manage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manage.d.ts","sourceRoot":"","sources":["../src/manage.ts"],"names":[],"mappings":"AAYA,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB3G;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACnE,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BhD"}
1
+ {"version":3,"file":"manage.d.ts","sourceRoot":"","sources":["../src/manage.ts"],"names":[],"mappings":"AAqBA,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB3G;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACnE,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5D,OAAO,CAAC,IAAI,CAAC,CAoEf;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BhD"}
package/dist/manage.js CHANGED
@@ -35,11 +35,19 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.runUse = runUse;
37
37
  exports.runPull = runPull;
38
+ exports.runRemove = runRemove;
38
39
  exports.runStorage = runStorage;
39
40
  const config_1 = require("./config");
40
41
  const recommend_1 = require("./recommend");
41
42
  const hardware_1 = require("./hardware");
43
+ const prompt_1 = require("./prompt");
42
44
  const ollama_1 = require("./ollama");
45
+ function formatBytes(bytes) {
46
+ const gb = bytes / 1024 ** 3;
47
+ if (gb >= 1)
48
+ return `${gb.toFixed(1)} GB`;
49
+ return `${Math.round(bytes / 1024 ** 2)} MB`;
50
+ }
43
51
  async function runUse(modelId, opts) {
44
52
  const catalog = (0, recommend_1.loadCatalog)();
45
53
  const entry = catalog.find((m) => m.id === modelId);
@@ -71,6 +79,13 @@ async function runPull(modelId, opts) {
71
79
  if (entry.ramGb > hw.budgetGb) {
72
80
  console.log(`\n Warning: ${entry.name} may not fit (~${entry.ramGb} GB needed, ~${hw.budgetGb} GB available).\n`);
73
81
  }
82
+ if (entry.sizeMb > 0) {
83
+ const freeGb = (0, hardware_1.detectDiskFreeGb)();
84
+ if (freeGb > 0 && !(0, hardware_1.fitsDisk)(entry.sizeMb, freeGb)) {
85
+ throw new Error(`Not enough disk for ${entry.name} (~${(entry.sizeMb / 1024).toFixed(1)} GB needed, ${freeGb} GB free). ` +
86
+ 'Free up space or remove a model with `oi rm <model>`.');
87
+ }
88
+ }
74
89
  }
75
90
  if (opts.docker)
76
91
  await (0, ollama_1.pullModelRemote)(base, modelId);
@@ -87,6 +102,68 @@ async function runPull(modelId, opts) {
87
102
  console.log(`\n ✓ Downloaded: ${modelId}\n`);
88
103
  }
89
104
  }
105
+ async function runRemove(modelId, opts) {
106
+ const base = (0, ollama_1.resolveOllamaUrl)(opts.ollamaUrl);
107
+ if (!(await (0, ollama_1.pingOllama)(base))) {
108
+ if (opts.docker)
109
+ throw new Error(`Ollama not reachable at ${base}`);
110
+ await (0, ollama_1.ensureHostOllamaRunning)(base);
111
+ }
112
+ const installed = await (0, ollama_1.listModelTags)(base);
113
+ if (installed.length === 0) {
114
+ console.log('\n No models are downloaded — nothing to remove.\n');
115
+ return;
116
+ }
117
+ // Resolve the exact installed tag the user means.
118
+ const matches = installed.filter((t) => t === modelId || t === `${modelId}:latest` || t.startsWith(`${modelId}:`));
119
+ if (matches.length === 0) {
120
+ console.log(`\n "${modelId}" is not downloaded. Installed models:\n`);
121
+ installed.forEach((t) => console.log(` ${t}`));
122
+ console.log('');
123
+ return;
124
+ }
125
+ if (matches.length > 1 && !matches.includes(modelId)) {
126
+ console.log(`\n "${modelId}" matches several models — please be specific:\n`);
127
+ matches.forEach((t) => console.log(` ${t}`));
128
+ console.log('');
129
+ return;
130
+ }
131
+ const target = matches.includes(modelId) ? modelId : matches[0];
132
+ const bytes = await (0, ollama_1.modelSizeBytes)(base, target);
133
+ const sizeStr = bytes ? formatBytes(bytes) : null;
134
+ const cfg = (0, config_1.loadConfig)();
135
+ const isActive = cfg?.model === target;
136
+ if (!opts.yes) {
137
+ console.log('');
138
+ console.log(` Remove ${target}${sizeStr ? ` (${sizeStr})` : ''}?`);
139
+ if (isActive)
140
+ console.log(' ⚠ This is your active model.');
141
+ const ok = await (0, prompt_1.askYesNo)(' Continue? (y/N): ', false);
142
+ if (!ok) {
143
+ console.log('\n Cancelled.\n');
144
+ return;
145
+ }
146
+ }
147
+ await (0, ollama_1.deleteModel)(base, target);
148
+ const diskFreeGb = (0, hardware_1.detectHardware)().diskFreeGb;
149
+ const freed = sizeStr ? ` · freed ${sizeStr}` : '';
150
+ const free = diskFreeGb > 0 ? ` · ${diskFreeGb} GB now free` : '';
151
+ console.log(`\n ✓ Removed ${target}${freed}${free}\n`);
152
+ // If we deleted the active model, repoint to another or clear the config.
153
+ if (isActive) {
154
+ const remaining = (await (0, ollama_1.listModelTags)(base).catch(() => [])).filter((t) => t !== target);
155
+ if (remaining.length > 0) {
156
+ const next = remaining[0];
157
+ const entry = (0, recommend_1.loadCatalog)().find((m) => m.id === next);
158
+ (0, config_1.setActiveModel)(next, entry?.name ?? next);
159
+ console.log(` Active model is now ${entry?.name ?? next} (${next}).\n`);
160
+ }
161
+ else {
162
+ (0, config_1.clearConfig)();
163
+ console.log(' That was your only model — run `oi` to set up again.\n');
164
+ }
165
+ }
166
+ }
90
167
  async function runStorage() {
91
168
  const { ollamaModelsPath } = await Promise.resolve().then(() => __importStar(require('./hardware')));
92
169
  const cfg = (0, config_1.loadConfig)();
@@ -1 +1 @@
1
- {"version":3,"file":"manage.js","sourceRoot":"","sources":["../src/manage.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,wBAsBC;AAED,0BA2BC;AAED,gCA2BC;AA5FD,qCAAsD;AACtD,2CAA0C;AAC1C,yCAA4C;AAC5C,qCAOkB;AAEX,KAAK,UAAU,MAAM,CAAC,OAAe,EAAE,IAA8C;IAC1F,MAAM,OAAO,GAAG,IAAA,uBAAW,GAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC;IACpC,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,CAAC,MAAM,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,IAAA,gCAAuB,EAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,sBAAa,EAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;IAEhF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,oCAAoC,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAA,wBAAe,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;;YACjD,MAAM,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,IAAA,uBAAc,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,KAAK,OAAO,KAAK,CAAC,CAAC;AAC5D,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,OAAe,EACf,IAAoE;IAEpE,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAA,uBAAW,GAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAEpD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,EAAE,GAAG,IAAA,yBAAc,GAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,KAAK,gBAAgB,EAAE,CAAC,QAAQ,mBAAmB,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,IAAA,wBAAe,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACjD,CAAC;QACJ,IAAI,CAAC,CAAC,MAAM,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC;YAAE,MAAM,IAAA,gCAAuB,EAAC,IAAI,CAAC,CAAC;QACnE,MAAM,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAA,uBAAc,EAAC,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,uCAAuC,KAAK,EAAE,IAAI,IAAI,OAAO,IAAI,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,IAAI,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,gBAAgB,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAA,mBAAU,GAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,mBAAmB,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAEvD,IAAI,MAAM,IAAA,mBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAa,EAAC,IAAI,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/D,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"manage.js","sourceRoot":"","sources":["../src/manage.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,wBAsBC;AAED,0BAoCC;AAED,8BAuEC;AAED,gCA2BC;AAvLD,qCAAmE;AACnE,2CAA0C;AAC1C,yCAAwE;AACxE,qCAAoC;AACpC,qCASkB;AAElB,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,EAAE,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC;IAC7B,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC;AAEM,KAAK,UAAU,MAAM,CAAC,OAAe,EAAE,IAA8C;IAC1F,MAAM,OAAO,GAAG,IAAA,uBAAW,GAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC;IACpC,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,CAAC,MAAM,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,IAAA,gCAAuB,EAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,sBAAa,EAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;IAEhF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,oCAAoC,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAA,wBAAe,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;;YACjD,MAAM,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,IAAA,uBAAc,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,KAAK,OAAO,KAAK,CAAC,CAAC;AAC5D,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,OAAe,EACf,IAAoE;IAEpE,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAA,uBAAW,GAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAEpD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,EAAE,GAAG,IAAA,yBAAc,GAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,KAAK,gBAAgB,EAAE,CAAC,QAAQ,mBAAmB,CAAC,CAAC;QACrH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,IAAA,2BAAgB,GAAE,CAAC;YAClC,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,IAAA,mBAAQ,EAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CACb,uBAAuB,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,MAAM,aAAa;oBACvG,uDAAuD,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,IAAA,wBAAe,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACjD,CAAC;QACJ,IAAI,CAAC,CAAC,MAAM,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC;YAAE,MAAM,IAAA,gCAAuB,EAAC,IAAI,CAAC,CAAC;QACnE,MAAM,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAA,uBAAc,EAAC,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,uCAAuC,KAAK,EAAE,IAAI,IAAI,OAAO,IAAI,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,IAAI,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,IAA6D;IAE7D,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,CAAC,MAAM,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,IAAA,gCAAuB,EAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,sBAAa,EAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,kDAAkD;IAClD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,OAAO,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,CACjF,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO,0CAA0C,CAAC,CAAC;QACvE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO,kDAAkD,CAAC,CAAC;QAC/E,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;IAEjE,MAAM,KAAK,GAAG,MAAM,IAAA,uBAAc,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,MAAM,GAAG,GAAG,IAAA,mBAAU,GAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,GAAG,EAAE,KAAK,KAAK,MAAM,CAAC;IAEvC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,MAAM,IAAA,iBAAQ,EAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,IAAA,oBAAW,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,IAAA,yBAAc,GAAE,CAAC,UAAU,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,UAAU,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC;IAExD,0EAA0E;IAC1E,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,CAAC,MAAM,IAAA,sBAAa,EAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QAC1F,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAA,uBAAW,GAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YACvD,IAAA,uBAAc,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,IAAA,oBAAW,GAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,gBAAgB,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAA,mBAAU,GAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,mBAAmB,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAEvD,IAAI,MAAM,IAAA,mBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAa,EAAC,IAAI,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/D,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
package/dist/ollama.d.ts CHANGED
@@ -11,6 +11,16 @@ export declare function pullModelHost(modelId: string): Promise<void>;
11
11
  /** Pull via Ollama HTTP API (for Docker / VM where `ollama` CLI is not on PATH). */
12
12
  export declare function pullModelRemote(baseUrl: string, modelId: string): Promise<void>;
13
13
  export declare function isInferenceCrashError(msg: string): boolean;
14
+ /**
15
+ * Turn a raw Ollama crash payload into an honest, specific message — instead of
16
+ * always blaming RAM. An OOM-kill (SIGKILL) and a segfault (SIGSEGV) have very
17
+ * different causes and fixes.
18
+ */
19
+ export declare function classifyCrash(text: string): string | null;
14
20
  export declare function verifyModel(baseUrl: string, modelId: string): Promise<void>;
15
21
  export declare function listModelTags(ollamaUrl?: string): Promise<string[]>;
22
+ /** Bytes a model occupies on disk, or null if it isn't installed / can't be read. */
23
+ export declare function modelSizeBytes(baseUrl: string, modelId: string): Promise<number | null>;
24
+ /** Delete a model via the Ollama HTTP API (works for local CLI and remote/Docker). */
25
+ export declare function deleteModel(baseUrl: string, modelId: string): Promise<void>;
16
26
  //# sourceMappingURL=ollama.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"AAKA,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAED,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAqCpC;AAWD,2DAA2D;AAC3D,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB5E;AAED,yEAAyE;AACzE,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5D;AAID,oFAAoF;AACpF,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDrF;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BjF;AAMD,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMzE"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"AAKA,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAED,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAqCpC;AAWD,2DAA2D;AAC3D,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB5E;AAED,yEAAyE;AACzE,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5D;AAID,oFAAoF;AACpF,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDrF;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqBzD;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjF;AAMD,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMzE;AAED,qFAAqF;AACrF,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa7F;AAED,sFAAsF;AACtF,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYjF"}
package/dist/ollama.js CHANGED
@@ -9,8 +9,11 @@ exports.ensureRemoteOllama = ensureRemoteOllama;
9
9
  exports.pullModelHost = pullModelHost;
10
10
  exports.pullModelRemote = pullModelRemote;
11
11
  exports.isInferenceCrashError = isInferenceCrashError;
12
+ exports.classifyCrash = classifyCrash;
12
13
  exports.verifyModel = verifyModel;
13
14
  exports.listModelTags = listModelTags;
15
+ exports.modelSizeBytes = modelSizeBytes;
16
+ exports.deleteModel = deleteModel;
14
17
  const node_child_process_1 = require("node:child_process");
15
18
  const config_1 = require("./config");
16
19
  const DEFAULT_URL = 'http://127.0.0.1:11434';
@@ -167,6 +170,27 @@ async function pullModelRemote(baseUrl, modelId) {
167
170
  function isInferenceCrashError(msg) {
168
171
  return /segmentation fault|process has terminated|out of memory|oom|cuda/i.test(msg);
169
172
  }
173
+ /**
174
+ * Turn a raw Ollama crash payload into an honest, specific message — instead of
175
+ * always blaming RAM. An OOM-kill (SIGKILL) and a segfault (SIGSEGV) have very
176
+ * different causes and fixes.
177
+ */
178
+ function classifyCrash(text) {
179
+ const t = text.toLowerCase();
180
+ if (/signal: killed|out of memory|\boom\b|cannot allocate|bad_alloc/.test(t)) {
181
+ return ('Model crashed — the system ran out of memory (OOM-killed). ' +
182
+ 'Pick a smaller model (e.g. smollm2:135m) or use a machine with more RAM.');
183
+ }
184
+ if (/cuda|rocm|hip error|gpu/.test(t)) {
185
+ return ('Model crashed on the GPU. Update your GPU driver, or run a smaller model on CPU.');
186
+ }
187
+ if (/segmentation fault|sigsegv|core dumped|process has terminated/.test(t)) {
188
+ return ('Model crashed (segmentation fault). This is often low memory, but a segfault ' +
189
+ 'can also mean a CPU-compatibility issue or a corrupt/partial download. ' +
190
+ 'Try re-pulling the model, or pick a smaller one (e.g. smollm2:135m).');
191
+ }
192
+ return null;
193
+ }
170
194
  async function verifyModel(baseUrl, modelId) {
171
195
  const url = resolveOllamaUrl(baseUrl);
172
196
  console.log('Verifying model…');
@@ -183,10 +207,9 @@ async function verifyModel(baseUrl, modelId) {
183
207
  });
184
208
  if (!res.ok) {
185
209
  const text = await res.text().catch(() => '');
186
- if (isInferenceCrashError(text)) {
187
- throw new Error(`Model "${modelId}" crashed on this computer (usually not enough RAM for CPU inference). ` +
188
- 'Pick a smaller modeltry smollm2:135m or gemma3:1b.');
189
- }
210
+ const crash = classifyCrash(text);
211
+ if (crash)
212
+ throw new Error(`Model "${modelId}"${crash}`);
190
213
  throw new Error(`Model verification failed: ${res.status} ${text}`);
191
214
  }
192
215
  const body = (await res.json());
@@ -203,4 +226,33 @@ async function listModelTags(ollamaUrl) {
203
226
  const body = (await res.json());
204
227
  return (body.models ?? []).map((m) => m.name).sort();
205
228
  }
229
+ /** Bytes a model occupies on disk, or null if it isn't installed / can't be read. */
230
+ async function modelSizeBytes(baseUrl, modelId) {
231
+ const base = resolveOllamaUrl(baseUrl);
232
+ try {
233
+ const res = await fetch(`${base}/api/tags`, { signal: AbortSignal.timeout(15_000) });
234
+ if (!res.ok)
235
+ return null;
236
+ const body = (await res.json());
237
+ const hit = (body.models ?? []).find((m) => m.name === modelId || m.name === `${modelId}:latest`);
238
+ return hit?.size ?? null;
239
+ }
240
+ catch {
241
+ return null;
242
+ }
243
+ }
244
+ /** Delete a model via the Ollama HTTP API (works for local CLI and remote/Docker). */
245
+ async function deleteModel(baseUrl, modelId) {
246
+ const base = resolveOllamaUrl(baseUrl);
247
+ const res = await fetch(`${base}/api/delete`, {
248
+ method: 'DELETE',
249
+ headers: { 'content-type': 'application/json' },
250
+ body: JSON.stringify({ name: modelId }),
251
+ signal: AbortSignal.timeout(30_000),
252
+ });
253
+ if (!res.ok) {
254
+ const text = await res.text().catch(() => '');
255
+ throw new Error(`Could not delete ${modelId} (${res.status}): ${text || res.statusText}`);
256
+ }
257
+ }
206
258
  //# sourceMappingURL=ollama.js.map