@reactive-agents/interaction
v0.10.6
Published
Interaction modes for Reactive Agents — 5 autonomy modes, checkpoints, and human collaboration
Readme
@reactive-agents/interaction
Interaction modes and human-in-the-loop primitives for the Reactive Agents framework. v0.10.3
Five autonomy modes, configurable checkpoints, approval gates, escalation rules, and a preference learner that adapts mode selection over time. Designed for agents that occasionally need human judgment — without forcing every run to be supervised.
Installation
bun add @reactive-agents/interactionOr via the umbrella:
bun add reactive-agentsThe 5 Modes
| Mode | Autonomy | When it activates |
| --------------- | ------------------------------ | ---------------------------------- |
| autonomous | Full — no interruptions | High confidence, routine tasks |
| supervised | Periodic checkpoints | Moderate confidence |
| collaborative | Human decides key steps | Complex or ambiguous tasks |
| consultative | Human approves before acting | High-cost or risky operations |
| interrogative | Human provides all direction | Information gathering only |
Modes transition automatically based on ModeTransitionRules and EscalationConditions — an autonomous agent can escalate to consultative when entropy spikes or estimated cost crosses a threshold, then de-escalate when confidence recovers.
Quick Example
import { ReactiveAgents } from "reactive-agents";
const agent = await ReactiveAgents.create()
.withName("assistant")
.withProvider("anthropic", { model: "claude-sonnet-4-20250514" })
.withInteraction({
defaultMode: "supervised",
onCheckpoint: async (ctx) => {
console.log("Agent wants to:", ctx.proposedAction);
const ok = await askHuman(ctx);
return { approved: ok };
},
escalation: [
{ type: "cost-threshold", thresholdUsd: 0.50, toMode: "consultative" },
{ type: "low-confidence", threshold: 0.4, toMode: "collaborative" },
],
})
.build();Direct Service Usage
import { Effect } from "effect";
import {
InteractionManager,
InteractionManagerLive,
CheckpointService,
ModeSwitcher,
} from "@reactive-agents/interaction";
const program = Effect.gen(function* () {
const interaction = yield* InteractionManager;
const switcher = yield* ModeSwitcher;
yield* switcher.switchTo("collaborative", { reason: "user-requested" });
const decision = yield* interaction.requestApproval({
action: "delete-file",
path: "/tmp/x",
});
return decision;
});Preference Learning
The PreferenceLearner records approval/rejection patterns and surfaces them as UserPreference records that can bias future mode selection — e.g. learning that the user always approves web-search calls but always wants to confirm filesystem writes.
import { PreferenceLearner } from "@reactive-agents/interaction";
const prefs = yield* PreferenceLearner;
yield* prefs.record({
action: "web-search",
decision: "approve",
context: { agentId, taskId },
});
const tolerance = yield* prefs.getTolerance(); // InterruptionToleranceKey Exports
| Export | Purpose |
| ------------------------------------------------- | ------------------------------------------------ |
| InteractionManager, InteractionManagerLive | Top-level orchestrator for modes + checkpoints |
| ModeSwitcher, ModeSwitcherLive | Programmatic mode transitions |
| CheckpointService, CheckpointServiceLive | Approval-point persistence |
| NotificationService, NotificationServiceLive | Multi-channel notifications |
| CollaborationService, CollaborationServiceLive | Bidirectional agent ↔ human messaging |
| PreferenceLearner, PreferenceLearnerLive | Approval-pattern learner |
| createInteractionLayer | Factory for the runtime layer |
| InteractionModeType, Checkpoint, Notification, InterruptRule, CollaborationSession, UserPreference | Schemas + types |
| InteractionError, ModeError, CheckpointError, NotificationError, InputTimeoutError | Tagged errors |
Documentation
License
MIT
