@positronic/cloudflare 0.0.41 → 0.0.43

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
@@ -509,7 +509,8 @@ app.delete('/brains/runs/:runId', function(context) {
509
509
  }, 404)
510
510
  ];
511
511
  }
512
- // Now try to kill it
512
+ // Now try to kill it - pass runId and brainTitle as fallbacks in case
513
+ // the DO's SQLite state is missing (zombie brain scenario)
513
514
  namespace = context.env.BRAIN_RUNNER_DO;
514
515
  doId = namespace.idFromName(runId);
515
516
  stub = namespace.get(doId);
@@ -523,12 +524,11 @@ app.delete('/brains/runs/:runId', function(context) {
523
524
  ]);
524
525
  return [
525
526
  4,
526
- stub.kill()
527
+ stub.kill(runId, existingRun.brain_title)
527
528
  ];
528
529
  case 3:
529
530
  result = _state.sent();
530
531
  if (!result.success) {
531
- // Brain run is not active or already completed
532
532
  return [
533
533
  2,
534
534
  context.json({
@@ -623,9 +623,17 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
623
623
  },
624
624
  {
625
625
  key: "kill",
626
- value: function kill() {
626
+ value: /**
627
+ * Kill a brain run. This method handles multiple scenarios:
628
+ * 1. Brain is actively running (has abortController) - abort it
629
+ * 2. Brain is suspended (waiting for webhook) - emit CANCELLED event
630
+ * 3. Brain is a "zombie" (DO state missing due to IoContext timeout) - directly update MonitorDO
631
+ *
632
+ * The brainRunId and brainTitle parameters are used as fallbacks when the DO's
633
+ * SQLite state is missing (zombie brain scenario).
634
+ */ function kill(brainRunId, brainTitle) {
627
635
  return _async_to_generator(function() {
628
- var sql, startEventResult, startEvent, actualBrainRunId, monitorStub, existingRun, cancelledEvent;
636
+ var monitorStub, actualBrainRunId, actualBrainTitle, startEvent, sql, startEventResult, existingRun, cancelledEvent;
629
637
  return _ts_generator(this, function(_state) {
630
638
  switch(_state.label){
631
639
  case 0:
@@ -640,12 +648,29 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
640
648
  }
641
649
  ];
642
650
  }
643
- // Brain is not actively running - it might be suspended for a webhook
644
- // First, get the actual brainRunId from the stored START event
645
- // (this.brainRunId is the DO's internal ID, not the UUID brainRunId)
646
- sql = this.sql;
647
- startEventResult = sql.exec("SELECT serialized_event FROM brain_events WHERE event_type IN (?, ?) ORDER BY event_id DESC LIMIT 1", BRAIN_EVENTS.START, BRAIN_EVENTS.RESTART).toArray();
648
- if (startEventResult.length === 0) {
651
+ monitorStub = this.env.MONITOR_DO.get(this.env.MONITOR_DO.idFromName('singleton'));
652
+ // Use passed-in brainRunId/brainTitle if provided (from API which already verified the run exists)
653
+ // Only fall back to SQLite if not provided
654
+ actualBrainRunId = brainRunId;
655
+ actualBrainTitle = brainTitle;
656
+ startEvent = null;
657
+ // Only query SQLite if we don't have the brainRunId from the API
658
+ if (!actualBrainRunId) {
659
+ sql = this.sql;
660
+ try {
661
+ startEventResult = sql.exec("SELECT serialized_event FROM brain_events WHERE event_type IN (?, ?) ORDER BY event_id DESC LIMIT 1", BRAIN_EVENTS.START, BRAIN_EVENTS.RESTART).toArray();
662
+ if (startEventResult.length > 0) {
663
+ startEvent = JSON.parse(startEventResult[0].serialized_event);
664
+ actualBrainRunId = startEvent.brainRunId;
665
+ actualBrainTitle = startEvent.brainTitle;
666
+ }
667
+ } catch (err) {
668
+ // Table doesn't exist - brain was killed before any events were written to DO's SQLite
669
+ console.log("[DO ".concat(this.brainRunId, "] kill() could not query brain_events (table may not exist)"));
670
+ }
671
+ }
672
+ // If we still don't have a brainRunId, we can't proceed
673
+ if (!actualBrainRunId) {
649
674
  return [
650
675
  2,
651
676
  {
@@ -654,10 +679,6 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
654
679
  }
655
680
  ];
656
681
  }
657
- startEvent = JSON.parse(startEventResult[0].serialized_event);
658
- actualBrainRunId = startEvent.brainRunId;
659
- // Check if it's still in RUNNING status (which means it's suspended)
660
- monitorStub = this.env.MONITOR_DO.get(this.env.MONITOR_DO.idFromName('singleton'));
661
682
  return [
662
683
  4,
663
684
  monitorStub.getLastEvent(actualBrainRunId)
@@ -683,14 +704,14 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
683
704
  }
684
705
  ];
685
706
  }
686
- // Brain is suspended for a webhook - emit CANCELLED event to MonitorDO
707
+ // Emit CANCELLED event to MonitorDO
687
708
  cancelledEvent = {
688
709
  type: BRAIN_EVENTS.CANCELLED,
689
710
  status: STATUS.CANCELLED,
690
- brainTitle: startEvent.brainTitle,
691
- brainDescription: startEvent.brainDescription || '',
711
+ brainTitle: actualBrainTitle || String(existingRun.brain_title) || 'unknown',
712
+ brainDescription: (startEvent === null || startEvent === void 0 ? void 0 : startEvent.brainDescription) || '',
692
713
  brainRunId: actualBrainRunId,
693
- options: startEvent.options || {}
714
+ options: (startEvent === null || startEvent === void 0 ? void 0 : startEvent.options) || {}
694
715
  };
695
716
  return [
696
717
  4,
@@ -702,7 +723,7 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
702
723
  2,
703
724
  {
704
725
  success: true,
705
- message: 'Suspended brain run cancelled'
726
+ message: 'Brain run cancelled'
706
727
  }
707
728
  ];
708
729
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAK1C,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;IAExB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA+BF,QAAA,MAAM,GAAG;cAAwB,QAAQ;yCAAK,CAAC;AAi8C/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;AAK1C,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;IAExB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA+BF,QAAA,MAAM,GAAG;cAAwB,QAAQ;yCAAK,CAAC;AAg8C/C,eAAe,GAAG,CAAC"}
@@ -28,7 +28,16 @@ export declare class BrainRunnerDO extends DurableObject<Env> {
28
28
  * Extracts secrets from Cloudflare env bindings (string values only).
29
29
  */
30
30
  private buildRuntimeEnv;
31
- kill(): Promise<{
31
+ /**
32
+ * Kill a brain run. This method handles multiple scenarios:
33
+ * 1. Brain is actively running (has abortController) - abort it
34
+ * 2. Brain is suspended (waiting for webhook) - emit CANCELLED event
35
+ * 3. Brain is a "zombie" (DO state missing due to IoContext timeout) - directly update MonitorDO
36
+ *
37
+ * The brainRunId and brainTitle parameters are used as fallbacks when the DO's
38
+ * SQLite state is missing (zombie brain scenario).
39
+ */
40
+ kill(brainRunId?: string, brainTitle?: string): Promise<{
32
41
  success: boolean;
33
42
  message: string;
34
43
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"brain-runner-do.d.ts","sourceRoot":"","sources":["../../src/brain-runner-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAyD,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,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;AAGD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAE/D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAE/D;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;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;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;IAqEjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBjB,IAAI,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAwDtD,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAuG7B,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAmJhC,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,EAAyD,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,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;AAGD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAE/D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAE/D;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;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;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;IAqEjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;;;;OAQG;IACG,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAuE9F,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAuG7B,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAmJhC,KAAK,CAAC,OAAO,EAAE,OAAO;CA4E7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/cloudflare",
3
- "version": "0.0.41",
3
+ "version": "0.0.43",
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.41",
35
- "@positronic/spec": "^0.0.41",
36
- "@positronic/template-new-project": "^0.0.41",
34
+ "@positronic/core": "^0.0.43",
35
+ "@positronic/spec": "^0.0.43",
36
+ "@positronic/template-new-project": "^0.0.43",
37
37
  "aws4fetch": "^1.0.18",
38
38
  "caz": "^2.0.0",
39
39
  "cron-schedule": "^5.0.4",