@positronic/cloudflare 0.0.23 → 0.0.25

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");
@@ -248,6 +248,7 @@ import { DurableObject } from 'cloudflare:workers';
248
248
  import { BrainRunSQLiteAdapter } from './sqlite-adapter.js';
249
249
  import { WebhookAdapter } from './webhook-adapter.js';
250
250
  import { PageAdapter } from './page-adapter.js';
251
+ import { createPagesService } from './pages-service.js';
251
252
  import { CloudflareR2Loader } from './r2-loader.js';
252
253
  import { createResources } from '@positronic/core';
253
254
  var manifest = null;
@@ -570,7 +571,7 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
570
571
  key: "start",
571
572
  value: function start(brainTitle, brainRunId, initialData) {
572
573
  return _async_to_generator(function() {
573
- var _this, sql, resolution, brainToRun, sqliteAdapter, eventStreamAdapter, monitorDOStub, monitorAdapter, scheduleAdapter, webhookAdapter, pageAdapter, r2Resources, runnerWithResources, options, initialState;
574
+ var _this, sql, resolution, brainToRun, sqliteAdapter, eventStreamAdapter, monitorDOStub, monitorAdapter, scheduleAdapter, webhookAdapter, pageAdapter, baseUrl, pagesService, r2Resources, runnerWithResources, options, initialState;
574
575
  return _ts_generator(this, function(_state) {
575
576
  switch(_state.label){
576
577
  case 0:
@@ -601,6 +602,9 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
601
602
  scheduleAdapter = new ScheduleAdapter(this.env.SCHEDULE_DO.get(this.env.SCHEDULE_DO.idFromName('singleton')));
602
603
  webhookAdapter = new WebhookAdapter(monitorDOStub);
603
604
  pageAdapter = new PageAdapter(monitorDOStub, this.env.RESOURCES_BUCKET);
605
+ // Create pages service for brain to use
606
+ baseUrl = this.env.WORKER_URL || 'http://localhost:3000';
607
+ pagesService = createPagesService(brainRunId, this.env.RESOURCES_BUCKET, monitorDOStub, baseUrl);
604
608
  if (!brainRunner) {
605
609
  throw new Error('BrainRunner not initialized');
606
610
  }
@@ -616,6 +620,8 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
616
620
  if (r2Resources) {
617
621
  runnerWithResources = brainRunner.withResources(r2Resources);
618
622
  }
623
+ // Add pages service
624
+ runnerWithResources = runnerWithResources.withPages(pagesService);
619
625
  // Extract options from initialData if present
620
626
  options = initialData === null || initialData === void 0 ? void 0 : initialData.options;
621
627
  initialState = initialData && !initialData.options ? initialData : {};
@@ -654,7 +660,7 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
654
660
  key: "resume",
655
661
  value: function resume(brainRunId, webhookResponse) {
656
662
  return _async_to_generator(function() {
657
- var _this, sql, startEventResult, startEvent, brainTitle, initialState, resolution, brainToRun, eventsResult, initialCompletedSteps, sqliteAdapter, eventStreamAdapter, monitorDOStub, monitorAdapter, scheduleAdapter, webhookAdapter, pageAdapter, r2Resources, runnerWithResources;
663
+ var _this, sql, startEventResult, startEvent, brainTitle, initialState, resolution, brainToRun, eventsResult, initialCompletedSteps, sqliteAdapter, eventStreamAdapter, monitorDOStub, monitorAdapter, scheduleAdapter, webhookAdapter, pageAdapter, baseUrl, pagesService, r2Resources, runnerWithResources;
658
664
  return _ts_generator(this, function(_state) {
659
665
  switch(_state.label){
660
666
  case 0:
@@ -706,6 +712,9 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
706
712
  scheduleAdapter = new ScheduleAdapter(this.env.SCHEDULE_DO.get(this.env.SCHEDULE_DO.idFromName('singleton')));
707
713
  webhookAdapter = new WebhookAdapter(monitorDOStub);
708
714
  pageAdapter = new PageAdapter(monitorDOStub, this.env.RESOURCES_BUCKET);
715
+ // Create pages service for brain to use
716
+ baseUrl = this.env.WORKER_URL || 'http://localhost:3000';
717
+ pagesService = createPagesService(brainRunId, this.env.RESOURCES_BUCKET, monitorDOStub, baseUrl);
709
718
  if (!brainRunner) {
710
719
  throw new Error('BrainRunner not initialized');
711
720
  }
@@ -719,6 +728,8 @@ export var BrainRunnerDO = /*#__PURE__*/ function(DurableObject) {
719
728
  if (r2Resources) {
720
729
  runnerWithResources = brainRunner.withResources(r2Resources);
721
730
  }
731
+ // Add pages service
732
+ runnerWithResources = runnerWithResources.withPages(pagesService);
722
733
  // Create abort controller for this run
723
734
  this.abortController = new AbortController();
724
735
  runnerWithResources.withAdapters([
package/dist/src/index.js CHANGED
@@ -4,3 +4,4 @@ export { ScheduleDO } from './schedule-do.js';
4
4
  export { PositronicManifest } from './manifest.js';
5
5
  export { default as api } from './api.js';
6
6
  export { CloudflareR2Loader } from './r2-loader.js';
7
+ export { createPagesService } from './pages-service.js';
@@ -0,0 +1,373 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _async_to_generator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ function _define_property(obj, key, value) {
31
+ if (key in obj) {
32
+ Object.defineProperty(obj, key, {
33
+ value: value,
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true
37
+ });
38
+ } else {
39
+ obj[key] = value;
40
+ }
41
+ return obj;
42
+ }
43
+ function _object_spread(target) {
44
+ for(var i = 1; i < arguments.length; i++){
45
+ var source = arguments[i] != null ? arguments[i] : {};
46
+ var ownKeys = Object.keys(source);
47
+ if (typeof Object.getOwnPropertySymbols === "function") {
48
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
49
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
50
+ }));
51
+ }
52
+ ownKeys.forEach(function(key) {
53
+ _define_property(target, key, source[key]);
54
+ });
55
+ }
56
+ return target;
57
+ }
58
+ function ownKeys(object, enumerableOnly) {
59
+ var keys = Object.keys(object);
60
+ if (Object.getOwnPropertySymbols) {
61
+ var symbols = Object.getOwnPropertySymbols(object);
62
+ if (enumerableOnly) {
63
+ symbols = symbols.filter(function(sym) {
64
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
65
+ });
66
+ }
67
+ keys.push.apply(keys, symbols);
68
+ }
69
+ return keys;
70
+ }
71
+ function _object_spread_props(target, source) {
72
+ source = source != null ? source : {};
73
+ if (Object.getOwnPropertyDescriptors) {
74
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
75
+ } else {
76
+ ownKeys(Object(source)).forEach(function(key) {
77
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
78
+ });
79
+ }
80
+ return target;
81
+ }
82
+ function _ts_generator(thisArg, body) {
83
+ var f, y, t, _ = {
84
+ label: 0,
85
+ sent: function() {
86
+ if (t[0] & 1) throw t[1];
87
+ return t[1];
88
+ },
89
+ trys: [],
90
+ ops: []
91
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
92
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
93
+ return this;
94
+ }), g;
95
+ function verb(n) {
96
+ return function(v) {
97
+ return step([
98
+ n,
99
+ v
100
+ ]);
101
+ };
102
+ }
103
+ function step(op) {
104
+ if (f) throw new TypeError("Generator is already executing.");
105
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
106
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
107
+ if (y = 0, t) op = [
108
+ op[0] & 2,
109
+ t.value
110
+ ];
111
+ switch(op[0]){
112
+ case 0:
113
+ case 1:
114
+ t = op;
115
+ break;
116
+ case 4:
117
+ _.label++;
118
+ return {
119
+ value: op[1],
120
+ done: false
121
+ };
122
+ case 5:
123
+ _.label++;
124
+ y = op[1];
125
+ op = [
126
+ 0
127
+ ];
128
+ continue;
129
+ case 7:
130
+ op = _.ops.pop();
131
+ _.trys.pop();
132
+ continue;
133
+ default:
134
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
135
+ _ = 0;
136
+ continue;
137
+ }
138
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
139
+ _.label = op[1];
140
+ break;
141
+ }
142
+ if (op[0] === 6 && _.label < t[1]) {
143
+ _.label = t[1];
144
+ t = op;
145
+ break;
146
+ }
147
+ if (t && _.label < t[2]) {
148
+ _.label = t[2];
149
+ _.ops.push(op);
150
+ break;
151
+ }
152
+ if (t[2]) _.ops.pop();
153
+ _.trys.pop();
154
+ continue;
155
+ }
156
+ op = body.call(thisArg, _);
157
+ } catch (e) {
158
+ op = [
159
+ 6,
160
+ e
161
+ ];
162
+ y = 0;
163
+ } finally{
164
+ f = t = 0;
165
+ }
166
+ if (op[0] & 5) throw op[1];
167
+ return {
168
+ value: op[0] ? op[1] : void 0,
169
+ done: true
170
+ };
171
+ }
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
+ }
181
+ /**
182
+ * Creates a PagesService implementation that works directly with R2 and MonitorDO.
183
+ *
184
+ * @param brainRunId - The current brain run ID (used for page registration/cleanup)
185
+ * @param bucket - The R2 bucket for storing pages
186
+ * @param monitorStub - The MonitorDO stub for page registration
187
+ * @param baseUrl - The base URL for page URLs (e.g., "https://myapp.workers.dev")
188
+ */ export function createPagesService(brainRunId, bucket, monitorStub, baseUrl) {
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
+ slug: slug,
222
+ brainRunId: brainRunId,
223
+ persist: persist ? 'true' : 'false',
224
+ createdAt: createdAt
225
+ }, (options === null || options === void 0 ? void 0 : options.ttl) !== undefined && {
226
+ ttl: String(options.ttl)
227
+ })
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,
259
+ get: function get(slug) {
260
+ return _async_to_generator(function() {
261
+ var key, r2Object;
262
+ return _ts_generator(this, function(_state) {
263
+ switch(_state.label){
264
+ case 0:
265
+ key = "pages/".concat(slug, ".html");
266
+ return [
267
+ 4,
268
+ bucket.get(key)
269
+ ];
270
+ case 1:
271
+ r2Object = _state.sent();
272
+ if (!r2Object) {
273
+ return [
274
+ 2,
275
+ null
276
+ ];
277
+ }
278
+ return [
279
+ 2,
280
+ r2Object.text()
281
+ ];
282
+ }
283
+ });
284
+ })();
285
+ },
286
+ exists: function exists(slug) {
287
+ return _async_to_generator(function() {
288
+ var key, r2Object, metadata, url;
289
+ return _ts_generator(this, function(_state) {
290
+ switch(_state.label){
291
+ case 0:
292
+ key = "pages/".concat(slug, ".html");
293
+ return [
294
+ 4,
295
+ bucket.head(key)
296
+ ];
297
+ case 1:
298
+ r2Object = _state.sent();
299
+ if (!r2Object) {
300
+ return [
301
+ 2,
302
+ null
303
+ ];
304
+ }
305
+ metadata = r2Object.customMetadata || {};
306
+ url = "".concat(baseUrl, "/pages/").concat(slug);
307
+ return [
308
+ 2,
309
+ _object_spread_props(_object_spread({
310
+ slug: metadata.slug || slug,
311
+ url: url,
312
+ brainRunId: metadata.brainRunId || '',
313
+ persist: metadata.persist === 'true'
314
+ }, metadata.ttl && {
315
+ ttl: Number(metadata.ttl)
316
+ }), {
317
+ createdAt: metadata.createdAt || r2Object.uploaded.toISOString()
318
+ })
319
+ ];
320
+ }
321
+ });
322
+ })();
323
+ },
324
+ update: function update(slug, html) {
325
+ return _async_to_generator(function() {
326
+ var key, existingObject, existingMetadata, url;
327
+ return _ts_generator(this, function(_state) {
328
+ switch(_state.label){
329
+ case 0:
330
+ key = "pages/".concat(slug, ".html");
331
+ return [
332
+ 4,
333
+ bucket.head(key)
334
+ ];
335
+ case 1:
336
+ existingObject = _state.sent();
337
+ if (!existingObject) {
338
+ throw new Error("Page '".concat(slug, "' not found"));
339
+ }
340
+ // Preserve existing metadata
341
+ existingMetadata = existingObject.customMetadata || {};
342
+ // Update with new HTML, preserving metadata
343
+ return [
344
+ 4,
345
+ bucket.put(key, html, {
346
+ httpMetadata: {
347
+ contentType: 'text/html; charset=utf-8'
348
+ },
349
+ customMetadata: existingMetadata
350
+ })
351
+ ];
352
+ case 2:
353
+ _state.sent();
354
+ url = "".concat(baseUrl, "/pages/").concat(slug);
355
+ return [
356
+ 2,
357
+ _object_spread_props(_object_spread({
358
+ slug: existingMetadata.slug || slug,
359
+ url: url,
360
+ brainRunId: existingMetadata.brainRunId || '',
361
+ persist: existingMetadata.persist === 'true'
362
+ }, existingMetadata.ttl && {
363
+ ttl: Number(existingMetadata.ttl)
364
+ }), {
365
+ createdAt: existingMetadata.createdAt || existingObject.uploaded.toISOString()
366
+ })
367
+ ];
368
+ }
369
+ });
370
+ })();
371
+ }
372
+ };
373
+ }
@@ -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"}
@@ -14,6 +14,7 @@ export interface Env {
14
14
  MONITOR_DO: DurableObjectNamespace<MonitorDO>;
15
15
  SCHEDULE_DO: DurableObjectNamespace<ScheduleDO>;
16
16
  RESOURCES_BUCKET: R2Bucket;
17
+ WORKER_URL?: string;
17
18
  }
18
19
  export declare class BrainRunnerDO extends DurableObject<Env> {
19
20
  private sql;
@@ -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;AAMnD,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;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;IAyF7B,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAyHhC,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;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"}
@@ -4,4 +4,5 @@ export { ScheduleDO } from './schedule-do.js';
4
4
  export { PositronicManifest, type BrainMetadata, type ResolutionResult } from './manifest.js';
5
5
  export { default as api } from './api.js';
6
6
  export { CloudflareR2Loader } from './r2-loader.js';
7
+ export { createPagesService } from './pages-service.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { PagesService } from '@positronic/core';
2
+ import type { R2Bucket } from '@cloudflare/workers-types';
3
+ import type { MonitorDO } from './monitor-do.js';
4
+ /**
5
+ * Creates a PagesService implementation that works directly with R2 and MonitorDO.
6
+ *
7
+ * @param brainRunId - The current brain run ID (used for page registration/cleanup)
8
+ * @param bucket - The R2 bucket for storing pages
9
+ * @param monitorStub - The MonitorDO stub for page registration
10
+ * @param baseUrl - The base URL for page URLs (e.g., "https://myapp.workers.dev")
11
+ */
12
+ export declare function createPagesService(brainRunId: string, bucket: R2Bucket, monitorStub: DurableObjectStub<MonitorDO>, baseUrl: string): PagesService;
13
+ //# sourceMappingURL=pages-service.d.ts.map
@@ -0,0 +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;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.23",
3
+ "version": "0.0.25",
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.23",
35
- "@positronic/spec": "^0.0.23",
36
- "@positronic/template-new-project": "^0.0.23",
34
+ "@positronic/core": "^0.0.25",
35
+ "@positronic/spec": "^0.0.25",
36
+ "@positronic/template-new-project": "^0.0.25",
37
37
  "aws4fetch": "^1.0.18",
38
38
  "caz": "^2.0.0",
39
39
  "cron-schedule": "^5.0.4",