@positronic/cloudflare 0.0.41 → 0.0.42

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,26 @@ 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)
651
+ monitorStub = this.env.MONITOR_DO.get(this.env.MONITOR_DO.idFromName('singleton'));
652
+ // Try to get brainRunId from DO's SQLite state
653
+ actualBrainRunId = brainRunId;
654
+ actualBrainTitle = brainTitle;
655
+ startEvent = null;
646
656
  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) {
657
+ try {
658
+ 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();
659
+ if (startEventResult.length > 0) {
660
+ startEvent = JSON.parse(startEventResult[0].serialized_event);
661
+ actualBrainRunId = startEvent.brainRunId;
662
+ actualBrainTitle = startEvent.brainTitle;
663
+ }
664
+ } catch (err) {
665
+ // Table doesn't exist - brain was killed before any events were written to DO's SQLite
666
+ // This is fine if we have fallback brainRunId/brainTitle from the API
667
+ console.log("[DO ".concat(this.brainRunId, "] kill() could not query brain_events (table may not exist)"));
668
+ }
669
+ // If we still don't have a brainRunId, we can't proceed
670
+ if (!actualBrainRunId) {
649
671
  return [
650
672
  2,
651
673
  {
@@ -654,10 +676,6 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
654
676
  }
655
677
  ];
656
678
  }
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
679
  return [
662
680
  4,
663
681
  monitorStub.getLastEvent(actualBrainRunId)
@@ -683,14 +701,14 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
683
701
  }
684
702
  ];
685
703
  }
686
- // Brain is suspended for a webhook - emit CANCELLED event to MonitorDO
704
+ // Emit CANCELLED event to MonitorDO
687
705
  cancelledEvent = {
688
706
  type: BRAIN_EVENTS.CANCELLED,
689
707
  status: STATUS.CANCELLED,
690
- brainTitle: startEvent.brainTitle,
691
- brainDescription: startEvent.brainDescription || '',
708
+ brainTitle: actualBrainTitle || String(existingRun.brain_title) || 'unknown',
709
+ brainDescription: (startEvent === null || startEvent === void 0 ? void 0 : startEvent.brainDescription) || '',
692
710
  brainRunId: actualBrainRunId,
693
- options: startEvent.options || {}
711
+ options: (startEvent === null || startEvent === void 0 ? void 0 : startEvent.options) || {}
694
712
  };
695
713
  return [
696
714
  4,
@@ -702,7 +720,7 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
702
720
  2,
703
721
  {
704
722
  success: true,
705
- message: 'Suspended brain run cancelled'
723
+ message: 'Brain run cancelled'
706
724
  }
707
725
  ];
708
726
  }
@@ -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;IAoE9F,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.42",
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.42",
35
+ "@positronic/spec": "^0.0.42",
36
+ "@positronic/template-new-project": "^0.0.42",
37
37
  "aws4fetch": "^1.0.18",
38
38
  "caz": "^2.0.0",
39
39
  "cron-schedule": "^5.0.4",