This repository has been archived on 2026-06-01. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
xingyue 47cc49eab4 refactor(daemon): split kernel.ts into focused modules (#86)
- Extract worker-pool.ts (211 LOC): sense worker fork/shutdown/restart/crash recovery
- Extract kernel-file-watch.ts (92 LOC): file change handlers for hot reload
- Extract kernel-sense-groups.ts (29 LOC): group lookup utilities
- kernel.ts reduced from 617 → 380 LOC (thin orchestrator)
- Add worker-pool.test.ts with 8 test cases
- No behavior changes, all existing tests unchanged
2026-04-24 19:39:10 +08:00
..

@uncaged/nerve-daemon

The observation engine runtime for nerve — runs senses, routes signals, schedules reflexes, and manages workflows.

Architecture

Module Responsibility
Kernel Top-level orchestrator — spawns workers, wires up signal bus, scheduler, and workflow manager. Supports hot reload and graceful shutdown.
Sense Runtime Per-sense SQLite database (via node:sqlite + Drizzle ORM), migration runner, peer DB read access.
Sense Worker Forked child process — one per sense group. Runs compute functions in isolation.
Signal Bus In-memory pub/sub. Sense computes emit signals; reflexes and workflows subscribe.
Reflex Scheduler Drives compute triggers — interval timers, signal-based events, throttle/coalesce logic.
Workflow Manager Concurrency control (drop/queue), thread lifecycle, worker process management (RFC-002).
Log Store Structured log storage in WAL-mode SQLite. Supports retention policies, archival to JSONL, and workflow run tracking.
Blob Store Binary artifact storage for workflow outputs.
File Watcher Watches nerve.yaml and sense files for hot reload.
Daemon IPC Unix socket server for CLI ↔ daemon communication.

Key Design Decisions

  • One worker process per sense group — isolation between groups, shared compute within a group
  • node:sqlite (DatabaseSync) — zero native addons, WAL mode, built into Node.js ≥ 22.5
  • Throttle + coalesce — if compute is in-flight, at most one pending trigger is queued (no unbounded accumulation)
  • Log ≠ Signal — logs are queryable data assets but cannot trigger reflexes (prevents feedback loops)

Usage

The daemon is typically started via the CLI (nerve daemon start), but can be used programmatically:

import { createKernel } from "@uncaged/nerve-daemon";

const kernel = await createKernel(nerveRoot);
await kernel.ready;

// Trigger a sense manually
kernel.triggerSense("cpu-usage");

// Check health
const health = kernel.getHealth();

// Graceful shutdown
await kernel.stop();

Install

pnpm add @uncaged/nerve-daemon

Requires Node.js ≥ 22.5 (for node:sqlite).

License

MIT