@effect-agent/platform-cloudflare 0.1.0-beta.80 → 0.1.0-beta.81

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.
@@ -8,6 +8,7 @@ import { DurableAgentRuntime, DurableRuntimeConfig, RecoveryReport } from "@effe
8
8
  import { AdmissionPolicyError, LedgerError, OwnershipLost, SettlementConflict, SubmissionLedger, SubmissionSnapshot } from "@effect-agent/thread/SubmissionLedger";
9
9
  import { ThreadProjectionMaintenance } from "@effect-agent/thread/ThreadProjectionMaintenance";
10
10
  import { Context, Crypto, Effect, Layer, Option, Schema, Scope } from "effect";
11
+ import { SqlClient } from "effect/unstable/sql/SqlClient";
11
12
  import { DurableObject, DurableObjectState as DurableObjectState$1, WorkerEnvironment } from "effect-cf";
12
13
  import { DigestError } from "@effect-agent/thread/Digest";
13
14
  import { DurableRuntimeFailpoint, DurableRuntimeFailpointError, DurableRuntimeFailpointHandler } from "@effect-agent/thread/DurableFailpoint";
@@ -23,7 +24,6 @@ import { DoStorageFailpoint, DoStorageFailpointHandler } from "@effect-agent/sto
23
24
  import { DoStorageInitializationError } from "@effect-agent/storage-cloudflare/DoThreadStore";
24
25
  import { MessageDeliveryError, MessageDeliveryStore } from "@effect-agent/thread/MessageDelivery";
25
26
  import { ToolReconciler } from "@effect-agent/thread/ToolReconciler";
26
- import { SqlClient } from "effect/unstable/sql/SqlClient";
27
27
  //#region src/internal/progress-wait.d.ts
28
28
  declare const ProgressWaitRegistry_base: Context.ServiceClass<ProgressWaitRegistry, "@effect-agent/platform-cloudflare/ProgressWaitRegistry", {
29
29
  /** Register a Scope-owned cancellation signal, observing any early cancel tombstone. */
@@ -694,22 +694,10 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
694
694
  } | {
695
695
  readonly _tag: "AdminFailed";
696
696
  readonly failure: {
697
- readonly _tag: "DurableAlarmError";
698
- readonly operation: string;
699
- readonly message: string;
700
- readonly cause?: Schema.Json | undefined;
701
- } | {
702
- readonly _tag: "HostProtocolError";
703
- readonly message: string;
704
- } | {
705
697
  readonly _tag: "LedgerError";
706
698
  readonly operation: string;
707
699
  readonly message: string;
708
700
  readonly cause?: Schema.Json | undefined;
709
- } | {
710
- readonly _tag: "AdmissionPolicyError";
711
- readonly reason: "occupied" | "refused" | "unavailable";
712
- readonly code: string;
713
701
  } | {
714
702
  readonly _tag: "AppendConflict";
715
703
  readonly threadId: string;
@@ -717,13 +705,6 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
717
705
  readonly reason: "batch-digest" | "record-identity" | "tail";
718
706
  readonly actualTailSequence?: number | undefined;
719
707
  readonly actualTailDigest?: string | undefined;
720
- } | {
721
- readonly _tag: "DigestError";
722
- readonly message: string;
723
- readonly cause?: Schema.Json | undefined;
724
- } | {
725
- readonly _tag: "DurableRuntimeFailpointError";
726
- readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-start-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:before-prepared-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-subtree-append";
727
708
  } | {
728
709
  readonly _tag: "FenceRejected";
729
710
  readonly threadId: string;
@@ -743,6 +724,17 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
743
724
  readonly reason: string;
744
725
  readonly threadId?: string | undefined;
745
726
  readonly submissionId?: string | undefined;
727
+ } | {
728
+ readonly _tag: "AdmissionPolicyError";
729
+ readonly reason: "occupied" | "refused" | "unavailable";
730
+ readonly code: string;
731
+ } | {
732
+ readonly _tag: "DigestError";
733
+ readonly message: string;
734
+ readonly cause?: Schema.Json | undefined;
735
+ } | {
736
+ readonly _tag: "DurableRuntimeFailpointError";
737
+ readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-start-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:before-prepared-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-subtree-append";
746
738
  } | {
747
739
  readonly _tag: "SettlementConflict";
748
740
  readonly submissionId: string;
@@ -755,6 +747,14 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
755
747
  readonly _tag: "RunJournalError";
756
748
  readonly message: string;
757
749
  readonly cause?: Schema.Json | undefined;
750
+ } | {
751
+ readonly _tag: "DurableAlarmError";
752
+ readonly operation: string;
753
+ readonly message: string;
754
+ readonly cause?: Schema.Json | undefined;
755
+ } | {
756
+ readonly _tag: "HostProtocolError";
757
+ readonly message: string;
758
758
  } | {
759
759
  readonly _tag: "RetryRefused";
760
760
  readonly submissionId: string;
@@ -813,4 +813,4 @@ interface Class<EventServices = never> {
813
813
  declare const make: <ApplicationServices, ApplicationError, EventServices = never, EventLayerError = never>(applicationLayer: Layer.Layer<CloudflareDurableRuntimeServices | ApplicationServices, ApplicationError, CloudflareBootstrapServices | DurableObjectState$1.DurableObjectState | WorkerEnvironment | DurableObjectContext | ThreadObjectNamespace>, options: Options<ApplicationServices, EventServices, EventLayerError>) => Class<ApplicationServices | EventServices>;
814
814
  //#endregion
815
815
  export { ThreadPublicationOptions as A, portCall as C, CloudflareDurableRuntimeOptions as D, CloudflareDurableRuntimeInitializationError as E, layerConfig as M, layerHostConfig as N, CloudflareDurableRuntimeServices as O, layerInHost as P, make as S, CloudflareBootstrapServices as T, decodeAdminVerifyRequest as _, AdminVerifyRequest as a, encodeAdminResponse as b, Instance as c, RetryExecuted as d, ThreadObject_d_exports as f, decodeAdminResponse as g, decodeAdminExplainRequest as h, AdminResponse as i, layer as j, ThreadObjectPorts as k, ObligationsScanned as l, VerifiedIntegrity as m, AdminFailed as n, Class as o, ThreadRpcOperation as p, AdminFailure as r, ExplainedRecovery as s, AdminExplainRequest as t, Options as u, decodeObligationThresholds as v, submit as w, handleRpc as x, decodeRetryCommand as y };
816
- //# sourceMappingURL=ThreadObject-3uDpKfB3.d.mts.map
816
+ //# sourceMappingURL=ThreadObject-NbFOWK1I.d.mts.map
@@ -1,2 +1,2 @@
1
- import { A as ThreadPublicationOptions, C as portCall, D as CloudflareDurableRuntimeOptions, E as CloudflareDurableRuntimeInitializationError, M as layerConfig, N as layerHostConfig, O as CloudflareDurableRuntimeServices, P as layerInHost, S as make, T as CloudflareBootstrapServices, _ as decodeAdminVerifyRequest, a as AdminVerifyRequest, b as encodeAdminResponse, c as Instance, d as RetryExecuted, g as decodeAdminResponse, h as decodeAdminExplainRequest, i as AdminResponse, j as layer, k as ThreadObjectPorts, l as ObligationsScanned, m as VerifiedIntegrity, n as AdminFailed, o as Class, p as ThreadRpcOperation, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeObligationThresholds, w as submit, x as handleRpc, y as decodeRetryCommand } from "./ThreadObject-3uDpKfB3.mjs";
1
+ import { A as ThreadPublicationOptions, C as portCall, D as CloudflareDurableRuntimeOptions, E as CloudflareDurableRuntimeInitializationError, M as layerConfig, N as layerHostConfig, O as CloudflareDurableRuntimeServices, P as layerInHost, S as make, T as CloudflareBootstrapServices, _ as decodeAdminVerifyRequest, a as AdminVerifyRequest, b as encodeAdminResponse, c as Instance, d as RetryExecuted, g as decodeAdminResponse, h as decodeAdminExplainRequest, i as AdminResponse, j as layer, k as ThreadObjectPorts, l as ObligationsScanned, m as VerifiedIntegrity, n as AdminFailed, o as Class, p as ThreadRpcOperation, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeObligationThresholds, w as submit, x as handleRpc, y as decodeRetryCommand } from "./ThreadObject-NbFOWK1I.mjs";
2
2
  export { AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, type CloudflareBootstrapServices as BootstrapServices, Class, ExplainedRecovery, type CloudflareDurableRuntimeInitializationError as InitializationError, Instance, ObligationsScanned, Options, type ThreadPublicationOptions as PublicationOptions, RetryExecuted, type CloudflareDurableRuntimeOptions as RuntimeOptions, type CloudflareDurableRuntimeServices as Services, ThreadObjectPorts, ThreadRpcOperation, VerifiedIntegrity, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeObligationThresholds, decodeRetryCommand, encodeAdminResponse, handleRpc, layer, layerConfig, layerHostConfig, layerInHost, make, portCall, submit };
@@ -1,3 +1,3 @@
1
1
  import "./CloudflareThreadClient.mjs";
2
- import { C as layer, E as layerInHost, S as ThreadObjectPorts, T as layerHostConfig, _ as encodeAdminResponse, a as AdminVerifyRequest, b as portCall, c as RetryExecuted, d as VerifiedIntegrity, f as decodeAdminExplainRequest, g as decodeRetryCommand, h as decodeObligationThresholds, i as AdminResponse, m as decodeAdminVerifyRequest, n as AdminFailed, o as ExplainedRecovery, p as decodeAdminResponse, r as AdminFailure, s as ObligationsScanned, t as AdminExplainRequest, u as ThreadRpcOperation, v as handleRpc, w as layerConfig, x as submit, y as make } from "./ThreadObject-DGkXv41C.mjs";
2
+ import { C as layer, E as layerInHost, S as ThreadObjectPorts, T as layerHostConfig, _ as encodeAdminResponse, a as AdminVerifyRequest, b as portCall, c as RetryExecuted, d as VerifiedIntegrity, f as decodeAdminExplainRequest, g as decodeRetryCommand, h as decodeObligationThresholds, i as AdminResponse, m as decodeAdminVerifyRequest, n as AdminFailed, o as ExplainedRecovery, p as decodeAdminResponse, r as AdminFailure, s as ObligationsScanned, t as AdminExplainRequest, u as ThreadRpcOperation, v as handleRpc, w as layerConfig, x as submit, y as make } from "./ThreadObject-BpwkEc5E.mjs";
3
3
  export { AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, ExplainedRecovery, ObligationsScanned, RetryExecuted, ThreadObjectPorts, ThreadRpcOperation, VerifiedIntegrity, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeObligationThresholds, decodeRetryCommand, encodeAdminResponse, handleRpc, layer, layerConfig, layerHostConfig, layerInHost, make, portCall, submit };
package/dist/index.d.mts CHANGED
@@ -8,6 +8,6 @@ import { t as CloudflareMemory_d_exports } from "./CloudflareMemory.mjs";
8
8
  import { t as CloudflareScheduling_d_exports } from "./CloudflareScheduling.mjs";
9
9
  import { t as CloudflareSubscriptions_d_exports } from "./CloudflareSubscriptions.mjs";
10
10
  import { t as CloudflareThreadClient_d_exports } from "./CloudflareThreadClient.mjs";
11
- import { f as ThreadObject_d_exports } from "./ThreadObject-3uDpKfB3.mjs";
11
+ import { f as ThreadObject_d_exports } from "./ThreadObject-NbFOWK1I.mjs";
12
12
  import { t as WakeScheduler_d_exports } from "./WakeScheduler.mjs";
13
13
  export { Alarm_d_exports as Alarm, CloudflareAiGateway_d_exports as CloudflareAiGateway, CloudflareBindings_d_exports as CloudflareBindings, CloudflareBrowser_d_exports as CloudflareBrowser, CloudflareCodeMode_d_exports as CloudflareCodeMode, CloudflareConfig_d_exports as CloudflareConfig, CloudflareMemory_d_exports as CloudflareMemory, CloudflareScheduling_d_exports as CloudflareScheduling, CloudflareSubscriptions_d_exports as CloudflareSubscriptions, CloudflareThreadClient_d_exports as CloudflareThreadClient, ThreadObject_d_exports as ThreadObject, WakeScheduler_d_exports as WakeScheduler };
package/dist/index.mjs CHANGED
@@ -8,6 +8,6 @@ import { t as CloudflareThreadClient_exports } from "./CloudflareThreadClient.mj
8
8
  import { t as CloudflareScheduling_exports } from "./CloudflareScheduling.mjs";
9
9
  import { t as CloudflareSubscriptions_exports } from "./CloudflareSubscriptions.mjs";
10
10
  import { t as WakeScheduler_exports } from "./WakeScheduler.mjs";
11
- import { l as ThreadObject_exports } from "./ThreadObject-DGkXv41C.mjs";
11
+ import { l as ThreadObject_exports } from "./ThreadObject-BpwkEc5E.mjs";
12
12
  import { t as CloudflareAiGateway_exports } from "./CloudflareAiGateway.mjs";
13
13
  export { Alarm_exports as Alarm, CloudflareAiGateway_exports as CloudflareAiGateway, CloudflareBindings_exports as CloudflareBindings, CloudflareBrowser_exports as CloudflareBrowser, CloudflareCodeMode_exports as CloudflareCodeMode, CloudflareConfig_exports as CloudflareConfig, CloudflareMemory_exports as CloudflareMemory, CloudflareScheduling_exports as CloudflareScheduling, CloudflareSubscriptions_exports as CloudflareSubscriptions, CloudflareThreadClient_exports as CloudflareThreadClient, ThreadObject_exports as ThreadObject, WakeScheduler_exports as WakeScheduler };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.80","dependencies":{"@effect-agent/core":"0.1.0-beta.80","@effect-agent/engine":"0.1.0-beta.80","@effect-agent/sandbox":"0.1.0-beta.80","@effect-agent/storage-cloudflare":"0.1.0-beta.80","@effect-agent/thread":"0.1.0-beta.80","@effect/platform-browser":"4.0.0-rc.112","@effect/sql-sqlite-do":"4.0.0-rc.112"},"devDependencies":{"@cloudflare/puppeteer":"1.1.0","@cloudflare/vitest-pool-workers":"0.21.3","@cloudflare/workers-types":"5.20260825.1","@effect-agent/capabilities":"0.1.0-beta.80","@effect-agent/testing":"0.1.0-beta.80","@effect/platform-node":"4.0.0-rc.112","@effect/sql-d1":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","effect":"4.0.0-rc.112","effect-cf":"0.40.0","esbuild":"0.28.1","miniflare":"5.20260811.1-alpha","typescript":"7.0.2","vite-plus":"0.3.0","vitest":"4.1.11"},"peerDependencies":{"@cloudflare/puppeteer":"^1.1.0","effect":"^4.0.0-rc.112","effect-cf":"^0.40.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./Alarm":{"types":"./dist/Alarm.d.mts","default":"./dist/Alarm.mjs"},"./BrowserRestCapture":{"types":"./dist/BrowserRestCapture.d.mts","default":"./dist/BrowserRestCapture.mjs"},"./BrowserRestCrawl":{"types":"./dist/BrowserRestCrawl.d.mts","default":"./dist/BrowserRestCrawl.mjs"},"./CloudflareBindings":{"types":"./dist/CloudflareBindings.d.mts","default":"./dist/CloudflareBindings.mjs"},"./CloudflareBrowser":{"types":"./dist/CloudflareBrowser.d.mts","default":"./dist/CloudflareBrowser.mjs"},"./CloudflareCodeMode":{"types":"./dist/CloudflareCodeMode.d.mts","default":"./dist/CloudflareCodeMode.mjs"},"./CloudflareConfig":{"types":"./dist/CloudflareConfig.d.mts","default":"./dist/CloudflareConfig.mjs"},"./CloudflareMemory":{"types":"./dist/CloudflareMemory.d.mts","default":"./dist/CloudflareMemory.mjs"},"./CloudflareScheduling":{"types":"./dist/CloudflareScheduling.d.mts","default":"./dist/CloudflareScheduling.mjs"},"./CloudflareSubscriptions":{"types":"./dist/CloudflareSubscriptions.d.mts","default":"./dist/CloudflareSubscriptions.mjs"},"./CloudflareThreadClient":{"types":"./dist/CloudflareThreadClient.d.mts","default":"./dist/CloudflareThreadClient.mjs"},"./InteractiveBrowser":{"types":"./dist/InteractiveBrowser.d.mts","default":"./dist/InteractiveBrowser.mjs"},"./ProtectedBrowser":{"types":"./dist/ProtectedBrowser.d.mts","default":"./dist/ProtectedBrowser.mjs"},"./ThreadObject":{"types":"./dist/ThreadObject.d.mts","default":"./dist/ThreadObject.mjs"},"./WakeScheduler":{"types":"./dist/WakeScheduler.d.mts","default":"./dist/WakeScheduler.mjs"},"./CloudflareAiGateway":{"types":"./dist/CloudflareAiGateway.d.mts","default":"./dist/CloudflareAiGateway.mjs"}},"description":"Cloudflare Layer assembly for Effect Agent: Durable Objects and Browser Run adapters.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-cloudflare"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"},"peerDependenciesMeta":{"@cloudflare/puppeteer":{"optional":true}}}
1
+ {"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.81","dependencies":{"@effect-agent/core":"0.1.0-beta.81","@effect-agent/engine":"0.1.0-beta.81","@effect-agent/sandbox":"0.1.0-beta.81","@effect-agent/storage-cloudflare":"0.1.0-beta.81","@effect-agent/thread":"0.1.0-beta.81","@effect/platform-browser":"4.0.0-rc.112","@effect/sql-sqlite-do":"4.0.0-rc.112"},"devDependencies":{"@cloudflare/puppeteer":"1.1.0","@cloudflare/vitest-pool-workers":"0.21.3","@cloudflare/workers-types":"5.20260825.1","@effect-agent/capabilities":"0.1.0-beta.81","@effect-agent/testing":"0.1.0-beta.81","@effect/platform-node":"4.0.0-rc.112","@effect/sql-d1":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","effect":"4.0.0-rc.112","effect-cf":"0.40.0","esbuild":"0.28.1","miniflare":"5.20260811.1-alpha","typescript":"7.0.2","vite-plus":"0.3.0","vitest":"4.1.11"},"peerDependencies":{"@cloudflare/puppeteer":"^1.1.0","effect":"^4.0.0-rc.112","effect-cf":"^0.40.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./Alarm":{"types":"./dist/Alarm.d.mts","default":"./dist/Alarm.mjs"},"./BrowserRestCapture":{"types":"./dist/BrowserRestCapture.d.mts","default":"./dist/BrowserRestCapture.mjs"},"./BrowserRestCrawl":{"types":"./dist/BrowserRestCrawl.d.mts","default":"./dist/BrowserRestCrawl.mjs"},"./CloudflareBindings":{"types":"./dist/CloudflareBindings.d.mts","default":"./dist/CloudflareBindings.mjs"},"./CloudflareBrowser":{"types":"./dist/CloudflareBrowser.d.mts","default":"./dist/CloudflareBrowser.mjs"},"./CloudflareCodeMode":{"types":"./dist/CloudflareCodeMode.d.mts","default":"./dist/CloudflareCodeMode.mjs"},"./CloudflareConfig":{"types":"./dist/CloudflareConfig.d.mts","default":"./dist/CloudflareConfig.mjs"},"./CloudflareMemory":{"types":"./dist/CloudflareMemory.d.mts","default":"./dist/CloudflareMemory.mjs"},"./CloudflareScheduling":{"types":"./dist/CloudflareScheduling.d.mts","default":"./dist/CloudflareScheduling.mjs"},"./CloudflareSubscriptions":{"types":"./dist/CloudflareSubscriptions.d.mts","default":"./dist/CloudflareSubscriptions.mjs"},"./CloudflareThreadClient":{"types":"./dist/CloudflareThreadClient.d.mts","default":"./dist/CloudflareThreadClient.mjs"},"./InteractiveBrowser":{"types":"./dist/InteractiveBrowser.d.mts","default":"./dist/InteractiveBrowser.mjs"},"./ProtectedBrowser":{"types":"./dist/ProtectedBrowser.d.mts","default":"./dist/ProtectedBrowser.mjs"},"./ThreadObject":{"types":"./dist/ThreadObject.d.mts","default":"./dist/ThreadObject.mjs"},"./WakeScheduler":{"types":"./dist/WakeScheduler.d.mts","default":"./dist/WakeScheduler.mjs"},"./CloudflareAiGateway":{"types":"./dist/CloudflareAiGateway.d.mts","default":"./dist/CloudflareAiGateway.mjs"}},"description":"Cloudflare Layer assembly for Effect Agent: Durable Objects and Browser Run adapters.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-cloudflare"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"},"peerDependenciesMeta":{"@cloudflare/puppeteer":{"optional":true}}}
package/src/Alarm.ts CHANGED
@@ -28,6 +28,7 @@ import {
28
28
  Semaphore,
29
29
  Stream,
30
30
  } from "effect";
31
+ import { SqlClient } from "effect/unstable/sql/SqlClient";
31
32
 
32
33
  import { DurableObjectContext } from "./CloudflareBindings.ts";
33
34
  import { CloudflareDurableRuntimeConfig } from "./CloudflareConfig.ts";
@@ -64,6 +65,25 @@ const alarmFailure =
64
65
  cause,
65
66
  });
66
67
 
68
+ // SQL and raw KV/alarm operations share one physical SQLite transaction. Reserve its
69
+ // connection for each short storage operation, never around a mutation or snapshot body.
70
+ const makeStorageOperation = Effect.map(
71
+ SqlClient,
72
+ (sql) =>
73
+ <A>(operation: string, execute: () => Promise<A>) =>
74
+ Effect.flatMap(Effect.serviceOption(sql.transactionService), (current) => {
75
+ const body = Effect.uninterruptible(
76
+ Effect.tryPromise({ try: execute, catch: alarmFailure(operation) }),
77
+ );
78
+
79
+ return current._tag === "Some"
80
+ ? body
81
+ : Effect.scoped(
82
+ Effect.andThen(sql.reserve.pipe(Effect.mapError(alarmFailure(operation))), body),
83
+ );
84
+ }),
85
+ );
86
+
67
87
  /** `ctx.storage` alarm slot as an Effect service; storage is truth, never a memory field. */
68
88
  export class DurableAlarmService extends Context.Service<
69
89
  DurableAlarmService,
@@ -97,7 +117,7 @@ export class DurableAlarmService extends Context.Service<
97
117
  readonly cancel: Effect.Effect<void, DurableAlarmError>;
98
118
  }
99
119
  >()("@effect-agent/platform-cloudflare/DurableAlarmService") {
100
- static readonly layer: Layer.Layer<DurableAlarmService, never, DurableObjectContext> =
120
+ static readonly layer: Layer.Layer<DurableAlarmService, never, DurableObjectContext | SqlClient> =
101
121
  Layer.effect(DurableAlarmService)(
102
122
  Effect.gen(function* () {
103
123
  const { ctx } = yield* DurableObjectContext;
@@ -108,28 +128,26 @@ export class DurableAlarmService extends Context.Service<
108
128
  */
109
129
  const runningPasses = yield* Ref.make(0);
110
130
 
111
- const scheduled = Effect.tryPromise({
112
- try: () => ctx.storage.getAlarm(),
113
- catch: alarmFailure("get alarm"),
114
- }).pipe(
131
+ const storageOperation = yield* makeStorageOperation;
132
+
133
+ const scheduled = storageOperation("get alarm", () => ctx.storage.getAlarm()).pipe(
115
134
  Effect.map((deadline) =>
116
135
  deadline === null ? Option.none<number>() : Option.some(deadline),
117
136
  ),
118
137
  );
119
138
 
120
139
  const scheduleAt = (epochMillis: number) =>
121
- Effect.tryPromise({
122
- try: () => ctx.storage.setAlarm(epochMillis),
123
- catch: alarmFailure("set alarm"),
124
- });
140
+ storageOperation("set alarm", () => ctx.storage.setAlarm(epochMillis));
125
141
 
126
142
  const ensureScheduledBy = (epochMillis: number) =>
127
- scheduled.pipe(
128
- Effect.flatMap((existing) =>
129
- Option.isSome(existing) && existing.value <= epochMillis
130
- ? Effect.void
131
- : scheduleAt(epochMillis),
132
- ),
143
+ storageOperation("ensure alarm", () =>
144
+ ctx.storage.transaction(async (transaction) => {
145
+ const existing = await transaction.getAlarm();
146
+
147
+ if (existing === null || existing > epochMillis) {
148
+ await transaction.setAlarm(epochMillis);
149
+ }
150
+ }),
133
151
  );
134
152
 
135
153
  const armNow = Clock.currentTimeMillis.pipe(
@@ -146,10 +164,7 @@ export class DurableAlarmService extends Context.Service<
146
164
  Effect.ensuring(Ref.update(runningPasses, (passes) => passes - 1)),
147
165
  );
148
166
 
149
- const cancel = Effect.tryPromise({
150
- try: () => ctx.storage.deleteAlarm(),
151
- catch: alarmFailure("delete alarm"),
152
- });
167
+ const cancel = storageOperation("delete alarm", () => ctx.storage.deleteAlarm());
153
168
 
154
169
  return DurableAlarmService.of({
155
170
  scheduled,
@@ -404,8 +419,7 @@ export class ThreadMutationGate extends Context.Service<
404
419
  const generationGate = yield* Semaphore.make(1);
405
420
  const minimumAlarmDelay = Math.max(1, Math.ceil(config.alarmBackoffBase / 2));
406
421
 
407
- const runTransaction = <A>(operation: string, transaction: () => Promise<A>) =>
408
- Effect.tryPromise({ try: transaction, catch: alarmFailure(operation) });
422
+ const runTransaction = yield* makeStorageOperation;
409
423
 
410
424
  const beginMutation = Effect.fn("ThreadMaintenance.beginMutation")(function* () {
411
425
  yield* failpoint.hit("maintenance:dirty:before");
@@ -508,6 +522,7 @@ export class ThreadMaintenance extends Context.Service<
508
522
  | ThreadMaintenanceFailpoint
509
523
  | CloudflareDurableRuntimeConfig
510
524
  | DurableObjectContext
525
+ | SqlClient
511
526
  > = Layer.effect(ThreadMaintenance)(
512
527
  Effect.gen(function* () {
513
528
  const runtime = yield* DurableAgentRuntime;
@@ -549,8 +564,7 @@ export class ThreadMaintenance extends Context.Service<
549
564
  const maintenancePassGate = yield* Semaphore.make(1);
550
565
  const minimumAlarmDelay = Math.max(1, Math.ceil(config.alarmBackoffBase / 2));
551
566
 
552
- const runTransaction = <A>(operation: string, transaction: () => Promise<A>) =>
553
- Effect.tryPromise({ try: transaction, catch: alarmFailure(operation) });
567
+ const runTransaction = yield* makeStorageOperation;
554
568
 
555
569
  const ensureAlarm = Effect.fn("ThreadMaintenance.ensureAlarm")(function* () {
556
570
  yield* failpoint.hit("maintenance:ensure:before");