moderado 0.4.8 → 0.4.18
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/README.md +51 -22
- package/dist/args.d.ts +1 -1
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +7 -0
- package/dist/args.js.map +1 -1
- package/dist/commands/chat.d.ts +4 -2
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +63 -39
- package/dist/commands/chat.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/self_update.d.ts +53 -0
- package/dist/self_update.d.ts.map +1 -0
- package/dist/self_update.js +515 -0
- package/dist/self_update.js.map +1 -0
- package/dist/ui/model_selector.d.ts +1 -0
- package/dist/ui/model_selector.d.ts.map +1 -1
- package/dist/ui/model_selector.js +5 -5
- package/dist/ui/model_selector.js.map +1 -1
- package/dist/ui/popup.d.ts.map +1 -1
- package/dist/ui/popup.js +22 -2
- package/dist/ui/popup.js.map +1 -1
- package/dist/ui/provider_connect.d.ts +26 -2
- package/dist/ui/provider_connect.d.ts.map +1 -1
- package/dist/ui/provider_connect.js +157 -46
- package/dist/ui/provider_connect.js.map +1 -1
- package/dist/ui/welcome.d.ts +0 -2
- package/dist/ui/welcome.d.ts.map +1 -1
- package/dist/ui/welcome.js +2 -25
- package/dist/ui/welcome.js.map +1 -1
- package/dist/vendor/contracts/models.d.ts +4 -0
- package/dist/vendor/contracts/models.d.ts.map +1 -1
- package/dist/vendor/contracts/models.js +2 -0
- package/dist/vendor/contracts/models.js.map +1 -1
- package/dist/vendor/providers/presets.d.ts +1 -1
- package/dist/vendor/providers/presets.d.ts.map +1 -1
- package/dist/vendor/providers/presets.js +3 -5
- package/dist/vendor/providers/presets.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { readFileSync, realpathSync, statSync } from 'node:fs';
|
|
4
|
+
import { chmod, open, rename, unlink } from 'node:fs/promises';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { basename, dirname, join } from 'node:path';
|
|
7
|
+
const RELEASES_URL = 'https://api.github.com/repos/marcuz-apl/moderado/releases?per_page=100';
|
|
8
|
+
const RELEASE_TAG_PATH = '/marcuz-apl/moderado/releases/tag/';
|
|
9
|
+
const MAX_PAGES = 10;
|
|
10
|
+
const MAX_MANIFEST_BYTES = 64 * 1024;
|
|
11
|
+
const MAX_SIDECAR_BYTES = 1024;
|
|
12
|
+
const VERSION = /^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
|
|
13
|
+
export class SelfUpdateError extends Error {
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'SelfUpdateError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async function readLimitedText(response, maxBytes, label, signal) {
|
|
20
|
+
if (!response.body)
|
|
21
|
+
throw new SelfUpdateError(`${label} response has no body`);
|
|
22
|
+
const reader = response.body.getReader();
|
|
23
|
+
const abortReader = () => { void reader.cancel().catch(() => undefined); };
|
|
24
|
+
signal?.addEventListener('abort', abortReader, { once: true });
|
|
25
|
+
const chunks = [];
|
|
26
|
+
let size = 0;
|
|
27
|
+
try {
|
|
28
|
+
while (true) {
|
|
29
|
+
const { done, value } = await reader.read();
|
|
30
|
+
if (signal?.aborted)
|
|
31
|
+
throw new SelfUpdateError(`${label} read cancelled`);
|
|
32
|
+
if (done)
|
|
33
|
+
break;
|
|
34
|
+
size += value.byteLength;
|
|
35
|
+
if (size > maxBytes) {
|
|
36
|
+
await reader.cancel().catch(() => undefined);
|
|
37
|
+
throw new SelfUpdateError(`${label} response exceeds size limit (${maxBytes} bytes)`);
|
|
38
|
+
}
|
|
39
|
+
chunks.push(value);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof SelfUpdateError)
|
|
44
|
+
throw error;
|
|
45
|
+
throw new SelfUpdateError(`Could not read ${label} response: ${error instanceof Error ? error.message : String(error)}`);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
signal?.removeEventListener('abort', abortReader);
|
|
49
|
+
}
|
|
50
|
+
return Buffer.concat(chunks, size).toString('utf8');
|
|
51
|
+
}
|
|
52
|
+
function parseVersion(value) {
|
|
53
|
+
const match = VERSION.exec(value);
|
|
54
|
+
if (!match)
|
|
55
|
+
throw new SelfUpdateError(`Invalid version: ${value}`);
|
|
56
|
+
const [major, minor, patch] = match.slice(1).map(Number);
|
|
57
|
+
if (![major, minor, patch].every(Number.isSafeInteger)) {
|
|
58
|
+
throw new SelfUpdateError(`Invalid version: ${value}`);
|
|
59
|
+
}
|
|
60
|
+
return { major, minor, patch };
|
|
61
|
+
}
|
|
62
|
+
export function parseInstalledVersion(value) {
|
|
63
|
+
const match = /^(v(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*))(?:\+\d{6}[0-9a-zA-Z])?$/.exec(value);
|
|
64
|
+
if (!match)
|
|
65
|
+
throw new SelfUpdateError(`Invalid installed version: ${value}`);
|
|
66
|
+
return parseVersion(match[1]);
|
|
67
|
+
}
|
|
68
|
+
export function parseReleaseMetadata(value) {
|
|
69
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
70
|
+
throw new SelfUpdateError('Invalid GitHub release: expected an object');
|
|
71
|
+
}
|
|
72
|
+
const release = value;
|
|
73
|
+
if (typeof release.draft !== 'boolean' || typeof release.prerelease !== 'boolean') {
|
|
74
|
+
throw new SelfUpdateError('Invalid GitHub release: draft and prerelease must be booleans');
|
|
75
|
+
}
|
|
76
|
+
if (release.draft || release.prerelease)
|
|
77
|
+
return null;
|
|
78
|
+
if (typeof release.tag_name !== 'string' || typeof release.html_url !== 'string') {
|
|
79
|
+
throw new SelfUpdateError('Invalid GitHub release: missing tag or URL');
|
|
80
|
+
}
|
|
81
|
+
const version = parseVersion(release.tag_name);
|
|
82
|
+
let url;
|
|
83
|
+
try {
|
|
84
|
+
url = new URL(release.html_url);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
throw new SelfUpdateError(`Invalid GitHub release URL for ${release.tag_name}`);
|
|
88
|
+
}
|
|
89
|
+
if (url.protocol !== 'https:' || url.hostname !== 'github.com' || url.port || url.username || url.password ||
|
|
90
|
+
url.pathname !== `${RELEASE_TAG_PATH}${release.tag_name}` || url.search || url.hash) {
|
|
91
|
+
throw new SelfUpdateError(`Invalid GitHub release URL for ${release.tag_name}`);
|
|
92
|
+
}
|
|
93
|
+
return { tag_name: release.tag_name, html_url: release.html_url, version };
|
|
94
|
+
}
|
|
95
|
+
function compareVersions(a, b) {
|
|
96
|
+
return a.major - b.major || a.minor - b.minor || a.patch - b.patch;
|
|
97
|
+
}
|
|
98
|
+
export function selectUpdateRelease(releases, installedVersion, mode) {
|
|
99
|
+
const installed = parseInstalledVersion(installedVersion);
|
|
100
|
+
if (mode !== 'update' && mode !== 'upgrade')
|
|
101
|
+
throw new SelfUpdateError(`Invalid update mode: ${String(mode)}`);
|
|
102
|
+
const compatible = releases.filter((release) => mode === 'upgrade' || release.version.major === installed.major);
|
|
103
|
+
if (compatible.length === 0)
|
|
104
|
+
throw new SelfUpdateError('No compatible release available');
|
|
105
|
+
const latest = compatible.reduce((best, release) => compareVersions(release.version, best.version) > 0 ? release : best);
|
|
106
|
+
if (compareVersions(latest.version, installed) <= 0)
|
|
107
|
+
throw new SelfUpdateError('Already current');
|
|
108
|
+
return latest;
|
|
109
|
+
}
|
|
110
|
+
function nextPage(linkHeader, currentPage) {
|
|
111
|
+
if (!linkHeader)
|
|
112
|
+
return null;
|
|
113
|
+
const next = linkHeader.split(',').map((part) => /<([^>]+)>\s*;\s*rel="?next"?(?:\s*;.*)?$/.exec(part.trim()))
|
|
114
|
+
.filter((match) => match !== null);
|
|
115
|
+
if (next.length === 0)
|
|
116
|
+
return null;
|
|
117
|
+
if (next.length !== 1)
|
|
118
|
+
throw new SelfUpdateError('Invalid GitHub pagination link');
|
|
119
|
+
let url;
|
|
120
|
+
try {
|
|
121
|
+
url = new URL(next[0][1]);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
throw new SelfUpdateError('Invalid GitHub pagination link');
|
|
125
|
+
}
|
|
126
|
+
if (url.protocol !== 'https:' || url.hostname !== 'api.github.com' || url.port || url.username || url.password ||
|
|
127
|
+
url.pathname !== '/repos/marcuz-apl/moderado/releases' ||
|
|
128
|
+
url.searchParams.size !== 2 || url.searchParams.getAll('per_page').length !== 1 ||
|
|
129
|
+
url.searchParams.get('per_page') !== '100' || url.searchParams.getAll('page').length !== 1 ||
|
|
130
|
+
url.searchParams.get('page') !== String(currentPage + 1) ||
|
|
131
|
+
url.hash) {
|
|
132
|
+
throw new SelfUpdateError('Invalid GitHub pagination link');
|
|
133
|
+
}
|
|
134
|
+
return url.href;
|
|
135
|
+
}
|
|
136
|
+
export async function fetchPublishedReleases(fetchImpl = fetch, signal) {
|
|
137
|
+
const releases = [];
|
|
138
|
+
const tags = new Set();
|
|
139
|
+
const visited = new Set();
|
|
140
|
+
let url = RELEASES_URL;
|
|
141
|
+
for (let page = 1; url !== null && page <= MAX_PAGES; page++) {
|
|
142
|
+
if (visited.has(url))
|
|
143
|
+
throw new SelfUpdateError('Repeated GitHub pagination link');
|
|
144
|
+
visited.add(url);
|
|
145
|
+
const response = await fetchImpl(url, { signal, headers: { Accept: 'application/vnd.github+json' } });
|
|
146
|
+
if (!response.ok)
|
|
147
|
+
throw new SelfUpdateError(`GitHub releases request failed: HTTP ${response.status}`);
|
|
148
|
+
let payload;
|
|
149
|
+
try {
|
|
150
|
+
payload = await response.json();
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
throw new SelfUpdateError('Invalid GitHub releases JSON');
|
|
154
|
+
}
|
|
155
|
+
if (!Array.isArray(payload))
|
|
156
|
+
throw new SelfUpdateError('Invalid GitHub releases: expected an array');
|
|
157
|
+
for (const item of payload) {
|
|
158
|
+
const release = parseReleaseMetadata(item);
|
|
159
|
+
if (release === null)
|
|
160
|
+
continue;
|
|
161
|
+
if (tags.has(release.tag_name))
|
|
162
|
+
throw new SelfUpdateError(`Duplicate GitHub release tag: ${release.tag_name}`);
|
|
163
|
+
tags.add(release.tag_name);
|
|
164
|
+
releases.push(release);
|
|
165
|
+
}
|
|
166
|
+
url = nextPage(response.headers.get('link'), page);
|
|
167
|
+
if (page === MAX_PAGES && url !== null)
|
|
168
|
+
throw new SelfUpdateError(`GitHub release lookup exceeded ${MAX_PAGES} pages`);
|
|
169
|
+
}
|
|
170
|
+
return releases;
|
|
171
|
+
}
|
|
172
|
+
export function detectInstallChannel(executablePath, platform = process.platform) {
|
|
173
|
+
const unknown = { channel: 'unknown', guidance: 'Update this installation with its original installer or package manager.' };
|
|
174
|
+
if (!executablePath)
|
|
175
|
+
return unknown;
|
|
176
|
+
let resolved;
|
|
177
|
+
try {
|
|
178
|
+
resolved = realpathSync(executablePath);
|
|
179
|
+
if (!statSync(resolved).isFile())
|
|
180
|
+
return unknown;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return unknown;
|
|
184
|
+
}
|
|
185
|
+
const path = resolved.replace(/\\/g, '/');
|
|
186
|
+
const matchPath = platform === 'win32' ? path.toLowerCase() : path;
|
|
187
|
+
if (platform === 'darwin' && /^\/(?:opt\/homebrew|usr\/local)\/Cellar\/moderado\/[^/]+\/bin\/moderado$/.test(matchPath)) {
|
|
188
|
+
return { channel: 'package-manager', manager: 'homebrew', guidance: 'brew upgrade moderado' };
|
|
189
|
+
}
|
|
190
|
+
if (platform === 'win32' && /^(?:[a-z]:\/|\/)[^\n]*\/scoop\/apps\/moderado\/(?:current|[^/]+)\/moderado-win-x64\.exe$/.test(matchPath)) {
|
|
191
|
+
return { channel: 'package-manager', manager: 'scoop', guidance: 'scoop update moderado' };
|
|
192
|
+
}
|
|
193
|
+
const npmLayout = platform === 'win32'
|
|
194
|
+
? /^(.*\/appdata\/roaming\/npm)\/node_modules\/moderado\/dist\/index\.js$/.exec(matchPath)
|
|
195
|
+
: /^(.*)\/lib\/node_modules\/moderado\/dist\/index\.js$/.exec(matchPath);
|
|
196
|
+
if (npmLayout && !matchPath.includes('/_npx/')) {
|
|
197
|
+
try {
|
|
198
|
+
const packageJson = JSON.parse(readFileSync(join(dirname(dirname(resolved)), 'package.json'), 'utf8'));
|
|
199
|
+
const bin = packageJson.bin;
|
|
200
|
+
if (packageJson.name === 'moderado' && bin && typeof bin === 'object' && !Array.isArray(bin) &&
|
|
201
|
+
bin.moderado === './dist/index.js') {
|
|
202
|
+
return { channel: 'npm', prefix: path.slice(0, npmLayout[1].length) || '/' };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return unknown;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (platform !== 'win32' && matchPath === join(homedir(), '.local', 'bin', 'moderado').replace(/\\/g, '/') &&
|
|
210
|
+
resolved === realpathSync(process.execPath)) {
|
|
211
|
+
return { channel: 'standalone' };
|
|
212
|
+
}
|
|
213
|
+
return unknown;
|
|
214
|
+
}
|
|
215
|
+
function verifiedNpmCli(path) {
|
|
216
|
+
let resolved;
|
|
217
|
+
try {
|
|
218
|
+
resolved = realpathSync(path);
|
|
219
|
+
if (!statSync(resolved).isFile() || !resolved.replace(/\\/g, '/').endsWith('/node_modules/npm/bin/npm-cli.js'))
|
|
220
|
+
return null;
|
|
221
|
+
const packageJson = JSON.parse(readFileSync(join(dirname(dirname(resolved)), 'package.json'), 'utf8'));
|
|
222
|
+
const bin = packageJson.bin;
|
|
223
|
+
return packageJson.name === 'npm' && bin && typeof bin === 'object' && !Array.isArray(bin) &&
|
|
224
|
+
bin.npm === 'bin/npm-cli.js' ? resolved : null;
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export function buildNpmUpdateInvocation(version, platform = process.platform, npmExecPath, prefix) {
|
|
231
|
+
const { major, minor, patch } = parseVersion(version);
|
|
232
|
+
if (prefix !== undefined && (!prefix || !/^(?:\/|[a-zA-Z]:[\\/])/.test(prefix) || prefix.includes('\0'))) {
|
|
233
|
+
throw new SelfUpdateError('Cannot update: npm install prefix must be an absolute path');
|
|
234
|
+
}
|
|
235
|
+
const adjacentNpm = join(dirname(process.execPath), 'node_modules', 'npm', 'bin', 'npm-cli.js');
|
|
236
|
+
const posixNpm = join(dirname(process.execPath), '..', 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js');
|
|
237
|
+
const knownNpm = (platform === 'win32' ? [adjacentNpm, posixNpm] : [posixNpm, adjacentNpm])
|
|
238
|
+
.map(verifiedNpmCli).filter((path) => path !== null);
|
|
239
|
+
const requestedNpm = npmExecPath === undefined ? undefined : verifiedNpmCli(npmExecPath);
|
|
240
|
+
const npmCli = npmExecPath === undefined ? knownNpm[0] : knownNpm.find((path) => path === requestedNpm);
|
|
241
|
+
if (!npmCli)
|
|
242
|
+
throw new SelfUpdateError('Cannot locate a verified npm CLI; update manually with npm install -g moderado');
|
|
243
|
+
const args = [npmCli, 'install', '--global', ...(prefix === undefined ? [] : ['--prefix', prefix]), `moderado@${major}.${minor}.${patch}`];
|
|
244
|
+
return { command: process.execPath, args };
|
|
245
|
+
}
|
|
246
|
+
export async function runNpmUpdate(version, platform = process.platform, npmExecPath = process.env.npm_execpath, prefix, signal) {
|
|
247
|
+
if (signal?.aborted)
|
|
248
|
+
throw new SelfUpdateError('npm update cancelled');
|
|
249
|
+
const { command, args } = buildNpmUpdateInvocation(version, platform, npmExecPath, prefix);
|
|
250
|
+
const env = { ...process.env };
|
|
251
|
+
for (const key of Object.keys(env)) {
|
|
252
|
+
if (/(?:_API_KEY|_TOKEN|_SECRET_ACCESS_KEY)$/i.test(key) || /^(?:AWS_ACCESS_KEY_ID|GH_TOKEN)$/i.test(key)) {
|
|
253
|
+
delete env[key];
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return new Promise((resolve, reject) => {
|
|
257
|
+
const child = spawn(command, args, { shell: false, env, windowsHide: true, timeout: 120_000 });
|
|
258
|
+
const abort = () => child.kill();
|
|
259
|
+
let wasAborted = false;
|
|
260
|
+
const onAbort = () => { wasAborted = true; abort(); };
|
|
261
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
262
|
+
const optionsSignalCleanup = () => signal?.removeEventListener('abort', onAbort);
|
|
263
|
+
if (signal?.aborted)
|
|
264
|
+
onAbort();
|
|
265
|
+
let stdout = '';
|
|
266
|
+
let stderr = '';
|
|
267
|
+
let outputExceeded = false;
|
|
268
|
+
child.stdout.setEncoding('utf8');
|
|
269
|
+
child.stderr.setEncoding('utf8');
|
|
270
|
+
child.stdout.on('data', (chunk) => {
|
|
271
|
+
if (stdout.length + chunk.length > 64 * 1024) {
|
|
272
|
+
outputExceeded = true;
|
|
273
|
+
child.kill();
|
|
274
|
+
}
|
|
275
|
+
else
|
|
276
|
+
stdout += chunk;
|
|
277
|
+
});
|
|
278
|
+
child.stderr.on('data', (chunk) => {
|
|
279
|
+
if (stderr.length + chunk.length > 64 * 1024) {
|
|
280
|
+
outputExceeded = true;
|
|
281
|
+
child.kill();
|
|
282
|
+
}
|
|
283
|
+
else
|
|
284
|
+
stderr += chunk;
|
|
285
|
+
});
|
|
286
|
+
child.on('error', (error) => {
|
|
287
|
+
optionsSignalCleanup();
|
|
288
|
+
reject(new SelfUpdateError(`Could not start npm: ${error.message}`));
|
|
289
|
+
});
|
|
290
|
+
child.on('close', (code, exitSignal) => {
|
|
291
|
+
optionsSignalCleanup();
|
|
292
|
+
if (wasAborted)
|
|
293
|
+
reject(new SelfUpdateError('npm update cancelled'));
|
|
294
|
+
else if (outputExceeded)
|
|
295
|
+
reject(new SelfUpdateError('npm update exceeded the output limit'));
|
|
296
|
+
else if (exitSignal)
|
|
297
|
+
reject(new SelfUpdateError(`npm update stopped (${exitSignal})`));
|
|
298
|
+
else if (code === 0)
|
|
299
|
+
resolve({ stdout, stderr });
|
|
300
|
+
else
|
|
301
|
+
reject(new SelfUpdateError(`npm update failed (exit ${code ?? 'unknown'}): ${stderr.trim() || stdout.trim()}`));
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
export async function updateStandalone(options) {
|
|
306
|
+
const { release, executablePath, platform, architecture } = options;
|
|
307
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
308
|
+
const signal = options.signal;
|
|
309
|
+
if (signal?.aborted)
|
|
310
|
+
throw new SelfUpdateError('Standalone update cancelled');
|
|
311
|
+
if (!executablePath || !release || !/^v(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)$/.test(release.tag_name)) {
|
|
312
|
+
throw new SelfUpdateError('Cannot update standalone binary: invalid release or executable path');
|
|
313
|
+
}
|
|
314
|
+
const targets = {
|
|
315
|
+
'win32-x64': { target: 'node22-win-x64', filename: 'moderado-win-x64.exe' },
|
|
316
|
+
'darwin-arm64': { target: 'node22-macos-arm64', filename: 'moderado-macos-arm64' },
|
|
317
|
+
'linux-x64': { target: 'node22-linux-x64', filename: 'moderado-linux-x64' },
|
|
318
|
+
};
|
|
319
|
+
const targetDetails = new Map(Object.entries(targets).map(([hostKey, value]) => {
|
|
320
|
+
const [targetPlatform, targetArchitecture] = hostKey.split('-');
|
|
321
|
+
return [value.target, { ...value, platform: targetPlatform, architecture: targetArchitecture }];
|
|
322
|
+
}));
|
|
323
|
+
const host = targets[`${platform}-${architecture}`];
|
|
324
|
+
if (!host)
|
|
325
|
+
throw new SelfUpdateError(`Unsupported standalone platform: ${platform} ${architecture}`);
|
|
326
|
+
const base = `https://github.com/marcuz-apl/moderado/releases/download/${release.tag_name}`;
|
|
327
|
+
const get = async (url) => {
|
|
328
|
+
let response;
|
|
329
|
+
try {
|
|
330
|
+
response = await fetchImpl(url, { signal });
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
throw new SelfUpdateError(`Standalone update download failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
334
|
+
}
|
|
335
|
+
if (!response.ok)
|
|
336
|
+
throw new SelfUpdateError(`Standalone update download failed: HTTP ${response.status}`);
|
|
337
|
+
return response;
|
|
338
|
+
};
|
|
339
|
+
let manifest;
|
|
340
|
+
try {
|
|
341
|
+
manifest = JSON.parse(await readLimitedText(await get(`${base}/manifest.json`), MAX_MANIFEST_BYTES, 'Standalone manifest', signal));
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
if (error instanceof SelfUpdateError)
|
|
345
|
+
throw error;
|
|
346
|
+
throw new SelfUpdateError('Standalone release manifest is malformed');
|
|
347
|
+
}
|
|
348
|
+
if (!manifest || typeof manifest !== 'object' || Array.isArray(manifest))
|
|
349
|
+
throw new SelfUpdateError('Standalone release manifest is malformed');
|
|
350
|
+
const data = manifest;
|
|
351
|
+
if (data.version !== release.tag_name || !Array.isArray(data.artifacts))
|
|
352
|
+
throw new SelfUpdateError('Standalone release manifest version or artifacts are invalid');
|
|
353
|
+
const seen = new Set();
|
|
354
|
+
let artifact;
|
|
355
|
+
for (const item of data.artifacts) {
|
|
356
|
+
if (!item || typeof item !== 'object' || Array.isArray(item))
|
|
357
|
+
throw new SelfUpdateError('Standalone release manifest contains an invalid artifact');
|
|
358
|
+
const entry = item;
|
|
359
|
+
if (typeof entry.target !== 'string' || seen.has(entry.target))
|
|
360
|
+
throw new SelfUpdateError('Standalone release manifest contains duplicate targets');
|
|
361
|
+
seen.add(entry.target);
|
|
362
|
+
if (typeof entry.filename !== 'string' || basename(entry.filename) !== entry.filename || /[\\/\0]/.test(entry.filename) ||
|
|
363
|
+
typeof entry.platform !== 'string' || typeof entry.architecture !== 'string' ||
|
|
364
|
+
!Number.isSafeInteger(entry.size) || entry.size < 1 ||
|
|
365
|
+
typeof entry.checksum !== 'string' || !/^[a-f0-9]{64}$/.test(entry.checksum) || entry.signed !== false) {
|
|
366
|
+
throw new SelfUpdateError('Standalone release manifest contains an invalid artifact');
|
|
367
|
+
}
|
|
368
|
+
const expected = targetDetails.get(entry.target);
|
|
369
|
+
if (!expected || entry.filename !== expected.filename || entry.platform !== expected.platform || entry.architecture !== expected.architecture) {
|
|
370
|
+
throw new SelfUpdateError('Standalone release manifest contains an unsupported artifact target');
|
|
371
|
+
}
|
|
372
|
+
if (entry.target === host.target && entry.platform === platform && entry.architecture === architecture) {
|
|
373
|
+
artifact = entry;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (!artifact || artifact.filename !== host.filename)
|
|
377
|
+
throw new SelfUpdateError(`Standalone release has no artifact for ${platform} ${architecture}`);
|
|
378
|
+
const [artifactResponse, sidecarResponse] = await Promise.all([
|
|
379
|
+
get(`${base}/${artifact.filename}`), get(`${base}/${artifact.filename}.sha256`),
|
|
380
|
+
]);
|
|
381
|
+
if (signal?.aborted)
|
|
382
|
+
throw new SelfUpdateError('Standalone update cancelled');
|
|
383
|
+
const stagedPath = join(dirname(executablePath), `.${basename(executablePath)}.${randomUUID()}.tmp`);
|
|
384
|
+
let file;
|
|
385
|
+
let operationError;
|
|
386
|
+
let abortReader;
|
|
387
|
+
try {
|
|
388
|
+
if (!artifactResponse.body)
|
|
389
|
+
throw new SelfUpdateError('Standalone artifact response had no body');
|
|
390
|
+
file = await open(stagedPath, 'wx', 0o600);
|
|
391
|
+
const reader = artifactResponse.body.getReader();
|
|
392
|
+
abortReader = () => { void reader.cancel().catch(() => undefined); };
|
|
393
|
+
signal?.addEventListener('abort', abortReader, { once: true });
|
|
394
|
+
const hash = createHash('sha256');
|
|
395
|
+
let size = 0;
|
|
396
|
+
while (true) {
|
|
397
|
+
const { done, value } = await reader.read();
|
|
398
|
+
if (signal?.aborted)
|
|
399
|
+
throw new SelfUpdateError('Standalone update cancelled');
|
|
400
|
+
if (done)
|
|
401
|
+
break;
|
|
402
|
+
size += value.byteLength;
|
|
403
|
+
if (size > artifact.size)
|
|
404
|
+
throw new SelfUpdateError(`Standalone artifact exceeds manifest size for ${artifact.filename}`);
|
|
405
|
+
hash.update(value);
|
|
406
|
+
let offset = 0;
|
|
407
|
+
while (offset < value.byteLength) {
|
|
408
|
+
const { bytesWritten } = await file.write(value, offset, value.byteLength - offset);
|
|
409
|
+
if (bytesWritten === 0)
|
|
410
|
+
throw new SelfUpdateError('Could not write staged standalone artifact');
|
|
411
|
+
offset += bytesWritten;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (size !== artifact.size)
|
|
415
|
+
throw new SelfUpdateError(`Standalone artifact size verification failed for ${artifact.filename}`);
|
|
416
|
+
const [checksum, sidecar] = await Promise.all([
|
|
417
|
+
Promise.resolve(hash.digest('hex')),
|
|
418
|
+
readLimitedText(sidecarResponse, MAX_SIDECAR_BYTES, 'Standalone sidecar', signal),
|
|
419
|
+
]);
|
|
420
|
+
if (sidecar !== `${artifact.checksum} ${artifact.filename}\n` || checksum !== artifact.checksum) {
|
|
421
|
+
throw new SelfUpdateError(`Standalone artifact checksum verification failed for ${artifact.filename}`);
|
|
422
|
+
}
|
|
423
|
+
await file.close();
|
|
424
|
+
file = undefined;
|
|
425
|
+
if (platform !== 'win32')
|
|
426
|
+
await (options.chmodImpl ?? chmod)(stagedPath, 0o755);
|
|
427
|
+
if (signal?.aborted)
|
|
428
|
+
throw new SelfUpdateError('Standalone update cancelled');
|
|
429
|
+
try {
|
|
430
|
+
await (options.renameImpl ?? rename)(stagedPath, executablePath);
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
const detail = platform === 'win32'
|
|
434
|
+
? `Exit Moderado, then download https://github.com/marcuz-apl/moderado/releases/download/${release.tag_name}/${artifact.filename} and use File Explorer to replace this executable. Open a new terminal when done.`
|
|
435
|
+
: 'Check that the executable directory is writable and retry.';
|
|
436
|
+
throw new SelfUpdateError(`Could not replace standalone executable. ${detail} (${error instanceof Error ? error.message : String(error)})`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
const failure = error instanceof SelfUpdateError ? error : new SelfUpdateError(`Standalone artifact download or staging failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
441
|
+
operationError = failure;
|
|
442
|
+
throw failure;
|
|
443
|
+
}
|
|
444
|
+
finally {
|
|
445
|
+
if (abortReader)
|
|
446
|
+
signal?.removeEventListener('abort', abortReader);
|
|
447
|
+
let cleanupError;
|
|
448
|
+
try {
|
|
449
|
+
await file?.close();
|
|
450
|
+
}
|
|
451
|
+
catch (error) {
|
|
452
|
+
cleanupError = error;
|
|
453
|
+
}
|
|
454
|
+
try {
|
|
455
|
+
await unlink(stagedPath);
|
|
456
|
+
}
|
|
457
|
+
catch (error) {
|
|
458
|
+
if (error.code !== 'ENOENT')
|
|
459
|
+
cleanupError ??= error;
|
|
460
|
+
}
|
|
461
|
+
if (operationError === undefined && cleanupError !== undefined) {
|
|
462
|
+
throw new SelfUpdateError(`Could not clean up staged standalone artifact: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
export async function handleSelfUpdateCommand(mode, installedVersion, signal) {
|
|
467
|
+
const write = (message) => process.stdout.write(`${message}\n`);
|
|
468
|
+
try {
|
|
469
|
+
if (signal.aborted)
|
|
470
|
+
throw new SelfUpdateError('Update cancelled. Run the command again when ready.');
|
|
471
|
+
const releases = await fetchPublishedReleases(fetch, signal);
|
|
472
|
+
let release;
|
|
473
|
+
try {
|
|
474
|
+
release = selectUpdateRelease(releases, installedVersion, mode);
|
|
475
|
+
}
|
|
476
|
+
catch (error) {
|
|
477
|
+
if (error instanceof SelfUpdateError && error.message === 'Already current') {
|
|
478
|
+
const installed = parseInstalledVersion(installedVersion);
|
|
479
|
+
const targetVersion = `v${installed.major}.${installed.minor}.${installed.patch}`;
|
|
480
|
+
write(`Installed version: ${installedVersion}`);
|
|
481
|
+
write(`Target version: ${targetVersion}`);
|
|
482
|
+
write('Already current.');
|
|
483
|
+
return 0;
|
|
484
|
+
}
|
|
485
|
+
throw error;
|
|
486
|
+
}
|
|
487
|
+
write(`Installed version: ${installedVersion}`);
|
|
488
|
+
write(`Target version: ${release.tag_name}`);
|
|
489
|
+
const channel = detectInstallChannel(process.argv[1]);
|
|
490
|
+
if (channel.channel === 'package-manager') {
|
|
491
|
+
write(`Update with your package manager: ${channel.guidance}`);
|
|
492
|
+
return 1;
|
|
493
|
+
}
|
|
494
|
+
if (channel.channel === 'unknown') {
|
|
495
|
+
throw new SelfUpdateError(`Cannot safely identify this installation. ${channel.guidance}`);
|
|
496
|
+
}
|
|
497
|
+
if (signal.aborted)
|
|
498
|
+
throw new SelfUpdateError('Update cancelled. Run the command again when ready.');
|
|
499
|
+
if (channel.channel === 'npm') {
|
|
500
|
+
await runNpmUpdate(release.tag_name, process.platform, process.env.npm_execpath, channel.prefix, signal);
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
await updateStandalone({
|
|
504
|
+
release, executablePath: process.argv[1] ?? '', platform: process.platform, architecture: process.arch, signal,
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
write(`Updated successfully to ${release.tag_name}. Restart Moderado to use the new version.`);
|
|
508
|
+
return 0;
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
process.stderr.write(`Update failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
512
|
+
return 1;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
//# sourceMappingURL=self_update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self_update.js","sourceRoot":"","sources":["../src/self_update.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,7 @@ export interface CompatibleModelSelectorOptions {
|
|
|
32
32
|
export interface CompatibleModelEntry {
|
|
33
33
|
id: string;
|
|
34
34
|
pricing?: Record<string, string>;
|
|
35
|
+
access?: 'free' | 'paid';
|
|
35
36
|
}
|
|
36
37
|
export declare function buildModelConnectionRequiredItems(): PopupListItem[];
|
|
37
38
|
export declare function showModelConnectionRequired(drawFrame: (popupLines: string[]) => void, signal?: AbortSignal): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model_selector.d.ts","sourceRoot":"","sources":["../../src/ui/model_selector.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAA6D,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIlH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"model_selector.d.ts","sourceRoot":"","sources":["../../src/ui/model_selector.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAA6D,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIlH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAID,wBAAgB,iCAAiC,IAAI,aAAa,EAAE,CAanE;AAED,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,EACzC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,oBAAoB,EAAE,EAC9B,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,kBAAkB,EAC/B,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GACrH,aAAa,EAAE,CA0DjB;AAwBD,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA+C7B;AAsCD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GACjF,aAAa,EAAE,CAmBjB;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAY/B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CAG/B"}
|
|
@@ -11,7 +11,7 @@ export function buildModelConnectionRequiredItems() {
|
|
|
11
11
|
{
|
|
12
12
|
label: 'Connect a provider first',
|
|
13
13
|
value: 'login',
|
|
14
|
-
description: 'Use /
|
|
14
|
+
description: 'Use /connect to choose a provider, including the Gateway.',
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
label: 'Close Window',
|
|
@@ -85,7 +85,7 @@ export function buildCompatibleModelMenuItems(providerName, models, currentModel
|
|
|
85
85
|
items.push({
|
|
86
86
|
label: 'Cancel & Close Window',
|
|
87
87
|
value: 'cancel',
|
|
88
|
-
description: '
|
|
88
|
+
description: 'Keep the current model selection.',
|
|
89
89
|
});
|
|
90
90
|
return items;
|
|
91
91
|
}
|
|
@@ -101,9 +101,9 @@ function compatibleModelPopupItem(model, providerName, policy) {
|
|
|
101
101
|
return {
|
|
102
102
|
label: model.id,
|
|
103
103
|
value: model.id,
|
|
104
|
-
tag: isFree ? 'Free' : 'Price unknown',
|
|
104
|
+
tag: isFree ? 'Free' : model.access === 'paid' ? 'Paid' : 'Price unknown',
|
|
105
105
|
description: isFree
|
|
106
|
-
? `${providerName} free model`
|
|
106
|
+
? model.access === 'free' && providerName === 'Moderado Cloud' ? `${providerName} free model · website API key required` : `${providerName} free model`
|
|
107
107
|
: price
|
|
108
108
|
? `${providerName} model · input $${Number(price) * 1_000_000}/M tokens`
|
|
109
109
|
: `${providerName} model · pricing unavailable`,
|
|
@@ -120,7 +120,7 @@ export async function selectCompatibleModelOverlay(options) {
|
|
|
120
120
|
layerPromptBox(drawFrame, `\x1b[36mQuerying ${providerName} model catalog...\x1b[0m`);
|
|
121
121
|
const provider = new NvidiaAdapter({ apiKey, baseUrl, providerId, providerName });
|
|
122
122
|
models = (await provider.discoverModels(signal))
|
|
123
|
-
.map((model) => ({ id: model.id, pricing: model.pricing }))
|
|
123
|
+
.map((model) => ({ id: model.id, pricing: model.pricing, access: model.access }))
|
|
124
124
|
.sort((a, b) => a.id.localeCompare(b.id));
|
|
125
125
|
}
|
|
126
126
|
catch (error) {
|