kingkont 0.7.1 → 0.7.3

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 (3) hide show
  1. package/main.js +35 -0
  2. package/package.json +1 -1
  3. package/preload.js +9 -1
package/main.js CHANGED
@@ -409,6 +409,41 @@ ipcMain.handle('updates:check', async () => {
409
409
  return { current, latest, isNew: isNewerVersion(current, latest) };
410
410
  });
411
411
 
412
+ // In-place install: запускаем `npm i -g kingkont@<version>` дочерним
413
+ // процессом через login shell (чтобы поймать PATH из ~/.zshrc — на macOS
414
+ // Electron, открытый из Finder, не видит Homebrew-путей).
415
+ //
416
+ // Streamим stdout/stderr в renderer через 'updates:install-output' events.
417
+ // На EACCES (нет прав на global install) renderer покажет команду для
418
+ // ручного запуска с sudo. spawn уже импортирован в начале файла.
419
+ ipcMain.handle('updates:install', async (e, target = 'latest') => {
420
+ return new Promise((resolve, reject) => {
421
+ const shell = process.env.SHELL || '/bin/bash';
422
+ const cmd = `npm i -g kingkont@${target}`;
423
+ const proc = spawn(shell, ['-lc', cmd]);
424
+ let stderr = '';
425
+ proc.stdout.on('data', d => {
426
+ const text = d.toString();
427
+ try { e.sender.send('updates:install-output', { stream: 'stdout', text }); } catch {}
428
+ });
429
+ proc.stderr.on('data', d => {
430
+ const text = d.toString();
431
+ stderr += text;
432
+ try { e.sender.send('updates:install-output', { stream: 'stderr', text }); } catch {}
433
+ });
434
+ proc.on('close', code => {
435
+ if (code === 0) resolve({ ok: true });
436
+ else reject(new Error(`npm exit ${code}. ${stderr.slice(-400) || '(нет деталей)'}`));
437
+ });
438
+ proc.on('error', err => reject(err));
439
+ });
440
+ });
441
+
442
+ ipcMain.handle('app:relaunch', () => {
443
+ app.relaunch();
444
+ app.exit(0);
445
+ });
446
+
412
447
  // Фоновая проверка при старте: если есть свежая — открываем окно автоматом.
413
448
  // Чтобы не доставать юзера до открытия проекта, ждём 5 сек после createWindow.
414
449
  async function backgroundCheckUpdates() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kingkont",
3
- "version": "0.7.1",
3
+ "version": "0.7.3",
4
4
  "description": "KingKont · Chatium — нод-редактор сцен с AI-генерацией (картинки/видео/голос/SFX/музыка/текст)",
5
5
  "main": "main.js",
6
6
  "bin": {
package/preload.js CHANGED
@@ -48,10 +48,18 @@ contextBridge.exposeInMainWorld('appSettings', {
48
48
  openSettingsWindow: () => ipcRenderer.invoke('settings-window:open'),
49
49
  });
50
50
 
51
- // Проверка обновлений через npm registry (в main-процессе).
51
+ // Проверка/установка обновлений через npm registry (в main-процессе).
52
52
  contextBridge.exposeInMainWorld('appUpdates', {
53
53
  check: () => ipcRenderer.invoke('updates:check'),
54
+ install: (version) => ipcRenderer.invoke('updates:install', version),
55
+ relaunch: () => ipcRenderer.invoke('app:relaunch'),
54
56
  closeWindow: () => ipcRenderer.invoke('updates-window:close'),
57
+ // Стрим stdout/stderr во время install. Возвращает unsubscribe.
58
+ onInstallOutput: (cb) => {
59
+ const handler = (_e, data) => cb(data);
60
+ ipcRenderer.on('updates:install-output', handler);
61
+ return () => ipcRenderer.removeListener('updates:install-output', handler);
62
+ },
55
63
  });
56
64
 
57
65
  // Авторизация в Chatium через loopback OAuth-flow.