effect-agent 0.1.0-beta.91 → 0.1.0-beta.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AgentRuntime-CHipL2jG.mjs → AgentRuntime-BPjQM1Nv.mjs} +2 -2
- package/dist/AgentRuntime-BPjQM1Nv.mjs.map +1 -0
- package/dist/{DurableAgentRuntime-D7gDKGjH.mjs → DurableAgentRuntime-CdrBuKZY.mjs} +4 -4
- package/dist/{DurableAgentRuntime-D7gDKGjH.mjs.map → DurableAgentRuntime-CdrBuKZY.mjs.map} +1 -1
- package/dist/{EventSource-OqS_P9ug.d.mts → EventSource-c6GRTCsl.d.mts} +3 -3
- package/dist/{Ephemeral.d.mts → InMemory.d.mts} +5 -3
- package/dist/{Ephemeral.mjs → InMemory.mjs} +6 -4
- package/dist/InMemory.mjs.map +1 -0
- package/dist/{PreparedInputAdmission-C4HbjHgl.d.mts → PreparedInputAdmission-QzFbW2LQ.d.mts} +4 -4
- package/dist/Records-C9cezOEf.mjs +799 -0
- package/dist/Records-C9cezOEf.mjs.map +1 -0
- package/dist/{Records-BAGkekt8.d.mts → Records-vFp_ZQ9Y.d.mts} +21 -3
- package/dist/{RunJournal-Cgg1kNvc.mjs → RunJournal-lwbrh2hZ.mjs} +2 -2
- package/dist/{RunJournal-Cgg1kNvc.mjs.map → RunJournal-lwbrh2hZ.mjs.map} +1 -1
- package/dist/{Schedule-H3SEYX9g.d.mts → Schedule-BkZvKyMw.d.mts} +2 -2
- package/dist/{Scheduling-C9aIP8zT.mjs → Scheduling-D0QqOoeT.mjs} +2 -2
- package/dist/{Scheduling-C9aIP8zT.mjs.map → Scheduling-D0QqOoeT.mjs.map} +1 -1
- package/dist/{Subagent-U5qXOFE8.mjs → Subagent-CnTzCy8k.mjs} +2 -2
- package/dist/{Subagent-U5qXOFE8.mjs.map → Subagent-CnTzCy8k.mjs.map} +1 -1
- package/dist/{Subscription-BEP8oQO5.d.mts → Subscription-CKQ0KDHN.d.mts} +3 -3
- package/dist/{SubscriptionInput-vAAOBrK7.d.mts → SubscriptionInput-Cth8F_7b.d.mts} +3 -3
- package/dist/capabilities/Subagent.mjs +1 -1
- package/dist/capabilities/WebSearch.d.mts +3 -3
- package/dist/capabilities/WebSearch.mjs +9 -6
- package/dist/capabilities/WebSearch.mjs.map +1 -1
- package/dist/durable/ActivityStore.d.mts +1 -1
- package/dist/durable/ActivityStore.mjs +1 -1
- package/dist/durable/Admin.d.mts +1 -1
- package/dist/durable/Admin.mjs +1 -1
- package/dist/durable/AgentRegistration.d.mts +1 -1
- package/dist/durable/Certification.d.mts +1 -1
- package/dist/durable/CommittedActivity.d.mts +1 -1
- package/dist/durable/CommittedActivity.mjs +1 -1
- package/dist/durable/Digest.d.mts +1 -1
- package/dist/durable/Digest.mjs +1 -1
- package/dist/durable/DurableAgentRuntime.d.mts +1 -1
- package/dist/durable/DurableAgentRuntime.mjs +1 -1
- package/dist/durable/EventSource.d.mts +1 -1
- package/dist/durable/EventSource.mjs +1 -1
- package/dist/durable/GitHubWorkflowSource.d.mts +48 -6
- package/dist/durable/GitHubWorkflowSource.mjs +13 -13
- package/dist/durable/GitHubWorkflowSource.mjs.map +1 -1
- package/dist/durable/MessageDelivery.d.mts +3 -3
- package/dist/durable/MessageDelivery.mjs +1 -1
- package/dist/durable/MessageDeliveryStoreConformance.d.mts +39 -39
- package/dist/durable/MessageDeliveryStoreConformance.mjs +1 -1
- package/dist/durable/PersistentHistory.d.mts +1 -1
- package/dist/durable/PersistentHistory.mjs +2 -2
- package/dist/durable/PreparedInputAdmission.d.mts +1 -1
- package/dist/durable/Records.d.mts +1 -1
- package/dist/durable/Records.mjs +2 -795
- package/dist/durable/Recovery.d.mts +1 -1
- package/dist/durable/Recovery.mjs +1 -1
- package/dist/durable/RunJournal.d.mts +1 -1
- package/dist/durable/RunJournal.mjs +1 -1
- package/dist/durable/Schedule.d.mts +1 -1
- package/dist/durable/Schedule.mjs +1 -1
- package/dist/durable/ScheduleStoreConformance.d.mts +1 -1
- package/dist/durable/ScheduleStoreConformance.mjs +1 -1
- package/dist/durable/ScheduleTransition.d.mts +1 -1
- package/dist/durable/ScheduleTransition.mjs +1 -1
- package/dist/durable/Scheduling.d.mts +2 -2
- package/dist/durable/Scheduling.mjs +1 -1
- package/dist/durable/SqlStorageV2Upgrade.d.mts +2 -2
- package/dist/durable/SqlStorageV2Upgrade.mjs +1 -1
- package/dist/durable/SqlSubscriptionStore.d.mts +2 -2
- package/dist/durable/SqlSubscriptionStore.mjs +1 -1
- package/dist/durable/SubmissionLedger.d.mts +1 -1
- package/dist/durable/SubmissionLedger.mjs +1 -1
- package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
- package/dist/durable/SubmissionLedgerConformance.mjs +1 -1
- package/dist/durable/SubmissionStatus.d.mts +1 -1
- package/dist/durable/Subscription.d.mts +1 -1
- package/dist/durable/Subscription.mjs +1 -1
- package/dist/durable/SubscriptionInput.d.mts +1 -1
- package/dist/durable/SubscriptionInput.mjs +1 -1
- package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
- package/dist/durable/SubscriptionStoreConformance.mjs +1 -1
- package/dist/durable/SubscriptionTools.d.mts +3 -3
- package/dist/durable/SubscriptionTransition.d.mts +1 -1
- package/dist/durable/SubscriptionTransition.mjs +1 -1
- package/dist/durable/Subscriptions.d.mts +5 -5
- package/dist/durable/Subscriptions.mjs +1 -1
- package/dist/durable/ThreadContextHistory.d.mts +1 -1
- package/dist/durable/ThreadContextHistory.mjs +1 -1
- package/dist/durable/ThreadContextHistoryProjection.d.mts +1 -1
- package/dist/durable/ThreadContextHistoryProjection.mjs +1 -1
- package/dist/durable/ThreadInvariants.d.mts +1 -1
- package/dist/durable/ThreadInvariants.mjs +1 -1
- package/dist/durable/ThreadProjection.d.mts +1 -1
- package/dist/durable/ThreadProjection.mjs +1 -1
- package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
- package/dist/durable/ThreadStore.d.mts +1 -1
- package/dist/durable/ThreadStore.mjs +1 -1
- package/dist/durable/ThreadStoreConformance.d.mts +1 -1
- package/dist/durable/ThreadStoreConformance.mjs +1 -1
- package/dist/durable/ToolReconciler.mjs +1 -1
- package/dist/durable/WorkerHost.d.mts +1 -1
- package/dist/engine/AgentRuntime.mjs +1 -1
- package/dist/index.d.mts +8 -8
- package/dist/index.mjs +8 -8
- package/dist/sandbox/InteractiveBrowser.mjs +2 -2
- package/dist/sandbox/InteractiveBrowser.mjs.map +1 -1
- package/dist/sandbox/PageCapture.mjs +4 -4
- package/dist/sandbox/PageCapture.mjs.map +1 -1
- package/dist/sandbox/ProtectedBrowser.mjs +1 -1
- package/dist/sandbox/ProtectedBrowser.mjs.map +1 -1
- package/package.json +1 -1
- package/src/{Ephemeral.ts → InMemory.ts} +2 -0
- package/src/capabilities/WebSearch.ts +23 -17
- package/src/core/internal/strict-schema.ts +14 -0
- package/src/durable/GitHubWorkflowSource.ts +32 -38
- package/src/durable/Records.ts +8 -4
- package/src/engine/internal/primitive-delta.ts +1 -1
- package/src/index.ts +1 -1
- package/src/sandbox/InteractiveBrowser.ts +2 -2
- package/src/sandbox/PageCapture.ts +6 -7
- package/src/sandbox/ProtectedBrowser.ts +1 -1
- package/dist/AgentRuntime-CHipL2jG.mjs.map +0 -1
- package/dist/Ephemeral.mjs.map +0 -1
- package/dist/durable/Records.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -14,7 +14,7 @@ import { n as MessagingHost_exports } from "./MessagingHost-CWi_PP3g.mjs";
|
|
|
14
14
|
import { t as SubagentHost_exports } from "./engine/SubagentHost.mjs";
|
|
15
15
|
import { t as Thread_exports } from "./core/Thread.mjs";
|
|
16
16
|
import { t as ThreadHistory_exports } from "./engine/ThreadHistory.mjs";
|
|
17
|
-
import { t as AgentRuntime_exports } from "./AgentRuntime-
|
|
17
|
+
import { t as AgentRuntime_exports } from "./AgentRuntime-BPjQM1Nv.mjs";
|
|
18
18
|
import { t as ContextWindow_exports } from "./engine/ContextWindow.mjs";
|
|
19
19
|
import { t as DurableStep_exports } from "./engine/DurableStep.mjs";
|
|
20
20
|
import { t as ContextCompactor_exports } from "./engine/ContextCompactor.mjs";
|
|
@@ -34,7 +34,7 @@ import { t as Compaction_exports } from "./engine/Compaction.mjs";
|
|
|
34
34
|
import { t as ContextHistory_exports } from "./engine/ContextHistory.mjs";
|
|
35
35
|
import { t as ContextTools_exports } from "./capabilities/ContextTools.mjs";
|
|
36
36
|
import { t as SubagentReservations_exports } from "./capabilities/SubagentReservations.mjs";
|
|
37
|
-
import { t as
|
|
37
|
+
import { t as InMemory_exports } from "./InMemory.mjs";
|
|
38
38
|
import { t as InteractiveBrowser_exports } from "./sandbox/InteractiveBrowser.mjs";
|
|
39
39
|
import { t as Mcp_exports } from "./capabilities/Mcp.mjs";
|
|
40
40
|
import { t as McpClient_exports } from "./capabilities/McpClient.mjs";
|
|
@@ -56,12 +56,12 @@ import { t as RunHooks_exports } from "./capabilities/RunHooks.mjs";
|
|
|
56
56
|
import { t as SemanticMemoryIndex_exports } from "./core/SemanticMemoryIndex.mjs";
|
|
57
57
|
import { t as SemanticMemoryRevalidation_exports } from "./core/SemanticMemoryRevalidation.mjs";
|
|
58
58
|
import { t as SemanticMemory_exports } from "./capabilities/SemanticMemory.mjs";
|
|
59
|
-
import { r as Subagent_exports } from "./Subagent-
|
|
59
|
+
import { r as Subagent_exports } from "./Subagent-CnTzCy8k.mjs";
|
|
60
60
|
import { t as ToolDiscovery_exports } from "./capabilities/ToolDiscovery.mjs";
|
|
61
61
|
import { t as ToolExposure_exports } from "./ToolExposure.mjs";
|
|
62
62
|
import { t as WebCapture_exports } from "./capabilities/WebCapture.mjs";
|
|
63
63
|
import { t as WebSearch_exports } from "./capabilities/WebSearch.mjs";
|
|
64
|
-
import {
|
|
64
|
+
import { A as Records_exports } from "./Records-C9cezOEf.mjs";
|
|
65
65
|
import { t as ActivityStore_exports } from "./durable/ActivityStore.mjs";
|
|
66
66
|
import { t as SubmissionLedger_exports } from "./durable/SubmissionLedger.mjs";
|
|
67
67
|
import { t as Recovery_exports } from "./durable/Recovery.mjs";
|
|
@@ -75,8 +75,8 @@ import { t as Schedule_exports } from "./durable/Schedule.mjs";
|
|
|
75
75
|
import { t as PreparedInputAdmission_exports } from "./durable/PreparedInputAdmission.mjs";
|
|
76
76
|
import { t as Subscription_exports } from "./durable/Subscription.mjs";
|
|
77
77
|
import { t as MessageDelivery_exports } from "./durable/MessageDelivery.mjs";
|
|
78
|
-
import { n as DurableAgentRuntime_exports } from "./DurableAgentRuntime-
|
|
79
|
-
import { n as RunJournal_exports } from "./RunJournal-
|
|
78
|
+
import { n as DurableAgentRuntime_exports } from "./DurableAgentRuntime-CdrBuKZY.mjs";
|
|
79
|
+
import { n as RunJournal_exports } from "./RunJournal-lwbrh2hZ.mjs";
|
|
80
80
|
import { t as WorkerHost_exports } from "./durable/WorkerHost.mjs";
|
|
81
81
|
import { t as OperationAuthorizer_exports } from "./durable/OperationAuthorizer.mjs";
|
|
82
82
|
import { t as SubmissionStatus_exports } from "./durable/SubmissionStatus.mjs";
|
|
@@ -86,7 +86,7 @@ import { t as WakeScheduler_exports } from "./durable/WakeScheduler.mjs";
|
|
|
86
86
|
import { t as EventSource_exports } from "./durable/EventSource.mjs";
|
|
87
87
|
import { t as PersistentHistory_exports } from "./durable/PersistentHistory.mjs";
|
|
88
88
|
import { t as ScheduleTransition_exports } from "./durable/ScheduleTransition.mjs";
|
|
89
|
-
import { i as Scheduling_exports } from "./Scheduling-
|
|
89
|
+
import { i as Scheduling_exports } from "./Scheduling-D0QqOoeT.mjs";
|
|
90
90
|
import { t as SubscriptionInput_exports } from "./durable/SubscriptionInput.mjs";
|
|
91
91
|
import { t as Subscriptions_exports } from "./durable/Subscriptions.mjs";
|
|
92
92
|
import { t as SubscriptionTools_exports } from "./durable/SubscriptionTools.mjs";
|
|
@@ -95,4 +95,4 @@ import { t as ThreadProjection_exports } from "./durable/ThreadProjection.mjs";
|
|
|
95
95
|
import { t as ThreadProjectionMaintenance_exports } from "./durable/ThreadProjectionMaintenance.mjs";
|
|
96
96
|
import { t as ThreadContextHistoryProjection_exports } from "./durable/ThreadContextHistoryProjection.mjs";
|
|
97
97
|
import { t as ThreadContextHistory_exports } from "./durable/ThreadContextHistory.mjs";
|
|
98
|
-
export { ActivityStore_exports as ActivityStore, Admin_exports as Admin, Agent_exports as Agent, AgentError_exports as AgentError, AgentPolicy_exports as AgentPolicy, AgentRegistration_exports as AgentRegistration, AgentRuntime_exports as AgentRuntime, AgentUpdates_exports as AgentUpdates, Approval_exports as Approval, Budget_exports as Budget, CodeExecutor_exports as CodeExecutor, CodeMode_exports as CodeMode, Commands_exports as Commands, CommittedActivity_exports as CommittedActivity, Compaction_exports as Compaction, ContextCompactor_exports as ContextCompactor, ContextHistory_exports as ContextHistory, ContextTools_exports as ContextTools, ContextWindow_exports as ContextWindow, Digest_exports as Digest, DurableAgentRuntime_exports as DurableAgentRuntime, DurableFailpoint_exports as DurableFailpoint, DurableStep_exports as DurableStep,
|
|
98
|
+
export { ActivityStore_exports as ActivityStore, Admin_exports as Admin, Agent_exports as Agent, AgentError_exports as AgentError, AgentPolicy_exports as AgentPolicy, AgentRegistration_exports as AgentRegistration, AgentRuntime_exports as AgentRuntime, AgentUpdates_exports as AgentUpdates, Approval_exports as Approval, Budget_exports as Budget, CodeExecutor_exports as CodeExecutor, CodeMode_exports as CodeMode, Commands_exports as Commands, CommittedActivity_exports as CommittedActivity, Compaction_exports as Compaction, ContextCompactor_exports as ContextCompactor, ContextHistory_exports as ContextHistory, ContextTools_exports as ContextTools, ContextWindow_exports as ContextWindow, Digest_exports as Digest, DurableAgentRuntime_exports as DurableAgentRuntime, DurableFailpoint_exports as DurableFailpoint, DurableStep_exports as DurableStep, EventSource_exports as EventSource, IdGenerator_exports as IdGenerator, Identifiers_exports as Identifiers, InMemory_exports as InMemory, InteractiveBrowser_exports as InteractiveBrowser, Mcp_exports as Mcp, McpClient_exports as McpClient, Memory_exports as Memory, MemoryNamespace_exports as MemoryNamespace, MemoryNotes_exports as MemoryNotes, MemoryReference_exports as MemoryReference, MemoryRevalidation_exports as MemoryRevalidation, MemoryStore_exports as MemoryStore, MessageDelivery_exports as MessageDelivery, Messaging_exports as Messaging, MessagingHost_exports as MessagingHost, ModelContext_exports as ModelContext, OperationAuthorizer_exports as OperationAuthorizer, Output_exports as Output, PageCapture_exports as PageCapture, PageCrawl_exports as PageCrawl, PageScreenshot_exports as PageScreenshot, PersistentHistory_exports as PersistentHistory, PreparedInputAdmission_exports as PreparedInputAdmission, ProtectedBrowser_exports as ProtectedBrowser, Receipt_exports as Receipt, Records_exports as Records, Recovery_exports as Recovery, Redaction_exports as Redaction, Remembering_exports as Remembering, RememberingStore_exports as RememberingStore, RunEvent_exports as RunEvent, RunEventSink_exports as RunEventSink, RunHooks_exports as RunHooks, RunJournal_exports as RunJournal, RunOptions_exports as RunOptions, RunPolicyUsage_exports as RunPolicyUsage, Sandbox_exports as Sandbox, Schedule_exports as Schedule, ScheduleTransition_exports as ScheduleTransition, Scheduling_exports as Scheduling, SemanticMemory_exports as SemanticMemory, SemanticMemoryIndex_exports as SemanticMemoryIndex, SemanticMemoryRevalidation_exports as SemanticMemoryRevalidation, Subagent_exports as Subagent, SubagentContract_exports as SubagentContract, SubagentHost_exports as SubagentHost, SubagentReservations_exports as SubagentReservations, SubmissionLedger_exports as SubmissionLedger, SubmissionStatus_exports as SubmissionStatus, Subscription_exports as Subscription, SubscriptionInput_exports as SubscriptionInput, SubscriptionTools_exports as SubscriptionTools, SubscriptionTransition_exports as SubscriptionTransition, Subscriptions_exports as Subscriptions, Thread_exports as Thread, ThreadContextHistory_exports as ThreadContextHistory, ThreadContextHistoryProjection_exports as ThreadContextHistoryProjection, ThreadHistory_exports as ThreadHistory, ThreadInvariants_exports as ThreadInvariants, ThreadProjection_exports as ThreadProjection, ThreadProjectionMaintenance_exports as ThreadProjectionMaintenance, ThreadStore_exports as ThreadStore, ToolBroker_exports as ToolBroker, ToolDiscovery_exports as ToolDiscovery, ToolExposure_exports as ToolExposure, ToolReconciler_exports as ToolReconciler, ToolResult_exports as ToolResult, Usage_exports as Usage, WakeScheduler_exports as WakeScheduler, WebCapture_exports as WebCapture, WebSearch_exports as WebSearch, Worker_exports as Worker, WorkerHost_exports as WorkerHost };
|
|
@@ -63,14 +63,14 @@ const InteractiveBrowserNetworkPolicy = Schema.Union([
|
|
|
63
63
|
Schema.TaggedStruct("ExactHosts", { allowedHosts: Schema.Array(InteractiveBrowserHost).check(Schema.isMinLength(1), Schema.isMaxLength(64), Schema.isUnique()) }),
|
|
64
64
|
Schema.TaggedStruct("PublicWeb", {}),
|
|
65
65
|
Schema.TaggedStruct("Unrestricted", {})
|
|
66
|
-
])
|
|
66
|
+
]);
|
|
67
67
|
/** Finite per-pass budgets. The elapsed ceiling is one hour; provider idle limits may be shorter. */
|
|
68
68
|
var InteractiveBrowserPolicy = class extends Schema.Class("InteractiveBrowserPolicy")(Schema.Struct({
|
|
69
69
|
network: InteractiveBrowserNetworkPolicy,
|
|
70
70
|
maxActions: PositiveInt.check(Schema.isLessThanOrEqualTo(1e3)),
|
|
71
71
|
maxElapsedMillis: PositiveInt.check(Schema.isLessThanOrEqualTo(36e5)),
|
|
72
72
|
maxReturnedBytes: PositiveInt.check(Schema.isLessThanOrEqualTo(8388608))
|
|
73
|
-
})
|
|
73
|
+
})) {};
|
|
74
74
|
var BrowserNavigateRequest = class extends Schema.Class("BrowserNavigateRequest")({ url: InteractiveBrowserTargetUrl }) {};
|
|
75
75
|
var BrowserReadTextRequest = class extends Schema.Class("BrowserReadTextRequest")({ selector: Schema.optionalKey(Selector) }) {};
|
|
76
76
|
var BrowserFillRequest = class extends Schema.Class("BrowserFillRequest")({
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAM,cAAc,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;AAC5D,MAAM,cAAc,OAAO,OAAO,MAAM,OAAO,YAAY,OAAe,CAAC;AAC3E,MAAM,iBAAiB,OAAO,OAAO,MAAM,OAAO,YAAY,IAAQ,CAAC;AACvE,MAAM,WAAW,OAAO,eAAe,MAAM,OAAO,YAAY,IAAK,CAAC;AACtE,MAAM,aAAa,OAAO,OAAO,MAAM,OAAO,YAAY,KAAS,CAAC;AACpE,MAAM,cAAc,OAAO,IAAI,MAAM,OAAO,UAAU;CAAE,SAAS;CAAU,SAAS;AAAQ,CAAC,CAAC;AAC9F,MAAM,YAAY,OAAO,oBAAoB,OAAO,aAAa;;AAGjE,MAAa,8BAA8B,OAAO,eAAe,MAC/D,OAAO,YAAY,IAAQ,GAC3B,OAAO,YACJ,UAAU;CACT,MAAM,SAAS,UAAU,KAAK;CAE9B,IAAI,OAAO,OAAO,MAAM,GAAG,OAAO;CAClC,MAAM,MAAM,OAAO;CAEnB,QACG,IAAI,aAAa,WAAW,IAAI,aAAa,aAC9C,IAAI,aAAa,MACjB,IAAI,aAAa,MACjB,IAAI,aAAa;AAErB,GACA,EAAE,OAAO,6DAA6D,CACxE,CACF;;AAKA,MAAa,yBAAyB,OAAO,eAAe,MAC1D,OAAO,YAAY,GAAG,GACtB,OAAO,YACJ,UAAU;CACT,IAAI,MAAM,SAAS,GAAG,GAAG,OAAO;CAChC,MAAM,SAAS,UAAU,WAAW,MAAM,EAAE;CAE5C,IAAI,OAAO,OAAO,MAAM,GAAG,OAAO;CAClC,MAAM,MAAM,OAAO;CAEnB,OACE,IAAI,aAAa,YACjB,IAAI,aAAa,MACjB,IAAI,aAAa,MACjB,IAAI,SAAS;AAEjB,GACA,EAAE,OAAO,mDAAmD,CAC9D,CACF;;;;;;;;AAWA,MAAa,kCAAkC,OAAO,MAAM;CAC1D,OAAO,aAAa,cAAc,EAChC,cAAc,OAAO,MAAM,sBAAsB,CAAC,CAAC,MACjD,OAAO,YAAY,CAAC,GACpB,OAAO,YAAY,EAAE,GACrB,OAAO,SAAS,CAClB,EACF,CAAC;CACD,OAAO,aAAa,aAAa,CAAC,CAAC;CACnC,OAAO,aAAa,gBAAgB,CAAC,CAAC;AACxC,CAAC;;AAKD,IAAa,2BAAb,cAA8C,OAAO,MACnD,0BACF,CAAC,CACC,OAAO,OAAO;CACZ,SAAS;CACT,YAAY,YAAY,MAAM,OAAO,oBAAoB,GAAK,CAAC;CAC/D,kBAAkB,YAAY,MAAM,OAAO,oBAAoB,IAAW,CAAC;CAC3E,kBAAkB,YAAY,MAAM,OAAO,oBAAoB,OAAe,CAAC;AACjF,CAAC,CACH,CAAC,CAAC,CAAC;AAEH,IAAa,yBAAb,cAA4C,OAAO,MACjD,wBACF,CAAC,CAAC,EAAE,KAAK,4BAA4B,CAAC,CAAC,CAAC,CAAC;AAEzC,IAAa,yBAAb,cAA4C,OAAO,MACjD,wBACF,CAAC,CAAC,EAAE,UAAU,OAAO,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAE/C,IAAa,qBAAb,cAAwC,OAAO,MAA0B,oBAAoB,CAAC,CAAC;CAC7F,UAAU;CACV,OAAO;AACT,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,sBAAb,cAAyC,OAAO,MAA2B,qBAAqB,CAAC,CAAC,EAChG,UAAU,SACZ,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,2BAAb,cAA8C,OAAO,MACnD,0BACF,CAAC,CAAC,EAAE,UAAU,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;;AAGjC,IAAa,uBAAb,cAA0C,OAAO,MAC/C,sBACF,CAAC,CAAC;CACA,QAAQ;CACR,QAAQ;AACV,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,0BAAb,cAA6C,OAAO,MAClD,yBACF,CAAC,CAAC,EAAE,KAAK,4BAA4B,CAAC,CAAC,CAAC,CAAC;AAEzC,IAAa,oBAAb,cAAuC,OAAO,MAAyB,mBAAmB,CAAC,CAAC,EAC1F,MAAM,YACR,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,sBAAb,cAAyC,OAAO,MAA2B,qBAAqB,CAAC,CAAC,EAChG,KAAK,4BACP,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,sCAAb,cAAyD,OAAO,YAAiD,CAAC,CAChH,uCACA;CAAE,gBAAgB;CAAuB,SAAS;AAAe,CACnE,CAAC,CAAC,CAAC;AAEH,IAAa,8BAAb,cAAiD,OAAO,YAAyC,CAAC,CAChG,+BACA;CAAE,gBAAgB;CAAuB,SAAS;AAAe,CACnE,CAAC,CAAC,CAAC;AAEH,IAAa,kCAAb,cAAqD,OAAO,YAA6C,CAAC,CACxG,mCACA;CAAE,gBAAgB;CAAuB,SAAS;AAAe,CACnE,CAAC,CAAC,CAAC;AAEH,IAAa,iCAAb,cAAoD,OAAO,YAA4C,CAAC,CACtG,kCACA;CAAE,gBAAgB;CAAuB,SAAS;AAAe,CACnE,CAAC,CAAC,CAAC;AAEH,IAAa,gCAAb,cAAmD,OAAO,YAA2C,CAAC,CACpG,iCACA;CACE,gBAAgB;CAChB,WAAW,OAAO,SAAS;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,SAAS;CACT,OAAO,OAAO,YAAY,OAAO,OAAO,CAAC;AAC3C,CACF,CAAC,CAAC,CAAC;AAEH,IAAa,kCAAb,cAAqD,OAAO,YAA6C,CAAC,CACxG,mCACA;CACE,gBAAgB;CAChB,SAAS;CACT,OAAO,OAAO,YAAY,OAAO,OAAO,CAAC;AAC3C,CACF,CAAC,CAAC,CAAC;AAEH,IAAa,+BAAb,cAAkD,OAAO,YAA0C,CAAC,CAClG,gCACA;CACE,gBAAgB;CAChB,OAAO,OAAO,SAAS;EAAC;EAAW;EAAW;CAAgB,CAAC;CAC/D,SAAS;CACT,UAAU,OAAO;CACjB,SAAS;AACX,CACF,CAAC,CAAC,CAAC;AAEH,IAAa,qCAAb,cAAwD,OAAO,YAAgD,CAAC,CAC9G,sCACA;CACE,gBAAgB;CAChB,SAAS,OAAO,SAAS;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,SAAS;AACX,CACF,CAAC,CAAC,CAAC;AAEH,MAAa,0BAA0B,OAAO,MAAM;CAClD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AA6BD,IAAa,qBAAb,cAAwC,QAAQ,QAO9C,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC"}
|
|
@@ -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())
|
|
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
|
-
})
|
|
176
|
-
const
|
|
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 (
|
|
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
|
-
})
|
|
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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"}
|