@euraika-labs/pan-ui 0.5.0 → 0.5.1

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@euraika-labs/pan-ui",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Beautiful WebUI for Hermes Agent — chat, skills, plugins, memory, profiles, and runtime diagnostics in one workspace.",
5
5
  "keywords": [
6
6
  "hermes",
package/README.md CHANGED
@@ -225,6 +225,27 @@ npm run dev
225
225
  | `npm run test` | Vitest unit tests |
226
226
  | `npm run test:e2e` | Playwright end-to-end tests |
227
227
 
228
+ ## Recent Changes
229
+
230
+ ### [0.5.1] — 2026-04-08
231
+ - **Fixed** fork session crash (missing `)` in Python bridge)
232
+ - **Changed** health probe decoupled from binary — Docker and headless deployments report full health status
233
+ - **Added** Docker test image with bundled Hermes Agent, Docker test suites (37 + 28 assertions), full-stack functional test (33 assertions), `.dockerignore`
234
+
235
+ ### [0.5.0] — 2026-04-08
236
+ - **Added** vendored Hermes fork (`hermes.version.json`), auto-install wizard, `sync-hermes` / `update` / `version` CLI commands, update banner
237
+ - **Changed** CLI refactored to subcommand structure, profile detection hardened
238
+
239
+ ### [0.4.0] — 2026-04-07
240
+ - **Added** automatic gateway management — Pan auto-starts and monitors the Hermes gateway on boot
241
+ - **Changed** simplified to single-process deployment (no separate gateway service needed)
242
+
243
+ ### [0.3.0] — 2026-04-07
244
+ - **Added** session source badges (CLI, Discord, Telegram, WhatsApp, …), source filter chips, resume button for external sessions
245
+ - **Fixed** skills Discover tab showing 0 skills, hydration mismatch
246
+
247
+ [Full changelog →](CHANGELOG.md)
248
+
228
249
  ## Security
229
250
 
230
251
  See [SECURITY.md](SECURITY.md) for reporting vulnerabilities.
package/bin/pan-ui.mjs CHANGED
@@ -80,7 +80,6 @@ const HERMES_FORK_REPO = HERMES_VERSION_CONFIG?.repo || 'https://github.com/Eura
80
80
  const HERMES_PINNED_TAG = HERMES_VERSION_CONFIG?.tag || 'main';
81
81
  const HERMES_PINNED_VERSION = HERMES_VERSION_CONFIG?.version || null;
82
82
  const HERMES_MIN_VERSION = HERMES_VERSION_CONFIG?.minVersion || '0.7.0';
83
- const HERMES_MAX_VERSION = HERMES_VERSION_CONFIG?.maxVersion || null;
84
83
  // Fallback to upstream install script for manual instructions
85
84
  const HERMES_INSTALL_URL = 'https://raw.githubusercontent.com/Euraika-Labs/hermes-agent/main/scripts/install.sh';
86
85
 
@@ -109,30 +108,24 @@ function parseHermesVersion(str) {
109
108
 
110
109
  /**
111
110
  * Check if the installed hermes version is compatible with Pan's requirements.
112
- * Uses the existing compareVersions(string, string) for semver comparison.
113
- * Returns { compatible, installed, required, message }.
111
+ * - Below minVersion: incompatible (needs upgrade)
112
+ * - At or above minVersion: compatible (newer versions are fine)
113
+ * Returns { compatible, installed, required, needsUpgrade, message }.
114
114
  */
115
115
  function checkHermesCompatibility(versionString) {
116
116
  const installed = parseHermesVersion(versionString);
117
- if (!installed) return { compatible: true, installed: null, message: null }; // can't check, assume ok
117
+ if (!installed) return { compatible: true, installed: null, needsUpgrade: false, message: null }; // can't check, assume ok
118
118
 
119
119
  if (HERMES_MIN_VERSION && compareVersions(installed, HERMES_MIN_VERSION) < 0) {
120
120
  return {
121
121
  compatible: false,
122
122
  installed,
123
123
  required: `>=${HERMES_MIN_VERSION}`,
124
+ needsUpgrade: true,
124
125
  message: `Hermes ${installed} is too old. Pan requires >=${HERMES_MIN_VERSION}.`
125
126
  };
126
127
  }
127
- if (HERMES_MAX_VERSION && compareVersions(installed, HERMES_MAX_VERSION) >= 0) {
128
- return {
129
- compatible: false,
130
- installed,
131
- required: `<${HERMES_MAX_VERSION}`,
132
- message: `Hermes ${installed} is too new (untested). Pan is tested with <${HERMES_MAX_VERSION}.`
133
- };
134
- }
135
- return { compatible: true, installed, message: null };
128
+ return { compatible: true, installed, needsUpgrade: false, message: null };
136
129
  }
137
130
 
138
131
  function detectHermesHome() {
@@ -327,14 +320,20 @@ async function syncHermes(force = false) {
327
320
  const hermesBin = detectHermesBinary();
328
321
  if (hermesBin && !force) {
329
322
  const version = detectHermesVersion(hermesBin);
330
- const compat = checkHermesCompatibility(version);
331
- if (compat.compatible && compat.installed === HERMES_PINNED_VERSION) {
332
- console.log(` ${green('✓')} Already on the pinned version (${compat.installed})`);
333
- console.log(` ${dim('Use --force to reinstall anyway')}`);
334
- return;
335
- }
336
- if (compat.installed) {
337
- console.log(` ${dim('Current:')} ${yellow(compat.installed)} → ${green(HERMES_PINNED_VERSION)}`);
323
+ const parsed = parseHermesVersion(version);
324
+ if (parsed) {
325
+ if (parsed === HERMES_PINNED_VERSION) {
326
+ console.log(` ${green('✓')} Already on the pinned version (${parsed})`);
327
+ console.log(` ${dim('Use --force to reinstall anyway')}`);
328
+ return;
329
+ }
330
+ if (compareVersions(parsed, HERMES_PINNED_VERSION) > 0) {
331
+ console.log(` ${green('✓')} Installed version (${parsed}) is newer than pinned (${HERMES_PINNED_VERSION}) — nothing to do`);
332
+ console.log(` ${dim('Use --force to downgrade to the pinned version')}`);
333
+ return;
334
+ }
335
+ // Older than pinned — will upgrade
336
+ console.log(` ${dim('Current:')} ${yellow(parsed)} → ${green(HERMES_PINNED_VERSION)}`);
338
337
  }
339
338
  }
340
339
 
@@ -674,10 +673,23 @@ async function setup(forceWizard = false) {
674
673
 
675
674
  // Check version compatibility with Pan's pinned range
676
675
  const compat = checkHermesCompatibility(version);
677
- if (!compat.compatible) {
676
+ if (!compat.compatible && compat.needsUpgrade) {
678
677
  console.log(` ${yellow('⚠')} ${compat.message}`);
679
- console.log(` ${dim(`Pan is tested with Hermes ${HERMES_PINNED_VERSION} (${HERMES_FORK_REPO} @ ${HERMES_PINNED_TAG})`)}`);
680
- console.log(` ${dim('Run:')} ${cyan('pan-ui sync-hermes')} ${dim('to install the compatible version')}`);
678
+ console.log(` ${dim(`Pan is tested with Hermes >=${HERMES_MIN_VERSION} (${HERMES_FORK_REPO} @ ${HERMES_PINNED_TAG})`)}`);
679
+ console.log('');
680
+ const doUpgrade = (await ask(` ${bold('Upgrade Hermes Agent now? [Y/n]:')} `)).trim().toLowerCase();
681
+
682
+ if (doUpgrade === '' || doUpgrade === 'y' || doUpgrade === 'yes') {
683
+ await syncHermes(true);
684
+ // Re-detect after upgrade
685
+ hermesBin = detectHermesBinary();
686
+ if (hermesBin) {
687
+ const newVersion = detectHermesVersion(hermesBin);
688
+ console.log(` ${green('✓')} Hermes upgraded: ${cyan(hermesBin)}${newVersion ? ` (${newVersion})` : ''}`);
689
+ }
690
+ } else {
691
+ console.log(` ${dim('Skipped. Some features may not work correctly with an older Hermes version.')}`);
692
+ }
681
693
  }
682
694
  } else {
683
695
  console.log(` ${yellow('!')} Hermes Agent not found in PATH`);
@@ -7,7 +7,6 @@
7
7
  "repo": "https://github.com/Euraika-Labs/hermes-agent.git",
8
8
  "upstream": "https://github.com/NousResearch/hermes-agent.git",
9
9
  "minVersion": "0.7.0",
10
- "maxVersion": "0.8.0",
11
10
  "pinnedAt": "2026-04-07T21:45:00Z",
12
11
  "upstreamSha": "ca0459d109b9d23ce2b3c4c4cb6e8547a7eada3c"
13
12
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@euraika-labs/pan-ui",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Beautiful WebUI for Hermes Agent — chat, skills, plugins, memory, profiles, and runtime diagnostics in one workspace.",
5
5
  "keywords": [
6
6
  "hermes",