@positronic/cloudflare 0.0.25 → 0.0.27

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
@@ -968,7 +968,7 @@ app.get('/brains/:identifier', function(context) {
968
968
  });
969
969
  app.get('/resources', function(context) {
970
970
  return _async_to_generator(function() {
971
- var bucket, listed, resources, error, errorMessage;
971
+ var bucket, listed, resources, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, object, _r2Object_customMetadata, r2Object, err, error, errorMessage;
972
972
  return _ts_generator(this, function(_state) {
973
973
  switch(_state.label){
974
974
  case 0:
@@ -977,9 +977,9 @@ app.get('/resources', function(context) {
977
977
  case 1:
978
978
  _state.trys.push([
979
979
  1,
980
- 4,
980
+ 11,
981
981
  ,
982
- 5
982
+ 12
983
983
  ]);
984
984
  return [
985
985
  4,
@@ -987,47 +987,81 @@ app.get('/resources', function(context) {
987
987
  ];
988
988
  case 2:
989
989
  listed = _state.sent();
990
+ resources = [];
991
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
992
+ _state.label = 3;
993
+ case 3:
994
+ _state.trys.push([
995
+ 3,
996
+ 8,
997
+ 9,
998
+ 10
999
+ ]);
1000
+ _iterator = listed.objects[Symbol.iterator]();
1001
+ _state.label = 4;
1002
+ case 4:
1003
+ if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
1004
+ 3,
1005
+ 7
1006
+ ];
1007
+ object = _step.value;
990
1008
  return [
991
1009
  4,
992
- Promise.all(listed.objects.map(function(object) {
993
- return _async_to_generator(function() {
994
- var _r2Object_customMetadata, r2Object, resource;
995
- return _ts_generator(this, function(_state) {
996
- switch(_state.label){
997
- case 0:
998
- return [
999
- 4,
1000
- bucket.head(object.key)
1001
- ];
1002
- case 1:
1003
- r2Object = _state.sent();
1004
- if (!r2Object) {
1005
- throw new Error('Resource "'.concat(object.key, '" not found'));
1006
- }
1007
- if (!((_r2Object_customMetadata = r2Object.customMetadata) === null || _r2Object_customMetadata === void 0 ? void 0 : _r2Object_customMetadata.type)) {
1008
- throw new Error('Resource "'.concat(object.key, '" is missing required metadata field "type"'));
1009
- }
1010
- resource = _object_spread_props(_object_spread({
1011
- type: r2Object.customMetadata.type
1012
- }, r2Object.customMetadata.path && {
1013
- path: r2Object.customMetadata.path
1014
- }), {
1015
- key: object.key,
1016
- size: object.size,
1017
- lastModified: object.uploaded.toISOString(),
1018
- local: r2Object.customMetadata.local === 'true'
1019
- });
1020
- return [
1021
- 2,
1022
- resource
1023
- ];
1024
- }
1025
- });
1026
- })();
1027
- }))
1010
+ bucket.head(object.key)
1028
1011
  ];
1029
- case 3:
1030
- resources = _state.sent();
1012
+ case 5:
1013
+ r2Object = _state.sent();
1014
+ // Skip objects without type metadata (e.g., pages or other non-resource data)
1015
+ if (!r2Object || !((_r2Object_customMetadata = r2Object.customMetadata) === null || _r2Object_customMetadata === void 0 ? void 0 : _r2Object_customMetadata.type)) {
1016
+ return [
1017
+ 3,
1018
+ 6
1019
+ ];
1020
+ }
1021
+ resources.push(_object_spread_props(_object_spread({
1022
+ type: r2Object.customMetadata.type
1023
+ }, r2Object.customMetadata.path && {
1024
+ path: r2Object.customMetadata.path
1025
+ }), {
1026
+ key: object.key,
1027
+ size: object.size,
1028
+ lastModified: object.uploaded.toISOString(),
1029
+ local: r2Object.customMetadata.local === 'true'
1030
+ }));
1031
+ _state.label = 6;
1032
+ case 6:
1033
+ _iteratorNormalCompletion = true;
1034
+ return [
1035
+ 3,
1036
+ 4
1037
+ ];
1038
+ case 7:
1039
+ return [
1040
+ 3,
1041
+ 10
1042
+ ];
1043
+ case 8:
1044
+ err = _state.sent();
1045
+ _didIteratorError = true;
1046
+ _iteratorError = err;
1047
+ return [
1048
+ 3,
1049
+ 10
1050
+ ];
1051
+ case 9:
1052
+ try {
1053
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
1054
+ _iterator.return();
1055
+ }
1056
+ } finally{
1057
+ if (_didIteratorError) {
1058
+ throw _iteratorError;
1059
+ }
1060
+ }
1061
+ return [
1062
+ 7
1063
+ ];
1064
+ case 10:
1031
1065
  return [
1032
1066
  2,
1033
1067
  context.json({
@@ -1036,7 +1070,7 @@ app.get('/resources', function(context) {
1036
1070
  count: resources.length
1037
1071
  })
1038
1072
  ];
1039
- case 4:
1073
+ case 11:
1040
1074
  error = _state.sent();
1041
1075
  errorMessage = _instanceof(error, Error) ? error.message : 'Unknown error occurred';
1042
1076
  return [
@@ -1045,7 +1079,7 @@ app.get('/resources', function(context) {
1045
1079
  error: errorMessage
1046
1080
  }, 500)
1047
1081
  ];
1048
- case 5:
1082
+ case 12:
1049
1083
  return [
1050
1084
  2
1051
1085
  ];
@@ -1229,7 +1263,7 @@ app.delete('/resources/:key', function(context) {
1229
1263
  // Delete all resources (bulk delete) - only available in development mode
1230
1264
  app.delete('/resources', function(context) {
1231
1265
  return _async_to_generator(function() {
1232
- var isDevelopment, bucket, listed, deletedCount, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, object, err, cursor, nextBatch, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, object1, err;
1266
+ var isDevelopment, bucket, listed, deletedCount, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, object, _r2Object_customMetadata, r2Object, err, cursor, nextBatch, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, object1, _r2Object_customMetadata1, r2Object1, err;
1233
1267
  return _ts_generator(this, function(_state) {
1234
1268
  switch(_state.label){
1235
1269
  case 0:
@@ -1256,46 +1290,56 @@ app.delete('/resources', function(context) {
1256
1290
  case 2:
1257
1291
  _state.trys.push([
1258
1292
  2,
1259
- 7,
1260
1293
  8,
1261
- 9
1294
+ 9,
1295
+ 10
1262
1296
  ]);
1263
1297
  _iterator = listed.objects[Symbol.iterator]();
1264
1298
  _state.label = 3;
1265
1299
  case 3:
1266
1300
  if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
1267
1301
  3,
1268
- 6
1302
+ 7
1269
1303
  ];
1270
1304
  object = _step.value;
1271
1305
  return [
1272
1306
  4,
1273
- bucket.delete(object.key)
1307
+ bucket.head(object.key)
1274
1308
  ];
1275
1309
  case 4:
1310
+ r2Object = _state.sent();
1311
+ if (!(r2Object === null || r2Object === void 0 ? void 0 : (_r2Object_customMetadata = r2Object.customMetadata) === null || _r2Object_customMetadata === void 0 ? void 0 : _r2Object_customMetadata.type)) return [
1312
+ 3,
1313
+ 6
1314
+ ];
1315
+ return [
1316
+ 4,
1317
+ bucket.delete(object.key)
1318
+ ];
1319
+ case 5:
1276
1320
  _state.sent();
1277
1321
  deletedCount++;
1278
- _state.label = 5;
1279
- case 5:
1322
+ _state.label = 6;
1323
+ case 6:
1280
1324
  _iteratorNormalCompletion = true;
1281
1325
  return [
1282
1326
  3,
1283
1327
  3
1284
1328
  ];
1285
- case 6:
1329
+ case 7:
1286
1330
  return [
1287
1331
  3,
1288
- 9
1332
+ 10
1289
1333
  ];
1290
- case 7:
1334
+ case 8:
1291
1335
  err = _state.sent();
1292
1336
  _didIteratorError = true;
1293
1337
  _iteratorError = err;
1294
1338
  return [
1295
1339
  3,
1296
- 9
1340
+ 10
1297
1341
  ];
1298
- case 8:
1342
+ case 9:
1299
1343
  try {
1300
1344
  if (!_iteratorNormalCompletion && _iterator.return != null) {
1301
1345
  _iterator.return();
@@ -1308,14 +1352,14 @@ app.delete('/resources', function(context) {
1308
1352
  return [
1309
1353
  7
1310
1354
  ];
1311
- case 9:
1355
+ case 10:
1312
1356
  // Handle pagination if there are more than 1000 objects
1313
1357
  cursor = listed.cursor;
1314
- _state.label = 10;
1315
- case 10:
1358
+ _state.label = 11;
1359
+ case 11:
1316
1360
  if (!(listed.truncated && cursor)) return [
1317
1361
  3,
1318
- 20
1362
+ 22
1319
1363
  ];
1320
1364
  return [
1321
1365
  4,
@@ -1323,53 +1367,63 @@ app.delete('/resources', function(context) {
1323
1367
  cursor: cursor
1324
1368
  })
1325
1369
  ];
1326
- case 11:
1370
+ case 12:
1327
1371
  nextBatch = _state.sent();
1328
1372
  _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1329
- _state.label = 12;
1330
- case 12:
1373
+ _state.label = 13;
1374
+ case 13:
1331
1375
  _state.trys.push([
1332
- 12,
1333
- 17,
1334
- 18,
1335
- 19
1376
+ 13,
1377
+ 19,
1378
+ 20,
1379
+ 21
1336
1380
  ]);
1337
1381
  _iterator1 = nextBatch.objects[Symbol.iterator]();
1338
- _state.label = 13;
1339
- case 13:
1382
+ _state.label = 14;
1383
+ case 14:
1340
1384
  if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
1341
1385
  3,
1342
- 16
1386
+ 18
1343
1387
  ];
1344
1388
  object1 = _step1.value;
1389
+ return [
1390
+ 4,
1391
+ bucket.head(object1.key)
1392
+ ];
1393
+ case 15:
1394
+ r2Object1 = _state.sent();
1395
+ if (!(r2Object1 === null || r2Object1 === void 0 ? void 0 : (_r2Object_customMetadata1 = r2Object1.customMetadata) === null || _r2Object_customMetadata1 === void 0 ? void 0 : _r2Object_customMetadata1.type)) return [
1396
+ 3,
1397
+ 17
1398
+ ];
1345
1399
  return [
1346
1400
  4,
1347
1401
  bucket.delete(object1.key)
1348
1402
  ];
1349
- case 14:
1403
+ case 16:
1350
1404
  _state.sent();
1351
1405
  deletedCount++;
1352
- _state.label = 15;
1353
- case 15:
1406
+ _state.label = 17;
1407
+ case 17:
1354
1408
  _iteratorNormalCompletion1 = true;
1355
1409
  return [
1356
1410
  3,
1357
- 13
1411
+ 14
1358
1412
  ];
1359
- case 16:
1413
+ case 18:
1360
1414
  return [
1361
1415
  3,
1362
- 19
1416
+ 21
1363
1417
  ];
1364
- case 17:
1418
+ case 19:
1365
1419
  err = _state.sent();
1366
1420
  _didIteratorError1 = true;
1367
1421
  _iteratorError1 = err;
1368
1422
  return [
1369
1423
  3,
1370
- 19
1424
+ 21
1371
1425
  ];
1372
- case 18:
1426
+ case 20:
1373
1427
  try {
1374
1428
  if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1375
1429
  _iterator1.return();
@@ -1382,13 +1436,13 @@ app.delete('/resources', function(context) {
1382
1436
  return [
1383
1437
  7
1384
1438
  ];
1385
- case 19:
1439
+ case 21:
1386
1440
  cursor = nextBatch.cursor;
1387
1441
  return [
1388
1442
  3,
1389
- 10
1443
+ 11
1390
1444
  ];
1391
- case 20:
1445
+ case 22:
1392
1446
  return [
1393
1447
  2,
1394
1448
  context.json({
@@ -458,7 +458,7 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
458
458
  case 4:
459
459
  r2Object = _state.sent();
460
460
  if (!r2Object || !((_r2Object_customMetadata = r2Object.customMetadata) === null || _r2Object_customMetadata === void 0 ? void 0 : _r2Object_customMetadata.type)) {
461
- console.warn("[DO ".concat(this.brainRunId, "] Skipping resource ").concat(object.key, " - ") + "missing metadata.type (found: ".concat(JSON.stringify((r2Object === null || r2Object === void 0 ? void 0 : r2Object.customMetadata) || {}), ")"));
461
+ // Skip non-resource objects (e.g., pages, or other data stored in the bucket)
462
462
  return [
463
463
  3,
464
464
  5
@@ -251,7 +251,7 @@ import * as path from 'path';
251
251
  import * as fsPromises from 'fs/promises';
252
252
  import * as fs from 'fs';
253
253
  import * as os from 'os';
254
- import { spawn } from 'child_process';
254
+ import { spawn, exec } from 'child_process';
255
255
  import * as dotenv from 'dotenv';
256
256
  import caz from 'caz';
257
257
  import { createRequire } from 'module';
@@ -495,52 +495,103 @@ function generateProject(projectName, projectDir, onSuccess) {
495
495
  });
496
496
  })();
497
497
  }
498
- function regenerateManifestFile(projectRootPath, targetSrcDir) {
498
+ export function discoverBrains(brainsDir) {
499
499
  return _async_to_generator(function() {
500
- var runnerPath, brainsDir, manifestPath, importStatements, manifestEntries, brainsDirExists, files, brainFiles, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, file, brainName, importPath, importAlias, manifestContent, runnerContent;
500
+ var entries, brains;
501
501
  return _ts_generator(this, function(_state) {
502
502
  switch(_state.label){
503
503
  case 0:
504
- runnerPath = path.join(projectRootPath, 'runner.ts');
505
- brainsDir = path.join(projectRootPath, 'brains');
506
- manifestPath = path.join(targetSrcDir, '_manifest.ts');
507
- importStatements = "import type { Brain } from '@positronic/core';\n";
508
- manifestEntries = '';
509
504
  return [
510
505
  4,
511
- fsPromises.access(brainsDir).then(function() {
512
- return true;
506
+ fsPromises.readdir(brainsDir, {
507
+ withFileTypes: true
513
508
  }).catch(function() {
514
- return false;
509
+ return [];
515
510
  })
516
511
  ];
517
512
  case 1:
518
- brainsDirExists = _state.sent();
519
- if (!brainsDirExists) return [
520
- 3,
521
- 3
522
- ];
513
+ entries = _state.sent();
523
514
  return [
524
515
  4,
525
- fsPromises.readdir(brainsDir)
516
+ Promise.all(entries.filter(function(e) {
517
+ return !e.name.startsWith('_');
518
+ }).map(function(entry) {
519
+ return _async_to_generator(function() {
520
+ var indexPath, hasIndex;
521
+ return _ts_generator(this, function(_state) {
522
+ switch(_state.label){
523
+ case 0:
524
+ if (entry.isFile() && entry.name.endsWith('.ts')) {
525
+ return [
526
+ 2,
527
+ {
528
+ name: entry.name.replace(/\.ts$/, ''),
529
+ relativePath: entry.name
530
+ }
531
+ ];
532
+ }
533
+ indexPath = path.join(brainsDir, entry.name, 'index.ts');
534
+ return [
535
+ 4,
536
+ fsPromises.access(indexPath).then(function() {
537
+ return true;
538
+ }, function() {
539
+ return false;
540
+ })
541
+ ];
542
+ case 1:
543
+ hasIndex = _state.sent();
544
+ return [
545
+ 2,
546
+ hasIndex ? {
547
+ name: entry.name,
548
+ relativePath: "".concat(entry.name, "/index.ts")
549
+ } : null
550
+ ];
551
+ }
552
+ });
553
+ })();
554
+ }))
526
555
  ];
527
556
  case 2:
528
- files = _state.sent();
529
- brainFiles = files.filter(function(file) {
530
- return file.endsWith('.ts') && !file.startsWith('_');
531
- });
557
+ brains = _state.sent();
558
+ return [
559
+ 2,
560
+ brains.filter(function(b) {
561
+ return b !== null;
562
+ })
563
+ ];
564
+ }
565
+ });
566
+ })();
567
+ }
568
+ function regenerateManifestFile(projectRootPath, targetSrcDir) {
569
+ return _async_to_generator(function() {
570
+ var runnerPath, brainsDir, manifestPath, importStatements, manifestEntries, brains, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, brain, importPath, importAlias, manifestContent, runnerContent;
571
+ return _ts_generator(this, function(_state) {
572
+ switch(_state.label){
573
+ case 0:
574
+ runnerPath = path.join(projectRootPath, 'runner.ts');
575
+ brainsDir = path.join(projectRootPath, 'brains');
576
+ manifestPath = path.join(targetSrcDir, '_manifest.ts');
577
+ importStatements = "import type { Brain } from '@positronic/core';\n";
578
+ manifestEntries = '';
579
+ return [
580
+ 4,
581
+ discoverBrains(brainsDir)
582
+ ];
583
+ case 1:
584
+ brains = _state.sent();
532
585
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
533
586
  try {
534
- for(_iterator = brainFiles[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
535
- file = _step.value;
536
- brainName = path.basename(file, '.ts');
537
- importPath = "../../brains/".concat(brainName, ".js");
538
- importAlias = "brain_".concat(brainName.replace(/[^a-zA-Z0-9_]/g, '_'));
587
+ for(_iterator = brains[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
588
+ brain = _step.value;
589
+ importPath = "../../brains/".concat(brain.relativePath.replace(/\.ts$/, '.js'));
590
+ importAlias = "brain_".concat(brain.name.replace(/[^a-zA-Z0-9_]/g, '_'));
539
591
  importStatements += "import * as ".concat(importAlias, " from '").concat(importPath, "';\n");
540
- // Create manifest entry with metadata
541
- manifestEntries += " ".concat(JSON.stringify(brainName), ": {\n");
542
- manifestEntries += " filename: ".concat(JSON.stringify(brainName), ",\n");
543
- manifestEntries += " path: ".concat(JSON.stringify("brains/".concat(file)), ",\n");
592
+ manifestEntries += " ".concat(JSON.stringify(brain.name), ": {\n");
593
+ manifestEntries += " filename: ".concat(JSON.stringify(brain.name), ",\n");
594
+ manifestEntries += " path: ".concat(JSON.stringify("brains/".concat(brain.relativePath)), ",\n");
544
595
  manifestEntries += " brain: ".concat(importAlias, ".default as Brain,\n");
545
596
  manifestEntries += " },\n";
546
597
  }
@@ -558,14 +609,12 @@ function regenerateManifestFile(projectRootPath, targetSrcDir) {
558
609
  }
559
610
  }
560
611
  }
561
- _state.label = 3;
562
- case 3:
563
612
  manifestContent = "// This file is generated automatically. Do not edit directly.\n".concat(importStatements, "\nimport type { BrainMetadata } from '@positronic/cloudflare';\n\nexport const manifest: Record<string, BrainMetadata> = {\n").concat(manifestEntries, "};\n");
564
613
  return [
565
614
  4,
566
615
  fsPromises.readFile(runnerPath, 'utf-8')
567
616
  ];
568
- case 4:
617
+ case 2:
569
618
  runnerContent = _state.sent();
570
619
  return [
571
620
  4,
@@ -573,19 +622,19 @@ function regenerateManifestFile(projectRootPath, targetSrcDir) {
573
622
  recursive: true
574
623
  })
575
624
  ];
576
- case 5:
625
+ case 3:
577
626
  _state.sent();
578
627
  return [
579
628
  4,
580
629
  fsPromises.writeFile(manifestPath, manifestContent, 'utf-8')
581
630
  ];
582
- case 6:
631
+ case 4:
583
632
  _state.sent();
584
633
  return [
585
634
  4,
586
635
  fsPromises.writeFile(path.join(targetSrcDir, 'runner.ts'), runnerContent, 'utf-8')
587
636
  ];
588
- case 7:
637
+ case 5:
589
638
  _state.sent();
590
639
  return [
591
640
  2
@@ -1056,11 +1105,102 @@ export var CloudflareDevServer = /*#__PURE__*/ function() {
1056
1105
  }).call(this);
1057
1106
  }
1058
1107
  },
1108
+ {
1109
+ key: "ensureR2BucketExists",
1110
+ value: function ensureR2BucketExists(bucketName) {
1111
+ return _async_to_generator(function() {
1112
+ var serverDir, existingBuckets;
1113
+ return _ts_generator(this, function(_state) {
1114
+ switch(_state.label){
1115
+ case 0:
1116
+ serverDir = path.join(this.projectRootDir, '.positronic');
1117
+ return [
1118
+ 4,
1119
+ new Promise(function(resolve, reject) {
1120
+ exec('npx wrangler r2 bucket list --json', {
1121
+ cwd: serverDir,
1122
+ env: _object_spread_props(_object_spread({}, process.env), {
1123
+ CLOUDFLARE_API_TOKEN: process.env.CLOUDFLARE_API_TOKEN,
1124
+ CLOUDFLARE_ACCOUNT_ID: process.env.CLOUDFLARE_ACCOUNT_ID
1125
+ })
1126
+ }, function(error, stdout) {
1127
+ if (error) {
1128
+ reject(new Error("Failed to list R2 buckets: ".concat(error.message)));
1129
+ return;
1130
+ }
1131
+ var buckets = JSON.parse(stdout);
1132
+ resolve(buckets.map(function(b) {
1133
+ return b.name;
1134
+ }));
1135
+ });
1136
+ })
1137
+ ];
1138
+ case 1:
1139
+ existingBuckets = _state.sent();
1140
+ if (existingBuckets.includes(bucketName)) {
1141
+ console.log("\uD83D\uDCE6 R2 bucket '".concat(bucketName, "' already exists"));
1142
+ return [
1143
+ 2
1144
+ ];
1145
+ }
1146
+ // Create the bucket
1147
+ console.log("\uD83D\uDCE6 Creating R2 bucket '".concat(bucketName, "'..."));
1148
+ return [
1149
+ 4,
1150
+ new Promise(function(resolve, reject) {
1151
+ var _createProcess_stdout, _createProcess_stderr;
1152
+ var createProcess = spawn('npx', [
1153
+ 'wrangler',
1154
+ 'r2',
1155
+ 'bucket',
1156
+ 'create',
1157
+ bucketName
1158
+ ], {
1159
+ cwd: serverDir,
1160
+ stdio: [
1161
+ 'inherit',
1162
+ 'pipe',
1163
+ 'pipe'
1164
+ ],
1165
+ env: _object_spread_props(_object_spread({}, process.env), {
1166
+ CLOUDFLARE_API_TOKEN: process.env.CLOUDFLARE_API_TOKEN,
1167
+ CLOUDFLARE_ACCOUNT_ID: process.env.CLOUDFLARE_ACCOUNT_ID
1168
+ })
1169
+ });
1170
+ (_createProcess_stdout = createProcess.stdout) === null || _createProcess_stdout === void 0 ? void 0 : _createProcess_stdout.on('data', function(data) {
1171
+ process.stdout.write(data);
1172
+ });
1173
+ (_createProcess_stderr = createProcess.stderr) === null || _createProcess_stderr === void 0 ? void 0 : _createProcess_stderr.on('data', function(data) {
1174
+ process.stderr.write(data);
1175
+ });
1176
+ createProcess.on('error', function(err) {
1177
+ reject(new Error("Failed to create R2 bucket: ".concat(err.message)));
1178
+ });
1179
+ createProcess.on('exit', function(code) {
1180
+ if (code === 0) {
1181
+ console.log("✅ R2 bucket '".concat(bucketName, "' created successfully"));
1182
+ resolve();
1183
+ } else {
1184
+ reject(new Error("Failed to create R2 bucket (exit code ".concat(code, ")")));
1185
+ }
1186
+ });
1187
+ })
1188
+ ];
1189
+ case 2:
1190
+ _state.sent();
1191
+ return [
1192
+ 2
1193
+ ];
1194
+ }
1195
+ });
1196
+ }).call(this);
1197
+ }
1198
+ },
1059
1199
  {
1060
1200
  key: "deploy",
1061
1201
  value: function deploy() {
1062
1202
  return _async_to_generator(function() {
1063
- var _this, projectRoot, serverDir;
1203
+ var _this, projectRoot, serverDir, configPath, configContent, config, bucketName;
1064
1204
  return _ts_generator(this, function(_state) {
1065
1205
  switch(_state.label){
1066
1206
  case 0:
@@ -1078,6 +1218,26 @@ export var CloudflareDevServer = /*#__PURE__*/ function() {
1078
1218
  if (!process.env.CLOUDFLARE_API_TOKEN || !process.env.CLOUDFLARE_ACCOUNT_ID) {
1079
1219
  throw new Error('Missing required Cloudflare credentials.\n' + 'Please set CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID environment variables.\n' + 'For example:\n' + ' export CLOUDFLARE_API_TOKEN=your-api-token\n' + ' export CLOUDFLARE_ACCOUNT_ID=your-account-id');
1080
1220
  }
1221
+ // Get project name from config (used as R2 bucket name)
1222
+ configPath = path.join(projectRoot, 'positronic.config.json');
1223
+ return [
1224
+ 4,
1225
+ fsPromises.readFile(configPath, 'utf-8')
1226
+ ];
1227
+ case 2:
1228
+ configContent = _state.sent();
1229
+ config = JSON.parse(configContent);
1230
+ bucketName = config.projectName;
1231
+ if (!bucketName) {
1232
+ throw new Error('Project name not found in positronic.config.json');
1233
+ }
1234
+ // Ensure R2 bucket exists before deploying
1235
+ return [
1236
+ 4,
1237
+ this.ensureR2BucketExists(bucketName)
1238
+ ];
1239
+ case 3:
1240
+ _state.sent();
1081
1241
  console.log('🚀 Deploying to Cloudflare Workers (production)...');
1082
1242
  // Deploy to production using wrangler
1083
1243
  return [
@@ -5,7 +5,7 @@
5
5
  */ // Only export modules that don't depend on cloudflare:workers
6
6
  export { PositronicManifest } from './manifest.js';
7
7
  export { CloudflareR2Loader } from './r2-loader.js';
8
- export { CloudflareDevServer } from './dev-server.js';
8
+ export { CloudflareDevServer, discoverBrains } from './dev-server.js';
9
9
  // Export with standard name for CLI to use
10
10
  export { CloudflareDevServer as DevServer } from './dev-server.js'; // Note: We do NOT export BrainRunnerDO, MonitorDO, or api here
11
11
  // because they depend on cloudflare:workers runtime
@@ -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;AAgkC/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;AA+jC/C,eAAe,GAAG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"brain-runner-do.d.ts","sourceRoot":"","sources":["../../src/brain-runner-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAwC,MAAM,kBAAkB,CAAC;AACrF,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;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;IAqG7B,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAqIhC,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,EAAwC,MAAM,kBAAkB,CAAC;AACrF,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;IAqE3B,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;IAqG7B,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAqIhC,KAAK,CAAC,OAAO,EAAE,OAAO;CA4E7B"}
@@ -1,4 +1,8 @@
1
1
  import type { PositronicDevServer, ServerHandle } from '@positronic/spec';
2
+ export declare function discoverBrains(brainsDir: string): Promise<{
3
+ name: string;
4
+ relativePath: string;
5
+ }[]>;
2
6
  export declare class CloudflareDevServer implements PositronicDevServer {
3
7
  projectRootDir: string;
4
8
  /**
@@ -29,6 +33,7 @@ export declare class CloudflareDevServer implements PositronicDevServer {
29
33
  private configureLocalR2;
30
34
  start(port?: number): Promise<ServerHandle>;
31
35
  watch(filePath: string, event: 'add' | 'change' | 'unlink'): Promise<void>;
36
+ private ensureR2BucketExists;
32
37
  deploy(): Promise<void>;
33
38
  onLog(callback: (message: string) => void): void;
34
39
  onError(callback: (message: string) => void): void;
@@ -1 +1 @@
1
- {"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/dev-server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA4M1E,qBAAa,mBAAoB,YAAW,mBAAmB;IAyB1C,cAAc,EAAE,MAAM;IAjBzC;;;;;;;;;;;OAWG;IAEH,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,gBAAgB,CAAwC;gBAE7C,cAAc,EAAE,MAAM;IAEnC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAiB7B,qBAAqB;YA4DrB,wBAAwB;YAqBxB,yBAAyB;YAQzB,2BAA2B;IAuBzC,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,wBAAwB;YASlB,0BAA0B;IA4BxC,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,gBAAgB;IA4BlB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkD3C,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GACjC,OAAO,CAAC,IAAI,CAAC;IAUV,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA6E7B,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhD,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIlD,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI9C,WAAW,IAAI,OAAO,CAC1B,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC,CAC5D;IAwCK,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CrD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuC5C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA0DnD"}
1
+ {"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/dev-server.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqJ1E,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAmBnD;AA8CD,qBAAa,mBAAoB,YAAW,mBAAmB;IAyB1C,cAAc,EAAE,MAAM;IAjBzC;;;;;;;;;;;OAWG;IAEH,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,gBAAgB,CAAwC;gBAE7C,cAAc,EAAE,MAAM;IAEnC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAiB7B,qBAAqB;YA4DrB,wBAAwB;YAqBxB,yBAAyB;YAQzB,2BAA2B;IAuBzC,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,wBAAwB;YASlB,0BAA0B;IA4BxC,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,gBAAgB;IA4BlB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkD3C,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GACjC,OAAO,CAAC,IAAI,CAAC;YAUF,oBAAoB;IAuE5B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA0F7B,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhD,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIlD,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI9C,WAAW,IAAI,OAAO,CAC1B,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC,CAC5D;IAwCK,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CrD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuC5C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA0DnD"}
@@ -5,6 +5,6 @@
5
5
  */
6
6
  export { PositronicManifest, type BrainMetadata, type ResolutionResult } from './manifest.js';
7
7
  export { CloudflareR2Loader } from './r2-loader.js';
8
- export { CloudflareDevServer } from './dev-server.js';
8
+ export { CloudflareDevServer, discoverBrains } from './dev-server.js';
9
9
  export { CloudflareDevServer as DevServer } from './dev-server.js';
10
10
  //# sourceMappingURL=node-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-index.d.ts","sourceRoot":"","sources":["../../src/node-index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"node-index.d.ts","sourceRoot":"","sources":["../../src/node-index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/cloudflare",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
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.25",
35
- "@positronic/spec": "^0.0.25",
36
- "@positronic/template-new-project": "^0.0.25",
34
+ "@positronic/core": "^0.0.27",
35
+ "@positronic/spec": "^0.0.27",
36
+ "@positronic/template-new-project": "^0.0.27",
37
37
  "aws4fetch": "^1.0.18",
38
38
  "caz": "^2.0.0",
39
39
  "cron-schedule": "^5.0.4",