Packages
@loop-engine/adapter-openclaw
Runtime role: Channel · Developer: EventBus routing · Runtime connections
Overview
@loop-engine/adapter-openclaw wraps an internal event bus and forwards selected loop events to OpenClaw over its WebSocket gateway control plane.
Install
1npm install @loop-engine/adapter-openclaw wsPrerequisites
- OpenClaw gateway reachable at
ws://127.0.0.1:18789 - Configured OpenClaw channel and target destination
createLoopSystem usage
createLoopSystem always wires an in-memory InMemoryEventBus today. To forward events to OpenClaw, wrap the bus returned from createLoopSystem with OpenClawEventBus:
1import { createLoopSystem } from '@loop-engine/sdk'2import { OpenClawEventBus } from '@loop-engine/adapter-openclaw'3import { LoopBuilder } from '@loop-engine/sdk'4 5const loop = LoopBuilder6 .create('demo.forward', 'demo')7 .state('A', { isTerminal: true })8 .initialState('A')9 .outcome({10 id: 'done',11 description: 'done',12 valueUnit: 'done',13 businessMetrics: [{ id: 'm_done', label: 'Done', unit: 'count' }]14 })15 .build()16 17const { eventBus: inner } = await createLoopSystem({ loops: [loop] })18 19const forward = new OpenClawEventBus(inner, {20 channel: 'whatsapp',21 target: '+15551234567',22 events: ['loop.transition.executed', 'loop.completed'],23 approvalStates: ['PENDING_BUYER_APPROVAL']24})25void forwardOpenClawAdapterOptions
1interface OpenClawAdapterOptions {2 gatewayUrl?: string "cmt">// default: ws://127.0.0.1:187893 channel: string4 target: string5 accountId?: string6 events?: string[] "cmt">// default: ['loop.transition.executed','loop.completed','loop.guard.failed']7 loopIds?: string[] "cmt">// default: []8 approvalStates?: string[] "cmt">// default: []9 inner?: EventBus "cmt">// default: new InMemoryEventBus()10 autoReconnect?: boolean "cmt">// default: true11 reconnectDelay?: number "cmt">// default: 500012}Approval state detection
The adapter marks a transition event as approval-required when toState matches PENDING|APPROVAL unless explicit approvalStates are configured.
Lifecycle cleanup
Call disconnect() during shutdown to stop reconnect timers and close the current socket cleanly.
Related example
See OpenClaw Integration for the end-to-end approval flow.