Loop Engine

Defining Loops

Typescript Builder

LoopBuilder API (@loop-engine/dsl)

LoopBuilder is a fluent authoring API that validates on .build().

Signatures

1LoopBuilder.create(id: string, domain: string): LoopBuilder
2version(v: string): LoopBuilder
3description(d: string): LoopBuilder
4state(id: string, options?: { isTerminal?: boolean; isError?: boolean }): LoopBuilder
5initialState(id: string): LoopBuilder
6transition(spec: {
7 id: string
8 from: string
9 to: string
10 actors: ActorType[]
11 guards?: Partial<GuardSpec>[]
12}): LoopBuilder
13outcome(spec: {
14 id?: string
15 description?: string
16 valueUnit?: string
17 measurable?: boolean
18 businessMetrics?: Array<{ id: string; label: string; unit: string; improvableByAI: boolean }>
19}): LoopBuilder
20build(): LoopDefinition

Runtime behavior notes

  • .transition() throws if actors is empty.
  • .build() throws if outcome is missing.
  • .build() validates via validateLoopDefinition().

Example: procurement-style loop in TypeScript

1import { LoopBuilder } from '@loop-engine/dsl'
2 
3const procurement = LoopBuilder
4 .create('scm.procurement', 'scm')
5 .version('1.0.0')
6 .description('Purchase order lifecycle through settlement')
7 .state('OPEN')
8 .state('PO_CONFIRMED')
9 .state('RECEIVED')
10 .state('INVOICE_MATCHED')
11 .state('SETTLED', { isTerminal: true })
12 .initialState('OPEN')
13 .transition({
14 id: 'confirm_po',
15 from: 'OPEN',
16 to: 'PO_CONFIRMED',
17 actors: ['human', 'automation', 'ai-agent'],
18 guards: [
19 {
20 id: 'approval_obtained',
21 severity: 'hard',
22 evaluatedBy: 'external',
23 description: 'PO must be approved',
24 failureMessage: 'PO confirmation requires explicit approval'
25 }
26 ]
27 })
28 .outcome({
29 id: 'po_settled',
30 description: 'Purchase order settled',
31 valueUnit: 'po_settled',
32 measurable: true
33 })
34 .build()

Use YAML when loop definitions are owned by ops/product teams; use builder when you prefer type-guided code review and composition.