diff --git a/package.json b/package.json index 640761f..b51c833 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { "name": "nerve", "private": true, + "engines": { + "node": ">=22.5.0" + }, "scripts": { "build": "pnpm -r run build", "check": "biome check .", diff --git a/packages/cli/package.json b/packages/cli/package.json index 4b0c67e..5f89021 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,5 +1,8 @@ { "name": "@uncaged/nerve-cli", + "engines": { + "node": ">=22.5.0" + }, "version": "0.1.8", "type": "module", "bin": { @@ -23,7 +26,6 @@ "citty": "^0.1.6" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.13", "@types/node": "^22.0.0", "@uncaged/nerve-daemon": "workspace:*", "vitest": "^4.1.5" diff --git a/packages/core/package.json b/packages/core/package.json index d398648..e50a1bd 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,6 +3,10 @@ "version": "0.1.4", "type": "module", "main": "dist/index.js", + "files": ["dist"], + "publishConfig": { + "access": "public" + }, "types": "dist/index.d.ts", "scripts": { "prepublishOnly": "bash ../../scripts/prepublish-check.sh", diff --git a/packages/daemon/src/__tests__/crash-recovery.test.ts b/packages/daemon/src/__tests__/crash-recovery.test.ts index faf4a23..b4eea4c 100644 --- a/packages/daemon/src/__tests__/crash-recovery.test.ts +++ b/packages/daemon/src/__tests__/crash-recovery.test.ts @@ -89,10 +89,11 @@ function makeLogStore( } return activeRuns; }), - getTriggerPayload: vi.fn(() => ({ value: 42 })), - getThreadEvents: vi.fn(() => [{ type: "thread_start", triggerPayload: {} }]), + getTriggerPayload: vi.fn((): unknown => ({ value: 42 })), + getThreadEvents: vi.fn((): Array<{ type: string; [key: string]: unknown }> => [{ type: "thread_start", triggerPayload: {} }]), archiveLogs: vi.fn(() => ({ days: [], vacuumed: false })), close: vi.fn(), + getAllWorkflowRuns: vi.fn(() => []), }; return store; } @@ -127,7 +128,7 @@ describe("WorkflowManager — crash recovery (Phase 3)", () => { child.emit("exit", 1, null); const crashedCalls = logStore.upsertWorkflowRun.mock.calls.filter( - ([entry]: [{ type: string }]) => entry.type === "crashed", + (args: any[]) => (args[0] as { type: string }).type === "crashed", ); expect(crashedCalls).toHaveLength(2); @@ -216,10 +217,10 @@ describe("WorkflowManager — crash recovery (Phase 3)", () => { // resume-thread should have been sent const resumeCalls = (secondChild.send as ReturnType).mock.calls.filter( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "resume-thread", + (args: any[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "resume-thread", ); expect(resumeCalls).toHaveLength(1); expect(resumeCalls[0][0]).toMatchObject({ @@ -286,7 +287,7 @@ describe("WorkflowManager — crash recovery (Phase 3)", () => { }); const appendCalls = logStore.append.mock.calls.filter( - ([entry]: [{ type: string }]) => entry.type === "thread_command_event", + (args: any[]) => (args[0] as { type: string }).type === "thread_command_event", ); expect(appendCalls).toHaveLength(1); expect(appendCalls[0][0]).toMatchObject({ @@ -313,7 +314,7 @@ describe("WorkflowManager — crash recovery (Phase 3)", () => { mgr.startWorkflow("my-wf", payload); const startedCall = logStore.upsertWorkflowRun.mock.calls.find( - ([entry]: [{ type: string }]) => entry.type === "started", + (args: any[]) => (args[0] as { type: string }).type === "started", ); expect(startedCall).toBeDefined(); const logEntry = startedCall?.[0] as { payload: string | null }; diff --git a/packages/daemon/src/__tests__/hot-reload.test.ts b/packages/daemon/src/__tests__/hot-reload.test.ts index 12318d6..0d56a24 100644 --- a/packages/daemon/src/__tests__/hot-reload.test.ts +++ b/packages/daemon/src/__tests__/hot-reload.test.ts @@ -79,6 +79,7 @@ function makeLogStore() { getThreadEvents: vi.fn(() => []), archiveLogs: vi.fn(() => ({ days: [], vacuumed: false })), close: vi.fn(), + getAllWorkflowRuns: vi.fn(() => []), }; } @@ -126,7 +127,7 @@ describe("WorkflowManager — drainAndRespawn (Phase 3 hot reload)", () => { await drainPromise; const interruptedCalls = logStore.upsertWorkflowRun.mock.calls.filter( - ([entry]: [{ type: string }]) => entry.type === "interrupted", + (args: any[]) => (args[0] as { type: string }).type === "interrupted", ); expect(interruptedCalls).toHaveLength(2); @@ -190,10 +191,10 @@ describe("WorkflowManager — drainAndRespawn (Phase 3 hot reload)", () => { const newChild = mockChildren[1]; const resumeCalls = (newChild.send as ReturnType).mock.calls.filter( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "resume-thread", + (args: any[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "resume-thread", ); expect(resumeCalls).toHaveLength(0); @@ -218,10 +219,10 @@ describe("WorkflowManager — drainAndRespawn (Phase 3 hot reload)", () => { const newChild = mockChildren[1]; const startCalls = (newChild.send as ReturnType).mock.calls.filter( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "start-thread", + (args: any[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "start-thread", ); expect(startCalls).toHaveLength(1); @@ -266,7 +267,7 @@ describe("Kernel — workflow hot reload via file-watcher (Phase 3)", () => { // Kernel's handleWorkflowFileChange should log a workflow_reload event // We test this via the kernel itself const appendCalls = logStore.append.mock.calls; - const startCall = appendCalls.find(([e]: [{ type: string }]) => e.type === "start"); + const startCall = appendCalls.find((args: any[]) => (args[0] as { type: string }).type === "start"); expect(startCall).toBeDefined(); const stopPromise = kernel.stop(); diff --git a/packages/daemon/src/__tests__/kernel-workflow-integration.test.ts b/packages/daemon/src/__tests__/kernel-workflow-integration.test.ts index 7991398..da6c09c 100644 --- a/packages/daemon/src/__tests__/kernel-workflow-integration.test.ts +++ b/packages/daemon/src/__tests__/kernel-workflow-integration.test.ts @@ -78,6 +78,7 @@ function makeLogStore() { appendWithWorkflowUpdate: vi.fn(), getWorkflowRun: vi.fn(() => null), getActiveWorkflowRuns: vi.fn(() => []), + getAllWorkflowRuns: vi.fn(() => []), getTriggerPayload: vi.fn(() => null), getThreadEvents: vi.fn(() => []), archiveLogs: vi.fn(() => ({ days: [], vacuumed: false })), @@ -137,10 +138,10 @@ describe("kernel + workflowManager integration", () => { // We need to check that a start-thread message was sent to the workflow worker const workflowWorker = mockChildren.find((c) => (c.send as ReturnType).mock.calls.some( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "start-thread", + (args: unknown[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "start-thread", ), ); expect(workflowWorker).toBeDefined(); @@ -212,10 +213,10 @@ describe("kernel + workflowManager integration", () => { // No workflow worker should have been spawned (only the sense group worker) const workflowWorkerSpawned = mockChildren.some((c) => (c.send as ReturnType).mock.calls.some( - ([msg]: [unknown]) => - msg !== null && - typeof msg === "object" && - (msg as Record).type === "start-thread", + (args: unknown[]) => + args[0] !== null && + typeof args[0] === "object" && + (args[0] as Record).type === "start-thread", ), ); expect(workflowWorkerSpawned).toBe(false); diff --git a/packages/daemon/src/__tests__/sense-runtime.test.ts b/packages/daemon/src/__tests__/sense-runtime.test.ts index a162a1e..7f30135 100644 --- a/packages/daemon/src/__tests__/sense-runtime.test.ts +++ b/packages/daemon/src/__tests__/sense-runtime.test.ts @@ -10,7 +10,7 @@ import { describe, expect, it } from "vitest"; import { createBlobStore } from "../blob-store.js"; import { parseParentMessage } from "../ipc.js"; import { executeCompute, openPeerDb, openSenseDb, runMigrations } from "../sense-runtime.js"; -import type { DrizzleDB, PeerMap, SenseRuntime } from "../sense-runtime.js"; +import type { ComputeFn, DrizzleDB, PeerMap, SenseRuntime } from "../sense-runtime.js"; // --------------------------------------------------------------------------- // Helpers @@ -168,7 +168,7 @@ describe("openPeerDb", () => { // --------------------------------------------------------------------------- describe("executeCompute", () => { - function makeRuntime(computeFn: (db: DrizzleDB, peers: PeerMap) => Promise): { + function makeRuntime(computeFn: ComputeFn): { runtime: SenseRuntime; sqlite: Database.Database; } { diff --git a/packages/daemon/src/__tests__/workflow-manager.test.ts b/packages/daemon/src/__tests__/workflow-manager.test.ts index c0cd2e3..8fb3a50 100644 --- a/packages/daemon/src/__tests__/workflow-manager.test.ts +++ b/packages/daemon/src/__tests__/workflow-manager.test.ts @@ -76,6 +76,7 @@ function makeLogStore() { getThreadEvents: vi.fn(() => []), archiveLogs: vi.fn(() => ({ days: [], vacuumed: false })), close: vi.fn(), + getAllWorkflowRuns: vi.fn(() => []), }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb9c56c..7a41a30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,9 +27,6 @@ importers: specifier: ^0.1.6 version: 0.1.6 devDependencies: - '@types/better-sqlite3': - specifier: ^7.6.13 - version: 7.6.13 '@types/node': specifier: ^22.0.0 version: 22.19.17