effect-agent 0.1.0-beta.91 → 0.1.0-beta.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/{AgentRuntime-CHipL2jG.mjs → AgentRuntime-BPjQM1Nv.mjs} +2 -2
  2. package/dist/AgentRuntime-BPjQM1Nv.mjs.map +1 -0
  3. package/dist/{DurableAgentRuntime-D7gDKGjH.mjs → DurableAgentRuntime-CdrBuKZY.mjs} +4 -4
  4. package/dist/{DurableAgentRuntime-D7gDKGjH.mjs.map → DurableAgentRuntime-CdrBuKZY.mjs.map} +1 -1
  5. package/dist/{EventSource-OqS_P9ug.d.mts → EventSource-c6GRTCsl.d.mts} +3 -3
  6. package/dist/{PreparedInputAdmission-C4HbjHgl.d.mts → PreparedInputAdmission-QzFbW2LQ.d.mts} +4 -4
  7. package/dist/Records-C9cezOEf.mjs +799 -0
  8. package/dist/Records-C9cezOEf.mjs.map +1 -0
  9. package/dist/{Records-BAGkekt8.d.mts → Records-vFp_ZQ9Y.d.mts} +21 -3
  10. package/dist/{RunJournal-Cgg1kNvc.mjs → RunJournal-lwbrh2hZ.mjs} +2 -2
  11. package/dist/{RunJournal-Cgg1kNvc.mjs.map → RunJournal-lwbrh2hZ.mjs.map} +1 -1
  12. package/dist/{Schedule-H3SEYX9g.d.mts → Schedule-BkZvKyMw.d.mts} +2 -2
  13. package/dist/{Scheduling-C9aIP8zT.mjs → Scheduling-D0QqOoeT.mjs} +2 -2
  14. package/dist/{Scheduling-C9aIP8zT.mjs.map → Scheduling-D0QqOoeT.mjs.map} +1 -1
  15. package/dist/{Subagent-U5qXOFE8.mjs → Subagent-CnTzCy8k.mjs} +2 -2
  16. package/dist/{Subagent-U5qXOFE8.mjs.map → Subagent-CnTzCy8k.mjs.map} +1 -1
  17. package/dist/{Subscription-BEP8oQO5.d.mts → Subscription-CKQ0KDHN.d.mts} +3 -3
  18. package/dist/{SubscriptionInput-vAAOBrK7.d.mts → SubscriptionInput-Cth8F_7b.d.mts} +3 -3
  19. package/dist/capabilities/Subagent.mjs +1 -1
  20. package/dist/capabilities/WebSearch.d.mts +3 -3
  21. package/dist/capabilities/WebSearch.mjs +9 -6
  22. package/dist/capabilities/WebSearch.mjs.map +1 -1
  23. package/dist/durable/ActivityStore.d.mts +1 -1
  24. package/dist/durable/ActivityStore.mjs +1 -1
  25. package/dist/durable/Admin.d.mts +1 -1
  26. package/dist/durable/Admin.mjs +1 -1
  27. package/dist/durable/AgentRegistration.d.mts +1 -1
  28. package/dist/durable/Certification.d.mts +1 -1
  29. package/dist/durable/CommittedActivity.d.mts +1 -1
  30. package/dist/durable/CommittedActivity.mjs +1 -1
  31. package/dist/durable/Digest.d.mts +1 -1
  32. package/dist/durable/Digest.mjs +1 -1
  33. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  34. package/dist/durable/DurableAgentRuntime.mjs +1 -1
  35. package/dist/durable/EventSource.d.mts +1 -1
  36. package/dist/durable/EventSource.mjs +1 -1
  37. package/dist/durable/GitHubWorkflowSource.d.mts +48 -6
  38. package/dist/durable/GitHubWorkflowSource.mjs +13 -13
  39. package/dist/durable/GitHubWorkflowSource.mjs.map +1 -1
  40. package/dist/durable/MessageDelivery.d.mts +22 -22
  41. package/dist/durable/MessageDelivery.mjs +1 -1
  42. package/dist/durable/MessageDeliveryStoreConformance.d.mts +39 -39
  43. package/dist/durable/MessageDeliveryStoreConformance.mjs +1 -1
  44. package/dist/durable/PersistentHistory.d.mts +1 -1
  45. package/dist/durable/PersistentHistory.mjs +2 -2
  46. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  47. package/dist/durable/Records.d.mts +1 -1
  48. package/dist/durable/Records.mjs +2 -795
  49. package/dist/durable/Recovery.d.mts +1 -1
  50. package/dist/durable/Recovery.mjs +1 -1
  51. package/dist/durable/RunJournal.d.mts +1 -1
  52. package/dist/durable/RunJournal.mjs +1 -1
  53. package/dist/durable/Schedule.d.mts +1 -1
  54. package/dist/durable/Schedule.mjs +1 -1
  55. package/dist/durable/ScheduleStoreConformance.d.mts +1 -1
  56. package/dist/durable/ScheduleStoreConformance.mjs +1 -1
  57. package/dist/durable/ScheduleTransition.d.mts +1 -1
  58. package/dist/durable/ScheduleTransition.mjs +1 -1
  59. package/dist/durable/Scheduling.d.mts +2 -2
  60. package/dist/durable/Scheduling.mjs +1 -1
  61. package/dist/durable/SqlStorageV2Upgrade.d.mts +2 -2
  62. package/dist/durable/SqlStorageV2Upgrade.mjs +1 -1
  63. package/dist/durable/SqlSubscriptionStore.d.mts +2 -2
  64. package/dist/durable/SqlSubscriptionStore.mjs +1 -1
  65. package/dist/durable/SubmissionLedger.d.mts +1 -1
  66. package/dist/durable/SubmissionLedger.mjs +1 -1
  67. package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
  68. package/dist/durable/SubmissionLedgerConformance.mjs +1 -1
  69. package/dist/durable/SubmissionStatus.d.mts +1 -1
  70. package/dist/durable/Subscription.d.mts +1 -1
  71. package/dist/durable/Subscription.mjs +1 -1
  72. package/dist/durable/SubscriptionInput.d.mts +1 -1
  73. package/dist/durable/SubscriptionInput.mjs +1 -1
  74. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  75. package/dist/durable/SubscriptionStoreConformance.mjs +1 -1
  76. package/dist/durable/SubscriptionTools.d.mts +3 -3
  77. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  78. package/dist/durable/SubscriptionTransition.mjs +1 -1
  79. package/dist/durable/Subscriptions.d.mts +5 -5
  80. package/dist/durable/Subscriptions.mjs +1 -1
  81. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  82. package/dist/durable/ThreadContextHistory.mjs +1 -1
  83. package/dist/durable/ThreadContextHistoryProjection.d.mts +1 -1
  84. package/dist/durable/ThreadContextHistoryProjection.mjs +1 -1
  85. package/dist/durable/ThreadInvariants.d.mts +1 -1
  86. package/dist/durable/ThreadInvariants.mjs +1 -1
  87. package/dist/durable/ThreadProjection.d.mts +1 -1
  88. package/dist/durable/ThreadProjection.mjs +1 -1
  89. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  90. package/dist/durable/ThreadStore.d.mts +1 -1
  91. package/dist/durable/ThreadStore.mjs +1 -1
  92. package/dist/durable/ThreadStoreConformance.d.mts +1 -1
  93. package/dist/durable/ThreadStoreConformance.mjs +1 -1
  94. package/dist/durable/ToolReconciler.mjs +1 -1
  95. package/dist/durable/WorkerHost.d.mts +1 -1
  96. package/dist/engine/AgentRuntime.mjs +1 -1
  97. package/dist/index.d.mts +6 -6
  98. package/dist/index.mjs +6 -6
  99. package/dist/sandbox/InteractiveBrowser.mjs +2 -2
  100. package/dist/sandbox/InteractiveBrowser.mjs.map +1 -1
  101. package/dist/sandbox/PageCapture.mjs +4 -4
  102. package/dist/sandbox/PageCapture.mjs.map +1 -1
  103. package/dist/sandbox/ProtectedBrowser.mjs +1 -1
  104. package/dist/sandbox/ProtectedBrowser.mjs.map +1 -1
  105. package/package.json +1 -1
  106. package/src/capabilities/WebSearch.ts +23 -17
  107. package/src/core/internal/strict-schema.ts +14 -0
  108. package/src/durable/GitHubWorkflowSource.ts +32 -38
  109. package/src/durable/Records.ts +8 -4
  110. package/src/engine/internal/primitive-delta.ts +1 -1
  111. package/src/sandbox/InteractiveBrowser.ts +2 -2
  112. package/src/sandbox/PageCapture.ts +6 -7
  113. package/src/sandbox/ProtectedBrowser.ts +1 -1
  114. package/dist/AgentRuntime-CHipL2jG.mjs.map +0 -1
  115. package/dist/durable/Records.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"InteractiveBrowser.mjs","names":[],"sources":["../../src/sandbox/InteractiveBrowser.ts"],"sourcesContent":["import { Context, Option, Schema, type Effect, type Scope } from \"effect\";\n\nimport type { PageScreenshotResult } from \"./PageScreenshot.ts\";\nimport { SandboxImplementation } from \"./Sandbox.ts\";\n\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\nconst BoundedText = Schema.String.check(Schema.isMaxLength(8 * 1024 * 1024));\nconst BoundedMessage = Schema.String.check(Schema.isMaxLength(8 * 1024));\nconst Selector = Schema.NonEmptyString.check(Schema.isMaxLength(1_024));\nconst FieldValue = Schema.String.check(Schema.isMaxLength(64 * 1024));\nconst ScrollDelta = Schema.Int.check(Schema.isBetween({ minimum: -100_000, maximum: 100_000 }));\nconst decodeUrl = Schema.decodeUnknownOption(Schema.URLFromString);\n\n/** Absolute, bounded HTTP(S) navigation URL without embedded credentials. */\nexport const InteractiveBrowserTargetUrl = Schema.NonEmptyString.check(\n Schema.isMaxLength(8 * 1024),\n Schema.makeFilter(\n (value) => {\n const parsed = decodeUrl(value);\n\n if (Option.isNone(parsed)) return false;\n const url = parsed.value;\n\n return (\n (url.protocol === \"http:\" || url.protocol === \"https:\") &&\n url.hostname !== \"\" &&\n url.username === \"\" &&\n url.password === \"\"\n );\n },\n { title: \"an absolute HTTP or HTTPS URL without embedded credentials\" },\n ),\n);\n\nexport type InteractiveBrowserTargetUrl = typeof InteractiveBrowserTargetUrl.Type;\n\n/** Canonical HTTPS host authority, optionally carrying a non-default port. */\nexport const InteractiveBrowserHost = Schema.NonEmptyString.check(\n Schema.isMaxLength(255),\n Schema.makeFilter(\n (value) => {\n if (value.includes(\"*\")) return false;\n const parsed = decodeUrl(`https://${value}/`);\n\n if (Option.isNone(parsed)) return false;\n const url = parsed.value;\n\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.host === value\n );\n },\n { title: \"a canonical credential-free HTTPS host authority\" },\n ),\n);\n\nexport type InteractiveBrowserHost = typeof InteractiveBrowserHost.Type;\n\n/**\n * ExactHosts retains the page-request URL allowlist, not a public-network boundary.\n * PublicWeb requires connection-time public-address enforcement for all session\n * traffic, including human navigation. Adapters that cannot enforce it must fail\n * with InteractiveBrowserUnsupportedError before acquiring a browser.\n * Unrestricted explicitly opts out of URL/host and private-network containment.\n */\nexport const InteractiveBrowserNetworkPolicy = Schema.Union([\n Schema.TaggedStruct(\"ExactHosts\", {\n allowedHosts: Schema.Array(InteractiveBrowserHost).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(64),\n Schema.isUnique(),\n ),\n }),\n Schema.TaggedStruct(\"PublicWeb\", {}),\n Schema.TaggedStruct(\"Unrestricted\", {}),\n]).pipe(Schema.annotate({ parseOptions: { onExcessProperty: \"error\" } }));\n\nexport type InteractiveBrowserNetworkPolicy = typeof InteractiveBrowserNetworkPolicy.Type;\n\n/** Finite per-pass budgets. The elapsed ceiling is one hour; provider idle limits may be shorter. */\nexport class InteractiveBrowserPolicy extends Schema.Class<InteractiveBrowserPolicy>(\n \"InteractiveBrowserPolicy\",\n)(\n Schema.Struct({\n network: InteractiveBrowserNetworkPolicy,\n maxActions: PositiveInt.check(Schema.isLessThanOrEqualTo(1_000)),\n maxElapsedMillis: PositiveInt.check(Schema.isLessThanOrEqualTo(60 * 60_000)),\n maxReturnedBytes: PositiveInt.check(Schema.isLessThanOrEqualTo(8 * 1024 * 1024)),\n }).pipe(Schema.annotate({ parseOptions: { onExcessProperty: \"error\" } })),\n) {}\n\nexport class BrowserNavigateRequest extends Schema.Class<BrowserNavigateRequest>(\n \"BrowserNavigateRequest\",\n)({ url: InteractiveBrowserTargetUrl }) {}\n\nexport class BrowserReadTextRequest extends Schema.Class<BrowserReadTextRequest>(\n \"BrowserReadTextRequest\",\n)({ selector: Schema.optionalKey(Selector) }) {}\n\nexport class BrowserFillRequest extends Schema.Class<BrowserFillRequest>(\"BrowserFillRequest\")({\n selector: Selector,\n value: FieldValue,\n}) {}\n\nexport class BrowserClickRequest extends Schema.Class<BrowserClickRequest>(\"BrowserClickRequest\")({\n selector: Selector,\n}) {}\n\n/** Capture the current page without navigating or opening another browser. */\nexport class BrowserScreenshotRequest extends Schema.Class<BrowserScreenshotRequest>(\n \"BrowserScreenshotRequest\",\n)({ fullPage: Schema.Boolean }) {}\n\n/** Scroll the current viewport by signed CSS pixel deltas. */\nexport class BrowserScrollRequest extends Schema.Class<BrowserScrollRequest>(\n \"BrowserScrollRequest\",\n)({\n deltaX: ScrollDelta,\n deltaY: ScrollDelta,\n}) {}\n\nexport class BrowserNavigationResult extends Schema.Class<BrowserNavigationResult>(\n \"BrowserNavigationResult\",\n)({ url: InteractiveBrowserTargetUrl }) {}\n\nexport class BrowserTextResult extends Schema.Class<BrowserTextResult>(\"BrowserTextResult\")({\n text: BoundedText,\n}) {}\n\n/** Post-action URL observation; no provider session state crosses this boundary. */\nexport class BrowserActionResult extends Schema.Class<BrowserActionResult>(\"BrowserActionResult\")({\n url: InteractiveBrowserTargetUrl,\n}) {}\n\nexport class InteractiveBrowserPolicyDeniedError extends Schema.TaggedError<InteractiveBrowserPolicyDeniedError>()(\n \"InteractiveBrowserPolicyDeniedError\",\n { implementation: SandboxImplementation, message: BoundedMessage },\n) {}\n\nexport class InteractiveBrowserBusyError extends Schema.TaggedError<InteractiveBrowserBusyError>()(\n \"InteractiveBrowserBusyError\",\n { implementation: SandboxImplementation, message: BoundedMessage },\n) {}\n\nexport class InteractiveBrowserCapacityError extends Schema.TaggedError<InteractiveBrowserCapacityError>()(\n \"InteractiveBrowserCapacityError\",\n { implementation: SandboxImplementation, message: BoundedMessage },\n) {}\n\nexport class InteractiveBrowserExpiredError extends Schema.TaggedError<InteractiveBrowserExpiredError>()(\n \"InteractiveBrowserExpiredError\",\n { implementation: SandboxImplementation, message: BoundedMessage },\n) {}\n\nexport class InteractiveBrowserActionError extends Schema.TaggedError<InteractiveBrowserActionError>()(\n \"InteractiveBrowserActionError\",\n {\n implementation: SandboxImplementation,\n operation: Schema.Literals([\n \"navigate\",\n \"read-text\",\n \"fill\",\n \"click\",\n \"screenshot\",\n \"scroll\",\n \"close\",\n ]),\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\nexport class InteractiveBrowserProtocolError extends Schema.TaggedError<InteractiveBrowserProtocolError>()(\n \"InteractiveBrowserProtocolError\",\n {\n implementation: SandboxImplementation,\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\nexport class InteractiveBrowserLimitError extends Schema.TaggedError<InteractiveBrowserLimitError>()(\n \"InteractiveBrowserLimitError\",\n {\n implementation: SandboxImplementation,\n limit: Schema.Literals([\"actions\", \"elapsed\", \"returned-bytes\"]),\n maximum: PositiveInt,\n observed: Schema.Natural,\n message: BoundedMessage,\n },\n) {}\n\nexport class InteractiveBrowserUnsupportedError extends Schema.TaggedError<InteractiveBrowserUnsupportedError>()(\n \"InteractiveBrowserUnsupportedError\",\n {\n implementation: SandboxImplementation,\n feature: Schema.Literals([\n \"navigation\",\n \"read-text\",\n \"fill\",\n \"click\",\n \"screenshot\",\n \"scroll\",\n \"policy\",\n ]),\n message: BoundedMessage,\n },\n) {}\n\nexport const InteractiveBrowserError = Schema.Union([\n InteractiveBrowserPolicyDeniedError,\n InteractiveBrowserBusyError,\n InteractiveBrowserCapacityError,\n InteractiveBrowserExpiredError,\n InteractiveBrowserActionError,\n InteractiveBrowserProtocolError,\n InteractiveBrowserLimitError,\n InteractiveBrowserUnsupportedError,\n]);\n\nexport type InteractiveBrowserError = typeof InteractiveBrowserError.Type;\n\n/** A live handle is intentionally not a Schema value and cannot cross persistence/transport boundaries. */\nexport interface BrowserHandle {\n readonly navigate: (\n request: BrowserNavigateRequest,\n ) => Effect.Effect<BrowserNavigationResult, InteractiveBrowserError>;\n readonly readText: (\n request: BrowserReadTextRequest,\n ) => Effect.Effect<BrowserTextResult, InteractiveBrowserError>;\n readonly fill: (\n request: BrowserFillRequest,\n ) => Effect.Effect<BrowserActionResult, InteractiveBrowserError>;\n readonly click: (\n request: BrowserClickRequest,\n ) => Effect.Effect<BrowserActionResult, InteractiveBrowserError>;\n /** PNG bytes are caller-owned and bounded by the pass's per-result byte limit. */\n readonly screenshot: (\n request: BrowserScreenshotRequest,\n ) => Effect.Effect<PageScreenshotResult, InteractiveBrowserError>;\n readonly scroll: (\n request: BrowserScrollRequest,\n ) => Effect.Effect<BrowserActionResult, InteractiveBrowserError>;\n /** Invalidate the handle and close its resources early, including after an interrupted action. */\n readonly close: Effect.Effect<void, InteractiveBrowserError>;\n}\n\nexport class InteractiveBrowser extends Context.Service<\n InteractiveBrowser,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<BrowserHandle, InteractiveBrowserError, Scope.Scope>;\n }\n>()(\"@effect-agent/sandbox/InteractiveBrowser\") {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InteractiveBrowser.mjs","names":[],"sources":["../../src/sandbox/InteractiveBrowser.ts"],"sourcesContent":["import { Context, Option, Schema, type Effect, type Scope } from \"effect\";\n\nimport type { PageScreenshotResult } from \"./PageScreenshot.ts\";\nimport { SandboxImplementation } from \"./Sandbox.ts\";\n\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\nconst BoundedText = Schema.String.check(Schema.isMaxLength(8 * 1024 * 1024));\nconst BoundedMessage = Schema.String.check(Schema.isMaxLength(8 * 1024));\nconst Selector = Schema.NonEmptyString.check(Schema.isMaxLength(1_024));\nconst FieldValue = Schema.String.check(Schema.isMaxLength(64 * 1024));\nconst ScrollDelta = Schema.Int.check(Schema.isBetween({ minimum: -100_000, maximum: 100_000 }));\nconst decodeUrl = Schema.decodeUnknownOption(Schema.URLFromString);\n\n/** Absolute, bounded HTTP(S) navigation URL without embedded credentials. */\nexport const InteractiveBrowserTargetUrl = Schema.NonEmptyString.check(\n Schema.isMaxLength(8 * 1024),\n Schema.makeFilter(\n (value) => {\n const parsed = decodeUrl(value);\n\n if (Option.isNone(parsed)) return false;\n const url = parsed.value;\n\n return (\n (url.protocol === \"http:\" || url.protocol === \"https:\") &&\n url.hostname !== \"\" &&\n url.username === \"\" &&\n url.password === \"\"\n );\n },\n { title: \"an absolute HTTP or HTTPS URL without embedded credentials\" },\n ),\n);\n\nexport type InteractiveBrowserTargetUrl = typeof InteractiveBrowserTargetUrl.Type;\n\n/** Canonical HTTPS host authority, optionally carrying a non-default port. */\nexport const InteractiveBrowserHost = Schema.NonEmptyString.check(\n Schema.isMaxLength(255),\n Schema.makeFilter(\n (value) => {\n if (value.includes(\"*\")) return false;\n const parsed = decodeUrl(`https://${value}/`);\n\n if (Option.isNone(parsed)) return false;\n const url = parsed.value;\n\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.host === value\n );\n },\n { title: \"a canonical credential-free HTTPS host authority\" },\n ),\n);\n\nexport type InteractiveBrowserHost = typeof InteractiveBrowserHost.Type;\n\n/**\n * ExactHosts retains the page-request URL allowlist, not a public-network boundary.\n * PublicWeb requires connection-time public-address enforcement for all session\n * traffic, including human navigation. Adapters that cannot enforce it must fail\n * with InteractiveBrowserUnsupportedError before acquiring a browser.\n * Unrestricted explicitly opts out of URL/host and private-network containment.\n */\nexport const InteractiveBrowserNetworkPolicy = Schema.Union([\n Schema.TaggedStruct(\"ExactHosts\", {\n allowedHosts: Schema.Array(InteractiveBrowserHost).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(64),\n Schema.isUnique(),\n ),\n }),\n Schema.TaggedStruct(\"PublicWeb\", {}),\n Schema.TaggedStruct(\"Unrestricted\", {}),\n]);\n\nexport type InteractiveBrowserNetworkPolicy = typeof InteractiveBrowserNetworkPolicy.Type;\n\n/** Finite per-pass budgets. The elapsed ceiling is one hour; provider idle limits may be shorter. */\nexport class InteractiveBrowserPolicy extends Schema.Class<InteractiveBrowserPolicy>(\n \"InteractiveBrowserPolicy\",\n)(\n Schema.Struct({\n network: InteractiveBrowserNetworkPolicy,\n maxActions: PositiveInt.check(Schema.isLessThanOrEqualTo(1_000)),\n maxElapsedMillis: PositiveInt.check(Schema.isLessThanOrEqualTo(60 * 60_000)),\n maxReturnedBytes: PositiveInt.check(Schema.isLessThanOrEqualTo(8 * 1024 * 1024)),\n }),\n) {}\n\nexport class BrowserNavigateRequest extends Schema.Class<BrowserNavigateRequest>(\n \"BrowserNavigateRequest\",\n)({ url: InteractiveBrowserTargetUrl }) {}\n\nexport class BrowserReadTextRequest extends Schema.Class<BrowserReadTextRequest>(\n \"BrowserReadTextRequest\",\n)({ selector: Schema.optionalKey(Selector) }) {}\n\nexport class BrowserFillRequest extends Schema.Class<BrowserFillRequest>(\"BrowserFillRequest\")({\n selector: Selector,\n value: FieldValue,\n}) {}\n\nexport class BrowserClickRequest extends Schema.Class<BrowserClickRequest>(\"BrowserClickRequest\")({\n selector: Selector,\n}) {}\n\n/** Capture the current page without navigating or opening another browser. */\nexport class BrowserScreenshotRequest extends Schema.Class<BrowserScreenshotRequest>(\n \"BrowserScreenshotRequest\",\n)({ fullPage: Schema.Boolean }) {}\n\n/** Scroll the current viewport by signed CSS pixel deltas. */\nexport class BrowserScrollRequest extends Schema.Class<BrowserScrollRequest>(\n \"BrowserScrollRequest\",\n)({\n deltaX: ScrollDelta,\n deltaY: ScrollDelta,\n}) {}\n\nexport class BrowserNavigationResult extends Schema.Class<BrowserNavigationResult>(\n \"BrowserNavigationResult\",\n)({ url: InteractiveBrowserTargetUrl }) {}\n\nexport class BrowserTextResult extends Schema.Class<BrowserTextResult>(\"BrowserTextResult\")({\n text: BoundedText,\n}) {}\n\n/** Post-action URL observation; no provider session state crosses this boundary. */\nexport class BrowserActionResult extends Schema.Class<BrowserActionResult>(\"BrowserActionResult\")({\n url: InteractiveBrowserTargetUrl,\n}) {}\n\nexport class InteractiveBrowserPolicyDeniedError extends Schema.TaggedError<InteractiveBrowserPolicyDeniedError>()(\n \"InteractiveBrowserPolicyDeniedError\",\n { implementation: SandboxImplementation, message: BoundedMessage },\n) {}\n\nexport class InteractiveBrowserBusyError extends Schema.TaggedError<InteractiveBrowserBusyError>()(\n \"InteractiveBrowserBusyError\",\n { implementation: SandboxImplementation, message: BoundedMessage },\n) {}\n\nexport class InteractiveBrowserCapacityError extends Schema.TaggedError<InteractiveBrowserCapacityError>()(\n \"InteractiveBrowserCapacityError\",\n { implementation: SandboxImplementation, message: BoundedMessage },\n) {}\n\nexport class InteractiveBrowserExpiredError extends Schema.TaggedError<InteractiveBrowserExpiredError>()(\n \"InteractiveBrowserExpiredError\",\n { implementation: SandboxImplementation, message: BoundedMessage },\n) {}\n\nexport class InteractiveBrowserActionError extends Schema.TaggedError<InteractiveBrowserActionError>()(\n \"InteractiveBrowserActionError\",\n {\n implementation: SandboxImplementation,\n operation: Schema.Literals([\n \"navigate\",\n \"read-text\",\n \"fill\",\n \"click\",\n \"screenshot\",\n \"scroll\",\n \"close\",\n ]),\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\nexport class InteractiveBrowserProtocolError extends Schema.TaggedError<InteractiveBrowserProtocolError>()(\n \"InteractiveBrowserProtocolError\",\n {\n implementation: SandboxImplementation,\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\nexport class InteractiveBrowserLimitError extends Schema.TaggedError<InteractiveBrowserLimitError>()(\n \"InteractiveBrowserLimitError\",\n {\n implementation: SandboxImplementation,\n limit: Schema.Literals([\"actions\", \"elapsed\", \"returned-bytes\"]),\n maximum: PositiveInt,\n observed: Schema.Natural,\n message: BoundedMessage,\n },\n) {}\n\nexport class InteractiveBrowserUnsupportedError extends Schema.TaggedError<InteractiveBrowserUnsupportedError>()(\n \"InteractiveBrowserUnsupportedError\",\n {\n implementation: SandboxImplementation,\n feature: Schema.Literals([\n \"navigation\",\n \"read-text\",\n \"fill\",\n \"click\",\n \"screenshot\",\n \"scroll\",\n \"policy\",\n ]),\n message: BoundedMessage,\n },\n) {}\n\nexport const InteractiveBrowserError = Schema.Union([\n InteractiveBrowserPolicyDeniedError,\n InteractiveBrowserBusyError,\n InteractiveBrowserCapacityError,\n InteractiveBrowserExpiredError,\n InteractiveBrowserActionError,\n InteractiveBrowserProtocolError,\n InteractiveBrowserLimitError,\n InteractiveBrowserUnsupportedError,\n]);\n\nexport type InteractiveBrowserError = typeof InteractiveBrowserError.Type;\n\n/** A live handle is intentionally not a Schema value and cannot cross persistence/transport boundaries. */\nexport interface BrowserHandle {\n readonly navigate: (\n request: BrowserNavigateRequest,\n ) => Effect.Effect<BrowserNavigationResult, InteractiveBrowserError>;\n readonly readText: (\n request: BrowserReadTextRequest,\n ) => Effect.Effect<BrowserTextResult, InteractiveBrowserError>;\n readonly fill: (\n request: BrowserFillRequest,\n ) => Effect.Effect<BrowserActionResult, InteractiveBrowserError>;\n readonly click: (\n request: BrowserClickRequest,\n ) => Effect.Effect<BrowserActionResult, InteractiveBrowserError>;\n /** PNG bytes are caller-owned and bounded by the pass's per-result byte limit. */\n readonly screenshot: (\n request: BrowserScreenshotRequest,\n ) => Effect.Effect<PageScreenshotResult, InteractiveBrowserError>;\n readonly scroll: (\n request: BrowserScrollRequest,\n ) => Effect.Effect<BrowserActionResult, InteractiveBrowserError>;\n /** Invalidate the handle and close its resources early, including after an interrupted action. */\n readonly close: Effect.Effect<void, InteractiveBrowserError>;\n}\n\nexport class InteractiveBrowser extends Context.Service<\n InteractiveBrowser,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<BrowserHandle, InteractiveBrowserError, Scope.Scope>;\n }\n>()(\"@effect-agent/sandbox/InteractiveBrowser\") {}\n"],"mappings":"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"}
@@ -105,7 +105,7 @@ const ResponseFormatPrimitive = Schema.Literals([
105
105
  "integer"
106
106
  ]);
107
107
  const ResponseFormatPrimitiveList = Schema.Array(ResponseFormatPrimitive).check(Schema.isMinLength(1), Schema.isMaxLength(7), Schema.isUnique());
108
- const ResponseFormatNode = Schema.suspend(() => Schema.Struct(responseFormatFields()).pipe(Schema.annotate({ parseOptions: { onExcessProperty: "error" } })));
108
+ const ResponseFormatNode = Schema.suspend(() => Schema.Struct(responseFormatFields()));
109
109
  const responseFormatFields = () => {
110
110
  const boundedNodes = Schema.Array(ResponseFormatNode).check(Schema.isMinLength(1), Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH));
111
111
  const boundedDefinitions = Schema.Record(BoundedSchemaProperty, ResponseFormatNode).check(Schema.isMaxProperties(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH));
@@ -172,8 +172,8 @@ const responseFormatFields = () => {
172
172
  const ResponseFormatDocument = Schema.Struct({
173
173
  ...responseFormatFields(),
174
174
  type: Schema.Literal("object")
175
- }).pipe(Schema.annotate({ parseOptions: { onExcessProperty: "error" } }));
176
- const isResponseFormatDocument = Schema.is(ResponseFormatDocument);
175
+ });
176
+ const decodeResponseFormatDocument = Schema.decodeUnknownOption(ResponseFormatDocument, { onExcessProperty: "error" });
177
177
  /** Preflight graph bounds before recursively decoding an untrusted JSON Schema. */
178
178
  const isBoundedResponseFormat = (input) => {
179
179
  if (!Predicate.isObject(input)) return false;
@@ -212,7 +212,7 @@ const isBoundedResponseFormat = (input) => {
212
212
  });
213
213
  }
214
214
  }
215
- if (!isResponseFormatDocument(input)) return false;
215
+ if (Option.isNone(decodeResponseFormatDocument(input))) return false;
216
216
  const encoded = JSON.stringify(input);
217
217
  return Encoding.encodeHex(encoded).length / 2 <= MAX_RESPONSE_FORMAT_BYTES;
218
218
  } catch {
@@ -1 +1 @@
1
- {"version":3,"file":"PageCapture.mjs","names":[],"sources":["../../src/sandbox/PageCapture.ts"],"sourcesContent":["import { Context, Encoding, Option, Predicate, Schema, type Effect } from \"effect\";\n\nimport { SANDBOX_DIAGNOSTIC_MAX_LENGTH, SandboxImplementation } from \"./Sandbox.ts\";\n\n/**\n * Page capture (capability spec §9.2): one stateless, schema-first rendering\n * pass over a remote or supplied page — navigate (or load raw HTML), render\n * with JavaScript, and return exactly one bounded output. It is a sibling of\n * the command-shaped `Sandbox` and callback-shaped `CodeExecutor` ports: a\n * browser is intrinsically an egress device, so it carries its own explicit\n * capture contract instead of widening the sandbox network policy that every\n * existing adapter rejects.\n *\n * Everything a capture returns is untrusted, attacker-influenced content\n * (security spec §9). Stateful browser sessions, screenshots, PDFs, snapshot\n * bundles, crawling, and accessibility trees are deliberately outside this\n * port's first slice.\n */\n\nconst MAX_OUTPUT_BYTES = 8 * 1024 * 1024;\nconst MAX_LINKS = 4_096;\nconst MAX_SCRAPE_SELECTORS = 64;\nconst MAX_SCRAPE_ELEMENTS = 4_096;\nconst MAX_SCRAPE_ATTRIBUTES = 64;\nconst MAX_RESPONSE_FORMAT_BYTES = 64 * 1024;\nconst MAX_RESPONSE_FORMAT_DEPTH = 32;\nconst MAX_RESPONSE_FORMAT_NODES = 4_096;\nconst MAX_RESPONSE_FORMAT_COLLECTION_LENGTH = 256;\n// Schema `isMaxLength` counts UTF-16 elements: these are transport sanity\n// bounds. The authoritative byte budget is `PageCaptureLimits.maxOutputBytes`,\n// which adapters enforce on the UTF-8 encoded response.\nconst BoundedOutputText = Schema.String.check(Schema.isMaxLength(MAX_OUTPUT_BYTES));\nconst BoundedUrl = Schema.NonEmptyString.check(Schema.isMaxLength(8 * 1024));\nconst BoundedHtml = Schema.NonEmptyString.check(Schema.isMaxLength(2 * 1024 * 1024));\nconst BoundedPrompt = Schema.NonEmptyString.check(Schema.isMaxLength(8 * 1024));\nconst BoundedSelector = Schema.NonEmptyString.check(Schema.isMaxLength(1_024));\nconst BoundedAttributeName = Schema.NonEmptyString.check(Schema.isMaxLength(1_024));\nconst BoundedAttributeValue = Schema.String.check(Schema.isMaxLength(64 * 1_024));\nconst BoundedScrapeText = Schema.String.check(Schema.isMaxLength(1024 * 1_024));\nconst BoundedScrapeHtml = Schema.String.check(Schema.isMaxLength(2 * 1024 * 1_024));\nconst BoundedPattern = Schema.NonEmptyString.check(Schema.isMaxLength(1_024));\nconst BoundedMessage = Schema.String.check(Schema.isMaxLength(SANDBOX_DIAGNOSTIC_MAX_LENGTH));\nconst BoundedInferenceProvider = Schema.NonEmptyString.check(Schema.isMaxLength(256));\nconst BoundedSchemaProperty = Schema.NonEmptyString.check(Schema.isMaxLength(256));\nconst BoundedSchemaText = Schema.String.check(Schema.isMaxLength(8 * 1024));\nconst BoundedSchemaReference = Schema.NonEmptyString.check(Schema.isMaxLength(8 * 1024));\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\n/** Bounded by the platform's 60-second browser inactivity ceiling. */\nconst BoundedTimeoutMillis = PositiveInt.check(Schema.isLessThanOrEqualTo(60_000));\n\nconst decodeUrl = Schema.decodeUnknownOption(Schema.URLFromString);\n\nconst isCredentialFreeWebUrl = (value: string, allowHttp: boolean): boolean => {\n const parsed = decodeUrl(value);\n\n if (Option.isNone(parsed)) return false;\n const url = parsed.value;\n\n return (\n (url.protocol === \"https:\" || (allowHttp && url.protocol === \"http:\")) &&\n url.hostname.length > 0 &&\n url.username === \"\" &&\n url.password === \"\"\n );\n};\n\n/** Absolute, bounded HTTPS navigation URL that never carries embedded credentials. */\nexport const PageCaptureTargetUrl = BoundedUrl.check(\n Schema.makeFilter((value) => isCredentialFreeWebUrl(value, false), {\n title: \"an absolute HTTPS URL without embedded credentials\",\n }),\n);\n\nexport type PageCaptureTargetUrl = typeof PageCaptureTargetUrl.Type;\n\n/** Discovered HTTP(S) links are data, never navigation authority, and carry no credentials. */\nexport const PageCaptureLinkUrl = BoundedUrl.check(\n Schema.makeFilter((value) => isCredentialFreeWebUrl(value, true), {\n title: \"an absolute HTTP or HTTPS URL without embedded credentials\",\n }),\n);\n\nexport type PageCaptureLinkUrl = typeof PageCaptureLinkUrl.Type;\n\nconst ResponseFormatPrimitive = Schema.Literals([\n \"string\",\n \"number\",\n \"boolean\",\n \"array\",\n \"object\",\n \"null\",\n \"integer\",\n]);\n\nconst ResponseFormatPrimitiveList = Schema.Array(ResponseFormatPrimitive).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(7),\n Schema.isUnique(),\n);\n\ntype ResponseFormatNode = Schema.JsonObject & {\n readonly $schema?: string | undefined;\n readonly $id?: string | undefined;\n readonly $ref?: string | undefined;\n readonly $anchor?: string | undefined;\n readonly $dynamicRef?: string | undefined;\n readonly $dynamicAnchor?: string | undefined;\n readonly $comment?: string | undefined;\n readonly title?: string | undefined;\n readonly description?: string | undefined;\n readonly default?: Schema.Json | undefined;\n readonly deprecated?: boolean | undefined;\n readonly readOnly?: boolean | undefined;\n readonly writeOnly?: boolean | undefined;\n readonly examples?: ReadonlyArray<Schema.Json> | undefined;\n readonly type?:\n | typeof ResponseFormatPrimitive.Type\n | typeof ResponseFormatPrimitiveList.Type\n | undefined;\n readonly enum?: ReadonlyArray<Schema.Json> | undefined;\n readonly const?: Schema.Json | undefined;\n readonly multipleOf?: number | undefined;\n readonly maximum?: number | undefined;\n readonly exclusiveMaximum?: number | undefined;\n readonly minimum?: number | undefined;\n readonly exclusiveMinimum?: number | undefined;\n readonly maxLength?: number | undefined;\n readonly minLength?: number | undefined;\n readonly pattern?: string | undefined;\n readonly format?: string | undefined;\n readonly maxItems?: number | undefined;\n readonly minItems?: number | undefined;\n readonly uniqueItems?: boolean | undefined;\n readonly prefixItems?: ReadonlyArray<ResponseFormatNode> | undefined;\n readonly properties?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n readonly patternProperties?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n readonly required?: ReadonlyArray<string> | undefined;\n readonly dependentRequired?: Readonly<Record<string, ReadonlyArray<string>>> | undefined;\n readonly dependentSchemas?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n readonly items?: ResponseFormatNode | boolean | undefined;\n readonly additionalItems?: ResponseFormatNode | boolean | undefined;\n readonly unevaluatedItems?: ResponseFormatNode | boolean | undefined;\n readonly contains?: ResponseFormatNode | boolean | undefined;\n readonly minContains?: number | undefined;\n readonly maxContains?: number | undefined;\n readonly additionalProperties?: ResponseFormatNode | boolean | undefined;\n readonly unevaluatedProperties?: ResponseFormatNode | boolean | undefined;\n readonly propertyNames?: ResponseFormatNode | boolean | undefined;\n readonly minProperties?: number | undefined;\n readonly maxProperties?: number | undefined;\n readonly anyOf?: ReadonlyArray<ResponseFormatNode> | undefined;\n readonly oneOf?: ReadonlyArray<ResponseFormatNode> | undefined;\n readonly allOf?: ReadonlyArray<ResponseFormatNode> | undefined;\n readonly not?: ResponseFormatNode | boolean | undefined;\n readonly contentEncoding?: string | undefined;\n readonly contentMediaType?: string | undefined;\n readonly contentSchema?: ResponseFormatNode | boolean | undefined;\n readonly $defs?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n readonly definitions?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n};\n\nconst ResponseFormatNode: Schema.Codec<ResponseFormatNode> = Schema.suspend(\n (): Schema.Codec<ResponseFormatNode> =>\n Schema.Struct(responseFormatFields()).pipe(\n Schema.annotate({ parseOptions: { onExcessProperty: \"error\" } }),\n ),\n);\n\nconst responseFormatFields = () => {\n const boundedNodes = Schema.Array(ResponseFormatNode).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n );\n\n const boundedDefinitions = Schema.Record(BoundedSchemaProperty, ResponseFormatNode).check(\n Schema.isMaxProperties(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n );\n\n const boundedRequired = Schema.Array(BoundedSchemaProperty).check(\n Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n Schema.isUnique(),\n );\n\n const subschema = Schema.Union([Schema.Boolean, ResponseFormatNode]);\n\n return {\n $schema: Schema.optionalKey(BoundedSchemaReference),\n $id: Schema.optionalKey(BoundedSchemaReference),\n $ref: Schema.optionalKey(BoundedSchemaReference),\n $anchor: Schema.optionalKey(BoundedSchemaReference),\n $dynamicRef: Schema.optionalKey(BoundedSchemaReference),\n $dynamicAnchor: Schema.optionalKey(BoundedSchemaReference),\n $comment: Schema.optionalKey(BoundedSchemaText),\n title: Schema.optionalKey(BoundedSchemaText),\n description: Schema.optionalKey(BoundedSchemaText),\n default: Schema.optionalKey(Schema.Json),\n deprecated: Schema.optionalKey(Schema.Boolean),\n readOnly: Schema.optionalKey(Schema.Boolean),\n writeOnly: Schema.optionalKey(Schema.Boolean),\n examples: Schema.optionalKey(\n Schema.Array(Schema.Json).check(Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH)),\n ),\n type: Schema.optionalKey(Schema.Union([ResponseFormatPrimitive, ResponseFormatPrimitiveList])),\n enum: Schema.optionalKey(\n Schema.Array(Schema.Json).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n Schema.isUnique(),\n ),\n ),\n const: Schema.optionalKey(Schema.Json),\n multipleOf: Schema.optionalKey(Schema.Finite.check(Schema.isGreaterThan(0))),\n maximum: Schema.optionalKey(Schema.Finite),\n exclusiveMaximum: Schema.optionalKey(Schema.Finite),\n minimum: Schema.optionalKey(Schema.Finite),\n exclusiveMinimum: Schema.optionalKey(Schema.Finite),\n maxLength: Schema.optionalKey(Schema.Natural),\n minLength: Schema.optionalKey(Schema.Natural),\n pattern: Schema.optionalKey(BoundedSchemaText),\n format: Schema.optionalKey(BoundedSchemaText),\n maxItems: Schema.optionalKey(Schema.Natural),\n minItems: Schema.optionalKey(Schema.Natural),\n uniqueItems: Schema.optionalKey(Schema.Boolean),\n prefixItems: Schema.optionalKey(boundedNodes),\n items: Schema.optionalKey(subschema),\n additionalItems: Schema.optionalKey(subschema),\n unevaluatedItems: Schema.optionalKey(subschema),\n contains: Schema.optionalKey(subschema),\n minContains: Schema.optionalKey(Schema.Natural),\n maxContains: Schema.optionalKey(Schema.Natural),\n properties: Schema.optionalKey(boundedDefinitions),\n patternProperties: Schema.optionalKey(boundedDefinitions),\n required: Schema.optionalKey(boundedRequired),\n dependentRequired: Schema.optionalKey(\n Schema.Record(BoundedSchemaProperty, boundedRequired).check(\n Schema.isMaxProperties(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n ),\n ),\n dependentSchemas: Schema.optionalKey(boundedDefinitions),\n additionalProperties: Schema.optionalKey(subschema),\n unevaluatedProperties: Schema.optionalKey(subschema),\n propertyNames: Schema.optionalKey(subschema),\n minProperties: Schema.optionalKey(Schema.Natural),\n maxProperties: Schema.optionalKey(Schema.Natural),\n anyOf: Schema.optionalKey(boundedNodes),\n oneOf: Schema.optionalKey(boundedNodes),\n allOf: Schema.optionalKey(boundedNodes),\n not: Schema.optionalKey(subschema),\n contentEncoding: Schema.optionalKey(BoundedSchemaText),\n contentMediaType: Schema.optionalKey(BoundedSchemaText),\n contentSchema: Schema.optionalKey(subschema),\n $defs: Schema.optionalKey(boundedDefinitions),\n definitions: Schema.optionalKey(boundedDefinitions),\n };\n};\n\nconst ResponseFormatDocument = Schema.Struct({\n ...responseFormatFields(),\n type: Schema.Literal(\"object\"),\n}).pipe(Schema.annotate({ parseOptions: { onExcessProperty: \"error\" } }));\n\nconst isResponseFormatDocument = Schema.is(ResponseFormatDocument);\n\n/** Preflight graph bounds before recursively decoding an untrusted JSON Schema. */\nconst isBoundedResponseFormat = (input: unknown): input is typeof ResponseFormatDocument.Type => {\n if (!Predicate.isObject(input)) return false;\n\n const pending: Array<{ readonly value: unknown; readonly depth: number }> = [\n { value: input, depth: 0 },\n ];\n\n const visited = new WeakSet<object>();\n let nodes = 0;\n let textUnits = 0;\n\n try {\n while (pending.length > 0) {\n const current = pending.pop();\n\n if (\n current === undefined ||\n current.depth > MAX_RESPONSE_FORMAT_DEPTH ||\n ++nodes > MAX_RESPONSE_FORMAT_NODES\n ) {\n return false;\n }\n\n const value = current.value;\n\n if (value === null || typeof value === \"boolean\") continue;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return false;\n continue;\n }\n if (typeof value === \"string\") {\n textUnits += value.length;\n if (textUnits > MAX_RESPONSE_FORMAT_BYTES) return false;\n continue;\n }\n if (!Predicate.isObjectOrArray(value) || visited.has(value)) return false;\n visited.add(value);\n\n const entries = Array.isArray(value)\n ? value.map((entry, index) => [index, entry] as const)\n : Object.entries(value);\n\n if (entries.length > MAX_RESPONSE_FORMAT_COLLECTION_LENGTH) return false;\n\n for (const [key, entry] of entries) {\n textUnits += typeof key === \"string\" ? key.length : 0;\n if (textUnits > MAX_RESPONSE_FORMAT_BYTES) return false;\n pending.push({ value: entry, depth: current.depth + 1 });\n }\n }\n\n if (!isResponseFormatDocument(input)) return false;\n const encoded = JSON.stringify(input);\n\n return Encoding.encodeHex(encoded).length / 2 <= MAX_RESPONSE_FORMAT_BYTES;\n } catch {\n return false;\n }\n};\n\n/** A platform-supported object JSON Schema with bounded depth, entries, nodes, and UTF-8 bytes. */\nexport const PageCaptureResponseFormat = Schema.declare(isBoundedResponseFormat, {\n identifier: \"@effect-agent/sandbox/PageCaptureResponseFormat\",\n description: \"An object JSON Schema bounded to 64 KiB, depth 32, and 4096 nodes\",\n});\n\nexport type PageCaptureResponseFormat = typeof PageCaptureResponseFormat.Type;\n\n/** Capture a URL after a full render, the common case. */\nexport class PageUrlTarget extends Schema.TaggedClass<PageUrlTarget>()(\"PageUrlTarget\", {\n url: PageCaptureTargetUrl,\n}) {}\n\n/** Render caller-supplied HTML instead of navigating. */\nexport class PageHtmlTarget extends Schema.TaggedClass<PageHtmlTarget>()(\"PageHtmlTarget\", {\n html: BoundedHtml,\n}) {}\n\n/** What the pass renders: a navigated URL or raw HTML. */\nexport const PageCaptureTarget = Schema.Union([PageUrlTarget, PageHtmlTarget]);\nexport type PageCaptureTarget = typeof PageCaptureTarget.Type;\n\n/**\n * The rendering engine. `chromium` is the full headless browser; `kitesurf`\n * is a lightweight stateless engine an adapter may support for lower-cost\n * captures. An adapter that cannot honor the requested engine\n * rejects it typed rather than silently substituting the other.\n */\nexport const PageCaptureEngine = Schema.Literals([\"chromium\", \"kitesurf\"]);\nexport type PageCaptureEngine = typeof PageCaptureEngine.Type;\n\n/** Return the fully rendered HTML document. */\nexport class CapturePageContent extends Schema.TaggedClass<CapturePageContent>()(\n \"CapturePageContent\",\n {},\n) {}\n\n/** Return the rendered page converted to Markdown. */\nexport class CapturePageMarkdown extends Schema.TaggedClass<CapturePageMarkdown>()(\n \"CapturePageMarkdown\",\n {},\n) {}\n\n/** Return the hyperlinks discovered on the rendered page. */\nexport class CapturePageLinks extends Schema.TaggedClass<CapturePageLinks>()(\"CapturePageLinks\", {\n visibleLinksOnly: Schema.optionalKey(Schema.Boolean),\n}) {}\n\n/** Return rendered element records grouped by their requested CSS selector. */\nexport class CapturePageScrape extends Schema.TaggedClass<CapturePageScrape>()(\n \"CapturePageScrape\",\n {\n selectors: Schema.Array(BoundedSelector).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_SCRAPE_SELECTORS),\n ),\n },\n) {}\n\n/**\n * Extract structured data from the rendered page. `responseFormat` is a\n * bounded, object-shaped JSON Schema document, typically derived from an\n * Effect Schema. The untrusted result must still be decoded by the caller\n * through the original Effect Schema.\n */\nexport class CapturePageStructured extends Schema.TaggedClass<CapturePageStructured>()(\n \"CapturePageStructured\",\n {\n responseFormat: PageCaptureResponseFormat,\n prompt: Schema.optionalKey(BoundedPrompt),\n },\n) {}\n\n/** Exactly one bounded output per pass. */\nexport const PageCaptureAction = Schema.Union([\n CapturePageContent,\n CapturePageMarkdown,\n CapturePageLinks,\n CapturePageScrape,\n CapturePageStructured,\n]);\n\nexport type PageCaptureAction = typeof PageCaptureAction.Type;\n\n/** Wait for one CSS selector to appear before capturing. */\nexport class PageSelectorWait extends Schema.Class<PageSelectorWait>(\"PageSelectorWait\")({\n selector: BoundedSelector,\n timeoutMillis: Schema.optionalKey(BoundedTimeoutMillis),\n}) {}\n\n/** Navigation and readiness options applied before the capture. */\nexport class PageNavigationOptions extends Schema.Class<PageNavigationOptions>(\n \"PageNavigationOptions\",\n)({\n waitUntil: Schema.optionalKey(\n Schema.Literals([\"load\", \"domcontentloaded\", \"networkidle0\", \"networkidle2\"]),\n ),\n timeoutMillis: Schema.optionalKey(BoundedTimeoutMillis),\n waitForSelector: Schema.optionalKey(PageSelectorWait),\n}) {}\n\n/** The rendered viewport. */\nexport class PageViewport extends Schema.Class<PageViewport>(\"PageViewport\")({\n width: PositiveInt.check(Schema.isLessThanOrEqualTo(7_680)),\n height: PositiveInt.check(Schema.isLessThanOrEqualTo(7_680)),\n}) {}\n\n/**\n * Request egress policy for the render. Rejected resource types are never\n * fetched; when request patterns are given, only matching navigation,\n * redirect, and subresource requests are allowed. Calling capabilities own\n * the capture-target allowlist and project it into this policy so rendered\n * JavaScript cannot escape the same construction-time authority.\n */\nexport class PageResourcePolicy extends Schema.Class<PageResourcePolicy>(\"PageResourcePolicy\")({\n rejectResourceTypes: Schema.optionalKey(\n Schema.Array(\n Schema.Literals([\n \"document\",\n \"stylesheet\",\n \"image\",\n \"media\",\n \"font\",\n \"script\",\n \"texttrack\",\n \"xhr\",\n \"fetch\",\n \"eventsource\",\n \"websocket\",\n \"manifest\",\n \"other\",\n ]),\n ).check(Schema.isMaxLength(16)),\n ),\n allowRequestPatterns: Schema.optionalKey(\n Schema.Array(BoundedPattern).check(Schema.isMaxLength(64)),\n ),\n}) {}\n\n/** Limits an adapter must either enforce or reject. Bytes are UTF-8 encoded. */\nexport class PageCaptureLimits extends Schema.Class<PageCaptureLimits>(\"PageCaptureLimits\")({\n maxOutputBytes: PositiveInt.check(Schema.isLessThanOrEqualTo(MAX_OUTPUT_BYTES)),\n}) {}\n\n/** Schema-first page capture request: one target, one action, one output. */\nexport class PageCaptureRequest extends Schema.Class<PageCaptureRequest>(\"PageCaptureRequest\")({\n target: PageCaptureTarget,\n action: PageCaptureAction,\n engine: PageCaptureEngine,\n limits: PageCaptureLimits,\n navigation: Schema.optionalKey(PageNavigationOptions),\n viewport: Schema.optionalKey(PageViewport),\n resourcePolicy: Schema.optionalKey(PageResourcePolicy),\n}) {}\n\n/** The rendered HTML document. */\nexport class PageContentCaptured extends Schema.TaggedClass<PageContentCaptured>()(\n \"PageContentCaptured\",\n {\n html: BoundedOutputText,\n },\n) {}\n\n/** The rendered page as Markdown. */\nexport class PageMarkdownCaptured extends Schema.TaggedClass<PageMarkdownCaptured>()(\n \"PageMarkdownCaptured\",\n {\n markdown: BoundedOutputText,\n },\n) {}\n\n/** The hyperlinks discovered on the rendered page. */\nexport class PageLinksCaptured extends Schema.TaggedClass<PageLinksCaptured>()(\n \"PageLinksCaptured\",\n {\n links: Schema.Array(PageCaptureLinkUrl).check(Schema.isMaxLength(MAX_LINKS)),\n },\n) {}\n\n/** The extracted structured value; untrusted until decoded by the caller. */\nexport class PageStructuredCaptured extends Schema.TaggedClass<PageStructuredCaptured>()(\n \"PageStructuredCaptured\",\n {\n value: Schema.Json,\n },\n) {}\n\n/** One bounded HTML attribute returned by a selector scrape. */\nexport class PageScrapeAttribute extends Schema.Class<PageScrapeAttribute>(\"PageScrapeAttribute\")({\n name: BoundedAttributeName,\n value: BoundedAttributeValue,\n}) {}\n\n/** One rendered element returned by a selector scrape. */\nexport class PageScrapeElement extends Schema.Class<PageScrapeElement>(\"PageScrapeElement\")({\n text: BoundedScrapeText,\n html: BoundedScrapeHtml,\n attributes: Schema.Array(PageScrapeAttribute).check(Schema.isMaxLength(MAX_SCRAPE_ATTRIBUTES)),\n left: Schema.Finite,\n top: Schema.Finite,\n width: Schema.Finite,\n height: Schema.Finite,\n}) {}\n\n/** All rendered elements matched by one requested selector. */\nexport class PageScrapeGroup extends Schema.Class<PageScrapeGroup>(\"PageScrapeGroup\")({\n selector: BoundedSelector,\n results: Schema.Array(PageScrapeElement).check(Schema.isMaxLength(MAX_SCRAPE_ELEMENTS)),\n}) {}\n\nconst PageScrapeGroups = Schema.Array(PageScrapeGroup).check(\n Schema.isMaxLength(MAX_SCRAPE_SELECTORS),\n Schema.makeFilter(\n (groups) =>\n groups.reduce((total, group) => total + group.results.length, 0) <= MAX_SCRAPE_ELEMENTS,\n { title: \"at most 4096 aggregate scraped elements\" },\n ),\n);\n\n/** Bounded rendered element records, preserving selector grouping. */\nexport class PageScrapeCaptured extends Schema.TaggedClass<PageScrapeCaptured>()(\n \"PageScrapeCaptured\",\n {\n groups: PageScrapeGroups,\n },\n) {}\n\n/** Exactly one output kind per pass, matching the requested action. */\nexport const PageCaptureOutput = Schema.Union([\n PageContentCaptured,\n PageMarkdownCaptured,\n PageLinksCaptured,\n PageScrapeCaptured,\n PageStructuredCaptured,\n]);\n\nexport type PageCaptureOutput = typeof PageCaptureOutput.Type;\n\n/** Explicit accounting for model inference performed by a capture adapter. */\nexport class PageCaptureInferenceUse extends Schema.Class<PageCaptureInferenceUse>(\n \"PageCaptureInferenceUse\",\n)({\n provider: BoundedInferenceProvider,\n modelCalls: PositiveInt,\n}) {}\n\n/** Accounting an adapter observed for one capture. */\nexport class PageCaptureResourceUse extends Schema.Class<PageCaptureResourceUse>(\n \"PageCaptureResourceUse\",\n)({\n browserMillis: Schema.optionalKey(Schema.Natural),\n inference: Schema.optionalKey(PageCaptureInferenceUse),\n}) {}\n\n/** The bounded outcome of one capture pass. */\nexport class PageCaptureResult extends Schema.Class<PageCaptureResult>(\"PageCaptureResult\")({\n implementation: SandboxImplementation,\n output: PageCaptureOutput,\n resourceUse: PageCaptureResourceUse,\n}) {}\n\n/**\n * The platform refused the pass for rate or quota reasons. `retryAfterMillis`\n * carries the platform's own backoff hint when one exists; retrying earlier\n * only re-fails.\n */\nexport class PageCaptureRateLimitedError extends Schema.TaggedError<PageCaptureRateLimitedError>()(\n \"PageCaptureRateLimitedError\",\n {\n implementation: SandboxImplementation,\n reason: Schema.Literals([\"rate\", \"quota\"]),\n retryAfterMillis: Schema.optionalKey(Schema.Natural),\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Navigation, readiness, or capture of the target page failed. */\nexport class PageCaptureNavigationError extends Schema.TaggedError<PageCaptureNavigationError>()(\n \"PageCaptureNavigationError\",\n {\n implementation: SandboxImplementation,\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Host authorization or accounting blocked provider inference before capture. */\nexport class PageCaptureInferencePolicyError extends Schema.TaggedError<PageCaptureInferencePolicyError>()(\n \"PageCaptureInferencePolicyError\",\n {\n implementation: SandboxImplementation,\n provider: BoundedInferenceProvider,\n reason: Schema.Literals([\"authorization\", \"accounting\"]),\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** The adapter cannot honestly honor one requested feature (CAP-010 idiom). */\nexport class PageCaptureUnsupportedError extends Schema.TaggedError<PageCaptureUnsupportedError>()(\n \"PageCaptureUnsupportedError\",\n {\n implementation: SandboxImplementation,\n feature: Schema.Literals([\n \"engine\",\n \"action\",\n \"target\",\n \"navigation\",\n \"viewport\",\n \"resource-policy\",\n ]),\n message: BoundedMessage,\n },\n) {}\n\n/** The response exceeded the request's output byte budget. */\nexport class PageCaptureOutputLimitError extends Schema.TaggedError<PageCaptureOutputLimitError>()(\n \"PageCaptureOutputLimitError\",\n {\n implementation: SandboxImplementation,\n limit: PositiveInt,\n observed: Schema.Natural,\n },\n) {}\n\n/** The platform or transport produced a value outside the capture protocol. */\nexport class PageCaptureProtocolError extends Schema.TaggedError<PageCaptureProtocolError>()(\n \"PageCaptureProtocolError\",\n {\n implementation: SandboxImplementation,\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Expected capture failures. Interruption stays an Effect interruption. */\nexport const PageCaptureError = Schema.Union([\n PageCaptureRateLimitedError,\n PageCaptureNavigationError,\n PageCaptureInferencePolicyError,\n PageCaptureUnsupportedError,\n PageCaptureOutputLimitError,\n PageCaptureProtocolError,\n]);\n\nexport type PageCaptureError = typeof PageCaptureError.Type;\n\n/**\n * Stateless page-capture port. One `capture` is one pass: the adapter owns no\n * session, replay, approval, or Thread semantics, identifies its\n * isolation posture honestly (CAP-010), enforces or rejects every requested\n * limit and policy, and returns exactly one bounded output. Capture results\n * are untrusted input to whatever reads them.\n */\nexport class PageCapture extends Context.Service<\n PageCapture,\n {\n readonly capture: (\n request: PageCaptureRequest,\n ) => Effect.Effect<PageCaptureResult, PageCaptureError>;\n }\n>()(\"@effect-agent/sandbox/PageCapture\") {}\n\n/** Type helper for implementations that preserve the public PageCapture contract. */\nexport type PageCaptureCapture = (\n request: PageCaptureRequest,\n) => Effect.Effect<PageCaptureResult, PageCaptureError>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"PageCapture.mjs","names":[],"sources":["../../src/sandbox/PageCapture.ts"],"sourcesContent":["import { Context, Encoding, Option, Predicate, Schema, type Effect } from \"effect\";\n\nimport { SANDBOX_DIAGNOSTIC_MAX_LENGTH, SandboxImplementation } from \"./Sandbox.ts\";\n\n/**\n * Page capture (capability spec §9.2): one stateless, schema-first rendering\n * pass over a remote or supplied page — navigate (or load raw HTML), render\n * with JavaScript, and return exactly one bounded output. It is a sibling of\n * the command-shaped `Sandbox` and callback-shaped `CodeExecutor` ports: a\n * browser is intrinsically an egress device, so it carries its own explicit\n * capture contract instead of widening the sandbox network policy that every\n * existing adapter rejects.\n *\n * Everything a capture returns is untrusted, attacker-influenced content\n * (security spec §9). Stateful browser sessions, screenshots, PDFs, snapshot\n * bundles, crawling, and accessibility trees are deliberately outside this\n * port's first slice.\n */\n\nconst MAX_OUTPUT_BYTES = 8 * 1024 * 1024;\nconst MAX_LINKS = 4_096;\nconst MAX_SCRAPE_SELECTORS = 64;\nconst MAX_SCRAPE_ELEMENTS = 4_096;\nconst MAX_SCRAPE_ATTRIBUTES = 64;\nconst MAX_RESPONSE_FORMAT_BYTES = 64 * 1024;\nconst MAX_RESPONSE_FORMAT_DEPTH = 32;\nconst MAX_RESPONSE_FORMAT_NODES = 4_096;\nconst MAX_RESPONSE_FORMAT_COLLECTION_LENGTH = 256;\n// Schema `isMaxLength` counts UTF-16 elements: these are transport sanity\n// bounds. The authoritative byte budget is `PageCaptureLimits.maxOutputBytes`,\n// which adapters enforce on the UTF-8 encoded response.\nconst BoundedOutputText = Schema.String.check(Schema.isMaxLength(MAX_OUTPUT_BYTES));\nconst BoundedUrl = Schema.NonEmptyString.check(Schema.isMaxLength(8 * 1024));\nconst BoundedHtml = Schema.NonEmptyString.check(Schema.isMaxLength(2 * 1024 * 1024));\nconst BoundedPrompt = Schema.NonEmptyString.check(Schema.isMaxLength(8 * 1024));\nconst BoundedSelector = Schema.NonEmptyString.check(Schema.isMaxLength(1_024));\nconst BoundedAttributeName = Schema.NonEmptyString.check(Schema.isMaxLength(1_024));\nconst BoundedAttributeValue = Schema.String.check(Schema.isMaxLength(64 * 1_024));\nconst BoundedScrapeText = Schema.String.check(Schema.isMaxLength(1024 * 1_024));\nconst BoundedScrapeHtml = Schema.String.check(Schema.isMaxLength(2 * 1024 * 1_024));\nconst BoundedPattern = Schema.NonEmptyString.check(Schema.isMaxLength(1_024));\nconst BoundedMessage = Schema.String.check(Schema.isMaxLength(SANDBOX_DIAGNOSTIC_MAX_LENGTH));\nconst BoundedInferenceProvider = Schema.NonEmptyString.check(Schema.isMaxLength(256));\nconst BoundedSchemaProperty = Schema.NonEmptyString.check(Schema.isMaxLength(256));\nconst BoundedSchemaText = Schema.String.check(Schema.isMaxLength(8 * 1024));\nconst BoundedSchemaReference = Schema.NonEmptyString.check(Schema.isMaxLength(8 * 1024));\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\n/** Bounded by the platform's 60-second browser inactivity ceiling. */\nconst BoundedTimeoutMillis = PositiveInt.check(Schema.isLessThanOrEqualTo(60_000));\n\nconst decodeUrl = Schema.decodeUnknownOption(Schema.URLFromString);\n\nconst isCredentialFreeWebUrl = (value: string, allowHttp: boolean): boolean => {\n const parsed = decodeUrl(value);\n\n if (Option.isNone(parsed)) return false;\n const url = parsed.value;\n\n return (\n (url.protocol === \"https:\" || (allowHttp && url.protocol === \"http:\")) &&\n url.hostname.length > 0 &&\n url.username === \"\" &&\n url.password === \"\"\n );\n};\n\n/** Absolute, bounded HTTPS navigation URL that never carries embedded credentials. */\nexport const PageCaptureTargetUrl = BoundedUrl.check(\n Schema.makeFilter((value) => isCredentialFreeWebUrl(value, false), {\n title: \"an absolute HTTPS URL without embedded credentials\",\n }),\n);\n\nexport type PageCaptureTargetUrl = typeof PageCaptureTargetUrl.Type;\n\n/** Discovered HTTP(S) links are data, never navigation authority, and carry no credentials. */\nexport const PageCaptureLinkUrl = BoundedUrl.check(\n Schema.makeFilter((value) => isCredentialFreeWebUrl(value, true), {\n title: \"an absolute HTTP or HTTPS URL without embedded credentials\",\n }),\n);\n\nexport type PageCaptureLinkUrl = typeof PageCaptureLinkUrl.Type;\n\nconst ResponseFormatPrimitive = Schema.Literals([\n \"string\",\n \"number\",\n \"boolean\",\n \"array\",\n \"object\",\n \"null\",\n \"integer\",\n]);\n\nconst ResponseFormatPrimitiveList = Schema.Array(ResponseFormatPrimitive).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(7),\n Schema.isUnique(),\n);\n\ntype ResponseFormatNode = Schema.JsonObject & {\n readonly $schema?: string | undefined;\n readonly $id?: string | undefined;\n readonly $ref?: string | undefined;\n readonly $anchor?: string | undefined;\n readonly $dynamicRef?: string | undefined;\n readonly $dynamicAnchor?: string | undefined;\n readonly $comment?: string | undefined;\n readonly title?: string | undefined;\n readonly description?: string | undefined;\n readonly default?: Schema.Json | undefined;\n readonly deprecated?: boolean | undefined;\n readonly readOnly?: boolean | undefined;\n readonly writeOnly?: boolean | undefined;\n readonly examples?: ReadonlyArray<Schema.Json> | undefined;\n readonly type?:\n | typeof ResponseFormatPrimitive.Type\n | typeof ResponseFormatPrimitiveList.Type\n | undefined;\n readonly enum?: ReadonlyArray<Schema.Json> | undefined;\n readonly const?: Schema.Json | undefined;\n readonly multipleOf?: number | undefined;\n readonly maximum?: number | undefined;\n readonly exclusiveMaximum?: number | undefined;\n readonly minimum?: number | undefined;\n readonly exclusiveMinimum?: number | undefined;\n readonly maxLength?: number | undefined;\n readonly minLength?: number | undefined;\n readonly pattern?: string | undefined;\n readonly format?: string | undefined;\n readonly maxItems?: number | undefined;\n readonly minItems?: number | undefined;\n readonly uniqueItems?: boolean | undefined;\n readonly prefixItems?: ReadonlyArray<ResponseFormatNode> | undefined;\n readonly properties?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n readonly patternProperties?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n readonly required?: ReadonlyArray<string> | undefined;\n readonly dependentRequired?: Readonly<Record<string, ReadonlyArray<string>>> | undefined;\n readonly dependentSchemas?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n readonly items?: ResponseFormatNode | boolean | undefined;\n readonly additionalItems?: ResponseFormatNode | boolean | undefined;\n readonly unevaluatedItems?: ResponseFormatNode | boolean | undefined;\n readonly contains?: ResponseFormatNode | boolean | undefined;\n readonly minContains?: number | undefined;\n readonly maxContains?: number | undefined;\n readonly additionalProperties?: ResponseFormatNode | boolean | undefined;\n readonly unevaluatedProperties?: ResponseFormatNode | boolean | undefined;\n readonly propertyNames?: ResponseFormatNode | boolean | undefined;\n readonly minProperties?: number | undefined;\n readonly maxProperties?: number | undefined;\n readonly anyOf?: ReadonlyArray<ResponseFormatNode> | undefined;\n readonly oneOf?: ReadonlyArray<ResponseFormatNode> | undefined;\n readonly allOf?: ReadonlyArray<ResponseFormatNode> | undefined;\n readonly not?: ResponseFormatNode | boolean | undefined;\n readonly contentEncoding?: string | undefined;\n readonly contentMediaType?: string | undefined;\n readonly contentSchema?: ResponseFormatNode | boolean | undefined;\n readonly $defs?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n readonly definitions?: Readonly<Record<string, ResponseFormatNode>> | undefined;\n};\n\nconst ResponseFormatNode: Schema.Codec<ResponseFormatNode> = Schema.suspend(\n (): Schema.Codec<ResponseFormatNode> => Schema.Struct(responseFormatFields()),\n);\n\nconst responseFormatFields = () => {\n const boundedNodes = Schema.Array(ResponseFormatNode).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n );\n\n const boundedDefinitions = Schema.Record(BoundedSchemaProperty, ResponseFormatNode).check(\n Schema.isMaxProperties(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n );\n\n const boundedRequired = Schema.Array(BoundedSchemaProperty).check(\n Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n Schema.isUnique(),\n );\n\n const subschema = Schema.Union([Schema.Boolean, ResponseFormatNode]);\n\n return {\n $schema: Schema.optionalKey(BoundedSchemaReference),\n $id: Schema.optionalKey(BoundedSchemaReference),\n $ref: Schema.optionalKey(BoundedSchemaReference),\n $anchor: Schema.optionalKey(BoundedSchemaReference),\n $dynamicRef: Schema.optionalKey(BoundedSchemaReference),\n $dynamicAnchor: Schema.optionalKey(BoundedSchemaReference),\n $comment: Schema.optionalKey(BoundedSchemaText),\n title: Schema.optionalKey(BoundedSchemaText),\n description: Schema.optionalKey(BoundedSchemaText),\n default: Schema.optionalKey(Schema.Json),\n deprecated: Schema.optionalKey(Schema.Boolean),\n readOnly: Schema.optionalKey(Schema.Boolean),\n writeOnly: Schema.optionalKey(Schema.Boolean),\n examples: Schema.optionalKey(\n Schema.Array(Schema.Json).check(Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH)),\n ),\n type: Schema.optionalKey(Schema.Union([ResponseFormatPrimitive, ResponseFormatPrimitiveList])),\n enum: Schema.optionalKey(\n Schema.Array(Schema.Json).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n Schema.isUnique(),\n ),\n ),\n const: Schema.optionalKey(Schema.Json),\n multipleOf: Schema.optionalKey(Schema.Finite.check(Schema.isGreaterThan(0))),\n maximum: Schema.optionalKey(Schema.Finite),\n exclusiveMaximum: Schema.optionalKey(Schema.Finite),\n minimum: Schema.optionalKey(Schema.Finite),\n exclusiveMinimum: Schema.optionalKey(Schema.Finite),\n maxLength: Schema.optionalKey(Schema.Natural),\n minLength: Schema.optionalKey(Schema.Natural),\n pattern: Schema.optionalKey(BoundedSchemaText),\n format: Schema.optionalKey(BoundedSchemaText),\n maxItems: Schema.optionalKey(Schema.Natural),\n minItems: Schema.optionalKey(Schema.Natural),\n uniqueItems: Schema.optionalKey(Schema.Boolean),\n prefixItems: Schema.optionalKey(boundedNodes),\n items: Schema.optionalKey(subschema),\n additionalItems: Schema.optionalKey(subschema),\n unevaluatedItems: Schema.optionalKey(subschema),\n contains: Schema.optionalKey(subschema),\n minContains: Schema.optionalKey(Schema.Natural),\n maxContains: Schema.optionalKey(Schema.Natural),\n properties: Schema.optionalKey(boundedDefinitions),\n patternProperties: Schema.optionalKey(boundedDefinitions),\n required: Schema.optionalKey(boundedRequired),\n dependentRequired: Schema.optionalKey(\n Schema.Record(BoundedSchemaProperty, boundedRequired).check(\n Schema.isMaxProperties(MAX_RESPONSE_FORMAT_COLLECTION_LENGTH),\n ),\n ),\n dependentSchemas: Schema.optionalKey(boundedDefinitions),\n additionalProperties: Schema.optionalKey(subschema),\n unevaluatedProperties: Schema.optionalKey(subschema),\n propertyNames: Schema.optionalKey(subschema),\n minProperties: Schema.optionalKey(Schema.Natural),\n maxProperties: Schema.optionalKey(Schema.Natural),\n anyOf: Schema.optionalKey(boundedNodes),\n oneOf: Schema.optionalKey(boundedNodes),\n allOf: Schema.optionalKey(boundedNodes),\n not: Schema.optionalKey(subschema),\n contentEncoding: Schema.optionalKey(BoundedSchemaText),\n contentMediaType: Schema.optionalKey(BoundedSchemaText),\n contentSchema: Schema.optionalKey(subschema),\n $defs: Schema.optionalKey(boundedDefinitions),\n definitions: Schema.optionalKey(boundedDefinitions),\n };\n};\n\nconst ResponseFormatDocument = Schema.Struct({\n ...responseFormatFields(),\n type: Schema.Literal(\"object\"),\n});\n\nconst decodeResponseFormatDocument = Schema.decodeUnknownOption(ResponseFormatDocument, {\n onExcessProperty: \"error\",\n});\n\n/** Preflight graph bounds before recursively decoding an untrusted JSON Schema. */\nconst isBoundedResponseFormat = (input: unknown): input is typeof ResponseFormatDocument.Type => {\n if (!Predicate.isObject(input)) return false;\n\n const pending: Array<{ readonly value: unknown; readonly depth: number }> = [\n { value: input, depth: 0 },\n ];\n\n const visited = new WeakSet<object>();\n let nodes = 0;\n let textUnits = 0;\n\n try {\n while (pending.length > 0) {\n const current = pending.pop();\n\n if (\n current === undefined ||\n current.depth > MAX_RESPONSE_FORMAT_DEPTH ||\n ++nodes > MAX_RESPONSE_FORMAT_NODES\n ) {\n return false;\n }\n\n const value = current.value;\n\n if (value === null || typeof value === \"boolean\") continue;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return false;\n continue;\n }\n if (typeof value === \"string\") {\n textUnits += value.length;\n if (textUnits > MAX_RESPONSE_FORMAT_BYTES) return false;\n continue;\n }\n if (!Predicate.isObjectOrArray(value) || visited.has(value)) return false;\n visited.add(value);\n\n const entries = Array.isArray(value)\n ? value.map((entry, index) => [index, entry] as const)\n : Object.entries(value);\n\n if (entries.length > MAX_RESPONSE_FORMAT_COLLECTION_LENGTH) return false;\n\n for (const [key, entry] of entries) {\n textUnits += typeof key === \"string\" ? key.length : 0;\n if (textUnits > MAX_RESPONSE_FORMAT_BYTES) return false;\n pending.push({ value: entry, depth: current.depth + 1 });\n }\n }\n\n if (Option.isNone(decodeResponseFormatDocument(input))) return false;\n const encoded = JSON.stringify(input);\n\n return Encoding.encodeHex(encoded).length / 2 <= MAX_RESPONSE_FORMAT_BYTES;\n } catch {\n return false;\n }\n};\n\n/** A platform-supported object JSON Schema with bounded depth, entries, nodes, and UTF-8 bytes. */\nexport const PageCaptureResponseFormat = Schema.declare(isBoundedResponseFormat, {\n identifier: \"@effect-agent/sandbox/PageCaptureResponseFormat\",\n description: \"An object JSON Schema bounded to 64 KiB, depth 32, and 4096 nodes\",\n});\n\nexport type PageCaptureResponseFormat = typeof PageCaptureResponseFormat.Type;\n\n/** Capture a URL after a full render, the common case. */\nexport class PageUrlTarget extends Schema.TaggedClass<PageUrlTarget>()(\"PageUrlTarget\", {\n url: PageCaptureTargetUrl,\n}) {}\n\n/** Render caller-supplied HTML instead of navigating. */\nexport class PageHtmlTarget extends Schema.TaggedClass<PageHtmlTarget>()(\"PageHtmlTarget\", {\n html: BoundedHtml,\n}) {}\n\n/** What the pass renders: a navigated URL or raw HTML. */\nexport const PageCaptureTarget = Schema.Union([PageUrlTarget, PageHtmlTarget]);\nexport type PageCaptureTarget = typeof PageCaptureTarget.Type;\n\n/**\n * The rendering engine. `chromium` is the full headless browser; `kitesurf`\n * is a lightweight stateless engine an adapter may support for lower-cost\n * captures. An adapter that cannot honor the requested engine\n * rejects it typed rather than silently substituting the other.\n */\nexport const PageCaptureEngine = Schema.Literals([\"chromium\", \"kitesurf\"]);\nexport type PageCaptureEngine = typeof PageCaptureEngine.Type;\n\n/** Return the fully rendered HTML document. */\nexport class CapturePageContent extends Schema.TaggedClass<CapturePageContent>()(\n \"CapturePageContent\",\n {},\n) {}\n\n/** Return the rendered page converted to Markdown. */\nexport class CapturePageMarkdown extends Schema.TaggedClass<CapturePageMarkdown>()(\n \"CapturePageMarkdown\",\n {},\n) {}\n\n/** Return the hyperlinks discovered on the rendered page. */\nexport class CapturePageLinks extends Schema.TaggedClass<CapturePageLinks>()(\"CapturePageLinks\", {\n visibleLinksOnly: Schema.optionalKey(Schema.Boolean),\n}) {}\n\n/** Return rendered element records grouped by their requested CSS selector. */\nexport class CapturePageScrape extends Schema.TaggedClass<CapturePageScrape>()(\n \"CapturePageScrape\",\n {\n selectors: Schema.Array(BoundedSelector).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_SCRAPE_SELECTORS),\n ),\n },\n) {}\n\n/**\n * Extract structured data from the rendered page. `responseFormat` is a\n * bounded, object-shaped JSON Schema document, typically derived from an\n * Effect Schema. The untrusted result must still be decoded by the caller\n * through the original Effect Schema.\n */\nexport class CapturePageStructured extends Schema.TaggedClass<CapturePageStructured>()(\n \"CapturePageStructured\",\n {\n responseFormat: PageCaptureResponseFormat,\n prompt: Schema.optionalKey(BoundedPrompt),\n },\n) {}\n\n/** Exactly one bounded output per pass. */\nexport const PageCaptureAction = Schema.Union([\n CapturePageContent,\n CapturePageMarkdown,\n CapturePageLinks,\n CapturePageScrape,\n CapturePageStructured,\n]);\n\nexport type PageCaptureAction = typeof PageCaptureAction.Type;\n\n/** Wait for one CSS selector to appear before capturing. */\nexport class PageSelectorWait extends Schema.Class<PageSelectorWait>(\"PageSelectorWait\")({\n selector: BoundedSelector,\n timeoutMillis: Schema.optionalKey(BoundedTimeoutMillis),\n}) {}\n\n/** Navigation and readiness options applied before the capture. */\nexport class PageNavigationOptions extends Schema.Class<PageNavigationOptions>(\n \"PageNavigationOptions\",\n)({\n waitUntil: Schema.optionalKey(\n Schema.Literals([\"load\", \"domcontentloaded\", \"networkidle0\", \"networkidle2\"]),\n ),\n timeoutMillis: Schema.optionalKey(BoundedTimeoutMillis),\n waitForSelector: Schema.optionalKey(PageSelectorWait),\n}) {}\n\n/** The rendered viewport. */\nexport class PageViewport extends Schema.Class<PageViewport>(\"PageViewport\")({\n width: PositiveInt.check(Schema.isLessThanOrEqualTo(7_680)),\n height: PositiveInt.check(Schema.isLessThanOrEqualTo(7_680)),\n}) {}\n\n/**\n * Request egress policy for the render. Rejected resource types are never\n * fetched; when request patterns are given, only matching navigation,\n * redirect, and subresource requests are allowed. Calling capabilities own\n * the capture-target allowlist and project it into this policy so rendered\n * JavaScript cannot escape the same construction-time authority.\n */\nexport class PageResourcePolicy extends Schema.Class<PageResourcePolicy>(\"PageResourcePolicy\")({\n rejectResourceTypes: Schema.optionalKey(\n Schema.Array(\n Schema.Literals([\n \"document\",\n \"stylesheet\",\n \"image\",\n \"media\",\n \"font\",\n \"script\",\n \"texttrack\",\n \"xhr\",\n \"fetch\",\n \"eventsource\",\n \"websocket\",\n \"manifest\",\n \"other\",\n ]),\n ).check(Schema.isMaxLength(16)),\n ),\n allowRequestPatterns: Schema.optionalKey(\n Schema.Array(BoundedPattern).check(Schema.isMaxLength(64)),\n ),\n}) {}\n\n/** Limits an adapter must either enforce or reject. Bytes are UTF-8 encoded. */\nexport class PageCaptureLimits extends Schema.Class<PageCaptureLimits>(\"PageCaptureLimits\")({\n maxOutputBytes: PositiveInt.check(Schema.isLessThanOrEqualTo(MAX_OUTPUT_BYTES)),\n}) {}\n\n/** Schema-first page capture request: one target, one action, one output. */\nexport class PageCaptureRequest extends Schema.Class<PageCaptureRequest>(\"PageCaptureRequest\")({\n target: PageCaptureTarget,\n action: PageCaptureAction,\n engine: PageCaptureEngine,\n limits: PageCaptureLimits,\n navigation: Schema.optionalKey(PageNavigationOptions),\n viewport: Schema.optionalKey(PageViewport),\n resourcePolicy: Schema.optionalKey(PageResourcePolicy),\n}) {}\n\n/** The rendered HTML document. */\nexport class PageContentCaptured extends Schema.TaggedClass<PageContentCaptured>()(\n \"PageContentCaptured\",\n {\n html: BoundedOutputText,\n },\n) {}\n\n/** The rendered page as Markdown. */\nexport class PageMarkdownCaptured extends Schema.TaggedClass<PageMarkdownCaptured>()(\n \"PageMarkdownCaptured\",\n {\n markdown: BoundedOutputText,\n },\n) {}\n\n/** The hyperlinks discovered on the rendered page. */\nexport class PageLinksCaptured extends Schema.TaggedClass<PageLinksCaptured>()(\n \"PageLinksCaptured\",\n {\n links: Schema.Array(PageCaptureLinkUrl).check(Schema.isMaxLength(MAX_LINKS)),\n },\n) {}\n\n/** The extracted structured value; untrusted until decoded by the caller. */\nexport class PageStructuredCaptured extends Schema.TaggedClass<PageStructuredCaptured>()(\n \"PageStructuredCaptured\",\n {\n value: Schema.Json,\n },\n) {}\n\n/** One bounded HTML attribute returned by a selector scrape. */\nexport class PageScrapeAttribute extends Schema.Class<PageScrapeAttribute>(\"PageScrapeAttribute\")({\n name: BoundedAttributeName,\n value: BoundedAttributeValue,\n}) {}\n\n/** One rendered element returned by a selector scrape. */\nexport class PageScrapeElement extends Schema.Class<PageScrapeElement>(\"PageScrapeElement\")({\n text: BoundedScrapeText,\n html: BoundedScrapeHtml,\n attributes: Schema.Array(PageScrapeAttribute).check(Schema.isMaxLength(MAX_SCRAPE_ATTRIBUTES)),\n left: Schema.Finite,\n top: Schema.Finite,\n width: Schema.Finite,\n height: Schema.Finite,\n}) {}\n\n/** All rendered elements matched by one requested selector. */\nexport class PageScrapeGroup extends Schema.Class<PageScrapeGroup>(\"PageScrapeGroup\")({\n selector: BoundedSelector,\n results: Schema.Array(PageScrapeElement).check(Schema.isMaxLength(MAX_SCRAPE_ELEMENTS)),\n}) {}\n\nconst PageScrapeGroups = Schema.Array(PageScrapeGroup).check(\n Schema.isMaxLength(MAX_SCRAPE_SELECTORS),\n Schema.makeFilter(\n (groups) =>\n groups.reduce((total, group) => total + group.results.length, 0) <= MAX_SCRAPE_ELEMENTS,\n { title: \"at most 4096 aggregate scraped elements\" },\n ),\n);\n\n/** Bounded rendered element records, preserving selector grouping. */\nexport class PageScrapeCaptured extends Schema.TaggedClass<PageScrapeCaptured>()(\n \"PageScrapeCaptured\",\n {\n groups: PageScrapeGroups,\n },\n) {}\n\n/** Exactly one output kind per pass, matching the requested action. */\nexport const PageCaptureOutput = Schema.Union([\n PageContentCaptured,\n PageMarkdownCaptured,\n PageLinksCaptured,\n PageScrapeCaptured,\n PageStructuredCaptured,\n]);\n\nexport type PageCaptureOutput = typeof PageCaptureOutput.Type;\n\n/** Explicit accounting for model inference performed by a capture adapter. */\nexport class PageCaptureInferenceUse extends Schema.Class<PageCaptureInferenceUse>(\n \"PageCaptureInferenceUse\",\n)({\n provider: BoundedInferenceProvider,\n modelCalls: PositiveInt,\n}) {}\n\n/** Accounting an adapter observed for one capture. */\nexport class PageCaptureResourceUse extends Schema.Class<PageCaptureResourceUse>(\n \"PageCaptureResourceUse\",\n)({\n browserMillis: Schema.optionalKey(Schema.Natural),\n inference: Schema.optionalKey(PageCaptureInferenceUse),\n}) {}\n\n/** The bounded outcome of one capture pass. */\nexport class PageCaptureResult extends Schema.Class<PageCaptureResult>(\"PageCaptureResult\")({\n implementation: SandboxImplementation,\n output: PageCaptureOutput,\n resourceUse: PageCaptureResourceUse,\n}) {}\n\n/**\n * The platform refused the pass for rate or quota reasons. `retryAfterMillis`\n * carries the platform's own backoff hint when one exists; retrying earlier\n * only re-fails.\n */\nexport class PageCaptureRateLimitedError extends Schema.TaggedError<PageCaptureRateLimitedError>()(\n \"PageCaptureRateLimitedError\",\n {\n implementation: SandboxImplementation,\n reason: Schema.Literals([\"rate\", \"quota\"]),\n retryAfterMillis: Schema.optionalKey(Schema.Natural),\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Navigation, readiness, or capture of the target page failed. */\nexport class PageCaptureNavigationError extends Schema.TaggedError<PageCaptureNavigationError>()(\n \"PageCaptureNavigationError\",\n {\n implementation: SandboxImplementation,\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Host authorization or accounting blocked provider inference before capture. */\nexport class PageCaptureInferencePolicyError extends Schema.TaggedError<PageCaptureInferencePolicyError>()(\n \"PageCaptureInferencePolicyError\",\n {\n implementation: SandboxImplementation,\n provider: BoundedInferenceProvider,\n reason: Schema.Literals([\"authorization\", \"accounting\"]),\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** The adapter cannot honestly honor one requested feature (CAP-010 idiom). */\nexport class PageCaptureUnsupportedError extends Schema.TaggedError<PageCaptureUnsupportedError>()(\n \"PageCaptureUnsupportedError\",\n {\n implementation: SandboxImplementation,\n feature: Schema.Literals([\n \"engine\",\n \"action\",\n \"target\",\n \"navigation\",\n \"viewport\",\n \"resource-policy\",\n ]),\n message: BoundedMessage,\n },\n) {}\n\n/** The response exceeded the request's output byte budget. */\nexport class PageCaptureOutputLimitError extends Schema.TaggedError<PageCaptureOutputLimitError>()(\n \"PageCaptureOutputLimitError\",\n {\n implementation: SandboxImplementation,\n limit: PositiveInt,\n observed: Schema.Natural,\n },\n) {}\n\n/** The platform or transport produced a value outside the capture protocol. */\nexport class PageCaptureProtocolError extends Schema.TaggedError<PageCaptureProtocolError>()(\n \"PageCaptureProtocolError\",\n {\n implementation: SandboxImplementation,\n message: BoundedMessage,\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Expected capture failures. Interruption stays an Effect interruption. */\nexport const PageCaptureError = Schema.Union([\n PageCaptureRateLimitedError,\n PageCaptureNavigationError,\n PageCaptureInferencePolicyError,\n PageCaptureUnsupportedError,\n PageCaptureOutputLimitError,\n PageCaptureProtocolError,\n]);\n\nexport type PageCaptureError = typeof PageCaptureError.Type;\n\n/**\n * Stateless page-capture port. One `capture` is one pass: the adapter owns no\n * session, replay, approval, or Thread semantics, identifies its\n * isolation posture honestly (CAP-010), enforces or rejects every requested\n * limit and policy, and returns exactly one bounded output. Capture results\n * are untrusted input to whatever reads them.\n */\nexport class PageCapture extends Context.Service<\n PageCapture,\n {\n readonly capture: (\n request: PageCaptureRequest,\n ) => Effect.Effect<PageCaptureResult, PageCaptureError>;\n }\n>()(\"@effect-agent/sandbox/PageCapture\") {}\n\n/** Type helper for implementations that preserve the public PageCapture contract. */\nexport type PageCaptureCapture = (\n request: PageCaptureRequest,\n) => Effect.Effect<PageCaptureResult, PageCaptureError>;\n"],"mappings":"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"}
@@ -128,7 +128,7 @@ var ProtectedBrowserClick = class extends Schema.Class("ProtectedBrowserClick")(
128
128
  var ProtectedBrowserFill = class extends Schema.Class("ProtectedBrowserFill")(Schema.Struct({
129
129
  ref: BrowserReference,
130
130
  value: Schema.String.check(Schema.isMaxLength(8192))
131
- }).pipe(Schema.annotate({ parseOptions: { onExcessProperty: "error" } }))) {};
131
+ })) {};
132
132
  const CredentialDispatch = Schema.Literals([
133
133
  "not-dispatched",
134
134
  "possibly-dispatched",
@@ -1 +1 @@
1
- {"version":3,"file":"ProtectedBrowser.mjs","names":[],"sources":["../../src/sandbox/ProtectedBrowser.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema, Scope, type Redacted } from \"effect\";\n\nimport {\n InteractiveBrowserHost,\n InteractiveBrowserTargetUrl,\n InteractiveBrowserPolicy,\n} from \"./InteractiveBrowser.ts\";\n\n/** Canonical HTTPS origin, including a non-default port. Host grants match exactly. */\nexport const CredentialOrigin = Schema.String.check(\n Schema.makeFilter(\n (value) => value.startsWith(\"https://\") && Schema.is(InteractiveBrowserHost)(value.slice(8)),\n ),\n);\n\nexport const BrowserReference = Schema.String.check(Schema.isUUID());\nexport const CredentialKind = Schema.Literals([\"login\", \"card\"]);\n\nexport const CredentialFieldRole = Schema.Literals([\n \"username\",\n \"password\",\n \"card-name\",\n \"card-number\",\n \"card-expiry\",\n \"card-expiry-month\",\n \"card-expiry-year\",\n \"card-security-code\",\n]);\n\nconst Label = Schema.String.check(Schema.isMaxLength(200));\nconst LinkUrl = InteractiveBrowserTargetUrl.check(Schema.isStartsWith(\"https://\"));\n\nexport class CredentialTarget extends Schema.Class<CredentialTarget>(\"CredentialTarget\")({\n topOrigin: CredentialOrigin,\n frameOrigin: CredentialOrigin,\n recipientOrigin: CredentialOrigin,\n document: BrowserReference,\n frame: BrowserReference,\n form: BrowserReference,\n}) {}\n\nexport class ProtectedBrowserControl extends Schema.Class<ProtectedBrowserControl>(\n \"ProtectedBrowserControl\",\n)({\n ref: BrowserReference,\n target: CredentialTarget,\n role: Schema.Union([\n CredentialFieldRole,\n Schema.Literals([\n \"text\",\n \"select\",\n \"radio\",\n \"checkbox\",\n \"submit\",\n \"link\",\n \"button\",\n \"unsupported\",\n ]),\n ]),\n label: Label,\n /** Current native radio/checkbox state; field values are never included. */\n checked: Schema.optionalKey(Schema.Boolean),\n /** Resolved HTTPS destination for a native link; target.recipientOrigin is its origin. */\n url: Schema.optionalKey(LinkUrl),\n}) {}\n\nexport class ProtectedBrowserObservation extends Schema.Class<ProtectedBrowserObservation>(\n \"ProtectedBrowserObservation\",\n)({\n document: BrowserReference,\n topOrigin: CredentialOrigin,\n text: Schema.String.check(Schema.isMaxLength(64 * 1024)),\n controls: Schema.Array(ProtectedBrowserControl).check(Schema.isMaxLength(64)),\n truncated: Schema.Boolean,\n observation: Schema.Literals([\"before-exposure\", \"approved-after-exposure\"]),\n}) {}\n\nexport class CredentialOfferMetadata extends Schema.Class<CredentialOfferMetadata>(\n \"CredentialOfferMetadata\",\n)({\n label: Label,\n brand: Schema.optionalKey(Label),\n lastFour: Schema.optionalKey(Schema.String.check(Schema.isPattern(/^\\d{4}$/))),\n /** Plaintext metadata disclosed only when the host authorizes listing this offer. */\n billingAddress: Schema.optionalKey(\n Schema.Struct({\n name: Schema.optionalKey(Label),\n line1: Schema.optionalKey(Label),\n line2: Schema.optionalKey(Label),\n city: Schema.optionalKey(Label),\n region: Schema.optionalKey(Label),\n postalCode: Schema.optionalKey(Label),\n country: Schema.optionalKey(Label),\n }),\n ),\n}) {}\n\nexport class CredentialOffer extends Schema.Class<CredentialOffer>(\"CredentialOffer\")({\n ref: BrowserReference,\n kind: CredentialKind,\n metadata: CredentialOfferMetadata,\n}) {}\n\nexport class ListCredentialOffers extends Schema.Class<ListCredentialOffers>(\n \"ListCredentialOffers\",\n)({\n kind: CredentialKind,\n target: BrowserReference,\n}) {}\n\nexport class UseCredential extends Schema.Class<UseCredential>(\"UseCredential\")({\n offer: BrowserReference,\n fields: Schema.Array(Schema.Struct({ ref: BrowserReference, role: CredentialFieldRole })).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(8),\n ),\n submit: Schema.optionalKey(BrowserReference),\n}) {}\n\nexport class ProtectedBrowserNavigate extends Schema.Class<ProtectedBrowserNavigate>(\n \"ProtectedBrowserNavigate\",\n)({\n url: Schema.String.check(Schema.isMaxLength(8192)),\n}) {}\n\nexport class ProtectedBrowserClick extends Schema.Class<ProtectedBrowserClick>(\n \"ProtectedBrowserClick\",\n)({\n ref: BrowserReference,\n}) {}\n\n/**\n * Non-secret text for an ordinary text control or native single select in the current observation.\n * Never pass credential material. Credential roles, including username, require useCredential.\n * Selects match a unique enabled option value, then a unique exact trimmed label. Empty text clears.\n */\nexport class ProtectedBrowserFill extends Schema.Class<ProtectedBrowserFill>(\n \"ProtectedBrowserFill\",\n)(\n Schema.Struct({\n ref: BrowserReference,\n value: Schema.String.check(Schema.isMaxLength(8192)),\n }).pipe(Schema.annotate({ parseOptions: { onExcessProperty: \"error\" } })),\n) {}\n\nexport const CredentialDispatch = Schema.Literals([\n \"not-dispatched\",\n \"possibly-dispatched\",\n \"dispatched\",\n]);\n\nexport const CredentialMilestone = Schema.Literals([\n \"none\",\n \"partial-fill\",\n \"filled\",\n \"submission-dispatched\",\n]);\n\nexport const ProtectedObservationState = Schema.Literals([\n \"before-exposure\",\n \"protected\",\n \"approved-after-exposure\",\n \"closed\",\n]);\n\nexport const ProtectedCleanup = Schema.Literals([\"not-requested\", \"confirmed\", \"unconfirmed\"]);\n\nconst Evidence = {\n dispatch: CredentialDispatch,\n milestone: CredentialMilestone,\n observation: ProtectedObservationState,\n cleanup: ProtectedCleanup,\n};\n\n/** No foreign message/cause or page data may enter this failure. Closure does not undo dispatch. */\nexport class ProtectedBrowserError extends Schema.TaggedError<ProtectedBrowserError>()(\n \"ProtectedBrowserError\",\n {\n reason: Schema.Literals([\n \"denied\",\n \"missing-credential\",\n \"stale-reference\",\n \"unsupported\",\n \"needs-attention\",\n \"busy\",\n \"closed\",\n \"limit\",\n \"timeout\",\n \"provider\",\n \"resolver\",\n \"outcome-unknown\",\n \"observation-blocked\",\n ]),\n ...Evidence,\n },\n) {}\n\nexport class CredentialUseResult extends Schema.Class<CredentialUseResult>(\"CredentialUseResult\")({\n ...Evidence,\n authentication: Schema.Literal(\"unverified\"),\n}) {}\n\nconst SecretText = Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(1024)));\n\n/** Host-only material. Never encode it into Tool results, checkpoints, or storage. */\nexport const LoginCredential = Schema.TaggedStruct(\"LoginCredential\", {\n username: SecretText,\n password: SecretText,\n});\n\n/** Security codes are transient, never persisted. Dummy tests are not PCI compliance evidence. */\nexport const CardCredential = Schema.TaggedStruct(\"CardCredential\", {\n name: SecretText,\n number: Schema.Redacted(Schema.String.check(Schema.isPattern(/^\\d{12,19}$/))),\n expiry: SecretText,\n expiryMonth: Schema.Redacted(Schema.String.check(Schema.isPattern(/^(0[1-9]|1[0-2])$/))),\n expiryYear: Schema.Redacted(Schema.String.check(Schema.isPattern(/^\\d{4}$/))),\n securityCode: Schema.optionalKey(\n Schema.Redacted(Schema.String.check(Schema.isPattern(/^\\d{3,4}$/))),\n ),\n});\n\nexport const BrowserCredentialMaterial = Schema.Union([LoginCredential, CardCredential]);\nexport type BrowserCredentialMaterial = typeof BrowserCredentialMaterial.Type;\n\nexport class CredentialAccessError extends Schema.TaggedError<CredentialAccessError>()(\n \"CredentialAccessError\",\n {\n reason: Schema.Literals([\"denied\", \"missing-credential\", \"needs-attention\", \"resolver\"]),\n },\n) {}\n\nexport interface CredentialAccessRequest {\n readonly caller: Redacted.Redacted<string>;\n readonly kind: typeof CredentialKind.Type;\n readonly target: CredentialTarget;\n}\n\nexport interface CredentialUseAuthorization extends CredentialAccessRequest {\n readonly key: Redacted.Redacted<string>;\n readonly roles: ReadonlyArray<typeof CredentialFieldRole.Type>;\n readonly submit: boolean;\n}\n\n/** Exact current action proposed to host authority; no ordinary fill value or secret is included. */\nexport const ProtectedBrowserAction = Schema.Union([\n Schema.TaggedStruct(\"Navigate\", { url: ProtectedBrowserNavigate.fields.url }),\n Schema.TaggedStruct(\"Fill\", {\n ref: BrowserReference,\n target: CredentialTarget,\n role: Schema.Literals([\"text\", \"select\"]),\n }),\n Schema.TaggedStruct(\"Click\", {\n ref: BrowserReference,\n target: CredentialTarget,\n role: Schema.Literals([\"button\", \"radio\", \"checkbox\"]),\n }),\n Schema.TaggedStruct(\"Click\", {\n ref: BrowserReference,\n target: CredentialTarget,\n role: Schema.Literal(\"link\"),\n url: LinkUrl,\n }),\n Schema.TaggedStruct(\"Submit\", { ref: BrowserReference, target: CredentialTarget }),\n]);\n\nexport type ProtectedBrowserAction = typeof ProtectedBrowserAction.Type;\n\n/**\n * Trust only these current observation origins. The top origin must be included. Other frames\n * supply neither text nor usable refs. This does not expand network policy or credential grants.\n */\nexport class CredentialObservationGrant extends Schema.Class<CredentialObservationGrant>(\n \"CredentialObservationGrant\",\n)({\n decision: Schema.Literal(\"trust-recipient-no-credential-echo\"),\n origins: Schema.Array(CredentialOrigin).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(16),\n Schema.isUnique(),\n ),\n}) {}\n\nexport const CredentialObservationDecision = Schema.Union([\n Schema.Literals([\"trust-recipient-no-credential-echo\", \"deny\"]),\n CredentialObservationGrant,\n]);\n\n/**\n * Host-only vault and grant port. Derive caller from the authorized invocation, never Tool input.\n * Recheck account ownership, current grants, merchant/frame/recipient pairing, and any side\n * effects caused by filling. Listing authorizes metadata only. Grant checks never widen network\n * policy. Implementations must not log material or put it in defects/traces.\n */\nexport class BrowserCredentialAccess extends Context.Service<\n BrowserCredentialAccess,\n {\n readonly caller: Effect.Effect<Redacted.Redacted<string>, CredentialAccessError>;\n readonly list: (request: CredentialAccessRequest) => Effect.Effect<\n ReadonlyArray<{\n readonly key: Redacted.Redacted<string>;\n readonly metadata: CredentialOfferMetadata;\n }>,\n CredentialAccessError\n >;\n readonly authorize: (\n request: CredentialUseAuthorization,\n ) => Effect.Effect<void, CredentialAccessError>;\n readonly resolve: (\n request: CredentialUseAuthorization,\n ) => Effect.Effect<BrowserCredentialMaterial, CredentialAccessError>;\n /**\n * Optional host authority for every ordinary navigate/fill/click, mandatory for Submit.\n * Recheck caller ownership, user intent, current submission/continuation grants for ALL prior\n * exposures, and this exact target. Exposures may come from separate credential frames/forms.\n * Without this hook, ordinary actions retain their observation gate and Submit is unsupported.\n * Observation trust alone never authorizes a new native submit. Called again on each action;\n * approvals are not cached. The pass revalidates caller and target after this hook returns.\n */\n readonly authorizeAction?: (request: {\n readonly caller: Redacted.Redacted<string>;\n readonly action: ProtectedBrowserAction;\n readonly exposures: ReadonlyArray<CredentialTarget>;\n }) => Effect.Effect<void, CredentialAccessError>;\n /**\n * Explicitly trust all observed destinations not to echo credentials, including transformed\n * or delayed echoes. Called for every observation and non-secret action after exposure.\n * The string grant trusts all current observed origins. Return CredentialObservationGrant\n * to select an explicit subset instead. This is recipient trust, not submission authority,\n * a universal secrecy guarantee, or a login verifier.\n */\n readonly observation: (request: {\n readonly caller: Redacted.Redacted<string>;\n readonly topOrigin: typeof CredentialOrigin.Type;\n readonly frameOrigins: ReadonlyArray<typeof CredentialOrigin.Type>;\n readonly exposures: ReadonlyArray<CredentialTarget>;\n /** A human may have entered secrets; explicitly authorize observation even with no vault exposures. */\n readonly humanExposure?: boolean;\n /** Origins present when the human received control, retained across durable suspension. */\n readonly humanOrigins?: ReadonlyArray<typeof CredentialOrigin.Type>;\n }) => Effect.Effect<typeof CredentialObservationDecision.Type, CredentialAccessError>;\n }\n>()(\"@effect-agent/sandbox/BrowserCredentialAccess\") {}\n\n/**\n * Host-only suspended-pass state. Persist with the host's fenced controller receipt, never in\n * a Tool result. It contains no credential material, offers, DOM references usable after resume,\n * cookies, page text, or provider capability. A host must restore its own credential exposure\n * ledger as well. The original deadline and action allowance include time spent with the human.\n */\nexport class ProtectedBrowserCheckpoint extends Schema.Class<ProtectedBrowserCheckpoint>(\n \"ProtectedBrowserCheckpoint\",\n)({\n policy: InteractiveBrowserPolicy,\n startedAt: Schema.Natural,\n actions: Schema.Natural,\n exposures: Schema.Array(CredentialTarget).check(Schema.isMaxLength(1000)),\n humanExposure: Schema.Boolean,\n humanOrigins: Schema.Array(CredentialOrigin).check(Schema.isMaxLength(16)),\n dispatch: CredentialDispatch,\n milestone: CredentialMilestone,\n}) {}\n\n/** A private ephemeral pass. No selectors, JavaScript, screenshots, viewer, or provider identity. */\nexport interface ProtectedBrowserHandle {\n readonly navigate: (\n request: ProtectedBrowserNavigate,\n ) => Effect.Effect<void, ProtectedBrowserError>;\n readonly observe: Effect.Effect<ProtectedBrowserObservation, ProtectedBrowserError>;\n readonly click: (request: ProtectedBrowserClick) => Effect.Effect<void, ProtectedBrowserError>;\n /** Uses the same lock, budgets, current-target checks and post-exposure grant as other actions. */\n readonly fill: (request: ProtectedBrowserFill) => Effect.Effect<void, ProtectedBrowserError>;\n readonly listCredentialOffers: (\n request: ListCredentialOffers,\n ) => Effect.Effect<ReadonlyArray<CredentialOffer>, ProtectedBrowserError>;\n readonly useCredential: (\n request: UseCredential,\n ) => Effect.Effect<CredentialUseResult, ProtectedBrowserError>;\n readonly close: Effect.Effect<typeof ProtectedCleanup.Type>;\n}\n\nexport class ProtectedBrowser extends Context.Service<\n ProtectedBrowser,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<\n ProtectedBrowserHandle,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n >;\n }\n>()(\"@effect-agent/sandbox/ProtectedBrowser\") {}\n\n/** Build once in an execution/Attempt Layer. Acquires lazily and shares one pass across Tools. */\nexport class ProtectedBrowserSession extends Context.Service<\n ProtectedBrowserSession,\n {\n readonly get: Effect.Effect<ProtectedBrowserHandle, ProtectedBrowserError>;\n }\n>()(\"@effect-agent/sandbox/ProtectedBrowserSession\") {\n static layer(policy: InteractiveBrowserPolicy) {\n return Layer.effect(this)(\n Effect.gen(function* () {\n const browser = yield* ProtectedBrowser;\n const access = yield* BrowserCredentialAccess;\n const scope = yield* Effect.scope;\n\n const cached = yield* Effect.cached(\n browser\n .open(policy)\n .pipe(\n Effect.provideService(BrowserCredentialAccess, access),\n Effect.provideService(Scope.Scope, scope),\n ),\n );\n\n return {\n get: Effect.suspend(() =>\n scope.state._tag === \"Closed\"\n ? Effect.fail(\n new ProtectedBrowserError({\n reason: \"closed\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"not-requested\",\n }),\n )\n : cached,\n ),\n };\n }),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProtectedBrowser.mjs","names":[],"sources":["../../src/sandbox/ProtectedBrowser.ts"],"sourcesContent":["import { Context, Effect, Layer, Schema, Scope, type Redacted } from \"effect\";\n\nimport {\n InteractiveBrowserHost,\n InteractiveBrowserTargetUrl,\n InteractiveBrowserPolicy,\n} from \"./InteractiveBrowser.ts\";\n\n/** Canonical HTTPS origin, including a non-default port. Host grants match exactly. */\nexport const CredentialOrigin = Schema.String.check(\n Schema.makeFilter(\n (value) => value.startsWith(\"https://\") && Schema.is(InteractiveBrowserHost)(value.slice(8)),\n ),\n);\n\nexport const BrowserReference = Schema.String.check(Schema.isUUID());\nexport const CredentialKind = Schema.Literals([\"login\", \"card\"]);\n\nexport const CredentialFieldRole = Schema.Literals([\n \"username\",\n \"password\",\n \"card-name\",\n \"card-number\",\n \"card-expiry\",\n \"card-expiry-month\",\n \"card-expiry-year\",\n \"card-security-code\",\n]);\n\nconst Label = Schema.String.check(Schema.isMaxLength(200));\nconst LinkUrl = InteractiveBrowserTargetUrl.check(Schema.isStartsWith(\"https://\"));\n\nexport class CredentialTarget extends Schema.Class<CredentialTarget>(\"CredentialTarget\")({\n topOrigin: CredentialOrigin,\n frameOrigin: CredentialOrigin,\n recipientOrigin: CredentialOrigin,\n document: BrowserReference,\n frame: BrowserReference,\n form: BrowserReference,\n}) {}\n\nexport class ProtectedBrowserControl extends Schema.Class<ProtectedBrowserControl>(\n \"ProtectedBrowserControl\",\n)({\n ref: BrowserReference,\n target: CredentialTarget,\n role: Schema.Union([\n CredentialFieldRole,\n Schema.Literals([\n \"text\",\n \"select\",\n \"radio\",\n \"checkbox\",\n \"submit\",\n \"link\",\n \"button\",\n \"unsupported\",\n ]),\n ]),\n label: Label,\n /** Current native radio/checkbox state; field values are never included. */\n checked: Schema.optionalKey(Schema.Boolean),\n /** Resolved HTTPS destination for a native link; target.recipientOrigin is its origin. */\n url: Schema.optionalKey(LinkUrl),\n}) {}\n\nexport class ProtectedBrowserObservation extends Schema.Class<ProtectedBrowserObservation>(\n \"ProtectedBrowserObservation\",\n)({\n document: BrowserReference,\n topOrigin: CredentialOrigin,\n text: Schema.String.check(Schema.isMaxLength(64 * 1024)),\n controls: Schema.Array(ProtectedBrowserControl).check(Schema.isMaxLength(64)),\n truncated: Schema.Boolean,\n observation: Schema.Literals([\"before-exposure\", \"approved-after-exposure\"]),\n}) {}\n\nexport class CredentialOfferMetadata extends Schema.Class<CredentialOfferMetadata>(\n \"CredentialOfferMetadata\",\n)({\n label: Label,\n brand: Schema.optionalKey(Label),\n lastFour: Schema.optionalKey(Schema.String.check(Schema.isPattern(/^\\d{4}$/))),\n /** Plaintext metadata disclosed only when the host authorizes listing this offer. */\n billingAddress: Schema.optionalKey(\n Schema.Struct({\n name: Schema.optionalKey(Label),\n line1: Schema.optionalKey(Label),\n line2: Schema.optionalKey(Label),\n city: Schema.optionalKey(Label),\n region: Schema.optionalKey(Label),\n postalCode: Schema.optionalKey(Label),\n country: Schema.optionalKey(Label),\n }),\n ),\n}) {}\n\nexport class CredentialOffer extends Schema.Class<CredentialOffer>(\"CredentialOffer\")({\n ref: BrowserReference,\n kind: CredentialKind,\n metadata: CredentialOfferMetadata,\n}) {}\n\nexport class ListCredentialOffers extends Schema.Class<ListCredentialOffers>(\n \"ListCredentialOffers\",\n)({\n kind: CredentialKind,\n target: BrowserReference,\n}) {}\n\nexport class UseCredential extends Schema.Class<UseCredential>(\"UseCredential\")({\n offer: BrowserReference,\n fields: Schema.Array(Schema.Struct({ ref: BrowserReference, role: CredentialFieldRole })).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(8),\n ),\n submit: Schema.optionalKey(BrowserReference),\n}) {}\n\nexport class ProtectedBrowserNavigate extends Schema.Class<ProtectedBrowserNavigate>(\n \"ProtectedBrowserNavigate\",\n)({\n url: Schema.String.check(Schema.isMaxLength(8192)),\n}) {}\n\nexport class ProtectedBrowserClick extends Schema.Class<ProtectedBrowserClick>(\n \"ProtectedBrowserClick\",\n)({\n ref: BrowserReference,\n}) {}\n\n/**\n * Non-secret text for an ordinary text control or native single select in the current observation.\n * Never pass credential material. Credential roles, including username, require useCredential.\n * Selects match a unique enabled option value, then a unique exact trimmed label. Empty text clears.\n */\nexport class ProtectedBrowserFill extends Schema.Class<ProtectedBrowserFill>(\n \"ProtectedBrowserFill\",\n)(\n Schema.Struct({\n ref: BrowserReference,\n value: Schema.String.check(Schema.isMaxLength(8192)),\n }),\n) {}\n\nexport const CredentialDispatch = Schema.Literals([\n \"not-dispatched\",\n \"possibly-dispatched\",\n \"dispatched\",\n]);\n\nexport const CredentialMilestone = Schema.Literals([\n \"none\",\n \"partial-fill\",\n \"filled\",\n \"submission-dispatched\",\n]);\n\nexport const ProtectedObservationState = Schema.Literals([\n \"before-exposure\",\n \"protected\",\n \"approved-after-exposure\",\n \"closed\",\n]);\n\nexport const ProtectedCleanup = Schema.Literals([\"not-requested\", \"confirmed\", \"unconfirmed\"]);\n\nconst Evidence = {\n dispatch: CredentialDispatch,\n milestone: CredentialMilestone,\n observation: ProtectedObservationState,\n cleanup: ProtectedCleanup,\n};\n\n/** No foreign message/cause or page data may enter this failure. Closure does not undo dispatch. */\nexport class ProtectedBrowserError extends Schema.TaggedError<ProtectedBrowserError>()(\n \"ProtectedBrowserError\",\n {\n reason: Schema.Literals([\n \"denied\",\n \"missing-credential\",\n \"stale-reference\",\n \"unsupported\",\n \"needs-attention\",\n \"busy\",\n \"closed\",\n \"limit\",\n \"timeout\",\n \"provider\",\n \"resolver\",\n \"outcome-unknown\",\n \"observation-blocked\",\n ]),\n ...Evidence,\n },\n) {}\n\nexport class CredentialUseResult extends Schema.Class<CredentialUseResult>(\"CredentialUseResult\")({\n ...Evidence,\n authentication: Schema.Literal(\"unverified\"),\n}) {}\n\nconst SecretText = Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(1024)));\n\n/** Host-only material. Never encode it into Tool results, checkpoints, or storage. */\nexport const LoginCredential = Schema.TaggedStruct(\"LoginCredential\", {\n username: SecretText,\n password: SecretText,\n});\n\n/** Security codes are transient, never persisted. Dummy tests are not PCI compliance evidence. */\nexport const CardCredential = Schema.TaggedStruct(\"CardCredential\", {\n name: SecretText,\n number: Schema.Redacted(Schema.String.check(Schema.isPattern(/^\\d{12,19}$/))),\n expiry: SecretText,\n expiryMonth: Schema.Redacted(Schema.String.check(Schema.isPattern(/^(0[1-9]|1[0-2])$/))),\n expiryYear: Schema.Redacted(Schema.String.check(Schema.isPattern(/^\\d{4}$/))),\n securityCode: Schema.optionalKey(\n Schema.Redacted(Schema.String.check(Schema.isPattern(/^\\d{3,4}$/))),\n ),\n});\n\nexport const BrowserCredentialMaterial = Schema.Union([LoginCredential, CardCredential]);\nexport type BrowserCredentialMaterial = typeof BrowserCredentialMaterial.Type;\n\nexport class CredentialAccessError extends Schema.TaggedError<CredentialAccessError>()(\n \"CredentialAccessError\",\n {\n reason: Schema.Literals([\"denied\", \"missing-credential\", \"needs-attention\", \"resolver\"]),\n },\n) {}\n\nexport interface CredentialAccessRequest {\n readonly caller: Redacted.Redacted<string>;\n readonly kind: typeof CredentialKind.Type;\n readonly target: CredentialTarget;\n}\n\nexport interface CredentialUseAuthorization extends CredentialAccessRequest {\n readonly key: Redacted.Redacted<string>;\n readonly roles: ReadonlyArray<typeof CredentialFieldRole.Type>;\n readonly submit: boolean;\n}\n\n/** Exact current action proposed to host authority; no ordinary fill value or secret is included. */\nexport const ProtectedBrowserAction = Schema.Union([\n Schema.TaggedStruct(\"Navigate\", { url: ProtectedBrowserNavigate.fields.url }),\n Schema.TaggedStruct(\"Fill\", {\n ref: BrowserReference,\n target: CredentialTarget,\n role: Schema.Literals([\"text\", \"select\"]),\n }),\n Schema.TaggedStruct(\"Click\", {\n ref: BrowserReference,\n target: CredentialTarget,\n role: Schema.Literals([\"button\", \"radio\", \"checkbox\"]),\n }),\n Schema.TaggedStruct(\"Click\", {\n ref: BrowserReference,\n target: CredentialTarget,\n role: Schema.Literal(\"link\"),\n url: LinkUrl,\n }),\n Schema.TaggedStruct(\"Submit\", { ref: BrowserReference, target: CredentialTarget }),\n]);\n\nexport type ProtectedBrowserAction = typeof ProtectedBrowserAction.Type;\n\n/**\n * Trust only these current observation origins. The top origin must be included. Other frames\n * supply neither text nor usable refs. This does not expand network policy or credential grants.\n */\nexport class CredentialObservationGrant extends Schema.Class<CredentialObservationGrant>(\n \"CredentialObservationGrant\",\n)({\n decision: Schema.Literal(\"trust-recipient-no-credential-echo\"),\n origins: Schema.Array(CredentialOrigin).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(16),\n Schema.isUnique(),\n ),\n}) {}\n\nexport const CredentialObservationDecision = Schema.Union([\n Schema.Literals([\"trust-recipient-no-credential-echo\", \"deny\"]),\n CredentialObservationGrant,\n]);\n\n/**\n * Host-only vault and grant port. Derive caller from the authorized invocation, never Tool input.\n * Recheck account ownership, current grants, merchant/frame/recipient pairing, and any side\n * effects caused by filling. Listing authorizes metadata only. Grant checks never widen network\n * policy. Implementations must not log material or put it in defects/traces.\n */\nexport class BrowserCredentialAccess extends Context.Service<\n BrowserCredentialAccess,\n {\n readonly caller: Effect.Effect<Redacted.Redacted<string>, CredentialAccessError>;\n readonly list: (request: CredentialAccessRequest) => Effect.Effect<\n ReadonlyArray<{\n readonly key: Redacted.Redacted<string>;\n readonly metadata: CredentialOfferMetadata;\n }>,\n CredentialAccessError\n >;\n readonly authorize: (\n request: CredentialUseAuthorization,\n ) => Effect.Effect<void, CredentialAccessError>;\n readonly resolve: (\n request: CredentialUseAuthorization,\n ) => Effect.Effect<BrowserCredentialMaterial, CredentialAccessError>;\n /**\n * Optional host authority for every ordinary navigate/fill/click, mandatory for Submit.\n * Recheck caller ownership, user intent, current submission/continuation grants for ALL prior\n * exposures, and this exact target. Exposures may come from separate credential frames/forms.\n * Without this hook, ordinary actions retain their observation gate and Submit is unsupported.\n * Observation trust alone never authorizes a new native submit. Called again on each action;\n * approvals are not cached. The pass revalidates caller and target after this hook returns.\n */\n readonly authorizeAction?: (request: {\n readonly caller: Redacted.Redacted<string>;\n readonly action: ProtectedBrowserAction;\n readonly exposures: ReadonlyArray<CredentialTarget>;\n }) => Effect.Effect<void, CredentialAccessError>;\n /**\n * Explicitly trust all observed destinations not to echo credentials, including transformed\n * or delayed echoes. Called for every observation and non-secret action after exposure.\n * The string grant trusts all current observed origins. Return CredentialObservationGrant\n * to select an explicit subset instead. This is recipient trust, not submission authority,\n * a universal secrecy guarantee, or a login verifier.\n */\n readonly observation: (request: {\n readonly caller: Redacted.Redacted<string>;\n readonly topOrigin: typeof CredentialOrigin.Type;\n readonly frameOrigins: ReadonlyArray<typeof CredentialOrigin.Type>;\n readonly exposures: ReadonlyArray<CredentialTarget>;\n /** A human may have entered secrets; explicitly authorize observation even with no vault exposures. */\n readonly humanExposure?: boolean;\n /** Origins present when the human received control, retained across durable suspension. */\n readonly humanOrigins?: ReadonlyArray<typeof CredentialOrigin.Type>;\n }) => Effect.Effect<typeof CredentialObservationDecision.Type, CredentialAccessError>;\n }\n>()(\"@effect-agent/sandbox/BrowserCredentialAccess\") {}\n\n/**\n * Host-only suspended-pass state. Persist with the host's fenced controller receipt, never in\n * a Tool result. It contains no credential material, offers, DOM references usable after resume,\n * cookies, page text, or provider capability. A host must restore its own credential exposure\n * ledger as well. The original deadline and action allowance include time spent with the human.\n */\nexport class ProtectedBrowserCheckpoint extends Schema.Class<ProtectedBrowserCheckpoint>(\n \"ProtectedBrowserCheckpoint\",\n)({\n policy: InteractiveBrowserPolicy,\n startedAt: Schema.Natural,\n actions: Schema.Natural,\n exposures: Schema.Array(CredentialTarget).check(Schema.isMaxLength(1000)),\n humanExposure: Schema.Boolean,\n humanOrigins: Schema.Array(CredentialOrigin).check(Schema.isMaxLength(16)),\n dispatch: CredentialDispatch,\n milestone: CredentialMilestone,\n}) {}\n\n/** A private ephemeral pass. No selectors, JavaScript, screenshots, viewer, or provider identity. */\nexport interface ProtectedBrowserHandle {\n readonly navigate: (\n request: ProtectedBrowserNavigate,\n ) => Effect.Effect<void, ProtectedBrowserError>;\n readonly observe: Effect.Effect<ProtectedBrowserObservation, ProtectedBrowserError>;\n readonly click: (request: ProtectedBrowserClick) => Effect.Effect<void, ProtectedBrowserError>;\n /** Uses the same lock, budgets, current-target checks and post-exposure grant as other actions. */\n readonly fill: (request: ProtectedBrowserFill) => Effect.Effect<void, ProtectedBrowserError>;\n readonly listCredentialOffers: (\n request: ListCredentialOffers,\n ) => Effect.Effect<ReadonlyArray<CredentialOffer>, ProtectedBrowserError>;\n readonly useCredential: (\n request: UseCredential,\n ) => Effect.Effect<CredentialUseResult, ProtectedBrowserError>;\n readonly close: Effect.Effect<typeof ProtectedCleanup.Type>;\n}\n\nexport class ProtectedBrowser extends Context.Service<\n ProtectedBrowser,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<\n ProtectedBrowserHandle,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n >;\n }\n>()(\"@effect-agent/sandbox/ProtectedBrowser\") {}\n\n/** Build once in an execution/Attempt Layer. Acquires lazily and shares one pass across Tools. */\nexport class ProtectedBrowserSession extends Context.Service<\n ProtectedBrowserSession,\n {\n readonly get: Effect.Effect<ProtectedBrowserHandle, ProtectedBrowserError>;\n }\n>()(\"@effect-agent/sandbox/ProtectedBrowserSession\") {\n static layer(policy: InteractiveBrowserPolicy) {\n return Layer.effect(this)(\n Effect.gen(function* () {\n const browser = yield* ProtectedBrowser;\n const access = yield* BrowserCredentialAccess;\n const scope = yield* Effect.scope;\n\n const cached = yield* Effect.cached(\n browser\n .open(policy)\n .pipe(\n Effect.provideService(BrowserCredentialAccess, access),\n Effect.provideService(Scope.Scope, scope),\n ),\n );\n\n return {\n get: Effect.suspend(() =>\n scope.state._tag === \"Closed\"\n ? Effect.fail(\n new ProtectedBrowserError({\n reason: \"closed\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"not-requested\",\n }),\n )\n : cached,\n ),\n };\n }),\n );\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"effect-agent","version":"0.1.0-beta.91","devDependencies":{"@effect/platform-node":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","effect":"4.0.0-rc.112","typescript":"7.0.2","vite-plus":"0.3.0"},"peerDependencies":{"effect":"^4.0.0-rc.112"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./activity-store":{"types":"./dist/durable/ActivityStore.d.mts","default":"./dist/durable/ActivityStore.mjs"},"./admin":{"types":"./dist/durable/Admin.d.mts","default":"./dist/durable/Admin.mjs"},"./agent":{"types":"./dist/core/Agent.d.mts","default":"./dist/core/Agent.mjs"},"./agent-error":{"types":"./dist/core/AgentError.d.mts","default":"./dist/core/AgentError.mjs"},"./agent-policy":{"types":"./dist/core/AgentPolicy.d.mts","default":"./dist/core/AgentPolicy.mjs"},"./agent-registration":{"types":"./dist/durable/AgentRegistration.d.mts","default":"./dist/durable/AgentRegistration.mjs"},"./agent-runtime":{"types":"./dist/engine/AgentRuntime.d.mts","default":"./dist/engine/AgentRuntime.mjs"},"./agent-updates":{"types":"./dist/core/AgentUpdates.d.mts","default":"./dist/core/AgentUpdates.mjs"},"./approval":{"types":"./dist/capabilities/Approval.d.mts","default":"./dist/capabilities/Approval.mjs"},"./budget":{"types":"./dist/capabilities/Budget.d.mts","default":"./dist/capabilities/Budget.mjs"},"./code-executor":{"types":"./dist/sandbox/CodeExecutor.d.mts","default":"./dist/sandbox/CodeExecutor.mjs"},"./code-mode":{"types":"./dist/capabilities/CodeMode.d.mts","default":"./dist/capabilities/CodeMode.mjs"},"./commands":{"types":"./dist/capabilities/Commands.d.mts","default":"./dist/capabilities/Commands.mjs"},"./committed-activity":{"types":"./dist/durable/CommittedActivity.d.mts","default":"./dist/durable/CommittedActivity.mjs"},"./compaction":{"types":"./dist/engine/Compaction.d.mts","default":"./dist/engine/Compaction.mjs"},"./context-compactor":{"types":"./dist/engine/ContextCompactor.d.mts","default":"./dist/engine/ContextCompactor.mjs"},"./context-history":{"types":"./dist/engine/ContextHistory.d.mts","default":"./dist/engine/ContextHistory.mjs"},"./context-tools":{"types":"./dist/capabilities/ContextTools.d.mts","default":"./dist/capabilities/ContextTools.mjs"},"./context-window":{"types":"./dist/engine/ContextWindow.d.mts","default":"./dist/engine/ContextWindow.mjs"},"./digest":{"types":"./dist/durable/Digest.d.mts","default":"./dist/durable/Digest.mjs"},"./durable-agent-runtime":{"types":"./dist/durable/DurableAgentRuntime.d.mts","default":"./dist/durable/DurableAgentRuntime.mjs"},"./durable-failpoint":{"types":"./dist/durable/DurableFailpoint.d.mts","default":"./dist/durable/DurableFailpoint.mjs"},"./durable-step":{"types":"./dist/engine/DurableStep.d.mts","default":"./dist/engine/DurableStep.mjs"},"./ephemeral":{"types":"./dist/Ephemeral.d.mts","default":"./dist/Ephemeral.mjs"},"./event-source":{"types":"./dist/durable/EventSource.d.mts","default":"./dist/durable/EventSource.mjs"},"./git-hub-workflow-source":{"types":"./dist/durable/GitHubWorkflowSource.d.mts","default":"./dist/durable/GitHubWorkflowSource.mjs"},"./id-generator":{"types":"./dist/core/IdGenerator.d.mts","default":"./dist/core/IdGenerator.mjs"},"./identifiers":{"types":"./dist/core/Identifiers.d.mts","default":"./dist/core/Identifiers.mjs"},"./interactive-browser":{"types":"./dist/sandbox/InteractiveBrowser.d.mts","default":"./dist/sandbox/InteractiveBrowser.mjs"},"./mcp":{"types":"./dist/capabilities/Mcp.d.mts","default":"./dist/capabilities/Mcp.mjs"},"./mcp-client":{"types":"./dist/capabilities/McpClient.d.mts","default":"./dist/capabilities/McpClient.mjs"},"./memory":{"types":"./dist/core/Memory.d.mts","default":"./dist/core/Memory.mjs"},"./memory-namespace":{"types":"./dist/core/MemoryNamespace.d.mts","default":"./dist/core/MemoryNamespace.mjs"},"./memory-notes":{"types":"./dist/capabilities/MemoryNotes.d.mts","default":"./dist/capabilities/MemoryNotes.mjs"},"./memory-reference":{"types":"./dist/core/MemoryReference.d.mts","default":"./dist/core/MemoryReference.mjs"},"./memory-revalidation":{"types":"./dist/core/MemoryRevalidation.d.mts","default":"./dist/core/MemoryRevalidation.mjs"},"./memory-store":{"types":"./dist/core/MemoryStore.d.mts","default":"./dist/core/MemoryStore.mjs"},"./message-delivery":{"types":"./dist/durable/MessageDelivery.d.mts","default":"./dist/durable/MessageDelivery.mjs"},"./messaging":{"types":"./dist/capabilities/Messaging.d.mts","default":"./dist/capabilities/Messaging.mjs"},"./messaging-host":{"types":"./dist/engine/MessagingHost.d.mts","default":"./dist/engine/MessagingHost.mjs"},"./model-context":{"types":"./dist/capabilities/ModelContext.d.mts","default":"./dist/capabilities/ModelContext.mjs"},"./operation-authorizer":{"types":"./dist/durable/OperationAuthorizer.d.mts","default":"./dist/durable/OperationAuthorizer.mjs"},"./output":{"types":"./dist/engine/Output.d.mts","default":"./dist/engine/Output.mjs"},"./page-capture":{"types":"./dist/sandbox/PageCapture.d.mts","default":"./dist/sandbox/PageCapture.mjs"},"./page-crawl":{"types":"./dist/sandbox/PageCrawl.d.mts","default":"./dist/sandbox/PageCrawl.mjs"},"./page-screenshot":{"types":"./dist/sandbox/PageScreenshot.d.mts","default":"./dist/sandbox/PageScreenshot.mjs"},"./persistent-history":{"types":"./dist/durable/PersistentHistory.d.mts","default":"./dist/durable/PersistentHistory.mjs"},"./prepared-input-admission":{"types":"./dist/durable/PreparedInputAdmission.d.mts","default":"./dist/durable/PreparedInputAdmission.mjs"},"./protected-browser":{"types":"./dist/sandbox/ProtectedBrowser.d.mts","default":"./dist/sandbox/ProtectedBrowser.mjs"},"./receipt":{"types":"./dist/core/Receipt.d.mts","default":"./dist/core/Receipt.mjs"},"./records":{"types":"./dist/durable/Records.d.mts","default":"./dist/durable/Records.mjs"},"./recovery":{"types":"./dist/durable/Recovery.d.mts","default":"./dist/durable/Recovery.mjs"},"./redaction":{"types":"./dist/capabilities/Redaction.d.mts","default":"./dist/capabilities/Redaction.mjs"},"./remembering":{"types":"./dist/capabilities/Remembering.d.mts","default":"./dist/capabilities/Remembering.mjs"},"./remembering-store":{"types":"./dist/core/RememberingStore.d.mts","default":"./dist/core/RememberingStore.mjs"},"./run-event":{"types":"./dist/core/RunEvent.d.mts","default":"./dist/core/RunEvent.mjs"},"./run-event-sink":{"types":"./dist/engine/RunEventSink.d.mts","default":"./dist/engine/RunEventSink.mjs"},"./run-hooks":{"types":"./dist/capabilities/RunHooks.d.mts","default":"./dist/capabilities/RunHooks.mjs"},"./run-journal":{"types":"./dist/durable/RunJournal.d.mts","default":"./dist/durable/RunJournal.mjs"},"./run-options":{"types":"./dist/engine/RunOptions.d.mts","default":"./dist/engine/RunOptions.mjs"},"./run-policy-usage":{"types":"./dist/core/RunPolicyUsage.d.mts","default":"./dist/core/RunPolicyUsage.mjs"},"./sandbox":{"types":"./dist/sandbox/Sandbox.d.mts","default":"./dist/sandbox/Sandbox.mjs"},"./schedule":{"types":"./dist/durable/Schedule.d.mts","default":"./dist/durable/Schedule.mjs"},"./schedule-transition":{"types":"./dist/durable/ScheduleTransition.d.mts","default":"./dist/durable/ScheduleTransition.mjs"},"./scheduling":{"types":"./dist/durable/Scheduling.d.mts","default":"./dist/durable/Scheduling.mjs"},"./semantic-memory":{"types":"./dist/capabilities/SemanticMemory.d.mts","default":"./dist/capabilities/SemanticMemory.mjs"},"./semantic-memory-index":{"types":"./dist/core/SemanticMemoryIndex.d.mts","default":"./dist/core/SemanticMemoryIndex.mjs"},"./semantic-memory-revalidation":{"types":"./dist/core/SemanticMemoryRevalidation.d.mts","default":"./dist/core/SemanticMemoryRevalidation.mjs"},"./sql-memory-store":{"types":"./dist/durable/SqlMemoryStore.d.mts","default":"./dist/durable/SqlMemoryStore.mjs"},"./sql-message-delivery-store":{"types":"./dist/durable/SqlMessageDeliveryStore.d.mts","default":"./dist/durable/SqlMessageDeliveryStore.mjs"},"./sql-storage-v2-upgrade":{"types":"./dist/durable/SqlStorageV2Upgrade.d.mts","default":"./dist/durable/SqlStorageV2Upgrade.mjs"},"./sql-subscription-store":{"types":"./dist/durable/SqlSubscriptionStore.d.mts","default":"./dist/durable/SqlSubscriptionStore.mjs"},"./subagent":{"types":"./dist/capabilities/Subagent.d.mts","default":"./dist/capabilities/Subagent.mjs"},"./subagent-contract":{"types":"./dist/core/SubagentContract.d.mts","default":"./dist/core/SubagentContract.mjs"},"./subagent-host":{"types":"./dist/engine/SubagentHost.d.mts","default":"./dist/engine/SubagentHost.mjs"},"./subagent-reservations":{"types":"./dist/capabilities/SubagentReservations.d.mts","default":"./dist/capabilities/SubagentReservations.mjs"},"./submission-ledger":{"types":"./dist/durable/SubmissionLedger.d.mts","default":"./dist/durable/SubmissionLedger.mjs"},"./submission-status":{"types":"./dist/durable/SubmissionStatus.d.mts","default":"./dist/durable/SubmissionStatus.mjs"},"./subscription":{"types":"./dist/durable/Subscription.d.mts","default":"./dist/durable/Subscription.mjs"},"./subscription-input":{"types":"./dist/durable/SubscriptionInput.d.mts","default":"./dist/durable/SubscriptionInput.mjs"},"./subscription-tools":{"types":"./dist/durable/SubscriptionTools.d.mts","default":"./dist/durable/SubscriptionTools.mjs"},"./subscription-transition":{"types":"./dist/durable/SubscriptionTransition.d.mts","default":"./dist/durable/SubscriptionTransition.mjs"},"./subscriptions":{"types":"./dist/durable/Subscriptions.d.mts","default":"./dist/durable/Subscriptions.mjs"},"./testing/certification":{"types":"./dist/durable/Certification.d.mts","default":"./dist/durable/Certification.mjs"},"./testing/durable-failpoint-test-control":{"types":"./dist/durable/DurableFailpointTestControl.d.mts","default":"./dist/durable/DurableFailpointTestControl.mjs"},"./testing/message-delivery-store-conformance":{"types":"./dist/durable/MessageDeliveryStoreConformance.d.mts","default":"./dist/durable/MessageDeliveryStoreConformance.mjs"},"./testing/schedule-store-conformance":{"types":"./dist/durable/ScheduleStoreConformance.d.mts","default":"./dist/durable/ScheduleStoreConformance.mjs"},"./testing/submission-ledger-conformance":{"types":"./dist/durable/SubmissionLedgerConformance.d.mts","default":"./dist/durable/SubmissionLedgerConformance.mjs"},"./testing/subscription-store-conformance":{"types":"./dist/durable/SubscriptionStoreConformance.d.mts","default":"./dist/durable/SubscriptionStoreConformance.mjs"},"./testing/thread-store-conformance":{"types":"./dist/durable/ThreadStoreConformance.d.mts","default":"./dist/durable/ThreadStoreConformance.mjs"},"./thread":{"types":"./dist/core/Thread.d.mts","default":"./dist/core/Thread.mjs"},"./thread-context-history":{"types":"./dist/durable/ThreadContextHistory.d.mts","default":"./dist/durable/ThreadContextHistory.mjs"},"./thread-context-history-projection":{"types":"./dist/durable/ThreadContextHistoryProjection.d.mts","default":"./dist/durable/ThreadContextHistoryProjection.mjs"},"./thread-history":{"types":"./dist/engine/ThreadHistory.d.mts","default":"./dist/engine/ThreadHistory.mjs"},"./thread-invariants":{"types":"./dist/durable/ThreadInvariants.d.mts","default":"./dist/durable/ThreadInvariants.mjs"},"./thread-projection":{"types":"./dist/durable/ThreadProjection.d.mts","default":"./dist/durable/ThreadProjection.mjs"},"./thread-projection-maintenance":{"types":"./dist/durable/ThreadProjectionMaintenance.d.mts","default":"./dist/durable/ThreadProjectionMaintenance.mjs"},"./thread-store":{"types":"./dist/durable/ThreadStore.d.mts","default":"./dist/durable/ThreadStore.mjs"},"./tool-broker":{"types":"./dist/engine/ToolBroker.d.mts","default":"./dist/engine/ToolBroker.mjs"},"./tool-discovery":{"types":"./dist/capabilities/ToolDiscovery.d.mts","default":"./dist/capabilities/ToolDiscovery.mjs"},"./tool-exposure":{"types":"./dist/ToolExposure.d.mts","default":"./dist/ToolExposure.mjs"},"./tool-reconciler":{"types":"./dist/durable/ToolReconciler.d.mts","default":"./dist/durable/ToolReconciler.mjs"},"./tool-result":{"types":"./dist/core/ToolResult.d.mts","default":"./dist/core/ToolResult.mjs"},"./usage":{"types":"./dist/core/Usage.d.mts","default":"./dist/core/Usage.mjs"},"./wake-scheduler":{"types":"./dist/durable/WakeScheduler.d.mts","default":"./dist/durable/WakeScheduler.mjs"},"./web-capture":{"types":"./dist/capabilities/WebCapture.d.mts","default":"./dist/capabilities/WebCapture.mjs"},"./web-search":{"types":"./dist/capabilities/WebSearch.d.mts","default":"./dist/capabilities/WebSearch.mjs"},"./worker":{"types":"./dist/core/Worker.d.mts","default":"./dist/core/Worker.mjs"},"./worker-host":{"types":"./dist/durable/WorkerHost.d.mts","default":"./dist/durable/WorkerHost.mjs"}},"description":"Effect-native agents, execution, subagents, and sandbox contracts in one tree-shakeable package.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/effect-agent"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json","test":"vp test --passWithNoTests"}}
1
+ {"name":"effect-agent","version":"0.1.0-beta.92","devDependencies":{"@effect/platform-node":"4.0.0-rc.115","@effect/vitest":"4.0.0-rc.115","effect":"4.0.0-rc.115","typescript":"7.0.2","vite-plus":"0.3.0"},"peerDependencies":{"effect":"^4.0.0-rc.115"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./activity-store":{"types":"./dist/durable/ActivityStore.d.mts","default":"./dist/durable/ActivityStore.mjs"},"./admin":{"types":"./dist/durable/Admin.d.mts","default":"./dist/durable/Admin.mjs"},"./agent":{"types":"./dist/core/Agent.d.mts","default":"./dist/core/Agent.mjs"},"./agent-error":{"types":"./dist/core/AgentError.d.mts","default":"./dist/core/AgentError.mjs"},"./agent-policy":{"types":"./dist/core/AgentPolicy.d.mts","default":"./dist/core/AgentPolicy.mjs"},"./agent-registration":{"types":"./dist/durable/AgentRegistration.d.mts","default":"./dist/durable/AgentRegistration.mjs"},"./agent-runtime":{"types":"./dist/engine/AgentRuntime.d.mts","default":"./dist/engine/AgentRuntime.mjs"},"./agent-updates":{"types":"./dist/core/AgentUpdates.d.mts","default":"./dist/core/AgentUpdates.mjs"},"./approval":{"types":"./dist/capabilities/Approval.d.mts","default":"./dist/capabilities/Approval.mjs"},"./budget":{"types":"./dist/capabilities/Budget.d.mts","default":"./dist/capabilities/Budget.mjs"},"./code-executor":{"types":"./dist/sandbox/CodeExecutor.d.mts","default":"./dist/sandbox/CodeExecutor.mjs"},"./code-mode":{"types":"./dist/capabilities/CodeMode.d.mts","default":"./dist/capabilities/CodeMode.mjs"},"./commands":{"types":"./dist/capabilities/Commands.d.mts","default":"./dist/capabilities/Commands.mjs"},"./committed-activity":{"types":"./dist/durable/CommittedActivity.d.mts","default":"./dist/durable/CommittedActivity.mjs"},"./compaction":{"types":"./dist/engine/Compaction.d.mts","default":"./dist/engine/Compaction.mjs"},"./context-compactor":{"types":"./dist/engine/ContextCompactor.d.mts","default":"./dist/engine/ContextCompactor.mjs"},"./context-history":{"types":"./dist/engine/ContextHistory.d.mts","default":"./dist/engine/ContextHistory.mjs"},"./context-tools":{"types":"./dist/capabilities/ContextTools.d.mts","default":"./dist/capabilities/ContextTools.mjs"},"./context-window":{"types":"./dist/engine/ContextWindow.d.mts","default":"./dist/engine/ContextWindow.mjs"},"./digest":{"types":"./dist/durable/Digest.d.mts","default":"./dist/durable/Digest.mjs"},"./durable-agent-runtime":{"types":"./dist/durable/DurableAgentRuntime.d.mts","default":"./dist/durable/DurableAgentRuntime.mjs"},"./durable-failpoint":{"types":"./dist/durable/DurableFailpoint.d.mts","default":"./dist/durable/DurableFailpoint.mjs"},"./durable-step":{"types":"./dist/engine/DurableStep.d.mts","default":"./dist/engine/DurableStep.mjs"},"./ephemeral":{"types":"./dist/Ephemeral.d.mts","default":"./dist/Ephemeral.mjs"},"./event-source":{"types":"./dist/durable/EventSource.d.mts","default":"./dist/durable/EventSource.mjs"},"./git-hub-workflow-source":{"types":"./dist/durable/GitHubWorkflowSource.d.mts","default":"./dist/durable/GitHubWorkflowSource.mjs"},"./id-generator":{"types":"./dist/core/IdGenerator.d.mts","default":"./dist/core/IdGenerator.mjs"},"./identifiers":{"types":"./dist/core/Identifiers.d.mts","default":"./dist/core/Identifiers.mjs"},"./interactive-browser":{"types":"./dist/sandbox/InteractiveBrowser.d.mts","default":"./dist/sandbox/InteractiveBrowser.mjs"},"./mcp":{"types":"./dist/capabilities/Mcp.d.mts","default":"./dist/capabilities/Mcp.mjs"},"./mcp-client":{"types":"./dist/capabilities/McpClient.d.mts","default":"./dist/capabilities/McpClient.mjs"},"./memory":{"types":"./dist/core/Memory.d.mts","default":"./dist/core/Memory.mjs"},"./memory-namespace":{"types":"./dist/core/MemoryNamespace.d.mts","default":"./dist/core/MemoryNamespace.mjs"},"./memory-notes":{"types":"./dist/capabilities/MemoryNotes.d.mts","default":"./dist/capabilities/MemoryNotes.mjs"},"./memory-reference":{"types":"./dist/core/MemoryReference.d.mts","default":"./dist/core/MemoryReference.mjs"},"./memory-revalidation":{"types":"./dist/core/MemoryRevalidation.d.mts","default":"./dist/core/MemoryRevalidation.mjs"},"./memory-store":{"types":"./dist/core/MemoryStore.d.mts","default":"./dist/core/MemoryStore.mjs"},"./message-delivery":{"types":"./dist/durable/MessageDelivery.d.mts","default":"./dist/durable/MessageDelivery.mjs"},"./messaging":{"types":"./dist/capabilities/Messaging.d.mts","default":"./dist/capabilities/Messaging.mjs"},"./messaging-host":{"types":"./dist/engine/MessagingHost.d.mts","default":"./dist/engine/MessagingHost.mjs"},"./model-context":{"types":"./dist/capabilities/ModelContext.d.mts","default":"./dist/capabilities/ModelContext.mjs"},"./operation-authorizer":{"types":"./dist/durable/OperationAuthorizer.d.mts","default":"./dist/durable/OperationAuthorizer.mjs"},"./output":{"types":"./dist/engine/Output.d.mts","default":"./dist/engine/Output.mjs"},"./page-capture":{"types":"./dist/sandbox/PageCapture.d.mts","default":"./dist/sandbox/PageCapture.mjs"},"./page-crawl":{"types":"./dist/sandbox/PageCrawl.d.mts","default":"./dist/sandbox/PageCrawl.mjs"},"./page-screenshot":{"types":"./dist/sandbox/PageScreenshot.d.mts","default":"./dist/sandbox/PageScreenshot.mjs"},"./persistent-history":{"types":"./dist/durable/PersistentHistory.d.mts","default":"./dist/durable/PersistentHistory.mjs"},"./prepared-input-admission":{"types":"./dist/durable/PreparedInputAdmission.d.mts","default":"./dist/durable/PreparedInputAdmission.mjs"},"./protected-browser":{"types":"./dist/sandbox/ProtectedBrowser.d.mts","default":"./dist/sandbox/ProtectedBrowser.mjs"},"./receipt":{"types":"./dist/core/Receipt.d.mts","default":"./dist/core/Receipt.mjs"},"./records":{"types":"./dist/durable/Records.d.mts","default":"./dist/durable/Records.mjs"},"./recovery":{"types":"./dist/durable/Recovery.d.mts","default":"./dist/durable/Recovery.mjs"},"./redaction":{"types":"./dist/capabilities/Redaction.d.mts","default":"./dist/capabilities/Redaction.mjs"},"./remembering":{"types":"./dist/capabilities/Remembering.d.mts","default":"./dist/capabilities/Remembering.mjs"},"./remembering-store":{"types":"./dist/core/RememberingStore.d.mts","default":"./dist/core/RememberingStore.mjs"},"./run-event":{"types":"./dist/core/RunEvent.d.mts","default":"./dist/core/RunEvent.mjs"},"./run-event-sink":{"types":"./dist/engine/RunEventSink.d.mts","default":"./dist/engine/RunEventSink.mjs"},"./run-hooks":{"types":"./dist/capabilities/RunHooks.d.mts","default":"./dist/capabilities/RunHooks.mjs"},"./run-journal":{"types":"./dist/durable/RunJournal.d.mts","default":"./dist/durable/RunJournal.mjs"},"./run-options":{"types":"./dist/engine/RunOptions.d.mts","default":"./dist/engine/RunOptions.mjs"},"./run-policy-usage":{"types":"./dist/core/RunPolicyUsage.d.mts","default":"./dist/core/RunPolicyUsage.mjs"},"./sandbox":{"types":"./dist/sandbox/Sandbox.d.mts","default":"./dist/sandbox/Sandbox.mjs"},"./schedule":{"types":"./dist/durable/Schedule.d.mts","default":"./dist/durable/Schedule.mjs"},"./schedule-transition":{"types":"./dist/durable/ScheduleTransition.d.mts","default":"./dist/durable/ScheduleTransition.mjs"},"./scheduling":{"types":"./dist/durable/Scheduling.d.mts","default":"./dist/durable/Scheduling.mjs"},"./semantic-memory":{"types":"./dist/capabilities/SemanticMemory.d.mts","default":"./dist/capabilities/SemanticMemory.mjs"},"./semantic-memory-index":{"types":"./dist/core/SemanticMemoryIndex.d.mts","default":"./dist/core/SemanticMemoryIndex.mjs"},"./semantic-memory-revalidation":{"types":"./dist/core/SemanticMemoryRevalidation.d.mts","default":"./dist/core/SemanticMemoryRevalidation.mjs"},"./sql-memory-store":{"types":"./dist/durable/SqlMemoryStore.d.mts","default":"./dist/durable/SqlMemoryStore.mjs"},"./sql-message-delivery-store":{"types":"./dist/durable/SqlMessageDeliveryStore.d.mts","default":"./dist/durable/SqlMessageDeliveryStore.mjs"},"./sql-storage-v2-upgrade":{"types":"./dist/durable/SqlStorageV2Upgrade.d.mts","default":"./dist/durable/SqlStorageV2Upgrade.mjs"},"./sql-subscription-store":{"types":"./dist/durable/SqlSubscriptionStore.d.mts","default":"./dist/durable/SqlSubscriptionStore.mjs"},"./subagent":{"types":"./dist/capabilities/Subagent.d.mts","default":"./dist/capabilities/Subagent.mjs"},"./subagent-contract":{"types":"./dist/core/SubagentContract.d.mts","default":"./dist/core/SubagentContract.mjs"},"./subagent-host":{"types":"./dist/engine/SubagentHost.d.mts","default":"./dist/engine/SubagentHost.mjs"},"./subagent-reservations":{"types":"./dist/capabilities/SubagentReservations.d.mts","default":"./dist/capabilities/SubagentReservations.mjs"},"./submission-ledger":{"types":"./dist/durable/SubmissionLedger.d.mts","default":"./dist/durable/SubmissionLedger.mjs"},"./submission-status":{"types":"./dist/durable/SubmissionStatus.d.mts","default":"./dist/durable/SubmissionStatus.mjs"},"./subscription":{"types":"./dist/durable/Subscription.d.mts","default":"./dist/durable/Subscription.mjs"},"./subscription-input":{"types":"./dist/durable/SubscriptionInput.d.mts","default":"./dist/durable/SubscriptionInput.mjs"},"./subscription-tools":{"types":"./dist/durable/SubscriptionTools.d.mts","default":"./dist/durable/SubscriptionTools.mjs"},"./subscription-transition":{"types":"./dist/durable/SubscriptionTransition.d.mts","default":"./dist/durable/SubscriptionTransition.mjs"},"./subscriptions":{"types":"./dist/durable/Subscriptions.d.mts","default":"./dist/durable/Subscriptions.mjs"},"./testing/certification":{"types":"./dist/durable/Certification.d.mts","default":"./dist/durable/Certification.mjs"},"./testing/durable-failpoint-test-control":{"types":"./dist/durable/DurableFailpointTestControl.d.mts","default":"./dist/durable/DurableFailpointTestControl.mjs"},"./testing/message-delivery-store-conformance":{"types":"./dist/durable/MessageDeliveryStoreConformance.d.mts","default":"./dist/durable/MessageDeliveryStoreConformance.mjs"},"./testing/schedule-store-conformance":{"types":"./dist/durable/ScheduleStoreConformance.d.mts","default":"./dist/durable/ScheduleStoreConformance.mjs"},"./testing/submission-ledger-conformance":{"types":"./dist/durable/SubmissionLedgerConformance.d.mts","default":"./dist/durable/SubmissionLedgerConformance.mjs"},"./testing/subscription-store-conformance":{"types":"./dist/durable/SubscriptionStoreConformance.d.mts","default":"./dist/durable/SubscriptionStoreConformance.mjs"},"./testing/thread-store-conformance":{"types":"./dist/durable/ThreadStoreConformance.d.mts","default":"./dist/durable/ThreadStoreConformance.mjs"},"./thread":{"types":"./dist/core/Thread.d.mts","default":"./dist/core/Thread.mjs"},"./thread-context-history":{"types":"./dist/durable/ThreadContextHistory.d.mts","default":"./dist/durable/ThreadContextHistory.mjs"},"./thread-context-history-projection":{"types":"./dist/durable/ThreadContextHistoryProjection.d.mts","default":"./dist/durable/ThreadContextHistoryProjection.mjs"},"./thread-history":{"types":"./dist/engine/ThreadHistory.d.mts","default":"./dist/engine/ThreadHistory.mjs"},"./thread-invariants":{"types":"./dist/durable/ThreadInvariants.d.mts","default":"./dist/durable/ThreadInvariants.mjs"},"./thread-projection":{"types":"./dist/durable/ThreadProjection.d.mts","default":"./dist/durable/ThreadProjection.mjs"},"./thread-projection-maintenance":{"types":"./dist/durable/ThreadProjectionMaintenance.d.mts","default":"./dist/durable/ThreadProjectionMaintenance.mjs"},"./thread-store":{"types":"./dist/durable/ThreadStore.d.mts","default":"./dist/durable/ThreadStore.mjs"},"./tool-broker":{"types":"./dist/engine/ToolBroker.d.mts","default":"./dist/engine/ToolBroker.mjs"},"./tool-discovery":{"types":"./dist/capabilities/ToolDiscovery.d.mts","default":"./dist/capabilities/ToolDiscovery.mjs"},"./tool-exposure":{"types":"./dist/ToolExposure.d.mts","default":"./dist/ToolExposure.mjs"},"./tool-reconciler":{"types":"./dist/durable/ToolReconciler.d.mts","default":"./dist/durable/ToolReconciler.mjs"},"./tool-result":{"types":"./dist/core/ToolResult.d.mts","default":"./dist/core/ToolResult.mjs"},"./usage":{"types":"./dist/core/Usage.d.mts","default":"./dist/core/Usage.mjs"},"./wake-scheduler":{"types":"./dist/durable/WakeScheduler.d.mts","default":"./dist/durable/WakeScheduler.mjs"},"./web-capture":{"types":"./dist/capabilities/WebCapture.d.mts","default":"./dist/capabilities/WebCapture.mjs"},"./web-search":{"types":"./dist/capabilities/WebSearch.d.mts","default":"./dist/capabilities/WebSearch.mjs"},"./worker":{"types":"./dist/core/Worker.d.mts","default":"./dist/core/Worker.mjs"},"./worker-host":{"types":"./dist/durable/WorkerHost.d.mts","default":"./dist/durable/WorkerHost.mjs"}},"description":"Effect-native agents, execution, subagents, and sandbox contracts in one tree-shakeable package.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/effect-agent"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json","test":"vp test --passWithNoTests"}}
@@ -71,9 +71,9 @@ export const tool = Tool.make("WebSearch", {
71
71
 
72
72
  export const toolkit = Toolkit.make(tool);
73
73
 
74
- export interface Options {
74
+ export interface Options<T extends Tool.AnyProviderDefined = Tool.AnyProviderDefined> {
75
75
  /** Native upstream hosted search tool, for example OpenAiTool.WebSearch or AnthropicTool.WebSearch_20250305. */
76
- readonly tool: Tool.AnyProviderDefined;
76
+ readonly tool: T;
77
77
  /** One model request, with no automatic retries; defaults to 30 seconds. */
78
78
  readonly timeoutMillis?: number;
79
79
  /** Maximum encoded result size, including citations and usage; defaults to 32 KiB. */
@@ -97,7 +97,7 @@ const decodeSearchStatus = Schema.decodeUnknownOption(Schema.Struct({ status: Sc
97
97
  * Defects and interruption propagate; expected failures become failed tool results. Search
98
98
  * model usage is returned for host accounting, not silently charged to the parent Run budget.
99
99
  */
100
- export const layer = (options: Options) => {
100
+ export const layer = <T extends Tool.AnyProviderDefined>(options: Options<T>) => {
101
101
  if (
102
102
  !Tool.isProviderDefined(options.tool) ||
103
103
  !["web_search", "web_search_preview"].includes(options.tool.providerName)
@@ -119,26 +119,32 @@ export const layer = (options: Options) => {
119
119
  Effect.gen(function* () {
120
120
  const model = yield* LanguageModel.LanguageModel;
121
121
 
122
+ const generate = (query: string) =>
123
+ model.generateText({
124
+ prompt: query,
125
+ toolkit: searchToolkit,
126
+ toolChoice: "required",
127
+ disableToolCallResolution: true,
128
+ });
129
+
130
+ const encodingContext = yield* Effect.context<Effect.Services<ReturnType<typeof generate>>>();
131
+
132
+ const generateWithContext = (query: string) =>
133
+ Effect.provide(generate(query), encodingContext);
134
+
122
135
  return {
123
136
  WebSearch: Effect.fn("WebSearch.search")(function* (input) {
124
137
  const { query } = yield* Schema.decodeEffect(Parameters)(input).pipe(
125
138
  Effect.mapError(() => new Failure({ reason: "invalid-query" })),
126
139
  );
127
140
 
128
- const response = yield* model
129
- .generateText({
130
- prompt: query,
131
- toolkit: searchToolkit,
132
- toolChoice: "required",
133
- disableToolCallResolution: true,
134
- })
135
- .pipe(
136
- Effect.mapError(() => new Failure({ reason: "provider" })),
137
- Effect.timeoutOrElse({
138
- duration: timeoutMillis,
139
- orElse: () => Effect.fail(new Failure({ reason: "timeout" })),
140
- }),
141
- );
141
+ const response = yield* generateWithContext(query).pipe(
142
+ Effect.mapError(() => new Failure({ reason: "provider" })),
143
+ Effect.timeoutOrElse({
144
+ duration: timeoutMillis,
145
+ orElse: () => Effect.fail(new Failure({ reason: "timeout" })),
146
+ }),
147
+ );
142
148
 
143
149
  if (
144
150
  response.toolResults.some((result) => {
@@ -0,0 +1,14 @@
1
+ import { Schema, SchemaParser, SchemaTransformation } from "effect";
2
+
3
+ /** Keep strict parsing on nested values even when an outer parser uses its defaults. */
4
+ export const strictSchema = <S extends Schema.Top>(schema: S) =>
5
+ Schema.declareConstructor<S["Type"], S["Encoded"]>()(
6
+ [schema],
7
+ ([codec]) =>
8
+ (value, _ast, options) =>
9
+ SchemaParser.decodeUnknownEffect(codec)(value, { ...options, onExcessProperty: "error" }),
10
+ {
11
+ toCodecJson: ([codec]) =>
12
+ Schema.link<S["Encoded"]>()(codec, SchemaTransformation.passthrough()),
13
+ },
14
+ );