@positronic/cloudflare 0.0.24 → 0.0.26

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
@@ -1660,6 +1660,14 @@ app.post('/webhooks/:slug', function(context) {
1660
1660
  });
1661
1661
  })();
1662
1662
  });
1663
+ /**
1664
+ * Generates a unique slug for pages that don't provide one.
1665
+ * Uses brainRunId prefix + random suffix for uniqueness.
1666
+ */ function generateUniqueSlug(brainRunId) {
1667
+ var shortId = brainRunId.slice(0, 8);
1668
+ var random = Math.random().toString(36).substring(2, 10);
1669
+ return "page-".concat(shortId, "-").concat(random);
1670
+ }
1663
1671
  // Create a new page
1664
1672
  app.post('/pages', function(context) {
1665
1673
  return _async_to_generator(function() {
@@ -1680,14 +1688,6 @@ app.post('/pages', function(context) {
1680
1688
  case 1:
1681
1689
  body = _state.sent();
1682
1690
  slug = body.slug, html = body.html, brainRunId = body.brainRunId, _body_persist = body.persist, persist = _body_persist === void 0 ? false : _body_persist, ttl = body.ttl;
1683
- if (!slug) {
1684
- return [
1685
- 2,
1686
- context.json({
1687
- error: 'Missing required field "slug"'
1688
- }, 400)
1689
- ];
1690
- }
1691
1691
  if (!html) {
1692
1692
  return [
1693
1693
  2,
@@ -1704,14 +1704,19 @@ app.post('/pages', function(context) {
1704
1704
  }, 400)
1705
1705
  ];
1706
1706
  }
1707
- // Validate slug format (alphanumeric, hyphens, underscores only)
1708
- if (!/^[a-zA-Z0-9_-]+$/.test(slug)) {
1709
- return [
1710
- 2,
1711
- context.json({
1712
- error: 'Slug must contain only alphanumeric characters, hyphens, and underscores'
1713
- }, 400)
1714
- ];
1707
+ // Generate slug if not provided
1708
+ if (!slug) {
1709
+ slug = generateUniqueSlug(brainRunId);
1710
+ } else {
1711
+ // Validate slug format (alphanumeric, hyphens, underscores only)
1712
+ if (!/^[a-zA-Z0-9_-]+$/.test(slug)) {
1713
+ return [
1714
+ 2,
1715
+ context.json({
1716
+ error: 'Slug must contain only alphanumeric characters, hyphens, and underscores'
1717
+ }, 400)
1718
+ ];
1719
+ }
1715
1720
  }
1716
1721
  bucket = context.env.RESOURCES_BUCKET;
1717
1722
  key = "pages/".concat(slug, ".html");
@@ -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
@@ -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
@@ -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
@@ -170,6 +170,14 @@ function _ts_generator(thisArg, body) {
170
170
  };
171
171
  }
172
172
  }
173
+ /**
174
+ * Generates a unique slug for pages that don't provide one.
175
+ * Uses brainRunId prefix + random suffix for uniqueness.
176
+ */ function generateUniqueSlug(brainRunId) {
177
+ var shortId = brainRunId.slice(0, 8);
178
+ var random = Math.random().toString(36).substring(2, 10);
179
+ return "page-".concat(shortId, "-").concat(random);
180
+ }
173
181
  /**
174
182
  * Creates a PagesService implementation that works directly with R2 and MonitorDO.
175
183
  *
@@ -178,60 +186,76 @@ function _ts_generator(thisArg, body) {
178
186
  * @param monitorStub - The MonitorDO stub for page registration
179
187
  * @param baseUrl - The base URL for page URLs (e.g., "https://myapp.workers.dev")
180
188
  */ export function createPagesService(brainRunId, bucket, monitorStub, baseUrl) {
181
- return {
182
- create: function create(slug, html, options) {
183
- return _async_to_generator(function() {
184
- var key, createdAt, _options_persist, persist, url;
185
- return _ts_generator(this, function(_state) {
186
- switch(_state.label){
187
- case 0:
188
- key = "pages/".concat(slug, ".html");
189
- createdAt = new Date().toISOString();
190
- persist = (_options_persist = options === null || options === void 0 ? void 0 : options.persist) !== null && _options_persist !== void 0 ? _options_persist : false;
191
- // Store HTML with metadata in R2
192
- return [
193
- 4,
194
- bucket.put(key, html, {
195
- httpMetadata: {
196
- contentType: 'text/html; charset=utf-8'
197
- },
198
- customMetadata: _object_spread({
199
- slug: slug,
200
- brainRunId: brainRunId,
201
- persist: persist ? 'true' : 'false',
202
- createdAt: createdAt
203
- }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
204
- ttl: String(options.ttl)
205
- })
206
- })
207
- ];
208
- case 1:
209
- _state.sent();
210
- // Register the page with MonitorDO for cleanup tracking
211
- return [
212
- 4,
213
- monitorStub.registerPage(slug, brainRunId, persist)
214
- ];
215
- case 2:
216
- _state.sent();
217
- url = "".concat(baseUrl, "/pages/").concat(slug);
218
- return [
219
- 2,
220
- _object_spread_props(_object_spread({
189
+ // Implementation function that handles both overloads
190
+ function createPage(slugOrHtml, htmlOrOptions, maybeOptions) {
191
+ return _async_to_generator(function() {
192
+ var slug, html, options, key, createdAt, _options_persist, persist, url;
193
+ return _ts_generator(this, function(_state) {
194
+ switch(_state.label){
195
+ case 0:
196
+ // Detect which overload was used:
197
+ // - create(html, options?) - htmlOrOptions is undefined or PageCreateOptions
198
+ // - create(slug, html, options?) - htmlOrOptions is string (the html)
199
+ if (typeof htmlOrOptions === 'string') {
200
+ // Called as create(slug, html, options?)
201
+ slug = slugOrHtml;
202
+ html = htmlOrOptions;
203
+ options = maybeOptions;
204
+ } else {
205
+ // Called as create(html, options?)
206
+ slug = generateUniqueSlug(brainRunId);
207
+ html = slugOrHtml;
208
+ options = htmlOrOptions;
209
+ }
210
+ key = "pages/".concat(slug, ".html");
211
+ createdAt = new Date().toISOString();
212
+ persist = (_options_persist = options === null || options === void 0 ? void 0 : options.persist) !== null && _options_persist !== void 0 ? _options_persist : false;
213
+ // Store HTML with metadata in R2
214
+ return [
215
+ 4,
216
+ bucket.put(key, html, {
217
+ httpMetadata: {
218
+ contentType: 'text/html; charset=utf-8'
219
+ },
220
+ customMetadata: _object_spread({
221
221
  slug: slug,
222
- url: url,
223
222
  brainRunId: brainRunId,
224
- persist: persist
225
- }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
226
- ttl: options.ttl
227
- }), {
223
+ persist: persist ? 'true' : 'false',
228
224
  createdAt: createdAt
225
+ }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
226
+ ttl: String(options.ttl)
229
227
  })
230
- ];
231
- }
232
- });
233
- })();
234
- },
228
+ })
229
+ ];
230
+ case 1:
231
+ _state.sent();
232
+ // Register the page with MonitorDO for cleanup tracking
233
+ return [
234
+ 4,
235
+ monitorStub.registerPage(slug, brainRunId, persist)
236
+ ];
237
+ case 2:
238
+ _state.sent();
239
+ url = "".concat(baseUrl, "/pages/").concat(slug);
240
+ return [
241
+ 2,
242
+ _object_spread_props(_object_spread({
243
+ slug: slug,
244
+ url: url,
245
+ brainRunId: brainRunId,
246
+ persist: persist
247
+ }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
248
+ ttl: options.ttl
249
+ }), {
250
+ createdAt: createdAt
251
+ })
252
+ ];
253
+ }
254
+ });
255
+ })();
256
+ }
257
+ return {
258
+ create: createPage,
235
259
  get: function get(slug) {
236
260
  return _async_to_generator(function() {
237
261
  var key, r2Object;
@@ -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;AAojC/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;AAgkC/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
  /**
@@ -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;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"}
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pages-service.d.ts","sourceRoot":"","sources":["../../src/pages-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,QAAQ,EAChB,WAAW,EAAE,iBAAiB,CAAC,SAAS,CAAC,EACzC,OAAO,EAAE,MAAM,GACd,YAAY,CAyGd"}
1
+ {"version":3,"file":"pages-service.d.ts","sourceRoot":"","sources":["../../src/pages-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAYjD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,QAAQ,EAChB,WAAW,EAAE,iBAAiB,CAAC,SAAS,CAAC,EACzC,OAAO,EAAE,MAAM,GACd,YAAY,CA+Hd"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/cloudflare",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
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.24",
35
- "@positronic/spec": "^0.0.24",
36
- "@positronic/template-new-project": "^0.0.24",
34
+ "@positronic/core": "^0.0.26",
35
+ "@positronic/spec": "^0.0.26",
36
+ "@positronic/template-new-project": "^0.0.26",
37
37
  "aws4fetch": "^1.0.18",
38
38
  "caz": "^2.0.0",
39
39
  "cron-schedule": "^5.0.4",