@effect-uai/core 0.11.0 → 0.12.1
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/{AiError-Bf1pq4BB.d.mts → AiError-eLV9t1lU.d.mts} +12 -16
- package/dist/AiError-eLV9t1lU.d.mts.map +1 -0
- package/dist/{Audio-CR7CSljJ.d.mts → Audio-60lKKHxS.d.mts} +4 -5
- package/dist/Audio-60lKKHxS.d.mts.map +1 -0
- package/dist/{Image-C4vuBmu0.d.mts → Image-BK8-4H6s.d.mts} +12 -14
- package/dist/Image-BK8-4H6s.d.mts.map +1 -0
- package/dist/{Items-BWNu6VGp.d.mts → Items-SfUabNuB.d.mts} +92 -81
- package/dist/Items-SfUabNuB.d.mts.map +1 -0
- package/dist/{Loop-D8nWpowc.d.mts → Loop-B54AB1ME.d.mts} +19 -21
- package/dist/Loop-B54AB1ME.d.mts.map +1 -0
- package/dist/{Media-D_CpcM1Z.d.mts → Media-DwgpifPD.d.mts} +1 -1
- package/dist/Media-DwgpifPD.d.mts.map +1 -0
- package/dist/{SandboxError-CIrVDOMV.d.mts → SandboxError-BN8b28Bh.d.mts} +11 -15
- package/dist/SandboxError-BN8b28Bh.d.mts.map +1 -0
- package/dist/{StructuredFormat-DHaUJBdd.d.mts → StructuredFormat-BlZhyOsi.d.mts} +3 -7
- package/dist/StructuredFormat-BlZhyOsi.d.mts.map +1 -0
- package/dist/{Tool-CXFHCQrT.d.mts → Tool-DE-rnvkw.d.mts} +5 -8
- package/dist/Tool-DE-rnvkw.d.mts.map +1 -0
- package/dist/{ToolEvent-nVijCrvm.d.mts → ToolEvent-D99MGQYH.d.mts} +56 -63
- package/dist/ToolEvent-D99MGQYH.d.mts.map +1 -0
- package/dist/{ToolResult-CQqKkcDa.d.mts → ToolResult-Cj8ChodL.d.mts} +49 -54
- package/dist/ToolResult-Cj8ChodL.d.mts.map +1 -0
- package/dist/{Toolkit-BYPwwu-j.d.mts → Toolkit-BEZrNPTI.d.mts} +13 -16
- package/dist/Toolkit-BEZrNPTI.d.mts.map +1 -0
- package/dist/browser/Browser.d.mts +11 -7
- package/dist/browser/Browser.d.mts.map +1 -1
- package/dist/browser/Browser.mjs +1 -1
- package/dist/browser/Browser.mjs.map +1 -1
- package/dist/browser/BrowserError.d.mts +9 -13
- package/dist/browser/BrowserError.d.mts.map +1 -1
- package/dist/browser/BrowserError.mjs +1 -1
- package/dist/browser/BrowserError.mjs.map +1 -1
- package/dist/browser/BrowserTool.d.mts +33 -36
- package/dist/browser/BrowserTool.d.mts.map +1 -1
- package/dist/browser/BrowserTool.mjs +1 -1
- package/dist/browser/BrowserTool.mjs.map +1 -1
- package/dist/capabilities/Capabilities.d.mts +8 -6
- package/dist/capabilities/Capabilities.d.mts.map +1 -1
- package/dist/capabilities/Capabilities.mjs +1 -1
- package/dist/capabilities/Capabilities.mjs.map +1 -1
- package/dist/dist-BaenoU1A.mjs +145 -0
- package/dist/dist-BaenoU1A.mjs.map +1 -0
- package/dist/{dist-C0m0QnUP.mjs → dist-nohcnkD6.mjs} +16 -15
- package/dist/dist-nohcnkD6.mjs.map +1 -0
- package/dist/domain/AiError.d.mts +1 -1
- package/dist/domain/AiError.mjs +1 -1
- package/dist/domain/AiError.mjs.map +1 -1
- package/dist/domain/Audio.d.mts +1 -1
- package/dist/domain/Audio.mjs +1 -1
- package/dist/domain/Citation.d.mts +0 -2
- package/dist/domain/Citation.d.mts.map +1 -1
- package/dist/domain/Citation.mjs +1 -1
- package/dist/domain/Image.d.mts +1 -1
- package/dist/domain/Image.mjs +1 -1
- package/dist/domain/Image.mjs.map +1 -1
- package/dist/domain/Items.d.mts +1 -1
- package/dist/domain/Items.mjs +16 -2
- package/dist/domain/Items.mjs.map +1 -1
- package/dist/domain/Media.d.mts +1 -1
- package/dist/domain/Media.mjs +1 -1
- package/dist/domain/Music.d.mts +18 -11
- package/dist/domain/Music.d.mts.map +1 -1
- package/dist/domain/Music.mjs +1 -1
- package/dist/domain/Music.mjs.map +1 -1
- package/dist/domain/Research.d.mts +3 -4
- package/dist/domain/Research.d.mts.map +1 -1
- package/dist/domain/Research.mjs +1 -1
- package/dist/domain/Transcript.d.mts +2 -3
- package/dist/domain/Transcript.d.mts.map +1 -1
- package/dist/domain/Transcript.mjs +1 -1
- package/dist/domain/Turn.d.mts +144 -164
- package/dist/domain/Turn.d.mts.map +1 -1
- package/dist/domain/Turn.mjs +1 -1
- package/dist/domain/Turn.mjs.map +1 -1
- package/dist/domain/Turn.test.d.mts +1 -1
- package/dist/domain/Turn.test.mjs +28 -18
- package/dist/domain/Turn.test.mjs.map +1 -1
- package/dist/embedding-model/Embedding.d.mts +1 -3
- package/dist/embedding-model/Embedding.d.mts.map +1 -1
- package/dist/embedding-model/Embedding.mjs +1 -1
- package/dist/embedding-model/EmbeddingModel.d.mts +1 -3
- package/dist/embedding-model/EmbeddingModel.d.mts.map +1 -1
- package/dist/embedding-model/EmbeddingModel.mjs +1 -1
- package/dist/embedding-model/EmbeddingModel.mjs.map +1 -1
- package/dist/embedding-model/EmbeddingModel.test.d.mts +1 -1
- package/dist/embedding-model/EmbeddingModel.test.mjs +14 -9
- package/dist/embedding-model/EmbeddingModel.test.mjs.map +1 -1
- package/dist/index.d.mts +12 -12
- package/dist/job/Job.d.mts +4 -4
- package/dist/job/Job.d.mts.map +1 -1
- package/dist/job/Job.mjs +1 -1
- package/dist/job/Job.mjs.map +1 -1
- package/dist/language-model/LanguageModel.d.mts +4 -6
- package/dist/language-model/LanguageModel.d.mts.map +1 -1
- package/dist/language-model/LanguageModel.mjs +1 -1
- package/dist/language-model/LanguageModel.mjs.map +1 -1
- package/dist/language-model/LanguageModel.test.d.mts +1 -1
- package/dist/language-model/LanguageModel.test.mjs +6 -3
- package/dist/language-model/LanguageModel.test.mjs.map +1 -1
- package/dist/loop/Loop.d.mts +1 -1
- package/dist/loop/Loop.mjs +1 -1
- package/dist/loop/Loop.mjs.map +1 -1
- package/dist/loop/Loop.test.d.mts +1 -1
- package/dist/loop/Loop.test.mjs +60 -34
- package/dist/loop/Loop.test.mjs.map +1 -1
- package/dist/{magic-string.es-Dk-MMA0F.mjs → magic-string.es-CB2hOw9v.mjs} +14 -13
- package/dist/{magic-string.es-Dk-MMA0F.mjs.map → magic-string.es-CB2hOw9v.mjs.map} +1 -1
- package/dist/math/Vector.d.mts +0 -2
- package/dist/math/Vector.d.mts.map +1 -1
- package/dist/math/Vector.mjs +1 -1
- package/dist/math/Vector.mjs.map +1 -1
- package/dist/music-generator/MusicGenerator.d.mts +2 -4
- package/dist/music-generator/MusicGenerator.d.mts.map +1 -1
- package/dist/music-generator/MusicGenerator.mjs +1 -1
- package/dist/music-generator/MusicGenerator.mjs.map +1 -1
- package/dist/music-generator/MusicGenerator.test.d.mts +1 -1
- package/dist/music-generator/MusicGenerator.test.mjs +19 -10
- package/dist/music-generator/MusicGenerator.test.mjs.map +1 -1
- package/dist/observability/Metrics.d.mts +21 -10
- package/dist/observability/Metrics.d.mts.map +1 -1
- package/dist/observability/Metrics.mjs +31 -8
- package/dist/observability/Metrics.mjs.map +1 -1
- package/dist/observability/Metrics.test.d.mts +1 -1
- package/dist/observability/Metrics.test.mjs +87 -23
- package/dist/observability/Metrics.test.mjs.map +1 -1
- package/dist/observability/Telemetry.d.mts +2 -3
- package/dist/observability/Telemetry.d.mts.map +1 -1
- package/dist/observability/Telemetry.mjs +1 -1
- package/dist/observability/Telemetry.mjs.map +1 -1
- package/dist/observability/Telemetry.test.d.mts +1 -1
- package/dist/observability/Telemetry.test.mjs +15 -7
- package/dist/observability/Telemetry.test.mjs.map +1 -1
- package/dist/research/DeepResearch.d.mts +1 -3
- package/dist/research/DeepResearch.d.mts.map +1 -1
- package/dist/research/DeepResearch.mjs +1 -1
- package/dist/research/DeepResearch.mjs.map +1 -1
- package/dist/retry/Retry.d.mts +4 -8
- package/dist/retry/Retry.d.mts.map +1 -1
- package/dist/retry/Retry.mjs +31 -2
- package/dist/retry/Retry.mjs.map +1 -1
- package/dist/retry/Retry.test.d.mts +1 -1
- package/dist/retry/Retry.test.mjs +6 -3
- package/dist/retry/Retry.test.mjs.map +1 -1
- package/dist/sandbox/Memory.d.mts +0 -2
- package/dist/sandbox/Memory.d.mts.map +1 -1
- package/dist/sandbox/Memory.mjs +4 -4
- package/dist/sandbox/Memory.mjs.map +1 -1
- package/dist/sandbox/Sandbox.d.mts +144 -156
- package/dist/sandbox/Sandbox.d.mts.map +1 -1
- package/dist/sandbox/Sandbox.mjs +1 -1
- package/dist/sandbox/Sandbox.mjs.map +1 -1
- package/dist/sandbox/SandboxError.d.mts +1 -1
- package/dist/sandbox/SandboxError.mjs +1 -1
- package/dist/sandbox/SandboxError.mjs.map +1 -1
- package/dist/sandbox/SandboxImage.d.mts +0 -2
- package/dist/sandbox/SandboxImage.d.mts.map +1 -1
- package/dist/sandbox/SandboxImage.mjs +1 -1
- package/dist/sandbox/SandboxImage.mjs.map +1 -1
- package/dist/sandbox/SandboxNetwork.d.mts +0 -2
- package/dist/sandbox/SandboxNetwork.d.mts.map +1 -1
- package/dist/sandbox/SandboxNetwork.mjs +1 -1
- package/dist/sandbox/SandboxNetwork.mjs.map +1 -1
- package/dist/speech-synthesizer/SpeechSynthesizer.d.mts +8 -7
- package/dist/speech-synthesizer/SpeechSynthesizer.d.mts.map +1 -1
- package/dist/speech-synthesizer/SpeechSynthesizer.mjs +1 -1
- package/dist/speech-synthesizer/SpeechSynthesizer.mjs.map +1 -1
- package/dist/speech-synthesizer/SpeechSynthesizer.test.d.mts +1 -1
- package/dist/speech-synthesizer/SpeechSynthesizer.test.mjs +31 -16
- package/dist/speech-synthesizer/SpeechSynthesizer.test.mjs.map +1 -1
- package/dist/streaming/JSONL.d.mts +1 -5
- package/dist/streaming/JSONL.d.mts.map +1 -1
- package/dist/streaming/JSONL.mjs +1 -1
- package/dist/streaming/JSONL.mjs.map +1 -1
- package/dist/streaming/JSONL.test.d.mts +1 -1
- package/dist/streaming/JSONL.test.mjs +16 -8
- package/dist/streaming/JSONL.test.mjs.map +1 -1
- package/dist/streaming/Lines.d.mts +0 -2
- package/dist/streaming/Lines.d.mts.map +1 -1
- package/dist/streaming/Lines.mjs +1 -1
- package/dist/streaming/Lines.mjs.map +1 -1
- package/dist/streaming/SSE.d.mts +0 -2
- package/dist/streaming/SSE.d.mts.map +1 -1
- package/dist/streaming/SSE.mjs +1 -1
- package/dist/streaming/SSE.mjs.map +1 -1
- package/dist/streaming/SSE.test.d.mts +1 -1
- package/dist/streaming/SSE.test.mjs +34 -17
- package/dist/streaming/SSE.test.mjs.map +1 -1
- package/dist/structured-format/StructuredFormat.d.mts +1 -1
- package/dist/structured-format/StructuredFormat.mjs +1 -1
- package/dist/structured-format/StructuredFormat.mjs.map +1 -1
- package/dist/structured-format/StructuredFormat.test.d.mts +1 -1
- package/dist/structured-format/StructuredFormat.test.mjs +7 -4
- package/dist/structured-format/StructuredFormat.test.mjs.map +1 -1
- package/dist/{dist-CcRV3-A5.mjs → test.DNmyFkvJ-YPzDR0Co.mjs} +1644 -5172
- package/dist/test.DNmyFkvJ-YPzDR0Co.mjs.map +1 -0
- package/dist/testing/MockMusicGenerator.d.mts +4 -3
- package/dist/testing/MockMusicGenerator.d.mts.map +1 -1
- package/dist/testing/MockMusicGenerator.mjs.map +1 -1
- package/dist/testing/MockProvider.d.mts +1 -2
- package/dist/testing/MockProvider.d.mts.map +1 -1
- package/dist/testing/MockProvider.mjs.map +1 -1
- package/dist/testing/MockSandbox.d.mts +256 -290
- package/dist/testing/MockSandbox.d.mts.map +1 -1
- package/dist/testing/MockSandbox.mjs.map +1 -1
- package/dist/testing/MockSpeechSynthesizer.d.mts +10 -6
- package/dist/testing/MockSpeechSynthesizer.d.mts.map +1 -1
- package/dist/testing/MockSpeechSynthesizer.mjs.map +1 -1
- package/dist/testing/MockTranscriber.d.mts +3 -2
- package/dist/testing/MockTranscriber.d.mts.map +1 -1
- package/dist/testing/MockTranscriber.mjs.map +1 -1
- package/dist/tool/Approval.d.mts +31 -36
- package/dist/tool/Approval.d.mts.map +1 -1
- package/dist/tool/Approval.mjs +1 -1
- package/dist/tool/Approval.mjs.map +1 -1
- package/dist/tool/Approval.test.d.mts +1 -1
- package/dist/tool/Approval.test.mjs +37 -24
- package/dist/tool/Approval.test.mjs.map +1 -1
- package/dist/tool/HistoryCheck.d.mts +2 -4
- package/dist/tool/HistoryCheck.d.mts.map +1 -1
- package/dist/tool/HistoryCheck.mjs +1 -1
- package/dist/tool/HistoryCheck.mjs.map +1 -1
- package/dist/tool/Tool.d.mts +1 -1
- package/dist/tool/Tool.mjs +4 -4
- package/dist/tool/Tool.mjs.map +1 -1
- package/dist/tool/Tool.test.d.mts +1 -1
- package/dist/tool/Tool.test.mjs +23 -11
- package/dist/tool/Tool.test.mjs.map +1 -1
- package/dist/tool/ToolEvent.d.mts +1 -1
- package/dist/tool/ToolEvent.mjs +1 -1
- package/dist/tool/ToolEvent.mjs.map +1 -1
- package/dist/tool/ToolResult.d.mts +1 -1
- package/dist/tool/ToolResult.mjs +1 -1
- package/dist/tool/ToolResult.mjs.map +1 -1
- package/dist/tool/Toolkit.d.mts +1 -1
- package/dist/tool/Toolkit.mjs +4 -3
- package/dist/tool/Toolkit.mjs.map +1 -1
- package/dist/tool/Toolkit.test.d.mts +1 -1
- package/dist/tool/Toolkit.test.mjs +40 -21
- package/dist/tool/Toolkit.test.mjs.map +1 -1
- package/dist/transcriber/Transcriber.d.mts +6 -6
- package/dist/transcriber/Transcriber.d.mts.map +1 -1
- package/dist/transcriber/Transcriber.mjs +1 -1
- package/dist/transcriber/Transcriber.mjs.map +1 -1
- package/dist/transcriber/Transcriber.test.d.mts +1 -1
- package/dist/transcriber/Transcriber.test.mjs +20 -10
- package/dist/transcriber/Transcriber.test.mjs.map +1 -1
- package/dist/utils-CiH_DjFW.mjs +3918 -0
- package/dist/utils-CiH_DjFW.mjs.map +1 -0
- package/dist/web-read/WebRead.d.mts +15 -9
- package/dist/web-read/WebRead.d.mts.map +1 -1
- package/dist/web-read/WebRead.mjs +1 -1
- package/dist/web-read/WebRead.mjs.map +1 -1
- package/dist/web-read/WebReadTool.d.mts +4 -5
- package/dist/web-read/WebReadTool.d.mts.map +1 -1
- package/dist/web-read/WebReadTool.mjs +1 -1
- package/dist/web-read/WebReadTool.mjs.map +1 -1
- package/dist/web-search/WebSearch.d.mts +22 -13
- package/dist/web-search/WebSearch.d.mts.map +1 -1
- package/dist/web-search/WebSearch.mjs +1 -1
- package/dist/web-search/WebSearch.mjs.map +1 -1
- package/dist/web-search/WebSearchTool.d.mts +6 -6
- package/dist/web-search/WebSearchTool.d.mts.map +1 -1
- package/dist/web-search/WebSearchTool.mjs +1 -1
- package/dist/web-search/WebSearchTool.mjs.map +1 -1
- package/package.json +4 -4
- package/src/domain/Items.ts +18 -0
- package/src/loop/Loop.test.ts +13 -14
- package/src/loop/Loop.ts +74 -76
- package/src/observability/Metrics.test.ts +65 -0
- package/src/observability/Metrics.ts +53 -11
- package/src/retry/Retry.ts +44 -3
- package/src/testing/MockProvider.ts +8 -9
- package/src/tool/Tool.ts +13 -13
- package/dist/AiError-Bf1pq4BB.d.mts.map +0 -1
- package/dist/Audio-CR7CSljJ.d.mts.map +0 -1
- package/dist/Image-C4vuBmu0.d.mts.map +0 -1
- package/dist/Items-BWNu6VGp.d.mts.map +0 -1
- package/dist/Loop-D8nWpowc.d.mts.map +0 -1
- package/dist/Media-D_CpcM1Z.d.mts.map +0 -1
- package/dist/SandboxError-CIrVDOMV.d.mts.map +0 -1
- package/dist/StructuredFormat-DHaUJBdd.d.mts.map +0 -1
- package/dist/Tool-CXFHCQrT.d.mts.map +0 -1
- package/dist/ToolEvent-nVijCrvm.d.mts.map +0 -1
- package/dist/ToolResult-CQqKkcDa.d.mts.map +0 -1
- package/dist/Toolkit-BYPwwu-j.d.mts.map +0 -1
- package/dist/dist-C0m0QnUP.mjs.map +0 -1
- package/dist/dist-CcRV3-A5.mjs.map +0 -1
- /package/dist/{chunk-uyGKjUfl.mjs → rolldown-runtime-EAsCxrDo.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Browser.mjs","names":[],"sources":["../../src/browser/Browser.ts"],"sourcesContent":["import { Brand, Context, type Duration, Effect, Scope } from \"effect\"\nimport type * as BrowserError from \"./BrowserError.js\"\n\n// ---------------------------------------------------------------------------\n// Identity\n// ---------------------------------------------------------------------------\n\n/**\n * Session identifier. Branded `string` so providers don't accidentally\n * accept a raw user-supplied id, and so a session id can't be passed where\n * another service's id is expected. Each provider mints these per its own\n * scheme; core code treats them opaquely. Mint via `BrowserSessionId(...)`.\n */\nexport type BrowserSessionId = Brand.Branded<string, \"BrowserSessionId\">\nexport const BrowserSessionId = Brand.nominal<BrowserSessionId>()\n\n/** Reference returned by `list`; enough to `attach`. */\nexport type BrowserSessionRef = {\n readonly id: BrowserSessionId\n /** Current top-level URL, when the provider reports it. */\n readonly url?: string\n}\n\n/**\n * Output representation for {@link BrowserSession.content}. `markdown` is\n * the default.\n */\nexport type PageFormat = \"markdown\" | \"html\"\n\n// ---------------------------------------------------------------------------\n// Create request\n// ---------------------------------------------------------------------------\n\n/**\n * Cross-provider session-create request. Provider-specific knobs (proxy,\n * stealth, persistent profile, ...) live on each provider's narrowed\n * request type which extends this.\n */\nexport type CommonSessionRequest = {\n /**\n * Hard max lifetime of the session. Enforced locally (the handle is\n * disposed and further calls fail with `BrowserSessionExpired`) and,\n * where the provider supports it, passed through as a server-side cap so\n * a crashed client still gets the session reclaimed. The provider cap\n * must be >= the local reaper. Accepts millis, a string like\n * `\"5 minutes\"`, or a `Duration`.\n */\n readonly timeout?: Duration.Input\n /**\n * Idle teardown: dispose the session after this much inactivity, the\n * timer resetting on each operation. Opt-in; omit for no idle limit.\n */\n readonly idleTimeout?: Duration.Input\n /** Initial viewport size. Providers default differently. */\n readonly viewport?: { readonly width: number; readonly height: number }\n}\n\n// ---------------------------------------------------------------------------\n// Observation shapes\n// ---------------------------------------------------------------------------\n\nexport type BoundingBox = {\n readonly x: number\n readonly y: number\n readonly width: number\n readonly height: number\n}\n\n/**\n * One element returned by {@link BrowserSession.query}. Serializable data,\n * not a live handle (handles go stale across navigation and do not cross a\n * provider boundary cleanly).\n */\nexport type ElementInfo = {\n /**\n * Reference usable as a selector for a follow-up action. Valid until the\n * next navigation; do not cache across `goto` or a page-changing click.\n */\n readonly ref: string\n readonly tag: string\n readonly text?: string\n readonly attributes: Readonly<Record<string, string>>\n readonly box?: BoundingBox\n}\n\n/** Accessibility-tree node returned by {@link BrowserSession.snapshot}. */\nexport type AxNode = {\n readonly role: string\n readonly name?: string\n readonly value?: string\n /**\n * Reference usable as a selector for a follow-up action. Valid until the\n * next navigation; do not cache across `goto` or a page-changing click.\n */\n readonly ref?: string\n readonly children: ReadonlyArray<AxNode>\n}\n\n// ---------------------------------------------------------------------------\n// Interaction shapes\n// ---------------------------------------------------------------------------\n\nexport type ScrollDirection = \"up\" | \"down\" | \"left\" | \"right\"\n\nexport type ScrollOptions = {\n readonly direction: ScrollDirection\n /** Distance in CSS pixels. Provider default applies when omitted. */\n readonly pixels?: number\n}\n\nexport type ScreenshotOptions = {\n /** Clip to the first element matching this selector. */\n readonly selector?: string\n /** Capture the full scrollable page rather than the viewport. */\n readonly fullPage?: boolean\n}\n\nexport type Cookie = {\n readonly name: string\n readonly value: string\n readonly domain?: string\n readonly path?: string\n readonly expires?: number\n readonly httpOnly?: boolean\n readonly secure?: boolean\n readonly sameSite?: \"Strict\" | \"Lax\" | \"None\"\n}\n\n/** Read / write the session's cookie jar. Needed for authenticated flows. */\nexport type CookieApi = {\n readonly get: Effect.Effect<ReadonlyArray<Cookie>, BrowserError.BrowserError>\n readonly set: (cookies: ReadonlyArray<Cookie>) => Effect.Effect<void, BrowserError.BrowserError>\n}\n\n// ---------------------------------------------------------------------------\n// Live session handle\n// ---------------------------------------------------------------------------\n\n/**\n * Live session handle. Actions take a CSS selector string (so `#id` is\n * just `#id`). Methods are plain `Effect` values; disposal is the scope\n * finalizer, not a method here (see {@link BrowserService}). Anything not\n * covered by a verb is reachable via `evaluate`. Per-operation time budgets\n * are the provider's default; wrap any call in `Effect.timeout` for a\n * tighter bound.\n */\nexport type BrowserSession = {\n readonly id: BrowserSessionId\n\n // Navigation and waiting\n readonly goto: (url: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly waitFor: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n\n // Interaction\n readonly click: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly dblclick: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly fill: (selector: string, text: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly type: (selector: string, text: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly press: (key: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly hover: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly focus: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly select: (\n selector: string,\n value: string,\n ) => Effect.Effect<void, BrowserError.BrowserError>\n readonly check: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly uncheck: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly scroll: (options: ScrollOptions) => Effect.Effect<void, BrowserError.BrowserError>\n readonly scrollIntoView: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n\n // Observation\n readonly content: (format?: PageFormat) => Effect.Effect<string, BrowserError.BrowserError>\n readonly screenshot: (\n options?: ScreenshotOptions,\n ) => Effect.Effect<Uint8Array, BrowserError.BrowserError>\n readonly snapshot: Effect.Effect<AxNode, BrowserError.BrowserError>\n readonly query: (\n selector: string,\n ) => Effect.Effect<ReadonlyArray<ElementInfo>, BrowserError.BrowserError>\n\n // State and escape hatch\n readonly cookies: CookieApi\n readonly evaluate: (script: string) => Effect.Effect<unknown, BrowserError.BrowserError>\n}\n\n// ---------------------------------------------------------------------------\n// Service definition\n// ---------------------------------------------------------------------------\n\n/**\n * Cross-provider browser service.\n *\n * Lifetime: `create` and `attach` return a handle in `Scope.Scope`. The\n * scope finalizer disposes the session (close the transport, destroy or\n * detach the remote session, kill the local engine). Bind with\n * `Effect.scoped` for a single call, or hold a wider scope to keep a\n * session warm across many calls. This is why there is no `dispose()` on\n * {@link BrowserSession}; the scope is the lifecycle handle.\n */\nexport type BrowserService = {\n /**\n * Provision a new session, bound to the caller's scope. Disposed on\n * scope close.\n */\n readonly create: (\n request: CommonSessionRequest,\n ) => Effect.Effect<BrowserSession, BrowserError.BrowserError, Scope.Scope>\n\n /**\n * Re-acquire an existing session by id. Scope-bound, but the finalizer\n * detaches rather than destroying, for sessions kept warm beyond a\n * single run.\n */\n readonly attach: (\n id: BrowserSessionId,\n ) => Effect.Effect<BrowserSession, BrowserError.BrowserError, Scope.Scope>\n\n /** Enumerate sessions visible to the configured account / project. */\n readonly list: Effect.Effect<ReadonlyArray<BrowserSessionRef>, BrowserError.BrowserError>\n\n /**\n * Destroy a session from outside its owning scope. Most callers should\n * let the scope finalizer handle this.\n */\n readonly destroy: (id: BrowserSessionId) => Effect.Effect<void, BrowserError.BrowserError>\n}\n\nexport class Browser extends Context.Service<Browser, BrowserService>()(\n \"@betalyra/effect-uai/Browser\",\n) {}\n\n// ---------------------------------------------------------------------------\n// Free helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Provision a session bound to the caller's scope. Drop the `Scope.Scope`\n * requirement with `Effect.scoped`.\n */\nexport const create = (\n request: CommonSessionRequest,\n): Effect.Effect<BrowserSession, BrowserError.BrowserError, Browser | Scope.Scope> =>\n Effect.flatMap(Browser, (s) => s.create(request))\n\n/**\n * Re-acquire an existing session by id. Same scope semantics as `create`,\n * but the finalizer detaches rather than destroying.\n */\nexport const attach = (\n id: BrowserSessionId,\n): Effect.Effect<BrowserSession, BrowserError.BrowserError, Browser | Scope.Scope> =>\n Effect.flatMap(Browser, (s) => s.attach(id))\n\n/** Enumerate sessions for the configured account / project. */\nexport const list: Effect.Effect<\n ReadonlyArray<BrowserSessionRef>,\n BrowserError.BrowserError,\n Browser\n> = Effect.flatMap(Browser, (s) => s.list)\n\n/**\n * Destroy a session from outside its owning scope. Most callers should let\n * the scope finalizer handle this automatically.\n */\nexport const destroy = (\n id: BrowserSessionId,\n): Effect.Effect<void, BrowserError.BrowserError, Browser> =>\n Effect.flatMap(Browser, (s) => s.destroy(id))\n"],"mappings":";;;;;;;;;;;AAcA,MAAa,mBAAmB,MAAM,SAA2B;AAqNjE,IAAa,UAAb,cAA6B,QAAQ,SAAkC,CACrE,+BACD,CAAC;;;;;AAUF,MAAa,UACX,YAEA,OAAO,QAAQ,UAAU,MAAM,EAAE,OAAO,QAAQ,CAAC;;;;;AAMnD,MAAa,UACX,OAEA,OAAO,QAAQ,UAAU,MAAM,EAAE,OAAO,GAAG,CAAC;;AAG9C,MAAa,OAIT,OAAO,QAAQ,UAAU,MAAM,EAAE,KAAK;;;;;AAM1C,MAAa,WACX,OAEA,OAAO,QAAQ,UAAU,MAAM,EAAE,QAAQ,GAAG,CAAC"}
|
|
1
|
+
{"version":3,"file":"Browser.mjs","names":[],"sources":["../../src/browser/Browser.ts"],"sourcesContent":["import { Brand, Context, type Duration, Effect, Scope } from \"effect\"\nimport type * as BrowserError from \"./BrowserError.js\"\n\n// ---------------------------------------------------------------------------\n// Identity\n// ---------------------------------------------------------------------------\n\n/**\n * Session identifier. Branded `string` so providers don't accidentally\n * accept a raw user-supplied id, and so a session id can't be passed where\n * another service's id is expected. Each provider mints these per its own\n * scheme; core code treats them opaquely. Mint via `BrowserSessionId(...)`.\n */\nexport type BrowserSessionId = Brand.Branded<string, \"BrowserSessionId\">\nexport const BrowserSessionId = Brand.nominal<BrowserSessionId>()\n\n/** Reference returned by `list`; enough to `attach`. */\nexport type BrowserSessionRef = {\n readonly id: BrowserSessionId\n /** Current top-level URL, when the provider reports it. */\n readonly url?: string\n}\n\n/**\n * Output representation for {@link BrowserSession.content}. `markdown` is\n * the default.\n */\nexport type PageFormat = \"markdown\" | \"html\"\n\n// ---------------------------------------------------------------------------\n// Create request\n// ---------------------------------------------------------------------------\n\n/**\n * Cross-provider session-create request. Provider-specific knobs (proxy,\n * stealth, persistent profile, ...) live on each provider's narrowed\n * request type which extends this.\n */\nexport type CommonSessionRequest = {\n /**\n * Hard max lifetime of the session. Enforced locally (the handle is\n * disposed and further calls fail with `BrowserSessionExpired`) and,\n * where the provider supports it, passed through as a server-side cap so\n * a crashed client still gets the session reclaimed. The provider cap\n * must be >= the local reaper. Accepts millis, a string like\n * `\"5 minutes\"`, or a `Duration`.\n */\n readonly timeout?: Duration.Input\n /**\n * Idle teardown: dispose the session after this much inactivity, the\n * timer resetting on each operation. Opt-in; omit for no idle limit.\n */\n readonly idleTimeout?: Duration.Input\n /** Initial viewport size. Providers default differently. */\n readonly viewport?: { readonly width: number; readonly height: number }\n}\n\n// ---------------------------------------------------------------------------\n// Observation shapes\n// ---------------------------------------------------------------------------\n\nexport type BoundingBox = {\n readonly x: number\n readonly y: number\n readonly width: number\n readonly height: number\n}\n\n/**\n * One element returned by {@link BrowserSession.query}. Serializable data,\n * not a live handle (handles go stale across navigation and do not cross a\n * provider boundary cleanly).\n */\nexport type ElementInfo = {\n /**\n * Reference usable as a selector for a follow-up action. Valid until the\n * next navigation; do not cache across `goto` or a page-changing click.\n */\n readonly ref: string\n readonly tag: string\n readonly text?: string\n readonly attributes: Readonly<Record<string, string>>\n readonly box?: BoundingBox\n}\n\n/** Accessibility-tree node returned by {@link BrowserSession.snapshot}. */\nexport type AxNode = {\n readonly role: string\n readonly name?: string\n readonly value?: string\n /**\n * Reference usable as a selector for a follow-up action. Valid until the\n * next navigation; do not cache across `goto` or a page-changing click.\n */\n readonly ref?: string\n readonly children: ReadonlyArray<AxNode>\n}\n\n// ---------------------------------------------------------------------------\n// Interaction shapes\n// ---------------------------------------------------------------------------\n\nexport type ScrollDirection = \"up\" | \"down\" | \"left\" | \"right\"\n\nexport type ScrollOptions = {\n readonly direction: ScrollDirection\n /** Distance in CSS pixels. Provider default applies when omitted. */\n readonly pixels?: number\n}\n\nexport type ScreenshotOptions = {\n /** Clip to the first element matching this selector. */\n readonly selector?: string\n /** Capture the full scrollable page rather than the viewport. */\n readonly fullPage?: boolean\n}\n\nexport type Cookie = {\n readonly name: string\n readonly value: string\n readonly domain?: string\n readonly path?: string\n readonly expires?: number\n readonly httpOnly?: boolean\n readonly secure?: boolean\n readonly sameSite?: \"Strict\" | \"Lax\" | \"None\"\n}\n\n/** Read / write the session's cookie jar. Needed for authenticated flows. */\nexport type CookieApi = {\n readonly get: Effect.Effect<ReadonlyArray<Cookie>, BrowserError.BrowserError>\n readonly set: (cookies: ReadonlyArray<Cookie>) => Effect.Effect<void, BrowserError.BrowserError>\n}\n\n// ---------------------------------------------------------------------------\n// Live session handle\n// ---------------------------------------------------------------------------\n\n/**\n * Live session handle. Actions take a CSS selector string (so `#id` is\n * just `#id`). Methods are plain `Effect` values; disposal is the scope\n * finalizer, not a method here (see {@link BrowserService}). Anything not\n * covered by a verb is reachable via `evaluate`. Per-operation time budgets\n * are the provider's default; wrap any call in `Effect.timeout` for a\n * tighter bound.\n */\nexport type BrowserSession = {\n readonly id: BrowserSessionId\n\n // Navigation and waiting\n readonly goto: (url: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly waitFor: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n\n // Interaction\n readonly click: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly dblclick: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly fill: (selector: string, text: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly type: (selector: string, text: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly press: (key: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly hover: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly focus: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly select: (\n selector: string,\n value: string,\n ) => Effect.Effect<void, BrowserError.BrowserError>\n readonly check: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly uncheck: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n readonly scroll: (options: ScrollOptions) => Effect.Effect<void, BrowserError.BrowserError>\n readonly scrollIntoView: (selector: string) => Effect.Effect<void, BrowserError.BrowserError>\n\n // Observation\n readonly content: (format?: PageFormat) => Effect.Effect<string, BrowserError.BrowserError>\n readonly screenshot: (\n options?: ScreenshotOptions,\n ) => Effect.Effect<Uint8Array, BrowserError.BrowserError>\n readonly snapshot: Effect.Effect<AxNode, BrowserError.BrowserError>\n readonly query: (\n selector: string,\n ) => Effect.Effect<ReadonlyArray<ElementInfo>, BrowserError.BrowserError>\n\n // State and escape hatch\n readonly cookies: CookieApi\n readonly evaluate: (script: string) => Effect.Effect<unknown, BrowserError.BrowserError>\n}\n\n// ---------------------------------------------------------------------------\n// Service definition\n// ---------------------------------------------------------------------------\n\n/**\n * Cross-provider browser service.\n *\n * Lifetime: `create` and `attach` return a handle in `Scope.Scope`. The\n * scope finalizer disposes the session (close the transport, destroy or\n * detach the remote session, kill the local engine). Bind with\n * `Effect.scoped` for a single call, or hold a wider scope to keep a\n * session warm across many calls. This is why there is no `dispose()` on\n * {@link BrowserSession}; the scope is the lifecycle handle.\n */\nexport type BrowserService = {\n /**\n * Provision a new session, bound to the caller's scope. Disposed on\n * scope close.\n */\n readonly create: (\n request: CommonSessionRequest,\n ) => Effect.Effect<BrowserSession, BrowserError.BrowserError, Scope.Scope>\n\n /**\n * Re-acquire an existing session by id. Scope-bound, but the finalizer\n * detaches rather than destroying, for sessions kept warm beyond a\n * single run.\n */\n readonly attach: (\n id: BrowserSessionId,\n ) => Effect.Effect<BrowserSession, BrowserError.BrowserError, Scope.Scope>\n\n /** Enumerate sessions visible to the configured account / project. */\n readonly list: Effect.Effect<ReadonlyArray<BrowserSessionRef>, BrowserError.BrowserError>\n\n /**\n * Destroy a session from outside its owning scope. Most callers should\n * let the scope finalizer handle this.\n */\n readonly destroy: (id: BrowserSessionId) => Effect.Effect<void, BrowserError.BrowserError>\n}\n\nexport class Browser extends Context.Service<Browser, BrowserService>()(\n \"@betalyra/effect-uai/Browser\",\n) {}\n\n// ---------------------------------------------------------------------------\n// Free helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Provision a session bound to the caller's scope. Drop the `Scope.Scope`\n * requirement with `Effect.scoped`.\n */\nexport const create = (\n request: CommonSessionRequest,\n): Effect.Effect<BrowserSession, BrowserError.BrowserError, Browser | Scope.Scope> =>\n Effect.flatMap(Browser, (s) => s.create(request))\n\n/**\n * Re-acquire an existing session by id. Same scope semantics as `create`,\n * but the finalizer detaches rather than destroying.\n */\nexport const attach = (\n id: BrowserSessionId,\n): Effect.Effect<BrowserSession, BrowserError.BrowserError, Browser | Scope.Scope> =>\n Effect.flatMap(Browser, (s) => s.attach(id))\n\n/** Enumerate sessions for the configured account / project. */\nexport const list: Effect.Effect<\n ReadonlyArray<BrowserSessionRef>,\n BrowserError.BrowserError,\n Browser\n> = Effect.flatMap(Browser, (s) => s.list)\n\n/**\n * Destroy a session from outside its owning scope. Most callers should let\n * the scope finalizer handle this automatically.\n */\nexport const destroy = (\n id: BrowserSessionId,\n): Effect.Effect<void, BrowserError.BrowserError, Browser> =>\n Effect.flatMap(Browser, (s) => s.destroy(id))\n"],"mappings":";;;;;;;;;;;AAcA,MAAa,mBAAmB,MAAM,QAA0B;AAqNhE,IAAa,UAAb,cAA6B,QAAQ,QAAiC,CAAC,CACrE,8BACF,CAAC,CAAC,CAAC;;;;;AAUH,MAAa,UACX,YAEA,OAAO,QAAQ,UAAU,MAAM,EAAE,OAAO,OAAO,CAAC;;;;;AAMlD,MAAa,UACX,OAEA,OAAO,QAAQ,UAAU,MAAM,EAAE,OAAO,EAAE,CAAC;;AAG7C,MAAa,OAIT,OAAO,QAAQ,UAAU,MAAM,EAAE,IAAI;;;;;AAMzC,MAAa,WACX,OAEA,OAAO,QAAQ,UAAU,MAAM,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { Duration } from "effect";
|
|
2
|
-
import * as _$effect_Cause0 from "effect/Cause";
|
|
3
|
-
import * as _$effect_Types0 from "effect/Types";
|
|
4
|
-
|
|
5
|
-
//#region src/browser/BrowserError.d.ts
|
|
6
2
|
declare namespace BrowserError_d_exports {
|
|
7
3
|
export { BrowserActionFailed, BrowserAuthFailed, BrowserAuthSubtype, BrowserCreateFailed, BrowserError, BrowserInvalidRequest, BrowserQuotaExceeded, BrowserSessionExpired, BrowserSessionNotFound, BrowserTimeout, BrowserUnsupported, describe };
|
|
8
4
|
}
|
|
9
|
-
declare const BrowserCreateFailed_base: new <A extends Record<string, any> = {}>(args:
|
|
5
|
+
declare const BrowserCreateFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
10
6
|
readonly _tag: "BrowserCreateFailed";
|
|
11
7
|
} & Readonly<A>;
|
|
12
8
|
/**
|
|
@@ -20,7 +16,7 @@ declare class BrowserCreateFailed extends BrowserCreateFailed_base<{
|
|
|
20
16
|
reason?: string;
|
|
21
17
|
raw: unknown;
|
|
22
18
|
}> {}
|
|
23
|
-
declare const BrowserSessionNotFound_base: new <A extends Record<string, any> = {}>(args:
|
|
19
|
+
declare const BrowserSessionNotFound_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
24
20
|
readonly _tag: "BrowserSessionNotFound";
|
|
25
21
|
} & Readonly<A>;
|
|
26
22
|
/**
|
|
@@ -33,7 +29,7 @@ declare class BrowserSessionNotFound extends BrowserSessionNotFound_base<{
|
|
|
33
29
|
provider: string;
|
|
34
30
|
id: string;
|
|
35
31
|
}> {}
|
|
36
|
-
declare const BrowserSessionExpired_base: new <A extends Record<string, any> = {}>(args:
|
|
32
|
+
declare const BrowserSessionExpired_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
37
33
|
readonly _tag: "BrowserSessionExpired";
|
|
38
34
|
} & Readonly<A>;
|
|
39
35
|
/**
|
|
@@ -47,7 +43,7 @@ declare class BrowserSessionExpired extends BrowserSessionExpired_base<{
|
|
|
47
43
|
provider: string;
|
|
48
44
|
id: string;
|
|
49
45
|
}> {}
|
|
50
|
-
declare const BrowserTimeout_base: new <A extends Record<string, any> = {}>(args:
|
|
46
|
+
declare const BrowserTimeout_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
51
47
|
readonly _tag: "BrowserTimeout";
|
|
52
48
|
} & Readonly<A>;
|
|
53
49
|
/**
|
|
@@ -61,7 +57,7 @@ declare class BrowserTimeout extends BrowserTimeout_base<{
|
|
|
61
57
|
budget?: Duration.Duration;
|
|
62
58
|
raw?: unknown;
|
|
63
59
|
}> {}
|
|
64
|
-
declare const BrowserActionFailed_base: new <A extends Record<string, any> = {}>(args:
|
|
60
|
+
declare const BrowserActionFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
65
61
|
readonly _tag: "BrowserActionFailed";
|
|
66
62
|
} & Readonly<A>;
|
|
67
63
|
/**
|
|
@@ -77,7 +73,7 @@ declare class BrowserActionFailed extends BrowserActionFailed_base<{
|
|
|
77
73
|
reason?: string;
|
|
78
74
|
raw: unknown;
|
|
79
75
|
}> {}
|
|
80
|
-
declare const BrowserQuotaExceeded_base: new <A extends Record<string, any> = {}>(args:
|
|
76
|
+
declare const BrowserQuotaExceeded_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
81
77
|
readonly _tag: "BrowserQuotaExceeded";
|
|
82
78
|
} & Readonly<A>;
|
|
83
79
|
/**
|
|
@@ -90,7 +86,7 @@ declare class BrowserQuotaExceeded extends BrowserQuotaExceeded_base<{
|
|
|
90
86
|
reason?: string;
|
|
91
87
|
raw: unknown;
|
|
92
88
|
}> {}
|
|
93
|
-
declare const BrowserInvalidRequest_base: new <A extends Record<string, any> = {}>(args:
|
|
89
|
+
declare const BrowserInvalidRequest_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
94
90
|
readonly _tag: "BrowserInvalidRequest";
|
|
95
91
|
} & Readonly<A>;
|
|
96
92
|
/**
|
|
@@ -109,7 +105,7 @@ declare class BrowserInvalidRequest extends BrowserInvalidRequest_base<{
|
|
|
109
105
|
* the model-side `AiError.AuthFailed` shape for consistency.
|
|
110
106
|
*/
|
|
111
107
|
type BrowserAuthSubtype = "auth" | "permission" | "billing" | "quota";
|
|
112
|
-
declare const BrowserAuthFailed_base: new <A extends Record<string, any> = {}>(args:
|
|
108
|
+
declare const BrowserAuthFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
113
109
|
readonly _tag: "BrowserAuthFailed";
|
|
114
110
|
} & Readonly<A>;
|
|
115
111
|
declare class BrowserAuthFailed extends BrowserAuthFailed_base<{
|
|
@@ -117,7 +113,7 @@ declare class BrowserAuthFailed extends BrowserAuthFailed_base<{
|
|
|
117
113
|
subtype: BrowserAuthSubtype;
|
|
118
114
|
raw: unknown;
|
|
119
115
|
}> {}
|
|
120
|
-
declare const BrowserUnsupported_base: new <A extends Record<string, any> = {}>(args:
|
|
116
|
+
declare const BrowserUnsupported_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
121
117
|
readonly _tag: "BrowserUnsupported";
|
|
122
118
|
} & Readonly<A>;
|
|
123
119
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserError.d.mts","names":[],"sources":["../../src/browser/BrowserError.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"BrowserError.d.mts","names":[],"sources":["../../src/browser/BrowserError.ts"],"mappings":";;;;;;;;;;;;;cAQa,4BAA4B;EACvC;EACA;EACA;;;;;;;;;;;cASW,+BAA+B;EAC1C;EACA;;;;;;;;;;;;cAUW,8BAA8B;EACzC;EACA;;;;;;;;;;cAQW,uBAAuB;EAClC;EACA;EACA,SAAS,SAAS;EAClB;;;;;;;;;;;cASW,4BAA4B;EACvC;EACA;EACA;EACA;EACA;;;;;;;;;;cAQW,6BAA6B;EACxC;EACA;EACA;;;;;;;;;;cAQW,8BAA8B;EACzC;EACA;EACA;EACA;;;;;;KAOU;;;;cAEC,0BAA0B;EACrC;EACA,SAAS;EACT;;;;;;;;;;cAQW,2BAA2B;EACtC;EACA;EACA;;KAGU,eACR,sBACA,yBACA,wBACA,iBACA,sBACA,uBACA,wBACA,oBACA;;;;;cASS,WAAW,GAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserError.mjs","names":[],"sources":["../../src/browser/BrowserError.ts"],"sourcesContent":["import { Data, Duration, Match } from \"effect\"\n\n/**\n * Failed to provision a browser session: the transport could not connect,\n * a launched engine did not come up, or the provider refused to mint a\n * session. Provider's structured reason on `reason`; the raw transport /\n * SDK error on `raw`.\n */\nexport class BrowserCreateFailed extends Data.TaggedError(\"BrowserCreateFailed\")<{\n provider: string\n reason?: string\n raw: unknown\n}> {}\n\n/**\n * The requested session id does not exist. Raised by `attach` / `destroy`\n * against a stale or never-known id. Distinct from\n * {@link BrowserSessionExpired}, which is a session that existed and has\n * since ended.\n */\nexport class BrowserSessionNotFound extends Data.TaggedError(\"BrowserSessionNotFound\")<{\n provider: string\n id: string\n}> {}\n\n/**\n * An operation was issued against a session that has ended: it reached its\n * max lifetime (the create-time `timeout`), was destroyed, or the provider\n * reaped it. The handle is dead; `create` or `attach` a live session.\n * Distinct from {@link BrowserTimeout} (a single live operation was too\n * slow).\n */\nexport class BrowserSessionExpired extends Data.TaggedError(\"BrowserSessionExpired\")<{\n provider: string\n id: string\n}> {}\n\n/**\n * A single operation exceeded its own time budget while the session was\n * still alive (a navigation that never settled, a `waitFor` selector that\n * never appeared). Carries the breached budget for observability.\n */\nexport class BrowserTimeout extends Data.TaggedError(\"BrowserTimeout\")<{\n provider: string\n operation: \"create\" | \"attach\" | \"navigate\" | \"action\" | \"query\"\n budget?: Duration.Duration\n raw?: unknown\n}> {}\n\n/**\n * An interaction or observation failed at the transport / protocol layer:\n * a selector resolved to nothing, an element was not actionable, an\n * `evaluate` script threw, a navigation errored. `selector` and `reason`\n * carry what is known.\n */\nexport class BrowserActionFailed extends Data.TaggedError(\"BrowserActionFailed\")<{\n provider: string\n operation: \"navigate\" | \"interact\" | \"observe\" | \"evaluate\" | \"cookies\"\n selector?: string\n reason?: string\n raw: unknown\n}> {}\n\n/**\n * Provider rejected the request because an account / project quota or\n * concurrency limit was exceeded. Separate from {@link BrowserCreateFailed}\n * so callers can back off and retry.\n */\nexport class BrowserQuotaExceeded extends Data.TaggedError(\"BrowserQuotaExceeded\")<{\n provider: string\n reason?: string\n raw: unknown\n}> {}\n\n/**\n * Caller's request shape is malformed for the wired provider. Adapters\n * should reject at the request-schema layer where possible; this is the\n * runtime fallback.\n */\nexport class BrowserInvalidRequest extends Data.TaggedError(\"BrowserInvalidRequest\")<{\n provider: string\n param?: string\n reason?: string\n raw?: unknown\n}> {}\n\n/**\n * Transport could not authenticate against the provider. Subtype mirrors\n * the model-side `AiError.AuthFailed` shape for consistency.\n */\nexport type BrowserAuthSubtype = \"auth\" | \"permission\" | \"billing\" | \"quota\"\n\nexport class BrowserAuthFailed extends Data.TaggedError(\"BrowserAuthFailed\")<{\n provider: string\n subtype: BrowserAuthSubtype\n raw: unknown\n}> {}\n\n/**\n * The wired provider does not implement the requested operation for these\n * inputs. Distinct from {@link BrowserInvalidRequest} (malformed request)\n * and from compile-time capability markers gating blanket provider gaps.\n */\nexport class BrowserUnsupported extends Data.TaggedError(\"BrowserUnsupported\")<{\n provider: string\n capability: string\n reason?: string\n}> {}\n\nexport type BrowserError =\n | BrowserCreateFailed\n | BrowserSessionNotFound\n | BrowserSessionExpired\n | BrowserTimeout\n | BrowserActionFailed\n | BrowserQuotaExceeded\n | BrowserInvalidRequest\n | BrowserAuthFailed\n | BrowserUnsupported\n\nconst withReason = (base: string, reason: string | undefined): string =>\n reason === undefined ? base : `${base}: ${reason}`\n\n/**\n * Short human-readable description of an error, for logs and model-facing\n * failure messages. Prose, not a contract; branch on `_tag` instead.\n */\nexport const describe: (e: BrowserError) => string = Match.type<BrowserError>().pipe(\n Match.discriminatorsExhaustive(\"_tag\")({\n BrowserCreateFailed: (e) => withReason(\"the browser session could not be created\", e.reason),\n BrowserSessionNotFound: () => \"the browser session does not exist\",\n BrowserSessionExpired: () => \"the browser session has expired\",\n BrowserTimeout: (e) => `the ${e.operation} operation timed out`,\n BrowserActionFailed: (e) =>\n withReason(\n `the ${e.operation} failed${e.selector === undefined ? \"\" : ` on ${e.selector}`}`,\n e.reason,\n ),\n BrowserQuotaExceeded: (e) => withReason(\"the browser quota is exceeded\", e.reason),\n BrowserInvalidRequest: (e) => withReason(\"the request was invalid\", e.reason),\n BrowserAuthFailed: (e) => `browser authentication failed (${e.subtype})`,\n BrowserUnsupported: (e) =>\n withReason(`this browser does not support ${e.capability}`, e.reason),\n }),\n)\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAQA,IAAa,sBAAb,cAAyC,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"BrowserError.mjs","names":[],"sources":["../../src/browser/BrowserError.ts"],"sourcesContent":["import { Data, Duration, Match } from \"effect\"\n\n/**\n * Failed to provision a browser session: the transport could not connect,\n * a launched engine did not come up, or the provider refused to mint a\n * session. Provider's structured reason on `reason`; the raw transport /\n * SDK error on `raw`.\n */\nexport class BrowserCreateFailed extends Data.TaggedError(\"BrowserCreateFailed\")<{\n provider: string\n reason?: string\n raw: unknown\n}> {}\n\n/**\n * The requested session id does not exist. Raised by `attach` / `destroy`\n * against a stale or never-known id. Distinct from\n * {@link BrowserSessionExpired}, which is a session that existed and has\n * since ended.\n */\nexport class BrowserSessionNotFound extends Data.TaggedError(\"BrowserSessionNotFound\")<{\n provider: string\n id: string\n}> {}\n\n/**\n * An operation was issued against a session that has ended: it reached its\n * max lifetime (the create-time `timeout`), was destroyed, or the provider\n * reaped it. The handle is dead; `create` or `attach` a live session.\n * Distinct from {@link BrowserTimeout} (a single live operation was too\n * slow).\n */\nexport class BrowserSessionExpired extends Data.TaggedError(\"BrowserSessionExpired\")<{\n provider: string\n id: string\n}> {}\n\n/**\n * A single operation exceeded its own time budget while the session was\n * still alive (a navigation that never settled, a `waitFor` selector that\n * never appeared). Carries the breached budget for observability.\n */\nexport class BrowserTimeout extends Data.TaggedError(\"BrowserTimeout\")<{\n provider: string\n operation: \"create\" | \"attach\" | \"navigate\" | \"action\" | \"query\"\n budget?: Duration.Duration\n raw?: unknown\n}> {}\n\n/**\n * An interaction or observation failed at the transport / protocol layer:\n * a selector resolved to nothing, an element was not actionable, an\n * `evaluate` script threw, a navigation errored. `selector` and `reason`\n * carry what is known.\n */\nexport class BrowserActionFailed extends Data.TaggedError(\"BrowserActionFailed\")<{\n provider: string\n operation: \"navigate\" | \"interact\" | \"observe\" | \"evaluate\" | \"cookies\"\n selector?: string\n reason?: string\n raw: unknown\n}> {}\n\n/**\n * Provider rejected the request because an account / project quota or\n * concurrency limit was exceeded. Separate from {@link BrowserCreateFailed}\n * so callers can back off and retry.\n */\nexport class BrowserQuotaExceeded extends Data.TaggedError(\"BrowserQuotaExceeded\")<{\n provider: string\n reason?: string\n raw: unknown\n}> {}\n\n/**\n * Caller's request shape is malformed for the wired provider. Adapters\n * should reject at the request-schema layer where possible; this is the\n * runtime fallback.\n */\nexport class BrowserInvalidRequest extends Data.TaggedError(\"BrowserInvalidRequest\")<{\n provider: string\n param?: string\n reason?: string\n raw?: unknown\n}> {}\n\n/**\n * Transport could not authenticate against the provider. Subtype mirrors\n * the model-side `AiError.AuthFailed` shape for consistency.\n */\nexport type BrowserAuthSubtype = \"auth\" | \"permission\" | \"billing\" | \"quota\"\n\nexport class BrowserAuthFailed extends Data.TaggedError(\"BrowserAuthFailed\")<{\n provider: string\n subtype: BrowserAuthSubtype\n raw: unknown\n}> {}\n\n/**\n * The wired provider does not implement the requested operation for these\n * inputs. Distinct from {@link BrowserInvalidRequest} (malformed request)\n * and from compile-time capability markers gating blanket provider gaps.\n */\nexport class BrowserUnsupported extends Data.TaggedError(\"BrowserUnsupported\")<{\n provider: string\n capability: string\n reason?: string\n}> {}\n\nexport type BrowserError =\n | BrowserCreateFailed\n | BrowserSessionNotFound\n | BrowserSessionExpired\n | BrowserTimeout\n | BrowserActionFailed\n | BrowserQuotaExceeded\n | BrowserInvalidRequest\n | BrowserAuthFailed\n | BrowserUnsupported\n\nconst withReason = (base: string, reason: string | undefined): string =>\n reason === undefined ? base : `${base}: ${reason}`\n\n/**\n * Short human-readable description of an error, for logs and model-facing\n * failure messages. Prose, not a contract; branch on `_tag` instead.\n */\nexport const describe: (e: BrowserError) => string = Match.type<BrowserError>().pipe(\n Match.discriminatorsExhaustive(\"_tag\")({\n BrowserCreateFailed: (e) => withReason(\"the browser session could not be created\", e.reason),\n BrowserSessionNotFound: () => \"the browser session does not exist\",\n BrowserSessionExpired: () => \"the browser session has expired\",\n BrowserTimeout: (e) => `the ${e.operation} operation timed out`,\n BrowserActionFailed: (e) =>\n withReason(\n `the ${e.operation} failed${e.selector === undefined ? \"\" : ` on ${e.selector}`}`,\n e.reason,\n ),\n BrowserQuotaExceeded: (e) => withReason(\"the browser quota is exceeded\", e.reason),\n BrowserInvalidRequest: (e) => withReason(\"the request was invalid\", e.reason),\n BrowserAuthFailed: (e) => `browser authentication failed (${e.subtype})`,\n BrowserUnsupported: (e) =>\n withReason(`this browser does not support ${e.capability}`, e.reason),\n }),\n)\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAQA,IAAa,sBAAb,cAAyC,KAAK,YAAY,qBAAqB,CAAC,CAI7E,CAAC;;;;;;;AAQJ,IAAa,yBAAb,cAA4C,KAAK,YAAY,wBAAwB,CAAC,CAGnF,CAAC;;;;;;;;AASJ,IAAa,wBAAb,cAA2C,KAAK,YAAY,uBAAuB,CAAC,CAGjF,CAAC;;;;;;AAOJ,IAAa,iBAAb,cAAoC,KAAK,YAAY,gBAAgB,CAAC,CAKnE,CAAC;;;;;;;AAQJ,IAAa,sBAAb,cAAyC,KAAK,YAAY,qBAAqB,CAAC,CAM7E,CAAC;;;;;;AAOJ,IAAa,uBAAb,cAA0C,KAAK,YAAY,sBAAsB,CAAC,CAI/E,CAAC;;;;;;AAOJ,IAAa,wBAAb,cAA2C,KAAK,YAAY,uBAAuB,CAAC,CAKjF,CAAC;AAQJ,IAAa,oBAAb,cAAuC,KAAK,YAAY,mBAAmB,CAAC,CAIzE,CAAC;;;;;;AAOJ,IAAa,qBAAb,cAAwC,KAAK,YAAY,oBAAoB,CAAC,CAI3E,CAAC;AAaJ,MAAM,cAAc,MAAc,WAChC,WAAW,KAAA,IAAY,OAAO,GAAG,KAAK,IAAI;;;;;AAM5C,MAAa,WAAwC,MAAM,KAAmB,CAAC,CAAC,KAC9E,MAAM,yBAAyB,MAAM,CAAC,CAAC;CACrC,sBAAsB,MAAM,WAAW,4CAA4C,EAAE,MAAM;CAC3F,8BAA8B;CAC9B,6BAA6B;CAC7B,iBAAiB,MAAM,OAAO,EAAE,UAAU;CAC1C,sBAAsB,MACpB,WACE,OAAO,EAAE,UAAU,SAAS,EAAE,aAAa,KAAA,IAAY,KAAK,OAAO,EAAE,cACrE,EAAE,MACJ;CACF,uBAAuB,MAAM,WAAW,iCAAiC,EAAE,MAAM;CACjF,wBAAwB,MAAM,WAAW,2BAA2B,EAAE,MAAM;CAC5E,oBAAoB,MAAM,kCAAkC,EAAE,QAAQ;CACtE,qBAAqB,MACnB,WAAW,iCAAiC,EAAE,cAAc,EAAE,MAAM;AACxE,CAAC,CACH"}
|
|
@@ -1,28 +1,25 @@
|
|
|
1
1
|
import { BrowserError } from "./BrowserError.mjs";
|
|
2
2
|
import { BrowserSession } from "./Browser.mjs";
|
|
3
|
-
import { l as Tool } from "../Tool-
|
|
4
|
-
import { Schema } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/browser/BrowserTool.d.ts
|
|
3
|
+
import { l as Tool } from "../Tool-DE-rnvkw.mjs";
|
|
7
4
|
declare namespace BrowserTool_d_exports {
|
|
8
5
|
export { browserToolkit, clickTool, fillTool, gotoTool, pressTool, scrollTool };
|
|
9
6
|
}
|
|
10
|
-
declare const gotoTool: (session: BrowserSession) => Tool<"browser_goto",
|
|
11
|
-
readonly url:
|
|
12
|
-
},
|
|
13
|
-
declare const clickTool: (session: BrowserSession) => Tool<"browser_click",
|
|
14
|
-
readonly ref:
|
|
15
|
-
},
|
|
16
|
-
declare const fillTool: (session: BrowserSession) => Tool<"browser_fill",
|
|
17
|
-
readonly ref:
|
|
18
|
-
readonly text:
|
|
19
|
-
},
|
|
20
|
-
declare const pressTool: (session: BrowserSession) => Tool<"browser_press",
|
|
21
|
-
readonly key:
|
|
22
|
-
},
|
|
23
|
-
declare const scrollTool: (session: BrowserSession) => Tool<"browser_scroll",
|
|
24
|
-
readonly direction:
|
|
25
|
-
},
|
|
7
|
+
declare const gotoTool: (session: BrowserSession) => Tool<"browser_goto", {
|
|
8
|
+
readonly url: string;
|
|
9
|
+
}, unknown, string, BrowserError, never>;
|
|
10
|
+
declare const clickTool: (session: BrowserSession) => Tool<"browser_click", {
|
|
11
|
+
readonly ref: string;
|
|
12
|
+
}, unknown, string, BrowserError, never>;
|
|
13
|
+
declare const fillTool: (session: BrowserSession) => Tool<"browser_fill", {
|
|
14
|
+
readonly ref: string;
|
|
15
|
+
readonly text: string;
|
|
16
|
+
}, unknown, string, BrowserError, never>;
|
|
17
|
+
declare const pressTool: (session: BrowserSession) => Tool<"browser_press", {
|
|
18
|
+
readonly key: string;
|
|
19
|
+
}, unknown, string, BrowserError, never>;
|
|
20
|
+
declare const scrollTool: (session: BrowserSession) => Tool<"browser_scroll", {
|
|
21
|
+
readonly direction: "down" | "up";
|
|
22
|
+
}, unknown, string, BrowserError, never>;
|
|
26
23
|
/**
|
|
27
24
|
* The canonical browser action verbs bundled as a `Toolkit`, closed over a
|
|
28
25
|
* live `BrowserSession`. Compose it with a recipe-local page-reading tool and
|
|
@@ -37,22 +34,22 @@ declare const scrollTool: (session: BrowserSession) => Tool<"browser_scroll", Sc
|
|
|
37
34
|
* constructors directly. Run a turn's calls with `{ concurrency: 1 }`.
|
|
38
35
|
*/
|
|
39
36
|
declare const browserToolkit: (session: BrowserSession) => {
|
|
40
|
-
|
|
41
|
-
readonly
|
|
42
|
-
},
|
|
43
|
-
|
|
44
|
-
readonly ref:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
readonly
|
|
49
|
-
},
|
|
50
|
-
browser_press: Tool<"browser_press",
|
|
51
|
-
readonly key:
|
|
52
|
-
},
|
|
53
|
-
browser_scroll: Tool<"browser_scroll",
|
|
54
|
-
readonly direction:
|
|
55
|
-
},
|
|
37
|
+
browser_click: Tool<"browser_click", {
|
|
38
|
+
readonly ref: string;
|
|
39
|
+
}, unknown, string, BrowserError, never>;
|
|
40
|
+
browser_fill: Tool<"browser_fill", {
|
|
41
|
+
readonly ref: string;
|
|
42
|
+
readonly text: string;
|
|
43
|
+
}, unknown, string, BrowserError, never>;
|
|
44
|
+
browser_goto: Tool<"browser_goto", {
|
|
45
|
+
readonly url: string;
|
|
46
|
+
}, unknown, string, BrowserError, never>;
|
|
47
|
+
browser_press: Tool<"browser_press", {
|
|
48
|
+
readonly key: string;
|
|
49
|
+
}, unknown, string, BrowserError, never>;
|
|
50
|
+
browser_scroll: Tool<"browser_scroll", {
|
|
51
|
+
readonly direction: "down" | "up";
|
|
52
|
+
}, unknown, string, BrowserError, never>;
|
|
56
53
|
};
|
|
57
54
|
//#endregion
|
|
58
55
|
export { browserToolkit, clickTool, fillTool, gotoTool, pressTool, scrollTool, BrowserTool_d_exports as t };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserTool.d.mts","names":[],"sources":["../../src/browser/BrowserTool.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"BrowserTool.d.mts","names":[],"sources":["../../src/browser/BrowserTool.ts"],"mappings":";;;;;;cAoEa,WAAQ,SAAa,mBAAc;;oBAAd;cAcrB,YAAS,SAAa,mBAAc;;oBAAd;cActB,WAAQ,SAAa,mBAAc;;;oBAAd;cAerB,YAAS,SAAa,mBAAc;;oBAAd;cActB,aAAU,SAAa,mBAAc;;oBAAd;;;;;;;;;;;;;;cA4BvB,iBAAc,SAAa;;;sBAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as __exportAll } from "../
|
|
1
|
+
import { n as __exportAll } from "../rolldown-runtime-EAsCxrDo.mjs";
|
|
2
2
|
import { fromEffectSchema, make } from "../tool/Tool.mjs";
|
|
3
3
|
import { make as make$1 } from "../tool/Toolkit.mjs";
|
|
4
4
|
import { Effect, Schema } from "effect";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserTool.mjs","names":["Tool.make","Tool.fromEffectSchema","Toolkit.make"],"sources":["../../src/browser/BrowserTool.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\"\nimport * as Tool from \"../tool/Tool.js\"\nimport * as Toolkit from \"../tool/Toolkit.js\"\nimport type { BrowserSession } from \"./Browser.js\"\n\n// ---------------------------------------------------------------------------\n// Model-facing argument schemas. Annotated so the descriptions reach the\n// model through the rendered JSON Schema (JSDoc does not).\n// ---------------------------------------------------------------------------\n\nconst GotoArgs = Schema.Struct({\n url: Schema.String.annotate({ description: \"Absolute URL to navigate to.\" }),\n})\n\nconst ClickArgs = Schema.Struct({\n ref: Schema.String.annotate({\n description: \"A CSS selector, or an element @ref if a page-reading tool provides one.\",\n }),\n})\n\nconst FillArgs = Schema.Struct({\n ref: Schema.String.annotate({\n description: \"A CSS selector (or element @ref) of the input to fill.\",\n }),\n text: Schema.String.annotate({ description: \"The text to put in the input.\" }),\n})\n\nconst PressArgs = Schema.Struct({\n key: Schema.String.annotate({\n description: 'Key to press, e.g. \"Enter\" to submit the focused input, \"Tab\", \"Escape\".',\n }),\n})\n\nconst ScrollArgs = Schema.Struct({\n direction: Schema.Literals([\"up\", \"down\"]).annotate({\n description: \"Scroll the viewport up or down.\",\n }),\n})\n\n// ---------------------------------------------------------------------------\n// Uniform action outcome: the model always learns where the action left it.\n// ---------------------------------------------------------------------------\n\nconst currentUrl = (session: BrowserSession): Effect.Effect<string> =>\n session.evaluate(\"location.href\").pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(Schema.String)),\n Effect.orElseSucceed(() => \"(unknown)\"),\n )\n\nconst okAt = (session: BrowserSession): Effect.Effect<string> =>\n Effect.map(currentUrl(session), (url) => `ok (now at ${url})`)\n\n// ---------------------------------------------------------------------------\n// The canonical browser action tools, each closed over a live `BrowserSession`\n// and failing with the full `BrowserError`. `Output` is a compact outcome\n// (`ok (now at <url>)`), not a page dump - a page-reading tool is the recipe's\n// to define, so history does not accumulate a full page per action.\n//\n// A failed action (stale ref, dead control, timeout) fails typed on the error\n// channel. Whether the model gets to recover from it is the loop's decision:\n// wrap the toolkit in `Toolkit.describeFailures(BrowserError.describe)` to\n// surface failures to the model, or map selectively to keep session/infra\n// errors (e.g. `BrowserSessionExpired`) fatal.\n//\n// Browser actions are order-dependent (fill, then press Enter): run a turn's\n// calls with `{ concurrency: 1 }`.\n// ---------------------------------------------------------------------------\n\nexport const gotoTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_goto\",\n description: \"Navigate the browser to an absolute URL.\",\n inputSchema: Tool.fromEffectSchema(GotoArgs),\n run: (args) =>\n Effect.andThen(session.goto(args.url), okAt(session)).pipe(\n Effect.withSpan(\"browser_goto\", {\n kind: \"client\",\n attributes: { \"browser.url\": args.url },\n }),\n ),\n })\n\nexport const clickTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_click\",\n description: \"Click the element named by ref. A click may navigate to a new page.\",\n inputSchema: Tool.fromEffectSchema(ClickArgs),\n run: (args) =>\n Effect.andThen(session.click(args.ref), okAt(session)).pipe(\n Effect.withSpan(\"browser_click\", {\n kind: \"client\",\n attributes: { \"browser.ref\": args.ref },\n }),\n ),\n })\n\nexport const fillTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_fill\",\n description:\n \"Put text into the input named by ref. Filling alone does not submit; press Enter to submit the input.\",\n inputSchema: Tool.fromEffectSchema(FillArgs),\n run: (args) =>\n Effect.andThen(session.fill(args.ref, args.text), okAt(session)).pipe(\n Effect.withSpan(\"browser_fill\", {\n kind: \"client\",\n attributes: { \"browser.ref\": args.ref },\n }),\n ),\n })\n\nexport const pressTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_press\",\n description: \"Press a keyboard key against the focused element.\",\n inputSchema: Tool.fromEffectSchema(PressArgs),\n run: (args) =>\n Effect.andThen(session.press(args.key), okAt(session)).pipe(\n Effect.withSpan(\"browser_press\", {\n kind: \"client\",\n attributes: { \"browser.key\": args.key },\n }),\n ),\n })\n\nexport const scrollTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_scroll\",\n description:\n \"Scroll the viewport. Only useful to bring an element into view - a page-reading tool's text is already scroll-independent.\",\n inputSchema: Tool.fromEffectSchema(ScrollArgs),\n run: (args) =>\n Effect.andThen(session.scroll({ direction: args.direction }), okAt(session)).pipe(\n Effect.withSpan(\"browser_scroll\", {\n kind: \"client\",\n attributes: { \"browser.direction\": args.direction },\n }),\n ),\n })\n\n/**\n * The canonical browser action verbs bundled as a `Toolkit`, closed over a\n * live `BrowserSession`. Compose it with a recipe-local page-reading tool and\n * whatever finish/signal tools the agent needs:\n *\n * const toolkit = yield* Toolkit.compose(\n * browserToolkit(session),\n * Toolkit.make(readPageTool(session), finishTool),\n * )\n *\n * For an à-la-carte subset, use the individual `gotoTool` / `clickTool` / …\n * constructors directly. Run a turn's calls with `{ concurrency: 1 }`.\n */\nexport const browserToolkit = (session: BrowserSession) =>\n Toolkit.make(\n gotoTool(session),\n clickTool(session),\n fillTool(session),\n pressTool(session),\n scrollTool(session),\n )\n"],"mappings":";;;;;;;;;;;;;AAUA,MAAM,WAAW,OAAO,OAAO,EAC7B,KAAK,OAAO,OAAO,SAAS,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"BrowserTool.mjs","names":["Tool.make","Tool.fromEffectSchema","Toolkit.make"],"sources":["../../src/browser/BrowserTool.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\"\nimport * as Tool from \"../tool/Tool.js\"\nimport * as Toolkit from \"../tool/Toolkit.js\"\nimport type { BrowserSession } from \"./Browser.js\"\n\n// ---------------------------------------------------------------------------\n// Model-facing argument schemas. Annotated so the descriptions reach the\n// model through the rendered JSON Schema (JSDoc does not).\n// ---------------------------------------------------------------------------\n\nconst GotoArgs = Schema.Struct({\n url: Schema.String.annotate({ description: \"Absolute URL to navigate to.\" }),\n})\n\nconst ClickArgs = Schema.Struct({\n ref: Schema.String.annotate({\n description: \"A CSS selector, or an element @ref if a page-reading tool provides one.\",\n }),\n})\n\nconst FillArgs = Schema.Struct({\n ref: Schema.String.annotate({\n description: \"A CSS selector (or element @ref) of the input to fill.\",\n }),\n text: Schema.String.annotate({ description: \"The text to put in the input.\" }),\n})\n\nconst PressArgs = Schema.Struct({\n key: Schema.String.annotate({\n description: 'Key to press, e.g. \"Enter\" to submit the focused input, \"Tab\", \"Escape\".',\n }),\n})\n\nconst ScrollArgs = Schema.Struct({\n direction: Schema.Literals([\"up\", \"down\"]).annotate({\n description: \"Scroll the viewport up or down.\",\n }),\n})\n\n// ---------------------------------------------------------------------------\n// Uniform action outcome: the model always learns where the action left it.\n// ---------------------------------------------------------------------------\n\nconst currentUrl = (session: BrowserSession): Effect.Effect<string> =>\n session.evaluate(\"location.href\").pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(Schema.String)),\n Effect.orElseSucceed(() => \"(unknown)\"),\n )\n\nconst okAt = (session: BrowserSession): Effect.Effect<string> =>\n Effect.map(currentUrl(session), (url) => `ok (now at ${url})`)\n\n// ---------------------------------------------------------------------------\n// The canonical browser action tools, each closed over a live `BrowserSession`\n// and failing with the full `BrowserError`. `Output` is a compact outcome\n// (`ok (now at <url>)`), not a page dump - a page-reading tool is the recipe's\n// to define, so history does not accumulate a full page per action.\n//\n// A failed action (stale ref, dead control, timeout) fails typed on the error\n// channel. Whether the model gets to recover from it is the loop's decision:\n// wrap the toolkit in `Toolkit.describeFailures(BrowserError.describe)` to\n// surface failures to the model, or map selectively to keep session/infra\n// errors (e.g. `BrowserSessionExpired`) fatal.\n//\n// Browser actions are order-dependent (fill, then press Enter): run a turn's\n// calls with `{ concurrency: 1 }`.\n// ---------------------------------------------------------------------------\n\nexport const gotoTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_goto\",\n description: \"Navigate the browser to an absolute URL.\",\n inputSchema: Tool.fromEffectSchema(GotoArgs),\n run: (args) =>\n Effect.andThen(session.goto(args.url), okAt(session)).pipe(\n Effect.withSpan(\"browser_goto\", {\n kind: \"client\",\n attributes: { \"browser.url\": args.url },\n }),\n ),\n })\n\nexport const clickTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_click\",\n description: \"Click the element named by ref. A click may navigate to a new page.\",\n inputSchema: Tool.fromEffectSchema(ClickArgs),\n run: (args) =>\n Effect.andThen(session.click(args.ref), okAt(session)).pipe(\n Effect.withSpan(\"browser_click\", {\n kind: \"client\",\n attributes: { \"browser.ref\": args.ref },\n }),\n ),\n })\n\nexport const fillTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_fill\",\n description:\n \"Put text into the input named by ref. Filling alone does not submit; press Enter to submit the input.\",\n inputSchema: Tool.fromEffectSchema(FillArgs),\n run: (args) =>\n Effect.andThen(session.fill(args.ref, args.text), okAt(session)).pipe(\n Effect.withSpan(\"browser_fill\", {\n kind: \"client\",\n attributes: { \"browser.ref\": args.ref },\n }),\n ),\n })\n\nexport const pressTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_press\",\n description: \"Press a keyboard key against the focused element.\",\n inputSchema: Tool.fromEffectSchema(PressArgs),\n run: (args) =>\n Effect.andThen(session.press(args.key), okAt(session)).pipe(\n Effect.withSpan(\"browser_press\", {\n kind: \"client\",\n attributes: { \"browser.key\": args.key },\n }),\n ),\n })\n\nexport const scrollTool = (session: BrowserSession) =>\n Tool.make({\n name: \"browser_scroll\",\n description:\n \"Scroll the viewport. Only useful to bring an element into view - a page-reading tool's text is already scroll-independent.\",\n inputSchema: Tool.fromEffectSchema(ScrollArgs),\n run: (args) =>\n Effect.andThen(session.scroll({ direction: args.direction }), okAt(session)).pipe(\n Effect.withSpan(\"browser_scroll\", {\n kind: \"client\",\n attributes: { \"browser.direction\": args.direction },\n }),\n ),\n })\n\n/**\n * The canonical browser action verbs bundled as a `Toolkit`, closed over a\n * live `BrowserSession`. Compose it with a recipe-local page-reading tool and\n * whatever finish/signal tools the agent needs:\n *\n * const toolkit = yield* Toolkit.compose(\n * browserToolkit(session),\n * Toolkit.make(readPageTool(session), finishTool),\n * )\n *\n * For an à-la-carte subset, use the individual `gotoTool` / `clickTool` / …\n * constructors directly. Run a turn's calls with `{ concurrency: 1 }`.\n */\nexport const browserToolkit = (session: BrowserSession) =>\n Toolkit.make(\n gotoTool(session),\n clickTool(session),\n fillTool(session),\n pressTool(session),\n scrollTool(session),\n )\n"],"mappings":";;;;;;;;;;;;;AAUA,MAAM,WAAW,OAAO,OAAO,EAC7B,KAAK,OAAO,OAAO,SAAS,EAAE,aAAa,+BAA+B,CAAC,EAC7E,CAAC;AAED,MAAM,YAAY,OAAO,OAAO,EAC9B,KAAK,OAAO,OAAO,SAAS,EAC1B,aAAa,0EACf,CAAC,EACH,CAAC;AAED,MAAM,WAAW,OAAO,OAAO;CAC7B,KAAK,OAAO,OAAO,SAAS,EAC1B,aAAa,yDACf,CAAC;CACD,MAAM,OAAO,OAAO,SAAS,EAAE,aAAa,gCAAgC,CAAC;AAC/E,CAAC;AAED,MAAM,YAAY,OAAO,OAAO,EAC9B,KAAK,OAAO,OAAO,SAAS,EAC1B,aAAa,iFACf,CAAC,EACH,CAAC;AAED,MAAM,aAAa,OAAO,OAAO,EAC/B,WAAW,OAAO,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,SAAS,EAClD,aAAa,kCACf,CAAC,EACH,CAAC;AAMD,MAAM,cAAc,YAClB,QAAQ,SAAS,eAAe,CAAC,CAAC,KAChC,OAAO,QAAQ,OAAO,oBAAoB,OAAO,MAAM,CAAC,GACxD,OAAO,oBAAoB,WAAW,CACxC;AAEF,MAAM,QAAQ,YACZ,OAAO,IAAI,WAAW,OAAO,IAAI,QAAQ,cAAc,IAAI,EAAE;AAkB/D,MAAa,YAAY,YACvBA,KAAU;CACR,MAAM;CACN,aAAa;CACb,aAAaC,iBAAsB,QAAQ;CAC3C,MAAM,SACJ,OAAO,QAAQ,QAAQ,KAAK,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KACpD,OAAO,SAAS,gBAAgB;EAC9B,MAAM;EACN,YAAY,EAAE,eAAe,KAAK,IAAI;CACxC,CAAC,CACH;AACJ,CAAC;AAEH,MAAa,aAAa,YACxBD,KAAU;CACR,MAAM;CACN,aAAa;CACb,aAAaC,iBAAsB,SAAS;CAC5C,MAAM,SACJ,OAAO,QAAQ,QAAQ,MAAM,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KACrD,OAAO,SAAS,iBAAiB;EAC/B,MAAM;EACN,YAAY,EAAE,eAAe,KAAK,IAAI;CACxC,CAAC,CACH;AACJ,CAAC;AAEH,MAAa,YAAY,YACvBD,KAAU;CACR,MAAM;CACN,aACE;CACF,aAAaC,iBAAsB,QAAQ;CAC3C,MAAM,SACJ,OAAO,QAAQ,QAAQ,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAC/D,OAAO,SAAS,gBAAgB;EAC9B,MAAM;EACN,YAAY,EAAE,eAAe,KAAK,IAAI;CACxC,CAAC,CACH;AACJ,CAAC;AAEH,MAAa,aAAa,YACxBD,KAAU;CACR,MAAM;CACN,aAAa;CACb,aAAaC,iBAAsB,SAAS;CAC5C,MAAM,SACJ,OAAO,QAAQ,QAAQ,MAAM,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KACrD,OAAO,SAAS,iBAAiB;EAC/B,MAAM;EACN,YAAY,EAAE,eAAe,KAAK,IAAI;CACxC,CAAC,CACH;AACJ,CAAC;AAEH,MAAa,cAAc,YACzBD,KAAU;CACR,MAAM;CACN,aACE;CACF,aAAaC,iBAAsB,UAAU;CAC7C,MAAM,SACJ,OAAO,QAAQ,QAAQ,OAAO,EAAE,WAAW,KAAK,UAAU,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAC3E,OAAO,SAAS,kBAAkB;EAChC,MAAM;EACN,YAAY,EAAE,qBAAqB,KAAK,UAAU;CACpD,CAAC,CACH;AACJ,CAAC;;;;;;;;;;;;;;AAeH,MAAa,kBAAkB,YAC7BC,OACE,SAAS,OAAO,GAChB,UAAU,OAAO,GACjB,SAAS,OAAO,GAChB,UAAU,OAAO,GACjB,WAAW,OAAO,CACpB"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
|
|
3
|
-
//#region src/capabilities/Capabilities.d.ts
|
|
4
2
|
declare namespace Capabilities_d_exports {
|
|
5
3
|
export { CapabilityWarning, warnDropped, warnDroppedWhen };
|
|
6
4
|
}
|
|
@@ -19,10 +17,14 @@ declare namespace Capabilities_d_exports {
|
|
|
19
17
|
*/
|
|
20
18
|
type CapabilityWarning = {
|
|
21
19
|
readonly _tag: "CapabilityWarning";
|
|
22
|
-
readonly provider: string;
|
|
23
|
-
|
|
24
|
-
readonly
|
|
25
|
-
|
|
20
|
+
readonly provider: string;
|
|
21
|
+
/** The capability name as it appears in docs (`"lyrics"`, `"bpm"`). */
|
|
22
|
+
readonly capability: string;
|
|
23
|
+
/** The Common-request field name that was dropped. */
|
|
24
|
+
readonly field: string;
|
|
25
|
+
/** The value the caller passed; included when useful for debugging. */
|
|
26
|
+
readonly value?: unknown;
|
|
27
|
+
/** Human-readable explanation; should suggest a workaround. */
|
|
26
28
|
readonly reason: string;
|
|
27
29
|
};
|
|
28
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Capabilities.d.mts","names":[],"sources":["../../src/capabilities/Capabilities.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Capabilities.d.mts","names":[],"sources":["../../src/capabilities/Capabilities.ts"],"mappings":";;;;;;;;;;;;;;;;;KAeY;WACD;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;;;;;;;;;;;;;;;;;;;;;;;;cA0BE,cAAW,SAAa,KAAK,+BAA6B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;cA0BjE,kBAAmB,GAAC,OACxB,eAAa,SACX,KAAK,yCACb,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Capabilities.mjs","names":[],"sources":["../../src/capabilities/Capabilities.ts"],"sourcesContent":["import { Effect } from \"effect\"\n\n/**\n * Structured event emitted when a provider adapter drops a Common\n * request field because its wire API has no place to put it (bucket 2\n * per the capabilities policy: the provider has no structured\n * interpretation; the output is still valid, just less aligned with\n * the caller's hint).\n *\n * Carried on `Effect.logWarning` today for visibility; may be\n * promoted to a typed `AiError` variant in the future if callers need\n * to react programmatically. The shape itself is stable.\n *\n * @category capabilities\n */\nexport type CapabilityWarning = {\n readonly _tag: \"CapabilityWarning\"\n readonly provider: string\n /** The capability name as it appears in docs (`\"lyrics\"`, `\"bpm\"`). */\n readonly capability: string\n /** The Common-request field name that was dropped. */\n readonly field: string\n /** The value the caller passed; included when useful for debugging. */\n readonly value?: unknown\n /** Human-readable explanation; should suggest a workaround. */\n readonly reason: string\n}\n\n/**\n * Emit a structured `CapabilityWarning` via `Effect.logWarning`. Use\n * when a provider adapter receives a Common-request field it has no\n * structured wire field for, and would otherwise drop silently.\n *\n * Bucket-2 cases only (per the capabilities policy): the provider has\n * no interpretation; the output is still valid, just less aligned\n * with the caller's hint. For bucket-1 cases (structurally broken\n * output if dropped, like wrong audio format), fail\n * `AiError.Unsupported` instead.\n *\n * @example\n * ```ts\n * if (request.lyrics !== undefined) {\n * yield* warnDropped({\n * provider: \"lyria\",\n * capability: \"lyrics\",\n * field: \"lyrics\",\n * reason: \"Lyria 3 sync has no `lyrics` wire field. Embed in your prompt instead.\",\n * })\n * }\n * ```\n */\nexport const warnDropped = (warning: Omit<CapabilityWarning, \"_tag\">): Effect.Effect<void> =>\n Effect.logWarning(\"Capability dropped\", { ...warning, _tag: \"CapabilityWarning\" })\n\n/**\n * Shorthand for the most common shape: warn-and-drop when a specific\n * field on the Common request is set. The field's value is included\n * automatically.\n *\n * @example\n * ```ts\n * yield* Effect.all([\n * warnDroppedWhen(request.lyrics, {\n * provider: \"lyria\",\n * capability: \"lyrics\",\n * field: \"lyrics\",\n * reason: \"Lyria 3 sync has no `lyrics` wire field. Embed in your prompt instead.\",\n * }),\n * warnDroppedWhen(request.duration, {\n * provider: \"lyria\",\n * capability: \"duration\",\n * field: \"duration\",\n * reason: \"Lyria 3 clip is fixed at 30 s.\",\n * }),\n * ], { discard: true })\n * ```\n */\nexport const warnDroppedWhen = <T>(\n value: T | undefined,\n warning: Omit<CapabilityWarning, \"_tag\" | \"value\">,\n): Effect.Effect<void> => (value === undefined ? Effect.void : warnDropped({ ...warning, value }))\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,MAAa,eAAe,YAC1B,OAAO,WAAW,sBAAsB;CAAE,GAAG;CAAS,MAAM;
|
|
1
|
+
{"version":3,"file":"Capabilities.mjs","names":[],"sources":["../../src/capabilities/Capabilities.ts"],"sourcesContent":["import { Effect } from \"effect\"\n\n/**\n * Structured event emitted when a provider adapter drops a Common\n * request field because its wire API has no place to put it (bucket 2\n * per the capabilities policy: the provider has no structured\n * interpretation; the output is still valid, just less aligned with\n * the caller's hint).\n *\n * Carried on `Effect.logWarning` today for visibility; may be\n * promoted to a typed `AiError` variant in the future if callers need\n * to react programmatically. The shape itself is stable.\n *\n * @category capabilities\n */\nexport type CapabilityWarning = {\n readonly _tag: \"CapabilityWarning\"\n readonly provider: string\n /** The capability name as it appears in docs (`\"lyrics\"`, `\"bpm\"`). */\n readonly capability: string\n /** The Common-request field name that was dropped. */\n readonly field: string\n /** The value the caller passed; included when useful for debugging. */\n readonly value?: unknown\n /** Human-readable explanation; should suggest a workaround. */\n readonly reason: string\n}\n\n/**\n * Emit a structured `CapabilityWarning` via `Effect.logWarning`. Use\n * when a provider adapter receives a Common-request field it has no\n * structured wire field for, and would otherwise drop silently.\n *\n * Bucket-2 cases only (per the capabilities policy): the provider has\n * no interpretation; the output is still valid, just less aligned\n * with the caller's hint. For bucket-1 cases (structurally broken\n * output if dropped, like wrong audio format), fail\n * `AiError.Unsupported` instead.\n *\n * @example\n * ```ts\n * if (request.lyrics !== undefined) {\n * yield* warnDropped({\n * provider: \"lyria\",\n * capability: \"lyrics\",\n * field: \"lyrics\",\n * reason: \"Lyria 3 sync has no `lyrics` wire field. Embed in your prompt instead.\",\n * })\n * }\n * ```\n */\nexport const warnDropped = (warning: Omit<CapabilityWarning, \"_tag\">): Effect.Effect<void> =>\n Effect.logWarning(\"Capability dropped\", { ...warning, _tag: \"CapabilityWarning\" })\n\n/**\n * Shorthand for the most common shape: warn-and-drop when a specific\n * field on the Common request is set. The field's value is included\n * automatically.\n *\n * @example\n * ```ts\n * yield* Effect.all([\n * warnDroppedWhen(request.lyrics, {\n * provider: \"lyria\",\n * capability: \"lyrics\",\n * field: \"lyrics\",\n * reason: \"Lyria 3 sync has no `lyrics` wire field. Embed in your prompt instead.\",\n * }),\n * warnDroppedWhen(request.duration, {\n * provider: \"lyria\",\n * capability: \"duration\",\n * field: \"duration\",\n * reason: \"Lyria 3 clip is fixed at 30 s.\",\n * }),\n * ], { discard: true })\n * ```\n */\nexport const warnDroppedWhen = <T>(\n value: T | undefined,\n warning: Omit<CapabilityWarning, \"_tag\" | \"value\">,\n): Effect.Effect<void> => (value === undefined ? Effect.void : warnDropped({ ...warning, value }))\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,MAAa,eAAe,YAC1B,OAAO,WAAW,sBAAsB;CAAE,GAAG;CAAS,MAAM;AAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AAyBnF,MAAa,mBACX,OACA,YACyB,UAAU,KAAA,IAAY,OAAO,OAAO,YAAY;CAAE,GAAG;CAAS;AAAM,CAAC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { t as __commonJSMin } from "./rolldown-runtime-EAsCxrDo.mjs";
|
|
2
|
+
import "./utils-CiH_DjFW.mjs";
|
|
3
|
+
//#region ../../node_modules/.pnpm/vite@7.3.2_@types+node@26.2.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.23.12_yaml@2.9.0/node_modules/vite/dist/node/module-runner.js
|
|
4
|
+
let SOURCEMAPPING_URL = "sourceMa";
|
|
5
|
+
SOURCEMAPPING_URL += "ppingURL";
|
|
6
|
+
typeof process < "u" && process.platform;
|
|
7
|
+
(async function() {}).constructor;
|
|
8
|
+
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
9
|
+
var intToChar = /* @__PURE__ */ new Uint8Array(64);
|
|
10
|
+
var charToInt = /* @__PURE__ */ new Uint8Array(128);
|
|
11
|
+
for (let i = 0; i < chars.length; i++) {
|
|
12
|
+
let c = chars.charCodeAt(i);
|
|
13
|
+
intToChar[i] = c, charToInt[c] = i;
|
|
14
|
+
}
|
|
15
|
+
`${SOURCEMAPPING_URL}`;
|
|
16
|
+
Error.prepareStackTrace;
|
|
17
|
+
const customizationHookNamespace = "vite-module-runner:import-meta-resolve/v1/";
|
|
18
|
+
`${JSON.stringify(customizationHookNamespace)}${JSON.stringify(customizationHookNamespace)}`;
|
|
19
|
+
new Proxy({}, { get(_, p) {
|
|
20
|
+
throw Error(`[module runner] Dynamic access of "import.meta.env" is not supported. Please, use "import.meta.env.${String(p)}" instead.`);
|
|
21
|
+
} });
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region ../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js
|
|
24
|
+
var require_branding = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
}));
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region ../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js
|
|
29
|
+
var require_messages = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
}));
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region ../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js
|
|
34
|
+
var require_overloads = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
}));
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region ../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js
|
|
39
|
+
var require_utils = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
}));
|
|
42
|
+
//#endregion
|
|
43
|
+
//#region ../../node_modules/.pnpm/vitest@4.1.11_@types+node@26.2.0_vite@7.3.2_@types+node@26.2.0_jiti@2.6.1_lightningcss@1.32.0_tsx@4.23.12_yaml@2.9.0_/node_modules/vitest/dist/index.js
|
|
44
|
+
var import_dist = (/* @__PURE__ */ __commonJSMin(((exports) => {
|
|
45
|
+
var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
46
|
+
if (k2 === void 0) k2 = k;
|
|
47
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
48
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) desc = {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function() {
|
|
51
|
+
return m[k];
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
Object.defineProperty(o, k2, desc);
|
|
55
|
+
}) : (function(o, m, k, k2) {
|
|
56
|
+
if (k2 === void 0) k2 = k;
|
|
57
|
+
o[k2] = m[k];
|
|
58
|
+
}));
|
|
59
|
+
var __exportStar = exports && exports.__exportStar || function(m, exports$1) {
|
|
60
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports$1, p)) __createBinding(exports$1, m, p);
|
|
61
|
+
};
|
|
62
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
+
exports.expectTypeOf = void 0;
|
|
64
|
+
__exportStar(require_branding(), exports);
|
|
65
|
+
__exportStar(require_messages(), exports);
|
|
66
|
+
__exportStar(require_overloads(), exports);
|
|
67
|
+
__exportStar(require_utils(), exports);
|
|
68
|
+
const fn = () => true;
|
|
69
|
+
/**
|
|
70
|
+
* Similar to Jest's `expect`, but with type-awareness.
|
|
71
|
+
* Gives you access to a number of type-matchers that let you make assertions about the
|
|
72
|
+
* form of a reference or generic type parameter.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* import { foo, bar } from '../foo'
|
|
77
|
+
* import { expectTypeOf } from 'expect-type'
|
|
78
|
+
*
|
|
79
|
+
* test('foo types', () => {
|
|
80
|
+
* // make sure `foo` has type { a: number }
|
|
81
|
+
* expectTypeOf(foo).toMatchTypeOf({ a: 1 })
|
|
82
|
+
* expectTypeOf(foo).toHaveProperty('a').toBeNumber()
|
|
83
|
+
*
|
|
84
|
+
* // make sure `bar` is a function taking a string:
|
|
85
|
+
* expectTypeOf(bar).parameter(0).toBeString()
|
|
86
|
+
* expectTypeOf(bar).returns.not.toBeAny()
|
|
87
|
+
* })
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @description
|
|
91
|
+
* See the [full docs](https://npmjs.com/package/expect-type#documentation) for lots more examples.
|
|
92
|
+
*/
|
|
93
|
+
const expectTypeOf = (_actual) => {
|
|
94
|
+
const nonFunctionProperties = [
|
|
95
|
+
"parameters",
|
|
96
|
+
"returns",
|
|
97
|
+
"resolves",
|
|
98
|
+
"not",
|
|
99
|
+
"items",
|
|
100
|
+
"constructorParameters",
|
|
101
|
+
"thisParameter",
|
|
102
|
+
"instance",
|
|
103
|
+
"guards",
|
|
104
|
+
"asserts",
|
|
105
|
+
"branded"
|
|
106
|
+
];
|
|
107
|
+
const obj = {
|
|
108
|
+
toBeAny: fn,
|
|
109
|
+
toBeUnknown: fn,
|
|
110
|
+
toBeNever: fn,
|
|
111
|
+
toBeFunction: fn,
|
|
112
|
+
toBeObject: fn,
|
|
113
|
+
toBeArray: fn,
|
|
114
|
+
toBeString: fn,
|
|
115
|
+
toBeNumber: fn,
|
|
116
|
+
toBeBoolean: fn,
|
|
117
|
+
toBeVoid: fn,
|
|
118
|
+
toBeSymbol: fn,
|
|
119
|
+
toBeNull: fn,
|
|
120
|
+
toBeUndefined: fn,
|
|
121
|
+
toBeNullable: fn,
|
|
122
|
+
toBeBigInt: fn,
|
|
123
|
+
toMatchTypeOf: fn,
|
|
124
|
+
toEqualTypeOf: fn,
|
|
125
|
+
toBeConstructibleWith: fn,
|
|
126
|
+
toMatchObjectType: fn,
|
|
127
|
+
toExtend: fn,
|
|
128
|
+
map: exports.expectTypeOf,
|
|
129
|
+
toBeCallableWith: exports.expectTypeOf,
|
|
130
|
+
extract: exports.expectTypeOf,
|
|
131
|
+
exclude: exports.expectTypeOf,
|
|
132
|
+
pick: exports.expectTypeOf,
|
|
133
|
+
omit: exports.expectTypeOf,
|
|
134
|
+
toHaveProperty: exports.expectTypeOf,
|
|
135
|
+
parameter: exports.expectTypeOf
|
|
136
|
+
};
|
|
137
|
+
nonFunctionProperties.forEach((prop) => Object.defineProperty(obj, prop, { get: () => (0, exports.expectTypeOf)({}) }));
|
|
138
|
+
return obj;
|
|
139
|
+
};
|
|
140
|
+
exports.expectTypeOf = expectTypeOf;
|
|
141
|
+
})))();
|
|
142
|
+
//#endregion
|
|
143
|
+
export { import_dist as t };
|
|
144
|
+
|
|
145
|
+
//# sourceMappingURL=dist-BaenoU1A.mjs.map
|