From 35481e452db92fa497f4b4167c65ee5a91536ffa Mon Sep 17 00:00:00 2001 From: ekko Date: Sat, 18 Apr 2026 09:34:59 +0800 Subject: [PATCH] fix: use dynamic import for node:sqlite with Node version guard Replace static top-level import with runtime version check and dynamic import() so Node < 22.5 gracefully falls back to CLI path instead of crashing at module load time. Co-Authored-By: Claude Opus 4.6 --- packages/server/src/services/hermes/sessions-db.ts | 11 ++++++++++- tests/server/sessions-db.test.ts | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/server/src/services/hermes/sessions-db.ts b/packages/server/src/services/hermes/sessions-db.ts index 0367fcc..1291d64 100644 --- a/packages/server/src/services/hermes/sessions-db.ts +++ b/packages/server/src/services/hermes/sessions-db.ts @@ -1,6 +1,10 @@ -import { DatabaseSync } from 'node:sqlite' import { getActiveProfileDir } from './hermes-profile' +const SQLITE_AVAILABLE = (() => { + const [major, minor] = process.versions.node.split('.').map(Number) + return major > 22 || (major === 22 && minor >= 5) +})() + export interface HermesSessionRow { id: string source: string @@ -115,6 +119,11 @@ const BASE_SELECT = ` ` export async function listSessionSummaries(source?: string, limit = 2000): Promise { + if (!SQLITE_AVAILABLE) { + throw new Error(`node:sqlite requires Node >= 22.5, current: ${process.versions.node}`) + } + + const { DatabaseSync } = await import('node:sqlite') const db = new DatabaseSync(sessionDbPath(), { open: true, readOnly: true }) try { diff --git a/tests/server/sessions-db.test.ts b/tests/server/sessions-db.test.ts index 22efa3a..c0f0256 100644 --- a/tests/server/sessions-db.test.ts +++ b/tests/server/sessions-db.test.ts @@ -6,7 +6,7 @@ const closeMock = vi.fn() const databaseSyncMock = vi.fn(() => ({ prepare: prepareMock, close: closeMock })) const getActiveProfileDirMock = vi.fn(() => '/tmp/hermes-profile') -vi.mock('node:sqlite', () => ({ +vi.doMock('node:sqlite', () => ({ DatabaseSync: databaseSyncMock, }))