@positronic/core 0.0.61 → 0.0.63
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 -6
- package/dist/src/dsl/brain-state-machine.js +42 -9
- package/dist/src/dsl/builder/brain.js +55 -127
- package/dist/src/dsl/constants.js +4 -1
- package/dist/src/dsl/example-webhook.js +8 -9
- package/dist/src/dsl/execution/event-stream.js +674 -108
- package/dist/src/dsl/execution/retry.js +0 -291
- package/dist/src/ui/generate-ui.js +2 -1
- package/dist/types/clients/types.d.ts +28 -0
- package/dist/types/clients/types.d.ts.map +1 -1
- package/dist/types/dsl/brain-runner.d.ts.map +1 -1
- package/dist/types/dsl/brain-state-machine.d.ts +12 -0
- package/dist/types/dsl/brain-state-machine.d.ts.map +1 -1
- package/dist/types/dsl/brain.d.ts +1 -1
- package/dist/types/dsl/brain.d.ts.map +1 -1
- package/dist/types/dsl/builder/brain.d.ts +15 -18
- package/dist/types/dsl/builder/brain.d.ts.map +1 -1
- package/dist/types/dsl/constants.d.ts +2 -0
- package/dist/types/dsl/constants.d.ts.map +1 -1
- package/dist/types/dsl/definitions/blocks.d.ts +37 -10
- package/dist/types/dsl/definitions/blocks.d.ts.map +1 -1
- package/dist/types/dsl/definitions/events.d.ts +12 -1
- package/dist/types/dsl/definitions/events.d.ts.map +1 -1
- package/dist/types/dsl/definitions/run-params.d.ts +6 -0
- package/dist/types/dsl/definitions/run-params.d.ts.map +1 -1
- package/dist/types/dsl/definitions/steps.d.ts +1 -1
- package/dist/types/dsl/definitions/steps.d.ts.map +1 -1
- package/dist/types/dsl/example-webhook.d.ts +1 -1
- package/dist/types/dsl/example-webhook.d.ts.map +1 -1
- package/dist/types/dsl/execution/event-stream.d.ts +12 -1
- package/dist/types/dsl/execution/event-stream.d.ts.map +1 -1
- package/dist/types/dsl/execution/retry.d.ts +0 -25
- package/dist/types/dsl/execution/retry.d.ts.map +1 -1
- package/dist/types/dsl/types.d.ts +8 -14
- package/dist/types/dsl/types.d.ts.map +1 -1
- package/dist/types/dsl/webhook.d.ts +1 -0
- package/dist/types/dsl/webhook.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/ui/generate-ui.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -281,7 +281,7 @@ import { DEFAULT_ENV } from './brain.js';
|
|
|
281
281
|
* Adds agent context to the deepest level.
|
|
282
282
|
* Webhook response is no longer passed here - it comes from signals during execution.
|
|
283
283
|
* This is internal to BrainRunner - external consumers don't need to know about ResumeContext.
|
|
284
|
-
*/ function executionStackToResumeContext(stack, agentContext) {
|
|
284
|
+
*/ function executionStackToResumeContext(stack, agentContext, batchContext) {
|
|
285
285
|
if (stack.length === 0) {
|
|
286
286
|
throw new Error('Cannot convert empty execution stack to ResumeContext');
|
|
287
287
|
}
|
|
@@ -290,11 +290,12 @@ import { DEFAULT_ENV } from './brain.js';
|
|
|
290
290
|
for(var i = stack.length - 1; i >= 0; i--){
|
|
291
291
|
var entry = stack[i];
|
|
292
292
|
if (i === stack.length - 1) {
|
|
293
|
-
// Deepest level - add agent context (webhook response comes from signals now)
|
|
293
|
+
// Deepest level - add agent context and batch progress (webhook response comes from signals now)
|
|
294
294
|
context = {
|
|
295
295
|
stepIndex: entry.stepIndex,
|
|
296
296
|
state: entry.state,
|
|
297
|
-
agentContext: agentContext !== null && agentContext !== void 0 ? agentContext : undefined
|
|
297
|
+
agentContext: agentContext !== null && agentContext !== void 0 ? agentContext : undefined,
|
|
298
|
+
batchProgress: batchContext !== null && batchContext !== void 0 ? batchContext : undefined
|
|
298
299
|
};
|
|
299
300
|
} else {
|
|
300
301
|
// Outer level - wrap inner context
|
|
@@ -409,13 +410,13 @@ export var BrainRunner = /*#__PURE__*/ function() {
|
|
|
409
410
|
* Webhook response data comes from signals, not as a parameter.
|
|
410
411
|
*/ function resume(brain, options) {
|
|
411
412
|
return _async_to_generator(function() {
|
|
412
|
-
var machine, brainRunId, brainOptions, endAfter, signal, _machine_context, executionStack, agentContext, resumeContext;
|
|
413
|
+
var machine, brainRunId, brainOptions, endAfter, signal, _machine_context, executionStack, agentContext, batchContext, resumeContext;
|
|
413
414
|
return _ts_generator(this, function(_state) {
|
|
414
415
|
machine = options.machine, brainRunId = options.brainRunId, brainOptions = options.options, endAfter = options.endAfter, signal = options.signal;
|
|
415
416
|
// Build ResumeContext from machine's execution stack
|
|
416
417
|
// Webhook response comes from signals during execution, not from resume parameters
|
|
417
|
-
_machine_context = machine.context, executionStack = _machine_context.executionStack, agentContext = _machine_context.agentContext;
|
|
418
|
-
resumeContext = executionStackToResumeContext(executionStack, agentContext);
|
|
418
|
+
_machine_context = machine.context, executionStack = _machine_context.executionStack, agentContext = _machine_context.agentContext, batchContext = _machine_context.batchContext;
|
|
419
|
+
resumeContext = executionStackToResumeContext(executionStack, agentContext, batchContext);
|
|
419
420
|
return [
|
|
420
421
|
2,
|
|
421
422
|
this.execute(brain, {
|
|
@@ -125,6 +125,7 @@ var createInitialContext = function(opts) {
|
|
|
125
125
|
currentState: (_opts_initialState = opts === null || opts === void 0 ? void 0 : opts.initialState) !== null && _opts_initialState !== void 0 ? _opts_initialState : {},
|
|
126
126
|
options: (_opts_options = opts === null || opts === void 0 ? void 0 : opts.options) !== null && _opts_options !== void 0 ? _opts_options : {},
|
|
127
127
|
agentContext: null,
|
|
128
|
+
batchContext: null,
|
|
128
129
|
status: STATUS.PENDING,
|
|
129
130
|
isTopLevel: false,
|
|
130
131
|
isRunning: false,
|
|
@@ -318,20 +319,33 @@ var startStep = reduce(function(ctx, param) {
|
|
|
318
319
|
});
|
|
319
320
|
});
|
|
320
321
|
var completeStep = reduce(function(ctx, param) {
|
|
321
|
-
var stepId = param.stepId, patch = param.patch;
|
|
322
|
+
var stepId = param.stepId, stepTitle = param.stepTitle, patch = param.patch, halted = param.halted;
|
|
322
323
|
var brains = ctx.brains, brainIdStack = ctx.brainIdStack, executionStack = ctx.executionStack, depth = ctx.depth, currentState = ctx.currentState, topLevelStepCount = ctx.topLevelStepCount;
|
|
323
324
|
if (brainIdStack.length === 0) return ctx;
|
|
324
325
|
// === NEW: Update flat structures ===
|
|
325
326
|
var currentBrainId = brainIdStack[brainIdStack.length - 1];
|
|
326
327
|
var currentBrain = brains[currentBrainId];
|
|
327
328
|
if (!currentBrain) return ctx;
|
|
328
|
-
//
|
|
329
|
-
var
|
|
329
|
+
// Use explicit halted flag from the event
|
|
330
|
+
var isHalted = halted === true;
|
|
331
|
+
// Update step status - HALTED if explicitly marked, COMPLETE otherwise
|
|
332
|
+
var stepStatus = isHalted ? STATUS.HALTED : STATUS.COMPLETE;
|
|
333
|
+
var existingStep = currentBrain.steps.find(function(s) {
|
|
334
|
+
return s.id === stepId;
|
|
335
|
+
});
|
|
336
|
+
var newSteps = existingStep ? currentBrain.steps.map(function(s) {
|
|
330
337
|
return s.id === stepId ? _object_spread_props(_object_spread({}, s), {
|
|
331
|
-
status:
|
|
338
|
+
status: stepStatus,
|
|
332
339
|
patch: patch
|
|
333
340
|
}) : s;
|
|
334
|
-
})
|
|
341
|
+
}) : _to_consumable_array(currentBrain.steps).concat([
|
|
342
|
+
{
|
|
343
|
+
id: stepId,
|
|
344
|
+
title: stepTitle,
|
|
345
|
+
status: stepStatus,
|
|
346
|
+
patch: patch
|
|
347
|
+
}
|
|
348
|
+
]);
|
|
335
349
|
var newBrains = _object_spread_props(_object_spread({}, brains), _define_property({}, currentBrainId, _object_spread_props(_object_spread({}, currentBrain), {
|
|
336
350
|
steps: newSteps
|
|
337
351
|
})));
|
|
@@ -339,7 +353,7 @@ var completeStep = reduce(function(ctx, param) {
|
|
|
339
353
|
var newExecutionStack = executionStack;
|
|
340
354
|
if (executionStack.length > 0) {
|
|
341
355
|
var topEntry = executionStack[executionStack.length - 1];
|
|
342
|
-
var newState = patch ? applyPatches(topEntry.state, [
|
|
356
|
+
var newState = patch && !isHalted ? applyPatches(topEntry.state, [
|
|
343
357
|
patch
|
|
344
358
|
]) : topEntry.state;
|
|
345
359
|
// Increment stepIndex so resume knows to start from the NEXT step
|
|
@@ -351,9 +365,10 @@ var completeStep = reduce(function(ctx, param) {
|
|
|
351
365
|
]);
|
|
352
366
|
}
|
|
353
367
|
// Apply patch to currentState only for top-level brain (for backwards compat)
|
|
368
|
+
// Skipped steps don't change state or count toward topLevelStepCount
|
|
354
369
|
var newState1 = currentState;
|
|
355
370
|
var newStepCount = topLevelStepCount;
|
|
356
|
-
if (depth === 1 && patch) {
|
|
371
|
+
if (depth === 1 && patch && !isHalted) {
|
|
357
372
|
newState1 = applyPatches(currentState, [
|
|
358
373
|
patch
|
|
359
374
|
]);
|
|
@@ -363,7 +378,8 @@ var completeStep = reduce(function(ctx, param) {
|
|
|
363
378
|
brains: newBrains,
|
|
364
379
|
executionStack: newExecutionStack,
|
|
365
380
|
currentState: newState1,
|
|
366
|
-
topLevelStepCount: newStepCount
|
|
381
|
+
topLevelStepCount: newStepCount,
|
|
382
|
+
batchContext: null
|
|
367
383
|
});
|
|
368
384
|
});
|
|
369
385
|
var webhookPause = reduce(function(ctx, param) {
|
|
@@ -430,6 +446,22 @@ var passthrough = function() {
|
|
|
430
446
|
return ctx;
|
|
431
447
|
});
|
|
432
448
|
};
|
|
449
|
+
// Reducer for BATCH_CHUNK_COMPLETE - merges chunk results into batchContext
|
|
450
|
+
var batchChunkComplete = reduce(function(ctx, payload) {
|
|
451
|
+
var existing = ctx.batchContext;
|
|
452
|
+
var newResults = (existing === null || existing === void 0 ? void 0 : existing.accumulatedResults) ? _to_consumable_array(existing.accumulatedResults) : [];
|
|
453
|
+
for(var i = 0; i < payload.chunkResults.length; i++){
|
|
454
|
+
newResults[payload.chunkStartIndex + i] = payload.chunkResults[i];
|
|
455
|
+
}
|
|
456
|
+
return _object_spread_props(_object_spread({}, ctx), {
|
|
457
|
+
batchContext: {
|
|
458
|
+
accumulatedResults: newResults,
|
|
459
|
+
processedCount: payload.processedCount,
|
|
460
|
+
totalItems: payload.totalItems,
|
|
461
|
+
schemaName: payload.schemaName
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
});
|
|
433
465
|
// Reducer for agent iteration events that tracks tokens per-iteration
|
|
434
466
|
// This ensures tokens are counted even if the agent doesn't complete (e.g., webhook interruption)
|
|
435
467
|
var agentIteration = reduce(function(ctx, ev) {
|
|
@@ -536,7 +568,8 @@ var makeBrainMachine = function(initialContext) {
|
|
|
536
568
|
transition(BRAIN_EVENTS.PAUSED, 'paused', pauseBrain), // Webhook -> waiting (for non-agent webhooks)
|
|
537
569
|
transition(BRAIN_EVENTS.WEBHOOK, 'waiting', webhookPause), // Webhook response (for resume from non-agent webhook)
|
|
538
570
|
transition(BRAIN_EVENTS.WEBHOOK_RESPONSE, 'running', webhookResponse), // Step events
|
|
539
|
-
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), //
|
|
571
|
+
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), // Batch chunk complete - stays in running, accumulates results
|
|
572
|
+
transition(BRAIN_EVENTS.BATCH_CHUNK_COMPLETE, 'running', batchChunkComplete), // AGENT_START transitions to the agentLoop state
|
|
540
573
|
transition(BRAIN_EVENTS.AGENT_START, 'agentLoop', agentStart)),
|
|
541
574
|
// Explicit agent loop state - isolates agent execution logic
|
|
542
575
|
agentLoop: state.apply(void 0, // Spread agent micro-transitions
|
|
@@ -375,7 +375,6 @@ function _ts_values(o) {
|
|
|
375
375
|
}
|
|
376
376
|
import { z } from 'zod';
|
|
377
377
|
import { BrainEventStream } from '../execution/event-stream.js';
|
|
378
|
-
import { Semaphore, normalizeRetryConfig, executeWithRetry } from '../execution/retry.js';
|
|
379
378
|
export var Brain = /*#__PURE__*/ function() {
|
|
380
379
|
"use strict";
|
|
381
380
|
function Brain(title, description) {
|
|
@@ -413,6 +412,16 @@ export var Brain = /*#__PURE__*/ function() {
|
|
|
413
412
|
type: 'agent',
|
|
414
413
|
title: block.title
|
|
415
414
|
};
|
|
415
|
+
} else if (block.type === 'guard') {
|
|
416
|
+
return {
|
|
417
|
+
type: 'guard',
|
|
418
|
+
title: block.title
|
|
419
|
+
};
|
|
420
|
+
} else if (block.type === 'wait') {
|
|
421
|
+
return {
|
|
422
|
+
type: 'wait',
|
|
423
|
+
title: block.title
|
|
424
|
+
};
|
|
416
425
|
} else {
|
|
417
426
|
// block.type === 'brain'
|
|
418
427
|
return {
|
|
@@ -543,6 +552,30 @@ export var Brain = /*#__PURE__*/ function() {
|
|
|
543
552
|
return this.nextBrain();
|
|
544
553
|
}
|
|
545
554
|
},
|
|
555
|
+
{
|
|
556
|
+
key: "wait",
|
|
557
|
+
value: function wait(title, action) {
|
|
558
|
+
var waitBlock = {
|
|
559
|
+
type: 'wait',
|
|
560
|
+
title: title,
|
|
561
|
+
action: action
|
|
562
|
+
};
|
|
563
|
+
this.blocks.push(waitBlock);
|
|
564
|
+
return this.nextBrain();
|
|
565
|
+
}
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
key: "guard",
|
|
569
|
+
value: function guard(predicate, title) {
|
|
570
|
+
var guardBlock = {
|
|
571
|
+
type: 'guard',
|
|
572
|
+
title: title !== null && title !== void 0 ? title : 'Guard',
|
|
573
|
+
predicate: predicate
|
|
574
|
+
};
|
|
575
|
+
this.blocks.push(guardBlock);
|
|
576
|
+
return this.nextBrain();
|
|
577
|
+
}
|
|
578
|
+
},
|
|
546
579
|
{
|
|
547
580
|
// Implementation
|
|
548
581
|
key: "brain",
|
|
@@ -635,134 +668,30 @@ export var Brain = /*#__PURE__*/ function() {
|
|
|
635
668
|
// At this point, outputSchema is guaranteed to exist (schema-less case returned early)
|
|
636
669
|
var outputSchema = config.outputSchema;
|
|
637
670
|
if (batchConfig) {
|
|
638
|
-
// Batch mode -
|
|
671
|
+
// Batch mode - store config on block for event-stream to execute with per-item events
|
|
639
672
|
var promptBlock1 = {
|
|
640
673
|
type: 'step',
|
|
641
674
|
title: title,
|
|
642
675
|
action: function(param) {
|
|
643
|
-
var state = param.state
|
|
676
|
+
var state = param.state;
|
|
644
677
|
return _async_to_generator(function() {
|
|
645
|
-
var template, stepClient, schema, schemaName, client, items, _batchConfig_concurrency, semaphore, _batchConfig_stagger, stagger, retryConfig, results, sleep, promises, finalResults;
|
|
646
678
|
return _ts_generator(this, function(_state) {
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
client = stepClient !== null && stepClient !== void 0 ? stepClient : runClient;
|
|
652
|
-
items = batchConfig.over(state);
|
|
653
|
-
semaphore = new Semaphore((_batchConfig_concurrency = batchConfig.concurrency) !== null && _batchConfig_concurrency !== void 0 ? _batchConfig_concurrency : 10);
|
|
654
|
-
stagger = (_batchConfig_stagger = batchConfig.stagger) !== null && _batchConfig_stagger !== void 0 ? _batchConfig_stagger : 0;
|
|
655
|
-
retryConfig = normalizeRetryConfig(batchConfig.retry);
|
|
656
|
-
results = new Array(items.length);
|
|
657
|
-
sleep = function(ms) {
|
|
658
|
-
return new Promise(function(r) {
|
|
659
|
-
return setTimeout(r, ms);
|
|
660
|
-
});
|
|
661
|
-
};
|
|
662
|
-
promises = items.map(function(item, index) {
|
|
663
|
-
return _async_to_generator(function() {
|
|
664
|
-
var promptText, output, error, fallback;
|
|
665
|
-
return _ts_generator(this, function(_state) {
|
|
666
|
-
switch(_state.label){
|
|
667
|
-
case 0:
|
|
668
|
-
if (!(stagger > 0 && index > 0)) return [
|
|
669
|
-
3,
|
|
670
|
-
2
|
|
671
|
-
];
|
|
672
|
-
return [
|
|
673
|
-
4,
|
|
674
|
-
sleep(stagger * index)
|
|
675
|
-
];
|
|
676
|
-
case 1:
|
|
677
|
-
_state.sent();
|
|
678
|
-
_state.label = 2;
|
|
679
|
-
case 2:
|
|
680
|
-
return [
|
|
681
|
-
4,
|
|
682
|
-
semaphore.acquire()
|
|
683
|
-
];
|
|
684
|
-
case 3:
|
|
685
|
-
_state.sent();
|
|
686
|
-
_state.label = 4;
|
|
687
|
-
case 4:
|
|
688
|
-
_state.trys.push([
|
|
689
|
-
4,
|
|
690
|
-
7,
|
|
691
|
-
8,
|
|
692
|
-
9
|
|
693
|
-
]);
|
|
694
|
-
return [
|
|
695
|
-
4,
|
|
696
|
-
template(item, resources)
|
|
697
|
-
];
|
|
698
|
-
case 5:
|
|
699
|
-
promptText = _state.sent();
|
|
700
|
-
return [
|
|
701
|
-
4,
|
|
702
|
-
executeWithRetry(function() {
|
|
703
|
-
return client.generateObject({
|
|
704
|
-
schema: schema,
|
|
705
|
-
schemaName: schemaName,
|
|
706
|
-
prompt: promptText
|
|
707
|
-
});
|
|
708
|
-
}, retryConfig)
|
|
709
|
-
];
|
|
710
|
-
case 6:
|
|
711
|
-
output = _state.sent();
|
|
712
|
-
results[index] = [
|
|
713
|
-
item,
|
|
714
|
-
output
|
|
715
|
-
];
|
|
716
|
-
return [
|
|
717
|
-
3,
|
|
718
|
-
9
|
|
719
|
-
];
|
|
720
|
-
case 7:
|
|
721
|
-
error = _state.sent();
|
|
722
|
-
if (batchConfig.error) {
|
|
723
|
-
fallback = batchConfig.error(item, error);
|
|
724
|
-
if (fallback !== null) {
|
|
725
|
-
results[index] = [
|
|
726
|
-
item,
|
|
727
|
-
fallback
|
|
728
|
-
];
|
|
729
|
-
}
|
|
730
|
-
} else {
|
|
731
|
-
throw error;
|
|
732
|
-
}
|
|
733
|
-
return [
|
|
734
|
-
3,
|
|
735
|
-
9
|
|
736
|
-
];
|
|
737
|
-
case 8:
|
|
738
|
-
semaphore.release();
|
|
739
|
-
return [
|
|
740
|
-
7
|
|
741
|
-
];
|
|
742
|
-
case 9:
|
|
743
|
-
return [
|
|
744
|
-
2
|
|
745
|
-
];
|
|
746
|
-
}
|
|
747
|
-
});
|
|
748
|
-
})();
|
|
749
|
-
});
|
|
750
|
-
return [
|
|
751
|
-
4,
|
|
752
|
-
Promise.all(promises)
|
|
753
|
-
];
|
|
754
|
-
case 1:
|
|
755
|
-
_state.sent();
|
|
756
|
-
finalResults = results.filter(function(r) {
|
|
757
|
-
return r !== undefined;
|
|
758
|
-
});
|
|
759
|
-
return [
|
|
760
|
-
2,
|
|
761
|
-
_object_spread_props(_object_spread({}, state), _define_property({}, outputSchema.name, finalResults))
|
|
762
|
-
];
|
|
763
|
-
}
|
|
679
|
+
return [
|
|
680
|
+
2,
|
|
681
|
+
state
|
|
682
|
+
];
|
|
764
683
|
});
|
|
765
684
|
})();
|
|
685
|
+
},
|
|
686
|
+
batchConfig: {
|
|
687
|
+
over: batchConfig.over,
|
|
688
|
+
maxRetries: batchConfig.maxRetries,
|
|
689
|
+
error: batchConfig.error,
|
|
690
|
+
template: config.template,
|
|
691
|
+
schema: outputSchema.schema,
|
|
692
|
+
schemaName: outputSchema.name,
|
|
693
|
+
client: config.client,
|
|
694
|
+
chunkSize: batchConfig.chunkSize
|
|
766
695
|
}
|
|
767
696
|
};
|
|
768
697
|
this.blocks.push(promptBlock1);
|
|
@@ -827,8 +756,8 @@ export var Brain = /*#__PURE__*/ function() {
|
|
|
827
756
|
* - `webhook`: Pre-configured WebhookRegistration for form submissions
|
|
828
757
|
*
|
|
829
758
|
* The brain author is responsible for notifying users about the page (via Slack,
|
|
830
|
-
* email, etc.) and using `
|
|
831
|
-
* Form data arrives in the `response` parameter of the step after
|
|
759
|
+
* email, etc.) and using `.wait()` to pause until the form is submitted.
|
|
760
|
+
* Form data arrives in the `response` parameter of the step after `.wait()`.
|
|
832
761
|
*
|
|
833
762
|
* @example
|
|
834
763
|
* ```typescript
|
|
@@ -841,12 +770,11 @@ export var Brain = /*#__PURE__*/ function() {
|
|
|
841
770
|
* comments: z.string(),
|
|
842
771
|
* }),
|
|
843
772
|
* })
|
|
844
|
-
* .step('Notify
|
|
845
|
-
* // Notify user however you want
|
|
773
|
+
* .step('Notify', async ({ state, page, slack }) => {
|
|
846
774
|
* await slack.post('#general', `Please fill out: ${page.url}`);
|
|
847
|
-
*
|
|
848
|
-
* return { state, waitFor: [page.webhook] };
|
|
775
|
+
* return state;
|
|
849
776
|
* })
|
|
777
|
+
* .wait('Wait for submission', ({ page }) => page.webhook)
|
|
850
778
|
* .step('Process Feedback', ({ state, response }) => ({
|
|
851
779
|
* ...state,
|
|
852
780
|
* // response is typed: { rating: number, comments: string }
|
|
@@ -25,7 +25,9 @@ export var BRAIN_EVENTS = {
|
|
|
25
25
|
AGENT_ITERATION_LIMIT: 'agent:iteration_limit',
|
|
26
26
|
AGENT_WEBHOOK: 'agent:webhook',
|
|
27
27
|
AGENT_RAW_RESPONSE_MESSAGE: 'agent:raw_response_message',
|
|
28
|
-
AGENT_USER_MESSAGE: 'agent:user_message'
|
|
28
|
+
AGENT_USER_MESSAGE: 'agent:user_message',
|
|
29
|
+
// Batch prompt events (prompt with `over`)
|
|
30
|
+
BATCH_CHUNK_COMPLETE: 'batch:chunk_complete'
|
|
29
31
|
};
|
|
30
32
|
export var STATUS = {
|
|
31
33
|
PENDING: 'pending',
|
|
@@ -35,6 +37,7 @@ export var STATUS = {
|
|
|
35
37
|
CANCELLED: 'cancelled',
|
|
36
38
|
WAITING: 'waiting',
|
|
37
39
|
PAUSED: 'paused',
|
|
40
|
+
HALTED: 'halted',
|
|
38
41
|
// Internal status for tracking when execution is inside an agent loop.
|
|
39
42
|
// Publicly this maps to RUNNING for consumers.
|
|
40
43
|
AGENT_LOOP: 'agent_loop'
|
|
@@ -238,15 +238,14 @@ export var emailWebhook = createWebhook('email', z.object({
|
|
|
238
238
|
});
|
|
239
239
|
var myBrain = brain('My Brain').step('My Step', function(param) {
|
|
240
240
|
var state = param.state;
|
|
241
|
-
return {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
};
|
|
241
|
+
return _object_spread({
|
|
242
|
+
cool: 'thing'
|
|
243
|
+
}, state);
|
|
244
|
+
}).wait('Wait for response', function() {
|
|
245
|
+
return [
|
|
246
|
+
slackWebhook('thread-123'),
|
|
247
|
+
emailWebhook('email-456')
|
|
248
|
+
];
|
|
250
249
|
}).step('My Step 2', function(param) {
|
|
251
250
|
var state = param.state, response = param.response;
|
|
252
251
|
if (response) {
|