@positronic/cloudflare 0.0.18 → 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,14 +526,45 @@ 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, resolution, 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');
@@ -551,18 +606,25 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
551
606
  // Extract options from initialData if present
552
607
  options = initialData === null || initialData === void 0 ? void 0 : initialData.options;
553
608
  initialState = initialData && !initialData.options ? initialData : {};
609
+ // Create abort controller for this run
610
+ this.abortController = new AbortController();
554
611
  runnerWithResources.withAdapters([
555
612
  sqliteAdapter,
556
613
  eventStreamAdapter,
557
614
  monitorAdapter,
558
615
  scheduleAdapter
559
- ]).run(brainToRun, _object_spread({
616
+ ]).run(brainToRun, _object_spread_props(_object_spread({
560
617
  initialState: initialState,
561
618
  brainRunId: brainRunId
562
619
  }, options && {
563
620
  options: options
621
+ }), {
622
+ signal: this.abortController.signal
564
623
  })).catch(function(err) {
565
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;
566
628
  });
567
629
  return [
568
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;IA2E7B,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.18",
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.18",
35
- "@positronic/spec": "^0.0.18",
36
- "@positronic/template-new-project": "^0.0.18",
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",