@effect-agent/platform-cloudflare 0.1.0-beta.26 → 0.1.0-beta.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-quick-action.d.mts +68 -0
- package/dist/browser-quick-action.mjs +303 -0
- package/dist/browser-quick-action.mjs.map +1 -0
- package/dist/index.d.mts +100 -7
- package/dist/index.mjs +4 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -8
- package/src/browser-quick-action.ts +514 -0
- package/src/index.ts +1 -0
- package/src/layers.ts +6 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Schema } from "effect";
|
|
2
|
+
import { PageCapture, PageCaptureRequest, SandboxImplementation } from "@effect-agent/sandbox";
|
|
3
|
+
//#region src/browser-quick-action.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* The Cloudflare Browser Run Quick Action `PageCapture` adapter (capability
|
|
6
|
+
* spec §9.2). Each capture is one stateless `quickAction()` RPC on the
|
|
7
|
+
* Wrangler `browser` binding: the platform renders the target in a managed
|
|
8
|
+
* headless browser and returns one bounded output; the adapter holds no
|
|
9
|
+
* session and no state between passes. The binding requires a Worker
|
|
10
|
+
* compatibility date of `2026-03-24` or later, and local `wrangler dev` needs
|
|
11
|
+
* remote mode (`"remote": true` on the binding) because `quickAction` has no
|
|
12
|
+
* local implementation.
|
|
13
|
+
*
|
|
14
|
+
* Rendered output is untrusted, attacker-influenced content; this adapter
|
|
15
|
+
* only bounds and types it. Deployment class `E` only: no durability claim.
|
|
16
|
+
*/
|
|
17
|
+
declare const browserQuickActionImplementation: SandboxImplementation;
|
|
18
|
+
/**
|
|
19
|
+
* Effect-native client captured by the binding service. Its option types come
|
|
20
|
+
* directly from the pinned Workers declarations rather than a local copy.
|
|
21
|
+
*/
|
|
22
|
+
interface BrowserQuickActionClient {
|
|
23
|
+
readonly content: (options: BrowserRunContentOptions) => Effect.Effect<Response, BrowserQuickActionRpcError>;
|
|
24
|
+
readonly markdown: (options: BrowserRunMarkdownOptions) => Effect.Effect<Response, BrowserQuickActionRpcError>;
|
|
25
|
+
readonly links: (options: BrowserRunLinksOptions) => Effect.Effect<Response, BrowserQuickActionRpcError>;
|
|
26
|
+
readonly json: (options: BrowserRunJsonOptions) => Effect.Effect<Response, BrowserQuickActionRpcError>;
|
|
27
|
+
}
|
|
28
|
+
declare const BrowserQuickActionRpcError_base: Schema.Class<BrowserQuickActionRpcError, Schema.TaggedStruct<"BrowserQuickActionRpcError", {
|
|
29
|
+
readonly action: Schema.Literals<readonly ["content", "markdown", "links", "json"]>;
|
|
30
|
+
readonly cause: Schema.Defect;
|
|
31
|
+
}>, import("effect/Cause").YieldableError>;
|
|
32
|
+
/** A native binding RPC rejected before it returned an HTTP response. */
|
|
33
|
+
declare class BrowserQuickActionRpcError extends BrowserQuickActionRpcError_base {}
|
|
34
|
+
interface BrowserQuickActionCaptureOptions {
|
|
35
|
+
/** The resolved Wrangler `browser` binding (DEPLOY-014: supplied, never ambient). */
|
|
36
|
+
readonly browser: BrowserRun;
|
|
37
|
+
}
|
|
38
|
+
declare const BrowserQuickActionBrowserBinding_base: Context.ServiceClass<BrowserQuickActionBrowserBinding, "@effect-agent/platform-cloudflare/BrowserQuickActionBrowserBinding", BrowserQuickActionClient>;
|
|
39
|
+
/** Host-owned browser binding authority, supplied explicitly at the composition root. */
|
|
40
|
+
declare class BrowserQuickActionBrowserBinding extends BrowserQuickActionBrowserBinding_base {
|
|
41
|
+
static layer(options: BrowserQuickActionCaptureOptions): Layer.Layer<BrowserQuickActionBrowserBinding>;
|
|
42
|
+
}
|
|
43
|
+
/** Host-owned authorization and accounting for one Workers AI extraction. */
|
|
44
|
+
interface BrowserQuickActionWorkersAiPolicy {
|
|
45
|
+
readonly authorizeAndAccount: (request: PageCaptureRequest) => Effect.Effect<void, BrowserQuickActionWorkersAiPolicyError>;
|
|
46
|
+
}
|
|
47
|
+
declare const BrowserQuickActionWorkersAiPolicyError_base: Schema.Class<BrowserQuickActionWorkersAiPolicyError, Schema.TaggedStruct<"BrowserQuickActionWorkersAiPolicyError", {
|
|
48
|
+
readonly reason: Schema.Literals<readonly ["authorization", "accounting"]>;
|
|
49
|
+
readonly message: Schema.String;
|
|
50
|
+
readonly cause: Schema.optionalKey<Schema.Defect>;
|
|
51
|
+
}>, import("effect/Cause").YieldableError>;
|
|
52
|
+
/** Host-only diagnostic for a denied or unaccounted Workers AI extraction. */
|
|
53
|
+
declare class BrowserQuickActionWorkersAiPolicyError extends BrowserQuickActionWorkersAiPolicyError_base {}
|
|
54
|
+
declare const BrowserQuickActionWorkersAi_base: Context.ServiceClass<BrowserQuickActionWorkersAi, "@effect-agent/platform-cloudflare/BrowserQuickActionWorkersAi", BrowserQuickActionWorkersAiPolicy>;
|
|
55
|
+
/** Explicit host-owned authority and accounting for separately billed Workers AI extraction. */
|
|
56
|
+
declare class BrowserQuickActionWorkersAi extends BrowserQuickActionWorkersAi_base {
|
|
57
|
+
static layer(policy: BrowserQuickActionWorkersAiPolicy): Layer.Layer<BrowserQuickActionWorkersAi>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Ordinary Quick Actions require host-owned browser binding authority. Workers
|
|
61
|
+
* AI stays unavailable unless the host deliberately selects its separate Layer.
|
|
62
|
+
*/
|
|
63
|
+
declare const browserQuickActionCaptureLayer: () => Layer.Layer<PageCapture, never, BrowserQuickActionBrowserBinding>;
|
|
64
|
+
/** Structured Quick Actions require host-owned browser and Workers AI authority. */
|
|
65
|
+
declare const browserQuickActionWorkersAiCaptureLayer: () => Layer.Layer<PageCapture, never, BrowserQuickActionBrowserBinding | BrowserQuickActionWorkersAi>;
|
|
66
|
+
//#endregion
|
|
67
|
+
export { BrowserQuickActionBrowserBinding, BrowserQuickActionCaptureOptions, BrowserQuickActionClient, BrowserQuickActionRpcError, BrowserQuickActionWorkersAi, BrowserQuickActionWorkersAiPolicy, BrowserQuickActionWorkersAiPolicyError, browserQuickActionCaptureLayer, browserQuickActionImplementation, browserQuickActionWorkersAiCaptureLayer };
|
|
68
|
+
//# sourceMappingURL=browser-quick-action.d.mts.map
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Option, Schema } from "effect";
|
|
2
|
+
import { PageCapture, PageCaptureInferencePolicyError, PageCaptureInferenceUse, PageCaptureNavigationError, PageCaptureOutputLimitError, PageCaptureProtocolError, PageCaptureRateLimitedError, PageCaptureResourceUse, PageCaptureResult, PageCaptureUnsupportedError, PageContentCaptured, PageLinksCaptured, PageMarkdownCaptured, PageStructuredCaptured, SandboxImplementation } from "@effect-agent/sandbox";
|
|
3
|
+
//#region src/browser-quick-action.ts
|
|
4
|
+
/**
|
|
5
|
+
* The Cloudflare Browser Run Quick Action `PageCapture` adapter (capability
|
|
6
|
+
* spec §9.2). Each capture is one stateless `quickAction()` RPC on the
|
|
7
|
+
* Wrangler `browser` binding: the platform renders the target in a managed
|
|
8
|
+
* headless browser and returns one bounded output; the adapter holds no
|
|
9
|
+
* session and no state between passes. The binding requires a Worker
|
|
10
|
+
* compatibility date of `2026-03-24` or later, and local `wrangler dev` needs
|
|
11
|
+
* remote mode (`"remote": true` on the binding) because `quickAction` has no
|
|
12
|
+
* local implementation.
|
|
13
|
+
*
|
|
14
|
+
* Rendered output is untrusted, attacker-influenced content; this adapter
|
|
15
|
+
* only bounds and types it. Deployment class `E` only: no durability claim.
|
|
16
|
+
*/
|
|
17
|
+
const browserQuickActionImplementation = SandboxImplementation.make({
|
|
18
|
+
isolation: "isolated",
|
|
19
|
+
identity: "cloudflare-browser-quick-action"
|
|
20
|
+
});
|
|
21
|
+
/** A native binding RPC rejected before it returned an HTTP response. */
|
|
22
|
+
var BrowserQuickActionRpcError = class extends Schema.TaggedError()("BrowserQuickActionRpcError", {
|
|
23
|
+
action: Schema.Literals([
|
|
24
|
+
"content",
|
|
25
|
+
"markdown",
|
|
26
|
+
"links",
|
|
27
|
+
"json"
|
|
28
|
+
]),
|
|
29
|
+
cause: Schema.Defect()
|
|
30
|
+
}) {};
|
|
31
|
+
/** Host-owned browser binding authority, supplied explicitly at the composition root. */
|
|
32
|
+
var BrowserQuickActionBrowserBinding = class BrowserQuickActionBrowserBinding extends Context.Service()("@effect-agent/platform-cloudflare/BrowserQuickActionBrowserBinding") {
|
|
33
|
+
static layer(options) {
|
|
34
|
+
const browser = options.browser;
|
|
35
|
+
const invoke = Effect.fn("BrowserQuickActionBrowserBinding.invoke")(function* (action, evaluate) {
|
|
36
|
+
return yield* Effect.tryPromise({
|
|
37
|
+
try: evaluate,
|
|
38
|
+
catch: (cause) => BrowserQuickActionRpcError.make({
|
|
39
|
+
action,
|
|
40
|
+
cause
|
|
41
|
+
})
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
return Layer.succeed(BrowserQuickActionBrowserBinding)({
|
|
45
|
+
content: (request) => invoke("content", () => browser.quickAction("content", request)),
|
|
46
|
+
markdown: (request) => invoke("markdown", () => browser.quickAction("markdown", request)),
|
|
47
|
+
links: (request) => invoke("links", () => browser.quickAction("links", request)),
|
|
48
|
+
json: (request) => invoke("json", () => browser.quickAction("json", request))
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
/** Host-only diagnostic for a denied or unaccounted Workers AI extraction. */
|
|
53
|
+
var BrowserQuickActionWorkersAiPolicyError = class extends Schema.TaggedError()("BrowserQuickActionWorkersAiPolicyError", {
|
|
54
|
+
reason: Schema.Literals(["authorization", "accounting"]),
|
|
55
|
+
message: Schema.String.check(Schema.isMaxLength(8e3)),
|
|
56
|
+
cause: Schema.optionalKey(Schema.Defect())
|
|
57
|
+
}) {};
|
|
58
|
+
/** Explicit host-owned authority and accounting for separately billed Workers AI extraction. */
|
|
59
|
+
var BrowserQuickActionWorkersAi = class BrowserQuickActionWorkersAi extends Context.Service()("@effect-agent/platform-cloudflare/BrowserQuickActionWorkersAi") {
|
|
60
|
+
static layer(policy) {
|
|
61
|
+
return Layer.succeed(BrowserQuickActionWorkersAi)(policy);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const MAX_DIAGNOSTIC_LENGTH = 8e3;
|
|
65
|
+
const boundedDiagnostic = (message) => message.slice(0, MAX_DIAGNOSTIC_LENGTH);
|
|
66
|
+
const QuickActionSuccessEnvelope = Schema.Struct({
|
|
67
|
+
success: Schema.Literal(true),
|
|
68
|
+
result: Schema.Json
|
|
69
|
+
});
|
|
70
|
+
const QuickActionErrorEnvelope = Schema.Struct({
|
|
71
|
+
success: Schema.Literal(false),
|
|
72
|
+
errors: Schema.Array(Schema.Struct({
|
|
73
|
+
message: Schema.String,
|
|
74
|
+
code: Schema.optionalKey(Schema.Number),
|
|
75
|
+
detail: Schema.optionalKey(Schema.String),
|
|
76
|
+
path: Schema.optionalKey(Schema.String)
|
|
77
|
+
})),
|
|
78
|
+
rawAiResponse: Schema.optionalKey(Schema.String)
|
|
79
|
+
});
|
|
80
|
+
const QuickActionEnvelope = Schema.Union([QuickActionSuccessEnvelope, QuickActionErrorEnvelope]);
|
|
81
|
+
const decodeEnvelope = Schema.decodeUnknownOption(Schema.fromJsonString(QuickActionEnvelope));
|
|
82
|
+
/** Project the schema-validated request onto Cloudflare's native common options. */
|
|
83
|
+
const quickActionCommonOptions = (request) => {
|
|
84
|
+
const options = {};
|
|
85
|
+
const navigation = request.navigation;
|
|
86
|
+
if (navigation !== void 0) {
|
|
87
|
+
const goto = {};
|
|
88
|
+
if (navigation.waitUntil !== void 0) goto.waitUntil = navigation.waitUntil;
|
|
89
|
+
if (navigation.timeoutMillis !== void 0) goto.timeout = navigation.timeoutMillis;
|
|
90
|
+
if (Object.keys(goto).length > 0) options.gotoOptions = goto;
|
|
91
|
+
if (navigation.waitForSelector !== void 0) options.waitForSelector = {
|
|
92
|
+
selector: navigation.waitForSelector.selector,
|
|
93
|
+
...navigation.waitForSelector.timeoutMillis === void 0 ? {} : { timeout: navigation.waitForSelector.timeoutMillis }
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (request.viewport !== void 0) options.viewport = {
|
|
97
|
+
width: request.viewport.width,
|
|
98
|
+
height: request.viewport.height
|
|
99
|
+
};
|
|
100
|
+
if (request.resourcePolicy !== void 0) {
|
|
101
|
+
if (request.resourcePolicy.rejectResourceTypes !== void 0) options.rejectResourceTypes = [...request.resourcePolicy.rejectResourceTypes];
|
|
102
|
+
if (request.resourcePolicy.allowRequestPatterns !== void 0) options.allowRequestPattern = [...request.resourcePolicy.allowRequestPatterns];
|
|
103
|
+
}
|
|
104
|
+
return request.target._tag === "PageUrlTarget" ? {
|
|
105
|
+
...options,
|
|
106
|
+
url: request.target.url
|
|
107
|
+
} : {
|
|
108
|
+
...options,
|
|
109
|
+
html: request.target.html
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
/** Dispatch through Cloudflare's native action-specific overloads. */
|
|
113
|
+
const executeQuickAction = (browser, request) => {
|
|
114
|
+
const options = quickActionCommonOptions(request);
|
|
115
|
+
switch (request.action._tag) {
|
|
116
|
+
case "CapturePageContent": return browser.content(options);
|
|
117
|
+
case "CapturePageMarkdown": return browser.markdown(options);
|
|
118
|
+
case "CapturePageLinks": return browser.links({
|
|
119
|
+
...options,
|
|
120
|
+
...request.action.visibleLinksOnly === void 0 ? {} : { visibleLinksOnly: request.action.visibleLinksOnly }
|
|
121
|
+
});
|
|
122
|
+
case "CapturePageStructured": return browser.json({
|
|
123
|
+
...options,
|
|
124
|
+
response_format: {
|
|
125
|
+
type: "json_schema",
|
|
126
|
+
json_schema: request.action.responseFormat
|
|
127
|
+
},
|
|
128
|
+
...request.action.prompt === void 0 ? {} : { prompt: request.action.prompt }
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const protocolError = (message, cause) => PageCaptureProtocolError.make({
|
|
133
|
+
implementation: browserQuickActionImplementation,
|
|
134
|
+
message: boundedDiagnostic(message),
|
|
135
|
+
...cause === void 0 ? {} : { cause }
|
|
136
|
+
});
|
|
137
|
+
const navigationError = (message, cause) => PageCaptureNavigationError.make({
|
|
138
|
+
implementation: browserQuickActionImplementation,
|
|
139
|
+
message: boundedDiagnostic(message),
|
|
140
|
+
...cause === void 0 ? {} : { cause }
|
|
141
|
+
});
|
|
142
|
+
/** Preserve bounded remote diagnostics for the host without exposing their text to a model. */
|
|
143
|
+
const privateResponseCause = (bodyText) => bodyText.length === 0 ? void 0 : new Error(boundedDiagnostic(bodyText));
|
|
144
|
+
const releaseResponseReader = (reader) => Effect.tryPromise({
|
|
145
|
+
try: () => reader.cancel(),
|
|
146
|
+
catch: (cause) => protocolError("Canceling the Quick Action response failed", cause)
|
|
147
|
+
}).pipe(Effect.catch((error) => Effect.logWarning(error.message)), Effect.ensuring(Effect.try({
|
|
148
|
+
try: () => reader.releaseLock(),
|
|
149
|
+
catch: (cause) => protocolError("Releasing the Quick Action response failed", cause)
|
|
150
|
+
}).pipe(Effect.catch((error) => Effect.logWarning(error.message)))));
|
|
151
|
+
const readBoundedResponse = Effect.fn("BrowserQuickActionCapture.readResponse")(function* (response, request) {
|
|
152
|
+
const body = response.body;
|
|
153
|
+
if (body === null) return "";
|
|
154
|
+
const reader = yield* Effect.acquireRelease(Effect.try({
|
|
155
|
+
try: () => body.getReader(),
|
|
156
|
+
catch: (cause) => protocolError("Opening the Quick Action response failed", cause)
|
|
157
|
+
}), releaseResponseReader);
|
|
158
|
+
const decoder = new TextDecoder("utf-8", {
|
|
159
|
+
fatal: true,
|
|
160
|
+
ignoreBOM: false
|
|
161
|
+
});
|
|
162
|
+
let observedBytes = 0;
|
|
163
|
+
let bodyText = "";
|
|
164
|
+
while (true) {
|
|
165
|
+
const chunk = yield* Effect.tryPromise({
|
|
166
|
+
try: () => reader.read(),
|
|
167
|
+
catch: (cause) => protocolError("Reading the Quick Action response failed", cause)
|
|
168
|
+
});
|
|
169
|
+
if (chunk.done) break;
|
|
170
|
+
observedBytes += chunk.value.byteLength;
|
|
171
|
+
if (observedBytes > request.limits.maxOutputBytes) return yield* PageCaptureOutputLimitError.make({
|
|
172
|
+
implementation: browserQuickActionImplementation,
|
|
173
|
+
limit: request.limits.maxOutputBytes,
|
|
174
|
+
observed: observedBytes
|
|
175
|
+
});
|
|
176
|
+
bodyText += yield* Effect.try({
|
|
177
|
+
try: () => decoder.decode(chunk.value, { stream: true }),
|
|
178
|
+
catch: (cause) => protocolError("Decoding the Quick Action response failed", cause)
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return bodyText + (yield* Effect.try({
|
|
182
|
+
try: () => decoder.decode(),
|
|
183
|
+
catch: (cause) => protocolError("Decoding the Quick Action response failed", cause)
|
|
184
|
+
}));
|
|
185
|
+
}, Effect.scoped);
|
|
186
|
+
/**
|
|
187
|
+
* Retry-After arrives in whole seconds; a non-integer form (an HTTP date) is
|
|
188
|
+
* dropped rather than guessed at.
|
|
189
|
+
*/
|
|
190
|
+
const retryAfterMillis = (response) => {
|
|
191
|
+
const header = response.headers.get("Retry-After");
|
|
192
|
+
if (header === null) return void 0;
|
|
193
|
+
const seconds = Number(header);
|
|
194
|
+
if (!Number.isSafeInteger(seconds) || seconds < 0) return void 0;
|
|
195
|
+
const millis = seconds * 1e3;
|
|
196
|
+
return Number.isSafeInteger(millis) ? millis : void 0;
|
|
197
|
+
};
|
|
198
|
+
const browserMillis = (response) => {
|
|
199
|
+
const header = response.headers.get("X-Browser-Ms-Used");
|
|
200
|
+
if (header === null) return void 0;
|
|
201
|
+
const millis = Number(header);
|
|
202
|
+
return Number.isSafeInteger(millis) && millis >= 0 ? millis : void 0;
|
|
203
|
+
};
|
|
204
|
+
/** Only trusted response metadata chooses transport framing; page text never does. */
|
|
205
|
+
const isJsonResponse = (response) => {
|
|
206
|
+
const contentType = response.headers.get("Content-Type");
|
|
207
|
+
if (contentType === null) return false;
|
|
208
|
+
const mediaType = contentType.split(";", 1)[0]?.trim().toLowerCase();
|
|
209
|
+
return mediaType === "application/json" || mediaType?.endsWith("+json") === true;
|
|
210
|
+
};
|
|
211
|
+
const parseOutput = (action, bodyText, response) => {
|
|
212
|
+
if (!isJsonResponse(response)) return protocolError("The Quick Action success response was not a JSON response envelope", privateResponseCause(bodyText));
|
|
213
|
+
const envelope = decodeEnvelope(bodyText);
|
|
214
|
+
if (Option.isNone(envelope)) return protocolError("The JSON Quick Action response did not carry a valid response envelope", privateResponseCause(bodyText));
|
|
215
|
+
if (!envelope.value.success) return navigationError("The Quick Action reported a navigation failure", privateResponseCause(bodyText));
|
|
216
|
+
switch (action._tag) {
|
|
217
|
+
case "CapturePageContent":
|
|
218
|
+
case "CapturePageMarkdown":
|
|
219
|
+
if (typeof envelope.value.result !== "string") return protocolError("The Quick Action envelope carried a non-text result");
|
|
220
|
+
return action._tag === "CapturePageContent" ? PageContentCaptured.make({ html: envelope.value.result }) : PageMarkdownCaptured.make({ markdown: envelope.value.result });
|
|
221
|
+
case "CapturePageLinks": {
|
|
222
|
+
const decoded = Schema.decodeUnknownOption(PageLinksCaptured)({
|
|
223
|
+
_tag: "PageLinksCaptured",
|
|
224
|
+
links: envelope.value.result
|
|
225
|
+
});
|
|
226
|
+
if (Option.isNone(decoded)) return protocolError("The links Quick Action did not return a bounded array of valid URLs");
|
|
227
|
+
return decoded.value;
|
|
228
|
+
}
|
|
229
|
+
case "CapturePageStructured": return PageStructuredCaptured.make({ value: envelope.value.result });
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
const isQuotaMessage = (text) => /time limit|daily|quota/i.test(text);
|
|
233
|
+
const makeCapture = (browser, workersAi) => Effect.fn("BrowserQuickActionCapture.capture")(function* (request) {
|
|
234
|
+
if (request.engine !== "chromium") return yield* PageCaptureUnsupportedError.make({
|
|
235
|
+
implementation: browserQuickActionImplementation,
|
|
236
|
+
feature: "engine",
|
|
237
|
+
message: "The browser binding's quickAction() exposes no engine selector; kitesurf requires the REST or CDP surface"
|
|
238
|
+
});
|
|
239
|
+
const usesWorkersAi = request.action._tag === "CapturePageStructured";
|
|
240
|
+
if (usesWorkersAi) {
|
|
241
|
+
if (workersAi === void 0) return yield* PageCaptureUnsupportedError.make({
|
|
242
|
+
implementation: browserQuickActionImplementation,
|
|
243
|
+
feature: "action",
|
|
244
|
+
message: "Structured capture invokes separately billed Workers AI and requires an explicit authorization and accounting policy"
|
|
245
|
+
});
|
|
246
|
+
yield* workersAi.authorizeAndAccount(request).pipe(Effect.mapError((cause) => PageCaptureInferencePolicyError.make({
|
|
247
|
+
implementation: browserQuickActionImplementation,
|
|
248
|
+
provider: "cloudflare-workers-ai",
|
|
249
|
+
reason: cause.reason,
|
|
250
|
+
message: cause.reason === "authorization" ? "Workers AI extraction was not authorized" : "Workers AI extraction could not be accounted for",
|
|
251
|
+
cause
|
|
252
|
+
})));
|
|
253
|
+
}
|
|
254
|
+
const response = yield* executeQuickAction(browser, request).pipe(Effect.mapError((error) => protocolError("The browser binding rejected the Quick Action", error.cause)));
|
|
255
|
+
const bodyText = yield* readBoundedResponse(response, request);
|
|
256
|
+
if (response.status === 429) {
|
|
257
|
+
const retryAfter = retryAfterMillis(response);
|
|
258
|
+
const reason = isQuotaMessage(bodyText) ? "quota" : "rate";
|
|
259
|
+
const cause = privateResponseCause(bodyText);
|
|
260
|
+
return yield* PageCaptureRateLimitedError.make({
|
|
261
|
+
implementation: browserQuickActionImplementation,
|
|
262
|
+
reason,
|
|
263
|
+
...retryAfter === void 0 ? {} : { retryAfterMillis: retryAfter },
|
|
264
|
+
...cause === void 0 ? {} : { cause },
|
|
265
|
+
message: reason === "quota" ? "The Quick Action exceeded its browser quota" : "The Quick Action was rate limited"
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (!response.ok) {
|
|
269
|
+
const message = `The Quick Action answered HTTP ${response.status}`;
|
|
270
|
+
const cause = privateResponseCause(bodyText);
|
|
271
|
+
if (response.status >= 500) return yield* protocolError(message, cause);
|
|
272
|
+
return yield* navigationError(message, cause);
|
|
273
|
+
}
|
|
274
|
+
const output = parseOutput(request.action, bodyText, response);
|
|
275
|
+
if (output._tag === "PageCaptureNavigationError" || output._tag === "PageCaptureProtocolError") return yield* output;
|
|
276
|
+
const millis = browserMillis(response);
|
|
277
|
+
return PageCaptureResult.make({
|
|
278
|
+
implementation: browserQuickActionImplementation,
|
|
279
|
+
output,
|
|
280
|
+
resourceUse: PageCaptureResourceUse.make({
|
|
281
|
+
...millis === void 0 ? {} : { browserMillis: millis },
|
|
282
|
+
...usesWorkersAi ? { inference: PageCaptureInferenceUse.make({
|
|
283
|
+
provider: "cloudflare-workers-ai",
|
|
284
|
+
modelCalls: 1
|
|
285
|
+
}) } : {}
|
|
286
|
+
})
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
/**
|
|
290
|
+
* Ordinary Quick Actions require host-owned browser binding authority. Workers
|
|
291
|
+
* AI stays unavailable unless the host deliberately selects its separate Layer.
|
|
292
|
+
*/
|
|
293
|
+
const browserQuickActionCaptureLayer = () => Layer.effect(PageCapture, Effect.map(BrowserQuickActionBrowserBinding, (browser) => PageCapture.of({ capture: makeCapture(browser) })));
|
|
294
|
+
/** Structured Quick Actions require host-owned browser and Workers AI authority. */
|
|
295
|
+
const browserQuickActionWorkersAiCaptureLayer = () => Layer.effect(PageCapture, Effect.gen(function* () {
|
|
296
|
+
const browser = yield* BrowserQuickActionBrowserBinding;
|
|
297
|
+
const workersAi = yield* BrowserQuickActionWorkersAi;
|
|
298
|
+
return PageCapture.of({ capture: makeCapture(browser, workersAi) });
|
|
299
|
+
}));
|
|
300
|
+
//#endregion
|
|
301
|
+
export { BrowserQuickActionBrowserBinding, BrowserQuickActionRpcError, BrowserQuickActionWorkersAi, BrowserQuickActionWorkersAiPolicyError, browserQuickActionCaptureLayer, browserQuickActionImplementation, browserQuickActionWorkersAiCaptureLayer };
|
|
302
|
+
|
|
303
|
+
//# sourceMappingURL=browser-quick-action.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-quick-action.mjs","names":[],"sources":["../src/browser-quick-action.ts"],"sourcesContent":["/// <reference types=\"@cloudflare/workers-types\" />\n\nimport {\n PageCapture,\n PageCaptureInferenceUse,\n PageCaptureInferencePolicyError,\n PageCaptureNavigationError,\n PageCaptureOutputLimitError,\n PageCaptureProtocolError,\n PageCaptureRateLimitedError,\n PageCaptureResourceUse,\n PageCaptureResult,\n PageCaptureUnsupportedError,\n PageContentCaptured,\n PageLinksCaptured,\n PageMarkdownCaptured,\n PageStructuredCaptured,\n SandboxImplementation,\n type PageCaptureAction,\n type PageCaptureCapture,\n type PageCaptureError,\n type PageCaptureOutput,\n type PageCaptureRequest,\n} from \"@effect-agent/sandbox\";\nimport { Context, Effect, Layer, Option, Schema } from \"effect\";\n\n/**\n * The Cloudflare Browser Run Quick Action `PageCapture` adapter (capability\n * spec §9.2). Each capture is one stateless `quickAction()` RPC on the\n * Wrangler `browser` binding: the platform renders the target in a managed\n * headless browser and returns one bounded output; the adapter holds no\n * session and no state between passes. The binding requires a Worker\n * compatibility date of `2026-03-24` or later, and local `wrangler dev` needs\n * remote mode (`\"remote\": true` on the binding) because `quickAction` has no\n * local implementation.\n *\n * Rendered output is untrusted, attacker-influenced content; this adapter\n * only bounds and types it. Deployment class `E` only: no durability claim.\n */\nexport const browserQuickActionImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-browser-quick-action\",\n});\n\n/**\n * Effect-native client captured by the binding service. Its option types come\n * directly from the pinned Workers declarations rather than a local copy.\n */\nexport interface BrowserQuickActionClient {\n readonly content: (\n options: BrowserRunContentOptions,\n ) => Effect.Effect<Response, BrowserQuickActionRpcError>;\n readonly markdown: (\n options: BrowserRunMarkdownOptions,\n ) => Effect.Effect<Response, BrowserQuickActionRpcError>;\n readonly links: (\n options: BrowserRunLinksOptions,\n ) => Effect.Effect<Response, BrowserQuickActionRpcError>;\n readonly json: (\n options: BrowserRunJsonOptions,\n ) => Effect.Effect<Response, BrowserQuickActionRpcError>;\n}\n\n/** A native binding RPC rejected before it returned an HTTP response. */\nexport class BrowserQuickActionRpcError extends Schema.TaggedError<BrowserQuickActionRpcError>()(\n \"BrowserQuickActionRpcError\",\n {\n action: Schema.Literals([\"content\", \"markdown\", \"links\", \"json\"]),\n cause: Schema.Defect(),\n },\n) {}\n\nexport interface BrowserQuickActionCaptureOptions {\n /** The resolved Wrangler `browser` binding (DEPLOY-014: supplied, never ambient). */\n readonly browser: BrowserRun;\n}\n\n/** Host-owned browser binding authority, supplied explicitly at the composition root. */\nexport class BrowserQuickActionBrowserBinding extends Context.Service<\n BrowserQuickActionBrowserBinding,\n BrowserQuickActionClient\n>()(\"@effect-agent/platform-cloudflare/BrowserQuickActionBrowserBinding\") {\n static layer(\n options: BrowserQuickActionCaptureOptions,\n ): Layer.Layer<BrowserQuickActionBrowserBinding> {\n const browser = options.browser;\n const invoke = Effect.fn(\"BrowserQuickActionBrowserBinding.invoke\")(function* (\n action: \"content\" | \"markdown\" | \"links\" | \"json\",\n evaluate: () => Promise<Response>,\n ): Effect.fn.Return<Response, BrowserQuickActionRpcError> {\n return yield* Effect.tryPromise({\n try: evaluate,\n catch: (cause) => BrowserQuickActionRpcError.make({ action, cause }),\n });\n });\n return Layer.succeed(BrowserQuickActionBrowserBinding)({\n content: (request) => invoke(\"content\", () => browser.quickAction(\"content\", request)),\n markdown: (request) => invoke(\"markdown\", () => browser.quickAction(\"markdown\", request)),\n links: (request) => invoke(\"links\", () => browser.quickAction(\"links\", request)),\n json: (request) => invoke(\"json\", () => browser.quickAction(\"json\", request)),\n });\n }\n}\n\n/** Host-owned authorization and accounting for one Workers AI extraction. */\nexport interface BrowserQuickActionWorkersAiPolicy {\n readonly authorizeAndAccount: (\n request: PageCaptureRequest,\n ) => Effect.Effect<void, BrowserQuickActionWorkersAiPolicyError>;\n}\n\n/** Host-only diagnostic for a denied or unaccounted Workers AI extraction. */\nexport class BrowserQuickActionWorkersAiPolicyError extends Schema.TaggedError<BrowserQuickActionWorkersAiPolicyError>()(\n \"BrowserQuickActionWorkersAiPolicyError\",\n {\n reason: Schema.Literals([\"authorization\", \"accounting\"]),\n message: Schema.String.check(Schema.isMaxLength(8_000)),\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Explicit host-owned authority and accounting for separately billed Workers AI extraction. */\nexport class BrowserQuickActionWorkersAi extends Context.Service<\n BrowserQuickActionWorkersAi,\n BrowserQuickActionWorkersAiPolicy\n>()(\"@effect-agent/platform-cloudflare/BrowserQuickActionWorkersAi\") {\n static layer(\n policy: BrowserQuickActionWorkersAiPolicy,\n ): Layer.Layer<BrowserQuickActionWorkersAi> {\n return Layer.succeed(BrowserQuickActionWorkersAi)(policy);\n }\n}\n\nconst MAX_DIAGNOSTIC_LENGTH = 8_000;\nconst boundedDiagnostic = (message: string): string => message.slice(0, MAX_DIAGNOSTIC_LENGTH);\n\nconst QuickActionSuccessEnvelope = Schema.Struct({\n success: Schema.Literal(true),\n result: Schema.Json,\n});\n\nconst QuickActionErrorEnvelope = Schema.Struct({\n success: Schema.Literal(false),\n errors: Schema.Array(\n Schema.Struct({\n message: Schema.String,\n code: Schema.optionalKey(Schema.Number),\n detail: Schema.optionalKey(Schema.String),\n path: Schema.optionalKey(Schema.String),\n }),\n ),\n rawAiResponse: Schema.optionalKey(Schema.String),\n});\n\nconst QuickActionEnvelope = Schema.Union([QuickActionSuccessEnvelope, QuickActionErrorEnvelope]);\nconst decodeEnvelope = Schema.decodeUnknownOption(Schema.fromJsonString(QuickActionEnvelope));\n\n/** Project the schema-validated request onto Cloudflare's native common options. */\nconst quickActionCommonOptions = (request: PageCaptureRequest): BrowserRunCommonOptions => {\n const options: BrowserRunBaseOptions = {};\n const navigation = request.navigation;\n if (navigation !== undefined) {\n const goto: NonNullable<BrowserRunBaseOptions[\"gotoOptions\"]> = {};\n if (navigation.waitUntil !== undefined) goto.waitUntil = navigation.waitUntil;\n if (navigation.timeoutMillis !== undefined) goto.timeout = navigation.timeoutMillis;\n if (Object.keys(goto).length > 0) options.gotoOptions = goto;\n if (navigation.waitForSelector !== undefined) {\n options.waitForSelector = {\n selector: navigation.waitForSelector.selector,\n ...(navigation.waitForSelector.timeoutMillis === undefined\n ? {}\n : { timeout: navigation.waitForSelector.timeoutMillis }),\n };\n }\n }\n if (request.viewport !== undefined) {\n options.viewport = { width: request.viewport.width, height: request.viewport.height };\n }\n if (request.resourcePolicy !== undefined) {\n if (request.resourcePolicy.rejectResourceTypes !== undefined) {\n options.rejectResourceTypes = [...request.resourcePolicy.rejectResourceTypes];\n }\n if (request.resourcePolicy.allowRequestPatterns !== undefined) {\n options.allowRequestPattern = [...request.resourcePolicy.allowRequestPatterns];\n }\n }\n return request.target._tag === \"PageUrlTarget\"\n ? { ...options, url: request.target.url }\n : { ...options, html: request.target.html };\n};\n\n/** Dispatch through Cloudflare's native action-specific overloads. */\nconst executeQuickAction = (\n browser: BrowserQuickActionClient,\n request: PageCaptureRequest,\n): Effect.Effect<Response, BrowserQuickActionRpcError> => {\n const options = quickActionCommonOptions(request);\n switch (request.action._tag) {\n case \"CapturePageContent\": {\n return browser.content(options);\n }\n case \"CapturePageMarkdown\": {\n return browser.markdown(options);\n }\n case \"CapturePageLinks\": {\n return browser.links({\n ...options,\n ...(request.action.visibleLinksOnly === undefined\n ? {}\n : { visibleLinksOnly: request.action.visibleLinksOnly }),\n });\n }\n case \"CapturePageStructured\": {\n return browser.json({\n ...options,\n response_format: {\n type: \"json_schema\",\n json_schema: request.action.responseFormat,\n },\n ...(request.action.prompt === undefined ? {} : { prompt: request.action.prompt }),\n });\n }\n }\n};\n\nconst protocolError = (message: string, cause?: unknown): PageCaptureProtocolError =>\n PageCaptureProtocolError.make({\n implementation: browserQuickActionImplementation,\n message: boundedDiagnostic(message),\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst navigationError = (message: string, cause?: unknown): PageCaptureNavigationError =>\n PageCaptureNavigationError.make({\n implementation: browserQuickActionImplementation,\n message: boundedDiagnostic(message),\n ...(cause === undefined ? {} : { cause }),\n });\n\n/** Preserve bounded remote diagnostics for the host without exposing their text to a model. */\nconst privateResponseCause = (bodyText: string): Error | undefined =>\n bodyText.length === 0 ? undefined : new Error(boundedDiagnostic(bodyText));\n\nconst releaseResponseReader = (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n): Effect.Effect<void> =>\n Effect.tryPromise({\n try: () => reader.cancel(),\n catch: (cause) => protocolError(\"Canceling the Quick Action response failed\", cause),\n }).pipe(\n Effect.catch((error) => Effect.logWarning(error.message)),\n Effect.ensuring(\n Effect.try({\n try: () => reader.releaseLock(),\n catch: (cause) => protocolError(\"Releasing the Quick Action response failed\", cause),\n }).pipe(Effect.catch((error) => Effect.logWarning(error.message))),\n ),\n );\n\nconst readBoundedResponse = Effect.fn(\"BrowserQuickActionCapture.readResponse\")(function* (\n response: Response,\n request: PageCaptureRequest,\n) {\n const body = response.body;\n if (body === null) return \"\";\n\n const reader = yield* Effect.acquireRelease(\n Effect.try({\n try: () => body.getReader(),\n catch: (cause) => protocolError(\"Opening the Quick Action response failed\", cause),\n }),\n releaseResponseReader,\n );\n const decoder = new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: false });\n let observedBytes = 0;\n let bodyText = \"\";\n\n while (true) {\n const chunk = yield* Effect.tryPromise({\n try: () => reader.read(),\n catch: (cause) => protocolError(\"Reading the Quick Action response failed\", cause),\n });\n if (chunk.done) break;\n\n observedBytes += chunk.value.byteLength;\n if (observedBytes > request.limits.maxOutputBytes) {\n return yield* PageCaptureOutputLimitError.make({\n implementation: browserQuickActionImplementation,\n limit: request.limits.maxOutputBytes,\n observed: observedBytes,\n });\n }\n\n bodyText += yield* Effect.try({\n try: () => decoder.decode(chunk.value, { stream: true }),\n catch: (cause) => protocolError(\"Decoding the Quick Action response failed\", cause),\n });\n }\n\n return (\n bodyText +\n (yield* Effect.try({\n try: () => decoder.decode(),\n catch: (cause) => protocolError(\"Decoding the Quick Action response failed\", cause),\n }))\n );\n}, Effect.scoped);\n\n/**\n * Retry-After arrives in whole seconds; a non-integer form (an HTTP date) is\n * dropped rather than guessed at.\n */\nconst retryAfterMillis = (response: Response): number | undefined => {\n const header = response.headers.get(\"Retry-After\");\n if (header === null) return undefined;\n const seconds = Number(header);\n if (!Number.isSafeInteger(seconds) || seconds < 0) return undefined;\n const millis = seconds * 1_000;\n return Number.isSafeInteger(millis) ? millis : undefined;\n};\n\nconst browserMillis = (response: Response): number | undefined => {\n const header = response.headers.get(\"X-Browser-Ms-Used\");\n if (header === null) return undefined;\n const millis = Number(header);\n return Number.isSafeInteger(millis) && millis >= 0 ? millis : undefined;\n};\n\n/** Only trusted response metadata chooses transport framing; page text never does. */\nconst isJsonResponse = (response: Response): boolean => {\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) return false;\n const mediaType = contentType.split(\";\", 1)[0]?.trim().toLowerCase();\n return mediaType === \"application/json\" || mediaType?.endsWith(\"+json\") === true;\n};\n\nconst parseOutput = (\n action: PageCaptureAction,\n bodyText: string,\n response: Response,\n): PageCaptureOutput | PageCaptureNavigationError | PageCaptureProtocolError => {\n if (!isJsonResponse(response)) {\n return protocolError(\n \"The Quick Action success response was not a JSON response envelope\",\n privateResponseCause(bodyText),\n );\n }\n const envelope = decodeEnvelope(bodyText);\n if (Option.isNone(envelope)) {\n return protocolError(\n \"The JSON Quick Action response did not carry a valid response envelope\",\n privateResponseCause(bodyText),\n );\n }\n if (!envelope.value.success) {\n return navigationError(\n \"The Quick Action reported a navigation failure\",\n privateResponseCause(bodyText),\n );\n }\n switch (action._tag) {\n case \"CapturePageContent\":\n case \"CapturePageMarkdown\": {\n if (typeof envelope.value.result !== \"string\") {\n return protocolError(\"The Quick Action envelope carried a non-text result\");\n }\n return action._tag === \"CapturePageContent\"\n ? PageContentCaptured.make({ html: envelope.value.result })\n : PageMarkdownCaptured.make({ markdown: envelope.value.result });\n }\n case \"CapturePageLinks\": {\n const decoded = Schema.decodeUnknownOption(PageLinksCaptured)({\n _tag: \"PageLinksCaptured\",\n links: envelope.value.result,\n });\n if (Option.isNone(decoded)) {\n return protocolError(\"The links Quick Action did not return a bounded array of valid URLs\");\n }\n return decoded.value;\n }\n case \"CapturePageStructured\": {\n return PageStructuredCaptured.make({ value: envelope.value.result });\n }\n }\n};\n\nconst isQuotaMessage = (text: string): boolean => /time limit|daily|quota/i.test(text);\n\nconst makeCapture = (\n browser: BrowserQuickActionClient,\n workersAi?: BrowserQuickActionWorkersAiPolicy,\n): PageCaptureCapture =>\n Effect.fn(\"BrowserQuickActionCapture.capture\")(function* (\n request: PageCaptureRequest,\n ): Effect.fn.Return<PageCaptureResult, PageCaptureError> {\n if (request.engine !== \"chromium\") {\n return yield* PageCaptureUnsupportedError.make({\n implementation: browserQuickActionImplementation,\n feature: \"engine\",\n message:\n \"The browser binding's quickAction() exposes no engine selector; kitesurf requires the REST or CDP surface\",\n });\n }\n\n const usesWorkersAi = request.action._tag === \"CapturePageStructured\";\n if (usesWorkersAi) {\n if (workersAi === undefined) {\n return yield* PageCaptureUnsupportedError.make({\n implementation: browserQuickActionImplementation,\n feature: \"action\",\n message:\n \"Structured capture invokes separately billed Workers AI and requires an explicit authorization and accounting policy\",\n });\n }\n yield* workersAi.authorizeAndAccount(request).pipe(\n Effect.mapError((cause) =>\n PageCaptureInferencePolicyError.make({\n implementation: browserQuickActionImplementation,\n provider: \"cloudflare-workers-ai\",\n reason: cause.reason,\n message:\n cause.reason === \"authorization\"\n ? \"Workers AI extraction was not authorized\"\n : \"Workers AI extraction could not be accounted for\",\n cause,\n }),\n ),\n );\n }\n\n const response = yield* executeQuickAction(browser, request).pipe(\n Effect.mapError((error) =>\n protocolError(\"The browser binding rejected the Quick Action\", error.cause),\n ),\n );\n const bodyText = yield* readBoundedResponse(response, request);\n if (response.status === 429) {\n const retryAfter = retryAfterMillis(response);\n const reason = isQuotaMessage(bodyText) ? \"quota\" : \"rate\";\n const cause = privateResponseCause(bodyText);\n return yield* PageCaptureRateLimitedError.make({\n implementation: browserQuickActionImplementation,\n reason,\n ...(retryAfter === undefined ? {} : { retryAfterMillis: retryAfter }),\n ...(cause === undefined ? {} : { cause }),\n message:\n reason === \"quota\"\n ? \"The Quick Action exceeded its browser quota\"\n : \"The Quick Action was rate limited\",\n });\n }\n if (!response.ok) {\n const message = `The Quick Action answered HTTP ${response.status}`;\n const cause = privateResponseCause(bodyText);\n if (response.status >= 500) {\n return yield* protocolError(message, cause);\n }\n return yield* navigationError(message, cause);\n }\n const output = parseOutput(request.action, bodyText, response);\n if (\n output._tag === \"PageCaptureNavigationError\" ||\n output._tag === \"PageCaptureProtocolError\"\n ) {\n return yield* output;\n }\n const millis = browserMillis(response);\n return PageCaptureResult.make({\n implementation: browserQuickActionImplementation,\n output,\n resourceUse: PageCaptureResourceUse.make({\n ...(millis === undefined ? {} : { browserMillis: millis }),\n ...(usesWorkersAi\n ? {\n inference: PageCaptureInferenceUse.make({\n provider: \"cloudflare-workers-ai\",\n modelCalls: 1,\n }),\n }\n : {}),\n }),\n });\n });\n\n/**\n * Ordinary Quick Actions require host-owned browser binding authority. Workers\n * AI stays unavailable unless the host deliberately selects its separate Layer.\n */\nexport const browserQuickActionCaptureLayer = (): Layer.Layer<\n PageCapture,\n never,\n BrowserQuickActionBrowserBinding\n> =>\n Layer.effect(\n PageCapture,\n Effect.map(BrowserQuickActionBrowserBinding, (browser) =>\n PageCapture.of({ capture: makeCapture(browser) }),\n ),\n );\n\n/** Structured Quick Actions require host-owned browser and Workers AI authority. */\nexport const browserQuickActionWorkersAiCaptureLayer = (): Layer.Layer<\n PageCapture,\n never,\n BrowserQuickActionBrowserBinding | BrowserQuickActionWorkersAi\n> =>\n Layer.effect(\n PageCapture,\n Effect.gen(function* () {\n const browser = yield* BrowserQuickActionBrowserBinding;\n const workersAi = yield* BrowserQuickActionWorkersAi;\n return PageCapture.of({ capture: makeCapture(browser, workersAi) });\n }),\n );\n"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { BrowserQuickActionBrowserBinding, BrowserQuickActionCaptureOptions, BrowserQuickActionClient, BrowserQuickActionRpcError, BrowserQuickActionWorkersAi, BrowserQuickActionWorkersAiPolicy, BrowserQuickActionWorkersAiPolicyError, browserQuickActionCaptureLayer, browserQuickActionImplementation, browserQuickActionWorkersAiCaptureLayer } from "./browser-quick-action.mjs";
|
|
1
2
|
import { Context, Crypto, Effect, Layer, Option, Schema, Scope } from "effect";
|
|
2
3
|
import { AbortCommand, AbortIntent, AdmissionConflict, AgentBindingResolver, AppendConflict, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, CanonicalRecordEnvelope, CanonicalSequence, ConversationNotMaterialized, ConversationStore, ConversationStoreError, DefinitionDigests, DigestError, DurableAgentRuntime, DurableBindingFailure, DurableRuntimeConfig, DurableRuntimeFailpointError, DurableRuntimeFailpointHandler, DurableSubmitAgent, DurableSubmitOptions, DurableWorkerFailure, FenceRejected, IntegrityReport, JoinedToHost, LedgerError, ObligationReport, ObligationThresholds, OperationAuthorizerService, OperationDenied, OwnershipLost, ProducerId, Receipt, RecoveryExplanation, RecoveryReport, ResolvedBinding, RetryCommand, RetryRefused, RunJournalError, Settlement, SettlementConflict, SubmissionLedger, ToolReconciler, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, WakeScheduler } from "@effect-agent/session";
|
|
3
4
|
import { ConversationPortTransport, DoStorageFailpointHandler, DoStorageInitializationError, PortRequest, PortResponse } from "@effect-agent/storage-cloudflare";
|
|
4
5
|
import { AgentInputError, ConversationId } from "@effect-agent/core";
|
|
5
|
-
import { RunContextPreparation } from "@effect-agent/engine";
|
|
6
|
+
import { RunContextPreparation, RunCostEstimator } from "@effect-agent/engine";
|
|
6
7
|
import { DurableObjectState as DurableObjectState$1, WorkerEnvironment } from "effect-cf";
|
|
7
8
|
import { CodeExecutor, SandboxImplementation } from "@effect-agent/sandbox";
|
|
8
9
|
import { DurableObject as DurableObject$1 } from "cloudflare:workers";
|
|
@@ -369,6 +370,8 @@ interface CloudflareDurableRuntimeOptions {
|
|
|
369
370
|
readonly leaseRenewalInterval?: number | undefined;
|
|
370
371
|
/** Milliseconds; default 500. */
|
|
371
372
|
readonly abortPollInterval?: number | undefined;
|
|
373
|
+
/** Deployment-owned pricing authority used by durable cost budgets and settlements. */
|
|
374
|
+
readonly estimateCostMicrousd?: RunCostEstimator | undefined;
|
|
372
375
|
/** Milliseconds; default 25. */
|
|
373
376
|
readonly observationPollInterval?: number | undefined;
|
|
374
377
|
/** Bytes; default just under the 2 MB platform value limit. */
|
|
@@ -644,6 +647,40 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
644
647
|
readonly receiptId: string;
|
|
645
648
|
readonly outcome: "aborted" | "completed" | "failed";
|
|
646
649
|
readonly runDisposition?: Schema.Json | undefined;
|
|
650
|
+
readonly usageSummary?: {
|
|
651
|
+
readonly modelCalls: number;
|
|
652
|
+
readonly inputTokens: {
|
|
653
|
+
readonly total: number;
|
|
654
|
+
readonly uncached: number;
|
|
655
|
+
readonly cacheRead: number;
|
|
656
|
+
readonly cacheWrite: number;
|
|
657
|
+
};
|
|
658
|
+
readonly outputTokens: {
|
|
659
|
+
readonly total: number;
|
|
660
|
+
readonly text: number;
|
|
661
|
+
readonly reasoning: number;
|
|
662
|
+
};
|
|
663
|
+
readonly costMicrousd: number;
|
|
664
|
+
readonly byModel: readonly {
|
|
665
|
+
readonly provider: string;
|
|
666
|
+
readonly model: string;
|
|
667
|
+
readonly serviceTier?: string | undefined;
|
|
668
|
+
readonly pricingVersion?: string | undefined;
|
|
669
|
+
readonly modelCalls: number;
|
|
670
|
+
readonly inputTokens: {
|
|
671
|
+
readonly total: number;
|
|
672
|
+
readonly uncached: number;
|
|
673
|
+
readonly cacheRead: number;
|
|
674
|
+
readonly cacheWrite: number;
|
|
675
|
+
};
|
|
676
|
+
readonly outputTokens: {
|
|
677
|
+
readonly total: number;
|
|
678
|
+
readonly text: number;
|
|
679
|
+
readonly reasoning: number;
|
|
680
|
+
};
|
|
681
|
+
readonly costMicrousd: number;
|
|
682
|
+
}[];
|
|
683
|
+
} | undefined;
|
|
647
684
|
readonly failure?: {
|
|
648
685
|
readonly errorTag: string;
|
|
649
686
|
readonly message: string;
|
|
@@ -688,6 +725,25 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
688
725
|
readonly turn: number;
|
|
689
726
|
readonly messages: Schema.Json;
|
|
690
727
|
readonly messagesDigest: string;
|
|
728
|
+
readonly runScopedPrefixLength?: number | undefined;
|
|
729
|
+
readonly modelUsage?: readonly {
|
|
730
|
+
readonly provider: string;
|
|
731
|
+
readonly model: string;
|
|
732
|
+
readonly serviceTier?: string | undefined;
|
|
733
|
+
readonly pricingVersion?: string | undefined;
|
|
734
|
+
readonly inputTokens: {
|
|
735
|
+
readonly total: number;
|
|
736
|
+
readonly uncached: number;
|
|
737
|
+
readonly cacheRead: number;
|
|
738
|
+
readonly cacheWrite: number;
|
|
739
|
+
};
|
|
740
|
+
readonly outputTokens: {
|
|
741
|
+
readonly total: number;
|
|
742
|
+
readonly text: number;
|
|
743
|
+
readonly reasoning: number;
|
|
744
|
+
};
|
|
745
|
+
readonly costMicrousd: number;
|
|
746
|
+
}[] | undefined;
|
|
691
747
|
readonly inputTokens?: number | undefined;
|
|
692
748
|
readonly outputTokens?: number | undefined;
|
|
693
749
|
readonly costMicrousd?: number | undefined;
|
|
@@ -765,6 +821,9 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
765
821
|
readonly _tag: "RunCompleted";
|
|
766
822
|
readonly runId: string;
|
|
767
823
|
readonly output: Schema.Json;
|
|
824
|
+
readonly runDisposition?: Schema.Json | undefined;
|
|
825
|
+
readonly finishReason?: "budget-exhausted" | undefined;
|
|
826
|
+
readonly exhausted?: "tokens" | "tool-calls" | "turns" | undefined;
|
|
768
827
|
} | {
|
|
769
828
|
readonly _tag: "AbortRequested";
|
|
770
829
|
readonly submissionId: string;
|
|
@@ -782,6 +841,40 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
782
841
|
readonly finishReason?: "budget-exhausted" | undefined;
|
|
783
842
|
readonly exhausted?: "tokens" | "tool-calls" | "turns" | undefined;
|
|
784
843
|
readonly policyLimit?: "cost" | "duration" | "repeated-failures" | "tokens" | "tool-calls" | "turns" | "usage" | undefined;
|
|
844
|
+
readonly usageSummary?: {
|
|
845
|
+
readonly modelCalls: number;
|
|
846
|
+
readonly inputTokens: {
|
|
847
|
+
readonly total: number;
|
|
848
|
+
readonly uncached: number;
|
|
849
|
+
readonly cacheRead: number;
|
|
850
|
+
readonly cacheWrite: number;
|
|
851
|
+
};
|
|
852
|
+
readonly outputTokens: {
|
|
853
|
+
readonly total: number;
|
|
854
|
+
readonly text: number;
|
|
855
|
+
readonly reasoning: number;
|
|
856
|
+
};
|
|
857
|
+
readonly costMicrousd: number;
|
|
858
|
+
readonly byModel: readonly {
|
|
859
|
+
readonly provider: string;
|
|
860
|
+
readonly model: string;
|
|
861
|
+
readonly serviceTier?: string | undefined;
|
|
862
|
+
readonly pricingVersion?: string | undefined;
|
|
863
|
+
readonly modelCalls: number;
|
|
864
|
+
readonly inputTokens: {
|
|
865
|
+
readonly total: number;
|
|
866
|
+
readonly uncached: number;
|
|
867
|
+
readonly cacheRead: number;
|
|
868
|
+
readonly cacheWrite: number;
|
|
869
|
+
};
|
|
870
|
+
readonly outputTokens: {
|
|
871
|
+
readonly total: number;
|
|
872
|
+
readonly text: number;
|
|
873
|
+
readonly reasoning: number;
|
|
874
|
+
};
|
|
875
|
+
readonly costMicrousd: number;
|
|
876
|
+
}[];
|
|
877
|
+
} | undefined;
|
|
785
878
|
} | {
|
|
786
879
|
readonly _tag: "SubagentRequested";
|
|
787
880
|
readonly runId: string;
|
|
@@ -896,6 +989,11 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
896
989
|
} | {
|
|
897
990
|
readonly _tag: "HostFailed";
|
|
898
991
|
readonly failure: {
|
|
992
|
+
readonly _tag: "AdmissionLimitExceeded";
|
|
993
|
+
readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
|
|
994
|
+
readonly actual: number;
|
|
995
|
+
readonly maximum: number;
|
|
996
|
+
} | {
|
|
899
997
|
readonly _tag: "HostProtocolError";
|
|
900
998
|
readonly message: string;
|
|
901
999
|
} | {
|
|
@@ -957,11 +1055,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
957
1055
|
} | {
|
|
958
1056
|
readonly _tag: "DurableRuntimeFailpointError";
|
|
959
1057
|
readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "claim:after-claim" | "compaction:after-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "resolve:after-intent" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append";
|
|
960
|
-
} | {
|
|
961
|
-
readonly _tag: "AdmissionLimitExceeded";
|
|
962
|
-
readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
|
|
963
|
-
readonly actual: number;
|
|
964
|
-
readonly maximum: number;
|
|
965
1058
|
} | {
|
|
966
1059
|
readonly _tag: "DurableAlarmError";
|
|
967
1060
|
readonly operation: string;
|
|
@@ -1622,5 +1715,5 @@ interface DynamicWorkerCodeExecutorOptions {
|
|
|
1622
1715
|
/** Layer building the Dynamic Worker `CodeExecutor` from resolved bindings. */
|
|
1623
1716
|
declare const dynamicWorkerCodeExecutorLayer: (options: DynamicWorkerCodeExecutorOptions) => Layer.Layer<CodeExecutor>;
|
|
1624
1717
|
//#endregion
|
|
1625
|
-
export { AbortRecorded, AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, AdmissionLimitExceeded, ApprovalRecorded, AwaitProgressRequest, CLOUDFLARE_DATABASE_CAP_BYTES, CLOUDFLARE_RUNTIME_DEFAULTS, CancelProgressRequest, ClientAbortFailure, ClientApprovalFailure, ClientAwaitFailure, ClientObserveFailure, ClientProgressFailure, ClientSubmitFailure, ClientUnknownFailure, CloudflareAdmissionLimitsValue, CloudflareBindingError, CloudflareBindingSource, CloudflareBindingSourceContext, CloudflareConversationClient, CloudflareDurableRuntime, CloudflareDurableRuntimeConfig, CloudflareDurableRuntimeConfigValue, CloudflareDurableRuntimeInitializationError, CloudflareDurableRuntimeOptions, CloudflareDurableRuntimeServices, CloudflarePlatformConfigError, CloudflareRunContextLayer, CloudflareRunContextSource, CloudflareRuntimeSourceContext, ConversationClientError, ConversationMaintenance, ConversationMaintenanceFailpoint, ConversationMaintenanceFailpointHandler, ConversationMaintenanceFailpointLocation, ConversationObjectClass, ConversationObjectIdentity, ConversationObjectInstance, ConversationObjectNamespace, ConversationObjectOptions, ConversationObjectPorts, ConversationObjectRpc, DEFAULT_MAX_DATABASE_BYTES, DurableAlarmError, DurableAlarmService, DurableObjectContext, DynamicWorkerCodeExecutorOptions, ExplainedRecovery, HostFailed, HostFailure, HostProtocolError, HostResponse, MaintenancePassFailure, MaintenancePassReport, ObligationsScanned, ObservePageRequest, ObservedPage, ProgressCancelled, ProgressObserved, ProgressWaitRegistry, RetryExecuted, SettlementReached, SubmitRequest, SubmitSucceeded, UnknownResolutionRecorded, VerifiedIntegrity, boundHostDiagnostic, cloudflareWakeSchedulerLayer, conversationNamespaceFromEnv, conversationNamespaceLayer, conversationPortTransportLayer, decodeAbortCommand, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeApprovalDecisionCommand, decodeAwaitProgressRequest, decodeCancelProgressRequest, decodeHostResponse, decodeObligationThresholds, decodeObservePageRequest, decodeReceipt, decodeRetryCommand, decodeSubmitRequest, decodeUnknownResolutionCommand, disposeRpcHandle, dynamicWorkerCodeExecutorLayer, dynamicWorkerImplementation, encodeAbortCommand, encodeAdminResponse, encodeApprovalDecisionCommand, encodeAwaitProgressRequest, encodeCancelProgressRequest, encodeHostResponse, encodeObservePageRequest, encodeReceipt, encodeSubmitRequest, encodeUnknownResolutionCommand, makeConversationObjectClass };
|
|
1718
|
+
export { AbortRecorded, AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, AdmissionLimitExceeded, ApprovalRecorded, AwaitProgressRequest, BrowserQuickActionBrowserBinding, BrowserQuickActionCaptureOptions, BrowserQuickActionClient, BrowserQuickActionRpcError, BrowserQuickActionWorkersAi, BrowserQuickActionWorkersAiPolicy, BrowserQuickActionWorkersAiPolicyError, CLOUDFLARE_DATABASE_CAP_BYTES, CLOUDFLARE_RUNTIME_DEFAULTS, CancelProgressRequest, ClientAbortFailure, ClientApprovalFailure, ClientAwaitFailure, ClientObserveFailure, ClientProgressFailure, ClientSubmitFailure, ClientUnknownFailure, CloudflareAdmissionLimitsValue, CloudflareBindingError, CloudflareBindingSource, CloudflareBindingSourceContext, CloudflareConversationClient, CloudflareDurableRuntime, CloudflareDurableRuntimeConfig, CloudflareDurableRuntimeConfigValue, CloudflareDurableRuntimeInitializationError, CloudflareDurableRuntimeOptions, CloudflareDurableRuntimeServices, CloudflarePlatformConfigError, CloudflareRunContextLayer, CloudflareRunContextSource, CloudflareRuntimeSourceContext, ConversationClientError, ConversationMaintenance, ConversationMaintenanceFailpoint, ConversationMaintenanceFailpointHandler, ConversationMaintenanceFailpointLocation, ConversationObjectClass, ConversationObjectIdentity, ConversationObjectInstance, ConversationObjectNamespace, ConversationObjectOptions, ConversationObjectPorts, ConversationObjectRpc, DEFAULT_MAX_DATABASE_BYTES, DurableAlarmError, DurableAlarmService, DurableObjectContext, DynamicWorkerCodeExecutorOptions, ExplainedRecovery, HostFailed, HostFailure, HostProtocolError, HostResponse, MaintenancePassFailure, MaintenancePassReport, ObligationsScanned, ObservePageRequest, ObservedPage, ProgressCancelled, ProgressObserved, ProgressWaitRegistry, RetryExecuted, SettlementReached, SubmitRequest, SubmitSucceeded, UnknownResolutionRecorded, VerifiedIntegrity, boundHostDiagnostic, browserQuickActionCaptureLayer, browserQuickActionImplementation, browserQuickActionWorkersAiCaptureLayer, cloudflareWakeSchedulerLayer, conversationNamespaceFromEnv, conversationNamespaceLayer, conversationPortTransportLayer, decodeAbortCommand, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeApprovalDecisionCommand, decodeAwaitProgressRequest, decodeCancelProgressRequest, decodeHostResponse, decodeObligationThresholds, decodeObservePageRequest, decodeReceipt, decodeRetryCommand, decodeSubmitRequest, decodeUnknownResolutionCommand, disposeRpcHandle, dynamicWorkerCodeExecutorLayer, dynamicWorkerImplementation, encodeAbortCommand, encodeAdminResponse, encodeApprovalDecisionCommand, encodeAwaitProgressRequest, encodeCancelProgressRequest, encodeHostResponse, encodeObservePageRequest, encodeReceipt, encodeSubmitRequest, encodeUnknownResolutionCommand, makeConversationObjectClass };
|
|
1626
1719
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BrowserQuickActionBrowserBinding, BrowserQuickActionRpcError, BrowserQuickActionWorkersAi, BrowserQuickActionWorkersAiPolicyError, browserQuickActionCaptureLayer, browserQuickActionImplementation, browserQuickActionWorkersAiCaptureLayer } from "./browser-quick-action.mjs";
|
|
1
2
|
import { Clock, Context, Crypto, Deferred, Duration, Effect, Exit, Fiber, Layer, Option, Predicate, PubSub, Queue, Random, Ref, Schema, Semaphore, Stream } from "effect";
|
|
2
3
|
import { AbortCommand, AbortIntent, AdmissionConflict, AgentBindingResolver, AppendConflict, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, CanonicalRecordEnvelope, CanonicalSequence, ConversationNotMaterialized, ConversationRead, ConversationStore, ConversationStoreError, DEFAULT_OWNERSHIP_LEASE_DURATION, DefinitionDigests, DeploymentId, DigestError, DurableAgentRuntime, DurableRuntimeConfig, DurableRuntimeFailpoint, DurableRuntimeFailpointError, FenceRejected, IdempotencyKey, IntegrityReport, JoinedToHost, LedgerError, ObligationReport, ObligationThresholds, OperationAuthorizationRequest, OperationAuthorizer, OperationDenied, OwnershipLost, PersistedJson, Principal, ProducerId, Receipt, RecoveryExplanation, RecoveryReport, RetryCommand, RetryRefused, RunJournalError, Settlement, SettlementConflict, SubmissionLedger, SubmissionLookupByKey, ToolReconciler, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, WakeScheduler, makeWakeSubscriptionHub, operationAuthorizerLayer } from "@effect-agent/session";
|
|
3
4
|
import { ConversationPortTransport, DEFAULT_MAX_STORED_VALUE_BYTES, conversationStoreLayer, decodePortRequest, encodePortResponse, executePortRequest, portTransportFailure, routedConversationStoreLayer, routedSubmissionLedgerLayer, storageConfigLayer, storageFailpointLayer, submissionLedgerLayer } from "@effect-agent/storage-cloudflare";
|
|
@@ -754,7 +755,8 @@ var CloudflareDurableRuntime = class {
|
|
|
754
755
|
producerId,
|
|
755
756
|
settlementPollInterval: Duration.millis(config.settlementPollInterval),
|
|
756
757
|
leaseRenewalInterval: Duration.millis(config.leaseRenewalInterval),
|
|
757
|
-
abortPollInterval: Duration.millis(config.abortPollInterval)
|
|
758
|
+
abortPollInterval: Duration.millis(config.abortPollInterval),
|
|
759
|
+
...options.estimateCostMicrousd === void 0 ? {} : { estimateCostMicrousd: options.estimateCostMicrousd }
|
|
758
760
|
}));
|
|
759
761
|
const runtimeFailpointLayer = options.runtimeFailpoint === void 0 ? DurableRuntimeFailpoint.layer : Layer.succeed(DurableRuntimeFailpoint)({ hit: options.runtimeFailpoint(ctx) });
|
|
760
762
|
const maintenanceFailpointLayer = options.maintenanceFailpoint === void 0 ? ConversationMaintenanceFailpoint.layer : Layer.succeed(ConversationMaintenanceFailpoint)({ hit: options.maintenanceFailpoint(ctx) });
|
|
@@ -1976,6 +1978,6 @@ const dynamicWorkerCodeExecutorLayer = (options) => Layer.effect(CodeExecutor, E
|
|
|
1976
1978
|
return CodeExecutor.of({ execute: makeExecute(options, clock) });
|
|
1977
1979
|
}));
|
|
1978
1980
|
//#endregion
|
|
1979
|
-
export { AbortRecorded, AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, AdmissionLimitExceeded, ApprovalRecorded, AwaitProgressRequest, CLOUDFLARE_DATABASE_CAP_BYTES, CLOUDFLARE_RUNTIME_DEFAULTS, CancelProgressRequest, CloudflareAdmissionLimitsValue, CloudflareBindingError, CloudflareConversationClient, CloudflareDurableRuntime, CloudflareDurableRuntimeConfig, CloudflareDurableRuntimeConfigValue, CloudflarePlatformConfigError, ConversationClientError, ConversationMaintenance, ConversationMaintenanceFailpoint, ConversationObjectIdentity, ConversationObjectNamespace, ConversationObjectPorts, DEFAULT_MAX_DATABASE_BYTES, DurableAlarmError, DurableAlarmService, DurableObjectContext, ExplainedRecovery, HostFailed, HostFailure, HostProtocolError, HostResponse, MaintenancePassReport, ObligationsScanned, ObservePageRequest, ObservedPage, ProgressCancelled, ProgressObserved, ProgressWaitRegistry, RetryExecuted, SettlementReached, SubmitRequest, SubmitSucceeded, UnknownResolutionRecorded, VerifiedIntegrity, boundHostDiagnostic, cloudflareWakeSchedulerLayer, conversationNamespaceFromEnv, conversationNamespaceLayer, conversationPortTransportLayer, decodeAbortCommand, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeApprovalDecisionCommand, decodeAwaitProgressRequest, decodeCancelProgressRequest, decodeHostResponse, decodeObligationThresholds, decodeObservePageRequest, decodeReceipt, decodeRetryCommand, decodeSubmitRequest, decodeUnknownResolutionCommand, disposeRpcHandle, dynamicWorkerCodeExecutorLayer, dynamicWorkerImplementation, encodeAbortCommand, encodeAdminResponse, encodeApprovalDecisionCommand, encodeAwaitProgressRequest, encodeCancelProgressRequest, encodeHostResponse, encodeObservePageRequest, encodeReceipt, encodeSubmitRequest, encodeUnknownResolutionCommand, makeConversationObjectClass };
|
|
1981
|
+
export { AbortRecorded, AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, AdmissionLimitExceeded, ApprovalRecorded, AwaitProgressRequest, BrowserQuickActionBrowserBinding, BrowserQuickActionRpcError, BrowserQuickActionWorkersAi, BrowserQuickActionWorkersAiPolicyError, CLOUDFLARE_DATABASE_CAP_BYTES, CLOUDFLARE_RUNTIME_DEFAULTS, CancelProgressRequest, CloudflareAdmissionLimitsValue, CloudflareBindingError, CloudflareConversationClient, CloudflareDurableRuntime, CloudflareDurableRuntimeConfig, CloudflareDurableRuntimeConfigValue, CloudflarePlatformConfigError, ConversationClientError, ConversationMaintenance, ConversationMaintenanceFailpoint, ConversationObjectIdentity, ConversationObjectNamespace, ConversationObjectPorts, DEFAULT_MAX_DATABASE_BYTES, DurableAlarmError, DurableAlarmService, DurableObjectContext, ExplainedRecovery, HostFailed, HostFailure, HostProtocolError, HostResponse, MaintenancePassReport, ObligationsScanned, ObservePageRequest, ObservedPage, ProgressCancelled, ProgressObserved, ProgressWaitRegistry, RetryExecuted, SettlementReached, SubmitRequest, SubmitSucceeded, UnknownResolutionRecorded, VerifiedIntegrity, boundHostDiagnostic, browserQuickActionCaptureLayer, browserQuickActionImplementation, browserQuickActionWorkersAiCaptureLayer, cloudflareWakeSchedulerLayer, conversationNamespaceFromEnv, conversationNamespaceLayer, conversationPortTransportLayer, decodeAbortCommand, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeApprovalDecisionCommand, decodeAwaitProgressRequest, decodeCancelProgressRequest, decodeHostResponse, decodeObligationThresholds, decodeObservePageRequest, decodeReceipt, decodeRetryCommand, decodeSubmitRequest, decodeUnknownResolutionCommand, disposeRpcHandle, dynamicWorkerCodeExecutorLayer, dynamicWorkerImplementation, encodeAbortCommand, encodeAdminResponse, encodeApprovalDecisionCommand, encodeAwaitProgressRequest, encodeCancelProgressRequest, encodeHostResponse, encodeObservePageRequest, encodeReceipt, encodeSubmitRequest, encodeUnknownResolutionCommand, makeConversationObjectClass };
|
|
1980
1982
|
|
|
1981
1983
|
//# sourceMappingURL=index.mjs.map
|