@openinference/cli 0.3.0 → 1.0.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 (49) hide show
  1. package/README.md +65 -0
  2. package/data/models.json +643 -120
  3. package/dist/chat.d.ts.map +1 -1
  4. package/dist/chat.js +1 -5
  5. package/dist/chat.js.map +1 -1
  6. package/dist/config.d.ts +3 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +8 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/data/models.json +643 -120
  11. package/dist/hardware.d.ts +5 -0
  12. package/dist/hardware.d.ts.map +1 -1
  13. package/dist/hardware.js +45 -0
  14. package/dist/hardware.js.map +1 -1
  15. package/dist/index.js +125 -53
  16. package/dist/index.js.map +1 -1
  17. package/dist/manage.d.ts +11 -0
  18. package/dist/manage.d.ts.map +1 -0
  19. package/dist/manage.js +118 -0
  20. package/dist/manage.js.map +1 -0
  21. package/dist/ollama.d.ts +1 -0
  22. package/dist/ollama.d.ts.map +1 -1
  23. package/dist/ollama.js +12 -3
  24. package/dist/ollama.js.map +1 -1
  25. package/dist/prompt.d.ts +11 -0
  26. package/dist/prompt.d.ts.map +1 -1
  27. package/dist/prompt.js +99 -11
  28. package/dist/prompt.js.map +1 -1
  29. package/dist/recommend-run.d.ts +6 -4
  30. package/dist/recommend-run.d.ts.map +1 -1
  31. package/dist/recommend-run.js +20 -25
  32. package/dist/recommend-run.js.map +1 -1
  33. package/dist/recommend.d.ts +18 -1
  34. package/dist/recommend.d.ts.map +1 -1
  35. package/dist/recommend.js +53 -22
  36. package/dist/recommend.js.map +1 -1
  37. package/dist/setup.d.ts +12 -4
  38. package/dist/setup.d.ts.map +1 -1
  39. package/dist/setup.js +84 -54
  40. package/dist/setup.js.map +1 -1
  41. package/dist/start.d.ts +2 -2
  42. package/dist/start.d.ts.map +1 -1
  43. package/dist/start.js +4 -9
  44. package/dist/start.js.map +1 -1
  45. package/dist/use-cases.d.ts +17 -0
  46. package/dist/use-cases.d.ts.map +1 -0
  47. package/dist/use-cases.js +115 -0
  48. package/dist/use-cases.js.map +1 -0
  49. package/package.json +8 -2
package/dist/prompt.d.ts CHANGED
@@ -1,4 +1,15 @@
1
+ import type { HardwareProfile } from './hardware';
1
2
  import type { Recommendation } from './recommend';
3
+ export declare function printHardwareResults(hw: HardwareProfile): void;
4
+ export declare function printHardwareScan(hw: HardwareProfile): void;
5
+ /** Detailed list for `oi recommend` / `oi browse`. */
2
6
  export declare function printRecommendations(recs: Recommendation[]): void;
7
+ /** Wizard step: numbered picks with recommended badge on #1. */
8
+ export declare function printWizardRecommendations(recs: Recommendation[], totalFit: number): void;
3
9
  export declare function pickRecommendation(recs: Recommendation[]): Promise<Recommendation>;
10
+ export declare function confirmInstall(opts: {
11
+ modelName: string;
12
+ sizeMb: number;
13
+ needsOllama: boolean;
14
+ }): Promise<boolean>;
4
15
  //# sourceMappingURL=prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,CAWjE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAkBxF"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAalD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAc9D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAG3D;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,CAWjE;AAED,gEAAgE;AAChE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQzF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAmBxF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBnB"}
package/dist/prompt.js CHANGED
@@ -1,44 +1,132 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
5
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.printHardwareResults = printHardwareResults;
37
+ exports.printHardwareScan = printHardwareScan;
6
38
  exports.printRecommendations = printRecommendations;
39
+ exports.printWizardRecommendations = printWizardRecommendations;
7
40
  exports.pickRecommendation = pickRecommendation;
8
- const node_readline_1 = __importDefault(require("node:readline"));
9
- const recommend_1 = require("./recommend");
41
+ exports.confirmInstall = confirmInstall;
10
42
  const TIER_COLOR = {
11
43
  perfect: '\x1b[32m',
12
44
  good: '\x1b[33m',
13
45
  marginal: '\x1b[35m',
14
46
  };
15
47
  const RESET = '\x1b[0m';
48
+ function formatSize(mb) {
49
+ return mb >= 1000 ? `${(mb / 1000).toFixed(1)} GB` : `${mb} MB`;
50
+ }
51
+ function printHardwareResults(hw) {
52
+ console.log(' Scanning your computer…\n');
53
+ console.log(` ✓ ${hw.osLabel}`);
54
+ console.log(` ✓ ${hw.ramGb} GB RAM`);
55
+ console.log(` ✓ ${hw.cpuCores} CPU cores`);
56
+ if (hw.hasGpu) {
57
+ console.log(` ✓ ${hw.gpuName ?? 'GPU'} (${hw.vramGb} GB VRAM)`);
58
+ }
59
+ else {
60
+ console.log(' ✓ CPU inference (no dedicated GPU detected)');
61
+ }
62
+ if (hw.diskFreeGb > 0) {
63
+ console.log(` ✓ ${hw.diskFreeGb} GB disk free`);
64
+ }
65
+ console.log(` ✓ ~${hw.budgetGb} GB available for models\n`);
66
+ }
67
+ function printHardwareScan(hw) {
68
+ console.log('\n OpenInference — local AI setup\n');
69
+ printHardwareResults(hw);
70
+ }
71
+ /** Detailed list for `oi recommend` / `oi browse`. */
16
72
  function printRecommendations(recs) {
17
73
  console.log('');
18
74
  recs.forEach((r, i) => {
19
75
  const color = TIER_COLOR[r.fit] ?? '';
20
- const size = r.sizeMb >= 1000 ? `${(r.sizeMb / 1000).toFixed(1)} GB` : `${r.sizeMb} MB`;
21
- console.log(` [${i + 1}] ${color}${(0, recommend_1.fitLabel)(r.fit).padEnd(9)}${RESET} ${r.name.padEnd(22)} ${size.padStart(7)} ${r.useCase}`);
76
+ const size = formatSize(r.sizeMb);
77
+ console.log(` [${i + 1}] ${color}${r.fit.padEnd(9)}${RESET} ${r.name.padEnd(22)} ${size.padStart(7)} ${r.useCase}`);
22
78
  console.log(` ${r.id}`);
23
79
  });
24
80
  console.log('');
25
81
  }
82
+ /** Wizard step: numbered picks with recommended badge on #1. */
83
+ function printWizardRecommendations(recs, totalFit) {
84
+ console.log(` ${totalFit} models fit your computer for this use case. Top picks:\n`);
85
+ recs.forEach((r, i) => {
86
+ const badge = i === 0 ? ' ⭐ Recommended' : '';
87
+ const size = formatSize(r.sizeMb);
88
+ console.log(` ${i + 1}. ${r.name.padEnd(22)} ${size.padStart(8)}${badge}`);
89
+ });
90
+ console.log('');
91
+ }
26
92
  async function pickRecommendation(recs) {
27
93
  if (recs.length === 0) {
28
- throw new Error('No models fit this machine. Free up RAM or use a machine with more memory.');
94
+ throw new Error('No models fit this machine. Free up RAM or disk, or try another use case.');
29
95
  }
30
96
  if (recs.length === 1)
31
97
  return recs[0];
32
- const rl = node_readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
98
+ const readline = await Promise.resolve().then(() => __importStar(require('node:readline')));
99
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
33
100
  const answer = await new Promise((resolve) => {
34
- rl.question(`Pick a model [1-${recs.length}] (default 1): `, resolve);
101
+ rl.question(` Choose a model (1-${recs.length}) [1]: `, resolve);
35
102
  });
36
103
  rl.close();
37
104
  const n = parseInt(answer.trim() || '1', 10);
38
105
  if (Number.isNaN(n) || n < 1 || n > recs.length) {
39
- console.log('Invalid choice — using recommendation #1.');
106
+ console.log(' Invalid choice — using recommendation #1.\n');
40
107
  return recs[0];
41
108
  }
42
109
  return recs[n - 1];
43
110
  }
111
+ async function confirmInstall(opts) {
112
+ const size = formatSize(opts.sizeMb);
113
+ console.log(' This will:\n');
114
+ if (opts.needsOllama) {
115
+ console.log(' • Install Ollama (local AI runtime, one-time)');
116
+ }
117
+ console.log(` • Download ${size} — ${opts.modelName}`);
118
+ console.log(' • Store models in ~/.ollama/models (managed by Ollama)\n');
119
+ const readline = await Promise.resolve().then(() => __importStar(require('node:readline')));
120
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
121
+ const answer = await new Promise((resolve) => {
122
+ rl.question(' Continue? (Y/n): ', resolve);
123
+ });
124
+ rl.close();
125
+ const no = /^(n|no)$/i.test(answer.trim());
126
+ if (no) {
127
+ console.log('\n Setup cancelled. Run `oi` again when you are ready.\n');
128
+ return false;
129
+ }
130
+ return true;
131
+ }
44
132
  //# sourceMappingURL=prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":";;;;;AAYA,oDAWC;AAED,gDAkBC;AA3CD,kEAAqC;AAGrC,2CAAuC;AAEvC,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,UAAU;CACrB,CAAC;AACF,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,SAAgB,oBAAoB,CAAC,IAAsB;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;QACxF,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,IAAA,oBAAQ,EAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CACnH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAsB;IAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;IAEvC,MAAM,EAAE,GAAG,uBAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACnD,EAAE,CAAC,QAAQ,CAAC,mBAAmB,IAAI,CAAC,MAAM,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
- import type { Recommendation } from './recommend';
2
- import { fitTier } from './recommend';
1
+ import type { UseCaseId } from './use-cases';
2
+ import { parseUseCaseArg, useCaseLabel } from './use-cases';
3
3
  export type RecommendRunOptions = {
4
4
  limit?: number;
5
5
  all?: boolean;
6
+ useCase?: UseCaseId;
6
7
  };
7
- export declare function runRecommend(opts?: RecommendRunOptions): Recommendation[];
8
- export { fitTier };
8
+ export declare function runRecommend(opts?: RecommendRunOptions): void;
9
+ export declare function runBrowse(opts?: RecommendRunOptions): void;
10
+ export { parseUseCaseArg, useCaseLabel };
9
11
  //# sourceMappingURL=recommend-run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recommend-run.d.ts","sourceRoot":"","sources":["../src/recommend-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,EAA6B,MAAM,aAAa,CAAC;AAIjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,cAAc,EAAE,CA+B7E;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"recommend-run.d.ts","sourceRoot":"","sources":["../src/recommend-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK5D,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,IAAI,CAejE;AAED,wBAAgB,SAAS,CAAC,IAAI,GAAE,mBAAwB,GAAG,IAAI,CAE9D;AAED,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC"}
@@ -1,34 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fitTier = void 0;
3
+ exports.useCaseLabel = exports.parseUseCaseArg = void 0;
4
4
  exports.runRecommend = runRecommend;
5
- const recommend_1 = require("./recommend");
6
- Object.defineProperty(exports, "fitTier", { enumerable: true, get: function () { return recommend_1.fitTier; } });
5
+ exports.runBrowse = runBrowse;
6
+ const use_cases_1 = require("./use-cases");
7
+ Object.defineProperty(exports, "parseUseCaseArg", { enumerable: true, get: function () { return use_cases_1.parseUseCaseArg; } });
8
+ Object.defineProperty(exports, "useCaseLabel", { enumerable: true, get: function () { return use_cases_1.useCaseLabel; } });
7
9
  const hardware_1 = require("./hardware");
8
- const prompt_1 = require("./prompt");
10
+ const recommend_1 = require("./recommend");
11
+ const setup_1 = require("./setup");
9
12
  function runRecommend(opts = {}) {
10
13
  const hw = (0, hardware_1.detectHardware)();
11
14
  const catalog = (0, recommend_1.loadCatalog)();
12
- const chat = catalog.filter((m) => m.kind !== 'embed');
13
- let pool = chat;
14
- if (!opts.all) {
15
- const verified = chat.filter((m) => m.verified);
16
- if (verified.length >= 3)
17
- pool = verified;
18
- }
19
- const limit = opts.limit ?? 5;
20
- const recs = (0, recommend_1.recommendTop)(pool, hw.budgetGb, limit);
21
- console.log('\n OpenInference — model recommendations\n');
22
- console.log(` System: ${(0, hardware_1.formatHardware)(hw)}`);
23
- console.log(` Memory budget: ~${hw.budgetGb} GB`);
24
- console.log(` Catalog: ${pool.length} models scored${opts.all ? '' : ' (verified Ollama tags only; use --all for full catalog)'}\n`);
25
- if (recs.length === 0) {
26
- console.log(' No models fit this machine.\n');
27
- return recs;
28
- }
29
- console.log(` Top ${recs.length} for your hardware:\n`);
30
- (0, prompt_1.printRecommendations)(recs);
31
- console.log(' Run `oi setup` to install Ollama and pull your choice.\n');
32
- return recs;
15
+ const useCase = opts.useCase ?? 'chat';
16
+ const { pool, runnable } = (0, recommend_1.buildRecommendPool)(catalog, hw, useCase, opts.all);
17
+ const limit = opts.limit ?? 10;
18
+ const recs = (0, recommend_1.recommendTop)(runnable, hw.budgetGb, limit, useCase, hw.diskFreeGb);
19
+ (0, setup_1.printRecommendPreview)(recs, hw, {
20
+ useCase,
21
+ poolSize: pool.length,
22
+ runnableSize: runnable.length,
23
+ all: opts.all,
24
+ });
25
+ }
26
+ function runBrowse(opts = {}) {
27
+ runRecommend({ ...opts, limit: opts.limit ?? 15 });
33
28
  }
34
29
  //# sourceMappingURL=recommend-run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recommend-run.js","sourceRoot":"","sources":["../src/recommend-run.ts"],"names":[],"mappings":";;;AAUA,oCA+BC;AAxCD,2CAAiE;AA0CxD,wFA1CA,mBAAO,OA0CA;AAzChB,yCAA4D;AAC5D,qCAAgD;AAOhD,SAAgB,YAAY,CAAC,OAA4B,EAAE;IACzD,MAAM,EAAE,GAAG,IAAA,yBAAc,GAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAA,uBAAW,GAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAEvD,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;YAAE,IAAI,GAAG,QAAQ,CAAC;IAC5C,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAA,wBAAY,EAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,aAAa,IAAA,yBAAc,EAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CACT,cAAc,IAAI,CAAC,MAAM,iBAAiB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,0DAA0D,IAAI,CACzH,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,uBAAuB,CAAC,CAAC;IACzD,IAAA,6BAAoB,EAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAE1E,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"recommend-run.js","sourceRoot":"","sources":["../src/recommend-run.ts"],"names":[],"mappings":";;;AAYA,oCAeC;AAED,8BAEC;AA9BD,2CAA4D;AAgCnD,gGAhCA,2BAAe,OAgCA;AAAE,6FAhCA,wBAAY,OAgCA;AA/BtC,yCAA4C;AAC5C,2CAA4E;AAC5E,mCAAgD;AAQhD,SAAgB,YAAY,CAAC,OAA4B,EAAE;IACzD,MAAM,EAAE,GAAG,IAAA,yBAAc,GAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,IAAA,uBAAW,GAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAA,8BAAkB,EAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAA,wBAAY,EAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;IAEhF,IAAA,6BAAqB,EAAC,IAAI,EAAE,EAAE,EAAE;QAC9B,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,MAAM;QACrB,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,SAAS,CAAC,OAA4B,EAAE;IACtD,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC"}
@@ -1,3 +1,5 @@
1
+ import type { UseCaseId } from './use-cases';
2
+ import { type HardwareProfile } from './hardware';
1
3
  export type FitTier = 'perfect' | 'good' | 'marginal';
2
4
  export type CatalogModel = {
3
5
  id: string;
@@ -6,6 +8,7 @@ export type CatalogModel = {
6
8
  sizeMb: number;
7
9
  quality: number;
8
10
  useCase: string;
11
+ categories?: UseCaseId[];
9
12
  kind?: 'embed';
10
13
  verified?: boolean;
11
14
  };
@@ -13,8 +16,22 @@ export type Recommendation = CatalogModel & {
13
16
  fit: FitTier;
14
17
  score: number;
15
18
  };
19
+ export type RecommendOptions = {
20
+ budgetGb: number;
21
+ diskFreeGb?: number;
22
+ useCase?: UseCaseId;
23
+ verifiedOnly?: boolean;
24
+ includeEmbed?: boolean;
25
+ };
16
26
  export declare function loadCatalog(): CatalogModel[];
17
27
  export declare function fitTier(needGb: number, budgetGb: number): FitTier | null;
18
28
  export declare function fitLabel(fit: FitTier): string;
19
- export declare function recommendTop(catalog: CatalogModel[], budgetGb: number, limit?: number): Recommendation[];
29
+ /** Filter catalog by hardware, disk, and optional verified flag. */
30
+ export declare function filterRunnable(catalog: CatalogModel[], opts: RecommendOptions): CatalogModel[];
31
+ export declare function scoreModel(model: CatalogModel, budgetGb: number, useCase?: UseCaseId): Recommendation | null;
32
+ export declare function recommendTop(catalog: CatalogModel[], budgetGb: number, limit?: number, useCase?: UseCaseId, diskFreeGb?: number): Recommendation[];
33
+ export declare function buildRecommendPool(catalog: CatalogModel[], hw: HardwareProfile, useCase: UseCaseId, all?: boolean): {
34
+ pool: CatalogModel[];
35
+ runnable: CatalogModel[];
36
+ };
20
37
  //# sourceMappingURL=recommend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../src/recommend.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG;IAC1C,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAQF,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAG5C;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAMxE;AAcD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAI,GACR,cAAc,EAAE,CA4BlB"}
1
+ {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../src/recommend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG;IAC1C,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAQF,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAG5C;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAMxE;AAcD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EAAE,EACvB,IAAI,EAAE,gBAAgB,GACrB,YAAY,EAAE,CAUhB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,SAAS,GAClB,cAAc,GAAG,IAAI,CASvB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAI,EACT,OAAO,CAAC,EAAE,SAAS,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,EAAE,CAWlB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,YAAY,EAAE,EACvB,EAAE,EAAE,eAAe,EACnB,OAAO,EAAE,SAAS,EAClB,GAAG,CAAC,EAAE,OAAO,GACZ;IAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAiBpD"}
package/dist/recommend.js CHANGED
@@ -6,9 +6,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.loadCatalog = loadCatalog;
7
7
  exports.fitTier = fitTier;
8
8
  exports.fitLabel = fitLabel;
9
+ exports.filterRunnable = filterRunnable;
10
+ exports.scoreModel = scoreModel;
9
11
  exports.recommendTop = recommendTop;
12
+ exports.buildRecommendPool = buildRecommendPool;
10
13
  const node_fs_1 = __importDefault(require("node:fs"));
11
14
  const node_path_1 = __importDefault(require("node:path"));
15
+ const use_cases_1 = require("./use-cases");
16
+ const hardware_1 = require("./hardware");
12
17
  function modelsPath() {
13
18
  const nextToDist = node_path_1.default.join(__dirname, 'data', 'models.json');
14
19
  if (node_fs_1.default.existsSync(nextToDist))
@@ -42,30 +47,56 @@ const FIT_LABEL = {
42
47
  function fitLabel(fit) {
43
48
  return FIT_LABEL[fit];
44
49
  }
45
- function recommendTop(catalog, budgetGb, limit = 5) {
46
- const chatCatalog = catalog.filter((m) => m.kind !== 'embed');
50
+ /** Filter catalog by hardware, disk, and optional verified flag. */
51
+ function filterRunnable(catalog, opts) {
52
+ const disk = opts.diskFreeGb ?? 0;
53
+ return catalog.filter((m) => {
54
+ if (!opts.includeEmbed && m.kind === 'embed')
55
+ return false;
56
+ if (opts.verifiedOnly && !m.verified)
57
+ return false;
58
+ if (!fitTier(m.ramGb, opts.budgetGb))
59
+ return false;
60
+ if (disk > 0 && !(0, hardware_1.fitsDisk)(m.sizeMb, disk))
61
+ return false;
62
+ return true;
63
+ });
64
+ }
65
+ function scoreModel(model, budgetGb, useCase) {
66
+ const fit = fitTier(model.ramGb, budgetGb);
67
+ if (!fit)
68
+ return null;
69
+ let score = FIT_POINTS[fit] + model.quality * 0.35;
70
+ if (useCase)
71
+ score += (0, use_cases_1.useCaseScoreBoost)(model, useCase);
72
+ if (model.verified)
73
+ score += 3;
74
+ return { ...model, fit, score };
75
+ }
76
+ function recommendTop(catalog, budgetGb, limit = 5, useCase, diskFreeGb) {
77
+ const pool = filterRunnable(catalog, { budgetGb, diskFreeGb, includeEmbed: false });
47
78
  const scored = [];
48
- for (const model of chatCatalog) {
49
- const fit = fitTier(model.ramGb, budgetGb);
50
- if (!fit)
51
- continue;
52
- const score = FIT_POINTS[fit] + model.quality * 0.35;
53
- scored.push({ ...model, fit, score });
79
+ for (const model of pool) {
80
+ const rec = scoreModel(model, budgetGb, useCase);
81
+ if (rec)
82
+ scored.push(rec);
54
83
  }
55
84
  scored.sort((a, b) => b.score - a.score);
56
- if (scored.length >= limit)
57
- return scored.slice(0, limit);
58
- // Fill with smallest runnable models if budget is very tight
59
- const extra = chatCatalog
60
- .filter((m) => m.ramGb <= budgetGb)
61
- .filter((m) => !scored.some((s) => s.id === m.id))
62
- .sort((a, b) => a.ramGb - b.ramGb)
63
- .slice(0, limit - scored.length)
64
- .map((m) => ({
65
- ...m,
66
- fit: fitTier(m.ramGb, budgetGb) ?? 'marginal',
67
- score: (fitTier(m.ramGb, budgetGb) ? FIT_POINTS[fitTier(m.ramGb, budgetGb)] : 40) + m.quality * 0.35,
68
- }));
69
- return [...scored, ...extra].slice(0, limit);
85
+ return scored.slice(0, limit);
86
+ }
87
+ function buildRecommendPool(catalog, hw, useCase, all) {
88
+ let pool = catalog.filter((m) => m.kind !== 'embed');
89
+ if (!all) {
90
+ const verified = pool.filter((m) => m.verified);
91
+ if (verified.length >= 10)
92
+ pool = verified;
93
+ }
94
+ pool = (0, use_cases_1.filterByUseCase)(pool, useCase);
95
+ const runnable = filterRunnable(pool, {
96
+ budgetGb: hw.budgetGb,
97
+ diskFreeGb: hw.diskFreeGb,
98
+ includeEmbed: false,
99
+ });
100
+ return { pool, runnable };
70
101
  }
71
102
  //# sourceMappingURL=recommend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../src/recommend.ts"],"names":[],"mappings":";;;;;AA2BA,kCAGC;AAED,0BAMC;AAcD,4BAEC;AAED,oCAgCC;AAxFD,sDAAyB;AACzB,0DAA6B;AAoB7B,SAAS,UAAU;IACjB,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/D,IAAI,iBAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACjD,OAAO,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,WAAW;IACzB,MAAM,GAAG,GAAG,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;AAC3C,CAAC;AAED,SAAgB,OAAO,CAAC,MAAc,EAAE,QAAgB;IACtD,IAAI,MAAM,GAAG,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IACjC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,GAA4B;IAC1C,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,SAAS,GAA4B;IACzC,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,SAAgB,QAAQ,CAAC,GAAY;IACnC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,YAAY,CAC1B,OAAuB,EACvB,QAAgB,EAChB,KAAK,GAAG,CAAC;IAET,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE1D,6DAA6D;IAC7D,MAAM,KAAK,GAAG,WAAW;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,GAAG,CAAC;QACJ,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAK,UAAsB;QAC1D,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI;KACtG,CAAC,CAAC,CAAC;IAEN,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../src/recommend.ts"],"names":[],"mappings":"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"}
package/dist/setup.d.ts CHANGED
@@ -1,13 +1,21 @@
1
+ import type { Recommendation } from './recommend';
2
+ import { detectHardware } from './hardware';
3
+ import { type UseCaseId } from './use-cases';
4
+ export declare const WIZARD_PICK_COUNT = 10;
1
5
  export type SetupOptions = {
2
6
  yes?: boolean;
3
7
  model?: string;
8
+ useCase?: UseCaseId;
4
9
  skipInstall?: boolean;
5
10
  docker?: boolean;
6
11
  ollamaUrl?: string;
7
- /** Beginner mode: minimal output, no jargon */
8
- quick?: boolean;
9
- /** Show 5 models and let user pick */
10
- choose?: boolean;
12
+ all?: boolean;
11
13
  };
12
14
  export declare function runSetup(opts: SetupOptions): Promise<void>;
15
+ export declare function printRecommendPreview(recs: Recommendation[], hw: ReturnType<typeof detectHardware>, meta: {
16
+ useCase: UseCaseId;
17
+ poolSize: number;
18
+ runnableSize: number;
19
+ all?: boolean;
20
+ }): void;
13
21
  //# sourceMappingURL=setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHhE"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,OAAO,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAqB9D,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmIhE;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,cAAc,EAAE,EACtB,EAAE,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EACrC,IAAI,EAAE;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAClF,IAAI,CAeN"}