@positronic/core 0.0.46 → 0.0.47

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.
@@ -273,9 +273,10 @@ function _ts_values(o) {
273
273
  };
274
274
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
275
275
  }
276
- import { BRAIN_EVENTS, STATUS } from './constants.js';
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, sendAction, BRAIN_ACTIONS } from './brain-state-machine.js';
279
280
  import { DEFAULT_ENV } from './brain.js';
280
281
  export var BrainRunner = /*#__PURE__*/ function() {
281
282
  "use strict";
@@ -330,7 +331,7 @@ export var BrainRunner = /*#__PURE__*/ function() {
330
331
  key: "run",
331
332
  value: function run(_0) {
332
333
  return _async_to_generator(function(brain) {
333
- var _ref, _ref_initialState, initialState, options, initialCompletedSteps, brainRunId, endAfter, signal, response, loopEvents, _this_options, adapters, client, resources, pages, env, resolvedEnv, currentState, stepNumber, brainDepth, loopResumeContext, brainRun, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step, _ret, err, error, cancelledEvent;
334
+ var _ref, _ref_initialState, initialState, options, initialCompletedSteps, brainRunId, endAfter, signal, response, loopEvents, _this_options, adapters, client, resources, pages, env, resolvedEnv, machineInitialState, initialStepCount, machine, loopResumeContext, brainRun, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step, _ret, err, error, cancelledEvent;
334
335
  var _arguments = arguments;
335
336
  return _ts_generator(this, function(_state) {
336
337
  switch(_state.label){
@@ -338,25 +339,23 @@ export var BrainRunner = /*#__PURE__*/ function() {
338
339
  _ref = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {}, _ref_initialState = _ref.initialState, initialState = _ref_initialState === void 0 ? {} : _ref_initialState, options = _ref.options, initialCompletedSteps = _ref.initialCompletedSteps, brainRunId = _ref.brainRunId, endAfter = _ref.endAfter, signal = _ref.signal, response = _ref.response, loopEvents = _ref.loopEvents;
339
340
  _this_options = this.options, adapters = _this_options.adapters, client = _this_options.client, resources = _this_options.resources, pages = _this_options.pages, env = _this_options.env;
340
341
  resolvedEnv = env !== null && env !== void 0 ? env : DEFAULT_ENV;
341
- currentState = initialState !== null && initialState !== void 0 ? initialState : {};
342
- stepNumber = 1;
343
- // Apply any patches from completed steps
344
- // to the initial state so that the brain
345
- // starts with a state that reflects all of the completed steps.
346
- // Need to do this when a brain is restarted with completed steps.
347
- // Note: Only apply top-level step patches, not innerSteps patches
348
- // (inner brain patches are applied to inner brain state, not outer brain state)
342
+ // Apply any patches from completed steps to get the initial state
343
+ // for the state machine. The machine will then track all subsequent state changes.
344
+ machineInitialState = initialState !== null && initialState !== void 0 ? initialState : {};
345
+ initialStepCount = 0;
349
346
  initialCompletedSteps === null || initialCompletedSteps === void 0 ? void 0 : initialCompletedSteps.forEach(function(step) {
350
347
  if (step.patch) {
351
- currentState = applyPatches(currentState, [
348
+ machineInitialState = applyPatches(machineInitialState, [
352
349
  step.patch
353
350
  ]);
354
- stepNumber++;
351
+ initialStepCount++;
355
352
  }
356
353
  });
357
- // Track brain nesting depth to know which STEP_COMPLETE events
358
- // belong to the top-level brain vs inner brains
359
- brainDepth = 0;
354
+ // Create state machine with pre-populated state
355
+ // The machine tracks: currentState, isTopLevel, topLevelStepCount, etc.
356
+ machine = createBrainExecutionMachine({
357
+ initialState: machineInitialState
358
+ });
360
359
  // If loopEvents and response are provided, reconstruct loop context
361
360
  loopResumeContext = loopEvents && response ? reconstructLoopContext(loopEvents, response) : null;
362
361
  brainRun = brainRunId && initialCompletedSteps ? brain.run({
@@ -397,7 +396,7 @@ export var BrainRunner = /*#__PURE__*/ function() {
397
396
  14
398
397
  ]);
399
398
  _loop = function() {
400
- var _value, event, cancelledEvent;
399
+ var _value, event, cancelledEvent, totalSteps;
401
400
  return _ts_generator(this, function(_state) {
402
401
  switch(_state.label){
403
402
  case 0:
@@ -407,15 +406,9 @@ export var BrainRunner = /*#__PURE__*/ function() {
407
406
  3,
408
407
  2
409
408
  ];
410
- // Emit a cancelled event
411
- cancelledEvent = {
412
- type: BRAIN_EVENTS.CANCELLED,
413
- status: STATUS.CANCELLED,
414
- brainTitle: brain.title,
415
- brainDescription: brain.structure.description,
416
- brainRunId: brainRunId || event.brainRunId,
417
- options: event.options
418
- };
409
+ // Use state machine to create cancelled event
410
+ sendAction(machine, BRAIN_ACTIONS.CANCEL_BRAIN, {});
411
+ cancelledEvent = machine.context.currentEvent;
419
412
  return [
420
413
  4,
421
414
  Promise.all(adapters.map(function(adapter) {
@@ -424,17 +417,16 @@ export var BrainRunner = /*#__PURE__*/ function() {
424
417
  ];
425
418
  case 1:
426
419
  _state.sent();
420
+ // Cast is safe: state started as TState and patches maintain the structure
427
421
  return [
428
422
  2,
429
423
  {
430
- v: currentState
424
+ v: machine.context.currentState
431
425
  }
432
426
  ];
433
427
  case 2:
434
- // Track brain nesting depth - START/RESTART increases, COMPLETE decreases
435
- if (event.type === BRAIN_EVENTS.START || event.type === BRAIN_EVENTS.RESTART) {
436
- brainDepth++;
437
- }
428
+ // Feed event to state machine - this updates currentState, isTopLevel, stepCount, etc.
429
+ sendEvent(machine, event);
438
430
  // Dispatch event to all adapters
439
431
  return [
440
432
  4,
@@ -444,38 +436,28 @@ export var BrainRunner = /*#__PURE__*/ function() {
444
436
  ];
445
437
  case 3:
446
438
  _state.sent();
447
- // Update current state when steps complete
448
- // Only apply patches from top-level brain (depth === 1)
449
- // Inner brain patches are applied to inner brain state within brain.ts
450
- if (event.type === BRAIN_EVENTS.STEP_COMPLETE) {
451
- if (event.patch && brainDepth === 1) {
452
- currentState = applyPatches(currentState, [
453
- event.patch
454
- ]);
455
- }
456
- // Check if we should stop after this step (only for top-level steps)
457
- if (brainDepth === 1 && endAfter && stepNumber >= endAfter) {
439
+ // Check if we should stop after this step (only for top-level steps)
440
+ // The machine's topLevelStepCount tracks steps since this run started,
441
+ // so we add initialStepCount to get the total step count.
442
+ if (event.type === BRAIN_EVENTS.STEP_COMPLETE && machine.context.isTopLevel) {
443
+ totalSteps = machine.context.topLevelStepCount + initialStepCount;
444
+ if (endAfter && totalSteps >= endAfter) {
445
+ // Cast is safe: state started as TState and patches maintain the structure
458
446
  return [
459
447
  2,
460
448
  {
461
- v: currentState
449
+ v: machine.context.currentState
462
450
  }
463
451
  ];
464
452
  }
465
- if (brainDepth === 1) {
466
- stepNumber++;
467
- }
468
- }
469
- // Track brain completion - decreases nesting depth
470
- if (event.type === BRAIN_EVENTS.COMPLETE) {
471
- brainDepth--;
472
453
  }
473
- // Stop execution when webhook event is encountered
474
- if (event.type === BRAIN_EVENTS.WEBHOOK) {
454
+ // Stop execution when machine enters paused state (webhook)
455
+ if (machine.context.isPaused) {
456
+ // Cast is safe: state started as TState and patches maintain the structure
475
457
  return [
476
458
  2,
477
459
  {
478
- v: currentState
460
+ v: machine.context.currentState
479
461
  }
480
462
  ];
481
463
  }
@@ -572,14 +554,8 @@ export var BrainRunner = /*#__PURE__*/ function() {
572
554
  3,
573
555
  17
574
556
  ];
575
- cancelledEvent = {
576
- type: BRAIN_EVENTS.CANCELLED,
577
- status: STATUS.CANCELLED,
578
- brainTitle: brain.title,
579
- brainDescription: brain.structure.description,
580
- brainRunId: brainRunId || '',
581
- options: options || {}
582
- };
557
+ sendAction(machine, BRAIN_ACTIONS.CANCEL_BRAIN, {});
558
+ cancelledEvent = machine.context.currentEvent;
583
559
  return [
584
560
  4,
585
561
  Promise.all(adapters.map(function(adapter) {
@@ -588,16 +564,18 @@ export var BrainRunner = /*#__PURE__*/ function() {
588
564
  ];
589
565
  case 16:
590
566
  _state.sent();
567
+ // Cast is safe: state started as TState and patches maintain the structure
591
568
  return [
592
569
  2,
593
- currentState
570
+ machine.context.currentState
594
571
  ];
595
572
  case 17:
596
573
  throw error;
597
574
  case 18:
575
+ // Cast is safe: state started as TState and patches maintain the structure
598
576
  return [
599
577
  2,
600
- currentState
578
+ machine.context.currentState
601
579
  ];
602
580
  }
603
581
  });
@@ -0,0 +1,663 @@
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _array_without_holes(arr) {
7
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
8
+ }
9
+ function _define_property(obj, key, value) {
10
+ if (key in obj) {
11
+ Object.defineProperty(obj, key, {
12
+ value: value,
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true
16
+ });
17
+ } else {
18
+ obj[key] = value;
19
+ }
20
+ return obj;
21
+ }
22
+ function _iterable_to_array(iter) {
23
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
24
+ }
25
+ function _non_iterable_spread() {
26
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
27
+ }
28
+ function _object_spread(target) {
29
+ for(var i = 1; i < arguments.length; i++){
30
+ var source = arguments[i] != null ? arguments[i] : {};
31
+ var ownKeys = Object.keys(source);
32
+ if (typeof Object.getOwnPropertySymbols === "function") {
33
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
34
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
35
+ }));
36
+ }
37
+ ownKeys.forEach(function(key) {
38
+ _define_property(target, key, source[key]);
39
+ });
40
+ }
41
+ return target;
42
+ }
43
+ function ownKeys(object, enumerableOnly) {
44
+ var keys = Object.keys(object);
45
+ if (Object.getOwnPropertySymbols) {
46
+ var symbols = Object.getOwnPropertySymbols(object);
47
+ if (enumerableOnly) {
48
+ symbols = symbols.filter(function(sym) {
49
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
50
+ });
51
+ }
52
+ keys.push.apply(keys, symbols);
53
+ }
54
+ return keys;
55
+ }
56
+ function _object_spread_props(target, source) {
57
+ source = source != null ? source : {};
58
+ if (Object.getOwnPropertyDescriptors) {
59
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
60
+ } else {
61
+ ownKeys(Object(source)).forEach(function(key) {
62
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
63
+ });
64
+ }
65
+ return target;
66
+ }
67
+ function _object_without_properties(source, excluded) {
68
+ if (source == null) return {};
69
+ var target = _object_without_properties_loose(source, excluded);
70
+ var key, i;
71
+ if (Object.getOwnPropertySymbols) {
72
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
73
+ for(i = 0; i < sourceSymbolKeys.length; i++){
74
+ key = sourceSymbolKeys[i];
75
+ if (excluded.indexOf(key) >= 0) continue;
76
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
77
+ target[key] = source[key];
78
+ }
79
+ }
80
+ return target;
81
+ }
82
+ function _object_without_properties_loose(source, excluded) {
83
+ if (source == null) return {};
84
+ var target = {};
85
+ var sourceKeys = Object.keys(source);
86
+ var key, i;
87
+ for(i = 0; i < sourceKeys.length; i++){
88
+ key = sourceKeys[i];
89
+ if (excluded.indexOf(key) >= 0) continue;
90
+ target[key] = source[key];
91
+ }
92
+ return target;
93
+ }
94
+ function _to_consumable_array(arr) {
95
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
96
+ }
97
+ function _unsupported_iterable_to_array(o, minLen) {
98
+ if (!o) return;
99
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
100
+ var n = Object.prototype.toString.call(o).slice(8, -1);
101
+ if (n === "Object" && o.constructor) n = o.constructor.name;
102
+ if (n === "Map" || n === "Set") return Array.from(n);
103
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
104
+ }
105
+ import { createMachine, state, transition, reduce, guard, interpret } from 'robot3';
106
+ import { BRAIN_EVENTS, STATUS } from './constants.js';
107
+ import { applyPatches } from './json-patch.js';
108
+ var createInitialContext = function(opts) {
109
+ var _opts_initialState, _opts_options;
110
+ return {
111
+ brainStack: [],
112
+ depth: 0,
113
+ brainRunId: null,
114
+ currentStepId: null,
115
+ currentStepTitle: null,
116
+ error: null,
117
+ pendingWebhooks: null,
118
+ currentState: (_opts_initialState = opts === null || opts === void 0 ? void 0 : opts.initialState) !== null && _opts_initialState !== void 0 ? _opts_initialState : {},
119
+ currentEvent: null,
120
+ options: (_opts_options = opts === null || opts === void 0 ? void 0 : opts.options) !== null && _opts_options !== void 0 ? _opts_options : {},
121
+ isTopLevel: false,
122
+ isRunning: false,
123
+ isComplete: false,
124
+ isPaused: false,
125
+ isError: false,
126
+ isCancelled: false,
127
+ topLevelStepCount: 0
128
+ };
129
+ };
130
+ // ============================================================================
131
+ // Helper to update derived state
132
+ // ============================================================================
133
+ var updateDerivedState = function(ctx, executionState) {
134
+ return _object_spread_props(_object_spread({}, ctx), {
135
+ isTopLevel: ctx.depth === 1,
136
+ isRunning: executionState === 'running',
137
+ isComplete: executionState === 'complete',
138
+ isPaused: executionState === 'paused',
139
+ isError: executionState === 'error',
140
+ isCancelled: executionState === 'cancelled'
141
+ });
142
+ };
143
+ // ============================================================================
144
+ // Reducers - Update context on transitions
145
+ // ============================================================================
146
+ var startBrain = reduce(function(ctx, param) {
147
+ var brainRunId = param.brainRunId, brainTitle = param.brainTitle, brainDescription = param.brainDescription, initialState = param.initialState;
148
+ var currentStepId = ctx.currentStepId, brainStack = ctx.brainStack, depth = ctx.depth, existingBrainRunId = ctx.brainRunId, currentState = ctx.currentState, options = ctx.options;
149
+ var newEntry = {
150
+ brainRunId: brainRunId,
151
+ brainTitle: brainTitle,
152
+ brainDescription: brainDescription,
153
+ parentStepId: currentStepId,
154
+ steps: []
155
+ };
156
+ var newDepth = depth + 1;
157
+ var newCtx = _object_spread_props(_object_spread({}, ctx), {
158
+ brainStack: _to_consumable_array(brainStack).concat([
159
+ newEntry
160
+ ]),
161
+ depth: newDepth,
162
+ brainRunId: existingBrainRunId !== null && existingBrainRunId !== void 0 ? existingBrainRunId : brainRunId,
163
+ currentState: newDepth === 1 ? initialState !== null && initialState !== void 0 ? initialState : currentState : currentState,
164
+ currentEvent: {
165
+ type: BRAIN_EVENTS.START,
166
+ brainTitle: brainTitle,
167
+ brainDescription: brainDescription,
168
+ brainRunId: brainRunId,
169
+ initialState: initialState !== null && initialState !== void 0 ? initialState : {},
170
+ status: STATUS.RUNNING,
171
+ options: options
172
+ }
173
+ });
174
+ return updateDerivedState(newCtx, 'running');
175
+ });
176
+ var restartBrain = reduce(function(ctx, param) {
177
+ var brainRunId = param.brainRunId, brainTitle = param.brainTitle, brainDescription = param.brainDescription, initialState = param.initialState;
178
+ var currentStepId = ctx.currentStepId, brainStack = ctx.brainStack, depth = ctx.depth, existingBrainRunId = ctx.brainRunId, options = ctx.options;
179
+ var newEntry = {
180
+ brainRunId: brainRunId,
181
+ brainTitle: brainTitle,
182
+ brainDescription: brainDescription,
183
+ parentStepId: currentStepId,
184
+ steps: []
185
+ };
186
+ var newDepth = depth + 1;
187
+ var newCtx = _object_spread_props(_object_spread({}, ctx), {
188
+ brainStack: _to_consumable_array(brainStack).concat([
189
+ newEntry
190
+ ]),
191
+ depth: newDepth,
192
+ brainRunId: existingBrainRunId !== null && existingBrainRunId !== void 0 ? existingBrainRunId : brainRunId,
193
+ currentEvent: {
194
+ type: BRAIN_EVENTS.RESTART,
195
+ brainTitle: brainTitle,
196
+ brainDescription: brainDescription,
197
+ brainRunId: brainRunId,
198
+ initialState: initialState !== null && initialState !== void 0 ? initialState : {},
199
+ status: STATUS.RUNNING,
200
+ options: options
201
+ }
202
+ });
203
+ return updateDerivedState(newCtx, 'running');
204
+ });
205
+ var completeBrain = reduce(function(ctx) {
206
+ var brainStack = ctx.brainStack, depth = ctx.depth, brainRunId = ctx.brainRunId, options = ctx.options;
207
+ if (brainStack.length === 0) return ctx;
208
+ var completedBrain = brainStack[brainStack.length - 1];
209
+ var newStack = brainStack.slice(0, -1);
210
+ // Attach completed brain's steps to parent step if nested
211
+ if (newStack.length > 0 && completedBrain.parentStepId) {
212
+ var parentBrain = newStack[newStack.length - 1];
213
+ var parentStep = parentBrain.steps.find(function(s) {
214
+ return s.id === completedBrain.parentStepId;
215
+ });
216
+ if (parentStep) {
217
+ parentStep.innerSteps = completedBrain.steps;
218
+ parentStep.status = STATUS.COMPLETE;
219
+ }
220
+ }
221
+ var newDepth = depth - 1;
222
+ var isNowComplete = newDepth === 0;
223
+ var newCtx = _object_spread_props(_object_spread({}, ctx), {
224
+ brainStack: newStack,
225
+ depth: newDepth,
226
+ currentEvent: {
227
+ type: BRAIN_EVENTS.COMPLETE,
228
+ brainTitle: completedBrain.brainTitle,
229
+ brainDescription: completedBrain.brainDescription,
230
+ brainRunId: brainRunId,
231
+ status: STATUS.COMPLETE,
232
+ options: options
233
+ }
234
+ });
235
+ return updateDerivedState(newCtx, isNowComplete ? 'complete' : 'running');
236
+ });
237
+ var errorBrain = reduce(function(ctx, param) {
238
+ var error = param.error;
239
+ var brainStack = ctx.brainStack, brainRunId = ctx.brainRunId, options = ctx.options;
240
+ var currentBrain = brainStack[brainStack.length - 1];
241
+ var newCtx = _object_spread_props(_object_spread({}, ctx), {
242
+ error: error,
243
+ currentEvent: {
244
+ type: BRAIN_EVENTS.ERROR,
245
+ brainTitle: currentBrain === null || currentBrain === void 0 ? void 0 : currentBrain.brainTitle,
246
+ brainDescription: currentBrain === null || currentBrain === void 0 ? void 0 : currentBrain.brainDescription,
247
+ brainRunId: brainRunId,
248
+ error: error,
249
+ status: STATUS.ERROR,
250
+ options: options
251
+ }
252
+ });
253
+ return updateDerivedState(newCtx, 'error');
254
+ });
255
+ var cancelBrain = reduce(function(ctx) {
256
+ var brainStack = ctx.brainStack, brainRunId = ctx.brainRunId, options = ctx.options;
257
+ var currentBrain = brainStack[brainStack.length - 1];
258
+ var newCtx = _object_spread_props(_object_spread({}, ctx), {
259
+ currentEvent: {
260
+ type: BRAIN_EVENTS.CANCELLED,
261
+ brainTitle: currentBrain === null || currentBrain === void 0 ? void 0 : currentBrain.brainTitle,
262
+ brainDescription: currentBrain === null || currentBrain === void 0 ? void 0 : currentBrain.brainDescription,
263
+ brainRunId: brainRunId,
264
+ status: STATUS.CANCELLED,
265
+ options: options
266
+ }
267
+ });
268
+ return updateDerivedState(newCtx, 'cancelled');
269
+ });
270
+ var startStep = reduce(function(ctx, param) {
271
+ var stepId = param.stepId, stepTitle = param.stepTitle;
272
+ var brainStack = ctx.brainStack, brainRunId = ctx.brainRunId, options = ctx.options;
273
+ // Add step to current brain's steps if not already there
274
+ if (brainStack.length > 0) {
275
+ var currentBrain = brainStack[brainStack.length - 1];
276
+ var existingStep = currentBrain.steps.find(function(s) {
277
+ return s.id === stepId;
278
+ });
279
+ if (!existingStep) {
280
+ currentBrain.steps.push({
281
+ id: stepId,
282
+ title: stepTitle,
283
+ status: STATUS.RUNNING
284
+ });
285
+ } else {
286
+ existingStep.status = STATUS.RUNNING;
287
+ }
288
+ }
289
+ return _object_spread_props(_object_spread({}, ctx), {
290
+ currentStepId: stepId,
291
+ currentStepTitle: stepTitle,
292
+ currentEvent: {
293
+ type: BRAIN_EVENTS.STEP_START,
294
+ brainRunId: brainRunId,
295
+ stepId: stepId,
296
+ stepTitle: stepTitle,
297
+ status: STATUS.RUNNING,
298
+ options: options
299
+ }
300
+ });
301
+ });
302
+ var completeStep = reduce(function(ctx, param) {
303
+ var stepId = param.stepId, stepTitle = param.stepTitle, patch = param.patch;
304
+ var brainStack = ctx.brainStack, depth = ctx.depth, currentState = ctx.currentState, topLevelStepCount = ctx.topLevelStepCount, brainRunId = ctx.brainRunId, options = ctx.options;
305
+ if (brainStack.length > 0) {
306
+ var currentBrain = brainStack[brainStack.length - 1];
307
+ var step = currentBrain.steps.find(function(s) {
308
+ return s.id === stepId;
309
+ });
310
+ if (step) {
311
+ step.status = STATUS.COMPLETE;
312
+ step.patch = patch;
313
+ }
314
+ }
315
+ // Apply patch to currentState only for top-level brain
316
+ var newState = currentState;
317
+ var newStepCount = topLevelStepCount;
318
+ if (depth === 1 && patch) {
319
+ newState = applyPatches(currentState, [
320
+ patch
321
+ ]);
322
+ newStepCount = topLevelStepCount + 1;
323
+ }
324
+ return _object_spread_props(_object_spread({}, ctx), {
325
+ currentState: newState,
326
+ topLevelStepCount: newStepCount,
327
+ currentEvent: {
328
+ type: BRAIN_EVENTS.STEP_COMPLETE,
329
+ brainRunId: brainRunId,
330
+ stepId: stepId,
331
+ stepTitle: stepTitle,
332
+ patch: patch,
333
+ status: STATUS.RUNNING,
334
+ options: options
335
+ }
336
+ });
337
+ });
338
+ var webhookPause = reduce(function(ctx, param) {
339
+ var waitFor = param.waitFor, state = param.state;
340
+ var brainRunId = ctx.brainRunId, currentState = ctx.currentState, options = ctx.options;
341
+ var newCtx = _object_spread_props(_object_spread({}, ctx), {
342
+ pendingWebhooks: waitFor,
343
+ currentEvent: {
344
+ type: BRAIN_EVENTS.WEBHOOK,
345
+ brainRunId: brainRunId,
346
+ waitFor: waitFor,
347
+ state: state !== null && state !== void 0 ? state : currentState,
348
+ options: options
349
+ }
350
+ });
351
+ return updateDerivedState(newCtx, 'paused');
352
+ });
353
+ var webhookResponse = reduce(function(ctx, param) {
354
+ var response = param.response;
355
+ var brainRunId = ctx.brainRunId, options = ctx.options;
356
+ var newCtx = _object_spread_props(_object_spread({}, ctx), {
357
+ pendingWebhooks: null,
358
+ currentEvent: {
359
+ type: BRAIN_EVENTS.WEBHOOK_RESPONSE,
360
+ brainRunId: brainRunId,
361
+ response: response,
362
+ options: options
363
+ }
364
+ });
365
+ return updateDerivedState(newCtx, 'running');
366
+ });
367
+ var stepStatus = reduce(function(ctx, param) {
368
+ var eventBrainRunId = param.brainRunId, steps = param.steps;
369
+ var brainRunId = ctx.brainRunId, brainStack = ctx.brainStack, options = ctx.options;
370
+ if (brainStack.length === 0) return ctx;
371
+ // Only update the current (deepest) brain on the stack.
372
+ // STEP_STATUS is emitted by the currently executing brain, which is always
373
+ // the deepest one. We can't match by brainRunId because nested brains share
374
+ // the same brainRunId, which would incorrectly update all nested brains.
375
+ var updatedStack = brainStack.map(function(brain, index) {
376
+ if (index === brainStack.length - 1) {
377
+ // Create a map of existing steps to preserve their patches
378
+ var existingStepsById = new Map(brain.steps.map(function(s) {
379
+ return [
380
+ s.id,
381
+ s
382
+ ];
383
+ }));
384
+ return _object_spread_props(_object_spread({}, brain), {
385
+ steps: steps.map(function(s) {
386
+ var existing = existingStepsById.get(s.id);
387
+ return _object_spread({
388
+ id: s.id,
389
+ title: s.title,
390
+ status: s.status
391
+ }, (existing === null || existing === void 0 ? void 0 : existing.patch) ? {
392
+ patch: existing.patch
393
+ } : {});
394
+ })
395
+ });
396
+ }
397
+ return brain;
398
+ });
399
+ return _object_spread_props(_object_spread({}, ctx), {
400
+ brainStack: updatedStack,
401
+ currentEvent: {
402
+ type: BRAIN_EVENTS.STEP_STATUS,
403
+ brainRunId: brainRunId,
404
+ steps: steps,
405
+ options: options
406
+ }
407
+ });
408
+ });
409
+ var stepRetry = reduce(function(ctx, param) {
410
+ var stepId = param.stepId, stepTitle = param.stepTitle, error = param.error, attempt = param.attempt;
411
+ var brainRunId = ctx.brainRunId, options = ctx.options;
412
+ return _object_spread_props(_object_spread({}, ctx), {
413
+ currentEvent: {
414
+ type: BRAIN_EVENTS.STEP_RETRY,
415
+ brainRunId: brainRunId,
416
+ stepId: stepId,
417
+ stepTitle: stepTitle,
418
+ error: error,
419
+ attempt: attempt,
420
+ options: options
421
+ }
422
+ });
423
+ });
424
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
425
+ var passthrough = function(eventType) {
426
+ return reduce(function(ctx, ev) {
427
+ var brainRunId = ctx.brainRunId, options = ctx.options;
428
+ // Destructure to exclude 'type' (the action name) from being spread into currentEvent
429
+ var _actionType = ev.type, eventData = _object_without_properties(ev, [
430
+ "type"
431
+ ]);
432
+ return _object_spread_props(_object_spread({}, ctx), {
433
+ currentEvent: _object_spread({
434
+ type: eventType,
435
+ brainRunId: brainRunId,
436
+ options: options
437
+ }, eventData)
438
+ });
439
+ });
440
+ };
441
+ // ============================================================================
442
+ // Guards - Conditional transitions
443
+ // ============================================================================
444
+ var isOuterBrain = guard(function(ctx) {
445
+ return ctx.depth === 1;
446
+ });
447
+ var isInnerBrain = guard(function(ctx) {
448
+ return ctx.depth > 1;
449
+ });
450
+ // ============================================================================
451
+ // State Machine Definition
452
+ // ============================================================================
453
+ // Action names for transitions
454
+ var ACTIONS = {
455
+ START_BRAIN: 'startBrain',
456
+ RESTART_BRAIN: 'restartBrain',
457
+ COMPLETE_BRAIN: 'completeBrain',
458
+ ERROR_BRAIN: 'errorBrain',
459
+ CANCEL_BRAIN: 'cancelBrain',
460
+ WEBHOOK: 'webhook',
461
+ WEBHOOK_RESPONSE: 'webhookResponse',
462
+ START_STEP: 'startStep',
463
+ COMPLETE_STEP: 'completeStep',
464
+ STEP_STATUS: 'stepStatus',
465
+ STEP_RETRY: 'stepRetry',
466
+ LOOP_START: 'loopStart',
467
+ LOOP_ITERATION: 'loopIteration',
468
+ LOOP_TOOL_CALL: 'loopToolCall',
469
+ LOOP_TOOL_RESULT: 'loopToolResult',
470
+ LOOP_ASSISTANT_MESSAGE: 'loopAssistantMessage',
471
+ LOOP_COMPLETE: 'loopComplete',
472
+ LOOP_TOKEN_LIMIT: 'loopTokenLimit',
473
+ LOOP_WEBHOOK: 'loopWebhook',
474
+ HEARTBEAT: 'heartbeat'
475
+ };
476
+ export { ACTIONS as BRAIN_ACTIONS };
477
+ // Create machine factory - needs to be called with initial context
478
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
479
+ var createBrainMachine = function(initialContext) {
480
+ return createMachine('idle', {
481
+ idle: state(transition(ACTIONS.START_BRAIN, 'running', startBrain), transition(ACTIONS.RESTART_BRAIN, 'running', restartBrain)),
482
+ running: state(// Nested brain lifecycle
483
+ transition(ACTIONS.START_BRAIN, 'running', startBrain), transition(ACTIONS.RESTART_BRAIN, 'running', restartBrain), // Outer brain complete -> terminal
484
+ transition(ACTIONS.COMPLETE_BRAIN, 'complete', isOuterBrain, completeBrain), // Inner brain complete -> stay running
485
+ transition(ACTIONS.COMPLETE_BRAIN, 'running', isInnerBrain, completeBrain), // Error (only outer brain errors are terminal)
486
+ transition(ACTIONS.ERROR_BRAIN, 'error', isOuterBrain, errorBrain), // Cancelled
487
+ transition(ACTIONS.CANCEL_BRAIN, 'cancelled', cancelBrain), // Webhook -> paused
488
+ transition(ACTIONS.WEBHOOK, 'paused', webhookPause), // Webhook response (for resume from webhook - machine is already running)
489
+ transition(ACTIONS.WEBHOOK_RESPONSE, 'running', webhookResponse), // Step events
490
+ transition(ACTIONS.START_STEP, 'running', startStep), transition(ACTIONS.COMPLETE_STEP, 'running', completeStep), transition(ACTIONS.STEP_STATUS, 'running', stepStatus), transition(ACTIONS.STEP_RETRY, 'running', stepRetry), // Loop events (pass-through with event data)
491
+ transition(ACTIONS.LOOP_START, 'running', passthrough(BRAIN_EVENTS.LOOP_START)), transition(ACTIONS.LOOP_ITERATION, 'running', passthrough(BRAIN_EVENTS.LOOP_ITERATION)), transition(ACTIONS.LOOP_TOOL_CALL, 'running', passthrough(BRAIN_EVENTS.LOOP_TOOL_CALL)), transition(ACTIONS.LOOP_TOOL_RESULT, 'running', passthrough(BRAIN_EVENTS.LOOP_TOOL_RESULT)), transition(ACTIONS.LOOP_ASSISTANT_MESSAGE, 'running', passthrough(BRAIN_EVENTS.LOOP_ASSISTANT_MESSAGE)), transition(ACTIONS.LOOP_COMPLETE, 'running', passthrough(BRAIN_EVENTS.LOOP_COMPLETE)), transition(ACTIONS.LOOP_TOKEN_LIMIT, 'running', passthrough(BRAIN_EVENTS.LOOP_TOKEN_LIMIT)), transition(ACTIONS.LOOP_WEBHOOK, 'running', passthrough(BRAIN_EVENTS.LOOP_WEBHOOK)), transition(ACTIONS.HEARTBEAT, 'running', passthrough(BRAIN_EVENTS.HEARTBEAT))),
492
+ paused: state(transition(ACTIONS.WEBHOOK_RESPONSE, 'running', webhookResponse), transition(ACTIONS.CANCEL_BRAIN, 'cancelled', cancelBrain), // RESTART happens when resuming from webhook
493
+ transition(ACTIONS.RESTART_BRAIN, 'running', restartBrain)),
494
+ // Terminal states - limited outgoing transitions
495
+ complete: state(),
496
+ error: state(// Allow STEP_STATUS after error so we can emit the final step statuses
497
+ transition(ACTIONS.STEP_STATUS, 'error', stepStatus)),
498
+ cancelled: state()
499
+ }, function() {
500
+ return initialContext;
501
+ });
502
+ };
503
+ /**
504
+ * Create a new brain execution state machine.
505
+ */ export function createBrainExecutionMachine(options) {
506
+ var initialContext = createInitialContext(options);
507
+ var machine = createBrainMachine(initialContext);
508
+ return interpret(machine, function() {});
509
+ }
510
+ /**
511
+ * Send a transition action to the machine.
512
+ * After calling this, read machine.context.currentEvent to get the event to yield.
513
+ */ export function sendAction(machine, action, payload) {
514
+ machine.send(_object_spread({
515
+ type: action
516
+ }, payload));
517
+ }
518
+ /**
519
+ * Feed an incoming event into the machine to update state (observer mode).
520
+ * Maps brain event types to machine actions.
521
+ */ // eslint-disable-next-line @typescript-eslint/no-explicit-any
522
+ export function sendEvent(machine, event) {
523
+ var _obj;
524
+ 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);
525
+ var action = eventToAction[event.type];
526
+ if (action) {
527
+ var payload = extractPayloadFromEvent(event);
528
+ machine.send(_object_spread({
529
+ type: action
530
+ }, payload));
531
+ }
532
+ }
533
+ /**
534
+ * Extract relevant payload fields from a brain event for the state machine.
535
+ */ // eslint-disable-next-line @typescript-eslint/no-explicit-any
536
+ function extractPayloadFromEvent(event) {
537
+ switch(event.type){
538
+ case BRAIN_EVENTS.START:
539
+ case BRAIN_EVENTS.RESTART:
540
+ return {
541
+ brainRunId: event.brainRunId,
542
+ brainTitle: event.brainTitle,
543
+ brainDescription: event.brainDescription,
544
+ initialState: event.initialState
545
+ };
546
+ case BRAIN_EVENTS.STEP_START:
547
+ return {
548
+ stepId: event.stepId,
549
+ stepTitle: event.stepTitle
550
+ };
551
+ case BRAIN_EVENTS.STEP_COMPLETE:
552
+ return {
553
+ stepId: event.stepId,
554
+ stepTitle: event.stepTitle,
555
+ patch: event.patch
556
+ };
557
+ case BRAIN_EVENTS.ERROR:
558
+ return {
559
+ error: event.error
560
+ };
561
+ case BRAIN_EVENTS.WEBHOOK:
562
+ return {
563
+ waitFor: event.waitFor,
564
+ state: event.state
565
+ };
566
+ case BRAIN_EVENTS.WEBHOOK_RESPONSE:
567
+ return {
568
+ response: event.response
569
+ };
570
+ case BRAIN_EVENTS.STEP_STATUS:
571
+ return {
572
+ brainRunId: event.brainRunId,
573
+ steps: event.steps
574
+ };
575
+ case BRAIN_EVENTS.STEP_RETRY:
576
+ return {
577
+ stepId: event.stepId,
578
+ stepTitle: event.stepTitle,
579
+ error: event.error,
580
+ attempt: event.attempt
581
+ };
582
+ default:
583
+ // For pass-through events, pass all properties except type
584
+ var type = event.type, rest = _object_without_properties(event, [
585
+ "type"
586
+ ]);
587
+ return rest;
588
+ }
589
+ }
590
+ // ============================================================================
591
+ // Query Helpers (kept for backwards compatibility, but context is now preferred)
592
+ // ============================================================================
593
+ export function getDepth(machine) {
594
+ return machine.context.depth;
595
+ }
596
+ export function isTopLevel(machine) {
597
+ return machine.context.isTopLevel;
598
+ }
599
+ export function getCurrentStep(machine) {
600
+ var _machine_context = machine.context, brainStack = _machine_context.brainStack, currentStepId = _machine_context.currentStepId;
601
+ if (brainStack.length === 0 || !currentStepId) return null;
602
+ var currentBrain = brainStack[brainStack.length - 1];
603
+ var _currentBrain_steps_find;
604
+ return (_currentBrain_steps_find = currentBrain.steps.find(function(s) {
605
+ return s.id === currentStepId;
606
+ })) !== null && _currentBrain_steps_find !== void 0 ? _currentBrain_steps_find : null;
607
+ }
608
+ export function getBrainStack(machine) {
609
+ return machine.context.brainStack;
610
+ }
611
+ export function getBrainRunId(machine) {
612
+ return machine.context.brainRunId;
613
+ }
614
+ export function getExecutionState(machine) {
615
+ return machine.machine.current;
616
+ }
617
+ export function getPendingWebhooks(machine) {
618
+ return machine.context.pendingWebhooks;
619
+ }
620
+ export function getError(machine) {
621
+ return machine.context.error;
622
+ }
623
+ /**
624
+ * Get the completed steps from the state machine in the format needed for resume.
625
+ * This reconstructs the nested step hierarchy from the brain stack.
626
+ * Returns a deep copy to avoid mutating the state machine's context.
627
+ */ export function getCompletedSteps(machine) {
628
+ var brainStack = machine.context.brainStack;
629
+ if (brainStack.length === 0) {
630
+ return [];
631
+ }
632
+ // Deep copy the steps to avoid mutating state machine context
633
+ var copyStep = function(step) {
634
+ var _step_innerSteps;
635
+ return _object_spread_props(_object_spread({}, step), {
636
+ innerSteps: (_step_innerSteps = step.innerSteps) === null || _step_innerSteps === void 0 ? void 0 : _step_innerSteps.map(copyStep)
637
+ });
638
+ };
639
+ var copyBrainStack = brainStack.map(function(brain) {
640
+ return _object_spread_props(_object_spread({}, brain), {
641
+ steps: brain.steps.map(copyStep)
642
+ });
643
+ });
644
+ // The outer brain's steps, with inner brain steps nested
645
+ var outerBrain = copyBrainStack[0];
646
+ // If there are nested brains still on the stack (paused mid-execution),
647
+ // attach their steps to the parent step as innerSteps
648
+ if (copyBrainStack.length > 1) {
649
+ var _loop = function(i) {
650
+ var innerBrain = copyBrainStack[i];
651
+ var parentBrain = copyBrainStack[i - 1];
652
+ // Find the parent step (the one that started this inner brain)
653
+ var parentStep = parentBrain.steps.find(function(s) {
654
+ return s.id === innerBrain.parentStepId;
655
+ });
656
+ if (parentStep) {
657
+ parentStep.innerSteps = innerBrain.steps;
658
+ }
659
+ };
660
+ for(var i = copyBrainStack.length - 1; i > 0; i--)_loop(i);
661
+ }
662
+ return outerBrain.steps;
663
+ }
package/dist/src/index.js CHANGED
@@ -11,3 +11,5 @@ export { createResources } from './resources/resources.js';
11
11
  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
+ // Brain state machine
15
+ export { createBrainExecutionMachine, sendAction, sendEvent, getDepth, isTopLevel, getCurrentStep, getBrainStack, getBrainRunId, getExecutionState, getPendingWebhooks, getError, getCompletedSteps, BRAIN_ACTIONS } from './dsl/brain-state-machine.js';
@@ -1 +1 @@
1
- {"version":3,"file":"brain-runner.d.ts","sourceRoot":"","sources":["../../../src/dsl/brain-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAe,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,qBAAa,WAAW;IAEpB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE;QACf,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,eAAe,CAAC;QACxB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,GAAG,CAAC,EAAE,UAAU,CAAC;KAClB;IAGH,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW;IAQ9C,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW;IAOhD,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW;IAOhD,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW;IAO3C,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW;IAO/B,GAAG,CAAC,QAAQ,SAAS,UAAU,GAAG,EAAE,EAAE,MAAM,SAAS,KAAK,GAAG,EAAE,EACnE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EACnC,EACE,YAA2B,EAC3B,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,UAAU,GACX,GAAE;QACD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,QAAQ,CAAC;QACnB,qBAAqB,CAAC,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;QACjD,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;QACtB,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;KACtB,GACL,OAAO,CAAC,MAAM,CAAC;CA8HnB"}
1
+ {"version":3,"file":"brain-runner.d.ts","sourceRoot":"","sources":["../../../src/dsl/brain-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAe,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,qBAAa,WAAW;IAEpB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE;QACf,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,eAAe,CAAC;QACxB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,GAAG,CAAC,EAAE,UAAU,CAAC;KAClB;IAGH,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW;IAQ9C,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW;IAOhD,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW;IAOhD,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW;IAO3C,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW;IAO/B,GAAG,CAAC,QAAQ,SAAS,UAAU,GAAG,EAAE,EAAE,MAAM,SAAS,KAAK,GAAG,EAAE,EACnE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EACnC,EACE,YAA2B,EAC3B,OAAO,EACP,qBAAqB,EACrB,UAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,UAAU,GACX,GAAE;QACD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,QAAQ,CAAC;QACnB,qBAAqB,CAAC,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;QACjD,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;QACtB,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;KACtB,GACL,OAAO,CAAC,MAAM,CAAC;CAmGnB"}
@@ -0,0 +1,156 @@
1
+ import { STATUS } from './constants.js';
2
+ import type { JsonPatch, JsonObject } from './types.js';
3
+ export interface BrainStackEntry {
4
+ brainRunId: string;
5
+ brainTitle: string;
6
+ brainDescription?: string;
7
+ parentStepId: string | null;
8
+ steps: StepInfo[];
9
+ }
10
+ export interface StepInfo {
11
+ id: string;
12
+ title: string;
13
+ status: (typeof STATUS)[keyof typeof STATUS];
14
+ patch?: JsonPatch;
15
+ innerSteps?: StepInfo[];
16
+ }
17
+ export interface SerializedError {
18
+ name: string;
19
+ message: string;
20
+ stack?: string;
21
+ }
22
+ export interface WebhookRegistration {
23
+ name: string;
24
+ identifier: string;
25
+ }
26
+ export interface BrainEvent {
27
+ type: string;
28
+ brainRunId: string;
29
+ options: JsonObject;
30
+ [key: string]: unknown;
31
+ }
32
+ export interface BrainExecutionContext {
33
+ brainStack: BrainStackEntry[];
34
+ depth: number;
35
+ brainRunId: string | null;
36
+ currentStepId: string | null;
37
+ currentStepTitle: string | null;
38
+ error: SerializedError | null;
39
+ pendingWebhooks: WebhookRegistration[] | null;
40
+ currentState: JsonObject;
41
+ currentEvent: BrainEvent | null;
42
+ options: JsonObject;
43
+ isTopLevel: boolean;
44
+ isRunning: boolean;
45
+ isComplete: boolean;
46
+ isPaused: boolean;
47
+ isError: boolean;
48
+ isCancelled: boolean;
49
+ topLevelStepCount: number;
50
+ }
51
+ export type ExecutionState = 'idle' | 'running' | 'paused' | 'complete' | 'error' | 'cancelled';
52
+ export interface StartBrainPayload {
53
+ brainRunId: string;
54
+ brainTitle: string;
55
+ brainDescription?: string;
56
+ initialState?: JsonObject;
57
+ }
58
+ export interface StartStepPayload {
59
+ stepId: string;
60
+ stepTitle: string;
61
+ }
62
+ export interface CompleteStepPayload {
63
+ stepId: string;
64
+ stepTitle: string;
65
+ patch?: JsonPatch;
66
+ }
67
+ export interface WebhookPayload {
68
+ waitFor: WebhookRegistration[];
69
+ state?: JsonObject;
70
+ }
71
+ export interface ErrorPayload {
72
+ error: SerializedError;
73
+ }
74
+ export interface StepStatusPayload {
75
+ brainRunId: string;
76
+ steps: Array<{
77
+ id: string;
78
+ title: string;
79
+ status: string;
80
+ }>;
81
+ }
82
+ export interface StepRetryPayload {
83
+ stepId: string;
84
+ stepTitle: string;
85
+ error: SerializedError;
86
+ attempt: number;
87
+ }
88
+ export interface CreateMachineOptions {
89
+ initialState?: JsonObject;
90
+ options?: JsonObject;
91
+ }
92
+ declare const ACTIONS: {
93
+ readonly START_BRAIN: "startBrain";
94
+ readonly RESTART_BRAIN: "restartBrain";
95
+ readonly COMPLETE_BRAIN: "completeBrain";
96
+ readonly ERROR_BRAIN: "errorBrain";
97
+ readonly CANCEL_BRAIN: "cancelBrain";
98
+ readonly WEBHOOK: "webhook";
99
+ readonly WEBHOOK_RESPONSE: "webhookResponse";
100
+ readonly START_STEP: "startStep";
101
+ readonly COMPLETE_STEP: "completeStep";
102
+ readonly STEP_STATUS: "stepStatus";
103
+ readonly STEP_RETRY: "stepRetry";
104
+ readonly LOOP_START: "loopStart";
105
+ readonly LOOP_ITERATION: "loopIteration";
106
+ readonly LOOP_TOOL_CALL: "loopToolCall";
107
+ readonly LOOP_TOOL_RESULT: "loopToolResult";
108
+ readonly LOOP_ASSISTANT_MESSAGE: "loopAssistantMessage";
109
+ readonly LOOP_COMPLETE: "loopComplete";
110
+ readonly LOOP_TOKEN_LIMIT: "loopTokenLimit";
111
+ readonly LOOP_WEBHOOK: "loopWebhook";
112
+ readonly HEARTBEAT: "heartbeat";
113
+ };
114
+ export { ACTIONS as BRAIN_ACTIONS };
115
+ export interface BrainStateMachine {
116
+ machine: {
117
+ current: string;
118
+ context: BrainExecutionContext;
119
+ };
120
+ context: BrainExecutionContext;
121
+ send: (event: {
122
+ type: string;
123
+ [key: string]: unknown;
124
+ }) => void;
125
+ }
126
+ /**
127
+ * Create a new brain execution state machine.
128
+ */
129
+ export declare function createBrainExecutionMachine(options?: CreateMachineOptions): BrainStateMachine;
130
+ /**
131
+ * Send a transition action to the machine.
132
+ * After calling this, read machine.context.currentEvent to get the event to yield.
133
+ */
134
+ export declare function sendAction(machine: BrainStateMachine, action: string, payload?: object): void;
135
+ /**
136
+ * Feed an incoming event into the machine to update state (observer mode).
137
+ * Maps brain event types to machine actions.
138
+ */
139
+ export declare function sendEvent(machine: BrainStateMachine, event: {
140
+ type: string;
141
+ } & Record<string, any>): void;
142
+ export declare function getDepth(machine: BrainStateMachine): number;
143
+ export declare function isTopLevel(machine: BrainStateMachine): boolean;
144
+ export declare function getCurrentStep(machine: BrainStateMachine): StepInfo | null;
145
+ export declare function getBrainStack(machine: BrainStateMachine): BrainStackEntry[];
146
+ export declare function getBrainRunId(machine: BrainStateMachine): string | null;
147
+ export declare function getExecutionState(machine: BrainStateMachine): ExecutionState;
148
+ export declare function getPendingWebhooks(machine: BrainStateMachine): WebhookRegistration[] | null;
149
+ export declare function getError(machine: BrainStateMachine): SerializedError | null;
150
+ /**
151
+ * Get the completed steps from the state machine in the format needed for resume.
152
+ * This reconstructs the nested step hierarchy from the brain stack.
153
+ * Returns a deep copy to avoid mutating the state machine's context.
154
+ */
155
+ export declare function getCompletedSteps(machine: BrainStateMachine): StepInfo[];
156
+ //# sourceMappingURL=brain-state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-state-machine.d.ts","sourceRoot":"","sources":["../../../src/dsl/brain-state-machine.ts"],"names":[],"mappings":"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"}
@@ -17,4 +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, sendAction, sendEvent, getDepth, isTopLevel, getCurrentStep, getBrainStack, getBrainRunId, getExecutionState, getPendingWebhooks, getError, getCompletedSteps, BRAIN_ACTIONS, } from './dsl/brain-state-machine.js';
21
+ export type { BrainStateMachine, BrainExecutionContext, BrainStackEntry, StepInfo, ExecutionState, CreateMachineOptions, } from './dsl/brain-state-machine.js';
20
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"}
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,UAAU,EACV,SAAS,EACT,QAAQ,EACR,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,iBAAiB,EACjB,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,QAAQ,EACR,cAAc,EACd,oBAAoB,GACrB,MAAM,8BAA8B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/core",
3
- "version": "0.0.46",
3
+ "version": "0.0.47",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -31,6 +31,7 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "fast-json-patch": "^3.1.1",
34
+ "robot3": "^1.2.0",
34
35
  "uuid": "^11.0.5"
35
36
  },
36
37
  "devDependencies": {