@effect-agent/platform-cloudflare 0.1.0-beta.118 → 0.1.0-beta.119

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.
@@ -497,13 +497,13 @@ export declare const encodeUnknownResolutionCommand: (input: UnknownResolutionCo
497
497
  readonly author: string;
498
498
  readonly reason: string;
499
499
  readonly resolution: {
500
- readonly _tag: "SafeToRetry";
501
- } | {
502
500
  readonly _tag: "CompletedWithResult";
503
501
  readonly result: Schema.Json;
504
502
  readonly isFailure: boolean;
505
503
  } | {
506
504
  readonly _tag: "NeverHappened";
505
+ } | {
506
+ readonly _tag: "SafeToRetry";
507
507
  } | {
508
508
  readonly _tag: "AbortSubmission";
509
509
  };
@@ -667,19 +667,6 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
667
667
  readonly createdAt: string;
668
668
  readonly deploymentId: string;
669
669
  readonly payload: {
670
- readonly _tag: "SubagentStarted";
671
- readonly runId: string;
672
- readonly toolCallId: string;
673
- readonly childThreadId: string;
674
- readonly childSubmissionId: string;
675
- readonly childReceiptId: string;
676
- readonly childRunId: string;
677
- } | {
678
- readonly _tag: "AbortRequested";
679
- readonly submissionId: string;
680
- readonly author: string;
681
- readonly reason: string;
682
- } | {
683
670
  readonly _tag: "ThreadCreated";
684
671
  readonly agentId: string;
685
672
  readonly definitions: {
@@ -957,6 +944,11 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
957
944
  readonly runDisposition?: Schema.Json | undefined;
958
945
  readonly finishReason?: "budget-exhausted" | undefined;
959
946
  readonly exhausted?: "tokens" | "tool-calls" | "turns" | undefined;
947
+ } | {
948
+ readonly _tag: "AbortRequested";
949
+ readonly submissionId: string;
950
+ readonly author: string;
951
+ readonly reason: string;
960
952
  } | {
961
953
  readonly _tag: "SubmissionSettled";
962
954
  readonly submissionId: string;
@@ -1091,6 +1083,14 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1091
1083
  readonly childLifetimes?: readonly ("attached" | "background")[] | undefined;
1092
1084
  } | undefined;
1093
1085
  readonly depth?: number | undefined;
1086
+ } | {
1087
+ readonly _tag: "SubagentStarted";
1088
+ readonly runId: string;
1089
+ readonly toolCallId: string;
1090
+ readonly childThreadId: string;
1091
+ readonly childSubmissionId: string;
1092
+ readonly childReceiptId: string;
1093
+ readonly childRunId: string;
1094
1094
  } | {
1095
1095
  readonly _tag: "SubagentJoined";
1096
1096
  readonly runId: string;
@@ -1524,13 +1524,13 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1524
1524
  readonly author: string;
1525
1525
  readonly reason: string;
1526
1526
  readonly resolution: {
1527
- readonly _tag: "SafeToRetry";
1528
- } | {
1529
1527
  readonly _tag: "CompletedWithResult";
1530
1528
  readonly result: Schema.Json;
1531
1529
  readonly isFailure: boolean;
1532
1530
  } | {
1533
1531
  readonly _tag: "NeverHappened";
1532
+ } | {
1533
+ readonly _tag: "SafeToRetry";
1534
1534
  } | {
1535
1535
  readonly _tag: "AbortSubmission";
1536
1536
  };
@@ -1540,31 +1540,13 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1540
1540
  } | {
1541
1541
  readonly _tag: "HostFailed";
1542
1542
  readonly failure: {
1543
- readonly _tag: "AdmissionConflict";
1544
- readonly threadId: string;
1545
- readonly principal: string;
1546
- readonly idempotencyKey: string;
1547
- readonly existingInputDigest: string;
1548
- readonly attemptedInputDigest: string;
1549
- } | {
1550
- readonly _tag: "AdmissionPolicyError";
1551
- readonly reason: "occupied" | "refused" | "unavailable";
1552
- readonly code: string;
1553
- readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
1554
- readonly stack?: string | undefined;
1555
- } | {
1556
- readonly _tag: "SettlementConflict";
1557
- readonly submissionId: string;
1558
- readonly existingOutcome: "aborted" | "completed" | "failed";
1559
- } | {
1560
- readonly _tag: "JoinedToHost";
1561
- readonly submissionId: string;
1562
- readonly hostSubmissionId: string;
1563
- } | {
1564
- readonly _tag: "LedgerError";
1543
+ readonly _tag: "DurableAlarmError";
1565
1544
  readonly operation: string;
1566
1545
  readonly message: string;
1567
- readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
1546
+ readonly cause?: Schema.Json | undefined;
1547
+ } | {
1548
+ readonly _tag: "ThreadNotMaterialized";
1549
+ readonly threadId: string;
1568
1550
  } | {
1569
1551
  readonly _tag: "ThreadStoreError";
1570
1552
  readonly operation: string;
@@ -1578,8 +1560,10 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1578
1560
  readonly sequence?: number | undefined;
1579
1561
  } | undefined;
1580
1562
  } | {
1581
- readonly _tag: "ThreadNotMaterialized";
1582
- readonly threadId: string;
1563
+ readonly _tag: "LedgerError";
1564
+ readonly operation: string;
1565
+ readonly message: string;
1566
+ readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
1583
1567
  } | {
1584
1568
  readonly _tag: "AppendConflict";
1585
1569
  readonly threadId: string;
@@ -1592,17 +1576,25 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1592
1576
  readonly threadId: string;
1593
1577
  readonly actualEpoch: number;
1594
1578
  readonly attemptedEpoch: number;
1595
- } | {
1596
- readonly _tag: "DurableAlarmError";
1597
- readonly operation: string;
1598
- readonly message: string;
1599
- readonly cause?: Schema.Json | undefined;
1600
1579
  } | {
1601
1580
  readonly _tag: "OperationDenied";
1602
1581
  readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
1603
1582
  readonly reason: string;
1604
1583
  readonly threadId?: string | undefined;
1605
1584
  readonly submissionId?: string | undefined;
1585
+ } | {
1586
+ readonly _tag: "AdmissionConflict";
1587
+ readonly threadId: string;
1588
+ readonly principal: string;
1589
+ readonly idempotencyKey: string;
1590
+ readonly existingInputDigest: string;
1591
+ readonly attemptedInputDigest: string;
1592
+ } | {
1593
+ readonly _tag: "AdmissionPolicyError";
1594
+ readonly reason: "occupied" | "refused" | "unavailable";
1595
+ readonly code: string;
1596
+ readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
1597
+ readonly stack?: string | undefined;
1606
1598
  } | {
1607
1599
  readonly _tag: "AgentInputError";
1608
1600
  readonly message: string;
@@ -1613,6 +1605,14 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1613
1605
  } | {
1614
1606
  readonly _tag: "DurableRuntimeFailpointError";
1615
1607
  readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-duration-append" | "run:after-start-append" | "run:before-duration-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:after-unavailable-append" | "tools:before-prepared-append" | "tools:before-unavailable-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "update:after-canonical-append" | "update:after-delivery-insert" | "update:before-canonical-append" | "update:before-delivery-insert" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-stop-append" | "worker:after-stop-seal" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-stop-append" | "worker:before-stop-seal" | "worker:before-subtree-append";
1608
+ } | {
1609
+ readonly _tag: "SettlementConflict";
1610
+ readonly submissionId: string;
1611
+ readonly existingOutcome: "aborted" | "completed" | "failed";
1612
+ } | {
1613
+ readonly _tag: "JoinedToHost";
1614
+ readonly submissionId: string;
1615
+ readonly hostSubmissionId: string;
1616
1616
  } | {
1617
1617
  readonly _tag: "AdmissionLimitExceeded";
1618
1618
  readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
@@ -9,6 +9,8 @@ declare const ProtectedTransportError_base: Schema.Class<ProtectedTransportError
9
9
  declare class ProtectedTransportError extends ProtectedTransportError_base {}
10
10
  declare const ProtectedBrowserDispatch_base: Context.ServiceClass<ProtectedBrowserDispatch, "@effect-agent/platform-cloudflare/ProtectedBrowserDispatch", {
11
11
  readonly mark: Effect.Effect<void>;
12
+ /** Only an acknowledged reply before assignment may restore the preceding dispatch evidence. */
13
+ readonly confirmNoWrite: Effect.Effect<void>;
12
14
  }>;
13
15
  /** Per-write evidence authority, provided by the policy immediately around a transport fill. */
14
16
  declare class ProtectedBrowserDispatch extends ProtectedBrowserDispatch_base {}
@@ -267,9 +267,15 @@ const makeProtectedBrowserPolicy = Effect.fn("ProtectedBrowser.open")(function*
267
267
  target: control.target,
268
268
  role: control.role
269
269
  });
270
- yield* publicFailure(driver.fill(decoded.ref, control.role, Redacted.make(decoded.value))).pipe(Effect.provideService(ProtectedBrowserDispatch, { mark: Effect.sync(() => {
271
- dispatch = "possibly-dispatched";
272
- }) }));
270
+ const previousDispatch = dispatch;
271
+ yield* publicFailure(driver.fill(decoded.ref, control.role, Redacted.make(decoded.value))).pipe(Effect.provideService(ProtectedBrowserDispatch, {
272
+ mark: Effect.sync(() => {
273
+ dispatch = "possibly-dispatched";
274
+ }),
275
+ confirmNoWrite: Effect.sync(() => {
276
+ dispatch = previousDispatch;
277
+ })
278
+ }));
273
279
  dispatch = "dispatched";
274
280
  milestone = "filled";
275
281
  yield* permitObservation;
@@ -356,11 +362,17 @@ const makeProtectedBrowserPolicy = Effect.fn("ProtectedBrowser.open")(function*
356
362
  yield* authorize;
357
363
  const value = secretFor(material, field.role);
358
364
  if (value === void 0) return yield* fail("missing-credential");
365
+ const previousDispatch = dispatch;
359
366
  observation = "protected";
360
- yield* publicFailure(driver.fill(field.ref, field.role, value)).pipe(Effect.provideService(ProtectedBrowserDispatch, { mark: Effect.sync(() => {
361
- dispatch = "possibly-dispatched";
362
- if (!exposures.some((target) => sameTarget(target, offer.target))) exposures.push(offer.target);
363
- }) }));
367
+ yield* publicFailure(driver.fill(field.ref, field.role, value)).pipe(Effect.provideService(ProtectedBrowserDispatch, {
368
+ mark: Effect.sync(() => {
369
+ dispatch = "possibly-dispatched";
370
+ if (!exposures.some((target) => sameTarget(target, offer.target))) exposures.push(offer.target);
371
+ }),
372
+ confirmNoWrite: Effect.sync(() => {
373
+ dispatch = previousDispatch;
374
+ })
375
+ }));
364
376
  dispatch = "dispatched";
365
377
  milestone = "partial-fill";
366
378
  }
@@ -504,12 +516,26 @@ const inspectFrame = `(() => {
504
516
  } else if (el instanceof HTMLButtonElement || (el instanceof HTMLInputElement && ['submit','button'].includes(type))) {
505
517
  if (!el.matches(':disabled')) role = type === 'submit' && form ? 'submit' : type === 'button' ? 'button' : 'unsupported';
506
518
  } else if (el instanceof HTMLAnchorElement) role = 'link';
519
+ const options = [];
520
+ let truncated = false;
521
+ if (role === 'select') {
522
+ for (let index = 0; index < el.options.length; index++) {
523
+ if (index === 256) { truncated = true; break; }
524
+ const option = el.options[index];
525
+ const label = option.label.trim();
526
+ // Never publish a shortened label as an exact fill choice.
527
+ if (label.length > 200) { truncated = true; continue; }
528
+ options.push({label, selected: option.selected, disabled: option.matches(':disabled')});
529
+ }
530
+ }
507
531
  const fingerprint = JSON.stringify([role, action, method, enctype, name, completion, type, choiceValue]);
508
532
  return { role, formIndex, action, fingerprint, ...(isChoice(el) ? {checked: el.checked} : {}),
533
+ ...(role === 'select' ? {options, truncated} : {}),
509
534
  label: (labelText(el) ?? (nativeField ? '' : el.textContent) ?? '').slice(0,200) };
510
535
  };
511
- const expose = ({role, formIndex, action, label, checked}) =>
512
- ({role, formIndex, action, label, ...(checked === undefined ? {} : {checked})});
536
+ const expose = ({role, formIndex, action, label, checked, options, truncated}) =>
537
+ ({role, formIndex, action, label, ...(checked === undefined ? {} : {checked}),
538
+ ...(options === undefined ? {} : {options, truncated})});
513
539
  const original = elements.map(describe);
514
540
  const validate = (index) => {
515
541
  const current = describe(elements[index]);
@@ -539,13 +565,13 @@ const inspectFrame = `(() => {
539
565
  const current = validate(index);
540
566
  if (!current || current.role !== role) return false;
541
567
  const el = elements[index];
542
- if (role === 'select') {
568
+ if (el instanceof HTMLSelectElement) {
543
569
  const options = [...el.options].filter(option => !option.matches(':disabled'));
544
- const values = options.filter(option => option.value === value);
545
- const matches = values.length > 0 ? values : options.filter(option => option.textContent?.trim() === value);
546
- if (matches.length !== 1) return 'unsupported';
570
+ // Ordinary fills name the visible choice; credential material stays a private value.
571
+ const matches = options.filter(option => (role === 'select' ? option.label.trim() : option.value) === value);
572
+ if (matches.length !== 1) return 'unsupported-before-write';
547
573
  value = matches[0].value;
548
- if ([...el.options].filter(option => option.value === value).length !== 1) return 'unsupported';
574
+ if ([...el.options].filter(option => option.value === value).length !== 1) return 'unsupported-before-write';
549
575
  }
550
576
  let prototype = Object.getPrototypeOf(el);
551
577
  let setter;
@@ -575,9 +601,17 @@ const Description = Schema.Struct({
575
601
  formIndex: Schema.Natural,
576
602
  action: Schema.String.check(Schema.isMaxLength(maxAttributeLength)),
577
603
  label: Schema.String.check(Schema.isMaxLength(200)),
578
- checked: Schema.optionalKey(Schema.Boolean)
604
+ checked: Schema.optionalKey(Schema.Boolean),
605
+ options: ProtectedBrowserControl.fields.options,
606
+ truncated: Schema.optionalKey(Schema.Boolean)
579
607
  });
580
608
  const Descriptions = Schema.Array(Schema.NullOr(Description)).check(Schema.isMaxLength(65));
609
+ const FillResult = Schema.Literals([
610
+ true,
611
+ false,
612
+ "unsupported-before-write",
613
+ "unsupported"
614
+ ]);
581
615
  /** One host-private acquired session. The SDK handles and exact-session cleanup have one owner. */
582
616
  var ProtectedNativeSession = class extends Context.Service()("@effect-agent/platform-cloudflare/ProtectedNativeSession") {};
583
617
  const transportError = (reason) => new ProtectedTransportError({ reason });
@@ -748,6 +782,7 @@ const makeProtectedNativeTransport = Effect.fn("ProtectedNativeTransport.make")(
748
782
  for (let index = 0; index < descriptions.length; index++) {
749
783
  const desc = descriptions[index];
750
784
  if (!desc) continue;
785
+ if (desc.truncated) truncated = true;
751
786
  if (discovered.length === 64) {
752
787
  truncated = true;
753
788
  break;
@@ -764,6 +799,7 @@ const makeProtectedNativeTransport = Effect.fn("ProtectedNativeTransport.make")(
764
799
  role: desc.role,
765
800
  label: desc.label,
766
801
  ...desc.checked === void 0 ? {} : { checked: desc.checked },
802
+ ...desc.options === void 0 ? {} : { options: desc.options },
767
803
  ...desc.role === "link" ? { url: desc.action } : {},
768
804
  target: CredentialTarget.make({
769
805
  topOrigin: before.topOrigin,
@@ -805,7 +841,7 @@ const makeProtectedNativeTransport = Effect.fn("ProtectedNativeTransport.make")(
805
841
  const dispatch = yield* ProtectedBrowserDispatch;
806
842
  const state = yield* get(ref);
807
843
  yield* dispatch.mark;
808
- const filled = yield* remote("protected.fill", () => state.frame.handle.evaluate((held, index, expectedRole, secret) => {
844
+ const raw = yield* remote("protected.fill", () => state.frame.handle.evaluate((held, index, expectedRole, secret) => {
809
845
  if (typeof held !== "object" || held === null) return false;
810
846
  return Reflect.apply(Reflect.get(held, "fill"), held, [
811
847
  index,
@@ -813,8 +849,12 @@ const makeProtectedNativeTransport = Effect.fn("ProtectedNativeTransport.make")(
813
849
  secret
814
850
  ]);
815
851
  }, state.index, role, Redacted.value(value)));
852
+ const filled = yield* decode(FillResult, raw);
853
+ if (filled === false || filled === "unsupported-before-write") {
854
+ yield* dispatch.confirmNoWrite;
855
+ return yield* transportError(filled === false ? "stale-reference" : "unsupported");
856
+ }
816
857
  if (filled === "unsupported") return yield* transportError("unsupported");
817
- if (filled !== true) return yield* transportError("stale-reference");
818
858
  }),
819
859
  click: Effect.fn("ProtectedNativeTransport.click")(function* (ref) {
820
860
  const state = yield* get(ref);
@@ -1 +1 @@
1
- {"version":3,"file":"ProtectedBrowser.mjs","names":[],"sources":["../src/protected-browser/policy.ts","../src/protected-browser/inspect-frame.ts","../src/protected-browser/native.ts","../src/protected-browser/binding.ts","../src/protected-browser/host.ts"],"sourcesContent":["import {\n Cause,\n Clock,\n Context,\n Crypto,\n Effect,\n Layer,\n Redacted,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\nimport { InteractiveBrowserPolicy } from \"effect-agent/interactive-browser\";\n/// <reference types=\"@cloudflare/workers-types\" />\nimport {\n BrowserCredentialAccess,\n type BrowserCredentialMaterial,\n CardCredential,\n CredentialOffer,\n CredentialOfferMetadata,\n CredentialOrigin,\n CredentialObservationDecision,\n type CredentialTarget,\n CredentialUseResult,\n ListCredentialOffers,\n LoginCredential,\n ProtectedBrowser,\n ProtectedBrowserClick,\n ProtectedBrowserCheckpoint,\n ProtectedBrowserError,\n ProtectedBrowserFill,\n ProtectedBrowserNavigate,\n ProtectedBrowserObservation,\n ProtectedBrowserControl,\n UseCredential,\n type CredentialFieldRole,\n type CredentialKind,\n type CredentialUseAuthorization,\n type ProtectedBrowserHandle,\n type ProtectedBrowserAction,\n type ProtectedCleanup,\n type ProtectedObservationState,\n} from \"effect-agent/protected-browser\";\n\nimport {\n BrowserRunFailure,\n inheritBrowserReport,\n reportBrowserCause,\n reportedBrowserError,\n} from \"../internal/browser-failure.ts\";\n\nexport class ProtectedTransportError extends Schema.TaggedError<ProtectedTransportError>()(\n \"ProtectedTransportError\",\n { reason: Schema.Literals([\"stale-reference\", \"needs-attention\", \"unsupported\", \"provider\"]) },\n) {}\n\n/** Per-write evidence authority, provided by the policy immediately around a transport fill. */\nexport class ProtectedBrowserDispatch extends Context.Service<\n ProtectedBrowserDispatch,\n { readonly mark: Effect.Effect<void> }\n>()(\"@effect-agent/platform-cloudflare/ProtectedBrowserDispatch\") {}\n\n/** Decoded adapter boundary. SDK exceptions and page diagnostics never cross this port. */\nexport interface ProtectedBrowserTransport {\n /** Select observation/target origins; undefined restores all network-permitted HTTPS frames. */\n readonly restrictObservation: (\n origins: ReadonlyArray<typeof CredentialOrigin.Type> | undefined,\n ) => Effect.Effect<void, ProtectedTransportError>;\n readonly context: Effect.Effect<typeof ProtectedPageContext.Type, ProtectedTransportError>;\n readonly discover: Effect.Effect<typeof ProtectedDiscovery.Type, ProtectedTransportError>;\n readonly target: (ref: string) => Effect.Effect<ProtectedBrowserControl, ProtectedTransportError>;\n readonly navigate: (url: string) => Effect.Effect<void, ProtectedTransportError>;\n readonly click: (ref: string) => Effect.Effect<void, ProtectedTransportError>;\n readonly fill: (\n ref: string,\n role: typeof CredentialFieldRole.Type | \"text\" | \"select\",\n value: Redacted.Redacted<string>,\n ) => Effect.Effect<void, ProtectedTransportError, ProtectedBrowserDispatch>;\n /** Invalidates local references synchronously before bounded exact-session cleanup. */\n readonly invalidate: () => void;\n /** Forget all discovered controls on a controller transition. */\n readonly resetReferences: () => void;\n /** Host attachment release, available only for transferable provider sessions. */\n readonly detach?: Effect.Effect<void, ProtectedBrowserError>;\n readonly close: Effect.Effect<typeof ProtectedCleanup.Type>;\n}\n\n/** Adapter-private injection seam for deterministic tests, not a model capability. */\nexport class BrowserRunProtectedTransport extends Context.Service<\n BrowserRunProtectedTransport,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<ProtectedBrowserTransport, ProtectedBrowserError, Scope.Scope>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunProtectedTransport\") {}\n\nexport const ProtectedPageContext = Schema.Struct({\n document: Schema.String.check(Schema.isUUID()),\n topOrigin: CredentialOrigin,\n frameOrigins: Schema.Array(CredentialOrigin).check(Schema.isMaxLength(16)),\n});\n\nexport const ProtectedDiscovery = Schema.Struct({\n ...ProtectedPageContext.fields,\n text: Schema.String.check(Schema.isMaxLength(64 * 1024)),\n controls: Schema.Array(ProtectedBrowserControl).check(Schema.isMaxLength(64)),\n truncated: Schema.Boolean,\n});\n\nconst sameTarget = (a: CredentialTarget, b: CredentialTarget) =>\n a.topOrigin === b.topOrigin &&\n a.frameOrigin === b.frameOrigin &&\n a.recipientOrigin === b.recipientOrigin &&\n a.document === b.document &&\n a.frame === b.frame &&\n a.form === b.form;\n\nconst kindFor = (role: string): typeof CredentialKind.Type | undefined =>\n role === \"username\" || role === \"password\"\n ? \"login\"\n : role.startsWith(\"card-\")\n ? \"card\"\n : undefined;\n\nconst secretFor = (material: BrowserCredentialMaterial, role: typeof CredentialFieldRole.Type) => {\n if (material._tag === \"LoginCredential\") {\n return role === \"username\"\n ? material.username\n : role === \"password\"\n ? material.password\n : undefined;\n }\n switch (role) {\n case \"card-name\":\n return material.name;\n case \"card-number\":\n return material.number;\n case \"card-expiry\":\n return material.expiry;\n case \"card-expiry-month\":\n return material.expiryMonth;\n case \"card-expiry-year\":\n return material.expiryYear;\n case \"card-security-code\":\n return material.securityCode;\n case \"username\":\n case \"password\":\n return undefined;\n }\n};\n\n/** Shared protected policy implementation for ephemeral and host-owned passes. */\nexport const makeProtectedBrowserPolicy = Effect.fn(\"ProtectedBrowser.open\")(function* (\n input: InteractiveBrowserPolicy,\n checkpoint?: ProtectedBrowserCheckpoint,\n) {\n const initialError = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({\n reason,\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"not-requested\",\n });\n\n const decodedPolicy = yield* Schema.decodeEffect(InteractiveBrowserPolicy, {\n onExcessProperty: \"error\",\n })(input).pipe(Effect.mapError(() => initialError(\"denied\")));\n\n if (decodedPolicy.network._tag === \"PublicWeb\") return yield* initialError(\"unsupported\");\n\n const policy = InteractiveBrowserPolicy.make({\n ...decodedPolicy,\n network:\n decodedPolicy.network._tag === \"ExactHosts\"\n ? { _tag: \"ExactHosts\", allowedHosts: [...decodedPolicy.network.allowedHosts] }\n : { _tag: \"Unrestricted\" },\n });\n\n // Capture the host access service for THIS execution, not the application singleton.\n const access = yield* BrowserCredentialAccess;\n\n const restored =\n checkpoint === undefined\n ? undefined\n : yield* Schema.decodeEffect(ProtectedBrowserCheckpoint)(checkpoint).pipe(\n Effect.mapError(() => initialError(\"denied\")),\n );\n\n const now = yield* Clock.currentTimeMillis;\n\n if (\n restored !== undefined &&\n (restored.startedAt > now ||\n restored.actions > policy.maxActions ||\n now - restored.startedAt >= policy.maxElapsedMillis)\n )\n return yield* initialError(\"timeout\");\n const started = restored?.startedAt ?? now;\n const driver = yield* (yield* BrowserRunProtectedTransport).open(policy);\n const crypto = yield* Crypto.Crypto;\n let suspended = restored !== undefined;\n let detached = false;\n let needsObservation = restored !== undefined;\n let humanExposure = restored?.humanExposure ?? false;\n let humanOrigins = [...(restored?.humanOrigins ?? [])];\n const lock = yield* Semaphore.make(1);\n let observation: typeof ProtectedObservationState.Type = \"before-exposure\";\n let cleanup: typeof ProtectedCleanup.Type = \"not-requested\";\n let actions = restored?.actions ?? 0;\n let dispatch: ProtectedBrowserError[\"dispatch\"] = restored?.dispatch ?? \"not-dispatched\";\n let milestone: ProtectedBrowserError[\"milestone\"] = restored?.milestone ?? \"none\";\n const exposures: Array<CredentialTarget> = [...(restored?.exposures ?? [])];\n\n const offers = new Map<\n string,\n {\n caller: Redacted.Redacted<string>;\n key: Redacted.Redacted<string>;\n target: CredentialTarget;\n targetRef: string;\n kind: typeof CredentialKind.Type;\n expires: number;\n }\n >();\n\n const fail = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({ reason, dispatch, milestone, observation, cleanup });\n\n const close = yield* Effect.cached(\n Effect.uninterruptible(\n Effect.gen(function* () {\n observation = \"closed\";\n offers.clear();\n driver.invalidate();\n cleanup = yield* driver.close.pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () =>\n Effect.fail(\n new BrowserRunFailure({ operation: \"protected.close\", reason: \"timeout\" }),\n ),\n }),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"protected.close\", cause).pipe(Effect.as(\"unconfirmed\" as const)),\n ),\n );\n\n return cleanup;\n }),\n ),\n );\n\n yield* Effect.addFinalizer(() => (detached ? Effect.void : close));\n\n const publicFailure = <A, E extends { readonly reason: ProtectedBrowserError[\"reason\"] }, R>(\n effect: Effect.Effect<A, E, R>,\n ) =>\n effect.pipe(\n Effect.catchCause((cause) =>\n Effect.failCause(\n Cause.map(cause, (error) => inheritBrowserReport(error, fail(error.reason))),\n ),\n ),\n );\n\n const decode = <A>(schema: Schema.Codec<A>, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.policy.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(fail(\"provider\")))),\n ),\n ),\n );\n\n const caller = access.caller.pipe(publicFailure);\n const pageContext = publicFailure(driver.context);\n\n const permitObservation = Effect.gen(function* () {\n const context = yield* pageContext;\n let origins: ReadonlyArray<typeof CredentialOrigin.Type> | undefined;\n\n if (exposures.length > 0 || humanExposure) {\n observation = \"protected\";\n const principal = yield* caller;\n\n const rawDecision = yield* access\n .observation({\n ...context,\n caller: principal,\n exposures: [...exposures],\n humanExposure,\n humanOrigins,\n })\n .pipe(publicFailure);\n\n if (Redacted.value(yield* caller) !== Redacted.value(principal)) return yield* fail(\"denied\");\n\n const decision = yield* Schema.decodeEffect(CredentialObservationDecision)(rawDecision).pipe(\n Effect.mapError(() => fail(\"observation-blocked\")),\n );\n\n if (decision === \"deny\") return yield* fail(\"observation-blocked\");\n if (typeof decision !== \"string\") {\n origins = [...decision.origins];\n if (!origins.includes(context.topOrigin)) return yield* fail(\"observation-blocked\");\n }\n observation = \"approved-after-exposure\";\n }\n yield* publicFailure(driver.restrictObservation(origins));\n\n return {\n ...context,\n frameOrigins: context.frameOrigins.filter(\n (origin) => origins === undefined || origins.includes(origin),\n ),\n };\n });\n\n const target = (ref: string) => publicFailure(driver.target(ref));\n\n const authorizeAction = Effect.fn(\"ProtectedBrowser.authorizeAction\")(function* (\n action: ProtectedBrowserAction,\n ) {\n if (access.authorizeAction === undefined) {\n if (action._tag === \"Submit\") return yield* fail(\"unsupported\");\n\n return;\n }\n const principal = yield* caller;\n\n yield* access\n .authorizeAction({ caller: principal, action, exposures: [...exposures] })\n .pipe(publicFailure);\n if (Redacted.value(yield* caller) !== Redacted.value(principal)) return yield* fail(\"denied\");\n if (action._tag !== \"Navigate\") {\n const current = yield* target(action.ref);\n\n if (\n !sameTarget(current.target, action.target) ||\n current.role !== (action._tag === \"Submit\" ? \"submit\" : action.role) ||\n (action._tag === \"Click\" && action.role === \"link\" && current.url !== action.url)\n )\n return yield* fail(\"stale-reference\");\n }\n }, Effect.withTracerEnabled(false));\n\n const bounded = <A>(result: A) => {\n const bytes = new TextEncoder().encode(JSON.stringify(result)).byteLength;\n\n return bytes <= policy.maxReturnedBytes ? Effect.succeed(result) : Effect.fail(fail(\"limit\"));\n };\n\n const run = <A>(effect: Effect.Effect<A, ProtectedBrowserError>, observing = false) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n if (suspended || detached) return yield* fail(\"busy\");\n if (needsObservation && !observing) return yield* fail(\"stale-reference\");\n dispatch = \"not-dispatched\";\n milestone = \"none\";\n if (observation === \"closed\") return yield* fail(\"closed\");\n if (++actions > policy.maxActions) return yield* fail(\"limit\");\n\n const remaining = policy.maxElapsedMillis - ((yield* Clock.currentTimeMillis) - started);\n\n if (remaining <= 0) {\n yield* close;\n\n return yield* fail(\"timeout\");\n }\n\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: remaining,\n orElse: () => Effect.fail(fail(\"timeout\")),\n }),\n Effect.catchCause((cause) =>\n Effect.gen(function* () {\n // Expected rejections cannot hide a concurrent defect. Preserve safe diagnostics first.\n const unexpected = cause.reasons.filter(\n (reason) =>\n reason._tag === \"Die\" ||\n (reason._tag === \"Fail\" && !Schema.is(ProtectedBrowserError)(reason.error)),\n );\n\n if (unexpected.length > 0)\n yield* reportBrowserCause(\"protected.operation\", Cause.fromReasons(unexpected));\n\n const error = cause.reasons.find(\n (reason) =>\n reason._tag === \"Fail\" && Schema.is(ProtectedBrowserError)(reason.error),\n );\n\n const reason =\n unexpected.length === 0 &&\n error?._tag === \"Fail\" &&\n Schema.is(ProtectedBrowserError)(error.error)\n ? error.error.reason\n : \"provider\";\n\n const interrupt = cause.reasons.some((reason) => reason._tag === \"Interrupt\");\n\n if (\n dispatch === \"possibly-dispatched\" ||\n (dispatch === \"dispatched\" && reason !== \"busy\") ||\n interrupt ||\n reason === \"provider\" ||\n reason === \"timeout\"\n )\n yield* close;\n if (interrupt) return yield* Effect.interrupt;\n\n const outcome = fail(\n dispatch === \"possibly-dispatched\" && reason === \"provider\"\n ? \"outcome-unknown\"\n : reason,\n );\n\n return yield* unexpected.length > 0\n ? reportedBrowserError(outcome)\n : inheritBrowserReport(error?._tag === \"Fail\" ? error.error : undefined, outcome);\n }),\n ),\n Effect.onInterrupt(() => close),\n Effect.withTracerEnabled(false),\n );\n }),\n )\n .pipe(\n Effect.flatMap(\n Effect.fromOption(\n () =>\n new ProtectedBrowserError({\n reason: \"busy\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation,\n cleanup,\n }),\n ),\n ),\n );\n\n const handle: ProtectedBrowserHandle = {\n close: Effect.suspend(() => (detached ? Effect.succeed(\"not-requested\" as const) : close)),\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserNavigate)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n let url: URL;\n\n try {\n url = new URL(decoded.url);\n } catch {\n return yield* fail(\"denied\");\n }\n if (\n url.protocol !== \"https:\" ||\n url.username ||\n url.password ||\n (policy.network._tag === \"ExactHosts\" &&\n !policy.network.allowedHosts.includes(url.host))\n )\n return yield* fail(\"denied\");\n if (exposures.length > 0 || humanExposure) yield* permitObservation;\n yield* authorizeAction({ _tag: \"Navigate\", url: decoded.url });\n offers.clear();\n dispatch = \"possibly-dispatched\";\n yield* publicFailure(driver.navigate(decoded.url));\n dispatch = \"dispatched\";\n yield* permitObservation;\n }),\n ),\n observe: run(\n Effect.gen(function* () {\n const before = yield* permitObservation;\n const result = yield* publicFailure(driver.discover);\n const after = yield* permitObservation;\n\n if (\n before.document !== after.document ||\n result.document !== after.document ||\n result.topOrigin !== after.topOrigin\n )\n return yield* fail(\"stale-reference\");\n if (result.frameOrigins.some((origin) => !after.frameOrigins.includes(origin)))\n return yield* fail(\"observation-blocked\");\n\n const observation = yield* bounded(\n ProtectedBrowserObservation.make({\n ...result,\n observation:\n exposures.length > 0 || humanExposure ? \"approved-after-exposure\" : \"before-exposure\",\n }),\n );\n\n needsObservation = false;\n\n return observation;\n }),\n true,\n ),\n click: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserClick)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n yield* permitObservation;\n const control = yield* target(decoded.ref);\n\n if (\n control.role !== \"link\" &&\n control.role !== \"button\" &&\n control.role !== \"radio\" &&\n control.role !== \"checkbox\" &&\n control.role !== \"submit\"\n )\n return yield* fail(\"unsupported\");\n let action: ProtectedBrowserAction;\n\n if (control.role === \"link\") {\n if (control.url === undefined) return yield* fail(\"unsupported\");\n action = {\n _tag: \"Click\",\n ref: decoded.ref,\n target: control.target,\n role: \"link\",\n url: control.url,\n };\n } else if (control.role === \"submit\") {\n action = { _tag: \"Submit\", ref: decoded.ref, target: control.target };\n } else {\n action = {\n _tag: \"Click\",\n ref: decoded.ref,\n target: control.target,\n role: control.role,\n };\n }\n yield* authorizeAction(action);\n dispatch = \"possibly-dispatched\";\n yield* publicFailure(driver.click(decoded.ref)).pipe(\n Effect.catch((error) => {\n if (error.reason === \"needs-attention\") dispatch = \"not-dispatched\";\n\n return Effect.fail(error);\n }),\n );\n dispatch = \"dispatched\";\n if (control.role === \"submit\") milestone = \"submission-dispatched\";\n yield* permitObservation;\n }),\n ),\n fill: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserFill, {\n onExcessProperty: \"error\",\n })(request).pipe(Effect.mapError(() => fail(\"denied\")));\n\n yield* permitObservation;\n const control = yield* target(decoded.ref);\n\n if (control.role !== \"text\" && control.role !== \"select\")\n return yield* fail(\"unsupported\");\n yield* authorizeAction({\n _tag: \"Fill\",\n ref: decoded.ref,\n target: control.target,\n role: control.role,\n });\n yield* publicFailure(\n driver.fill(decoded.ref, control.role, Redacted.make(decoded.value)),\n ).pipe(\n Effect.provideService(ProtectedBrowserDispatch, {\n mark: Effect.sync(() => {\n dispatch = \"possibly-dispatched\";\n }),\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"filled\";\n yield* permitObservation;\n }),\n ),\n listCredentialOffers: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ListCredentialOffers)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n yield* permitObservation;\n const control = yield* target(decoded.target);\n\n if (kindFor(control.role) !== decoded.kind) return yield* fail(\"unsupported\");\n const principal = yield* caller;\n\n const candidates = yield* access\n .list({ caller: principal, kind: decoded.kind, target: control.target })\n .pipe(publicFailure);\n\n const now = yield* Clock.currentTimeMillis;\n\n for (const [ref, offer] of offers) if (offer.expires <= now) offers.delete(ref);\n if (candidates.length > 16 || offers.size + candidates.length > 64)\n return yield* fail(\"limit\");\n if (!sameTarget(control.target, (yield* target(decoded.target)).target))\n return yield* fail(\"stale-reference\");\n const expires = now + 60_000;\n const result: Array<CredentialOffer> = [];\n const pending: typeof offers = new Map();\n\n for (const candidate of candidates) {\n const metadata = yield* decode(CredentialOfferMetadata, candidate.metadata);\n\n const ref = yield* crypto.randomUUIDv4.pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.identity\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(fail(\"provider\")))),\n ),\n ),\n );\n\n pending.set(ref, {\n caller: principal,\n key: candidate.key,\n target: control.target,\n targetRef: decoded.target,\n kind: decoded.kind,\n expires,\n });\n result.push(CredentialOffer.make({ ref, kind: decoded.kind, metadata }));\n }\n yield* bounded(result);\n for (const [ref, offer] of pending) offers.set(ref, offer);\n\n return result;\n }),\n ),\n useCredential: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(UseCredential)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n const offer = offers.get(decoded.offer);\n\n if (offer === undefined || offer.expires <= (yield* Clock.currentTimeMillis))\n return yield* fail(\"stale-reference\");\n const principal = yield* caller;\n\n if (Redacted.value(principal) !== Redacted.value(offer.caller))\n return yield* fail(\"denied\");\n if (\n new Set(decoded.fields.map((field) => field.ref)).size !== decoded.fields.length ||\n new Set(decoded.fields.map((field) => field.role)).size !== decoded.fields.length\n )\n return yield* fail(\"denied\");\n\n const validate = Effect.gen(function* () {\n if (!sameTarget(offer.target, (yield* target(offer.targetRef)).target))\n return yield* fail(\"stale-reference\");\n for (const field of decoded.fields) {\n const current = yield* target(field.ref);\n\n if (\n field.role !== current.role ||\n kindFor(field.role) !== offer.kind ||\n !sameTarget(offer.target, current.target)\n )\n return yield* fail(\"denied\");\n }\n if (decoded.submit !== undefined) {\n const submit = yield* target(decoded.submit);\n\n if (submit.role !== \"submit\" || !sameTarget(offer.target, submit.target))\n return yield* fail(\"denied\");\n }\n });\n\n yield* validate;\n\n const authorization: CredentialUseAuthorization = {\n caller: principal,\n key: offer.key,\n kind: offer.kind,\n target: offer.target,\n roles: decoded.fields.map((field) => field.role),\n submit: decoded.submit !== undefined,\n };\n\n const authorize = Effect.gen(function* () {\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n yield* access.authorize(authorization).pipe(publicFailure);\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n });\n\n yield* authorize;\n yield* validate;\n\n const raw = yield* access.resolve(authorization).pipe(publicFailure);\n\n const material = yield* Schema.decodeEffect(\n offer.kind === \"login\" ? LoginCredential : CardCredential,\n )(raw).pipe(Effect.mapError(() => fail(\"resolver\")));\n\n for (const field of decoded.fields)\n if (secretFor(material, field.role) === undefined)\n return yield* fail(\"missing-credential\");\n offers.delete(decoded.offer);\n for (const field of decoded.fields) {\n yield* validate;\n yield* authorize;\n const value = secretFor(material, field.role);\n\n if (value === undefined) return yield* fail(\"missing-credential\");\n observation = \"protected\";\n yield* publicFailure(driver.fill(field.ref, field.role, value)).pipe(\n Effect.provideService(ProtectedBrowserDispatch, {\n mark: Effect.sync(() => {\n dispatch = \"possibly-dispatched\";\n if (!exposures.some((target) => sameTarget(target, offer.target)))\n exposures.push(offer.target);\n }),\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"partial-fill\";\n }\n milestone = \"filled\";\n if (decoded.submit !== undefined) {\n yield* validate;\n yield* authorize;\n const ref = decoded.submit;\n\n dispatch = \"possibly-dispatched\";\n yield* publicFailure(driver.click(ref)).pipe(\n Effect.catch((error) => {\n if (error.reason === \"needs-attention\") dispatch = \"dispatched\";\n\n return Effect.fail(error);\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"submission-dispatched\";\n }\n yield* permitObservation;\n\n return CredentialUseResult.make({\n dispatch,\n milestone,\n observation,\n cleanup,\n authentication: \"unverified\",\n });\n }),\n ),\n };\n\n const locked = <A>(effect: Effect.Effect<A, ProtectedBrowserError>) =>\n lock\n .withPermitsIfAvailable(1)(effect)\n .pipe(Effect.flatMap(Effect.fromOption(() => fail(\"busy\"))));\n\n return {\n handle,\n suspend: (human = false) =>\n locked(\n Effect.gen(function* () {\n if (detached || observation === \"closed\") return yield* fail(\"closed\");\n if (dispatch === \"possibly-dispatched\") return yield* fail(\"outcome-unknown\");\n if ((yield* Clock.currentTimeMillis) - started >= policy.maxElapsedMillis)\n return yield* fail(\"timeout\");\n suspended = true;\n if (human) {\n const context = yield* pageContext;\n\n const origins = yield* Schema.decodeEffect(\n ProtectedBrowserCheckpoint.fields.humanOrigins,\n )([...new Set([...humanOrigins, context.topOrigin, ...context.frameOrigins])]).pipe(\n Effect.catch(() => fail(\"needs-attention\")),\n );\n\n humanExposure = true;\n humanOrigins = [...origins];\n observation = \"protected\";\n }\n driver.resetReferences();\n offers.clear();\n\n return ProtectedBrowserCheckpoint.make({\n policy,\n startedAt: started,\n actions,\n exposures: [...exposures],\n humanExposure,\n humanOrigins,\n dispatch,\n milestone,\n });\n }),\n ),\n returnControl: locked(\n Effect.gen(function* () {\n if (detached || observation === \"closed\") return yield* fail(\"closed\");\n if (!suspended) return yield* fail(\"denied\");\n offers.clear();\n driver.resetReferences();\n needsObservation = true;\n suspended = false;\n }),\n ),\n detach: locked(\n Effect.gen(function* () {\n if (!suspended || observation === \"closed\") return yield* fail(\"denied\");\n if (driver.detach === undefined) return yield* fail(\"unsupported\");\n yield* driver.detach.pipe(\n Effect.onError(() => close),\n Effect.onInterrupt(() => close),\n );\n detached = true;\n offers.clear();\n driver.invalidate();\n }),\n ),\n };\n}, Effect.withTracerEnabled(false));\n\n/** Fresh private passes; scoped release confirms exact-session termination. */\nexport const browserRunProtectedLayer = () =>\n Layer.effect(ProtectedBrowser)(\n Effect.gen(function* () {\n const transport = yield* BrowserRunProtectedTransport;\n const crypto = yield* Crypto.Crypto;\n\n return {\n open: (policy: InteractiveBrowserPolicy) =>\n makeProtectedBrowserPolicy(policy).pipe(\n Effect.map((session) => session.handle),\n Effect.provideService(BrowserRunProtectedTransport, transport),\n Effect.provideService(Crypto.Crypto, crypto),\n ),\n };\n }),\n );\n","// This fixed program runs in an isolated world. Pages cannot replace its native DOM methods.\n// Handles retain actual nodes; a selector is never reconstructed from an opaque reference.\nexport const maxAttributeLength = 2048;\n\nexport const inspectFrame = `(() => {\n const doc = document;\n const forms = [];\n const isChoice = el => el instanceof HTMLInputElement && ['radio','checkbox'].includes(el.type);\n const presented = el => {\n if (el.closest('[hidden],[aria-hidden=\"true\"],[inert]') ||\n ['hidden','collapse'].includes(getComputedStyle(el).visibility)) return false;\n for (let parent = el; parent; parent = parent.parentElement) {\n if (getComputedStyle(parent).opacity === '0') return false;\n }\n return true;\n };\n const hasLayout = el => presented(el) &&\n [...el.getClientRects()].some(rect => rect.width > 0 && rect.height > 0);\n const available = el => el.type !== 'hidden' && !el.closest('[hidden],[aria-hidden=\"true\"],[inert]') &&\n (hasLayout(el) || (isChoice(el) && [...(el.labels ?? [])].some(hasLayout)));\n const elements = [...doc.querySelectorAll('input,textarea,select,button,a[href]')].filter(available).slice(0, 65);\n const labelText = el => {\n const label = el.labels?.[0]?.cloneNode(true);\n label?.querySelectorAll('input,textarea,select,script,style,noscript').forEach(child => child.remove());\n return label?.textContent ?? el.getAttribute('aria-label');\n };\n const describe = (el) => {\n if (doc !== document || !el.isConnected || el.ownerDocument !== doc || !available(el)) return null;\n const form = el.form ?? null;\n let formIndex = forms.indexOf(form);\n if (formIndex < 0) { formIndex = forms.length; forms.push(form); }\n // Resolved href (including path/query/fragment and base-URL changes) is part of the fingerprint.\n const action = el instanceof HTMLAnchorElement ? el.href : form ? (el.hasAttribute('formaction') ? el.formAction : form.action || doc.URL) : doc.URL;\n const method = form ? (el.hasAttribute('formmethod') ? el.formMethod : form.method) : '';\n const enctype = form?.enctype ?? '';\n const name = el.name ?? '';\n const completion = el.getAttribute('autocomplete') ?? '';\n const inputType = el.type ?? '';\n const choiceValue = isChoice(el) ? el.value : '';\n // Reject before parsing, fingerprinting or CDP transfer. Truncation could hide a target change.\n if ([action, method, enctype, name, completion, inputType, choiceValue].some(value => value.length > ${maxAttributeLength})) return null;\n const type = inputType.toLowerCase();\n const autocomplete = completion.trim().toLowerCase().split(/\\\\s+/).at(-1);\n const cardRoles = { 'cc-name':'card-name', 'cc-number':'card-number', 'cc-exp':'card-expiry',\n 'cc-exp-month':'card-expiry-month', 'cc-exp-year':'card-expiry-year', 'cc-csc':'card-security-code' };\n let role = 'unsupported';\n const nativeField = el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement;\n if (nativeField && !['submit','button'].includes(type) && !el.matches(':disabled') && !el.readOnly && !(el instanceof HTMLSelectElement && el.multiple)) {\n if (isChoice(el)) role = type;\n else if (type === 'password' || ['current-password','new-password','one-time-code'].includes(autocomplete)) {\n if (type === 'password' && form) role = 'password';\n } else if (['text','email','tel','number','month','search','url','date','time','week','datetime-local','textarea',''].includes(type) || el instanceof HTMLSelectElement) {\n if (cardRoles[autocomplete]) { if (form) role = cardRoles[autocomplete]; }\n // Email autocomplete alone is contact data; explicit usernames and password forms identify login fields.\n else if (autocomplete === 'username') { if (form) role = 'username'; }\n else if (['text','email'].includes(type) && form && form.querySelector('input[type=\"password\"]')) role = 'username';\n else if (el instanceof HTMLSelectElement) { if (!el.multiple) role = 'select'; }\n else role = 'text';\n }\n } else if (el instanceof HTMLButtonElement || (el instanceof HTMLInputElement && ['submit','button'].includes(type))) {\n if (!el.matches(':disabled')) role = type === 'submit' && form ? 'submit' : type === 'button' ? 'button' : 'unsupported';\n } else if (el instanceof HTMLAnchorElement) role = 'link';\n const fingerprint = JSON.stringify([role, action, method, enctype, name, completion, type, choiceValue]);\n return { role, formIndex, action, fingerprint, ...(isChoice(el) ? {checked: el.checked} : {}),\n label: (labelText(el) ?? (nativeField ? '' : el.textContent) ?? '').slice(0,200) };\n };\n const expose = ({role, formIndex, action, label, checked}) =>\n ({role, formIndex, action, label, ...(checked === undefined ? {} : {checked})});\n const original = elements.map(describe);\n const validate = (index) => {\n const current = describe(elements[index]);\n if (!current || !original[index] || current.fingerprint !== original[index].fingerprint ||\n current.formIndex !== original[index].formIndex) return null;\n return expose(current);\n };\n return {\n doc, elements, original: original.map(current => current && expose(current)), validate,\n text: () => {\n if (doc !== document) return null;\n if (!doc.body) return '';\n const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT);\n const range = doc.createRange();\n let text = '';\n for (let node = walker.nextNode(); node && text.length < 65536; node = walker.nextNode()) {\n const parent = node.parentElement;\n if (!parent || parent.closest('input,textarea,select,script,style,noscript,iframe,object,embed')) continue;\n if (!presented(parent)) continue;\n range.selectNodeContents(node);\n if (![...range.getClientRects()].some(rect => rect.width > 0 && rect.height > 0)) continue;\n text += (node.textContent ?? '').replace(/\\\\s+/g, ' ') + ' ';\n }\n return text.slice(0,65536);\n },\n fill: (index, role, value) => {\n const current = validate(index);\n if (!current || current.role !== role) return false;\n const el = elements[index];\n if (role === 'select') {\n const options = [...el.options].filter(option => !option.matches(':disabled'));\n const values = options.filter(option => option.value === value);\n const matches = values.length > 0 ? values : options.filter(option => option.textContent?.trim() === value);\n if (matches.length !== 1) return 'unsupported';\n value = matches[0].value;\n if ([...el.options].filter(option => option.value === value).length !== 1) return 'unsupported';\n }\n let prototype = Object.getPrototypeOf(el);\n let setter;\n while (prototype && !setter) { setter = Object.getOwnPropertyDescriptor(prototype,'value')?.set; prototype = Object.getPrototypeOf(prototype); }\n if (!setter) return false;\n // Validate and mutate in one isolated-world task, without focusing first and running\n // page handlers between validation and assignment. Native setters support controlled inputs.\n setter.call(el, value);\n if (el.value !== value) return 'unsupported';\n el.dispatchEvent(new Event('input', {bubbles:true}));\n el.dispatchEvent(new Event('change', {bubbles:true}));\n return true;\n },\n click: (index) => {\n const current = validate(index);\n if (!current || !['button','submit','link','radio','checkbox'].includes(current.role)) return false;\n if (current.role === 'submit' && elements[index].form && !elements[index].form.matches(':valid')) return 'needs-attention';\n elements[index].click();\n return true;\n }\n };\n})()`;\n","/// <reference types=\"@cloudflare/workers-types\" />\nimport type { Browser, Frame, JSHandle, Page } from \"@cloudflare/puppeteer\";\nimport { Cause, Clock, Context, Crypto, Effect, Redacted, Schema, type Scope } from \"effect\";\nimport { type InteractiveBrowserPolicy } from \"effect-agent/interactive-browser\";\nimport {\n CredentialOrigin,\n CredentialTarget,\n ProtectedBrowserControl,\n} from \"effect-agent/protected-browser\";\n\nimport {\n browserFailure,\n reportBrowserCause,\n reportedBrowserError,\n} from \"../internal/browser-failure.ts\";\nimport { inspectFrame, maxAttributeLength } from \"./inspect-frame.ts\";\nimport {\n ProtectedBrowserDispatch,\n ProtectedTransportError,\n ProtectedDiscovery,\n ProtectedPageContext,\n type ProtectedBrowserTransport,\n} from \"./policy.ts\";\n\n// The pinned SDK implements this method but strips its internal declaration from lib/types.d.ts.\n// Keep the declaration narrow and refuse runtimes without it. No main-world fallback is safe.\ndeclare module \"@cloudflare/puppeteer\" {\n interface Frame {\n isolatedRealm(): { evaluateHandle(source: string): Promise<JSHandle<unknown>> };\n }\n}\n\nconst Description = Schema.Struct({\n role: ProtectedBrowserControl.fields.role,\n formIndex: Schema.Natural,\n action: Schema.String.check(Schema.isMaxLength(maxAttributeLength)),\n label: Schema.String.check(Schema.isMaxLength(200)),\n checked: Schema.optionalKey(Schema.Boolean),\n});\n\nconst Descriptions = Schema.Array(Schema.NullOr(Description)).check(Schema.isMaxLength(65));\n\ninterface FrameState {\n readonly frame: Frame;\n readonly handle: JSHandle<unknown>;\n readonly ref: string;\n readonly document: string;\n readonly forms: Map<number, string>;\n}\ninterface ControlState {\n readonly frame: FrameState;\n readonly index: number;\n readonly control: ProtectedBrowserControl;\n readonly expires: number;\n}\n\n/** One host-private acquired session. The SDK handles and exact-session cleanup have one owner. */\nexport class ProtectedNativeSession extends Context.Service<\n ProtectedNativeSession,\n {\n readonly browser: Browser;\n readonly page: Page;\n readonly close: Effect.Effect<\"confirmed\" | \"unconfirmed\">;\n /** Host-owned attachment release may detach a committed suspended session. */\n readonly release?: Effect.Effect<void>;\n }\n>()(\"@effect-agent/platform-cloudflare/ProtectedNativeSession\") {}\n\nconst transportError = (reason: ProtectedTransportError[\"reason\"]) =>\n new ProtectedTransportError({ reason });\n\nconst decode = <A>(schema: Schema.Codec<A>, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(transportError(\"provider\")))),\n ),\n ),\n );\n\n// Attach rejection handling inside the SDK callback before workerd can report foreign diagnostics.\nconst remote = <A>(operation: string, run: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: async (signal) => {\n try {\n return { ok: true as const, value: await run(signal) };\n } catch (cause) {\n return { ok: false as const, failure: browserFailure(operation, cause) };\n }\n },\n catch: (cause) => browserFailure(operation, cause),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok ? Effect.succeed(result.value) : Effect.fail(result.failure),\n ),\n Effect.catch((failure) =>\n reportBrowserCause(operation, Cause.fail(failure)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(transportError(\"provider\")))),\n ),\n ),\n );\n\n/** Host-private scoped transport. Session capabilities are requirements; policy is per-pass data. */\nexport const makeProtectedNativeTransport = Effect.fn(\"ProtectedNativeTransport.make\")(function* (\n policy: InteractiveBrowserPolicy,\n): Effect.fn.Return<\n ProtectedBrowserTransport,\n never,\n ProtectedNativeSession | Crypto.Crypto | Scope.Scope\n> {\n const session = yield* ProtectedNativeSession;\n const { browser, page } = session;\n const crypto = yield* Crypto.Crypto;\n const clock = yield* Clock.Clock;\n\n const uuid = crypto.randomUUIDv4.pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.identity\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(transportError(\"provider\")))),\n ),\n ),\n );\n\n let closed = false;\n let violation = false;\n let documentRef: string | undefined;\n let observationOrigins: ReadonlySet<string> | undefined;\n const frames = new Map<Frame, FrameState>();\n const controls = new Map<string, ControlState>();\n\n const origin = (value: string) =>\n Effect.try({\n try: () => {\n const url = new URL(value);\n\n if (url.username || url.password) throw transportError(\"stale-reference\");\n if (!Schema.is(CredentialOrigin)(url.origin)) throw transportError(\"unsupported\");\n if (policy.network._tag === \"ExactHosts\" && !policy.network.allowedHosts.includes(url.host))\n throw transportError(\"stale-reference\");\n\n return url.origin;\n },\n catch: (cause) =>\n Schema.is(ProtectedTransportError)(cause) ? cause : transportError(\"provider\"),\n });\n\n const check = Effect.suspend(() =>\n closed || violation || !browser.isConnected()\n ? Effect.fail(transportError(\"stale-reference\"))\n : Effect.void,\n );\n\n const clear = () => {\n controls.clear();\n // Browser event callbacks only invalidate. The next Effect operation allocates the new identity.\n documentRef = undefined;\n };\n\n const onNavigated = () => {\n clear();\n };\n\n const onTarget = (target: { type(): string }) => {\n if (target.type() !== \"page\") return;\n // No popup or additional page may inherit an observation channel.\n violation = true;\n clear();\n };\n\n const invalidate = () => {\n closed = true;\n clear();\n };\n\n const observationFrames = Effect.gen(function* () {\n const list = page.frames();\n\n if (list.length > 32) return yield* transportError(\"unsupported\");\n\n // Opaque/blank child documents have no observation channel or credential targets.\n // The main document and every retained HTTPS child still require strict origin validation.\n return yield* Effect.filter(list, (frame) =>\n frame === page.mainFrame()\n ? Effect.succeed(true)\n : Effect.try({\n try: () => frame.url() !== \"\" && new URL(frame.url()).protocol === \"https:\",\n catch: () => transportError(\"provider\"),\n }),\n );\n });\n\n const context = Effect.gen(function* () {\n yield* check;\n const list = yield* observationFrames;\n const topOrigin = yield* origin(page.url());\n const frameOrigins = [...new Set(yield* Effect.forEach(list, (frame) => origin(frame.url())))];\n\n if (frameOrigins.length > 16) return yield* transportError(\"unsupported\");\n\n if (documentRef === undefined) documentRef = yield* uuid;\n\n return yield* decode(ProtectedPageContext, { document: documentRef, topOrigin, frameOrigins });\n });\n\n const isCurrent = Effect.fn(\"ProtectedNativeTransport.isCurrent\")(function* (state: FrameState) {\n if (state.frame.detached) return false;\n\n return yield* remote(\"protected.validate-document\", () =>\n state.handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.get(held, \"doc\") === Reflect.get(globalThis, \"document\");\n }),\n );\n });\n\n const get = Effect.fn(\"ProtectedNativeTransport.get\")(function* (ref: string) {\n yield* check;\n const state = controls.get(ref);\n\n if (\n !state ||\n (observationOrigins !== undefined &&\n !observationOrigins.has(state.control.target.frameOrigin)) ||\n state.expires <= (yield* clock.currentTimeMillis) ||\n !(yield* isCurrent(state.frame))\n )\n return yield* transportError(\"stale-reference\");\n\n const current = yield* remote(\"protected.validate-control\", () =>\n state.frame.handle.evaluate((held, index) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.apply(Reflect.get(held, \"validate\"), held, [index]);\n }, state.index),\n );\n\n const description = yield* decode(Schema.NullOr(Description), current);\n\n if (description === null) return yield* transportError(\"stale-reference\");\n const ctx = yield* context;\n\n if (\n ctx.topOrigin !== state.control.target.topOrigin ||\n (yield* origin(state.frame.frame.url())) !== state.control.target.frameOrigin ||\n (yield* origin(description.action)) !== state.control.target.recipientOrigin ||\n description.role !== state.control.role\n )\n return yield* transportError(\"stale-reference\");\n\n return state;\n });\n\n const close = yield* Effect.cached(\n Effect.gen(function* () {\n invalidate();\n\n return yield* session.close;\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n page.off(\"framenavigated\", onNavigated);\n page.off(\"framedetached\", onNavigated);\n browser.off(\"targetcreated\", onTarget);\n // Handles die with the exact session. Do not block remote termination on local disposal.\n frames.clear();\n }),\n ),\n ),\n );\n\n yield* Effect.acquireRelease(\n Effect.sync(() => {\n page.on(\"framenavigated\", onNavigated);\n page.on(\"framedetached\", onNavigated);\n browser.on(\"targetcreated\", onTarget);\n }),\n () =>\n session.release === undefined\n ? close\n : session.release.pipe(\n Effect.ensuring(\n Effect.sync(() => {\n invalidate();\n page.off(\"framenavigated\", onNavigated);\n page.off(\"framedetached\", onNavigated);\n browser.off(\"targetcreated\", onTarget);\n frames.clear();\n }),\n ),\n ),\n );\n\n return {\n restrictObservation: Effect.fn(\"ProtectedNativeTransport.restrictObservation\")(\n function* (origins) {\n yield* check;\n observationOrigins =\n origins === undefined\n ? undefined\n : new Set(yield* decode(Schema.Array(CredentialOrigin), origins));\n // A later grant expansion must not revive previously excluded references.\n for (const [ref, state] of controls)\n if (\n observationOrigins !== undefined &&\n !observationOrigins.has(state.control.target.frameOrigin)\n )\n controls.delete(ref);\n },\n ),\n context,\n invalidate,\n resetReferences: clear,\n close,\n navigate: Effect.fn(\"ProtectedNativeTransport.navigate\")(function* (url) {\n yield* check;\n yield* origin(url);\n clear();\n yield* remote(\"protected.navigate\", () => page.goto(url, { waitUntil: \"load\" }));\n yield* context;\n }),\n target: (ref) => get(ref).pipe(Effect.map((state) => state.control)),\n discover: Effect.gen(function* () {\n const before = yield* context;\n\n controls.clear();\n for (const state of frames.values())\n yield* remote(\"protected.dispose\", () => state.handle.dispose());\n frames.clear();\n const discovered: Array<ProtectedBrowserControl> = [];\n let text = \"\";\n let truncated = false;\n const frameOrigins = new Set<string>();\n\n for (const frame of yield* observationFrames) {\n const frameOrigin = yield* origin(frame.url());\n\n if (observationOrigins !== undefined && !observationOrigins.has(frameOrigin)) continue;\n frameOrigins.add(frameOrigin);\n if (typeof frame.isolatedRealm !== \"function\") return yield* transportError(\"unsupported\");\n\n const handle = yield* remote(\"protected.discover\", () =>\n frame.isolatedRealm().evaluateHandle(inspectFrame),\n );\n\n const state: FrameState = {\n frame,\n handle,\n ref: yield* uuid,\n document: yield* uuid,\n forms: new Map(),\n };\n\n frames.set(frame, state);\n\n const raw = yield* remote(\"protected.describe-controls\", () =>\n handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.get(held, \"original\");\n }),\n );\n\n const descriptions = yield* decode(Descriptions, raw);\n\n for (let index = 0; index < descriptions.length; index++) {\n const desc = descriptions[index];\n\n if (!desc) continue;\n if (discovered.length === 64) {\n truncated = true;\n break;\n }\n let form = state.forms.get(desc.formIndex);\n\n if (form === undefined) {\n form = yield* uuid;\n state.forms.set(desc.formIndex, form);\n }\n // Unsupported destinations/controls are not offered as credential targets.\n const recipient = yield* origin(desc.action).pipe(Effect.result);\n\n if (recipient._tag === \"Failure\") continue;\n\n const control = ProtectedBrowserControl.make({\n ref: yield* uuid,\n role: desc.role,\n label: desc.label,\n ...(desc.checked === undefined ? {} : { checked: desc.checked }),\n ...(desc.role === \"link\" ? { url: desc.action } : {}),\n target: CredentialTarget.make({\n topOrigin: before.topOrigin,\n frameOrigin: yield* origin(frame.url()),\n recipientOrigin: recipient.success,\n document: state.document,\n frame: state.ref,\n form,\n }),\n });\n\n controls.set(control.ref, {\n frame: state,\n index,\n control,\n expires: (yield* clock.currentTimeMillis) + 60_000,\n });\n discovered.push(control);\n }\n\n const rawText = yield* remote(\"protected.read-text\", () =>\n handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.apply(Reflect.get(held, \"text\"), held, []);\n }),\n );\n\n text += yield* decode(Schema.String.check(Schema.isMaxLength(65536)), rawText);\n if (text.length > 65536) {\n text = text.slice(0, 65536);\n truncated = true;\n }\n }\n if ((yield* context).document !== before.document)\n return yield* transportError(\"stale-reference\");\n\n return yield* decode(ProtectedDiscovery, {\n ...before,\n frameOrigins: [...frameOrigins],\n text,\n controls: discovered,\n truncated,\n });\n }),\n fill: Effect.fn(\"ProtectedNativeTransport.fill\")(function* (ref, role, value) {\n const dispatch = yield* ProtectedBrowserDispatch;\n const state = yield* get(ref);\n\n // CDP dispatch may mutate before its reply is lost, so uncertainty starts here.\n yield* dispatch.mark;\n\n const filled = yield* remote(\"protected.fill\", () =>\n state.frame.handle.evaluate(\n (held, index, expectedRole, secret) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.apply(Reflect.get(held, \"fill\"), held, [index, expectedRole, secret]);\n },\n state.index,\n role,\n Redacted.value(value),\n ),\n );\n\n if (filled === \"unsupported\") return yield* transportError(\"unsupported\");\n if (filled !== true) return yield* transportError(\"stale-reference\");\n }),\n click: Effect.fn(\"ProtectedNativeTransport.click\")(function* (ref) {\n const state = yield* get(ref);\n\n const clicked = yield* remote(\"protected.click\", () =>\n state.frame.handle.evaluate((held, index) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.apply(Reflect.get(held, \"click\"), held, [index]);\n }, state.index),\n );\n\n if (clicked === \"needs-attention\") return yield* transportError(\"needs-attention\");\n if (clicked !== true) return yield* transportError(\"stale-reference\");\n }),\n };\n}, Effect.withTracerEnabled(false));\n","/// <reference types=\"@cloudflare/workers-types\" />\nimport { type Browser, type Page, type CDPSession } from \"@cloudflare/puppeteer\";\nimport { Cause, Context, Crypto, Effect, Layer, Redacted, Schema, type Scope } from \"effect\";\nimport { type InteractiveBrowserPolicy } from \"effect-agent/interactive-browser\";\nimport { ProtectedBrowserError } from \"effect-agent/protected-browser\";\n\nimport { BrowserRunBinding } from \"../internal/browser-binding.ts\";\nimport {\n browserFailure,\n BrowserRunFailure,\n reportBrowserCause,\n reportedBrowserError,\n} from \"../internal/browser-failure.ts\";\nimport { BrowserRunSessionLifecycle } from \"../internal/browser-session-lifecycle.ts\";\nimport { makeProtectedNativeTransport, ProtectedNativeSession } from \"./native.ts\";\nimport {\n BrowserRunProtectedTransport,\n ProtectedTransportError,\n type ProtectedBrowserTransport,\n} from \"./policy.ts\";\n\n/** Host-private exact page identity; never include it in model-visible results. */\nexport const ProtectedProviderIdentity = Schema.Struct({\n sessionId: Schema.Redacted(Schema.String.check(Schema.isUUID())),\n contextId: Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(256))),\n targetId: Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(256))),\n});\n\nexport type ProtectedProviderIdentity = typeof ProtectedProviderIdentity.Type;\n\nexport interface ProtectedProviderSession {\n readonly identity: ProtectedProviderIdentity;\n readonly driver: ProtectedBrowserTransport;\n readonly command: (\n method: \"Cloudflare.getLiveView\" | \"Cloudflare.handoff\" | \"Cloudflare.getHandoffState\",\n parameters: Readonly<Record<string, string | number>>,\n ) => Effect.Effect<unknown, ProtectedBrowserError>;\n readonly detach: Effect.Effect<void, ProtectedBrowserError>;\n}\n\nexport class BrowserRunProtectedBinding extends Context.Service<\n BrowserRunProtectedBinding,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n identity?: ProtectedProviderIdentity,\n ) => Effect.Effect<ProtectedProviderSession, ProtectedBrowserError, Scope.Scope>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunProtectedBinding\") {}\n\n/**\n * Acquires through BROWSER with recording=false explicitly on the wire. The trusted provider's\n * documented opt-in semantics are the recording guarantee; no recording-status API exists.\n * Account operators remain trusted, and must not attach external observers to private passes.\n */\nconst protectedBindingLayer = (options: { readonly browser: Pick<BrowserRun, \"fetch\"> }) =>\n Layer.effect(BrowserRunProtectedBinding)(\n Effect.gen(function* () {\n const lifecycle = yield* BrowserRunSessionLifecycle;\n const binding = yield* BrowserRunBinding;\n const crypto = yield* Crypto.Crypto;\n\n const open = Effect.fn(\"BrowserRunProtectedTransport.open\")(function* (\n policy: InteractiveBrowserPolicy,\n identity?: ProtectedProviderIdentity,\n ): Effect.fn.Return<ProtectedProviderSession, ProtectedBrowserError, Scope.Scope> {\n const failure = () =>\n new ProtectedBrowserError({\n reason: \"provider\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"unconfirmed\",\n });\n\n let sessionId: Redacted.Redacted<string> | undefined = identity?.sessionId;\n let detached = false;\n let control: CDPSession | undefined;\n let providerIdentity: ProtectedProviderIdentity | undefined;\n let browser: Browser | undefined;\n let driver: ProtectedBrowserTransport | undefined;\n let invalid = false;\n // SDK acquisition may finish after interruption. Its late-reply callback must await cleanup,\n // retaining this pass's clock and private reporting scope.\n const runCleanup = Effect.runPromiseWith(yield* Effect.context<never>());\n\n const terminate = Effect.gen(function* () {\n invalid = true;\n driver?.invalidate();\n if (sessionId === undefined) return \"unconfirmed\" as const;\n\n const cleanup = yield* lifecycle.close(sessionId).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"protected.close\", cause).pipe(Effect.as(\"unconfirmed\" as const)),\n ),\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () =>\n reportBrowserCause(\n \"protected.close\",\n Cause.fail(\n new BrowserRunFailure({ operation: \"protected.close\", reason: \"timeout\" }),\n ),\n ).pipe(Effect.as(\"unconfirmed\" as const)),\n }),\n );\n\n // Local disconnect is not remote-closure evidence. Do it even when confirmation fails.\n const connected = browser;\n\n if (connected !== undefined)\n yield* Effect.promise(() => connected.disconnect()).pipe(\n Effect.catchCause((cause) => reportBrowserCause(\"protected.disconnect\", cause)),\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"1 second\",\n orElse: () =>\n reportBrowserCause(\n \"protected.disconnect\",\n Cause.fail(\n new BrowserRunFailure({\n operation: \"protected.disconnect\",\n reason: \"timeout\",\n }),\n ),\n ),\n }),\n );\n\n return cleanup;\n });\n\n const close = yield* Effect.cached(terminate);\n\n yield* Effect.addFinalizer(() => (detached ? Effect.void : close));\n let stage = identity === undefined ? \"protected.acquire\" : \"protected.connect\";\n\n const acquired = yield* Effect.tryPromise({\n try: async (signal) => {\n try {\n sessionId =\n identity === undefined\n ? Redacted.make(\n await binding.acquire(\n Math.min(600_000, Math.max(10_000, policy.maxElapsedMillis)),\n \"protected.acquire\",\n ),\n )\n : identity.sessionId;\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n // Resume only a host-persisted exact page. Never open a replacement page or context.\n stage = \"protected.connect\";\n browser = await binding.connect(Redacted.value(sessionId), stage);\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n let page: Page;\n\n if (identity === undefined) {\n stage = \"protected.context\";\n const context = await browser.createBrowserContext();\n\n stage = \"protected.page\";\n page = await context.newPage();\n } else {\n stage = \"protected.resume\";\n\n const context = browser\n .browserContexts()\n .find((candidate) => candidate.id === Redacted.value(identity.contextId));\n\n if (context === undefined)\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n const pages = await context.pages();\n let found: Page | undefined;\n\n for (const candidate of pages) {\n const client = await candidate.createCDPSession();\n const info = await client.send(\"Target.getTargetInfo\");\n\n await client.detach();\n if (info.targetInfo.targetId === Redacted.value(identity.targetId))\n found = candidate;\n }\n if (found === undefined || pages.length !== 1)\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n page = found;\n }\n stage = \"protected.control\";\n control = await page.createCDPSession();\n const info = await control.send(\"Target.getTargetInfo\");\n\n stage = \"protected.identity\";\n providerIdentity = Schema.decodeSync(ProtectedProviderIdentity)({\n sessionId,\n contextId: Redacted.make(page.browserContext().id ?? \"\"),\n targetId: Redacted.make(info.targetInfo.targetId),\n });\n\n stage = \"protected.interception\";\n await page.setBypassServiceWorker(true);\n await page.setRequestInterception(true);\n page.on(\"request\", (request) => {\n let allowed = policy.network._tag === \"Unrestricted\";\n\n try {\n const url = new URL(request.url());\n\n allowed ||=\n policy.network._tag === \"ExactHosts\" &&\n url.protocol === \"https:\" &&\n !url.username &&\n !url.password &&\n policy.network.allowedHosts.includes(url.host);\n } catch {\n /* Refuse malformed destinations. */\n }\n void (\n allowed && !invalid ? request.continue() : request.abort(\"blockedbyclient\")\n ).catch(async (cause) => {\n invalid = true;\n driver?.invalidate();\n await runCleanup(reportBrowserCause(\"protected.interception\", Cause.fail(cause)));\n });\n });\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n\n return ProtectedNativeSession.of({\n browser,\n page,\n close,\n release: Effect.suspend(() => (detached ? Effect.void : close.pipe(Effect.asVoid))),\n });\n } catch (cause) {\n if (signal.aborted && !(cause instanceof ProtectedTransportError))\n await runCleanup(reportBrowserCause(stage, Cause.fail(cause)));\n throw cause;\n }\n },\n catch: (cause) => browserFailure(stage, cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Math.min(policy.maxElapsedMillis, 30_000),\n orElse: () =>\n Effect.fail(new BrowserRunFailure({ operation: stage, reason: \"timeout\" })),\n }),\n Effect.catch((error) =>\n reportBrowserCause(stage, Cause.fail(error)).pipe(\n Effect.andThen(close),\n Effect.flatMap((cleanup) =>\n Effect.fail(\n reportedBrowserError(\n new ProtectedBrowserError({\n ...failure(),\n reason: error.reason === \"timeout\" ? \"timeout\" : \"provider\",\n cleanup,\n }),\n ),\n ),\n ),\n ),\n ),\n );\n\n driver = yield* makeProtectedNativeTransport(policy).pipe(\n Effect.provideService(ProtectedNativeSession, acquired),\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const exact = providerIdentity;\n\n if (exact === undefined) return yield* failure();\n\n return {\n identity: exact,\n driver,\n command: (method, parameters) =>\n Effect.tryPromise({\n try: async () => {\n if (invalid || detached || control === undefined) throw undefined;\n\n // Cloudflare extends CDP with host-only methods absent from upstream ProtocolMapping.\n const send = Reflect.get(control, \"send\");\n\n return await Reflect.apply(send, control, [method, parameters]);\n },\n catch: (cause) => browserFailure(\"protected.command\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () =>\n Effect.fail(\n new BrowserRunFailure({ operation: \"protected.command\", reason: \"timeout\" }),\n ),\n }),\n Effect.catch((error) =>\n reportBrowserCause(\"protected.command\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure()))),\n ),\n ),\n ),\n detach: Effect.tryPromise({\n try: async () => {\n if (invalid || detached || browser === undefined) throw undefined;\n // Stop this attachment before another controller can attach. The browser remains live.\n await browser.disconnect();\n detached = true;\n driver?.invalidate();\n },\n catch: (cause) => browserFailure(\"protected.detach\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () =>\n Effect.fail(\n new BrowserRunFailure({ operation: \"protected.detach\", reason: \"timeout\" }),\n ),\n }),\n Effect.catch((error) =>\n reportBrowserCause(\"protected.detach\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure()))),\n ),\n ),\n ),\n };\n }, Effect.withTracerEnabled(false));\n\n return { open };\n }),\n ).pipe(Layer.provide(BrowserRunBinding.layer(options.browser)));\n\n/** One binding implementation serves scoped tools and host-managed protected handoffs. */\nexport const browserRunProtectedBindingLayer = (options: {\n readonly browser: Pick<BrowserRun, \"fetch\">;\n}) =>\n Layer.effect(BrowserRunProtectedTransport)(\n Effect.gen(function* () {\n const binding = yield* BrowserRunProtectedBinding;\n\n return {\n open: (policy: InteractiveBrowserPolicy) =>\n binding.open(policy).pipe(Effect.map((session) => session.driver)),\n };\n }),\n ).pipe(Layer.provideMerge(protectedBindingLayer(options)));\n","import {\n Cause,\n Clock,\n Context,\n Crypto,\n Effect,\n Layer,\n Redacted,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\nimport { InteractiveBrowserPolicy } from \"effect-agent/interactive-browser\";\nimport {\n type BrowserCredentialAccess,\n CredentialOrigin,\n ProtectedBrowserCheckpoint,\n ProtectedBrowserError,\n type ProtectedBrowserHandle,\n type ProtectedCleanup,\n} from \"effect-agent/protected-browser\";\n\nimport {\n BrowserRunHandoffRequest,\n BrowserRunHandoffState,\n BrowserRunLiveViewRequest,\n BrowserRunLiveViewResult,\n} from \"../InteractiveBrowser.ts\";\nimport {\n inheritBrowserReport,\n reportBrowserCause,\n reportedBrowserError,\n} from \"../internal/browser-failure.ts\";\nimport { BrowserRunSessionLifecycle } from \"../internal/browser-session-lifecycle.ts\";\nimport { BrowserRunProtectedBinding, ProtectedProviderIdentity } from \"./binding.ts\";\nimport { BrowserRunProtectedTransport, makeProtectedBrowserPolicy } from \"./policy.ts\";\n\n/** Host-only receipt. Store atomically with the controller lease; never return it to a model. */\nexport class BrowserRunProtectedCheckpoint extends Schema.Class<BrowserRunProtectedCheckpoint>(\n \"BrowserRunProtectedCheckpoint\",\n)({\n ...ProtectedProviderIdentity.fields,\n protected: ProtectedBrowserCheckpoint,\n handoffId: Schema.optionalKey(\n Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(1024))),\n ),\n}) {}\n\nexport interface BrowserRunProtectedSession {\n readonly handle: ProtectedBrowserHandle;\n readonly sessionId: Redacted.Redacted<string>;\n /** Quiesce for a durable workflow pause or human-control request. Persist before detaching. */\n readonly suspend: Effect.Effect<BrowserRunProtectedCheckpoint, ProtectedBrowserError>;\n /** Fences agent tools before dispatch. Persist the returned receipt before detaching. */\n readonly handoff: (\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunProtectedCheckpoint, ProtectedBrowserError>;\n /** Available only while human control is held; the host must authorize the specific human. */\n readonly getLiveView: (\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, ProtectedBrowserError>;\n readonly getHandoffState: Effect.Effect<BrowserRunHandoffState, ProtectedBrowserError>;\n /** Read only the exact page’s current origin after its recorded handoff completes; tools remain paused. */\n readonly getReturnOrigin: Effect.Effect<typeof CredentialOrigin.Type, ProtectedBrowserError>;\n /**\n * Resume a committed pause; human handoffs also require provider completion. Returns no page data.\n * A fresh authorized observation must succeed before page actions or credential operations.\n */\n readonly returnControl: Effect.Effect<void, ProtectedBrowserError>;\n /** Release this attachment only after committing its suspended checkpoint; preserve the remote browser. */\n readonly detach: Effect.Effect<void, ProtectedBrowserError>;\n readonly close: Effect.Effect<typeof ProtectedCleanup.Type>;\n}\n\n/**\n * Host authority for one protected page. The consumer owns durable generation fencing, authorized\n * human recipients, checkpoint integrity, vault exposure metadata, and expiry cleanup. Resume only\n * the latest committed suspended receipt; it never replays browser mutations or creates a page.\n * Hosted passes require Unrestricted network policy: attachment-local request interception\n * cannot enforce an ExactHosts policy during detachment. Current credential grants still apply.\n * Provider inactivity/session deadlines still apply while the host is detached.\n */\nexport class BrowserRunProtectedHost extends Context.Service<\n BrowserRunProtectedHost,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<\n BrowserRunProtectedSession,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n >;\n readonly resume: (\n checkpoint: BrowserRunProtectedCheckpoint,\n ) => Effect.Effect<\n BrowserRunProtectedSession,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n >;\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<typeof ProtectedCleanup.Type>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunProtectedHost\") {}\n\nconst failure = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({\n reason,\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"protected\",\n cleanup: \"not-requested\",\n });\n\nconst Handoff = Schema.Struct({ handoffId: Schema.NonEmptyString.check(Schema.isMaxLength(1024)) });\n\nconst HandoffState = Schema.Struct({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(Schema.NonEmptyString.check(Schema.isMaxLength(1024))),\n durationMs: Schema.optionalKey(Schema.Natural),\n});\n\nconst LiveView = Schema.Struct({ devtoolsFrontendUrl: Schema.String });\n\n/** Compose with browserRunProtectedBindingLayer and BrowserRunSessionLifecycle. */\nexport const browserRunProtectedHostLayer = () =>\n Layer.effect(BrowserRunProtectedHost)(\n Effect.gen(function* () {\n const binding = yield* BrowserRunProtectedBinding;\n const lifecycle = yield* BrowserRunSessionLifecycle;\n const crypto = yield* Crypto.Crypto;\n\n const open = Effect.fn(\"BrowserRunProtectedHost.open\")(function* (\n input: InteractiveBrowserPolicy,\n checkpoint?: BrowserRunProtectedCheckpoint,\n ): Effect.fn.Return<\n BrowserRunProtectedSession,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n > {\n const policy = yield* Schema.decodeEffect(InteractiveBrowserPolicy, {\n onExcessProperty: \"error\",\n })(input).pipe(Effect.mapError(() => failure(\"denied\")));\n\n if (policy.network._tag !== \"Unrestricted\") return yield* failure(\"unsupported\");\n\n const remaining =\n policy.maxElapsedMillis -\n ((yield* Clock.currentTimeMillis) -\n (checkpoint?.protected.startedAt ?? (yield* Clock.currentTimeMillis)));\n\n if (\n remaining <= 0 ||\n (checkpoint !== undefined &&\n checkpoint.protected.startedAt > (yield* Clock.currentTimeMillis))\n )\n return yield* failure(\"timeout\");\n if (checkpoint !== undefined && checkpoint.protected.actions > policy.maxActions)\n return yield* failure(\"denied\");\n const provider = yield* binding.open(policy, checkpoint);\n\n const state = yield* makeProtectedBrowserPolicy(policy, checkpoint?.protected).pipe(\n Effect.provideService(BrowserRunProtectedTransport, {\n open: () => Effect.succeed({ ...provider.driver, detach: provider.detach }),\n }),\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const lock = yield* Semaphore.make(1);\n let handoff = checkpoint;\n let detached = false;\n\n const control = <A>(effect: Effect.Effect<A, ProtectedBrowserError>) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.suspend(() => (detached ? Effect.fail(failure(\"closed\")) : effect)),\n )\n .pipe(Effect.flatMap(Effect.fromOption(() => failure(\"busy\"))));\n\n const fits = (millis: number) =>\n Effect.gen(function* () {\n const started = handoff?.protected.startedAt ?? startedAt;\n\n if (millis > policy.maxElapsedMillis - ((yield* Clock.currentTimeMillis) - started))\n return yield* failure(\"timeout\");\n });\n\n const startedAt = checkpoint?.protected.startedAt ?? (yield* Clock.currentTimeMillis);\n\n const getHandoffState = Effect.gen(function* () {\n if (handoff?.handoffId === undefined) return yield* failure(\"denied\");\n yield* fits(0);\n const raw = yield* provider.command(\"Cloudflare.getHandoffState\", {});\n\n const result = yield* Schema.decodeUnknownEffect(HandoffState)(raw).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.host.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"provider\")))),\n ),\n ),\n );\n\n if (\n (result.active && result.handoffId === undefined) ||\n (result.handoffId !== undefined &&\n result.handoffId !== Redacted.value(handoff.handoffId))\n )\n return yield* failure(\"denied\");\n\n return BrowserRunHandoffState.make({\n active: result.active,\n ...(result.durationMs === undefined ? {} : { durationMs: result.durationMs }),\n ...(result.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(result.handoffId) }),\n });\n });\n\n return {\n handle: state.handle,\n sessionId: provider.identity.sessionId,\n suspend: control(\n Effect.gen(function* () {\n if (handoff !== undefined) {\n yield* state.suspend();\n\n return handoff;\n }\n const suspended = yield* state.suspend();\n\n handoff = BrowserRunProtectedCheckpoint.make({\n ...provider.identity,\n protected: suspended,\n });\n\n return handoff;\n }),\n ),\n handoff: (request) =>\n control(\n Effect.gen(function* () {\n if (handoff?.handoffId !== undefined) return yield* failure(\"busy\");\n\n const decoded = yield* Schema.decodeEffect(BrowserRunHandoffRequest)(request).pipe(\n Effect.mapError(() => failure(\"denied\")),\n );\n\n yield* fits(decoded.timeout);\n const suspended = yield* state.suspend(true);\n\n // An uncertain handoff is never retried; close exactly this provider session.\n const result = yield* provider\n .command(\"Cloudflare.handoff\", {\n instructions: decoded.instructions,\n timeout: decoded.timeout,\n })\n .pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(Handoff)),\n Effect.catchCause((cause) =>\n Cause.hasInterruptsOnly(cause)\n ? Effect.interrupt\n : reportBrowserCause(\"protected.handoff\", cause).pipe(\n Effect.andThen(state.handle.close),\n Effect.flatMap((cleanup) =>\n Effect.fail(\n reportedBrowserError(\n new ProtectedBrowserError({\n reason: \"outcome-unknown\",\n dispatch: \"possibly-dispatched\",\n milestone: suspended.milestone,\n observation: \"closed\",\n cleanup,\n }),\n ),\n ),\n ),\n ),\n ),\n Effect.onInterrupt(() => state.handle.close),\n );\n\n handoff = BrowserRunProtectedCheckpoint.make({\n ...provider.identity,\n protected: suspended,\n handoffId: Redacted.make(result.handoffId),\n });\n\n return handoff;\n }),\n ),\n getLiveView: (request) =>\n control(\n Effect.gen(function* () {\n if (handoff?.handoffId === undefined) return yield* failure(\"denied\");\n\n const decoded = yield* Schema.decodeEffect(BrowserRunLiveViewRequest)(request).pipe(\n Effect.mapError(() => failure(\"denied\")),\n );\n\n yield* fits(decoded.expiresInMs);\n\n const raw = yield* provider.command(\"Cloudflare.getLiveView\", {\n mode: decoded.mode,\n expiresInMs: decoded.expiresInMs,\n });\n\n const result = yield* Schema.decodeUnknownEffect(LiveView)(raw).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.host.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"provider\")))),\n ),\n ),\n );\n\n return yield* Schema.decodeEffect(BrowserRunLiveViewResult)({\n devtoolsFrontendUrl: Redacted.make(result.devtoolsFrontendUrl),\n }).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.host.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"provider\")))),\n ),\n ),\n );\n }),\n ),\n getHandoffState: control(getHandoffState),\n getReturnOrigin: control(\n Effect.gen(function* () {\n if ((yield* getHandoffState).active) return yield* failure(\"busy\");\n\n const context = yield* provider.driver.context.pipe(\n Effect.mapError((error) => inheritBrowserReport(error, failure(error.reason))),\n );\n\n return yield* Schema.decodeEffect(CredentialOrigin)(context.topOrigin).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.host.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"provider\")))),\n ),\n ),\n );\n }),\n ),\n returnControl: control(\n Effect.gen(function* () {\n yield* fits(0);\n if (handoff?.handoffId !== undefined && (yield* getHandoffState).active)\n return yield* failure(\"busy\");\n yield* state.returnControl;\n handoff = undefined;\n }),\n ),\n detach: control(\n Effect.gen(function* () {\n if (handoff === undefined) return yield* failure(\"denied\");\n yield* state.detach;\n detached = true;\n }),\n ),\n close: state.handle.close,\n };\n }, Effect.withTracerEnabled(false));\n\n return {\n open: (policy: InteractiveBrowserPolicy) => open(policy),\n resume: (checkpoint: BrowserRunProtectedCheckpoint) =>\n Schema.decodeEffect(BrowserRunProtectedCheckpoint)(checkpoint).pipe(\n Effect.mapError(() => failure(\"denied\")),\n Effect.flatMap((decoded) => open(decoded.protected.policy, decoded)),\n ),\n closeSession: (id: Redacted.Redacted<string>) =>\n lifecycle.close(id).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"protected.closeSession\", cause).pipe(\n Effect.as(\"unconfirmed\" as const),\n ),\n ),\n ),\n };\n }),\n );\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProtectedBrowser.mjs","names":[],"sources":["../src/protected-browser/policy.ts","../src/protected-browser/inspect-frame.ts","../src/protected-browser/native.ts","../src/protected-browser/binding.ts","../src/protected-browser/host.ts"],"sourcesContent":["import {\n Cause,\n Clock,\n Context,\n Crypto,\n Effect,\n Layer,\n Redacted,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\nimport { InteractiveBrowserPolicy } from \"effect-agent/interactive-browser\";\n/// <reference types=\"@cloudflare/workers-types\" />\nimport {\n BrowserCredentialAccess,\n type BrowserCredentialMaterial,\n CardCredential,\n CredentialOffer,\n CredentialOfferMetadata,\n CredentialOrigin,\n CredentialObservationDecision,\n type CredentialTarget,\n CredentialUseResult,\n ListCredentialOffers,\n LoginCredential,\n ProtectedBrowser,\n ProtectedBrowserClick,\n ProtectedBrowserCheckpoint,\n ProtectedBrowserError,\n ProtectedBrowserFill,\n ProtectedBrowserNavigate,\n ProtectedBrowserObservation,\n ProtectedBrowserControl,\n UseCredential,\n type CredentialFieldRole,\n type CredentialKind,\n type CredentialUseAuthorization,\n type ProtectedBrowserHandle,\n type ProtectedBrowserAction,\n type ProtectedCleanup,\n type ProtectedObservationState,\n} from \"effect-agent/protected-browser\";\n\nimport {\n BrowserRunFailure,\n inheritBrowserReport,\n reportBrowserCause,\n reportedBrowserError,\n} from \"../internal/browser-failure.ts\";\n\nexport class ProtectedTransportError extends Schema.TaggedError<ProtectedTransportError>()(\n \"ProtectedTransportError\",\n { reason: Schema.Literals([\"stale-reference\", \"needs-attention\", \"unsupported\", \"provider\"]) },\n) {}\n\n/** Per-write evidence authority, provided by the policy immediately around a transport fill. */\nexport class ProtectedBrowserDispatch extends Context.Service<\n ProtectedBrowserDispatch,\n {\n readonly mark: Effect.Effect<void>;\n /** Only an acknowledged reply before assignment may restore the preceding dispatch evidence. */\n readonly confirmNoWrite: Effect.Effect<void>;\n }\n>()(\"@effect-agent/platform-cloudflare/ProtectedBrowserDispatch\") {}\n\n/** Decoded adapter boundary. SDK exceptions and page diagnostics never cross this port. */\nexport interface ProtectedBrowserTransport {\n /** Select observation/target origins; undefined restores all network-permitted HTTPS frames. */\n readonly restrictObservation: (\n origins: ReadonlyArray<typeof CredentialOrigin.Type> | undefined,\n ) => Effect.Effect<void, ProtectedTransportError>;\n readonly context: Effect.Effect<typeof ProtectedPageContext.Type, ProtectedTransportError>;\n readonly discover: Effect.Effect<typeof ProtectedDiscovery.Type, ProtectedTransportError>;\n readonly target: (ref: string) => Effect.Effect<ProtectedBrowserControl, ProtectedTransportError>;\n readonly navigate: (url: string) => Effect.Effect<void, ProtectedTransportError>;\n readonly click: (ref: string) => Effect.Effect<void, ProtectedTransportError>;\n readonly fill: (\n ref: string,\n role: typeof CredentialFieldRole.Type | \"text\" | \"select\",\n value: Redacted.Redacted<string>,\n ) => Effect.Effect<void, ProtectedTransportError, ProtectedBrowserDispatch>;\n /** Invalidates local references synchronously before bounded exact-session cleanup. */\n readonly invalidate: () => void;\n /** Forget all discovered controls on a controller transition. */\n readonly resetReferences: () => void;\n /** Host attachment release, available only for transferable provider sessions. */\n readonly detach?: Effect.Effect<void, ProtectedBrowserError>;\n readonly close: Effect.Effect<typeof ProtectedCleanup.Type>;\n}\n\n/** Adapter-private injection seam for deterministic tests, not a model capability. */\nexport class BrowserRunProtectedTransport extends Context.Service<\n BrowserRunProtectedTransport,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<ProtectedBrowserTransport, ProtectedBrowserError, Scope.Scope>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunProtectedTransport\") {}\n\nexport const ProtectedPageContext = Schema.Struct({\n document: Schema.String.check(Schema.isUUID()),\n topOrigin: CredentialOrigin,\n frameOrigins: Schema.Array(CredentialOrigin).check(Schema.isMaxLength(16)),\n});\n\nexport const ProtectedDiscovery = Schema.Struct({\n ...ProtectedPageContext.fields,\n text: Schema.String.check(Schema.isMaxLength(64 * 1024)),\n controls: Schema.Array(ProtectedBrowserControl).check(Schema.isMaxLength(64)),\n truncated: Schema.Boolean,\n});\n\nconst sameTarget = (a: CredentialTarget, b: CredentialTarget) =>\n a.topOrigin === b.topOrigin &&\n a.frameOrigin === b.frameOrigin &&\n a.recipientOrigin === b.recipientOrigin &&\n a.document === b.document &&\n a.frame === b.frame &&\n a.form === b.form;\n\nconst kindFor = (role: string): typeof CredentialKind.Type | undefined =>\n role === \"username\" || role === \"password\"\n ? \"login\"\n : role.startsWith(\"card-\")\n ? \"card\"\n : undefined;\n\nconst secretFor = (material: BrowserCredentialMaterial, role: typeof CredentialFieldRole.Type) => {\n if (material._tag === \"LoginCredential\") {\n return role === \"username\"\n ? material.username\n : role === \"password\"\n ? material.password\n : undefined;\n }\n switch (role) {\n case \"card-name\":\n return material.name;\n case \"card-number\":\n return material.number;\n case \"card-expiry\":\n return material.expiry;\n case \"card-expiry-month\":\n return material.expiryMonth;\n case \"card-expiry-year\":\n return material.expiryYear;\n case \"card-security-code\":\n return material.securityCode;\n case \"username\":\n case \"password\":\n return undefined;\n }\n};\n\n/** Shared protected policy implementation for ephemeral and host-owned passes. */\nexport const makeProtectedBrowserPolicy = Effect.fn(\"ProtectedBrowser.open\")(function* (\n input: InteractiveBrowserPolicy,\n checkpoint?: ProtectedBrowserCheckpoint,\n) {\n const initialError = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({\n reason,\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"not-requested\",\n });\n\n const decodedPolicy = yield* Schema.decodeEffect(InteractiveBrowserPolicy, {\n onExcessProperty: \"error\",\n })(input).pipe(Effect.mapError(() => initialError(\"denied\")));\n\n if (decodedPolicy.network._tag === \"PublicWeb\") return yield* initialError(\"unsupported\");\n\n const policy = InteractiveBrowserPolicy.make({\n ...decodedPolicy,\n network:\n decodedPolicy.network._tag === \"ExactHosts\"\n ? { _tag: \"ExactHosts\", allowedHosts: [...decodedPolicy.network.allowedHosts] }\n : { _tag: \"Unrestricted\" },\n });\n\n // Capture the host access service for THIS execution, not the application singleton.\n const access = yield* BrowserCredentialAccess;\n\n const restored =\n checkpoint === undefined\n ? undefined\n : yield* Schema.decodeEffect(ProtectedBrowserCheckpoint)(checkpoint).pipe(\n Effect.mapError(() => initialError(\"denied\")),\n );\n\n const now = yield* Clock.currentTimeMillis;\n\n if (\n restored !== undefined &&\n (restored.startedAt > now ||\n restored.actions > policy.maxActions ||\n now - restored.startedAt >= policy.maxElapsedMillis)\n )\n return yield* initialError(\"timeout\");\n const started = restored?.startedAt ?? now;\n const driver = yield* (yield* BrowserRunProtectedTransport).open(policy);\n const crypto = yield* Crypto.Crypto;\n let suspended = restored !== undefined;\n let detached = false;\n let needsObservation = restored !== undefined;\n let humanExposure = restored?.humanExposure ?? false;\n let humanOrigins = [...(restored?.humanOrigins ?? [])];\n const lock = yield* Semaphore.make(1);\n let observation: typeof ProtectedObservationState.Type = \"before-exposure\";\n let cleanup: typeof ProtectedCleanup.Type = \"not-requested\";\n let actions = restored?.actions ?? 0;\n let dispatch: ProtectedBrowserError[\"dispatch\"] = restored?.dispatch ?? \"not-dispatched\";\n let milestone: ProtectedBrowserError[\"milestone\"] = restored?.milestone ?? \"none\";\n const exposures: Array<CredentialTarget> = [...(restored?.exposures ?? [])];\n\n const offers = new Map<\n string,\n {\n caller: Redacted.Redacted<string>;\n key: Redacted.Redacted<string>;\n target: CredentialTarget;\n targetRef: string;\n kind: typeof CredentialKind.Type;\n expires: number;\n }\n >();\n\n const fail = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({ reason, dispatch, milestone, observation, cleanup });\n\n const close = yield* Effect.cached(\n Effect.uninterruptible(\n Effect.gen(function* () {\n observation = \"closed\";\n offers.clear();\n driver.invalidate();\n cleanup = yield* driver.close.pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () =>\n Effect.fail(\n new BrowserRunFailure({ operation: \"protected.close\", reason: \"timeout\" }),\n ),\n }),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"protected.close\", cause).pipe(Effect.as(\"unconfirmed\" as const)),\n ),\n );\n\n return cleanup;\n }),\n ),\n );\n\n yield* Effect.addFinalizer(() => (detached ? Effect.void : close));\n\n const publicFailure = <A, E extends { readonly reason: ProtectedBrowserError[\"reason\"] }, R>(\n effect: Effect.Effect<A, E, R>,\n ) =>\n effect.pipe(\n Effect.catchCause((cause) =>\n Effect.failCause(\n Cause.map(cause, (error) => inheritBrowserReport(error, fail(error.reason))),\n ),\n ),\n );\n\n const decode = <A>(schema: Schema.Codec<A>, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.policy.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(fail(\"provider\")))),\n ),\n ),\n );\n\n const caller = access.caller.pipe(publicFailure);\n const pageContext = publicFailure(driver.context);\n\n const permitObservation = Effect.gen(function* () {\n const context = yield* pageContext;\n let origins: ReadonlyArray<typeof CredentialOrigin.Type> | undefined;\n\n if (exposures.length > 0 || humanExposure) {\n observation = \"protected\";\n const principal = yield* caller;\n\n const rawDecision = yield* access\n .observation({\n ...context,\n caller: principal,\n exposures: [...exposures],\n humanExposure,\n humanOrigins,\n })\n .pipe(publicFailure);\n\n if (Redacted.value(yield* caller) !== Redacted.value(principal)) return yield* fail(\"denied\");\n\n const decision = yield* Schema.decodeEffect(CredentialObservationDecision)(rawDecision).pipe(\n Effect.mapError(() => fail(\"observation-blocked\")),\n );\n\n if (decision === \"deny\") return yield* fail(\"observation-blocked\");\n if (typeof decision !== \"string\") {\n origins = [...decision.origins];\n if (!origins.includes(context.topOrigin)) return yield* fail(\"observation-blocked\");\n }\n observation = \"approved-after-exposure\";\n }\n yield* publicFailure(driver.restrictObservation(origins));\n\n return {\n ...context,\n frameOrigins: context.frameOrigins.filter(\n (origin) => origins === undefined || origins.includes(origin),\n ),\n };\n });\n\n const target = (ref: string) => publicFailure(driver.target(ref));\n\n const authorizeAction = Effect.fn(\"ProtectedBrowser.authorizeAction\")(function* (\n action: ProtectedBrowserAction,\n ) {\n if (access.authorizeAction === undefined) {\n if (action._tag === \"Submit\") return yield* fail(\"unsupported\");\n\n return;\n }\n const principal = yield* caller;\n\n yield* access\n .authorizeAction({ caller: principal, action, exposures: [...exposures] })\n .pipe(publicFailure);\n if (Redacted.value(yield* caller) !== Redacted.value(principal)) return yield* fail(\"denied\");\n if (action._tag !== \"Navigate\") {\n const current = yield* target(action.ref);\n\n if (\n !sameTarget(current.target, action.target) ||\n current.role !== (action._tag === \"Submit\" ? \"submit\" : action.role) ||\n (action._tag === \"Click\" && action.role === \"link\" && current.url !== action.url)\n )\n return yield* fail(\"stale-reference\");\n }\n }, Effect.withTracerEnabled(false));\n\n const bounded = <A>(result: A) => {\n const bytes = new TextEncoder().encode(JSON.stringify(result)).byteLength;\n\n return bytes <= policy.maxReturnedBytes ? Effect.succeed(result) : Effect.fail(fail(\"limit\"));\n };\n\n const run = <A>(effect: Effect.Effect<A, ProtectedBrowserError>, observing = false) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n if (suspended || detached) return yield* fail(\"busy\");\n if (needsObservation && !observing) return yield* fail(\"stale-reference\");\n dispatch = \"not-dispatched\";\n milestone = \"none\";\n if (observation === \"closed\") return yield* fail(\"closed\");\n if (++actions > policy.maxActions) return yield* fail(\"limit\");\n\n const remaining = policy.maxElapsedMillis - ((yield* Clock.currentTimeMillis) - started);\n\n if (remaining <= 0) {\n yield* close;\n\n return yield* fail(\"timeout\");\n }\n\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: remaining,\n orElse: () => Effect.fail(fail(\"timeout\")),\n }),\n Effect.catchCause((cause) =>\n Effect.gen(function* () {\n // Expected rejections cannot hide a concurrent defect. Preserve safe diagnostics first.\n const unexpected = cause.reasons.filter(\n (reason) =>\n reason._tag === \"Die\" ||\n (reason._tag === \"Fail\" && !Schema.is(ProtectedBrowserError)(reason.error)),\n );\n\n if (unexpected.length > 0)\n yield* reportBrowserCause(\"protected.operation\", Cause.fromReasons(unexpected));\n\n const error = cause.reasons.find(\n (reason) =>\n reason._tag === \"Fail\" && Schema.is(ProtectedBrowserError)(reason.error),\n );\n\n const reason =\n unexpected.length === 0 &&\n error?._tag === \"Fail\" &&\n Schema.is(ProtectedBrowserError)(error.error)\n ? error.error.reason\n : \"provider\";\n\n const interrupt = cause.reasons.some((reason) => reason._tag === \"Interrupt\");\n\n if (\n dispatch === \"possibly-dispatched\" ||\n (dispatch === \"dispatched\" && reason !== \"busy\") ||\n interrupt ||\n reason === \"provider\" ||\n reason === \"timeout\"\n )\n yield* close;\n if (interrupt) return yield* Effect.interrupt;\n\n const outcome = fail(\n dispatch === \"possibly-dispatched\" && reason === \"provider\"\n ? \"outcome-unknown\"\n : reason,\n );\n\n return yield* unexpected.length > 0\n ? reportedBrowserError(outcome)\n : inheritBrowserReport(error?._tag === \"Fail\" ? error.error : undefined, outcome);\n }),\n ),\n Effect.onInterrupt(() => close),\n Effect.withTracerEnabled(false),\n );\n }),\n )\n .pipe(\n Effect.flatMap(\n Effect.fromOption(\n () =>\n new ProtectedBrowserError({\n reason: \"busy\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation,\n cleanup,\n }),\n ),\n ),\n );\n\n const handle: ProtectedBrowserHandle = {\n close: Effect.suspend(() => (detached ? Effect.succeed(\"not-requested\" as const) : close)),\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserNavigate)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n let url: URL;\n\n try {\n url = new URL(decoded.url);\n } catch {\n return yield* fail(\"denied\");\n }\n if (\n url.protocol !== \"https:\" ||\n url.username ||\n url.password ||\n (policy.network._tag === \"ExactHosts\" &&\n !policy.network.allowedHosts.includes(url.host))\n )\n return yield* fail(\"denied\");\n if (exposures.length > 0 || humanExposure) yield* permitObservation;\n yield* authorizeAction({ _tag: \"Navigate\", url: decoded.url });\n offers.clear();\n dispatch = \"possibly-dispatched\";\n yield* publicFailure(driver.navigate(decoded.url));\n dispatch = \"dispatched\";\n yield* permitObservation;\n }),\n ),\n observe: run(\n Effect.gen(function* () {\n const before = yield* permitObservation;\n const result = yield* publicFailure(driver.discover);\n const after = yield* permitObservation;\n\n if (\n before.document !== after.document ||\n result.document !== after.document ||\n result.topOrigin !== after.topOrigin\n )\n return yield* fail(\"stale-reference\");\n if (result.frameOrigins.some((origin) => !after.frameOrigins.includes(origin)))\n return yield* fail(\"observation-blocked\");\n\n const observation = yield* bounded(\n ProtectedBrowserObservation.make({\n ...result,\n observation:\n exposures.length > 0 || humanExposure ? \"approved-after-exposure\" : \"before-exposure\",\n }),\n );\n\n needsObservation = false;\n\n return observation;\n }),\n true,\n ),\n click: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserClick)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n yield* permitObservation;\n const control = yield* target(decoded.ref);\n\n if (\n control.role !== \"link\" &&\n control.role !== \"button\" &&\n control.role !== \"radio\" &&\n control.role !== \"checkbox\" &&\n control.role !== \"submit\"\n )\n return yield* fail(\"unsupported\");\n let action: ProtectedBrowserAction;\n\n if (control.role === \"link\") {\n if (control.url === undefined) return yield* fail(\"unsupported\");\n action = {\n _tag: \"Click\",\n ref: decoded.ref,\n target: control.target,\n role: \"link\",\n url: control.url,\n };\n } else if (control.role === \"submit\") {\n action = { _tag: \"Submit\", ref: decoded.ref, target: control.target };\n } else {\n action = {\n _tag: \"Click\",\n ref: decoded.ref,\n target: control.target,\n role: control.role,\n };\n }\n yield* authorizeAction(action);\n dispatch = \"possibly-dispatched\";\n yield* publicFailure(driver.click(decoded.ref)).pipe(\n Effect.catch((error) => {\n if (error.reason === \"needs-attention\") dispatch = \"not-dispatched\";\n\n return Effect.fail(error);\n }),\n );\n dispatch = \"dispatched\";\n if (control.role === \"submit\") milestone = \"submission-dispatched\";\n yield* permitObservation;\n }),\n ),\n fill: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserFill, {\n onExcessProperty: \"error\",\n })(request).pipe(Effect.mapError(() => fail(\"denied\")));\n\n yield* permitObservation;\n const control = yield* target(decoded.ref);\n\n if (control.role !== \"text\" && control.role !== \"select\")\n return yield* fail(\"unsupported\");\n yield* authorizeAction({\n _tag: \"Fill\",\n ref: decoded.ref,\n target: control.target,\n role: control.role,\n });\n const previousDispatch = dispatch;\n\n yield* publicFailure(\n driver.fill(decoded.ref, control.role, Redacted.make(decoded.value)),\n ).pipe(\n Effect.provideService(ProtectedBrowserDispatch, {\n mark: Effect.sync(() => {\n dispatch = \"possibly-dispatched\";\n }),\n confirmNoWrite: Effect.sync(() => {\n dispatch = previousDispatch;\n }),\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"filled\";\n yield* permitObservation;\n }),\n ),\n listCredentialOffers: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ListCredentialOffers)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n yield* permitObservation;\n const control = yield* target(decoded.target);\n\n if (kindFor(control.role) !== decoded.kind) return yield* fail(\"unsupported\");\n const principal = yield* caller;\n\n const candidates = yield* access\n .list({ caller: principal, kind: decoded.kind, target: control.target })\n .pipe(publicFailure);\n\n const now = yield* Clock.currentTimeMillis;\n\n for (const [ref, offer] of offers) if (offer.expires <= now) offers.delete(ref);\n if (candidates.length > 16 || offers.size + candidates.length > 64)\n return yield* fail(\"limit\");\n if (!sameTarget(control.target, (yield* target(decoded.target)).target))\n return yield* fail(\"stale-reference\");\n const expires = now + 60_000;\n const result: Array<CredentialOffer> = [];\n const pending: typeof offers = new Map();\n\n for (const candidate of candidates) {\n const metadata = yield* decode(CredentialOfferMetadata, candidate.metadata);\n\n const ref = yield* crypto.randomUUIDv4.pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.identity\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(fail(\"provider\")))),\n ),\n ),\n );\n\n pending.set(ref, {\n caller: principal,\n key: candidate.key,\n target: control.target,\n targetRef: decoded.target,\n kind: decoded.kind,\n expires,\n });\n result.push(CredentialOffer.make({ ref, kind: decoded.kind, metadata }));\n }\n yield* bounded(result);\n for (const [ref, offer] of pending) offers.set(ref, offer);\n\n return result;\n }),\n ),\n useCredential: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(UseCredential)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n const offer = offers.get(decoded.offer);\n\n if (offer === undefined || offer.expires <= (yield* Clock.currentTimeMillis))\n return yield* fail(\"stale-reference\");\n const principal = yield* caller;\n\n if (Redacted.value(principal) !== Redacted.value(offer.caller))\n return yield* fail(\"denied\");\n if (\n new Set(decoded.fields.map((field) => field.ref)).size !== decoded.fields.length ||\n new Set(decoded.fields.map((field) => field.role)).size !== decoded.fields.length\n )\n return yield* fail(\"denied\");\n\n const validate = Effect.gen(function* () {\n if (!sameTarget(offer.target, (yield* target(offer.targetRef)).target))\n return yield* fail(\"stale-reference\");\n for (const field of decoded.fields) {\n const current = yield* target(field.ref);\n\n if (\n field.role !== current.role ||\n kindFor(field.role) !== offer.kind ||\n !sameTarget(offer.target, current.target)\n )\n return yield* fail(\"denied\");\n }\n if (decoded.submit !== undefined) {\n const submit = yield* target(decoded.submit);\n\n if (submit.role !== \"submit\" || !sameTarget(offer.target, submit.target))\n return yield* fail(\"denied\");\n }\n });\n\n yield* validate;\n\n const authorization: CredentialUseAuthorization = {\n caller: principal,\n key: offer.key,\n kind: offer.kind,\n target: offer.target,\n roles: decoded.fields.map((field) => field.role),\n submit: decoded.submit !== undefined,\n };\n\n const authorize = Effect.gen(function* () {\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n yield* access.authorize(authorization).pipe(publicFailure);\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n });\n\n yield* authorize;\n yield* validate;\n\n const raw = yield* access.resolve(authorization).pipe(publicFailure);\n\n const material = yield* Schema.decodeEffect(\n offer.kind === \"login\" ? LoginCredential : CardCredential,\n )(raw).pipe(Effect.mapError(() => fail(\"resolver\")));\n\n for (const field of decoded.fields)\n if (secretFor(material, field.role) === undefined)\n return yield* fail(\"missing-credential\");\n offers.delete(decoded.offer);\n for (const field of decoded.fields) {\n yield* validate;\n yield* authorize;\n const value = secretFor(material, field.role);\n\n if (value === undefined) return yield* fail(\"missing-credential\");\n const previousDispatch = dispatch;\n\n observation = \"protected\";\n yield* publicFailure(driver.fill(field.ref, field.role, value)).pipe(\n Effect.provideService(ProtectedBrowserDispatch, {\n mark: Effect.sync(() => {\n dispatch = \"possibly-dispatched\";\n if (!exposures.some((target) => sameTarget(target, offer.target)))\n exposures.push(offer.target);\n }),\n // A refused later field cannot erase a completed earlier field or its exposure.\n confirmNoWrite: Effect.sync(() => {\n dispatch = previousDispatch;\n }),\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"partial-fill\";\n }\n milestone = \"filled\";\n if (decoded.submit !== undefined) {\n yield* validate;\n yield* authorize;\n const ref = decoded.submit;\n\n dispatch = \"possibly-dispatched\";\n yield* publicFailure(driver.click(ref)).pipe(\n Effect.catch((error) => {\n if (error.reason === \"needs-attention\") dispatch = \"dispatched\";\n\n return Effect.fail(error);\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"submission-dispatched\";\n }\n yield* permitObservation;\n\n return CredentialUseResult.make({\n dispatch,\n milestone,\n observation,\n cleanup,\n authentication: \"unverified\",\n });\n }),\n ),\n };\n\n const locked = <A>(effect: Effect.Effect<A, ProtectedBrowserError>) =>\n lock\n .withPermitsIfAvailable(1)(effect)\n .pipe(Effect.flatMap(Effect.fromOption(() => fail(\"busy\"))));\n\n return {\n handle,\n suspend: (human = false) =>\n locked(\n Effect.gen(function* () {\n if (detached || observation === \"closed\") return yield* fail(\"closed\");\n if (dispatch === \"possibly-dispatched\") return yield* fail(\"outcome-unknown\");\n if ((yield* Clock.currentTimeMillis) - started >= policy.maxElapsedMillis)\n return yield* fail(\"timeout\");\n suspended = true;\n if (human) {\n const context = yield* pageContext;\n\n const origins = yield* Schema.decodeEffect(\n ProtectedBrowserCheckpoint.fields.humanOrigins,\n )([...new Set([...humanOrigins, context.topOrigin, ...context.frameOrigins])]).pipe(\n Effect.catch(() => fail(\"needs-attention\")),\n );\n\n humanExposure = true;\n humanOrigins = [...origins];\n observation = \"protected\";\n }\n driver.resetReferences();\n offers.clear();\n\n return ProtectedBrowserCheckpoint.make({\n policy,\n startedAt: started,\n actions,\n exposures: [...exposures],\n humanExposure,\n humanOrigins,\n dispatch,\n milestone,\n });\n }),\n ),\n returnControl: locked(\n Effect.gen(function* () {\n if (detached || observation === \"closed\") return yield* fail(\"closed\");\n if (!suspended) return yield* fail(\"denied\");\n offers.clear();\n driver.resetReferences();\n needsObservation = true;\n suspended = false;\n }),\n ),\n detach: locked(\n Effect.gen(function* () {\n if (!suspended || observation === \"closed\") return yield* fail(\"denied\");\n if (driver.detach === undefined) return yield* fail(\"unsupported\");\n yield* driver.detach.pipe(\n Effect.onError(() => close),\n Effect.onInterrupt(() => close),\n );\n detached = true;\n offers.clear();\n driver.invalidate();\n }),\n ),\n };\n}, Effect.withTracerEnabled(false));\n\n/** Fresh private passes; scoped release confirms exact-session termination. */\nexport const browserRunProtectedLayer = () =>\n Layer.effect(ProtectedBrowser)(\n Effect.gen(function* () {\n const transport = yield* BrowserRunProtectedTransport;\n const crypto = yield* Crypto.Crypto;\n\n return {\n open: (policy: InteractiveBrowserPolicy) =>\n makeProtectedBrowserPolicy(policy).pipe(\n Effect.map((session) => session.handle),\n Effect.provideService(BrowserRunProtectedTransport, transport),\n Effect.provideService(Crypto.Crypto, crypto),\n ),\n };\n }),\n );\n","// This fixed program runs in an isolated world. Pages cannot replace its native DOM methods.\n// Handles retain actual nodes; a selector is never reconstructed from an opaque reference.\nexport const maxAttributeLength = 2048;\n\nexport const inspectFrame = `(() => {\n const doc = document;\n const forms = [];\n const isChoice = el => el instanceof HTMLInputElement && ['radio','checkbox'].includes(el.type);\n const presented = el => {\n if (el.closest('[hidden],[aria-hidden=\"true\"],[inert]') ||\n ['hidden','collapse'].includes(getComputedStyle(el).visibility)) return false;\n for (let parent = el; parent; parent = parent.parentElement) {\n if (getComputedStyle(parent).opacity === '0') return false;\n }\n return true;\n };\n const hasLayout = el => presented(el) &&\n [...el.getClientRects()].some(rect => rect.width > 0 && rect.height > 0);\n const available = el => el.type !== 'hidden' && !el.closest('[hidden],[aria-hidden=\"true\"],[inert]') &&\n (hasLayout(el) || (isChoice(el) && [...(el.labels ?? [])].some(hasLayout)));\n const elements = [...doc.querySelectorAll('input,textarea,select,button,a[href]')].filter(available).slice(0, 65);\n const labelText = el => {\n const label = el.labels?.[0]?.cloneNode(true);\n label?.querySelectorAll('input,textarea,select,script,style,noscript').forEach(child => child.remove());\n return label?.textContent ?? el.getAttribute('aria-label');\n };\n const describe = (el) => {\n if (doc !== document || !el.isConnected || el.ownerDocument !== doc || !available(el)) return null;\n const form = el.form ?? null;\n let formIndex = forms.indexOf(form);\n if (formIndex < 0) { formIndex = forms.length; forms.push(form); }\n // Resolved href (including path/query/fragment and base-URL changes) is part of the fingerprint.\n const action = el instanceof HTMLAnchorElement ? el.href : form ? (el.hasAttribute('formaction') ? el.formAction : form.action || doc.URL) : doc.URL;\n const method = form ? (el.hasAttribute('formmethod') ? el.formMethod : form.method) : '';\n const enctype = form?.enctype ?? '';\n const name = el.name ?? '';\n const completion = el.getAttribute('autocomplete') ?? '';\n const inputType = el.type ?? '';\n const choiceValue = isChoice(el) ? el.value : '';\n // Reject before parsing, fingerprinting or CDP transfer. Truncation could hide a target change.\n if ([action, method, enctype, name, completion, inputType, choiceValue].some(value => value.length > ${maxAttributeLength})) return null;\n const type = inputType.toLowerCase();\n const autocomplete = completion.trim().toLowerCase().split(/\\\\s+/).at(-1);\n const cardRoles = { 'cc-name':'card-name', 'cc-number':'card-number', 'cc-exp':'card-expiry',\n 'cc-exp-month':'card-expiry-month', 'cc-exp-year':'card-expiry-year', 'cc-csc':'card-security-code' };\n let role = 'unsupported';\n const nativeField = el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement;\n if (nativeField && !['submit','button'].includes(type) && !el.matches(':disabled') && !el.readOnly && !(el instanceof HTMLSelectElement && el.multiple)) {\n if (isChoice(el)) role = type;\n else if (type === 'password' || ['current-password','new-password','one-time-code'].includes(autocomplete)) {\n if (type === 'password' && form) role = 'password';\n } else if (['text','email','tel','number','month','search','url','date','time','week','datetime-local','textarea',''].includes(type) || el instanceof HTMLSelectElement) {\n if (cardRoles[autocomplete]) { if (form) role = cardRoles[autocomplete]; }\n // Email autocomplete alone is contact data; explicit usernames and password forms identify login fields.\n else if (autocomplete === 'username') { if (form) role = 'username'; }\n else if (['text','email'].includes(type) && form && form.querySelector('input[type=\"password\"]')) role = 'username';\n else if (el instanceof HTMLSelectElement) { if (!el.multiple) role = 'select'; }\n else role = 'text';\n }\n } else if (el instanceof HTMLButtonElement || (el instanceof HTMLInputElement && ['submit','button'].includes(type))) {\n if (!el.matches(':disabled')) role = type === 'submit' && form ? 'submit' : type === 'button' ? 'button' : 'unsupported';\n } else if (el instanceof HTMLAnchorElement) role = 'link';\n const options = [];\n let truncated = false;\n if (role === 'select') {\n for (let index = 0; index < el.options.length; index++) {\n if (index === 256) { truncated = true; break; }\n const option = el.options[index];\n const label = option.label.trim();\n // Never publish a shortened label as an exact fill choice.\n if (label.length > 200) { truncated = true; continue; }\n options.push({label, selected: option.selected, disabled: option.matches(':disabled')});\n }\n }\n const fingerprint = JSON.stringify([role, action, method, enctype, name, completion, type, choiceValue]);\n return { role, formIndex, action, fingerprint, ...(isChoice(el) ? {checked: el.checked} : {}),\n ...(role === 'select' ? {options, truncated} : {}),\n label: (labelText(el) ?? (nativeField ? '' : el.textContent) ?? '').slice(0,200) };\n };\n const expose = ({role, formIndex, action, label, checked, options, truncated}) =>\n ({role, formIndex, action, label, ...(checked === undefined ? {} : {checked}),\n ...(options === undefined ? {} : {options, truncated})});\n const original = elements.map(describe);\n const validate = (index) => {\n const current = describe(elements[index]);\n if (!current || !original[index] || current.fingerprint !== original[index].fingerprint ||\n current.formIndex !== original[index].formIndex) return null;\n return expose(current);\n };\n return {\n doc, elements, original: original.map(current => current && expose(current)), validate,\n text: () => {\n if (doc !== document) return null;\n if (!doc.body) return '';\n const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT);\n const range = doc.createRange();\n let text = '';\n for (let node = walker.nextNode(); node && text.length < 65536; node = walker.nextNode()) {\n const parent = node.parentElement;\n if (!parent || parent.closest('input,textarea,select,script,style,noscript,iframe,object,embed')) continue;\n if (!presented(parent)) continue;\n range.selectNodeContents(node);\n if (![...range.getClientRects()].some(rect => rect.width > 0 && rect.height > 0)) continue;\n text += (node.textContent ?? '').replace(/\\\\s+/g, ' ') + ' ';\n }\n return text.slice(0,65536);\n },\n fill: (index, role, value) => {\n const current = validate(index);\n if (!current || current.role !== role) return false;\n const el = elements[index];\n if (el instanceof HTMLSelectElement) {\n const options = [...el.options].filter(option => !option.matches(':disabled'));\n // Ordinary fills name the visible choice; credential material stays a private value.\n const matches = options.filter(option => (role === 'select' ? option.label.trim() : option.value) === value);\n if (matches.length !== 1) return 'unsupported-before-write';\n value = matches[0].value;\n if ([...el.options].filter(option => option.value === value).length !== 1) return 'unsupported-before-write';\n }\n let prototype = Object.getPrototypeOf(el);\n let setter;\n while (prototype && !setter) { setter = Object.getOwnPropertyDescriptor(prototype,'value')?.set; prototype = Object.getPrototypeOf(prototype); }\n if (!setter) return false;\n // Validate and mutate in one isolated-world task, without focusing first and running\n // page handlers between validation and assignment. Native setters support controlled inputs.\n setter.call(el, value);\n if (el.value !== value) return 'unsupported';\n el.dispatchEvent(new Event('input', {bubbles:true}));\n el.dispatchEvent(new Event('change', {bubbles:true}));\n return true;\n },\n click: (index) => {\n const current = validate(index);\n if (!current || !['button','submit','link','radio','checkbox'].includes(current.role)) return false;\n if (current.role === 'submit' && elements[index].form && !elements[index].form.matches(':valid')) return 'needs-attention';\n elements[index].click();\n return true;\n }\n };\n})()`;\n","/// <reference types=\"@cloudflare/workers-types\" />\nimport type { Browser, Frame, JSHandle, Page } from \"@cloudflare/puppeteer\";\nimport { Cause, Clock, Context, Crypto, Effect, Redacted, Schema, type Scope } from \"effect\";\nimport { type InteractiveBrowserPolicy } from \"effect-agent/interactive-browser\";\nimport {\n CredentialOrigin,\n CredentialTarget,\n ProtectedBrowserControl,\n} from \"effect-agent/protected-browser\";\n\nimport {\n browserFailure,\n reportBrowserCause,\n reportedBrowserError,\n} from \"../internal/browser-failure.ts\";\nimport { inspectFrame, maxAttributeLength } from \"./inspect-frame.ts\";\nimport {\n ProtectedBrowserDispatch,\n ProtectedTransportError,\n ProtectedDiscovery,\n ProtectedPageContext,\n type ProtectedBrowserTransport,\n} from \"./policy.ts\";\n\n// The pinned SDK implements this method but strips its internal declaration from lib/types.d.ts.\n// Keep the declaration narrow and refuse runtimes without it. No main-world fallback is safe.\ndeclare module \"@cloudflare/puppeteer\" {\n interface Frame {\n isolatedRealm(): { evaluateHandle(source: string): Promise<JSHandle<unknown>> };\n }\n}\n\nconst Description = Schema.Struct({\n role: ProtectedBrowserControl.fields.role,\n formIndex: Schema.Natural,\n action: Schema.String.check(Schema.isMaxLength(maxAttributeLength)),\n label: Schema.String.check(Schema.isMaxLength(200)),\n checked: Schema.optionalKey(Schema.Boolean),\n options: ProtectedBrowserControl.fields.options,\n truncated: Schema.optionalKey(Schema.Boolean),\n});\n\nconst Descriptions = Schema.Array(Schema.NullOr(Description)).check(Schema.isMaxLength(65));\nconst FillResult = Schema.Literals([true, false, \"unsupported-before-write\", \"unsupported\"]);\n\ninterface FrameState {\n readonly frame: Frame;\n readonly handle: JSHandle<unknown>;\n readonly ref: string;\n readonly document: string;\n readonly forms: Map<number, string>;\n}\ninterface ControlState {\n readonly frame: FrameState;\n readonly index: number;\n readonly control: ProtectedBrowserControl;\n readonly expires: number;\n}\n\n/** One host-private acquired session. The SDK handles and exact-session cleanup have one owner. */\nexport class ProtectedNativeSession extends Context.Service<\n ProtectedNativeSession,\n {\n readonly browser: Browser;\n readonly page: Page;\n readonly close: Effect.Effect<\"confirmed\" | \"unconfirmed\">;\n /** Host-owned attachment release may detach a committed suspended session. */\n readonly release?: Effect.Effect<void>;\n }\n>()(\"@effect-agent/platform-cloudflare/ProtectedNativeSession\") {}\n\nconst transportError = (reason: ProtectedTransportError[\"reason\"]) =>\n new ProtectedTransportError({ reason });\n\nconst decode = <A>(schema: Schema.Codec<A>, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(transportError(\"provider\")))),\n ),\n ),\n );\n\n// Attach rejection handling inside the SDK callback before workerd can report foreign diagnostics.\nconst remote = <A>(operation: string, run: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: async (signal) => {\n try {\n return { ok: true as const, value: await run(signal) };\n } catch (cause) {\n return { ok: false as const, failure: browserFailure(operation, cause) };\n }\n },\n catch: (cause) => browserFailure(operation, cause),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok ? Effect.succeed(result.value) : Effect.fail(result.failure),\n ),\n Effect.catch((failure) =>\n reportBrowserCause(operation, Cause.fail(failure)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(transportError(\"provider\")))),\n ),\n ),\n );\n\n/** Host-private scoped transport. Session capabilities are requirements; policy is per-pass data. */\nexport const makeProtectedNativeTransport = Effect.fn(\"ProtectedNativeTransport.make\")(function* (\n policy: InteractiveBrowserPolicy,\n): Effect.fn.Return<\n ProtectedBrowserTransport,\n never,\n ProtectedNativeSession | Crypto.Crypto | Scope.Scope\n> {\n const session = yield* ProtectedNativeSession;\n const { browser, page } = session;\n const crypto = yield* Crypto.Crypto;\n const clock = yield* Clock.Clock;\n\n const uuid = crypto.randomUUIDv4.pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.identity\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(transportError(\"provider\")))),\n ),\n ),\n );\n\n let closed = false;\n let violation = false;\n let documentRef: string | undefined;\n let observationOrigins: ReadonlySet<string> | undefined;\n const frames = new Map<Frame, FrameState>();\n const controls = new Map<string, ControlState>();\n\n const origin = (value: string) =>\n Effect.try({\n try: () => {\n const url = new URL(value);\n\n if (url.username || url.password) throw transportError(\"stale-reference\");\n if (!Schema.is(CredentialOrigin)(url.origin)) throw transportError(\"unsupported\");\n if (policy.network._tag === \"ExactHosts\" && !policy.network.allowedHosts.includes(url.host))\n throw transportError(\"stale-reference\");\n\n return url.origin;\n },\n catch: (cause) =>\n Schema.is(ProtectedTransportError)(cause) ? cause : transportError(\"provider\"),\n });\n\n const check = Effect.suspend(() =>\n closed || violation || !browser.isConnected()\n ? Effect.fail(transportError(\"stale-reference\"))\n : Effect.void,\n );\n\n const clear = () => {\n controls.clear();\n // Browser event callbacks only invalidate. The next Effect operation allocates the new identity.\n documentRef = undefined;\n };\n\n const onNavigated = () => {\n clear();\n };\n\n const onTarget = (target: { type(): string }) => {\n if (target.type() !== \"page\") return;\n // No popup or additional page may inherit an observation channel.\n violation = true;\n clear();\n };\n\n const invalidate = () => {\n closed = true;\n clear();\n };\n\n const observationFrames = Effect.gen(function* () {\n const list = page.frames();\n\n if (list.length > 32) return yield* transportError(\"unsupported\");\n\n // Opaque/blank child documents have no observation channel or credential targets.\n // The main document and every retained HTTPS child still require strict origin validation.\n return yield* Effect.filter(list, (frame) =>\n frame === page.mainFrame()\n ? Effect.succeed(true)\n : Effect.try({\n try: () => frame.url() !== \"\" && new URL(frame.url()).protocol === \"https:\",\n catch: () => transportError(\"provider\"),\n }),\n );\n });\n\n const context = Effect.gen(function* () {\n yield* check;\n const list = yield* observationFrames;\n const topOrigin = yield* origin(page.url());\n const frameOrigins = [...new Set(yield* Effect.forEach(list, (frame) => origin(frame.url())))];\n\n if (frameOrigins.length > 16) return yield* transportError(\"unsupported\");\n\n if (documentRef === undefined) documentRef = yield* uuid;\n\n return yield* decode(ProtectedPageContext, { document: documentRef, topOrigin, frameOrigins });\n });\n\n const isCurrent = Effect.fn(\"ProtectedNativeTransport.isCurrent\")(function* (state: FrameState) {\n if (state.frame.detached) return false;\n\n return yield* remote(\"protected.validate-document\", () =>\n state.handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.get(held, \"doc\") === Reflect.get(globalThis, \"document\");\n }),\n );\n });\n\n const get = Effect.fn(\"ProtectedNativeTransport.get\")(function* (ref: string) {\n yield* check;\n const state = controls.get(ref);\n\n if (\n !state ||\n (observationOrigins !== undefined &&\n !observationOrigins.has(state.control.target.frameOrigin)) ||\n state.expires <= (yield* clock.currentTimeMillis) ||\n !(yield* isCurrent(state.frame))\n )\n return yield* transportError(\"stale-reference\");\n\n const current = yield* remote(\"protected.validate-control\", () =>\n state.frame.handle.evaluate((held, index) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.apply(Reflect.get(held, \"validate\"), held, [index]);\n }, state.index),\n );\n\n const description = yield* decode(Schema.NullOr(Description), current);\n\n if (description === null) return yield* transportError(\"stale-reference\");\n const ctx = yield* context;\n\n if (\n ctx.topOrigin !== state.control.target.topOrigin ||\n (yield* origin(state.frame.frame.url())) !== state.control.target.frameOrigin ||\n (yield* origin(description.action)) !== state.control.target.recipientOrigin ||\n description.role !== state.control.role\n )\n return yield* transportError(\"stale-reference\");\n\n return state;\n });\n\n const close = yield* Effect.cached(\n Effect.gen(function* () {\n invalidate();\n\n return yield* session.close;\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n page.off(\"framenavigated\", onNavigated);\n page.off(\"framedetached\", onNavigated);\n browser.off(\"targetcreated\", onTarget);\n // Handles die with the exact session. Do not block remote termination on local disposal.\n frames.clear();\n }),\n ),\n ),\n );\n\n yield* Effect.acquireRelease(\n Effect.sync(() => {\n page.on(\"framenavigated\", onNavigated);\n page.on(\"framedetached\", onNavigated);\n browser.on(\"targetcreated\", onTarget);\n }),\n () =>\n session.release === undefined\n ? close\n : session.release.pipe(\n Effect.ensuring(\n Effect.sync(() => {\n invalidate();\n page.off(\"framenavigated\", onNavigated);\n page.off(\"framedetached\", onNavigated);\n browser.off(\"targetcreated\", onTarget);\n frames.clear();\n }),\n ),\n ),\n );\n\n return {\n restrictObservation: Effect.fn(\"ProtectedNativeTransport.restrictObservation\")(\n function* (origins) {\n yield* check;\n observationOrigins =\n origins === undefined\n ? undefined\n : new Set(yield* decode(Schema.Array(CredentialOrigin), origins));\n // A later grant expansion must not revive previously excluded references.\n for (const [ref, state] of controls)\n if (\n observationOrigins !== undefined &&\n !observationOrigins.has(state.control.target.frameOrigin)\n )\n controls.delete(ref);\n },\n ),\n context,\n invalidate,\n resetReferences: clear,\n close,\n navigate: Effect.fn(\"ProtectedNativeTransport.navigate\")(function* (url) {\n yield* check;\n yield* origin(url);\n clear();\n yield* remote(\"protected.navigate\", () => page.goto(url, { waitUntil: \"load\" }));\n yield* context;\n }),\n target: (ref) => get(ref).pipe(Effect.map((state) => state.control)),\n discover: Effect.gen(function* () {\n const before = yield* context;\n\n controls.clear();\n for (const state of frames.values())\n yield* remote(\"protected.dispose\", () => state.handle.dispose());\n frames.clear();\n const discovered: Array<ProtectedBrowserControl> = [];\n let text = \"\";\n let truncated = false;\n const frameOrigins = new Set<string>();\n\n for (const frame of yield* observationFrames) {\n const frameOrigin = yield* origin(frame.url());\n\n if (observationOrigins !== undefined && !observationOrigins.has(frameOrigin)) continue;\n frameOrigins.add(frameOrigin);\n if (typeof frame.isolatedRealm !== \"function\") return yield* transportError(\"unsupported\");\n\n const handle = yield* remote(\"protected.discover\", () =>\n frame.isolatedRealm().evaluateHandle(inspectFrame),\n );\n\n const state: FrameState = {\n frame,\n handle,\n ref: yield* uuid,\n document: yield* uuid,\n forms: new Map(),\n };\n\n frames.set(frame, state);\n\n const raw = yield* remote(\"protected.describe-controls\", () =>\n handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.get(held, \"original\");\n }),\n );\n\n const descriptions = yield* decode(Descriptions, raw);\n\n for (let index = 0; index < descriptions.length; index++) {\n const desc = descriptions[index];\n\n if (!desc) continue;\n if (desc.truncated) truncated = true;\n if (discovered.length === 64) {\n truncated = true;\n break;\n }\n let form = state.forms.get(desc.formIndex);\n\n if (form === undefined) {\n form = yield* uuid;\n state.forms.set(desc.formIndex, form);\n }\n // Unsupported destinations/controls are not offered as credential targets.\n const recipient = yield* origin(desc.action).pipe(Effect.result);\n\n if (recipient._tag === \"Failure\") continue;\n\n const control = ProtectedBrowserControl.make({\n ref: yield* uuid,\n role: desc.role,\n label: desc.label,\n ...(desc.checked === undefined ? {} : { checked: desc.checked }),\n ...(desc.options === undefined ? {} : { options: desc.options }),\n ...(desc.role === \"link\" ? { url: desc.action } : {}),\n target: CredentialTarget.make({\n topOrigin: before.topOrigin,\n frameOrigin: yield* origin(frame.url()),\n recipientOrigin: recipient.success,\n document: state.document,\n frame: state.ref,\n form,\n }),\n });\n\n controls.set(control.ref, {\n frame: state,\n index,\n control,\n expires: (yield* clock.currentTimeMillis) + 60_000,\n });\n discovered.push(control);\n }\n\n const rawText = yield* remote(\"protected.read-text\", () =>\n handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.apply(Reflect.get(held, \"text\"), held, []);\n }),\n );\n\n text += yield* decode(Schema.String.check(Schema.isMaxLength(65536)), rawText);\n if (text.length > 65536) {\n text = text.slice(0, 65536);\n truncated = true;\n }\n }\n if ((yield* context).document !== before.document)\n return yield* transportError(\"stale-reference\");\n\n return yield* decode(ProtectedDiscovery, {\n ...before,\n frameOrigins: [...frameOrigins],\n text,\n controls: discovered,\n truncated,\n });\n }),\n fill: Effect.fn(\"ProtectedNativeTransport.fill\")(function* (ref, role, value) {\n const dispatch = yield* ProtectedBrowserDispatch;\n const state = yield* get(ref);\n\n // CDP dispatch may mutate before its reply is lost, so uncertainty starts here.\n yield* dispatch.mark;\n\n const raw = yield* remote(\"protected.fill\", () =>\n state.frame.handle.evaluate(\n (held, index, expectedRole, secret) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.apply(Reflect.get(held, \"fill\"), held, [index, expectedRole, secret]);\n },\n state.index,\n role,\n Redacted.value(value),\n ),\n );\n\n const filled = yield* decode(FillResult, raw);\n\n if (filled === false || filled === \"unsupported-before-write\") {\n yield* dispatch.confirmNoWrite;\n\n return yield* transportError(filled === false ? \"stale-reference\" : \"unsupported\");\n }\n\n if (filled === \"unsupported\") return yield* transportError(\"unsupported\");\n }),\n click: Effect.fn(\"ProtectedNativeTransport.click\")(function* (ref) {\n const state = yield* get(ref);\n\n const clicked = yield* remote(\"protected.click\", () =>\n state.frame.handle.evaluate((held, index) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.apply(Reflect.get(held, \"click\"), held, [index]);\n }, state.index),\n );\n\n if (clicked === \"needs-attention\") return yield* transportError(\"needs-attention\");\n if (clicked !== true) return yield* transportError(\"stale-reference\");\n }),\n };\n}, Effect.withTracerEnabled(false));\n","/// <reference types=\"@cloudflare/workers-types\" />\nimport { type Browser, type Page, type CDPSession } from \"@cloudflare/puppeteer\";\nimport { Cause, Context, Crypto, Effect, Layer, Redacted, Schema, type Scope } from \"effect\";\nimport { type InteractiveBrowserPolicy } from \"effect-agent/interactive-browser\";\nimport { ProtectedBrowserError } from \"effect-agent/protected-browser\";\n\nimport { BrowserRunBinding } from \"../internal/browser-binding.ts\";\nimport {\n browserFailure,\n BrowserRunFailure,\n reportBrowserCause,\n reportedBrowserError,\n} from \"../internal/browser-failure.ts\";\nimport { BrowserRunSessionLifecycle } from \"../internal/browser-session-lifecycle.ts\";\nimport { makeProtectedNativeTransport, ProtectedNativeSession } from \"./native.ts\";\nimport {\n BrowserRunProtectedTransport,\n ProtectedTransportError,\n type ProtectedBrowserTransport,\n} from \"./policy.ts\";\n\n/** Host-private exact page identity; never include it in model-visible results. */\nexport const ProtectedProviderIdentity = Schema.Struct({\n sessionId: Schema.Redacted(Schema.String.check(Schema.isUUID())),\n contextId: Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(256))),\n targetId: Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(256))),\n});\n\nexport type ProtectedProviderIdentity = typeof ProtectedProviderIdentity.Type;\n\nexport interface ProtectedProviderSession {\n readonly identity: ProtectedProviderIdentity;\n readonly driver: ProtectedBrowserTransport;\n readonly command: (\n method: \"Cloudflare.getLiveView\" | \"Cloudflare.handoff\" | \"Cloudflare.getHandoffState\",\n parameters: Readonly<Record<string, string | number>>,\n ) => Effect.Effect<unknown, ProtectedBrowserError>;\n readonly detach: Effect.Effect<void, ProtectedBrowserError>;\n}\n\nexport class BrowserRunProtectedBinding extends Context.Service<\n BrowserRunProtectedBinding,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n identity?: ProtectedProviderIdentity,\n ) => Effect.Effect<ProtectedProviderSession, ProtectedBrowserError, Scope.Scope>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunProtectedBinding\") {}\n\n/**\n * Acquires through BROWSER with recording=false explicitly on the wire. The trusted provider's\n * documented opt-in semantics are the recording guarantee; no recording-status API exists.\n * Account operators remain trusted, and must not attach external observers to private passes.\n */\nconst protectedBindingLayer = (options: { readonly browser: Pick<BrowserRun, \"fetch\"> }) =>\n Layer.effect(BrowserRunProtectedBinding)(\n Effect.gen(function* () {\n const lifecycle = yield* BrowserRunSessionLifecycle;\n const binding = yield* BrowserRunBinding;\n const crypto = yield* Crypto.Crypto;\n\n const open = Effect.fn(\"BrowserRunProtectedTransport.open\")(function* (\n policy: InteractiveBrowserPolicy,\n identity?: ProtectedProviderIdentity,\n ): Effect.fn.Return<ProtectedProviderSession, ProtectedBrowserError, Scope.Scope> {\n const failure = () =>\n new ProtectedBrowserError({\n reason: \"provider\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"unconfirmed\",\n });\n\n let sessionId: Redacted.Redacted<string> | undefined = identity?.sessionId;\n let detached = false;\n let control: CDPSession | undefined;\n let providerIdentity: ProtectedProviderIdentity | undefined;\n let browser: Browser | undefined;\n let driver: ProtectedBrowserTransport | undefined;\n let invalid = false;\n // SDK acquisition may finish after interruption. Its late-reply callback must await cleanup,\n // retaining this pass's clock and private reporting scope.\n const runCleanup = Effect.runPromiseWith(yield* Effect.context<never>());\n\n const terminate = Effect.gen(function* () {\n invalid = true;\n driver?.invalidate();\n if (sessionId === undefined) return \"unconfirmed\" as const;\n\n const cleanup = yield* lifecycle.close(sessionId).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"protected.close\", cause).pipe(Effect.as(\"unconfirmed\" as const)),\n ),\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () =>\n reportBrowserCause(\n \"protected.close\",\n Cause.fail(\n new BrowserRunFailure({ operation: \"protected.close\", reason: \"timeout\" }),\n ),\n ).pipe(Effect.as(\"unconfirmed\" as const)),\n }),\n );\n\n // Local disconnect is not remote-closure evidence. Do it even when confirmation fails.\n const connected = browser;\n\n if (connected !== undefined)\n yield* Effect.promise(() => connected.disconnect()).pipe(\n Effect.catchCause((cause) => reportBrowserCause(\"protected.disconnect\", cause)),\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"1 second\",\n orElse: () =>\n reportBrowserCause(\n \"protected.disconnect\",\n Cause.fail(\n new BrowserRunFailure({\n operation: \"protected.disconnect\",\n reason: \"timeout\",\n }),\n ),\n ),\n }),\n );\n\n return cleanup;\n });\n\n const close = yield* Effect.cached(terminate);\n\n yield* Effect.addFinalizer(() => (detached ? Effect.void : close));\n let stage = identity === undefined ? \"protected.acquire\" : \"protected.connect\";\n\n const acquired = yield* Effect.tryPromise({\n try: async (signal) => {\n try {\n sessionId =\n identity === undefined\n ? Redacted.make(\n await binding.acquire(\n Math.min(600_000, Math.max(10_000, policy.maxElapsedMillis)),\n \"protected.acquire\",\n ),\n )\n : identity.sessionId;\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n // Resume only a host-persisted exact page. Never open a replacement page or context.\n stage = \"protected.connect\";\n browser = await binding.connect(Redacted.value(sessionId), stage);\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n let page: Page;\n\n if (identity === undefined) {\n stage = \"protected.context\";\n const context = await browser.createBrowserContext();\n\n stage = \"protected.page\";\n page = await context.newPage();\n } else {\n stage = \"protected.resume\";\n\n const context = browser\n .browserContexts()\n .find((candidate) => candidate.id === Redacted.value(identity.contextId));\n\n if (context === undefined)\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n const pages = await context.pages();\n let found: Page | undefined;\n\n for (const candidate of pages) {\n const client = await candidate.createCDPSession();\n const info = await client.send(\"Target.getTargetInfo\");\n\n await client.detach();\n if (info.targetInfo.targetId === Redacted.value(identity.targetId))\n found = candidate;\n }\n if (found === undefined || pages.length !== 1)\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n page = found;\n }\n stage = \"protected.control\";\n control = await page.createCDPSession();\n const info = await control.send(\"Target.getTargetInfo\");\n\n stage = \"protected.identity\";\n providerIdentity = Schema.decodeSync(ProtectedProviderIdentity)({\n sessionId,\n contextId: Redacted.make(page.browserContext().id ?? \"\"),\n targetId: Redacted.make(info.targetInfo.targetId),\n });\n\n stage = \"protected.interception\";\n await page.setBypassServiceWorker(true);\n await page.setRequestInterception(true);\n page.on(\"request\", (request) => {\n let allowed = policy.network._tag === \"Unrestricted\";\n\n try {\n const url = new URL(request.url());\n\n allowed ||=\n policy.network._tag === \"ExactHosts\" &&\n url.protocol === \"https:\" &&\n !url.username &&\n !url.password &&\n policy.network.allowedHosts.includes(url.host);\n } catch {\n /* Refuse malformed destinations. */\n }\n void (\n allowed && !invalid ? request.continue() : request.abort(\"blockedbyclient\")\n ).catch(async (cause) => {\n invalid = true;\n driver?.invalidate();\n await runCleanup(reportBrowserCause(\"protected.interception\", Cause.fail(cause)));\n });\n });\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n\n return ProtectedNativeSession.of({\n browser,\n page,\n close,\n release: Effect.suspend(() => (detached ? Effect.void : close.pipe(Effect.asVoid))),\n });\n } catch (cause) {\n if (signal.aborted && !(cause instanceof ProtectedTransportError))\n await runCleanup(reportBrowserCause(stage, Cause.fail(cause)));\n throw cause;\n }\n },\n catch: (cause) => browserFailure(stage, cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Math.min(policy.maxElapsedMillis, 30_000),\n orElse: () =>\n Effect.fail(new BrowserRunFailure({ operation: stage, reason: \"timeout\" })),\n }),\n Effect.catch((error) =>\n reportBrowserCause(stage, Cause.fail(error)).pipe(\n Effect.andThen(close),\n Effect.flatMap((cleanup) =>\n Effect.fail(\n reportedBrowserError(\n new ProtectedBrowserError({\n ...failure(),\n reason: error.reason === \"timeout\" ? \"timeout\" : \"provider\",\n cleanup,\n }),\n ),\n ),\n ),\n ),\n ),\n );\n\n driver = yield* makeProtectedNativeTransport(policy).pipe(\n Effect.provideService(ProtectedNativeSession, acquired),\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const exact = providerIdentity;\n\n if (exact === undefined) return yield* failure();\n\n return {\n identity: exact,\n driver,\n command: (method, parameters) =>\n Effect.tryPromise({\n try: async () => {\n if (invalid || detached || control === undefined) throw undefined;\n\n // Cloudflare extends CDP with host-only methods absent from upstream ProtocolMapping.\n const send = Reflect.get(control, \"send\");\n\n return await Reflect.apply(send, control, [method, parameters]);\n },\n catch: (cause) => browserFailure(\"protected.command\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () =>\n Effect.fail(\n new BrowserRunFailure({ operation: \"protected.command\", reason: \"timeout\" }),\n ),\n }),\n Effect.catch((error) =>\n reportBrowserCause(\"protected.command\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure()))),\n ),\n ),\n ),\n detach: Effect.tryPromise({\n try: async () => {\n if (invalid || detached || browser === undefined) throw undefined;\n // Stop this attachment before another controller can attach. The browser remains live.\n await browser.disconnect();\n detached = true;\n driver?.invalidate();\n },\n catch: (cause) => browserFailure(\"protected.detach\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () =>\n Effect.fail(\n new BrowserRunFailure({ operation: \"protected.detach\", reason: \"timeout\" }),\n ),\n }),\n Effect.catch((error) =>\n reportBrowserCause(\"protected.detach\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure()))),\n ),\n ),\n ),\n };\n }, Effect.withTracerEnabled(false));\n\n return { open };\n }),\n ).pipe(Layer.provide(BrowserRunBinding.layer(options.browser)));\n\n/** One binding implementation serves scoped tools and host-managed protected handoffs. */\nexport const browserRunProtectedBindingLayer = (options: {\n readonly browser: Pick<BrowserRun, \"fetch\">;\n}) =>\n Layer.effect(BrowserRunProtectedTransport)(\n Effect.gen(function* () {\n const binding = yield* BrowserRunProtectedBinding;\n\n return {\n open: (policy: InteractiveBrowserPolicy) =>\n binding.open(policy).pipe(Effect.map((session) => session.driver)),\n };\n }),\n ).pipe(Layer.provideMerge(protectedBindingLayer(options)));\n","import {\n Cause,\n Clock,\n Context,\n Crypto,\n Effect,\n Layer,\n Redacted,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\nimport { InteractiveBrowserPolicy } from \"effect-agent/interactive-browser\";\nimport {\n type BrowserCredentialAccess,\n CredentialOrigin,\n ProtectedBrowserCheckpoint,\n ProtectedBrowserError,\n type ProtectedBrowserHandle,\n type ProtectedCleanup,\n} from \"effect-agent/protected-browser\";\n\nimport {\n BrowserRunHandoffRequest,\n BrowserRunHandoffState,\n BrowserRunLiveViewRequest,\n BrowserRunLiveViewResult,\n} from \"../InteractiveBrowser.ts\";\nimport {\n inheritBrowserReport,\n reportBrowserCause,\n reportedBrowserError,\n} from \"../internal/browser-failure.ts\";\nimport { BrowserRunSessionLifecycle } from \"../internal/browser-session-lifecycle.ts\";\nimport { BrowserRunProtectedBinding, ProtectedProviderIdentity } from \"./binding.ts\";\nimport { BrowserRunProtectedTransport, makeProtectedBrowserPolicy } from \"./policy.ts\";\n\n/** Host-only receipt. Store atomically with the controller lease; never return it to a model. */\nexport class BrowserRunProtectedCheckpoint extends Schema.Class<BrowserRunProtectedCheckpoint>(\n \"BrowserRunProtectedCheckpoint\",\n)({\n ...ProtectedProviderIdentity.fields,\n protected: ProtectedBrowserCheckpoint,\n handoffId: Schema.optionalKey(\n Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(1024))),\n ),\n}) {}\n\nexport interface BrowserRunProtectedSession {\n readonly handle: ProtectedBrowserHandle;\n readonly sessionId: Redacted.Redacted<string>;\n /** Quiesce for a durable workflow pause or human-control request. Persist before detaching. */\n readonly suspend: Effect.Effect<BrowserRunProtectedCheckpoint, ProtectedBrowserError>;\n /** Fences agent tools before dispatch. Persist the returned receipt before detaching. */\n readonly handoff: (\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunProtectedCheckpoint, ProtectedBrowserError>;\n /** Available only while human control is held; the host must authorize the specific human. */\n readonly getLiveView: (\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, ProtectedBrowserError>;\n readonly getHandoffState: Effect.Effect<BrowserRunHandoffState, ProtectedBrowserError>;\n /** Read only the exact page’s current origin after its recorded handoff completes; tools remain paused. */\n readonly getReturnOrigin: Effect.Effect<typeof CredentialOrigin.Type, ProtectedBrowserError>;\n /**\n * Resume a committed pause; human handoffs also require provider completion. Returns no page data.\n * A fresh authorized observation must succeed before page actions or credential operations.\n */\n readonly returnControl: Effect.Effect<void, ProtectedBrowserError>;\n /** Release this attachment only after committing its suspended checkpoint; preserve the remote browser. */\n readonly detach: Effect.Effect<void, ProtectedBrowserError>;\n readonly close: Effect.Effect<typeof ProtectedCleanup.Type>;\n}\n\n/**\n * Host authority for one protected page. The consumer owns durable generation fencing, authorized\n * human recipients, checkpoint integrity, vault exposure metadata, and expiry cleanup. Resume only\n * the latest committed suspended receipt; it never replays browser mutations or creates a page.\n * Hosted passes require Unrestricted network policy: attachment-local request interception\n * cannot enforce an ExactHosts policy during detachment. Current credential grants still apply.\n * Provider inactivity/session deadlines still apply while the host is detached.\n */\nexport class BrowserRunProtectedHost extends Context.Service<\n BrowserRunProtectedHost,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<\n BrowserRunProtectedSession,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n >;\n readonly resume: (\n checkpoint: BrowserRunProtectedCheckpoint,\n ) => Effect.Effect<\n BrowserRunProtectedSession,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n >;\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<typeof ProtectedCleanup.Type>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunProtectedHost\") {}\n\nconst failure = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({\n reason,\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"protected\",\n cleanup: \"not-requested\",\n });\n\nconst Handoff = Schema.Struct({ handoffId: Schema.NonEmptyString.check(Schema.isMaxLength(1024)) });\n\nconst HandoffState = Schema.Struct({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(Schema.NonEmptyString.check(Schema.isMaxLength(1024))),\n durationMs: Schema.optionalKey(Schema.Natural),\n});\n\nconst LiveView = Schema.Struct({ devtoolsFrontendUrl: Schema.String });\n\n/** Compose with browserRunProtectedBindingLayer and BrowserRunSessionLifecycle. */\nexport const browserRunProtectedHostLayer = () =>\n Layer.effect(BrowserRunProtectedHost)(\n Effect.gen(function* () {\n const binding = yield* BrowserRunProtectedBinding;\n const lifecycle = yield* BrowserRunSessionLifecycle;\n const crypto = yield* Crypto.Crypto;\n\n const open = Effect.fn(\"BrowserRunProtectedHost.open\")(function* (\n input: InteractiveBrowserPolicy,\n checkpoint?: BrowserRunProtectedCheckpoint,\n ): Effect.fn.Return<\n BrowserRunProtectedSession,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n > {\n const policy = yield* Schema.decodeEffect(InteractiveBrowserPolicy, {\n onExcessProperty: \"error\",\n })(input).pipe(Effect.mapError(() => failure(\"denied\")));\n\n if (policy.network._tag !== \"Unrestricted\") return yield* failure(\"unsupported\");\n\n const remaining =\n policy.maxElapsedMillis -\n ((yield* Clock.currentTimeMillis) -\n (checkpoint?.protected.startedAt ?? (yield* Clock.currentTimeMillis)));\n\n if (\n remaining <= 0 ||\n (checkpoint !== undefined &&\n checkpoint.protected.startedAt > (yield* Clock.currentTimeMillis))\n )\n return yield* failure(\"timeout\");\n if (checkpoint !== undefined && checkpoint.protected.actions > policy.maxActions)\n return yield* failure(\"denied\");\n const provider = yield* binding.open(policy, checkpoint);\n\n const state = yield* makeProtectedBrowserPolicy(policy, checkpoint?.protected).pipe(\n Effect.provideService(BrowserRunProtectedTransport, {\n open: () => Effect.succeed({ ...provider.driver, detach: provider.detach }),\n }),\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const lock = yield* Semaphore.make(1);\n let handoff = checkpoint;\n let detached = false;\n\n const control = <A>(effect: Effect.Effect<A, ProtectedBrowserError>) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.suspend(() => (detached ? Effect.fail(failure(\"closed\")) : effect)),\n )\n .pipe(Effect.flatMap(Effect.fromOption(() => failure(\"busy\"))));\n\n const fits = (millis: number) =>\n Effect.gen(function* () {\n const started = handoff?.protected.startedAt ?? startedAt;\n\n if (millis > policy.maxElapsedMillis - ((yield* Clock.currentTimeMillis) - started))\n return yield* failure(\"timeout\");\n });\n\n const startedAt = checkpoint?.protected.startedAt ?? (yield* Clock.currentTimeMillis);\n\n const getHandoffState = Effect.gen(function* () {\n if (handoff?.handoffId === undefined) return yield* failure(\"denied\");\n yield* fits(0);\n const raw = yield* provider.command(\"Cloudflare.getHandoffState\", {});\n\n const result = yield* Schema.decodeUnknownEffect(HandoffState)(raw).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.host.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"provider\")))),\n ),\n ),\n );\n\n if (\n (result.active && result.handoffId === undefined) ||\n (result.handoffId !== undefined &&\n result.handoffId !== Redacted.value(handoff.handoffId))\n )\n return yield* failure(\"denied\");\n\n return BrowserRunHandoffState.make({\n active: result.active,\n ...(result.durationMs === undefined ? {} : { durationMs: result.durationMs }),\n ...(result.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(result.handoffId) }),\n });\n });\n\n return {\n handle: state.handle,\n sessionId: provider.identity.sessionId,\n suspend: control(\n Effect.gen(function* () {\n if (handoff !== undefined) {\n yield* state.suspend();\n\n return handoff;\n }\n const suspended = yield* state.suspend();\n\n handoff = BrowserRunProtectedCheckpoint.make({\n ...provider.identity,\n protected: suspended,\n });\n\n return handoff;\n }),\n ),\n handoff: (request) =>\n control(\n Effect.gen(function* () {\n if (handoff?.handoffId !== undefined) return yield* failure(\"busy\");\n\n const decoded = yield* Schema.decodeEffect(BrowserRunHandoffRequest)(request).pipe(\n Effect.mapError(() => failure(\"denied\")),\n );\n\n yield* fits(decoded.timeout);\n const suspended = yield* state.suspend(true);\n\n // An uncertain handoff is never retried; close exactly this provider session.\n const result = yield* provider\n .command(\"Cloudflare.handoff\", {\n instructions: decoded.instructions,\n timeout: decoded.timeout,\n })\n .pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(Handoff)),\n Effect.catchCause((cause) =>\n Cause.hasInterruptsOnly(cause)\n ? Effect.interrupt\n : reportBrowserCause(\"protected.handoff\", cause).pipe(\n Effect.andThen(state.handle.close),\n Effect.flatMap((cleanup) =>\n Effect.fail(\n reportedBrowserError(\n new ProtectedBrowserError({\n reason: \"outcome-unknown\",\n dispatch: \"possibly-dispatched\",\n milestone: suspended.milestone,\n observation: \"closed\",\n cleanup,\n }),\n ),\n ),\n ),\n ),\n ),\n Effect.onInterrupt(() => state.handle.close),\n );\n\n handoff = BrowserRunProtectedCheckpoint.make({\n ...provider.identity,\n protected: suspended,\n handoffId: Redacted.make(result.handoffId),\n });\n\n return handoff;\n }),\n ),\n getLiveView: (request) =>\n control(\n Effect.gen(function* () {\n if (handoff?.handoffId === undefined) return yield* failure(\"denied\");\n\n const decoded = yield* Schema.decodeEffect(BrowserRunLiveViewRequest)(request).pipe(\n Effect.mapError(() => failure(\"denied\")),\n );\n\n yield* fits(decoded.expiresInMs);\n\n const raw = yield* provider.command(\"Cloudflare.getLiveView\", {\n mode: decoded.mode,\n expiresInMs: decoded.expiresInMs,\n });\n\n const result = yield* Schema.decodeUnknownEffect(LiveView)(raw).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.host.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"provider\")))),\n ),\n ),\n );\n\n return yield* Schema.decodeEffect(BrowserRunLiveViewResult)({\n devtoolsFrontendUrl: Redacted.make(result.devtoolsFrontendUrl),\n }).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.host.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"provider\")))),\n ),\n ),\n );\n }),\n ),\n getHandoffState: control(getHandoffState),\n getReturnOrigin: control(\n Effect.gen(function* () {\n if ((yield* getHandoffState).active) return yield* failure(\"busy\");\n\n const context = yield* provider.driver.context.pipe(\n Effect.mapError((error) => inheritBrowserReport(error, failure(error.reason))),\n );\n\n return yield* Schema.decodeEffect(CredentialOrigin)(context.topOrigin).pipe(\n Effect.catch((error) =>\n reportBrowserCause(\"protected.host.decode\", Cause.fail(error)).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"provider\")))),\n ),\n ),\n );\n }),\n ),\n returnControl: control(\n Effect.gen(function* () {\n yield* fits(0);\n if (handoff?.handoffId !== undefined && (yield* getHandoffState).active)\n return yield* failure(\"busy\");\n yield* state.returnControl;\n handoff = undefined;\n }),\n ),\n detach: control(\n Effect.gen(function* () {\n if (handoff === undefined) return yield* failure(\"denied\");\n yield* state.detach;\n detached = true;\n }),\n ),\n close: state.handle.close,\n };\n }, Effect.withTracerEnabled(false));\n\n return {\n open: (policy: InteractiveBrowserPolicy) => open(policy),\n resume: (checkpoint: BrowserRunProtectedCheckpoint) =>\n Schema.decodeEffect(BrowserRunProtectedCheckpoint)(checkpoint).pipe(\n Effect.mapError(() => failure(\"denied\")),\n Effect.flatMap((decoded) => open(decoded.protected.policy, decoded)),\n ),\n closeSession: (id: Redacted.Redacted<string>) =>\n lifecycle.close(id).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"protected.closeSession\", cause).pipe(\n Effect.as(\"unconfirmed\" as const),\n ),\n ),\n ),\n };\n }),\n );\n"],"mappings":"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"}
@@ -705,6 +705,11 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
705
705
  } | {
706
706
  readonly _tag: "AdminFailed";
707
707
  readonly failure: {
708
+ readonly _tag: "DurableAlarmError";
709
+ readonly operation: string;
710
+ readonly message: string;
711
+ readonly cause?: Schema.Json | undefined;
712
+ } | {
708
713
  readonly _tag: "AdmissionPolicyError";
709
714
  readonly reason: "occupied" | "refused" | "unavailable";
710
715
  readonly code: string;
@@ -753,11 +758,6 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
753
758
  readonly _tag: "DigestError";
754
759
  readonly message: string;
755
760
  readonly cause?: Schema.Json | undefined;
756
- } | {
757
- readonly _tag: "DurableAlarmError";
758
- readonly operation: string;
759
- readonly message: string;
760
- readonly cause?: Schema.Json | undefined;
761
761
  } | {
762
762
  readonly _tag: "DurableRuntimeFailpointError";
763
763
  readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-duration-append" | "run:after-start-append" | "run:before-duration-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:after-unavailable-append" | "tools:before-prepared-append" | "tools:before-unavailable-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "update:after-canonical-append" | "update:after-delivery-insert" | "update:before-canonical-append" | "update:before-delivery-insert" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-stop-append" | "worker:after-stop-seal" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-stop-append" | "worker:before-stop-seal" | "worker:before-subtree-append";
@@ -833,4 +833,4 @@ interface Class<EventServices = never> {
833
833
  declare const make: <ApplicationServices, ApplicationError, EventServices = never, EventLayerError = never>(applicationLayer: Layer.Layer<CloudflareDurableRuntimeServices | ApplicationServices, ApplicationError, CloudflareBootstrapServices | DurableObjectState$1.DurableObjectState | WorkerEnvironment | DurableObjectContext | ThreadObjectNamespace>, options: Options<ApplicationServices, EventServices, EventLayerError>) => Class<ApplicationServices | EventServices>;
834
834
  //#endregion
835
835
  export { ThreadPublicationOptions as A, portCall as C, CloudflareDurableRuntimeOptions as D, CloudflareDurableRuntimeInitializationError as E, layerConfig as M, layerHostConfig as N, CloudflareDurableRuntimeServices as O, layerInHost as P, make as S, CloudflareBootstrapServices as T, decodeAdminVerifyRequest as _, AdminVerifyRequest as a, encodeAdminResponse as b, Instance as c, RetryExecuted as d, ThreadObject_d_exports as f, decodeAdminResponse as g, decodeAdminExplainRequest as h, AdminResponse as i, layer as j, ThreadObjectPorts as k, ObligationsScanned as l, VerifiedIntegrity as m, AdminFailed as n, Class as o, ThreadRpcOperation as p, AdminFailure as r, ExplainedRecovery as s, AdminExplainRequest as t, Options as u, decodeObligationThresholds as v, submit as w, handleRpc as x, decodeRetryCommand as y };
836
- //# sourceMappingURL=ThreadObject-CmlCCxd8.d.mts.map
836
+ //# sourceMappingURL=ThreadObject-D_prWu8-.d.mts.map
@@ -1,2 +1,2 @@
1
- import { A as ThreadPublicationOptions, C as portCall, D as CloudflareDurableRuntimeOptions, E as CloudflareDurableRuntimeInitializationError, M as layerConfig, N as layerHostConfig, O as CloudflareDurableRuntimeServices, P as layerInHost, S as make, T as CloudflareBootstrapServices, _ as decodeAdminVerifyRequest, a as AdminVerifyRequest, b as encodeAdminResponse, c as Instance, d as RetryExecuted, g as decodeAdminResponse, h as decodeAdminExplainRequest, i as AdminResponse, j as layer, k as ThreadObjectPorts, l as ObligationsScanned, m as VerifiedIntegrity, n as AdminFailed, o as Class, p as ThreadRpcOperation, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeObligationThresholds, w as submit, x as handleRpc, y as decodeRetryCommand } from "./ThreadObject-CmlCCxd8.mjs";
1
+ import { A as ThreadPublicationOptions, C as portCall, D as CloudflareDurableRuntimeOptions, E as CloudflareDurableRuntimeInitializationError, M as layerConfig, N as layerHostConfig, O as CloudflareDurableRuntimeServices, P as layerInHost, S as make, T as CloudflareBootstrapServices, _ as decodeAdminVerifyRequest, a as AdminVerifyRequest, b as encodeAdminResponse, c as Instance, d as RetryExecuted, g as decodeAdminResponse, h as decodeAdminExplainRequest, i as AdminResponse, j as layer, k as ThreadObjectPorts, l as ObligationsScanned, m as VerifiedIntegrity, n as AdminFailed, o as Class, p as ThreadRpcOperation, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeObligationThresholds, w as submit, x as handleRpc, y as decodeRetryCommand } from "./ThreadObject-D_prWu8-.mjs";
2
2
  export { AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, type CloudflareBootstrapServices as BootstrapServices, Class, ExplainedRecovery, type CloudflareDurableRuntimeInitializationError as InitializationError, Instance, ObligationsScanned, Options, type ThreadPublicationOptions as PublicationOptions, RetryExecuted, type CloudflareDurableRuntimeOptions as RuntimeOptions, type CloudflareDurableRuntimeServices as Services, ThreadObjectPorts, ThreadRpcOperation, VerifiedIntegrity, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeObligationThresholds, decodeRetryCommand, encodeAdminResponse, handleRpc, layer, layerConfig, layerHostConfig, layerInHost, make, portCall, submit };
package/dist/index.d.mts CHANGED
@@ -8,6 +8,6 @@ import { t as CloudflareMemory_d_exports } from "./CloudflareMemory.mjs";
8
8
  import { t as CloudflareScheduling_d_exports } from "./CloudflareScheduling.mjs";
9
9
  import { t as CloudflareSubscriptions_d_exports } from "./CloudflareSubscriptions.mjs";
10
10
  import { t as CloudflareThreadClient_d_exports } from "./CloudflareThreadClient.mjs";
11
- import { f as ThreadObject_d_exports } from "./ThreadObject-CmlCCxd8.mjs";
11
+ import { f as ThreadObject_d_exports } from "./ThreadObject-D_prWu8-.mjs";
12
12
  import { t as WakeScheduler_d_exports } from "./WakeScheduler.mjs";
13
13
  export { Alarm_d_exports as Alarm, CloudflareAiGateway_d_exports as CloudflareAiGateway, CloudflareBindings_d_exports as CloudflareBindings, CloudflareBrowser_d_exports as CloudflareBrowser, CloudflareCodeMode_d_exports as CloudflareCodeMode, CloudflareConfig_d_exports as CloudflareConfig, CloudflareMemory_d_exports as CloudflareMemory, CloudflareScheduling_d_exports as CloudflareScheduling, CloudflareSubscriptions_d_exports as CloudflareSubscriptions, CloudflareThreadClient_d_exports as CloudflareThreadClient, ThreadObject_d_exports as ThreadObject, WakeScheduler_d_exports as WakeScheduler };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.118","dependencies":{"@effect-agent/storage-cloudflare":"0.1.0-beta.118","@effect/platform-browser":"4.0.0-rc.116","@effect/sql-sqlite-do":"4.0.0-rc.116","effect-agent":"0.1.0-beta.118"},"devDependencies":{"@cloudflare/puppeteer":"1.1.0","@cloudflare/vitest-pool-workers":"0.21.3","@cloudflare/workers-types":"5.20260825.1","@effect-agent/testing":"0.1.0-beta.118","@effect/platform-node":"4.0.0-rc.116","@effect/sql-d1":"4.0.0-rc.116","@effect/vitest":"4.0.0-rc.116","effect":"4.0.0-rc.116","effect-cf":"0.44.1","esbuild":"0.28.1","miniflare":"5.20260811.1-alpha","typescript":"7.0.2","vite-plus":"0.3.2","vitest":"4.1.11"},"peerDependencies":{"@cloudflare/puppeteer":"^1.1.0","effect":"^4.0.0-rc.116","effect-cf":"^0.44.1 || ^0.45.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./alarm":{"types":"./dist/Alarm.d.mts","default":"./dist/Alarm.mjs"},"./browser-rest-capture":{"types":"./dist/BrowserRestCapture.d.mts","default":"./dist/BrowserRestCapture.mjs"},"./browser-rest-crawl":{"types":"./dist/BrowserRestCrawl.d.mts","default":"./dist/BrowserRestCrawl.mjs"},"./cloudflare-bindings":{"types":"./dist/CloudflareBindings.d.mts","default":"./dist/CloudflareBindings.mjs"},"./cloudflare-browser":{"types":"./dist/CloudflareBrowser.d.mts","default":"./dist/CloudflareBrowser.mjs"},"./cloudflare-code-mode":{"types":"./dist/CloudflareCodeMode.d.mts","default":"./dist/CloudflareCodeMode.mjs"},"./cloudflare-config":{"types":"./dist/CloudflareConfig.d.mts","default":"./dist/CloudflareConfig.mjs"},"./cloudflare-memory":{"types":"./dist/CloudflareMemory.d.mts","default":"./dist/CloudflareMemory.mjs"},"./cloudflare-scheduling":{"types":"./dist/CloudflareScheduling.d.mts","default":"./dist/CloudflareScheduling.mjs"},"./cloudflare-subscriptions":{"types":"./dist/CloudflareSubscriptions.d.mts","default":"./dist/CloudflareSubscriptions.mjs"},"./cloudflare-thread-client":{"types":"./dist/CloudflareThreadClient.d.mts","default":"./dist/CloudflareThreadClient.mjs"},"./interactive-browser":{"types":"./dist/InteractiveBrowser.d.mts","default":"./dist/InteractiveBrowser.mjs"},"./protected-browser":{"types":"./dist/ProtectedBrowser.d.mts","default":"./dist/ProtectedBrowser.mjs"},"./thread-object":{"types":"./dist/ThreadObject.d.mts","default":"./dist/ThreadObject.mjs"},"./wake-scheduler":{"types":"./dist/WakeScheduler.d.mts","default":"./dist/WakeScheduler.mjs"},"./cloudflare-ai-gateway":{"types":"./dist/CloudflareAiGateway.d.mts","default":"./dist/CloudflareAiGateway.mjs"}},"description":"Cloudflare Layer assembly for Effect Agent: Durable Objects and Browser Run adapters.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-cloudflare"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"},"peerDependenciesMeta":{"@cloudflare/puppeteer":{"optional":true}}}
1
+ {"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.119","dependencies":{"@effect-agent/storage-cloudflare":"0.1.0-beta.119","@effect/platform-browser":"4.0.0-rc.116","@effect/sql-sqlite-do":"4.0.0-rc.116","effect-agent":"0.1.0-beta.119"},"devDependencies":{"@cloudflare/puppeteer":"1.1.0","@cloudflare/vitest-pool-workers":"0.21.3","@cloudflare/workers-types":"5.20260825.1","@effect-agent/testing":"0.1.0-beta.119","@effect/platform-node":"4.0.0-rc.116","@effect/sql-d1":"4.0.0-rc.116","@effect/vitest":"4.0.0-rc.116","effect":"4.0.0-rc.116","effect-cf":"0.44.1","esbuild":"0.28.1","miniflare":"5.20260811.1-alpha","typescript":"7.0.2","vite-plus":"0.3.2","vitest":"4.1.11"},"peerDependencies":{"@cloudflare/puppeteer":"^1.1.0","effect":"^4.0.0-rc.116","effect-cf":"^0.44.1 || ^0.45.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./alarm":{"types":"./dist/Alarm.d.mts","default":"./dist/Alarm.mjs"},"./browser-rest-capture":{"types":"./dist/BrowserRestCapture.d.mts","default":"./dist/BrowserRestCapture.mjs"},"./browser-rest-crawl":{"types":"./dist/BrowserRestCrawl.d.mts","default":"./dist/BrowserRestCrawl.mjs"},"./cloudflare-bindings":{"types":"./dist/CloudflareBindings.d.mts","default":"./dist/CloudflareBindings.mjs"},"./cloudflare-browser":{"types":"./dist/CloudflareBrowser.d.mts","default":"./dist/CloudflareBrowser.mjs"},"./cloudflare-code-mode":{"types":"./dist/CloudflareCodeMode.d.mts","default":"./dist/CloudflareCodeMode.mjs"},"./cloudflare-config":{"types":"./dist/CloudflareConfig.d.mts","default":"./dist/CloudflareConfig.mjs"},"./cloudflare-memory":{"types":"./dist/CloudflareMemory.d.mts","default":"./dist/CloudflareMemory.mjs"},"./cloudflare-scheduling":{"types":"./dist/CloudflareScheduling.d.mts","default":"./dist/CloudflareScheduling.mjs"},"./cloudflare-subscriptions":{"types":"./dist/CloudflareSubscriptions.d.mts","default":"./dist/CloudflareSubscriptions.mjs"},"./cloudflare-thread-client":{"types":"./dist/CloudflareThreadClient.d.mts","default":"./dist/CloudflareThreadClient.mjs"},"./interactive-browser":{"types":"./dist/InteractiveBrowser.d.mts","default":"./dist/InteractiveBrowser.mjs"},"./protected-browser":{"types":"./dist/ProtectedBrowser.d.mts","default":"./dist/ProtectedBrowser.mjs"},"./thread-object":{"types":"./dist/ThreadObject.d.mts","default":"./dist/ThreadObject.mjs"},"./wake-scheduler":{"types":"./dist/WakeScheduler.d.mts","default":"./dist/WakeScheduler.mjs"},"./cloudflare-ai-gateway":{"types":"./dist/CloudflareAiGateway.d.mts","default":"./dist/CloudflareAiGateway.mjs"}},"description":"Cloudflare Layer assembly for Effect Agent: Durable Objects and Browser Run adapters.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-cloudflare"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"},"peerDependenciesMeta":{"@cloudflare/puppeteer":{"optional":true}}}
@@ -60,12 +60,26 @@ export const inspectFrame = `(() => {
60
60
  } else if (el instanceof HTMLButtonElement || (el instanceof HTMLInputElement && ['submit','button'].includes(type))) {
61
61
  if (!el.matches(':disabled')) role = type === 'submit' && form ? 'submit' : type === 'button' ? 'button' : 'unsupported';
62
62
  } else if (el instanceof HTMLAnchorElement) role = 'link';
63
+ const options = [];
64
+ let truncated = false;
65
+ if (role === 'select') {
66
+ for (let index = 0; index < el.options.length; index++) {
67
+ if (index === 256) { truncated = true; break; }
68
+ const option = el.options[index];
69
+ const label = option.label.trim();
70
+ // Never publish a shortened label as an exact fill choice.
71
+ if (label.length > 200) { truncated = true; continue; }
72
+ options.push({label, selected: option.selected, disabled: option.matches(':disabled')});
73
+ }
74
+ }
63
75
  const fingerprint = JSON.stringify([role, action, method, enctype, name, completion, type, choiceValue]);
64
76
  return { role, formIndex, action, fingerprint, ...(isChoice(el) ? {checked: el.checked} : {}),
77
+ ...(role === 'select' ? {options, truncated} : {}),
65
78
  label: (labelText(el) ?? (nativeField ? '' : el.textContent) ?? '').slice(0,200) };
66
79
  };
67
- const expose = ({role, formIndex, action, label, checked}) =>
68
- ({role, formIndex, action, label, ...(checked === undefined ? {} : {checked})});
80
+ const expose = ({role, formIndex, action, label, checked, options, truncated}) =>
81
+ ({role, formIndex, action, label, ...(checked === undefined ? {} : {checked}),
82
+ ...(options === undefined ? {} : {options, truncated})});
69
83
  const original = elements.map(describe);
70
84
  const validate = (index) => {
71
85
  const current = describe(elements[index]);
@@ -95,13 +109,13 @@ export const inspectFrame = `(() => {
95
109
  const current = validate(index);
96
110
  if (!current || current.role !== role) return false;
97
111
  const el = elements[index];
98
- if (role === 'select') {
112
+ if (el instanceof HTMLSelectElement) {
99
113
  const options = [...el.options].filter(option => !option.matches(':disabled'));
100
- const values = options.filter(option => option.value === value);
101
- const matches = values.length > 0 ? values : options.filter(option => option.textContent?.trim() === value);
102
- if (matches.length !== 1) return 'unsupported';
114
+ // Ordinary fills name the visible choice; credential material stays a private value.
115
+ const matches = options.filter(option => (role === 'select' ? option.label.trim() : option.value) === value);
116
+ if (matches.length !== 1) return 'unsupported-before-write';
103
117
  value = matches[0].value;
104
- if ([...el.options].filter(option => option.value === value).length !== 1) return 'unsupported';
118
+ if ([...el.options].filter(option => option.value === value).length !== 1) return 'unsupported-before-write';
105
119
  }
106
120
  let prototype = Object.getPrototypeOf(el);
107
121
  let setter;
@@ -36,9 +36,12 @@ const Description = Schema.Struct({
36
36
  action: Schema.String.check(Schema.isMaxLength(maxAttributeLength)),
37
37
  label: Schema.String.check(Schema.isMaxLength(200)),
38
38
  checked: Schema.optionalKey(Schema.Boolean),
39
+ options: ProtectedBrowserControl.fields.options,
40
+ truncated: Schema.optionalKey(Schema.Boolean),
39
41
  });
40
42
 
41
43
  const Descriptions = Schema.Array(Schema.NullOr(Description)).check(Schema.isMaxLength(65));
44
+ const FillResult = Schema.Literals([true, false, "unsupported-before-write", "unsupported"]);
42
45
 
43
46
  interface FrameState {
44
47
  readonly frame: Frame;
@@ -367,6 +370,7 @@ export const makeProtectedNativeTransport = Effect.fn("ProtectedNativeTransport.
367
370
  const desc = descriptions[index];
368
371
 
369
372
  if (!desc) continue;
373
+ if (desc.truncated) truncated = true;
370
374
  if (discovered.length === 64) {
371
375
  truncated = true;
372
376
  break;
@@ -387,6 +391,7 @@ export const makeProtectedNativeTransport = Effect.fn("ProtectedNativeTransport.
387
391
  role: desc.role,
388
392
  label: desc.label,
389
393
  ...(desc.checked === undefined ? {} : { checked: desc.checked }),
394
+ ...(desc.options === undefined ? {} : { options: desc.options }),
390
395
  ...(desc.role === "link" ? { url: desc.action } : {}),
391
396
  target: CredentialTarget.make({
392
397
  topOrigin: before.topOrigin,
@@ -439,7 +444,7 @@ export const makeProtectedNativeTransport = Effect.fn("ProtectedNativeTransport.
439
444
  // CDP dispatch may mutate before its reply is lost, so uncertainty starts here.
440
445
  yield* dispatch.mark;
441
446
 
442
- const filled = yield* remote("protected.fill", () =>
447
+ const raw = yield* remote("protected.fill", () =>
443
448
  state.frame.handle.evaluate(
444
449
  (held, index, expectedRole, secret) => {
445
450
  if (typeof held !== "object" || held === null) return false;
@@ -452,8 +457,15 @@ export const makeProtectedNativeTransport = Effect.fn("ProtectedNativeTransport.
452
457
  ),
453
458
  );
454
459
 
460
+ const filled = yield* decode(FillResult, raw);
461
+
462
+ if (filled === false || filled === "unsupported-before-write") {
463
+ yield* dispatch.confirmNoWrite;
464
+
465
+ return yield* transportError(filled === false ? "stale-reference" : "unsupported");
466
+ }
467
+
455
468
  if (filled === "unsupported") return yield* transportError("unsupported");
456
- if (filled !== true) return yield* transportError("stale-reference");
457
469
  }),
458
470
  click: Effect.fn("ProtectedNativeTransport.click")(function* (ref) {
459
471
  const state = yield* get(ref);
@@ -57,7 +57,11 @@ export class ProtectedTransportError extends Schema.TaggedError<ProtectedTranspo
57
57
  /** Per-write evidence authority, provided by the policy immediately around a transport fill. */
58
58
  export class ProtectedBrowserDispatch extends Context.Service<
59
59
  ProtectedBrowserDispatch,
60
- { readonly mark: Effect.Effect<void> }
60
+ {
61
+ readonly mark: Effect.Effect<void>;
62
+ /** Only an acknowledged reply before assignment may restore the preceding dispatch evidence. */
63
+ readonly confirmNoWrite: Effect.Effect<void>;
64
+ }
61
65
  >()("@effect-agent/platform-cloudflare/ProtectedBrowserDispatch") {}
62
66
 
63
67
  /** Decoded adapter boundary. SDK exceptions and page diagnostics never cross this port. */
@@ -577,6 +581,8 @@ export const makeProtectedBrowserPolicy = Effect.fn("ProtectedBrowser.open")(fun
577
581
  target: control.target,
578
582
  role: control.role,
579
583
  });
584
+ const previousDispatch = dispatch;
585
+
580
586
  yield* publicFailure(
581
587
  driver.fill(decoded.ref, control.role, Redacted.make(decoded.value)),
582
588
  ).pipe(
@@ -584,6 +590,9 @@ export const makeProtectedBrowserPolicy = Effect.fn("ProtectedBrowser.open")(fun
584
590
  mark: Effect.sync(() => {
585
591
  dispatch = "possibly-dispatched";
586
592
  }),
593
+ confirmNoWrite: Effect.sync(() => {
594
+ dispatch = previousDispatch;
595
+ }),
587
596
  }),
588
597
  );
589
598
  dispatch = "dispatched";
@@ -726,6 +735,8 @@ export const makeProtectedBrowserPolicy = Effect.fn("ProtectedBrowser.open")(fun
726
735
  const value = secretFor(material, field.role);
727
736
 
728
737
  if (value === undefined) return yield* fail("missing-credential");
738
+ const previousDispatch = dispatch;
739
+
729
740
  observation = "protected";
730
741
  yield* publicFailure(driver.fill(field.ref, field.role, value)).pipe(
731
742
  Effect.provideService(ProtectedBrowserDispatch, {
@@ -734,6 +745,10 @@ export const makeProtectedBrowserPolicy = Effect.fn("ProtectedBrowser.open")(fun
734
745
  if (!exposures.some((target) => sameTarget(target, offer.target)))
735
746
  exposures.push(offer.target);
736
747
  }),
748
+ // A refused later field cannot erase a completed earlier field or its exposure.
749
+ confirmNoWrite: Effect.sync(() => {
750
+ dispatch = previousDispatch;
751
+ }),
737
752
  }),
738
753
  );
739
754
  dispatch = "dispatched";