@yielded/agent-platform-cloudflare 0.1.0-beta.172 → 0.1.0-beta.174

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 (70) hide show
  1. package/dist/{Alarm-BMEAZo3p.mjs → Alarm-4J9B8Fg8.mjs} +54 -32
  2. package/dist/Alarm-4J9B8Fg8.mjs.map +1 -0
  3. package/dist/Alarm.mjs +1 -1
  4. package/dist/BrowserRestCapture.mjs.map +1 -1
  5. package/dist/BrowserRestCrawl.mjs.map +1 -1
  6. package/dist/{BrowserSession-Bx0V1-6_.d.mts → BrowserSession-Cojp7nth.d.mts} +3 -2
  7. package/dist/{BrowserSession-BfNmyayH.mjs → BrowserSession-aovMjfL4.mjs} +14 -14
  8. package/dist/BrowserSession-aovMjfL4.mjs.map +1 -0
  9. package/dist/BrowserSession.d.mts +1 -1
  10. package/dist/BrowserSession.mjs +2 -2
  11. package/dist/BrowserUse.d.mts +40 -64
  12. package/dist/BrowserUse.mjs +223 -2
  13. package/dist/BrowserUse.mjs.map +1 -0
  14. package/dist/CloudflareBrowser-Vt8qTdYW.mjs.map +1 -1
  15. package/dist/CloudflareCodeMode.mjs.map +1 -1
  16. package/dist/CloudflareScheduling.mjs +9 -9
  17. package/dist/CloudflareScheduling.mjs.map +1 -1
  18. package/dist/CloudflareSubscriptions.mjs +15 -15
  19. package/dist/CloudflareSubscriptions.mjs.map +1 -1
  20. package/dist/{CloudflareThreadClient-DgZVrZzF.mjs → CloudflareThreadClient-DU548EEj.mjs} +42 -39
  21. package/dist/CloudflareThreadClient-DU548EEj.mjs.map +1 -0
  22. package/dist/{CloudflareThreadClient-DuRG0MLd.d.mts → CloudflareThreadClient-lTm6baDP.d.mts} +353 -353
  23. package/dist/CloudflareThreadClient.d.mts +1 -1
  24. package/dist/CloudflareThreadClient.mjs +1 -1
  25. package/dist/{InteractiveBrowser-LdKzQeLR.mjs → InteractiveBrowser-BHNlwjZL.mjs} +40 -31
  26. package/dist/InteractiveBrowser-BHNlwjZL.mjs.map +1 -0
  27. package/dist/InteractiveBrowser.mjs +1 -1
  28. package/dist/{ThreadObject-CugPnWsJ.d.mts → ThreadObject-BLYgzcdT.d.mts} +6 -6
  29. package/dist/{ThreadObject-CGIaz6Jv.mjs → ThreadObject-C2LF3btz.mjs} +13 -14
  30. package/dist/ThreadObject-C2LF3btz.mjs.map +1 -0
  31. package/dist/ThreadObject.d.mts +1 -1
  32. package/dist/ThreadObject.mjs +1 -1
  33. package/dist/WakeScheduler.d.mts +1 -1
  34. package/dist/WakeScheduler.mjs +8 -3
  35. package/dist/WakeScheduler.mjs.map +1 -1
  36. package/dist/index.d.mts +3 -3
  37. package/dist/index.mjs +5 -5
  38. package/dist/{prepared-admission-CSdzFM_v.mjs → prepared-admission-BoUPHSNQ.mjs} +2 -2
  39. package/dist/{prepared-admission-CSdzFM_v.mjs.map → prepared-admission-BoUPHSNQ.mjs.map} +1 -1
  40. package/package.json +1 -1
  41. package/src/Alarm.ts +82 -39
  42. package/src/BrowserRestCapture.ts +1 -0
  43. package/src/BrowserRestCrawl.ts +1 -0
  44. package/src/BrowserSession.ts +3 -2
  45. package/src/BrowserUse.ts +287 -1504
  46. package/src/CloudflareCodeMode.ts +6 -0
  47. package/src/CloudflareScheduling.ts +103 -103
  48. package/src/CloudflareSubscriptions.ts +192 -199
  49. package/src/CloudflareThreadClient.ts +256 -268
  50. package/src/InteractiveBrowser.ts +43 -17
  51. package/src/ThreadObject.ts +35 -24
  52. package/src/WakeScheduler.ts +12 -9
  53. package/src/internal/browser-binding.ts +8 -0
  54. package/src/internal/browser-credentials.ts +18 -13
  55. package/src/internal/browser-file-selection.ts +13 -2
  56. package/src/internal/browser-quick-action.ts +1 -0
  57. package/src/internal/browser-session-lifecycle.ts +32 -36
  58. package/src/internal/due-queue.ts +38 -19
  59. package/src/internal/layers.ts +53 -53
  60. package/dist/Alarm-BMEAZo3p.mjs.map +0 -1
  61. package/dist/BrowserSession-BfNmyayH.mjs.map +0 -1
  62. package/dist/BrowserUse-Bc2JdLW2.mjs +0 -1528
  63. package/dist/BrowserUse-Bc2JdLW2.mjs.map +0 -1
  64. package/dist/CloudflareThreadClient-DgZVrZzF.mjs.map +0 -1
  65. package/dist/InteractiveBrowser-LdKzQeLR.mjs.map +0 -1
  66. package/dist/ThreadObject-CGIaz6Jv.mjs.map +0 -1
  67. package/dist/page-function-CmUCcyNP.mjs +0 -11
  68. package/dist/page-function-CmUCcyNP.mjs.map +0 -1
  69. package/src/internal/browser-dom.ts +0 -886
  70. package/src/internal/browser-jev-dom.ts +0 -362
@@ -1 +1 @@
1
- {"version":3,"file":"CloudflareSubscriptions.mjs","names":["EffectCfDurableObjectState","EffectCfDurableObject"],"sources":["../src/CloudflareSubscriptions.ts"],"sourcesContent":["import { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport {\n DoSubscriptionAlarmControl,\n DoSubscriptionTransaction,\n doSubscriptionStoreLayer,\n} from \"@yielded/agent-storage-cloudflare/do-subscription-store\";\nimport { type EventSources } from \"@yielded/agent/event-source\";\nimport { PersistedJson } from \"@yielded/agent/records\";\nimport { Principal } from \"@yielded/agent/submission-ledger\";\nimport {\n EventAcknowledgement,\n EventSourceVersion,\n SourcePartition,\n type SubscriptionAuthorizer,\n SubscriptionConfiguration,\n SubscriptionDeliverySnapshot,\n SubscriptionDeliveryKey,\n SubscriptionError,\n SubscriptionFailpointError,\n SubscriptionKey,\n SubscriptionScope,\n type SubscriptionLimits,\n SubscriptionSnapshot,\n SubscriptionSourceError,\n defaultSubscriptionLimits,\n} from \"@yielded/agent/subscription\";\nimport { type SubscriptionInputBindings } from \"@yielded/agent/subscription-input\";\nimport {\n SubscriptionDriver,\n SubscriptionIntake,\n Subscriptions,\n} from \"@yielded/agent/subscriptions\";\nimport { Cause, Clock, Context, DateTime, Effect, Layer, Schema, type Scope } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectAlarm,\n DurableObjectState as EffectCfDurableObjectState,\n type WorkerEnvironment,\n} from \"effect-cf\";\n\nimport { type ThreadObjectNamespace } from \"./CloudflareBindings.ts\";\nimport { CloudflareThreadClient } from \"./CloudflareThreadClient.ts\";\nimport { cloudflareCryptoLayer } from \"./internal/crypto.ts\";\nimport { cloudflarePreparedInputAdmissionLayer } from \"./internal/prepared-admission.ts\";\n\nconst SUBSCRIPTION_ALARM_TAG = \"effect-agent/SubscriptionPartitionWake\";\nconst SUBSCRIPTION_ALARM_ID = \"driver\";\nconst MAX_ALARM_WALL_MILLIS = 12 * 60_000;\nconst MAX_ALARMS_PER_INVOCATION = 16;\nconst MAX_ANCILLARY_ALARM_MILLIS = 30_000;\n\nconst SubscriptionAlarmPayload = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n generation: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nexport class SubscriptionAlarmProtocolError extends Schema.TaggedError<SubscriptionAlarmProtocolError>()(\n \"SubscriptionAlarmProtocolError\",\n { message: Schema.String },\n) {}\n\n/** Bounded host diagnostic; credentials and provider responses do not belong in alarm failures. */\nexport class SubscriptionAlarmExtensionError extends Schema.TaggedError<SubscriptionAlarmExtensionError>()(\n \"SubscriptionAlarmExtensionError\",\n { code: Schema.NonEmptyString.check(Schema.isMaxLength(128)) },\n) {}\n\n/** Native partition services supplied at alarm invocation, after the host Layer is built. */\nexport type SubscriptionPartitionAlarmServices =\n | Subscriptions\n | SubscriptionIntake\n | SubscriptionDriver;\n\nexport interface SubscriptionPartitionAlarmHandler<R = SubscriptionPartitionAlarmServices> {\n readonly tag: string;\n readonly handle: (\n event: DurableObjectAlarm.DurableObjectAlarmEvent,\n ) => Effect.Effect<void, SubscriptionAlarmProtocolError | SubscriptionAlarmExtensionError, R>;\n}\n\n/** Host-only handlers; the framework reserves its namespace and rejects every unknown tag. */\nexport const SubscriptionPartitionAlarmExtension = Context.Reference<{\n readonly handlers: ReadonlyArray<SubscriptionPartitionAlarmHandler>;\n}>(\"@effect-agent/platform-cloudflare/SubscriptionPartitionAlarmExtension\", {\n defaultValue: () => ({ handlers: [] }),\n});\n\n/** Capture host services once, deferring native partition services to invocation.\n * Each invocation owns its codec/handler Scope and timeout.\n * Callback failures stay typed. Defects and interruption reach the native alarm multiplexer.\n * The host owns durable idempotency, prearming and external-effect uncertainty.\n */\nexport const makeSubscriptionPartitionAlarmHandler = Effect.fnUntraced(function* <\n Payload extends Schema.Top,\n R,\n>(options: {\n readonly tag: string;\n readonly payload: Payload;\n readonly timeoutMillis: number;\n readonly handle: (\n event: Omit<DurableObjectAlarm.DurableObjectAlarmEvent, \"payload\"> & {\n readonly payload: Payload[\"Type\"];\n },\n ) => Effect.Effect<void, SubscriptionAlarmExtensionError, R>;\n}): Effect.fn.Return<\n SubscriptionPartitionAlarmHandler<\n Exclude<\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope>,\n Exclude<\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope | SubscriptionPartitionAlarmServices>,\n SubscriptionPartitionAlarmServices\n >\n >\n >,\n SubscriptionAlarmProtocolError,\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope | SubscriptionPartitionAlarmServices>\n> {\n if (\n options.tag.length === 0 ||\n options.tag.length > 128 ||\n options.tag.startsWith(\"effect-agent/\") ||\n !Number.isSafeInteger(options.timeoutMillis) ||\n options.timeoutMillis < 1 ||\n options.timeoutMillis > MAX_ANCILLARY_ALARM_MILLIS\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Invalid ancillary alarm tag or timeout\",\n });\n\n // Context capture includes unrequested services too; never retain a host override of native work.\n const services = (yield* Effect.context<\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope | SubscriptionPartitionAlarmServices>\n >()).pipe(Context.omit(Subscriptions, SubscriptionIntake, SubscriptionDriver));\n\n return {\n tag: options.tag,\n handle: (event) =>\n Effect.gen(function* () {\n if (event.tag !== options.tag)\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Ancillary alarm tag mismatch\",\n });\n\n const payload = yield* Schema.decodeEffect(options.payload)(event.payload).pipe(\n Effect.mapError(() =>\n SubscriptionAlarmProtocolError.make({ message: \"Invalid ancillary alarm payload\" }),\n ),\n );\n\n yield* options.handle({ ...event, payload });\n }).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: options.timeoutMillis,\n orElse: () => SubscriptionAlarmExtensionError.make({ code: \"timeout\" }),\n }),\n Effect.provideContext(services),\n ),\n };\n});\n\nexport class SubscriptionPartitionProtocolError extends Schema.TaggedError<SubscriptionPartitionProtocolError>()(\n \"SubscriptionPartitionProtocolError\",\n { message: Schema.String.check(Schema.isMaxLength(4_096)) },\n) {}\n\nexport class CloudflareSubscriptionConfigError extends Schema.TaggedError<CloudflareSubscriptionConfigError>()(\n \"CloudflareSubscriptionConfigError\",\n { message: Schema.String },\n) {}\n\n/** Reject limits whose four bounded phases could exceed the safe Durable Object alarm budget. */\nexport const validateCloudflareSubscriptionLimits = (\n limits: SubscriptionLimits,\n options: { readonly ancillaryAlarms?: boolean } = {},\n): Effect.Effect<void, CloudflareSubscriptionConfigError> => {\n const worstCaseMillis =\n 4 * Math.ceil(limits.batchSize / limits.concurrency) * limits.operationTimeoutMillis +\n (options.ancillaryAlarms === true ? MAX_ALARMS_PER_INVOCATION * MAX_ANCILLARY_ALARM_MILLIS : 0);\n\n return worstCaseMillis <= MAX_ALARM_WALL_MILLIS\n ? Effect.void\n : Effect.fail(\n CloudflareSubscriptionConfigError.make({\n message: \"Subscription limits can exceed the bounded Durable Object alarm wall budget\",\n }),\n );\n};\n\nconst protocolMessage = (message: string): string =>\n message.length <= 4_096 ? message : `${message.slice(0, 4_093)}...`;\n\nconst SubscribeRequest = Schema.TaggedStruct(\"Subscribe\", {\n schemaVersion: Schema.Literal(1),\n scope: Schema.Struct({\n ...SubscriptionScope.fields,\n }),\n options: Schema.Struct({\n subscriptionId: SubscriptionKey.fields.subscriptionId,\n source: EventSourceVersion,\n parameters: PersistedJson,\n context: PersistedJson,\n mode: Schema.Literals([\"once\", \"continuous\"]),\n expiresAtMillis: Schema.NullOr(Schema.Number),\n destination: SubscriptionConfiguration.fields.destination,\n deliveryPrincipal: SubscriptionConfiguration.fields.deliveryPrincipal,\n admissionGroup: SubscriptionConfiguration.fields.admissionGroup,\n admissionFence: SubscriptionConfiguration.fields.admissionFence,\n agentId: SubscriptionConfiguration.fields.agentId,\n definitions: SubscriptionConfiguration.fields.definitions,\n }),\n});\n\nconst UpdateSubscriptionRequest = Schema.TaggedStruct(\"UpdateSubscription\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n options: SubscribeRequest.fields.options.mapFields(({ subscriptionId: _, ...fields }) => fields),\n});\n\nconst SubscriptionStateRequest = Schema.Struct({\n _tag: Schema.Literals([\"PauseSubscription\", \"ResumeSubscription\", \"RecoverSubscription\"]),\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nconst ListSubscriptionsRequest = Schema.TaggedStruct(\"ListSubscriptions\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n after: Schema.optionalKey(Schema.Natural),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n});\n\nconst CancelSubscriptionRequest = Schema.TaggedStruct(\"CancelSubscription\", {\n expectedRevision: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n});\n\nconst GetSubscriptionRequest = Schema.TaggedStruct(\"GetSubscription\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscriptionScope,\n key: SubscriptionKey,\n});\n\nconst RecoverDeliveryRequest = Schema.TaggedStruct(\"RecoverDelivery\", {\n expectedGeneration: Schema.Natural,\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionDeliveryKey,\n});\n\nconst ListDeliveriesRequest = Schema.TaggedStruct(\"ListDeliveries\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n after: Schema.optionalKey(Schema.String),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n});\n\nconst AcceptRequest = Schema.TaggedStruct(\"Accept\", {\n schemaVersion: Schema.Literal(1),\n partition: SourcePartition,\n principal: Principal,\n source: EventSourceVersion,\n payload: PersistedJson,\n});\n\nconst StatusRequest = Schema.TaggedStruct(\"Status\", {\n schemaVersion: Schema.Literal(1),\n partition: SourcePartition,\n principal: Principal,\n source: EventSourceVersion,\n eventId: Schema.String,\n});\n\nconst SubscriptionPartitionRequest = Schema.Union([\n SubscribeRequest,\n GetSubscriptionRequest,\n UpdateSubscriptionRequest,\n SubscriptionStateRequest,\n ListSubscriptionsRequest,\n CancelSubscriptionRequest,\n ListDeliveriesRequest,\n RecoverDeliveryRequest,\n AcceptRequest,\n StatusRequest,\n]);\n\ntype SubscriptionPartitionRequest = typeof SubscriptionPartitionRequest.Type;\n\nconst SubscriptionPage = Schema.Struct({\n items: Schema.Array(SubscriptionSnapshot),\n next: Schema.NullOr(Schema.Natural),\n});\n\nconst DeliveryPage = Schema.Struct({\n items: Schema.Array(SubscriptionDeliverySnapshot),\n next: Schema.NullOr(Schema.String),\n});\n\nconst IntakeStatus = Schema.Struct({\n ...EventAcknowledgement.fields,\n routingComplete: Schema.Boolean,\n routingFailure: Schema.NullOr(Schema.String),\n nextAttemptAtMillis: Schema.Number,\n});\n\nconst SubscriptionPartitionFailure = Schema.Union([\n SubscriptionError,\n SubscriptionSourceError,\n SubscriptionFailpointError,\n SubscriptionPartitionProtocolError,\n]);\n\ntype SubscriptionPartitionFailure = typeof SubscriptionPartitionFailure.Type;\n\nconst SubscriptionPartitionResponse = Schema.Union([\n Schema.TaggedStruct(\"Snapshot\", { value: SubscriptionSnapshot }),\n Schema.TaggedStruct(\"SubscriptionPage\", { value: SubscriptionPage }),\n Schema.TaggedStruct(\"DeliveryPage\", { value: DeliveryPage }),\n Schema.TaggedStruct(\"DeliverySnapshot\", { value: SubscriptionDeliverySnapshot }),\n Schema.TaggedStruct(\"Acknowledgement\", { value: EventAcknowledgement }),\n Schema.TaggedStruct(\"Status\", { value: IntakeStatus }),\n Schema.TaggedStruct(\"Failed\", { failure: SubscriptionPartitionFailure }),\n]);\n\ntype SubscriptionPartitionResponse = typeof SubscriptionPartitionResponse.Type;\n\nconst decodeRequest = Schema.decodeUnknownEffect(SubscriptionPartitionRequest);\nconst encodeRequest = Schema.encodeEffect(SubscriptionPartitionRequest);\nconst decodeResponse = Schema.decodeUnknownEffect(SubscriptionPartitionResponse);\nconst encodeResponse = Schema.encodeEffect(SubscriptionPartitionResponse);\n\nconst protocolFailure = (message: string): SubscriptionPartitionResponse => ({\n _tag: \"Failed\",\n failure: SubscriptionPartitionProtocolError.make({ message: protocolMessage(message) }),\n});\n\nexport const sourcePartitionName = (partition: SourcePartition): string =>\n JSON.stringify([partition.tenantId, partition.address]);\n\nexport interface SubscriptionPartitionObjectRpc extends Rpc.DurableObjectBranded {\n subscription(encoded: unknown): Promise<unknown>;\n}\n\nexport class SubscriptionPartitionNamespace extends Context.Service<\n SubscriptionPartitionNamespace,\n { readonly namespace: DurableObjectNamespace<SubscriptionPartitionObjectRpc> }\n>()(\"@effect-agent/platform-cloudflare/SubscriptionPartitionNamespace\") {}\n\nconst storageFailure = (code: string): SubscriptionError =>\n SubscriptionError.make({ reason: \"storage\", code });\n\nconst corruptFailure = (code: string): SubscriptionError =>\n SubscriptionError.make({ reason: \"corrupt\", code });\n\n/** Worker-side management and trusted intake, routed to one fresh partition stub per call. */\nexport class CloudflareSubscriptionsClient {\n static layer(\n partition: SourcePartition,\n ): Layer.Layer<Subscriptions | SubscriptionIntake, never, SubscriptionPartitionNamespace> {\n return Layer.effectContext(\n Effect.gen(function* () {\n const { namespace } = yield* SubscriptionPartitionNamespace;\n\n const call = Effect.fnUntraced(function* (\n addressedPartition: SourcePartition,\n request: SubscriptionPartitionRequest,\n ) {\n if (!samePartition(partition, addressedPartition)) {\n return yield* SubscriptionError.make({ reason: \"unauthorized\", code: \"partition\" });\n }\n\n const encoded = yield* encodeRequest(request).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-partition-protocol\")),\n );\n\n const raw = yield* Effect.tryPromise({\n try: () =>\n namespace\n .get(namespace.idFromName(sourcePartitionName(partition)))\n .subscription(encoded),\n catch: () => storageFailure(\"call-subscription-partition\"),\n });\n\n return yield* decodeResponse(raw).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-partition-protocol\")),\n );\n });\n\n const failed = (response: SubscriptionPartitionResponse): SubscriptionPartitionFailure =>\n response._tag === \"Failed\"\n ? response.failure\n : SubscriptionPartitionProtocolError.make({\n message: \"Unexpected subscription response\",\n });\n\n const asProtocolError = (): SubscriptionError =>\n corruptFailure(\"subscription-partition-protocol\");\n\n const changeState = Effect.fnUntraced(function* (\n scope: typeof SubscriptionScope.Type,\n key: typeof SubscriptionKey.Type,\n expectedRevision: number,\n _tag: \"PauseSubscription\" | \"ResumeSubscription\" | \"RecoverSubscription\",\n ) {\n const response = yield* call(scope.partition, {\n _tag,\n schemaVersion: 1,\n scope,\n key,\n expectedRevision,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n ? failure\n : asProtocolError();\n });\n\n const subscriptions = Subscriptions.of({\n recoverSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"RecoverSubscription\"),\n getSubscription: (scope, key) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"GetSubscription\",\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n recoverDelivery: (scope, key, expectedGeneration) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"RecoverDelivery\",\n expectedGeneration,\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"DeliverySnapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n ? failure\n : asProtocolError();\n }),\n updateSubscription: (scope, key, expectedRevision, options) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"UpdateSubscription\",\n schemaVersion: 1,\n scope,\n key,\n expectedRevision,\n options,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\" ||\n failure._tag === \"SubscriptionSourceError\"\n ? failure\n : asProtocolError();\n }),\n pauseSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"PauseSubscription\"),\n resumeSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"ResumeSubscription\"),\n subscribe: (scope, options) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"Subscribe\",\n schemaVersion: 1,\n scope,\n options,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionSourceError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n listSubscriptions: (scope, after, limit) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"ListSubscriptions\",\n schemaVersion: 1,\n scope,\n ...(after === undefined ? {} : { after }),\n ...(limit === undefined ? {} : { limit }),\n });\n\n if (response._tag === \"SubscriptionPage\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n cancelSubscription: (scope, key, expectedRevision) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"CancelSubscription\",\n ...(expectedRevision === undefined ? {} : { expectedRevision }),\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n listDeliveries: (scope, key, after, limit) =>\n Effect.gen(function* () {\n const response = yield* call(scope.partition, {\n _tag: \"ListDeliveries\",\n schemaVersion: 1,\n scope,\n key,\n ...(after === undefined ? {} : { after }),\n ...(limit === undefined ? {} : { limit }),\n });\n\n if (response._tag === \"DeliveryPage\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n });\n\n const intake = SubscriptionIntake.of({\n accept: (principal, source, payload) =>\n Effect.gen(function* () {\n const request = yield* Schema.decodeUnknownEffect(AcceptRequest)({\n _tag: \"Accept\",\n schemaVersion: 1,\n partition,\n principal,\n source,\n payload,\n }).pipe(\n Effect.mapError(() =>\n SubscriptionError.make({ reason: \"validation\", code: \"event-payload\" }),\n ),\n );\n\n const response = yield* call(request.partition, request);\n\n if (response._tag === \"Acknowledgement\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionSourceError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n status: (principal, source, eventId) =>\n Effect.gen(function* () {\n const response = yield* call(partition, {\n _tag: \"Status\",\n schemaVersion: 1,\n partition,\n principal,\n source,\n eventId,\n });\n\n if (response._tag === \"Status\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n });\n\n return Context.make(Subscriptions, subscriptions).pipe(\n Context.add(SubscriptionIntake, intake),\n );\n }),\n );\n }\n}\n\nexport class SubscriptionPartitionIdentity extends Context.Service<\n SubscriptionPartitionIdentity,\n { readonly partition: SourcePartition }\n>()(\"@effect-agent/platform-cloudflare/SubscriptionPartitionIdentity\") {}\n\nconst decodePartitionName = Effect.fnUntraced(function* (name: string | null | undefined) {\n if (name === null || name === undefined) {\n return yield* SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition objects require an idFromName identity\",\n });\n }\n\n const tuple = yield* Schema.decodeEffect(\n Schema.fromJsonString(Schema.Tuple([Schema.String, Schema.String])),\n )(name).pipe(\n Effect.mapError(() =>\n SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition name is malformed\",\n }),\n ),\n );\n\n return yield* Schema.decodeEffect(SourcePartition)({\n tenantId: tuple[0],\n address: tuple[1],\n }).pipe(\n Effect.mapError(() =>\n SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition identity is invalid\",\n }),\n ),\n );\n});\n\nconst samePartition = Schema.toEquivalence(SourcePartition);\n\nconst requestPartition = (request: SubscriptionPartitionRequest): SourcePartition =>\n request._tag === \"Accept\" || request._tag === \"Status\"\n ? request.partition\n : request.scope.partition;\n\nconst handleRequest = Effect.fnUntraced(function* (encoded: unknown) {\n const decoded = yield* decodeRequest(encoded).pipe(Effect.result);\n\n if (decoded._tag === \"Failure\") {\n return yield* encodeResponse(\n protocolFailure(\"The subscription request could not be decoded\"),\n ).pipe(Effect.orDie);\n }\n const request = decoded.success;\n const { partition } = yield* SubscriptionPartitionIdentity;\n\n if (!samePartition(partition, requestPartition(request))) {\n return yield* encodeResponse(\n protocolFailure(\"The request partition does not match the addressed object\"),\n ).pipe(Effect.orDie);\n }\n const subscriptions = yield* Subscriptions;\n const intake = yield* SubscriptionIntake;\n\n const response = yield* Effect.gen(function* (): Effect.fn.Return<\n SubscriptionPartitionResponse,\n SubscriptionPartitionFailure\n > {\n switch (request._tag) {\n case \"GetSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.getSubscription(request.scope, request.key),\n };\n case \"Subscribe\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.subscribe(request.scope, request.options),\n };\n case \"UpdateSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.updateSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n request.options,\n ),\n };\n case \"RecoverSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.recoverSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"PauseSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.pauseSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"ResumeSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.resumeSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"ListSubscriptions\":\n return {\n _tag: \"SubscriptionPage\",\n value: yield* subscriptions.listSubscriptions(\n request.scope,\n request.after,\n request.limit,\n ),\n };\n case \"CancelSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.cancelSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"RecoverDelivery\":\n return {\n _tag: \"DeliverySnapshot\",\n value: yield* subscriptions.recoverDelivery(\n request.scope,\n request.key,\n request.expectedGeneration,\n ),\n };\n case \"ListDeliveries\":\n return {\n _tag: \"DeliveryPage\",\n value: yield* subscriptions.listDeliveries(\n request.scope,\n request.key,\n request.after,\n request.limit,\n ),\n };\n case \"Accept\":\n return {\n _tag: \"Acknowledgement\",\n value: yield* intake.accept(request.principal, request.source, request.payload),\n };\n case \"Status\":\n return {\n _tag: \"Status\",\n value: yield* intake.status(request.principal, request.source, request.eventId),\n };\n }\n }).pipe(\n Effect.catch((failure) =>\n Schema.is(SubscriptionPartitionFailure)(failure)\n ? Effect.succeed({ _tag: \"Failed\" as const, failure })\n : Effect.succeed(protocolFailure(\"The subscription operation failed outside its contract\")),\n ),\n );\n\n return yield* encodeResponse(response).pipe(Effect.orDie);\n});\n\nconst alarmStorageError = (code: string) => () => storageFailure(code);\n\nconst transactionLayer: Layer.Layer<\n DoSubscriptionTransaction,\n never,\n DurableObjectAlarm.DurableObjectAlarm\n> = Layer.effect(\n DoSubscriptionTransaction,\n Effect.gen(function* () {\n const alarms = yield* DurableObjectAlarm.DurableObjectAlarm;\n\n return DoSubscriptionTransaction.of({\n run: (body) =>\n Effect.gen(function* () {\n const nowMillis = yield* Clock.currentTimeMillis;\n\n return yield* alarms\n .transaction((transaction) =>\n body((replacement) =>\n replacement.deadlineAtMillis === null\n ? transaction\n .cancelAlarm({ id: SUBSCRIPTION_ALARM_ID, tag: SUBSCRIPTION_ALARM_TAG })\n .pipe(Effect.mapError(alarmStorageError(\"cancel-subscription-alarm\")))\n : Effect.fromOption(\n DateTime.make(Math.max(replacement.deadlineAtMillis, nowMillis + 1)),\n ).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-alarm-deadline\")),\n Effect.flatMap((runAt) =>\n transaction\n .scheduleAlarm({\n id: SUBSCRIPTION_ALARM_ID,\n tag: SUBSCRIPTION_ALARM_TAG,\n runAt,\n payload: { schemaVersion: 1, generation: replacement.generation },\n })\n .pipe(Effect.mapError(alarmStorageError(\"schedule-subscription-alarm\"))),\n ),\n ),\n ),\n )\n .pipe(\n Effect.catchTag(\"StorageOperationError\", () =>\n storageFailure(\"commit-subscription-transaction\"),\n ),\n );\n }),\n });\n }),\n);\n\nconst alarmHandler = (limits: SubscriptionLimits) =>\n DurableObjectAlarm.processDue(\n (event) =>\n Effect.gen(function* () {\n if (event.tag !== SUBSCRIPTION_ALARM_TAG) {\n const { handlers } = yield* SubscriptionPartitionAlarmExtension;\n const matches = handlers.filter((handler) => handler.tag === event.tag);\n const handler = matches[0];\n\n if (\n event.tag.startsWith(\"effect-agent/\") ||\n matches.length !== 1 ||\n handler === undefined\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Unknown or ambiguous ancillary alarm tag\",\n });\n\n return yield* handler.handle(event).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: MAX_ANCILLARY_ALARM_MILLIS,\n orElse: () => SubscriptionAlarmExtensionError.make({ code: \"timeout\" }),\n }),\n );\n }\n if (event.id !== SUBSCRIPTION_ALARM_ID) {\n return yield* SubscriptionAlarmProtocolError.make({\n message: `Unsupported Subscription Partition alarm ${event.tag}/${event.id}`,\n });\n }\n yield* Schema.decodeUnknownEffect(SubscriptionAlarmPayload)(event.payload).pipe(\n Effect.mapError(() =>\n SubscriptionAlarmProtocolError.make({\n message: \"Unsupported subscription alarm payload\",\n }),\n ),\n );\n const driver = yield* SubscriptionDriver;\n const alarmControl = yield* DoSubscriptionAlarmControl;\n\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);\n\n const pass = yield* driver.runDue.pipe(\n Effect.catchCauseIf(\n (cause) => !Cause.hasInterrupts(cause),\n (cause) =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((time) => alarmControl.prearm(time + limits.retryMillis)),\n Effect.andThen(Effect.failCause(cause)),\n ),\n ),\n );\n\n if (pass.failed > 0) {\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);\n } else {\n yield* alarmControl.reconcile;\n }\n }),\n {\n limit: MAX_ALARMS_PER_INVOCATION,\n retryFailedAfter: limits.retryMillis,\n onFailure: () => Effect.logWarning(\"Subscription partition alarm retained for retry\"),\n },\n ).pipe(Effect.asVoid);\n\ntype SubscriptionRuntimeServices =\n | Subscriptions\n | SubscriptionIntake\n | SubscriptionDriver\n | DoSubscriptionAlarmControl\n | SubscriptionPartitionIdentity\n | DurableObjectAlarm.DurableObjectAlarm;\n\nexport interface SubscriptionPartitionObjectInstance extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, SubscriptionRuntimeServices>\n> {\n subscription(encoded: unknown): Promise<unknown>;\n alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;\n}\n\nexport interface SubscriptionPartitionObjectClass {\n new (ctx: DurableObjectState, env: Cloudflare.Env): SubscriptionPartitionObjectInstance;\n}\n\n/**\n * Build one source-addressed SQLite Durable Object. The host Layer binds the permitted source\n * catalog and authority. It must not retain cleanup-scoped resources across RPC events.\n */\nexport const makeSubscriptionPartitionObjectClass = <E>(\n host: Layer.Layer<\n SubscriptionAuthorizer | EventSources | SubscriptionInputBindings | ThreadObjectNamespace,\n E,\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n | SubscriptionPartitionIdentity\n >,\n limits: SubscriptionLimits = defaultSubscriptionLimits,\n): SubscriptionPartitionObjectClass => {\n const cloudflareLimitsLayer = Layer.effectDiscard(validateCloudflareSubscriptionLimits(limits));\n\n const identityLayer = Layer.effect(\n SubscriptionPartitionIdentity,\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n\n return SubscriptionPartitionIdentity.of({\n partition: yield* decodePartitionName(state.raw.id.name),\n });\n }),\n );\n\n const sqlLayer = Layer.unwrap(\n Effect.map(EffectCfDurableObjectState.DurableObjectState, (state) =>\n SqliteClient.layer({ storage: state.raw.storage }),\n ),\n );\n\n const partitionStore = Layer.unwrap(\n Effect.map(SubscriptionPartitionIdentity, ({ partition }) =>\n doSubscriptionStoreLayer(partition).pipe(\n Layer.provide(transactionLayer),\n Layer.provide(sqlLayer),\n ),\n ),\n );\n\n const application = Layer.mergeAll(\n Subscriptions.layer(limits),\n SubscriptionIntake.layer(limits),\n SubscriptionDriver.layer(limits),\n cloudflareLimitsLayer,\n // Capture the host reference before its scoped input Layer is hidden from the runtime.\n Layer.effect(\n SubscriptionPartitionAlarmExtension,\n Effect.gen(function* () {\n const extension = yield* SubscriptionPartitionAlarmExtension;\n const tags = extension.handlers.map((handler) => handler.tag);\n\n if (\n tags.length > MAX_ALARMS_PER_INVOCATION ||\n new Set(tags).size !== tags.length ||\n tags.some(\n (tag) => tag.length === 0 || tag.length > 128 || tag.startsWith(\"effect-agent/\"),\n )\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Invalid ancillary alarm handler registry\",\n });\n\n yield* validateCloudflareSubscriptionLimits(limits, { ancillaryAlarms: tags.length > 0 });\n\n return extension;\n }),\n ),\n ).pipe(\n Layer.provideMerge(partitionStore),\n Layer.provide(\n cloudflarePreparedInputAdmissionLayer.pipe(Layer.provide(CloudflareThreadClient.layer)),\n ),\n Layer.provide(cloudflareCryptoLayer),\n Layer.provideMerge(DurableObjectAlarm.DurableObjectAlarm.layer),\n Layer.provide(host),\n Layer.provideMerge(identityLayer),\n );\n\n const runtime: Layer.Layer<\n SubscriptionRuntimeServices,\n | E\n | SubscriptionError\n | SubscriptionPartitionProtocolError\n | CloudflareSubscriptionConfigError\n | SubscriptionAlarmProtocolError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n return yield* state.blockConcurrencyWhile(Layer.buildWithScope(application, scope));\n }),\n );\n\n const rpc = {\n subscription: (encoded: unknown) => handleRequest(encoded),\n } satisfies EffectCfDurableObject.DurableObjectRpc<SubscriptionRuntimeServices>;\n\n const SubscriptionPartitionObject = EffectCfDurableObject.make(runtime, {\n initialize: Effect.void,\n rpc,\n alarms: alarmHandler(limits),\n });\n\n return SubscriptionPartitionObject;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"CloudflareSubscriptions.mjs","names":["EffectCfDurableObjectState","EffectCfDurableObject"],"sources":["../src/CloudflareSubscriptions.ts"],"sourcesContent":["import { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport {\n DoSubscriptionAlarmControl,\n DoSubscriptionTransaction,\n doSubscriptionStoreLayer,\n} from \"@yielded/agent-storage-cloudflare/do-subscription-store\";\nimport { type EventSources } from \"@yielded/agent/event-source\";\nimport { PersistedJson } from \"@yielded/agent/records\";\nimport { Principal } from \"@yielded/agent/submission-ledger\";\nimport {\n EventAcknowledgement,\n EventSourceVersion,\n SourcePartition,\n type SubscriptionAuthorizer,\n SubscriptionConfiguration,\n SubscriptionDeliverySnapshot,\n SubscriptionDeliveryKey,\n SubscriptionError,\n SubscriptionFailpointError,\n SubscriptionKey,\n SubscriptionScope,\n type SubscriptionLimits,\n SubscriptionSnapshot,\n SubscriptionSourceError,\n defaultSubscriptionLimits,\n} from \"@yielded/agent/subscription\";\nimport { type SubscriptionInputBindings } from \"@yielded/agent/subscription-input\";\nimport {\n SubscriptionDriver,\n SubscriptionIntake,\n Subscriptions,\n} from \"@yielded/agent/subscriptions\";\nimport { Cause, Clock, Context, DateTime, Effect, Layer, Schema, type Scope } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectAlarm,\n DurableObjectState as EffectCfDurableObjectState,\n type WorkerEnvironment,\n} from \"effect-cf\";\n\nimport { type ThreadObjectNamespace } from \"./CloudflareBindings.ts\";\nimport { CloudflareThreadClient } from \"./CloudflareThreadClient.ts\";\nimport { cloudflareCryptoLayer } from \"./internal/crypto.ts\";\nimport { cloudflarePreparedInputAdmissionLayer } from \"./internal/prepared-admission.ts\";\n\nconst SUBSCRIPTION_ALARM_TAG = \"effect-agent/SubscriptionPartitionWake\";\nconst SUBSCRIPTION_ALARM_ID = \"driver\";\nconst MAX_ALARM_WALL_MILLIS = 12 * 60_000;\nconst MAX_ALARMS_PER_INVOCATION = 16;\nconst MAX_ANCILLARY_ALARM_MILLIS = 30_000;\n\nconst SubscriptionAlarmPayload = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n generation: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nexport class SubscriptionAlarmProtocolError extends Schema.TaggedError<SubscriptionAlarmProtocolError>()(\n \"SubscriptionAlarmProtocolError\",\n { message: Schema.String },\n) {}\n\n/** Bounded host diagnostic; credentials and provider responses do not belong in alarm failures. */\nexport class SubscriptionAlarmExtensionError extends Schema.TaggedError<SubscriptionAlarmExtensionError>()(\n \"SubscriptionAlarmExtensionError\",\n { code: Schema.NonEmptyString.check(Schema.isMaxLength(128)) },\n) {}\n\n/** Native partition services supplied at alarm invocation, after the host Layer is built. */\nexport type SubscriptionPartitionAlarmServices =\n | Subscriptions\n | SubscriptionIntake\n | SubscriptionDriver;\n\nexport interface SubscriptionPartitionAlarmHandler<R = SubscriptionPartitionAlarmServices> {\n readonly tag: string;\n readonly handle: (\n event: DurableObjectAlarm.DurableObjectAlarmEvent,\n ) => Effect.Effect<void, SubscriptionAlarmProtocolError | SubscriptionAlarmExtensionError, R>;\n}\n\n/** Host-only handlers; the framework reserves its namespace and rejects every unknown tag. */\nexport const SubscriptionPartitionAlarmExtension = Context.Reference<{\n readonly handlers: ReadonlyArray<SubscriptionPartitionAlarmHandler>;\n}>(\"@effect-agent/platform-cloudflare/SubscriptionPartitionAlarmExtension\", {\n defaultValue: () => ({ handlers: [] }),\n});\n\n/** Capture host services once, deferring native partition services to invocation.\n * Each invocation owns its codec/handler Scope and timeout.\n * Callback failures stay typed. Defects and interruption reach the native alarm multiplexer.\n * The host owns durable idempotency, prearming and external-effect uncertainty.\n */\nexport const makeSubscriptionPartitionAlarmHandler = Effect.fnUntraced(function* <\n Payload extends Schema.Top,\n R,\n>(options: {\n readonly tag: string;\n readonly payload: Payload;\n readonly timeoutMillis: number;\n readonly handle: (\n event: Omit<DurableObjectAlarm.DurableObjectAlarmEvent, \"payload\"> & {\n readonly payload: Payload[\"Type\"];\n },\n ) => Effect.Effect<void, SubscriptionAlarmExtensionError, R>;\n}): Effect.fn.Return<\n SubscriptionPartitionAlarmHandler<\n Exclude<\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope>,\n Exclude<\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope | SubscriptionPartitionAlarmServices>,\n SubscriptionPartitionAlarmServices\n >\n >\n >,\n SubscriptionAlarmProtocolError,\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope | SubscriptionPartitionAlarmServices>\n> {\n if (\n options.tag.length === 0 ||\n options.tag.length > 128 ||\n options.tag.startsWith(\"effect-agent/\") ||\n !Number.isSafeInteger(options.timeoutMillis) ||\n options.timeoutMillis < 1 ||\n options.timeoutMillis > MAX_ANCILLARY_ALARM_MILLIS\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Invalid ancillary alarm tag or timeout\",\n });\n\n // Context capture includes unrequested services too; never retain a host override of native work.\n const services = (yield* Effect.context<\n Exclude<R | Payload[\"DecodingServices\"], Scope.Scope | SubscriptionPartitionAlarmServices>\n >()).pipe(Context.omit(Subscriptions, SubscriptionIntake, SubscriptionDriver));\n\n return {\n tag: options.tag,\n handle: Effect.fnUntraced(\n function* (event) {\n if (event.tag !== options.tag)\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Ancillary alarm tag mismatch\",\n });\n\n const payload = yield* Schema.decodeEffect(options.payload)(event.payload).pipe(\n Effect.mapError(() =>\n SubscriptionAlarmProtocolError.make({ message: \"Invalid ancillary alarm payload\" }),\n ),\n );\n\n yield* options.handle({ ...event, payload });\n },\n (effect) =>\n effect.pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: options.timeoutMillis,\n orElse: () => SubscriptionAlarmExtensionError.make({ code: \"timeout\" }),\n }),\n Effect.provideContext(services),\n ),\n ),\n };\n});\n\nexport class SubscriptionPartitionProtocolError extends Schema.TaggedError<SubscriptionPartitionProtocolError>()(\n \"SubscriptionPartitionProtocolError\",\n { message: Schema.String.check(Schema.isMaxLength(4_096)) },\n) {}\n\nexport class CloudflareSubscriptionConfigError extends Schema.TaggedError<CloudflareSubscriptionConfigError>()(\n \"CloudflareSubscriptionConfigError\",\n { message: Schema.String },\n) {}\n\n/** Reject limits whose four bounded phases could exceed the safe Durable Object alarm budget. */\nexport const validateCloudflareSubscriptionLimits = (\n limits: SubscriptionLimits,\n options: { readonly ancillaryAlarms?: boolean } = {},\n): Effect.Effect<void, CloudflareSubscriptionConfigError> => {\n const worstCaseMillis =\n 4 * Math.ceil(limits.batchSize / limits.concurrency) * limits.operationTimeoutMillis +\n (options.ancillaryAlarms === true ? MAX_ALARMS_PER_INVOCATION * MAX_ANCILLARY_ALARM_MILLIS : 0);\n\n return worstCaseMillis <= MAX_ALARM_WALL_MILLIS\n ? Effect.void\n : Effect.fail(\n CloudflareSubscriptionConfigError.make({\n message: \"Subscription limits can exceed the bounded Durable Object alarm wall budget\",\n }),\n );\n};\n\nconst protocolMessage = (message: string): string =>\n message.length <= 4_096 ? message : `${message.slice(0, 4_093)}...`;\n\nconst SubscribeRequest = Schema.TaggedStruct(\"Subscribe\", {\n schemaVersion: Schema.Literal(1),\n scope: Schema.Struct({\n ...SubscriptionScope.fields,\n }),\n options: Schema.Struct({\n subscriptionId: SubscriptionKey.fields.subscriptionId,\n source: EventSourceVersion,\n parameters: PersistedJson,\n context: PersistedJson,\n mode: Schema.Literals([\"once\", \"continuous\"]),\n expiresAtMillis: Schema.NullOr(Schema.Number),\n destination: SubscriptionConfiguration.fields.destination,\n deliveryPrincipal: SubscriptionConfiguration.fields.deliveryPrincipal,\n admissionGroup: SubscriptionConfiguration.fields.admissionGroup,\n admissionFence: SubscriptionConfiguration.fields.admissionFence,\n agentId: SubscriptionConfiguration.fields.agentId,\n definitions: SubscriptionConfiguration.fields.definitions,\n }),\n});\n\nconst UpdateSubscriptionRequest = Schema.TaggedStruct(\"UpdateSubscription\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n options: SubscribeRequest.fields.options.mapFields(({ subscriptionId: _, ...fields }) => fields),\n});\n\nconst SubscriptionStateRequest = Schema.Struct({\n _tag: Schema.Literals([\"PauseSubscription\", \"ResumeSubscription\", \"RecoverSubscription\"]),\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nconst ListSubscriptionsRequest = Schema.TaggedStruct(\"ListSubscriptions\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n after: Schema.optionalKey(Schema.Natural),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n});\n\nconst CancelSubscriptionRequest = Schema.TaggedStruct(\"CancelSubscription\", {\n expectedRevision: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n});\n\nconst GetSubscriptionRequest = Schema.TaggedStruct(\"GetSubscription\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscriptionScope,\n key: SubscriptionKey,\n});\n\nconst RecoverDeliveryRequest = Schema.TaggedStruct(\"RecoverDelivery\", {\n expectedGeneration: Schema.Natural,\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionDeliveryKey,\n});\n\nconst ListDeliveriesRequest = Schema.TaggedStruct(\"ListDeliveries\", {\n schemaVersion: Schema.Literal(1),\n scope: SubscribeRequest.fields.scope,\n key: SubscriptionKey,\n after: Schema.optionalKey(Schema.String),\n limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0))),\n});\n\nconst AcceptRequest = Schema.TaggedStruct(\"Accept\", {\n schemaVersion: Schema.Literal(1),\n partition: SourcePartition,\n principal: Principal,\n source: EventSourceVersion,\n payload: PersistedJson,\n});\n\nconst StatusRequest = Schema.TaggedStruct(\"Status\", {\n schemaVersion: Schema.Literal(1),\n partition: SourcePartition,\n principal: Principal,\n source: EventSourceVersion,\n eventId: Schema.String,\n});\n\nconst SubscriptionPartitionRequest = Schema.Union([\n SubscribeRequest,\n GetSubscriptionRequest,\n UpdateSubscriptionRequest,\n SubscriptionStateRequest,\n ListSubscriptionsRequest,\n CancelSubscriptionRequest,\n ListDeliveriesRequest,\n RecoverDeliveryRequest,\n AcceptRequest,\n StatusRequest,\n]);\n\ntype SubscriptionPartitionRequest = typeof SubscriptionPartitionRequest.Type;\n\nconst SubscriptionPage = Schema.Struct({\n items: Schema.Array(SubscriptionSnapshot),\n next: Schema.NullOr(Schema.Natural),\n});\n\nconst DeliveryPage = Schema.Struct({\n items: Schema.Array(SubscriptionDeliverySnapshot),\n next: Schema.NullOr(Schema.String),\n});\n\nconst IntakeStatus = Schema.Struct({\n ...EventAcknowledgement.fields,\n routingComplete: Schema.Boolean,\n routingFailure: Schema.NullOr(Schema.String),\n nextAttemptAtMillis: Schema.Number,\n});\n\nconst SubscriptionPartitionFailure = Schema.Union([\n SubscriptionError,\n SubscriptionSourceError,\n SubscriptionFailpointError,\n SubscriptionPartitionProtocolError,\n]);\n\ntype SubscriptionPartitionFailure = typeof SubscriptionPartitionFailure.Type;\n\nconst SubscriptionPartitionResponse = Schema.Union([\n Schema.TaggedStruct(\"Snapshot\", { value: SubscriptionSnapshot }),\n Schema.TaggedStruct(\"SubscriptionPage\", { value: SubscriptionPage }),\n Schema.TaggedStruct(\"DeliveryPage\", { value: DeliveryPage }),\n Schema.TaggedStruct(\"DeliverySnapshot\", { value: SubscriptionDeliverySnapshot }),\n Schema.TaggedStruct(\"Acknowledgement\", { value: EventAcknowledgement }),\n Schema.TaggedStruct(\"Status\", { value: IntakeStatus }),\n Schema.TaggedStruct(\"Failed\", { failure: SubscriptionPartitionFailure }),\n]);\n\ntype SubscriptionPartitionResponse = typeof SubscriptionPartitionResponse.Type;\n\nconst decodeRequest = Schema.decodeUnknownEffect(SubscriptionPartitionRequest);\nconst encodeRequest = Schema.encodeEffect(SubscriptionPartitionRequest);\nconst decodeResponse = Schema.decodeUnknownEffect(SubscriptionPartitionResponse);\nconst encodeResponse = Schema.encodeEffect(SubscriptionPartitionResponse);\n\nconst protocolFailure = (message: string): SubscriptionPartitionResponse => ({\n _tag: \"Failed\",\n failure: SubscriptionPartitionProtocolError.make({ message: protocolMessage(message) }),\n});\n\nexport const sourcePartitionName = (partition: SourcePartition): string =>\n JSON.stringify([partition.tenantId, partition.address]);\n\nexport interface SubscriptionPartitionObjectRpc extends Rpc.DurableObjectBranded {\n subscription(encoded: unknown): Promise<unknown>;\n}\n\nexport class SubscriptionPartitionNamespace extends Context.Service<\n SubscriptionPartitionNamespace,\n { readonly namespace: DurableObjectNamespace<SubscriptionPartitionObjectRpc> }\n>()(\"@effect-agent/platform-cloudflare/SubscriptionPartitionNamespace\") {}\n\nconst storageFailure = (code: string): SubscriptionError =>\n SubscriptionError.make({ reason: \"storage\", code });\n\nconst corruptFailure = (code: string): SubscriptionError =>\n SubscriptionError.make({ reason: \"corrupt\", code });\n\n/** Worker-side management and trusted intake, routed to one fresh partition stub per call. */\nexport class CloudflareSubscriptionsClient {\n static layer(\n partition: SourcePartition,\n ): Layer.Layer<Subscriptions | SubscriptionIntake, never, SubscriptionPartitionNamespace> {\n return Layer.effectContext(\n Effect.gen(function* () {\n const { namespace } = yield* SubscriptionPartitionNamespace;\n\n const call = Effect.fnUntraced(function* (\n addressedPartition: SourcePartition,\n request: SubscriptionPartitionRequest,\n ) {\n if (!samePartition(partition, addressedPartition)) {\n return yield* SubscriptionError.make({ reason: \"unauthorized\", code: \"partition\" });\n }\n\n const encoded = yield* encodeRequest(request).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-partition-protocol\")),\n );\n\n const raw = yield* Effect.tryPromise({\n try: () =>\n namespace\n .get(namespace.idFromName(sourcePartitionName(partition)))\n .subscription(encoded),\n catch: () => storageFailure(\"call-subscription-partition\"),\n });\n\n return yield* decodeResponse(raw).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-partition-protocol\")),\n );\n });\n\n const failed = (response: SubscriptionPartitionResponse): SubscriptionPartitionFailure =>\n response._tag === \"Failed\"\n ? response.failure\n : SubscriptionPartitionProtocolError.make({\n message: \"Unexpected subscription response\",\n });\n\n const asProtocolError = (): SubscriptionError =>\n corruptFailure(\"subscription-partition-protocol\");\n\n const changeState = Effect.fnUntraced(function* (\n scope: typeof SubscriptionScope.Type,\n key: typeof SubscriptionKey.Type,\n expectedRevision: number,\n _tag: \"PauseSubscription\" | \"ResumeSubscription\" | \"RecoverSubscription\",\n ) {\n const response = yield* call(scope.partition, {\n _tag,\n schemaVersion: 1,\n scope,\n key,\n expectedRevision,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n ? failure\n : asProtocolError();\n });\n\n const subscriptions = Subscriptions.of({\n recoverSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"RecoverSubscription\"),\n getSubscription: Effect.fnUntraced(function* (scope, key) {\n const response = yield* call(scope.partition, {\n _tag: \"GetSubscription\",\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n recoverDelivery: Effect.fnUntraced(function* (scope, key, expectedGeneration) {\n const response = yield* call(scope.partition, {\n _tag: \"RecoverDelivery\",\n expectedGeneration,\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"DeliverySnapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n ? failure\n : asProtocolError();\n }),\n updateSubscription: Effect.fnUntraced(function* (scope, key, expectedRevision, options) {\n const response = yield* call(scope.partition, {\n _tag: \"UpdateSubscription\",\n schemaVersion: 1,\n scope,\n key,\n expectedRevision,\n options,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\" ||\n failure._tag === \"SubscriptionSourceError\"\n ? failure\n : asProtocolError();\n }),\n pauseSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"PauseSubscription\"),\n resumeSubscription: (scope, key, revision) =>\n changeState(scope, key, revision, \"ResumeSubscription\"),\n subscribe: Effect.fnUntraced(function* (scope, options) {\n const response = yield* call(scope.partition, {\n _tag: \"Subscribe\",\n schemaVersion: 1,\n scope,\n options,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionSourceError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n listSubscriptions: Effect.fnUntraced(function* (scope, after, limit) {\n const response = yield* call(scope.partition, {\n _tag: \"ListSubscriptions\",\n schemaVersion: 1,\n scope,\n ...(after === undefined ? {} : { after }),\n ...(limit === undefined ? {} : { limit }),\n });\n\n if (response._tag === \"SubscriptionPage\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n cancelSubscription: Effect.fnUntraced(function* (scope, key, expectedRevision) {\n const response = yield* call(scope.partition, {\n _tag: \"CancelSubscription\",\n ...(expectedRevision === undefined ? {} : { expectedRevision }),\n schemaVersion: 1,\n scope,\n key,\n });\n\n if (response._tag === \"Snapshot\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n listDeliveries: Effect.fnUntraced(function* (scope, key, after, limit) {\n const response = yield* call(scope.partition, {\n _tag: \"ListDeliveries\",\n schemaVersion: 1,\n scope,\n key,\n ...(after === undefined ? {} : { after }),\n ...(limit === undefined ? {} : { limit }),\n });\n\n if (response._tag === \"DeliveryPage\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n });\n\n const intake = SubscriptionIntake.of({\n accept: Effect.fnUntraced(function* (principal, source, payload) {\n const request = yield* Schema.decodeUnknownEffect(AcceptRequest)({\n _tag: \"Accept\",\n schemaVersion: 1,\n partition,\n principal,\n source,\n payload,\n }).pipe(\n Effect.mapError(() =>\n SubscriptionError.make({ reason: \"validation\", code: \"event-payload\" }),\n ),\n );\n\n const response = yield* call(request.partition, request);\n\n if (response._tag === \"Acknowledgement\") return response.value;\n const failure = failed(response);\n\n if (\n failure._tag === \"SubscriptionError\" ||\n failure._tag === \"SubscriptionSourceError\" ||\n failure._tag === \"SubscriptionFailpointError\"\n )\n return yield* failure;\n\n return yield* asProtocolError();\n }),\n status: Effect.fnUntraced(function* (principal, source, eventId) {\n const response = yield* call(partition, {\n _tag: \"Status\",\n schemaVersion: 1,\n partition,\n principal,\n source,\n eventId,\n });\n\n if (response._tag === \"Status\") return response.value;\n const failure = failed(response);\n\n return yield* failure._tag === \"SubscriptionError\" ? failure : asProtocolError();\n }),\n });\n\n return Context.make(Subscriptions, subscriptions).pipe(\n Context.add(SubscriptionIntake, intake),\n );\n }),\n );\n }\n}\n\nexport class SubscriptionPartitionIdentity extends Context.Service<\n SubscriptionPartitionIdentity,\n { readonly partition: SourcePartition }\n>()(\"@effect-agent/platform-cloudflare/SubscriptionPartitionIdentity\") {}\n\nconst decodePartitionName = Effect.fnUntraced(function* (name: string | null | undefined) {\n if (name === null || name === undefined) {\n return yield* SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition objects require an idFromName identity\",\n });\n }\n\n const tuple = yield* Schema.decodeEffect(\n Schema.fromJsonString(Schema.Tuple([Schema.String, Schema.String])),\n )(name).pipe(\n Effect.mapError(() =>\n SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition name is malformed\",\n }),\n ),\n );\n\n return yield* Schema.decodeEffect(SourcePartition)({\n tenantId: tuple[0],\n address: tuple[1],\n }).pipe(\n Effect.mapError(() =>\n SubscriptionPartitionProtocolError.make({\n message: \"Subscription Partition identity is invalid\",\n }),\n ),\n );\n});\n\nconst samePartition = Schema.toEquivalence(SourcePartition);\n\nconst requestPartition = (request: SubscriptionPartitionRequest): SourcePartition =>\n request._tag === \"Accept\" || request._tag === \"Status\"\n ? request.partition\n : request.scope.partition;\n\nconst handleRequest = Effect.fnUntraced(function* (encoded: unknown) {\n const decoded = yield* decodeRequest(encoded).pipe(Effect.result);\n\n if (decoded._tag === \"Failure\") {\n return yield* encodeResponse(\n protocolFailure(\"The subscription request could not be decoded\"),\n ).pipe(Effect.orDie);\n }\n const request = decoded.success;\n const { partition } = yield* SubscriptionPartitionIdentity;\n\n if (!samePartition(partition, requestPartition(request))) {\n return yield* encodeResponse(\n protocolFailure(\"The request partition does not match the addressed object\"),\n ).pipe(Effect.orDie);\n }\n const subscriptions = yield* Subscriptions;\n const intake = yield* SubscriptionIntake;\n\n const response = yield* Effect.gen(function* (): Effect.fn.Return<\n SubscriptionPartitionResponse,\n SubscriptionPartitionFailure\n > {\n switch (request._tag) {\n case \"GetSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.getSubscription(request.scope, request.key),\n };\n case \"Subscribe\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.subscribe(request.scope, request.options),\n };\n case \"UpdateSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.updateSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n request.options,\n ),\n };\n case \"RecoverSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.recoverSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"PauseSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.pauseSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"ResumeSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.resumeSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"ListSubscriptions\":\n return {\n _tag: \"SubscriptionPage\",\n value: yield* subscriptions.listSubscriptions(\n request.scope,\n request.after,\n request.limit,\n ),\n };\n case \"CancelSubscription\":\n return {\n _tag: \"Snapshot\",\n value: yield* subscriptions.cancelSubscription(\n request.scope,\n request.key,\n request.expectedRevision,\n ),\n };\n case \"RecoverDelivery\":\n return {\n _tag: \"DeliverySnapshot\",\n value: yield* subscriptions.recoverDelivery(\n request.scope,\n request.key,\n request.expectedGeneration,\n ),\n };\n case \"ListDeliveries\":\n return {\n _tag: \"DeliveryPage\",\n value: yield* subscriptions.listDeliveries(\n request.scope,\n request.key,\n request.after,\n request.limit,\n ),\n };\n case \"Accept\":\n return {\n _tag: \"Acknowledgement\",\n value: yield* intake.accept(request.principal, request.source, request.payload),\n };\n case \"Status\":\n return {\n _tag: \"Status\",\n value: yield* intake.status(request.principal, request.source, request.eventId),\n };\n }\n }).pipe(\n Effect.catch((failure) =>\n Schema.is(SubscriptionPartitionFailure)(failure)\n ? Effect.succeed({ _tag: \"Failed\" as const, failure })\n : Effect.succeed(protocolFailure(\"The subscription operation failed outside its contract\")),\n ),\n );\n\n return yield* encodeResponse(response).pipe(Effect.orDie);\n});\n\nconst alarmStorageError = (code: string) => () => storageFailure(code);\n\nconst transactionLayer: Layer.Layer<\n DoSubscriptionTransaction,\n never,\n DurableObjectAlarm.DurableObjectAlarm\n> = Layer.effect(\n DoSubscriptionTransaction,\n Effect.gen(function* () {\n const alarms = yield* DurableObjectAlarm.DurableObjectAlarm;\n\n return DoSubscriptionTransaction.of({\n run: Effect.fnUntraced(function* (body) {\n const nowMillis = yield* Clock.currentTimeMillis;\n\n return yield* alarms\n .transaction((transaction) =>\n body((replacement) =>\n replacement.deadlineAtMillis === null\n ? transaction\n .cancelAlarm({ id: SUBSCRIPTION_ALARM_ID, tag: SUBSCRIPTION_ALARM_TAG })\n .pipe(Effect.mapError(alarmStorageError(\"cancel-subscription-alarm\")))\n : Effect.fromOption(\n DateTime.make(Math.max(replacement.deadlineAtMillis, nowMillis + 1)),\n ).pipe(\n Effect.mapError(() => corruptFailure(\"subscription-alarm-deadline\")),\n Effect.flatMap((runAt) =>\n transaction\n .scheduleAlarm({\n id: SUBSCRIPTION_ALARM_ID,\n tag: SUBSCRIPTION_ALARM_TAG,\n runAt,\n payload: { schemaVersion: 1, generation: replacement.generation },\n })\n .pipe(Effect.mapError(alarmStorageError(\"schedule-subscription-alarm\"))),\n ),\n ),\n ),\n )\n .pipe(\n Effect.catchTag(\"StorageOperationError\", () =>\n storageFailure(\"commit-subscription-transaction\"),\n ),\n );\n }),\n });\n }),\n);\n\nconst alarmHandler = (limits: SubscriptionLimits) =>\n DurableObjectAlarm.processDue(\n (event) =>\n Effect.gen(function* () {\n if (event.tag !== SUBSCRIPTION_ALARM_TAG) {\n const { handlers } = yield* SubscriptionPartitionAlarmExtension;\n const matches = handlers.filter((handler) => handler.tag === event.tag);\n const handler = matches[0];\n\n if (\n event.tag.startsWith(\"effect-agent/\") ||\n matches.length !== 1 ||\n handler === undefined\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Unknown or ambiguous ancillary alarm tag\",\n });\n\n return yield* handler.handle(event).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: MAX_ANCILLARY_ALARM_MILLIS,\n orElse: () => SubscriptionAlarmExtensionError.make({ code: \"timeout\" }),\n }),\n );\n }\n if (event.id !== SUBSCRIPTION_ALARM_ID) {\n return yield* SubscriptionAlarmProtocolError.make({\n message: `Unsupported Subscription Partition alarm ${event.tag}/${event.id}`,\n });\n }\n yield* Schema.decodeUnknownEffect(SubscriptionAlarmPayload)(event.payload).pipe(\n Effect.mapError(() =>\n SubscriptionAlarmProtocolError.make({\n message: \"Unsupported subscription alarm payload\",\n }),\n ),\n );\n const driver = yield* SubscriptionDriver;\n const alarmControl = yield* DoSubscriptionAlarmControl;\n\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);\n\n const pass = yield* driver.runDue.pipe(\n Effect.catchCauseIf(\n (cause) => !Cause.hasInterrupts(cause),\n (cause) =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((time) => alarmControl.prearm(time + limits.retryMillis)),\n Effect.andThen(Effect.failCause(cause)),\n ),\n ),\n );\n\n if (pass.failed > 0) {\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.retryMillis);\n } else {\n yield* alarmControl.reconcile;\n }\n }),\n {\n limit: MAX_ALARMS_PER_INVOCATION,\n retryFailedAfter: limits.retryMillis,\n onFailure: () => Effect.logWarning(\"Subscription partition alarm retained for retry\"),\n },\n ).pipe(Effect.asVoid);\n\ntype SubscriptionRuntimeServices =\n | Subscriptions\n | SubscriptionIntake\n | SubscriptionDriver\n | DoSubscriptionAlarmControl\n | SubscriptionPartitionIdentity\n | DurableObjectAlarm.DurableObjectAlarm;\n\nexport interface SubscriptionPartitionObjectInstance extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, SubscriptionRuntimeServices>\n> {\n subscription(encoded: unknown): Promise<unknown>;\n alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;\n}\n\nexport interface SubscriptionPartitionObjectClass {\n new (ctx: DurableObjectState, env: Cloudflare.Env): SubscriptionPartitionObjectInstance;\n}\n\n/**\n * Build one source-addressed SQLite Durable Object. The host Layer binds the permitted source\n * catalog and authority. It must not retain cleanup-scoped resources across RPC events.\n */\nexport const makeSubscriptionPartitionObjectClass = <E>(\n host: Layer.Layer<\n SubscriptionAuthorizer | EventSources | SubscriptionInputBindings | ThreadObjectNamespace,\n E,\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n | SubscriptionPartitionIdentity\n >,\n limits: SubscriptionLimits = defaultSubscriptionLimits,\n): SubscriptionPartitionObjectClass => {\n const cloudflareLimitsLayer = Layer.effectDiscard(validateCloudflareSubscriptionLimits(limits));\n\n const identityLayer = Layer.effect(\n SubscriptionPartitionIdentity,\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n\n return SubscriptionPartitionIdentity.of({\n partition: yield* decodePartitionName(state.raw.id.name),\n });\n }),\n );\n\n const sqlLayer = Layer.unwrap(\n Effect.map(EffectCfDurableObjectState.DurableObjectState, (state) =>\n SqliteClient.layer({ storage: state.raw.storage }),\n ),\n );\n\n const partitionStore = Layer.unwrap(\n Effect.map(SubscriptionPartitionIdentity, ({ partition }) =>\n doSubscriptionStoreLayer(partition).pipe(\n Layer.provide(transactionLayer),\n Layer.provide(sqlLayer),\n ),\n ),\n );\n\n const application = Layer.mergeAll(\n Subscriptions.layer(limits),\n SubscriptionIntake.layer(limits),\n SubscriptionDriver.layer(limits),\n cloudflareLimitsLayer,\n // Capture the host reference before its scoped input Layer is hidden from the runtime.\n Layer.effect(\n SubscriptionPartitionAlarmExtension,\n Effect.gen(function* () {\n const extension = yield* SubscriptionPartitionAlarmExtension;\n const tags = extension.handlers.map((handler) => handler.tag);\n\n if (\n tags.length > MAX_ALARMS_PER_INVOCATION ||\n new Set(tags).size !== tags.length ||\n tags.some(\n (tag) => tag.length === 0 || tag.length > 128 || tag.startsWith(\"effect-agent/\"),\n )\n )\n return yield* SubscriptionAlarmProtocolError.make({\n message: \"Invalid ancillary alarm handler registry\",\n });\n\n yield* validateCloudflareSubscriptionLimits(limits, { ancillaryAlarms: tags.length > 0 });\n\n return extension;\n }),\n ),\n ).pipe(\n Layer.provideMerge(partitionStore),\n Layer.provide(\n cloudflarePreparedInputAdmissionLayer.pipe(Layer.provide(CloudflareThreadClient.layer)),\n ),\n Layer.provide(cloudflareCryptoLayer),\n Layer.provideMerge(DurableObjectAlarm.DurableObjectAlarm.layer),\n Layer.provide(host),\n Layer.provideMerge(identityLayer),\n );\n\n const runtime: Layer.Layer<\n SubscriptionRuntimeServices,\n | E\n | SubscriptionError\n | SubscriptionPartitionProtocolError\n | CloudflareSubscriptionConfigError\n | SubscriptionAlarmProtocolError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n return yield* state.blockConcurrencyWhile(Layer.buildWithScope(application, scope));\n }),\n );\n\n const rpc = {\n subscription: (encoded: unknown) => handleRequest(encoded),\n } satisfies EffectCfDurableObject.DurableObjectRpc<SubscriptionRuntimeServices>;\n\n const SubscriptionPartitionObject = EffectCfDurableObject.make(runtime, {\n initialize: Effect.void,\n rpc,\n alarms: alarmHandler(limits),\n });\n\n return SubscriptionPartitionObject;\n};\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
2
  import { ThreadObjectNamespace, callThreadObject } from "./CloudflareBindings.mjs";
3
3
  import { AdmissionLimitExceeded } from "./CloudflareConfig.mjs";
4
4
  import { r as safeCauseMessage, t as cloudflareFailureSignals } from "./boundary-BguazVkh.mjs";
5
- import { n as DurableAlarmError } from "./Alarm-BMEAZo3p.mjs";
5
+ import { n as DurableAlarmError } from "./Alarm-4J9B8Fg8.mjs";
6
6
  import { Receipt } from "@yielded/agent/durable-agent-runtime";
7
7
  import { AgentId, ThreadId } from "@yielded/agent/identifiers";
8
8
  import { AbortCommand, AbortIntent, AdmissionConflict, AdmissionFence, AdmissionGroup, AdmissionPolicyError, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, IdempotencyKey, JoinedToHost, LedgerError, OwnershipLost, Principal, Settlement, SettlementConflict, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent } from "@yielded/agent/submission-ledger";
@@ -327,15 +327,15 @@ const decodeLiveText = (threadId, source) => Stream.suspend(() => {
327
327
  let expected = 0;
328
328
  let streamId;
329
329
  const models = /* @__PURE__ */ new Map();
330
- const accept = (frame) => {
330
+ const accept = Effect.fnUntraced(function* (frame) {
331
331
  if (frame._tag === "Reset") {
332
- if (frame.streamId === streamId || frame.threadId !== threadId) throw liveTextProtocolFailure();
332
+ if (frame.streamId === streamId || frame.threadId !== threadId) return yield* liveTextProtocolFailure();
333
333
  streamId = frame.streamId;
334
334
  expected = 1;
335
335
  models.clear();
336
336
  return true;
337
337
  }
338
- if (streamId === void 0 || frame.streamId !== streamId || frame.sequence !== expected++ || frame.event.threadId !== threadId || !isBoundedEvent(frame.event)) throw liveTextProtocolFailure();
338
+ if (streamId === void 0 || frame.streamId !== streamId || frame.sequence !== expected++ || frame.event.threadId !== threadId || !isBoundedEvent(frame.event)) return yield* liveTextProtocolFailure();
339
339
  const event = frame.event;
340
340
  if (event._tag === "AttemptEnded") {
341
341
  for (const [key, model] of models) if (model.attemptId === event.attemptId) models.delete(key);
@@ -353,8 +353,8 @@ const decodeLiveText = (threadId, source) => Stream.suspend(() => {
353
353
  }
354
354
  let model = models.get(key);
355
355
  if (event.part.type === "text-start") {
356
- if (model?.parts.has(event.part.id)) throw liveTextProtocolFailure();
357
- if ([...models.values()].reduce((size, value) => size + value.parts.size, 0) >= 32) throw liveTextProtocolFailure();
356
+ if (model?.parts.has(event.part.id)) return yield* liveTextProtocolFailure();
357
+ if ([...models.values()].reduce((size, value) => size + value.parts.size, 0) >= 32) return yield* liveTextProtocolFailure();
358
358
  if (model === void 0) {
359
359
  model = {
360
360
  attemptId: event.attemptId,
@@ -365,13 +365,13 @@ const decodeLiveText = (threadId, source) => Stream.suspend(() => {
365
365
  model.parts.add(event.part.id);
366
366
  return true;
367
367
  }
368
- if (!model?.parts.has(event.part.id)) throw liveTextProtocolFailure();
368
+ if (!model?.parts.has(event.part.id)) return yield* liveTextProtocolFailure();
369
369
  if (event.part.type === "text-end") {
370
370
  model.parts.delete(event.part.id);
371
371
  if (model.parts.size === 0) models.delete(key);
372
372
  }
373
373
  return true;
374
- };
374
+ });
375
375
  return Stream.fromReadableStream({
376
376
  evaluate: () => source,
377
377
  releaseLockOnEnd: true,
@@ -380,26 +380,29 @@ const decodeLiveText = (threadId, source) => Stream.suspend(() => {
380
380
  message: "Provisional text disconnected; discard drafts and read canonical records",
381
381
  cause
382
382
  })
383
- }).pipe(Stream.mapEffect((chunk) => Effect.try({
384
- try: () => {
385
- if (!(chunk instanceof Uint8Array)) throw liveTextProtocolFailure();
386
- const frames = [];
387
- for (let offset = 0; offset < chunk.byteLength;) {
388
- const newline = chunk.indexOf(10, offset);
389
- const end = newline < 0 ? chunk.byteLength : newline;
390
- pendingBytes += end - offset;
391
- if (pendingBytes > 32768) throw liveTextProtocolFailure();
392
- pending += decoder.decode(chunk.subarray(offset, end), { stream: newline < 0 });
393
- offset = end + 1;
394
- if (newline < 0) break;
395
- const frame = decode(pending);
396
- pending = "";
397
- pendingBytes = 0;
398
- if (accept(frame)) frames.push(frame);
399
- }
400
- return frames;
401
- },
402
- catch: liveTextProtocolFailure
383
+ }).pipe(Stream.mapEffect(Effect.fnUntraced(function* (chunk) {
384
+ if (!(chunk instanceof Uint8Array)) return yield* liveTextProtocolFailure();
385
+ const frames = [];
386
+ for (let offset = 0; offset < chunk.byteLength;) {
387
+ const newline = chunk.indexOf(10, offset);
388
+ const end = newline < 0 ? chunk.byteLength : newline;
389
+ pendingBytes += end - offset;
390
+ if (pendingBytes > 32768) return yield* liveTextProtocolFailure();
391
+ pending += yield* Effect.try({
392
+ try: () => decoder.decode(chunk.subarray(offset, end), { stream: newline < 0 }),
393
+ catch: liveTextProtocolFailure
394
+ });
395
+ offset = end + 1;
396
+ if (newline < 0) break;
397
+ const frame = yield* Effect.try({
398
+ try: () => decode(pending),
399
+ catch: liveTextProtocolFailure
400
+ });
401
+ pending = "";
402
+ pendingBytes = 0;
403
+ if (yield* accept(frame)) frames.push(frame);
404
+ }
405
+ return frames;
403
406
  })), Stream.flatMap(Stream.fromArray), Stream.concat(Stream.fail(liveTextProtocolFailure())));
404
407
  });
405
408
  const outOfContract = (threadId, operation, observed) => ThreadClientError.make({
@@ -457,7 +460,7 @@ var CloudflareThreadClient = class CloudflareThreadClient extends Context.Servic
457
460
  return Effect.succeed(response);
458
461
  };
459
462
  };
460
- const readPage = (threadId, options) => Effect.gen(function* () {
463
+ const readPage = Effect.fnUntraced(function* (threadId, options) {
461
464
  const request = ObservePageRequest.make({
462
465
  ...options?.afterSequence === void 0 ? {} : { afterSequence: options.afterSequence },
463
466
  limit: options?.limit ?? 256
@@ -476,7 +479,7 @@ var CloudflareThreadClient = class CloudflareThreadClient extends Context.Servic
476
479
  return yield* call(receipt.threadId, operation, encoded).pipe(Effect.onInterrupt(() => cancelProgress(receipt.threadId, waiterId)));
477
480
  });
478
481
  return CloudflareThreadClient.of({
479
- submit: (agent, input, options) => Effect.gen(function* () {
482
+ submit: Effect.fnUntraced(function* (agent, input, options) {
480
483
  const encodedInput = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(Effect.mapError((cause) => AgentInputError.make({ message: `Unable to encode Agent input: ${cause.message}` })));
481
484
  const inputPayload = yield* Schema.decodeUnknownEffect(PersistedJson)(encodedInput).pipe(Effect.mapError(() => AgentInputError.make({ message: "Agent input does not satisfy the canonical persistence bounds" })));
482
485
  const request = SubmitRequest.make({
@@ -494,20 +497,20 @@ var CloudflareThreadClient = class CloudflareThreadClient extends Context.Servic
494
497
  const response = yield* call(options.threadId, "submit", encoded);
495
498
  return (yield* expect(options.threadId, "submit", SubmitSucceeded, ClientSubmitHostFailure)(response)).receipt;
496
499
  }),
497
- submissionStatus: (receipt) => Effect.gen(function* () {
500
+ submissionStatus: Effect.fnUntraced(function* (receipt) {
498
501
  const encoded = yield* encodeReceipt(receipt).pipe(Effect.mapError(() => HostProtocolError.make({ message: "Invalid receipt" })));
499
502
  const response = yield* call(receipt.threadId, "submissionStatus", encoded);
500
503
  return (yield* expect(receipt.threadId, "submissionStatus", SubmissionStatusResponse, ClientAwaitHostFailure)(response)).status;
501
504
  }),
502
- awaitSettlement: (receipt) => Effect.gen(function* () {
505
+ awaitSettlement: Effect.fnUntraced(function* (receipt) {
503
506
  const response = yield* awaitSettlementCall(receipt, "awaitSettlement");
504
507
  return (yield* expect(receipt.threadId, "awaitSettlement", SettlementReached, ClientAwaitHostFailure)(response)).settlement;
505
508
  }),
506
- awaitSettlementRecord: (receipt) => Effect.gen(function* () {
509
+ awaitSettlementRecord: Effect.fnUntraced(function* (receipt) {
507
510
  const response = yield* awaitSettlementCall(receipt, "awaitSettlementRecord");
508
511
  return (yield* expect(receipt.threadId, "awaitSettlementRecord", SettlementRecordReached, ClientAwaitHostFailure)(response)).record;
509
512
  }),
510
- awaitProgress: (threadId, afterSequence) => Effect.gen(function* () {
513
+ awaitProgress: Effect.fnUntraced(function* (threadId, afterSequence) {
511
514
  const waiterId = yield* crypto.randomUUIDv4().pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`awaitProgress cancellation identity generation failed: ${error.message}`) })));
512
515
  const request = AwaitProgressRequest.make({
513
516
  afterSequence,
@@ -563,7 +566,7 @@ var CloudflareThreadClient = class CloudflareThreadClient extends Context.Servic
563
566
  return yield* liveTextProtocolFailure();
564
567
  })),
565
568
  readPage,
566
- readAll: (threadId) => Effect.gen(function* () {
569
+ readAll: Effect.fnUntraced(function* (threadId) {
567
570
  const all = [];
568
571
  let after;
569
572
  for (;;) {
@@ -577,17 +580,17 @@ var CloudflareThreadClient = class CloudflareThreadClient extends Context.Servic
577
580
  after = last.sequence;
578
581
  }
579
582
  }),
580
- abort: (threadId, command) => Effect.gen(function* () {
583
+ abort: Effect.fnUntraced(function* (threadId, command) {
581
584
  const encoded = yield* encodeAbortCommand(command).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`abort command encode failed: ${error.message}`) })));
582
585
  const response = yield* call(threadId, "abort", encoded);
583
586
  return (yield* expect(threadId, "abort", AbortRecorded, ClientAbortHostFailure)(response)).intent;
584
587
  }),
585
- resolveApproval: (threadId, command) => Effect.gen(function* () {
588
+ resolveApproval: Effect.fnUntraced(function* (threadId, command) {
586
589
  const encoded = yield* encodeApprovalDecisionCommand(command).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`approval command encode failed: ${error.message}`) })));
587
590
  const response = yield* call(threadId, "resolveApproval", encoded);
588
591
  return (yield* expect(threadId, "resolveApproval", ApprovalRecorded, ClientApprovalHostFailure)(response)).intent;
589
592
  }),
590
- resolveUnknown: (threadId, command) => Effect.gen(function* () {
593
+ resolveUnknown: Effect.fnUntraced(function* (threadId, command) {
591
594
  const encoded = yield* encodeUnknownResolutionCommand(command).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`resolution command encode failed: ${error.message}`) })));
592
595
  const response = yield* call(threadId, "resolveUnknown", encoded);
593
596
  return (yield* expect(threadId, "resolveUnknown", UnknownResolutionRecorded, ClientUnknownHostFailure)(response)).intent;
@@ -598,4 +601,4 @@ var CloudflareThreadClient = class CloudflareThreadClient extends Context.Servic
598
601
  //#endregion
599
602
  export { decodeObservePageRequest as A, encodeObservePageRequest as B, boundHostDiagnostic as C, decodeAwaitSettlementRequest as D, decodeAwaitProgressRequest as E, encodeApprovalDecisionCommand as F, MAX_DELTA_LENGTH as G, encodeSubmitRequest as H, encodeAwaitProgressRequest as I, Request as J, MAX_DRAFT_LENGTH as K, encodeAwaitSettlementRequest as L, decodeSubmitRequest as M, decodeUnknownResolutionCommand as N, decodeCancelProgressRequest as O, encodeAbortCommand as P, encodeCancelProgressRequest as R, UnknownResolutionRecorded as S, decodeApprovalDecisionCommand as T, encodeUnknownResolutionCommand as U, encodeReceipt as V, Frame as W, cloudflareCryptoLayer as X, isBoundedEvent as Y, SettlementRecordReached as _, CancelProgressRequest as a, SubmitSucceeded as b, HostFailed as c, HostResponse as d, ObservePageRequest as f, SettlementReached as g, ProgressObserved as h, AwaitSettlementRequest as i, decodeReceipt as j, decodeHostResponse as k, HostFailure as l, ProgressCancelled as m, ApprovalRecorded as n, CloudflareThreadClient as o, ObservedPage as p, MAX_FRAME_BYTES as q, AwaitProgressRequest as r, CloudflareThreadClient_exports as s, AbortRecorded as t, HostProtocolError as u, SubmissionStatusResponse as v, decodeAbortCommand as w, ThreadClientError as x, SubmitRequest as y, encodeHostResponse as z };
600
603
 
601
- //# sourceMappingURL=CloudflareThreadClient-DgZVrZzF.mjs.map
604
+ //# sourceMappingURL=CloudflareThreadClient-DU548EEj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareThreadClient-DU548EEj.mjs","names":["LiveTextFrame","WatchTextRequest"],"sources":["../src/internal/crypto.ts","../src/internal/live-text-protocol.ts","../src/CloudflareThreadClient.ts"],"sourcesContent":["// Implement the Effect Crypto service with the Workers native hashing primitive.\n// @effect-diagnostics-next-line nodeBuiltinImport:off\nimport { createHash } from \"node:crypto\";\n\nimport { BrowserCrypto } from \"@effect/platform-browser\";\nimport { Crypto, Effect, Layer, PlatformError } from \"effect\";\n\n/** Workers use native SHA-256 while retaining BrowserCrypto's services and overrides. */\nexport const cloudflareCryptoLayer: Layer.Layer<Crypto.Crypto> = Layer.effect(\n Crypto.Crypto,\n Effect.gen(function* () {\n const base = yield* Crypto.Crypto;\n const webCrypto = yield* BrowserCrypto.WebCrypto;\n const hostGlobals: object = globalThis;\n\n return Crypto.Crypto.of({\n ...base,\n digest: (algorithm, data) => {\n if (\n algorithm !== \"SHA-256\" ||\n !(\"crypto\" in hostGlobals) ||\n webCrypto !== hostGlobals.crypto ||\n typeof webCrypto.subtle?.digest !== \"function\"\n )\n return base.digest(algorithm, data);\n\n return Effect.try({\n try: () => Uint8Array.from(createHash(\"sha256\").update(data).digest()),\n catch: (cause) =>\n PlatformError.systemError({\n module: \"Crypto\",\n method: \"digest\",\n _tag: \"Unknown\",\n description: \"Could not compute digest\",\n cause,\n }),\n });\n },\n });\n }),\n).pipe(Layer.provide(BrowserCrypto.layer));\n","import { ThreadId } from \"@yielded/agent/identifiers\";\nimport { Event } from \"@yielded/agent/provisional-text\";\nimport { Schema } from \"effect\";\n\nexport const MAX_FRAME_BYTES = 32 * 1_024;\nexport const MAX_ID_LENGTH = 256;\nexport const MAX_DELTA_LENGTH = 4_096;\nexport const BUFFER_SIZE = 32;\nexport const MAX_OBSERVERS = 8;\nexport const MAX_DRAFT_PARTS = 32;\nexport const MAX_DRAFT_LENGTH = 2 * 1_024 * 1_024;\n\nconst streamId = Schema.NonEmptyString.check(Schema.isMaxLength(MAX_ID_LENGTH));\n\nexport const Request = Schema.Struct({ schemaVersion: Schema.Literal(1) });\n\n/**\n * Reset replaces all drafts with a snapshot, streamed as native Text parts before live deltas.\n * Each snapshot starts a fresh streamId. Its sequences are unrelated to canonical sequences.\n */\nexport const Frame = Schema.Union([\n Schema.TaggedStruct(\"Reset\", {\n schemaVersion: Schema.Literal(1),\n streamId,\n threadId: ThreadId,\n sequence: Schema.Literal(0),\n }),\n Schema.TaggedStruct(\"Event\", {\n schemaVersion: Schema.Literal(1),\n streamId,\n sequence: Schema.Int.check(Schema.isGreaterThan(0)),\n event: Event,\n }),\n]);\n\nexport type Frame = typeof Frame.Type;\n\n/** Bounds are checked before queueing; provider metadata is deliberately absent. */\nexport const isBoundedEvent = (event: Event): boolean => {\n const ids: string[] = [event.threadId, event.submissionId, event.attemptId];\n\n if (event._tag !== \"AttemptEnded\") ids.push(event.runId, event.turnId);\n if (ids.some((id) => id.length > MAX_ID_LENGTH)) return false;\n\n return (\n event._tag !== \"Text\" ||\n (event.part.id.length <= MAX_ID_LENGTH &&\n Object.keys(event.part.metadata).length === 0 &&\n (event.part.type !== \"text-delta\" || event.part.delta.length <= MAX_DELTA_LENGTH))\n );\n};\n","import { AgentInputError } from \"@yielded/agent/agent-error\";\nimport { DigestError } from \"@yielded/agent/digest\";\nimport {\n Receipt,\n type DurableSubmitAgent,\n type DurableSubmitOptions,\n} from \"@yielded/agent/durable-agent-runtime\";\nimport { DurableRuntimeFailpointError } from \"@yielded/agent/durable-failpoint\";\nimport { AgentId, type ThreadId } from \"@yielded/agent/identifiers\";\nimport { InputMessage } from \"@yielded/agent/messaging\";\nimport { OperationDenied } from \"@yielded/agent/operation-authorizer\";\nimport {\n CanonicalRecordEnvelope,\n CanonicalSequence,\n DefinitionDigests,\n PersistedJson,\n SubmissionSettledRecord,\n WorkerAdmission,\n} from \"@yielded/agent/records\";\nimport {\n AdmissionFence,\n AdmissionGroup,\n AbortCommand,\n AbortIntent,\n AdmissionConflict,\n AdmissionPolicyError,\n ApprovalConflict,\n ApprovalDecisionCommand,\n ApprovalDecisionIntent,\n IdempotencyKey,\n JoinedToHost,\n LedgerError,\n OwnershipLost,\n Principal,\n Settlement,\n SettlementConflict,\n UnknownResolutionCommand,\n UnknownResolutionConflict,\n UnknownResolutionIntent,\n} from \"@yielded/agent/submission-ledger\";\nimport { SubmissionStatus } from \"@yielded/agent/submission-status\";\nimport {\n AppendConflict,\n ThreadNotMaterialized,\n ThreadStoreError,\n} from \"@yielded/agent/thread-store\";\nimport { Context, Crypto, Duration, Effect, Layer, Predicate, Schema, Stream } from \"effect\";\nimport { RpcTargets, RpcTracing } from \"effect-cf\";\n\nimport { DurableAlarmError } from \"./Alarm.ts\";\nimport {\n callThreadObject,\n ThreadObjectNamespace,\n type ThreadObjectRpc,\n} from \"./CloudflareBindings.ts\";\nimport { AdmissionLimitExceeded } from \"./CloudflareConfig.ts\";\nimport { cloudflareFailureSignals, safeCauseMessage } from \"./internal/boundary.ts\";\nimport { cloudflareCryptoLayer } from \"./internal/crypto.ts\";\nimport {\n Frame as LiveTextFrame,\n isBoundedEvent,\n MAX_DRAFT_PARTS,\n MAX_FRAME_BYTES,\n Request as WatchTextRequest,\n} from \"./internal/live-text-protocol.ts\";\n\nexport { Frame as LiveTextFrame } from \"./internal/live-text-protocol.ts\";\n\n/**\n * The Worker↔Thread-Object host protocol (plan §1.4): Schema envelopes for the host\n * entry points (`submitEncoded`, `awaitSettlementEncoded`, `observePage`, `abortEncoded`,\n * `resolveApprovalEncoded`, `resolveUnknownEncoded`) plus the Worker-side client that speaks\n * it. Mirrors the WP2 port protocol: requests and responses are closed Schema unions, typed\n * failures travel as their own tagged classes and RE-DECODE to identical tags on the caller\n * (error-tag fidelity), and protocol anomalies are answered typed instead of thrown.\n */\n\n/** Ceiling for host protocol diagnostic strings. */\nconst MAX_HOST_DIAGNOSTIC_LENGTH = 4_096;\nconst PROGRESS_CANCELLATION_TIMEOUT = \"1 second\";\n\nconst BoundedDiagnostic = Schema.String.check(Schema.isMaxLength(MAX_HOST_DIAGNOSTIC_LENGTH));\n\n/** Truncate a diagnostic string to the host protocol's bounded length. */\nexport const boundHostDiagnostic = (value: string): string =>\n value.length > MAX_HOST_DIAGNOSTIC_LENGTH\n ? `${value.slice(0, MAX_HOST_DIAGNOSTIC_LENGTH - 3)}...`\n : value;\n\n/**\n * The envelope itself could not be honored: the Object could not decode the request, or a\n * response could not be encoded/decoded. Never carries operation semantics.\n */\nexport class HostProtocolError extends Schema.TaggedError<HostProtocolError>()(\n \"HostProtocolError\",\n {\n message: BoundedDiagnostic,\n },\n) {}\n\n/** The Worker-side stub call itself failed (RPC rejection, overload, eviction mid-call). */\nexport class ThreadClientError extends Schema.TaggedError<ThreadClientError>()(\n \"ThreadClientError\",\n {\n threadId: Schema.String,\n message: Schema.String,\n cause: Schema.optionalKey(Schema.Defect()),\n /** Cloudflare's own classification for a failure safe to retry with a fresh stub. */\n retryable: Schema.optionalKey(Schema.Boolean),\n /** Cloudflare overloads are surfaced immediately instead of adding retry pressure. */\n overloaded: Schema.optionalKey(Schema.Boolean),\n },\n) {}\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\n/**\n * One durable submission, input ALREADY encoded by the caller through the Agent Binding's\n * input schema (the Worker bundles the same Agent definitions as the Object, so schema\n * validation happens client-side; the resolved Binding re-validates at claim time). The\n * Thread identity is deliberately absent — the addressed Object IS the lane.\n */\nexport class SubmitRequest extends Schema.Class<SubmitRequest>(\n \"@effect-agent/platform-cloudflare/SubmitRequest\",\n)({\n agentId: AgentId,\n principal: Principal,\n idempotencyKey: IdempotencyKey,\n admissionGroup: Schema.optionalKey(AdmissionGroup),\n admissionFence: Schema.optionalKey(AdmissionFence),\n workerAdmission: Schema.optionalKey(WorkerAdmission),\n messageAdmission: Schema.optionalKey(InputMessage),\n definitions: DefinitionDigests,\n inputPayload: PersistedJson,\n}) {}\n\n/** One bounded page of canonical records after an optional sequence. */\nexport class ObservePageRequest extends Schema.Class<ObservePageRequest>(\n \"@effect-agent/platform-cloudflare/ObservePageRequest\",\n)({\n afterSequence: Schema.optionalKey(CanonicalSequence),\n limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1_024)),\n}) {}\n\n/** Receipt-shaped observation request; the optional identity owns only the remote wait. */\nexport class AwaitSettlementRequest extends Receipt.extend<AwaitSettlementRequest>(\n \"@effect-agent/platform-cloudflare/AwaitSettlementRequest\",\n)({\n waiterId: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256))),\n}) {}\n\n/** One event-driven wait for canonical progress strictly after this sequence. */\nexport class AwaitProgressRequest extends Schema.Class<AwaitProgressRequest>(\n \"@effect-agent/platform-cloudflare/AwaitProgressRequest\",\n)({\n afterSequence: CanonicalSequence,\n waiterId: Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256)),\n}) {}\n\n/** Best-effort cancellation of one in-flight progress or settlement observation. */\nexport class CancelProgressRequest extends Schema.Class<CancelProgressRequest>(\n \"@effect-agent/platform-cloudflare/CancelProgressRequest\",\n)({\n waiterId: Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256)),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Responses\n// ---------------------------------------------------------------------------\n\n/**\n * Every typed failure a host entry point can produce, plus the protocol's own errors. Same\n * closed-union discipline as the WP2 `PortFailure`: members re-decode to the SAME tagged\n * classes on the Worker side; `cause` chains travel as Schema defects without instance\n * fidelity (plan §2.8).\n */\nexport const HostFailure = Schema.Union([\n AgentInputError,\n DigestError,\n AdmissionConflict,\n AdmissionPolicyError,\n SettlementConflict,\n ApprovalConflict,\n UnknownResolutionConflict,\n JoinedToHost,\n LedgerError,\n OwnershipLost,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n DurableRuntimeFailpointError,\n AdmissionLimitExceeded,\n DurableAlarmError,\n OperationDenied,\n HostProtocolError,\n]);\n\nexport type HostFailure = typeof HostFailure.Type;\n\nexport class SubmitSucceeded extends Schema.TaggedClass<SubmitSucceeded>(\n \"@effect-agent/platform-cloudflare/SubmitSucceeded\",\n)(\"SubmitSucceeded\", {\n receipt: Receipt,\n}) {}\n\nexport class SubmissionStatusResponse extends Schema.TaggedClass<SubmissionStatusResponse>(\n \"@effect-agent/platform-cloudflare/SubmissionStatusResponse\",\n)(\"SubmissionStatusResponse\", { status: SubmissionStatus }) {}\n\nexport class SettlementReached extends Schema.TaggedClass<SettlementReached>(\n \"@effect-agent/platform-cloudflare/SettlementReached\",\n)(\"SettlementReached\", {\n settlement: Settlement,\n}) {}\n\n/** The exact canonical record of an operationally finalized Submission. */\nexport class SettlementRecordReached extends Schema.TaggedClass<SettlementRecordReached>(\n \"@effect-agent/platform-cloudflare/SettlementRecordReached\",\n)(\"SettlementRecordReached\", {\n record: SubmissionSettledRecord,\n}) {}\n\nexport class ObservedPage extends Schema.TaggedClass<ObservedPage>(\n \"@effect-agent/platform-cloudflare/ObservedPage\",\n)(\"ObservedPage\", {\n records: Schema.Array(CanonicalRecordEnvelope).check(Schema.isMaxLength(1_024)),\n}) {}\n\n/** A record was already committed or an incarnation-local hint says the caller should re-read. */\nexport class ProgressObserved extends Schema.TaggedClass<ProgressObserved>(\n \"@effect-agent/platform-cloudflare/ProgressObserved\",\n)(\"ProgressObserved\", {}) {}\n\nexport class ProgressCancelled extends Schema.TaggedClass<ProgressCancelled>(\n \"@effect-agent/platform-cloudflare/ProgressCancelled\",\n)(\"ProgressCancelled\", {}) {}\n\nexport class AbortRecorded extends Schema.TaggedClass<AbortRecorded>(\n \"@effect-agent/platform-cloudflare/AbortRecorded\",\n)(\"AbortRecorded\", {\n intent: AbortIntent,\n}) {}\n\nexport class ApprovalRecorded extends Schema.TaggedClass<ApprovalRecorded>(\n \"@effect-agent/platform-cloudflare/ApprovalRecorded\",\n)(\"ApprovalRecorded\", {\n intent: ApprovalDecisionIntent,\n}) {}\n\nexport class UnknownResolutionRecorded extends Schema.TaggedClass<UnknownResolutionRecorded>(\n \"@effect-agent/platform-cloudflare/UnknownResolutionRecorded\",\n)(\"UnknownResolutionRecorded\", {\n intent: UnknownResolutionIntent,\n}) {}\n\n/** The entry point failed TYPED on the Object; the failure re-decodes verbatim. */\nexport class HostFailed extends Schema.TaggedClass<HostFailed>(\n \"@effect-agent/platform-cloudflare/HostFailed\",\n)(\"HostFailed\", {\n failure: HostFailure,\n}) {}\n\n/** The uniform answer of one host entry point. Callers narrow by the tag their call implies. */\nexport const HostResponse = Schema.Union([\n SubmitSucceeded,\n SettlementReached,\n SettlementRecordReached,\n SubmissionStatusResponse,\n ObservedPage,\n ProgressObserved,\n ProgressCancelled,\n AbortRecorded,\n ApprovalRecorded,\n UnknownResolutionRecorded,\n HostFailed,\n]);\n\nexport type HostResponse = typeof HostResponse.Type;\n\n// ---------------------------------------------------------------------------\n// Codecs (shared by the Object endpoints and the Worker client)\n// ---------------------------------------------------------------------------\n\nexport const decodeSubmitRequest = Schema.decodeUnknownEffect(SubmitRequest);\nexport const encodeSubmitRequest = Schema.encodeEffect(SubmitRequest);\nexport const decodeReceipt = Schema.decodeUnknownEffect(Receipt);\nexport const encodeReceipt = Schema.encodeEffect(Receipt);\nexport const decodeAwaitSettlementRequest = Schema.decodeUnknownEffect(AwaitSettlementRequest);\nexport const encodeAwaitSettlementRequest = Schema.encodeEffect(AwaitSettlementRequest);\nexport const decodeObservePageRequest = Schema.decodeUnknownEffect(ObservePageRequest);\nexport const encodeObservePageRequest = Schema.encodeEffect(ObservePageRequest);\nexport const decodeAwaitProgressRequest = Schema.decodeUnknownEffect(AwaitProgressRequest);\nexport const encodeAwaitProgressRequest = Schema.encodeEffect(AwaitProgressRequest);\nexport const decodeCancelProgressRequest = Schema.decodeUnknownEffect(CancelProgressRequest);\nexport const encodeCancelProgressRequest = Schema.encodeEffect(CancelProgressRequest);\nexport const decodeAbortCommand = Schema.decodeUnknownEffect(AbortCommand);\nexport const encodeAbortCommand = Schema.encodeEffect(AbortCommand);\nexport const decodeApprovalDecisionCommand = Schema.decodeUnknownEffect(ApprovalDecisionCommand);\nexport const encodeApprovalDecisionCommand = Schema.encodeEffect(ApprovalDecisionCommand);\nexport const decodeUnknownResolutionCommand = Schema.decodeUnknownEffect(UnknownResolutionCommand);\nexport const encodeUnknownResolutionCommand = Schema.encodeEffect(UnknownResolutionCommand);\nexport const encodeHostResponse = Schema.encodeEffect(HostResponse);\nexport const decodeHostResponse = Schema.decodeUnknownEffect(HostResponse);\n\n// ---------------------------------------------------------------------------\n// Worker-side client\n// ---------------------------------------------------------------------------\n\n/** Failure surface of `CloudflareThreadClient.submit`. */\nconst ClientSubmitHostFailure = Schema.Union([\n AgentInputError,\n DigestError,\n AdmissionConflict,\n AdmissionPolicyError,\n LedgerError,\n OwnershipLost,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n DurableRuntimeFailpointError,\n AdmissionLimitExceeded,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nconst ClientAwaitHostFailure = Schema.Union([\n LedgerError,\n OwnershipLost,\n SettlementConflict,\n OperationDenied,\n HostProtocolError,\n]);\n\nconst ClientObserveHostFailure = Schema.Union([\n ThreadStoreError,\n ThreadNotMaterialized,\n OperationDenied,\n HostProtocolError,\n]);\n\nconst ClientAbortHostFailure = Schema.Union([\n OperationDenied,\n LedgerError,\n OwnershipLost,\n SettlementConflict,\n JoinedToHost,\n DurableRuntimeFailpointError,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nconst ClientApprovalHostFailure = Schema.Union([\n LedgerError,\n OwnershipLost,\n SettlementConflict,\n ApprovalConflict,\n OperationDenied,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nconst ClientUnknownHostFailure = Schema.Union([\n LedgerError,\n OwnershipLost,\n SettlementConflict,\n UnknownResolutionConflict,\n JoinedToHost,\n DurableRuntimeFailpointError,\n OperationDenied,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nexport type ClientSubmitFailure = typeof ClientSubmitHostFailure.Type | ThreadClientError;\nexport type ClientAwaitFailure = typeof ClientAwaitHostFailure.Type | ThreadClientError;\nexport type ClientObserveFailure = typeof ClientObserveHostFailure.Type | ThreadClientError;\nexport type ClientProgressFailure = ClientObserveFailure;\nexport type ClientAbortFailure = typeof ClientAbortHostFailure.Type | ThreadClientError;\nexport type ClientApprovalFailure = typeof ClientApprovalHostFailure.Type | ThreadClientError;\nexport type ClientUnknownFailure = typeof ClientUnknownHostFailure.Type | ThreadClientError;\n\nconst liveTextProtocolFailure = () =>\n HostProtocolError.make({\n message: \"Provisional text is incomplete or invalid; discard drafts and read canonical records\",\n });\n\nconst decodeLiveText = (\n threadId: ThreadId,\n source: ReadableStream<unknown>,\n): Stream.Stream<LiveTextFrame, HostProtocolError | ThreadClientError> =>\n Stream.suspend(() => {\n const decoder = new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: false });\n const decode = Schema.decodeUnknownSync(Schema.fromJsonString(LiveTextFrame));\n let pending = \"\";\n let pendingBytes = 0;\n let expected = 0;\n let streamId: string | undefined;\n const models = new Map<string, { attemptId: string; parts: Set<string> }>();\n\n const accept = Effect.fnUntraced(function* (frame: LiveTextFrame) {\n if (frame._tag === \"Reset\") {\n if (frame.streamId === streamId || frame.threadId !== threadId)\n return yield* liveTextProtocolFailure();\n streamId = frame.streamId;\n expected = 1;\n models.clear();\n\n return true;\n }\n if (\n streamId === undefined ||\n frame.streamId !== streamId ||\n frame.sequence !== expected++ ||\n frame.event.threadId !== threadId ||\n !isBoundedEvent(frame.event)\n )\n return yield* liveTextProtocolFailure();\n const event = frame.event;\n\n if (event._tag === \"AttemptEnded\") {\n for (const [key, model] of models)\n if (model.attemptId === event.attemptId) models.delete(key);\n\n return true;\n }\n const key = JSON.stringify([event.attemptId, event.runId, event.turnId, event.generation]);\n\n if (event._tag === \"Discard\") {\n models.delete(key);\n\n return true;\n }\n let model = models.get(key);\n\n if (event.part.type === \"text-start\") {\n if (model?.parts.has(event.part.id)) return yield* liveTextProtocolFailure();\n if (\n [...models.values()].reduce((size, value) => size + value.parts.size, 0) >=\n MAX_DRAFT_PARTS\n )\n return yield* liveTextProtocolFailure();\n if (model === undefined) {\n model = { attemptId: event.attemptId, parts: new Set() };\n models.set(key, model);\n }\n model.parts.add(event.part.id);\n\n return true;\n }\n if (!model?.parts.has(event.part.id)) return yield* liveTextProtocolFailure();\n if (event.part.type === \"text-end\") {\n model.parts.delete(event.part.id);\n if (model.parts.size === 0) models.delete(key);\n }\n\n return true;\n });\n\n return Stream.fromReadableStream({\n evaluate: () => source,\n // The subscription Scope owns the single bounded cancellation after this reader unlocks.\n releaseLockOnEnd: true,\n onError: (cause) =>\n ThreadClientError.make({\n threadId,\n message: \"Provisional text disconnected; discard drafts and read canonical records\",\n cause,\n }),\n }).pipe(\n Stream.mapEffect(\n Effect.fnUntraced(function* (chunk) {\n if (!(chunk instanceof Uint8Array)) return yield* liveTextProtocolFailure();\n const frames: LiveTextFrame[] = [];\n\n for (let offset = 0; offset < chunk.byteLength;) {\n const newline = chunk.indexOf(10, offset);\n const end = newline < 0 ? chunk.byteLength : newline;\n\n pendingBytes += end - offset;\n if (pendingBytes > MAX_FRAME_BYTES) return yield* liveTextProtocolFailure();\n pending += yield* Effect.try({\n try: () => decoder.decode(chunk.subarray(offset, end), { stream: newline < 0 }),\n catch: liveTextProtocolFailure,\n });\n offset = end + 1;\n if (newline < 0) break;\n\n const frame = yield* Effect.try({\n try: () => decode(pending),\n catch: liveTextProtocolFailure,\n });\n\n pending = \"\";\n pendingBytes = 0;\n if (yield* accept(frame)) frames.push(frame);\n }\n\n return frames;\n }),\n ),\n Stream.flatMap(Stream.fromArray),\n // This connection is open-ended. Clean EOF is also loss of provisional state.\n Stream.concat(Stream.fail(liveTextProtocolFailure())),\n );\n });\n\nconst outOfContract = (threadId: string, operation: string, observed: string): ThreadClientError =>\n ThreadClientError.make({\n threadId,\n message: boundHostDiagnostic(\n `The Thread Object answered ${operation} with the out-of-contract ${observed}.`,\n ),\n });\n\nconst hostRpcMethods = {\n submit: \"submitEncoded\",\n awaitSettlement: \"awaitSettlementEncoded\",\n awaitSettlementRecord: \"awaitSettlementRecordEncoded\",\n submissionStatus: \"submissionStatusEncoded\",\n awaitProgress: \"awaitProgressEncoded\",\n cancelProgress: \"cancelProgressEncoded\",\n observePage: \"observePage\",\n abort: \"abortEncoded\",\n resolveApproval: \"resolveApprovalEncoded\",\n resolveUnknown: \"resolveUnknownEncoded\",\n} as const satisfies Record<string, keyof ThreadObjectRpc>;\n\n/** Worker-side client over the Thread Object namespace (DEPLOY-010). */\nexport class CloudflareThreadClient extends Context.Service<\n CloudflareThreadClient,\n {\n /** Encode the input client-side, then durably submit to the owning Object. */\n readonly submit: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: DurableSubmitOptions,\n ) => Effect.Effect<Receipt, ClientSubmitFailure, InputSchema[\"EncodingServices\"]>;\n /** Wake-hinted, poll-guaranteed settlement wait executed inside the owning Object. */\n readonly submissionStatus: (\n receipt: Receipt,\n ) => Effect.Effect<SubmissionStatus, ClientAwaitFailure>;\n /**\n * Wait for settlement; interruption spends at most one second cancelling the remote\n * observation best effort. Cancellation never aborts the admitted Run.\n */\n readonly awaitSettlement: (receipt: Receipt) => Effect.Effect<Settlement, ClientAwaitFailure>;\n /**\n * Wait for finalization and return this Receipt's canonical terminal record in one RPC.\n * Requires both settlement and observation authority. Decode an ordinary completed\n * record's result through the Agent output Schema; joined completion may have no result.\n * Interruption uses the same bounded observation cancellation as `awaitSettlement`.\n */\n readonly awaitSettlementRecord: (\n receipt: Receipt,\n ) => Effect.Effect<SubmissionSettledRecord, ClientAwaitFailure>;\n /**\n * Wait without polling until progress after `afterSequence` is already durable or hinted.\n * The result is deliberately void: canonical records remain authoritative and must be read.\n * Interruption waits at most one second for best-effort remote cancellation.\n */\n readonly awaitProgress: (\n threadId: ThreadId,\n afterSequence: CanonicalSequence,\n ) => Effect.Effect<void, ClientProgressFailure>;\n /**\n * Current provisional text followed by native deltas. Reset starts a replacement snapshot,\n * including when a slow consumer exceeds the fixed backlog. Reconcile by\n * Run/Turn identity to canonical records; discard drafts on Discard, AttemptEnded,\n * Reset or stream failure. Snapshots exist only in the Object incarnation's memory.\n * Scope the stream: interruption cancels its remote subscription.\n */\n readonly watchText: (threadId: ThreadId) => Stream.Stream<LiveTextFrame, ClientObserveFailure>;\n /** One bounded page of canonical records. */\n readonly readPage: (\n threadId: ThreadId,\n options?: {\n readonly afterSequence?: CanonicalSequence | undefined;\n readonly limit?: number | undefined;\n },\n ) => Effect.Effect<ReadonlyArray<CanonicalRecordEnvelope>, ClientObserveFailure>;\n /**\n * Every canonical record up to the CURRENT committed tail, via repeated pages. A\n * snapshot read, not a live observation — callers wanting liveness re-read after\n * `awaitSettlement`.\n */\n readonly readAll: (\n threadId: ThreadId,\n ) => Effect.Effect<ReadonlyArray<CanonicalRecordEnvelope>, ClientObserveFailure>;\n /**\n * Submission-addressed operations take the owning Thread explicitly (from the\n * Receipt): minted Submission identities stay OPAQUE outside the storage adapter that\n * minted them (D-P6-5), so the client never parses one to find the lane.\n */\n readonly abort: (\n threadId: ThreadId,\n command: AbortCommand,\n ) => Effect.Effect<AbortIntent, ClientAbortFailure>;\n readonly resolveApproval: (\n threadId: ThreadId,\n command: ApprovalDecisionCommand,\n ) => Effect.Effect<ApprovalDecisionIntent, ClientApprovalFailure>;\n readonly resolveUnknown: (\n threadId: ThreadId,\n command: UnknownResolutionCommand,\n ) => Effect.Effect<UnknownResolutionIntent, ClientUnknownFailure>;\n }\n>()(\"@effect-agent/platform-cloudflare/CloudflareThreadClient\") {\n /**\n * Assemble the client from a resolved namespace and the platform Crypto implementation.\n * rpcTracing is the binding name and remains opt-in. Caller authentication, principals,\n * idempotency keys, and definition digests are still explicit submission inputs.\n */\n static layerFromBinding(options: {\n readonly namespace: DurableObjectNamespace<ThreadObjectRpc>;\n readonly rpcTracing?: string;\n }): Layer.Layer<CloudflareThreadClient> {\n return CloudflareThreadClient.layer.pipe(\n Layer.provide([\n ThreadObjectNamespace.layer(options.namespace, options),\n cloudflareCryptoLayer,\n ]),\n );\n }\n\n static readonly layer: Layer.Layer<\n CloudflareThreadClient,\n never,\n ThreadObjectNamespace | Crypto.Crypto\n > = Layer.effect(CloudflareThreadClient)(\n Effect.gen(function* () {\n const namespace = yield* ThreadObjectNamespace;\n const { rpcTracing } = namespace;\n const crypto = yield* Crypto.Crypto;\n\n const call = Effect.fnUntraced(\n function* (\n threadId: ThreadId,\n operation: keyof typeof hostRpcMethods,\n encoded: unknown,\n ): Effect.fn.Return<HostResponse, ThreadClientError | HostProtocolError> {\n // Empty arguments preserve native arity. Passing `undefined` still adds an argument.\n const traceArgs =\n rpcTracing === undefined ? [] : yield* RpcTracing.withRpcTraceContext([]);\n\n const raw = yield* callThreadObject(\n threadId,\n (stub) => stub[hostRpcMethods[operation]](encoded, ...traceArgs),\n (cause) =>\n ThreadClientError.make({\n threadId,\n message: boundHostDiagnostic(\n `${operation} did not reach the Thread Object: ${safeCauseMessage(\n cause,\n \"the RPC failed without a diagnostic\",\n )}`,\n ),\n cause,\n ...cloudflareFailureSignals(cause),\n }),\n ).pipe(Effect.provideService(ThreadObjectNamespace, namespace));\n\n return yield* decodeHostResponse(raw).pipe(\n Effect.mapError((error): HostProtocolError =>\n HostProtocolError.make({\n message: boundHostDiagnostic(\n `The ${operation} answer could not be decoded: ${error.message}`,\n ),\n }),\n ),\n );\n },\n (effect, threadId, operation) =>\n rpcTracing === undefined\n ? Effect.withSpan(effect, \"CloudflareThreadClient.call\", {\n attributes: { threadId, operation },\n })\n : RpcTracing.withRpcClientSpan(effect, rpcTracing, hostRpcMethods[operation]),\n );\n\n const expect = <ResultSchema extends Schema.Top, FailureSchema extends Schema.Top>(\n threadId: string,\n operation: string,\n resultSchema: ResultSchema,\n failureSchema: FailureSchema,\n ) => {\n const isExpectedResult = Schema.is(resultSchema);\n const isExpectedFailure = Schema.is(failureSchema);\n\n return (\n response: HostResponse,\n ): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | ThreadClientError> => {\n if (response._tag === \"HostFailed\") {\n const failure = response.failure;\n\n return isExpectedFailure(failure)\n ? Effect.fail(failure)\n : Effect.fail(outOfContract(threadId, operation, `failure ${failure._tag}`));\n }\n if (!isExpectedResult(response)) {\n return Effect.fail(outOfContract(threadId, operation, `result ${response._tag}`));\n }\n\n return Effect.succeed(response);\n };\n };\n\n const readPage = Effect.fnUntraced(function* (\n threadId: ThreadId,\n options?: {\n readonly afterSequence?: CanonicalSequence | undefined;\n readonly limit?: number | undefined;\n },\n ) {\n const request = ObservePageRequest.make({\n ...(options?.afterSequence === undefined ? {} : { afterSequence: options.afterSequence }),\n limit: options?.limit ?? 256,\n });\n\n const encoded = yield* encodeObservePageRequest(request).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`observePage request encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(threadId, \"observePage\", encoded);\n\n const page = yield* expect(\n threadId,\n \"observePage\",\n ObservedPage,\n ClientObserveHostFailure,\n )(response);\n\n return page.records;\n });\n\n const cancelProgress = (threadId: ThreadId, waiterId: string): Effect.Effect<void> =>\n encodeCancelProgressRequest(CancelProgressRequest.make({ waiterId })).pipe(\n Effect.mapError(() => undefined),\n Effect.flatMap((encoded) => call(threadId, \"cancelProgress\", encoded)),\n // Finalizers are uninterruptible; only the foreign RPC branch must remain\n // interruptible so a lost cancellation reply cannot prevent local shutdown.\n Effect.interruptible,\n Effect.timeout(PROGRESS_CANCELLATION_TIMEOUT),\n Effect.asVoid,\n Effect.ignore,\n );\n\n const awaitSettlementCall = Effect.fnUntraced(function* (\n receipt: Receipt,\n operation: \"awaitSettlement\" | \"awaitSettlementRecord\",\n ): Effect.fn.Return<HostResponse, ClientAwaitFailure> {\n const waiterId = yield* crypto.randomUUIDv4().pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(\n `${operation} cancellation identity generation failed: ${error.message}`,\n ),\n }),\n ),\n );\n\n const encoded = yield* encodeAwaitSettlementRequest(\n AwaitSettlementRequest.make({ ...receipt, waiterId }),\n ).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`${operation} request encode failed: ${error.message}`),\n }),\n ),\n );\n\n return yield* call(receipt.threadId, operation, encoded).pipe(\n Effect.onInterrupt(() => cancelProgress(receipt.threadId, waiterId)),\n );\n });\n\n return CloudflareThreadClient.of({\n submit: Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: DurableSubmitOptions,\n ) {\n // Client-side half of `DurableAgentRuntime.submit`'s input boundary: encode\n // through the Agent's input schema and prove the canonical persistence bounds.\n const encodedInput = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(\n Effect.mapError((cause) =>\n AgentInputError.make({ message: `Unable to encode Agent input: ${cause.message}` }),\n ),\n );\n\n const inputPayload = yield* Schema.decodeUnknownEffect(PersistedJson)(encodedInput).pipe(\n Effect.mapError(() =>\n AgentInputError.make({\n message: \"Agent input does not satisfy the canonical persistence bounds\",\n }),\n ),\n );\n\n const request = SubmitRequest.make({\n agentId: agent.definition.id,\n principal: options.principal,\n idempotencyKey: options.idempotencyKey,\n ...(options.admissionGroup === undefined\n ? {}\n : { admissionGroup: options.admissionGroup }),\n ...(options.admissionFence === undefined\n ? {}\n : { admissionFence: options.admissionFence }),\n ...(options.workerAdmission === undefined\n ? {}\n : { workerAdmission: options.workerAdmission }),\n ...(options.messageAdmission === undefined\n ? {}\n : { messageAdmission: options.messageAdmission }),\n definitions: options.definitions,\n inputPayload,\n });\n\n const encoded = yield* encodeSubmitRequest(request).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`submit request encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(options.threadId, \"submit\", encoded);\n\n const succeeded = yield* expect(\n options.threadId,\n \"submit\",\n SubmitSucceeded,\n ClientSubmitHostFailure,\n )(response);\n\n return succeeded.receipt;\n }),\n\n submissionStatus: Effect.fnUntraced(function* (receipt) {\n const encoded = yield* encodeReceipt(receipt).pipe(\n Effect.mapError(() => HostProtocolError.make({ message: \"Invalid receipt\" })),\n );\n\n const response = yield* call(receipt.threadId, \"submissionStatus\", encoded);\n\n const result = yield* expect(\n receipt.threadId,\n \"submissionStatus\",\n SubmissionStatusResponse,\n ClientAwaitHostFailure,\n )(response);\n\n return result.status;\n }),\n awaitSettlement: Effect.fnUntraced(function* (receipt) {\n const response = yield* awaitSettlementCall(receipt, \"awaitSettlement\");\n\n const settled = yield* expect(\n receipt.threadId,\n \"awaitSettlement\",\n SettlementReached,\n ClientAwaitHostFailure,\n )(response);\n\n return settled.settlement;\n }),\n\n awaitSettlementRecord: Effect.fnUntraced(function* (receipt) {\n const response = yield* awaitSettlementCall(receipt, \"awaitSettlementRecord\");\n\n const settled = yield* expect(\n receipt.threadId,\n \"awaitSettlementRecord\",\n SettlementRecordReached,\n ClientAwaitHostFailure,\n )(response);\n\n return settled.record;\n }),\n\n awaitProgress: Effect.fnUntraced(function* (threadId, afterSequence) {\n const waiterId = yield* crypto.randomUUIDv4().pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(\n `awaitProgress cancellation identity generation failed: ${error.message}`,\n ),\n }),\n ),\n );\n\n const request = AwaitProgressRequest.make({ afterSequence, waiterId });\n\n const encoded = yield* encodeAwaitProgressRequest(request).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(\n `awaitProgress request encode failed: ${error.message}`,\n ),\n }),\n ),\n );\n\n const attempt = (retry: number): Effect.Effect<void, ClientProgressFailure> =>\n call(threadId, \"awaitProgress\", encoded).pipe(\n Effect.flatMap(\n expect(threadId, \"awaitProgress\", ProgressObserved, ClientObserveHostFailure),\n ),\n Effect.asVoid,\n Effect.catchTag(\"ThreadClientError\", (error) =>\n error.retryable === true && error.overloaded !== true && retry < 5\n ? Effect.sleep(Duration.millis(10 * 2 ** retry)).pipe(\n Effect.andThen(attempt(retry + 1)),\n )\n : Effect.fail(error),\n ),\n );\n\n yield* attempt(0).pipe(Effect.onInterrupt(() => cancelProgress(threadId, waiterId)));\n }),\n\n watchText: (threadId) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const traceArgs =\n rpcTracing === undefined ? [] : yield* RpcTracing.withRpcTraceContext([]);\n\n const openingFailure = (cause: unknown) =>\n ThreadClientError.make({\n threadId,\n message: \"Provisional text observation could not reach the Thread Object\",\n cause,\n ...cloudflareFailureSignals(cause),\n });\n\n // Retain the original RPC promise: resolving through callThreadObject would\n // erase its optional native disposer before an interrupted opening can use it.\n const target = yield* RpcTargets.get(namespace, threadId, () =>\n namespace.get(threadId),\n ).pipe(Effect.mapError(openingFailure));\n\n let request: Promise<unknown> | undefined;\n let received: unknown;\n let closed = false;\n\n const cancel = () => {\n const value = received;\n\n received = undefined;\n\n return value instanceof ReadableStream && !value.locked\n ? value.cancel().catch(() => undefined)\n : Promise.resolve();\n };\n\n // Install ownership before invoking foreign code, not after its promise settles.\n yield* Effect.addFinalizer(() =>\n Effect.try({\n try: () => {\n closed = true;\n if (Predicate.hasProperty(request, Symbol.dispose)) {\n const dispose = request[Symbol.dispose];\n\n if (typeof dispose === \"function\") dispose.call(request);\n }\n },\n catch: () => undefined,\n }).pipe(\n Effect.ignore,\n Effect.andThen(\n Effect.tryPromise({ try: cancel, catch: () => undefined }).pipe(\n Effect.interruptible,\n Effect.timeout(PROGRESS_CANCELLATION_TIMEOUT),\n Effect.ignore,\n ),\n ),\n ),\n );\n\n const raw = yield* Effect.tryPromise({\n try: () => {\n request = target.watchTextEncoded(\n Schema.encodeSync(WatchTextRequest)({ schemaVersion: 1 }),\n ...traceArgs,\n );\n\n return request.then((value) => {\n received = value;\n\n // A custom endpoint may return a plain, non-cancellable promise. Keep\n // late cleanup on that native promise chain; it starts no Effect fiber.\n return closed ? cancel().then(() => value) : value;\n });\n },\n catch: openingFailure,\n }).pipe(\n Effect.interruptible,\n Effect.tapCause(() => RpcTargets.invalidate(target)),\n );\n\n if (raw instanceof ReadableStream) return decodeLiveText(threadId, raw);\n\n const response = yield* decodeHostResponse(raw).pipe(\n Effect.mapError(liveTextProtocolFailure),\n );\n\n if (\n response._tag === \"HostFailed\" &&\n Schema.is(ClientObserveHostFailure)(response.failure)\n )\n return yield* response.failure;\n\n return yield* liveTextProtocolFailure();\n }),\n ),\n\n readPage,\n\n readAll: Effect.fnUntraced(function* (threadId) {\n const all: Array<CanonicalRecordEnvelope> = [];\n let after: CanonicalSequence | undefined;\n\n for (;;) {\n const page = yield* readPage(threadId, { afterSequence: after, limit: 1_024 });\n\n all.push(...page);\n const last = page.at(-1);\n\n if (page.length < 1_024 || last === undefined) return all;\n after = last.sequence;\n }\n }),\n\n abort: Effect.fnUntraced(function* (threadId, command) {\n const encoded = yield* encodeAbortCommand(command).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`abort command encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(threadId, \"abort\", encoded);\n\n const recorded = yield* expect(\n threadId,\n \"abort\",\n AbortRecorded,\n ClientAbortHostFailure,\n )(response);\n\n return recorded.intent;\n }),\n\n resolveApproval: Effect.fnUntraced(function* (threadId, command) {\n const encoded = yield* encodeApprovalDecisionCommand(command).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`approval command encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(threadId, \"resolveApproval\", encoded);\n\n const recorded = yield* expect(\n threadId,\n \"resolveApproval\",\n ApprovalRecorded,\n ClientApprovalHostFailure,\n )(response);\n\n return recorded.intent;\n }),\n\n resolveUnknown: Effect.fnUntraced(function* (threadId, command) {\n const encoded = yield* encodeUnknownResolutionCommand(command).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`resolution command encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(threadId, \"resolveUnknown\", encoded);\n\n const recorded = yield* expect(\n threadId,\n \"resolveUnknown\",\n UnknownResolutionRecorded,\n ClientUnknownHostFailure,\n )(response);\n\n return recorded.intent;\n }),\n });\n }),\n );\n}\n"],"mappings":"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"}