8dd82d99da
Senses trigger shell commands only. Workflows are invoked via CLI.
SenseTrigger is now { command: string } — no discriminated union.
Closes #318
Co-authored-by: Cursor <cursoragent@cursor.com>
2.2 KiB
2.2 KiB
@uncaged/nerve-core
Shared types and configuration parser for the nerve observation engine.
What's Inside
- Type definitions —
SenseConfig,SenseInfo,SenseComputeFn,SenseModule,SenseTrigger,WorkflowConfig,NerveConfig, and related types - Config parser —
parseNerveConfig(yaml)validates and parsesnerve.yamlintoNerveConfig(top-levelreflexesis rejected; useinterval/onon each sense) - Sense triggers —
parseSenseTriggervalidates{ command: string }from sense compute results or worker IPC (triggerfield oncompute-result) - Daemon IPC protocol — request/response types (
DaemonIpcRequest,DaemonIpcResponse, …) andparseDaemonIpcRequestfor newline-delimited JSON on the CLI ↔ daemon socket - Workflow automaton types —
START/ENDsentinel constants,WorkflowMessage,StartStep,RoleStep,ModeratorContext(start+steps; emptystepson first moderator call),Moderator(singlecontextargument),WorkflowDefinition,Role,RoleResult, plusDEFAULT_ENGINE_MAX_ROUNDS - Result type —
Result<T>withok()/err()helpers for explicit error handling (no thrown exceptions for parse paths)
Usage
import { parseNerveConfig, ok, err } from "@uncaged/nerve-core";
import type { NerveConfig, Result } from "@uncaged/nerve-core";
const result: Result<NerveConfig> = parseNerveConfig(yamlString);
if (result.ok) {
console.log(result.value.senses);
}
Sense trigger validation
import { parseSenseTrigger } from "@uncaged/nerve-core";
const parsed = parseSenseTrigger({ command: "echo hello" });
if (parsed.ok) {
console.log(parsed.value.command);
}
Sense modules return { state, trigger } from compute(state); when trigger is non-null it must be exactly { command: string } (non-empty after trim). The daemon validates worker IPC with parseSenseTrigger. Workflows are started only via CLI / daemon IPC, not from this field.
Duration Format
Config fields like throttle, timeout, and interval accept human-readable durations:
5s— 5 seconds10m— 10 minutes1h— 1 hour
Install
pnpm add @uncaged/nerve-core
License
MIT