@xingjisoft/neutrino 0.5.1 → 0.5.2

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/web/settings.js CHANGED
@@ -2,13 +2,14 @@
2
2
  // are returned to this controller or kept in browser storage.
3
3
  import { t, getLanguage } from "./i18n.js";
4
4
 
5
- export function createSettingsUI({ apiFetch, applyModel, onLanguageChange, proMode = false, onCatalogChange }) {
5
+ export function createSettingsUI({ apiFetch, applyModel, onLanguageChange, onUpdateFound, proMode = false, onCatalogChange }) {
6
6
  const ids = ["model-picker", "model-picker-summary", "model-picker-label", "model-provider", "model-name", "model-intensity",
7
7
  "model-intensity-label", "model-intensity-slider", "model-intensity-stops", "model-intensity-ticks", "model-feedback",
8
8
  "settings-open", "settings-dialog", "settings-form", "settings-close", "settings-cancel", "settings-save", "settings-feedback",
9
9
  "default-provider", "default-model", "default-intensity", "settings-context", "settings-compress-note", "settings-reviewer",
10
10
  "settings-extreme", "settings-sound", "settings-password", "settings-password-confirm",
11
11
  "settings-language", "settings-plan", "settings-approval", "settings-web-console", "settings-web-lan", "settings-background",
12
+ "settings-check-update", "settings-update-feedback",
12
13
  "settings-pro", "settings-pro-preset", "settings-pro-depth"];
13
14
  const el = Object.fromEntries(ids.map(id => [id, document.getElementById(id)]));
14
15
  let config = null;
@@ -348,6 +349,33 @@ export function createSettingsUI({ apiFetch, applyModel, onLanguageChange, proMo
348
349
  }
349
350
  });
350
351
 
352
+ /** Ask the server to compare this install with npm right now. */
353
+ el["settings-check-update"].addEventListener("click", async () => {
354
+ const button = el["settings-check-update"];
355
+ if (button.disabled) return;
356
+ button.disabled = true;
357
+ message(el["settings-update-feedback"], t("Checking for updates…"));
358
+ try {
359
+ const update = await json("/api/update/check", {});
360
+ if (update.error) {
361
+ message(el["settings-update-feedback"], t("Update check failed: {error}", { error: update.error }), true);
362
+ } else if (update.has_update) {
363
+ message(el["settings-update-feedback"], t("Version {latest} is available. This install runs {current}.", {
364
+ current: update.current_version, latest: update.latest_version,
365
+ }));
366
+ // Installing runs npm on this machine, so the offer and its progress
367
+ // belong to the console's dialog, not to this form.
368
+ onUpdateFound?.(update);
369
+ } else {
370
+ message(el["settings-update-feedback"], t("Neutrino {version} is up to date.", { version: update.current_version }));
371
+ }
372
+ } catch (error) {
373
+ message(el["settings-update-feedback"], t("Update check failed: {error}", { error: error.message }), true);
374
+ } finally {
375
+ button.disabled = false;
376
+ }
377
+ });
378
+
351
379
  function renderContextWindow() {
352
380
  const provider = config.providers.find(entry => entry.name === el["default-provider"].value);
353
381
  const model = provider?.models.find(entry => entry.name === el["default-model"].value);
@@ -392,6 +420,8 @@ export function createSettingsUI({ apiFetch, applyModel, onLanguageChange, proMo
392
420
  el["settings-open"].addEventListener("click", async () => {
393
421
  if (!el["settings-dialog"].open) el["settings-dialog"].showModal();
394
422
  el["settings-save"].disabled = true;
423
+ // The last check belongs to an earlier visit; do not present it as current.
424
+ message(el["settings-update-feedback"], "");
395
425
  message(el["settings-feedback"], t("Loading…"));
396
426
  try {
397
427
  await load();