@positronic/cloudflare 0.0.67 → 0.0.69

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.
Files changed (37) hide show
  1. package/dist/src/api/auth-middleware.js +25 -0
  2. package/dist/src/api/brains.js +67 -16
  3. package/dist/src/api/secrets.js +3 -0
  4. package/dist/src/brain-runner-do.js +51 -5
  5. package/dist/src/create-r2-store.js +319 -0
  6. package/dist/src/dev-server.js +19 -1
  7. package/dist/src/governor-client-wrapper.js +364 -0
  8. package/dist/src/governor-do.js +387 -0
  9. package/dist/src/index.js +3 -0
  10. package/dist/src/monitor-do.js +25 -12
  11. package/dist/src/rate-limit-headers.js +199 -0
  12. package/dist/src/schedule-do.js +38 -22
  13. package/dist/src/token-estimator.js +39 -0
  14. package/dist/types/api/auth-middleware.d.ts +5 -0
  15. package/dist/types/api/auth-middleware.d.ts.map +1 -1
  16. package/dist/types/api/brains.d.ts.map +1 -1
  17. package/dist/types/api/secrets.d.ts.map +1 -1
  18. package/dist/types/brain-runner-do.d.ts +9 -1
  19. package/dist/types/brain-runner-do.d.ts.map +1 -1
  20. package/dist/types/create-r2-store.d.ts +14 -0
  21. package/dist/types/create-r2-store.d.ts.map +1 -0
  22. package/dist/types/dev-server.d.ts.map +1 -1
  23. package/dist/types/governor-client-wrapper.d.ts +15 -0
  24. package/dist/types/governor-client-wrapper.d.ts.map +1 -0
  25. package/dist/types/governor-do.d.ts +25 -0
  26. package/dist/types/governor-do.d.ts.map +1 -0
  27. package/dist/types/index.d.ts +3 -0
  28. package/dist/types/index.d.ts.map +1 -1
  29. package/dist/types/monitor-do.d.ts +13 -4
  30. package/dist/types/monitor-do.d.ts.map +1 -1
  31. package/dist/types/rate-limit-headers.d.ts +10 -0
  32. package/dist/types/rate-limit-headers.d.ts.map +1 -0
  33. package/dist/types/schedule-do.d.ts +11 -3
  34. package/dist/types/schedule-do.d.ts.map +1 -1
  35. package/dist/types/token-estimator.d.ts +9 -0
  36. package/dist/types/token-estimator.d.ts.map +1 -0
  37. package/package.json +5 -4
@@ -253,7 +253,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
253
253
  ]), _define_property(_this, "storage", void 0);
254
254
  _this.storage = state.storage.sql;
255
255
  // Initialize database schema
256
- _this.storage.exec("\n CREATE TABLE IF NOT EXISTS schedules (\n id TEXT PRIMARY KEY,\n brain_title TEXT NOT NULL,\n cron_expression TEXT NOT NULL,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at INTEGER NOT NULL,\n next_run_at INTEGER\n );\n\n CREATE INDEX IF NOT EXISTS idx_schedules_brain\n ON schedules(brain_title);\n\n CREATE INDEX IF NOT EXISTS idx_schedules_enabled\n ON schedules(enabled);\n\n CREATE TABLE IF NOT EXISTS scheduled_runs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n schedule_id TEXT NOT NULL,\n brain_run_id TEXT UNIQUE,\n status TEXT NOT NULL CHECK(status IN ('triggered', 'failed', 'complete')),\n ran_at INTEGER NOT NULL,\n completed_at INTEGER,\n error TEXT,\n FOREIGN KEY (schedule_id) REFERENCES schedules(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_runs_schedule\n ON scheduled_runs(schedule_id, ran_at DESC);\n ");
256
+ _this.storage.exec("\n CREATE TABLE IF NOT EXISTS schedules (\n id TEXT PRIMARY KEY,\n brain_title TEXT NOT NULL,\n cron_expression TEXT NOT NULL,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at INTEGER NOT NULL,\n next_run_at INTEGER,\n run_as_user_id TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_schedules_brain\n ON schedules(brain_title);\n\n CREATE INDEX IF NOT EXISTS idx_schedules_enabled\n ON schedules(enabled);\n\n CREATE TABLE IF NOT EXISTS scheduled_runs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n schedule_id TEXT NOT NULL,\n brain_run_id TEXT UNIQUE,\n status TEXT NOT NULL CHECK(status IN ('triggered', 'failed', 'complete')),\n ran_at INTEGER NOT NULL,\n completed_at INTEGER,\n error TEXT,\n FOREIGN KEY (schedule_id) REFERENCES schedules(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_runs_schedule\n ON scheduled_runs(schedule_id, ran_at DESC);\n ");
257
257
  // Migration: add timezone column for existing DOs
258
258
  try {
259
259
  _this.storage.exec("ALTER TABLE schedules ADD COLUMN timezone TEXT NOT NULL DEFAULT 'UTC'");
@@ -266,7 +266,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
266
266
  {
267
267
  key: "createSchedule",
268
268
  value: function createSchedule(brainTitle, cronExpression) {
269
- var timezone = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'UTC';
269
+ var timezone = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'UTC', runAsUserId = arguments.length > 3 ? arguments[3] : void 0;
270
270
  return _async_to_generator(function() {
271
271
  var id, createdAt, alarm, nextRunAt;
272
272
  return _ts_generator(this, function(_state) {
@@ -299,7 +299,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
299
299
  // Note: Cron expression is validated at the API level before calling this method
300
300
  // Calculate next run time
301
301
  nextRunAt = this.calculateNextRunTime(cronExpression, createdAt, timezone);
302
- this.storage.exec("INSERT INTO schedules (id, brain_title, cron_expression, timezone, enabled, created_at, next_run_at)\n VALUES (?, ?, ?, ?, 1, ?, ?)", id, brainTitle, cronExpression, timezone, createdAt, nextRunAt);
302
+ this.storage.exec("INSERT INTO schedules (id, brain_title, cron_expression, timezone, enabled, created_at, next_run_at, run_as_user_id)\n VALUES (?, ?, ?, ?, 1, ?, ?, ?)", id, brainTitle, cronExpression, timezone, createdAt, nextRunAt, runAsUserId);
303
303
  return [
304
304
  2,
305
305
  {
@@ -309,7 +309,8 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
309
309
  timezone: timezone,
310
310
  enabled: true,
311
311
  createdAt: createdAt,
312
- nextRunAt: nextRunAt
312
+ nextRunAt: nextRunAt,
313
+ runAsUserId: runAsUserId
313
314
  }
314
315
  ];
315
316
  }
@@ -323,7 +324,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
323
324
  return _async_to_generator(function() {
324
325
  var results, result;
325
326
  return _ts_generator(this, function(_state) {
326
- results = this.storage.exec("SELECT id, brain_title, cron_expression, timezone, enabled, created_at, next_run_at\n FROM schedules WHERE id = ?", scheduleId).toArray();
327
+ results = this.storage.exec("SELECT id, brain_title, cron_expression, timezone, enabled, created_at, next_run_at, run_as_user_id\n FROM schedules WHERE id = ?", scheduleId).toArray();
327
328
  if (results.length === 0) {
328
329
  return [
329
330
  2,
@@ -340,7 +341,8 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
340
341
  timezone: result.timezone || 'UTC',
341
342
  enabled: result.enabled === 1,
342
343
  createdAt: result.created_at,
343
- nextRunAt: result.next_run_at
344
+ nextRunAt: result.next_run_at,
345
+ runAsUserId: result.run_as_user_id
344
346
  }
345
347
  ];
346
348
  });
@@ -379,7 +381,10 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
379
381
  },
380
382
  {
381
383
  key: "listSchedules",
382
- value: function listSchedules() {
384
+ value: /**
385
+ * List all schedules. Pass null for userId to skip ownership filter (root access).
386
+ */ function listSchedules() {
387
+ var userId = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
383
388
  return _async_to_generator(function() {
384
389
  var alarm, schedules;
385
390
  return _ts_generator(this, function(_state) {
@@ -416,7 +421,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
416
421
  _state.sent();
417
422
  _state.label = 4;
418
423
  case 4:
419
- schedules = this.storage.exec("SELECT id, brain_title, cron_expression, timezone, enabled, created_at, next_run_at\n FROM schedules\n ORDER BY created_at DESC").toArray().map(function(row) {
424
+ schedules = this.storage.exec("SELECT id, brain_title, cron_expression, timezone, enabled, created_at, next_run_at, run_as_user_id\n FROM schedules\n WHERE (? IS NULL OR run_as_user_id = ?)\n ORDER BY created_at DESC", userId, userId).toArray().map(function(row) {
420
425
  return {
421
426
  id: row.id,
422
427
  brainTitle: row.brain_title,
@@ -424,7 +429,8 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
424
429
  timezone: row.timezone || 'UTC',
425
430
  enabled: row.enabled === 1,
426
431
  createdAt: row.created_at,
427
- nextRunAt: row.next_run_at
432
+ nextRunAt: row.next_run_at,
433
+ runAsUserId: row.run_as_user_id
428
434
  };
429
435
  });
430
436
  return [
@@ -441,18 +447,23 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
441
447
  },
442
448
  {
443
449
  key: "getAllRuns",
444
- value: function getAllRuns(scheduleId) {
445
- var limit = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 100;
450
+ value: /**
451
+ * Get all scheduled runs. Pass null for userId to skip ownership filter (root access).
452
+ * When userId is set, only returns runs for schedules owned by that user.
453
+ */ function getAllRuns(scheduleId) {
454
+ var limit = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 100, userId = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
446
455
  return _async_to_generator(function() {
447
456
  var _this_storage, _this_storage1, query, params, runs, countQuery, countParams, countResult, count;
448
457
  return _ts_generator(this, function(_state) {
449
- query = "\n SELECT id, schedule_id, brain_run_id, status, ran_at, completed_at, error\n FROM scheduled_runs\n ";
458
+ query = "\n SELECT sr.id, sr.schedule_id, sr.brain_run_id, sr.status, sr.ran_at, sr.completed_at, sr.error\n FROM scheduled_runs sr\n JOIN schedules s ON sr.schedule_id = s.id\n WHERE 1=1\n ";
450
459
  params = [];
451
460
  if (scheduleId) {
452
- query += " WHERE schedule_id = ?";
461
+ query += " AND sr.schedule_id = ?";
453
462
  params.push(scheduleId);
454
463
  }
455
- query += " ORDER BY ran_at DESC LIMIT ?";
464
+ query += " AND (? IS NULL OR s.run_as_user_id = ?)";
465
+ params.push(userId, userId);
466
+ query += " ORDER BY sr.ran_at DESC LIMIT ?";
456
467
  params.push(limit);
457
468
  runs = (_this_storage = this.storage).exec.apply(_this_storage, [
458
469
  query
@@ -468,12 +479,14 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
468
479
  };
469
480
  });
470
481
  // Get total count
471
- countQuery = "SELECT COUNT(*) as count FROM scheduled_runs";
482
+ countQuery = "\n SELECT COUNT(*) as count\n FROM scheduled_runs sr\n JOIN schedules s ON sr.schedule_id = s.id\n WHERE 1=1\n ";
472
483
  countParams = [];
473
484
  if (scheduleId) {
474
- countQuery += " WHERE schedule_id = ?";
485
+ countQuery += " AND sr.schedule_id = ?";
475
486
  countParams.push(scheduleId);
476
487
  }
488
+ countQuery += " AND (? IS NULL OR s.run_as_user_id = ?)";
489
+ countParams.push(userId, userId);
477
490
  countResult = (_this_storage1 = this.storage).exec.apply(_this_storage1, [
478
491
  countQuery
479
492
  ].concat(_to_consumable_array(countParams))).one();
@@ -494,7 +507,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
494
507
  value: // Handle the alarm trigger - runs every minute in a perpetual cycle
495
508
  function alarm() {
496
509
  return _async_to_generator(function() {
497
- var now, dueSchedules, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, schedule, scheduleId, brainTitle, cronExpression, brainRunId, error, errorMessage, timezone, nextRunAt, err;
510
+ var now, dueSchedules, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, schedule, scheduleId, brainTitle, cronExpression, runAsUserId, brainRunId, error, errorMessage, timezone, nextRunAt, err;
498
511
  return _ts_generator(this, function(_state) {
499
512
  switch(_state.label){
500
513
  case 0:
@@ -509,7 +522,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
509
522
  // checking every minute ensures we never miss a scheduled run.
510
523
  // Get all enabled schedules that are due
511
524
  now = Date.now();
512
- dueSchedules = this.storage.exec("SELECT id, brain_title, cron_expression, timezone\n FROM schedules\n WHERE enabled = 1 AND next_run_at <= ?", now).toArray();
525
+ dueSchedules = this.storage.exec("SELECT id, brain_title, cron_expression, timezone, run_as_user_id\n FROM schedules\n WHERE enabled = 1 AND next_run_at <= ?", now).toArray();
513
526
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
514
527
  _state.label = 1;
515
528
  case 1:
@@ -530,6 +543,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
530
543
  scheduleId = schedule.id;
531
544
  brainTitle = schedule.brain_title;
532
545
  cronExpression = schedule.cron_expression;
546
+ runAsUserId = schedule.run_as_user_id;
533
547
  _state.label = 3;
534
548
  case 3:
535
549
  _state.trys.push([
@@ -540,7 +554,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
540
554
  ]);
541
555
  return [
542
556
  4,
543
- this.triggerBrainRun(brainTitle)
557
+ this.triggerBrainRun(brainTitle, runAsUserId)
544
558
  ];
545
559
  case 4:
546
560
  brainRunId = _state.sent();
@@ -630,7 +644,7 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
630
644
  },
631
645
  {
632
646
  key: "triggerBrainRun",
633
- value: function triggerBrainRun(brainTitle) {
647
+ value: function triggerBrainRun(brainTitle, runAsUserId) {
634
648
  return _async_to_generator(function() {
635
649
  var brainRunId, namespace, doId, stub;
636
650
  return _ts_generator(this, function(_state) {
@@ -640,10 +654,12 @@ export var ScheduleDO = /*#__PURE__*/ function(DurableObject) {
640
654
  namespace = this.env.BRAIN_RUNNER_DO;
641
655
  doId = namespace.idFromName(brainRunId);
642
656
  stub = namespace.get(doId);
643
- console.log("[ScheduleDO] Triggering brain run ".concat(brainTitle, " with id ").concat(brainRunId));
657
+ console.log("[ScheduleDO] Triggering brain run ".concat(brainTitle, " with id ").concat(brainRunId, " as user ").concat(runAsUserId));
644
658
  return [
645
659
  4,
646
- stub.start(brainTitle, brainRunId)
660
+ stub.start(brainTitle, brainRunId, {
661
+ id: runAsUserId
662
+ })
647
663
  ];
648
664
  case 1:
649
665
  _state.sent();
@@ -0,0 +1,39 @@
1
+ import { Tiktoken } from 'js-tiktoken/lite';
2
+ import cl100k_base from 'js-tiktoken/ranks/cl100k_base';
3
+ var encoder = new Tiktoken(cl100k_base);
4
+ export function estimateTokens(text) {
5
+ return encoder.encode(text).length;
6
+ }
7
+ export function estimateRequestTokens(param) {
8
+ var prompt = param.prompt, messages = param.messages, system = param.system;
9
+ var parts = [];
10
+ if (system) {
11
+ parts.push(system);
12
+ }
13
+ if (messages) {
14
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
15
+ try {
16
+ for(var _iterator = messages[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
17
+ var msg = _step.value;
18
+ parts.push(msg.content);
19
+ }
20
+ } catch (err) {
21
+ _didIteratorError = true;
22
+ _iteratorError = err;
23
+ } finally{
24
+ try {
25
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
26
+ _iterator.return();
27
+ }
28
+ } finally{
29
+ if (_didIteratorError) {
30
+ throw _iteratorError;
31
+ }
32
+ }
33
+ }
34
+ }
35
+ if (prompt) {
36
+ parts.push(prompt);
37
+ }
38
+ return estimateTokens(parts.join('\n'));
39
+ }
@@ -4,6 +4,11 @@ export interface AuthContext {
4
4
  userId: string | null;
5
5
  isRoot: boolean;
6
6
  }
7
+ /**
8
+ * Middleware that restricts access to root users only.
9
+ * Returns 403 if the authenticated user is not root.
10
+ */
11
+ export declare function requireRoot(): MiddlewareHandler;
7
12
  declare module 'hono' {
8
13
  interface ContextVariableMap {
9
14
  auth: AuthContext;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../../src/api/auth-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAGD,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,IAAI,EAAE,WAAW,CAAC;KACnB;CACF;AAwBD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,iBAAiB,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,CAsF1E"}
1
+ {"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../../src/api/auth-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,iBAAiB,CAQ/C;AAGD,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,IAAI,EAAE,WAAW,CAAC;KACnB;CACF;AAwBD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,iBAAiB,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,CAsF1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"brains.d.ts","sourceRoot":"","sources":["../../../src/api/brains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAM1C,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,YAAY,CAAC;AAE1F,QAAA,MAAM,MAAM;cAAwB,QAAQ;yCAAK,CAAC;AA+lBlD,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"brains.d.ts","sourceRoot":"","sources":["../../../src/api/brains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAM1C,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,YAAY,CAAC;AAE1F,QAAA,MAAM,MAAM;cAAwB,QAAQ;yCAAK,CAAC;AAooBlD,eAAe,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/api/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiD3C,QAAA,MAAM,OAAO;cAAwB,QAAQ;yCAAK,CAAC;AA0SnD,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/api/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkD3C,QAAA,MAAM,OAAO;cAAwB,QAAQ;yCAAK,CAAC;AA6SnD,eAAe,OAAO,CAAC"}
@@ -2,6 +2,7 @@ import { BrainRunner, type BrainSignal } from '@positronic/core';
2
2
  import { DurableObject } from 'cloudflare:workers';
3
3
  import type { MonitorDO } from './monitor-do.js';
4
4
  import type { ScheduleDO } from './schedule-do.js';
5
+ import type { GovernorDO } from './governor-do.js';
5
6
  import { PositronicManifest } from './manifest.js';
6
7
  import type { R2Bucket } from '@cloudflare/workers-types';
7
8
  export declare function setManifest(generatedManifest: PositronicManifest): void;
@@ -13,6 +14,7 @@ export interface Env {
13
14
  BRAIN_RUNNER_DO: DurableObjectNamespace;
14
15
  MONITOR_DO: DurableObjectNamespace<MonitorDO>;
15
16
  SCHEDULE_DO: DurableObjectNamespace<ScheduleDO>;
17
+ GOVERNOR_DO: DurableObjectNamespace<GovernorDO>;
16
18
  RESOURCES_BUCKET: R2Bucket;
17
19
  WORKER_URL?: string;
18
20
  }
@@ -22,9 +24,13 @@ export declare class BrainRunnerDO extends DurableObject<Env> {
22
24
  private eventStreamAdapter;
23
25
  private abortController;
24
26
  private pageAdapter;
27
+ private runOwnerTableInitialized;
25
28
  private signalsTableInitialized;
26
29
  private waitTimeoutTableInitialized;
27
30
  constructor(state: DurableObjectState, env: Env);
31
+ private initializeRunOwnerTable;
32
+ private storeRunOwner;
33
+ private getRunOwner;
28
34
  private initializeSignalsTable;
29
35
  private initializeWaitTimeoutTable;
30
36
  storeWaitTimeout(brainRunId: string, timeoutAt: number): void;
@@ -72,7 +78,9 @@ export declare class BrainRunnerDO extends DurableObject<Env> {
72
78
  message: string;
73
79
  }>;
74
80
  alarm(): Promise<void>;
75
- start(brainTitle: string, brainRunId: string, initialData?: Record<string, any>): Promise<void>;
81
+ start(brainTitle: string, brainRunId: string, currentUser: {
82
+ id: string;
83
+ }, initialData?: Record<string, any>): Promise<void>;
76
84
  /**
77
85
  * Wake up (resume) a brain from a previous execution point.
78
86
  * Webhook response data comes from signals, not as a parameter.
@@ -1 +1 @@
1
- {"version":3,"file":"brain-runner-do.d.ts","sourceRoot":"","sources":["../../src/brain-runner-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiG,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChK,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAUnD,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,CAExD;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;AAsGD,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;IACvD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,2BAA2B,CAAS;gBAEhC,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAO/C,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,0BAA0B;IAOlC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAStD,gBAAgB,CAAC,UAAU,EAAE,MAAM;IAQnC,cAAc,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAWlE;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAmB9I;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,WAAW,EAAE;YA+C5D,mBAAmB;IAqEjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;;;;OAQG;IACG,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAkF9F,KAAK;IASL,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAyHnC;;;;OAIG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM;IAyJzB,KAAK,CAAC,OAAO,EAAE,OAAO;CAkE7B"}
1
+ {"version":3,"file":"brain-runner-do.d.ts","sourceRoot":"","sources":["../../src/brain-runner-do.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { R2Bucket } from '@cloudflare/workers-types';
2
+ import type { StoreProvider } from '@positronic/core';
3
+ /**
4
+ * Create a StoreProvider backed by Cloudflare R2.
5
+ *
6
+ * Key resolution:
7
+ * shared: store/{brainTitle}/{key}.json
8
+ * per-user: store/{brainTitle}/user/{userId}/{key}.json
9
+ *
10
+ * The factory receives the store schema, brain title, and currentUser,
11
+ * and returns a typed Store<any> with full key resolution built in.
12
+ */
13
+ export declare function createR2Backend(bucket: R2Bucket): StoreProvider;
14
+ //# sourceMappingURL=create-r2-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-r2-store.d.ts","sourceRoot":"","sources":["../../src/create-r2-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAS,MAAM,kBAAkB,CAAC;AAe7D;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,GAAG,aAAa,CA+C/D"}
@@ -1 +1 @@
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;AAED,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAanD;AA6ED,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;YAoB7B,qBAAqB;YA4DrB,wBAAwB;YAkCxB,yBAAyB;YASzB,2BAA2B;IAuBzC,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,wBAAwB;YASlB,0BAA0B;IA4BxC,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,gBAAgB;IA4BxB;;;OAGG;YACW,oBAAoB;IAqF5B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqD3C,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GACjC,OAAO,CAAC,IAAI,CAAC;YAmBF,oBAAoB;IA0D5B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA4G7B;;;OAGG;YACW,sBAAsB;IAepC;;OAEG;YACW,eAAe;IA6B7B,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;AA0K1E,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAmBnD;AAED,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAanD;AA6ED,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;YAoB7B,qBAAqB;YA4DrB,wBAAwB;YAkCxB,yBAAyB;YASzB,2BAA2B;IAuBzC,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,wBAAwB;YASlB,0BAA0B;IA4BxC,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,gBAAgB;IA4BxB;;;OAGG;YACW,oBAAoB;IAqF5B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqD3C,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GACjC,OAAO,CAAC,IAAI,CAAC;YAmBF,oBAAoB;IA0D5B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA4G7B;;;OAGG;YACW,sBAAsB;IAepC;;OAEG;YACW,eAAe;IA6B7B,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"}
@@ -0,0 +1,15 @@
1
+ import type { ObjectGenerator } from '@positronic/core';
2
+ import type { GovernorDO } from './governor-do.js';
3
+ type GovernorStub = Pick<GovernorDO, 'waitForCapacity' | 'reportHeaders'>;
4
+ interface GovernorNamespace {
5
+ idFromName(name: string): {
6
+ toString(): string;
7
+ };
8
+ get(id: {
9
+ toString(): string;
10
+ }): GovernorStub;
11
+ }
12
+ export declare function setGovernorBinding(ns: GovernorNamespace): void;
13
+ export declare function rateGoverned(client: ObjectGenerator): ObjectGenerator;
14
+ export {};
15
+ //# sourceMappingURL=governor-client-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governor-client-wrapper.d.ts","sourceRoot":"","sources":["../../src/governor-client-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,KAAK,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,GAAG,eAAe,CAAC,CAAC;AAE1E,UAAU,iBAAiB;IACzB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,CAAC;IACjD,GAAG,CAAC,EAAE,EAAE;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC;CAC/C;AAID,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,iBAAiB,QAEvD;AAmDD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,GACtB,eAAe,CAqFjB"}
@@ -0,0 +1,25 @@
1
+ import { DurableObject } from 'cloudflare:workers';
2
+ export interface Env {
3
+ IS_TEST?: string;
4
+ NODE_ENV?: string;
5
+ }
6
+ export declare class GovernorDO extends DurableObject<Env> {
7
+ private readonly storage;
8
+ private waitQueue;
9
+ private loopRunning;
10
+ private rpmLimit;
11
+ private tpmLimit;
12
+ private limitsLoaded;
13
+ private lastAdmitTime;
14
+ private lastDelay;
15
+ constructor(state: DurableObjectState, env: Env);
16
+ private loadLimits;
17
+ private persistLimits;
18
+ waitForCapacity(modelId: string, estimatedTokens: number): Promise<void>;
19
+ reportHeaders(headers: Record<string, string>): Promise<void>;
20
+ private kickLoop;
21
+ private runLoop;
22
+ private calculateDelay;
23
+ private sleep;
24
+ }
25
+ //# sourceMappingURL=governor-do.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governor-do.d.ts","sourceRoot":"","sources":["../../src/governor-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,WAAW,GAAG;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAOD,qBAAa,UAAW,SAAQ,aAAa,CAAC,GAAG,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;gBAEV,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAe/C,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,aAAa;IAYf,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxE,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAenE,OAAO,CAAC,QAAQ;YAKF,OAAO;IAsBrB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,KAAK;CAGd"}
@@ -2,6 +2,9 @@ export { BrainRunnerDO, setBrainRunner, setManifest, setWebhookManifest, } from
2
2
  export { MonitorDO } from './monitor-do.js';
3
3
  export { ScheduleDO } from './schedule-do.js';
4
4
  export { AuthDO } from './auth-do.js';
5
+ export { GovernorDO } from './governor-do.js';
6
+ export { rateGoverned, setGovernorBinding } from './governor-client-wrapper.js';
7
+ export { createR2Backend } from './create-r2-store.js';
5
8
  export { PositronicManifest, type BrainMetadata } from './manifest.js';
6
9
  export { default as api } from './api/index.js';
7
10
  //# 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,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,GAAG,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,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,gBAAgB,CAAC"}
@@ -13,11 +13,20 @@ export declare class MonitorDO extends DurableObject<Env> {
13
13
  getLastEvent(brainRunId: string): Record<string, SqlStorageValue> | null;
14
14
  /**
15
15
  * Get detailed information about a specific brain run
16
- * Returns null if run not found
16
+ * Returns null if run not found or not owned by userId
17
+ * Pass null for userId to skip ownership check (root access)
17
18
  */
18
- getRun(brainRunId: string): any;
19
- history(brainTitle: string, limit?: number): Record<string, SqlStorageValue>[];
20
- activeRuns(brainTitle: string): Record<string, SqlStorageValue>[];
19
+ getRun(brainRunId: string, userId?: string | null): any;
20
+ /**
21
+ * Get run history for a brain.
22
+ * Pass null for userId to skip ownership filter (root access).
23
+ */
24
+ history(brainTitle: string, limit?: number, userId?: string | null): Record<string, SqlStorageValue>[];
25
+ /**
26
+ * Get active brain runs for a specific brain (running, paused, or waiting).
27
+ * Pass null for userId to skip ownership filter (root access).
28
+ */
29
+ activeRuns(brainTitle: string, userId?: string | null): Record<string, SqlStorageValue>[];
21
30
  /**
22
31
  * Register a webhook to wait for
23
32
  * Called when a brain emits a WEBHOOK event
@@ -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;AAQnD,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;IAEtD,OAAO,CAAC,QAAQ,CAAwC;gBAE5C,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAyE/C,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;YAmHzB,sBAAsB;IA4B9B,KAAK,CAAC,OAAO,EAAE,OAAO;IAmE5B,YAAY,CAAC,UAAU,EAAE,MAAM;IAa/B;;;OAGG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM;IAqCzB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IA6B9C,UAAU,CAAC,UAAU,EAAE,MAAM;IA2B7B;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAcpF;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI;IAmBvG;;;OAGG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM;IAU5C;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAgB/D;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM;IAU3B;;;OAGG;IACH,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAezD;;;OAGG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM;CAU1C"}
1
+ {"version":3,"file":"monitor-do.d.ts","sourceRoot":"","sources":["../../src/monitor-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnD,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;IAEtD,OAAO,CAAC,QAAQ,CAAwC;gBAE5C,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IAgF/C,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;YA0HzB,sBAAsB;IA4B9B,KAAK,CAAC,OAAO,EAAE,OAAO;IAmE5B,YAAY,CAAC,UAAU,EAAE,MAAM;IAa/B;;;;OAIG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,IAAW;IAwCvD;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,MAAM,GAAE,MAAM,GAAG,IAAW;IA8B5E;;;OAGG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,IAAW;IA+B3D;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAcpF;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI;IAmBvG;;;OAGG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM;IAU5C;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAgB/D;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM;IAU3B;;;OAGG;IACH,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAezD;;;OAGG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM;CAU1C"}
@@ -0,0 +1,10 @@
1
+ export interface ParsedRateLimits {
2
+ requestsLimit: number | null;
3
+ tokensLimit: number | null;
4
+ }
5
+ export declare function getGoogleModelDefaults(modelId: string): {
6
+ rpm: number;
7
+ tpm: number;
8
+ } | null;
9
+ export declare function parseRateLimitHeaders(headers: Record<string, string>): ParsedRateLimits | null;
10
+ //# sourceMappingURL=rate-limit-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-headers.d.ts","sourceRoot":"","sources":["../../src/rate-limit-headers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA6BD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GACd;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQrC;AAOD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,gBAAgB,GAAG,IAAI,CA8CzB"}
@@ -14,6 +14,7 @@ interface Schedule {
14
14
  enabled: boolean;
15
15
  createdAt: number;
16
16
  nextRunAt?: number;
17
+ runAsUserId: string;
17
18
  }
18
19
  interface ScheduledRun {
19
20
  id: number;
@@ -27,14 +28,21 @@ interface ScheduledRun {
27
28
  export declare class ScheduleDO extends DurableObject<Env> {
28
29
  private readonly storage;
29
30
  constructor(state: DurableObjectState, env: Env);
30
- createSchedule(brainTitle: string, cronExpression: string, timezone?: string): Promise<Schedule>;
31
+ createSchedule(brainTitle: string, cronExpression: string, timezone: string | undefined, runAsUserId: string): Promise<Schedule>;
31
32
  getSchedule(scheduleId: string): Promise<Schedule | null>;
32
33
  deleteSchedule(scheduleId: string): Promise<boolean>;
33
- listSchedules(): Promise<{
34
+ /**
35
+ * List all schedules. Pass null for userId to skip ownership filter (root access).
36
+ */
37
+ listSchedules(userId?: string | null): Promise<{
34
38
  schedules: Schedule[];
35
39
  count: number;
36
40
  }>;
37
- getAllRuns(scheduleId?: string, limit?: number): Promise<{
41
+ /**
42
+ * Get all scheduled runs. Pass null for userId to skip ownership filter (root access).
43
+ * When userId is set, only returns runs for schedules owned by that user.
44
+ */
45
+ getAllRuns(scheduleId?: string, limit?: number, userId?: string | null): Promise<{
38
46
  runs: ScheduledRun[];
39
47
  count: number;
40
48
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"schedule-do.d.ts","sourceRoot":"","sources":["../../src/schedule-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,GAAG;IAClB,eAAe,EAAE,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,UAAW,SAAQ,aAAa,CAAC,GAAG,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;gBAEzB,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IA4CzC,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,QAAQ,GAAE,MAAc,GACvB,OAAO,CAAC,QAAQ,CAAC;IAmCd,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA0BzD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYpD,aAAa,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAmClE,UAAU,CACd,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC;QAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA4C7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA2Ed,eAAe;IAcvB,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C7D,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,oBAAoB;IAMtB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;CAG5C"}
1
+ {"version":3,"file":"schedule-do.d.ts","sourceRoot":"","sources":["../../src/schedule-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,GAAG;IAClB,eAAe,EAAE,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,UAAW,SAAQ,aAAa,CAAC,GAAG,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;gBAEzB,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG;IA8CzC,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,YAAQ,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,CAAC;IAqCd,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA2BzD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY1D;;OAEG;IACG,aAAa,CAAC,MAAM,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAuCpG;;;OAGG;IACG,UAAU,CACd,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,GAAE,MAAY,EACnB,MAAM,GAAE,MAAM,GAAG,IAAW,GAC3B,OAAO,CAAC;QAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAyD7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA4Ed,eAAe;IAcvB,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C7D,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,oBAAoB;IAMtB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;CAG5C"}
@@ -0,0 +1,9 @@
1
+ export declare function estimateTokens(text: string): number;
2
+ export declare function estimateRequestTokens({ prompt, messages, system, }: {
3
+ prompt?: string;
4
+ messages?: Array<{
5
+ content: string;
6
+ }>;
7
+ system?: string;
8
+ }): number;
9
+ //# sourceMappingURL=token-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../src/token-estimator.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,QAAQ,EACR,MAAM,GACP,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAkBT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@positronic/cloudflare",
3
- "version": "0.0.67",
3
+ "version": "0.0.69",
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.67",
35
- "@positronic/spec": "^0.0.67",
36
- "@positronic/template-new-project": "^0.0.67",
34
+ "@positronic/core": "^0.0.69",
35
+ "@positronic/spec": "^0.0.69",
36
+ "@positronic/template-new-project": "^0.0.69",
37
37
  "aws4fetch": "^1.0.18",
38
38
  "caz": "^2.0.0",
39
39
  "croner": "^10.0.1",
@@ -41,6 +41,7 @@
41
41
  "fuse.js": "^7.1.0",
42
42
  "hono": "^4.2.3",
43
43
  "jose": "^5.2.0",
44
+ "js-tiktoken": "^1.0.21",
44
45
  "uuid": "^9.0.1"
45
46
  },
46
47
  "devDependencies": {