@openinference/cli 0.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.
- package/data/models.json +1259 -0
- package/dist/chat-repl.d.ts +3 -0
- package/dist/chat-repl.d.ts.map +1 -0
- package/dist/chat-repl.js +35 -0
- package/dist/chat-repl.js.map +1 -0
- package/dist/chat.d.ts +9 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +51 -0
- package/dist/chat.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/data/models.json +1259 -0
- package/dist/hardware.d.ts +13 -0
- package/dist/hardware.d.ts.map +1 -0
- package/dist/hardware.js +61 -0
- package/dist/hardware.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +153 -0
- package/dist/index.js.map +1 -0
- package/dist/ollama.d.ts +14 -0
- package/dist/ollama.d.ts.map +1 -0
- package/dist/ollama.js +189 -0
- package/dist/ollama.js.map +1 -0
- package/dist/prompt.d.ts +4 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +44 -0
- package/dist/prompt.js.map +1 -0
- package/dist/recommend-run.d.ts +9 -0
- package/dist/recommend-run.d.ts.map +1 -0
- package/dist/recommend-run.js +34 -0
- package/dist/recommend-run.js.map +1 -0
- package/dist/recommend.d.ts +20 -0
- package/dist/recommend.d.ts.map +1 -0
- package/dist/recommend.js +71 -0
- package/dist/recommend.js.map +1 -0
- package/dist/setup.d.ts +13 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +119 -0
- package/dist/setup.js.map +1 -0
- package/dist/start.d.ts +13 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +32 -0
- package/dist/start.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type HardwareProfile = {
|
|
2
|
+
ramGb: number;
|
|
3
|
+
cpuCores: number;
|
|
4
|
+
vramGb: number;
|
|
5
|
+
hasGpu: boolean;
|
|
6
|
+
gpuName: string | null;
|
|
7
|
+
platform: NodeJS.Platform;
|
|
8
|
+
/** Usable memory budget for model weights (GB). */
|
|
9
|
+
budgetGb: number;
|
|
10
|
+
};
|
|
11
|
+
export declare function detectHardware(): HardwareProfile;
|
|
12
|
+
export declare function formatHardware(hw: HardwareProfile): string;
|
|
13
|
+
//# sourceMappingURL=hardware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hardware.d.ts","sourceRoot":"","sources":["../src/hardware.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AA0BF,wBAAgB,cAAc,IAAI,eAAe,CAoBhD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,eAAe,GAAG,MAAM,CAK1D"}
|
package/dist/hardware.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
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.detectHardware = detectHardware;
|
|
7
|
+
exports.formatHardware = formatHardware;
|
|
8
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
+
const node_child_process_1 = require("node:child_process");
|
|
10
|
+
function roundGb(bytes) {
|
|
11
|
+
return Math.round((bytes / 1024 ** 3) * 10) / 10;
|
|
12
|
+
}
|
|
13
|
+
function detectVram() {
|
|
14
|
+
try {
|
|
15
|
+
const r = (0, node_child_process_1.spawnSync)('nvidia-smi', ['--query-gpu=name,memory.total', '--format=csv,noheader,nounits'], {
|
|
16
|
+
encoding: 'utf8',
|
|
17
|
+
timeout: 5000,
|
|
18
|
+
windowsHide: true,
|
|
19
|
+
});
|
|
20
|
+
if (r.status !== 0 || !r.stdout?.trim())
|
|
21
|
+
return { vramGb: 0, name: null };
|
|
22
|
+
const line = r.stdout.trim().split('\n')[0] ?? '';
|
|
23
|
+
const comma = line.lastIndexOf(',');
|
|
24
|
+
if (comma === -1)
|
|
25
|
+
return { vramGb: 0, name: null };
|
|
26
|
+
const name = line.slice(0, comma).trim();
|
|
27
|
+
const mb = parseInt(line.slice(comma + 1).trim(), 10);
|
|
28
|
+
if (Number.isNaN(mb))
|
|
29
|
+
return { vramGb: 0, name };
|
|
30
|
+
return { vramGb: Math.round((mb / 1024) * 10) / 10, name };
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return { vramGb: 0, name: null };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function detectHardware() {
|
|
37
|
+
const ramGb = roundGb(node_os_1.default.totalmem());
|
|
38
|
+
const cpuCores = node_os_1.default.cpus().length;
|
|
39
|
+
const { vramGb, name } = detectVram();
|
|
40
|
+
const hasGpu = vramGb > 0;
|
|
41
|
+
const osHeadroom = 4;
|
|
42
|
+
const vramBudget = hasGpu ? Math.max(0, vramGb - 1) : 0;
|
|
43
|
+
const ramBudget = Math.max(0, ramGb - osHeadroom);
|
|
44
|
+
const budgetGb = hasGpu ? Math.max(vramBudget, ramBudget * 0.6) : ramBudget;
|
|
45
|
+
return {
|
|
46
|
+
ramGb,
|
|
47
|
+
cpuCores,
|
|
48
|
+
vramGb,
|
|
49
|
+
hasGpu,
|
|
50
|
+
gpuName: name,
|
|
51
|
+
platform: process.platform,
|
|
52
|
+
budgetGb: Math.round(budgetGb * 10) / 10,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function formatHardware(hw) {
|
|
56
|
+
const gpu = hw.hasGpu
|
|
57
|
+
? `${hw.gpuName ?? 'GPU'} (${hw.vramGb} GB VRAM)`
|
|
58
|
+
: 'CPU inference';
|
|
59
|
+
return `${hw.ramGb} GB RAM · ${hw.cpuCores} cores · ${gpu}`;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=hardware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hardware.js","sourceRoot":"","sources":["../src/hardware.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const config_1 = require("./config");
|
|
6
|
+
const start_1 = require("./start");
|
|
7
|
+
const recommend_run_1 = require("./recommend-run");
|
|
8
|
+
const chat_1 = require("./chat");
|
|
9
|
+
const chat_repl_1 = require("./chat-repl");
|
|
10
|
+
const program = new commander_1.Command();
|
|
11
|
+
function fail(e) {
|
|
12
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
13
|
+
console.error(`\n Error: ${msg}\n`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const urlOption = {
|
|
17
|
+
flags: '--ollama-url <url>',
|
|
18
|
+
description: 'AI runtime URL (default: $OLLAMA_URL, saved config, or localhost)',
|
|
19
|
+
};
|
|
20
|
+
const dockerOption = {
|
|
21
|
+
flags: '--docker',
|
|
22
|
+
description: 'server/Docker: use remote runtime over HTTP (no local install)',
|
|
23
|
+
};
|
|
24
|
+
program
|
|
25
|
+
.name('oi')
|
|
26
|
+
.description('OpenInference — one command to run open-source AI on your computer')
|
|
27
|
+
.version('0.3.0');
|
|
28
|
+
program
|
|
29
|
+
.command('start', { isDefault: true })
|
|
30
|
+
.description('One command: set up the best model, then chat (default)')
|
|
31
|
+
.option('-m, --model <id>', 'use a specific model tag')
|
|
32
|
+
.option('--choose', 'pick from 5 recommendations instead of auto-select')
|
|
33
|
+
.option('--force', 'run setup again even if already configured')
|
|
34
|
+
.option('--no-chat', 'setup only, do not open chat after')
|
|
35
|
+
.option('--skip-install', 'do not install local runtime if missing')
|
|
36
|
+
.option(dockerOption.flags, dockerOption.description)
|
|
37
|
+
.option(urlOption.flags, urlOption.description)
|
|
38
|
+
.action(async (opts) => {
|
|
39
|
+
try {
|
|
40
|
+
await (0, start_1.runStart)({
|
|
41
|
+
model: opts.model,
|
|
42
|
+
choose: opts.choose,
|
|
43
|
+
force: opts.force,
|
|
44
|
+
chat: opts.chat,
|
|
45
|
+
skipInstall: opts.skipInstall,
|
|
46
|
+
docker: opts.docker,
|
|
47
|
+
ollamaUrl: opts.ollamaUrl,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
fail(e);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
program
|
|
55
|
+
.command('setup')
|
|
56
|
+
.description('Same as oi start (use --choose to pick a model manually)')
|
|
57
|
+
.option('-m, --model <id>', 'use a specific model tag')
|
|
58
|
+
.option('--choose', 'pick from 5 recommendations')
|
|
59
|
+
.option('--skip-install', 'do not install local runtime if missing')
|
|
60
|
+
.option(dockerOption.flags, dockerOption.description)
|
|
61
|
+
.option(urlOption.flags, urlOption.description)
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
try {
|
|
64
|
+
await (0, start_1.runStart)({
|
|
65
|
+
model: opts.model,
|
|
66
|
+
choose: opts.choose,
|
|
67
|
+
chat: false,
|
|
68
|
+
skipInstall: opts.skipInstall,
|
|
69
|
+
docker: opts.docker,
|
|
70
|
+
ollamaUrl: opts.ollamaUrl,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
fail(e);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
program
|
|
78
|
+
.command('recommend')
|
|
79
|
+
.description('Preview model picks without installing')
|
|
80
|
+
.option('-n, --limit <n>', 'number of recommendations', '5')
|
|
81
|
+
.option('--all', 'full catalog, not just verified tags')
|
|
82
|
+
.action((opts) => {
|
|
83
|
+
try {
|
|
84
|
+
const n = Math.min(Math.max(parseInt(opts.limit, 10) || 5, 1), 20);
|
|
85
|
+
(0, recommend_run_1.runRecommend)({ limit: n, all: opts.all });
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
fail(e);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
program
|
|
92
|
+
.command('chat [message]')
|
|
93
|
+
.description('Chat with your local model (no message = interactive)')
|
|
94
|
+
.option('-m, --model <id>', 'override model')
|
|
95
|
+
.option(urlOption.flags, urlOption.description)
|
|
96
|
+
.option('--docker', 'remote runtime; do not start local serve')
|
|
97
|
+
.action(async (message, opts) => {
|
|
98
|
+
try {
|
|
99
|
+
const chatOpts = {
|
|
100
|
+
model: opts.model,
|
|
101
|
+
ollamaUrl: opts.ollamaUrl,
|
|
102
|
+
remote: opts.docker,
|
|
103
|
+
};
|
|
104
|
+
if (!message?.trim()) {
|
|
105
|
+
if (!(0, config_1.loadConfig)() && !opts.model) {
|
|
106
|
+
console.log('\n Not set up yet. Running setup first…\n');
|
|
107
|
+
await (0, start_1.runStart)({ chat: false, ollamaUrl: opts.ollamaUrl, docker: opts.docker });
|
|
108
|
+
}
|
|
109
|
+
await (0, chat_repl_1.runChatRepl)(chatOpts);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const reply = await (0, chat_1.runChat)(message.trim(), chatOpts);
|
|
113
|
+
console.log(`\n${reply}\n`);
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
fail(e);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
program
|
|
120
|
+
.command('models')
|
|
121
|
+
.description('List downloaded models')
|
|
122
|
+
.option(urlOption.flags, urlOption.description)
|
|
123
|
+
.action(async (opts) => {
|
|
124
|
+
try {
|
|
125
|
+
const names = await (0, chat_1.listInstalledModels)(opts.ollamaUrl);
|
|
126
|
+
if (names.length === 0) {
|
|
127
|
+
console.log('\n No models yet. Run: oi\n');
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
console.log('\n Models on this computer:\n');
|
|
131
|
+
names.forEach((n) => console.log(` ${n}`));
|
|
132
|
+
console.log('');
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
fail(e);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
program
|
|
139
|
+
.command('status')
|
|
140
|
+
.description('Show saved setup')
|
|
141
|
+
.action(() => {
|
|
142
|
+
const cfg = (0, config_1.loadConfig)();
|
|
143
|
+
if (!cfg) {
|
|
144
|
+
console.log('\n Not set up yet. Run:\n\n oi\n');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
console.log('\n OpenInference\n');
|
|
148
|
+
console.log(` Model: ${cfg.modelName}`);
|
|
149
|
+
console.log(` Since: ${new Date(cfg.setupAt).toLocaleDateString()}\n`);
|
|
150
|
+
console.log(' Run `oi` to chat again.\n');
|
|
151
|
+
});
|
|
152
|
+
program.parse();
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ollama.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Resolve Ollama API base: CLI flag → OLLAMA_URL env → saved config → localhost. */
|
|
2
|
+
export declare function resolveOllamaUrl(cliUrl?: string): string;
|
|
3
|
+
export declare function isOllamaInstalled(): boolean;
|
|
4
|
+
export declare function pingOllama(baseUrl?: string): Promise<boolean>;
|
|
5
|
+
export declare function installOllama(): void;
|
|
6
|
+
/** Start local `ollama serve` when using host CLI mode. */
|
|
7
|
+
export declare function ensureHostOllamaRunning(baseUrl: string): Promise<void>;
|
|
8
|
+
/** Docker / remote mode — Ollama must already be reachable over HTTP. */
|
|
9
|
+
export declare function ensureRemoteOllama(baseUrl: string): Promise<void>;
|
|
10
|
+
export declare function pullModelHost(modelId: string): Promise<void>;
|
|
11
|
+
/** Pull via Ollama HTTP API (for Docker / VM where `ollama` CLI is not on PATH). */
|
|
12
|
+
export declare function pullModelRemote(baseUrl: string, modelId: string): Promise<void>;
|
|
13
|
+
export declare function verifyModel(baseUrl: string, modelId: string): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +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,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBjF"}
|
package/dist/ollama.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveOllamaUrl = resolveOllamaUrl;
|
|
4
|
+
exports.isOllamaInstalled = isOllamaInstalled;
|
|
5
|
+
exports.pingOllama = pingOllama;
|
|
6
|
+
exports.installOllama = installOllama;
|
|
7
|
+
exports.ensureHostOllamaRunning = ensureHostOllamaRunning;
|
|
8
|
+
exports.ensureRemoteOllama = ensureRemoteOllama;
|
|
9
|
+
exports.pullModelHost = pullModelHost;
|
|
10
|
+
exports.pullModelRemote = pullModelRemote;
|
|
11
|
+
exports.verifyModel = verifyModel;
|
|
12
|
+
const node_child_process_1 = require("node:child_process");
|
|
13
|
+
const config_1 = require("./config");
|
|
14
|
+
const DEFAULT_URL = 'http://127.0.0.1:11434';
|
|
15
|
+
/** Resolve Ollama API base: CLI flag → OLLAMA_URL env → saved config → localhost. */
|
|
16
|
+
function resolveOllamaUrl(cliUrl) {
|
|
17
|
+
const cfg = (0, config_1.loadConfig)();
|
|
18
|
+
return (cliUrl ?? process.env.OLLAMA_URL ?? cfg?.ollamaUrl ?? DEFAULT_URL).replace(/\/$/, '');
|
|
19
|
+
}
|
|
20
|
+
function isOllamaInstalled() {
|
|
21
|
+
const cmd = process.platform === 'win32' ? 'where' : 'which';
|
|
22
|
+
const r = (0, node_child_process_1.spawnSync)(cmd, ['ollama'], { encoding: 'utf8', windowsHide: true });
|
|
23
|
+
return r.status === 0 && Boolean(r.stdout?.trim());
|
|
24
|
+
}
|
|
25
|
+
async function pingOllama(baseUrl) {
|
|
26
|
+
const url = resolveOllamaUrl(baseUrl);
|
|
27
|
+
try {
|
|
28
|
+
const res = await fetch(`${url}/api/tags`, { signal: AbortSignal.timeout(5000) });
|
|
29
|
+
return res.ok;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function installOllama() {
|
|
36
|
+
console.log('\nInstalling Ollama…\n');
|
|
37
|
+
if (process.platform === 'win32') {
|
|
38
|
+
const winget = (0, node_child_process_1.spawnSync)('winget', [
|
|
39
|
+
'install',
|
|
40
|
+
'--id',
|
|
41
|
+
'Ollama.Ollama',
|
|
42
|
+
'-e',
|
|
43
|
+
'--accept-source-agreements',
|
|
44
|
+
'--accept-package-agreements',
|
|
45
|
+
], { stdio: 'inherit', windowsHide: false });
|
|
46
|
+
if (winget.status !== 0) {
|
|
47
|
+
throw new Error('Could not install Ollama automatically. Install from https://ollama.com/download/windows then run `oi setup` again.');
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (process.platform === 'linux') {
|
|
52
|
+
const sh = (0, node_child_process_1.spawnSync)('sh', ['-c', 'curl -fsSL https://ollama.com/install.sh | sh'], {
|
|
53
|
+
stdio: 'inherit',
|
|
54
|
+
});
|
|
55
|
+
if (sh.status !== 0) {
|
|
56
|
+
throw new Error('Could not install Ollama automatically. Run: curl -fsSL https://ollama.com/install.sh | sh');
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
throw new Error('Automatic Ollama install supports Linux and Windows only. Install from https://ollama.com');
|
|
61
|
+
}
|
|
62
|
+
function spawnDetached(command, args) {
|
|
63
|
+
const child = (0, node_child_process_1.spawn)(command, args, {
|
|
64
|
+
detached: true,
|
|
65
|
+
stdio: 'ignore',
|
|
66
|
+
windowsHide: true,
|
|
67
|
+
});
|
|
68
|
+
child.unref();
|
|
69
|
+
}
|
|
70
|
+
/** Start local `ollama serve` when using host CLI mode. */
|
|
71
|
+
async function ensureHostOllamaRunning(baseUrl) {
|
|
72
|
+
if (await pingOllama(baseUrl))
|
|
73
|
+
return;
|
|
74
|
+
console.log('Starting Ollama…');
|
|
75
|
+
if (!isOllamaInstalled()) {
|
|
76
|
+
throw new Error('Ollama is not installed.');
|
|
77
|
+
}
|
|
78
|
+
spawnDetached('ollama', ['serve']);
|
|
79
|
+
const deadline = Date.now() + 45_000;
|
|
80
|
+
while (Date.now() < deadline) {
|
|
81
|
+
if (await pingOllama(baseUrl)) {
|
|
82
|
+
console.log('Ollama is running.\n');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
await sleep(1500);
|
|
86
|
+
}
|
|
87
|
+
if (process.platform === 'win32') {
|
|
88
|
+
throw new Error('Ollama did not start in time. Open the Ollama app from the Start menu, then run `oi setup` again.');
|
|
89
|
+
}
|
|
90
|
+
throw new Error('Ollama did not start in time. Try: ollama serve');
|
|
91
|
+
}
|
|
92
|
+
/** Docker / remote mode — Ollama must already be reachable over HTTP. */
|
|
93
|
+
async function ensureRemoteOllama(baseUrl) {
|
|
94
|
+
if (await pingOllama(baseUrl)) {
|
|
95
|
+
console.log(` Ollama reachable at ${baseUrl}\n`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
throw new Error(`Cannot reach Ollama at ${baseUrl}. Check the URL, Docker network, and that the container is running.`);
|
|
99
|
+
}
|
|
100
|
+
function pullModelHost(modelId) {
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
console.log(`\nPulling ${modelId}… (this may take a few minutes)\n`);
|
|
103
|
+
const child = (0, node_child_process_1.spawn)('ollama', ['pull', modelId], { stdio: 'inherit', windowsHide: false });
|
|
104
|
+
child.on('error', reject);
|
|
105
|
+
child.on('close', (code) => {
|
|
106
|
+
if (code === 0)
|
|
107
|
+
resolve();
|
|
108
|
+
else
|
|
109
|
+
reject(new Error(`ollama pull failed (exit ${code})`));
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/** Pull via Ollama HTTP API (for Docker / VM where `ollama` CLI is not on PATH). */
|
|
114
|
+
async function pullModelRemote(baseUrl, modelId) {
|
|
115
|
+
const url = resolveOllamaUrl(baseUrl);
|
|
116
|
+
console.log(`\nPulling ${modelId} via ${url}… (this may take a few minutes)\n`);
|
|
117
|
+
const res = await fetch(`${url}/api/pull`, {
|
|
118
|
+
method: 'POST',
|
|
119
|
+
headers: { 'content-type': 'application/json' },
|
|
120
|
+
body: JSON.stringify({ name: modelId, stream: true }),
|
|
121
|
+
});
|
|
122
|
+
if (!res.ok || !res.body) {
|
|
123
|
+
const text = await res.text().catch(() => '');
|
|
124
|
+
throw new Error(`Pull failed (${res.status}): ${text || res.statusText}`);
|
|
125
|
+
}
|
|
126
|
+
const reader = res.body.getReader();
|
|
127
|
+
const decoder = new TextDecoder();
|
|
128
|
+
let buffer = '';
|
|
129
|
+
let lastLine = '';
|
|
130
|
+
while (true) {
|
|
131
|
+
const { done, value } = await reader.read();
|
|
132
|
+
if (done)
|
|
133
|
+
break;
|
|
134
|
+
buffer += decoder.decode(value, { stream: true });
|
|
135
|
+
const parts = buffer.split('\n');
|
|
136
|
+
buffer = parts.pop() ?? '';
|
|
137
|
+
for (const line of parts) {
|
|
138
|
+
if (!line.trim())
|
|
139
|
+
continue;
|
|
140
|
+
let ev;
|
|
141
|
+
try {
|
|
142
|
+
ev = JSON.parse(line);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (ev.status === 'downloading' && ev.total && ev.completed != null) {
|
|
148
|
+
const pct = Math.round((ev.completed / ev.total) * 100);
|
|
149
|
+
lastLine = ` downloading ${pct}%`;
|
|
150
|
+
process.stdout.write(`\r${lastLine}`);
|
|
151
|
+
}
|
|
152
|
+
else if (ev.status && ev.status !== lastLine) {
|
|
153
|
+
if (lastLine.startsWith('\r'))
|
|
154
|
+
process.stdout.write('\n');
|
|
155
|
+
lastLine = ev.status;
|
|
156
|
+
const short = ev.status.length > 72 ? ev.status.slice(0, 69) + '…' : ev.status;
|
|
157
|
+
console.log(` ${short}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (lastLine.startsWith('downloading'))
|
|
162
|
+
process.stdout.write('\n');
|
|
163
|
+
console.log('');
|
|
164
|
+
}
|
|
165
|
+
async function verifyModel(baseUrl, modelId) {
|
|
166
|
+
const url = resolveOllamaUrl(baseUrl);
|
|
167
|
+
console.log('Verifying model…');
|
|
168
|
+
const res = await fetch(`${url}/api/generate`, {
|
|
169
|
+
method: 'POST',
|
|
170
|
+
headers: { 'content-type': 'application/json' },
|
|
171
|
+
body: JSON.stringify({
|
|
172
|
+
model: modelId,
|
|
173
|
+
prompt: 'Say OK',
|
|
174
|
+
stream: false,
|
|
175
|
+
options: { num_predict: 8 },
|
|
176
|
+
}),
|
|
177
|
+
signal: AbortSignal.timeout(300_000),
|
|
178
|
+
});
|
|
179
|
+
if (!res.ok) {
|
|
180
|
+
const text = await res.text().catch(() => '');
|
|
181
|
+
throw new Error(`Model verification failed: ${res.status} ${text}`);
|
|
182
|
+
}
|
|
183
|
+
const body = (await res.json());
|
|
184
|
+
console.log(`Smoke test passed${body.response ? `: "${body.response.trim().slice(0, 40)}"` : ''}.\n`);
|
|
185
|
+
}
|
|
186
|
+
function sleep(ms) {
|
|
187
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"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"}
|
package/dist/prompt.d.ts
ADDED
|
@@ -0,0 +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"}
|
package/dist/prompt.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
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.printRecommendations = printRecommendations;
|
|
7
|
+
exports.pickRecommendation = pickRecommendation;
|
|
8
|
+
const node_readline_1 = __importDefault(require("node:readline"));
|
|
9
|
+
const recommend_1 = require("./recommend");
|
|
10
|
+
const TIER_COLOR = {
|
|
11
|
+
perfect: '\x1b[32m',
|
|
12
|
+
good: '\x1b[33m',
|
|
13
|
+
marginal: '\x1b[35m',
|
|
14
|
+
};
|
|
15
|
+
const RESET = '\x1b[0m';
|
|
16
|
+
function printRecommendations(recs) {
|
|
17
|
+
console.log('');
|
|
18
|
+
recs.forEach((r, i) => {
|
|
19
|
+
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}`);
|
|
22
|
+
console.log(` ${r.id}`);
|
|
23
|
+
});
|
|
24
|
+
console.log('');
|
|
25
|
+
}
|
|
26
|
+
async function pickRecommendation(recs) {
|
|
27
|
+
if (recs.length === 0) {
|
|
28
|
+
throw new Error('No models fit this machine. Free up RAM or use a machine with more memory.');
|
|
29
|
+
}
|
|
30
|
+
if (recs.length === 1)
|
|
31
|
+
return recs[0];
|
|
32
|
+
const rl = node_readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
|
|
33
|
+
const answer = await new Promise((resolve) => {
|
|
34
|
+
rl.question(`Pick a model [1-${recs.length}] (default 1): `, resolve);
|
|
35
|
+
});
|
|
36
|
+
rl.close();
|
|
37
|
+
const n = parseInt(answer.trim() || '1', 10);
|
|
38
|
+
if (Number.isNaN(n) || n < 1 || n > recs.length) {
|
|
39
|
+
console.log('Invalid choice — using recommendation #1.');
|
|
40
|
+
return recs[0];
|
|
41
|
+
}
|
|
42
|
+
return recs[n - 1];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Recommendation } from './recommend';
|
|
2
|
+
import { fitTier } from './recommend';
|
|
3
|
+
export type RecommendRunOptions = {
|
|
4
|
+
limit?: number;
|
|
5
|
+
all?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare function runRecommend(opts?: RecommendRunOptions): Recommendation[];
|
|
8
|
+
export { fitTier };
|
|
9
|
+
//# sourceMappingURL=recommend-run.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fitTier = void 0;
|
|
4
|
+
exports.runRecommend = runRecommend;
|
|
5
|
+
const recommend_1 = require("./recommend");
|
|
6
|
+
Object.defineProperty(exports, "fitTier", { enumerable: true, get: function () { return recommend_1.fitTier; } });
|
|
7
|
+
const hardware_1 = require("./hardware");
|
|
8
|
+
const prompt_1 = require("./prompt");
|
|
9
|
+
function runRecommend(opts = {}) {
|
|
10
|
+
const hw = (0, hardware_1.detectHardware)();
|
|
11
|
+
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;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=recommend-run.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type FitTier = 'perfect' | 'good' | 'marginal';
|
|
2
|
+
export type CatalogModel = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
ramGb: number;
|
|
6
|
+
sizeMb: number;
|
|
7
|
+
quality: number;
|
|
8
|
+
useCase: string;
|
|
9
|
+
kind?: 'embed';
|
|
10
|
+
verified?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type Recommendation = CatalogModel & {
|
|
13
|
+
fit: FitTier;
|
|
14
|
+
score: number;
|
|
15
|
+
};
|
|
16
|
+
export declare function loadCatalog(): CatalogModel[];
|
|
17
|
+
export declare function fitTier(needGb: number, budgetGb: number): FitTier | null;
|
|
18
|
+
export declare function fitLabel(fit: FitTier): string;
|
|
19
|
+
export declare function recommendTop(catalog: CatalogModel[], budgetGb: number, limit?: number): Recommendation[];
|
|
20
|
+
//# sourceMappingURL=recommend.d.ts.map
|
|
@@ -0,0 +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"}
|