@positronic/core 0.0.36 → 0.0.38

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.
@@ -275,6 +275,7 @@ function _ts_values(o) {
275
275
  }
276
276
  import { BRAIN_EVENTS, STATUS } from './constants.js';
277
277
  import { applyPatches } from './json-patch.js';
278
+ import { reconstructLoopContext } from './loop-messages.js';
278
279
  import { DEFAULT_ENV } from './brain.js';
279
280
  export var BrainRunner = /*#__PURE__*/ function() {
280
281
  "use strict";
@@ -329,12 +330,12 @@ export var BrainRunner = /*#__PURE__*/ function() {
329
330
  key: "run",
330
331
  value: function run(_0) {
331
332
  return _async_to_generator(function(brain) {
332
- var _ref, _ref_initialState, initialState, options, initialCompletedSteps, brainRunId, endAfter, signal, response, _this_options, adapters, client, resources, pages, env, resolvedEnv, currentState, stepNumber, brainRun, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step, _ret, err, error, cancelledEvent;
333
+ var _ref, _ref_initialState, initialState, options, initialCompletedSteps, brainRunId, endAfter, signal, response, loopEvents, _this_options, adapters, client, resources, pages, env, resolvedEnv, currentState, stepNumber, loopResumeContext, brainRun, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step, _ret, err, error, cancelledEvent;
333
334
  var _arguments = arguments;
334
335
  return _ts_generator(this, function(_state) {
335
336
  switch(_state.label){
336
337
  case 0:
337
- _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;
338
+ _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;
338
339
  _this_options = this.options, adapters = _this_options.adapters, client = _this_options.client, resources = _this_options.resources, pages = _this_options.pages, env = _this_options.env;
339
340
  resolvedEnv = env !== null && env !== void 0 ? env : DEFAULT_ENV;
340
341
  currentState = initialState !== null && initialState !== void 0 ? initialState : {};
@@ -351,6 +352,8 @@ export var BrainRunner = /*#__PURE__*/ function() {
351
352
  stepNumber++;
352
353
  }
353
354
  });
355
+ // If loopEvents and response are provided, reconstruct loop context
356
+ loopResumeContext = loopEvents && response ? reconstructLoopContext(loopEvents, response) : null;
354
357
  brainRun = brainRunId && initialCompletedSteps ? brain.run({
355
358
  initialState: initialState,
356
359
  initialCompletedSteps: initialCompletedSteps,
@@ -360,7 +363,8 @@ export var BrainRunner = /*#__PURE__*/ function() {
360
363
  resources: resources !== null && resources !== void 0 ? resources : {},
361
364
  pages: pages,
362
365
  env: resolvedEnv,
363
- response: response
366
+ response: response,
367
+ loopResumeContext: loopResumeContext
364
368
  }) : brain.run({
365
369
  initialState: initialState,
366
370
  options: options,
@@ -1,3 +1,11 @@
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_with_holes(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
1
9
  function _async_generator(gen) {
2
10
  var front, back;
3
11
  function send(key, arg) {
@@ -219,6 +227,33 @@ function _define_property(obj, key, value) {
219
227
  }
220
228
  return obj;
221
229
  }
230
+ function _iterable_to_array_limit(arr, i) {
231
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
232
+ if (_i == null) return;
233
+ var _arr = [];
234
+ var _n = true;
235
+ var _d = false;
236
+ var _s, _e;
237
+ try {
238
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
239
+ _arr.push(_s.value);
240
+ if (i && _arr.length === i) break;
241
+ }
242
+ } catch (err) {
243
+ _d = true;
244
+ _e = err;
245
+ } finally{
246
+ try {
247
+ if (!_n && _i["return"] != null) _i["return"]();
248
+ } finally{
249
+ if (_d) throw _e;
250
+ }
251
+ }
252
+ return _arr;
253
+ }
254
+ function _non_iterable_rest() {
255
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
256
+ }
222
257
  function _object_spread(target) {
223
258
  for(var i = 1; i < arguments.length; i++){
224
259
  var source = arguments[i] != null ? arguments[i] : {};
@@ -289,10 +324,21 @@ function _overload_yield(value, kind) {
289
324
  this.v = value;
290
325
  this.k = kind;
291
326
  }
327
+ function _sliced_to_array(arr, i) {
328
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
329
+ }
292
330
  function _type_of(obj) {
293
331
  "@swc/helpers - typeof";
294
332
  return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
295
333
  }
334
+ function _unsupported_iterable_to_array(o, minLen) {
335
+ if (!o) return;
336
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
337
+ var n = Object.prototype.toString.call(o).slice(8, -1);
338
+ if (n === "Object" && o.constructor) n = o.constructor.name;
339
+ if (n === "Map" || n === "Set") return Array.from(n);
340
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
341
+ }
296
342
  function _wrap_async_generator(fn) {
297
343
  return function() {
298
344
  return new _async_generator(fn.apply(this, arguments));
@@ -442,6 +488,11 @@ export var Brain = /*#__PURE__*/ function() {
442
488
  type: 'step',
443
489
  title: block.title
444
490
  };
491
+ } else if (block.type === 'loop') {
492
+ return {
493
+ type: 'loop',
494
+ title: block.title
495
+ };
445
496
  } else {
446
497
  // block.type === 'brain'
447
498
  return {
@@ -513,6 +564,25 @@ export var Brain = /*#__PURE__*/ function() {
513
564
  return this.nextBrain();
514
565
  }
515
566
  },
567
+ {
568
+ /**
569
+ * Add an agentic loop step that runs an LLM with tools.
570
+ * The loop continues until a terminal tool is called, no tool calls are returned,
571
+ * or maxTokens is exceeded.
572
+ */ key: "loop",
573
+ value: function loop(title, configFn) {
574
+ var loopBlock = {
575
+ type: 'loop',
576
+ title: title,
577
+ configFn: configFn
578
+ };
579
+ this.blocks.push(loopBlock);
580
+ var nextBrain = new Brain(this.title, this.description).withBlocks(this.blocks);
581
+ nextBrain.services = this.services;
582
+ nextBrain.optionsSchema = this.optionsSchema;
583
+ return nextBrain;
584
+ }
585
+ },
516
586
  {
517
587
  // TResponseKey:
518
588
  // The response key must be a string literal, so if defining a response model
@@ -699,7 +769,8 @@ var BrainEventStream = /*#__PURE__*/ function() {
699
769
  _define_property(this, "pages", void 0);
700
770
  _define_property(this, "env", void 0);
701
771
  _define_property(this, "currentResponse", undefined);
702
- var _params_initialState = params.initialState, initialState = _params_initialState === void 0 ? {} : _params_initialState, initialCompletedSteps = params.initialCompletedSteps, blocks = params.blocks, title = params.title, description = params.description, providedBrainRunId = params.brainRunId, _params_options = params.options, options = _params_options === void 0 ? {} : _params_options, client = params.client, services = params.services, _params_resources = params.resources, resources = _params_resources === void 0 ? {} : _params_resources, pages = params.pages, env = params.env, response = params.response;
772
+ _define_property(this, "loopResumeContext", undefined);
773
+ var _params_initialState = params.initialState, initialState = _params_initialState === void 0 ? {} : _params_initialState, initialCompletedSteps = params.initialCompletedSteps, blocks = params.blocks, title = params.title, description = params.description, providedBrainRunId = params.brainRunId, _params_options = params.options, options = _params_options === void 0 ? {} : _params_options, client = params.client, services = params.services, _params_resources = params.resources, resources = _params_resources === void 0 ? {} : _params_resources, pages = params.pages, env = params.env, response = params.response, loopResumeContext = params.loopResumeContext;
703
774
  this.initialState = initialState;
704
775
  this.title = title;
705
776
  this.description = description;
@@ -748,6 +819,10 @@ var BrainEventStream = /*#__PURE__*/ function() {
748
819
  if (response) {
749
820
  this.currentResponse = response;
750
821
  }
822
+ // Set loop resume context if provided (for loop webhook restarts)
823
+ if (loopResumeContext) {
824
+ this.loopResumeContext = loopResumeContext;
825
+ }
751
826
  }
752
827
  _create_class(BrainEventStream, [
753
828
  {
@@ -1076,27 +1151,42 @@ var BrainEventStream = /*#__PURE__*/ function() {
1076
1151
  _state.sent();
1077
1152
  return [
1078
1153
  3,
1079
- 28
1154
+ 30
1080
1155
  ];
1081
1156
  case 16:
1157
+ if (!(block.type === 'loop')) return [
1158
+ 3,
1159
+ 18
1160
+ ];
1161
+ return [
1162
+ 5,
1163
+ _ts_values(_async_generator_delegate(_async_iterator(this.executeLoop(step))))
1164
+ ];
1165
+ case 17:
1166
+ _state.sent();
1167
+ return [
1168
+ 3,
1169
+ 30
1170
+ ];
1171
+ case 18:
1082
1172
  // Get previous state before action
1083
1173
  prevState1 = this.currentState;
1084
1174
  stepBlock = block;
1085
1175
  // Execute step with automatic retry on failure
1086
1176
  retries = 0;
1087
- _state.label = 17;
1088
- case 17:
1177
+ _state.label = 19;
1178
+ case 19:
1089
1179
  if (!true) return [
1090
1180
  3,
1091
- 25
1181
+ 27
1092
1182
  ];
1093
- _state.label = 18;
1094
- case 18:
1183
+ _state.label = 20;
1184
+ case 20:
1095
1185
  _state.trys.push([
1096
- 18,
1097
1186
  20,
1187
+ 22,
1098
1188
  ,
1099
- 24
1189
+ 26
1100
1190
  ]);
1101
1191
  actionPromise = Promise.resolve(stepBlock.action(_object_spread({
1102
1192
  state: this.currentState,
@@ -1111,17 +1201,17 @@ var BrainEventStream = /*#__PURE__*/ function() {
1111
1201
  4,
1112
1202
  _await_async_generator(actionPromise)
1113
1203
  ];
1114
- case 19:
1204
+ case 21:
1115
1205
  result = _state.sent();
1116
1206
  return [
1117
1207
  3,
1118
- 25
1208
+ 27
1119
1209
  ]; // Success
1120
- case 20:
1210
+ case 22:
1121
1211
  error = _state.sent();
1122
1212
  if (!(retries < MAX_RETRIES)) return [
1123
1213
  3,
1124
- 22
1214
+ 24
1125
1215
  ];
1126
1216
  retries++;
1127
1217
  return [
@@ -1140,35 +1230,35 @@ var BrainEventStream = /*#__PURE__*/ function() {
1140
1230
  brainRunId: this.brainRunId
1141
1231
  }
1142
1232
  ];
1143
- case 21:
1233
+ case 23:
1144
1234
  _state.sent();
1145
1235
  return [
1146
1236
  3,
1147
- 23
1237
+ 25
1148
1238
  ];
1149
- case 22:
1239
+ case 24:
1150
1240
  throw error;
1151
- case 23:
1241
+ case 25:
1152
1242
  return [
1153
1243
  3,
1154
- 24
1244
+ 26
1155
1245
  ];
1156
- case 24:
1246
+ case 26:
1157
1247
  return [
1158
1248
  3,
1159
- 17
1249
+ 19
1160
1250
  ];
1161
- case 25:
1251
+ case 27:
1162
1252
  this.currentState = result && (typeof result === "undefined" ? "undefined" : _type_of(result)) === 'object' && 'waitFor' in result ? result.state : result;
1163
1253
  return [
1164
1254
  5,
1165
1255
  _ts_values(_async_generator_delegate(_async_iterator(this.completeStep(step, prevState1))))
1166
1256
  ];
1167
- case 26:
1257
+ case 28:
1168
1258
  _state.sent();
1169
1259
  if (!(result && (typeof result === "undefined" ? "undefined" : _type_of(result)) === 'object' && 'waitFor' in result)) return [
1170
1260
  3,
1171
- 28
1261
+ 30
1172
1262
  ];
1173
1263
  // Serialize webhook registrations (remove Zod schemas for event serializability)
1174
1264
  serializedWaitFor = result.waitFor.map(function(registration) {
@@ -1187,10 +1277,420 @@ var BrainEventStream = /*#__PURE__*/ function() {
1187
1277
  brainRunId: this.brainRunId
1188
1278
  }
1189
1279
  ];
1280
+ case 29:
1281
+ _state.sent();
1282
+ _state.label = 30;
1283
+ case 30:
1284
+ return [
1285
+ 2
1286
+ ];
1287
+ }
1288
+ });
1289
+ }).call(this);
1290
+ }
1291
+ },
1292
+ {
1293
+ key: "executeLoop",
1294
+ value: function executeLoop(step) {
1295
+ return _wrap_async_generator(function() {
1296
+ var block, prevState, _this_options, config, messages, resumeContext, _this_options1, _this_options2, _this_options3, totalTokens, iteration, _this_options4, toolsForClient, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, name, toolDef, tool, response, _this_options5, _this_options6, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, toolCall, _this_options7, tool1, _this_options8, toolResult, waitForResult, _this_options9, _this_options10, _this_options11, err;
1297
+ return _ts_generator(this, function(_state) {
1298
+ switch(_state.label){
1299
+ case 0:
1300
+ block = step.block;
1301
+ prevState = this.currentState;
1302
+ return [
1303
+ 4,
1304
+ _await_async_generator(block.configFn(_object_spread({
1305
+ state: this.currentState,
1306
+ options: (_this_options = this.options) !== null && _this_options !== void 0 ? _this_options : {},
1307
+ client: this.client,
1308
+ resources: this.resources,
1309
+ response: this.currentResponse,
1310
+ pages: this.pages,
1311
+ env: this.env
1312
+ }, this.services)))
1313
+ ];
1314
+ case 1:
1315
+ config = _state.sent();
1316
+ if (!this.loopResumeContext) return [
1317
+ 3,
1318
+ 4
1319
+ ];
1320
+ resumeContext = this.loopResumeContext;
1321
+ // Emit WEBHOOK_RESPONSE event to record the response
1322
+ return [
1323
+ 4,
1324
+ {
1325
+ type: BRAIN_EVENTS.WEBHOOK_RESPONSE,
1326
+ response: this.currentResponse,
1327
+ options: (_this_options1 = this.options) !== null && _this_options1 !== void 0 ? _this_options1 : {},
1328
+ brainRunId: this.brainRunId
1329
+ }
1330
+ ];
1331
+ case 2:
1332
+ _state.sent();
1333
+ // Emit LOOP_TOOL_RESULT for the pending tool (webhook response injected as tool result)
1334
+ return [
1335
+ 4,
1336
+ {
1337
+ type: BRAIN_EVENTS.LOOP_TOOL_RESULT,
1338
+ stepTitle: step.block.title,
1339
+ stepId: step.id,
1340
+ toolCallId: resumeContext.pendingToolCallId,
1341
+ toolName: resumeContext.pendingToolName,
1342
+ result: this.currentResponse,
1343
+ options: (_this_options2 = this.options) !== null && _this_options2 !== void 0 ? _this_options2 : {},
1344
+ brainRunId: this.brainRunId
1345
+ }
1346
+ ];
1347
+ case 3:
1348
+ _state.sent();
1349
+ // Use restored messages from the resume context
1350
+ messages = resumeContext.messages;
1351
+ // Clear the context so it's only used once
1352
+ this.loopResumeContext = undefined;
1353
+ return [
1354
+ 3,
1355
+ 6
1356
+ ];
1357
+ case 4:
1358
+ // Emit loop start event (only for fresh starts)
1359
+ return [
1360
+ 4,
1361
+ {
1362
+ type: BRAIN_EVENTS.LOOP_START,
1363
+ stepTitle: step.block.title,
1364
+ stepId: step.id,
1365
+ prompt: config.prompt,
1366
+ system: config.system,
1367
+ options: (_this_options3 = this.options) !== null && _this_options3 !== void 0 ? _this_options3 : {},
1368
+ brainRunId: this.brainRunId
1369
+ }
1370
+ ];
1371
+ case 5:
1372
+ _state.sent();
1373
+ // Initialize messages for fresh start
1374
+ messages = [
1375
+ {
1376
+ role: 'user',
1377
+ content: config.prompt
1378
+ }
1379
+ ];
1380
+ _state.label = 6;
1381
+ case 6:
1382
+ // Initialize token tracking
1383
+ totalTokens = 0;
1384
+ iteration = 0;
1385
+ _state.label = 7;
1386
+ case 7:
1387
+ if (!true) return [
1388
+ 3,
1389
+ 33
1390
+ ];
1391
+ iteration++;
1392
+ // Emit iteration event
1393
+ return [
1394
+ 4,
1395
+ {
1396
+ type: BRAIN_EVENTS.LOOP_ITERATION,
1397
+ stepTitle: step.block.title,
1398
+ stepId: step.id,
1399
+ iteration: iteration,
1400
+ options: (_this_options4 = this.options) !== null && _this_options4 !== void 0 ? _this_options4 : {},
1401
+ brainRunId: this.brainRunId
1402
+ }
1403
+ ];
1404
+ case 8:
1405
+ _state.sent();
1406
+ // Check if client supports generateText
1407
+ if (!this.client.generateText) {
1408
+ throw new Error('Client does not support generateText. Use a client that implements generateText for loop steps.');
1409
+ }
1410
+ // Build tools object for the client (description and inputSchema only)
1411
+ toolsForClient = {};
1412
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1413
+ try {
1414
+ for(_iterator = Object.entries(config.tools)[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1415
+ _step_value = _sliced_to_array(_step.value, 2), name = _step_value[0], toolDef = _step_value[1];
1416
+ tool = toolDef;
1417
+ toolsForClient[name] = {
1418
+ description: tool.description,
1419
+ inputSchema: tool.inputSchema
1420
+ };
1421
+ }
1422
+ } catch (err) {
1423
+ _didIteratorError = true;
1424
+ _iteratorError = err;
1425
+ } finally{
1426
+ try {
1427
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
1428
+ _iterator.return();
1429
+ }
1430
+ } finally{
1431
+ if (_didIteratorError) {
1432
+ throw _iteratorError;
1433
+ }
1434
+ }
1435
+ }
1436
+ return [
1437
+ 4,
1438
+ _await_async_generator(this.client.generateText({
1439
+ system: config.system,
1440
+ messages: messages,
1441
+ tools: toolsForClient
1442
+ }))
1443
+ ];
1444
+ case 9:
1445
+ response = _state.sent();
1446
+ // Track tokens
1447
+ totalTokens += response.usage.totalTokens;
1448
+ if (!(config.maxTokens && totalTokens > config.maxTokens)) return [
1449
+ 3,
1450
+ 12
1451
+ ];
1452
+ return [
1453
+ 4,
1454
+ {
1455
+ type: BRAIN_EVENTS.LOOP_TOKEN_LIMIT,
1456
+ stepTitle: step.block.title,
1457
+ stepId: step.id,
1458
+ totalTokens: totalTokens,
1459
+ maxTokens: config.maxTokens,
1460
+ options: (_this_options5 = this.options) !== null && _this_options5 !== void 0 ? _this_options5 : {},
1461
+ brainRunId: this.brainRunId
1462
+ }
1463
+ ];
1464
+ case 10:
1465
+ _state.sent();
1466
+ return [
1467
+ 5,
1468
+ _ts_values(_async_generator_delegate(_async_iterator(this.completeStep(step, prevState))))
1469
+ ];
1470
+ case 11:
1471
+ _state.sent();
1472
+ return [
1473
+ 2
1474
+ ];
1475
+ case 12:
1476
+ if (!response.text) return [
1477
+ 3,
1478
+ 14
1479
+ ];
1480
+ return [
1481
+ 4,
1482
+ {
1483
+ type: BRAIN_EVENTS.LOOP_ASSISTANT_MESSAGE,
1484
+ stepTitle: step.block.title,
1485
+ stepId: step.id,
1486
+ content: response.text,
1487
+ options: (_this_options6 = this.options) !== null && _this_options6 !== void 0 ? _this_options6 : {},
1488
+ brainRunId: this.brainRunId
1489
+ }
1490
+ ];
1491
+ case 13:
1492
+ _state.sent();
1493
+ messages.push({
1494
+ role: 'assistant',
1495
+ content: response.text
1496
+ });
1497
+ _state.label = 14;
1498
+ case 14:
1499
+ if (!(!response.toolCalls || response.toolCalls.length === 0)) return [
1500
+ 3,
1501
+ 16
1502
+ ];
1503
+ return [
1504
+ 5,
1505
+ _ts_values(_async_generator_delegate(_async_iterator(this.completeStep(step, prevState))))
1506
+ ];
1507
+ case 15:
1508
+ _state.sent();
1509
+ return [
1510
+ 2
1511
+ ];
1512
+ case 16:
1513
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1514
+ _state.label = 17;
1515
+ case 17:
1516
+ _state.trys.push([
1517
+ 17,
1518
+ 30,
1519
+ 31,
1520
+ 32
1521
+ ]);
1522
+ _iterator1 = response.toolCalls[Symbol.iterator]();
1523
+ _state.label = 18;
1524
+ case 18:
1525
+ if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
1526
+ 3,
1527
+ 29
1528
+ ];
1529
+ toolCall = _step1.value;
1530
+ return [
1531
+ 4,
1532
+ {
1533
+ type: BRAIN_EVENTS.LOOP_TOOL_CALL,
1534
+ stepTitle: step.block.title,
1535
+ stepId: step.id,
1536
+ toolName: toolCall.toolName,
1537
+ toolCallId: toolCall.toolCallId,
1538
+ input: toolCall.args,
1539
+ options: (_this_options7 = this.options) !== null && _this_options7 !== void 0 ? _this_options7 : {},
1540
+ brainRunId: this.brainRunId
1541
+ }
1542
+ ];
1543
+ case 19:
1544
+ _state.sent();
1545
+ tool1 = config.tools[toolCall.toolName];
1546
+ if (!tool1) {
1547
+ throw new Error("Unknown tool: ".concat(toolCall.toolName));
1548
+ }
1549
+ if (!tool1.terminal) return [
1550
+ 3,
1551
+ 22
1552
+ ];
1553
+ return [
1554
+ 4,
1555
+ {
1556
+ type: BRAIN_EVENTS.LOOP_COMPLETE,
1557
+ stepTitle: step.block.title,
1558
+ stepId: step.id,
1559
+ terminalToolName: toolCall.toolName,
1560
+ result: toolCall.args,
1561
+ totalIterations: iteration,
1562
+ options: (_this_options8 = this.options) !== null && _this_options8 !== void 0 ? _this_options8 : {},
1563
+ brainRunId: this.brainRunId
1564
+ }
1565
+ ];
1566
+ case 20:
1567
+ _state.sent();
1568
+ // Merge terminal result into state
1569
+ this.currentState = _object_spread({}, this.currentState, toolCall.args);
1570
+ return [
1571
+ 5,
1572
+ _ts_values(_async_generator_delegate(_async_iterator(this.completeStep(step, prevState))))
1573
+ ];
1574
+ case 21:
1575
+ _state.sent();
1576
+ return [
1577
+ 2
1578
+ ];
1579
+ case 22:
1580
+ if (!tool1.execute) return [
1581
+ 3,
1582
+ 28
1583
+ ];
1584
+ return [
1585
+ 4,
1586
+ _await_async_generator(Promise.resolve(tool1.execute(toolCall.args)))
1587
+ ];
1588
+ case 23:
1589
+ toolResult = _state.sent();
1590
+ if (!(toolResult && (typeof toolResult === "undefined" ? "undefined" : _type_of(toolResult)) === 'object' && 'waitFor' in toolResult)) return [
1591
+ 3,
1592
+ 26
1593
+ ];
1594
+ waitForResult = toolResult;
1595
+ // Emit loop webhook event first (captures pending tool context)
1596
+ return [
1597
+ 4,
1598
+ {
1599
+ type: BRAIN_EVENTS.LOOP_WEBHOOK,
1600
+ stepTitle: step.block.title,
1601
+ stepId: step.id,
1602
+ toolCallId: toolCall.toolCallId,
1603
+ toolName: toolCall.toolName,
1604
+ input: toolCall.args,
1605
+ options: (_this_options9 = this.options) !== null && _this_options9 !== void 0 ? _this_options9 : {},
1606
+ brainRunId: this.brainRunId
1607
+ }
1608
+ ];
1609
+ case 24:
1610
+ _state.sent();
1611
+ // Then emit webhook event
1612
+ return [
1613
+ 4,
1614
+ {
1615
+ type: BRAIN_EVENTS.WEBHOOK,
1616
+ waitFor: [
1617
+ {
1618
+ slug: waitForResult.waitFor.slug,
1619
+ identifier: waitForResult.waitFor.identifier
1620
+ }
1621
+ ],
1622
+ state: this.currentState,
1623
+ options: (_this_options10 = this.options) !== null && _this_options10 !== void 0 ? _this_options10 : {},
1624
+ brainRunId: this.brainRunId
1625
+ }
1626
+ ];
1627
+ case 25:
1628
+ _state.sent();
1629
+ return [
1630
+ 2
1631
+ ];
1632
+ case 26:
1633
+ // Normal tool result
1634
+ return [
1635
+ 4,
1636
+ {
1637
+ type: BRAIN_EVENTS.LOOP_TOOL_RESULT,
1638
+ stepTitle: step.block.title,
1639
+ stepId: step.id,
1640
+ toolName: toolCall.toolName,
1641
+ toolCallId: toolCall.toolCallId,
1642
+ result: toolResult,
1643
+ options: (_this_options11 = this.options) !== null && _this_options11 !== void 0 ? _this_options11 : {},
1644
+ brainRunId: this.brainRunId
1645
+ }
1646
+ ];
1190
1647
  case 27:
1191
1648
  _state.sent();
1649
+ messages.push({
1650
+ role: 'tool',
1651
+ content: JSON.stringify(toolResult),
1652
+ toolCallId: toolCall.toolCallId,
1653
+ toolName: toolCall.toolName
1654
+ });
1192
1655
  _state.label = 28;
1193
1656
  case 28:
1657
+ _iteratorNormalCompletion1 = true;
1658
+ return [
1659
+ 3,
1660
+ 18
1661
+ ];
1662
+ case 29:
1663
+ return [
1664
+ 3,
1665
+ 32
1666
+ ];
1667
+ case 30:
1668
+ err = _state.sent();
1669
+ _didIteratorError1 = true;
1670
+ _iteratorError1 = err;
1671
+ return [
1672
+ 3,
1673
+ 32
1674
+ ];
1675
+ case 31:
1676
+ try {
1677
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1678
+ _iterator1.return();
1679
+ }
1680
+ } finally{
1681
+ if (_didIteratorError1) {
1682
+ throw _iteratorError1;
1683
+ }
1684
+ }
1685
+ return [
1686
+ 7
1687
+ ];
1688
+ case 32:
1689
+ return [
1690
+ 3,
1691
+ 7
1692
+ ];
1693
+ case 33:
1194
1694
  return [
1195
1695
  2
1196
1696
  ];
@@ -8,7 +8,17 @@ export var BRAIN_EVENTS = {
8
8
  ERROR: 'brain:error',
9
9
  COMPLETE: 'brain:complete',
10
10
  CANCELLED: 'brain:cancelled',
11
- WEBHOOK: 'brain:webhook'
11
+ WEBHOOK: 'brain:webhook',
12
+ WEBHOOK_RESPONSE: 'brain:webhook_response',
13
+ // Loop step events
14
+ LOOP_START: 'loop:start',
15
+ LOOP_ITERATION: 'loop:iteration',
16
+ LOOP_TOOL_CALL: 'loop:tool_call',
17
+ LOOP_TOOL_RESULT: 'loop:tool_result',
18
+ LOOP_ASSISTANT_MESSAGE: 'loop:assistant_message',
19
+ LOOP_COMPLETE: 'loop:complete',
20
+ LOOP_TOKEN_LIMIT: 'loop:token_limit',
21
+ LOOP_WEBHOOK: 'loop:webhook'
12
22
  };
13
23
  export var STATUS = {
14
24
  PENDING: 'pending',
@@ -0,0 +1,75 @@
1
+ import { BRAIN_EVENTS } from './constants.js';
2
+ /**
3
+ * Reconstructs the loop context from stored events and a webhook response.
4
+ * Returns null if this is not a loop resume (no LOOP_WEBHOOK event found).
5
+ */ export function reconstructLoopContext(events, webhookResponse) {
6
+ // Find LOOP_WEBHOOK event - if not present, this is not a loop resume
7
+ var loopWebhookEvent = events.find(function(e) {
8
+ return e.type === BRAIN_EVENTS.LOOP_WEBHOOK;
9
+ });
10
+ if (!loopWebhookEvent) {
11
+ return null;
12
+ }
13
+ // Find LOOP_START to get the initial prompt and system
14
+ var loopStartEvent = events.find(function(e) {
15
+ return e.type === BRAIN_EVENTS.LOOP_START;
16
+ });
17
+ if (!loopStartEvent) {
18
+ throw new Error('LOOP_START event not found but LOOP_WEBHOOK exists - invalid event sequence');
19
+ }
20
+ var messages = [];
21
+ // Add initial user message from the prompt
22
+ messages.push({
23
+ role: 'user',
24
+ content: loopStartEvent.prompt
25
+ });
26
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
27
+ try {
28
+ // Process events in order to rebuild conversation
29
+ for(var _iterator = events[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
30
+ var event = _step.value;
31
+ if (event.type === BRAIN_EVENTS.LOOP_ASSISTANT_MESSAGE) {
32
+ var assistantEvent = event;
33
+ messages.push({
34
+ role: 'assistant',
35
+ content: assistantEvent.content
36
+ });
37
+ } else if (event.type === BRAIN_EVENTS.LOOP_TOOL_RESULT) {
38
+ var toolResultEvent = event;
39
+ messages.push({
40
+ role: 'tool',
41
+ content: JSON.stringify(toolResultEvent.result),
42
+ toolCallId: toolResultEvent.toolCallId,
43
+ toolName: toolResultEvent.toolName
44
+ });
45
+ }
46
+ }
47
+ } catch (err) {
48
+ _didIteratorError = true;
49
+ _iteratorError = err;
50
+ } finally{
51
+ try {
52
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
53
+ _iterator.return();
54
+ }
55
+ } finally{
56
+ if (_didIteratorError) {
57
+ throw _iteratorError;
58
+ }
59
+ }
60
+ }
61
+ // Add the webhook response as the pending tool's result
62
+ messages.push({
63
+ role: 'tool',
64
+ content: JSON.stringify(webhookResponse),
65
+ toolCallId: loopWebhookEvent.toolCallId,
66
+ toolName: loopWebhookEvent.toolName
67
+ });
68
+ return {
69
+ messages: messages,
70
+ pendingToolCallId: loopWebhookEvent.toolCallId,
71
+ pendingToolName: loopWebhookEvent.toolName,
72
+ prompt: loopStartEvent.prompt,
73
+ system: loopStartEvent.system
74
+ };
75
+ }
@@ -1 +1,4 @@
1
- export { };
1
+ /**
2
+ * Helper type to extract the terminal tool's input type from a tools object.
3
+ * Used for typing the result that gets merged into state.
4
+ */ export { };
package/dist/src/index.js CHANGED
@@ -10,3 +10,4 @@ export { z } from 'zod';
10
10
  export { createResources } from './resources/resources.js';
11
11
  export { createWebhook } from './dsl/webhook.js';
12
12
  export { RESOURCE_TYPES } from './resources/resources.js';
13
+ export { reconstructLoopContext } from './dsl/loop-messages.js';
@@ -6,6 +6,16 @@ export type Message = {
6
6
  role: 'user' | 'assistant' | 'system';
7
7
  content: string;
8
8
  };
9
+ /**
10
+ * Represents a message in a tool-calling conversation.
11
+ * Extends Message to include tool messages.
12
+ */
13
+ export type ToolMessage = {
14
+ role: 'user' | 'assistant' | 'system' | 'tool';
15
+ content: string;
16
+ toolCallId?: string;
17
+ toolName?: string;
18
+ };
9
19
  /**
10
20
  * Interface for AI model interactions, focused on generating structured objects
11
21
  * and potentially other types of content in the future.
@@ -46,5 +56,33 @@ export interface ObjectGenerator {
46
56
  */
47
57
  system?: string;
48
58
  }): Promise<z.infer<T>>;
59
+ /**
60
+ * Generates text with optional tool calling support.
61
+ * Used by loop steps for agentic workflows.
62
+ */
63
+ generateText?(params: {
64
+ /** System prompt for the LLM */
65
+ system?: string;
66
+ /** Conversation messages (including tool messages) */
67
+ messages: ToolMessage[];
68
+ /** Available tools for the LLM to call */
69
+ tools: Record<string, {
70
+ description: string;
71
+ inputSchema: z.ZodSchema;
72
+ }>;
73
+ }): Promise<{
74
+ /** Text response from the LLM */
75
+ text?: string;
76
+ /** Tool calls made by the LLM */
77
+ toolCalls?: Array<{
78
+ toolCallId: string;
79
+ toolName: string;
80
+ args: unknown;
81
+ }>;
82
+ /** Token usage information */
83
+ usage: {
84
+ totalTokens: number;
85
+ };
86
+ }>;
49
87
  }
50
88
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/clients/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE;QAC/C;;;WAGG;QACH,MAAM,EAAE,CAAC,CAAC;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAE3B;;;;;WAKG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB;;;;;WAKG;QACH,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QAErB;;;;WAIG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/clients/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE;QAC/C;;;WAGG;QACH,MAAM,EAAE,CAAC,CAAC;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAE3B;;;;;WAKG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB;;;;;WAKG;QACH,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QAErB;;;;WAIG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAExB;;;OAGG;IACH,YAAY,CAAC,CAAC,MAAM,EAAE;QACpB,gCAAgC;QAChC,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,sDAAsD;QACtD,QAAQ,EAAE,WAAW,EAAE,CAAC;QACxB,0CAA0C;QAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAA;SAAE,CAAC,CAAC;KAC1E,GAAG,OAAO,CAAC;QACV,iCAAiC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,iCAAiC;QACjC,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,UAAU,EAAE,MAAM,CAAC;YACnB,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,OAAO,CAAC;SACf,CAAC,CAAC;QACH,8BAA8B;QAC9B,KAAK,EAAE;YAAE,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC;KAChC,CAAC,CAAC;CACJ"}
@@ -1,5 +1,5 @@
1
1
  import type { Adapter } from '../adapters/types.js';
2
- import { type SerializedStep, type Brain } from './brain.js';
2
+ import { type SerializedStep, type Brain, type BrainEvent } from './brain.js';
3
3
  import type { State, JsonObject, RuntimeEnv } from './types.js';
4
4
  import type { ObjectGenerator } from '../clients/types.js';
5
5
  import type { Resources } from '../resources/resources.js';
@@ -18,7 +18,7 @@ export declare class BrainRunner {
18
18
  withResources(resources: Resources): BrainRunner;
19
19
  withPages(pages: PagesService): BrainRunner;
20
20
  withEnv(env: RuntimeEnv): BrainRunner;
21
- run<TOptions extends JsonObject = {}, TState extends State = {}>(brain: Brain<TOptions, TState, any>, { initialState, options, initialCompletedSteps, brainRunId, endAfter, signal, response, }?: {
21
+ run<TOptions extends JsonObject = {}, TState extends State = {}>(brain: Brain<TOptions, TState, any>, { initialState, options, initialCompletedSteps, brainRunId, endAfter, signal, response, loopEvents, }?: {
22
22
  initialState?: TState;
23
23
  options?: TOptions;
24
24
  initialCompletedSteps?: SerializedStep[] | never;
@@ -26,6 +26,7 @@ export declare class BrainRunner {
26
26
  endAfter?: number;
27
27
  signal?: AbortSignal;
28
28
  response?: JsonObject;
29
+ loopEvents?: BrainEvent[];
29
30
  }): Promise<TState>;
30
31
  }
31
32
  //# sourceMappingURL=brain-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brain-runner.d.ts","sourceRoot":"","sources":["../../../src/dsl/brain-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAe,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1E,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,GACT,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;KAClB,GACL,OAAO,CAAC,MAAM,CAAC;CAmGnB"}
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;CA0GnB"}
@@ -1,10 +1,11 @@
1
1
  import { z } from 'zod';
2
2
  import type { ObjectGenerator } from '../clients/types.js';
3
- import type { State, JsonPatch, JsonObject, RuntimeEnv } from './types.js';
3
+ import type { State, JsonPatch, JsonObject, RuntimeEnv, LoopTool, LoopConfig } from './types.js';
4
4
  import { STATUS, BRAIN_EVENTS } from './constants.js';
5
5
  import type { Resources } from '../resources/resources.js';
6
6
  import type { ExtractWebhookResponses, SerializedWebhookRegistration } from './webhook.js';
7
7
  import type { PagesService } from './pages.js';
8
+ import type { LoopResumeContext } from './loop-messages.js';
8
9
  export type SerializedError = {
9
10
  name: string;
10
11
  message: string;
@@ -86,7 +87,69 @@ export interface WebhookEvent<TOptions extends JsonObject = JsonObject> extends
86
87
  waitFor: SerializedWebhookRegistration[];
87
88
  state: State;
88
89
  }
89
- export type BrainEvent<TOptions extends JsonObject = JsonObject> = BrainStartEvent<TOptions> | BrainCompleteEvent<TOptions> | BrainErrorEvent<TOptions> | BrainCancelledEvent<TOptions> | StepStatusEvent<TOptions> | StepStartedEvent<TOptions> | StepCompletedEvent<TOptions> | StepRetryEvent<TOptions> | WebhookEvent<TOptions>;
90
+ export interface LoopStartEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
91
+ type: typeof BRAIN_EVENTS.LOOP_START;
92
+ stepTitle: string;
93
+ stepId: string;
94
+ prompt: string;
95
+ system?: string;
96
+ }
97
+ export interface LoopIterationEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
98
+ type: typeof BRAIN_EVENTS.LOOP_ITERATION;
99
+ stepTitle: string;
100
+ stepId: string;
101
+ iteration: number;
102
+ }
103
+ export interface LoopToolCallEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
104
+ type: typeof BRAIN_EVENTS.LOOP_TOOL_CALL;
105
+ stepTitle: string;
106
+ stepId: string;
107
+ toolName: string;
108
+ toolCallId: string;
109
+ input: JsonObject;
110
+ }
111
+ export interface LoopToolResultEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
112
+ type: typeof BRAIN_EVENTS.LOOP_TOOL_RESULT;
113
+ stepTitle: string;
114
+ stepId: string;
115
+ toolName: string;
116
+ toolCallId: string;
117
+ result: unknown;
118
+ }
119
+ export interface LoopAssistantMessageEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
120
+ type: typeof BRAIN_EVENTS.LOOP_ASSISTANT_MESSAGE;
121
+ stepTitle: string;
122
+ stepId: string;
123
+ content: string;
124
+ }
125
+ export interface LoopCompleteEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
126
+ type: typeof BRAIN_EVENTS.LOOP_COMPLETE;
127
+ stepTitle: string;
128
+ stepId: string;
129
+ terminalToolName: string;
130
+ result: JsonObject;
131
+ totalIterations: number;
132
+ }
133
+ export interface LoopTokenLimitEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
134
+ type: typeof BRAIN_EVENTS.LOOP_TOKEN_LIMIT;
135
+ stepTitle: string;
136
+ stepId: string;
137
+ totalTokens: number;
138
+ maxTokens: number;
139
+ }
140
+ export interface LoopWebhookEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
141
+ type: typeof BRAIN_EVENTS.LOOP_WEBHOOK;
142
+ stepTitle: string;
143
+ stepId: string;
144
+ toolCallId: string;
145
+ toolName: string;
146
+ input: JsonObject;
147
+ }
148
+ export interface WebhookResponseEvent<TOptions extends JsonObject = JsonObject> extends BaseEvent<TOptions> {
149
+ type: typeof BRAIN_EVENTS.WEBHOOK_RESPONSE;
150
+ response: JsonObject;
151
+ }
152
+ export type BrainEvent<TOptions extends JsonObject = JsonObject> = BrainStartEvent<TOptions> | BrainCompleteEvent<TOptions> | BrainErrorEvent<TOptions> | BrainCancelledEvent<TOptions> | StepStatusEvent<TOptions> | StepStartedEvent<TOptions> | StepCompletedEvent<TOptions> | StepRetryEvent<TOptions> | WebhookEvent<TOptions> | WebhookResponseEvent<TOptions> | LoopStartEvent<TOptions> | LoopIterationEvent<TOptions> | LoopToolCallEvent<TOptions> | LoopToolResultEvent<TOptions> | LoopAssistantMessageEvent<TOptions> | LoopCompleteEvent<TOptions> | LoopTokenLimitEvent<TOptions> | LoopWebhookEvent<TOptions>;
90
153
  export interface SerializedStep {
91
154
  title: string;
92
155
  status: (typeof STATUS)[keyof typeof STATUS];
@@ -98,7 +161,7 @@ export interface BrainStructure {
98
161
  title: string;
99
162
  description?: string;
100
163
  steps: Array<{
101
- type: 'step' | 'brain';
164
+ type: 'step' | 'brain' | 'loop';
102
165
  title: string;
103
166
  innerBrain?: BrainStructure;
104
167
  }>;
@@ -126,6 +189,7 @@ export interface RerunParams<TOptions extends JsonObject = JsonObject> extends B
126
189
  initialCompletedSteps: SerializedStep[];
127
190
  brainRunId: string;
128
191
  response?: JsonObject;
192
+ loopResumeContext?: LoopResumeContext | null;
129
193
  }
130
194
  export declare class Brain<TOptions extends JsonObject = JsonObject, TState extends State = object, TServices extends object = object, TResponse extends JsonObject | undefined = undefined> {
131
195
  readonly title: string;
@@ -158,6 +222,20 @@ export declare class Brain<TOptions extends JsonObject = JsonObject, TState exte
158
222
  brainState: TInnerState;
159
223
  services: TServices;
160
224
  }) => TNewState, initialState?: State | ((state: TState) => State)): Brain<TOptions, TNewState, TServices, undefined>;
225
+ /**
226
+ * Add an agentic loop step that runs an LLM with tools.
227
+ * The loop continues until a terminal tool is called, no tool calls are returned,
228
+ * or maxTokens is exceeded.
229
+ */
230
+ loop<TTools extends Record<string, LoopTool> = Record<string, LoopTool>, TNewState extends State = TState>(title: string, configFn: (params: {
231
+ state: TState;
232
+ options: TOptions;
233
+ client: ObjectGenerator;
234
+ resources: Resources;
235
+ response: TResponse;
236
+ pages?: PagesService;
237
+ env: RuntimeEnv;
238
+ } & TServices) => LoopConfig<TTools> | Promise<LoopConfig<TTools>>): Brain<TOptions, TNewState, TServices, TResponse>;
161
239
  prompt<TResponseKey extends string & {
162
240
  readonly brand?: unique symbol;
163
241
  }, TSchema extends z.ZodObject<any>, TNewState extends State = TState & {
@@ -1 +1 @@
1
- {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../../src/dsl/brain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../../src/dsl/brain.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,15 @@ export declare const BRAIN_EVENTS: {
9
9
  readonly COMPLETE: "brain:complete";
10
10
  readonly CANCELLED: "brain:cancelled";
11
11
  readonly WEBHOOK: "brain:webhook";
12
+ readonly WEBHOOK_RESPONSE: "brain:webhook_response";
13
+ readonly LOOP_START: "loop:start";
14
+ readonly LOOP_ITERATION: "loop:iteration";
15
+ readonly LOOP_TOOL_CALL: "loop:tool_call";
16
+ readonly LOOP_TOOL_RESULT: "loop:tool_result";
17
+ readonly LOOP_ASSISTANT_MESSAGE: "loop:assistant_message";
18
+ readonly LOOP_COMPLETE: "loop:complete";
19
+ readonly LOOP_TOKEN_LIMIT: "loop:token_limit";
20
+ readonly LOOP_WEBHOOK: "loop:webhook";
12
21
  };
13
22
  export declare const STATUS: {
14
23
  readonly PENDING: "pending";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/dsl/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;;;;;;;;;;CAWf,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/dsl/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;CAqBf,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { BrainEvent } from './brain.js';
2
+ import type { ToolMessage } from '../clients/types.js';
3
+ import type { JsonObject } from './types.js';
4
+ export interface LoopResumeContext {
5
+ messages: ToolMessage[];
6
+ pendingToolCallId: string;
7
+ pendingToolName: string;
8
+ prompt: string;
9
+ system?: string;
10
+ }
11
+ /**
12
+ * Reconstructs the loop context from stored events and a webhook response.
13
+ * Returns null if this is not a loop resume (no LOOP_WEBHOOK event found).
14
+ */
15
+ export declare function reconstructLoopContext(events: BrainEvent[], webhookResponse: JsonObject): LoopResumeContext | null;
16
+ //# sourceMappingURL=loop-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-messages.d.ts","sourceRoot":"","sources":["../../../src/dsl/loop-messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAKX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,EAAE,EACpB,eAAe,EAAE,UAAU,GAC1B,iBAAiB,GAAG,IAAI,CA0D1B"}
@@ -1,3 +1,5 @@
1
+ import { z } from 'zod';
2
+ import type { WebhookRegistration } from './webhook.js';
1
3
  export type JsonPrimitive = string | number | boolean | null;
2
4
  export type JsonArray = JsonValue[];
3
5
  export type JsonObject = {
@@ -37,4 +39,65 @@ export type JsonPatch = {
37
39
  value?: JsonValue;
38
40
  from?: string;
39
41
  }[];
42
+ /**
43
+ * Return type for tools that need to suspend execution and wait for an external event.
44
+ */
45
+ export interface LoopToolWaitFor {
46
+ waitFor: WebhookRegistration<z.ZodSchema>;
47
+ }
48
+ /**
49
+ * A tool definition for use in loop steps.
50
+ * Compatible with Vercel AI SDK tool format, extended with Positronic-specific properties.
51
+ */
52
+ export interface LoopTool<TInput extends z.ZodSchema = z.ZodSchema> {
53
+ /** Description of what this tool does, helps the LLM understand when to use it */
54
+ description: string;
55
+ /** Zod schema defining the input parameters for this tool */
56
+ inputSchema: TInput;
57
+ /**
58
+ * Execute function for the tool.
59
+ * Can return a result directly, or { waitFor: webhook(...) } to suspend execution.
60
+ * Not required for terminal tools.
61
+ */
62
+ execute?: (input: z.infer<TInput>) => Promise<unknown | LoopToolWaitFor> | unknown | LoopToolWaitFor;
63
+ /**
64
+ * If true, calling this tool ends the loop.
65
+ * The tool's input becomes the loop result (merged into state).
66
+ */
67
+ terminal?: boolean;
68
+ }
69
+ /**
70
+ * Configuration for a loop step.
71
+ */
72
+ export interface LoopConfig<TTools extends Record<string, LoopTool> = Record<string, LoopTool>> {
73
+ /** System prompt for the LLM */
74
+ system?: string;
75
+ /** Initial user prompt to start the conversation */
76
+ prompt: string;
77
+ /** Tools available to the LLM */
78
+ tools: TTools;
79
+ /** Safety valve - exit if cumulative tokens exceed this limit */
80
+ maxTokens?: number;
81
+ }
82
+ /**
83
+ * Represents a single message in the loop conversation.
84
+ */
85
+ export interface LoopMessage {
86
+ role: 'user' | 'assistant' | 'tool';
87
+ content: string;
88
+ /** For tool messages, the ID of the tool call this is responding to */
89
+ toolCallId?: string;
90
+ /** For tool messages, the name of the tool */
91
+ toolName?: string;
92
+ }
93
+ /**
94
+ * Helper type to extract the terminal tool's input type from a tools object.
95
+ * Used for typing the result that gets merged into state.
96
+ */
97
+ export type ExtractTerminalInput<TTools extends Record<string, LoopTool>> = {
98
+ [K in keyof TTools]: TTools[K] extends {
99
+ terminal: true;
100
+ inputSchema: infer S;
101
+ } ? S extends z.ZodSchema ? z.infer<S> : never : never;
102
+ }[keyof TTools];
40
103
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dsl/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AACpC,MAAM,MAAM,UAAU,GAAG;KAAG,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,SAAS;CAAE,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/D,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;CAEvB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dsl/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AACpC,MAAM,MAAM,UAAU,GAAG;KAAG,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,SAAS;CAAE,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/D,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;CAEvB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,EAAE,CAAC;AAIJ;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS;IAChE,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CACR,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KACnB,OAAO,CAAC,OAAO,GAAG,eAAe,CAAC,GAAG,OAAO,GAAG,eAAe,CAAC;IACpE;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU,CACzB,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAElE,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI;KACzE,CAAC,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC,CAAA;KAAE,GAC3E,CAAC,SAAS,CAAC,CAAC,SAAS,GACnB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GACV,KAAK,GACP,KAAK;CACV,CAAC,MAAM,MAAM,CAAC,CAAC"}
@@ -3,8 +3,8 @@ export { BrainRunner } from './dsl/brain-runner.js';
3
3
  export { STATUS, BRAIN_EVENTS } from './dsl/constants.js';
4
4
  export type { Adapter } from './adapters/types.js';
5
5
  export type { BrainEvent, SerializedStep, InitialRunParams, RerunParams, BrainStartEvent, BrainCompleteEvent, BrainErrorEvent, StepStatusEvent, StepStartedEvent, StepCompletedEvent, StepRetryEvent, BrainStructure, BrainFactory, } from './dsl/brain.js';
6
- export type { ObjectGenerator, Message } from './clients/types.js';
7
- export type { State, RuntimeEnv, Secrets } from './dsl/types.js';
6
+ export type { ObjectGenerator, Message, ToolMessage } from './clients/types.js';
7
+ export type { State, RuntimeEnv, Secrets, LoopTool, LoopConfig, LoopMessage, LoopToolWaitFor, ExtractTerminalInput, } from './dsl/types.js';
8
8
  export { createPatch, applyPatches } from './dsl/json-patch.js';
9
9
  export { z } from 'zod';
10
10
  export type { ResourceLoader } from './resources/resource-loader.js';
@@ -14,4 +14,7 @@ export type { WebhookFunction, WebhookRegistration } from './dsl/webhook.js';
14
14
  export type { PagesService, Page, PageCreateOptions } from './dsl/pages.js';
15
15
  export type { Manifest as ResourceManifest, Entry as ResourceEntry, ResourceType, } from './resources/resources.js';
16
16
  export { RESOURCE_TYPES } from './resources/resources.js';
17
+ export type { LoopStartEvent, LoopIterationEvent, LoopToolCallEvent, LoopToolResultEvent, LoopAssistantMessageEvent, LoopCompleteEvent, LoopTokenLimitEvent, LoopWebhookEvent, WebhookResponseEvent, } from './dsl/brain.js';
18
+ export type { LoopResumeContext } from './dsl/loop-messages.js';
19
+ export { reconstructLoopContext } from './dsl/loop-messages.js';
17
20
  //# 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,MAAM,oBAAoB,CAAC;AACnE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACjE,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"}
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,GACrB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/core",
3
- "version": "0.0.36",
3
+ "version": "0.0.38",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },