Packages
@loop-engine/actors
@loop-engine/actors models all five actor categories and provides transition authorization + evidence utilities.
Install
1npm install @loop-engine/actorsActor types
1interface HumanActor extends ActorRef {2 type: "human"3 userId: string4 displayName: string5 roles?: string[]6}7 8interface AutomationActor extends ActorRef {9 type: "automation"10 serviceId: string11 version?: string12}13 14interface AIAgentActor extends ActorRef {15 type: "ai-agent"16 modelId: string17 provider: string18 confidence?: number19 promptHash?: string20 toolsUsed?: string[]21}Authorization
1canActorExecuteTransition(2 actor: Actor,3 transition: TransitionSpec,4 constraints?: AIActorConstraints5): { authorized: boolean; requiresApproval: boolean; reason?: string }canActorExecuteTransition() validates transition.allowedActors and the optional AIActorConstraints.requiresHumanApprovalFor list for ai-agent actors.
1"cmt">// @no-typecheck2import { canActorExecuteTransition } from "@loop-engine/actors"3 4const auth = canActorExecuteTransition(agentActor, transition)5if (!auth.authorized) {6 console.log(auth.reason)7}Evidence building
1buildAIActorEvidence(params: {2 modelId: string3 provider: string4 reasoning: string5 confidence: number6 dataPoints?: Record<string, unknown>7 rawResponse?: unknown8 prompt?: string9}): Promise<AIAgentSubmission["evidence"] & { modelId: string; provider: string; promptHash?: string }>Use buildAIActorEvidence when you have model metadata and need structured, attributable AI evidence to attach to a transition.
1import { buildAIActorEvidence } from "@loop-engine/actors"2 3const evidence = await buildAIActorEvidence({4 modelId: "gpt-4o",5 provider: "openai",6 reasoning: "Demand spike at DC-East",7 confidence: 0.82,8 dataPoints: { recommended_qty: 500 }9})