@positronic/cloudflare 0.0.17 → 0.0.19

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/api.js CHANGED
@@ -397,6 +397,81 @@ app.get('/brains/runs/:runId/watch', function(context) {
397
397
  });
398
398
  })();
399
399
  });
400
+ app.delete('/brains/runs/:runId', function(context) {
401
+ return _async_to_generator(function() {
402
+ var runId, monitorId, monitorStub, existingRun, namespace, doId, stub, result, error;
403
+ return _ts_generator(this, function(_state) {
404
+ switch(_state.label){
405
+ case 0:
406
+ runId = context.req.param('runId');
407
+ // First check if the run exists in the monitor
408
+ monitorId = context.env.MONITOR_DO.idFromName('singleton');
409
+ monitorStub = context.env.MONITOR_DO.get(monitorId);
410
+ return [
411
+ 4,
412
+ monitorStub.getLastEvent(runId)
413
+ ];
414
+ case 1:
415
+ existingRun = _state.sent();
416
+ if (!existingRun) {
417
+ return [
418
+ 2,
419
+ context.json({
420
+ error: "Brain run '".concat(runId, "' not found")
421
+ }, 404)
422
+ ];
423
+ }
424
+ // Now try to kill it
425
+ namespace = context.env.BRAIN_RUNNER_DO;
426
+ doId = namespace.idFromName(runId);
427
+ stub = namespace.get(doId);
428
+ _state.label = 2;
429
+ case 2:
430
+ _state.trys.push([
431
+ 2,
432
+ 4,
433
+ ,
434
+ 5
435
+ ]);
436
+ return [
437
+ 4,
438
+ stub.kill()
439
+ ];
440
+ case 3:
441
+ result = _state.sent();
442
+ if (!result.success) {
443
+ // Brain run is not active or already completed
444
+ return [
445
+ 2,
446
+ context.json({
447
+ error: result.message
448
+ }, 409)
449
+ ];
450
+ }
451
+ // Return 204 No Content on success
452
+ return [
453
+ 2,
454
+ new Response(null, {
455
+ status: 204
456
+ })
457
+ ];
458
+ case 4:
459
+ error = _state.sent();
460
+ console.error("Error killing brain run ".concat(runId, ":"), error);
461
+ return [
462
+ 2,
463
+ context.json({
464
+ error: 'Failed to kill brain run'
465
+ }, 500)
466
+ ];
467
+ case 5:
468
+ return [
469
+ 2
470
+ ];
471
+ }
472
+ });
473
+ })();
474
+ });
400
475
  app.get('/brains/:identifier/history', function(context) {
401
476
  return _async_to_generator(function() {
402
477
  var identifier, limit, manifest, resolution, brain, brainTitle, monitorId, monitorStub, runs;
@@ -103,6 +103,30 @@ function _object_spread(target) {
103
103
  }
104
104
  return target;
105
105
  }
106
+ function ownKeys(object, enumerableOnly) {
107
+ var keys = Object.keys(object);
108
+ if (Object.getOwnPropertySymbols) {
109
+ var symbols = Object.getOwnPropertySymbols(object);
110
+ if (enumerableOnly) {
111
+ symbols = symbols.filter(function(sym) {
112
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
113
+ });
114
+ }
115
+ keys.push.apply(keys, symbols);
116
+ }
117
+ return keys;
118
+ }
119
+ function _object_spread_props(target, source) {
120
+ source = source != null ? source : {};
121
+ if (Object.getOwnPropertyDescriptors) {
122
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
123
+ } else {
124
+ ownKeys(Object(source)).forEach(function(key) {
125
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
126
+ });
127
+ }
128
+ return target;
129
+ }
106
130
  function _possible_constructor_return(self, call) {
107
131
  if (call && (_type_of(call) === "object" || typeof call === "function")) {
108
132
  return call;
@@ -364,7 +388,7 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
364
388
  _this = _call_super(this, BrainRunnerDO, [
365
389
  state,
366
390
  env
367
- ]), _define_property(_this, "sql", void 0), _define_property(_this, "brainRunId", void 0), _define_property(_this, "eventStreamAdapter", new EventStreamAdapter());
391
+ ]), _define_property(_this, "sql", void 0), _define_property(_this, "brainRunId", void 0), _define_property(_this, "eventStreamAdapter", new EventStreamAdapter()), _define_property(_this, "abortController", null);
368
392
  _this.sql = state.storage.sql;
369
393
  _this.brainRunId = state.id.toString();
370
394
  _this.env = env;
@@ -502,29 +526,64 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
502
526
  }).call(this);
503
527
  }
504
528
  },
529
+ {
530
+ key: "kill",
531
+ value: function kill() {
532
+ return _async_to_generator(function() {
533
+ return _ts_generator(this, function(_state) {
534
+ if (this.abortController && !this.abortController.signal.aborted) {
535
+ this.abortController.abort();
536
+ return [
537
+ 2,
538
+ {
539
+ success: true,
540
+ message: 'Brain run kill signal sent'
541
+ }
542
+ ];
543
+ } else {
544
+ return [
545
+ 2,
546
+ {
547
+ success: false,
548
+ message: 'Brain run is not active or already completed'
549
+ }
550
+ ];
551
+ }
552
+ return [
553
+ 2
554
+ ];
555
+ });
556
+ }).call(this);
557
+ }
558
+ },
505
559
  {
506
560
  key: "start",
507
561
  value: function start(brainTitle, brainRunId, initialData) {
508
562
  return _async_to_generator(function() {
509
- var sql, brainToRun, sqliteAdapter, eventStreamAdapter, monitorAdapter, scheduleAdapter, r2Resources, runnerWithResources, options, initialState;
563
+ var _this, sql, resolution, brainToRun, sqliteAdapter, eventStreamAdapter, monitorAdapter, scheduleAdapter, r2Resources, runnerWithResources, options, initialState;
510
564
  return _ts_generator(this, function(_state) {
511
565
  switch(_state.label){
512
566
  case 0:
567
+ _this = this;
513
568
  sql = this.sql;
514
569
  if (!manifest) {
515
570
  throw new Error('Runtime manifest not initialized');
516
571
  }
517
- return [
518
- 4,
519
- manifest.import(brainTitle)
520
- ];
521
- case 1:
522
- brainToRun = _state.sent();
523
- if (!brainToRun) {
572
+ // Resolve the brain using the title/identifier
573
+ resolution = manifest.resolve(brainTitle);
574
+ if (resolution.matchType === 'none') {
524
575
  console.error("[DO ".concat(brainRunId, "] Brain ").concat(brainTitle, " not found in manifest."));
525
576
  console.error(JSON.stringify(manifest, null, 2));
526
577
  throw new Error("Brain ".concat(brainTitle, " not found"));
527
578
  }
579
+ if (resolution.matchType === 'multiple') {
580
+ console.error("[DO ".concat(brainRunId, "] Multiple brains match identifier ").concat(brainTitle), resolution.candidates);
581
+ throw new Error("Multiple brains match identifier ".concat(brainTitle));
582
+ }
583
+ brainToRun = resolution.brain;
584
+ if (!brainToRun) {
585
+ throw new Error("Brain ".concat(brainTitle, " resolved but brain object is missing"));
586
+ }
528
587
  sqliteAdapter = new BrainRunSQLiteAdapter(sql);
529
588
  eventStreamAdapter = this.eventStreamAdapter;
530
589
  monitorAdapter = new MonitorAdapter(this.env.MONITOR_DO.get(this.env.MONITOR_DO.idFromName('singleton')));
@@ -536,7 +595,7 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
536
595
  4,
537
596
  this.loadResourcesFromR2()
538
597
  ];
539
- case 2:
598
+ case 1:
540
599
  r2Resources = _state.sent();
541
600
  // Create an enhanced runner with resources if available
542
601
  runnerWithResources = brainRunner;
@@ -547,18 +606,25 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
547
606
  // Extract options from initialData if present
548
607
  options = initialData === null || initialData === void 0 ? void 0 : initialData.options;
549
608
  initialState = initialData && !initialData.options ? initialData : {};
609
+ // Create abort controller for this run
610
+ this.abortController = new AbortController();
550
611
  runnerWithResources.withAdapters([
551
612
  sqliteAdapter,
552
613
  eventStreamAdapter,
553
614
  monitorAdapter,
554
615
  scheduleAdapter
555
- ]).run(brainToRun, _object_spread({
616
+ ]).run(brainToRun, _object_spread_props(_object_spread({
556
617
  initialState: initialState,
557
618
  brainRunId: brainRunId
558
619
  }, options && {
559
620
  options: options
621
+ }), {
622
+ signal: this.abortController.signal
560
623
  })).catch(function(err) {
561
624
  console.error("[DO ".concat(brainRunId, "] BrainRunner run failed:"), err);
625
+ }).finally(function() {
626
+ // Clean up abort controller when run completes
627
+ _this.abortController = null;
562
628
  });
563
629
  return [
564
630
  2
@@ -225,10 +225,10 @@ export var MonitorDO = /*#__PURE__*/ function(DurableObject) {
225
225
  {
226
226
  key: "handleBrainEvent",
227
227
  value: function handleBrainEvent(event) {
228
- if (event.type === BRAIN_EVENTS.START || event.type === BRAIN_EVENTS.RESTART || event.type === BRAIN_EVENTS.COMPLETE || event.type === BRAIN_EVENTS.ERROR) {
228
+ if (event.type === BRAIN_EVENTS.START || event.type === BRAIN_EVENTS.RESTART || event.type === BRAIN_EVENTS.COMPLETE || event.type === BRAIN_EVENTS.ERROR || event.type === BRAIN_EVENTS.CANCELLED) {
229
229
  var currentTime = Date.now();
230
230
  var startTime = event.type === BRAIN_EVENTS.START || event.type === BRAIN_EVENTS.RESTART ? currentTime : null;
231
- var completeTime = event.type === BRAIN_EVENTS.COMPLETE || event.type === BRAIN_EVENTS.ERROR ? currentTime : null;
231
+ var completeTime = event.type === BRAIN_EVENTS.COMPLETE || event.type === BRAIN_EVENTS.ERROR || event.type === BRAIN_EVENTS.CANCELLED ? currentTime : null;
232
232
  var error = event.type === BRAIN_EVENTS.ERROR ? JSON.stringify(event.error) : null;
233
233
  // Update SQL insert/update with new column names, read from existing event fields
234
234
  this.storage.exec("\n INSERT INTO brain_runs (\n run_id, brain_title, brain_description, type, status,\n options, error, created_at, started_at, completed_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(run_id) DO UPDATE SET\n type = excluded.type,\n status = excluded.status,\n error = excluded.error,\n completed_at = excluded.completed_at\n ", event.brainRunId, event.brainTitle, event.brainDescription || null, event.type, event.status, JSON.stringify(event.options || {}), error, currentTime, startTime, completeTime);
@@ -344,7 +344,8 @@ export var MonitorDO = /*#__PURE__*/ function(DurableObject) {
344
344
  // No changes needed for getLastEvent, uses run_id
345
345
  key: "getLastEvent",
346
346
  value: function getLastEvent(brainRunId) {
347
- return this.storage.exec("\n SELECT * FROM brain_runs WHERE run_id = ?\n ", brainRunId).one();
347
+ var results = this.storage.exec("\n SELECT * FROM brain_runs WHERE run_id = ?\n ", brainRunId).toArray();
348
+ return results.length > 0 ? results[0] : null;
348
349
  }
349
350
  },
350
351
  {
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAI1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,2BAA2B,CAAC;AAGpE,KAAK,QAAQ,GAAG;IACd,eAAe,EAAE,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACvD,UAAU,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC9C,WAAW,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAChD,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAmBF,QAAA,MAAM,GAAG;cAAwB,QAAQ;yCAAK,CAAC;AAupB/C,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAI1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,2BAA2B,CAAC;AAGpE,KAAK,QAAQ,GAAG;IACd,eAAe,EAAE,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACvD,UAAU,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC9C,WAAW,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAChD,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAmBF,QAAA,MAAM,GAAG;cAAwB,QAAQ;yCAAK,CAAC;AAyrB/C,eAAe,GAAG,CAAC"}
@@ -17,8 +17,13 @@ export declare class BrainRunnerDO extends DurableObject<Env> {
17
17
  private sql;
18
18
  private brainRunId;
19
19
  private eventStreamAdapter;
20
+ private abortController;
20
21
  constructor(state: DurableObjectState, env: Env);
21
22
  private loadResourcesFromR2;
23
+ kill(): Promise<{
24
+ success: boolean;
25
+ message: string;
26
+ }>;
22
27
  start(brainTitle: string, brainRunId: string, initialData?: Record<string, any>): Promise<void>;
23
28
  fetch(request: Request): Promise<Response>;
24
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"brain-runner-do.d.ts","sourceRoot":"","sources":["../../src/brain-runner-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,wBAAgB,WAAW,CAAC,iBAAiB,EAAE,kBAAkB,QAEhE;AAED,wBAAgB,WAAW,IAAI,kBAAkB,GAAG,IAAI,CAEvD;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,QAEjD;AAED,MAAM,WAAW,GAAG;IAClB,eAAe,EAAE,sBAAsB,CAAC;IACxC,UAAU,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC9C,WAAW,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAChD,gBAAgB,EAAE,QAAQ,CAAC;CAC5B;AAwDD,qBAAa,aAAc,SAAQ,aAAa,CAAC,GAAG,CAAC;IACnD,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAA4B;gBAE1C,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;YAOjC,mBAAmB;IA0E3B,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAgE7B,KAAK,CAAC,OAAO,EAAE,OAAO;CA4E7B"}
1
+ {"version":3,"file":"brain-runner-do.d.ts","sourceRoot":"","sources":["../../src/brain-runner-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,wBAAgB,WAAW,CAAC,iBAAiB,EAAE,kBAAkB,QAEhE;AAED,wBAAgB,WAAW,IAAI,kBAAkB,GAAG,IAAI,CAEvD;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,QAEjD;AAED,MAAM,WAAW,GAAG;IAClB,eAAe,EAAE,sBAAsB,CAAC;IACxC,UAAU,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC9C,WAAW,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAChD,gBAAgB,EAAE,QAAQ,CAAC;CAC5B;AAwDD,qBAAa,aAAc,SAAQ,aAAa,CAAC,GAAG,CAAC;IACnD,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,eAAe,CAAgC;gBAE3C,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;YAOjC,mBAAmB;IA0E3B,IAAI,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAStD,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAmF7B,KAAK,CAAC,OAAO,EAAE,OAAO;CA4E7B"}
@@ -9,7 +9,7 @@ export declare class MonitorDO extends DurableObject<Env> {
9
9
  handleBrainEvent(event: BrainEvent<any>): void;
10
10
  private broadcastRunningBrains;
11
11
  fetch(request: Request): Promise<Response>;
12
- getLastEvent(brainRunId: string): Record<string, SqlStorageValue>;
12
+ getLastEvent(brainRunId: string): Record<string, SqlStorageValue> | null;
13
13
  history(brainTitle: string, limit?: number): Record<string, SqlStorageValue>[];
14
14
  activeRuns(brainTitle: string): Record<string, SqlStorageValue>[];
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"monitor-do.d.ts","sourceRoot":"","sources":["../../src/monitor-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,GAAG;CAEnB;AAED,qBAAa,SAAU,SAAQ,aAAa,CAAC,GAAG,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,kBAAkB,CAA4B;gBAE1C,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IA2B/C,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;YAiDzB,sBAAsB;IA0B9B,KAAK,CAAC,OAAO,EAAE,OAAO;IA2D5B,YAAY,CAAC,UAAU,EAAE,MAAM;IAY/B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IA6B9C,UAAU,CAAC,UAAU,EAAE,MAAM;CAwB9B"}
1
+ {"version":3,"file":"monitor-do.d.ts","sourceRoot":"","sources":["../../src/monitor-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,GAAG;CAEnB;AAED,qBAAa,SAAU,SAAQ,aAAa,CAAC,GAAG,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,kBAAkB,CAA4B;gBAE1C,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IA2B/C,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;YAmDzB,sBAAsB;IA0B9B,KAAK,CAAC,OAAO,EAAE,OAAO;IA2D5B,YAAY,CAAC,UAAU,EAAE,MAAM;IAc/B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IA6B9C,UAAU,CAAC,UAAU,EAAE,MAAM;CAwB9B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/cloudflare",
3
- "version": "0.0.17",
3
+ "version": "0.0.19",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -31,9 +31,9 @@
31
31
  "clean": "rm -rf tsconfig.tsbuildinfo dist"
32
32
  },
33
33
  "dependencies": {
34
- "@positronic/core": "^0.0.17",
35
- "@positronic/spec": "^0.0.17",
36
- "@positronic/template-new-project": "^0.0.17",
34
+ "@positronic/core": "^0.0.19",
35
+ "@positronic/spec": "^0.0.19",
36
+ "@positronic/template-new-project": "^0.0.19",
37
37
  "aws4fetch": "^1.0.18",
38
38
  "caz": "^2.0.0",
39
39
  "cron-schedule": "^5.0.4",