@positronic/core 0.0.49 → 0.0.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/dsl/brain-runner.js +7 -3
- package/dist/src/dsl/brain-state-machine.js +315 -251
- package/dist/src/index.js +1 -1
- package/dist/types/dsl/brain-state-machine.d.ts +41 -29
- package/dist/types/dsl/brain-state-machine.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -276,7 +276,7 @@ function _ts_values(o) {
|
|
|
276
276
|
import { BRAIN_EVENTS } from './constants.js';
|
|
277
277
|
import { applyPatches } from './json-patch.js';
|
|
278
278
|
import { reconstructLoopContext } from './loop-messages.js';
|
|
279
|
-
import { createBrainExecutionMachine, sendEvent
|
|
279
|
+
import { createBrainExecutionMachine, sendEvent } from './brain-state-machine.js';
|
|
280
280
|
import { DEFAULT_ENV } from './brain.js';
|
|
281
281
|
export var BrainRunner = /*#__PURE__*/ function() {
|
|
282
282
|
"use strict";
|
|
@@ -407,7 +407,9 @@ export var BrainRunner = /*#__PURE__*/ function() {
|
|
|
407
407
|
2
|
|
408
408
|
];
|
|
409
409
|
// Use state machine to create cancelled event
|
|
410
|
-
|
|
410
|
+
sendEvent(machine, {
|
|
411
|
+
type: BRAIN_EVENTS.CANCELLED
|
|
412
|
+
});
|
|
411
413
|
cancelledEvent = machine.context.currentEvent;
|
|
412
414
|
return [
|
|
413
415
|
4,
|
|
@@ -554,7 +556,9 @@ export var BrainRunner = /*#__PURE__*/ function() {
|
|
|
554
556
|
3,
|
|
555
557
|
17
|
|
556
558
|
];
|
|
557
|
-
|
|
559
|
+
sendEvent(machine, {
|
|
560
|
+
type: BRAIN_EVENTS.CANCELLED
|
|
561
|
+
});
|
|
558
562
|
cancelledEvent = machine.context.currentEvent;
|
|
559
563
|
return [
|
|
560
564
|
4,
|
|
@@ -109,9 +109,104 @@ import * as robot3 from 'robot3';
|
|
|
109
109
|
var createMachine = robot3.createMachine, state = robot3.state, transition = robot3.transition, reduce = robot3.reduce, guard = robot3.guard, interpret = robot3.interpret;
|
|
110
110
|
import { BRAIN_EVENTS, STATUS } from './constants.js';
|
|
111
111
|
import { applyPatches } from './json-patch.js';
|
|
112
|
+
// ============================================================================
|
|
113
|
+
// Tree Helper Functions
|
|
114
|
+
// ============================================================================
|
|
115
|
+
/**
|
|
116
|
+
* Get the deepest (currently executing) brain in the tree.
|
|
117
|
+
*/ function getDeepestBrain(root) {
|
|
118
|
+
if (!root) return null;
|
|
119
|
+
var current = root;
|
|
120
|
+
while(current.innerBrain){
|
|
121
|
+
current = current.innerBrain;
|
|
122
|
+
}
|
|
123
|
+
return current;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Clone tree with a new innerBrain attached to the deepest node.
|
|
127
|
+
*/ function cloneTreeWithNewInner(root, newInner) {
|
|
128
|
+
if (!root.innerBrain) {
|
|
129
|
+
return _object_spread_props(_object_spread({}, root), {
|
|
130
|
+
innerBrain: newInner
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return _object_spread_props(_object_spread({}, root), {
|
|
134
|
+
innerBrain: cloneTreeWithNewInner(root.innerBrain, newInner)
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Clone tree replacing the deepest brain.
|
|
139
|
+
*/ function cloneTreeReplacingDeepest(root, replacement) {
|
|
140
|
+
if (!root.innerBrain) {
|
|
141
|
+
return replacement;
|
|
142
|
+
}
|
|
143
|
+
return _object_spread_props(_object_spread({}, root), {
|
|
144
|
+
innerBrain: cloneTreeReplacingDeepest(root.innerBrain, replacement)
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Clone tree updating steps on the deepest brain.
|
|
149
|
+
*/ function cloneTreeUpdatingDeepestSteps(root, newSteps) {
|
|
150
|
+
if (!root.innerBrain) {
|
|
151
|
+
return _object_spread_props(_object_spread({}, root), {
|
|
152
|
+
steps: newSteps
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return _object_spread_props(_object_spread({}, root), {
|
|
156
|
+
innerBrain: cloneTreeUpdatingDeepestSteps(root.innerBrain, newSteps)
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Clone tree removing the deepest brain and attaching its steps to parent step.
|
|
161
|
+
* Returns null if root is the deepest (no parent).
|
|
162
|
+
*/ function cloneTreeRemovingDeepest(root) {
|
|
163
|
+
if (!root.innerBrain) {
|
|
164
|
+
// Root is the deepest - can't remove, return null
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
if (!root.innerBrain.innerBrain) {
|
|
168
|
+
// root.innerBrain is the deepest - remove it and attach steps to parent step
|
|
169
|
+
var completedBrain = root.innerBrain;
|
|
170
|
+
var updatedSteps = root.steps.map(function(step) {
|
|
171
|
+
if (step.id === completedBrain.parentStepId) {
|
|
172
|
+
return _object_spread_props(_object_spread({}, step), {
|
|
173
|
+
innerSteps: completedBrain.steps,
|
|
174
|
+
status: STATUS.COMPLETE
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return step;
|
|
178
|
+
});
|
|
179
|
+
return _object_spread_props(_object_spread({}, root), {
|
|
180
|
+
steps: updatedSteps,
|
|
181
|
+
innerBrain: null
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// Recurse down
|
|
185
|
+
return _object_spread_props(_object_spread({}, root), {
|
|
186
|
+
innerBrain: cloneTreeRemovingDeepest(root.innerBrain)
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Convert tree to flat array (for backwards compatibility).
|
|
191
|
+
*/ function treeToStack(root) {
|
|
192
|
+
var stack = [];
|
|
193
|
+
var current = root;
|
|
194
|
+
while(current){
|
|
195
|
+
stack.push({
|
|
196
|
+
brainRunId: current.brainRunId,
|
|
197
|
+
brainTitle: current.brainTitle,
|
|
198
|
+
brainDescription: current.brainDescription,
|
|
199
|
+
parentStepId: current.parentStepId,
|
|
200
|
+
steps: current.steps
|
|
201
|
+
});
|
|
202
|
+
current = current.innerBrain;
|
|
203
|
+
}
|
|
204
|
+
return stack;
|
|
205
|
+
}
|
|
112
206
|
var createInitialContext = function(opts) {
|
|
113
207
|
var _opts_initialState, _opts_options;
|
|
114
208
|
return {
|
|
209
|
+
rootBrain: null,
|
|
115
210
|
brainStack: [],
|
|
116
211
|
depth: 0,
|
|
117
212
|
brainRunId: null,
|
|
@@ -122,6 +217,7 @@ var createInitialContext = function(opts) {
|
|
|
122
217
|
currentState: (_opts_initialState = opts === null || opts === void 0 ? void 0 : opts.initialState) !== null && _opts_initialState !== void 0 ? _opts_initialState : {},
|
|
123
218
|
currentEvent: null,
|
|
124
219
|
options: (_opts_options = opts === null || opts === void 0 ? void 0 : opts.options) !== null && _opts_options !== void 0 ? _opts_options : {},
|
|
220
|
+
status: STATUS.PENDING,
|
|
125
221
|
isTopLevel: false,
|
|
126
222
|
isRunning: false,
|
|
127
223
|
isComplete: false,
|
|
@@ -135,7 +231,33 @@ var createInitialContext = function(opts) {
|
|
|
135
231
|
// Helper to update derived state
|
|
136
232
|
// ============================================================================
|
|
137
233
|
var updateDerivedState = function(ctx, executionState) {
|
|
234
|
+
// Map ExecutionState to STATUS - this gives consumers the authoritative status
|
|
235
|
+
var status;
|
|
236
|
+
switch(executionState){
|
|
237
|
+
case 'idle':
|
|
238
|
+
status = STATUS.PENDING;
|
|
239
|
+
break;
|
|
240
|
+
case 'running':
|
|
241
|
+
status = STATUS.RUNNING;
|
|
242
|
+
break;
|
|
243
|
+
case 'paused':
|
|
244
|
+
// Paused brains are still considered "running" in terms of database status
|
|
245
|
+
status = STATUS.RUNNING;
|
|
246
|
+
break;
|
|
247
|
+
case 'complete':
|
|
248
|
+
status = STATUS.COMPLETE;
|
|
249
|
+
break;
|
|
250
|
+
case 'error':
|
|
251
|
+
status = STATUS.ERROR;
|
|
252
|
+
break;
|
|
253
|
+
case 'cancelled':
|
|
254
|
+
status = STATUS.CANCELLED;
|
|
255
|
+
break;
|
|
256
|
+
default:
|
|
257
|
+
status = STATUS.RUNNING;
|
|
258
|
+
}
|
|
138
259
|
return _object_spread_props(_object_spread({}, ctx), {
|
|
260
|
+
status: status,
|
|
139
261
|
isTopLevel: ctx.depth === 1,
|
|
140
262
|
isRunning: executionState === 'running',
|
|
141
263
|
isComplete: executionState === 'complete',
|
|
@@ -149,19 +271,22 @@ var updateDerivedState = function(ctx, executionState) {
|
|
|
149
271
|
// ============================================================================
|
|
150
272
|
var startBrain = reduce(function(ctx, param) {
|
|
151
273
|
var brainRunId = param.brainRunId, brainTitle = param.brainTitle, brainDescription = param.brainDescription, initialState = param.initialState;
|
|
152
|
-
var currentStepId = ctx.currentStepId,
|
|
153
|
-
var
|
|
274
|
+
var currentStepId = ctx.currentStepId, rootBrain = ctx.rootBrain, depth = ctx.depth, existingBrainRunId = ctx.brainRunId, currentState = ctx.currentState, options = ctx.options;
|
|
275
|
+
var newDepth = depth + 1;
|
|
276
|
+
var newBrain = {
|
|
154
277
|
brainRunId: brainRunId,
|
|
155
278
|
brainTitle: brainTitle,
|
|
156
279
|
brainDescription: brainDescription,
|
|
157
280
|
parentStepId: currentStepId,
|
|
158
|
-
steps: []
|
|
281
|
+
steps: [],
|
|
282
|
+
innerBrain: null,
|
|
283
|
+
depth: newDepth
|
|
159
284
|
};
|
|
160
|
-
|
|
285
|
+
// Build tree: if no root, this is root; else attach to deepest
|
|
286
|
+
var newRootBrain = rootBrain ? cloneTreeWithNewInner(rootBrain, newBrain) : newBrain;
|
|
161
287
|
var newCtx = _object_spread_props(_object_spread({}, ctx), {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
]),
|
|
288
|
+
rootBrain: newRootBrain,
|
|
289
|
+
brainStack: treeToStack(newRootBrain),
|
|
165
290
|
depth: newDepth,
|
|
166
291
|
brainRunId: existingBrainRunId !== null && existingBrainRunId !== void 0 ? existingBrainRunId : brainRunId,
|
|
167
292
|
currentState: newDepth === 1 ? initialState !== null && initialState !== void 0 ? initialState : currentState : currentState,
|
|
@@ -179,26 +304,27 @@ var startBrain = reduce(function(ctx, param) {
|
|
|
179
304
|
});
|
|
180
305
|
var restartBrain = reduce(function(ctx, param) {
|
|
181
306
|
var brainRunId = param.brainRunId, brainTitle = param.brainTitle, brainDescription = param.brainDescription, initialState = param.initialState;
|
|
182
|
-
var currentStepId = ctx.currentStepId,
|
|
307
|
+
var currentStepId = ctx.currentStepId, rootBrain = ctx.rootBrain, depth = ctx.depth, existingBrainRunId = ctx.brainRunId, options = ctx.options;
|
|
183
308
|
// brain:restart can be either:
|
|
184
309
|
// 1. A resume of an existing brain on the stack (same brainTitle) - should REPLACE
|
|
185
310
|
// 2. A nested inner brain restarting (different brainTitle) - should ADD
|
|
186
|
-
if (
|
|
187
|
-
var
|
|
188
|
-
// If the
|
|
189
|
-
if (
|
|
190
|
-
var
|
|
311
|
+
if (rootBrain) {
|
|
312
|
+
var deepestBrain = getDeepestBrain(rootBrain);
|
|
313
|
+
// If the deepest brain has the same title, this is a resume - replace it
|
|
314
|
+
if (deepestBrain && deepestBrain.brainTitle === brainTitle) {
|
|
315
|
+
var replacementBrain = {
|
|
191
316
|
brainRunId: brainRunId,
|
|
192
317
|
brainTitle: brainTitle,
|
|
193
318
|
brainDescription: brainDescription,
|
|
194
|
-
parentStepId:
|
|
195
|
-
steps: []
|
|
319
|
+
parentStepId: deepestBrain.parentStepId,
|
|
320
|
+
steps: [],
|
|
321
|
+
innerBrain: null,
|
|
322
|
+
depth: deepestBrain.depth
|
|
196
323
|
};
|
|
197
|
-
var
|
|
198
|
-
newEntry
|
|
199
|
-
]);
|
|
324
|
+
var newRootBrain = cloneTreeReplacingDeepest(rootBrain, replacementBrain);
|
|
200
325
|
var newCtx = _object_spread_props(_object_spread({}, ctx), {
|
|
201
|
-
|
|
326
|
+
rootBrain: newRootBrain,
|
|
327
|
+
brainStack: treeToStack(newRootBrain),
|
|
202
328
|
// depth stays the same - we're replacing, not nesting
|
|
203
329
|
brainRunId: existingBrainRunId !== null && existingBrainRunId !== void 0 ? existingBrainRunId : brainRunId,
|
|
204
330
|
currentEvent: {
|
|
@@ -213,19 +339,21 @@ var restartBrain = reduce(function(ctx, param) {
|
|
|
213
339
|
});
|
|
214
340
|
return updateDerivedState(newCtx, 'running');
|
|
215
341
|
}
|
|
216
|
-
// Different title - this is a nested inner brain restarting, ADD to
|
|
217
|
-
var
|
|
342
|
+
// Different title - this is a nested inner brain restarting, ADD to tree
|
|
343
|
+
var newDepth = depth + 1;
|
|
344
|
+
var newBrain = {
|
|
218
345
|
brainRunId: brainRunId,
|
|
219
346
|
brainTitle: brainTitle,
|
|
220
347
|
brainDescription: brainDescription,
|
|
221
348
|
parentStepId: currentStepId,
|
|
222
|
-
steps: []
|
|
349
|
+
steps: [],
|
|
350
|
+
innerBrain: null,
|
|
351
|
+
depth: newDepth
|
|
223
352
|
};
|
|
224
|
-
var
|
|
353
|
+
var newRootBrain1 = cloneTreeWithNewInner(rootBrain, newBrain);
|
|
225
354
|
var newCtx1 = _object_spread_props(_object_spread({}, ctx), {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
]),
|
|
355
|
+
rootBrain: newRootBrain1,
|
|
356
|
+
brainStack: treeToStack(newRootBrain1),
|
|
229
357
|
depth: newDepth,
|
|
230
358
|
brainRunId: existingBrainRunId !== null && existingBrainRunId !== void 0 ? existingBrainRunId : brainRunId,
|
|
231
359
|
currentEvent: {
|
|
@@ -241,17 +369,18 @@ var restartBrain = reduce(function(ctx, param) {
|
|
|
241
369
|
return updateDerivedState(newCtx1, 'running');
|
|
242
370
|
}
|
|
243
371
|
// No brain on stack - this is a fresh restart from idle state
|
|
244
|
-
var
|
|
372
|
+
var newBrain1 = {
|
|
245
373
|
brainRunId: brainRunId,
|
|
246
374
|
brainTitle: brainTitle,
|
|
247
375
|
brainDescription: brainDescription,
|
|
248
376
|
parentStepId: null,
|
|
249
|
-
steps: []
|
|
377
|
+
steps: [],
|
|
378
|
+
innerBrain: null,
|
|
379
|
+
depth: 1
|
|
250
380
|
};
|
|
251
381
|
var newCtx2 = _object_spread_props(_object_spread({}, ctx), {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
],
|
|
382
|
+
rootBrain: newBrain1,
|
|
383
|
+
brainStack: treeToStack(newBrain1),
|
|
255
384
|
depth: 1,
|
|
256
385
|
brainRunId: existingBrainRunId !== null && existingBrainRunId !== void 0 ? existingBrainRunId : brainRunId,
|
|
257
386
|
currentEvent: {
|
|
@@ -267,25 +396,18 @@ var restartBrain = reduce(function(ctx, param) {
|
|
|
267
396
|
return updateDerivedState(newCtx2, 'running');
|
|
268
397
|
});
|
|
269
398
|
var completeBrain = reduce(function(ctx) {
|
|
270
|
-
var
|
|
271
|
-
if (
|
|
272
|
-
var completedBrain =
|
|
273
|
-
|
|
274
|
-
// Attach completed brain's steps to parent step if nested
|
|
275
|
-
if (newStack.length > 0 && completedBrain.parentStepId) {
|
|
276
|
-
var parentBrain = newStack[newStack.length - 1];
|
|
277
|
-
var parentStep = parentBrain.steps.find(function(s) {
|
|
278
|
-
return s.id === completedBrain.parentStepId;
|
|
279
|
-
});
|
|
280
|
-
if (parentStep) {
|
|
281
|
-
parentStep.innerSteps = completedBrain.steps;
|
|
282
|
-
parentStep.status = STATUS.COMPLETE;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
399
|
+
var rootBrain = ctx.rootBrain, depth = ctx.depth, brainRunId = ctx.brainRunId, options = ctx.options;
|
|
400
|
+
if (!rootBrain) return ctx;
|
|
401
|
+
var completedBrain = getDeepestBrain(rootBrain);
|
|
402
|
+
if (!completedBrain) return ctx;
|
|
285
403
|
var newDepth = depth - 1;
|
|
286
|
-
var
|
|
404
|
+
var isOuterBrainComplete = newDepth === 0;
|
|
405
|
+
// When the outer brain completes, keep rootBrain so we can still display
|
|
406
|
+
// the final state. Only remove inner brains (attaching their steps to parent).
|
|
407
|
+
var newRootBrain = isOuterBrainComplete ? rootBrain : cloneTreeRemovingDeepest(rootBrain);
|
|
287
408
|
var newCtx = _object_spread_props(_object_spread({}, ctx), {
|
|
288
|
-
|
|
409
|
+
rootBrain: newRootBrain,
|
|
410
|
+
brainStack: treeToStack(newRootBrain),
|
|
289
411
|
depth: newDepth,
|
|
290
412
|
currentEvent: {
|
|
291
413
|
type: BRAIN_EVENTS.COMPLETE,
|
|
@@ -296,12 +418,12 @@ var completeBrain = reduce(function(ctx) {
|
|
|
296
418
|
options: options
|
|
297
419
|
}
|
|
298
420
|
});
|
|
299
|
-
return updateDerivedState(newCtx,
|
|
421
|
+
return updateDerivedState(newCtx, isOuterBrainComplete ? 'complete' : 'running');
|
|
300
422
|
});
|
|
301
423
|
var errorBrain = reduce(function(ctx, param) {
|
|
302
424
|
var error = param.error;
|
|
303
|
-
var
|
|
304
|
-
var currentBrain =
|
|
425
|
+
var rootBrain = ctx.rootBrain, brainRunId = ctx.brainRunId, options = ctx.options;
|
|
426
|
+
var currentBrain = getDeepestBrain(rootBrain);
|
|
305
427
|
var newCtx = _object_spread_props(_object_spread({}, ctx), {
|
|
306
428
|
error: error,
|
|
307
429
|
currentEvent: {
|
|
@@ -317,8 +439,8 @@ var errorBrain = reduce(function(ctx, param) {
|
|
|
317
439
|
return updateDerivedState(newCtx, 'error');
|
|
318
440
|
});
|
|
319
441
|
var cancelBrain = reduce(function(ctx) {
|
|
320
|
-
var
|
|
321
|
-
var currentBrain =
|
|
442
|
+
var rootBrain = ctx.rootBrain, brainRunId = ctx.brainRunId, options = ctx.options;
|
|
443
|
+
var currentBrain = getDeepestBrain(rootBrain);
|
|
322
444
|
var newCtx = _object_spread_props(_object_spread({}, ctx), {
|
|
323
445
|
currentEvent: {
|
|
324
446
|
type: BRAIN_EVENTS.CANCELLED,
|
|
@@ -333,24 +455,37 @@ var cancelBrain = reduce(function(ctx) {
|
|
|
333
455
|
});
|
|
334
456
|
var startStep = reduce(function(ctx, param) {
|
|
335
457
|
var stepId = param.stepId, stepTitle = param.stepTitle;
|
|
336
|
-
var
|
|
458
|
+
var rootBrain = ctx.rootBrain, brainRunId = ctx.brainRunId, options = ctx.options;
|
|
337
459
|
// Add step to current brain's steps if not already there
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
var
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
currentBrain.steps.push({
|
|
345
|
-
id: stepId,
|
|
346
|
-
title: stepTitle,
|
|
347
|
-
status: STATUS.RUNNING
|
|
460
|
+
var newRootBrain = rootBrain;
|
|
461
|
+
if (rootBrain) {
|
|
462
|
+
var currentBrain = getDeepestBrain(rootBrain);
|
|
463
|
+
if (currentBrain) {
|
|
464
|
+
var existingStep = currentBrain.steps.find(function(s) {
|
|
465
|
+
return s.id === stepId;
|
|
348
466
|
});
|
|
349
|
-
|
|
350
|
-
existingStep
|
|
467
|
+
var newSteps;
|
|
468
|
+
if (!existingStep) {
|
|
469
|
+
newSteps = _to_consumable_array(currentBrain.steps).concat([
|
|
470
|
+
{
|
|
471
|
+
id: stepId,
|
|
472
|
+
title: stepTitle,
|
|
473
|
+
status: STATUS.RUNNING
|
|
474
|
+
}
|
|
475
|
+
]);
|
|
476
|
+
} else {
|
|
477
|
+
newSteps = currentBrain.steps.map(function(s) {
|
|
478
|
+
return s.id === stepId ? _object_spread_props(_object_spread({}, s), {
|
|
479
|
+
status: STATUS.RUNNING
|
|
480
|
+
}) : s;
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
newRootBrain = cloneTreeUpdatingDeepestSteps(rootBrain, newSteps);
|
|
351
484
|
}
|
|
352
485
|
}
|
|
353
486
|
return _object_spread_props(_object_spread({}, ctx), {
|
|
487
|
+
rootBrain: newRootBrain,
|
|
488
|
+
brainStack: treeToStack(newRootBrain),
|
|
354
489
|
currentStepId: stepId,
|
|
355
490
|
currentStepTitle: stepTitle,
|
|
356
491
|
currentEvent: {
|
|
@@ -365,15 +500,18 @@ var startStep = reduce(function(ctx, param) {
|
|
|
365
500
|
});
|
|
366
501
|
var completeStep = reduce(function(ctx, param) {
|
|
367
502
|
var stepId = param.stepId, stepTitle = param.stepTitle, patch = param.patch;
|
|
368
|
-
var
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
var
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
503
|
+
var rootBrain = ctx.rootBrain, depth = ctx.depth, currentState = ctx.currentState, topLevelStepCount = ctx.topLevelStepCount, brainRunId = ctx.brainRunId, options = ctx.options;
|
|
504
|
+
var newRootBrain = rootBrain;
|
|
505
|
+
if (rootBrain) {
|
|
506
|
+
var currentBrain = getDeepestBrain(rootBrain);
|
|
507
|
+
if (currentBrain) {
|
|
508
|
+
var newSteps = currentBrain.steps.map(function(s) {
|
|
509
|
+
return s.id === stepId ? _object_spread_props(_object_spread({}, s), {
|
|
510
|
+
status: STATUS.COMPLETE,
|
|
511
|
+
patch: patch
|
|
512
|
+
}) : s;
|
|
513
|
+
});
|
|
514
|
+
newRootBrain = cloneTreeUpdatingDeepestSteps(rootBrain, newSteps);
|
|
377
515
|
}
|
|
378
516
|
}
|
|
379
517
|
// Apply patch to currentState only for top-level brain
|
|
@@ -386,6 +524,8 @@ var completeStep = reduce(function(ctx, param) {
|
|
|
386
524
|
newStepCount = topLevelStepCount + 1;
|
|
387
525
|
}
|
|
388
526
|
return _object_spread_props(_object_spread({}, ctx), {
|
|
527
|
+
rootBrain: newRootBrain,
|
|
528
|
+
brainStack: treeToStack(newRootBrain),
|
|
389
529
|
currentState: newState,
|
|
390
530
|
topLevelStepCount: newStepCount,
|
|
391
531
|
currentEvent: {
|
|
@@ -429,38 +569,35 @@ var webhookResponse = reduce(function(ctx, param) {
|
|
|
429
569
|
});
|
|
430
570
|
var stepStatus = reduce(function(ctx, param) {
|
|
431
571
|
var eventBrainRunId = param.brainRunId, steps = param.steps;
|
|
432
|
-
var brainRunId = ctx.brainRunId,
|
|
433
|
-
if (
|
|
434
|
-
// Only update the current (deepest) brain
|
|
572
|
+
var brainRunId = ctx.brainRunId, rootBrain = ctx.rootBrain, options = ctx.options;
|
|
573
|
+
if (!rootBrain) return ctx;
|
|
574
|
+
// Only update the current (deepest) brain in the tree.
|
|
435
575
|
// STEP_STATUS is emitted by the currently executing brain, which is always
|
|
436
576
|
// the deepest one. We can't match by brainRunId because nested brains share
|
|
437
577
|
// the same brainRunId, which would incorrectly update all nested brains.
|
|
438
|
-
var
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
} : {});
|
|
457
|
-
})
|
|
458
|
-
});
|
|
459
|
-
}
|
|
460
|
-
return brain;
|
|
578
|
+
var currentBrain = getDeepestBrain(rootBrain);
|
|
579
|
+
if (!currentBrain) return ctx;
|
|
580
|
+
// Create a map of existing steps to preserve their patches
|
|
581
|
+
var existingStepsById = new Map(currentBrain.steps.map(function(s) {
|
|
582
|
+
return [
|
|
583
|
+
s.id,
|
|
584
|
+
s
|
|
585
|
+
];
|
|
586
|
+
}));
|
|
587
|
+
var newSteps = steps.map(function(s) {
|
|
588
|
+
var existing = existingStepsById.get(s.id);
|
|
589
|
+
return _object_spread({
|
|
590
|
+
id: s.id,
|
|
591
|
+
title: s.title,
|
|
592
|
+
status: s.status
|
|
593
|
+
}, (existing === null || existing === void 0 ? void 0 : existing.patch) ? {
|
|
594
|
+
patch: existing.patch
|
|
595
|
+
} : {});
|
|
461
596
|
});
|
|
597
|
+
var newRootBrain = cloneTreeUpdatingDeepestSteps(rootBrain, newSteps);
|
|
462
598
|
return _object_spread_props(_object_spread({}, ctx), {
|
|
463
|
-
|
|
599
|
+
rootBrain: newRootBrain,
|
|
600
|
+
brainStack: treeToStack(newRootBrain),
|
|
464
601
|
currentEvent: {
|
|
465
602
|
type: BRAIN_EVENTS.STEP_STATUS,
|
|
466
603
|
brainRunId: brainRunId,
|
|
@@ -484,7 +621,6 @@ var stepRetry = reduce(function(ctx, param) {
|
|
|
484
621
|
}
|
|
485
622
|
});
|
|
486
623
|
});
|
|
487
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
488
624
|
var passthrough = function(eventType) {
|
|
489
625
|
return reduce(function(ctx, ev) {
|
|
490
626
|
var brainRunId = ctx.brainRunId, options = ctx.options;
|
|
@@ -513,51 +649,26 @@ var isInnerBrain = guard(function(ctx) {
|
|
|
513
649
|
// ============================================================================
|
|
514
650
|
// State Machine Definition
|
|
515
651
|
// ============================================================================
|
|
516
|
-
//
|
|
517
|
-
var
|
|
518
|
-
START_BRAIN: 'startBrain',
|
|
519
|
-
RESTART_BRAIN: 'restartBrain',
|
|
520
|
-
COMPLETE_BRAIN: 'completeBrain',
|
|
521
|
-
ERROR_BRAIN: 'errorBrain',
|
|
522
|
-
CANCEL_BRAIN: 'cancelBrain',
|
|
523
|
-
WEBHOOK: 'webhook',
|
|
524
|
-
WEBHOOK_RESPONSE: 'webhookResponse',
|
|
525
|
-
START_STEP: 'startStep',
|
|
526
|
-
COMPLETE_STEP: 'completeStep',
|
|
527
|
-
STEP_STATUS: 'stepStatus',
|
|
528
|
-
STEP_RETRY: 'stepRetry',
|
|
529
|
-
LOOP_START: 'loopStart',
|
|
530
|
-
LOOP_ITERATION: 'loopIteration',
|
|
531
|
-
LOOP_TOOL_CALL: 'loopToolCall',
|
|
532
|
-
LOOP_TOOL_RESULT: 'loopToolResult',
|
|
533
|
-
LOOP_ASSISTANT_MESSAGE: 'loopAssistantMessage',
|
|
534
|
-
LOOP_COMPLETE: 'loopComplete',
|
|
535
|
-
LOOP_TOKEN_LIMIT: 'loopTokenLimit',
|
|
536
|
-
LOOP_WEBHOOK: 'loopWebhook',
|
|
537
|
-
HEARTBEAT: 'heartbeat'
|
|
538
|
-
};
|
|
539
|
-
export { ACTIONS as BRAIN_ACTIONS };
|
|
540
|
-
// Create machine factory - needs to be called with initial context
|
|
541
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
542
|
-
var createBrainMachine = function(initialContext) {
|
|
652
|
+
// Internal machine factory - called with pre-built context
|
|
653
|
+
var makeBrainMachine = function(initialContext) {
|
|
543
654
|
return createMachine('idle', {
|
|
544
|
-
idle: state(transition(
|
|
655
|
+
idle: state(transition(BRAIN_EVENTS.START, 'running', startBrain), transition(BRAIN_EVENTS.RESTART, 'running', restartBrain)),
|
|
545
656
|
running: state(// Nested brain lifecycle
|
|
546
|
-
transition(
|
|
547
|
-
transition(
|
|
548
|
-
transition(
|
|
549
|
-
transition(
|
|
550
|
-
transition(
|
|
551
|
-
transition(
|
|
552
|
-
transition(
|
|
553
|
-
transition(
|
|
554
|
-
transition(
|
|
555
|
-
paused: state(transition(
|
|
556
|
-
transition(
|
|
657
|
+
transition(BRAIN_EVENTS.START, 'running', startBrain), transition(BRAIN_EVENTS.RESTART, 'running', restartBrain), // Outer brain complete -> terminal
|
|
658
|
+
transition(BRAIN_EVENTS.COMPLETE, 'complete', isOuterBrain, completeBrain), // Inner brain complete -> stay running
|
|
659
|
+
transition(BRAIN_EVENTS.COMPLETE, 'running', isInnerBrain, completeBrain), // Error (only outer brain errors are terminal)
|
|
660
|
+
transition(BRAIN_EVENTS.ERROR, 'error', isOuterBrain, errorBrain), // Cancelled
|
|
661
|
+
transition(BRAIN_EVENTS.CANCELLED, 'cancelled', cancelBrain), // Webhook -> paused
|
|
662
|
+
transition(BRAIN_EVENTS.WEBHOOK, 'paused', webhookPause), // Webhook response (for resume from webhook - machine is already running)
|
|
663
|
+
transition(BRAIN_EVENTS.WEBHOOK_RESPONSE, 'running', webhookResponse), // Step events
|
|
664
|
+
transition(BRAIN_EVENTS.STEP_START, 'running', startStep), transition(BRAIN_EVENTS.STEP_COMPLETE, 'running', completeStep), transition(BRAIN_EVENTS.STEP_STATUS, 'running', stepStatus), transition(BRAIN_EVENTS.STEP_RETRY, 'running', stepRetry), // Loop events (pass-through with event data)
|
|
665
|
+
transition(BRAIN_EVENTS.LOOP_START, 'running', passthrough(BRAIN_EVENTS.LOOP_START)), transition(BRAIN_EVENTS.LOOP_ITERATION, 'running', passthrough(BRAIN_EVENTS.LOOP_ITERATION)), transition(BRAIN_EVENTS.LOOP_TOOL_CALL, 'running', passthrough(BRAIN_EVENTS.LOOP_TOOL_CALL)), transition(BRAIN_EVENTS.LOOP_TOOL_RESULT, 'running', passthrough(BRAIN_EVENTS.LOOP_TOOL_RESULT)), transition(BRAIN_EVENTS.LOOP_ASSISTANT_MESSAGE, 'running', passthrough(BRAIN_EVENTS.LOOP_ASSISTANT_MESSAGE)), transition(BRAIN_EVENTS.LOOP_COMPLETE, 'running', passthrough(BRAIN_EVENTS.LOOP_COMPLETE)), transition(BRAIN_EVENTS.LOOP_TOKEN_LIMIT, 'running', passthrough(BRAIN_EVENTS.LOOP_TOKEN_LIMIT)), transition(BRAIN_EVENTS.LOOP_WEBHOOK, 'running', passthrough(BRAIN_EVENTS.LOOP_WEBHOOK)), transition(BRAIN_EVENTS.HEARTBEAT, 'running', passthrough(BRAIN_EVENTS.HEARTBEAT))),
|
|
666
|
+
paused: state(transition(BRAIN_EVENTS.WEBHOOK_RESPONSE, 'running', webhookResponse), transition(BRAIN_EVENTS.CANCELLED, 'cancelled', cancelBrain), // RESTART happens when resuming from webhook
|
|
667
|
+
transition(BRAIN_EVENTS.RESTART, 'running', restartBrain)),
|
|
557
668
|
// Terminal states - limited outgoing transitions
|
|
558
669
|
complete: state(),
|
|
559
670
|
error: state(// Allow STEP_STATUS after error so we can emit the final step statuses
|
|
560
|
-
transition(
|
|
671
|
+
transition(BRAIN_EVENTS.STEP_STATUS, 'error', stepStatus)),
|
|
561
672
|
cancelled: state()
|
|
562
673
|
}, function() {
|
|
563
674
|
return initialContext;
|
|
@@ -565,89 +676,48 @@ var createBrainMachine = function(initialContext) {
|
|
|
565
676
|
};
|
|
566
677
|
/**
|
|
567
678
|
* Create a new brain execution state machine.
|
|
679
|
+
* Optionally replay events to restore state from history.
|
|
568
680
|
*/ export function createBrainExecutionMachine(options) {
|
|
569
681
|
var initialContext = createInitialContext(options);
|
|
570
|
-
var machine =
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
682
|
+
var machine = makeBrainMachine(initialContext);
|
|
683
|
+
var service = interpret(machine, function() {});
|
|
684
|
+
// Replay events if provided - just send each event directly to the machine
|
|
685
|
+
if (options === null || options === void 0 ? void 0 : options.events) {
|
|
686
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
687
|
+
try {
|
|
688
|
+
for(var _iterator = options.events[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
689
|
+
var event = _step.value;
|
|
690
|
+
service.send(event);
|
|
691
|
+
}
|
|
692
|
+
} catch (err) {
|
|
693
|
+
_didIteratorError = true;
|
|
694
|
+
_iteratorError = err;
|
|
695
|
+
} finally{
|
|
696
|
+
try {
|
|
697
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
698
|
+
_iterator.return();
|
|
699
|
+
}
|
|
700
|
+
} finally{
|
|
701
|
+
if (_didIteratorError) {
|
|
702
|
+
throw _iteratorError;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
return service;
|
|
580
708
|
}
|
|
581
709
|
/**
|
|
582
|
-
*
|
|
583
|
-
*
|
|
584
|
-
*/
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
var eventToAction = (_obj = {}, _define_property(_obj, BRAIN_EVENTS.START, ACTIONS.START_BRAIN), _define_property(_obj, BRAIN_EVENTS.RESTART, ACTIONS.RESTART_BRAIN), _define_property(_obj, BRAIN_EVENTS.COMPLETE, ACTIONS.COMPLETE_BRAIN), _define_property(_obj, BRAIN_EVENTS.ERROR, ACTIONS.ERROR_BRAIN), _define_property(_obj, BRAIN_EVENTS.CANCELLED, ACTIONS.CANCEL_BRAIN), _define_property(_obj, BRAIN_EVENTS.WEBHOOK, ACTIONS.WEBHOOK), _define_property(_obj, BRAIN_EVENTS.WEBHOOK_RESPONSE, ACTIONS.WEBHOOK_RESPONSE), _define_property(_obj, BRAIN_EVENTS.STEP_START, ACTIONS.START_STEP), _define_property(_obj, BRAIN_EVENTS.STEP_COMPLETE, ACTIONS.COMPLETE_STEP), _define_property(_obj, BRAIN_EVENTS.STEP_STATUS, ACTIONS.STEP_STATUS), _define_property(_obj, BRAIN_EVENTS.STEP_RETRY, ACTIONS.STEP_RETRY), _define_property(_obj, BRAIN_EVENTS.LOOP_START, ACTIONS.LOOP_START), _define_property(_obj, BRAIN_EVENTS.LOOP_ITERATION, ACTIONS.LOOP_ITERATION), _define_property(_obj, BRAIN_EVENTS.LOOP_TOOL_CALL, ACTIONS.LOOP_TOOL_CALL), _define_property(_obj, BRAIN_EVENTS.LOOP_TOOL_RESULT, ACTIONS.LOOP_TOOL_RESULT), _define_property(_obj, BRAIN_EVENTS.LOOP_ASSISTANT_MESSAGE, ACTIONS.LOOP_ASSISTANT_MESSAGE), _define_property(_obj, BRAIN_EVENTS.LOOP_COMPLETE, ACTIONS.LOOP_COMPLETE), _define_property(_obj, BRAIN_EVENTS.LOOP_TOKEN_LIMIT, ACTIONS.LOOP_TOKEN_LIMIT), _define_property(_obj, BRAIN_EVENTS.LOOP_WEBHOOK, ACTIONS.LOOP_WEBHOOK), _define_property(_obj, BRAIN_EVENTS.HEARTBEAT, ACTIONS.HEARTBEAT), _obj);
|
|
588
|
-
var action = eventToAction[event.type];
|
|
589
|
-
if (action) {
|
|
590
|
-
var payload = extractPayloadFromEvent(event);
|
|
591
|
-
machine.send(_object_spread({
|
|
592
|
-
type: action
|
|
593
|
-
}, payload));
|
|
594
|
-
}
|
|
710
|
+
* Create an uninterpreted brain execution machine.
|
|
711
|
+
* Use with robot3's interpret() or react-robot's useMachine() hook.
|
|
712
|
+
*/ export function createBrainMachine(options) {
|
|
713
|
+
var initialContext = createInitialContext(options);
|
|
714
|
+
return makeBrainMachine(initialContext);
|
|
595
715
|
}
|
|
596
716
|
/**
|
|
597
|
-
*
|
|
598
|
-
|
|
599
|
-
function
|
|
600
|
-
|
|
601
|
-
case BRAIN_EVENTS.START:
|
|
602
|
-
case BRAIN_EVENTS.RESTART:
|
|
603
|
-
return {
|
|
604
|
-
brainRunId: event.brainRunId,
|
|
605
|
-
brainTitle: event.brainTitle,
|
|
606
|
-
brainDescription: event.brainDescription,
|
|
607
|
-
initialState: event.initialState
|
|
608
|
-
};
|
|
609
|
-
case BRAIN_EVENTS.STEP_START:
|
|
610
|
-
return {
|
|
611
|
-
stepId: event.stepId,
|
|
612
|
-
stepTitle: event.stepTitle
|
|
613
|
-
};
|
|
614
|
-
case BRAIN_EVENTS.STEP_COMPLETE:
|
|
615
|
-
return {
|
|
616
|
-
stepId: event.stepId,
|
|
617
|
-
stepTitle: event.stepTitle,
|
|
618
|
-
patch: event.patch
|
|
619
|
-
};
|
|
620
|
-
case BRAIN_EVENTS.ERROR:
|
|
621
|
-
return {
|
|
622
|
-
error: event.error
|
|
623
|
-
};
|
|
624
|
-
case BRAIN_EVENTS.WEBHOOK:
|
|
625
|
-
return {
|
|
626
|
-
waitFor: event.waitFor
|
|
627
|
-
};
|
|
628
|
-
case BRAIN_EVENTS.WEBHOOK_RESPONSE:
|
|
629
|
-
return {
|
|
630
|
-
response: event.response
|
|
631
|
-
};
|
|
632
|
-
case BRAIN_EVENTS.STEP_STATUS:
|
|
633
|
-
return {
|
|
634
|
-
brainRunId: event.brainRunId,
|
|
635
|
-
steps: event.steps
|
|
636
|
-
};
|
|
637
|
-
case BRAIN_EVENTS.STEP_RETRY:
|
|
638
|
-
return {
|
|
639
|
-
stepId: event.stepId,
|
|
640
|
-
stepTitle: event.stepTitle,
|
|
641
|
-
error: event.error,
|
|
642
|
-
attempt: event.attempt
|
|
643
|
-
};
|
|
644
|
-
default:
|
|
645
|
-
// For pass-through events, pass all properties except type
|
|
646
|
-
var type = event.type, rest = _object_without_properties(event, [
|
|
647
|
-
"type"
|
|
648
|
-
]);
|
|
649
|
-
return rest;
|
|
650
|
-
}
|
|
717
|
+
* Send an event to the machine.
|
|
718
|
+
* The machine transitions use BRAIN_EVENTS types directly, so just pass the event through.
|
|
719
|
+
*/ export function sendEvent(machine, event) {
|
|
720
|
+
machine.send(event);
|
|
651
721
|
}
|
|
652
722
|
// ============================================================================
|
|
653
723
|
// Query Helpers (kept for backwards compatibility, but context is now preferred)
|
|
@@ -659,11 +729,11 @@ export function isTopLevel(machine) {
|
|
|
659
729
|
return machine.context.isTopLevel;
|
|
660
730
|
}
|
|
661
731
|
export function getCurrentStep(machine) {
|
|
662
|
-
var _machine_context = machine.context,
|
|
663
|
-
if (
|
|
664
|
-
var currentBrain =
|
|
732
|
+
var _machine_context = machine.context, rootBrain = _machine_context.rootBrain, currentStepId = _machine_context.currentStepId;
|
|
733
|
+
if (!rootBrain || !currentStepId) return null;
|
|
734
|
+
var currentBrain = getDeepestBrain(rootBrain);
|
|
665
735
|
var _currentBrain_steps_find;
|
|
666
|
-
return (_currentBrain_steps_find = currentBrain.steps.find(function(s) {
|
|
736
|
+
return (_currentBrain_steps_find = currentBrain === null || currentBrain === void 0 ? void 0 : currentBrain.steps.find(function(s) {
|
|
667
737
|
return s.id === currentStepId;
|
|
668
738
|
})) !== null && _currentBrain_steps_find !== void 0 ? _currentBrain_steps_find : null;
|
|
669
739
|
}
|
|
@@ -684,42 +754,36 @@ export function getError(machine) {
|
|
|
684
754
|
}
|
|
685
755
|
/**
|
|
686
756
|
* Get the completed steps from the state machine in the format needed for resume.
|
|
687
|
-
* This reconstructs the nested step hierarchy from the brain
|
|
757
|
+
* This reconstructs the nested step hierarchy from the brain tree.
|
|
688
758
|
* Returns a deep copy to avoid mutating the state machine's context.
|
|
689
759
|
*/ export function getCompletedSteps(machine) {
|
|
690
|
-
var
|
|
691
|
-
if (
|
|
760
|
+
var rootBrain = machine.context.rootBrain;
|
|
761
|
+
if (!rootBrain) {
|
|
692
762
|
return [];
|
|
693
763
|
}
|
|
694
|
-
// Deep copy the steps
|
|
764
|
+
// Deep copy the steps, including any innerBrain's steps attached to parent step
|
|
695
765
|
var copyStep = function(step) {
|
|
696
766
|
var _step_innerSteps;
|
|
697
767
|
return _object_spread_props(_object_spread({}, step), {
|
|
698
768
|
innerSteps: (_step_innerSteps = step.innerSteps) === null || _step_innerSteps === void 0 ? void 0 : _step_innerSteps.map(copyStep)
|
|
699
769
|
});
|
|
700
770
|
};
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
// Find the parent step (the one that started this inner brain)
|
|
715
|
-
var parentStep = parentBrain.steps.find(function(s) {
|
|
716
|
-
return s.id === innerBrain.parentStepId;
|
|
717
|
-
});
|
|
718
|
-
if (parentStep) {
|
|
719
|
-
parentStep.innerSteps = innerBrain.steps;
|
|
771
|
+
// Recursively build steps from the brain tree
|
|
772
|
+
var copyBrainSteps = function(brain) {
|
|
773
|
+
var steps = brain.steps.map(copyStep);
|
|
774
|
+
// If there's a running inner brain, attach its steps to the parent step
|
|
775
|
+
if (brain.innerBrain) {
|
|
776
|
+
var parentStepId = brain.innerBrain.parentStepId;
|
|
777
|
+
if (parentStepId) {
|
|
778
|
+
var parentStep = steps.find(function(s) {
|
|
779
|
+
return s.id === parentStepId;
|
|
780
|
+
});
|
|
781
|
+
if (parentStep) {
|
|
782
|
+
parentStep.innerSteps = copyBrainSteps(brain.innerBrain);
|
|
783
|
+
}
|
|
720
784
|
}
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
}
|
|
724
|
-
return
|
|
785
|
+
}
|
|
786
|
+
return steps;
|
|
787
|
+
};
|
|
788
|
+
return copyBrainSteps(rootBrain);
|
|
725
789
|
}
|
package/dist/src/index.js
CHANGED
|
@@ -12,4 +12,4 @@ export { createWebhook } from './dsl/webhook.js';
|
|
|
12
12
|
export { RESOURCE_TYPES } from './resources/resources.js';
|
|
13
13
|
export { reconstructLoopContext } from './dsl/loop-messages.js';
|
|
14
14
|
// Brain state machine
|
|
15
|
-
export { createBrainExecutionMachine,
|
|
15
|
+
export { createBrainExecutionMachine, createBrainMachine, sendEvent, getDepth, isTopLevel, getCurrentStep, getBrainStack, getBrainRunId, getExecutionState, getPendingWebhooks, getError, getCompletedSteps } from './dsl/brain-state-machine.js';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as robot3 from 'robot3';
|
|
1
2
|
import { STATUS } from './constants.js';
|
|
2
3
|
import type { JsonPatch, JsonObject } from './types.js';
|
|
3
4
|
export interface BrainStackEntry {
|
|
@@ -7,6 +8,19 @@ export interface BrainStackEntry {
|
|
|
7
8
|
parentStepId: string | null;
|
|
8
9
|
steps: StepInfo[];
|
|
9
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Represents a running brain in a nested tree structure.
|
|
13
|
+
* Each brain can have at most one inner brain running at a time.
|
|
14
|
+
*/
|
|
15
|
+
export interface RunningBrain {
|
|
16
|
+
brainRunId: string;
|
|
17
|
+
brainTitle: string;
|
|
18
|
+
brainDescription?: string;
|
|
19
|
+
parentStepId: string | null;
|
|
20
|
+
steps: StepInfo[];
|
|
21
|
+
innerBrain: RunningBrain | null;
|
|
22
|
+
depth: number;
|
|
23
|
+
}
|
|
10
24
|
export interface StepInfo {
|
|
11
25
|
id: string;
|
|
12
26
|
title: string;
|
|
@@ -30,6 +44,7 @@ export interface BrainEvent {
|
|
|
30
44
|
[key: string]: unknown;
|
|
31
45
|
}
|
|
32
46
|
export interface BrainExecutionContext {
|
|
47
|
+
rootBrain: RunningBrain | null;
|
|
33
48
|
brainStack: BrainStackEntry[];
|
|
34
49
|
depth: number;
|
|
35
50
|
brainRunId: string | null;
|
|
@@ -40,6 +55,7 @@ export interface BrainExecutionContext {
|
|
|
40
55
|
currentState: JsonObject;
|
|
41
56
|
currentEvent: BrainEvent | null;
|
|
42
57
|
options: JsonObject;
|
|
58
|
+
status: (typeof STATUS)[keyof typeof STATUS];
|
|
43
59
|
isTopLevel: boolean;
|
|
44
60
|
isRunning: boolean;
|
|
45
61
|
isComplete: boolean;
|
|
@@ -87,30 +103,11 @@ export interface StepRetryPayload {
|
|
|
87
103
|
export interface CreateMachineOptions {
|
|
88
104
|
initialState?: JsonObject;
|
|
89
105
|
options?: JsonObject;
|
|
106
|
+
/** Events to replay through the machine to restore state */
|
|
107
|
+
events?: Array<{
|
|
108
|
+
type: string;
|
|
109
|
+
} & Record<string, unknown>>;
|
|
90
110
|
}
|
|
91
|
-
declare const ACTIONS: {
|
|
92
|
-
readonly START_BRAIN: "startBrain";
|
|
93
|
-
readonly RESTART_BRAIN: "restartBrain";
|
|
94
|
-
readonly COMPLETE_BRAIN: "completeBrain";
|
|
95
|
-
readonly ERROR_BRAIN: "errorBrain";
|
|
96
|
-
readonly CANCEL_BRAIN: "cancelBrain";
|
|
97
|
-
readonly WEBHOOK: "webhook";
|
|
98
|
-
readonly WEBHOOK_RESPONSE: "webhookResponse";
|
|
99
|
-
readonly START_STEP: "startStep";
|
|
100
|
-
readonly COMPLETE_STEP: "completeStep";
|
|
101
|
-
readonly STEP_STATUS: "stepStatus";
|
|
102
|
-
readonly STEP_RETRY: "stepRetry";
|
|
103
|
-
readonly LOOP_START: "loopStart";
|
|
104
|
-
readonly LOOP_ITERATION: "loopIteration";
|
|
105
|
-
readonly LOOP_TOOL_CALL: "loopToolCall";
|
|
106
|
-
readonly LOOP_TOOL_RESULT: "loopToolResult";
|
|
107
|
-
readonly LOOP_ASSISTANT_MESSAGE: "loopAssistantMessage";
|
|
108
|
-
readonly LOOP_COMPLETE: "loopComplete";
|
|
109
|
-
readonly LOOP_TOKEN_LIMIT: "loopTokenLimit";
|
|
110
|
-
readonly LOOP_WEBHOOK: "loopWebhook";
|
|
111
|
-
readonly HEARTBEAT: "heartbeat";
|
|
112
|
-
};
|
|
113
|
-
export { ACTIONS as BRAIN_ACTIONS };
|
|
114
111
|
export interface BrainStateMachine {
|
|
115
112
|
machine: {
|
|
116
113
|
current: string;
|
|
@@ -124,16 +121,31 @@ export interface BrainStateMachine {
|
|
|
124
121
|
}
|
|
125
122
|
/**
|
|
126
123
|
* Create a new brain execution state machine.
|
|
124
|
+
* Optionally replay events to restore state from history.
|
|
127
125
|
*/
|
|
128
126
|
export declare function createBrainExecutionMachine(options?: CreateMachineOptions): BrainStateMachine;
|
|
129
127
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
128
|
+
* Create an uninterpreted brain execution machine.
|
|
129
|
+
* Use with robot3's interpret() or react-robot's useMachine() hook.
|
|
132
130
|
*/
|
|
133
|
-
export declare function
|
|
131
|
+
export declare function createBrainMachine(options?: CreateMachineOptions): robot3.Machine<{
|
|
132
|
+
idle: robot3.MachineState<string>;
|
|
133
|
+
running: robot3.MachineState<string>;
|
|
134
|
+
paused: robot3.MachineState<string>;
|
|
135
|
+
complete: robot3.MachineState<any>;
|
|
136
|
+
error: robot3.MachineState<string>;
|
|
137
|
+
cancelled: robot3.MachineState<any>;
|
|
138
|
+
}, BrainExecutionContext, robot3.AllStateKeys<{
|
|
139
|
+
idle: robot3.MachineState<string>;
|
|
140
|
+
running: robot3.MachineState<string>;
|
|
141
|
+
paused: robot3.MachineState<string>;
|
|
142
|
+
complete: robot3.MachineState<any>;
|
|
143
|
+
error: robot3.MachineState<string>;
|
|
144
|
+
cancelled: robot3.MachineState<any>;
|
|
145
|
+
}>, string>;
|
|
134
146
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
147
|
+
* Send an event to the machine.
|
|
148
|
+
* The machine transitions use BRAIN_EVENTS types directly, so just pass the event through.
|
|
137
149
|
*/
|
|
138
150
|
export declare function sendEvent(machine: BrainStateMachine, event: {
|
|
139
151
|
type: string;
|
|
@@ -148,7 +160,7 @@ export declare function getPendingWebhooks(machine: BrainStateMachine): WebhookR
|
|
|
148
160
|
export declare function getError(machine: BrainStateMachine): SerializedError | null;
|
|
149
161
|
/**
|
|
150
162
|
* Get the completed steps from the state machine in the format needed for resume.
|
|
151
|
-
* This reconstructs the nested step hierarchy from the brain
|
|
163
|
+
* This reconstructs the nested step hierarchy from the brain tree.
|
|
152
164
|
* Returns a deep copy to avoid mutating the state machine's context.
|
|
153
165
|
*/
|
|
154
166
|
export declare function getCompletedSteps(machine: BrainStateMachine): StepInfo[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain-state-machine.d.ts","sourceRoot":"","sources":["../../../src/dsl/brain-state-machine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"brain-state-machine.d.ts","sourceRoot":"","sources":["../../../src/dsl/brain-state-machine.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -17,6 +17,6 @@ export { RESOURCE_TYPES } from './resources/resources.js';
|
|
|
17
17
|
export type { LoopStartEvent, LoopIterationEvent, LoopToolCallEvent, LoopToolResultEvent, LoopAssistantMessageEvent, LoopCompleteEvent, LoopTokenLimitEvent, LoopWebhookEvent, WebhookResponseEvent, HeartbeatEvent, } from './dsl/brain.js';
|
|
18
18
|
export type { LoopResumeContext } from './dsl/loop-messages.js';
|
|
19
19
|
export { reconstructLoopContext } from './dsl/loop-messages.js';
|
|
20
|
-
export { createBrainExecutionMachine,
|
|
21
|
-
export type { BrainStateMachine, BrainExecutionContext, BrainStackEntry, StepInfo, ExecutionState, CreateMachineOptions, } from './dsl/brain-state-machine.js';
|
|
20
|
+
export { createBrainExecutionMachine, createBrainMachine, sendEvent, getDepth, isTopLevel, getCurrentStep, getBrainStack, getBrainRunId, getExecutionState, getPendingWebhooks, getError, getCompletedSteps, } from './dsl/brain-state-machine.js';
|
|
21
|
+
export type { BrainStateMachine, BrainExecutionContext, BrainStackEntry, RunningBrain, StepInfo, ExecutionState, CreateMachineOptions, } from './dsl/brain-state-machine.js';
|
|
22
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EACV,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EACV,KAAK,EACL,UAAU,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,WAAW,EACX,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMhE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,YAAY,EACV,QAAQ,IAAI,gBAAgB,EAC5B,KAAK,IAAI,aAAa,EACtB,YAAY,GACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EACL,2BAA2B,EAC3B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EACV,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EACV,KAAK,EACL,UAAU,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,WAAW,EACX,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMhE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,YAAY,EACV,QAAQ,IAAI,gBAAgB,EAC5B,KAAK,IAAI,aAAa,EACtB,YAAY,GACb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,SAAS,EACT,QAAQ,EACR,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,oBAAoB,GACrB,MAAM,8BAA8B,CAAC"}
|